From webhook-mailer at python.org Fri Mar 1 00:47:29 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 01 Mar 2019 05:47:29 -0000 Subject: [Python-checkins] bpo-36018: Add documentation link to "random variable" (GH-12114) Message-ID: https://github.com/python/cpython/commit/9add4b3317629933d88cf206a24b15e922fa8941 commit: 9add4b3317629933d88cf206a24b15e922fa8941 branch: master author: Raymond Hettinger committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-02-28T21:47:26-08:00 summary: bpo-36018: Add documentation link to "random variable" (GH-12114) https://bugs.python.org/issue36018 files: M Doc/library/statistics.rst diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst index 8d961b7ca5b1..8f8c0098f84a 100644 --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -471,9 +471,11 @@ A single exception is defined: :class:`NormalDist` objects =========================== -A :class:`NormalDist` is a a composite class that treats the mean and standard -deviation of data measurements as a single entity. It is a tool for creating -and manipulating normal distributions of a random variable. +:class:`NormalDist` is a tool for creating and manipulating normal +distributions of a `random variable +`_. It is a +composite class that treats the mean and standard deviation of data +measurements as a single entity. Normal distributions arise from the `Central Limit Theorem `_ and have a wide range @@ -530,7 +532,7 @@ of applications in statistics, including simulations and hypothesis testing. Using a `probability density function (pdf) `_, - compute the relative likelihood that a random sample *X* will be near + compute the relative likelihood that a random variable *X* will be near the given value *x*. Mathematically, it is the ratio ``P(x <= X < x+dx) / dx``. @@ -544,7 +546,7 @@ of applications in statistics, including simulations and hypothesis testing. Using a `cumulative distribution function (cdf) `_, - compute the probability that a random sample *X* will be less than or + compute the probability that a random variable *X* will be less than or equal to *x*. Mathematically, it is written ``P(X <= x)``. Instances of :class:`NormalDist` support addition, subtraction, From webhook-mailer at python.org Fri Mar 1 02:36:04 2019 From: webhook-mailer at python.org (larryhastings) Date: Fri, 01 Mar 2019 07:36:04 -0000 Subject: [Python-checkins] [3.5] bpo-33127: Compatibility patch for LibreSSL 2.7.0 (GH-6210) (#10994) Message-ID: https://github.com/python/cpython/commit/56f8783e3e32ddc0cb84a96711e3861aea9895ac commit: 56f8783e3e32ddc0cb84a96711e3861aea9895ac branch: 3.5 author: Alex Viscreanu committer: larryhastings date: 2019-02-28T23:36:00-08:00 summary: [3.5] bpo-33127: Compatibility patch for LibreSSL 2.7.0 (GH-6210) (#10994) * bpo-33127: Compatibility patch for LibreSSL 2.7.0 (GH-6210) LibreSSL 2.7 introduced OpenSSL 1.1.0 API. The ssl module now detects LibreSSL 2.7 and only provides API shims for OpenSSL < 1.1.0 and LibreSSL < 2.7. Documentation updates and fixes for failing tests will be provided in another patch set. Signed-off-by: Christian Heimes files: A Misc/NEWS.d/next/Library/2018-03-24-15-08-24.bpo-33127.olJmHv.rst M Modules/_ssl.c diff --git a/Misc/NEWS.d/next/Library/2018-03-24-15-08-24.bpo-33127.olJmHv.rst b/Misc/NEWS.d/next/Library/2018-03-24-15-08-24.bpo-33127.olJmHv.rst new file mode 100644 index 000000000000..635aabbde031 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-03-24-15-08-24.bpo-33127.olJmHv.rst @@ -0,0 +1 @@ +The ssl module now compiles with LibreSSL 2.7.1. diff --git a/Modules/_ssl.c b/Modules/_ssl.c index f721391d9db9..b9369b817df3 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -101,6 +101,12 @@ struct py_ssl_library_code { #if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) # define OPENSSL_VERSION_1_1 1 +# define PY_OPENSSL_1_1_API 1 +#endif + +/* LibreSSL 2.7.0 provides necessary OpenSSL 1.1.0 APIs */ +#if defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER >= 0x2070000fL +# define PY_OPENSSL_1_1_API 1 #endif /* Openssl comes with TLSv1.1 and TLSv1.2 between 1.0.0h and 1.0.1 @@ -129,16 +135,18 @@ struct py_ssl_library_code { #define INVALID_SOCKET (-1) #endif -#ifdef OPENSSL_VERSION_1_1 -/* OpenSSL 1.1.0+ */ -#ifndef OPENSSL_NO_SSL2 -#define OPENSSL_NO_SSL2 -#endif -#else /* OpenSSL < 1.1.0 */ -#if defined(WITH_THREAD) +/* OpenSSL 1.0.2 and LibreSSL needs extra code for locking */ +#ifndef OPENSSL_VERSION_1_1 #define HAVE_OPENSSL_CRYPTO_LOCK #endif +#if defined(OPENSSL_VERSION_1_1) && !defined(OPENSSL_NO_SSL2) +#define OPENSSL_NO_SSL2 +#endif + +#ifndef PY_OPENSSL_1_1_API +/* OpenSSL 1.1 API shims for OpenSSL < 1.1.0 and LibreSSL < 2.7.0 */ + #define TLS_method SSLv23_method static int X509_NAME_ENTRY_set(const X509_NAME_ENTRY *ne) @@ -187,7 +195,8 @@ static X509_VERIFY_PARAM *X509_STORE_get0_param(X509_STORE *store) { return store->param; } -#endif /* OpenSSL < 1.1.0 or LibreSSL */ + +#endif /* OpenSSL < 1.1.0 or LibreSSL < 2.7.0 */ enum py_ssl_error { From webhook-mailer at python.org Fri Mar 1 04:12:41 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Fri, 01 Mar 2019 09:12:41 -0000 Subject: [Python-checkins] bpo-36155: Check for identity on test_gc.test_get_objects (GH-12116) Message-ID: https://github.com/python/cpython/commit/d60a79a1015aa26ff7ee3166820ec43558911b60 commit: d60a79a1015aa26ff7ee3166820ec43558911b60 branch: master author: Pablo Galindo committer: GitHub date: 2019-03-01T01:12:27-08:00 summary: bpo-36155: Check for identity on test_gc.test_get_objects (GH-12116) files: M Lib/test/test_gc.py diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py index 65e74d4759ce..2dab53004452 100644 --- a/Lib/test/test_gc.py +++ b/Lib/test/test_gc.py @@ -770,21 +770,45 @@ def test_get_objects(self): gc.collect() l = [] l.append(l) - self.assertIn(l, gc.get_objects(generation=0)) - self.assertNotIn(l, gc.get_objects(generation=1)) - self.assertNotIn(l, gc.get_objects(generation=2)) + self.assertTrue( + any(l is element for element in gc.get_objects(generation=0)) + ) + self.assertFalse( + any(l is element for element in gc.get_objects(generation=1)) + ) + self.assertFalse( + any(l is element for element in gc.get_objects(generation=2)) + ) gc.collect(generation=0) - self.assertNotIn(l, gc.get_objects(generation=0)) - self.assertIn(l, gc.get_objects(generation=1)) - self.assertNotIn(l, gc.get_objects(generation=2)) + self.assertFalse( + any(l is element for element in gc.get_objects(generation=0)) + ) + self.assertTrue( + any(l is element for element in gc.get_objects(generation=1)) + ) + self.assertFalse( + any(l is element for element in gc.get_objects(generation=2)) + ) gc.collect(generation=1) - self.assertNotIn(l, gc.get_objects(generation=0)) - self.assertNotIn(l, gc.get_objects(generation=1)) - self.assertIn(l, gc.get_objects(generation=2)) + self.assertFalse( + any(l is element for element in gc.get_objects(generation=0)) + ) + self.assertFalse( + any(l is element for element in gc.get_objects(generation=1)) + ) + self.assertTrue( + any(l is element for element in gc.get_objects(generation=2)) + ) gc.collect(generation=2) - self.assertNotIn(l, gc.get_objects(generation=0)) - self.assertNotIn(l, gc.get_objects(generation=1)) - self.assertIn(l, gc.get_objects(generation=2)) + self.assertFalse( + any(l is element for element in gc.get_objects(generation=0)) + ) + self.assertFalse( + any(l is element for element in gc.get_objects(generation=1)) + ) + self.assertTrue( + any(l is element for element in gc.get_objects(generation=2)) + ) del l gc.collect() From webhook-mailer at python.org Fri Mar 1 05:19:45 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Fri, 01 Mar 2019 10:19:45 -0000 Subject: [Python-checkins] bpo-36152: IDLE: Remove unused parameter from colorizer (GH-12109) Message-ID: https://github.com/python/cpython/commit/b9f0354efce95b7557bc43ea193c4b652cd28392 commit: b9f0354efce95b7557bc43ea193c4b652cd28392 branch: master author: Cheryl Sabella committer: GitHub date: 2019-03-01T05:19:40-05:00 summary: bpo-36152: IDLE: Remove unused parameter from colorizer (GH-12109) Remove colorizer.ColorDelegator.close_when_done and the corresponding argument of .close(). In IDLE, both have always been None or False since 2007. files: A Misc/NEWS.d/next/IDLE/2019-02-28-18-52-40.bpo-36152.9pkHIU.rst M Lib/idlelib/colorizer.py M Lib/idlelib/editor.py diff --git a/Lib/idlelib/colorizer.py b/Lib/idlelib/colorizer.py index fd13281fb295..facbef8bb189 100644 --- a/Lib/idlelib/colorizer.py +++ b/Lib/idlelib/colorizer.py @@ -66,8 +66,6 @@ class ColorDelegator(Delegator): colorizing: Boolean flag when colorizing is in process. stop_colorizing: Boolean flag to end an active colorizing process. - close_when_done: Widget to destroy after colorizing process - completes (doesn't seem to be used by IDLE). """ def __init__(self): @@ -157,9 +155,7 @@ def notify_range(self, index1, index2=None): self.after_id = self.after(1, self.recolorize) return - close_when_done = None # Window to be closed when done colorizing. - - def close(self, close_when_done=None): + def close(self): if self.after_id: after_id = self.after_id self.after_id = None @@ -167,11 +163,6 @@ def close(self, close_when_done=None): self.after_cancel(after_id) self.allow_colorizing = False self.stop_colorizing = True - if close_when_done: - if not self.colorizing: - close_when_done.destroy() - else: - self.close_when_done = close_when_done def toggle_colorize_event(self, event=None): """Toggle colorizing on and off. @@ -205,9 +196,7 @@ def recolorize(self): process is not already running. After colorizing is complete, some cleanup is done to - make sure that all the text has been colorized and to close - the window if the close event had been called while the - process was running. + make sure that all the text has been colorized. """ self.after_id = None if not self.delegate: @@ -232,10 +221,6 @@ def recolorize(self): if self.allow_colorizing and self.tag_nextrange("TODO", "1.0"): if DEBUG: print("reschedule colorizing") self.after_id = self.after(1, self.recolorize) - if self.close_when_done: - top = self.close_when_done - self.close_when_done = None - top.destroy() def recolorize_main(self): "Evaluate text and apply colorizing tags." diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py index e05b52a96dcc..83260329640e 100644 --- a/Lib/idlelib/editor.py +++ b/Lib/idlelib/editor.py @@ -1033,7 +1033,7 @@ def _close(self): self.io = None self.undo = None if self.color: - self.color.close(False) + self.color.close() self.color = None self.text = None self.tkinter_vars = None diff --git a/Misc/NEWS.d/next/IDLE/2019-02-28-18-52-40.bpo-36152.9pkHIU.rst b/Misc/NEWS.d/next/IDLE/2019-02-28-18-52-40.bpo-36152.9pkHIU.rst new file mode 100644 index 000000000000..b75ae89ef30a --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-02-28-18-52-40.bpo-36152.9pkHIU.rst @@ -0,0 +1,3 @@ +Remove colorizer.ColorDelegator.close_when_done and the +corresponding argument of .close(). In IDLE, both have +always been None or False since 2007. From webhook-mailer at python.org Fri Mar 1 05:43:46 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 01 Mar 2019 10:43:46 -0000 Subject: [Python-checkins] bpo-36152: IDLE: Remove unused parameter from colorizer (GH-12109) Message-ID: https://github.com/python/cpython/commit/70852b1eb6fbcc41fe9cad042e9ca61c5148fbda commit: 70852b1eb6fbcc41fe9cad042e9ca61c5148fbda branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-01T02:43:43-08:00 summary: bpo-36152: IDLE: Remove unused parameter from colorizer (GH-12109) Remove colorizer.ColorDelegator.close_when_done and the corresponding argument of .close(). In IDLE, both have always been None or False since 2007. (cherry picked from commit b9f0354efce95b7557bc43ea193c4b652cd28392) Co-authored-by: Cheryl Sabella files: A Misc/NEWS.d/next/IDLE/2019-02-28-18-52-40.bpo-36152.9pkHIU.rst M Lib/idlelib/colorizer.py M Lib/idlelib/editor.py diff --git a/Lib/idlelib/colorizer.py b/Lib/idlelib/colorizer.py index fd13281fb295..facbef8bb189 100644 --- a/Lib/idlelib/colorizer.py +++ b/Lib/idlelib/colorizer.py @@ -66,8 +66,6 @@ class ColorDelegator(Delegator): colorizing: Boolean flag when colorizing is in process. stop_colorizing: Boolean flag to end an active colorizing process. - close_when_done: Widget to destroy after colorizing process - completes (doesn't seem to be used by IDLE). """ def __init__(self): @@ -157,9 +155,7 @@ def notify_range(self, index1, index2=None): self.after_id = self.after(1, self.recolorize) return - close_when_done = None # Window to be closed when done colorizing. - - def close(self, close_when_done=None): + def close(self): if self.after_id: after_id = self.after_id self.after_id = None @@ -167,11 +163,6 @@ def close(self, close_when_done=None): self.after_cancel(after_id) self.allow_colorizing = False self.stop_colorizing = True - if close_when_done: - if not self.colorizing: - close_when_done.destroy() - else: - self.close_when_done = close_when_done def toggle_colorize_event(self, event=None): """Toggle colorizing on and off. @@ -205,9 +196,7 @@ def recolorize(self): process is not already running. After colorizing is complete, some cleanup is done to - make sure that all the text has been colorized and to close - the window if the close event had been called while the - process was running. + make sure that all the text has been colorized. """ self.after_id = None if not self.delegate: @@ -232,10 +221,6 @@ def recolorize(self): if self.allow_colorizing and self.tag_nextrange("TODO", "1.0"): if DEBUG: print("reschedule colorizing") self.after_id = self.after(1, self.recolorize) - if self.close_when_done: - top = self.close_when_done - self.close_when_done = None - top.destroy() def recolorize_main(self): "Evaluate text and apply colorizing tags." diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py index e05b52a96dcc..83260329640e 100644 --- a/Lib/idlelib/editor.py +++ b/Lib/idlelib/editor.py @@ -1033,7 +1033,7 @@ def _close(self): self.io = None self.undo = None if self.color: - self.color.close(False) + self.color.close() self.color = None self.text = None self.tkinter_vars = None diff --git a/Misc/NEWS.d/next/IDLE/2019-02-28-18-52-40.bpo-36152.9pkHIU.rst b/Misc/NEWS.d/next/IDLE/2019-02-28-18-52-40.bpo-36152.9pkHIU.rst new file mode 100644 index 000000000000..b75ae89ef30a --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-02-28-18-52-40.bpo-36152.9pkHIU.rst @@ -0,0 +1,3 @@ +Remove colorizer.ColorDelegator.close_when_done and the +corresponding argument of .close(). In IDLE, both have +always been None or False since 2007. From webhook-mailer at python.org Fri Mar 1 06:14:45 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 01 Mar 2019 11:14:45 -0000 Subject: [Python-checkins] bpo-36142: Rework error reporting in pymain_main() (GH-12113) Message-ID: https://github.com/python/cpython/commit/dfe884759d1f4441c889695f8985bc9feb9f37eb commit: dfe884759d1f4441c889695f8985bc9feb9f37eb branch: master author: Victor Stinner committer: GitHub date: 2019-03-01T12:14:41+01:00 summary: bpo-36142: Rework error reporting in pymain_main() (GH-12113) Add a new _Py_INIT_EXIT() macro to be able to exit Python with an exitcode using _PyInitError API. Rewrite function calls by pymain_main() to use _PyInitError. Changes: * Remove _PyMain.err and _PyMain.status field * Add _Py_INIT_EXIT() macro and _PyInitError.exitcode field. * Rename _Py_FatalInitError() to _Py_ExitInitError(). files: M Include/cpython/coreconfig.h M Include/cpython/pylifecycle.h M Modules/main.c M Programs/_freeze_importlib.c M Programs/_testembed.c M Python/frozenmain.c M Python/pathconfig.c M Python/pylifecycle.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index f7ac3f9cff09..2ce99b2eab64 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -11,6 +11,7 @@ typedef struct { const char *prefix; const char *msg; int user_err; + int exitcode; } _PyInitError; /* Almost all errors causing Python initialization to fail */ @@ -22,16 +23,18 @@ typedef struct { #endif #define _Py_INIT_OK() \ - (_PyInitError){.prefix = NULL, .msg = NULL, .user_err = 0} + (_PyInitError){.prefix = NULL, .msg = NULL, .user_err = 0, .exitcode = -1} #define _Py_INIT_ERR(MSG) \ - (_PyInitError){.prefix = _Py_INIT_GET_FUNC(), .msg = (MSG), .user_err = 0} + (_PyInitError){.prefix = _Py_INIT_GET_FUNC(), .msg = (MSG), .user_err = 0, .exitcode = -1} /* Error that can be fixed by the user like invalid input parameter. Don't abort() the process on such error. */ #define _Py_INIT_USER_ERR(MSG) \ - (_PyInitError){.prefix = _Py_INIT_GET_FUNC(), .msg = (MSG), .user_err = 1} + (_PyInitError){.prefix = _Py_INIT_GET_FUNC(), .msg = (MSG), .user_err = 1, .exitcode = -1} #define _Py_INIT_NO_MEMORY() _Py_INIT_USER_ERR("memory allocation failed") +#define _Py_INIT_EXIT(EXITCODE) \ + (_PyInitError){.prefix = NULL, .msg = NULL, .user_err = 0, .exitcode = (EXITCODE)} #define _Py_INIT_FAILED(err) \ - (err.msg != NULL) + (err.msg != NULL || err.exitcode != -1) /* _PyCoreConfig */ diff --git a/Include/cpython/pylifecycle.h b/Include/cpython/pylifecycle.h index a3fdeefde01b..3bffc80c9376 100644 --- a/Include/cpython/pylifecycle.h +++ b/Include/cpython/pylifecycle.h @@ -39,7 +39,7 @@ PyAPI_FUNC(_PyInitError) _Py_InitializeMainInterpreter( PyAPI_FUNC(_PyInitError) _Py_InitializeFromConfig( const _PyCoreConfig *config); -PyAPI_FUNC(void) _Py_NO_RETURN _Py_FatalInitError(_PyInitError err); +PyAPI_FUNC(void) _Py_NO_RETURN _Py_ExitInitError(_PyInitError err); /* Py_PyAtExit is for the atexit module, Py_AtExit is for low-level * exit functions. diff --git a/Modules/main.c b/Modules/main.c index f373dab20890..0d76953a5cae 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -329,11 +329,6 @@ typedef struct { char **bytes_argv; wchar_t **wchar_argv; - /* Exit status or "exit code": result of pymain_main() */ - int status; - /* Error message if a function failed */ - _PyInitError err; - /* non-zero is stdin is a TTY or if -i option is used */ int stdin_is_interactive; int skip_first_line; /* -x option */ @@ -342,9 +337,6 @@ typedef struct { wchar_t *module; /* -m argument */ } _PyMain; -#define _PyMain_INIT {.err = _Py_INIT_OK()} -/* Note: _PyMain_INIT sets other fields to 0/NULL */ - /* Non-zero if filename, command (-c) or module (-m) is set on the command line */ @@ -353,19 +345,7 @@ typedef struct { || pymain->module != NULL) -static wchar_t* -pymain_wstrdup(_PyMain *pymain, const wchar_t *str) -{ - wchar_t *str2 = _PyMem_RawWcsdup(str); - if (str2 == NULL) { - pymain->err = _Py_INIT_NO_MEMORY(); - return NULL; - } - return str2; -} - - -static int +static _PyInitError pymain_init_cmdline_argv(_PyMain *pymain, _PyCoreConfig *config, _PyCmdline *cmdline) { @@ -376,8 +356,7 @@ pymain_init_cmdline_argv(_PyMain *pymain, _PyCoreConfig *config, size_t size = sizeof(wchar_t*) * (pymain->argc + 1); wchar_t** argv = (wchar_t **)PyMem_RawMalloc(size); if (argv == NULL) { - pymain->err = _Py_INIT_NO_MEMORY(); - return -1; + return _Py_INIT_NO_MEMORY(); } for (int i = 0; i < pymain->argc; i++) { @@ -385,9 +364,8 @@ pymain_init_cmdline_argv(_PyMain *pymain, _PyCoreConfig *config, wchar_t *arg = Py_DecodeLocale(pymain->bytes_argv[i], &len); if (arg == NULL) { _Py_wstrlist_clear(i, argv); - pymain->err = DECODE_LOCALE_ERR("command line arguments", - (Py_ssize_t)len); - return -1; + return DECODE_LOCALE_ERR("command line arguments", + (Py_ssize_t)len); } argv[i] = arg; } @@ -406,12 +384,12 @@ pymain_init_cmdline_argv(_PyMain *pymain, _PyCoreConfig *config, else { program = L""; } - config->program = pymain_wstrdup(pymain, program); + config->program = _PyMem_RawWcsdup(program); if (config->program == NULL) { - return -1; + return _Py_INIT_NO_MEMORY(); } - return 0; + return _Py_INIT_OK(); } @@ -562,26 +540,12 @@ _Py_wstrlist_append(int *len, wchar_t ***list, const wchar_t *str) } -static int -pymain_wstrlist_append(_PyMain *pymain, int *len, wchar_t ***list, const wchar_t *str) -{ - _PyInitError err = _Py_wstrlist_append(len, list, str); - if (_Py_INIT_FAILED(err)) { - pymain->err = err; - return -1; - } - return 0; -} - - -/* Parse the command line arguments - Return 0 on success. - Return 1 if parsing failed. - Set pymain->err and return -1 on other errors. */ -static int +/* Parse the command line arguments */ +static _PyInitError pymain_parse_cmdline_impl(_PyMain *pymain, _PyCoreConfig *config, - _PyCmdline *cmdline) + _PyCmdline *cmdline, int *need_usage) { + _PyInitError err; _PyOS_ResetGetOpt(); do { int longindex = -1; @@ -598,8 +562,7 @@ pymain_parse_cmdline_impl(_PyMain *pymain, _PyCoreConfig *config, size_t len = wcslen(_PyOS_optarg) + 1 + 1; wchar_t *command = PyMem_RawMalloc(sizeof(wchar_t) * len); if (command == NULL) { - pymain->err = _Py_INIT_NO_MEMORY(); - return -1; + return _Py_INIT_NO_MEMORY(); } memcpy(command, _PyOS_optarg, (len - 2) * sizeof(wchar_t)); command[len - 2] = '\n'; @@ -612,9 +575,9 @@ pymain_parse_cmdline_impl(_PyMain *pymain, _PyCoreConfig *config, /* -m is the last option; following arguments that look like options are left for the module to interpret. */ - pymain->module = pymain_wstrdup(pymain, _PyOS_optarg); + pymain->module = _PyMem_RawWcsdup(_PyOS_optarg); if (pymain->module == NULL) { - return -1; + return _Py_INIT_NO_MEMORY(); } break; } @@ -632,7 +595,8 @@ pymain_parse_cmdline_impl(_PyMain *pymain, _PyCoreConfig *config, } else { fprintf(stderr, "--check-hash-based-pycs must be one of " "'default', 'always', or 'never'\n"); - return 1; + *need_usage = 1; + return _Py_INIT_OK(); } break; @@ -701,20 +665,20 @@ pymain_parse_cmdline_impl(_PyMain *pymain, _PyCoreConfig *config, break; case 'W': - if (pymain_wstrlist_append(pymain, - &cmdline->nwarnoption, - &cmdline->warnoptions, - _PyOS_optarg) < 0) { - return -1; + err = _Py_wstrlist_append(&cmdline->nwarnoption, + &cmdline->warnoptions, + _PyOS_optarg); + if (_Py_INIT_FAILED(err)) { + return err; } break; case 'X': - if (pymain_wstrlist_append(pymain, - &config->nxoption, - &config->xoptions, - _PyOS_optarg) < 0) { - return -1; + err = _Py_wstrlist_append(&config->nxoption, + &config->xoptions, + _PyOS_optarg); + if (_Py_INIT_FAILED(err)) { + return err; } break; @@ -730,7 +694,8 @@ pymain_parse_cmdline_impl(_PyMain *pymain, _PyCoreConfig *config, default: /* unknown argument: parsing failed */ - return 1; + *need_usage = 1; + return _Py_INIT_OK(); } } while (1); @@ -738,16 +703,21 @@ pymain_parse_cmdline_impl(_PyMain *pymain, _PyCoreConfig *config, && _PyOS_optind < pymain->argc && wcscmp(cmdline->argv[_PyOS_optind], L"-") != 0) { - pymain->filename = pymain_wstrdup(pymain, cmdline->argv[_PyOS_optind]); + pymain->filename = _PyMem_RawWcsdup(cmdline->argv[_PyOS_optind]); if (pymain->filename == NULL) { - return -1; + return _Py_INIT_NO_MEMORY(); } } + if (pymain->command != NULL || pymain->module != NULL) { + /* Backup _PyOS_optind */ + _PyOS_optind--; + } + /* -c and -m options are exclusive */ assert(!(pymain->command != NULL && pymain->module != NULL)); - return 0; + return _Py_INIT_OK(); } @@ -888,9 +858,7 @@ config_init_warnoptions(_PyCoreConfig *config, _PyCmdline *cmdline) } -/* Get warning options from PYTHONWARNINGS environment variable. - Return 0 on success. - Set pymain->err and return -1 on error. */ +/* Get warning options from PYTHONWARNINGS environment variable. */ static _PyInitError cmdline_init_env_warnoptions(_PyMain *pymain, const _PyCoreConfig *config, _PyCmdline *cmdline) @@ -983,7 +951,7 @@ pymain_header(_PyMain *pymain, const _PyCoreConfig *config) } -static int +static _PyInitError pymain_init_core_argv(_PyMain *pymain, _PyCoreConfig *config, _PyCmdline *cmdline) { /* Copy argv to be able to modify it (to force -c/-m) */ @@ -1001,8 +969,7 @@ pymain_init_core_argv(_PyMain *pymain, _PyCoreConfig *config, _PyCmdline *cmdlin } if (argv == NULL) { - pymain->err = _Py_INIT_NO_MEMORY(); - return -1; + return _Py_INIT_NO_MEMORY(); } wchar_t *arg0 = NULL; @@ -1018,8 +985,7 @@ pymain_init_core_argv(_PyMain *pymain, _PyCoreConfig *config, _PyCmdline *cmdlin arg0 = _PyMem_RawWcsdup(arg0); if (arg0 == NULL) { _Py_wstrlist_clear(argc, argv); - pymain->err = _Py_INIT_NO_MEMORY(); - return -1; + return _Py_INIT_NO_MEMORY(); } assert(argc >= 1); @@ -1029,7 +995,7 @@ pymain_init_core_argv(_PyMain *pymain, _PyCoreConfig *config, _PyCmdline *cmdlin config->argc = argc; config->argv = argv; - return 0; + return _Py_INIT_OK(); } @@ -1104,7 +1070,7 @@ pymain_run_startup(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf) } -static void +static int pymain_run_file(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf) { const wchar_t *filename = pymain->filename; @@ -1121,8 +1087,7 @@ pymain_run_file(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf) fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n", config->program, cfilename, err, strerror(err)); PyMem_RawFree(cfilename_buffer); - pymain->status = 2; - return; + return 2; } if (pymain->skip_first_line) { @@ -1141,17 +1106,15 @@ pymain_run_file(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf) fprintf(stderr, "%ls: '%ls' is a directory, cannot continue\n", config->program, filename); - pymain->status = 1; fclose(fp); - return; + return 1; } /* call pending calls like signal handlers (SIGINT) */ if (Py_MakePendingCalls() == -1) { PyErr_Print(); - pymain->status = 1; fclose(fp); - return; + return 1; } PyObject *unicode, *bytes = NULL; @@ -1173,11 +1136,11 @@ pymain_run_file(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf) /* PyRun_AnyFileExFlags(closeit=1) calls fclose(fp) before running code */ int run = PyRun_AnyFileExFlags(fp, filename_str, 1, cf); Py_XDECREF(bytes); - pymain->status = (run != 0); + return (run != 0); } -static void +static int pymain_run_stdin(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf) { if (pymain->stdin_is_interactive) { @@ -1190,17 +1153,16 @@ pymain_run_stdin(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf) /* call pending calls like signal handlers (SIGINT) */ if (Py_MakePendingCalls() == -1) { PyErr_Print(); - pymain->status = 1; - return; + return 1; } int run = PyRun_AnyFileExFlags(stdin, "", 0, cf); - pymain->status = (run != 0); + return (run != 0); } static void -pymain_repl(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf) +pymain_repl(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf, int *exitcode) { /* Check this environment variable at the end, to give programs the opportunity to set it from Python. */ @@ -1218,100 +1180,86 @@ pymain_repl(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf) pymain_run_interactive_hook(); int res = PyRun_AnyFileFlags(stdin, "", cf); - pymain->status = (res != 0); + *exitcode = (res != 0); } /* Parse the command line. - Handle --version and --help options directly. - - Return 1 if Python must exit. - Return 0 on success. - Set pymain->err and return -1 on failure. */ -static int + Handle --version and --help options directly. */ +static _PyInitError pymain_parse_cmdline(_PyMain *pymain, _PyCoreConfig *config, _PyCmdline *cmdline) { - int res = pymain_parse_cmdline_impl(pymain, config, cmdline); - if (res < 0) { - return -1; - } - if (res) { - pymain_usage(1, config->program); - pymain->status = 2; - return 1; + int need_usage = 0; + _PyInitError err; + err = pymain_parse_cmdline_impl(pymain, config, cmdline, &need_usage); + if (_Py_INIT_FAILED(err)) { + return err; } - if (pymain->command != NULL || pymain->module != NULL) { - /* Backup _PyOS_optind */ - _PyOS_optind--; + if (need_usage) { + pymain_usage(1, config->program); + return _Py_INIT_EXIT(2); } - - return 0; + return _Py_INIT_OK(); } /* Parse command line options and environment variables. - This code must not use Python runtime apart PyMem_Raw memory allocator. - - Return 0 on success. - Return 1 if Python is done and must exit. - Set pymain->err and return -1 on error. */ -static int + This code must not use Python runtime apart PyMem_Raw memory allocator. */ +static _PyInitError pymain_read_conf_impl(_PyMain *pymain, _PyCoreConfig *config, _PyCmdline *cmdline) { _PyInitError err; - int res = pymain_parse_cmdline(pymain, config, cmdline); - if (res != 0) { - return res; + err = pymain_parse_cmdline(pymain, config, cmdline); + if (_Py_INIT_FAILED(err)) { + return err; } - if (pymain_init_core_argv(pymain, config, cmdline) < 0) { - return -1; + err = pymain_init_core_argv(pymain, config, cmdline); + if (_Py_INIT_FAILED(err)) { + return err; } err = _PyCoreConfig_Read(config); if (_Py_INIT_FAILED(err)) { - pymain->err = err; - return -1; + return err; } if (config->use_environment) { err = cmdline_init_env_warnoptions(pymain, config, cmdline); if (_Py_INIT_FAILED(err)) { - pymain->err = err; - return -1; + return err; } } err = config_init_warnoptions(config, cmdline); if (_Py_INIT_FAILED(err)) { - pymain->err = err; - return -1; + return err; } - return 0; + return _Py_INIT_OK(); } /* Read the configuration and initialize the LC_CTYPE locale: enable UTF-8 mode (PEP 540) and/or coerce the C locale (PEP 538). */ -static int +static _PyInitError pymain_read_conf(_PyMain *pymain, _PyCoreConfig *config, _PyCmdline *cmdline) { + _PyInitError err; int init_utf8_mode = Py_UTF8Mode; #ifdef MS_WINDOWS int init_legacy_encoding = Py_LegacyWindowsFSEncodingFlag; #endif _PyCoreConfig save_config = _PyCoreConfig_INIT; - int res = -1; int locale_coerced = 0; int loops = 0; if (_PyCoreConfig_Copy(&save_config, config) < 0) { - pymain->err = _Py_INIT_NO_MEMORY(); + err = _Py_INIT_NO_MEMORY(); goto done; } @@ -1325,8 +1273,8 @@ pymain_read_conf(_PyMain *pymain, _PyCoreConfig *config, /* Watchdog to prevent an infinite loop */ loops++; if (loops == 3) { - pymain->err = _Py_INIT_ERR("Encoding changed twice while " - "reading the configuration"); + err = _Py_INIT_ERR("Encoding changed twice while " + "reading the configuration"); goto done; } @@ -1337,13 +1285,13 @@ pymain_read_conf(_PyMain *pymain, _PyCoreConfig *config, Py_LegacyWindowsFSEncodingFlag = config->legacy_windows_fs_encoding; #endif - if (pymain_init_cmdline_argv(pymain, config, cmdline) < 0) { + err = pymain_init_cmdline_argv(pymain, config, cmdline); + if (_Py_INIT_FAILED(err)) { goto done; } - int conf_res = pymain_read_conf_impl(pymain, config, cmdline); - if (conf_res != 0) { - res = conf_res; + err = pymain_read_conf_impl(pymain, config, cmdline); + if (_Py_INIT_FAILED(err)) { goto done; } @@ -1384,7 +1332,7 @@ pymain_read_conf(_PyMain *pymain, _PyCoreConfig *config, int new_utf8_mode = config->utf8_mode; int new_coerce_c_locale = config->coerce_c_locale; if (_PyCoreConfig_Copy(config, &save_config) < 0) { - pymain->err = _Py_INIT_NO_MEMORY(); + err = _Py_INIT_NO_MEMORY(); goto done; } pymain_clear_cmdline(pymain, cmdline); @@ -1396,7 +1344,7 @@ pymain_read_conf(_PyMain *pymain, _PyCoreConfig *config, /* The encoding changed: read again the configuration with the new encoding */ } - res = 0; + err = _Py_INIT_OK(); done: _PyCoreConfig_Clear(&save_config); @@ -1404,7 +1352,7 @@ pymain_read_conf(_PyMain *pymain, _PyCoreConfig *config, #ifdef MS_WINDOWS Py_LegacyWindowsFSEncodingFlag = init_legacy_encoding; #endif - return res; + return err; } @@ -1605,31 +1553,29 @@ _PyMainInterpreterConfig_Read(_PyMainInterpreterConfig *main_config, } -static int -pymain_init_python_main(_PyMain *pymain, _PyCoreConfig *config, - PyInterpreterState *interp) +static _PyInitError +pymain_init_python_main(_PyMain *pymain, PyInterpreterState *interp) { _PyInitError err; _PyMainInterpreterConfig main_config = _PyMainInterpreterConfig_INIT; - err = _PyMainInterpreterConfig_Read(&main_config, config); + err = _PyMainInterpreterConfig_Read(&main_config, &interp->core_config); if (!_Py_INIT_FAILED(err)) { err = _Py_InitializeMainInterpreter(interp, &main_config); } _PyMainInterpreterConfig_Clear(&main_config); if (_Py_INIT_FAILED(err)) { - pymain->err = err; - return -1; + return err; } - return 0; + return _Py_INIT_OK(); } -static int -pymain_run_python(_PyMain *pymain, PyInterpreterState *interp) +static _PyInitError +pymain_run_python(_PyMain *pymain, PyInterpreterState *interp, int *exitcode) { - int res = 0; + _PyInitError err; _PyCoreConfig *config = &interp->core_config; PyObject *main_importer_path = NULL; @@ -1644,7 +1590,7 @@ pymain_run_python(_PyMain *pymain, PyInterpreterState *interp) if (main_importer_path != NULL) { if (pymain_sys_path_add_path0(interp, main_importer_path) < 0) { - pymain->status = 1; + err = _Py_INIT_EXIT(1); goto done; } } @@ -1652,14 +1598,13 @@ pymain_run_python(_PyMain *pymain, PyInterpreterState *interp) PyObject *path0 = _PyPathConfig_ComputeArgv0(config->argc, config->argv); if (path0 == NULL) { - pymain->err = _Py_INIT_NO_MEMORY(); - res = -1; + err = _Py_INIT_NO_MEMORY(); goto done; } if (pymain_sys_path_add_path0(interp, path0) < 0) { Py_DECREF(path0); - pymain->status = 1; + err = _Py_INIT_EXIT(1); goto done; } Py_DECREF(path0); @@ -1671,67 +1616,65 @@ pymain_run_python(_PyMain *pymain, PyInterpreterState *interp) pymain_import_readline(pymain, config); if (pymain->command) { - pymain->status = pymain_run_command(pymain->command, &cf); + *exitcode = pymain_run_command(pymain->command, &cf); } else if (pymain->module) { - pymain->status = (pymain_run_module(pymain->module, 1) != 0); + *exitcode = (pymain_run_module(pymain->module, 1) != 0); } else if (main_importer_path != NULL) { int sts = pymain_run_module(L"__main__", 0); - pymain->status = (sts != 0); + *exitcode = (sts != 0); } else if (pymain->filename != NULL) { - pymain_run_file(pymain, config, &cf); + *exitcode = pymain_run_file(pymain, config, &cf); } else { - pymain_run_stdin(pymain, config, &cf); + *exitcode = pymain_run_stdin(pymain, config, &cf); } - pymain_repl(pymain, config, &cf); + pymain_repl(pymain, config, &cf, exitcode); + err = _Py_INIT_OK(); done: Py_XDECREF(main_importer_path); - return res; + return err; } -static int +static _PyInitError pymain_cmdline_impl(_PyMain *pymain, _PyCoreConfig *config, _PyCmdline *cmdline) { - pymain->err = _PyRuntime_Initialize(); - if (_Py_INIT_FAILED(pymain->err)) { - return -1; - } + _PyInitError err; - int res = pymain_read_conf(pymain, config, cmdline); - if (res < 0) { - return -1; + err = _PyRuntime_Initialize(); + if (_Py_INIT_FAILED(err)) { + return err; } - if (res > 0) { - /* --help or --version command: we are done */ - return 1; + + err = pymain_read_conf(pymain, config, cmdline); + if (_Py_INIT_FAILED(err)) { + return err; } if (cmdline->print_help) { pymain_usage(0, config->program); - return 1; + return _Py_INIT_EXIT(0); } if (cmdline->print_version) { printf("Python %s\n", (cmdline->print_version >= 2) ? Py_GetVersion() : PY_VERSION); - return 1; + return _Py_INIT_EXIT(0); } /* For Py_GetArgcArgv(). Cleared by pymain_free(). */ orig_argv = _Py_wstrlist_copy(pymain->argc, cmdline->argv); if (orig_argv == NULL) { - pymain->err = _Py_INIT_NO_MEMORY(); - return -1; + return _Py_INIT_NO_MEMORY(); } orig_argc = pymain->argc; - return 0; + return _Py_INIT_OK(); } @@ -1746,7 +1689,7 @@ pymain_cmdline_impl(_PyMain *pymain, _PyCoreConfig *config, _PyCmdline is a temporary structure used to prioritize these variables. */ -static int +static _PyInitError pymain_cmdline(_PyMain *pymain, _PyCoreConfig *config) { /* Force default allocator, since pymain_free() and pymain_clear_config() @@ -1761,7 +1704,7 @@ pymain_cmdline(_PyMain *pymain, _PyCoreConfig *config) _PyCmdline cmdline; memset(&cmdline, 0, sizeof(cmdline)); - int res = pymain_cmdline_impl(pymain, config, &cmdline); + _PyInitError err = pymain_cmdline_impl(pymain, config, &cmdline); pymain_clear_cmdline(pymain, &cmdline); @@ -1772,13 +1715,15 @@ pymain_cmdline(_PyMain *pymain, _PyCoreConfig *config) assert(memcmp(&cur_alloc, &default_alloc, sizeof(cur_alloc)) == 0); #endif PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - return res; + return err; } -static int +static _PyInitError pymain_init(_PyMain *pymain, PyInterpreterState **interp_p) { + _PyInitError err; + /* 754 requires that FP exceptions run in "no stop" mode by default, * and until C vendors implement C99's ways to control FP exceptions, * Python requires non-stop mode. Alas, some platforms enable FP @@ -1793,13 +1738,9 @@ pymain_init(_PyMain *pymain, PyInterpreterState **interp_p) _PyCoreConfig_GetGlobalConfig(config); - int cmd_res = pymain_cmdline(pymain, config); - if (cmd_res < 0) { - _Py_FatalInitError(pymain->err); - } - if (cmd_res == 1) { - pymain_clear_config(config); - return 1; + err = pymain_cmdline(pymain, config); + if (_Py_INIT_FAILED(err)) { + goto done; } _PyCoreConfig_SetGlobalConfig(config); @@ -1807,37 +1748,46 @@ pymain_init(_PyMain *pymain, PyInterpreterState **interp_p) pymain_init_stdio(pymain, config); PyInterpreterState *interp; - pymain->err = _Py_InitializeCore(&interp, config); - if (_Py_INIT_FAILED(pymain->err)) { - _Py_FatalInitError(pymain->err); + err = _Py_InitializeCore(&interp, config); + if (_Py_INIT_FAILED(err)) { + goto done; } *interp_p = interp; - pymain_clear_config(config); - config = &interp->core_config; - - if (pymain_init_python_main(pymain, config, interp) < 0) { - _Py_FatalInitError(pymain->err); + err = pymain_init_python_main(pymain, interp); + if (_Py_INIT_FAILED(err)) { + goto done; } - return 0; + + err = _Py_INIT_OK(); + +done: + pymain_clear_config(config); + return err; } static int pymain_main(_PyMain *pymain) { + _PyInitError err; + PyInterpreterState *interp; - int res = pymain_init(pymain, &interp); - if (res != 1) { - if (pymain_run_python(pymain, interp) < 0) { - _Py_FatalInitError(pymain->err); - } + err = pymain_init(pymain, &interp); + if (_Py_INIT_FAILED(err)) { + _Py_ExitInitError(err); + } - if (Py_FinalizeEx() < 0) { - /* Value unlikely to be confused with a non-error exit status or - other special meaning */ - pymain->status = 120; - } + int exitcode = 0; + err = pymain_run_python(pymain, interp, &exitcode); + if (_Py_INIT_FAILED(err)) { + _Py_ExitInitError(err); + } + + if (Py_FinalizeEx() < 0) { + /* Value unlikely to be confused with a non-error exit status or + other special meaning */ + exitcode = 120; } pymain_free(pymain); @@ -1859,20 +1809,22 @@ pymain_main(_PyMain *pymain) #ifdef MS_WINDOWS /* cmd.exe detects this, prints ^C, and offers to terminate. */ /* https://msdn.microsoft.com/en-us/library/cc704588.aspx */ - pymain->status = STATUS_CONTROL_C_EXIT; + exitcode = STATUS_CONTROL_C_EXIT; #else - pymain->status = SIGINT + 128; + exitcode = SIGINT + 128; #endif /* !MS_WINDOWS */ } - return pymain->status; + return exitcode; } int Py_Main(int argc, wchar_t **argv) { - _PyMain pymain = _PyMain_INIT; + _PyMain pymain; + memset(&pymain, 0, sizeof(pymain)); + pymain.use_bytes_argv = 0; pymain.argc = argc; pymain.wchar_argv = argv; @@ -1884,7 +1836,9 @@ Py_Main(int argc, wchar_t **argv) int _Py_UnixMain(int argc, char **argv) { - _PyMain pymain = _PyMain_INIT; + _PyMain pymain; + memset(&pymain, 0, sizeof(pymain)); + pymain.use_bytes_argv = 1; pymain.argc = argc; pymain.bytes_argv = argv; diff --git a/Programs/_freeze_importlib.c b/Programs/_freeze_importlib.c index 3f43757ecb1f..d0e40c96a7a8 100644 --- a/Programs/_freeze_importlib.c +++ b/Programs/_freeze_importlib.c @@ -89,7 +89,7 @@ main(int argc, char *argv[]) /* No need to call _PyCoreConfig_Clear() since we didn't allocate any memory: program_name is a constant string. */ if (_Py_INIT_FAILED(err)) { - _Py_FatalInitError(err); + _Py_ExitInitError(err); } sprintf(buf, "", name); diff --git a/Programs/_testembed.c b/Programs/_testembed.c index e28d94c175e6..6b5311be27ac 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -553,7 +553,7 @@ static int test_init_from_config(void) _PyInitError err = _Py_InitializeFromConfig(&config); /* Don't call _PyCoreConfig_Clear() since all strings are static */ if (_Py_INIT_FAILED(err)) { - _Py_FatalInitError(err); + _Py_ExitInitError(err); } dump_config(); Py_Finalize(); @@ -618,7 +618,7 @@ static int test_init_isolated(void) test_init_env_putenvs(); _PyInitError err = _Py_InitializeFromConfig(&config); if (_Py_INIT_FAILED(err)) { - _Py_FatalInitError(err); + _Py_ExitInitError(err); } dump_config(); Py_Finalize(); @@ -635,7 +635,7 @@ static int test_init_dev_mode(void) config.program_name = L"./_testembed"; _PyInitError err = _Py_InitializeFromConfig(&config); if (_Py_INIT_FAILED(err)) { - _Py_FatalInitError(err); + _Py_ExitInitError(err); } dump_config(); Py_Finalize(); diff --git a/Python/frozenmain.c b/Python/frozenmain.c index 616090965b13..6554aa75b038 100644 --- a/Python/frozenmain.c +++ b/Python/frozenmain.c @@ -86,7 +86,7 @@ Py_FrozenMain(int argc, char **argv) /* No need to call _PyCoreConfig_Clear() since we didn't allocate any memory: program_name is a constant string. */ if (_Py_INIT_FAILED(err)) { - _Py_FatalInitError(err); + _Py_ExitInitError(err); } #ifdef MS_WINDOWS diff --git a/Python/pathconfig.c b/Python/pathconfig.c index eadc09baa9f1..f96f0153e210 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -408,7 +408,7 @@ pathconfig_global_init(void) error: _PyCoreConfig_Clear(&config); - _Py_FatalInitError(err); + _Py_ExitInitError(err); } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 1d65d3b86f72..088e7aa9313d 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -960,7 +960,7 @@ Py_InitializeEx(int install_sigs) _PyCoreConfig_Clear(&config); if (_Py_INIT_FAILED(err)) { - _Py_FatalInitError(err); + _Py_ExitInitError(err); } } @@ -1432,7 +1432,7 @@ Py_NewInterpreter(void) PyThreadState *tstate; _PyInitError err = new_interpreter(&tstate); if (_Py_INIT_FAILED(err)) { - _Py_FatalInitError(err); + _Py_ExitInitError(err); } return tstate; @@ -2073,12 +2073,17 @@ Py_FatalError(const char *msg) } void _Py_NO_RETURN -_Py_FatalInitError(_PyInitError err) +_Py_ExitInitError(_PyInitError err) { - /* On "user" error: exit with status 1. - For all other errors, call abort(). */ - int status = err.user_err ? 1 : -1; - fatal_error(err.prefix, err.msg, status); + if (err.exitcode >= 0) { + exit(err.exitcode); + } + else { + /* On "user" error: exit with status 1. + For all other errors, call abort(). */ + int status = err.user_err ? 1 : -1; + fatal_error(err.prefix, err.msg, status); + } } /* Clean up and exit */ From webhook-mailer at python.org Fri Mar 1 07:10:21 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 01 Mar 2019 12:10:21 -0000 Subject: [Python-checkins] bpo-36142: Remove _PyMain structure (GH-12120) Message-ID: https://github.com/python/cpython/commit/62be763348d16ba90f96667aa0240503261393f0 commit: 62be763348d16ba90f96667aa0240503261393f0 branch: master author: Victor Stinner committer: GitHub date: 2019-03-01T13:10:14+01:00 summary: bpo-36142: Remove _PyMain structure (GH-12120) * Move fields from _PyMain to _PyCoreConfig: * skip_first_line * run_command * run_module * run_filename * Replace _PyMain.stdin_is_interactive with a new stdin_is_interactive(config) function * Rename _PyMain to _PyArgv. Add "const _PyArgv *args" field to _PyCmdline. files: M Include/cpython/coreconfig.h M Lib/test/test_embed.py M Modules/main.c M Python/coreconfig.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index 2ce99b2eab64..4985bf3a7598 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -276,7 +276,19 @@ typedef struct { int legacy_windows_stdio; #endif - /* --- Private fields -------- */ + /* --- Parameter only used by Py_Main() ---------- */ + + /* Skip the first line of the source ('run_filename' parameter), allowing use of non-Unix forms of + "#!cmd". This is intended for a DOS specific hack only. + + Set by the -x command line option. */ + int skip_source_first_line; + + wchar_t *run_command; /* -c command line argument */ + wchar_t *run_module; /* -m command line argument */ + wchar_t *run_filename; /* Trailing command line argument without -c or -m */ + + /* --- Private fields ---------------------------- */ /* Install importlib? If set to 0, importlib is not initialized at all. Needed by freeze_importlib. */ diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index d35b9f4d5a2f..6c245ebcd194 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -322,6 +322,11 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'stdio_encoding': GET_DEFAULT_CONFIG, 'stdio_errors': GET_DEFAULT_CONFIG, + 'skip_source_first_line': 0, + 'run_command': None, + 'run_module': None, + 'run_filename': None, + '_install_importlib': 1, '_check_hash_pycs_mode': 'default', '_frozen': 0, diff --git a/Modules/main.c b/Modules/main.c index 0d76953a5cae..e7d75a79e787 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -312,6 +312,14 @@ pymain_run_command(wchar_t *command, PyCompilerFlags *cf) /* Main program */ typedef struct { + int argc; + int use_bytes_argv; + char **bytes_argv; + wchar_t **wchar_argv; +} _PyArgv; + +typedef struct { + const _PyArgv *args; wchar_t **argv; int nwarnoption; /* Number of -W command line options */ wchar_t **warnoptions; /* Command line -W options */ @@ -321,47 +329,33 @@ typedef struct { int print_version; /* -V option */ } _PyCmdline; -/* Structure used by Py_Main() to pass data to subfunctions */ -typedef struct { - /* Input arguments */ - int argc; - int use_bytes_argv; - char **bytes_argv; - wchar_t **wchar_argv; - - /* non-zero is stdin is a TTY or if -i option is used */ - int stdin_is_interactive; - int skip_first_line; /* -x option */ - wchar_t *filename; /* Trailing arg without -c or -m */ - wchar_t *command; /* -c argument */ - wchar_t *module; /* -m argument */ -} _PyMain; /* Non-zero if filename, command (-c) or module (-m) is set on the command line */ -#define RUN_CODE(pymain) \ - (pymain->command != NULL || pymain->filename != NULL \ - || pymain->module != NULL) +#define RUN_CODE(config) \ + (config->run_command != NULL || config->run_filename != NULL \ + || config->run_module != NULL) static _PyInitError -pymain_init_cmdline_argv(_PyMain *pymain, _PyCoreConfig *config, - _PyCmdline *cmdline) +pymain_init_cmdline_argv(_PyCoreConfig *config, _PyCmdline *cmdline) { assert(cmdline->argv == NULL); - if (pymain->use_bytes_argv) { + const _PyArgv *args = cmdline->args; + + if (args->use_bytes_argv) { /* +1 for a the NULL terminator */ - size_t size = sizeof(wchar_t*) * (pymain->argc + 1); + size_t size = sizeof(wchar_t*) * (args->argc + 1); wchar_t** argv = (wchar_t **)PyMem_RawMalloc(size); if (argv == NULL) { return _Py_INIT_NO_MEMORY(); } - for (int i = 0; i < pymain->argc; i++) { + for (int i = 0; i < args->argc; i++) { size_t len; - wchar_t *arg = Py_DecodeLocale(pymain->bytes_argv[i], &len); + wchar_t *arg = Py_DecodeLocale(args->bytes_argv[i], &len); if (arg == NULL) { _Py_wstrlist_clear(i, argv); return DECODE_LOCALE_ERR("command line arguments", @@ -369,16 +363,16 @@ pymain_init_cmdline_argv(_PyMain *pymain, _PyCoreConfig *config, } argv[i] = arg; } - argv[pymain->argc] = NULL; + argv[args->argc] = NULL; cmdline->argv = argv; } else { - cmdline->argv = pymain->wchar_argv; + cmdline->argv = args->wchar_argv; } wchar_t *program; - if (pymain->argc >= 1 && cmdline->argv != NULL) { + if (args->argc >= 1 && cmdline->argv != NULL) { program = cmdline->argv[0]; } else { @@ -394,7 +388,7 @@ pymain_init_cmdline_argv(_PyMain *pymain, _PyCoreConfig *config, static void -pymain_clear_cmdline(_PyMain *pymain, _PyCmdline *cmdline) +pymain_clear_cmdline(_PyCmdline *cmdline) { PyMemAllocatorEx old_alloc; _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); @@ -407,8 +401,8 @@ pymain_clear_cmdline(_PyMain *pymain, _PyCmdline *cmdline) cmdline->nenv_warnoption = 0; cmdline->env_warnoptions = NULL; - if (pymain->use_bytes_argv && cmdline->argv != NULL) { - _Py_wstrlist_clear(pymain->argc, cmdline->argv); + if (cmdline->args->use_bytes_argv && cmdline->argv != NULL) { + _Py_wstrlist_clear(cmdline->args->argc, cmdline->argv); } cmdline->argv = NULL; @@ -416,21 +410,6 @@ pymain_clear_cmdline(_PyMain *pymain, _PyCmdline *cmdline) } -static void -pymain_clear_pymain(_PyMain *pymain) -{ -#define CLEAR(ATTR) \ - do { \ - PyMem_RawFree(ATTR); \ - ATTR = NULL; \ - } while (0) - - CLEAR(pymain->filename); - CLEAR(pymain->command); - CLEAR(pymain->module); -#undef CLEAR -} - static void pymain_clear_config(_PyCoreConfig *config) { @@ -446,7 +425,7 @@ pymain_clear_config(_PyCoreConfig *config) static void -pymain_free(_PyMain *pymain) +pymain_free(void) { _PyImport_Fini2(); @@ -461,8 +440,6 @@ pymain_free(_PyMain *pymain) PyMemAllocatorEx old_alloc; _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - pymain_clear_pymain(pymain); - _Py_wstrlist_clear(orig_argc, orig_argv); orig_argc = 0; orig_argv = NULL; @@ -542,14 +519,14 @@ _Py_wstrlist_append(int *len, wchar_t ***list, const wchar_t *str) /* Parse the command line arguments */ static _PyInitError -pymain_parse_cmdline_impl(_PyMain *pymain, _PyCoreConfig *config, - _PyCmdline *cmdline, int *need_usage) +pymain_parse_cmdline_impl(_PyCoreConfig *config, _PyCmdline *cmdline, + int *need_usage) { _PyInitError err; _PyOS_ResetGetOpt(); do { int longindex = -1; - int c = _PyOS_GetOpt(pymain->argc, cmdline->argv, PROGRAM_OPTS, + int c = _PyOS_GetOpt(cmdline->args->argc, cmdline->argv, PROGRAM_OPTS, longoptions, &longindex); if (c == EOF) { break; @@ -567,7 +544,7 @@ pymain_parse_cmdline_impl(_PyMain *pymain, _PyCoreConfig *config, memcpy(command, _PyOS_optarg, (len - 2) * sizeof(wchar_t)); command[len - 2] = '\n'; command[len - 1] = 0; - pymain->command = command; + config->run_command = command; break; } @@ -575,8 +552,8 @@ pymain_parse_cmdline_impl(_PyMain *pymain, _PyCoreConfig *config, /* -m is the last option; following arguments that look like options are left for the module to interpret. */ - pymain->module = _PyMem_RawWcsdup(_PyOS_optarg); - if (pymain->module == NULL) { + config->run_module = _PyMem_RawWcsdup(_PyOS_optarg); + if (config->run_module == NULL) { return _Py_INIT_NO_MEMORY(); } break; @@ -652,7 +629,7 @@ pymain_parse_cmdline_impl(_PyMain *pymain, _PyCoreConfig *config, break; case 'x': - pymain->skip_first_line = 1; + config->skip_source_first_line = 1; break; case 'h': @@ -699,23 +676,23 @@ pymain_parse_cmdline_impl(_PyMain *pymain, _PyCoreConfig *config, } } while (1); - if (pymain->command == NULL && pymain->module == NULL - && _PyOS_optind < pymain->argc + if (config->run_command == NULL && config->run_module == NULL + && _PyOS_optind < cmdline->args->argc && wcscmp(cmdline->argv[_PyOS_optind], L"-") != 0) { - pymain->filename = _PyMem_RawWcsdup(cmdline->argv[_PyOS_optind]); - if (pymain->filename == NULL) { + config->run_filename = _PyMem_RawWcsdup(cmdline->argv[_PyOS_optind]); + if (config->run_filename == NULL) { return _Py_INIT_NO_MEMORY(); } } - if (pymain->command != NULL || pymain->module != NULL) { + if (config->run_command != NULL || config->run_module != NULL) { /* Backup _PyOS_optind */ _PyOS_optind--; } /* -c and -m options are exclusive */ - assert(!(pymain->command != NULL && pymain->module != NULL)); + assert(!(config->run_command != NULL && config->run_module != NULL)); return _Py_INIT_OK(); } @@ -860,8 +837,7 @@ config_init_warnoptions(_PyCoreConfig *config, _PyCmdline *cmdline) /* Get warning options from PYTHONWARNINGS environment variable. */ static _PyInitError -cmdline_init_env_warnoptions(_PyMain *pymain, const _PyCoreConfig *config, - _PyCmdline *cmdline) +cmdline_init_env_warnoptions(const _PyCoreConfig *config, _PyCmdline *cmdline) { wchar_t *env; int res = _PyCoreConfig_GetEnvDup(config, &env, @@ -893,12 +869,17 @@ cmdline_init_env_warnoptions(_PyMain *pymain, const _PyCoreConfig *config, } -static void -pymain_init_stdio(_PyMain *pymain, _PyCoreConfig *config) +/* Return non-zero is stdin is a TTY or if -i command line option is used */ +static int +stdin_is_interactive(const _PyCoreConfig *config) { - pymain->stdin_is_interactive = (isatty(fileno(stdin)) - || config->interactive); + return (isatty(fileno(stdin)) || config->interactive); +} + +static void +pymain_init_stdio(_PyCoreConfig *config) +{ #if defined(MS_WINDOWS) || defined(__CYGWIN__) /* don't translate newlines (\r\n <=> \n) */ _setmode(fileno(stdin), O_BINARY); @@ -934,13 +915,13 @@ pymain_init_stdio(_PyMain *pymain, _PyCoreConfig *config) static void -pymain_header(_PyMain *pymain, const _PyCoreConfig *config) +pymain_header(const _PyCoreConfig *config) { if (config->quiet) { return; } - if (!config->verbose && (RUN_CODE(pymain) || !pymain->stdin_is_interactive)) { + if (!config->verbose && (RUN_CODE(config) || !stdin_is_interactive(config))) { return; } @@ -952,10 +933,10 @@ pymain_header(_PyMain *pymain, const _PyCoreConfig *config) static _PyInitError -pymain_init_core_argv(_PyMain *pymain, _PyCoreConfig *config, _PyCmdline *cmdline) +pymain_init_core_argv(_PyCoreConfig *config, _PyCmdline *cmdline) { /* Copy argv to be able to modify it (to force -c/-m) */ - int argc = pymain->argc - _PyOS_optind; + int argc = cmdline->args->argc - _PyOS_optind; wchar_t **argv; if (argc <= 0 || cmdline->argv == NULL) { @@ -973,11 +954,11 @@ pymain_init_core_argv(_PyMain *pymain, _PyCoreConfig *config, _PyCmdline *cmdlin } wchar_t *arg0 = NULL; - if (pymain->command != NULL) { + if (config->run_command != NULL) { /* Force sys.argv[0] = '-c' */ arg0 = L"-c"; } - else if (pymain->module != NULL) { + else if (config->run_module != NULL) { /* Force sys.argv[0] = '-m'*/ arg0 = L"-m"; } @@ -1022,12 +1003,12 @@ _Py_wstrlist_as_pylist(int len, wchar_t **list) static void -pymain_import_readline(_PyMain *pymain, const _PyCoreConfig *config) +pymain_import_readline(const _PyCoreConfig *config) { if (config->isolated) { return; } - if (!config->inspect && RUN_CODE(pymain)) { + if (!config->inspect && RUN_CODE(config)) { return; } if (!isatty(fileno(stdin))) { @@ -1045,7 +1026,7 @@ pymain_import_readline(_PyMain *pymain, const _PyCoreConfig *config) static void -pymain_run_startup(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf) +pymain_run_startup(_PyCoreConfig *config, PyCompilerFlags *cf) { const char *startup = _PyCoreConfig_GetEnv(config, "PYTHONSTARTUP"); if (startup == NULL) { @@ -1071,9 +1052,9 @@ pymain_run_startup(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf) static int -pymain_run_file(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf) +pymain_run_file(_PyCoreConfig *config, PyCompilerFlags *cf) { - const wchar_t *filename = pymain->filename; + const wchar_t *filename = config->run_filename; FILE *fp = _Py_wfopen(filename, L"r"); if (fp == NULL) { char *cfilename_buffer; @@ -1090,7 +1071,7 @@ pymain_run_file(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf) return 2; } - if (pymain->skip_first_line) { + if (config->skip_source_first_line) { int ch; /* Push back first newline so line numbers remain the same */ while ((ch = getc(fp)) != EOF) { @@ -1141,12 +1122,12 @@ pymain_run_file(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf) static int -pymain_run_stdin(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf) +pymain_run_stdin(_PyCoreConfig *config, PyCompilerFlags *cf) { - if (pymain->stdin_is_interactive) { + if (stdin_is_interactive(config)) { Py_InspectFlag = 0; /* do exit on SystemExit */ config->inspect = 0; - pymain_run_startup(pymain, config, cf); + pymain_run_startup(config, cf); pymain_run_interactive_hook(); } @@ -1162,7 +1143,7 @@ pymain_run_stdin(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf) static void -pymain_repl(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf, int *exitcode) +pymain_repl(_PyCoreConfig *config, PyCompilerFlags *cf, int *exitcode) { /* Check this environment variable at the end, to give programs the opportunity to set it from Python. */ @@ -1171,7 +1152,7 @@ pymain_repl(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf, int *ex config->inspect = 1; } - if (!(Py_InspectFlag && pymain->stdin_is_interactive && RUN_CODE(pymain))) { + if (!(Py_InspectFlag && stdin_is_interactive(config) && RUN_CODE(config))) { return; } @@ -1187,12 +1168,11 @@ pymain_repl(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf, int *ex /* Parse the command line. Handle --version and --help options directly. */ static _PyInitError -pymain_parse_cmdline(_PyMain *pymain, _PyCoreConfig *config, - _PyCmdline *cmdline) +pymain_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline) { int need_usage = 0; _PyInitError err; - err = pymain_parse_cmdline_impl(pymain, config, cmdline, &need_usage); + err = pymain_parse_cmdline_impl(config, cmdline, &need_usage); if (_Py_INIT_FAILED(err)) { return err; } @@ -1208,17 +1188,16 @@ pymain_parse_cmdline(_PyMain *pymain, _PyCoreConfig *config, /* Parse command line options and environment variables. This code must not use Python runtime apart PyMem_Raw memory allocator. */ static _PyInitError -pymain_read_conf_impl(_PyMain *pymain, _PyCoreConfig *config, - _PyCmdline *cmdline) +pymain_read_conf_impl(_PyCoreConfig *config, _PyCmdline *cmdline) { _PyInitError err; - err = pymain_parse_cmdline(pymain, config, cmdline); + err = pymain_parse_cmdline(config, cmdline); if (_Py_INIT_FAILED(err)) { return err; } - err = pymain_init_core_argv(pymain, config, cmdline); + err = pymain_init_core_argv(config, cmdline); if (_Py_INIT_FAILED(err)) { return err; } @@ -1229,7 +1208,7 @@ pymain_read_conf_impl(_PyMain *pymain, _PyCoreConfig *config, } if (config->use_environment) { - err = cmdline_init_env_warnoptions(pymain, config, cmdline); + err = cmdline_init_env_warnoptions(config, cmdline); if (_Py_INIT_FAILED(err)) { return err; } @@ -1246,8 +1225,7 @@ pymain_read_conf_impl(_PyMain *pymain, _PyCoreConfig *config, /* Read the configuration and initialize the LC_CTYPE locale: enable UTF-8 mode (PEP 540) and/or coerce the C locale (PEP 538). */ static _PyInitError -pymain_read_conf(_PyMain *pymain, _PyCoreConfig *config, - _PyCmdline *cmdline) +pymain_read_conf(_PyCoreConfig *config, _PyCmdline *cmdline) { _PyInitError err; int init_utf8_mode = Py_UTF8Mode; @@ -1285,12 +1263,12 @@ pymain_read_conf(_PyMain *pymain, _PyCoreConfig *config, Py_LegacyWindowsFSEncodingFlag = config->legacy_windows_fs_encoding; #endif - err = pymain_init_cmdline_argv(pymain, config, cmdline); + err = pymain_init_cmdline_argv(config, cmdline); if (_Py_INIT_FAILED(err)) { goto done; } - err = pymain_read_conf_impl(pymain, config, cmdline); + err = pymain_read_conf_impl(config, cmdline); if (_Py_INIT_FAILED(err)) { goto done; } @@ -1335,9 +1313,10 @@ pymain_read_conf(_PyMain *pymain, _PyCoreConfig *config, err = _Py_INIT_NO_MEMORY(); goto done; } - pymain_clear_cmdline(pymain, cmdline); - pymain_clear_pymain(pymain); + pymain_clear_cmdline(cmdline); + const _PyArgv *args = cmdline->args; memset(cmdline, 0, sizeof(*cmdline)); + cmdline->args = args; config->utf8_mode = new_utf8_mode; config->coerce_c_locale = new_coerce_c_locale; @@ -1554,7 +1533,7 @@ _PyMainInterpreterConfig_Read(_PyMainInterpreterConfig *main_config, static _PyInitError -pymain_init_python_main(_PyMain *pymain, PyInterpreterState *interp) +pymain_init_python_main(PyInterpreterState *interp) { _PyInitError err; @@ -1573,19 +1552,19 @@ pymain_init_python_main(_PyMain *pymain, PyInterpreterState *interp) static _PyInitError -pymain_run_python(_PyMain *pymain, PyInterpreterState *interp, int *exitcode) +pymain_run_python(PyInterpreterState *interp, int *exitcode) { _PyInitError err; _PyCoreConfig *config = &interp->core_config; PyObject *main_importer_path = NULL; - if (pymain->filename != NULL) { + if (config->run_filename != NULL) { /* If filename is a package (ex: directory or ZIP file) which contains __main__.py, main_importer_path is set to filename and will be prepended to sys.path. Otherwise, main_importer_path is set to NULL. */ - main_importer_path = pymain_get_importer(pymain->filename); + main_importer_path = pymain_get_importer(config->run_filename); } if (main_importer_path != NULL) { @@ -1612,27 +1591,27 @@ pymain_run_python(_PyMain *pymain, PyInterpreterState *interp, int *exitcode) PyCompilerFlags cf = {.cf_flags = 0}; - pymain_header(pymain, config); - pymain_import_readline(pymain, config); + pymain_header(config); + pymain_import_readline(config); - if (pymain->command) { - *exitcode = pymain_run_command(pymain->command, &cf); + if (config->run_command) { + *exitcode = pymain_run_command(config->run_command, &cf); } - else if (pymain->module) { - *exitcode = (pymain_run_module(pymain->module, 1) != 0); + else if (config->run_module) { + *exitcode = (pymain_run_module(config->run_module, 1) != 0); } else if (main_importer_path != NULL) { int sts = pymain_run_module(L"__main__", 0); *exitcode = (sts != 0); } - else if (pymain->filename != NULL) { - *exitcode = pymain_run_file(pymain, config, &cf); + else if (config->run_filename != NULL) { + *exitcode = pymain_run_file(config, &cf); } else { - *exitcode = pymain_run_stdin(pymain, config, &cf); + *exitcode = pymain_run_stdin(config, &cf); } - pymain_repl(pymain, config, &cf, exitcode); + pymain_repl(config, &cf, exitcode); err = _Py_INIT_OK(); done: @@ -1642,8 +1621,7 @@ pymain_run_python(_PyMain *pymain, PyInterpreterState *interp, int *exitcode) static _PyInitError -pymain_cmdline_impl(_PyMain *pymain, _PyCoreConfig *config, - _PyCmdline *cmdline) +pymain_cmdline_impl(_PyCoreConfig *config, _PyCmdline *cmdline) { _PyInitError err; @@ -1652,7 +1630,7 @@ pymain_cmdline_impl(_PyMain *pymain, _PyCoreConfig *config, return err; } - err = pymain_read_conf(pymain, config, cmdline); + err = pymain_read_conf(config, cmdline); if (_Py_INIT_FAILED(err)) { return err; } @@ -1669,11 +1647,11 @@ pymain_cmdline_impl(_PyMain *pymain, _PyCoreConfig *config, } /* For Py_GetArgcArgv(). Cleared by pymain_free(). */ - orig_argv = _Py_wstrlist_copy(pymain->argc, cmdline->argv); + orig_argv = _Py_wstrlist_copy(cmdline->args->argc, cmdline->argv); if (orig_argv == NULL) { return _Py_INIT_NO_MEMORY(); } - orig_argc = pymain->argc; + orig_argc = cmdline->args->argc; return _Py_INIT_OK(); } @@ -1690,7 +1668,7 @@ pymain_cmdline_impl(_PyMain *pymain, _PyCoreConfig *config, _PyCmdline is a temporary structure used to prioritize these variables. */ static _PyInitError -pymain_cmdline(_PyMain *pymain, _PyCoreConfig *config) +pymain_cmdline(_PyArgv *args, _PyCoreConfig *config) { /* Force default allocator, since pymain_free() and pymain_clear_config() must use the same allocator than this function. */ @@ -1703,10 +1681,11 @@ pymain_cmdline(_PyMain *pymain, _PyCoreConfig *config) _PyCmdline cmdline; memset(&cmdline, 0, sizeof(cmdline)); + cmdline.args = args; - _PyInitError err = pymain_cmdline_impl(pymain, config, &cmdline); + _PyInitError err = pymain_cmdline_impl(config, &cmdline); - pymain_clear_cmdline(pymain, &cmdline); + pymain_clear_cmdline(&cmdline); #ifdef Py_DEBUG /* Make sure that PYMEM_DOMAIN_RAW has not been modified */ @@ -1720,7 +1699,7 @@ pymain_cmdline(_PyMain *pymain, _PyCoreConfig *config) static _PyInitError -pymain_init(_PyMain *pymain, PyInterpreterState **interp_p) +pymain_init(_PyArgv *args, PyInterpreterState **interp_p) { _PyInitError err; @@ -1738,14 +1717,14 @@ pymain_init(_PyMain *pymain, PyInterpreterState **interp_p) _PyCoreConfig_GetGlobalConfig(config); - err = pymain_cmdline(pymain, config); + err = pymain_cmdline(args, config); if (_Py_INIT_FAILED(err)) { goto done; } _PyCoreConfig_SetGlobalConfig(config); - pymain_init_stdio(pymain, config); + pymain_init_stdio(config); PyInterpreterState *interp; err = _Py_InitializeCore(&interp, config); @@ -1754,7 +1733,7 @@ pymain_init(_PyMain *pymain, PyInterpreterState **interp_p) } *interp_p = interp; - err = pymain_init_python_main(pymain, interp); + err = pymain_init_python_main(interp); if (_Py_INIT_FAILED(err)) { goto done; } @@ -1768,18 +1747,18 @@ pymain_init(_PyMain *pymain, PyInterpreterState **interp_p) static int -pymain_main(_PyMain *pymain) +pymain_main(_PyArgv *args) { _PyInitError err; PyInterpreterState *interp; - err = pymain_init(pymain, &interp); + err = pymain_init(args, &interp); if (_Py_INIT_FAILED(err)) { _Py_ExitInitError(err); } int exitcode = 0; - err = pymain_run_python(pymain, interp, &exitcode); + err = pymain_run_python(interp, &exitcode); if (_Py_INIT_FAILED(err)) { _Py_ExitInitError(err); } @@ -1790,7 +1769,7 @@ pymain_main(_PyMain *pymain) exitcode = 120; } - pymain_free(pymain); + pymain_free(); if (_Py_UnhandledKeyboardInterrupt) { /* https://bugs.python.org/issue1054041 - We need to exit via the @@ -1822,28 +1801,24 @@ pymain_main(_PyMain *pymain) int Py_Main(int argc, wchar_t **argv) { - _PyMain pymain; - memset(&pymain, 0, sizeof(pymain)); - - pymain.use_bytes_argv = 0; - pymain.argc = argc; - pymain.wchar_argv = argv; - - return pymain_main(&pymain); + _PyArgv args = { + .argc = argc, + .use_bytes_argv = 0, + .bytes_argv = NULL, + .wchar_argv = argv}; + return pymain_main(&args); } int _Py_UnixMain(int argc, char **argv) { - _PyMain pymain; - memset(&pymain, 0, sizeof(pymain)); - - pymain.use_bytes_argv = 1; - pymain.argc = argc; - pymain.bytes_argv = argv; - - return pymain_main(&pymain); + _PyArgv args = { + .argc = argc, + .use_bytes_argv = 1, + .bytes_argv = argv, + .wchar_argv = NULL}; + return pymain_main(&args); } diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 06dbada6dfb6..d9b30130c931 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -424,6 +424,10 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) COPY_ATTR(legacy_windows_fs_encoding); COPY_ATTR(legacy_windows_stdio); #endif + COPY_ATTR(skip_source_first_line); + COPY_WSTR_ATTR(run_command); + COPY_WSTR_ATTR(run_module); + COPY_WSTR_ATTR(run_filename); COPY_ATTR(_check_hash_pycs_mode); COPY_ATTR(_frozen); @@ -1559,6 +1563,10 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) SET_ITEM_INT(legacy_windows_fs_encoding); SET_ITEM_INT(legacy_windows_stdio); #endif + SET_ITEM_INT(skip_source_first_line); + SET_ITEM_WSTR(run_command); + SET_ITEM_WSTR(run_module); + SET_ITEM_WSTR(run_filename); SET_ITEM_INT(_install_importlib); SET_ITEM_STR(_check_hash_pycs_mode); SET_ITEM_INT(_frozen); From webhook-mailer at python.org Fri Mar 1 07:53:50 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 01 Mar 2019 12:53:50 -0000 Subject: [Python-checkins] bpo-36146: Fix inc_dirs in setup.py on macOS (GH-12098) Message-ID: https://github.com/python/cpython/commit/96d81583be98cec9728636186ea32b662cb091d5 commit: 96d81583be98cec9728636186ea32b662cb091d5 branch: master author: Victor Stinner committer: GitHub date: 2019-03-01T13:53:46+01:00 summary: bpo-36146: Fix inc_dirs in setup.py on macOS (GH-12098) Fix setup.py on macOS: only add /usr/include/ffi to include directories of _ctypes, not for all extensions. files: A Misc/NEWS.d/next/Build/2019-02-28-18-09-01.bpo-36146.IwPJVT.rst M setup.py diff --git a/Misc/NEWS.d/next/Build/2019-02-28-18-09-01.bpo-36146.IwPJVT.rst b/Misc/NEWS.d/next/Build/2019-02-28-18-09-01.bpo-36146.IwPJVT.rst new file mode 100644 index 000000000000..93c1e1afac87 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2019-02-28-18-09-01.bpo-36146.IwPJVT.rst @@ -0,0 +1,2 @@ +Fix setup.py on macOS: only add ``/usr/include/ffi`` to include +directories of _ctypes, not for all extensions. diff --git a/setup.py b/setup.py index 2fef0ad468a4..56a1df327399 100644 --- a/setup.py +++ b/setup.py @@ -2003,16 +2003,17 @@ def detect_ctypes(self, inc_dirs, lib_dirs): libraries=['m']) self.extensions.extend([ext, ext_test]) + ffi_inc_dirs = inc_dirs.copy() if MACOS: if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"): return # OS X 10.5 comes with libffi.dylib; the include files are # in /usr/include/ffi - inc_dirs.append('/usr/include/ffi') + ffi_inc_dirs.append('/usr/include/ffi') ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] if not ffi_inc or ffi_inc[0] == '': - ffi_inc = find_file('ffi.h', [], inc_dirs) + ffi_inc = find_file('ffi.h', [], ffi_inc_dirs) if ffi_inc is not None: ffi_h = ffi_inc[0] + '/ffi.h' if not os.path.exists(ffi_h): From webhook-mailer at python.org Fri Mar 1 09:31:48 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 01 Mar 2019 14:31:48 -0000 Subject: [Python-checkins] bpo-36146: Refactor setup.py: PyBuildExt.add() method (GH-12097) Message-ID: https://github.com/python/cpython/commit/8058bdae3e5e1f77a202d9dc907b4189409c9b03 commit: 8058bdae3e5e1f77a202d9dc907b4189409c9b03 branch: master author: Victor Stinner committer: GitHub date: 2019-03-01T15:31:45+01:00 summary: bpo-36146: Refactor setup.py: PyBuildExt.add() method (GH-12097) * Add PyBuildExt.add() which adds the extension directly to self.extensions, rather than using a temporary 'exts' local variable in detect_modules() and then add 'exts' to self.extensions * Convert 'missing' local variable from detect_modules() into PyBuildExt.missing attribute * _detect_openssl(), _decimal_ext() and _detect_nis() now call directly self.add(), rather than returning an extension (or None if not found). * Rename _decimal_ext() to _detect_decimal() for consistency with other methods. files: M setup.py diff --git a/setup.py b/setup.py index 56a1df327399..db77772da925 100644 --- a/setup.py +++ b/setup.py @@ -229,13 +229,17 @@ def __init__(self, dist): build_ext.__init__(self, dist) self.failed = [] self.failed_on_import = [] + self.missing = [] if '-j' in os.environ.get('MAKEFLAGS', ''): self.parallel = True + def add(self, ext): + self.extensions.append(ext) + def build_extensions(self): # Detect which modules should be compiled - missing = self.detect_modules() + self.detect_modules() # Remove modules that are present on the disabled list extensions = [ext for ext in self.extensions @@ -331,12 +335,12 @@ def print_three_column(lst): print("%-*s %-*s %-*s" % (longest, e, longest, f, longest, g)) - if missing: + if self.missing: print() print("Python build finished successfully!") print("The necessary bits to build these optional modules were not " "found:") - print_three_column(missing) + print_three_column(self.missing) print("To find the necessary bits, look in setup.py in" " detect_modules() for the module's name.") print() @@ -374,7 +378,7 @@ def print_three_column(lst): print() if any('_ssl' in l - for l in (missing, self.failed, self.failed_on_import)): + for l in (self.missing, self.failed, self.failed_on_import)): print() print("Could not build the ssl module!") print("Python requires an OpenSSL 1.0.2 or 1.1 compatible " @@ -609,8 +613,6 @@ def detect_modules(self): inc_dirs = (self.compiler.include_dirs + sysroot_paths(('CPPFLAGS', 'CFLAGS', 'CC'), system_include_dirs)) - exts = [] - missing = [] config_h = sysconfig.get_config_h_filename() with open(config_h) as file: @@ -650,22 +652,22 @@ def detect_modules(self): # # array objects - exts.append( Extension('array', ['arraymodule.c']) ) + self.add(Extension('array', ['arraymodule.c'])) # Context Variables - exts.append( Extension('_contextvars', ['_contextvarsmodule.c']) ) + self.add(Extension('_contextvars', ['_contextvarsmodule.c'])) shared_math = 'Modules/_math.o' # complex math library functions - exts.append( Extension('cmath', ['cmathmodule.c'], - extra_objects=[shared_math], - depends=['_math.h', shared_math], - libraries=['m']) ) + self.add(Extension('cmath', ['cmathmodule.c'], + extra_objects=[shared_math], + depends=['_math.h', shared_math], + libraries=['m'])) # math library functions, e.g. sin() - exts.append( Extension('math', ['mathmodule.c'], - extra_objects=[shared_math], - depends=['_math.h', shared_math], - libraries=['m']) ) + self.add(Extension('math', ['mathmodule.c'], + extra_objects=[shared_math], + depends=['_math.h', shared_math], + libraries=['m'])) # time libraries: librt may be needed for clock_gettime() time_libs = [] @@ -674,48 +676,48 @@ def detect_modules(self): time_libs.append(lib) # time operations and variables - exts.append( Extension('time', ['timemodule.c'], - libraries=time_libs) ) + self.add(Extension('time', ['timemodule.c'], + libraries=time_libs)) # libm is needed by delta_new() that uses round() and by accum() that # uses modf(). - exts.append( Extension('_datetime', ['_datetimemodule.c'], - libraries=['m']) ) + self.add(Extension('_datetime', ['_datetimemodule.c'], + libraries=['m'])) # random number generator implemented in C - exts.append( Extension("_random", ["_randommodule.c"]) ) + self.add(Extension("_random", ["_randommodule.c"])) # bisect - exts.append( Extension("_bisect", ["_bisectmodule.c"]) ) + self.add(Extension("_bisect", ["_bisectmodule.c"])) # heapq - exts.append( Extension("_heapq", ["_heapqmodule.c"]) ) + self.add(Extension("_heapq", ["_heapqmodule.c"])) # C-optimized pickle replacement - exts.append( Extension("_pickle", ["_pickle.c"]) ) + self.add(Extension("_pickle", ["_pickle.c"])) # atexit - exts.append( Extension("atexit", ["atexitmodule.c"]) ) + self.add(Extension("atexit", ["atexitmodule.c"])) # _json speedups - exts.append( Extension("_json", ["_json.c"], - # pycore_accu.h requires Py_BUILD_CORE_BUILTIN - extra_compile_args=['-DPy_BUILD_CORE_BUILTIN']) ) + self.add(Extension("_json", ["_json.c"], + # pycore_accu.h requires Py_BUILD_CORE_BUILTIN + extra_compile_args=['-DPy_BUILD_CORE_BUILTIN'])) # Python C API test module - exts.append( Extension('_testcapi', ['_testcapimodule.c'], - depends=['testcapi_long.h']) ) + self.add(Extension('_testcapi', ['_testcapimodule.c'], + depends=['testcapi_long.h'])) # Python PEP-3118 (buffer protocol) test module - exts.append( Extension('_testbuffer', ['_testbuffer.c']) ) + self.add(Extension('_testbuffer', ['_testbuffer.c'])) # Test loading multiple modules from one compiled file (http://bugs.python.org/issue16421) - exts.append( Extension('_testimportmultiple', ['_testimportmultiple.c']) ) + self.add(Extension('_testimportmultiple', ['_testimportmultiple.c'])) # Test multi-phase extension module init (PEP 489) - exts.append( Extension('_testmultiphase', ['_testmultiphase.c']) ) + self.add(Extension('_testmultiphase', ['_testmultiphase.c'])) # profiler (_lsprof is for cProfile.py) - exts.append( Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']) ) + self.add(Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c'])) # static Unicode character database - exts.append( Extension('unicodedata', ['unicodedata.c'], - depends=['unicodedata_db.h', 'unicodename_db.h']) ) + self.add(Extension('unicodedata', ['unicodedata.c'], + depends=['unicodedata_db.h', 'unicodename_db.h'])) # _opcode module - exts.append( Extension('_opcode', ['_opcode.c']) ) + self.add(Extension('_opcode', ['_opcode.c'])) # asyncio speedups - exts.append( Extension("_asyncio", ["_asynciomodule.c"]) ) + self.add(Extension("_asyncio", ["_asynciomodule.c"])) # _abc speedups - exts.append( Extension("_abc", ["_abc.c"]) ) + self.add(Extension("_abc", ["_abc.c"])) # _queue module - exts.append( Extension("_queue", ["_queuemodule.c"]) ) + self.add(Extension("_queue", ["_queuemodule.c"])) # Modules with some UNIX dependencies -- on by default: # (If you have a really backward UNIX, select and socket may not be @@ -726,41 +728,42 @@ def detect_modules(self): if (config_h_vars.get('FLOCK_NEEDS_LIBBSD', False)): # May be necessary on AIX for flock function libs = ['bsd'] - exts.append( Extension('fcntl', ['fcntlmodule.c'], libraries=libs) ) + self.add(Extension('fcntl', ['fcntlmodule.c'], + libraries=libs)) # pwd(3) - exts.append( Extension('pwd', ['pwdmodule.c']) ) + self.add(Extension('pwd', ['pwdmodule.c'])) # grp(3) if not VXWORKS: - exts.append( Extension('grp', ['grpmodule.c']) ) + self.add(Extension('grp', ['grpmodule.c'])) # spwd, shadow passwords if (config_h_vars.get('HAVE_GETSPNAM', False) or config_h_vars.get('HAVE_GETSPENT', False)): - exts.append( Extension('spwd', ['spwdmodule.c']) ) + self.add(Extension('spwd', ['spwdmodule.c'])) else: - missing.append('spwd') + self.missing.append('spwd') # select(2); not on ancient System V - exts.append( Extension('select', ['selectmodule.c']) ) + self.add(Extension('select', ['selectmodule.c'])) # Fred Drake's interface to the Python parser - exts.append( Extension('parser', ['parsermodule.c']) ) + self.add(Extension('parser', ['parsermodule.c'])) # Memory-mapped files (also works on Win32). - exts.append( Extension('mmap', ['mmapmodule.c']) ) + self.add(Extension('mmap', ['mmapmodule.c'])) # Lance Ellinghaus's syslog module # syslog daemon interface - exts.append( Extension('syslog', ['syslogmodule.c']) ) + self.add(Extension('syslog', ['syslogmodule.c'])) # Fuzz tests. - exts.append( Extension( - '_xxtestfuzz', - ['_xxtestfuzz/_xxtestfuzz.c', '_xxtestfuzz/fuzzer.c']) - ) + self.add(Extension('_xxtestfuzz', + ['_xxtestfuzz/_xxtestfuzz.c', + '_xxtestfuzz/fuzzer.c'])) # Python interface to subinterpreter C-API. - exts.append(Extension('_xxsubinterpreters', ['_xxsubinterpretersmodule.c'], - define_macros=[('Py_BUILD_CORE', '')])) + self.add(Extension('_xxsubinterpreters', + ['_xxsubinterpretersmodule.c'], + define_macros=[('Py_BUILD_CORE', '')])) # # Here ends the simple stuff. From here on, modules need certain @@ -776,8 +779,8 @@ def detect_modules(self): # 64-bit platforms. # # audioop needs libm for floor() in multiple functions. - exts.append( Extension('audioop', ['audioop.c'], - libraries=['m']) ) + self.add(Extension('audioop', ['audioop.c'], + libraries=['m'])) # readline do_readline = self.compiler.find_library_file(lib_dirs, 'readline') @@ -855,12 +858,12 @@ def detect_modules(self): ['/usr/lib/termcap'], 'termcap'): readline_libs.append('termcap') - exts.append( Extension('readline', ['readline.c'], - library_dirs=['/usr/lib/termcap'], - extra_link_args=readline_extra_link_args, - libraries=readline_libs) ) + self.add(Extension('readline', ['readline.c'], + library_dirs=['/usr/lib/termcap'], + extra_link_args=readline_extra_link_args, + libraries=readline_libs)) else: - missing.append('readline') + self.missing.append('readline') # crypt module. @@ -870,65 +873,60 @@ def detect_modules(self): libs = [] if not VXWORKS: - exts.append( Extension('_crypt', ['_cryptmodule.c'], libraries=libs) ) + self.add(Extension('_crypt', ['_cryptmodule.c'], + libraries=libs)) elif self.compiler.find_library_file(lib_dirs, 'OPENSSL'): libs = ['OPENSSL'] - exts.append( Extension('_crypt', ['_cryptmodule.c'], libraries=libs) ) + self.add(Extension('_crypt', ['_cryptmodule.c'], + libraries=libs)) # CSV files - exts.append( Extension('_csv', ['_csv.c']) ) + self.add(Extension('_csv', ['_csv.c'])) # POSIX subprocess module helper. - exts.append( Extension('_posixsubprocess', ['_posixsubprocess.c']) ) + self.add(Extension('_posixsubprocess', ['_posixsubprocess.c'])) # socket(2) if not VXWORKS: - exts.append( Extension('_socket', ['socketmodule.c'], - depends = ['socketmodule.h']) ) + self.add(Extension('_socket', ['socketmodule.c'], + depends=['socketmodule.h'])) elif self.compiler.find_library_file(lib_dirs, 'net'): libs = ['net'] - exts.append( Extension('_socket', ['socketmodule.c'], - depends = ['socketmodule.h'], libraries=libs) ) + self.add(Extension('_socket', ['socketmodule.c'], + depends=['socketmodule.h'], + libraries=libs)) # Detect SSL support for the socket module (via _ssl) - ssl_ext, hashlib_ext = self._detect_openssl(inc_dirs, lib_dirs) - if ssl_ext is not None: - exts.append(ssl_ext) - else: - missing.append('_ssl') - if hashlib_ext is not None: - exts.append(hashlib_ext) - else: - missing.append('_hashlib') + self._detect_openssl(inc_dirs, lib_dirs) # We always compile these even when OpenSSL is available (issue #14693). # It's harmless and the object code is tiny (40-50 KiB per module, # only loaded when actually used). - exts.append( Extension('_sha256', ['sha256module.c'], - depends=['hashlib.h']) ) - exts.append( Extension('_sha512', ['sha512module.c'], - depends=['hashlib.h']) ) - exts.append( Extension('_md5', ['md5module.c'], - depends=['hashlib.h']) ) - exts.append( Extension('_sha1', ['sha1module.c'], - depends=['hashlib.h']) ) + self.add(Extension('_sha256', ['sha256module.c'], + depends=['hashlib.h'])) + self.add(Extension('_sha512', ['sha512module.c'], + depends=['hashlib.h'])) + self.add(Extension('_md5', ['md5module.c'], + depends=['hashlib.h'])) + self.add(Extension('_sha1', ['sha1module.c'], + depends=['hashlib.h'])) blake2_deps = glob(os.path.join(os.getcwd(), srcdir, 'Modules/_blake2/impl/*')) blake2_deps.append('hashlib.h') - exts.append( Extension('_blake2', - ['_blake2/blake2module.c', - '_blake2/blake2b_impl.c', - '_blake2/blake2s_impl.c'], - depends=blake2_deps) ) + self.add(Extension('_blake2', + ['_blake2/blake2module.c', + '_blake2/blake2b_impl.c', + '_blake2/blake2s_impl.c'], + depends=blake2_deps)) sha3_deps = glob(os.path.join(os.getcwd(), srcdir, 'Modules/_sha3/kcp/*')) sha3_deps.append('hashlib.h') - exts.append( Extension('_sha3', - ['_sha3/sha3module.c'], - depends=sha3_deps)) + self.add(Extension('_sha3', + ['_sha3/sha3module.c'], + depends=sha3_deps)) # Modules that provide persistent dictionary-like semantics. You will # probably want to arrange for at least one of them to be available on @@ -1244,14 +1242,14 @@ class db_found(Exception): pass # avoid a runtime library path for a system library dir if sqlite_libdir and sqlite_libdir[0] in lib_dirs: sqlite_libdir = None - exts.append(Extension('_sqlite3', sqlite_srcs, - define_macros=sqlite_defines, - include_dirs=include_dirs, - library_dirs=sqlite_libdir, - extra_link_args=sqlite_extra_link_args, - libraries=["sqlite3",])) + self.add(Extension('_sqlite3', sqlite_srcs, + define_macros=sqlite_defines, + include_dirs=include_dirs, + library_dirs=sqlite_libdir, + extra_link_args=sqlite_extra_link_args, + libraries=["sqlite3",])) else: - missing.append('_sqlite3') + self.missing.append('_sqlite3') dbm_setup_debug = False # verbose debug prints from this script? dbm_order = ['gdbm'] @@ -1325,33 +1323,29 @@ class db_found(Exception): pass libraries=dblibs) break if dbmext is not None: - exts.append(dbmext) + self.add(dbmext) else: - missing.append('_dbm') + self.missing.append('_dbm') # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm: if ('gdbm' in dbm_order and self.compiler.find_library_file(lib_dirs, 'gdbm')): - exts.append( Extension('_gdbm', ['_gdbmmodule.c'], - libraries = ['gdbm'] ) ) + self.add(Extension('_gdbm', ['_gdbmmodule.c'], + libraries=['gdbm'])) else: - missing.append('_gdbm') + self.missing.append('_gdbm') # Unix-only modules if not MS_WINDOWS: if not VXWORKS: # Steen Lumholt's termios module - exts.append( Extension('termios', ['termios.c']) ) + self.add(Extension('termios', ['termios.c'])) # Jeremy Hylton's rlimit interface - exts.append( Extension('resource', ['resource.c']) ) + self.add(Extension('resource', ['resource.c'])) else: - missing.extend(['resource', 'termios']) + self.missing.extend(['resource', 'termios']) - nis = self._detect_nis(inc_dirs, lib_dirs) - if nis is not None: - exts.append(nis) - else: - missing.append('nis') + self._detect_nis(inc_dirs, lib_dirs) # Curses support, requiring the System V version of curses, often # provided by the ncurses library. @@ -1380,10 +1374,10 @@ class db_found(Exception): pass if curses_library.startswith('ncurses'): curses_libs = [curses_library] - exts.append( Extension('_curses', ['_cursesmodule.c'], - include_dirs=curses_includes, - define_macros=curses_defines, - libraries = curses_libs) ) + self.add(Extension('_curses', ['_cursesmodule.c'], + include_dirs=curses_includes, + define_macros=curses_defines, + libraries=curses_libs)) elif curses_library == 'curses' and not MACOS: # OSX has an old Berkeley curses, not good enough for # the _curses module. @@ -1394,21 +1388,21 @@ class db_found(Exception): pass else: curses_libs = ['curses'] - exts.append( Extension('_curses', ['_cursesmodule.c'], - define_macros=curses_defines, - libraries = curses_libs) ) + self.add(Extension('_curses', ['_cursesmodule.c'], + define_macros=curses_defines, + libraries=curses_libs)) else: - missing.append('_curses') + self.missing.append('_curses') # If the curses module is enabled, check for the panel module - if (module_enabled(exts, '_curses') and + if (module_enabled(self.extensions, '_curses') and self.compiler.find_library_file(lib_dirs, panel_library)): - exts.append( Extension('_curses_panel', ['_curses_panel.c'], - include_dirs=curses_includes, - define_macros=curses_defines, - libraries = [panel_library] + curses_libs) ) + self.add(Extension('_curses_panel', ['_curses_panel.c'], + include_dirs=curses_includes, + define_macros=curses_defines, + libraries=[panel_library, *curses_libs])) else: - missing.append('_curses_panel') + self.missing.append('_curses_panel') # Andrew Kuchling's zlib module. Note that some versions of zlib # 1.1.3 have security problems. See CERT Advisory CA-2002-07: @@ -1444,16 +1438,16 @@ class db_found(Exception): pass zlib_extra_link_args = ('-Wl,-search_paths_first',) else: zlib_extra_link_args = () - exts.append( Extension('zlib', ['zlibmodule.c'], - libraries = ['z'], - extra_link_args = zlib_extra_link_args)) + self.add(Extension('zlib', ['zlibmodule.c'], + libraries=['z'], + extra_link_args=zlib_extra_link_args)) have_zlib = True else: - missing.append('zlib') + self.missing.append('zlib') else: - missing.append('zlib') + self.missing.append('zlib') else: - missing.append('zlib') + self.missing.append('zlib') # Helper module for various ascii-encoders. Uses zlib for an optimized # crc32 if we have it. Otherwise binascii uses its own. @@ -1465,10 +1459,10 @@ class db_found(Exception): pass extra_compile_args = [] libraries = [] extra_link_args = [] - exts.append( Extension('binascii', ['binascii.c'], - extra_compile_args = extra_compile_args, - libraries = libraries, - extra_link_args = extra_link_args) ) + self.add(Extension('binascii', ['binascii.c'], + extra_compile_args=extra_compile_args, + libraries=libraries, + extra_link_args=extra_link_args)) # Gustavo Niemeyer's bz2 module. if (self.compiler.find_library_file(lib_dirs, 'bz2')): @@ -1476,18 +1470,18 @@ class db_found(Exception): pass bz2_extra_link_args = ('-Wl,-search_paths_first',) else: bz2_extra_link_args = () - exts.append( Extension('_bz2', ['_bz2module.c'], - libraries = ['bz2'], - extra_link_args = bz2_extra_link_args) ) + self.add(Extension('_bz2', ['_bz2module.c'], + libraries=['bz2'], + extra_link_args=bz2_extra_link_args)) else: - missing.append('_bz2') + self.missing.append('_bz2') # LZMA compression support. if self.compiler.find_library_file(lib_dirs, 'lzma'): - exts.append( Extension('_lzma', ['_lzmamodule.c'], - libraries = ['lzma']) ) + self.add(Extension('_lzma', ['_lzmamodule.c'], + libraries=['lzma'])) else: - missing.append('_lzma') + self.missing.append('_lzma') # Interface to the Expat XML parser # @@ -1539,40 +1533,38 @@ class db_found(Exception): pass if ret >> 8 == 0: extra_compile_args.append('-Wno-implicit-fallthrough') - exts.append(Extension('pyexpat', - define_macros = define_macros, - extra_compile_args = extra_compile_args, - include_dirs = expat_inc, - libraries = expat_lib, - sources = ['pyexpat.c'] + expat_sources, - depends = expat_depends, - )) + self.add(Extension('pyexpat', + define_macros=define_macros, + extra_compile_args=extra_compile_args, + include_dirs=expat_inc, + libraries=expat_lib, + sources=['pyexpat.c'] + expat_sources, + depends=expat_depends)) # Fredrik Lundh's cElementTree module. Note that this also # uses expat (via the CAPI hook in pyexpat). if os.path.isfile(os.path.join(srcdir, 'Modules', '_elementtree.c')): define_macros.append(('USE_PYEXPAT_CAPI', None)) - exts.append(Extension('_elementtree', - define_macros = define_macros, - include_dirs = expat_inc, - libraries = expat_lib, - sources = ['_elementtree.c'], - depends = ['pyexpat.c'] + expat_sources + - expat_depends, - )) + self.add(Extension('_elementtree', + define_macros=define_macros, + include_dirs=expat_inc, + libraries=expat_lib, + sources=['_elementtree.c'], + depends=['pyexpat.c', *expat_sources, + *expat_depends])) else: - missing.append('_elementtree') + self.missing.append('_elementtree') # Hye-Shik Chang's CJKCodecs modules. - exts.append(Extension('_multibytecodec', - ['cjkcodecs/multibytecodec.c'])) + self.add(Extension('_multibytecodec', + ['cjkcodecs/multibytecodec.c'])) for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'): - exts.append(Extension('_codecs_%s' % loc, - ['cjkcodecs/_codecs_%s.c' % loc])) + self.add(Extension('_codecs_%s' % loc, + ['cjkcodecs/_codecs_%s.c' % loc])) # Stefan Krah's _decimal module - exts.append(self._decimal_ext()) + self._detect_decimal() # Thomas Heller's _ctypes module self.detect_ctypes(inc_dirs, lib_dirs) @@ -1621,37 +1613,33 @@ class db_found(Exception): pass if sysconfig.get_config_var('SHM_NEEDS_LIBRT'): # need to link with librt to get shm_open() libs.append('rt') - exts.append( Extension('_posixshmem', posixshmem_srcs, - define_macros={}, - libraries=libs, - include_dirs=["Modules/_multiprocessing"])) - - exts.append ( Extension('_multiprocessing', multiprocessing_srcs, - define_macros=list(macros.items()), - include_dirs=["Modules/_multiprocessing"])) + self.add(Extension('_posixshmem', posixshmem_srcs, + define_macros={}, + libraries=libs, + include_dirs=["Modules/_multiprocessing"])) + + self.add(Extension('_multiprocessing', multiprocessing_srcs, + define_macros=list(macros.items()), + include_dirs=["Modules/_multiprocessing"])) # End multiprocessing # Platform-specific libraries if HOST_PLATFORM.startswith(('linux', 'freebsd', 'gnukfreebsd')): - exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) + self.add(Extension('ossaudiodev', ['ossaudiodev.c'])) else: - missing.append('ossaudiodev') + self.missing.append('ossaudiodev') if MACOS: - exts.append( - Extension('_scproxy', ['_scproxy.c'], - extra_link_args=[ - '-framework', 'SystemConfiguration', - '-framework', 'CoreFoundation', - ])) - - self.extensions.extend(exts) + self.add(Extension('_scproxy', ['_scproxy.c'], + extra_link_args=[ + '-framework', 'SystemConfiguration', + '-framework', 'CoreFoundation'])) # Call the method for detecting whether _tkinter can be compiled self.detect_tkinter(inc_dirs, lib_dirs) if '_tkinter' not in [e.name for e in self.extensions]: - missing.append('_tkinter') + self.missing.append('_tkinter') # Build the _uuid module if possible uuid_incs = find_file("uuid.h", inc_dirs, ["/usr/include/uuid"]) @@ -1664,7 +1652,7 @@ class db_found(Exception): pass libraries=uuid_libs, include_dirs=uuid_incs)) else: - missing.append('_uuid') + self.missing.append('_uuid') ## # Uncomment these lines if you want to play with xxmodule.c ## ext = Extension('xx', ['xxmodule.c']) @@ -1675,8 +1663,6 @@ class db_found(Exception): pass define_macros=[('Py_LIMITED_API', '0x03050000')]) self.extensions.append(ext) - return missing - def detect_tkinter_explicitly(self): # Build _tkinter using explicit locations for Tcl/Tk. # @@ -2035,7 +2021,7 @@ def detect_ctypes(self, inc_dirs, lib_dirs): # for dlopen, see bpo-32647 ext.libraries.append('dl') - def _decimal_ext(self): + def _detect_decimal(self): extra_compile_args = [] undef_macros = [] if '--with-system-libmpdec' in sysconfig.get_config_var("CONFIG_ARGS"): @@ -2142,17 +2128,14 @@ def _decimal_ext(self): # Uncomment for extra functionality: #define_macros.append(('EXTRA_FUNCTIONALITY', 1)) - ext = Extension ( - '_decimal', - include_dirs=include_dirs, - libraries=libraries, - define_macros=define_macros, - undef_macros=undef_macros, - extra_compile_args=extra_compile_args, - sources=sources, - depends=depends - ) - return ext + self.add(Extension('_decimal', + include_dirs=include_dirs, + libraries=libraries, + define_macros=define_macros, + undef_macros=undef_macros, + extra_compile_args=extra_compile_args, + sources=sources, + depends=depends)) def _detect_openssl(self, inc_dirs, lib_dirs): config_vars = sysconfig.get_config_vars() @@ -2191,29 +2174,24 @@ def split_var(name, sep): ssl_incs.extend(krb5_h) if config_vars.get("HAVE_X509_VERIFY_PARAM_SET1_HOST"): - ssl_ext = Extension( - '_ssl', ['_ssl.c'], - include_dirs=openssl_includes, - library_dirs=openssl_libdirs, - libraries=openssl_libs, - depends=['socketmodule.h'] - ) + self.add(Extension('_ssl', ['_ssl.c'], + include_dirs=openssl_includes, + library_dirs=openssl_libdirs, + libraries=openssl_libs, + depends=['socketmodule.h'])) else: - ssl_ext = None - - hashlib_ext = Extension( - '_hashlib', ['_hashopenssl.c'], - depends=['hashlib.h'], - include_dirs=openssl_includes, - library_dirs=openssl_libdirs, - libraries=openssl_libs, - ) + self.missing.append('_ssl') - return ssl_ext, hashlib_ext + self.add(Extension('_hashlib', ['_hashopenssl.c'], + depends=['hashlib.h'], + include_dirs=openssl_includes, + library_dirs=openssl_libdirs, + libraries=openssl_libs)) def _detect_nis(self, inc_dirs, lib_dirs): if MS_WINDOWS or CYGWIN or HOST_PLATFORM == 'qnx6': - return None + self.missing.append('nis') + return libs = [] library_dirs = [] @@ -2232,7 +2210,8 @@ def _detect_nis(self, inc_dirs, lib_dirs): ) if rpcsvc_inc is None or rpc_inc is None: # not found - return None + self.missing.append('nis') + return includes_dirs.extend(rpcsvc_inc) includes_dirs.extend(rpc_inc) @@ -2249,12 +2228,10 @@ def _detect_nis(self, inc_dirs, lib_dirs): if self.compiler.find_library_file(lib_dirs, 'tirpc'): libs.append('tirpc') - return Extension( - 'nis', ['nismodule.c'], - libraries=libs, - library_dirs=library_dirs, - include_dirs=includes_dirs - ) + self.add(Extension('nis', ['nismodule.c'], + libraries=libs, + library_dirs=library_dirs, + include_dirs=includes_dirs)) class PyBuildInstall(install): From webhook-mailer at python.org Fri Mar 1 09:59:43 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 01 Mar 2019 14:59:43 -0000 Subject: [Python-checkins] bpo-36146: Refactor setup.py: Add PyBuildExt.srcdir (GH-12124) Message-ID: https://github.com/python/cpython/commit/625dbf2567533e6001d57e5969fba75c1b6ece43 commit: 625dbf2567533e6001d57e5969fba75c1b6ece43 branch: master author: Victor Stinner committer: GitHub date: 2019-03-01T15:59:39+01:00 summary: bpo-36146: Refactor setup.py: Add PyBuildExt.srcdir (GH-12124) * Add PyBuildExt.srcdir atribute in setup.py: the source directory is now always absolute. * Add PyBuildExt.inc_dirs and PyBuildExt.lib_dirs attributes: replace 'inc_dirs' and 'lib_dirs' local variables of detect_modules(). * Replace "from distutils.errors import *" with "from distutils.errors import CCompilerError, DistutilsError" to be able to use static analyzers like pyflakes * Reorder imports. files: M setup.py diff --git a/setup.py b/setup.py index db77772da925..9001f62cd33e 100644 --- a/setup.py +++ b/setup.py @@ -1,19 +1,23 @@ # Autodetecting setup.py script for building the Python extensions # -import sys, os, importlib.machinery, re, argparse -from glob import glob +import argparse import importlib._bootstrap +import importlib.machinery import importlib.util +import os +import re +import sys import sysconfig +from glob import glob from distutils import log -from distutils.errors import * -from distutils.core import Extension, setup from distutils.command.build_ext import build_ext +from distutils.command.build_scripts import build_scripts from distutils.command.install import install from distutils.command.install_lib import install_lib -from distutils.command.build_scripts import build_scripts +from distutils.core import Extension, setup +from distutils.errors import CCompilerError, DistutilsError from distutils.spawn import find_executable CROSS_COMPILING = "_PYTHON_HOST_PLATFORM" in os.environ @@ -227,6 +231,9 @@ class PyBuildExt(build_ext): def __init__(self, dist): build_ext.__init__(self, dist) + self.srcdir = None + self.lib_dirs = None + self.inc_dirs = None self.failed = [] self.failed_on_import = [] self.missing = [] @@ -237,6 +244,11 @@ def add(self, ext): self.extensions.append(ext) def build_extensions(self): + self.srcdir = sysconfig.get_config_var('srcdir') + if not self.srcdir: + # Maybe running on Windows but not using CYGWIN? + raise ValueError("No source directory; cannot proceed.") + self.srcdir = os.path.abspath(self.srcdir) # Detect which modules should be compiled self.detect_modules() @@ -253,15 +265,10 @@ def build_extensions(self): # Fix up the autodetected modules, prefixing all the source files # with Modules/. - srcdir = sysconfig.get_config_var('srcdir') - if not srcdir: - # Maybe running on Windows but not using CYGWIN? - raise ValueError("No source directory; cannot proceed.") - srcdir = os.path.abspath(srcdir) - moddirlist = [os.path.join(srcdir, 'Modules')] + moddirlist = [os.path.join(self.srcdir, 'Modules')] # Fix up the paths for scripts, too - self.distribution.scripts = [os.path.join(srcdir, filename) + self.distribution.scripts = [os.path.join(self.srcdir, filename) for filename in self.distribution.scripts] # Python header files @@ -398,7 +405,7 @@ def build_extension(self, ext): build_ext.build_extension(self, ext) except (CCompilerError, DistutilsError) as why: self.announce('WARNING: building of extension "%s" failed: %s' % - (ext.name, sys.exc_info()[1])) + (ext.name, why)) self.failed.append(ext.name) return @@ -527,8 +534,6 @@ def add_cross_compiling_paths(self): is_gcc = False is_clang = False in_incdirs = False - inc_dirs = [] - lib_dirs = [] try: if ret >> 8 == 0: with open(tmpfile) as fp: @@ -602,31 +607,29 @@ def detect_modules(self): # if a file is found in one of those directories, it can # be assumed that no additional -I,-L directives are needed. if not CROSS_COMPILING: - lib_dirs = self.compiler.library_dirs + system_lib_dirs - inc_dirs = self.compiler.include_dirs + system_include_dirs + self.lib_dirs = self.compiler.library_dirs + system_lib_dirs + self.inc_dirs = self.compiler.include_dirs + system_include_dirs else: # Add the sysroot paths. 'sysroot' is a compiler option used to # set the logical path of the standard system headers and # libraries. - lib_dirs = (self.compiler.library_dirs + - sysroot_paths(('LDFLAGS', 'CC'), system_lib_dirs)) - inc_dirs = (self.compiler.include_dirs + - sysroot_paths(('CPPFLAGS', 'CFLAGS', 'CC'), - system_include_dirs)) + self.lib_dirs = (self.compiler.library_dirs + + sysroot_paths(('LDFLAGS', 'CC'), system_lib_dirs)) + self.inc_dirs = (self.compiler.include_dirs + + sysroot_paths(('CPPFLAGS', 'CFLAGS', 'CC'), + system_include_dirs)) config_h = sysconfig.get_config_h_filename() with open(config_h) as file: config_h_vars = sysconfig.parse_config_h(file) - srcdir = sysconfig.get_config_var('srcdir') - # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb) if HOST_PLATFORM in ['osf1', 'unixware7', 'openunix8']: - lib_dirs += ['/usr/ccs/lib'] + self.lib_dirs += ['/usr/ccs/lib'] # HP-UX11iv3 keeps files in lib/hpux folders. if HOST_PLATFORM == 'hp-ux11': - lib_dirs += ['/usr/lib/hpux64', '/usr/lib/hpux32'] + self.lib_dirs += ['/usr/lib/hpux64', '/usr/lib/hpux32'] if MACOS: # This should work on any unixy platform ;-) @@ -640,11 +643,11 @@ def detect_modules(self): 'CFLAGS', 'LDFLAGS') for item in cflags.split(): if item.startswith('-I'): - inc_dirs.append(item[2:]) + self.inc_dirs.append(item[2:]) for item in ldflags.split(): if item.startswith('-L'): - lib_dirs.append(item[2:]) + self.lib_dirs.append(item[2:]) # # The following modules are all pretty straightforward, and compile @@ -783,7 +786,7 @@ def detect_modules(self): libraries=['m'])) # readline - do_readline = self.compiler.find_library_file(lib_dirs, 'readline') + do_readline = self.compiler.find_library_file(self.lib_dirs, 'readline') readline_termcap_library = "" curses_library = "" # Cannot use os.popen here in py3k. @@ -818,11 +821,11 @@ def detect_modules(self): # use the same library for the readline and curses modules. if 'curses' in readline_termcap_library: curses_library = readline_termcap_library - elif self.compiler.find_library_file(lib_dirs, 'ncursesw'): + elif self.compiler.find_library_file(self.lib_dirs, 'ncursesw'): curses_library = 'ncursesw' - elif self.compiler.find_library_file(lib_dirs, 'ncurses'): + elif self.compiler.find_library_file(self.lib_dirs, 'ncurses'): curses_library = 'ncurses' - elif self.compiler.find_library_file(lib_dirs, 'curses'): + elif self.compiler.find_library_file(self.lib_dirs, 'curses'): curses_library = 'curses' if MACOS: @@ -836,7 +839,7 @@ def detect_modules(self): # MacOSX 10.4 has a broken readline. Don't try to build # the readline module unless the user has installed a fixed # readline package - if find_file('readline/rlconf.h', inc_dirs, []) is None: + if find_file('readline/rlconf.h', self.inc_dirs, []) is None: do_readline = False if do_readline: if MACOS and os_release < 9: @@ -854,7 +857,7 @@ def detect_modules(self): pass # Issue 7384: Already linked against curses or tinfo. elif curses_library: readline_libs.append(curses_library) - elif self.compiler.find_library_file(lib_dirs + + elif self.compiler.find_library_file(self.lib_dirs + ['/usr/lib/termcap'], 'termcap'): readline_libs.append('termcap') @@ -867,7 +870,7 @@ def detect_modules(self): # crypt module. - if self.compiler.find_library_file(lib_dirs, 'crypt'): + if self.compiler.find_library_file(self.lib_dirs, 'crypt'): libs = ['crypt'] else: libs = [] @@ -875,7 +878,7 @@ def detect_modules(self): if not VXWORKS: self.add(Extension('_crypt', ['_cryptmodule.c'], libraries=libs)) - elif self.compiler.find_library_file(lib_dirs, 'OPENSSL'): + elif self.compiler.find_library_file(self.lib_dirs, 'OPENSSL'): libs = ['OPENSSL'] self.add(Extension('_crypt', ['_cryptmodule.c'], libraries=libs)) @@ -890,14 +893,14 @@ def detect_modules(self): if not VXWORKS: self.add(Extension('_socket', ['socketmodule.c'], depends=['socketmodule.h'])) - elif self.compiler.find_library_file(lib_dirs, 'net'): + elif self.compiler.find_library_file(self.lib_dirs, 'net'): libs = ['net'] self.add(Extension('_socket', ['socketmodule.c'], depends=['socketmodule.h'], libraries=libs)) # Detect SSL support for the socket module (via _ssl) - self._detect_openssl(inc_dirs, lib_dirs) + self._detect_openssl() # We always compile these even when OpenSSL is available (issue #14693). # It's harmless and the object code is tiny (40-50 KiB per module, @@ -911,7 +914,7 @@ def detect_modules(self): self.add(Extension('_sha1', ['sha1module.c'], depends=['hashlib.h'])) - blake2_deps = glob(os.path.join(os.getcwd(), srcdir, + blake2_deps = glob(os.path.join(self.srcdir, 'Modules/_blake2/impl/*')) blake2_deps.append('hashlib.h') @@ -921,7 +924,7 @@ def detect_modules(self): '_blake2/blake2s_impl.c'], depends=blake2_deps)) - sha3_deps = glob(os.path.join(os.getcwd(), srcdir, + sha3_deps = glob(os.path.join(self.srcdir, 'Modules/_sha3/kcp/*')) sha3_deps.append('hashlib.h') self.add(Extension('_sha3', @@ -1008,7 +1011,7 @@ def gen_db_minor_ver_nums(major): # picked up when it is installed in a non-standard prefix and # the user has added that prefix into inc_dirs. std_variants = [] - for dn in inc_dirs: + for dn in self.inc_dirs: std_variants.append(os.path.join(dn, 'db3')) std_variants.append(os.path.join(dn, 'db4')) for x in gen_db_minor_ver_nums(4): @@ -1030,7 +1033,7 @@ class db_found(Exception): pass try: # See whether there is a Sleepycat header in the standard # search path. - for d in inc_dirs + db_inc_paths: + for d in self.inc_dirs + db_inc_paths: f = os.path.join(d, "db.h") if MACOS and is_macosx_sdk_path(d): f = os.path.join(sysroot, d[1:], "db.h") @@ -1108,7 +1111,7 @@ class db_found(Exception): pass ('db%d%d' % db_ver), ('db%d' % db_ver[0])): dblib_file = self.compiler.find_library_file( - db_dirs_to_check + lib_dirs, dblib ) + db_dirs_to_check + self.lib_dirs, dblib ) if dblib_file: dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ] raise db_found @@ -1123,11 +1126,11 @@ class db_found(Exception): pass # Only add the found library and include directories if they aren't # already being searched. This avoids an explicit runtime library # dependency. - if db_incdir in inc_dirs: + if db_incdir in self.inc_dirs: db_incs = None else: db_incs = [db_incdir] - if dblib_dir[0] in lib_dirs: + if dblib_dir[0] in self.lib_dirs: dblib_dir = None else: if db_setup_debug: print("db: no appropriate library found") @@ -1160,7 +1163,7 @@ class db_found(Exception): pass if MACOS: sysroot = macosx_sdk_root() - for d_ in inc_dirs + sqlite_inc_paths: + for d_ in self.inc_dirs + sqlite_inc_paths: d = d_ if MACOS and is_macosx_sdk_path(d): d = os.path.join(sysroot, d[1:]) @@ -1197,7 +1200,7 @@ class db_found(Exception): pass os.path.join(sqlite_incdir, '..', '..', 'lib'), ] sqlite_libfile = self.compiler.find_library_file( - sqlite_dirs_to_check + lib_dirs, 'sqlite3') + sqlite_dirs_to_check + self.lib_dirs, 'sqlite3') if sqlite_libfile: sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))] @@ -1240,7 +1243,7 @@ class db_found(Exception): pass if sqlite_incdir not in self.compiler.include_dirs: include_dirs.append(sqlite_incdir) # avoid a runtime library path for a system library dir - if sqlite_libdir and sqlite_libdir[0] in lib_dirs: + if sqlite_libdir and sqlite_libdir[0] in self.lib_dirs: sqlite_libdir = None self.add(Extension('_sqlite3', sqlite_srcs, define_macros=sqlite_defines, @@ -1266,13 +1269,13 @@ class db_found(Exception): pass dbmext = None for cand in dbm_order: if cand == "ndbm": - if find_file("ndbm.h", inc_dirs, []) is not None: + if find_file("ndbm.h", self.inc_dirs, []) is not None: # Some systems have -lndbm, others have -lgdbm_compat, # others don't have either - if self.compiler.find_library_file(lib_dirs, + if self.compiler.find_library_file(self.lib_dirs, 'ndbm'): ndbm_libs = ['ndbm'] - elif self.compiler.find_library_file(lib_dirs, + elif self.compiler.find_library_file(self.lib_dirs, 'gdbm_compat'): ndbm_libs = ['gdbm_compat'] else: @@ -1286,12 +1289,12 @@ class db_found(Exception): pass break elif cand == "gdbm": - if self.compiler.find_library_file(lib_dirs, 'gdbm'): + if self.compiler.find_library_file(self.lib_dirs, 'gdbm'): gdbm_libs = ['gdbm'] - if self.compiler.find_library_file(lib_dirs, + if self.compiler.find_library_file(self.lib_dirs, 'gdbm_compat'): gdbm_libs.append('gdbm_compat') - if find_file("gdbm/ndbm.h", inc_dirs, []) is not None: + if find_file("gdbm/ndbm.h", self.inc_dirs, []) is not None: if dbm_setup_debug: print("building dbm using gdbm") dbmext = Extension( '_dbm', ['_dbmmodule.c'], @@ -1300,7 +1303,7 @@ class db_found(Exception): pass ], libraries = gdbm_libs) break - if find_file("gdbm-ndbm.h", inc_dirs, []) is not None: + if find_file("gdbm-ndbm.h", self.inc_dirs, []) is not None: if dbm_setup_debug: print("building dbm using gdbm") dbmext = Extension( '_dbm', ['_dbmmodule.c'], @@ -1329,7 +1332,7 @@ class db_found(Exception): pass # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm: if ('gdbm' in dbm_order and - self.compiler.find_library_file(lib_dirs, 'gdbm')): + self.compiler.find_library_file(self.lib_dirs, 'gdbm')): self.add(Extension('_gdbm', ['_gdbmmodule.c'], libraries=['gdbm'])) else: @@ -1345,7 +1348,7 @@ class db_found(Exception): pass else: self.missing.extend(['resource', 'termios']) - self._detect_nis(inc_dirs, lib_dirs) + self._detect_nis() # Curses support, requiring the System V version of curses, often # provided by the ncurses library. @@ -1381,9 +1384,9 @@ class db_found(Exception): pass elif curses_library == 'curses' and not MACOS: # OSX has an old Berkeley curses, not good enough for # the _curses module. - if (self.compiler.find_library_file(lib_dirs, 'terminfo')): + if (self.compiler.find_library_file(self.lib_dirs, 'terminfo')): curses_libs = ['curses', 'terminfo'] - elif (self.compiler.find_library_file(lib_dirs, 'termcap')): + elif (self.compiler.find_library_file(self.lib_dirs, 'termcap')): curses_libs = ['curses', 'termcap'] else: curses_libs = ['curses'] @@ -1396,7 +1399,7 @@ class db_found(Exception): pass # If the curses module is enabled, check for the panel module if (module_enabled(self.extensions, '_curses') and - self.compiler.find_library_file(lib_dirs, panel_library)): + self.compiler.find_library_file(self.lib_dirs, panel_library)): self.add(Extension('_curses_panel', ['_curses_panel.c'], include_dirs=curses_includes, define_macros=curses_defines, @@ -1416,7 +1419,7 @@ class db_found(Exception): pass # # You can upgrade zlib to version 1.1.4 yourself by going to # http://www.gzip.org/zlib/ - zlib_inc = find_file('zlib.h', [], inc_dirs) + zlib_inc = find_file('zlib.h', [], self.inc_dirs) have_zlib = False if zlib_inc is not None: zlib_h = zlib_inc[0] + '/zlib.h' @@ -1433,7 +1436,7 @@ class db_found(Exception): pass version = line.split()[2] break if version >= version_req: - if (self.compiler.find_library_file(lib_dirs, 'z')): + if (self.compiler.find_library_file(self.lib_dirs, 'z')): if MACOS: zlib_extra_link_args = ('-Wl,-search_paths_first',) else: @@ -1465,7 +1468,7 @@ class db_found(Exception): pass extra_link_args=extra_link_args)) # Gustavo Niemeyer's bz2 module. - if (self.compiler.find_library_file(lib_dirs, 'bz2')): + if (self.compiler.find_library_file(self.lib_dirs, 'bz2')): if MACOS: bz2_extra_link_args = ('-Wl,-search_paths_first',) else: @@ -1477,7 +1480,7 @@ class db_found(Exception): pass self.missing.append('_bz2') # LZMA compression support. - if self.compiler.find_library_file(lib_dirs, 'lzma'): + if self.compiler.find_library_file(self.lib_dirs, 'lzma'): self.add(Extension('_lzma', ['_lzmamodule.c'], libraries=['lzma'])) else: @@ -1502,7 +1505,7 @@ class db_found(Exception): pass expat_sources = [] expat_depends = [] else: - expat_inc = [os.path.join(os.getcwd(), srcdir, 'Modules', 'expat')] + expat_inc = [os.path.join(self.srcdir, 'Modules', 'expat')] define_macros = [ ('HAVE_EXPAT_CONFIG_H', '1'), # bpo-30947: Python uses best available entropy sources to @@ -1544,7 +1547,7 @@ class db_found(Exception): pass # Fredrik Lundh's cElementTree module. Note that this also # uses expat (via the CAPI hook in pyexpat). - if os.path.isfile(os.path.join(srcdir, 'Modules', '_elementtree.c')): + if os.path.isfile(os.path.join(self.srcdir, 'Modules', '_elementtree.c')): define_macros.append(('USE_PYEXPAT_CAPI', None)) self.add(Extension('_elementtree', define_macros=define_macros, @@ -1567,7 +1570,7 @@ class db_found(Exception): pass self._detect_decimal() # Thomas Heller's _ctypes module - self.detect_ctypes(inc_dirs, lib_dirs) + self.detect_ctypes() # Richard Oudkerk's multiprocessing module if MS_WINDOWS: @@ -1636,15 +1639,15 @@ class db_found(Exception): pass '-framework', 'CoreFoundation'])) # Call the method for detecting whether _tkinter can be compiled - self.detect_tkinter(inc_dirs, lib_dirs) + self.detect_tkinter() if '_tkinter' not in [e.name for e in self.extensions]: self.missing.append('_tkinter') # Build the _uuid module if possible - uuid_incs = find_file("uuid.h", inc_dirs, ["/usr/include/uuid"]) + uuid_incs = find_file("uuid.h", self.inc_dirs, ["/usr/include/uuid"]) if uuid_incs is not None: - if self.compiler.find_library_file(lib_dirs, 'uuid'): + if self.compiler.find_library_file(self.lib_dirs, 'uuid'): uuid_libs = ['uuid'] else: uuid_libs = [] @@ -1698,7 +1701,7 @@ def detect_tkinter_explicitly(self): self.extensions.append(ext) return True - def detect_tkinter_darwin(self, inc_dirs, lib_dirs): + def detect_tkinter_darwin(self): # The _tkinter module, using frameworks. Since frameworks are quite # different the UNIX search logic is not sharable. from os.path import join, exists @@ -1787,7 +1790,7 @@ def detect_tkinter_darwin(self, inc_dirs, lib_dirs): self.extensions.append(ext) return True - def detect_tkinter(self, inc_dirs, lib_dirs): + def detect_tkinter(self): # The _tkinter module. # Check whether --with-tcltk-includes and --with-tcltk-libs were @@ -1801,7 +1804,7 @@ def detect_tkinter(self, inc_dirs, lib_dirs): # AquaTk is a separate method. Only one Tkinter will be built on # Darwin - either AquaTk, if it is found, or X11 based Tk. if (MACOS and - self.detect_tkinter_darwin(inc_dirs, lib_dirs)): + self.detect_tkinter_darwin()): return # Assume we haven't found any of the libraries or include files @@ -1810,9 +1813,9 @@ def detect_tkinter(self, inc_dirs, lib_dirs): tcllib = tklib = tcl_includes = tk_includes = None for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83', '8.2', '82', '8.1', '81', '8.0', '80']: - tklib = self.compiler.find_library_file(lib_dirs, + tklib = self.compiler.find_library_file(self.lib_dirs, 'tk' + version) - tcllib = self.compiler.find_library_file(lib_dirs, + tcllib = self.compiler.find_library_file(self.lib_dirs, 'tcl' + version) if tklib and tcllib: # Exit the loop when we've found the Tcl/Tk libraries @@ -1829,12 +1832,12 @@ def detect_tkinter(self, inc_dirs, lib_dirs): dotversion = dotversion[:-1] + '.' + dotversion[-1] tcl_include_sub = [] tk_include_sub = [] - for dir in inc_dirs: + for dir in self.inc_dirs: tcl_include_sub += [dir + os.sep + "tcl" + dotversion] tk_include_sub += [dir + os.sep + "tk" + dotversion] tk_include_sub += tcl_include_sub - tcl_includes = find_file('tcl.h', inc_dirs, tcl_include_sub) - tk_includes = find_file('tk.h', inc_dirs, tk_include_sub) + tcl_includes = find_file('tcl.h', self.inc_dirs, tcl_include_sub) + tk_includes = find_file('tk.h', self.inc_dirs, tk_include_sub) if (tcllib is None or tklib is None or tcl_includes is None or tk_includes is None): @@ -1871,11 +1874,11 @@ def detect_tkinter(self, inc_dirs, lib_dirs): return # Check for BLT extension - if self.compiler.find_library_file(lib_dirs + added_lib_dirs, + if self.compiler.find_library_file(self.lib_dirs + added_lib_dirs, 'BLT8.0'): defs.append( ('WITH_BLT', 1) ) libs.append('BLT8.0') - elif self.compiler.find_library_file(lib_dirs + added_lib_dirs, + elif self.compiler.find_library_file(self.lib_dirs + added_lib_dirs, 'BLT'): defs.append( ('WITH_BLT', 1) ) libs.append('BLT') @@ -1910,8 +1913,7 @@ def detect_tkinter(self, inc_dirs, lib_dirs): def configure_ctypes_darwin(self, ext): # Darwin (OS X) uses preconfigured files, in # the Modules/_ctypes/libffi_osx directory. - srcdir = sysconfig.get_config_var('srcdir') - ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', + ffi_srcdir = os.path.abspath(os.path.join(self.srcdir, 'Modules', '_ctypes', 'libffi_osx')) sources = [os.path.join(ffi_srcdir, p) for p in ['ffi.c', @@ -1942,7 +1944,7 @@ def configure_ctypes(self, ext): return False return True - def detect_ctypes(self, inc_dirs, lib_dirs): + def detect_ctypes(self): self.use_system_libffi = False include_dirs = [] extra_compile_args = [] @@ -1989,7 +1991,7 @@ def detect_ctypes(self, inc_dirs, lib_dirs): libraries=['m']) self.extensions.extend([ext, ext_test]) - ffi_inc_dirs = inc_dirs.copy() + ffi_inc_dirs = self.inc_dirs.copy() if MACOS: if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"): return @@ -2008,7 +2010,7 @@ def detect_ctypes(self, inc_dirs, lib_dirs): ffi_lib = None if ffi_inc is not None: for lib_name in ('ffi', 'ffi_pic'): - if (self.compiler.find_library_file(lib_dirs, lib_name)): + if (self.compiler.find_library_file(self.lib_dirs, lib_name)): ffi_lib = lib_name break @@ -2030,8 +2032,7 @@ def _detect_decimal(self): sources = ['_decimal/_decimal.c'] depends = ['_decimal/docstrings.h'] else: - srcdir = sysconfig.get_config_var('srcdir') - include_dirs = [os.path.abspath(os.path.join(srcdir, + include_dirs = [os.path.abspath(os.path.join(self.srcdir, 'Modules', '_decimal', 'libmpdec'))] @@ -2137,7 +2138,7 @@ def _detect_decimal(self): sources=sources, depends=depends)) - def _detect_openssl(self, inc_dirs, lib_dirs): + def _detect_openssl(self): config_vars = sysconfig.get_config_vars() def split_var(name, sep): @@ -2160,14 +2161,14 @@ def split_var(name, sep): # Find OpenSSL includes ssl_incs = find_file( - 'openssl/ssl.h', inc_dirs, openssl_includes + 'openssl/ssl.h', self.inc_dirs, openssl_includes ) if ssl_incs is None: return None, None # OpenSSL 1.0.2 uses Kerberos for KRB5 ciphers krb5_h = find_file( - 'krb5.h', inc_dirs, + 'krb5.h', self.inc_dirs, ['/usr/kerberos/include'] ) if krb5_h: @@ -2188,7 +2189,7 @@ def split_var(name, sep): library_dirs=openssl_libdirs, libraries=openssl_libs)) - def _detect_nis(self, inc_dirs, lib_dirs): + def _detect_nis(self): if MS_WINDOWS or CYGWIN or HOST_PLATFORM == 'qnx6': self.missing.append('nis') return @@ -2201,12 +2202,12 @@ def _detect_nis(self, inc_dirs, lib_dirs): # moved headers and libraries to libtirpc and libnsl. The headers # are in tircp and nsl sub directories. rpcsvc_inc = find_file( - 'rpcsvc/yp_prot.h', inc_dirs, - [os.path.join(inc_dir, 'nsl') for inc_dir in inc_dirs] + 'rpcsvc/yp_prot.h', self.inc_dirs, + [os.path.join(inc_dir, 'nsl') for inc_dir in self.inc_dirs] ) rpc_inc = find_file( - 'rpc/rpc.h', inc_dirs, - [os.path.join(inc_dir, 'tirpc') for inc_dir in inc_dirs] + 'rpc/rpc.h', self.inc_dirs, + [os.path.join(inc_dir, 'tirpc') for inc_dir in self.inc_dirs] ) if rpcsvc_inc is None or rpc_inc is None: # not found @@ -2215,17 +2216,17 @@ def _detect_nis(self, inc_dirs, lib_dirs): includes_dirs.extend(rpcsvc_inc) includes_dirs.extend(rpc_inc) - if self.compiler.find_library_file(lib_dirs, 'nsl'): + if self.compiler.find_library_file(self.lib_dirs, 'nsl'): libs.append('nsl') else: # libnsl-devel: check for libnsl in nsl/ subdirectory - nsl_dirs = [os.path.join(lib_dir, 'nsl') for lib_dir in lib_dirs] + nsl_dirs = [os.path.join(lib_dir, 'nsl') for lib_dir in self.lib_dirs] libnsl = self.compiler.find_library_file(nsl_dirs, 'nsl') if libnsl is not None: library_dirs.append(os.path.dirname(libnsl)) libs.append('nsl') - if self.compiler.find_library_file(lib_dirs, 'tirpc'): + if self.compiler.find_library_file(self.lib_dirs, 'tirpc'): libs.append('tirpc') self.add(Extension('nis', ['nismodule.c'], From webhook-mailer at python.org Fri Mar 1 10:25:23 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 01 Mar 2019 15:25:23 -0000 Subject: [Python-checkins] bpo-36142: Move command line parsing to coreconfig.c (GH-12123) Message-ID: https://github.com/python/cpython/commit/95e2cbf32f8156c239b27dae558ba058d0f2d496 commit: 95e2cbf32f8156c239b27dae558ba058d0f2d496 branch: master author: Victor Stinner committer: GitHub date: 2019-03-01T16:25:19+01:00 summary: bpo-36142: Move command line parsing to coreconfig.c (GH-12123) * Add _PyCoreConfig_ReadFromArgv() function which parses command line options: move code from main.c to coreconfig.c. * Add _PyCoreConfig_Write() to write the new configuration: coerce the LC_CTYPE locale, set Py_xxx global configuration variables, etc. * _PyCoreConfig_ReadFromArgv() now only changes the LC_CTYPE locale temporarily. _PyCoreConfig_Write() becomes responsible to set the LC_CTYPE locale. * Add _Py_SetArgcArgv() and _Py_ClearArgcArgv() functions * Rename many "pymain_xxx()" functions * Add "const" to some function parameters * Reorganize main.c to declare functions in the order in which they are called. files: M Include/cpython/coreconfig.h M Include/internal/pycore_coreconfig.h M Include/internal/pycore_pathconfig.h M Modules/main.c M Python/coreconfig.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index 4985bf3a7598..8109d4abc508 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -5,6 +5,16 @@ extern "C" { #endif +/* _PyArgv */ + +typedef struct { + int argc; + int use_bytes_argv; + char **bytes_argv; + wchar_t **wchar_argv; +} _PyArgv; + + /* _PyInitError */ typedef struct { diff --git a/Include/internal/pycore_coreconfig.h b/Include/internal/pycore_coreconfig.h index b906ac4f7f9f..ebb0a9e9f1f7 100644 --- a/Include/internal/pycore_coreconfig.h +++ b/Include/internal/pycore_coreconfig.h @@ -8,6 +8,29 @@ extern "C" { # error "this header requires Py_BUILD_CORE or Py_BUILD_CORE_BUILTIN defined" #endif +/* _Py_wstrlist */ + +PyAPI_FUNC(void) _Py_wstrlist_clear( + int len, + wchar_t **list); +PyAPI_FUNC(wchar_t**) _Py_wstrlist_copy( + int len, + wchar_t * const *list); +PyAPI_FUNC(_PyInitError) _Py_wstrlist_append( + int *len, + wchar_t ***list, + const wchar_t *str); +PyAPI_FUNC(PyObject*) _Py_wstrlist_as_pylist( + int len, + wchar_t **list); + +/* Py_GetArgcArgv() helpers */ + +PyAPI_FUNC(void) _Py_ClearArgcArgv(void); +PyAPI_FUNC(int) _Py_SetArgcArgv(int argc, wchar_t * const *argv); + +/* _PyCoreConfig */ + PyAPI_FUNC(_PyInitError) _PyCoreConfig_Read(_PyCoreConfig *config); PyAPI_FUNC(void) _PyCoreConfig_Clear(_PyCoreConfig *); PyAPI_FUNC(int) _PyCoreConfig_Copy( @@ -26,6 +49,9 @@ PyAPI_FUNC(int) _PyCoreConfig_GetEnvDup( wchar_t **dest, wchar_t *wname, char *name); +PyAPI_FUNC(_PyInitError) _PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, + const _PyArgv *args); +PyAPI_FUNC(void) _PyCoreConfig_Write(const _PyCoreConfig *config); #ifdef __cplusplus } diff --git a/Include/internal/pycore_pathconfig.h b/Include/internal/pycore_pathconfig.h index c0731525ca10..fb6b1d78b364 100644 --- a/Include/internal/pycore_pathconfig.h +++ b/Include/internal/pycore_pathconfig.h @@ -8,20 +8,6 @@ extern "C" { # error "this header requires Py_BUILD_CORE or Py_BUILD_CORE_BUILTIN define" #endif -PyAPI_FUNC(void) _Py_wstrlist_clear( - int len, - wchar_t **list); -PyAPI_FUNC(wchar_t**) _Py_wstrlist_copy( - int len, - wchar_t **list); -PyAPI_FUNC(_PyInitError) _Py_wstrlist_append( - int *len, - wchar_t ***list, - const wchar_t *str); -PyAPI_FUNC(PyObject*) _Py_wstrlist_as_pylist( - int len, - wchar_t **list); - typedef struct _PyPathConfig { /* Full path to the Python program */ wchar_t *program_full_path; diff --git a/Modules/main.c b/Modules/main.c index e7d75a79e787..fdeaf1d12ad2 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -1,46 +1,27 @@ /* Python interpreter main program */ #include "Python.h" -#include "osdefs.h" #include "pycore_coreconfig.h" -#include "pycore_getopt.h" -#include "pycore_pathconfig.h" #include "pycore_pylifecycle.h" #include "pycore_pymem.h" #include "pycore_pystate.h" -#include +#ifdef __FreeBSD__ +# include /* fedisableexcept() */ +#endif + +/* Includes for exit_sigint() */ +#include /* perror() */ #ifdef HAVE_SIGNAL_H -#include +# include /* SIGINT */ #endif -#include #if defined(HAVE_GETPID) && defined(HAVE_UNISTD_H) -#include -#endif - -#if defined(MS_WINDOWS) || defined(__CYGWIN__) -# include -# ifdef HAVE_IO_H -# include -# endif -# ifdef HAVE_FCNTL_H -# include -# endif +# include /* getpid() */ #endif - #ifdef _MSC_VER -# include -#endif - -#ifdef __FreeBSD__ -# include -#endif - -#if defined(MS_WINDOWS) -# define PYTHONHOMEHELP "\\python{major}{minor}" -#else -# define PYTHONHOMEHELP "/lib/pythonX.X" +# include /* STATUS_CONTROL_C_EXIT */ #endif +/* End of includes for exit_sigint() */ #define COPYRIGHT \ "Type \"help\", \"copyright\", \"credits\" or \"license\" " \ @@ -50,825 +31,370 @@ extern "C" { #endif -#define DECODE_LOCALE_ERR(NAME, LEN) \ - (((LEN) == -2) \ - ? _Py_INIT_USER_ERR("cannot decode " NAME) \ - : _Py_INIT_NO_MEMORY()) - - -#ifdef MS_WINDOWS -#define WCSTOK wcstok_s -#else -#define WCSTOK wcstok -#endif - -/* For Py_GetArgcArgv(); set by main() */ -static wchar_t **orig_argv = NULL; -static int orig_argc = 0; - -/* command line options */ -#define BASE_OPTS L"bBc:dEhiIJm:OqRsStuvVW:xX:?" - -#define PROGRAM_OPTS BASE_OPTS - -static const _PyOS_LongOption longoptions[] = { - {L"check-hash-based-pycs", 1, 0}, - {NULL, 0, 0}, -}; - -/* Short usage message (with %s for argv0) */ -static const char usage_line[] = -"usage: %ls [option] ... [-c cmd | -m mod | file | -] [arg] ...\n"; - -/* Long usage message, split into parts < 512 bytes */ -static const char usage_1[] = "\ -Options and arguments (and corresponding environment variables):\n\ --b : issue warnings about str(bytes_instance), str(bytearray_instance)\n\ - and comparing bytes/bytearray with str. (-bb: issue errors)\n\ --B : don't write .pyc files on import; also PYTHONDONTWRITEBYTECODE=x\n\ --c cmd : program passed in as string (terminates option list)\n\ --d : debug output from parser; also PYTHONDEBUG=x\n\ --E : ignore PYTHON* environment variables (such as PYTHONPATH)\n\ --h : print this help message and exit (also --help)\n\ -"; -static const char usage_2[] = "\ --i : inspect interactively after running script; forces a prompt even\n\ - if stdin does not appear to be a terminal; also PYTHONINSPECT=x\n\ --I : isolate Python from the user's environment (implies -E and -s)\n\ --m mod : run library module as a script (terminates option list)\n\ --O : remove assert and __debug__-dependent statements; add .opt-1 before\n\ - .pyc extension; also PYTHONOPTIMIZE=x\n\ --OO : do -O changes and also discard docstrings; add .opt-2 before\n\ - .pyc extension\n\ --q : don't print version and copyright messages on interactive startup\n\ --s : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\ --S : don't imply 'import site' on initialization\n\ -"; -static const char usage_3[] = "\ --u : force the stdout and stderr streams to be unbuffered;\n\ - this option has no effect on stdin; also PYTHONUNBUFFERED=x\n\ --v : verbose (trace import statements); also PYTHONVERBOSE=x\n\ - can be supplied multiple times to increase verbosity\n\ --V : print the Python version number and exit (also --version)\n\ - when given twice, print more information about the build\n\ --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\ ---check-hash-based-pycs always|default|never:\n\ - control how Python invalidates hash-based .pyc files\n\ -"; -static const char usage_4[] = "\ -file : program read from script file\n\ -- : program read from stdin (default; interactive mode if a tty)\n\ -arg ...: arguments passed to program in sys.argv[1:]\n\n\ -Other environment variables:\n\ -PYTHONSTARTUP: file executed on interactive startup (no default)\n\ -PYTHONPATH : '%lc'-separated list of directories prefixed to the\n\ - default module search path. The result is sys.path.\n\ -"; -static const char usage_5[] = -"PYTHONHOME : alternate directory (or %lc).\n" -" The default module search path uses %s.\n" -"PYTHONCASEOK : ignore case in 'import' statements (Windows).\n" -"PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n" -"PYTHONFAULTHANDLER: dump the Python traceback on fatal errors.\n"; -static const char usage_6[] = -"PYTHONHASHSEED: if this variable is set to 'random', a random value is used\n" -" to seed the hashes of str, bytes and datetime objects. It can also be\n" -" set to an integer in the range [0,4294967295] to get hash values with a\n" -" predictable seed.\n" -"PYTHONMALLOC: set the Python memory allocators and/or install debug hooks\n" -" on Python memory allocators. Use PYTHONMALLOC=debug to install debug\n" -" hooks.\n" -"PYTHONCOERCECLOCALE: if this variable is set to 0, it disables the locale\n" -" coercion behavior. Use PYTHONCOERCECLOCALE=warn to request display of\n" -" locale coercion and locale compatibility warnings on stderr.\n" -"PYTHONBREAKPOINT: if this variable is set to 0, it disables the default\n" -" debugger. It can be set to the callable of your debugger of choice.\n" -"PYTHONDEVMODE: enable the development mode.\n" -"PYTHONPYCACHEPREFIX: root directory for bytecode cache (pyc) files.\n"; - -static void -pymain_usage(int error, const wchar_t* program) -{ - FILE *f = error ? stderr : stdout; +/* --- PyMainInterpreter ------------------------------------------ */ - fprintf(f, usage_line, program); - if (error) - fprintf(f, "Try `python -h' for more information.\n"); - else { - fputs(usage_1, f); - fputs(usage_2, f); - fputs(usage_3, f); - fprintf(f, usage_4, (wint_t)DELIM); - fprintf(f, usage_5, (wint_t)DELIM, PYTHONHOMEHELP); - fputs(usage_6, f); - } -} - - -static void -pymain_run_interactive_hook(void) +void +_PyMainInterpreterConfig_Clear(_PyMainInterpreterConfig *config) { - PyObject *sys, *hook, *result; - sys = PyImport_ImportModule("sys"); - if (sys == NULL) { - goto error; - } - - hook = PyObject_GetAttrString(sys, "__interactivehook__"); - Py_DECREF(sys); - if (hook == NULL) { - PyErr_Clear(); - return; - } - - result = _PyObject_CallNoArg(hook); - Py_DECREF(hook); - if (result == NULL) { - goto error; - } - Py_DECREF(result); - - return; - -error: - PySys_WriteStderr("Failed calling sys.__interactivehook__\n"); - PyErr_Print(); + Py_CLEAR(config->argv); + Py_CLEAR(config->executable); + Py_CLEAR(config->prefix); + Py_CLEAR(config->base_prefix); + Py_CLEAR(config->exec_prefix); + Py_CLEAR(config->base_exec_prefix); + Py_CLEAR(config->warnoptions); + Py_CLEAR(config->xoptions); + Py_CLEAR(config->module_search_path); + Py_CLEAR(config->pycache_prefix); } static int -pymain_run_module(const wchar_t *modname, int set_argv0) +mainconfig_add_xoption(PyObject *opts, const wchar_t *s) { - PyObject *module, *runpy, *runmodule, *runargs, *result; - runpy = PyImport_ImportModule("runpy"); - if (runpy == NULL) { - fprintf(stderr, "Could not import runpy module\n"); - PyErr_Print(); - return -1; - } - runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main"); - if (runmodule == NULL) { - fprintf(stderr, "Could not access runpy._run_module_as_main\n"); - PyErr_Print(); - Py_DECREF(runpy); - return -1; - } - module = PyUnicode_FromWideChar(modname, wcslen(modname)); - if (module == NULL) { - fprintf(stderr, "Could not convert module name to unicode\n"); - PyErr_Print(); - Py_DECREF(runpy); - Py_DECREF(runmodule); - return -1; - } - runargs = Py_BuildValue("(Oi)", module, set_argv0); - if (runargs == NULL) { - fprintf(stderr, - "Could not create arguments for runpy._run_module_as_main\n"); - PyErr_Print(); - Py_DECREF(runpy); - Py_DECREF(runmodule); - Py_DECREF(module); - return -1; - } - result = PyObject_Call(runmodule, runargs, NULL); - if (result == NULL) { - PyErr_Print(); + PyObject *name, *value; + + const wchar_t *name_end = wcschr(s, L'='); + if (!name_end) { + name = PyUnicode_FromWideChar(s, -1); + value = Py_True; + Py_INCREF(value); } - Py_DECREF(runpy); - Py_DECREF(runmodule); - Py_DECREF(module); - Py_DECREF(runargs); - if (result == NULL) { - return -1; + else { + name = PyUnicode_FromWideChar(s, name_end - s); + value = PyUnicode_FromWideChar(name_end + 1, -1); } - Py_DECREF(result); - return 0; -} - -static PyObject * -pymain_get_importer(const wchar_t *filename) -{ - PyObject *sys_path0 = NULL, *importer; - - sys_path0 = PyUnicode_FromWideChar(filename, wcslen(filename)); - if (sys_path0 == NULL) { + if (name == NULL || value == NULL) { goto error; } - - importer = PyImport_GetImporter(sys_path0); - if (importer == NULL) { + if (PyDict_SetItem(opts, name, value) < 0) { goto error; } - - if (importer == Py_None) { - Py_DECREF(sys_path0); - Py_DECREF(importer); - return NULL; - } - - Py_DECREF(importer); - return sys_path0; + Py_DECREF(name); + Py_DECREF(value); + return 0; error: - Py_XDECREF(sys_path0); - PySys_WriteStderr("Failed checking if argv[0] is an import path entry\n"); - PyErr_Print(); - return NULL; + Py_XDECREF(name); + Py_XDECREF(value); + return -1; } -static int -pymain_run_command(wchar_t *command, PyCompilerFlags *cf) +static PyObject* +mainconfig_create_xoptions_dict(const _PyCoreConfig *config) { - PyObject *unicode, *bytes; - int ret; - - unicode = PyUnicode_FromWideChar(command, -1); - if (unicode == NULL) { - goto error; + int nxoption = config->nxoption; + wchar_t **xoptions = config->xoptions; + PyObject *dict = PyDict_New(); + if (dict == NULL) { + return NULL; } - bytes = PyUnicode_AsUTF8String(unicode); - Py_DECREF(unicode); - if (bytes == NULL) { - goto error; + for (int i=0; i < nxoption; i++) { + wchar_t *option = xoptions[i]; + if (mainconfig_add_xoption(dict, option) < 0) { + Py_DECREF(dict); + return NULL; + } } - ret = PyRun_SimpleStringFlags(PyBytes_AsString(bytes), cf); - Py_DECREF(bytes); - return (ret != 0); - -error: - PySys_WriteStderr("Unable to decode the command from the command line:\n"); - PyErr_Print(); - return 1; + return dict; } -/* Main program */ - -typedef struct { - int argc; - int use_bytes_argv; - char **bytes_argv; - wchar_t **wchar_argv; -} _PyArgv; - -typedef struct { - const _PyArgv *args; - wchar_t **argv; - int nwarnoption; /* Number of -W command line options */ - wchar_t **warnoptions; /* Command line -W options */ - int nenv_warnoption; /* Number of PYTHONWARNINGS environment variables */ - wchar_t **env_warnoptions; /* PYTHONWARNINGS environment variables */ - int print_help; /* -h, -? options */ - int print_version; /* -V option */ -} _PyCmdline; - - - -/* Non-zero if filename, command (-c) or module (-m) is set - on the command line */ -#define RUN_CODE(config) \ - (config->run_command != NULL || config->run_filename != NULL \ - || config->run_module != NULL) - - -static _PyInitError -pymain_init_cmdline_argv(_PyCoreConfig *config, _PyCmdline *cmdline) +static PyObject* +mainconfig_copy_attr(PyObject *obj) { - assert(cmdline->argv == NULL); - - const _PyArgv *args = cmdline->args; - - if (args->use_bytes_argv) { - /* +1 for a the NULL terminator */ - size_t size = sizeof(wchar_t*) * (args->argc + 1); - wchar_t** argv = (wchar_t **)PyMem_RawMalloc(size); - if (argv == NULL) { - return _Py_INIT_NO_MEMORY(); - } - - for (int i = 0; i < args->argc; i++) { - size_t len; - wchar_t *arg = Py_DecodeLocale(args->bytes_argv[i], &len); - if (arg == NULL) { - _Py_wstrlist_clear(i, argv); - return DECODE_LOCALE_ERR("command line arguments", - (Py_ssize_t)len); - } - argv[i] = arg; - } - argv[args->argc] = NULL; - - cmdline->argv = argv; + if (PyUnicode_Check(obj)) { + Py_INCREF(obj); + return obj; } - else { - cmdline->argv = args->wchar_argv; + else if (PyList_Check(obj)) { + return PyList_GetSlice(obj, 0, Py_SIZE(obj)); } - - wchar_t *program; - if (args->argc >= 1 && cmdline->argv != NULL) { - program = cmdline->argv[0]; + else if (PyDict_Check(obj)) { + /* The dict type is used for xoptions. Make the assumption that keys + and values are immutables */ + return PyDict_Copy(obj); } else { - program = L""; - } - config->program = _PyMem_RawWcsdup(program); - if (config->program == NULL) { - return _Py_INIT_NO_MEMORY(); - } - - return _Py_INIT_OK(); -} - - -static void -pymain_clear_cmdline(_PyCmdline *cmdline) -{ - PyMemAllocatorEx old_alloc; - _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - - _Py_wstrlist_clear(cmdline->nwarnoption, cmdline->warnoptions); - cmdline->nwarnoption = 0; - cmdline->warnoptions = NULL; - - _Py_wstrlist_clear(cmdline->nenv_warnoption, cmdline->env_warnoptions); - cmdline->nenv_warnoption = 0; - cmdline->env_warnoptions = NULL; - - if (cmdline->args->use_bytes_argv && cmdline->argv != NULL) { - _Py_wstrlist_clear(cmdline->args->argc, cmdline->argv); + PyErr_Format(PyExc_TypeError, + "cannot copy config attribute of type %.200s", + Py_TYPE(obj)->tp_name); + return NULL; } - cmdline->argv = NULL; - - PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); } -static void -pymain_clear_config(_PyCoreConfig *config) +int +_PyMainInterpreterConfig_Copy(_PyMainInterpreterConfig *config, + const _PyMainInterpreterConfig *config2) { - /* Clear core config with the memory allocator - used by pymain_read_conf() */ - PyMemAllocatorEx old_alloc; - _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); + _PyMainInterpreterConfig_Clear(config); - _PyCoreConfig_Clear(config); +#define COPY_ATTR(ATTR) config->ATTR = config2->ATTR +#define COPY_OBJ_ATTR(ATTR) \ + do { \ + if (config2->ATTR != NULL) { \ + config->ATTR = mainconfig_copy_attr(config2->ATTR); \ + if (config->ATTR == NULL) { \ + return -1; \ + } \ + } \ + } while (0) - PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); + COPY_ATTR(install_signal_handlers); + COPY_OBJ_ATTR(argv); + COPY_OBJ_ATTR(executable); + COPY_OBJ_ATTR(prefix); + COPY_OBJ_ATTR(base_prefix); + COPY_OBJ_ATTR(exec_prefix); + COPY_OBJ_ATTR(base_exec_prefix); + COPY_OBJ_ATTR(warnoptions); + COPY_OBJ_ATTR(xoptions); + COPY_OBJ_ATTR(module_search_path); + COPY_OBJ_ATTR(pycache_prefix); +#undef COPY_ATTR +#undef COPY_OBJ_ATTR + return 0; } -static void -pymain_free(void) +PyObject* +_PyMainInterpreterConfig_AsDict(const _PyMainInterpreterConfig *config) { - _PyImport_Fini2(); - - /* Free global variables which cannot be freed in Py_Finalize(): - configuration options set before Py_Initialize() which should - remain valid after Py_Finalize(), since - Py_Initialize()-Py_Finalize() can be called multiple times. */ - _PyPathConfig_ClearGlobal(); - _Py_ClearStandardStreamEncoding(); - - /* Force the allocator used by pymain_read_conf() */ - PyMemAllocatorEx old_alloc; - _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); + PyObject *dict, *obj; + int res; - _Py_wstrlist_clear(orig_argc, orig_argv); - orig_argc = 0; - orig_argv = NULL; + dict = PyDict_New(); + if (dict == NULL) { + return NULL; + } - PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); +#define SET_ITEM_INT(ATTR) \ + do { \ + obj = PyLong_FromLong(config->ATTR); \ + if (obj == NULL) { \ + goto fail; \ + } \ + res = PyDict_SetItemString(dict, #ATTR, obj); \ + Py_DECREF(obj); \ + if (res < 0) { \ + goto fail; \ + } \ + } while (0) -#ifdef __INSURE__ - /* Insure++ is a memory analysis tool that aids in discovering - * memory leaks and other memory problems. On Python exit, the - * interned string dictionaries are flagged as being in use at exit - * (which it is). Under normal circumstances, this is fine because - * the memory will be automatically reclaimed by the system. Under - * memory debugging, it's a huge source of useless noise, so we - * trade off slower shutdown for less distraction in the memory - * reports. -baw - */ - _Py_ReleaseInternedUnicodeStrings(); -#endif /* __INSURE__ */ -} +#define SET_ITEM_OBJ(ATTR) \ + do { \ + obj = config->ATTR; \ + if (obj == NULL) { \ + obj = Py_None; \ + } \ + res = PyDict_SetItemString(dict, #ATTR, obj); \ + if (res < 0) { \ + goto fail; \ + } \ + } while (0) + SET_ITEM_INT(install_signal_handlers); + SET_ITEM_OBJ(argv); + SET_ITEM_OBJ(executable); + SET_ITEM_OBJ(prefix); + SET_ITEM_OBJ(base_prefix); + SET_ITEM_OBJ(exec_prefix); + SET_ITEM_OBJ(base_exec_prefix); + SET_ITEM_OBJ(warnoptions); + SET_ITEM_OBJ(xoptions); + SET_ITEM_OBJ(module_search_path); + SET_ITEM_OBJ(pycache_prefix); -static int -pymain_sys_path_add_path0(PyInterpreterState *interp, PyObject *path0) -{ - _Py_IDENTIFIER(path); - PyObject *sys_path; - PyObject *sysdict = interp->sysdict; - if (sysdict != NULL) { - sys_path = _PyDict_GetItemIdWithError(sysdict, &PyId_path); - if (sys_path == NULL && PyErr_Occurred()) { - goto error; - } - } - else { - sys_path = NULL; - } - if (sys_path == NULL) { - PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path"); - goto error; - } + return dict; - if (PyList_Insert(sys_path, 0, path0)) { - goto error; - } - return 0; +fail: + Py_DECREF(dict); + return NULL; -error: - PyErr_Print(); - return -1; +#undef SET_ITEM_OBJ } _PyInitError -_Py_wstrlist_append(int *len, wchar_t ***list, const wchar_t *str) +_PyMainInterpreterConfig_Read(_PyMainInterpreterConfig *main_config, + const _PyCoreConfig *config) { - if (*len == INT_MAX) { - /* len+1 would overflow */ - return _Py_INIT_NO_MEMORY(); - } - wchar_t *str2 = _PyMem_RawWcsdup(str); - if (str2 == NULL) { - return _Py_INIT_NO_MEMORY(); - } - - size_t size = (*len + 1) * sizeof(list[0]); - wchar_t **list2 = (wchar_t **)PyMem_RawRealloc(*list, size); - if (list2 == NULL) { - PyMem_RawFree(str2); - return _Py_INIT_NO_MEMORY(); + if (main_config->install_signal_handlers < 0) { + main_config->install_signal_handlers = config->install_signal_handlers; } - list2[*len] = str2; - *list = list2; - (*len)++; - return _Py_INIT_OK(); -} - - -/* Parse the command line arguments */ -static _PyInitError -pymain_parse_cmdline_impl(_PyCoreConfig *config, _PyCmdline *cmdline, - int *need_usage) -{ - _PyInitError err; - _PyOS_ResetGetOpt(); - do { - int longindex = -1; - int c = _PyOS_GetOpt(cmdline->args->argc, cmdline->argv, PROGRAM_OPTS, - longoptions, &longindex); - if (c == EOF) { - break; - } - - if (c == 'c') { - /* -c is the last option; following arguments - that look like options are left for the - command to interpret. */ - size_t len = wcslen(_PyOS_optarg) + 1 + 1; - wchar_t *command = PyMem_RawMalloc(sizeof(wchar_t) * len); - if (command == NULL) { - return _Py_INIT_NO_MEMORY(); - } - memcpy(command, _PyOS_optarg, (len - 2) * sizeof(wchar_t)); - command[len - 2] = '\n'; - command[len - 1] = 0; - config->run_command = command; - break; - } - - if (c == 'm') { - /* -m is the last option; following arguments - that look like options are left for the - module to interpret. */ - config->run_module = _PyMem_RawWcsdup(_PyOS_optarg); - if (config->run_module == NULL) { - return _Py_INIT_NO_MEMORY(); - } - break; - } - - switch (c) { - case 0: - // Handle long option. - assert(longindex == 0); // Only one long option now. - if (!wcscmp(_PyOS_optarg, L"always")) { - config->_check_hash_pycs_mode = "always"; - } else if (!wcscmp(_PyOS_optarg, L"never")) { - config->_check_hash_pycs_mode = "never"; - } else if (!wcscmp(_PyOS_optarg, L"default")) { - config->_check_hash_pycs_mode = "default"; - } else { - fprintf(stderr, "--check-hash-based-pycs must be one of " - "'default', 'always', or 'never'\n"); - *need_usage = 1; - return _Py_INIT_OK(); - } - break; - - case 'b': - config->bytes_warning++; - break; - - case 'd': - config->parser_debug++; - break; - - case 'i': - config->inspect++; - config->interactive++; - break; - - case 'I': - config->isolated++; - break; - - /* case 'J': reserved for Jython */ - - case 'O': - config->optimization_level++; - break; - - case 'B': - config->write_bytecode = 0; - break; - - case 's': - config->user_site_directory = 0; - break; - - case 'S': - config->site_import = 0; - break; - - case 'E': - config->use_environment = 0; - break; - - case 't': - /* ignored for backwards compatibility */ - break; - - case 'u': - config->buffered_stdio = 0; - break; - - case 'v': - config->verbose++; - break; - - case 'x': - config->skip_source_first_line = 1; - break; - - case 'h': - case '?': - cmdline->print_help++; - break; - - case 'V': - cmdline->print_version++; - break; - - case 'W': - err = _Py_wstrlist_append(&cmdline->nwarnoption, - &cmdline->warnoptions, - _PyOS_optarg); - if (_Py_INIT_FAILED(err)) { - return err; - } - break; - - case 'X': - err = _Py_wstrlist_append(&config->nxoption, - &config->xoptions, - _PyOS_optarg); - if (_Py_INIT_FAILED(err)) { - return err; - } - break; - - case 'q': - config->quiet++; - break; - case 'R': - config->use_hash_seed = 0; - break; - - /* This space reserved for other options */ - - default: - /* unknown argument: parsing failed */ - *need_usage = 1; - return _Py_INIT_OK(); - } - } while (1); - - if (config->run_command == NULL && config->run_module == NULL - && _PyOS_optind < cmdline->args->argc - && wcscmp(cmdline->argv[_PyOS_optind], L"-") != 0) - { - config->run_filename = _PyMem_RawWcsdup(cmdline->argv[_PyOS_optind]); - if (config->run_filename == NULL) { + if (main_config->xoptions == NULL) { + main_config->xoptions = mainconfig_create_xoptions_dict(config); + if (main_config->xoptions == NULL) { return _Py_INIT_NO_MEMORY(); } } - if (config->run_command != NULL || config->run_module != NULL) { - /* Backup _PyOS_optind */ - _PyOS_optind--; - } +#define COPY_WSTR(ATTR) \ + do { \ + if (main_config->ATTR == NULL && config->ATTR != NULL) { \ + main_config->ATTR = PyUnicode_FromWideChar(config->ATTR, -1); \ + if (main_config->ATTR == NULL) { \ + return _Py_INIT_NO_MEMORY(); \ + } \ + } \ + } while (0) +#define COPY_WSTRLIST(ATTR, LEN, LIST) \ + do { \ + if (ATTR == NULL) { \ + ATTR = _Py_wstrlist_as_pylist(LEN, LIST); \ + if (ATTR == NULL) { \ + return _Py_INIT_NO_MEMORY(); \ + } \ + } \ + } while (0) - /* -c and -m options are exclusive */ - assert(!(config->run_command != NULL && config->run_module != NULL)); + COPY_WSTRLIST(main_config->warnoptions, + config->nwarnoption, config->warnoptions); + if (config->argc >= 0) { + COPY_WSTRLIST(main_config->argv, + config->argc, config->argv); + } - return _Py_INIT_OK(); -} + if (config->_install_importlib) { + COPY_WSTR(executable); + COPY_WSTR(prefix); + COPY_WSTR(base_prefix); + COPY_WSTR(exec_prefix); + COPY_WSTR(base_exec_prefix); + COPY_WSTRLIST(main_config->module_search_path, + config->nmodule_search_path, config->module_search_paths); -static int -add_xoption(PyObject *opts, const wchar_t *s) -{ - PyObject *name, *value; + if (config->pycache_prefix != NULL) { + COPY_WSTR(pycache_prefix); + } else { + main_config->pycache_prefix = NULL; + } - const wchar_t *name_end = wcschr(s, L'='); - if (!name_end) { - name = PyUnicode_FromWideChar(s, -1); - value = Py_True; - Py_INCREF(value); } - else { - name = PyUnicode_FromWideChar(s, name_end - s); - value = PyUnicode_FromWideChar(name_end + 1, -1); - } - if (name == NULL || value == NULL) { - goto error; - } - if (PyDict_SetItem(opts, name, value) < 0) { - goto error; - } - Py_DECREF(name); - Py_DECREF(value); - return 0; -error: - Py_XDECREF(name); - Py_XDECREF(value); - return -1; + return _Py_INIT_OK(); +#undef COPY_WSTR +#undef COPY_WSTRLIST } -static PyObject* -config_create_xoptions_dict(const _PyCoreConfig *config) +/* --- pymain_init() ---------------------------------------------- */ + +static void +config_clear(_PyCoreConfig *config) { - int nxoption = config->nxoption; - wchar_t **xoptions = config->xoptions; - PyObject *dict = PyDict_New(); - if (dict == NULL) { - return NULL; - } + PyMemAllocatorEx old_alloc; + _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - for (int i=0; i < nxoption; i++) { - wchar_t *option = xoptions[i]; - if (add_xoption(dict, option) < 0) { - Py_DECREF(dict); - return NULL; - } - } + _PyCoreConfig_Clear(config); - return dict; + PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); } static _PyInitError -config_add_warnings_optlist(_PyCoreConfig *config, int len, wchar_t **options) +config_read_write(_PyCoreConfig *config, const _PyArgv *args) { - for (int i = 0; i < len; i++) { - _PyInitError err = _Py_wstrlist_append(&config->nwarnoption, - &config->warnoptions, - options[i]); - if (_Py_INIT_FAILED(err)) { - return err; - } + _PyInitError err; + + PyMemAllocatorEx old_alloc; + _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); + + _PyCoreConfig_GetGlobalConfig(config); + + err = _PyCoreConfig_ReadFromArgv(config, args); + + PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); + + if (_Py_INIT_FAILED(err)) { + return err; } + + _PyCoreConfig_Write(config); return _Py_INIT_OK(); } static _PyInitError -config_init_warnoptions(_PyCoreConfig *config, _PyCmdline *cmdline) +pymain_init_python_main(PyInterpreterState *interp) { _PyInitError err; - assert(config->nwarnoption == 0); - - /* The priority order for warnings configuration is (highest precedence - * first): - * - * - the BytesWarning filter, if needed ('-b', '-bb') - * - any '-W' command line options; then - * - the 'PYTHONWARNINGS' environment variable; then - * - the dev mode filter ('-X dev', 'PYTHONDEVMODE'); then - * - any implicit filters added by _warnings.c/warnings.py - * - * All settings except the last are passed to the warnings module via - * the `sys.warnoptions` list. Since the warnings module works on the basis - * of "the most recently added filter will be checked first", we add - * the lowest precedence entries first so that later entries override them. - */ - - if (config->dev_mode) { - err = _Py_wstrlist_append(&config->nwarnoption, - &config->warnoptions, - L"default"); - if (_Py_INIT_FAILED(err)) { - return err; - } + _PyMainInterpreterConfig main_config = _PyMainInterpreterConfig_INIT; + err = _PyMainInterpreterConfig_Read(&main_config, &interp->core_config); + if (!_Py_INIT_FAILED(err)) { + err = _Py_InitializeMainInterpreter(interp, &main_config); } + _PyMainInterpreterConfig_Clear(&main_config); - err = config_add_warnings_optlist(config, - cmdline->nenv_warnoption, - cmdline->env_warnoptions); if (_Py_INIT_FAILED(err)) { return err; } + return _Py_INIT_OK(); +} + + +static _PyInitError +pymain_init(const _PyArgv *args, PyInterpreterState **interp_p) +{ + _PyInitError err; - err = config_add_warnings_optlist(config, - cmdline->nwarnoption, - cmdline->warnoptions); + err = _PyRuntime_Initialize(); if (_Py_INIT_FAILED(err)) { return err; } - /* If the bytes_warning_flag isn't set, bytesobject.c and bytearrayobject.c - * don't even try to emit a warning, so we skip setting the filter in that - * case. + /* 754 requires that FP exceptions run in "no stop" mode by default, + * and until C vendors implement C99's ways to control FP exceptions, + * Python requires non-stop mode. Alas, some platforms enable FP + * exceptions by default. Here we disable them. */ - if (config->bytes_warning) { - wchar_t *filter; - if (config->bytes_warning> 1) { - filter = L"error::BytesWarning"; - } - else { - filter = L"default::BytesWarning"; - } - err = _Py_wstrlist_append(&config->nwarnoption, - &config->warnoptions, - filter); - if (_Py_INIT_FAILED(err)) { - return err; - } - } - return _Py_INIT_OK(); -} +#ifdef __FreeBSD__ + fedisableexcept(FE_OVERFLOW); +#endif + _PyCoreConfig local_config = _PyCoreConfig_INIT; + _PyCoreConfig *config = &local_config; -/* Get warning options from PYTHONWARNINGS environment variable. */ -static _PyInitError -cmdline_init_env_warnoptions(const _PyCoreConfig *config, _PyCmdline *cmdline) -{ - wchar_t *env; - int res = _PyCoreConfig_GetEnvDup(config, &env, - L"PYTHONWARNINGS", "PYTHONWARNINGS"); - if (res < 0) { - return DECODE_LOCALE_ERR("PYTHONWARNINGS", res); + err = config_read_write(config, args); + if (_Py_INIT_FAILED(err)) { + goto done; } - if (env == NULL) { - return _Py_INIT_OK(); + PyInterpreterState *interp; + err = _Py_InitializeCore(&interp, config); + if (_Py_INIT_FAILED(err)) { + goto done; } + *interp_p = interp; - - wchar_t *warning, *context = NULL; - for (warning = WCSTOK(env, L",", &context); - warning != NULL; - warning = WCSTOK(NULL, L",", &context)) - { - _PyInitError err = _Py_wstrlist_append(&cmdline->nenv_warnoption, - &cmdline->env_warnoptions, - warning); - if (_Py_INIT_FAILED(err)) { - PyMem_RawFree(env); - return err; - } + err = pymain_init_python_main(interp); + if (_Py_INIT_FAILED(err)) { + goto done; } - PyMem_RawFree(env); - return _Py_INIT_OK(); + + err = _Py_INIT_OK(); + +done: + config_clear(config); + return err; } +/* --- pymain_run_python() ---------------------------------------- */ + +/* Non-zero if filename, command (-c) or module (-m) is set + on the command line */ +#define RUN_CODE(config) \ + (config->run_command != NULL || config->run_filename != NULL \ + || config->run_module != NULL) + /* Return non-zero is stdin is a TTY or if -i command line option is used */ static int stdin_is_interactive(const _PyCoreConfig *config) @@ -877,128 +403,84 @@ stdin_is_interactive(const _PyCoreConfig *config) } -static void -pymain_init_stdio(_PyCoreConfig *config) +static PyObject * +pymain_get_importer(const wchar_t *filename) { -#if defined(MS_WINDOWS) || defined(__CYGWIN__) - /* don't translate newlines (\r\n <=> \n) */ - _setmode(fileno(stdin), O_BINARY); - _setmode(fileno(stdout), O_BINARY); - _setmode(fileno(stderr), O_BINARY); -#endif + PyObject *sys_path0 = NULL, *importer; - if (!config->buffered_stdio) { -#ifdef HAVE_SETVBUF - setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ); - setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ); - setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ); -#else /* !HAVE_SETVBUF */ - setbuf(stdin, (char *)NULL); - setbuf(stdout, (char *)NULL); - setbuf(stderr, (char *)NULL); -#endif /* !HAVE_SETVBUF */ - } - else if (config->interactive) { -#ifdef MS_WINDOWS - /* Doesn't have to have line-buffered -- use unbuffered */ - /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */ - setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ); -#else /* !MS_WINDOWS */ -#ifdef HAVE_SETVBUF - setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ); - setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ); -#endif /* HAVE_SETVBUF */ -#endif /* !MS_WINDOWS */ - /* Leave stderr alone - it should be unbuffered anyway. */ + sys_path0 = PyUnicode_FromWideChar(filename, wcslen(filename)); + if (sys_path0 == NULL) { + goto error; } -} - -static void -pymain_header(const _PyCoreConfig *config) -{ - if (config->quiet) { - return; + importer = PyImport_GetImporter(sys_path0); + if (importer == NULL) { + goto error; } - if (!config->verbose && (RUN_CODE(config) || !stdin_is_interactive(config))) { - return; + if (importer == Py_None) { + Py_DECREF(sys_path0); + Py_DECREF(importer); + return NULL; } - fprintf(stderr, "Python %s on %s\n", Py_GetVersion(), Py_GetPlatform()); - if (config->site_import) { - fprintf(stderr, "%s\n", COPYRIGHT); - } + Py_DECREF(importer); + return sys_path0; + +error: + Py_XDECREF(sys_path0); + PySys_WriteStderr("Failed checking if argv[0] is an import path entry\n"); + PyErr_Print(); + return NULL; } -static _PyInitError -pymain_init_core_argv(_PyCoreConfig *config, _PyCmdline *cmdline) +static int +pymain_sys_path_add_path0(PyInterpreterState *interp, PyObject *path0) { - /* Copy argv to be able to modify it (to force -c/-m) */ - int argc = cmdline->args->argc - _PyOS_optind; - wchar_t **argv; - - if (argc <= 0 || cmdline->argv == NULL) { - /* Ensure at least one (empty) argument is seen */ - static wchar_t *empty_argv[1] = {L""}; - argc = 1; - argv = _Py_wstrlist_copy(1, empty_argv); + _Py_IDENTIFIER(path); + PyObject *sys_path; + PyObject *sysdict = interp->sysdict; + if (sysdict != NULL) { + sys_path = _PyDict_GetItemIdWithError(sysdict, &PyId_path); + if (sys_path == NULL && PyErr_Occurred()) { + goto error; + } } else { - argv = _Py_wstrlist_copy(argc, &cmdline->argv[_PyOS_optind]); - } - - if (argv == NULL) { - return _Py_INIT_NO_MEMORY(); - } - - wchar_t *arg0 = NULL; - if (config->run_command != NULL) { - /* Force sys.argv[0] = '-c' */ - arg0 = L"-c"; + sys_path = NULL; } - else if (config->run_module != NULL) { - /* Force sys.argv[0] = '-m'*/ - arg0 = L"-m"; + if (sys_path == NULL) { + PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path"); + goto error; } - if (arg0 != NULL) { - arg0 = _PyMem_RawWcsdup(arg0); - if (arg0 == NULL) { - _Py_wstrlist_clear(argc, argv); - return _Py_INIT_NO_MEMORY(); - } - assert(argc >= 1); - PyMem_RawFree(argv[0]); - argv[0] = arg0; + if (PyList_Insert(sys_path, 0, path0)) { + goto error; } + return 0; - config->argc = argc; - config->argv = argv; - return _Py_INIT_OK(); +error: + PyErr_Print(); + return -1; } -PyObject* -_Py_wstrlist_as_pylist(int len, wchar_t **list) +static void +pymain_header(const _PyCoreConfig *config) { - assert(list != NULL || len < 1); + if (config->quiet) { + return; + } - PyObject *pylist = PyList_New(len); - if (pylist == NULL) { - return NULL; + if (!config->verbose && (RUN_CODE(config) || !stdin_is_interactive(config))) { + return; } - for (int i = 0; i < len; i++) { - PyObject *v = PyUnicode_FromWideChar(list[i], -1); - if (v == NULL) { - Py_DECREF(pylist); - return NULL; - } - PyList_SET_ITEM(pylist, i, v); + fprintf(stderr, "Python %s on %s\n", Py_GetVersion(), Py_GetPlatform()); + if (config->site_import) { + fprintf(stderr, "%s\n", COPYRIGHT); } - return pylist; } @@ -1025,29 +507,82 @@ pymain_import_readline(const _PyCoreConfig *config) } -static void -pymain_run_startup(_PyCoreConfig *config, PyCompilerFlags *cf) +static int +pymain_run_command(wchar_t *command, PyCompilerFlags *cf) { - const char *startup = _PyCoreConfig_GetEnv(config, "PYTHONSTARTUP"); - if (startup == NULL) { - return; + PyObject *unicode, *bytes; + int ret; + + unicode = PyUnicode_FromWideChar(command, -1); + if (unicode == NULL) { + goto error; } - FILE *fp = _Py_fopen(startup, "r"); - if (fp == NULL) { - int save_errno = errno; - PySys_WriteStderr("Could not open PYTHONSTARTUP\n"); - errno = save_errno; + bytes = PyUnicode_AsUTF8String(unicode); + Py_DECREF(unicode); + if (bytes == NULL) { + goto error; + } - PyErr_SetFromErrnoWithFilename(PyExc_OSError, - startup); + ret = PyRun_SimpleStringFlags(PyBytes_AsString(bytes), cf); + Py_DECREF(bytes); + return (ret != 0); + +error: + PySys_WriteStderr("Unable to decode the command from the command line:\n"); + PyErr_Print(); + return 1; +} + + +static int +pymain_run_module(const wchar_t *modname, int set_argv0) +{ + PyObject *module, *runpy, *runmodule, *runargs, *result; + runpy = PyImport_ImportModule("runpy"); + if (runpy == NULL) { + fprintf(stderr, "Could not import runpy module\n"); PyErr_Print(); - return; + return -1; } - - (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf); - PyErr_Clear(); - fclose(fp); + runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main"); + if (runmodule == NULL) { + fprintf(stderr, "Could not access runpy._run_module_as_main\n"); + PyErr_Print(); + Py_DECREF(runpy); + return -1; + } + module = PyUnicode_FromWideChar(modname, wcslen(modname)); + if (module == NULL) { + fprintf(stderr, "Could not convert module name to unicode\n"); + PyErr_Print(); + Py_DECREF(runpy); + Py_DECREF(runmodule); + return -1; + } + runargs = Py_BuildValue("(Oi)", module, set_argv0); + if (runargs == NULL) { + fprintf(stderr, + "Could not create arguments for runpy._run_module_as_main\n"); + PyErr_Print(); + Py_DECREF(runpy); + Py_DECREF(runmodule); + Py_DECREF(module); + return -1; + } + result = PyObject_Call(runmodule, runargs, NULL); + if (result == NULL) { + PyErr_Print(); + } + Py_DECREF(runpy); + Py_DECREF(runmodule); + Py_DECREF(module); + Py_DECREF(runargs); + if (result == NULL) { + return -1; + } + Py_DECREF(result); + return 0; } @@ -1117,437 +652,108 @@ pymain_run_file(_PyCoreConfig *config, PyCompilerFlags *cf) /* PyRun_AnyFileExFlags(closeit=1) calls fclose(fp) before running code */ int run = PyRun_AnyFileExFlags(fp, filename_str, 1, cf); Py_XDECREF(bytes); - return (run != 0); -} - - -static int -pymain_run_stdin(_PyCoreConfig *config, PyCompilerFlags *cf) -{ - if (stdin_is_interactive(config)) { - Py_InspectFlag = 0; /* do exit on SystemExit */ - config->inspect = 0; - pymain_run_startup(config, cf); - pymain_run_interactive_hook(); - } - - /* call pending calls like signal handlers (SIGINT) */ - if (Py_MakePendingCalls() == -1) { - PyErr_Print(); - return 1; - } - - int run = PyRun_AnyFileExFlags(stdin, "", 0, cf); - return (run != 0); -} - - -static void -pymain_repl(_PyCoreConfig *config, PyCompilerFlags *cf, int *exitcode) -{ - /* Check this environment variable at the end, to give programs the - opportunity to set it from Python. */ - if (!Py_InspectFlag && _PyCoreConfig_GetEnv(config, "PYTHONINSPECT")) { - Py_InspectFlag = 1; - config->inspect = 1; - } - - if (!(Py_InspectFlag && stdin_is_interactive(config) && RUN_CODE(config))) { - return; - } - - Py_InspectFlag = 0; - config->inspect = 0; - pymain_run_interactive_hook(); - - int res = PyRun_AnyFileFlags(stdin, "", cf); - *exitcode = (res != 0); -} - - -/* Parse the command line. - Handle --version and --help options directly. */ -static _PyInitError -pymain_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline) -{ - int need_usage = 0; - _PyInitError err; - err = pymain_parse_cmdline_impl(config, cmdline, &need_usage); - if (_Py_INIT_FAILED(err)) { - return err; - } - - if (need_usage) { - pymain_usage(1, config->program); - return _Py_INIT_EXIT(2); - } - return _Py_INIT_OK(); -} - - -/* Parse command line options and environment variables. - This code must not use Python runtime apart PyMem_Raw memory allocator. */ -static _PyInitError -pymain_read_conf_impl(_PyCoreConfig *config, _PyCmdline *cmdline) -{ - _PyInitError err; - - err = pymain_parse_cmdline(config, cmdline); - if (_Py_INIT_FAILED(err)) { - return err; - } - - err = pymain_init_core_argv(config, cmdline); - if (_Py_INIT_FAILED(err)) { - return err; - } - - err = _PyCoreConfig_Read(config); - if (_Py_INIT_FAILED(err)) { - return err; - } - - if (config->use_environment) { - err = cmdline_init_env_warnoptions(config, cmdline); - if (_Py_INIT_FAILED(err)) { - return err; - } - } - - err = config_init_warnoptions(config, cmdline); - if (_Py_INIT_FAILED(err)) { - return err; - } - return _Py_INIT_OK(); -} - - -/* Read the configuration and initialize the LC_CTYPE locale: - enable UTF-8 mode (PEP 540) and/or coerce the C locale (PEP 538). */ -static _PyInitError -pymain_read_conf(_PyCoreConfig *config, _PyCmdline *cmdline) -{ - _PyInitError err; - int init_utf8_mode = Py_UTF8Mode; -#ifdef MS_WINDOWS - int init_legacy_encoding = Py_LegacyWindowsFSEncodingFlag; -#endif - _PyCoreConfig save_config = _PyCoreConfig_INIT; - int locale_coerced = 0; - int loops = 0; - - if (_PyCoreConfig_Copy(&save_config, config) < 0) { - err = _Py_INIT_NO_MEMORY(); - goto done; - } - - /* Set LC_CTYPE to the user preferred locale */ - _Py_SetLocaleFromEnv(LC_CTYPE); - - while (1) { - int utf8_mode = config->utf8_mode; - int encoding_changed = 0; - - /* Watchdog to prevent an infinite loop */ - loops++; - if (loops == 3) { - err = _Py_INIT_ERR("Encoding changed twice while " - "reading the configuration"); - goto done; - } - - /* bpo-34207: Py_DecodeLocale() and Py_EncodeLocale() depend - on Py_UTF8Mode and Py_LegacyWindowsFSEncodingFlag. */ - Py_UTF8Mode = config->utf8_mode; -#ifdef MS_WINDOWS - Py_LegacyWindowsFSEncodingFlag = config->legacy_windows_fs_encoding; -#endif - - err = pymain_init_cmdline_argv(config, cmdline); - if (_Py_INIT_FAILED(err)) { - goto done; - } - - err = pymain_read_conf_impl(config, cmdline); - if (_Py_INIT_FAILED(err)) { - goto done; - } - - /* The legacy C locale assumes ASCII as the default text encoding, which - * causes problems not only for the CPython runtime, but also other - * components like GNU readline. - * - * Accordingly, when the CLI detects it, it attempts to coerce it to a - * more capable UTF-8 based alternative. - * - * See the documentation of the PYTHONCOERCECLOCALE setting for more - * details. - */ - if (config->coerce_c_locale && !locale_coerced) { - locale_coerced = 1; - _Py_CoerceLegacyLocale(config->coerce_c_locale_warn); - encoding_changed = 1; - } - - if (utf8_mode == -1) { - if (config->utf8_mode == 1) { - /* UTF-8 Mode enabled */ - encoding_changed = 1; - } - } - else { - if (config->utf8_mode != utf8_mode) { - encoding_changed = 1; - } - } - - if (!encoding_changed) { - break; - } - - /* Reset the configuration before reading again the configuration, - just keep UTF-8 Mode value. */ - int new_utf8_mode = config->utf8_mode; - int new_coerce_c_locale = config->coerce_c_locale; - if (_PyCoreConfig_Copy(config, &save_config) < 0) { - err = _Py_INIT_NO_MEMORY(); - goto done; - } - pymain_clear_cmdline(cmdline); - const _PyArgv *args = cmdline->args; - memset(cmdline, 0, sizeof(*cmdline)); - cmdline->args = args; - config->utf8_mode = new_utf8_mode; - config->coerce_c_locale = new_coerce_c_locale; - - /* The encoding changed: read again the configuration - with the new encoding */ - } - err = _Py_INIT_OK(); - -done: - _PyCoreConfig_Clear(&save_config); - Py_UTF8Mode = init_utf8_mode ; -#ifdef MS_WINDOWS - Py_LegacyWindowsFSEncodingFlag = init_legacy_encoding; -#endif - return err; -} - - -void -_PyMainInterpreterConfig_Clear(_PyMainInterpreterConfig *config) -{ - Py_CLEAR(config->argv); - Py_CLEAR(config->executable); - Py_CLEAR(config->prefix); - Py_CLEAR(config->base_prefix); - Py_CLEAR(config->exec_prefix); - Py_CLEAR(config->base_exec_prefix); - Py_CLEAR(config->warnoptions); - Py_CLEAR(config->xoptions); - Py_CLEAR(config->module_search_path); - Py_CLEAR(config->pycache_prefix); -} - - -static PyObject* -config_copy_attr(PyObject *obj) -{ - if (PyUnicode_Check(obj)) { - Py_INCREF(obj); - return obj; - } - else if (PyList_Check(obj)) { - return PyList_GetSlice(obj, 0, Py_SIZE(obj)); - } - else if (PyDict_Check(obj)) { - /* The dict type is used for xoptions. Make the assumption that keys - and values are immutables */ - return PyDict_Copy(obj); - } - else { - PyErr_Format(PyExc_TypeError, - "cannot copy config attribute of type %.200s", - Py_TYPE(obj)->tp_name); - return NULL; - } -} - - -int -_PyMainInterpreterConfig_Copy(_PyMainInterpreterConfig *config, - const _PyMainInterpreterConfig *config2) -{ - _PyMainInterpreterConfig_Clear(config); - -#define COPY_ATTR(ATTR) config->ATTR = config2->ATTR -#define COPY_OBJ_ATTR(ATTR) \ - do { \ - if (config2->ATTR != NULL) { \ - config->ATTR = config_copy_attr(config2->ATTR); \ - if (config->ATTR == NULL) { \ - return -1; \ - } \ - } \ - } while (0) - - COPY_ATTR(install_signal_handlers); - COPY_OBJ_ATTR(argv); - COPY_OBJ_ATTR(executable); - COPY_OBJ_ATTR(prefix); - COPY_OBJ_ATTR(base_prefix); - COPY_OBJ_ATTR(exec_prefix); - COPY_OBJ_ATTR(base_exec_prefix); - COPY_OBJ_ATTR(warnoptions); - COPY_OBJ_ATTR(xoptions); - COPY_OBJ_ATTR(module_search_path); - COPY_OBJ_ATTR(pycache_prefix); -#undef COPY_ATTR -#undef COPY_OBJ_ATTR - return 0; -} - - -PyObject* -_PyMainInterpreterConfig_AsDict(const _PyMainInterpreterConfig *config) -{ - PyObject *dict, *obj; - int res; - - dict = PyDict_New(); - if (dict == NULL) { - return NULL; - } - -#define SET_ITEM_INT(ATTR) \ - do { \ - obj = PyLong_FromLong(config->ATTR); \ - if (obj == NULL) { \ - goto fail; \ - } \ - res = PyDict_SetItemString(dict, #ATTR, obj); \ - Py_DECREF(obj); \ - if (res < 0) { \ - goto fail; \ - } \ - } while (0) - -#define SET_ITEM_OBJ(ATTR) \ - do { \ - obj = config->ATTR; \ - if (obj == NULL) { \ - obj = Py_None; \ - } \ - res = PyDict_SetItemString(dict, #ATTR, obj); \ - if (res < 0) { \ - goto fail; \ - } \ - } while (0) - - SET_ITEM_INT(install_signal_handlers); - SET_ITEM_OBJ(argv); - SET_ITEM_OBJ(executable); - SET_ITEM_OBJ(prefix); - SET_ITEM_OBJ(base_prefix); - SET_ITEM_OBJ(exec_prefix); - SET_ITEM_OBJ(base_exec_prefix); - SET_ITEM_OBJ(warnoptions); - SET_ITEM_OBJ(xoptions); - SET_ITEM_OBJ(module_search_path); - SET_ITEM_OBJ(pycache_prefix); + return (run != 0); +} - return dict; -fail: - Py_DECREF(dict); - return NULL; +static void +pymain_run_startup(_PyCoreConfig *config, PyCompilerFlags *cf) +{ + const char *startup = _PyCoreConfig_GetEnv(config, "PYTHONSTARTUP"); + if (startup == NULL) { + return; + } -#undef SET_ITEM_OBJ + FILE *fp = _Py_fopen(startup, "r"); + if (fp == NULL) { + int save_errno = errno; + PySys_WriteStderr("Could not open PYTHONSTARTUP\n"); + errno = save_errno; + + PyErr_SetFromErrnoWithFilename(PyExc_OSError, + startup); + PyErr_Print(); + return; + } + + (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf); + PyErr_Clear(); + fclose(fp); } -_PyInitError -_PyMainInterpreterConfig_Read(_PyMainInterpreterConfig *main_config, - const _PyCoreConfig *config) +static void +pymain_run_interactive_hook(void) { - if (main_config->install_signal_handlers < 0) { - main_config->install_signal_handlers = config->install_signal_handlers; + PyObject *sys, *hook, *result; + sys = PyImport_ImportModule("sys"); + if (sys == NULL) { + goto error; } - if (main_config->xoptions == NULL) { - main_config->xoptions = config_create_xoptions_dict(config); - if (main_config->xoptions == NULL) { - return _Py_INIT_NO_MEMORY(); - } + hook = PyObject_GetAttrString(sys, "__interactivehook__"); + Py_DECREF(sys); + if (hook == NULL) { + PyErr_Clear(); + return; } -#define COPY_WSTR(ATTR) \ - do { \ - if (main_config->ATTR == NULL && config->ATTR != NULL) { \ - main_config->ATTR = PyUnicode_FromWideChar(config->ATTR, -1); \ - if (main_config->ATTR == NULL) { \ - return _Py_INIT_NO_MEMORY(); \ - } \ - } \ - } while (0) -#define COPY_WSTRLIST(ATTR, LEN, LIST) \ - do { \ - if (ATTR == NULL) { \ - ATTR = _Py_wstrlist_as_pylist(LEN, LIST); \ - if (ATTR == NULL) { \ - return _Py_INIT_NO_MEMORY(); \ - } \ - } \ - } while (0) - - COPY_WSTRLIST(main_config->warnoptions, - config->nwarnoption, config->warnoptions); - if (config->argc >= 0) { - COPY_WSTRLIST(main_config->argv, - config->argc, config->argv); + result = _PyObject_CallNoArg(hook); + Py_DECREF(hook); + if (result == NULL) { + goto error; } + Py_DECREF(result); - if (config->_install_importlib) { - COPY_WSTR(executable); - COPY_WSTR(prefix); - COPY_WSTR(base_prefix); - COPY_WSTR(exec_prefix); - COPY_WSTR(base_exec_prefix); + return; - COPY_WSTRLIST(main_config->module_search_path, - config->nmodule_search_path, config->module_search_paths); +error: + PySys_WriteStderr("Failed calling sys.__interactivehook__\n"); + PyErr_Print(); +} - if (config->pycache_prefix != NULL) { - COPY_WSTR(pycache_prefix); - } else { - main_config->pycache_prefix = NULL; - } +static int +pymain_run_stdin(_PyCoreConfig *config, PyCompilerFlags *cf) +{ + if (stdin_is_interactive(config)) { + Py_InspectFlag = 0; /* do exit on SystemExit */ + config->inspect = 0; + pymain_run_startup(config, cf); + pymain_run_interactive_hook(); } - return _Py_INIT_OK(); -#undef COPY_WSTR -#undef COPY_WSTRLIST + /* call pending calls like signal handlers (SIGINT) */ + if (Py_MakePendingCalls() == -1) { + PyErr_Print(); + return 1; + } + + int run = PyRun_AnyFileExFlags(stdin, "", 0, cf); + return (run != 0); } -static _PyInitError -pymain_init_python_main(PyInterpreterState *interp) +static void +pymain_repl(_PyCoreConfig *config, PyCompilerFlags *cf, int *exitcode) { - _PyInitError err; - - _PyMainInterpreterConfig main_config = _PyMainInterpreterConfig_INIT; - err = _PyMainInterpreterConfig_Read(&main_config, &interp->core_config); - if (!_Py_INIT_FAILED(err)) { - err = _Py_InitializeMainInterpreter(interp, &main_config); + /* Check this environment variable at the end, to give programs the + opportunity to set it from Python. */ + if (!Py_InspectFlag && _PyCoreConfig_GetEnv(config, "PYTHONINSPECT")) { + Py_InspectFlag = 1; + config->inspect = 1; } - _PyMainInterpreterConfig_Clear(&main_config); - if (_Py_INIT_FAILED(err)) { - return err; + if (!(Py_InspectFlag && stdin_is_interactive(config) && RUN_CODE(config))) { + return; } - return _Py_INIT_OK(); + + Py_InspectFlag = 0; + config->inspect = 0; + pymain_run_interactive_hook(); + + int res = PyRun_AnyFileFlags(stdin, "", cf); + *exitcode = (res != 0); } @@ -1620,129 +826,58 @@ pymain_run_python(PyInterpreterState *interp, int *exitcode) } -static _PyInitError -pymain_cmdline_impl(_PyCoreConfig *config, _PyCmdline *cmdline) -{ - _PyInitError err; - - err = _PyRuntime_Initialize(); - if (_Py_INIT_FAILED(err)) { - return err; - } - - err = pymain_read_conf(config, cmdline); - if (_Py_INIT_FAILED(err)) { - return err; - } - - if (cmdline->print_help) { - pymain_usage(0, config->program); - return _Py_INIT_EXIT(0); - } - - if (cmdline->print_version) { - printf("Python %s\n", - (cmdline->print_version >= 2) ? Py_GetVersion() : PY_VERSION); - return _Py_INIT_EXIT(0); - } - - /* For Py_GetArgcArgv(). Cleared by pymain_free(). */ - orig_argv = _Py_wstrlist_copy(cmdline->args->argc, cmdline->argv); - if (orig_argv == NULL) { - return _Py_INIT_NO_MEMORY(); - } - orig_argc = cmdline->args->argc; - return _Py_INIT_OK(); -} - - -/* Read the configuration into _PyCoreConfig and _PyMain, initialize the - LC_CTYPE locale and Py_DecodeLocale(). - - Configuration: +/* --- pymain_main() ---------------------------------------------- */ - * Command line arguments - * Environment variables - * Py_xxx global configuration variables - - _PyCmdline is a temporary structure used to prioritize these - variables. */ -static _PyInitError -pymain_cmdline(_PyArgv *args, _PyCoreConfig *config) +static void +pymain_free(void) { - /* Force default allocator, since pymain_free() and pymain_clear_config() - must use the same allocator than this function. */ - PyMemAllocatorEx old_alloc; - _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); -#ifdef Py_DEBUG - PyMemAllocatorEx default_alloc; - PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &default_alloc); -#endif - - _PyCmdline cmdline; - memset(&cmdline, 0, sizeof(cmdline)); - cmdline.args = args; - - _PyInitError err = pymain_cmdline_impl(config, &cmdline); - - pymain_clear_cmdline(&cmdline); + _PyImport_Fini2(); -#ifdef Py_DEBUG - /* Make sure that PYMEM_DOMAIN_RAW has not been modified */ - PyMemAllocatorEx cur_alloc; - PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &cur_alloc); - assert(memcmp(&cur_alloc, &default_alloc, sizeof(cur_alloc)) == 0); -#endif - PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - return err; + /* Free global variables which cannot be freed in Py_Finalize(): + configuration options set before Py_Initialize() which should + remain valid after Py_Finalize(), since + Py_Initialize()-Py_Finalize() can be called multiple times. */ + _PyPathConfig_ClearGlobal(); + _Py_ClearStandardStreamEncoding(); + _Py_ClearArgcArgv(); +#ifdef __INSURE__ + /* Insure++ is a memory analysis tool that aids in discovering + * memory leaks and other memory problems. On Python exit, the + * interned string dictionaries are flagged as being in use at exit + * (which it is). Under normal circumstances, this is fine because + * the memory will be automatically reclaimed by the system. Under + * memory debugging, it's a huge source of useless noise, so we + * trade off slower shutdown for less distraction in the memory + * reports. -baw + */ + _Py_ReleaseInternedUnicodeStrings(); +#endif /* __INSURE__ */ } -static _PyInitError -pymain_init(_PyArgv *args, PyInterpreterState **interp_p) +static int +exit_sigint(void) { - _PyInitError err; - - /* 754 requires that FP exceptions run in "no stop" mode by default, - * and until C vendors implement C99's ways to control FP exceptions, - * Python requires non-stop mode. Alas, some platforms enable FP - * exceptions by default. Here we disable them. - */ -#ifdef __FreeBSD__ - fedisableexcept(FE_OVERFLOW); -#endif - - _PyCoreConfig local_config = _PyCoreConfig_INIT; - _PyCoreConfig *config = &local_config; - - _PyCoreConfig_GetGlobalConfig(config); - - err = pymain_cmdline(args, config); - if (_Py_INIT_FAILED(err)) { - goto done; - } - - _PyCoreConfig_SetGlobalConfig(config); - - pymain_init_stdio(config); - - PyInterpreterState *interp; - err = _Py_InitializeCore(&interp, config); - if (_Py_INIT_FAILED(err)) { - goto done; - } - *interp_p = interp; - - err = pymain_init_python_main(interp); - if (_Py_INIT_FAILED(err)) { - goto done; + /* bpo-1054041: We need to exit via the + * SIG_DFL handler for SIGINT if KeyboardInterrupt went unhandled. + * If we don't, a calling process such as a shell may not know + * about the user's ^C. https://www.cons.org/cracauer/sigint.html */ +#if defined(HAVE_GETPID) && !defined(MS_WINDOWS) + if (PyOS_setsig(SIGINT, SIG_DFL) == SIG_ERR) { + perror("signal"); /* Impossible in normal environments. */ + } else { + kill(getpid(), SIGINT); } - - err = _Py_INIT_OK(); - -done: - pymain_clear_config(config); - return err; + /* If setting SIG_DFL failed, or kill failed to terminate us, + * there isn't much else we can do aside from an error code. */ +#endif /* HAVE_GETPID && !MS_WINDOWS */ +#ifdef MS_WINDOWS + /* cmd.exe detects this, prints ^C, and offers to terminate. */ + /* https://msdn.microsoft.com/en-us/library/cc704588.aspx */ + return STATUS_CONTROL_C_EXIT; +#else + return SIGINT + 128; +#endif /* !MS_WINDOWS */ } @@ -1772,26 +907,7 @@ pymain_main(_PyArgv *args) pymain_free(); if (_Py_UnhandledKeyboardInterrupt) { - /* https://bugs.python.org/issue1054041 - We need to exit via the - * SIG_DFL handler for SIGINT if KeyboardInterrupt went unhandled. - * If we don't, a calling process such as a shell may not know - * about the user's ^C. https://www.cons.org/cracauer/sigint.html */ -#if defined(HAVE_GETPID) && !defined(MS_WINDOWS) - if (PyOS_setsig(SIGINT, SIG_DFL) == SIG_ERR) { - perror("signal"); /* Impossible in normal environments. */ - } else { - kill(getpid(), SIGINT); - } - /* If setting SIG_DFL failed, or kill failed to terminate us, - * there isn't much else we can do aside from an error code. */ -#endif /* HAVE_GETPID && !MS_WINDOWS */ -#ifdef MS_WINDOWS - /* cmd.exe detects this, prints ^C, and offers to terminate. */ - /* https://msdn.microsoft.com/en-us/library/cc704588.aspx */ - exitcode = STATUS_CONTROL_C_EXIT; -#else - exitcode = SIGINT + 128; -#endif /* !MS_WINDOWS */ + exitcode = exit_sigint(); } return exitcode; @@ -1821,21 +937,6 @@ _Py_UnixMain(int argc, char **argv) return pymain_main(&args); } - -/* this is gonna seem *real weird*, but if you put some other code between - Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the - while statement in Misc/gdbinit:ppystack */ - -/* Make the *original* argc/argv available to other modules. - This is rare, but it is needed by the secureware extension. */ - -void -Py_GetArgcArgv(int *argc, wchar_t ***argv) -{ - *argc = orig_argc; - *argv = orig_argv; -} - #ifdef __cplusplus } #endif diff --git a/Python/coreconfig.c b/Python/coreconfig.c index d9b30130c931..47dbe66d3eba 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -1,35 +1,116 @@ #include "Python.h" +#include "osdefs.h" /* DELIM */ #include "pycore_coreconfig.h" #include "pycore_fileutils.h" +#include "pycore_getopt.h" #include "pycore_pylifecycle.h" #include "pycore_pymem.h" #include "pycore_pathconfig.h" -#include "pycore_pystate.h" -#include +#include /* setlocale() */ #ifdef HAVE_LANGINFO_H -# include +# include /* nl_langinfo(CODESET) */ #endif - -#include /* setlocale() */ -#ifdef HAVE_LANGINFO_H -#include /* nl_langinfo(CODESET) */ +#if defined(MS_WINDOWS) || defined(__CYGWIN__) +# include /* GetACP() */ +# ifdef HAVE_IO_H +# include +# endif +# ifdef HAVE_FCNTL_H +# include /* O_BINARY */ +# endif #endif -#define DECODE_LOCALE_ERR(NAME, LEN) \ - (((LEN) == -2) \ - ? _Py_INIT_USER_ERR("cannot decode " NAME) \ - : _Py_INIT_NO_MEMORY()) +/* --- Command line options --------------------------------------- */ + +#define PROGRAM_OPTS L"bBc:dEhiIJm:OqRsStuvVW:xX:?" + +static const _PyOS_LongOption longoptions[] = { + {L"check-hash-based-pycs", 1, 0}, + {NULL, 0, 0}, +}; + +/* Short usage message (with %s for argv0) */ +static const char usage_line[] = +"usage: %ls [option] ... [-c cmd | -m mod | file | -] [arg] ...\n"; + +/* Long usage message, split into parts < 512 bytes */ +static const char usage_1[] = "\ +Options and arguments (and corresponding environment variables):\n\ +-b : issue warnings about str(bytes_instance), str(bytearray_instance)\n\ + and comparing bytes/bytearray with str. (-bb: issue errors)\n\ +-B : don't write .pyc files on import; also PYTHONDONTWRITEBYTECODE=x\n\ +-c cmd : program passed in as string (terminates option list)\n\ +-d : debug output from parser; also PYTHONDEBUG=x\n\ +-E : ignore PYTHON* environment variables (such as PYTHONPATH)\n\ +-h : print this help message and exit (also --help)\n\ +"; +static const char usage_2[] = "\ +-i : inspect interactively after running script; forces a prompt even\n\ + if stdin does not appear to be a terminal; also PYTHONINSPECT=x\n\ +-I : isolate Python from the user's environment (implies -E and -s)\n\ +-m mod : run library module as a script (terminates option list)\n\ +-O : remove assert and __debug__-dependent statements; add .opt-1 before\n\ + .pyc extension; also PYTHONOPTIMIZE=x\n\ +-OO : do -O changes and also discard docstrings; add .opt-2 before\n\ + .pyc extension\n\ +-q : don't print version and copyright messages on interactive startup\n\ +-s : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\ +-S : don't imply 'import site' on initialization\n\ +"; +static const char usage_3[] = "\ +-u : force the stdout and stderr streams to be unbuffered;\n\ + this option has no effect on stdin; also PYTHONUNBUFFERED=x\n\ +-v : verbose (trace import statements); also PYTHONVERBOSE=x\n\ + can be supplied multiple times to increase verbosity\n\ +-V : print the Python version number and exit (also --version)\n\ + when given twice, print more information about the build\n\ +-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\ +--check-hash-based-pycs always|default|never:\n\ + control how Python invalidates hash-based .pyc files\n\ +"; +static const char usage_4[] = "\ +file : program read from script file\n\ +- : program read from stdin (default; interactive mode if a tty)\n\ +arg ...: arguments passed to program in sys.argv[1:]\n\n\ +Other environment variables:\n\ +PYTHONSTARTUP: file executed on interactive startup (no default)\n\ +PYTHONPATH : '%lc'-separated list of directories prefixed to the\n\ + default module search path. The result is sys.path.\n\ +"; +static const char usage_5[] = +"PYTHONHOME : alternate directory (or %lc).\n" +" The default module search path uses %s.\n" +"PYTHONCASEOK : ignore case in 'import' statements (Windows).\n" +"PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n" +"PYTHONFAULTHANDLER: dump the Python traceback on fatal errors.\n"; +static const char usage_6[] = +"PYTHONHASHSEED: if this variable is set to 'random', a random value is used\n" +" to seed the hashes of str, bytes and datetime objects. It can also be\n" +" set to an integer in the range [0,4294967295] to get hash values with a\n" +" predictable seed.\n" +"PYTHONMALLOC: set the Python memory allocators and/or install debug hooks\n" +" on Python memory allocators. Use PYTHONMALLOC=debug to install debug\n" +" hooks.\n" +"PYTHONCOERCECLOCALE: if this variable is set to 0, it disables the locale\n" +" coercion behavior. Use PYTHONCOERCECLOCALE=warn to request display of\n" +" locale coercion and locale compatibility warnings on stderr.\n" +"PYTHONBREAKPOINT: if this variable is set to 0, it disables the default\n" +" debugger. It can be set to the callable of your debugger of choice.\n" +"PYTHONDEVMODE: enable the development mode.\n" +"PYTHONPYCACHEPREFIX: root directory for bytecode cache (pyc) files.\n"; + +#if defined(MS_WINDOWS) +# define PYTHONHOMEHELP "\\python{major}{minor}" +#else +# define PYTHONHOMEHELP "/lib/pythonX.X" +#endif -/* Global configuration variables */ - -/* The filesystem encoding is chosen by config_init_fs_encoding(), - see also initfsencoding(). */ -const char *Py_FileSystemDefaultEncoding = NULL; -int Py_HasFileSystemDefaultEncoding = 0; -const char *Py_FileSystemDefaultEncodeErrors = NULL; -static int _Py_HasFileSystemDefaultEncodeErrors = 0; +/* --- Global configuration variables ----------------------------- */ /* UTF-8 mode (PEP 540): if equals to 1, use the UTF-8 encoding, and change stdin and stdout error handler to "surrogateescape". It is equal to @@ -55,6 +136,13 @@ int Py_LegacyWindowsFSEncodingFlag = 0; /* Uses mbcs instead of utf-8 */ int Py_LegacyWindowsStdioFlag = 0; /* Uses FileIO instead of WindowsConsoleIO */ #endif +/* The filesystem encoding is chosen by config_init_fs_encoding(), + see also initfsencoding(). */ +const char *Py_FileSystemDefaultEncoding = NULL; +int Py_HasFileSystemDefaultEncoding = 0; +const char *Py_FileSystemDefaultEncodeErrors = NULL; +static int _Py_HasFileSystemDefaultEncodeErrors = 0; + PyObject * _Py_GetGlobalVariablesAsDict(void) @@ -128,6 +216,8 @@ _Py_GetGlobalVariablesAsDict(void) } +/* --- _Py_wstrlist ----------------------------------------------- */ + void _Py_wstrlist_clear(int len, wchar_t **list) { @@ -139,7 +229,7 @@ _Py_wstrlist_clear(int len, wchar_t **list) wchar_t** -_Py_wstrlist_copy(int len, wchar_t **list) +_Py_wstrlist_copy(int len, wchar_t * const *list) { assert((len > 0 && list != NULL) || len == 0); size_t size = len * sizeof(list[0]); @@ -159,6 +249,53 @@ _Py_wstrlist_copy(int len, wchar_t **list) } +_PyInitError +_Py_wstrlist_append(int *len, wchar_t ***list, const wchar_t *str) +{ + if (*len == INT_MAX) { + /* len+1 would overflow */ + return _Py_INIT_NO_MEMORY(); + } + wchar_t *str2 = _PyMem_RawWcsdup(str); + if (str2 == NULL) { + return _Py_INIT_NO_MEMORY(); + } + + size_t size = (*len + 1) * sizeof(list[0]); + wchar_t **list2 = (wchar_t **)PyMem_RawRealloc(*list, size); + if (list2 == NULL) { + PyMem_RawFree(str2); + return _Py_INIT_NO_MEMORY(); + } + list2[*len] = str2; + *list = list2; + (*len)++; + return _Py_INIT_OK(); +} + + +PyObject* +_Py_wstrlist_as_pylist(int len, wchar_t **list) +{ + assert(list != NULL || len < 1); + + PyObject *pylist = PyList_New(len); + if (pylist == NULL) { + return NULL; + } + + for (int i = 0; i < len; i++) { + PyObject *v = PyUnicode_FromWideChar(list[i], -1); + if (v == NULL) { + Py_DECREF(pylist); + return NULL; + } + PyList_SET_ITEM(pylist, i, v); + } + return pylist; +} + + void _Py_ClearFileSystemEncoding(void) { @@ -173,6 +310,8 @@ _Py_ClearFileSystemEncoding(void) } +/* --- File system encoding/errors -------------------------------- */ + /* Set Py_FileSystemDefaultEncoding and Py_FileSystemDefaultEncodeErrors global configuration variables. */ int @@ -200,6 +339,8 @@ _Py_SetFileSystemEncoding(const char *encoding, const char *errors) } +/* --- Py_SetStandardStreamEncoding() ----------------------------- */ + /* Helper to allow an embedding application to override the normal * mechanism that attempts to figure out an appropriate IO encoding */ @@ -282,6 +423,68 @@ _Py_ClearStandardStreamEncoding(void) } +/* --- Py_GetArgcArgv() ------------------------------------------- */ + +/* For Py_GetArgcArgv(); set by _Py_SetArgcArgv() */ +static int orig_argc = 0; +static wchar_t **orig_argv = NULL; + + +void +_Py_ClearArgcArgv(void) +{ + PyMemAllocatorEx old_alloc; + _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); + + _Py_wstrlist_clear(orig_argc, orig_argv); + orig_argc = 0; + orig_argv = NULL; + + PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); +} + + +int +_Py_SetArgcArgv(int argc, wchar_t * const *argv) +{ + int res; + + PyMemAllocatorEx old_alloc; + _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); + + wchar_t **argv_copy = _Py_wstrlist_copy(argc, argv); + if (argv_copy != NULL) { + _Py_ClearArgcArgv(); + orig_argc = argc; + orig_argv = argv_copy; + res = 0; + } + else { + res = -1; + } + + PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); + return res; +} + + +/* Make the *original* argc/argv available to other modules. + This is rare, but it is needed by the secureware extension. */ +void +Py_GetArgcArgv(int *argc, wchar_t ***argv) +{ + *argc = orig_argc; + *argv = orig_argv; +} + + +/* --- _PyCoreConfig ---------------------------------------------- */ + +#define DECODE_LOCALE_ERR(NAME, LEN) \ + (((LEN) == -2) \ + ? _Py_INIT_USER_ERR("cannot decode " NAME) \ + : _Py_INIT_NO_MEMORY()) + /* Free memory allocated in config, but don't clear all attributes */ void _PyCoreConfig_Clear(_PyCoreConfig *config) @@ -1469,6 +1672,60 @@ _PyCoreConfig_Read(_PyCoreConfig *config) } +static void +config_init_stdio(const _PyCoreConfig *config) +{ +#if defined(MS_WINDOWS) || defined(__CYGWIN__) + /* don't translate newlines (\r\n <=> \n) */ + _setmode(fileno(stdin), O_BINARY); + _setmode(fileno(stdout), O_BINARY); + _setmode(fileno(stderr), O_BINARY); +#endif + + if (!config->buffered_stdio) { +#ifdef HAVE_SETVBUF + setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ); + setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ); + setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ); +#else /* !HAVE_SETVBUF */ + setbuf(stdin, (char *)NULL); + setbuf(stdout, (char *)NULL); + setbuf(stderr, (char *)NULL); +#endif /* !HAVE_SETVBUF */ + } + else if (config->interactive) { +#ifdef MS_WINDOWS + /* Doesn't have to have line-buffered -- use unbuffered */ + /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */ + setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ); +#else /* !MS_WINDOWS */ +#ifdef HAVE_SETVBUF + setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ); + setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ); +#endif /* HAVE_SETVBUF */ +#endif /* !MS_WINDOWS */ + /* Leave stderr alone - it should be unbuffered anyway. */ + } +} + + +/* Write the configuration: + + - coerce the LC_CTYPE locale (PEP 538) + - UTF-8 mode (PEP 540) + - set Py_xxx global configuration variables + - initialize C standard streams (stdin, stdout, stderr) */ +void +_PyCoreConfig_Write(const _PyCoreConfig *config) +{ + if (config->coerce_c_locale) { + _Py_CoerceLegacyLocale(config->coerce_c_locale_warn); + } + _PyCoreConfig_SetGlobalConfig(config); + config_init_stdio(config); +} + + PyObject * _PyCoreConfig_AsDict(const _PyCoreConfig *config) { @@ -1586,3 +1843,681 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) #undef SET_ITEM_WSTR #undef SET_ITEM_WSTRLIST } + + +/* --- _PyCmdline ------------------------------------------------- */ + +typedef struct { + const _PyArgv *args; + wchar_t **argv; + int nwarnoption; /* Number of -W command line options */ + wchar_t **warnoptions; /* Command line -W options */ + int nenv_warnoption; /* Number of PYTHONWARNINGS environment variables */ + wchar_t **env_warnoptions; /* PYTHONWARNINGS environment variables */ + int print_help; /* -h, -? options */ + int print_version; /* -V option */ +} _PyCmdline; + + +static void +cmdline_clear(_PyCmdline *cmdline) +{ + _Py_wstrlist_clear(cmdline->nwarnoption, cmdline->warnoptions); + cmdline->nwarnoption = 0; + cmdline->warnoptions = NULL; + + _Py_wstrlist_clear(cmdline->nenv_warnoption, cmdline->env_warnoptions); + cmdline->nenv_warnoption = 0; + cmdline->env_warnoptions = NULL; + + if (cmdline->args->use_bytes_argv && cmdline->argv != NULL) { + _Py_wstrlist_clear(cmdline->args->argc, cmdline->argv); + } + cmdline->argv = NULL; +} + + +static _PyInitError +cmdline_decode_argv(_PyCmdline *cmdline) +{ + assert(cmdline->argv == NULL); + + const _PyArgv *args = cmdline->args; + + if (args->use_bytes_argv) { + /* +1 for a the NULL terminator */ + size_t size = sizeof(wchar_t*) * (args->argc + 1); + wchar_t** argv = (wchar_t **)PyMem_RawMalloc(size); + if (argv == NULL) { + return _Py_INIT_NO_MEMORY(); + } + + for (int i = 0; i < args->argc; i++) { + size_t len; + wchar_t *arg = Py_DecodeLocale(args->bytes_argv[i], &len); + if (arg == NULL) { + _Py_wstrlist_clear(i, argv); + return DECODE_LOCALE_ERR("command line arguments", + (Py_ssize_t)len); + } + argv[i] = arg; + } + argv[args->argc] = NULL; + + cmdline->argv = argv; + } + else { + cmdline->argv = args->wchar_argv; + } + return _Py_INIT_OK(); +} + + +/* --- _PyCoreConfig command line parser -------------------------- */ + +/* Parse the command line arguments */ +static _PyInitError +config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, + int *need_usage) +{ + _PyInitError err; + _PyOS_ResetGetOpt(); + do { + int longindex = -1; + int c = _PyOS_GetOpt(cmdline->args->argc, cmdline->argv, PROGRAM_OPTS, + longoptions, &longindex); + if (c == EOF) { + break; + } + + if (c == 'c') { + /* -c is the last option; following arguments + that look like options are left for the + command to interpret. */ + size_t len = wcslen(_PyOS_optarg) + 1 + 1; + wchar_t *command = PyMem_RawMalloc(sizeof(wchar_t) * len); + if (command == NULL) { + return _Py_INIT_NO_MEMORY(); + } + memcpy(command, _PyOS_optarg, (len - 2) * sizeof(wchar_t)); + command[len - 2] = '\n'; + command[len - 1] = 0; + config->run_command = command; + break; + } + + if (c == 'm') { + /* -m is the last option; following arguments + that look like options are left for the + module to interpret. */ + config->run_module = _PyMem_RawWcsdup(_PyOS_optarg); + if (config->run_module == NULL) { + return _Py_INIT_NO_MEMORY(); + } + break; + } + + switch (c) { + case 0: + // Handle long option. + assert(longindex == 0); // Only one long option now. + if (!wcscmp(_PyOS_optarg, L"always")) { + config->_check_hash_pycs_mode = "always"; + } else if (!wcscmp(_PyOS_optarg, L"never")) { + config->_check_hash_pycs_mode = "never"; + } else if (!wcscmp(_PyOS_optarg, L"default")) { + config->_check_hash_pycs_mode = "default"; + } else { + fprintf(stderr, "--check-hash-based-pycs must be one of " + "'default', 'always', or 'never'\n"); + *need_usage = 1; + return _Py_INIT_OK(); + } + break; + + case 'b': + config->bytes_warning++; + break; + + case 'd': + config->parser_debug++; + break; + + case 'i': + config->inspect++; + config->interactive++; + break; + + case 'I': + config->isolated++; + break; + + /* case 'J': reserved for Jython */ + + case 'O': + config->optimization_level++; + break; + + case 'B': + config->write_bytecode = 0; + break; + + case 's': + config->user_site_directory = 0; + break; + + case 'S': + config->site_import = 0; + break; + + case 'E': + config->use_environment = 0; + break; + + case 't': + /* ignored for backwards compatibility */ + break; + + case 'u': + config->buffered_stdio = 0; + break; + + case 'v': + config->verbose++; + break; + + case 'x': + config->skip_source_first_line = 1; + break; + + case 'h': + case '?': + cmdline->print_help++; + break; + + case 'V': + cmdline->print_version++; + break; + + case 'W': + err = _Py_wstrlist_append(&cmdline->nwarnoption, + &cmdline->warnoptions, + _PyOS_optarg); + if (_Py_INIT_FAILED(err)) { + return err; + } + break; + + case 'X': + err = _Py_wstrlist_append(&config->nxoption, + &config->xoptions, + _PyOS_optarg); + if (_Py_INIT_FAILED(err)) { + return err; + } + break; + + case 'q': + config->quiet++; + break; + + case 'R': + config->use_hash_seed = 0; + break; + + /* This space reserved for other options */ + + default: + /* unknown argument: parsing failed */ + *need_usage = 1; + return _Py_INIT_OK(); + } + } while (1); + + if (config->run_command == NULL && config->run_module == NULL + && _PyOS_optind < cmdline->args->argc + && wcscmp(cmdline->argv[_PyOS_optind], L"-") != 0) + { + config->run_filename = _PyMem_RawWcsdup(cmdline->argv[_PyOS_optind]); + if (config->run_filename == NULL) { + return _Py_INIT_NO_MEMORY(); + } + } + + if (config->run_command != NULL || config->run_module != NULL) { + /* Backup _PyOS_optind */ + _PyOS_optind--; + } + + /* -c and -m options are exclusive */ + assert(!(config->run_command != NULL && config->run_module != NULL)); + + return _Py_INIT_OK(); +} + + +#ifdef MS_WINDOWS +# define WCSTOK wcstok_s +#else +# define WCSTOK wcstok +#endif + +/* Get warning options from PYTHONWARNINGS environment variable. */ +static _PyInitError +cmdline_init_env_warnoptions(_PyCmdline *cmdline, const _PyCoreConfig *config) +{ + wchar_t *env; + int res = _PyCoreConfig_GetEnvDup(config, &env, + L"PYTHONWARNINGS", "PYTHONWARNINGS"); + if (res < 0) { + return DECODE_LOCALE_ERR("PYTHONWARNINGS", res); + } + + if (env == NULL) { + return _Py_INIT_OK(); + } + + + wchar_t *warning, *context = NULL; + for (warning = WCSTOK(env, L",", &context); + warning != NULL; + warning = WCSTOK(NULL, L",", &context)) + { + _PyInitError err = _Py_wstrlist_append(&cmdline->nenv_warnoption, + &cmdline->env_warnoptions, + warning); + if (_Py_INIT_FAILED(err)) { + PyMem_RawFree(env); + return err; + } + } + PyMem_RawFree(env); + return _Py_INIT_OK(); +} + + +static _PyInitError +config_init_program(_PyCoreConfig *config, const _PyCmdline *cmdline) +{ + wchar_t *program; + if (cmdline->args->argc >= 1 && cmdline->argv != NULL) { + program = cmdline->argv[0]; + } + else { + program = L""; + } + config->program = _PyMem_RawWcsdup(program); + if (config->program == NULL) { + return _Py_INIT_NO_MEMORY(); + } + + return _Py_INIT_OK(); +} + + +static _PyInitError +config_add_warnings_optlist(_PyCoreConfig *config, + int len, wchar_t * const *options) +{ + for (int i = 0; i < len; i++) { + _PyInitError err = _Py_wstrlist_append(&config->nwarnoption, + &config->warnoptions, + options[i]); + if (_Py_INIT_FAILED(err)) { + return err; + } + } + return _Py_INIT_OK(); +} + + +static _PyInitError +config_init_warnoptions(_PyCoreConfig *config, const _PyCmdline *cmdline) +{ + _PyInitError err; + + assert(config->nwarnoption == 0); + + /* The priority order for warnings configuration is (highest precedence + * first): + * + * - the BytesWarning filter, if needed ('-b', '-bb') + * - any '-W' command line options; then + * - the 'PYTHONWARNINGS' environment variable; then + * - the dev mode filter ('-X dev', 'PYTHONDEVMODE'); then + * - any implicit filters added by _warnings.c/warnings.py + * + * All settings except the last are passed to the warnings module via + * the `sys.warnoptions` list. Since the warnings module works on the basis + * of "the most recently added filter will be checked first", we add + * the lowest precedence entries first so that later entries override them. + */ + + if (config->dev_mode) { + err = _Py_wstrlist_append(&config->nwarnoption, + &config->warnoptions, + L"default"); + if (_Py_INIT_FAILED(err)) { + return err; + } + } + + err = config_add_warnings_optlist(config, + cmdline->nenv_warnoption, + cmdline->env_warnoptions); + if (_Py_INIT_FAILED(err)) { + return err; + } + + err = config_add_warnings_optlist(config, + cmdline->nwarnoption, + cmdline->warnoptions); + if (_Py_INIT_FAILED(err)) { + return err; + } + + /* If the bytes_warning_flag isn't set, bytesobject.c and bytearrayobject.c + * don't even try to emit a warning, so we skip setting the filter in that + * case. + */ + if (config->bytes_warning) { + wchar_t *filter; + if (config->bytes_warning> 1) { + filter = L"error::BytesWarning"; + } + else { + filter = L"default::BytesWarning"; + } + err = _Py_wstrlist_append(&config->nwarnoption, + &config->warnoptions, + filter); + if (_Py_INIT_FAILED(err)) { + return err; + } + } + return _Py_INIT_OK(); +} + + +static _PyInitError +config_init_argv(_PyCoreConfig *config, const _PyCmdline *cmdline) +{ + /* Copy argv to be able to modify it (to force -c/-m) */ + int argc = cmdline->args->argc - _PyOS_optind; + wchar_t **argv; + + if (argc <= 0 || cmdline->argv == NULL) { + /* Ensure at least one (empty) argument is seen */ + static wchar_t *empty_argv[1] = {L""}; + argc = 1; + argv = _Py_wstrlist_copy(1, empty_argv); + } + else { + argv = _Py_wstrlist_copy(argc, &cmdline->argv[_PyOS_optind]); + } + + if (argv == NULL) { + return _Py_INIT_NO_MEMORY(); + } + + wchar_t *arg0 = NULL; + if (config->run_command != NULL) { + /* Force sys.argv[0] = '-c' */ + arg0 = L"-c"; + } + else if (config->run_module != NULL) { + /* Force sys.argv[0] = '-m'*/ + arg0 = L"-m"; + } + if (arg0 != NULL) { + arg0 = _PyMem_RawWcsdup(arg0); + if (arg0 == NULL) { + _Py_wstrlist_clear(argc, argv); + return _Py_INIT_NO_MEMORY(); + } + + assert(argc >= 1); + PyMem_RawFree(argv[0]); + argv[0] = arg0; + } + + config->argc = argc; + config->argv = argv; + return _Py_INIT_OK(); +} + + +static void +config_usage(int error, const wchar_t* program) +{ + FILE *f = error ? stderr : stdout; + + fprintf(f, usage_line, program); + if (error) + fprintf(f, "Try `python -h' for more information.\n"); + else { + fputs(usage_1, f); + fputs(usage_2, f); + fputs(usage_3, f); + fprintf(f, usage_4, (wint_t)DELIM); + fprintf(f, usage_5, (wint_t)DELIM, PYTHONHOMEHELP); + fputs(usage_6, f); + } +} + + +/* Parse command line options and environment variables. */ +static _PyInitError +config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline) +{ + int need_usage = 0; + _PyInitError err; + + err = config_init_program(config, cmdline); + if (_Py_INIT_FAILED(err)) { + return err; + } + + err = config_parse_cmdline(config, cmdline, &need_usage); + if (_Py_INIT_FAILED(err)) { + return err; + } + + if (need_usage) { + config_usage(1, config->program); + return _Py_INIT_EXIT(2); + } + + if (cmdline->print_help) { + config_usage(0, config->program); + return _Py_INIT_EXIT(0); + } + + if (cmdline->print_version) { + printf("Python %s\n", + (cmdline->print_version >= 2) ? Py_GetVersion() : PY_VERSION); + return _Py_INIT_EXIT(0); + } + + err = config_init_argv(config, cmdline); + if (_Py_INIT_FAILED(err)) { + return err; + } + + err = _PyCoreConfig_Read(config); + if (_Py_INIT_FAILED(err)) { + return err; + } + + if (config->use_environment) { + err = cmdline_init_env_warnoptions(cmdline, config); + if (_Py_INIT_FAILED(err)) { + return err; + } + } + + err = config_init_warnoptions(config, cmdline); + if (_Py_INIT_FAILED(err)) { + return err; + } + + if (_Py_SetArgcArgv(cmdline->args->argc, cmdline->argv) < 0) { + return _Py_INIT_NO_MEMORY(); + } + return _Py_INIT_OK(); +} + + +static _PyInitError +config_read_from_argv_impl(_PyCoreConfig *config, const _PyArgv *args) +{ + _PyInitError err; + + _PyCmdline cmdline; + memset(&cmdline, 0, sizeof(cmdline)); + cmdline.args = args; + + err = cmdline_decode_argv(&cmdline); + if (_Py_INIT_FAILED(err)) { + goto done; + } + + err = config_from_cmdline(config, &cmdline); + if (_Py_INIT_FAILED(err)) { + goto done; + } + err = _Py_INIT_OK(); + +done: + cmdline_clear(&cmdline); + return err; +} + + +/* Read the configuration into _PyCoreConfig and initialize the LC_CTYPE + locale: enable UTF-8 mode (PEP 540) and/or coerce the C locale (PEP 538). + + Read the configuration from: + + * Command line arguments + * Environment variables + * Py_xxx global configuration variables */ +_PyInitError +_PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, const _PyArgv *args) +{ + _PyInitError err; + int init_utf8_mode = Py_UTF8Mode; +#ifdef MS_WINDOWS + int init_legacy_encoding = Py_LegacyWindowsFSEncodingFlag; +#endif + _PyCoreConfig save_config = _PyCoreConfig_INIT; + int locale_coerced = 0; + int loops = 0; + char *init_ctype_locale = NULL; + + /* copy LC_CTYPE locale */ + const char *loc = setlocale(LC_CTYPE, NULL); + if (loc == NULL) { + err = _Py_INIT_ERR("failed to LC_CTYPE locale"); + goto done; + } + init_ctype_locale = _PyMem_RawStrdup(loc); + if (init_ctype_locale == NULL) { + err = _Py_INIT_NO_MEMORY(); + goto done; + } + + if (_PyCoreConfig_Copy(&save_config, config) < 0) { + err = _Py_INIT_NO_MEMORY(); + goto done; + } + + /* Set LC_CTYPE to the user preferred locale */ + _Py_SetLocaleFromEnv(LC_CTYPE); + + while (1) { + int utf8_mode = config->utf8_mode; + int encoding_changed = 0; + + /* Watchdog to prevent an infinite loop */ + loops++; + if (loops == 3) { + err = _Py_INIT_ERR("Encoding changed twice while " + "reading the configuration"); + goto done; + } + + /* bpo-34207: Py_DecodeLocale() and Py_EncodeLocale() depend + on Py_UTF8Mode and Py_LegacyWindowsFSEncodingFlag. */ + Py_UTF8Mode = config->utf8_mode; +#ifdef MS_WINDOWS + Py_LegacyWindowsFSEncodingFlag = config->legacy_windows_fs_encoding; +#endif + + err = config_read_from_argv_impl(config, args); + if (_Py_INIT_FAILED(err)) { + goto done; + } + if (locale_coerced) { + config->coerce_c_locale = 1; + } + + /* The legacy C locale assumes ASCII as the default text encoding, which + * causes problems not only for the CPython runtime, but also other + * components like GNU readline. + * + * Accordingly, when the CLI detects it, it attempts to coerce it to a + * more capable UTF-8 based alternative. + * + * See the documentation of the PYTHONCOERCECLOCALE setting for more + * details. + */ + if (config->coerce_c_locale && !locale_coerced) { + locale_coerced = 1; + _Py_CoerceLegacyLocale(0); + encoding_changed = 1; + } + + if (utf8_mode == -1) { + if (config->utf8_mode == 1) { + /* UTF-8 Mode enabled */ + encoding_changed = 1; + } + } + else { + if (config->utf8_mode != utf8_mode) { + encoding_changed = 1; + } + } + + if (!encoding_changed) { + break; + } + + /* Reset the configuration before reading again the configuration, + just keep UTF-8 Mode value. */ + int new_utf8_mode = config->utf8_mode; + int new_coerce_c_locale = config->coerce_c_locale; + if (_PyCoreConfig_Copy(config, &save_config) < 0) { + err = _Py_INIT_NO_MEMORY(); + goto done; + } + config->utf8_mode = new_utf8_mode; + config->coerce_c_locale = new_coerce_c_locale; + + /* The encoding changed: read again the configuration + with the new encoding */ + } + err = _Py_INIT_OK(); + +done: + if (init_ctype_locale != NULL) { + setlocale(LC_CTYPE, init_ctype_locale); + } + _PyCoreConfig_Clear(&save_config); + Py_UTF8Mode = init_utf8_mode ; +#ifdef MS_WINDOWS + Py_LegacyWindowsFSEncodingFlag = init_legacy_encoding; +#endif + return err; +} From webhook-mailer at python.org Fri Mar 1 10:43:32 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 01 Mar 2019 15:43:32 -0000 Subject: [Python-checkins] bpo-36146: Split setup.py into subfunctions (GH-12125) Message-ID: https://github.com/python/cpython/commit/5ec33a1c25a586552751ca35c85ab7ecb6b06ec3 commit: 5ec33a1c25a586552751ca35c85ab7ecb6b06ec3 branch: master author: Victor Stinner committer: GitHub date: 2019-03-01T16:43:28+01:00 summary: bpo-36146: Split setup.py into subfunctions (GH-12125) * Split PyBuildExt.detect_modules() huge function into subfunctions. * Move curses, hashlib and some other code to reorganize the code. * detect_tkinter() now returns False if the extension is missing. * Add PyBuildExt.config_h_vars attribute files: M setup.py diff --git a/setup.py b/setup.py index 9001f62cd33e..1bcfaa222113 100644 --- a/setup.py +++ b/setup.py @@ -234,6 +234,7 @@ def __init__(self, dist): self.srcdir = None self.lib_dirs = None self.inc_dirs = None + self.config_h_vars = None self.failed = [] self.failed_on_import = [] self.missing = [] @@ -558,7 +559,7 @@ def add_cross_compiling_paths(self): finally: os.unlink(tmpfile) - def detect_modules(self): + def add_compiler_directories(self): # Ensure that /usr/local is always used, but the local build # directories (i.e. '.' and 'Include') must be first. See issue # 10520. @@ -589,6 +590,7 @@ def detect_modules(self): for directory in reversed(options.dirs): add_dir_to_list(dir_list, directory) + def init_inc_lib_dirs(self): if (not CROSS_COMPILING and os.path.normpath(sys.base_prefix) != '/usr' and not sysconfig.get_config_var('PYTHONFRAMEWORK')): @@ -621,7 +623,7 @@ def detect_modules(self): config_h = sysconfig.get_config_h_filename() with open(config_h) as file: - config_h_vars = sysconfig.parse_config_h(file) + self.config_h_vars = sysconfig.parse_config_h(file) # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb) if HOST_PLATFORM in ['osf1', 'unixware7', 'openunix8']: @@ -649,6 +651,7 @@ def detect_modules(self): if item.startswith('-L'): self.lib_dirs.append(item[2:]) + def detect_simple_extensions(self): # # The following modules are all pretty straightforward, and compile # on pretty much any POSIXish platform. @@ -728,7 +731,7 @@ def detect_modules(self): # fcntl(2) and ioctl(2) libs = [] - if (config_h_vars.get('FLOCK_NEEDS_LIBBSD', False)): + if (self.config_h_vars.get('FLOCK_NEEDS_LIBBSD', False)): # May be necessary on AIX for flock function libs = ['bsd'] self.add(Extension('fcntl', ['fcntlmodule.c'], @@ -739,8 +742,8 @@ def detect_modules(self): if not VXWORKS: self.add(Extension('grp', ['grpmodule.c'])) # spwd, shadow passwords - if (config_h_vars.get('HAVE_GETSPNAM', False) or - config_h_vars.get('HAVE_GETSPENT', False)): + if (self.config_h_vars.get('HAVE_GETSPNAM', False) or + self.config_h_vars.get('HAVE_GETSPENT', False)): self.add(Extension('spwd', ['spwdmodule.c'])) else: self.missing.append('spwd') @@ -785,6 +788,13 @@ def detect_modules(self): self.add(Extension('audioop', ['audioop.c'], libraries=['m'])) + # CSV files + self.add(Extension('_csv', ['_csv.c'])) + + # POSIX subprocess module helper. + self.add(Extension('_posixsubprocess', ['_posixsubprocess.c'])) + + def detect_readline_curses(self): # readline do_readline = self.compiler.find_library_file(self.lib_dirs, 'readline') readline_termcap_library = "" @@ -868,8 +878,65 @@ def detect_modules(self): else: self.missing.append('readline') - # crypt module. + # Curses support, requiring the System V version of curses, often + # provided by the ncurses library. + curses_defines = [] + curses_includes = [] + panel_library = 'panel' + if curses_library == 'ncursesw': + curses_defines.append(('HAVE_NCURSESW', '1')) + if not CROSS_COMPILING: + curses_includes.append('/usr/include/ncursesw') + # Bug 1464056: If _curses.so links with ncursesw, + # _curses_panel.so must link with panelw. + panel_library = 'panelw' + if MACOS: + # On OS X, there is no separate /usr/lib/libncursesw nor + # libpanelw. If we are here, we found a locally-supplied + # version of libncursesw. There should also be a + # libpanelw. _XOPEN_SOURCE defines are usually excluded + # for OS X but we need _XOPEN_SOURCE_EXTENDED here for + # ncurses wide char support + curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1')) + elif MACOS and curses_library == 'ncurses': + # Building with the system-suppied combined libncurses/libpanel + curses_defines.append(('HAVE_NCURSESW', '1')) + curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1')) + + if curses_library.startswith('ncurses'): + curses_libs = [curses_library] + self.add(Extension('_curses', ['_cursesmodule.c'], + include_dirs=curses_includes, + define_macros=curses_defines, + libraries=curses_libs)) + elif curses_library == 'curses' and not MACOS: + # OSX has an old Berkeley curses, not good enough for + # the _curses module. + if (self.compiler.find_library_file(self.lib_dirs, 'terminfo')): + curses_libs = ['curses', 'terminfo'] + elif (self.compiler.find_library_file(self.lib_dirs, 'termcap')): + curses_libs = ['curses', 'termcap'] + else: + curses_libs = ['curses'] + + self.add(Extension('_curses', ['_cursesmodule.c'], + define_macros=curses_defines, + libraries=curses_libs)) + else: + self.missing.append('_curses') + # If the curses module is enabled, check for the panel module + if (module_enabled(self.extensions, '_curses') and + self.compiler.find_library_file(self.lib_dirs, panel_library)): + self.add(Extension('_curses_panel', ['_curses_panel.c'], + include_dirs=curses_includes, + define_macros=curses_defines, + libraries=[panel_library, *curses_libs])) + else: + self.missing.append('_curses_panel') + + def detect_crypt(self): + # crypt module. if self.compiler.find_library_file(self.lib_dirs, 'crypt'): libs = ['crypt'] else: @@ -883,12 +950,7 @@ def detect_modules(self): self.add(Extension('_crypt', ['_cryptmodule.c'], libraries=libs)) - # CSV files - self.add(Extension('_csv', ['_csv.c'])) - - # POSIX subprocess module helper. - self.add(Extension('_posixsubprocess', ['_posixsubprocess.c'])) - + def detect_socket(self): # socket(2) if not VXWORKS: self.add(Extension('_socket', ['socketmodule.c'], @@ -899,38 +961,7 @@ def detect_modules(self): depends=['socketmodule.h'], libraries=libs)) - # Detect SSL support for the socket module (via _ssl) - self._detect_openssl() - - # We always compile these even when OpenSSL is available (issue #14693). - # It's harmless and the object code is tiny (40-50 KiB per module, - # only loaded when actually used). - self.add(Extension('_sha256', ['sha256module.c'], - depends=['hashlib.h'])) - self.add(Extension('_sha512', ['sha512module.c'], - depends=['hashlib.h'])) - self.add(Extension('_md5', ['md5module.c'], - depends=['hashlib.h'])) - self.add(Extension('_sha1', ['sha1module.c'], - depends=['hashlib.h'])) - - blake2_deps = glob(os.path.join(self.srcdir, - 'Modules/_blake2/impl/*')) - blake2_deps.append('hashlib.h') - - self.add(Extension('_blake2', - ['_blake2/blake2module.c', - '_blake2/blake2b_impl.c', - '_blake2/blake2s_impl.c'], - depends=blake2_deps)) - - sha3_deps = glob(os.path.join(self.srcdir, - 'Modules/_sha3/kcp/*')) - sha3_deps.append('hashlib.h') - self.add(Extension('_sha3', - ['_sha3/sha3module.c'], - depends=sha3_deps)) - + def detect_dbm_gdbm(self): # Modules that provide persistent dictionary-like semantics. You will # probably want to arrange for at least one of them to be available on # your machine, though none are defined by default because of library @@ -1138,6 +1169,91 @@ class db_found(Exception): pass dblibs = [] dblib_dir = None + dbm_setup_debug = False # verbose debug prints from this script? + dbm_order = ['gdbm'] + # The standard Unix dbm module: + if not CYGWIN: + config_args = [arg.strip("'") + for arg in sysconfig.get_config_var("CONFIG_ARGS").split()] + dbm_args = [arg for arg in config_args + if arg.startswith('--with-dbmliborder=')] + if dbm_args: + dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":") + else: + dbm_order = "ndbm:gdbm:bdb".split(":") + dbmext = None + for cand in dbm_order: + if cand == "ndbm": + if find_file("ndbm.h", self.inc_dirs, []) is not None: + # Some systems have -lndbm, others have -lgdbm_compat, + # others don't have either + if self.compiler.find_library_file(self.lib_dirs, + 'ndbm'): + ndbm_libs = ['ndbm'] + elif self.compiler.find_library_file(self.lib_dirs, + 'gdbm_compat'): + ndbm_libs = ['gdbm_compat'] + else: + ndbm_libs = [] + if dbm_setup_debug: print("building dbm using ndbm") + dbmext = Extension('_dbm', ['_dbmmodule.c'], + define_macros=[ + ('HAVE_NDBM_H',None), + ], + libraries=ndbm_libs) + break + + elif cand == "gdbm": + if self.compiler.find_library_file(self.lib_dirs, 'gdbm'): + gdbm_libs = ['gdbm'] + if self.compiler.find_library_file(self.lib_dirs, + 'gdbm_compat'): + gdbm_libs.append('gdbm_compat') + if find_file("gdbm/ndbm.h", self.inc_dirs, []) is not None: + if dbm_setup_debug: print("building dbm using gdbm") + dbmext = Extension( + '_dbm', ['_dbmmodule.c'], + define_macros=[ + ('HAVE_GDBM_NDBM_H', None), + ], + libraries = gdbm_libs) + break + if find_file("gdbm-ndbm.h", self.inc_dirs, []) is not None: + if dbm_setup_debug: print("building dbm using gdbm") + dbmext = Extension( + '_dbm', ['_dbmmodule.c'], + define_macros=[ + ('HAVE_GDBM_DASH_NDBM_H', None), + ], + libraries = gdbm_libs) + break + elif cand == "bdb": + if dblibs: + if dbm_setup_debug: print("building dbm using bdb") + dbmext = Extension('_dbm', ['_dbmmodule.c'], + library_dirs=dblib_dir, + runtime_library_dirs=dblib_dir, + include_dirs=db_incs, + define_macros=[ + ('HAVE_BERKDB_H', None), + ('DB_DBM_HSEARCH', None), + ], + libraries=dblibs) + break + if dbmext is not None: + self.add(dbmext) + else: + self.missing.append('_dbm') + + # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm: + if ('gdbm' in dbm_order and + self.compiler.find_library_file(self.lib_dirs, 'gdbm')): + self.add(Extension('_gdbm', ['_gdbmmodule.c'], + libraries=['gdbm'])) + else: + self.missing.append('_gdbm') + + def detect_sqlite(self): # The sqlite interface sqlite_setup_debug = False # verbose debug prints from this script? @@ -1254,90 +1370,7 @@ class db_found(Exception): pass else: self.missing.append('_sqlite3') - dbm_setup_debug = False # verbose debug prints from this script? - dbm_order = ['gdbm'] - # The standard Unix dbm module: - if not CYGWIN: - config_args = [arg.strip("'") - for arg in sysconfig.get_config_var("CONFIG_ARGS").split()] - dbm_args = [arg for arg in config_args - if arg.startswith('--with-dbmliborder=')] - if dbm_args: - dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":") - else: - dbm_order = "ndbm:gdbm:bdb".split(":") - dbmext = None - for cand in dbm_order: - if cand == "ndbm": - if find_file("ndbm.h", self.inc_dirs, []) is not None: - # Some systems have -lndbm, others have -lgdbm_compat, - # others don't have either - if self.compiler.find_library_file(self.lib_dirs, - 'ndbm'): - ndbm_libs = ['ndbm'] - elif self.compiler.find_library_file(self.lib_dirs, - 'gdbm_compat'): - ndbm_libs = ['gdbm_compat'] - else: - ndbm_libs = [] - if dbm_setup_debug: print("building dbm using ndbm") - dbmext = Extension('_dbm', ['_dbmmodule.c'], - define_macros=[ - ('HAVE_NDBM_H',None), - ], - libraries=ndbm_libs) - break - - elif cand == "gdbm": - if self.compiler.find_library_file(self.lib_dirs, 'gdbm'): - gdbm_libs = ['gdbm'] - if self.compiler.find_library_file(self.lib_dirs, - 'gdbm_compat'): - gdbm_libs.append('gdbm_compat') - if find_file("gdbm/ndbm.h", self.inc_dirs, []) is not None: - if dbm_setup_debug: print("building dbm using gdbm") - dbmext = Extension( - '_dbm', ['_dbmmodule.c'], - define_macros=[ - ('HAVE_GDBM_NDBM_H', None), - ], - libraries = gdbm_libs) - break - if find_file("gdbm-ndbm.h", self.inc_dirs, []) is not None: - if dbm_setup_debug: print("building dbm using gdbm") - dbmext = Extension( - '_dbm', ['_dbmmodule.c'], - define_macros=[ - ('HAVE_GDBM_DASH_NDBM_H', None), - ], - libraries = gdbm_libs) - break - elif cand == "bdb": - if dblibs: - if dbm_setup_debug: print("building dbm using bdb") - dbmext = Extension('_dbm', ['_dbmmodule.c'], - library_dirs=dblib_dir, - runtime_library_dirs=dblib_dir, - include_dirs=db_incs, - define_macros=[ - ('HAVE_BERKDB_H', None), - ('DB_DBM_HSEARCH', None), - ], - libraries=dblibs) - break - if dbmext is not None: - self.add(dbmext) - else: - self.missing.append('_dbm') - - # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm: - if ('gdbm' in dbm_order and - self.compiler.find_library_file(self.lib_dirs, 'gdbm')): - self.add(Extension('_gdbm', ['_gdbmmodule.c'], - libraries=['gdbm'])) - else: - self.missing.append('_gdbm') - + def detect_platform_specific_exts(self): # Unix-only modules if not MS_WINDOWS: if not VXWORKS: @@ -1348,65 +1381,19 @@ class db_found(Exception): pass else: self.missing.extend(['resource', 'termios']) - self._detect_nis() - - # Curses support, requiring the System V version of curses, often - # provided by the ncurses library. - curses_defines = [] - curses_includes = [] - panel_library = 'panel' - if curses_library == 'ncursesw': - curses_defines.append(('HAVE_NCURSESW', '1')) - if not CROSS_COMPILING: - curses_includes.append('/usr/include/ncursesw') - # Bug 1464056: If _curses.so links with ncursesw, - # _curses_panel.so must link with panelw. - panel_library = 'panelw' - if MACOS: - # On OS X, there is no separate /usr/lib/libncursesw nor - # libpanelw. If we are here, we found a locally-supplied - # version of libncursesw. There should also be a - # libpanelw. _XOPEN_SOURCE defines are usually excluded - # for OS X but we need _XOPEN_SOURCE_EXTENDED here for - # ncurses wide char support - curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1')) - elif MACOS and curses_library == 'ncurses': - # Building with the system-suppied combined libncurses/libpanel - curses_defines.append(('HAVE_NCURSESW', '1')) - curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1')) - - if curses_library.startswith('ncurses'): - curses_libs = [curses_library] - self.add(Extension('_curses', ['_cursesmodule.c'], - include_dirs=curses_includes, - define_macros=curses_defines, - libraries=curses_libs)) - elif curses_library == 'curses' and not MACOS: - # OSX has an old Berkeley curses, not good enough for - # the _curses module. - if (self.compiler.find_library_file(self.lib_dirs, 'terminfo')): - curses_libs = ['curses', 'terminfo'] - elif (self.compiler.find_library_file(self.lib_dirs, 'termcap')): - curses_libs = ['curses', 'termcap'] - else: - curses_libs = ['curses'] - - self.add(Extension('_curses', ['_cursesmodule.c'], - define_macros=curses_defines, - libraries=curses_libs)) + # Platform-specific libraries + if HOST_PLATFORM.startswith(('linux', 'freebsd', 'gnukfreebsd')): + self.add(Extension('ossaudiodev', ['ossaudiodev.c'])) else: - self.missing.append('_curses') + self.missing.append('ossaudiodev') - # If the curses module is enabled, check for the panel module - if (module_enabled(self.extensions, '_curses') and - self.compiler.find_library_file(self.lib_dirs, panel_library)): - self.add(Extension('_curses_panel', ['_curses_panel.c'], - include_dirs=curses_includes, - define_macros=curses_defines, - libraries=[panel_library, *curses_libs])) - else: - self.missing.append('_curses_panel') + if MACOS: + self.add(Extension('_scproxy', ['_scproxy.c'], + extra_link_args=[ + '-framework', 'SystemConfiguration', + '-framework', 'CoreFoundation'])) + def detect_compress_exts(self): # Andrew Kuchling's zlib module. Note that some versions of zlib # 1.1.3 have security problems. See CERT Advisory CA-2002-07: # http://www.cert.org/advisories/CA-2002-07.html @@ -1486,6 +1473,7 @@ class db_found(Exception): pass else: self.missing.append('_lzma') + def detect_expat_elementtree(self): # Interface to the Expat XML parser # # Expat was written by James Clark and is now maintained by a group of @@ -1559,6 +1547,7 @@ class db_found(Exception): pass else: self.missing.append('_elementtree') + def detect_multibytecodecs(self): # Hye-Shik Chang's CJKCodecs modules. self.add(Extension('_multibytecodec', ['cjkcodecs/multibytecodec.c'])) @@ -1566,12 +1555,7 @@ class db_found(Exception): pass self.add(Extension('_codecs_%s' % loc, ['cjkcodecs/_codecs_%s.c' % loc])) - # Stefan Krah's _decimal module - self._detect_decimal() - - # Thomas Heller's _ctypes module - self.detect_ctypes() - + def detect_multiprocessing(self): # Richard Oudkerk's multiprocessing module if MS_WINDOWS: macros = dict() @@ -1624,26 +1608,8 @@ class db_found(Exception): pass self.add(Extension('_multiprocessing', multiprocessing_srcs, define_macros=list(macros.items()), include_dirs=["Modules/_multiprocessing"])) - # End multiprocessing - - # Platform-specific libraries - if HOST_PLATFORM.startswith(('linux', 'freebsd', 'gnukfreebsd')): - self.add(Extension('ossaudiodev', ['ossaudiodev.c'])) - else: - self.missing.append('ossaudiodev') - - if MACOS: - self.add(Extension('_scproxy', ['_scproxy.c'], - extra_link_args=[ - '-framework', 'SystemConfiguration', - '-framework', 'CoreFoundation'])) - - # Call the method for detecting whether _tkinter can be compiled - self.detect_tkinter() - - if '_tkinter' not in [e.name for e in self.extensions]: - self.missing.append('_tkinter') + def detect_uuid(self): # Build the _uuid module if possible uuid_incs = find_file("uuid.h", self.inc_dirs, ["/usr/include/uuid"]) if uuid_incs is not None: @@ -1657,6 +1623,29 @@ class db_found(Exception): pass else: self.missing.append('_uuid') + def detect_modules(self): + self.add_compiler_directories() + self.init_inc_lib_dirs() + + self.detect_simple_extensions() + self.detect_readline_curses() + self.detect_crypt() + self.detect_socket() + self.detect_openssl_hashlib() + self.detect_dbm_gdbm() + self.detect_sqlite() + self.detect_platform_specific_exts() + self.detect_nis() + self.detect_compress_exts() + self.detect_expat_elementtree() + self.detect_multibytecodecs() + self.detect_decimal() + self.detect_ctypes() + self.detect_multiprocessing() + if not self.detect_tkinter(): + self.missing.append('_tkinter') + self.detect_uuid() + ## # Uncomment these lines if you want to play with xxmodule.c ## ext = Extension('xx', ['xxmodule.c']) ## self.extensions.append(ext) @@ -1798,14 +1787,13 @@ def detect_tkinter(self): # to build tkinter and bypass the searches for Tcl and TK in standard # locations. if self.detect_tkinter_explicitly(): - return + return True # Rather than complicate the code below, detecting and building # AquaTk is a separate method. Only one Tkinter will be built on # Darwin - either AquaTk, if it is found, or X11 based Tk. - if (MACOS and - self.detect_tkinter_darwin()): - return + if (MACOS and self.detect_tkinter_darwin()): + return True # Assume we haven't found any of the libraries or include files # The versions with dots are used on Unix, and the versions without @@ -1842,7 +1830,7 @@ def detect_tkinter(self): if (tcllib is None or tklib is None or tcl_includes is None or tk_includes is None): self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2) - return + return False # OK... everything seems to be present for Tcl/Tk. @@ -1871,7 +1859,7 @@ def detect_tkinter(self): if CYGWIN: x11_inc = find_file('X11/Xlib.h', [], include_dirs) if x11_inc is None: - return + return False # Check for BLT extension if self.compiler.find_library_file(self.lib_dirs + added_lib_dirs, @@ -1894,14 +1882,6 @@ def detect_tkinter(self): if not CYGWIN: libs.append('X11') - ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'], - define_macros=[('WITH_APPINIT', 1)] + defs, - include_dirs = include_dirs, - libraries = libs, - library_dirs = added_lib_dirs, - ) - self.extensions.append(ext) - # XXX handle these, but how to detect? # *** Uncomment and edit for PIL (TkImaging) extension only: # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \ @@ -1910,6 +1890,15 @@ def detect_tkinter(self): # *** Uncomment these for TOGL extension only: # -lGL -lGLU -lXext -lXmu \ + ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'], + define_macros=[('WITH_APPINIT', 1)] + defs, + include_dirs = include_dirs, + libraries = libs, + library_dirs = added_lib_dirs, + ) + self.extensions.append(ext) + return True + def configure_ctypes_darwin(self, ext): # Darwin (OS X) uses preconfigured files, in # the Modules/_ctypes/libffi_osx directory. @@ -1945,6 +1934,7 @@ def configure_ctypes(self, ext): return True def detect_ctypes(self): + # Thomas Heller's _ctypes module self.use_system_libffi = False include_dirs = [] extra_compile_args = [] @@ -1961,8 +1951,8 @@ def detect_ctypes(self): sources.append('_ctypes/darwin/dlfcn_simple.c') extra_compile_args.append('-DMACOSX') include_dirs.append('_ctypes/darwin') -# XXX Is this still needed? -## extra_link_args.extend(['-read_only_relocs', 'warning']) + # XXX Is this still needed? + # extra_link_args.extend(['-read_only_relocs', 'warning']) elif HOST_PLATFORM == 'sunos5': # XXX This shouldn't be necessary; it appears that some @@ -2023,7 +2013,8 @@ def detect_ctypes(self): # for dlopen, see bpo-32647 ext.libraries.append('dl') - def _detect_decimal(self): + def detect_decimal(self): + # Stefan Krah's _decimal module extra_compile_args = [] undef_macros = [] if '--with-system-libmpdec' in sysconfig.get_config_var("CONFIG_ARGS"): @@ -2138,7 +2129,8 @@ def _detect_decimal(self): sources=sources, depends=depends)) - def _detect_openssl(self): + def detect_openssl_hashlib(self): + # Detect SSL support for the socket module (via _ssl) config_vars = sysconfig.get_config_vars() def split_var(name, sep): @@ -2189,7 +2181,36 @@ def split_var(name, sep): library_dirs=openssl_libdirs, libraries=openssl_libs)) - def _detect_nis(self): + # We always compile these even when OpenSSL is available (issue #14693). + # It's harmless and the object code is tiny (40-50 KiB per module, + # only loaded when actually used). + self.add(Extension('_sha256', ['sha256module.c'], + depends=['hashlib.h'])) + self.add(Extension('_sha512', ['sha512module.c'], + depends=['hashlib.h'])) + self.add(Extension('_md5', ['md5module.c'], + depends=['hashlib.h'])) + self.add(Extension('_sha1', ['sha1module.c'], + depends=['hashlib.h'])) + + blake2_deps = glob(os.path.join(self.srcdir, + 'Modules/_blake2/impl/*')) + blake2_deps.append('hashlib.h') + + self.add(Extension('_blake2', + ['_blake2/blake2module.c', + '_blake2/blake2b_impl.c', + '_blake2/blake2s_impl.c'], + depends=blake2_deps)) + + sha3_deps = glob(os.path.join(self.srcdir, + 'Modules/_sha3/kcp/*')) + sha3_deps.append('hashlib.h') + self.add(Extension('_sha3', + ['_sha3/sha3module.c'], + depends=sha3_deps)) + + def detect_nis(self): if MS_WINDOWS or CYGWIN or HOST_PLATFORM == 'qnx6': self.missing.append('nis') return From webhook-mailer at python.org Fri Mar 1 11:19:13 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 01 Mar 2019 16:19:13 -0000 Subject: [Python-checkins] bpo-36146: Don't run code at setup.py top level (GH-12127) Message-ID: https://github.com/python/cpython/commit/c991f2415d4eef663039a83125aa6aad81672680 commit: c991f2415d4eef663039a83125aa6aad81672680 branch: master author: Victor Stinner committer: GitHub date: 2019-03-01T17:19:04+01:00 summary: bpo-36146: Don't run code at setup.py top level (GH-12127) * Move set_compiler_flags() calls and concurrent.future hack from module top-level to main() * Remove unused variables 'macros' and 'libraries' from detect_multiprocessing(). * Move SUMMARY and CLASSIFIERS constants at the top, move set_compiler_flags() function below these constants. * Add some empty new lines to respect PEP 8. files: M setup.py diff --git a/setup.py b/setup.py index 1bcfaa222113..6aa607f1e334 100644 --- a/setup.py +++ b/setup.py @@ -1,5 +1,4 @@ # Autodetecting setup.py script for building the Python extensions -# import argparse import importlib._bootstrap @@ -20,32 +19,19 @@ from distutils.errors import CCompilerError, DistutilsError from distutils.spawn import find_executable -CROSS_COMPILING = "_PYTHON_HOST_PLATFORM" in os.environ - -# Set common compiler and linker flags derived from the Makefile, -# reserved for building the interpreter and the stdlib modules. -# See bpo-21121 and bpo-35257 -def set_compiler_flags(compiler_flags, compiler_py_flags_nodist): - flags = sysconfig.get_config_var(compiler_flags) - py_flags_nodist = sysconfig.get_config_var(compiler_py_flags_nodist) - sysconfig.get_config_vars()[compiler_flags] = flags + ' ' + py_flags_nodist - -set_compiler_flags('CFLAGS', 'PY_CFLAGS_NODIST') -set_compiler_flags('LDFLAGS', 'PY_LDFLAGS_NODIST') - -class Dummy: - """Hack for parallel build""" - ProcessPoolExecutor = None -sys.modules['concurrent.futures.process'] = Dummy def get_platform(): - # cross build + # Cross compiling if "_PYTHON_HOST_PLATFORM" in os.environ: return os.environ["_PYTHON_HOST_PLATFORM"] + # Get value of sys.platform if sys.platform.startswith('osf1'): return 'osf1' return sys.platform + + +CROSS_COMPILING = ("_PYTHON_HOST_PLATFORM" in os.environ) HOST_PLATFORM = get_platform() MS_WINDOWS = (HOST_PLATFORM == 'win32') CYGWIN = (HOST_PLATFORM == 'cygwin') @@ -59,6 +45,45 @@ def get_platform(): # This global variable is used to hold the list of modules to be disabled. DISABLED_MODULE_LIST = [] + +SUMMARY = """ +Python is an interpreted, interactive, object-oriented programming +language. It is often compared to Tcl, Perl, Scheme or Java. + +Python combines remarkable power with very clear syntax. It has +modules, classes, exceptions, very high level dynamic data types, and +dynamic typing. There are interfaces to many system calls and +libraries, as well as to various windowing systems (X11, Motif, Tk, +Mac, MFC). New built-in modules are easily written in C or C++. Python +is also usable as an extension language for applications that need a +programmable interface. + +The Python implementation is portable: it runs on many brands of UNIX, +on Windows, DOS, Mac, Amiga... If your favorite system isn't +listed here, it may still be supported, if there's a C compiler for +it. Ask around on comp.lang.python -- or just try compiling Python +yourself. +""" + +CLASSIFIERS = """ +Development Status :: 6 - Mature +License :: OSI Approved :: Python Software Foundation License +Natural Language :: English +Programming Language :: C +Programming Language :: Python +Topic :: Software Development +""" + + +# Set common compiler and linker flags derived from the Makefile, +# reserved for building the interpreter and the stdlib modules. +# See bpo-21121 and bpo-35257 +def set_compiler_flags(compiler_flags, compiler_py_flags_nodist): + flags = sysconfig.get_config_var(compiler_flags) + py_flags_nodist = sysconfig.get_config_var(compiler_py_flags_nodist) + sysconfig.get_config_vars()[compiler_flags] = flags + ' ' + py_flags_nodist + + def add_dir_to_list(dirlist, dir): """Add the directory 'dir' to the list 'dirlist' (after any relative directories) if: @@ -74,6 +99,7 @@ def add_dir_to_list(dirlist, dir): return dirlist.insert(0, dir) + def sysroot_paths(make_vars, subdirs): """Get the paths of sysroot sub-directories. @@ -99,6 +125,7 @@ def sysroot_paths(make_vars, subdirs): break return dirs + def macosx_sdk_root(): """ Return the directory of the current OSX SDK, @@ -112,6 +139,7 @@ def macosx_sdk_root(): sysroot = m.group(1) return sysroot + def is_macosx_sdk_path(path): """ Returns True if 'path' can be located in an OSX SDK @@ -120,6 +148,7 @@ def is_macosx_sdk_path(path): or path.startswith('/System/') or path.startswith('/Library/') ) + def find_file(filename, std_dirs, paths): """Searches for the directory where a given file is located, and returns a possibly-empty list of additional directories, or None @@ -159,6 +188,7 @@ def find_file(filename, std_dirs, paths): # Not found anywhere return None + def find_library_file(compiler, libname, std_dirs, paths): result = compiler.find_library_file(std_dirs + paths, libname) if result is None: @@ -211,12 +241,14 @@ def find_library_file(compiler, libname, std_dirs, paths): else: assert False, "Internal error: Path not found in std_dirs or paths" + def module_enabled(extlist, modname): """Returns whether the module 'modname' is present in the list of extensions 'extlist'.""" extlist = [ext for ext in extlist if ext.name == modname] return len(extlist) + def find_module_file(module, dirlist): """Find a module in a set of possible folders. If it is not found return the unadorned filename""" @@ -227,6 +259,7 @@ def find_module_file(module, dirlist): log.info("WARNING: multiple copies of %s found", module) return os.path.join(list[0], module) + class PyBuildExt(build_ext): def __init__(self, dist): @@ -1558,44 +1591,17 @@ def detect_multibytecodecs(self): def detect_multiprocessing(self): # Richard Oudkerk's multiprocessing module if MS_WINDOWS: - macros = dict() - libraries = ['ws2_32'] - - elif MACOS: # Mac OSX - macros = dict() - libraries = [] - - elif CYGWIN: - macros = dict() - libraries = [] - - elif HOST_PLATFORM.startswith('openbsd'): - macros = dict() - libraries = [] - - elif HOST_PLATFORM.startswith('netbsd'): - macros = dict() - libraries = [] - - else: # Linux and other unices - macros = dict() - libraries = ['rt'] - - if MS_WINDOWS: - multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c', - '_multiprocessing/semaphore.c', - ] + multiprocessing_srcs = ['_multiprocessing/multiprocessing.c', + '_multiprocessing/semaphore.c'] else: - multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c', - ] + multiprocessing_srcs = ['_multiprocessing/multiprocessing.c'] if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')): multiprocessing_srcs.append('_multiprocessing/semaphore.c') if (sysconfig.get_config_var('HAVE_SHM_OPEN') and sysconfig.get_config_var('HAVE_SHM_UNLINK')): - posixshmem_srcs = [ '_multiprocessing/posixshmem.c', - ] + posixshmem_srcs = ['_multiprocessing/posixshmem.c'] libs = [] if sysconfig.get_config_var('SHM_NEEDS_LIBRT'): # need to link with librt to get shm_open() @@ -1606,7 +1612,6 @@ def detect_multiprocessing(self): include_dirs=["Modules/_multiprocessing"])) self.add(Extension('_multiprocessing', multiprocessing_srcs, - define_macros=list(macros.items()), include_dirs=["Modules/_multiprocessing"])) def detect_uuid(self): @@ -2303,6 +2308,7 @@ def set_dir_modes(self, dirname, mode): log.info("changing mode of %s to %o", dirpath, mode) if not self.dry_run: os.chmod(dirpath, mode) + class PyBuildScripts(build_scripts): def copy_scripts(self): outfiles, updated_files = build_scripts.copy_scripts(self) @@ -2322,35 +2328,17 @@ def copy_scripts(self): newupdated_files.append(newfilename) return newoutfiles, newupdated_files -SUMMARY = """ -Python is an interpreted, interactive, object-oriented programming -language. It is often compared to Tcl, Perl, Scheme or Java. -Python combines remarkable power with very clear syntax. It has -modules, classes, exceptions, very high level dynamic data types, and -dynamic typing. There are interfaces to many system calls and -libraries, as well as to various windowing systems (X11, Motif, Tk, -Mac, MFC). New built-in modules are easily written in C or C++. Python -is also usable as an extension language for applications that need a -programmable interface. +def main(): + set_compiler_flags('CFLAGS', 'PY_CFLAGS_NODIST') + set_compiler_flags('LDFLAGS', 'PY_LDFLAGS_NODIST') -The Python implementation is portable: it runs on many brands of UNIX, -on Windows, DOS, Mac, Amiga... If your favorite system isn't -listed here, it may still be supported, if there's a C compiler for -it. Ask around on comp.lang.python -- or just try compiling Python -yourself. -""" + class DummyProcess: + """Hack for parallel build""" + ProcessPoolExecutor = None -CLASSIFIERS = """ -Development Status :: 6 - Mature -License :: OSI Approved :: Python Software Foundation License -Natural Language :: English -Programming Language :: C -Programming Language :: Python -Topic :: Software Development -""" + sys.modules['concurrent.futures.process'] = DummyProcess -def main(): # turn off warnings when deprecated modules are imported import warnings warnings.filterwarnings("ignore",category=DeprecationWarning) From webhook-mailer at python.org Fri Mar 1 11:53:00 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 01 Mar 2019 16:53:00 -0000 Subject: [Python-checkins] bpo-36142: Add preconfig.c (GH-12128) Message-ID: https://github.com/python/cpython/commit/91b9ecf82c3287b45f39158c5134a87414ff26bc commit: 91b9ecf82c3287b45f39158c5134a87414ff26bc branch: master author: Victor Stinner committer: GitHub date: 2019-03-01T17:52:56+01:00 summary: bpo-36142: Add preconfig.c (GH-12128) * Add _PyArgv_Decode() function * Move _Py_ClearFileSystemEncoding() and _Py_SetFileSystemEncoding() to preconfig.c. files: A Python/preconfig.c M Include/cpython/coreconfig.h M Include/internal/pycore_coreconfig.h M Include/internal/pycore_fileutils.h M Makefile.pre.in M PCbuild/pythoncore.vcxproj M PCbuild/pythoncore.vcxproj.filters M Python/coreconfig.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index 8109d4abc508..e3ebf7365b94 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -5,7 +5,7 @@ extern "C" { #endif -/* _PyArgv */ +/* --- _PyArgv ---------------------------------------------------- */ typedef struct { int argc; @@ -15,7 +15,7 @@ typedef struct { } _PyArgv; -/* _PyInitError */ +/* --- _PyInitError ----------------------------------------------- */ typedef struct { const char *prefix; @@ -46,7 +46,7 @@ typedef struct { #define _Py_INIT_FAILED(err) \ (err.msg != NULL || err.exitcode != -1) -/* _PyCoreConfig */ +/* --- _PyCoreConfig ---------------------------------------------- */ typedef struct { /* Install signal handlers? Yes by default. */ @@ -364,7 +364,8 @@ typedef struct { /* Note: _PyCoreConfig_INIT sets other fields to 0/NULL */ -/* Functions used for testing */ +/* --- Function used for testing ---------------------------------- */ + PyAPI_FUNC(PyObject *) _Py_GetGlobalVariablesAsDict(void); PyAPI_FUNC(PyObject *) _PyCoreConfig_AsDict(const _PyCoreConfig *config); diff --git a/Include/internal/pycore_coreconfig.h b/Include/internal/pycore_coreconfig.h index ebb0a9e9f1f7..9f3a4c72b16d 100644 --- a/Include/internal/pycore_coreconfig.h +++ b/Include/internal/pycore_coreconfig.h @@ -8,7 +8,7 @@ extern "C" { # error "this header requires Py_BUILD_CORE or Py_BUILD_CORE_BUILTIN defined" #endif -/* _Py_wstrlist */ +/* --- _Py_wstrlist ----------------------------------------------- */ PyAPI_FUNC(void) _Py_wstrlist_clear( int len, @@ -24,12 +24,17 @@ PyAPI_FUNC(PyObject*) _Py_wstrlist_as_pylist( int len, wchar_t **list); -/* Py_GetArgcArgv() helpers */ +/* --- _PyArgv ---------------------------------------------------- */ + +PyAPI_FUNC(_PyInitError) _PyArgv_Decode(const _PyArgv *args, + wchar_t*** argv_p); + +/* --- Py_GetArgcArgv() helpers ----------------------------------- */ PyAPI_FUNC(void) _Py_ClearArgcArgv(void); PyAPI_FUNC(int) _Py_SetArgcArgv(int argc, wchar_t * const *argv); -/* _PyCoreConfig */ +/* --- _PyCoreConfig ---------------------------------------------- */ PyAPI_FUNC(_PyInitError) _PyCoreConfig_Read(_PyCoreConfig *config); PyAPI_FUNC(void) _PyCoreConfig_Clear(_PyCoreConfig *); diff --git a/Include/internal/pycore_fileutils.h b/Include/internal/pycore_fileutils.h index 25006653a589..23ae2013c0ee 100644 --- a/Include/internal/pycore_fileutils.h +++ b/Include/internal/pycore_fileutils.h @@ -10,6 +10,8 @@ extern "C" { #include /* struct lconv */ +PyAPI_DATA(int) _Py_HasFileSystemDefaultEncodeErrors; + PyAPI_FUNC(int) _Py_DecodeUTF8Ex( const char *arg, Py_ssize_t arglen, diff --git a/Makefile.pre.in b/Makefile.pre.in index 9c2d3d66a05e..5ae69480bf16 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -357,6 +357,7 @@ PYTHON_OBJS= \ Python/mystrtoul.o \ Python/pathconfig.o \ Python/peephole.o \ + Python/preconfig.o \ Python/pyarena.o \ Python/pyctype.o \ Python/pyfpe.o \ diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 1ec5f75808f3..992c84f8cc81 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -425,6 +425,7 @@ + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 5053dcf1e8d9..293bded66c31 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -989,6 +989,9 @@ Python + + Python + Python diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 47dbe66d3eba..e1bf8b523ccf 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -136,13 +136,6 @@ int Py_LegacyWindowsFSEncodingFlag = 0; /* Uses mbcs instead of utf-8 */ int Py_LegacyWindowsStdioFlag = 0; /* Uses FileIO instead of WindowsConsoleIO */ #endif -/* The filesystem encoding is chosen by config_init_fs_encoding(), - see also initfsencoding(). */ -const char *Py_FileSystemDefaultEncoding = NULL; -int Py_HasFileSystemDefaultEncoding = 0; -const char *Py_FileSystemDefaultEncodeErrors = NULL; -static int _Py_HasFileSystemDefaultEncodeErrors = 0; - PyObject * _Py_GetGlobalVariablesAsDict(void) @@ -296,49 +289,6 @@ _Py_wstrlist_as_pylist(int len, wchar_t **list) } -void -_Py_ClearFileSystemEncoding(void) -{ - if (!Py_HasFileSystemDefaultEncoding && Py_FileSystemDefaultEncoding) { - PyMem_RawFree((char*)Py_FileSystemDefaultEncoding); - Py_FileSystemDefaultEncoding = NULL; - } - if (!_Py_HasFileSystemDefaultEncodeErrors && Py_FileSystemDefaultEncodeErrors) { - PyMem_RawFree((char*)Py_FileSystemDefaultEncodeErrors); - Py_FileSystemDefaultEncodeErrors = NULL; - } -} - - -/* --- File system encoding/errors -------------------------------- */ - -/* Set Py_FileSystemDefaultEncoding and Py_FileSystemDefaultEncodeErrors - global configuration variables. */ -int -_Py_SetFileSystemEncoding(const char *encoding, const char *errors) -{ - char *encoding2 = _PyMem_RawStrdup(encoding); - if (encoding2 == NULL) { - return -1; - } - - char *errors2 = _PyMem_RawStrdup(errors); - if (errors2 == NULL) { - PyMem_RawFree(encoding2); - return -1; - } - - _Py_ClearFileSystemEncoding(); - - Py_FileSystemDefaultEncoding = encoding2; - Py_HasFileSystemDefaultEncoding = 0; - - Py_FileSystemDefaultEncodeErrors = errors2; - _Py_HasFileSystemDefaultEncodeErrors = 0; - return 0; -} - - /* --- Py_SetStandardStreamEncoding() ----------------------------- */ /* Helper to allow an embedding application to override the normal @@ -1849,6 +1799,7 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) typedef struct { const _PyArgv *args; + int argc; wchar_t **argv; int nwarnoption; /* Number of -W command line options */ wchar_t **warnoptions; /* Command line -W options */ @@ -1881,35 +1832,7 @@ static _PyInitError cmdline_decode_argv(_PyCmdline *cmdline) { assert(cmdline->argv == NULL); - - const _PyArgv *args = cmdline->args; - - if (args->use_bytes_argv) { - /* +1 for a the NULL terminator */ - size_t size = sizeof(wchar_t*) * (args->argc + 1); - wchar_t** argv = (wchar_t **)PyMem_RawMalloc(size); - if (argv == NULL) { - return _Py_INIT_NO_MEMORY(); - } - - for (int i = 0; i < args->argc; i++) { - size_t len; - wchar_t *arg = Py_DecodeLocale(args->bytes_argv[i], &len); - if (arg == NULL) { - _Py_wstrlist_clear(i, argv); - return DECODE_LOCALE_ERR("command line arguments", - (Py_ssize_t)len); - } - argv[i] = arg; - } - argv[args->argc] = NULL; - - cmdline->argv = argv; - } - else { - cmdline->argv = args->wchar_argv; - } - return _Py_INIT_OK(); + return _PyArgv_Decode(cmdline->args, &cmdline->argv); } @@ -2377,7 +2300,7 @@ config_read_from_argv_impl(_PyCoreConfig *config, const _PyArgv *args) memset(&cmdline, 0, sizeof(cmdline)); cmdline.args = args; - err = cmdline_decode_argv(&cmdline); + err = _PyArgv_Decode(cmdline.args, &cmdline.argv); if (_Py_INIT_FAILED(err)) { goto done; } diff --git a/Python/preconfig.c b/Python/preconfig.c new file mode 100644 index 000000000000..8102924e7165 --- /dev/null +++ b/Python/preconfig.c @@ -0,0 +1,92 @@ +#include "Python.h" +#include "pycore_coreconfig.h" + + +#define DECODE_LOCALE_ERR(NAME, LEN) \ + (((LEN) == -2) \ + ? _Py_INIT_USER_ERR("cannot decode " NAME) \ + : _Py_INIT_NO_MEMORY()) + + +/* --- File system encoding/errors -------------------------------- */ + +/* The filesystem encoding is chosen by config_init_fs_encoding(), + see also initfsencoding(). */ +const char *Py_FileSystemDefaultEncoding = NULL; +int Py_HasFileSystemDefaultEncoding = 0; +const char *Py_FileSystemDefaultEncodeErrors = NULL; +int _Py_HasFileSystemDefaultEncodeErrors = 0; + +void +_Py_ClearFileSystemEncoding(void) +{ + if (!Py_HasFileSystemDefaultEncoding && Py_FileSystemDefaultEncoding) { + PyMem_RawFree((char*)Py_FileSystemDefaultEncoding); + Py_FileSystemDefaultEncoding = NULL; + } + if (!_Py_HasFileSystemDefaultEncodeErrors && Py_FileSystemDefaultEncodeErrors) { + PyMem_RawFree((char*)Py_FileSystemDefaultEncodeErrors); + Py_FileSystemDefaultEncodeErrors = NULL; + } +} + + +/* Set Py_FileSystemDefaultEncoding and Py_FileSystemDefaultEncodeErrors + global configuration variables. */ +int +_Py_SetFileSystemEncoding(const char *encoding, const char *errors) +{ + char *encoding2 = _PyMem_RawStrdup(encoding); + if (encoding2 == NULL) { + return -1; + } + + char *errors2 = _PyMem_RawStrdup(errors); + if (errors2 == NULL) { + PyMem_RawFree(encoding2); + return -1; + } + + _Py_ClearFileSystemEncoding(); + + Py_FileSystemDefaultEncoding = encoding2; + Py_HasFileSystemDefaultEncoding = 0; + + Py_FileSystemDefaultEncodeErrors = errors2; + _Py_HasFileSystemDefaultEncodeErrors = 0; + return 0; +} + + +/* --- _PyArgv ---------------------------------------------------- */ + +_PyInitError +_PyArgv_Decode(const _PyArgv *args, wchar_t*** argv_p) +{ + wchar_t** argv; + if (args->use_bytes_argv) { + /* +1 for a the NULL terminator */ + size_t size = sizeof(wchar_t*) * (args->argc + 1); + argv = (wchar_t **)PyMem_RawMalloc(size); + if (argv == NULL) { + return _Py_INIT_NO_MEMORY(); + } + + for (int i = 0; i < args->argc; i++) { + size_t len; + wchar_t *arg = Py_DecodeLocale(args->bytes_argv[i], &len); + if (arg == NULL) { + _Py_wstrlist_clear(i, argv); + return DECODE_LOCALE_ERR("command line arguments", + (Py_ssize_t)len); + } + argv[i] = arg; + } + argv[args->argc] = NULL; + } + else { + argv = args->wchar_argv; + } + *argv_p = argv; + return _Py_INIT_OK(); +} From webhook-mailer at python.org Fri Mar 1 12:17:59 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 01 Mar 2019 17:17:59 -0000 Subject: [Python-checkins] bpo-35178: Fix warnings._formatwarnmsg() (GH-12033) Message-ID: https://github.com/python/cpython/commit/be7c460fb50efe3b88a00281025d76acc62ad2fd commit: be7c460fb50efe3b88a00281025d76acc62ad2fd branch: master author: Xtreak committer: Victor Stinner date: 2019-03-01T18:17:55+01:00 summary: bpo-35178: Fix warnings._formatwarnmsg() (GH-12033) Ensure custom formatwarning function can receive line as positional argument. Co-Authored-By: Tashrif Billah files: A Misc/NEWS.d/next/Library/2019-02-25-23-04-00.bpo-35178.NA_rXa.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 2c54e6137ba8..86c2f226ebcf 100644 --- a/Lib/test/test_warnings/__init__.py +++ b/Lib/test/test_warnings/__init__.py @@ -877,6 +877,25 @@ def test_showwarning(self): file_object, expected_file_line) self.assertEqual(expect, file_object.getvalue()) + def test_formatwarning_override(self): + # bpo-35178: Test that a custom formatwarning function gets the 'line' + # argument as a positional argument, and not only as a keyword argument + def myformatwarning(message, category, filename, lineno, text): + return f'm={message}:c={category}:f={filename}:l={lineno}:t={text}' + + file_name = os.path.splitext(warning_tests.__file__)[0] + '.py' + line_num = 3 + file_line = linecache.getline(file_name, line_num).strip() + message = 'msg' + category = Warning + file_object = StringIO() + expected = f'm={message}:c={category}:f={file_name}:l={line_num}' + \ + f':t={file_line}' + with support.swap_attr(self.module, 'formatwarning', myformatwarning): + self.module.showwarning(message, category, file_name, line_num, + file_object, file_line) + self.assertEqual(file_object.getvalue(), expected) + class CWarningsDisplayTests(WarningsDisplayTests, unittest.TestCase): module = c_warnings diff --git a/Lib/warnings.py b/Lib/warnings.py index cf88131f87b4..00f740ca3a95 100644 --- a/Lib/warnings.py +++ b/Lib/warnings.py @@ -124,7 +124,7 @@ def _formatwarnmsg(msg): if fw is not _formatwarning_orig: # warnings.formatwarning() was replaced return fw(msg.message, msg.category, - msg.filename, msg.lineno, line=msg.line) + msg.filename, msg.lineno, msg.line) return _formatwarnmsg_impl(msg) def filterwarnings(action, message="", category=Warning, module="", lineno=0, diff --git a/Misc/NEWS.d/next/Library/2019-02-25-23-04-00.bpo-35178.NA_rXa.rst b/Misc/NEWS.d/next/Library/2019-02-25-23-04-00.bpo-35178.NA_rXa.rst new file mode 100644 index 000000000000..2593199cfe9c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-02-25-23-04-00.bpo-35178.NA_rXa.rst @@ -0,0 +1,2 @@ +Ensure custom :func:`warnings.formatwarning` function can receive `line` as +positional argument. Based on patch by Tashrif Billah. From webhook-mailer at python.org Fri Mar 1 12:21:53 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 01 Mar 2019 17:21:53 -0000 Subject: [Python-checkins] bpo-36146: Add TEST_EXTENSIONS to setup.py (GH-12129) Message-ID: https://github.com/python/cpython/commit/cfe172dc6bd0a02d36db31ffabcc38f9320a4510 commit: cfe172dc6bd0a02d36db31ffabcc38f9320a4510 branch: master author: Victor Stinner committer: GitHub date: 2019-03-01T18:21:49+01:00 summary: bpo-36146: Add TEST_EXTENSIONS to setup.py (GH-12129) Add TEST_EXTENSIONS constant to setup.py to allow to not build test extensions like _testcapi. Changes: * Add add_ldflags_cppflags() subfunction * Rename add_compiler_directories() to configure_compiler(). * Remove unused COMPILED_WITH_PYDEBUG constant. * Use self.add() rather than accessing directly self.extensions. * Remove module_enabled() function: check differently if curses extension is built or not. files: A Misc/NEWS.d/next/Build/2019-03-01-17-49-22.bpo-36146.VeoyG7.rst M setup.py diff --git a/Misc/NEWS.d/next/Build/2019-03-01-17-49-22.bpo-36146.VeoyG7.rst b/Misc/NEWS.d/next/Build/2019-03-01-17-49-22.bpo-36146.VeoyG7.rst new file mode 100644 index 000000000000..f32a821302c5 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2019-03-01-17-49-22.bpo-36146.VeoyG7.rst @@ -0,0 +1,2 @@ +Add ``TEST_EXTENSIONS`` constant to ``setup.py`` to allow to not build test +extensions like ``_testcapi``. diff --git a/setup.py b/setup.py index 6aa607f1e334..b96961073b98 100644 --- a/setup.py +++ b/setup.py @@ -20,6 +20,13 @@ from distutils.spawn import find_executable +# Compile extensions used to test Python? +TEST_EXTENSIONS = True + +# This global variable is used to hold the list of modules to be disabled. +DISABLED_MODULE_LIST = [] + + def get_platform(): # Cross compiling if "_PYTHON_HOST_PLATFORM" in os.environ: @@ -36,15 +43,8 @@ def get_platform(): MS_WINDOWS = (HOST_PLATFORM == 'win32') CYGWIN = (HOST_PLATFORM == 'cygwin') MACOS = (HOST_PLATFORM == 'darwin') - VXWORKS = ('vxworks' in HOST_PLATFORM) -# Were we compiled --with-pydebug or with #define Py_DEBUG? -COMPILED_WITH_PYDEBUG = ('--with-pydebug' in sysconfig.get_config_var("CONFIG_ARGS")) - -# This global variable is used to hold the list of modules to be disabled. -DISABLED_MODULE_LIST = [] - SUMMARY = """ Python is an interpreted, interactive, object-oriented programming @@ -242,13 +242,6 @@ def find_library_file(compiler, libname, std_dirs, paths): assert False, "Internal error: Path not found in std_dirs or paths" -def module_enabled(extlist, modname): - """Returns whether the module 'modname' is present in the list - of extensions 'extlist'.""" - extlist = [ext for ext in extlist if ext.name == modname] - return len(extlist) - - def find_module_file(module, dirlist): """Find a module in a set of possible folders. If it is not found return the unadorned filename""" @@ -592,18 +585,7 @@ def add_cross_compiling_paths(self): finally: os.unlink(tmpfile) - def add_compiler_directories(self): - # Ensure that /usr/local is always used, but the local build - # directories (i.e. '.' and 'Include') must be first. See issue - # 10520. - if not CROSS_COMPILING: - add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') - add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') - # only change this for cross builds for 3.3, issues on Mageia - if CROSS_COMPILING: - self.add_cross_compiling_paths() - self.add_multiarch_paths() - + def add_ldflags_cppflags(self): # Add paths specified in the environment variables LDFLAGS and # CPPFLAGS for header and library files. # We must get the values from the Makefile and not the environment @@ -623,6 +605,19 @@ def add_compiler_directories(self): for directory in reversed(options.dirs): add_dir_to_list(dir_list, directory) + def configure_compiler(self): + # Ensure that /usr/local is always used, but the local build + # directories (i.e. '.' and 'Include') must be first. See issue + # 10520. + if not CROSS_COMPILING: + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + # only change this for cross builds for 3.3, issues on Mageia + if CROSS_COMPILING: + self.add_cross_compiling_paths() + self.add_multiarch_paths() + self.add_ldflags_cppflags() + def init_inc_lib_dirs(self): if (not CROSS_COMPILING and os.path.normpath(sys.base_prefix) != '/usr' and @@ -697,13 +692,15 @@ def detect_simple_extensions(self): self.add(Extension('_contextvars', ['_contextvarsmodule.c'])) shared_math = 'Modules/_math.o' - # complex math library functions - self.add(Extension('cmath', ['cmathmodule.c'], + + # math library functions, e.g. sin() + self.add(Extension('math', ['mathmodule.c'], extra_objects=[shared_math], depends=['_math.h', shared_math], libraries=['m'])) - # math library functions, e.g. sin() - self.add(Extension('math', ['mathmodule.c'], + + # complex math library functions + self.add(Extension('cmath', ['cmathmodule.c'], extra_objects=[shared_math], depends=['_math.h', shared_math], libraries=['m'])) @@ -735,15 +732,7 @@ def detect_simple_extensions(self): self.add(Extension("_json", ["_json.c"], # pycore_accu.h requires Py_BUILD_CORE_BUILTIN extra_compile_args=['-DPy_BUILD_CORE_BUILTIN'])) - # Python C API test module - self.add(Extension('_testcapi', ['_testcapimodule.c'], - depends=['testcapi_long.h'])) - # Python PEP-3118 (buffer protocol) test module - self.add(Extension('_testbuffer', ['_testbuffer.c'])) - # Test loading multiple modules from one compiled file (http://bugs.python.org/issue16421) - self.add(Extension('_testimportmultiple', ['_testimportmultiple.c'])) - # Test multi-phase extension module init (PEP 489) - self.add(Extension('_testmultiphase', ['_testmultiphase.c'])) + # profiler (_lsprof is for cProfile.py) self.add(Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c'])) # static Unicode character database @@ -794,11 +783,6 @@ def detect_simple_extensions(self): # syslog daemon interface self.add(Extension('syslog', ['syslogmodule.c'])) - # Fuzz tests. - self.add(Extension('_xxtestfuzz', - ['_xxtestfuzz/_xxtestfuzz.c', - '_xxtestfuzz/fuzzer.c'])) - # Python interface to subinterpreter C-API. self.add(Extension('_xxsubinterpreters', ['_xxsubinterpretersmodule.c'], @@ -827,6 +811,25 @@ def detect_simple_extensions(self): # POSIX subprocess module helper. self.add(Extension('_posixsubprocess', ['_posixsubprocess.c'])) + def detect_test_extensions(self): + # Python C API test module + self.add(Extension('_testcapi', ['_testcapimodule.c'], + depends=['testcapi_long.h'])) + + # Python PEP-3118 (buffer protocol) test module + self.add(Extension('_testbuffer', ['_testbuffer.c'])) + + # Test loading multiple modules from one compiled file (http://bugs.python.org/issue16421) + self.add(Extension('_testimportmultiple', ['_testimportmultiple.c'])) + + # Test multi-phase extension module init (PEP 489) + self.add(Extension('_testmultiphase', ['_testmultiphase.c'])) + + # Fuzz tests. + self.add(Extension('_xxtestfuzz', + ['_xxtestfuzz/_xxtestfuzz.c', + '_xxtestfuzz/fuzzer.c'])) + def detect_readline_curses(self): # readline do_readline = self.compiler.find_library_file(self.lib_dirs, 'readline') @@ -936,6 +939,7 @@ def detect_readline_curses(self): curses_defines.append(('HAVE_NCURSESW', '1')) curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1')) + curses_enabled = True if curses_library.startswith('ncurses'): curses_libs = [curses_library] self.add(Extension('_curses', ['_cursesmodule.c'], @@ -956,10 +960,11 @@ def detect_readline_curses(self): define_macros=curses_defines, libraries=curses_libs)) else: + curses_enabled = False self.missing.append('_curses') # If the curses module is enabled, check for the panel module - if (module_enabled(self.extensions, '_curses') and + if (curses_enabled and self.compiler.find_library_file(self.lib_dirs, panel_library)): self.add(Extension('_curses_panel', ['_curses_panel.c'], include_dirs=curses_includes, @@ -1622,17 +1627,19 @@ def detect_uuid(self): uuid_libs = ['uuid'] else: uuid_libs = [] - self.extensions.append(Extension('_uuid', ['_uuidmodule.c'], - libraries=uuid_libs, - include_dirs=uuid_incs)) + self.add(Extension('_uuid', ['_uuidmodule.c'], + libraries=uuid_libs, + include_dirs=uuid_incs)) else: self.missing.append('_uuid') def detect_modules(self): - self.add_compiler_directories() + self.configure_compiler() self.init_inc_lib_dirs() self.detect_simple_extensions() + if TEST_EXTENSIONS: + self.detect_test_extensions() self.detect_readline_curses() self.detect_crypt() self.detect_socket() @@ -1652,13 +1659,11 @@ def detect_modules(self): self.detect_uuid() ## # Uncomment these lines if you want to play with xxmodule.c -## ext = Extension('xx', ['xxmodule.c']) -## self.extensions.append(ext) +## self.add(Extension('xx', ['xxmodule.c'])) if 'd' not in sysconfig.get_config_var('ABIFLAGS'): - ext = Extension('xxlimited', ['xxlimited.c'], - define_macros=[('Py_LIMITED_API', '0x03050000')]) - self.extensions.append(ext) + self.add(Extension('xxlimited', ['xxlimited.c'], + define_macros=[('Py_LIMITED_API', '0x03050000')])) def detect_tkinter_explicitly(self): # Build _tkinter using explicit locations for Tcl/Tk. @@ -1687,12 +1692,10 @@ def detect_tkinter_explicitly(self): extra_compile_args = tcltk_includes.split() extra_link_args = tcltk_libs.split() - ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'], - define_macros=[('WITH_APPINIT', 1)], - extra_compile_args = extra_compile_args, - extra_link_args = extra_link_args, - ) - self.extensions.append(ext) + self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'], + define_macros=[('WITH_APPINIT', 1)], + extra_compile_args = extra_compile_args, + extra_link_args = extra_link_args)) return True def detect_tkinter_darwin(self): @@ -1774,14 +1777,12 @@ def detect_tkinter_darwin(self): frameworks.append('-arch') frameworks.append(a) - ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'], - define_macros=[('WITH_APPINIT', 1)], - include_dirs = include_dirs, - libraries = [], - extra_compile_args = frameworks[2:], - extra_link_args = frameworks, - ) - self.extensions.append(ext) + self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'], + define_macros=[('WITH_APPINIT', 1)], + include_dirs=include_dirs, + libraries=[], + extra_compile_args=frameworks[2:], + extra_link_args=frameworks)) return True def detect_tkinter(self): @@ -1839,7 +1840,10 @@ def detect_tkinter(self): # OK... everything seems to be present for Tcl/Tk. - include_dirs = [] ; libs = [] ; defs = [] ; added_lib_dirs = [] + include_dirs = [] + libs = [] + defs = [] + added_lib_dirs = [] for dir in tcl_includes + tk_includes: if dir not in include_dirs: include_dirs.append(dir) @@ -1895,13 +1899,11 @@ def detect_tkinter(self): # *** Uncomment these for TOGL extension only: # -lGL -lGLU -lXext -lXmu \ - ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'], - define_macros=[('WITH_APPINIT', 1)] + defs, - include_dirs = include_dirs, - libraries = libs, - library_dirs = added_lib_dirs, - ) - self.extensions.append(ext) + self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'], + define_macros=[('WITH_APPINIT', 1)] + defs, + include_dirs=include_dirs, + libraries=libs, + library_dirs=added_lib_dirs)) return True def configure_ctypes_darwin(self, ext): @@ -1980,11 +1982,12 @@ def detect_ctypes(self): libraries=[], sources=sources, depends=depends) - # function my_sqrt() needs libm for sqrt() - ext_test = Extension('_ctypes_test', - sources=['_ctypes/_ctypes_test.c'], - libraries=['m']) - self.extensions.extend([ext, ext_test]) + self.add(ext) + if TEST_EXTENSIONS: + # function my_sqrt() needs libm for sqrt() + self.add(Extension('_ctypes_test', + sources=['_ctypes/_ctypes_test.c'], + libraries=['m'])) ffi_inc_dirs = self.inc_dirs.copy() if MACOS: From webhook-mailer at python.org Fri Mar 1 12:40:15 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 01 Mar 2019 17:40:15 -0000 Subject: [Python-checkins] bpo-35178: Fix warnings._formatwarnmsg() (GH-12033) Message-ID: https://github.com/python/cpython/commit/b94874f7e27cbc92e0aec8779ee98bcb16efb257 commit: b94874f7e27cbc92e0aec8779ee98bcb16efb257 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-01T09:40:10-08:00 summary: bpo-35178: Fix warnings._formatwarnmsg() (GH-12033) Ensure custom formatwarning function can receive line as positional argument. Co-Authored-By: Tashrif Billah (cherry picked from commit be7c460fb50efe3b88a00281025d76acc62ad2fd) Co-authored-by: Xtreak files: A Misc/NEWS.d/next/Library/2019-02-25-23-04-00.bpo-35178.NA_rXa.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 a40a9a297c82..87cc3a7e36ae 100644 --- a/Lib/test/test_warnings/__init__.py +++ b/Lib/test/test_warnings/__init__.py @@ -940,6 +940,25 @@ def test_showwarning(self): file_object, expected_file_line) self.assertEqual(expect, file_object.getvalue()) + def test_formatwarning_override(self): + # bpo-35178: Test that a custom formatwarning function gets the 'line' + # argument as a positional argument, and not only as a keyword argument + def myformatwarning(message, category, filename, lineno, text): + return f'm={message}:c={category}:f={filename}:l={lineno}:t={text}' + + file_name = os.path.splitext(warning_tests.__file__)[0] + '.py' + line_num = 3 + file_line = linecache.getline(file_name, line_num).strip() + message = 'msg' + category = Warning + file_object = StringIO() + expected = f'm={message}:c={category}:f={file_name}:l={line_num}' + \ + f':t={file_line}' + with support.swap_attr(self.module, 'formatwarning', myformatwarning): + self.module.showwarning(message, category, file_name, line_num, + file_object, file_line) + self.assertEqual(file_object.getvalue(), expected) + class CWarningsDisplayTests(WarningsDisplayTests, unittest.TestCase): module = c_warnings diff --git a/Lib/warnings.py b/Lib/warnings.py index ae4295e120f6..9064f56827df 100644 --- a/Lib/warnings.py +++ b/Lib/warnings.py @@ -124,7 +124,7 @@ def _formatwarnmsg(msg): if fw is not _formatwarning_orig: # warnings.formatwarning() was replaced return fw(msg.message, msg.category, - msg.filename, msg.lineno, line=msg.line) + msg.filename, msg.lineno, msg.line) return _formatwarnmsg_impl(msg) def filterwarnings(action, message="", category=Warning, module="", lineno=0, diff --git a/Misc/NEWS.d/next/Library/2019-02-25-23-04-00.bpo-35178.NA_rXa.rst b/Misc/NEWS.d/next/Library/2019-02-25-23-04-00.bpo-35178.NA_rXa.rst new file mode 100644 index 000000000000..2593199cfe9c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-02-25-23-04-00.bpo-35178.NA_rXa.rst @@ -0,0 +1,2 @@ +Ensure custom :func:`warnings.formatwarning` function can receive `line` as +positional argument. Based on patch by Tashrif Billah. From webhook-mailer at python.org Fri Mar 1 14:35:16 2019 From: webhook-mailer at python.org (Eric Snow) Date: Fri, 01 Mar 2019 19:35:16 -0000 Subject: [Python-checkins] bpo-33608: Use _Py_AddPendingCall() in _PyCrossInterpreterData_Release(). (gh-12024) Message-ID: https://github.com/python/cpython/commit/b05b711a2cef6c6c381e01069dedac372e0b9fb2 commit: b05b711a2cef6c6c381e01069dedac372e0b9fb2 branch: master author: Eric Snow committer: GitHub date: 2019-03-01T12:35:10-07:00 summary: bpo-33608: Use _Py_AddPendingCall() in _PyCrossInterpreterData_Release(). (gh-12024) files: M Python/pystate.c diff --git a/Python/pystate.c b/Python/pystate.c index a9a425c2f49c..d612d3a171b6 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -328,28 +328,39 @@ PyInterpreterState_GetID(PyInterpreterState *interp) } -PyInterpreterState * -_PyInterpreterState_LookUpID(PY_INT64_T requested_id) +static PyInterpreterState * +interp_look_up_id(PY_INT64_T requested_id) { - if (requested_id < 0) - goto error; - PyInterpreterState *interp = PyInterpreterState_Head(); while (interp != NULL) { PY_INT64_T id = PyInterpreterState_GetID(interp); - if (id < 0) + if (id < 0) { return NULL; - if (requested_id == id) + } + if (requested_id == id) { return interp; + } interp = PyInterpreterState_Next(interp); } - -error: - PyErr_Format(PyExc_RuntimeError, - "unrecognized interpreter ID %lld", requested_id); return NULL; } +PyInterpreterState * +_PyInterpreterState_LookUpID(PY_INT64_T requested_id) +{ + PyInterpreterState *interp = NULL; + if (requested_id >= 0) { + HEAD_UNLOCK(); + interp = interp_look_up_id(requested_id); + HEAD_UNLOCK(); + } + if (interp == NULL && !PyErr_Occurred()) { + PyErr_Format(PyExc_RuntimeError, + "unrecognized interpreter ID %lld", requested_id); + } + return interp; +} + int _PyInterpreterState_IDInitref(PyInterpreterState *interp) @@ -1280,7 +1291,7 @@ _PyObject_GetCrossInterpreterData(PyObject *obj, _PyCrossInterpreterData *data) return 0; } -static void +static int _release_xidata(void *arg) { _PyCrossInterpreterData *data = (_PyCrossInterpreterData *)arg; @@ -1288,30 +1299,8 @@ _release_xidata(void *arg) data->free(data->data); } Py_XDECREF(data->obj); -} - -static void -_call_in_interpreter(PyInterpreterState *interp, - void (*func)(void *), void *arg) -{ - /* We would use Py_AddPendingCall() if it weren't specific to the - * main interpreter (see bpo-33608). In the meantime we take a - * naive approach. - */ - PyThreadState *save_tstate = NULL; - if (interp != _PyInterpreterState_Get()) { - // XXX Using the "head" thread isn't strictly correct. - PyThreadState *tstate = PyInterpreterState_ThreadHead(interp); - // XXX Possible GILState issues? - save_tstate = PyThreadState_Swap(tstate); - } - - func(arg); - - // Switch back. - if (save_tstate != NULL) { - PyThreadState_Swap(save_tstate); - } + PyMem_Free(data); + return 0; } void @@ -1322,7 +1311,7 @@ _PyCrossInterpreterData_Release(_PyCrossInterpreterData *data) return; } - // Switch to the original interpreter. + // Get the original interpreter. PyInterpreterState *interp = _PyInterpreterState_LookUpID(data->interp); if (interp == NULL) { // The intepreter was already destroyed. @@ -1331,10 +1320,24 @@ _PyCrossInterpreterData_Release(_PyCrossInterpreterData *data) } return; } + // XXX There's an ever-so-slight race here... + if (interp->finalizing) { + // XXX Someone leaked some memory... + return; + } // "Release" the data and/or the object. - // XXX Use _Py_AddPendingCall(). - _call_in_interpreter(interp, _release_xidata, data); + _PyCrossInterpreterData *copied = PyMem_Malloc(sizeof(_PyCrossInterpreterData)); + if (copied == NULL) { + PyErr_SetString(PyExc_MemoryError, + "Not enough memory to preserve cross-interpreter data"); + PyErr_Print(); + return; + } + memcpy(copied, data, sizeof(_PyCrossInterpreterData)); + if (_Py_AddPendingCall(interp, 0, _release_xidata, copied) != 0) { + // XXX Queue full or couldn't get lock. Try again somehow? + } } PyObject * From webhook-mailer at python.org Fri Mar 1 15:15:49 2019 From: webhook-mailer at python.org (Eric Snow) Date: Fri, 01 Mar 2019 20:15:49 -0000 Subject: [Python-checkins] bpo-33608: Simplify ceval's DISPATCH by hoisting eval_breaker ahead of time. (gh-12062) Message-ID: https://github.com/python/cpython/commit/bda918bf65a88560ec453aaba0758a9c0d49b449 commit: bda918bf65a88560ec453aaba0758a9c0d49b449 branch: master author: Eric Snow committer: GitHub date: 2019-03-01T13:15:45-07:00 summary: bpo-33608: Simplify ceval's DISPATCH by hoisting eval_breaker ahead of time. (gh-12062) This includes fixes to various _Py_atomic_* macros. files: M Include/internal/pycore_atomic.h M Python/ceval.c diff --git a/Include/internal/pycore_atomic.h b/Include/internal/pycore_atomic.h index 5669f71b941f..7aa7eed6f7c2 100644 --- a/Include/internal/pycore_atomic.h +++ b/Include/internal/pycore_atomic.h @@ -58,10 +58,10 @@ typedef struct _Py_atomic_int { atomic_thread_fence(ORDER) #define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ - atomic_store_explicit(&(ATOMIC_VAL)->_value, NEW_VAL, ORDER) + atomic_store_explicit(&((ATOMIC_VAL)->_value), NEW_VAL, ORDER) #define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ - atomic_load_explicit(&(ATOMIC_VAL)->_value, ORDER) + atomic_load_explicit(&((ATOMIC_VAL)->_value), ORDER) /* Use builtin atomic operations in GCC >= 4.7 */ #elif defined(HAVE_BUILTIN_ATOMIC) @@ -92,14 +92,14 @@ typedef struct _Py_atomic_int { (assert((ORDER) == __ATOMIC_RELAXED \ || (ORDER) == __ATOMIC_SEQ_CST \ || (ORDER) == __ATOMIC_RELEASE), \ - __atomic_store_n(&(ATOMIC_VAL)->_value, NEW_VAL, ORDER)) + __atomic_store_n(&((ATOMIC_VAL)->_value), NEW_VAL, ORDER)) #define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ (assert((ORDER) == __ATOMIC_RELAXED \ || (ORDER) == __ATOMIC_SEQ_CST \ || (ORDER) == __ATOMIC_ACQUIRE \ || (ORDER) == __ATOMIC_CONSUME), \ - __atomic_load_n(&(ATOMIC_VAL)->_value, ORDER)) + __atomic_load_n(&((ATOMIC_VAL)->_value), ORDER)) /* Only support GCC (for expression statements) and x86 (for simple * atomic semantics) and MSVC x86/x64/ARM */ @@ -324,7 +324,7 @@ inline intptr_t _Py_atomic_load_64bit(volatile uintptr_t* value, int order) { } #else -#define _Py_atomic_load_64bit(ATOMIC_VAL, ORDER) *ATOMIC_VAL +#define _Py_atomic_load_64bit(ATOMIC_VAL, ORDER) *(ATOMIC_VAL) #endif inline int _Py_atomic_load_32bit(volatile int* value, int order) { @@ -359,15 +359,15 @@ inline int _Py_atomic_load_32bit(volatile int* value, int order) { } #define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ - if (sizeof(*ATOMIC_VAL._value) == 8) { \ - _Py_atomic_store_64bit((volatile long long*)ATOMIC_VAL._value, NEW_VAL, ORDER) } else { \ - _Py_atomic_store_32bit((volatile long*)ATOMIC_VAL._value, NEW_VAL, ORDER) } + if (sizeof((ATOMIC_VAL)->_value) == 8) { \ + _Py_atomic_store_64bit((volatile long long*)&((ATOMIC_VAL)->_value), NEW_VAL, ORDER) } else { \ + _Py_atomic_store_32bit((volatile long*)&((ATOMIC_VAL)->_value), NEW_VAL, ORDER) } #define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ ( \ - sizeof(*(ATOMIC_VAL._value)) == 8 ? \ - _Py_atomic_load_64bit((volatile long long*)ATOMIC_VAL._value, ORDER) : \ - _Py_atomic_load_32bit((volatile long*)ATOMIC_VAL._value, ORDER) \ + sizeof((ATOMIC_VAL)->_value) == 8 ? \ + _Py_atomic_load_64bit((volatile long long*)&((ATOMIC_VAL)->_value), ORDER) : \ + _Py_atomic_load_32bit((volatile long*)&((ATOMIC_VAL)->_value), ORDER) \ ) #elif defined(_M_ARM) || defined(_M_ARM64) typedef enum _Py_memory_order { @@ -391,13 +391,13 @@ typedef struct _Py_atomic_int { #define _Py_atomic_store_64bit(ATOMIC_VAL, NEW_VAL, ORDER) \ switch (ORDER) { \ case _Py_memory_order_acquire: \ - _InterlockedExchange64_acq((__int64 volatile*)ATOMIC_VAL, (__int64)NEW_VAL); \ + _InterlockedExchange64_acq((__int64 volatile*)&((ATOMIC_VAL)->_value), (__int64)NEW_VAL); \ break; \ case _Py_memory_order_release: \ - _InterlockedExchange64_rel((__int64 volatile*)ATOMIC_VAL, (__int64)NEW_VAL); \ + _InterlockedExchange64_rel((__int64 volatile*)&((ATOMIC_VAL)->_value), (__int64)NEW_VAL); \ break; \ default: \ - _InterlockedExchange64((__int64 volatile*)ATOMIC_VAL, (__int64)NEW_VAL); \ + _InterlockedExchange64((__int64 volatile*)&((ATOMIC_VAL)->_value), (__int64)NEW_VAL); \ break; \ } #else @@ -407,13 +407,13 @@ typedef struct _Py_atomic_int { #define _Py_atomic_store_32bit(ATOMIC_VAL, NEW_VAL, ORDER) \ switch (ORDER) { \ case _Py_memory_order_acquire: \ - _InterlockedExchange_acq((volatile long*)ATOMIC_VAL, (int)NEW_VAL); \ + _InterlockedExchange_acq((volatile long*)&((ATOMIC_VAL)->_value), (int)NEW_VAL); \ break; \ case _Py_memory_order_release: \ - _InterlockedExchange_rel((volatile long*)ATOMIC_VAL, (int)NEW_VAL); \ + _InterlockedExchange_rel((volatile long*)&((ATOMIC_VAL)->_value), (int)NEW_VAL); \ break; \ default: \ - _InterlockedExchange((volatile long*)ATOMIC_VAL, (int)NEW_VAL); \ + _InterlockedExchange((volatile long*)&((ATOMIC_VAL)->_value), (int)NEW_VAL); \ break; \ } @@ -454,7 +454,7 @@ inline intptr_t _Py_atomic_load_64bit(volatile uintptr_t* value, int order) { } #else -#define _Py_atomic_load_64bit(ATOMIC_VAL, ORDER) *ATOMIC_VAL +#define _Py_atomic_load_64bit(ATOMIC_VAL, ORDER) *(ATOMIC_VAL) #endif inline int _Py_atomic_load_32bit(volatile int* value, int order) { @@ -489,15 +489,15 @@ inline int _Py_atomic_load_32bit(volatile int* value, int order) { } #define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ - if (sizeof(*ATOMIC_VAL._value) == 8) { \ - _Py_atomic_store_64bit(ATOMIC_VAL._value, NEW_VAL, ORDER) } else { \ - _Py_atomic_store_32bit(ATOMIC_VAL._value, NEW_VAL, ORDER) } + if (sizeof((ATOMIC_VAL)->_value) == 8) { \ + _Py_atomic_store_64bit(&((ATOMIC_VAL)->_value), NEW_VAL, ORDER) } else { \ + _Py_atomic_store_32bit(&((ATOMIC_VAL)->_value), NEW_VAL, ORDER) } #define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ ( \ - sizeof(*(ATOMIC_VAL._value)) == 8 ? \ - _Py_atomic_load_64bit(ATOMIC_VAL._value, ORDER) : \ - _Py_atomic_load_32bit(ATOMIC_VAL._value, ORDER) \ + sizeof((ATOMIC_VAL)->_value) == 8 ? \ + _Py_atomic_load_64bit(&((ATOMIC_VAL)->_value), ORDER) : \ + _Py_atomic_load_32bit(&((ATOMIC_VAL)->_value), ORDER) \ ) #endif #else /* !gcc x86 !_msc_ver */ diff --git a/Python/ceval.c b/Python/ceval.c index 68c1617c78f2..be75ade909d7 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -637,6 +637,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) PyObject **fastlocals, **freevars; PyObject *retval = NULL; /* Return value */ PyThreadState *tstate = _PyThreadState_GET(); + _Py_atomic_int *eval_breaker = &tstate->interp->ceval.eval_breaker; PyCodeObject *co; /* when tracing we set things up so that @@ -722,7 +723,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) #define DISPATCH() \ { \ - if (!_Py_atomic_load_relaxed(&tstate->interp->ceval.eval_breaker)) { \ + if (!_Py_atomic_load_relaxed(eval_breaker)) { \ FAST_DISPATCH(); \ } \ continue; \ @@ -1024,7 +1025,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) async I/O handler); see Py_AddPendingCall() and Py_MakePendingCalls() above. */ - if (_Py_atomic_load_relaxed(&(tstate->interp->ceval.eval_breaker))) { + if (_Py_atomic_load_relaxed(eval_breaker)) { opcode = _Py_OPCODE(*next_instr); if (opcode == SETUP_FINALLY || opcode == SETUP_WITH || From webhook-mailer at python.org Fri Mar 1 15:40:59 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 01 Mar 2019 20:40:59 -0000 Subject: [Python-checkins] bpo-36043: FileCookieJar supports os.PathLike (GH-11945) Message-ID: https://github.com/python/cpython/commit/4b219ce81ed04234648a4ce4f0cb0865818abb38 commit: 4b219ce81ed04234648a4ce4f0cb0865818abb38 branch: master author: St?phane Wirtel committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-01T12:40:54-08:00 summary: bpo-36043: FileCookieJar supports os.PathLike (GH-11945) https://bugs.python.org/issue36043 files: A Misc/NEWS.d/next/Library/2019-02-19-19-53-46.bpo-36043.l867v0.rst M Doc/library/http.cookiejar.rst M Lib/http/cookiejar.py M Lib/test/test_http_cookiejar.py diff --git a/Doc/library/http.cookiejar.rst b/Doc/library/http.cookiejar.rst index 4c8be2917b22..a9d7321a42c4 100644 --- a/Doc/library/http.cookiejar.rst +++ b/Doc/library/http.cookiejar.rst @@ -71,6 +71,10 @@ The following classes are provided: :meth:`load` or :meth:`revert` method is called. Subclasses of this class are documented in section :ref:`file-cookie-jar-classes`. + .. versionchanged:: 3.8 + + The filename parameter supports a :term:`path-like object`. + .. class:: CookiePolicy() @@ -341,6 +345,9 @@ writing. compatible with the libwww-perl library's ``Set-Cookie3`` file format. This is convenient if you want to store cookies in a human-readable file. + .. versionchanged:: 3.8 + + The filename parameter supports a :term:`path-like object`. .. _cookie-policy-objects: diff --git a/Lib/http/cookiejar.py b/Lib/http/cookiejar.py index 0ba8200f325a..befe7653c530 100644 --- a/Lib/http/cookiejar.py +++ b/Lib/http/cookiejar.py @@ -28,6 +28,7 @@ __all__ = ['Cookie', 'CookieJar', 'CookiePolicy', 'DefaultCookiePolicy', 'FileCookieJar', 'LWPCookieJar', 'LoadError', 'MozillaCookieJar'] +import os import copy import datetime import re @@ -1762,10 +1763,7 @@ def __init__(self, filename=None, delayload=False, policy=None): """ CookieJar.__init__(self, policy) if filename is not None: - try: - filename+"" - except: - raise ValueError("filename must be string-like") + filename = os.fspath(filename) self.filename = filename self.delayload = bool(delayload) diff --git a/Lib/test/test_http_cookiejar.py b/Lib/test/test_http_cookiejar.py index 8dbea3325d9b..170549caf5b4 100644 --- a/Lib/test/test_http_cookiejar.py +++ b/Lib/test/test_http_cookiejar.py @@ -6,6 +6,7 @@ import time import unittest import urllib.request +import pathlib from http.cookiejar import (time2isoz, http2time, iso2time, time2netscape, parse_ns_headers, join_header_words, split_header_words, Cookie, @@ -313,6 +314,30 @@ def _interact(cookiejar, url, set_cookie_hdrs, hdr_name): class FileCookieJarTests(unittest.TestCase): + def test_constructor_with_str(self): + filename = test.support.TESTFN + c = LWPCookieJar(filename) + self.assertEqual(c.filename, filename) + + def test_constructor_with_path_like(self): + filename = pathlib.Path(test.support.TESTFN) + c = LWPCookieJar(filename) + self.assertEqual(c.filename, os.fspath(filename)) + + def test_constructor_with_none(self): + c = LWPCookieJar(None) + self.assertIsNone(c.filename) + + def test_constructor_with_other_types(self): + class A: + pass + + for type_ in (int, float, A): + with self.subTest(filename=type_): + with self.assertRaises(TypeError): + instance = type_() + c = LWPCookieJar(filename=instance) + def test_lwp_valueless_cookie(self): # cookies with no value should be saved and loaded consistently filename = test.support.TESTFN diff --git a/Misc/NEWS.d/next/Library/2019-02-19-19-53-46.bpo-36043.l867v0.rst b/Misc/NEWS.d/next/Library/2019-02-19-19-53-46.bpo-36043.l867v0.rst new file mode 100644 index 000000000000..f4911a0c8d0a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-02-19-19-53-46.bpo-36043.l867v0.rst @@ -0,0 +1 @@ +:class:`FileCookieJar` supports :term:`path-like object`. Contributed by St?phane Wirtel From webhook-mailer at python.org Fri Mar 1 17:53:54 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Fri, 01 Mar 2019 22:53:54 -0000 Subject: [Python-checkins] bpo-32129: Avoid blurry IDLE application icon on macOS with Tk 8.6. (GH-12031) Message-ID: https://github.com/python/cpython/commit/7eebbbd5b3907447eddadf5cb7cb1cc9230d15b2 commit: 7eebbbd5b3907447eddadf5cb7cb1cc9230d15b2 branch: master author: Ned Deily committer: Terry Jan Reedy date: 2019-03-01T17:53:50-05:00 summary: bpo-32129: Avoid blurry IDLE application icon on macOS with Tk 8.6. (GH-12031) Patch by Kevin Walzer. files: A Misc/NEWS.d/next/IDLE/2019-02-25-11-40-14.bpo-32129.4qVCzD.rst M Lib/idlelib/pyshell.py diff --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py index ea49aff08b43..11bafdb49aaa 100755 --- a/Lib/idlelib/pyshell.py +++ b/Lib/idlelib/pyshell.py @@ -1495,7 +1495,7 @@ def main(): if system() == 'Windows': iconfile = os.path.join(icondir, 'idle.ico') root.wm_iconbitmap(default=iconfile) - else: + elif not macosx.isAquaTk(): ext = '.png' if TkVersion >= 8.6 else '.gif' iconfiles = [os.path.join(icondir, 'idle_%d%s' % (size, ext)) for size in (16, 32, 48)] diff --git a/Misc/NEWS.d/next/IDLE/2019-02-25-11-40-14.bpo-32129.4qVCzD.rst b/Misc/NEWS.d/next/IDLE/2019-02-25-11-40-14.bpo-32129.4qVCzD.rst new file mode 100644 index 000000000000..54a5c7244140 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-02-25-11-40-14.bpo-32129.4qVCzD.rst @@ -0,0 +1,2 @@ +Avoid blurry IDLE application icon on macOS with Tk 8.6. Patch by Kevin +Walzer. From webhook-mailer at python.org Fri Mar 1 18:12:49 2019 From: webhook-mailer at python.org (Ned Deily) Date: Fri, 01 Mar 2019 23:12:49 -0000 Subject: [Python-checkins] bpo-32129: Avoid blurry IDLE application icon on macOS with Tk 8.6. Original patch by Kevin Walzer. (GH-12034) Message-ID: https://github.com/python/cpython/commit/453100f60e3c297226eaf0b0b4eb8c817a73b5ce commit: 453100f60e3c297226eaf0b0b4eb8c817a73b5ce branch: 2.7 author: Ned Deily committer: GitHub date: 2019-03-01T18:12:45-05:00 summary: bpo-32129: Avoid blurry IDLE application icon on macOS with Tk 8.6. Original patch by Kevin Walzer. (GH-12034) files: A Misc/NEWS.d/next/IDLE/2019-02-25-12-59-24.bpo-32129.4qVCzD.rst M Lib/idlelib/PyShell.py diff --git a/Lib/idlelib/PyShell.py b/Lib/idlelib/PyShell.py index db854b65e22a..2ea7e6b939a6 100755 --- a/Lib/idlelib/PyShell.py +++ b/Lib/idlelib/PyShell.py @@ -1560,7 +1560,7 @@ def main(): if system() == 'Windows': iconfile = os.path.join(icondir, 'idle.ico') root.wm_iconbitmap(default=iconfile) - elif TkVersion >= 8.5: + elif TkVersion >= 8.5 and sys.platform != 'darwin': ext = '.png' if TkVersion >= 8.6 else '.gif' iconfiles = [os.path.join(icondir, 'idle_%d%s' % (size, ext)) for size in (16, 32, 48)] diff --git a/Misc/NEWS.d/next/IDLE/2019-02-25-12-59-24.bpo-32129.4qVCzD.rst b/Misc/NEWS.d/next/IDLE/2019-02-25-12-59-24.bpo-32129.4qVCzD.rst new file mode 100644 index 000000000000..54a5c7244140 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-02-25-12-59-24.bpo-32129.4qVCzD.rst @@ -0,0 +1,2 @@ +Avoid blurry IDLE application icon on macOS with Tk 8.6. Patch by Kevin +Walzer. From webhook-mailer at python.org Fri Mar 1 18:14:02 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 01 Mar 2019 23:14:02 -0000 Subject: [Python-checkins] bpo-32129: Avoid blurry IDLE application icon on macOS with Tk 8.6. (GH-12031) Message-ID: https://github.com/python/cpython/commit/243b2064ce4fb7f90e69f9a4fa9c7e7ec70eba17 commit: 243b2064ce4fb7f90e69f9a4fa9c7e7ec70eba17 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-01T15:13:57-08:00 summary: bpo-32129: Avoid blurry IDLE application icon on macOS with Tk 8.6. (GH-12031) Patch by Kevin Walzer. (cherry picked from commit 7eebbbd5b3907447eddadf5cb7cb1cc9230d15b2) Co-authored-by: Ned Deily files: A Misc/NEWS.d/next/IDLE/2019-02-25-11-40-14.bpo-32129.4qVCzD.rst M Lib/idlelib/pyshell.py diff --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py index ea49aff08b43..11bafdb49aaa 100755 --- a/Lib/idlelib/pyshell.py +++ b/Lib/idlelib/pyshell.py @@ -1495,7 +1495,7 @@ def main(): if system() == 'Windows': iconfile = os.path.join(icondir, 'idle.ico') root.wm_iconbitmap(default=iconfile) - else: + elif not macosx.isAquaTk(): ext = '.png' if TkVersion >= 8.6 else '.gif' iconfiles = [os.path.join(icondir, 'idle_%d%s' % (size, ext)) for size in (16, 32, 48)] diff --git a/Misc/NEWS.d/next/IDLE/2019-02-25-11-40-14.bpo-32129.4qVCzD.rst b/Misc/NEWS.d/next/IDLE/2019-02-25-11-40-14.bpo-32129.4qVCzD.rst new file mode 100644 index 000000000000..54a5c7244140 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-02-25-11-40-14.bpo-32129.4qVCzD.rst @@ -0,0 +1,2 @@ +Avoid blurry IDLE application icon on macOS with Tk 8.6. Patch by Kevin +Walzer. From webhook-mailer at python.org Fri Mar 1 18:34:47 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Fri, 01 Mar 2019 23:34:47 -0000 Subject: [Python-checkins] bpo-35808: Retire pgen and use pgen2 to generate the parser (GH-11814) Message-ID: https://github.com/python/cpython/commit/1f24a719e7be5e49b876a5dc7daf21d01ee69faa commit: 1f24a719e7be5e49b876a5dc7daf21d01ee69faa branch: master author: Pablo Galindo committer: GitHub date: 2019-03-01T15:34:44-08:00 summary: bpo-35808: Retire pgen and use pgen2 to generate the parser (GH-11814) Pgen is the oldest piece of technology in the CPython repository, building it requires various #if[n]def PGEN hacks in other parts of the code and it also depends more and more on CPython internals. This commit removes the old pgen C code and replaces it for a new version implemented in pure Python. This is a modified and adapted version of lib2to3/pgen2 that can generate grammar files compatibles with the current parser. This commit also eliminates all the #ifdef and code branches related to pgen, simplifying the code and making it more maintainable. The regen-grammar step now uses $(PYTHON_FOR_REGEN) that can be any version of the interpreter, so the new pgen code maintains compatibility with older versions of the interpreter (this also allows regenerating the grammar with the current CI solution that uses Python3.5). The new pgen Python module also makes use of the Grammar/Tokens file that holds the token specification, so is always kept in sync and avoids having to maintain duplicate token definitions. files: A Misc/NEWS.d/next/Core and Builtins/2019-02-11-00-50-03.bpo-11814.M12CMH.rst A Parser/pgen/__init__.py A Parser/pgen/__main__.py A Parser/pgen/grammar.py A Parser/pgen/pgen.py A Parser/pgen/token.py D Include/metagrammar.h D Include/pgen.h D Parser/bitset.c D Parser/firstsets.c D Parser/grammar.c D Parser/metagrammar.c D Parser/parsetok_pgen.c D Parser/pgen.c D Parser/pgenmain.c D Parser/printgrammar.c D Parser/tokenizer_pgen.c M .gitignore M Include/parsetok.h M Makefile.pre.in M Misc/coverity_model.c M PCbuild/pythoncore.vcxproj M PCbuild/pythoncore.vcxproj.filters M Parser/parsetok.c M Parser/tokenizer.c M Parser/tokenizer.h M Python/graminit.c diff --git a/.gitignore b/.gitignore index 7ee9e6d875ec..9e60f5a20690 100644 --- a/.gitignore +++ b/.gitignore @@ -73,8 +73,6 @@ PCbuild/arm32/ PCbuild/obj/ PCbuild/win32/ .purify -Parser/pgen -Parser/pgen.exe __pycache__ autom4te.cache build/ diff --git a/Include/metagrammar.h b/Include/metagrammar.h deleted file mode 100644 index 15c8ef8f3f1a..000000000000 --- a/Include/metagrammar.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef Py_METAGRAMMAR_H -#define Py_METAGRAMMAR_H -#ifdef __cplusplus -extern "C" { -#endif - - -#define MSTART 256 -#define RULE 257 -#define RHS 258 -#define ALT 259 -#define ITEM 260 -#define ATOM 261 - -#ifdef __cplusplus -} -#endif -#endif /* !Py_METAGRAMMAR_H */ diff --git a/Include/parsetok.h b/Include/parsetok.h index e95dd31fb79a..be49f0005ac6 100644 --- a/Include/parsetok.h +++ b/Include/parsetok.h @@ -12,10 +12,7 @@ extern "C" { typedef struct { int error; -#ifndef PGEN - /* The filename is useless for pgen, see comment in tok_state structure */ PyObject *filename; -#endif int lineno; int offset; char *text; /* UTF-8-encoded string */ diff --git a/Include/pgen.h b/Include/pgen.h deleted file mode 100644 index 8a325ed07488..000000000000 --- a/Include/pgen.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef Py_PGEN_H -#define Py_PGEN_H -#ifdef __cplusplus -extern "C" { -#endif - - -/* Parser generator interface */ - -extern grammar *meta_grammar(void); - -struct _node; -extern grammar *pgen(struct _node *); - -#ifdef __cplusplus -} -#endif -#endif /* !Py_PGEN_H */ diff --git a/Makefile.pre.in b/Makefile.pre.in index 5ae69480bf16..135c3230292b 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -290,40 +290,21 @@ LIBFFI_INCLUDEDIR= @LIBFFI_INCLUDEDIR@ ########################################################################## # Parser -PGEN= Parser/pgen$(EXE) - POBJS= \ Parser/acceler.o \ Parser/grammar1.o \ Parser/listnode.o \ Parser/node.o \ Parser/parser.o \ - Parser/bitset.o \ - Parser/metagrammar.o \ - Parser/firstsets.o \ - Parser/grammar.o \ Parser/token.o \ - Parser/pgen.o PARSER_OBJS= $(POBJS) Parser/myreadline.o Parser/parsetok.o Parser/tokenizer.o -PGOBJS= \ - Objects/obmalloc.o \ - Python/dynamic_annotations.o \ - Python/mysnprintf.o \ - Python/pyctype.o \ - Parser/tokenizer_pgen.o \ - Parser/printgrammar.o \ - Parser/parsetok_pgen.o \ - Parser/pgenmain.o - PARSER_HEADERS= \ $(srcdir)/Parser/parser.h \ $(srcdir)/Include/parsetok.h \ $(srcdir)/Parser/tokenizer.h -PGENOBJS= $(POBJS) $(PGOBJS) - ########################################################################## # Python @@ -802,31 +783,18 @@ Python/sysmodule.o: $(srcdir)/Python/sysmodule.c Makefile $(IO_OBJS): $(IO_H) -$(PGEN): $(PGENOBJS) - $(CC) $(OPT) $(PY_CORE_LDFLAGS) $(PGENOBJS) $(LIBS) -o $(PGEN) - .PHONY: regen-grammar -regen-grammar: $(PGEN) +regen-grammar: regen-token # Regenerate Include/graminit.h and Python/graminit.c # from Grammar/Grammar using pgen @$(MKDIR_P) Include - $(PGEN) $(srcdir)/Grammar/Grammar \ + $(PYTHON_FOR_REGEN) -m Parser.pgen $(srcdir)/Grammar/Grammar \ + $(srcdir)/Grammar/Tokens \ $(srcdir)/Include/graminit.h.new \ $(srcdir)/Python/graminit.c.new $(UPDATE_FILE) $(srcdir)/Include/graminit.h $(srcdir)/Include/graminit.h.new $(UPDATE_FILE) $(srcdir)/Python/graminit.c $(srcdir)/Python/graminit.c.new -Parser/grammar.o: $(srcdir)/Parser/grammar.c \ - $(srcdir)/Include/token.h \ - $(srcdir)/Include/grammar.h -Parser/metagrammar.o: $(srcdir)/Parser/metagrammar.c - -Parser/tokenizer_pgen.o: $(srcdir)/Parser/tokenizer.c -Parser/parsetok_pgen.o: $(srcdir)/Parser/parsetok.c -Parser/printgrammar.o: $(srcdir)/Parser/printgrammar.c - -Parser/pgenmain.o: $(srcdir)/Include/parsetok.h - .PHONY=regen-ast regen-ast: # Regenerate Include/Python-ast.h using Parser/asdl_c.py -h @@ -1016,7 +984,6 @@ PYTHON_HEADERS= \ $(srcdir)/Include/longobject.h \ $(srcdir)/Include/marshal.h \ $(srcdir)/Include/memoryobject.h \ - $(srcdir)/Include/metagrammar.h \ $(srcdir)/Include/methodobject.h \ $(srcdir)/Include/modsupport.h \ $(srcdir)/Include/moduleobject.h \ @@ -1028,7 +995,6 @@ PYTHON_HEADERS= \ $(srcdir)/Include/osdefs.h \ $(srcdir)/Include/osmodule.h \ $(srcdir)/Include/patchlevel.h \ - $(srcdir)/Include/pgen.h \ $(srcdir)/Include/pgenheaders.h \ $(srcdir)/Include/pyarena.h \ $(srcdir)/Include/pycapsule.h \ @@ -1771,7 +1737,7 @@ profile-removal: rm -f profile-run-stamp clobber: clean profile-removal - -rm -f $(BUILDPYTHON) $(PGEN) $(LIBRARY) $(LDLIBRARY) $(DLLLIBRARY) \ + -rm -f $(BUILDPYTHON) $(LIBRARY) $(LDLIBRARY) $(DLLLIBRARY) \ tags TAGS \ config.cache config.log pyconfig.h Modules/config.c -rm -rf build platform diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-02-11-00-50-03.bpo-11814.M12CMH.rst b/Misc/NEWS.d/next/Core and Builtins/2019-02-11-00-50-03.bpo-11814.M12CMH.rst new file mode 100644 index 000000000000..b3bec728d9dd --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-02-11-00-50-03.bpo-11814.M12CMH.rst @@ -0,0 +1,2 @@ +Retire pgen and use a modified version of pgen2 to generate the parser. +Patch by Pablo Galindo. diff --git a/Misc/coverity_model.c b/Misc/coverity_model.c index 1ae617911ce6..8960362a6d74 100644 --- a/Misc/coverity_model.c +++ b/Misc/coverity_model.c @@ -92,14 +92,6 @@ wchar_t *Py_DecodeLocale(const char* arg, size_t *size) return w; } -/* Parser/pgenmain.c */ -grammar *getgrammar(const char *filename) -{ - grammar *g; - __coverity_tainted_data_sink__(filename); - return g; -} - /* Python/marshal.c */ static Py_ssize_t r_string(char *s, Py_ssize_t n, RFILE *p) diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 992c84f8cc81..bff7b95a84ae 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -161,7 +161,6 @@ - @@ -175,7 +174,6 @@ - @@ -372,12 +370,8 @@ - - - - diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 293bded66c31..03030744b155 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -234,9 +234,6 @@ Include - - Include - Include @@ -270,9 +267,6 @@ Include - - Include - Include @@ -836,24 +830,12 @@ Parser - - Parser - - - Parser - - - Parser - Parser Parser - - Parser - Parser diff --git a/Parser/bitset.c b/Parser/bitset.c deleted file mode 100644 index f5bfd41bd653..000000000000 --- a/Parser/bitset.c +++ /dev/null @@ -1,66 +0,0 @@ - -/* Bitset primitives used by the parser generator */ - -#include "pgenheaders.h" -#include "bitset.h" - -bitset -newbitset(int nbits) -{ - int nbytes = NBYTES(nbits); - bitset ss = (char *)PyObject_MALLOC(sizeof(BYTE) * nbytes); - - if (ss == NULL) - Py_FatalError("no mem for bitset"); - - ss += nbytes; - while (--nbytes >= 0) - *--ss = 0; - return ss; -} - -void -delbitset(bitset ss) -{ - PyObject_FREE(ss); -} - -int -addbit(bitset ss, int ibit) -{ - int ibyte = BIT2BYTE(ibit); - BYTE mask = BIT2MASK(ibit); - - if (ss[ibyte] & mask) - return 0; /* Bit already set */ - ss[ibyte] |= mask; - return 1; -} - -#if 0 /* Now a macro */ -int -testbit(bitset ss, int ibit) -{ - return (ss[BIT2BYTE(ibit)] & BIT2MASK(ibit)) != 0; -} -#endif - -int -samebitset(bitset ss1, bitset ss2, int nbits) -{ - int i; - - for (i = NBYTES(nbits); --i >= 0; ) - if (*ss1++ != *ss2++) - return 0; - return 1; -} - -void -mergebitset(bitset ss1, bitset ss2, int nbits) -{ - int i; - - for (i = NBYTES(nbits); --i >= 0; ) - *ss1++ |= *ss2++; -} diff --git a/Parser/firstsets.c b/Parser/firstsets.c deleted file mode 100644 index ee75d1bfe067..000000000000 --- a/Parser/firstsets.c +++ /dev/null @@ -1,113 +0,0 @@ - -/* Computation of FIRST stets */ - -#include "pgenheaders.h" -#include "grammar.h" -#include "token.h" - -extern int Py_DebugFlag; - -/* Forward */ -static void calcfirstset(grammar *, dfa *); - -void -addfirstsets(grammar *g) -{ - int i; - dfa *d; - - if (Py_DebugFlag) - printf("Adding FIRST sets ...\n"); - for (i = 0; i < g->g_ndfas; i++) { - d = &g->g_dfa[i]; - if (d->d_first == NULL) - calcfirstset(g, d); - } -} - -static void -calcfirstset(grammar *g, dfa *d) -{ - int i, j; - state *s; - arc *a; - int nsyms; - int *sym; - int nbits; - static bitset dummy; - bitset result; - int type; - dfa *d1; - label *l0; - - if (Py_DebugFlag) - printf("Calculate FIRST set for '%s'\n", d->d_name); - - if (dummy == NULL) - dummy = newbitset(1); - if (d->d_first == dummy) { - fprintf(stderr, "Left-recursion for '%s'\n", d->d_name); - return; - } - if (d->d_first != NULL) { - fprintf(stderr, "Re-calculating FIRST set for '%s' ???\n", - d->d_name); - } - d->d_first = dummy; - - l0 = g->g_ll.ll_label; - nbits = g->g_ll.ll_nlabels; - result = newbitset(nbits); - - sym = (int *)PyObject_MALLOC(sizeof(int)); - if (sym == NULL) - Py_FatalError("no mem for new sym in calcfirstset"); - nsyms = 1; - sym[0] = findlabel(&g->g_ll, d->d_type, (char *)NULL); - - s = &d->d_state[d->d_initial]; - for (i = 0; i < s->s_narcs; i++) { - a = &s->s_arc[i]; - for (j = 0; j < nsyms; j++) { - if (sym[j] == a->a_lbl) - break; - } - if (j >= nsyms) { /* New label */ - sym = (int *)PyObject_REALLOC(sym, - sizeof(int) * (nsyms + 1)); - if (sym == NULL) - Py_FatalError( - "no mem to resize sym in calcfirstset"); - sym[nsyms++] = a->a_lbl; - type = l0[a->a_lbl].lb_type; - if (ISNONTERMINAL(type)) { - d1 = PyGrammar_FindDFA(g, type); - if (d1->d_first == dummy) { - fprintf(stderr, - "Left-recursion below '%s'\n", - d->d_name); - } - else { - if (d1->d_first == NULL) - calcfirstset(g, d1); - mergebitset(result, - d1->d_first, nbits); - } - } - else if (ISTERMINAL(type)) { - addbit(result, a->a_lbl); - } - } - } - d->d_first = result; - if (Py_DebugFlag) { - printf("FIRST set for '%s': {", d->d_name); - for (i = 0; i < nbits; i++) { - if (testbit(result, i)) - printf(" %s", PyGrammar_LabelRepr(&l0[i])); - } - printf(" }\n"); - } - - PyObject_FREE(sym); -} diff --git a/Parser/grammar.c b/Parser/grammar.c deleted file mode 100644 index 75fd5b9cde50..000000000000 --- a/Parser/grammar.c +++ /dev/null @@ -1,273 +0,0 @@ - -/* Grammar implementation */ - -#include "Python.h" -#include "pgenheaders.h" - -#include - -#include "token.h" -#include "grammar.h" - -extern int Py_DebugFlag; - -grammar * -newgrammar(int start) -{ - grammar *g; - - g = (grammar *)PyObject_MALLOC(sizeof(grammar)); - if (g == NULL) - Py_FatalError("no mem for new grammar"); - g->g_ndfas = 0; - g->g_dfa = NULL; - g->g_start = start; - g->g_ll.ll_nlabels = 0; - g->g_ll.ll_label = NULL; - g->g_accel = 0; - return g; -} - -void -freegrammar(grammar *g) -{ - int i; - for (i = 0; i < g->g_ndfas; i++) { - free(g->g_dfa[i].d_name); - for (int j = 0; j < g->g_dfa[i].d_nstates; j++) - PyObject_FREE(g->g_dfa[i].d_state[j].s_arc); - PyObject_FREE(g->g_dfa[i].d_state); - } - PyObject_FREE(g->g_dfa); - for (i = 0; i < g->g_ll.ll_nlabels; i++) - free(g->g_ll.ll_label[i].lb_str); - PyObject_FREE(g->g_ll.ll_label); - PyObject_FREE(g); -} - -dfa * -adddfa(grammar *g, int type, const char *name) -{ - dfa *d; - - g->g_dfa = (dfa *)PyObject_REALLOC(g->g_dfa, - sizeof(dfa) * (g->g_ndfas + 1)); - if (g->g_dfa == NULL) - Py_FatalError("no mem to resize dfa in adddfa"); - d = &g->g_dfa[g->g_ndfas++]; - d->d_type = type; - d->d_name = strdup(name); - d->d_nstates = 0; - d->d_state = NULL; - d->d_initial = -1; - d->d_first = NULL; - return d; /* Only use while fresh! */ -} - -int -addstate(dfa *d) -{ - state *s; - - d->d_state = (state *)PyObject_REALLOC(d->d_state, - sizeof(state) * (d->d_nstates + 1)); - if (d->d_state == NULL) - Py_FatalError("no mem to resize state in addstate"); - s = &d->d_state[d->d_nstates++]; - s->s_narcs = 0; - s->s_arc = NULL; - s->s_lower = 0; - s->s_upper = 0; - s->s_accel = NULL; - s->s_accept = 0; - return Py_SAFE_DOWNCAST(s - d->d_state, intptr_t, int); -} - -void -addarc(dfa *d, int from, int to, int lbl) -{ - state *s; - arc *a; - - assert(0 <= from && from < d->d_nstates); - assert(0 <= to && to < d->d_nstates); - - s = &d->d_state[from]; - s->s_arc = (arc *)PyObject_REALLOC(s->s_arc, sizeof(arc) * (s->s_narcs + 1)); - if (s->s_arc == NULL) - Py_FatalError("no mem to resize arc list in addarc"); - a = &s->s_arc[s->s_narcs++]; - a->a_lbl = lbl; - a->a_arrow = to; -} - -int -addlabel(labellist *ll, int type, const char *str) -{ - int i; - label *lb; - - for (i = 0; i < ll->ll_nlabels; i++) { - if (ll->ll_label[i].lb_type == type && - strcmp(ll->ll_label[i].lb_str, str) == 0) - return i; - } - ll->ll_label = (label *)PyObject_REALLOC(ll->ll_label, - sizeof(label) * (ll->ll_nlabels + 1)); - if (ll->ll_label == NULL) - Py_FatalError("no mem to resize labellist in addlabel"); - lb = &ll->ll_label[ll->ll_nlabels++]; - lb->lb_type = type; - lb->lb_str = strdup(str); - if (Py_DebugFlag) - printf("Label @ %8p, %d: %s\n", ll, ll->ll_nlabels, - PyGrammar_LabelRepr(lb)); - return Py_SAFE_DOWNCAST(lb - ll->ll_label, intptr_t, int); -} - -/* Same, but rather dies than adds */ - -int -findlabel(labellist *ll, int type, const char *str) -{ - int i; - - for (i = 0; i < ll->ll_nlabels; i++) { - if (ll->ll_label[i].lb_type == type /*&& - strcmp(ll->ll_label[i].lb_str, str) == 0*/) - return i; - } - fprintf(stderr, "Label %d/'%s' not found\n", type, str); - Py_FatalError("grammar.c:findlabel()"); - - /* Py_FatalError() is declared with __attribute__((__noreturn__)). - GCC emits a warning without "return 0;" (compiler bug!), but Clang is - smarter and emits a warning on the return... */ -#ifndef __clang__ - return 0; /* Make gcc -Wall happy */ -#endif -} - -/* Forward */ -static void translabel(grammar *, label *); - -void -translatelabels(grammar *g) -{ - int i; - -#ifdef Py_DEBUG - printf("Translating labels ...\n"); -#endif - /* Don't translate EMPTY */ - for (i = EMPTY+1; i < g->g_ll.ll_nlabels; i++) - translabel(g, &g->g_ll.ll_label[i]); -} - -static void -translabel(grammar *g, label *lb) -{ - int i; - - if (Py_DebugFlag) - printf("Translating label %s ...\n", PyGrammar_LabelRepr(lb)); - - if (lb->lb_type == NAME) { - for (i = 0; i < g->g_ndfas; i++) { - if (strcmp(lb->lb_str, g->g_dfa[i].d_name) == 0) { - if (Py_DebugFlag) - printf( - "Label %s is non-terminal %d.\n", - lb->lb_str, - g->g_dfa[i].d_type); - lb->lb_type = g->g_dfa[i].d_type; - free(lb->lb_str); - lb->lb_str = NULL; - return; - } - } - for (i = 0; i < (int)N_TOKENS; i++) { - if (strcmp(lb->lb_str, _PyParser_TokenNames[i]) == 0) { - if (Py_DebugFlag) - printf("Label %s is terminal %d.\n", - lb->lb_str, i); - lb->lb_type = i; - free(lb->lb_str); - lb->lb_str = NULL; - return; - } - } - printf("Can't translate NAME label '%s'\n", lb->lb_str); - return; - } - - if (lb->lb_type == STRING) { - if (isalpha(Py_CHARMASK(lb->lb_str[1])) || - lb->lb_str[1] == '_') { - char *p; - char *src; - char *dest; - size_t name_len; - if (Py_DebugFlag) - printf("Label %s is a keyword\n", lb->lb_str); - lb->lb_type = NAME; - src = lb->lb_str + 1; - p = strchr(src, '\''); - if (p) - name_len = p - src; - else - name_len = strlen(src); - dest = (char *)malloc(name_len + 1); - if (!dest) { - printf("Can't alloc dest '%s'\n", src); - return; - } - strncpy(dest, src, name_len); - dest[name_len] = '\0'; - free(lb->lb_str); - lb->lb_str = dest; - } - else if (lb->lb_str[2] == lb->lb_str[0]) { - int type = (int) PyToken_OneChar(lb->lb_str[1]); - if (type != OP) { - lb->lb_type = type; - free(lb->lb_str); - lb->lb_str = NULL; - } - else - printf("Unknown OP label %s\n", - lb->lb_str); - } - else if (lb->lb_str[2] && lb->lb_str[3] == lb->lb_str[0]) { - int type = (int) PyToken_TwoChars(lb->lb_str[1], - lb->lb_str[2]); - if (type != OP) { - lb->lb_type = type; - free(lb->lb_str); - lb->lb_str = NULL; - } - else - printf("Unknown OP label %s\n", - lb->lb_str); - } - else if (lb->lb_str[2] && lb->lb_str[3] && lb->lb_str[4] == lb->lb_str[0]) { - int type = (int) PyToken_ThreeChars(lb->lb_str[1], - lb->lb_str[2], - lb->lb_str[3]); - if (type != OP) { - lb->lb_type = type; - free(lb->lb_str); - lb->lb_str = NULL; - } - else - printf("Unknown OP label %s\n", - lb->lb_str); - } - else - printf("Can't translate STRING label %s\n", - lb->lb_str); - } - else - printf("Can't translate label '%s'\n", - PyGrammar_LabelRepr(lb)); -} diff --git a/Parser/metagrammar.c b/Parser/metagrammar.c deleted file mode 100644 index 53810b812552..000000000000 --- a/Parser/metagrammar.c +++ /dev/null @@ -1,159 +0,0 @@ - -#include "pgenheaders.h" -#include "metagrammar.h" -#include "grammar.h" -#include "pgen.h" -static arc arcs_0_0[3] = { - {2, 0}, - {3, 0}, - {4, 1}, -}; -static arc arcs_0_1[1] = { - {0, 1}, -}; -static state states_0[2] = { - {3, arcs_0_0}, - {1, arcs_0_1}, -}; -static arc arcs_1_0[1] = { - {5, 1}, -}; -static arc arcs_1_1[1] = { - {6, 2}, -}; -static arc arcs_1_2[1] = { - {7, 3}, -}; -static arc arcs_1_3[1] = { - {3, 4}, -}; -static arc arcs_1_4[1] = { - {0, 4}, -}; -static state states_1[5] = { - {1, arcs_1_0}, - {1, arcs_1_1}, - {1, arcs_1_2}, - {1, arcs_1_3}, - {1, arcs_1_4}, -}; -static arc arcs_2_0[1] = { - {8, 1}, -}; -static arc arcs_2_1[2] = { - {9, 0}, - {0, 1}, -}; -static state states_2[2] = { - {1, arcs_2_0}, - {2, arcs_2_1}, -}; -static arc arcs_3_0[1] = { - {10, 1}, -}; -static arc arcs_3_1[2] = { - {10, 1}, - {0, 1}, -}; -static state states_3[2] = { - {1, arcs_3_0}, - {2, arcs_3_1}, -}; -static arc arcs_4_0[2] = { - {11, 1}, - {13, 2}, -}; -static arc arcs_4_1[1] = { - {7, 3}, -}; -static arc arcs_4_2[3] = { - {14, 4}, - {15, 4}, - {0, 2}, -}; -static arc arcs_4_3[1] = { - {12, 4}, -}; -static arc arcs_4_4[1] = { - {0, 4}, -}; -static state states_4[5] = { - {2, arcs_4_0}, - {1, arcs_4_1}, - {3, arcs_4_2}, - {1, arcs_4_3}, - {1, arcs_4_4}, -}; -static arc arcs_5_0[3] = { - {5, 1}, - {16, 1}, - {17, 2}, -}; -static arc arcs_5_1[1] = { - {0, 1}, -}; -static arc arcs_5_2[1] = { - {7, 3}, -}; -static arc arcs_5_3[1] = { - {18, 1}, -}; -static state states_5[4] = { - {3, arcs_5_0}, - {1, arcs_5_1}, - {1, arcs_5_2}, - {1, arcs_5_3}, -}; -static dfa dfas[6] = { - {256, "MSTART", 0, 2, states_0, - "\070\000\000"}, - {257, "RULE", 0, 5, states_1, - "\040\000\000"}, - {258, "RHS", 0, 2, states_2, - "\040\010\003"}, - {259, "ALT", 0, 2, states_3, - "\040\010\003"}, - {260, "ITEM", 0, 5, states_4, - "\040\010\003"}, - {261, "ATOM", 0, 4, states_5, - "\040\000\003"}, -}; -static label labels[19] = { - {0, "EMPTY"}, - {256, 0}, - {257, 0}, - {4, 0}, - {0, 0}, - {1, 0}, - {11, 0}, - {258, 0}, - {259, 0}, - {18, 0}, - {260, 0}, - {9, 0}, - {10, 0}, - {261, 0}, - {16, 0}, - {14, 0}, - {3, 0}, - {7, 0}, - {8, 0}, -}; -static grammar _PyParser_Grammar = { - 6, - dfas, - {19, labels}, - 256 -}; - -grammar * -meta_grammar(void) -{ - return &_PyParser_Grammar; -} - -grammar * -Py_meta_grammar(void) -{ - return meta_grammar(); -} diff --git a/Parser/parsetok.c b/Parser/parsetok.c index 6a96f6bc5a57..7a6c88651943 100644 --- a/Parser/parsetok.c +++ b/Parser/parsetok.c @@ -99,10 +99,8 @@ PyParser_ParseStringObject(const char *s, PyObject *filename, tok->type_comments = 1; } -#ifndef PGEN Py_INCREF(err_ret->filename); tok->filename = err_ret->filename; -#endif return parsetok(tok, g, start, err_ret, flags); } @@ -113,7 +111,6 @@ PyParser_ParseStringFlagsFilenameEx(const char *s, const char *filename_str, { node *n; PyObject *filename = NULL; -#ifndef PGEN if (filename_str != NULL) { filename = PyUnicode_DecodeFSDefault(filename_str); if (filename == NULL) { @@ -121,11 +118,8 @@ PyParser_ParseStringFlagsFilenameEx(const char *s, const char *filename_str, return NULL; } } -#endif n = PyParser_ParseStringObject(s, filename, g, start, err_ret, flags); -#ifndef PGEN Py_XDECREF(filename); -#endif return n; } @@ -169,10 +163,8 @@ PyParser_ParseFileObject(FILE *fp, PyObject *filename, if (*flags & PyPARSE_TYPE_COMMENTS) { tok->type_comments = 1; } -#ifndef PGEN Py_INCREF(err_ret->filename); tok->filename = err_ret->filename; -#endif return parsetok(tok, g, start, err_ret, flags); } @@ -184,7 +176,6 @@ PyParser_ParseFileFlagsEx(FILE *fp, const char *filename, { node *n; PyObject *fileobj = NULL; -#ifndef PGEN if (filename != NULL) { fileobj = PyUnicode_DecodeFSDefault(filename); if (fileobj == NULL) { @@ -192,12 +183,9 @@ PyParser_ParseFileFlagsEx(FILE *fp, const char *filename, return NULL; } } -#endif n = PyParser_ParseFileObject(fp, fileobj, enc, g, start, ps1, ps2, err_ret, flags); -#ifndef PGEN Py_XDECREF(fileobj); -#endif return n; } @@ -371,7 +359,6 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret, } } -#ifndef PGEN /* Check that the source for a single input statement really is a single statement by looking at what is left in the buffer after parsing. Trailing whitespace and comments @@ -399,7 +386,6 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret, c = *++cur; } } -#endif } else n = NULL; @@ -470,7 +456,6 @@ initerr(perrdetail *err_ret, PyObject *filename) err_ret->text = NULL; err_ret->token = -1; err_ret->expected = -1; -#ifndef PGEN if (filename) { Py_INCREF(filename); err_ret->filename = filename; @@ -482,6 +467,5 @@ initerr(perrdetail *err_ret, PyObject *filename) return -1; } } -#endif return 0; } diff --git a/Parser/parsetok_pgen.c b/Parser/parsetok_pgen.c deleted file mode 100644 index 97b92883f3f4..000000000000 --- a/Parser/parsetok_pgen.c +++ /dev/null @@ -1,2 +0,0 @@ -#define PGEN -#include "parsetok.c" diff --git a/Parser/pgen.c b/Parser/pgen.c deleted file mode 100644 index 6451a1d99866..000000000000 --- a/Parser/pgen.c +++ /dev/null @@ -1,724 +0,0 @@ -/* Parser generator */ - -/* For a description, see the comments at end of this file */ - -#include "Python.h" -#include "pgenheaders.h" -#include "token.h" -#include "node.h" -#include "grammar.h" -#include "metagrammar.h" -#include "pgen.h" - -extern int Py_DebugFlag; -extern int Py_IgnoreEnvironmentFlag; /* needed by Py_GETENV */ - - -/* PART ONE -- CONSTRUCT NFA -- Cf. Algorithm 3.2 from [Aho&Ullman 77] */ - -typedef struct _nfaarc { - int ar_label; - int ar_arrow; -} nfaarc; - -typedef struct _nfastate { - int st_narcs; - nfaarc *st_arc; -} nfastate; - -typedef struct _nfa { - int nf_type; - char *nf_name; - int nf_nstates; - nfastate *nf_state; - int nf_start, nf_finish; -} nfa; - -/* Forward */ -static void compile_rhs(labellist *ll, - nfa *nf, node *n, int *pa, int *pb); -static void compile_alt(labellist *ll, - nfa *nf, node *n, int *pa, int *pb); -static void compile_item(labellist *ll, - nfa *nf, node *n, int *pa, int *pb); -static void compile_atom(labellist *ll, - nfa *nf, node *n, int *pa, int *pb); - -static int -addnfastate(nfa *nf) -{ - nfastate *st; - - nf->nf_state = (nfastate *)PyObject_REALLOC(nf->nf_state, - sizeof(nfastate) * (nf->nf_nstates + 1)); - if (nf->nf_state == NULL) - Py_FatalError("out of mem"); - st = &nf->nf_state[nf->nf_nstates++]; - st->st_narcs = 0; - st->st_arc = NULL; - return st - nf->nf_state; -} - -static void -addnfaarc(nfa *nf, int from, int to, int lbl) -{ - nfastate *st; - nfaarc *ar; - - st = &nf->nf_state[from]; - st->st_arc = (nfaarc *)PyObject_REALLOC(st->st_arc, - sizeof(nfaarc) * (st->st_narcs + 1)); - if (st->st_arc == NULL) - Py_FatalError("out of mem"); - ar = &st->st_arc[st->st_narcs++]; - ar->ar_label = lbl; - ar->ar_arrow = to; -} - -static nfa * -newnfa(char *name) -{ - nfa *nf; - static int type = NT_OFFSET; /* All types will be disjunct */ - - nf = (nfa *)PyObject_MALLOC(sizeof(nfa)); - if (nf == NULL) - Py_FatalError("no mem for new nfa"); - nf->nf_type = type++; - nf->nf_name = name; /* XXX strdup(name) ??? */ - nf->nf_nstates = 0; - nf->nf_state = NULL; - nf->nf_start = nf->nf_finish = -1; - return nf; -} - -typedef struct _nfagrammar { - int gr_nnfas; - nfa **gr_nfa; - labellist gr_ll; -} nfagrammar; - -/* Forward */ -static void compile_rule(nfagrammar *gr, node *n); - -static nfagrammar * -newnfagrammar(void) -{ - nfagrammar *gr; - - gr = (nfagrammar *)PyObject_MALLOC(sizeof(nfagrammar)); - if (gr == NULL) - Py_FatalError("no mem for new nfa grammar"); - gr->gr_nnfas = 0; - gr->gr_nfa = NULL; - gr->gr_ll.ll_nlabels = 0; - gr->gr_ll.ll_label = NULL; - addlabel(&gr->gr_ll, ENDMARKER, "EMPTY"); - return gr; -} - -static void -freenfagrammar(nfagrammar *gr) -{ - for (int i = 0; i < gr->gr_nnfas; i++) { - PyObject_FREE(gr->gr_nfa[i]->nf_state); - } - PyObject_FREE(gr->gr_nfa); - PyObject_FREE(gr); -} - -static nfa * -addnfa(nfagrammar *gr, char *name) -{ - nfa *nf; - - nf = newnfa(name); - gr->gr_nfa = (nfa **)PyObject_REALLOC(gr->gr_nfa, - sizeof(nfa*) * (gr->gr_nnfas + 1)); - if (gr->gr_nfa == NULL) - Py_FatalError("out of mem"); - gr->gr_nfa[gr->gr_nnfas++] = nf; - addlabel(&gr->gr_ll, NAME, nf->nf_name); - return nf; -} - -#ifdef Py_DEBUG - -static const char REQNFMT[] = "metacompile: less than %d children\n"; - -#define REQN(i, count) do { \ - if (i < count) { \ - fprintf(stderr, REQNFMT, count); \ - Py_FatalError("REQN"); \ - } \ -} while (0) - -#else -#define REQN(i, count) /* empty */ -#endif - -static nfagrammar * -metacompile(node *n) -{ - nfagrammar *gr; - int i; - - if (Py_DebugFlag) - printf("Compiling (meta-) parse tree into NFA grammar\n"); - gr = newnfagrammar(); - REQ(n, MSTART); - i = n->n_nchildren - 1; /* Last child is ENDMARKER */ - n = n->n_child; - for (; --i >= 0; n++) { - if (n->n_type != NEWLINE) - compile_rule(gr, n); - } - return gr; -} - -static void -compile_rule(nfagrammar *gr, node *n) -{ - nfa *nf; - - REQ(n, RULE); - REQN(n->n_nchildren, 4); - n = n->n_child; - REQ(n, NAME); - nf = addnfa(gr, n->n_str); - n++; - REQ(n, COLON); - n++; - REQ(n, RHS); - compile_rhs(&gr->gr_ll, nf, n, &nf->nf_start, &nf->nf_finish); - n++; - REQ(n, NEWLINE); -} - -static void -compile_rhs(labellist *ll, nfa *nf, node *n, int *pa, int *pb) -{ - int i; - int a, b; - - REQ(n, RHS); - i = n->n_nchildren; - REQN(i, 1); - n = n->n_child; - REQ(n, ALT); - compile_alt(ll, nf, n, pa, pb); - if (--i <= 0) - return; - n++; - a = *pa; - b = *pb; - *pa = addnfastate(nf); - *pb = addnfastate(nf); - addnfaarc(nf, *pa, a, EMPTY); - addnfaarc(nf, b, *pb, EMPTY); - for (; --i >= 0; n++) { - REQ(n, VBAR); - REQN(i, 1); - --i; - n++; - REQ(n, ALT); - compile_alt(ll, nf, n, &a, &b); - addnfaarc(nf, *pa, a, EMPTY); - addnfaarc(nf, b, *pb, EMPTY); - } -} - -static void -compile_alt(labellist *ll, nfa *nf, node *n, int *pa, int *pb) -{ - int i; - int a, b; - - REQ(n, ALT); - i = n->n_nchildren; - REQN(i, 1); - n = n->n_child; - REQ(n, ITEM); - compile_item(ll, nf, n, pa, pb); - --i; - n++; - for (; --i >= 0; n++) { - REQ(n, ITEM); - compile_item(ll, nf, n, &a, &b); - addnfaarc(nf, *pb, a, EMPTY); - *pb = b; - } -} - -static void -compile_item(labellist *ll, nfa *nf, node *n, int *pa, int *pb) -{ - int i; - int a, b; - - REQ(n, ITEM); - i = n->n_nchildren; - REQN(i, 1); - n = n->n_child; - if (n->n_type == LSQB) { - REQN(i, 3); - n++; - REQ(n, RHS); - *pa = addnfastate(nf); - *pb = addnfastate(nf); - addnfaarc(nf, *pa, *pb, EMPTY); - compile_rhs(ll, nf, n, &a, &b); - addnfaarc(nf, *pa, a, EMPTY); - addnfaarc(nf, b, *pb, EMPTY); - REQN(i, 1); - n++; - REQ(n, RSQB); - } - else { - compile_atom(ll, nf, n, pa, pb); - if (--i <= 0) - return; - n++; - addnfaarc(nf, *pb, *pa, EMPTY); - if (n->n_type == STAR) - *pb = *pa; - else - REQ(n, PLUS); - } -} - -static void -compile_atom(labellist *ll, nfa *nf, node *n, int *pa, int *pb) -{ - int i; - - REQ(n, ATOM); - i = n->n_nchildren; - (void)i; /* Don't warn about set but unused */ - REQN(i, 1); - n = n->n_child; - if (n->n_type == LPAR) { - REQN(i, 3); - n++; - REQ(n, RHS); - compile_rhs(ll, nf, n, pa, pb); - n++; - REQ(n, RPAR); - } - else if (n->n_type == NAME || n->n_type == STRING) { - *pa = addnfastate(nf); - *pb = addnfastate(nf); - addnfaarc(nf, *pa, *pb, addlabel(ll, n->n_type, n->n_str)); - } - else - REQ(n, NAME); -} - -static void -dumpstate(labellist *ll, nfa *nf, int istate) -{ - nfastate *st; - int i; - nfaarc *ar; - - printf("%c%2d%c", - istate == nf->nf_start ? '*' : ' ', - istate, - istate == nf->nf_finish ? '.' : ' '); - st = &nf->nf_state[istate]; - ar = st->st_arc; - for (i = 0; i < st->st_narcs; i++) { - if (i > 0) - printf("\n "); - printf("-> %2d %s", ar->ar_arrow, - PyGrammar_LabelRepr(&ll->ll_label[ar->ar_label])); - ar++; - } - printf("\n"); -} - -static void -dumpnfa(labellist *ll, nfa *nf) -{ - int i; - - printf("NFA '%s' has %d states; start %d, finish %d\n", - nf->nf_name, nf->nf_nstates, nf->nf_start, nf->nf_finish); - for (i = 0; i < nf->nf_nstates; i++) - dumpstate(ll, nf, i); -} - - -/* PART TWO -- CONSTRUCT DFA -- Algorithm 3.1 from [Aho&Ullman 77] */ - -static void -addclosure(bitset ss, nfa *nf, int istate) -{ - if (addbit(ss, istate)) { - nfastate *st = &nf->nf_state[istate]; - nfaarc *ar = st->st_arc; - int i; - - for (i = st->st_narcs; --i >= 0; ) { - if (ar->ar_label == EMPTY) - addclosure(ss, nf, ar->ar_arrow); - ar++; - } - } -} - -typedef struct _ss_arc { - bitset sa_bitset; - int sa_arrow; - int sa_label; -} ss_arc; - -typedef struct _ss_state { - bitset ss_ss; - int ss_narcs; - struct _ss_arc *ss_arc; - int ss_deleted; - int ss_finish; - int ss_rename; -} ss_state; - -typedef struct _ss_dfa { - int sd_nstates; - ss_state *sd_state; -} ss_dfa; - -/* Forward */ -static void printssdfa(int xx_nstates, ss_state *xx_state, int nbits, - labellist *ll, const char *msg); -static void simplify(int xx_nstates, ss_state *xx_state); -static void convert(dfa *d, int xx_nstates, ss_state *xx_state); - -static void -makedfa(nfagrammar *gr, nfa *nf, dfa *d) -{ - int nbits = nf->nf_nstates; - bitset ss; - int xx_nstates; - ss_state *xx_state, *yy; - ss_arc *zz; - int istate, jstate, iarc, jarc, ibit; - nfastate *st; - nfaarc *ar; - - ss = newbitset(nbits); - addclosure(ss, nf, nf->nf_start); - xx_state = (ss_state *)PyObject_MALLOC(sizeof(ss_state)); - if (xx_state == NULL) - Py_FatalError("no mem for xx_state in makedfa"); - xx_nstates = 1; - yy = &xx_state[0]; - yy->ss_ss = ss; - yy->ss_narcs = 0; - yy->ss_arc = NULL; - yy->ss_deleted = 0; - yy->ss_finish = testbit(ss, nf->nf_finish); - if (yy->ss_finish) - printf("Error: nonterminal '%s' may produce empty.\n", - nf->nf_name); - - /* This algorithm is from a book written before - the invention of structured programming... */ - - /* For each unmarked state... */ - for (istate = 0; istate < xx_nstates; ++istate) { - size_t size; - yy = &xx_state[istate]; - ss = yy->ss_ss; - /* For all its states... */ - for (ibit = 0; ibit < nf->nf_nstates; ++ibit) { - if (!testbit(ss, ibit)) - continue; - st = &nf->nf_state[ibit]; - /* For all non-empty arcs from this state... */ - for (iarc = 0; iarc < st->st_narcs; iarc++) { - ar = &st->st_arc[iarc]; - if (ar->ar_label == EMPTY) - continue; - /* Look up in list of arcs from this state */ - for (jarc = 0; jarc < yy->ss_narcs; ++jarc) { - zz = &yy->ss_arc[jarc]; - if (ar->ar_label == zz->sa_label) - goto found; - } - /* Add new arc for this state */ - size = sizeof(ss_arc) * (yy->ss_narcs + 1); - yy->ss_arc = (ss_arc *)PyObject_REALLOC( - yy->ss_arc, size); - if (yy->ss_arc == NULL) - Py_FatalError("out of mem"); - zz = &yy->ss_arc[yy->ss_narcs++]; - zz->sa_label = ar->ar_label; - zz->sa_bitset = newbitset(nbits); - zz->sa_arrow = -1; - found: ; - /* Add destination */ - addclosure(zz->sa_bitset, nf, ar->ar_arrow); - } - } - /* Now look up all the arrow states */ - for (jarc = 0; jarc < xx_state[istate].ss_narcs; jarc++) { - zz = &xx_state[istate].ss_arc[jarc]; - for (jstate = 0; jstate < xx_nstates; jstate++) { - if (samebitset(zz->sa_bitset, - xx_state[jstate].ss_ss, nbits)) { - zz->sa_arrow = jstate; - goto done; - } - } - size = sizeof(ss_state) * (xx_nstates + 1); - xx_state = (ss_state *)PyObject_REALLOC(xx_state, - size); - if (xx_state == NULL) - Py_FatalError("out of mem"); - zz->sa_arrow = xx_nstates; - yy = &xx_state[xx_nstates++]; - yy->ss_ss = zz->sa_bitset; - yy->ss_narcs = 0; - yy->ss_arc = NULL; - yy->ss_deleted = 0; - yy->ss_finish = testbit(yy->ss_ss, nf->nf_finish); - done: ; - } - } - - if (Py_DebugFlag) - printssdfa(xx_nstates, xx_state, nbits, &gr->gr_ll, - "before minimizing"); - - simplify(xx_nstates, xx_state); - - if (Py_DebugFlag) - printssdfa(xx_nstates, xx_state, nbits, &gr->gr_ll, - "after minimizing"); - - convert(d, xx_nstates, xx_state); - - for (int i = 0; i < xx_nstates; i++) { - for (int j = 0; j < xx_state[i].ss_narcs; j++) - delbitset(xx_state[i].ss_arc[j].sa_bitset); - PyObject_FREE(xx_state[i].ss_arc); - } - PyObject_FREE(xx_state); -} - -static void -printssdfa(int xx_nstates, ss_state *xx_state, int nbits, - labellist *ll, const char *msg) -{ - int i, ibit, iarc; - ss_state *yy; - ss_arc *zz; - - printf("Subset DFA %s\n", msg); - for (i = 0; i < xx_nstates; i++) { - yy = &xx_state[i]; - if (yy->ss_deleted) - continue; - printf(" Subset %d", i); - if (yy->ss_finish) - printf(" (finish)"); - printf(" { "); - for (ibit = 0; ibit < nbits; ibit++) { - if (testbit(yy->ss_ss, ibit)) - printf("%d ", ibit); - } - printf("}\n"); - for (iarc = 0; iarc < yy->ss_narcs; iarc++) { - zz = &yy->ss_arc[iarc]; - printf(" Arc to state %d, label %s\n", - zz->sa_arrow, - PyGrammar_LabelRepr( - &ll->ll_label[zz->sa_label])); - } - } -} - - -/* PART THREE -- SIMPLIFY DFA */ - -/* Simplify the DFA by repeatedly eliminating states that are - equivalent to another oner. This is NOT Algorithm 3.3 from - [Aho&Ullman 77]. It does not always finds the minimal DFA, - but it does usually make a much smaller one... (For an example - of sub-optimal behavior, try S: x a b+ | y a b+.) -*/ - -static int -samestate(ss_state *s1, ss_state *s2) -{ - int i; - - if (s1->ss_narcs != s2->ss_narcs || s1->ss_finish != s2->ss_finish) - return 0; - for (i = 0; i < s1->ss_narcs; i++) { - if (s1->ss_arc[i].sa_arrow != s2->ss_arc[i].sa_arrow || - s1->ss_arc[i].sa_label != s2->ss_arc[i].sa_label) - return 0; - } - return 1; -} - -static void -renamestates(int xx_nstates, ss_state *xx_state, int from, int to) -{ - int i, j; - - if (Py_DebugFlag) - printf("Rename state %d to %d.\n", from, to); - for (i = 0; i < xx_nstates; i++) { - if (xx_state[i].ss_deleted) - continue; - for (j = 0; j < xx_state[i].ss_narcs; j++) { - if (xx_state[i].ss_arc[j].sa_arrow == from) - xx_state[i].ss_arc[j].sa_arrow = to; - } - } -} - -static void -simplify(int xx_nstates, ss_state *xx_state) -{ - int changes; - int i, j; - - do { - changes = 0; - for (i = 1; i < xx_nstates; i++) { - if (xx_state[i].ss_deleted) - continue; - for (j = 0; j < i; j++) { - if (xx_state[j].ss_deleted) - continue; - if (samestate(&xx_state[i], &xx_state[j])) { - xx_state[i].ss_deleted++; - renamestates(xx_nstates, xx_state, - i, j); - changes++; - break; - } - } - } - } while (changes); -} - - -/* PART FOUR -- GENERATE PARSING TABLES */ - -/* Convert the DFA into a grammar that can be used by our parser */ - -static void -convert(dfa *d, int xx_nstates, ss_state *xx_state) -{ - int i, j; - ss_state *yy; - ss_arc *zz; - - for (i = 0; i < xx_nstates; i++) { - yy = &xx_state[i]; - if (yy->ss_deleted) - continue; - yy->ss_rename = addstate(d); - } - - for (i = 0; i < xx_nstates; i++) { - yy = &xx_state[i]; - if (yy->ss_deleted) - continue; - for (j = 0; j < yy->ss_narcs; j++) { - zz = &yy->ss_arc[j]; - addarc(d, yy->ss_rename, - xx_state[zz->sa_arrow].ss_rename, - zz->sa_label); - } - if (yy->ss_finish) - addarc(d, yy->ss_rename, yy->ss_rename, 0); - } - - d->d_initial = 0; -} - - -/* PART FIVE -- GLUE IT ALL TOGETHER */ - -static grammar * -maketables(nfagrammar *gr) -{ - int i; - nfa *nf; - dfa *d; - grammar *g; - - if (gr->gr_nnfas == 0) - return NULL; - g = newgrammar(gr->gr_nfa[0]->nf_type); - /* XXX first rule must be start rule */ - g->g_ll = gr->gr_ll; - - for (i = 0; i < gr->gr_nnfas; i++) { - nf = gr->gr_nfa[i]; - if (Py_DebugFlag) { - printf("Dump of NFA for '%s' ...\n", nf->nf_name); - dumpnfa(&gr->gr_ll, nf); - printf("Making DFA for '%s' ...\n", nf->nf_name); - } - d = adddfa(g, nf->nf_type, nf->nf_name); - makedfa(gr, gr->gr_nfa[i], d); - } - - return g; -} - -grammar * -pgen(node *n) -{ - nfagrammar *gr; - grammar *g; - - gr = metacompile(n); - g = maketables(gr); - translatelabels(g); - addfirstsets(g); - freenfagrammar(gr); - return g; -} - -grammar * -Py_pgen(node *n) -{ - return pgen(n); -} - -/* - -Description ------------ - -Input is a grammar in extended BNF (using * for repetition, + for -at-least-once repetition, [] for optional parts, | for alternatives and -() for grouping). This has already been parsed and turned into a parse -tree. - -Each rule is considered as a regular expression in its own right. -It is turned into a Non-deterministic Finite Automaton (NFA), which -is then turned into a Deterministic Finite Automaton (DFA), which is then -optimized to reduce the number of states. See [Aho&Ullman 77] chapter 3, -or similar compiler books (this technique is more often used for lexical -analyzers). - -The DFA's are used by the parser as parsing tables in a special way -that's probably unique. Before they are usable, the FIRST sets of all -non-terminals are computed. - -Reference ---------- - -[Aho&Ullman 77] - Aho&Ullman, Principles of Compiler Design, Addison-Wesley 1977 - (first edition) - -*/ diff --git a/Parser/pgen/__init__.py b/Parser/pgen/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/Parser/pgen/__main__.py b/Parser/pgen/__main__.py new file mode 100644 index 000000000000..965b08fd2343 --- /dev/null +++ b/Parser/pgen/__main__.py @@ -0,0 +1,34 @@ +import argparse + +from .pgen import ParserGenerator + +def main(): + parser = argparse.ArgumentParser(description="Parser generator main program.") + parser.add_argument( + "grammar", type=str, help="The file with the grammar definition in EBNF format" + ) + parser.add_argument( + "tokens", type=str, help="The file with the token definitions" + ) + parser.add_argument( + "graminit_h", + type=argparse.FileType('w'), + help="The path to write the grammar's non-terminals as #defines", + ) + parser.add_argument( + "graminit_c", + type=argparse.FileType('w'), + help="The path to write the grammar as initialized data", + ) + + parser.add_argument("--verbose", "-v", action="count") + args = parser.parse_args() + + p = ParserGenerator(args.grammar, args.tokens, verbose=args.verbose) + grammar = p.make_grammar() + grammar.produce_graminit_h(args.graminit_h.write) + grammar.produce_graminit_c(args.graminit_c.write) + + +if __name__ == "__main__": + main() diff --git a/Parser/pgen/grammar.py b/Parser/pgen/grammar.py new file mode 100644 index 000000000000..bd405e674e44 --- /dev/null +++ b/Parser/pgen/grammar.py @@ -0,0 +1,160 @@ +import collections + +class Grammar: + """Pgen parsing tables conversion class. + + Once initialized, this class supplies the grammar tables for the + parsing engine implemented by parse.py. The parsing engine + accesses the instance variables directly. The class here does not + provide initialization of the tables; several subclasses exist to + do this (see the conv and pgen modules). + + The load() method reads the tables from a pickle file, which is + much faster than the other ways offered by subclasses. The pickle + file is written by calling dump() (after loading the grammar + tables using a subclass). The report() method prints a readable + representation of the tables to stdout, for debugging. + + The instance variables are as follows: + + symbol2number -- a dict mapping symbol names to numbers. Symbol + numbers are always 256 or higher, to distinguish + them from token numbers, which are between 0 and + 255 (inclusive). + + number2symbol -- a dict mapping numbers to symbol names; + these two are each other's inverse. + + states -- a list of DFAs, where each DFA is a list of + states, each state is a list of arcs, and each + arc is a (i, j) pair where i is a label and j is + a state number. The DFA number is the index into + this list. (This name is slightly confusing.) + Final states are represented by a special arc of + the form (0, j) where j is its own state number. + + dfas -- a dict mapping symbol numbers to (DFA, first) + pairs, where DFA is an item from the states list + above, and first is a set of tokens that can + begin this grammar rule (represented by a dict + whose values are always 1). + + labels -- a list of (x, y) pairs where x is either a token + number or a symbol number, and y is either None + or a string; the strings are keywords. The label + number is the index in this list; label numbers + are used to mark state transitions (arcs) in the + DFAs. + + start -- the number of the grammar's start symbol. + + keywords -- a dict mapping keyword strings to arc labels. + + tokens -- a dict mapping token numbers to arc labels. + + """ + + def __init__(self): + self.symbol2number = collections.OrderedDict() + self.number2symbol = collections.OrderedDict() + self.states = [] + self.dfas = collections.OrderedDict() + self.labels = [(0, "EMPTY")] + self.keywords = collections.OrderedDict() + self.tokens = collections.OrderedDict() + self.symbol2label = collections.OrderedDict() + self.start = 256 + + def produce_graminit_h(self, writer): + writer("/* Generated by Parser/pgen */\n\n") + for number, symbol in self.number2symbol.items(): + writer("#define {} {}\n".format(symbol, number)) + + def produce_graminit_c(self, writer): + writer("/* Generated by Parser/pgen */\n\n") + + writer('#include "pgenheaders.h"\n') + writer('#include "grammar.h"\n') + writer("grammar _PyParser_Grammar;\n") + + self.print_dfas(writer) + self.print_labels(writer) + + writer("grammar _PyParser_Grammar = {\n") + writer(" {n_dfas},\n".format(n_dfas=len(self.dfas))) + writer(" dfas,\n") + writer(" {{{n_labels}, labels}},\n".format(n_labels=len(self.labels))) + writer(" {start_number}\n".format(start_number=self.start)) + writer("};\n") + + def print_labels(self, writer): + writer( + "static label labels[{n_labels}] = {{\n".format(n_labels=len(self.labels)) + ) + for label, name in self.labels: + if name is None: + writer(" {{{label}, 0}},\n".format(label=label)) + else: + writer( + ' {{{label}, "{label_name}"}},\n'.format( + label=label, label_name=name + ) + ) + writer("};\n") + + def print_dfas(self, writer): + self.print_states(writer) + writer("static dfa dfas[{}] = {{\n".format(len(self.dfas))) + for dfaindex, dfa_elem in enumerate(self.dfas.items()): + symbol, (dfa, first_sets) = dfa_elem + writer( + ' {{{dfa_symbol}, "{symbol_name}", '.format( + dfa_symbol=symbol, symbol_name=self.number2symbol[symbol] + ) + + "0, {n_states}, states_{dfa_index},\n".format( + n_states=len(dfa), dfa_index=dfaindex + ) + ) + writer(' "') + + k = [name for label, name in self.labels if label in first_sets] + bitset = bytearray((len(self.labels) >> 3) + 1) + for token in first_sets: + bitset[token >> 3] |= 1 << (token & 7) + for byte in bitset: + writer("\\%03o" % (byte & 0xFF)) + writer('"},\n') + writer("};\n") + + def print_states(self, write): + for dfaindex, dfa in enumerate(self.states): + self.print_arcs(write, dfaindex, dfa) + write( + "static state states_{dfa_index}[{n_states}] = {{\n".format( + dfa_index=dfaindex, n_states=len(dfa) + ) + ) + for stateindex, state in enumerate(dfa): + narcs = len(state) + write( + " {{{n_arcs}, arcs_{dfa_index}_{state_index}}},\n".format( + n_arcs=narcs, dfa_index=dfaindex, state_index=stateindex + ) + ) + write("};\n") + + def print_arcs(self, write, dfaindex, states): + for stateindex, state in enumerate(states): + narcs = len(state) + write( + "static arc arcs_{dfa_index}_{state_index}[{n_arcs}] = {{\n".format( + dfa_index=dfaindex, state_index=stateindex, n_arcs=narcs + ) + ) + for a, b in state: + write( + " {{{from_label}, {to_state}}},\n".format( + from_label=a, to_state=b + ) + ) + write("};\n") diff --git a/Parser/pgen/pgen.py b/Parser/pgen/pgen.py new file mode 100644 index 000000000000..c878919f2ac4 --- /dev/null +++ b/Parser/pgen/pgen.py @@ -0,0 +1,408 @@ +import collections +import tokenize # from stdlib + +from . import grammar, token + +class ParserGenerator(object): + + def __init__(self, grammar_file, token_file, stream=None, verbose=False): + close_stream = None + if stream is None: + stream = open(grammar_file) + close_stream = stream.close + with open(token_file) as tok_file: + token_lines = tok_file.readlines() + self.tokens = dict(token.generate_tokens(token_lines)) + self.opmap = dict(token.generate_opmap(token_lines)) + # Manually add <> so it does not collide with != + self.opmap['<>'] = "NOTEQUAL" + self.verbose = verbose + self.filename = grammar_file + self.stream = stream + self.generator = tokenize.generate_tokens(stream.readline) + self.gettoken() # Initialize lookahead + self.dfas, self.startsymbol = self.parse() + if close_stream is not None: + close_stream() + self.first = {} # map from symbol name to set of tokens + self.addfirstsets() + + def make_grammar(self): + c = grammar.Grammar() + names = list(self.dfas.keys()) + names.remove(self.startsymbol) + names.insert(0, self.startsymbol) + for name in names: + i = 256 + len(c.symbol2number) + c.symbol2number[name] = i + c.number2symbol[i] = name + for name in names: + self.make_label(c, name) + dfa = self.dfas[name] + states = [] + for state in dfa: + arcs = [] + for label, next in sorted(state.arcs.items()): + arcs.append((self.make_label(c, label), dfa.index(next))) + if state.isfinal: + arcs.append((0, dfa.index(state))) + states.append(arcs) + c.states.append(states) + c.dfas[c.symbol2number[name]] = (states, self.make_first(c, name)) + c.start = c.symbol2number[self.startsymbol] + + if self.verbose: + print("") + print("Grammar summary") + print("===============") + + print("- {n_labels} labels".format(n_labels=len(c.labels))) + print("- {n_dfas} dfas".format(n_dfas=len(c.dfas))) + print("- {n_tokens} tokens".format(n_tokens=len(c.tokens))) + print("- {n_keywords} keywords".format(n_keywords=len(c.keywords))) + print( + "- Start symbol: {start_symbol}".format( + start_symbol=c.number2symbol[c.start] + ) + ) + return c + + def make_first(self, c, name): + rawfirst = self.first[name] + first = set() + for label in sorted(rawfirst): + ilabel = self.make_label(c, label) + ##assert ilabel not in first # XXX failed on <> ... != + first.add(ilabel) + return first + + def make_label(self, c, label): + # XXX Maybe this should be a method on a subclass of converter? + ilabel = len(c.labels) + if label[0].isalpha(): + # Either a symbol name or a named token + if label in c.symbol2number: + # A symbol name (a non-terminal) + if label in c.symbol2label: + return c.symbol2label[label] + else: + c.labels.append((c.symbol2number[label], None)) + c.symbol2label[label] = ilabel + return ilabel + else: + # A named token (NAME, NUMBER, STRING) + itoken = self.tokens.get(label, None) + assert isinstance(itoken, int), label + assert itoken in self.tokens.values(), label + if itoken in c.tokens: + return c.tokens[itoken] + else: + c.labels.append((itoken, None)) + c.tokens[itoken] = ilabel + return ilabel + else: + # Either a keyword or an operator + assert label[0] in ('"', "'"), label + value = eval(label) + if value[0].isalpha(): + # A keyword + if value in c.keywords: + return c.keywords[value] + else: + c.labels.append((self.tokens["NAME"], value)) + c.keywords[value] = ilabel + return ilabel + else: + # An operator (any non-numeric token) + tok_name = self.opmap[value] # Fails if unknown token + itoken = self.tokens[tok_name] + if itoken in c.tokens: + return c.tokens[itoken] + else: + c.labels.append((itoken, None)) + c.tokens[itoken] = ilabel + return ilabel + + def addfirstsets(self): + names = list(self.dfas.keys()) + for name in names: + if name not in self.first: + self.calcfirst(name) + + if self.verbose: + print("First set for {dfa_name}".format(dfa_name=name)) + for item in self.first[name]: + print(" - {terminal}".format(terminal=item)) + + def calcfirst(self, name): + dfa = self.dfas[name] + self.first[name] = None # dummy to detect left recursion + state = dfa[0] + totalset = set() + overlapcheck = {} + for label, next in state.arcs.items(): + if label in self.dfas: + if label in self.first: + fset = self.first[label] + if fset is None: + raise ValueError("recursion for rule %r" % name) + else: + self.calcfirst(label) + fset = self.first[label] + totalset.update(fset) + overlapcheck[label] = fset + else: + totalset.add(label) + overlapcheck[label] = {label} + inverse = {} + for label, itsfirst in overlapcheck.items(): + for symbol in itsfirst: + if symbol in inverse: + raise ValueError("rule %s is ambiguous; %s is in the" + " first sets of %s as well as %s" % + (name, symbol, label, inverse[symbol])) + inverse[symbol] = label + self.first[name] = totalset + + def parse(self): + dfas = collections.OrderedDict() + startsymbol = None + # MSTART: (NEWLINE | RULE)* ENDMARKER + while self.type != tokenize.ENDMARKER: + while self.type == tokenize.NEWLINE: + self.gettoken() + # RULE: NAME ':' RHS NEWLINE + name = self.expect(tokenize.NAME) + if self.verbose: + print("Processing rule {dfa_name}".format(dfa_name=name)) + self.expect(tokenize.OP, ":") + a, z = self.parse_rhs() + self.expect(tokenize.NEWLINE) + if self.verbose: + self.dump_nfa(name, a, z) + dfa = self.make_dfa(a, z) + if self.verbose: + self.dump_dfa(name, dfa) + oldlen = len(dfa) + self.simplify_dfa(dfa) + newlen = len(dfa) + dfas[name] = dfa + #print name, oldlen, newlen + if startsymbol is None: + startsymbol = name + return dfas, startsymbol + + def make_dfa(self, start, finish): + # To turn an NFA into a DFA, we define the states of the DFA + # to correspond to *sets* of states of the NFA. Then do some + # state reduction. Let's represent sets as dicts with 1 for + # values. + assert isinstance(start, NFAState) + assert isinstance(finish, NFAState) + def closure(state): + base = set() + addclosure(state, base) + return base + def addclosure(state, base): + assert isinstance(state, NFAState) + if state in base: + return + base.add(state) + for label, next in state.arcs: + if label is None: + addclosure(next, base) + states = [DFAState(closure(start), finish)] + for state in states: # NB states grows while we're iterating + arcs = {} + for nfastate in state.nfaset: + for label, next in nfastate.arcs: + if label is not None: + addclosure(next, arcs.setdefault(label, set())) + for label, nfaset in sorted(arcs.items()): + for st in states: + if st.nfaset == nfaset: + break + else: + st = DFAState(nfaset, finish) + states.append(st) + state.addarc(st, label) + return states # List of DFAState instances; first one is start + + def dump_nfa(self, name, start, finish): + print("Dump of NFA for", name) + todo = [start] + for i, state in enumerate(todo): + print(" State", i, state is finish and "(final)" or "") + for label, next in state.arcs: + if next in todo: + j = todo.index(next) + else: + j = len(todo) + todo.append(next) + if label is None: + print(" -> %d" % j) + else: + print(" %s -> %d" % (label, j)) + + def dump_dfa(self, name, dfa): + print("Dump of DFA for", name) + for i, state in enumerate(dfa): + print(" State", i, state.isfinal and "(final)" or "") + for label, next in sorted(state.arcs.items()): + print(" %s -> %d" % (label, dfa.index(next))) + + def simplify_dfa(self, dfa): + # This is not theoretically optimal, but works well enough. + # Algorithm: repeatedly look for two states that have the same + # set of arcs (same labels pointing to the same nodes) and + # unify them, until things stop changing. + + # dfa is a list of DFAState instances + changes = True + while changes: + changes = False + for i, state_i in enumerate(dfa): + for j in range(i+1, len(dfa)): + state_j = dfa[j] + if state_i == state_j: + #print " unify", i, j + del dfa[j] + for state in dfa: + state.unifystate(state_j, state_i) + changes = True + break + + def parse_rhs(self): + # RHS: ALT ('|' ALT)* + a, z = self.parse_alt() + if self.value != "|": + return a, z + else: + aa = NFAState() + zz = NFAState() + aa.addarc(a) + z.addarc(zz) + while self.value == "|": + self.gettoken() + a, z = self.parse_alt() + aa.addarc(a) + z.addarc(zz) + return aa, zz + + def parse_alt(self): + # ALT: ITEM+ + a, b = self.parse_item() + while (self.value in ("(", "[") or + self.type in (tokenize.NAME, tokenize.STRING)): + c, d = self.parse_item() + b.addarc(c) + b = d + return a, b + + def parse_item(self): + # ITEM: '[' RHS ']' | ATOM ['+' | '*'] + if self.value == "[": + self.gettoken() + a, z = self.parse_rhs() + self.expect(tokenize.OP, "]") + a.addarc(z) + return a, z + else: + a, z = self.parse_atom() + value = self.value + if value not in ("+", "*"): + return a, z + self.gettoken() + z.addarc(a) + if value == "+": + return a, z + else: + return a, a + + def parse_atom(self): + # ATOM: '(' RHS ')' | NAME | STRING + if self.value == "(": + self.gettoken() + a, z = self.parse_rhs() + self.expect(tokenize.OP, ")") + return a, z + elif self.type in (tokenize.NAME, tokenize.STRING): + a = NFAState() + z = NFAState() + a.addarc(z, self.value) + self.gettoken() + return a, z + else: + self.raise_error("expected (...) or NAME or STRING, got %s/%s", + self.type, self.value) + + def expect(self, type, value=None): + if self.type != type or (value is not None and self.value != value): + self.raise_error("expected %s/%s, got %s/%s", + type, value, self.type, self.value) + value = self.value + self.gettoken() + return value + + def gettoken(self): + tup = next(self.generator) + while tup[0] in (tokenize.COMMENT, tokenize.NL): + tup = next(self.generator) + self.type, self.value, self.begin, self.end, self.line = tup + # print(getattr(tokenize, 'tok_name')[self.type], repr(self.value)) + + def raise_error(self, msg, *args): + if args: + try: + msg = msg % args + except: + msg = " ".join([msg] + list(map(str, args))) + raise SyntaxError(msg, (self.filename, self.end[0], + self.end[1], self.line)) + +class NFAState(object): + + def __init__(self): + self.arcs = [] # list of (label, NFAState) pairs + + def addarc(self, next, label=None): + assert label is None or isinstance(label, str) + assert isinstance(next, NFAState) + self.arcs.append((label, next)) + +class DFAState(object): + + def __init__(self, nfaset, final): + assert isinstance(nfaset, set) + assert isinstance(next(iter(nfaset)), NFAState) + assert isinstance(final, NFAState) + self.nfaset = nfaset + self.isfinal = final in nfaset + self.arcs = {} # map from label to DFAState + + def addarc(self, next, label): + assert isinstance(label, str) + assert label not in self.arcs + assert isinstance(next, DFAState) + self.arcs[label] = next + + def unifystate(self, old, new): + for label, next in self.arcs.items(): + if next is old: + self.arcs[label] = new + + def __eq__(self, other): + # Equality test -- ignore the nfaset instance variable + assert isinstance(other, DFAState) + if self.isfinal != other.isfinal: + return False + # Can't just return self.arcs == other.arcs, because that + # would invoke this method recursively, with cycles... + if len(self.arcs) != len(other.arcs): + return False + for label, next in self.arcs.items(): + if next is not other.arcs.get(label): + return False + return True + + __hash__ = None # For Py3 compatibility. diff --git a/Parser/pgen/token.py b/Parser/pgen/token.py new file mode 100644 index 000000000000..f9d45c450c45 --- /dev/null +++ b/Parser/pgen/token.py @@ -0,0 +1,40 @@ +import itertools + +def generate_tokens(tokens): + numbers = itertools.count(0) + for line in tokens: + line = line.strip() + + if not line: + continue + if line.strip().startswith('#'): + continue + + name = line.split()[0] + yield (name, next(numbers)) + + yield ('N_TOKENS', next(numbers)) + yield ('NT_OFFSET', 256) + +def generate_opmap(tokens): + for line in tokens: + line = line.strip() + + if not line: + continue + if line.strip().startswith('#'): + continue + + pieces = line.split() + + if len(pieces) != 2: + continue + + name, op = pieces + yield (op.strip("'"), name) + + # Yield independently <>. This is needed so it does not collide + # with the token generation in "generate_tokens" because if this + # symbol is included in Grammar/Tokens, it will collide with != + # as it has the same name (NOTEQUAL). + yield ('<>', 'NOTEQUAL') diff --git a/Parser/pgenmain.c b/Parser/pgenmain.c deleted file mode 100644 index fa6c88253cdd..000000000000 --- a/Parser/pgenmain.c +++ /dev/null @@ -1,188 +0,0 @@ - -/* Parser generator main program */ - -/* This expects a filename containing the grammar as argv[1] (UNIX) - or asks the console for such a file name (THINK C). - It writes its output on two files in the current directory: - - "graminit.c" gets the grammar as a bunch of initialized data - - "graminit.h" gets the grammar's non-terminals as #defines. - Error messages and status info during the generation process are - written to stdout, or sometimes to stderr. */ - -/* XXX TO DO: - - check for duplicate definitions of names (instead of fatal err) -*/ - -#define PGEN - -#include "Python.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" -#include "pgenheaders.h" -#include "grammar.h" -#include "node.h" -#include "parsetok.h" -#include "pgen.h" - -int Py_DebugFlag = 0; -int Py_VerboseFlag = 0; -int Py_IgnoreEnvironmentFlag = 0; -_PyRuntimeState _PyRuntime = _PyRuntimeState_INIT; - -/* Forward */ -grammar *getgrammar(const char *filename); - -void -Py_Exit(int sts) -{ - exit(sts); -} - -/* Needed by obmalloc.c */ -int PyGILState_Check(void) -{ return 1; } - -void _PyMem_DumpTraceback(int fd, const void *ptr) -{} - -int -main(int argc, char **argv) -{ - grammar *g; - FILE *fp; - char *filename, *graminit_h, *graminit_c; - - if (argc != 4) { - fprintf(stderr, - "usage: %s grammar graminit.h graminit.c\n", argv[0]); - Py_Exit(2); - } - filename = argv[1]; - graminit_h = argv[2]; - graminit_c = argv[3]; - g = getgrammar(filename); - fp = fopen(graminit_c, "w"); - if (fp == NULL) { - perror(graminit_c); - Py_Exit(1); - } - if (Py_DebugFlag) - printf("Writing %s ...\n", graminit_c); - printgrammar(g, fp); - fclose(fp); - fp = fopen(graminit_h, "w"); - if (fp == NULL) { - perror(graminit_h); - Py_Exit(1); - } - if (Py_DebugFlag) - printf("Writing %s ...\n", graminit_h); - printnonterminals(g, fp); - fclose(fp); - freegrammar(g); - Py_Exit(0); - return 0; /* Make gcc -Wall happy */ -} - -grammar * -getgrammar(const char *filename) -{ - FILE *fp; - node *n; - grammar *g0, *g; - perrdetail err; - - fp = fopen(filename, "r"); - if (fp == NULL) { - perror(filename); - Py_Exit(1); - } - g0 = meta_grammar(); - n = PyParser_ParseFile(fp, filename, g0, g0->g_start, - (char *)NULL, (char *)NULL, &err); - fclose(fp); - if (n == NULL) { - fprintf(stderr, "Parsing error %d, line %d.\n", - err.error, err.lineno); - if (err.text != NULL) { - size_t len; - int i; - fprintf(stderr, "%s", err.text); - len = strlen(err.text); - if (len == 0 || err.text[len-1] != '\n') - fprintf(stderr, "\n"); - for (i = 0; i < err.offset; i++) { - if (err.text[i] == '\t') - putc('\t', stderr); - else - putc(' ', stderr); - } - fprintf(stderr, "^\n"); - PyObject_FREE(err.text); - } - Py_Exit(1); - } - g = pgen(n); - PyNode_Free(n); - if (g == NULL) { - printf("Bad grammar.\n"); - Py_Exit(1); - } - return g; -} - -/* Can't happen in pgen */ -PyObject* -PyErr_Occurred() -{ - return 0; -} - -void -Py_FatalError(const char *msg) -{ - fprintf(stderr, "pgen: FATAL ERROR: %s\n", msg); - Py_Exit(1); -} - -/* No-nonsense my_readline() for tokenizer.c */ - -char * -PyOS_Readline(FILE *sys_stdin, FILE *sys_stdout, const char *prompt) -{ - size_t n = 1000; - char *p = (char *)PyMem_MALLOC(n); - char *q; - if (p == NULL) - return NULL; - fprintf(stderr, "%s", prompt); - q = fgets(p, n, sys_stdin); - if (q == NULL) { - *p = '\0'; - return p; - } - n = strlen(p); - if (n > 0 && p[n-1] != '\n') - p[n-1] = '\n'; - return (char *)PyMem_REALLOC(p, n+1); -} - -/* No-nonsense fgets */ -char * -Py_UniversalNewlineFgets(char *buf, int n, FILE *stream, PyObject *fobj) -{ - return fgets(buf, n, stream); -} - - -#include - -void -PySys_WriteStderr(const char *format, ...) -{ - va_list va; - - va_start(va, format); - vfprintf(stderr, format, va); - va_end(va); -} diff --git a/Parser/printgrammar.c b/Parser/printgrammar.c deleted file mode 100644 index 1a8b0e176f2a..000000000000 --- a/Parser/printgrammar.c +++ /dev/null @@ -1,120 +0,0 @@ - -/* Print a bunch of C initializers that represent a grammar */ - -#define PGEN - -#include "pgenheaders.h" -#include "grammar.h" - -/* Forward */ -static void printarcs(int, dfa *, FILE *); -static void printstates(grammar *, FILE *); -static void printdfas(grammar *, FILE *); -static void printlabels(grammar *, FILE *); - -void -printgrammar(grammar *g, FILE *fp) -{ - fprintf(fp, "/* Generated by Parser/pgen */\n\n"); - fprintf(fp, "#include \"pgenheaders.h\"\n"); - fprintf(fp, "#include \"grammar.h\"\n"); - fprintf(fp, "grammar _PyParser_Grammar;\n"); - printdfas(g, fp); - printlabels(g, fp); - fprintf(fp, "grammar _PyParser_Grammar = {\n"); - fprintf(fp, " %d,\n", g->g_ndfas); - fprintf(fp, " dfas,\n"); - fprintf(fp, " {%d, labels},\n", g->g_ll.ll_nlabels); - fprintf(fp, " %d\n", g->g_start); - fprintf(fp, "};\n"); -} - -void -printnonterminals(grammar *g, FILE *fp) -{ - dfa *d; - int i; - - fprintf(fp, "/* Generated by Parser/pgen */\n\n"); - - d = g->g_dfa; - for (i = g->g_ndfas; --i >= 0; d++) - fprintf(fp, "#define %s %d\n", d->d_name, d->d_type); -} - -static void -printarcs(int i, dfa *d, FILE *fp) -{ - arc *a; - state *s; - int j, k; - - s = d->d_state; - for (j = 0; j < d->d_nstates; j++, s++) { - fprintf(fp, "static arc arcs_%d_%d[%d] = {\n", - i, j, s->s_narcs); - a = s->s_arc; - for (k = 0; k < s->s_narcs; k++, a++) - fprintf(fp, " {%d, %d},\n", a->a_lbl, a->a_arrow); - fprintf(fp, "};\n"); - } -} - -static void -printstates(grammar *g, FILE *fp) -{ - state *s; - dfa *d; - int i, j; - - d = g->g_dfa; - for (i = 0; i < g->g_ndfas; i++, d++) { - printarcs(i, d, fp); - fprintf(fp, "static state states_%d[%d] = {\n", - i, d->d_nstates); - s = d->d_state; - for (j = 0; j < d->d_nstates; j++, s++) - fprintf(fp, " {%d, arcs_%d_%d},\n", - s->s_narcs, i, j); - fprintf(fp, "};\n"); - } -} - -static void -printdfas(grammar *g, FILE *fp) -{ - dfa *d; - int i, j, n; - - printstates(g, fp); - fprintf(fp, "static dfa dfas[%d] = {\n", g->g_ndfas); - d = g->g_dfa; - for (i = 0; i < g->g_ndfas; i++, d++) { - fprintf(fp, " {%d, \"%s\", %d, %d, states_%d,\n", - d->d_type, d->d_name, d->d_initial, d->d_nstates, i); - fprintf(fp, " \""); - n = NBYTES(g->g_ll.ll_nlabels); - for (j = 0; j < n; j++) - fprintf(fp, "\\%03o", d->d_first[j] & 0xff); - fprintf(fp, "\"},\n"); - } - fprintf(fp, "};\n"); -} - -static void -printlabels(grammar *g, FILE *fp) -{ - label *l; - int i; - - fprintf(fp, "static label labels[%d] = {\n", g->g_ll.ll_nlabels); - l = g->g_ll.ll_label; - for (i = g->g_ll.ll_nlabels; --i >= 0; l++) { - if (l->lb_str == NULL) - fprintf(fp, " {%d, 0},\n", l->lb_type); - else - fprintf(fp, " {%d, \"%s\"},\n", - l->lb_type, l->lb_str); - } - fprintf(fp, "};\n"); -} diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index 1ded9ade3771..44ec41512cb1 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -10,13 +10,11 @@ #include "tokenizer.h" #include "errcode.h" -#ifndef PGEN #include "unicodeobject.h" #include "bytesobject.h" #include "fileobject.h" #include "codecs.h" #include "abstract.h" -#endif /* PGEN */ /* Alternate tab spacing */ #define ALTTABSIZE 1 @@ -81,11 +79,9 @@ tok_new(void) tok->enc = NULL; tok->encoding = NULL; tok->cont_line = 0; -#ifndef PGEN tok->filename = NULL; tok->decoding_readline = NULL; tok->decoding_buffer = NULL; -#endif tok->type_comments = 0; return tok; @@ -104,28 +100,6 @@ new_string(const char *s, Py_ssize_t len, struct tok_state *tok) return result; } -#ifdef PGEN - -static char * -decoding_fgets(char *s, int size, struct tok_state *tok) -{ - return fgets(s, size, tok->fp); -} - -static int -decoding_feof(struct tok_state *tok) -{ - return feof(tok->fp); -} - -static char * -decode_str(const char *str, int exec_input, struct tok_state *tok) -{ - return new_string(str, strlen(str), tok); -} - -#else /* PGEN */ - static char * error_ret(struct tok_state *tok) /* XXX */ { @@ -551,7 +525,6 @@ decoding_fgets(char *s, int size, struct tok_state *tok) return error_ret(tok); } } -#ifndef PGEN /* The default encoding is UTF-8, so make sure we don't have any non-UTF-8 sequences in it. */ if (line && !tok->encoding) { @@ -574,7 +547,6 @@ decoding_fgets(char *s, int size, struct tok_state *tok) badchar, tok->filename, tok->lineno + 1); return error_ret(tok); } -#endif return line; } @@ -738,8 +710,6 @@ decode_str(const char *input, int single, struct tok_state *tok) return str; } -#endif /* PGEN */ - /* Set up tokenizer for string */ struct tok_state * @@ -765,9 +735,7 @@ PyTokenizer_FromUTF8(const char *str, int exec_input) struct tok_state *tok = tok_new(); if (tok == NULL) return NULL; -#ifndef PGEN tok->input = str = translate_newlines(str, exec_input, tok); -#endif if (str == NULL) { PyTokenizer_Free(tok); return NULL; @@ -828,11 +796,9 @@ PyTokenizer_Free(struct tok_state *tok) { if (tok->encoding != NULL) PyMem_FREE(tok->encoding); -#ifndef PGEN Py_XDECREF(tok->decoding_readline); Py_XDECREF(tok->decoding_buffer); Py_XDECREF(tok->filename); -#endif if (tok->fp != NULL && tok->buf != NULL) PyMem_FREE(tok->buf); if (tok->input) @@ -871,7 +837,6 @@ tok_nextc(struct tok_state *tok) } if (tok->prompt != NULL) { char *newtok = PyOS_Readline(stdin, stdout, tok->prompt); -#ifndef PGEN if (newtok != NULL) { char *translated = translate_newlines(newtok, 0, tok); PyMem_FREE(newtok); @@ -900,7 +865,6 @@ tok_nextc(struct tok_state *tok) strcpy(newtok, buf); Py_DECREF(u); } -#endif if (tok->nextprompt != NULL) tok->prompt = tok->nextprompt; if (newtok == NULL) @@ -1056,7 +1020,6 @@ tok_backup(struct tok_state *tok, int c) static int syntaxerror(struct tok_state *tok, const char *format, ...) { -#ifndef PGEN va_list vargs; #ifdef HAVE_STDARG_PROTOTYPES va_start(vargs, format); @@ -1069,9 +1032,6 @@ syntaxerror(struct tok_state *tok, const char *format, ...) tok->lineno, (int)(tok->cur - tok->line_start)); tok->done = E_ERROR; -#else - tok->done = E_TOKEN; -#endif return ERRORTOKEN; } @@ -1083,9 +1043,6 @@ indenterror(struct tok_state *tok) return ERRORTOKEN; } -#ifdef PGEN -#define verify_identifier(tok) 1 -#else /* Verify that the identifier follows PEP 3131. All identifier strings are guaranteed to be "ready" unicode objects. */ @@ -1112,7 +1069,6 @@ verify_identifier(struct tok_state *tok) tok->done = E_IDENTIFIER; return result; } -#endif static int tok_decimal_tail(struct tok_state *tok) @@ -1667,25 +1623,20 @@ tok_get(struct tok_state *tok, char **p_start, char **p_end) case '(': case '[': case '{': -#ifndef PGEN if (tok->level >= MAXLEVEL) { return syntaxerror(tok, "too many nested parentheses"); } tok->parenstack[tok->level] = c; tok->parenlinenostack[tok->level] = tok->lineno; -#endif tok->level++; break; case ')': case ']': case '}': -#ifndef PGEN if (!tok->level) { return syntaxerror(tok, "unmatched '%c'", c); } -#endif tok->level--; -#ifndef PGEN int opening = tok->parenstack[tok->level]; if (!((opening == '(' && c == ')') || (opening == '[' && c == ']') || @@ -1704,7 +1655,6 @@ tok_get(struct tok_state *tok, char **p_start, char **p_end) c, opening); } } -#endif break; } @@ -1742,11 +1692,7 @@ PyTokenizer_FindEncodingFilename(int fd, PyObject *filename) FILE *fp; char *p_start =NULL , *p_end =NULL , *encoding = NULL; -#ifndef PGEN fd = _Py_dup(fd); -#else - fd = dup(fd); -#endif if (fd < 0) { return NULL; } @@ -1760,7 +1706,6 @@ PyTokenizer_FindEncodingFilename(int fd, PyObject *filename) fclose(fp); return NULL; } -#ifndef PGEN if (filename != NULL) { Py_INCREF(filename); tok->filename = filename; @@ -1773,7 +1718,6 @@ PyTokenizer_FindEncodingFilename(int fd, PyObject *filename) return encoding; } } -#endif while (tok->lineno < 2 && tok->done == E_OK) { PyTokenizer_Get(tok, &p_start, &p_end); } diff --git a/Parser/tokenizer.h b/Parser/tokenizer.h index 9639c658b1c2..22e91f7dca76 100644 --- a/Parser/tokenizer.h +++ b/Parser/tokenizer.h @@ -42,15 +42,9 @@ struct tok_state { expression (cf. issue 16806) */ int level; /* () [] {} Parentheses nesting level */ /* Used to allow free continuations inside them */ -#ifndef PGEN char parenstack[MAXLEVEL]; int parenlinenostack[MAXLEVEL]; - /* pgen doesn't have access to Python codecs, it cannot decode the input - filename. The bytes filename might be kept, but it is only used by - indenterror() and it is not really needed: pgen only compiles one file - (Grammar/Grammar). */ PyObject *filename; -#endif /* Stuff for checking on different tab sizes */ int altindstack[MAXINDENT]; /* Stack of alternate indents */ /* Stuff for PEP 0263 */ @@ -63,10 +57,8 @@ struct tok_state { const char* multi_line_start; /* pointer to start of first line of a single line or multi line string expression (cf. issue 16806) */ -#ifndef PGEN PyObject *decoding_readline; /* open(...).readline */ PyObject *decoding_buffer; -#endif const char* enc; /* Encoding for the current str. */ const char* str; const char* input; /* Tokenizer's newline translated copy of the string. */ diff --git a/Parser/tokenizer_pgen.c b/Parser/tokenizer_pgen.c deleted file mode 100644 index 9cb8492d6a64..000000000000 --- a/Parser/tokenizer_pgen.c +++ /dev/null @@ -1,2 +0,0 @@ -#define PGEN -#include "tokenizer.c" diff --git a/Python/graminit.c b/Python/graminit.c index 5cdde2789c72..6cb7bbc9f76f 100644 --- a/Python/graminit.c +++ b/Python/graminit.c @@ -5,8 +5,8 @@ grammar _PyParser_Grammar; static arc arcs_0_0[3] = { {2, 1}, - {3, 1}, - {4, 2}, + {3, 2}, + {4, 1}, }; static arc arcs_0_1[1] = { {0, 1}, @@ -20,9 +20,9 @@ static state states_0[3] = { {1, arcs_0_2}, }; static arc arcs_1_0[3] = { + {44, 1}, {2, 0}, - {6, 0}, - {7, 1}, + {45, 0}, }; static arc arcs_1_1[1] = { {0, 1}, @@ -32,11 +32,11 @@ static state states_1[2] = { {1, arcs_1_1}, }; static arc arcs_2_0[1] = { - {9, 1}, + {47, 1}, }; static arc arcs_2_1[2] = { + {44, 2}, {2, 1}, - {7, 2}, }; static arc arcs_2_2[1] = { {0, 2}, @@ -47,27 +47,27 @@ static state states_2[3] = { {1, arcs_2_2}, }; static arc arcs_3_0[1] = { - {11, 1}, + {10, 1}, }; static arc arcs_3_1[1] = { - {12, 2}, + {49, 2}, }; static arc arcs_3_2[2] = { - {13, 3}, + {5, 3}, {2, 4}, }; static arc arcs_3_3[2] = { - {14, 5}, - {15, 6}, + {50, 5}, + {51, 6}, }; static arc arcs_3_4[1] = { {0, 4}, }; static arc arcs_3_5[1] = { - {15, 6}, + {2, 4}, }; static arc arcs_3_6[1] = { - {2, 4}, + {50, 5}, }; static state states_3[7] = { {1, arcs_3_0}, @@ -79,10 +79,10 @@ static state states_3[7] = { {1, arcs_3_6}, }; static arc arcs_4_0[1] = { - {10, 1}, + {48, 1}, }; static arc arcs_4_1[2] = { - {10, 1}, + {48, 1}, {0, 1}, }; static state states_4[2] = { @@ -90,12 +90,12 @@ static state states_4[2] = { {2, arcs_4_1}, }; static arc arcs_5_0[1] = { - {16, 1}, + {52, 1}, }; static arc arcs_5_1[3] = { - {18, 2}, - {19, 2}, - {20, 2}, + {54, 2}, + {55, 2}, + {56, 2}, }; static arc arcs_5_2[1] = { {0, 2}, @@ -106,10 +106,10 @@ static state states_5[3] = { {1, arcs_5_2}, }; static arc arcs_6_0[1] = { - {21, 1}, + {16, 1}, }; static arc arcs_6_1[1] = { - {19, 2}, + {56, 2}, }; static arc arcs_6_2[1] = { {0, 2}, @@ -120,30 +120,30 @@ static state states_6[3] = { {1, arcs_6_2}, }; static arc arcs_7_0[1] = { - {22, 1}, + {21, 1}, }; static arc arcs_7_1[1] = { - {23, 2}, + {40, 2}, }; static arc arcs_7_2[1] = { - {24, 3}, + {57, 3}, }; static arc arcs_7_3[2] = { - {25, 4}, - {27, 5}, + {58, 4}, + {59, 5}, }; static arc arcs_7_4[1] = { - {26, 6}, + {60, 6}, }; static arc arcs_7_5[2] = { - {28, 7}, - {29, 8}, + {61, 7}, + {62, 8}, }; static arc arcs_7_6[1] = { - {27, 5}, + {59, 5}, }; static arc arcs_7_7[1] = { - {29, 8}, + {62, 8}, }; static arc arcs_7_8[1] = { {0, 8}, @@ -160,17 +160,17 @@ static state states_7[9] = { {1, arcs_7_8}, }; static arc arcs_8_0[1] = { - {13, 1}, + {5, 1}, }; static arc arcs_8_1[2] = { - {30, 2}, - {15, 3}, + {50, 2}, + {63, 3}, }; static arc arcs_8_2[1] = { - {15, 3}, + {0, 2}, }; static arc arcs_8_3[1] = { - {0, 3}, + {50, 2}, }; static state states_8[4] = { {1, arcs_8_0}, @@ -179,154 +179,147 @@ static state states_8[4] = { {1, arcs_8_3}, }; static arc arcs_9_0[3] = { - {31, 1}, - {34, 2}, - {35, 3}, + {6, 1}, + {64, 2}, + {65, 3}, }; static arc arcs_9_1[4] = { - {32, 4}, - {33, 5}, - {28, 6}, + {66, 4}, + {61, 5}, + {65, 6}, {0, 1}, }; -static arc arcs_9_2[4] = { - {31, 7}, - {33, 8}, - {28, 6}, - {0, 2}, +static arc arcs_9_2[1] = { + {65, 7}, }; -static arc arcs_9_3[1] = { - {31, 9}, +static arc arcs_9_3[4] = { + {66, 8}, + {67, 9}, + {61, 5}, + {0, 3}, }; -static arc arcs_9_4[1] = { - {26, 10}, +static arc arcs_9_4[4] = { + {64, 2}, + {61, 10}, + {65, 11}, + {0, 4}, }; -static arc arcs_9_5[5] = { - {28, 11}, - {31, 12}, - {34, 13}, - {35, 3}, +static arc arcs_9_5[1] = { {0, 5}, }; -static arc arcs_9_6[1] = { +static arc arcs_9_6[3] = { + {66, 4}, + {61, 5}, {0, 6}, }; static arc arcs_9_7[3] = { - {33, 8}, - {28, 6}, + {66, 12}, + {61, 5}, {0, 7}, }; -static arc arcs_9_8[4] = { - {28, 14}, - {31, 15}, - {35, 3}, +static arc arcs_9_8[5] = { + {6, 13}, + {64, 2}, + {61, 14}, + {65, 3}, {0, 8}, }; -static arc arcs_9_9[3] = { - {33, 16}, - {28, 6}, - {0, 9}, +static arc arcs_9_9[1] = { + {60, 15}, }; static arc arcs_9_10[3] = { - {33, 5}, - {28, 6}, + {64, 2}, + {65, 11}, {0, 10}, }; static arc arcs_9_11[4] = { - {31, 12}, - {34, 13}, - {35, 3}, + {66, 4}, + {67, 16}, + {61, 5}, {0, 11}, }; -static arc arcs_9_12[4] = { - {33, 5}, - {32, 4}, - {28, 6}, +static arc arcs_9_12[2] = { + {61, 5}, {0, 12}, }; static arc arcs_9_13[4] = { - {31, 17}, - {33, 18}, - {28, 6}, + {66, 17}, + {61, 5}, + {65, 18}, {0, 13}, }; -static arc arcs_9_14[3] = { - {31, 15}, - {35, 3}, +static arc arcs_9_14[4] = { + {6, 13}, + {64, 2}, + {65, 3}, {0, 14}, }; -static arc arcs_9_15[4] = { - {33, 8}, - {32, 19}, - {28, 6}, +static arc arcs_9_15[3] = { + {66, 8}, + {61, 5}, {0, 15}, }; -static arc arcs_9_16[2] = { - {28, 6}, - {0, 16}, +static arc arcs_9_16[1] = { + {60, 6}, }; -static arc arcs_9_17[3] = { - {33, 18}, - {28, 6}, +static arc arcs_9_17[4] = { + {64, 2}, + {61, 19}, + {65, 20}, {0, 17}, }; -static arc arcs_9_18[4] = { - {28, 20}, - {31, 21}, - {35, 3}, +static arc arcs_9_18[3] = { + {66, 17}, + {61, 5}, {0, 18}, }; -static arc arcs_9_19[1] = { - {26, 7}, +static arc arcs_9_19[3] = { + {64, 2}, + {65, 20}, + {0, 19}, }; -static arc arcs_9_20[3] = { - {31, 21}, - {35, 3}, +static arc arcs_9_20[4] = { + {66, 17}, + {67, 21}, + {61, 5}, {0, 20}, }; -static arc arcs_9_21[4] = { - {33, 18}, - {32, 22}, - {28, 6}, - {0, 21}, +static arc arcs_9_21[1] = { + {60, 18}, }; -static arc arcs_9_22[1] = { - {26, 17}, -}; -static state states_9[23] = { +static state states_9[22] = { {3, arcs_9_0}, {4, arcs_9_1}, - {4, arcs_9_2}, - {1, arcs_9_3}, - {1, arcs_9_4}, - {5, arcs_9_5}, - {1, arcs_9_6}, + {1, arcs_9_2}, + {4, arcs_9_3}, + {4, arcs_9_4}, + {1, arcs_9_5}, + {3, arcs_9_6}, {3, arcs_9_7}, - {4, arcs_9_8}, - {3, arcs_9_9}, + {5, arcs_9_8}, + {1, arcs_9_9}, {3, arcs_9_10}, {4, arcs_9_11}, - {4, arcs_9_12}, + {2, arcs_9_12}, {4, arcs_9_13}, - {3, arcs_9_14}, - {4, arcs_9_15}, - {2, arcs_9_16}, - {3, arcs_9_17}, - {4, arcs_9_18}, - {1, arcs_9_19}, - {3, arcs_9_20}, - {4, arcs_9_21}, - {1, arcs_9_22}, + {4, arcs_9_14}, + {3, arcs_9_15}, + {1, arcs_9_16}, + {4, arcs_9_17}, + {3, arcs_9_18}, + {3, arcs_9_19}, + {4, arcs_9_20}, + {1, arcs_9_21}, }; static arc arcs_10_0[1] = { - {23, 1}, + {40, 1}, }; static arc arcs_10_1[2] = { - {27, 2}, + {59, 2}, {0, 1}, }; static arc arcs_10_2[1] = { - {26, 3}, + {60, 3}, }; static arc arcs_10_3[1] = { {0, 3}, @@ -338,110 +331,104 @@ static state states_10[4] = { {1, arcs_10_3}, }; static arc arcs_11_0[3] = { - {37, 1}, - {34, 2}, - {35, 3}, + {6, 1}, + {64, 2}, + {69, 3}, }; static arc arcs_11_1[3] = { - {32, 4}, - {33, 5}, + {66, 4}, + {69, 5}, {0, 1}, }; -static arc arcs_11_2[3] = { - {37, 6}, - {33, 7}, - {0, 2}, +static arc arcs_11_2[1] = { + {69, 6}, }; -static arc arcs_11_3[1] = { - {37, 8}, +static arc arcs_11_3[3] = { + {66, 7}, + {67, 8}, + {0, 3}, }; -static arc arcs_11_4[1] = { - {26, 9}, +static arc arcs_11_4[3] = { + {64, 2}, + {69, 9}, + {0, 4}, }; -static arc arcs_11_5[4] = { - {37, 10}, - {34, 11}, - {35, 3}, +static arc arcs_11_5[2] = { + {66, 4}, {0, 5}, }; static arc arcs_11_6[2] = { - {33, 7}, + {66, 10}, {0, 6}, }; -static arc arcs_11_7[3] = { - {37, 12}, - {35, 3}, +static arc arcs_11_7[4] = { + {6, 11}, + {64, 2}, + {69, 3}, {0, 7}, }; -static arc arcs_11_8[2] = { - {33, 13}, - {0, 8}, +static arc arcs_11_8[1] = { + {60, 12}, }; -static arc arcs_11_9[2] = { - {33, 5}, +static arc arcs_11_9[3] = { + {66, 4}, + {67, 13}, {0, 9}, }; -static arc arcs_11_10[3] = { - {33, 5}, - {32, 4}, +static arc arcs_11_10[1] = { {0, 10}, }; static arc arcs_11_11[3] = { - {37, 14}, - {33, 15}, + {66, 14}, + {69, 15}, {0, 11}, }; -static arc arcs_11_12[3] = { - {33, 7}, - {32, 16}, +static arc arcs_11_12[2] = { + {66, 7}, {0, 12}, }; static arc arcs_11_13[1] = { - {0, 13}, + {60, 5}, }; -static arc arcs_11_14[2] = { - {33, 15}, +static arc arcs_11_14[3] = { + {64, 2}, + {69, 16}, {0, 14}, }; -static arc arcs_11_15[3] = { - {37, 17}, - {35, 3}, +static arc arcs_11_15[2] = { + {66, 14}, {0, 15}, }; -static arc arcs_11_16[1] = { - {26, 6}, -}; -static arc arcs_11_17[3] = { - {33, 15}, - {32, 18}, - {0, 17}, +static arc arcs_11_16[3] = { + {66, 14}, + {67, 17}, + {0, 16}, }; -static arc arcs_11_18[1] = { - {26, 14}, +static arc arcs_11_17[1] = { + {60, 15}, }; -static state states_11[19] = { +static state states_11[18] = { {3, arcs_11_0}, {3, arcs_11_1}, - {3, arcs_11_2}, - {1, arcs_11_3}, - {1, arcs_11_4}, - {4, arcs_11_5}, + {1, arcs_11_2}, + {3, arcs_11_3}, + {3, arcs_11_4}, + {2, arcs_11_5}, {2, arcs_11_6}, - {3, arcs_11_7}, - {2, arcs_11_8}, - {2, arcs_11_9}, - {3, arcs_11_10}, + {4, arcs_11_7}, + {1, arcs_11_8}, + {3, arcs_11_9}, + {1, arcs_11_10}, {3, arcs_11_11}, - {3, arcs_11_12}, + {2, arcs_11_12}, {1, arcs_11_13}, - {2, arcs_11_14}, - {3, arcs_11_15}, - {1, arcs_11_16}, - {3, arcs_11_17}, - {1, arcs_11_18}, + {3, arcs_11_14}, + {2, arcs_11_15}, + {3, arcs_11_16}, + {1, arcs_11_17}, }; static arc arcs_12_0[1] = { - {23, 1}, + {40, 1}, }; static arc arcs_12_1[1] = { {0, 1}, @@ -462,15 +449,15 @@ static state states_13[2] = { {1, arcs_13_1}, }; static arc arcs_14_0[1] = { - {38, 1}, + {70, 1}, }; static arc arcs_14_1[2] = { - {39, 2}, + {71, 2}, {2, 3}, }; static arc arcs_14_2[2] = { - {38, 1}, {2, 3}, + {70, 1}, }; static arc arcs_14_3[1] = { {0, 3}, @@ -482,14 +469,14 @@ static state states_14[4] = { {1, arcs_14_3}, }; static arc arcs_15_0[8] = { - {40, 1}, - {41, 1}, - {42, 1}, - {43, 1}, - {44, 1}, - {45, 1}, - {46, 1}, - {47, 1}, + {72, 1}, + {73, 1}, + {74, 1}, + {75, 1}, + {76, 1}, + {77, 1}, + {78, 1}, + {79, 1}, }; static arc arcs_15_1[1] = { {0, 1}, @@ -499,51 +486,51 @@ static state states_15[2] = { {1, arcs_15_1}, }; static arc arcs_16_0[1] = { - {48, 1}, + {80, 1}, }; static arc arcs_16_1[4] = { - {49, 2}, - {50, 3}, - {32, 4}, + {67, 2}, + {81, 3}, + {82, 4}, {0, 1}, }; -static arc arcs_16_2[1] = { - {0, 2}, +static arc arcs_16_2[2] = { + {80, 5}, + {83, 5}, }; -static arc arcs_16_3[2] = { - {51, 2}, - {9, 2}, +static arc arcs_16_3[1] = { + {0, 3}, }; static arc arcs_16_4[2] = { - {51, 5}, - {48, 5}, + {47, 3}, + {83, 3}, }; static arc arcs_16_5[3] = { - {32, 4}, - {28, 2}, + {67, 2}, + {61, 3}, {0, 5}, }; static state states_16[6] = { {1, arcs_16_0}, {4, arcs_16_1}, - {1, arcs_16_2}, - {2, arcs_16_3}, + {2, arcs_16_2}, + {1, arcs_16_3}, {2, arcs_16_4}, {3, arcs_16_5}, }; static arc arcs_17_0[1] = { - {27, 1}, + {59, 1}, }; static arc arcs_17_1[1] = { - {26, 2}, + {60, 2}, }; static arc arcs_17_2[2] = { - {32, 3}, + {67, 3}, {0, 2}, }; static arc arcs_17_3[2] = { - {51, 4}, - {9, 4}, + {47, 4}, + {83, 4}, }; static arc arcs_17_4[1] = { {0, 4}, @@ -556,16 +543,16 @@ static state states_17[5] = { {1, arcs_17_4}, }; static arc arcs_18_0[2] = { - {26, 1}, - {52, 1}, + {84, 1}, + {60, 1}, }; static arc arcs_18_1[2] = { - {33, 2}, + {66, 2}, {0, 1}, }; static arc arcs_18_2[3] = { - {26, 1}, - {52, 1}, + {84, 1}, + {60, 1}, {0, 2}, }; static state states_18[3] = { @@ -574,19 +561,19 @@ static state states_18[3] = { {3, arcs_18_2}, }; static arc arcs_19_0[13] = { - {53, 1}, - {54, 1}, - {55, 1}, - {56, 1}, - {57, 1}, - {58, 1}, - {59, 1}, - {60, 1}, - {61, 1}, - {62, 1}, - {63, 1}, - {64, 1}, - {65, 1}, + {85, 1}, + {86, 1}, + {87, 1}, + {88, 1}, + {89, 1}, + {90, 1}, + {91, 1}, + {92, 1}, + {93, 1}, + {94, 1}, + {95, 1}, + {96, 1}, + {97, 1}, }; static arc arcs_19_1[1] = { {0, 1}, @@ -596,10 +583,10 @@ static state states_19[2] = { {1, arcs_19_1}, }; static arc arcs_20_0[1] = { - {66, 1}, + {22, 1}, }; static arc arcs_20_1[1] = { - {67, 2}, + {98, 2}, }; static arc arcs_20_2[1] = { {0, 2}, @@ -610,7 +597,7 @@ static state states_20[3] = { {1, arcs_20_2}, }; static arc arcs_21_0[1] = { - {68, 1}, + {31, 1}, }; static arc arcs_21_1[1] = { {0, 1}, @@ -620,11 +607,11 @@ static state states_21[2] = { {1, arcs_21_1}, }; static arc arcs_22_0[5] = { - {69, 1}, - {70, 1}, - {71, 1}, - {72, 1}, - {73, 1}, + {99, 1}, + {100, 1}, + {101, 1}, + {102, 1}, + {103, 1}, }; static arc arcs_22_1[1] = { {0, 1}, @@ -634,7 +621,7 @@ static state states_22[2] = { {1, arcs_22_1}, }; static arc arcs_23_0[1] = { - {74, 1}, + {18, 1}, }; static arc arcs_23_1[1] = { {0, 1}, @@ -644,7 +631,7 @@ static state states_23[2] = { {1, arcs_23_1}, }; static arc arcs_24_0[1] = { - {75, 1}, + {20, 1}, }; static arc arcs_24_1[1] = { {0, 1}, @@ -654,10 +641,10 @@ static state states_24[2] = { {1, arcs_24_1}, }; static arc arcs_25_0[1] = { - {76, 1}, + {33, 1}, }; static arc arcs_25_1[2] = { - {48, 2}, + {80, 2}, {0, 1}, }; static arc arcs_25_2[1] = { @@ -669,7 +656,7 @@ static state states_25[3] = { {1, arcs_25_2}, }; static arc arcs_26_0[1] = { - {51, 1}, + {83, 1}, }; static arc arcs_26_1[1] = { {0, 1}, @@ -679,18 +666,18 @@ static state states_26[2] = { {1, arcs_26_1}, }; static arc arcs_27_0[1] = { - {77, 1}, + {32, 1}, }; static arc arcs_27_1[2] = { - {26, 2}, + {60, 2}, {0, 1}, }; static arc arcs_27_2[2] = { - {78, 3}, + {24, 3}, {0, 2}, }; static arc arcs_27_3[1] = { - {26, 4}, + {60, 4}, }; static arc arcs_27_4[1] = { {0, 4}, @@ -703,8 +690,8 @@ static state states_27[5] = { {1, arcs_27_4}, }; static arc arcs_28_0[2] = { - {79, 1}, - {80, 1}, + {104, 1}, + {105, 1}, }; static arc arcs_28_1[1] = { {0, 1}, @@ -714,10 +701,10 @@ static state states_28[2] = { {1, arcs_28_1}, }; static arc arcs_29_0[1] = { - {81, 1}, + {27, 1}, }; static arc arcs_29_1[1] = { - {82, 2}, + {106, 2}, }; static arc arcs_29_2[1] = { {0, 2}, @@ -728,35 +715,35 @@ static state states_29[3] = { {1, arcs_29_2}, }; static arc arcs_30_0[1] = { - {78, 1}, + {24, 1}, }; static arc arcs_30_1[3] = { - {83, 2}, - {84, 2}, - {12, 3}, + {107, 2}, + {9, 2}, + {49, 3}, }; static arc arcs_30_2[4] = { - {83, 2}, - {84, 2}, - {12, 3}, - {81, 4}, + {107, 2}, + {9, 2}, + {27, 4}, + {49, 3}, }; static arc arcs_30_3[1] = { - {81, 4}, + {27, 4}, }; static arc arcs_30_4[3] = { - {34, 5}, - {13, 6}, - {85, 5}, + {5, 5}, + {6, 6}, + {108, 6}, }; static arc arcs_30_5[1] = { - {0, 5}, + {108, 7}, }; static arc arcs_30_6[1] = { - {85, 7}, + {0, 6}, }; static arc arcs_30_7[1] = { - {15, 5}, + {50, 6}, }; static state states_30[8] = { {1, arcs_30_0}, @@ -769,14 +756,14 @@ static state states_30[8] = { {1, arcs_30_7}, }; static arc arcs_31_0[1] = { - {23, 1}, + {40, 1}, }; static arc arcs_31_1[2] = { - {87, 2}, + {110, 2}, {0, 1}, }; static arc arcs_31_2[1] = { - {23, 3}, + {40, 3}, }; static arc arcs_31_3[1] = { {0, 3}, @@ -788,14 +775,14 @@ static state states_31[4] = { {1, arcs_31_3}, }; static arc arcs_32_0[1] = { - {12, 1}, + {49, 1}, }; static arc arcs_32_1[2] = { - {87, 2}, + {110, 2}, {0, 1}, }; static arc arcs_32_2[1] = { - {23, 3}, + {40, 3}, }; static arc arcs_32_3[1] = { {0, 3}, @@ -807,14 +794,14 @@ static state states_32[4] = { {1, arcs_32_3}, }; static arc arcs_33_0[1] = { - {86, 1}, + {109, 1}, }; static arc arcs_33_1[2] = { - {33, 2}, + {66, 2}, {0, 1}, }; static arc arcs_33_2[2] = { - {86, 1}, + {109, 1}, {0, 2}, }; static state states_33[3] = { @@ -823,10 +810,10 @@ static state states_33[3] = { {2, arcs_33_2}, }; static arc arcs_34_0[1] = { - {88, 1}, + {111, 1}, }; static arc arcs_34_1[2] = { - {33, 0}, + {66, 0}, {0, 1}, }; static state states_34[2] = { @@ -834,10 +821,10 @@ static state states_34[2] = { {2, arcs_34_1}, }; static arc arcs_35_0[1] = { - {23, 1}, + {40, 1}, }; static arc arcs_35_1[2] = { - {83, 0}, + {107, 0}, {0, 1}, }; static state states_35[2] = { @@ -845,13 +832,13 @@ static state states_35[2] = { {2, arcs_35_1}, }; static arc arcs_36_0[1] = { - {89, 1}, + {25, 1}, }; static arc arcs_36_1[1] = { - {23, 2}, + {40, 2}, }; static arc arcs_36_2[2] = { - {33, 1}, + {66, 1}, {0, 2}, }; static state states_36[3] = { @@ -860,13 +847,13 @@ static state states_36[3] = { {2, arcs_36_2}, }; static arc arcs_37_0[1] = { - {90, 1}, + {29, 1}, }; static arc arcs_37_1[1] = { - {23, 2}, + {40, 2}, }; static arc arcs_37_2[2] = { - {33, 1}, + {66, 1}, {0, 2}, }; static state states_37[3] = { @@ -875,17 +862,17 @@ static state states_37[3] = { {2, arcs_37_2}, }; static arc arcs_38_0[1] = { - {91, 1}, + {15, 1}, }; static arc arcs_38_1[1] = { - {26, 2}, + {60, 2}, }; static arc arcs_38_2[2] = { - {33, 3}, + {66, 3}, {0, 2}, }; static arc arcs_38_3[1] = { - {26, 4}, + {60, 4}, }; static arc arcs_38_4[1] = { {0, 4}, @@ -898,15 +885,15 @@ static state states_38[5] = { {1, arcs_38_4}, }; static arc arcs_39_0[9] = { - {92, 1}, - {93, 1}, - {94, 1}, - {95, 1}, - {96, 1}, - {19, 1}, - {18, 1}, - {17, 1}, - {97, 1}, + {112, 1}, + {55, 1}, + {53, 1}, + {113, 1}, + {56, 1}, + {114, 1}, + {115, 1}, + {116, 1}, + {117, 1}, }; static arc arcs_39_1[1] = { {0, 1}, @@ -916,12 +903,12 @@ static state states_39[2] = { {1, arcs_39_1}, }; static arc arcs_40_0[1] = { - {21, 1}, + {16, 1}, }; static arc arcs_40_1[3] = { - {19, 2}, - {96, 2}, - {94, 2}, + {113, 2}, + {56, 2}, + {117, 2}, }; static arc arcs_40_2[1] = { {0, 2}, @@ -932,27 +919,27 @@ static state states_40[3] = { {1, arcs_40_2}, }; static arc arcs_41_0[1] = { - {98, 1}, + {26, 1}, }; static arc arcs_41_1[1] = { - {99, 2}, + {118, 2}, }; static arc arcs_41_2[1] = { - {27, 3}, + {59, 3}, }; static arc arcs_41_3[1] = { - {100, 4}, + {119, 4}, }; static arc arcs_41_4[3] = { - {101, 1}, - {102, 5}, + {120, 1}, + {121, 5}, {0, 4}, }; static arc arcs_41_5[1] = { - {27, 6}, + {59, 6}, }; static arc arcs_41_6[1] = { - {100, 7}, + {119, 7}, }; static arc arcs_41_7[1] = { {0, 7}, @@ -968,26 +955,26 @@ static state states_41[8] = { {1, arcs_41_7}, }; static arc arcs_42_0[1] = { - {103, 1}, + {35, 1}, }; static arc arcs_42_1[1] = { - {99, 2}, + {118, 2}, }; static arc arcs_42_2[1] = { - {27, 3}, + {59, 3}, }; static arc arcs_42_3[1] = { - {100, 4}, + {119, 4}, }; static arc arcs_42_4[2] = { - {102, 5}, + {121, 5}, {0, 4}, }; static arc arcs_42_5[1] = { - {27, 6}, + {59, 6}, }; static arc arcs_42_6[1] = { - {100, 7}, + {119, 7}, }; static arc arcs_42_7[1] = { {0, 7}, @@ -1003,36 +990,36 @@ static state states_42[8] = { {1, arcs_42_7}, }; static arc arcs_43_0[1] = { - {104, 1}, + {23, 1}, }; static arc arcs_43_1[1] = { - {67, 2}, + {98, 2}, }; static arc arcs_43_2[1] = { - {105, 3}, + {122, 3}, }; static arc arcs_43_3[1] = { - {9, 4}, + {47, 4}, }; static arc arcs_43_4[1] = { - {27, 5}, + {59, 5}, }; static arc arcs_43_5[2] = { - {28, 6}, - {100, 7}, + {61, 6}, + {119, 7}, }; static arc arcs_43_6[1] = { - {100, 7}, + {119, 7}, }; static arc arcs_43_7[2] = { - {102, 8}, + {121, 8}, {0, 7}, }; static arc arcs_43_8[1] = { - {27, 9}, + {59, 9}, }; static arc arcs_43_9[1] = { - {100, 10}, + {119, 10}, }; static arc arcs_43_10[1] = { {0, 10}, @@ -1051,47 +1038,47 @@ static state states_43[11] = { {1, arcs_43_10}, }; static arc arcs_44_0[1] = { - {106, 1}, + {34, 1}, }; static arc arcs_44_1[1] = { - {27, 2}, + {59, 2}, }; static arc arcs_44_2[1] = { - {100, 3}, + {119, 3}, }; static arc arcs_44_3[2] = { - {107, 4}, - {108, 5}, + {123, 4}, + {124, 5}, }; static arc arcs_44_4[1] = { - {27, 6}, + {59, 6}, }; static arc arcs_44_5[1] = { - {27, 7}, + {59, 7}, }; static arc arcs_44_6[1] = { - {100, 8}, + {119, 8}, }; static arc arcs_44_7[1] = { - {100, 9}, + {119, 9}, }; -static arc arcs_44_8[4] = { - {107, 4}, - {102, 10}, - {108, 5}, +static arc arcs_44_8[1] = { {0, 8}, }; -static arc arcs_44_9[1] = { +static arc arcs_44_9[4] = { + {121, 10}, + {123, 4}, + {124, 5}, {0, 9}, }; static arc arcs_44_10[1] = { - {27, 11}, + {59, 11}, }; static arc arcs_44_11[1] = { - {100, 12}, + {119, 12}, }; static arc arcs_44_12[2] = { - {108, 5}, + {123, 4}, {0, 12}, }; static state states_44[13] = { @@ -1103,28 +1090,28 @@ static state states_44[13] = { {1, arcs_44_5}, {1, arcs_44_6}, {1, arcs_44_7}, - {4, arcs_44_8}, - {1, arcs_44_9}, + {1, arcs_44_8}, + {4, arcs_44_9}, {1, arcs_44_10}, {1, arcs_44_11}, {2, arcs_44_12}, }; static arc arcs_45_0[1] = { - {109, 1}, + {36, 1}, }; static arc arcs_45_1[1] = { - {110, 2}, + {125, 2}, }; static arc arcs_45_2[2] = { - {33, 1}, - {27, 3}, + {66, 1}, + {59, 3}, }; static arc arcs_45_3[2] = { - {28, 4}, - {100, 5}, + {61, 4}, + {119, 5}, }; static arc arcs_45_4[1] = { - {100, 5}, + {119, 5}, }; static arc arcs_45_5[1] = { {0, 5}, @@ -1138,14 +1125,14 @@ static state states_45[6] = { {1, arcs_45_5}, }; static arc arcs_46_0[1] = { - {26, 1}, + {60, 1}, }; static arc arcs_46_1[2] = { - {87, 2}, + {110, 2}, {0, 1}, }; static arc arcs_46_2[1] = { - {111, 3}, + {126, 3}, }; static arc arcs_46_3[1] = { {0, 3}, @@ -1157,18 +1144,18 @@ static state states_46[4] = { {1, arcs_46_3}, }; static arc arcs_47_0[1] = { - {112, 1}, + {127, 1}, }; static arc arcs_47_1[2] = { - {26, 2}, + {60, 2}, {0, 1}, }; static arc arcs_47_2[2] = { - {87, 3}, + {110, 3}, {0, 2}, }; static arc arcs_47_3[1] = { - {23, 4}, + {40, 4}, }; static arc arcs_47_4[1] = { {0, 4}, @@ -1181,21 +1168,21 @@ static state states_47[5] = { {1, arcs_47_4}, }; static arc arcs_48_0[2] = { - {3, 1}, - {2, 2}, + {2, 1}, + {4, 2}, }; static arc arcs_48_1[1] = { - {0, 1}, + {128, 3}, }; static arc arcs_48_2[1] = { - {113, 3}, + {0, 2}, }; static arc arcs_48_3[1] = { - {6, 4}, + {45, 4}, }; static arc arcs_48_4[2] = { - {6, 4}, - {114, 1}, + {129, 2}, + {45, 4}, }; static state states_48[5] = { {2, arcs_48_0}, @@ -1205,14 +1192,14 @@ static state states_48[5] = { {2, arcs_48_4}, }; static arc arcs_49_0[1] = { - {26, 1}, + {60, 1}, }; static arc arcs_49_1[2] = { - {115, 2}, + {130, 2}, {0, 1}, }; static arc arcs_49_2[1] = { - {26, 3}, + {60, 3}, }; static arc arcs_49_3[1] = { {0, 3}, @@ -1224,36 +1211,36 @@ static state states_49[4] = { {1, arcs_49_3}, }; static arc arcs_50_0[2] = { - {116, 1}, - {117, 2}, + {131, 1}, + {132, 2}, }; -static arc arcs_50_1[2] = { - {98, 3}, +static arc arcs_50_1[1] = { {0, 1}, }; -static arc arcs_50_2[1] = { +static arc arcs_50_2[2] = { + {26, 3}, {0, 2}, }; static arc arcs_50_3[1] = { - {116, 4}, + {132, 4}, }; static arc arcs_50_4[1] = { - {102, 5}, + {121, 5}, }; static arc arcs_50_5[1] = { - {26, 2}, + {60, 1}, }; static state states_50[6] = { {2, arcs_50_0}, - {2, arcs_50_1}, - {1, arcs_50_2}, + {1, arcs_50_1}, + {2, arcs_50_2}, {1, arcs_50_3}, {1, arcs_50_4}, {1, arcs_50_5}, }; static arc arcs_51_0[2] = { - {116, 1}, - {119, 1}, + {134, 1}, + {132, 1}, }; static arc arcs_51_1[1] = { {0, 1}, @@ -1263,17 +1250,17 @@ static state states_51[2] = { {1, arcs_51_1}, }; static arc arcs_52_0[1] = { - {120, 1}, + {28, 1}, }; static arc arcs_52_1[2] = { - {36, 2}, - {27, 3}, + {59, 2}, + {68, 3}, }; static arc arcs_52_2[1] = { - {27, 3}, + {60, 4}, }; static arc arcs_52_3[1] = { - {26, 4}, + {59, 2}, }; static arc arcs_52_4[1] = { {0, 4}, @@ -1286,17 +1273,17 @@ static state states_52[5] = { {1, arcs_52_4}, }; static arc arcs_53_0[1] = { - {120, 1}, + {28, 1}, }; static arc arcs_53_1[2] = { - {36, 2}, - {27, 3}, + {59, 2}, + {68, 3}, }; static arc arcs_53_2[1] = { - {27, 3}, + {133, 4}, }; static arc arcs_53_3[1] = { - {118, 4}, + {59, 2}, }; static arc arcs_53_4[1] = { {0, 4}, @@ -1309,10 +1296,10 @@ static state states_53[5] = { {1, arcs_53_4}, }; static arc arcs_54_0[1] = { - {121, 1}, + {135, 1}, }; static arc arcs_54_1[2] = { - {122, 0}, + {136, 0}, {0, 1}, }; static state states_54[2] = { @@ -1320,10 +1307,10 @@ static state states_54[2] = { {2, arcs_54_1}, }; static arc arcs_55_0[1] = { - {123, 1}, + {137, 1}, }; static arc arcs_55_1[2] = { - {124, 0}, + {138, 0}, {0, 1}, }; static state states_55[2] = { @@ -1331,11 +1318,11 @@ static state states_55[2] = { {2, arcs_55_1}, }; static arc arcs_56_0[2] = { - {125, 1}, - {126, 2}, + {30, 1}, + {139, 2}, }; static arc arcs_56_1[1] = { - {123, 2}, + {137, 2}, }; static arc arcs_56_2[1] = { {0, 2}, @@ -1346,10 +1333,10 @@ static state states_56[3] = { {1, arcs_56_2}, }; static arc arcs_57_0[1] = { - {111, 1}, + {126, 1}, }; static arc arcs_57_1[2] = { - {127, 0}, + {140, 0}, {0, 1}, }; static state states_57[2] = { @@ -1357,38 +1344,38 @@ static state states_57[2] = { {2, arcs_57_1}, }; static arc arcs_58_0[10] = { - {128, 1}, - {129, 1}, - {130, 1}, - {131, 1}, - {132, 1}, - {133, 1}, - {134, 1}, - {105, 1}, - {125, 2}, - {135, 3}, + {141, 1}, + {142, 1}, + {143, 1}, + {141, 1}, + {144, 1}, + {145, 1}, + {146, 1}, + {122, 1}, + {147, 2}, + {30, 3}, }; static arc arcs_58_1[1] = { {0, 1}, }; -static arc arcs_58_2[1] = { - {105, 1}, +static arc arcs_58_2[2] = { + {30, 1}, + {0, 2}, }; -static arc arcs_58_3[2] = { - {125, 1}, - {0, 3}, +static arc arcs_58_3[1] = { + {122, 1}, }; static state states_58[4] = { {10, arcs_58_0}, {1, arcs_58_1}, - {1, arcs_58_2}, - {2, arcs_58_3}, + {2, arcs_58_2}, + {1, arcs_58_3}, }; static arc arcs_59_0[1] = { - {34, 1}, + {6, 1}, }; static arc arcs_59_1[1] = { - {111, 2}, + {126, 2}, }; static arc arcs_59_2[1] = { {0, 2}, @@ -1399,10 +1386,10 @@ static state states_59[3] = { {1, arcs_59_2}, }; static arc arcs_60_0[1] = { - {136, 1}, + {148, 1}, }; static arc arcs_60_1[2] = { - {137, 0}, + {149, 0}, {0, 1}, }; static state states_60[2] = { @@ -1410,10 +1397,10 @@ static state states_60[2] = { {2, arcs_60_1}, }; static arc arcs_61_0[1] = { - {138, 1}, + {150, 1}, }; static arc arcs_61_1[2] = { - {139, 0}, + {151, 0}, {0, 1}, }; static state states_61[2] = { @@ -1421,10 +1408,10 @@ static state states_61[2] = { {2, arcs_61_1}, }; static arc arcs_62_0[1] = { - {140, 1}, + {152, 1}, }; static arc arcs_62_1[2] = { - {141, 0}, + {153, 0}, {0, 1}, }; static state states_62[2] = { @@ -1432,11 +1419,11 @@ static state states_62[2] = { {2, arcs_62_1}, }; static arc arcs_63_0[1] = { - {142, 1}, + {154, 1}, }; static arc arcs_63_1[3] = { - {143, 0}, - {144, 0}, + {155, 0}, + {156, 0}, {0, 1}, }; static state states_63[2] = { @@ -1444,11 +1431,11 @@ static state states_63[2] = { {3, arcs_63_1}, }; static arc arcs_64_0[1] = { - {145, 1}, + {157, 1}, }; static arc arcs_64_1[3] = { - {146, 0}, - {147, 0}, + {7, 0}, + {8, 0}, {0, 1}, }; static state states_64[2] = { @@ -1456,14 +1443,14 @@ static state states_64[2] = { {3, arcs_64_1}, }; static arc arcs_65_0[1] = { - {148, 1}, + {158, 1}, }; static arc arcs_65_1[6] = { - {34, 0}, - {11, 0}, - {149, 0}, - {150, 0}, - {151, 0}, + {159, 0}, + {6, 0}, + {160, 0}, + {161, 0}, + {10, 0}, {0, 1}, }; static state states_65[2] = { @@ -1471,13 +1458,13 @@ static state states_65[2] = { {6, arcs_65_1}, }; static arc arcs_66_0[4] = { - {146, 1}, - {147, 1}, - {152, 1}, - {153, 2}, + {7, 1}, + {8, 1}, + {39, 1}, + {162, 2}, }; static arc arcs_66_1[1] = { - {148, 2}, + {158, 2}, }; static arc arcs_66_2[1] = { {0, 2}, @@ -1488,14 +1475,14 @@ static state states_66[3] = { {1, arcs_66_2}, }; static arc arcs_67_0[1] = { - {154, 1}, + {163, 1}, }; static arc arcs_67_1[2] = { - {35, 2}, + {64, 2}, {0, 1}, }; static arc arcs_67_2[1] = { - {148, 3}, + {158, 3}, }; static arc arcs_67_3[1] = { {0, 3}, @@ -1507,14 +1494,14 @@ static state states_67[4] = { {1, arcs_67_3}, }; static arc arcs_68_0[2] = { - {155, 1}, - {156, 2}, + {17, 1}, + {164, 2}, }; static arc arcs_68_1[1] = { - {156, 2}, + {164, 2}, }; static arc arcs_68_2[2] = { - {157, 2}, + {165, 2}, {0, 2}, }; static state states_68[3] = { @@ -1523,108 +1510,108 @@ static state states_68[3] = { {2, arcs_68_2}, }; static arc arcs_69_0[10] = { - {13, 1}, - {159, 2}, - {161, 3}, - {23, 4}, - {164, 4}, - {165, 5}, - {84, 4}, - {166, 4}, - {167, 4}, - {168, 4}, + {5, 1}, + {9, 2}, + {11, 2}, + {12, 2}, + {13, 2}, + {14, 3}, + {38, 4}, + {40, 2}, + {41, 2}, + {42, 5}, }; static arc arcs_69_1[3] = { - {51, 6}, - {158, 6}, - {15, 4}, + {50, 2}, + {166, 6}, + {83, 6}, }; -static arc arcs_69_2[2] = { - {158, 7}, - {160, 4}, +static arc arcs_69_2[1] = { + {0, 2}, }; static arc arcs_69_3[2] = { - {162, 8}, - {163, 4}, + {167, 2}, + {166, 7}, }; -static arc arcs_69_4[1] = { - {0, 4}, +static arc arcs_69_4[2] = { + {168, 2}, + {169, 8}, }; static arc arcs_69_5[2] = { - {165, 5}, + {42, 5}, {0, 5}, }; static arc arcs_69_6[1] = { - {15, 4}, + {50, 2}, }; static arc arcs_69_7[1] = { - {160, 4}, + {167, 2}, }; static arc arcs_69_8[1] = { - {163, 4}, + {168, 2}, }; static state states_69[9] = { {10, arcs_69_0}, {3, arcs_69_1}, - {2, arcs_69_2}, + {1, arcs_69_2}, {2, arcs_69_3}, - {1, arcs_69_4}, + {2, arcs_69_4}, {2, arcs_69_5}, {1, arcs_69_6}, {1, arcs_69_7}, {1, arcs_69_8}, }; static arc arcs_70_0[2] = { - {99, 1}, - {52, 1}, + {118, 1}, + {84, 1}, }; static arc arcs_70_1[3] = { - {169, 2}, - {33, 3}, + {66, 2}, + {170, 3}, {0, 1}, }; -static arc arcs_70_2[1] = { +static arc arcs_70_2[3] = { + {118, 4}, + {84, 4}, {0, 2}, }; -static arc arcs_70_3[3] = { - {99, 4}, - {52, 4}, +static arc arcs_70_3[1] = { {0, 3}, }; static arc arcs_70_4[2] = { - {33, 3}, + {66, 2}, {0, 4}, }; static state states_70[5] = { {2, arcs_70_0}, {3, arcs_70_1}, - {1, arcs_70_2}, - {3, arcs_70_3}, + {3, arcs_70_2}, + {1, arcs_70_3}, {2, arcs_70_4}, }; static arc arcs_71_0[3] = { - {13, 1}, - {159, 2}, - {83, 3}, + {5, 1}, + {107, 2}, + {14, 3}, }; static arc arcs_71_1[2] = { - {14, 4}, - {15, 5}, + {50, 4}, + {51, 5}, }; static arc arcs_71_2[1] = { - {170, 6}, + {40, 4}, }; static arc arcs_71_3[1] = { - {23, 5}, + {171, 6}, }; static arc arcs_71_4[1] = { - {15, 5}, + {0, 4}, }; static arc arcs_71_5[1] = { - {0, 5}, + {50, 4}, }; static arc arcs_71_6[1] = { - {160, 5}, + {167, 4}, }; static state states_71[7] = { {3, arcs_71_0}, @@ -1636,14 +1623,14 @@ static state states_71[7] = { {1, arcs_71_6}, }; static arc arcs_72_0[1] = { - {171, 1}, + {172, 1}, }; static arc arcs_72_1[2] = { - {33, 2}, + {66, 2}, {0, 1}, }; static arc arcs_72_2[2] = { - {171, 1}, + {172, 1}, {0, 2}, }; static state states_72[3] = { @@ -1652,37 +1639,37 @@ static state states_72[3] = { {2, arcs_72_2}, }; static arc arcs_73_0[2] = { - {26, 1}, - {27, 2}, + {59, 1}, + {60, 2}, }; -static arc arcs_73_1[2] = { - {27, 2}, +static arc arcs_73_1[3] = { + {173, 3}, + {60, 4}, {0, 1}, }; -static arc arcs_73_2[3] = { - {26, 3}, - {172, 4}, +static arc arcs_73_2[2] = { + {59, 1}, {0, 2}, }; -static arc arcs_73_3[2] = { - {172, 4}, +static arc arcs_73_3[1] = { {0, 3}, }; -static arc arcs_73_4[1] = { +static arc arcs_73_4[2] = { + {173, 3}, {0, 4}, }; static state states_73[5] = { {2, arcs_73_0}, - {2, arcs_73_1}, - {3, arcs_73_2}, - {2, arcs_73_3}, - {1, arcs_73_4}, + {3, arcs_73_1}, + {2, arcs_73_2}, + {1, arcs_73_3}, + {2, arcs_73_4}, }; static arc arcs_74_0[1] = { - {27, 1}, + {59, 1}, }; static arc arcs_74_1[2] = { - {26, 2}, + {60, 2}, {0, 1}, }; static arc arcs_74_2[1] = { @@ -1694,16 +1681,16 @@ static state states_74[3] = { {1, arcs_74_2}, }; static arc arcs_75_0[2] = { - {111, 1}, - {52, 1}, + {126, 1}, + {84, 1}, }; static arc arcs_75_1[2] = { - {33, 2}, + {66, 2}, {0, 1}, }; static arc arcs_75_2[3] = { - {111, 1}, - {52, 1}, + {126, 1}, + {84, 1}, {0, 2}, }; static state states_75[3] = { @@ -1712,14 +1699,14 @@ static state states_75[3] = { {3, arcs_75_2}, }; static arc arcs_76_0[1] = { - {26, 1}, + {60, 1}, }; static arc arcs_76_1[2] = { - {33, 2}, + {66, 2}, {0, 1}, }; static arc arcs_76_2[2] = { - {26, 1}, + {60, 1}, {0, 2}, }; static state states_76[3] = { @@ -1728,100 +1715,100 @@ static state states_76[3] = { {2, arcs_76_2}, }; static arc arcs_77_0[3] = { - {26, 1}, - {35, 2}, - {52, 3}, + {64, 1}, + {84, 2}, + {60, 3}, }; -static arc arcs_77_1[4] = { - {27, 4}, - {169, 5}, - {33, 6}, - {0, 1}, +static arc arcs_77_1[1] = { + {126, 4}, }; -static arc arcs_77_2[1] = { - {111, 7}, +static arc arcs_77_2[3] = { + {66, 5}, + {170, 6}, + {0, 2}, }; -static arc arcs_77_3[3] = { - {169, 5}, - {33, 6}, +static arc arcs_77_3[4] = { + {66, 5}, + {59, 7}, + {170, 6}, {0, 3}, }; -static arc arcs_77_4[1] = { - {26, 7}, +static arc arcs_77_4[3] = { + {66, 8}, + {170, 6}, + {0, 4}, }; -static arc arcs_77_5[1] = { +static arc arcs_77_5[3] = { + {84, 9}, + {60, 9}, {0, 5}, }; -static arc arcs_77_6[3] = { - {26, 8}, - {52, 8}, +static arc arcs_77_6[1] = { {0, 6}, }; -static arc arcs_77_7[3] = { - {169, 5}, - {33, 9}, - {0, 7}, +static arc arcs_77_7[1] = { + {60, 4}, }; -static arc arcs_77_8[2] = { - {33, 6}, +static arc arcs_77_8[3] = { + {64, 10}, + {60, 11}, {0, 8}, }; -static arc arcs_77_9[3] = { - {26, 10}, - {35, 11}, +static arc arcs_77_9[2] = { + {66, 5}, {0, 9}, }; static arc arcs_77_10[1] = { - {27, 12}, + {126, 12}, }; static arc arcs_77_11[1] = { - {111, 13}, + {59, 13}, }; -static arc arcs_77_12[1] = { - {26, 13}, +static arc arcs_77_12[2] = { + {66, 8}, + {0, 12}, }; -static arc arcs_77_13[2] = { - {33, 9}, - {0, 13}, +static arc arcs_77_13[1] = { + {60, 12}, }; static state states_77[14] = { {3, arcs_77_0}, - {4, arcs_77_1}, - {1, arcs_77_2}, - {3, arcs_77_3}, - {1, arcs_77_4}, - {1, arcs_77_5}, - {3, arcs_77_6}, - {3, arcs_77_7}, - {2, arcs_77_8}, - {3, arcs_77_9}, + {1, arcs_77_1}, + {3, arcs_77_2}, + {4, arcs_77_3}, + {3, arcs_77_4}, + {3, arcs_77_5}, + {1, arcs_77_6}, + {1, arcs_77_7}, + {3, arcs_77_8}, + {2, arcs_77_9}, {1, arcs_77_10}, {1, arcs_77_11}, - {1, arcs_77_12}, - {2, arcs_77_13}, + {2, arcs_77_12}, + {1, arcs_77_13}, }; static arc arcs_78_0[1] = { - {173, 1}, + {19, 1}, }; static arc arcs_78_1[1] = { - {23, 2}, + {40, 2}, }; static arc arcs_78_2[2] = { - {13, 3}, - {27, 4}, + {5, 3}, + {59, 4}, }; static arc arcs_78_3[2] = { - {14, 5}, - {15, 6}, + {50, 5}, + {51, 6}, }; static arc arcs_78_4[1] = { - {100, 7}, + {119, 7}, }; static arc arcs_78_5[1] = { - {15, 6}, + {59, 4}, }; static arc arcs_78_6[1] = { - {27, 4}, + {50, 5}, }; static arc arcs_78_7[1] = { {0, 7}, @@ -1840,7 +1827,7 @@ static arc arcs_79_0[1] = { {174, 1}, }; static arc arcs_79_1[2] = { - {33, 2}, + {66, 2}, {0, 1}, }; static arc arcs_79_2[2] = { @@ -1853,30 +1840,30 @@ static state states_79[3] = { {2, arcs_79_2}, }; static arc arcs_80_0[3] = { - {26, 1}, - {35, 2}, - {34, 2}, + {6, 1}, + {64, 1}, + {60, 2}, }; -static arc arcs_80_1[4] = { - {169, 3}, - {115, 2}, - {32, 2}, - {0, 1}, +static arc arcs_80_1[1] = { + {60, 3}, }; -static arc arcs_80_2[1] = { - {26, 3}, +static arc arcs_80_2[4] = { + {130, 1}, + {67, 1}, + {170, 3}, + {0, 2}, }; static arc arcs_80_3[1] = { {0, 3}, }; static state states_80[4] = { {3, arcs_80_0}, - {4, arcs_80_1}, - {1, arcs_80_2}, + {1, arcs_80_1}, + {4, arcs_80_2}, {1, arcs_80_3}, }; static arc arcs_81_0[2] = { - {169, 1}, + {170, 1}, {176, 1}, }; static arc arcs_81_1[1] = { @@ -1887,16 +1874,16 @@ static state states_81[2] = { {1, arcs_81_1}, }; static arc arcs_82_0[1] = { - {104, 1}, + {23, 1}, }; static arc arcs_82_1[1] = { - {67, 2}, + {98, 2}, }; static arc arcs_82_2[1] = { - {105, 3}, + {122, 3}, }; static arc arcs_82_3[1] = { - {116, 4}, + {132, 4}, }; static arc arcs_82_4[2] = { {175, 5}, @@ -1914,7 +1901,7 @@ static state states_82[6] = { {1, arcs_82_5}, }; static arc arcs_83_0[2] = { - {21, 1}, + {16, 1}, {177, 2}, }; static arc arcs_83_1[1] = { @@ -1929,10 +1916,10 @@ static state states_83[3] = { {1, arcs_83_2}, }; static arc arcs_84_0[1] = { - {98, 1}, + {26, 1}, }; static arc arcs_84_1[1] = { - {118, 2}, + {133, 2}, }; static arc arcs_84_2[2] = { {175, 3}, @@ -1948,7 +1935,7 @@ static state states_84[4] = { {1, arcs_84_3}, }; static arc arcs_85_0[1] = { - {23, 1}, + {40, 1}, }; static arc arcs_85_1[1] = { {0, 1}, @@ -1958,10 +1945,10 @@ static state states_85[2] = { {1, arcs_85_1}, }; static arc arcs_86_0[1] = { - {179, 1}, + {37, 1}, }; static arc arcs_86_1[2] = { - {180, 2}, + {179, 2}, {0, 1}, }; static arc arcs_86_2[1] = { @@ -1973,11 +1960,11 @@ static state states_86[3] = { {1, arcs_86_2}, }; static arc arcs_87_0[2] = { - {78, 1}, - {48, 2}, + {24, 1}, + {80, 2}, }; static arc arcs_87_1[1] = { - {26, 2}, + {60, 2}, }; static arc arcs_87_2[1] = { {0, 2}, @@ -1988,44 +1975,44 @@ static state states_87[3] = { {1, arcs_87_2}, }; static arc arcs_88_0[2] = { - {3, 1}, - {2, 2}, + {2, 1}, + {4, 2}, }; -static arc arcs_88_1[1] = { - {0, 1}, +static arc arcs_88_1[2] = { + {128, 3}, + {61, 4}, }; -static arc arcs_88_2[2] = { - {28, 3}, - {113, 4}, +static arc arcs_88_2[1] = { + {0, 2}, }; static arc arcs_88_3[1] = { - {2, 5}, + {45, 5}, }; static arc arcs_88_4[1] = { - {6, 6}, + {2, 6}, }; -static arc arcs_88_5[1] = { - {113, 4}, +static arc arcs_88_5[2] = { + {129, 2}, + {45, 5}, }; -static arc arcs_88_6[2] = { - {6, 6}, - {114, 1}, +static arc arcs_88_6[1] = { + {128, 3}, }; static state states_88[7] = { {2, arcs_88_0}, - {1, arcs_88_1}, - {2, arcs_88_2}, + {2, arcs_88_1}, + {1, arcs_88_2}, {1, arcs_88_3}, {1, arcs_88_4}, - {1, arcs_88_5}, - {2, arcs_88_6}, + {2, arcs_88_5}, + {1, arcs_88_6}, }; static arc arcs_89_0[1] = { - {182, 1}, + {181, 1}, }; static arc arcs_89_1[2] = { + {44, 2}, {2, 1}, - {7, 2}, }; static arc arcs_89_2[1] = { {0, 2}, @@ -2036,20 +2023,20 @@ static state states_89[3] = { {1, arcs_89_2}, }; static arc arcs_90_0[1] = { - {13, 1}, + {5, 1}, }; static arc arcs_90_1[2] = { - {183, 2}, - {15, 3}, + {50, 2}, + {182, 3}, }; static arc arcs_90_2[1] = { - {15, 3}, + {58, 4}, }; static arc arcs_90_3[1] = { - {25, 4}, + {50, 2}, }; static arc arcs_90_4[1] = { - {26, 5}, + {60, 5}, }; static arc arcs_90_5[1] = { {0, 5}, @@ -2063,387 +2050,399 @@ static state states_90[6] = { {1, arcs_90_5}, }; static arc arcs_91_0[3] = { - {26, 1}, - {34, 2}, - {35, 3}, + {6, 1}, + {64, 2}, + {60, 3}, }; -static arc arcs_91_1[2] = { - {33, 4}, +static arc arcs_91_1[3] = { + {66, 4}, + {60, 5}, {0, 1}, }; -static arc arcs_91_2[3] = { - {26, 5}, - {33, 6}, - {0, 2}, +static arc arcs_91_2[1] = { + {60, 6}, }; -static arc arcs_91_3[1] = { - {26, 7}, +static arc arcs_91_3[2] = { + {66, 7}, + {0, 3}, }; -static arc arcs_91_4[4] = { - {26, 1}, - {34, 8}, - {35, 3}, - {0, 4}, +static arc arcs_91_4[2] = { + {64, 2}, + {60, 5}, }; static arc arcs_91_5[2] = { - {33, 6}, + {66, 4}, {0, 5}, }; -static arc arcs_91_6[2] = { - {26, 5}, - {35, 3}, +static arc arcs_91_6[1] = { + {0, 6}, }; -static arc arcs_91_7[1] = { +static arc arcs_91_7[4] = { + {6, 8}, + {64, 2}, + {60, 3}, {0, 7}, }; static arc arcs_91_8[3] = { - {26, 9}, - {33, 10}, + {66, 9}, + {60, 10}, {0, 8}, }; static arc arcs_91_9[2] = { - {33, 10}, - {0, 9}, + {64, 2}, + {60, 10}, }; static arc arcs_91_10[2] = { - {26, 9}, - {35, 3}, + {66, 9}, + {0, 10}, }; static state states_91[11] = { {3, arcs_91_0}, - {2, arcs_91_1}, - {3, arcs_91_2}, - {1, arcs_91_3}, - {4, arcs_91_4}, + {3, arcs_91_1}, + {1, arcs_91_2}, + {2, arcs_91_3}, + {2, arcs_91_4}, {2, arcs_91_5}, - {2, arcs_91_6}, - {1, arcs_91_7}, + {1, arcs_91_6}, + {4, arcs_91_7}, {3, arcs_91_8}, {2, arcs_91_9}, {2, arcs_91_10}, }; static dfa dfas[92] = { {256, "single_input", 0, 3, states_0, - "\004\050\340\000\004\000\000\000\024\174\022\016\204\045\000\041\000\000\014\211\362\041\010"}, + "\344\377\377\377\377\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {257, "file_input", 0, 2, states_1, - "\204\050\340\000\004\000\000\000\024\174\022\016\204\045\000\041\000\000\014\211\362\041\010"}, + "\344\377\377\377\377\027\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {258, "eval_input", 0, 3, states_2, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\041\000\000\014\211\362\001\000"}, + "\240\173\002\120\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {259, "decorator", 0, 7, states_3, - "\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {260, "decorators", 0, 2, states_4, - "\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {261, "decorated", 0, 3, states_5, - "\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {262, "async_funcdef", 0, 3, states_6, - "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {263, "funcdef", 0, 9, states_7, - "\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {264, "parameters", 0, 4, states_8, - "\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {265, "typedargslist", 0, 23, states_9, - "\000\000\200\000\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + {265, "typedargslist", 0, 22, states_9, + "\100\000\000\000\000\001\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {266, "tfpdef", 0, 4, states_10, - "\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {267, "varargslist", 0, 19, states_11, - "\000\000\200\000\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + {267, "varargslist", 0, 18, states_11, + "\100\000\000\000\000\001\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {268, "vfpdef", 0, 2, states_12, - "\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {269, "stmt", 0, 2, states_13, - "\000\050\340\000\004\000\000\000\024\174\022\016\204\045\000\041\000\000\014\211\362\041\010"}, + "\340\377\377\377\377\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {270, "simple_stmt", 0, 4, states_14, - "\000\040\200\000\004\000\000\000\024\174\022\016\000\000\000\041\000\000\014\211\362\001\010"}, + "\340\373\126\373\343\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {271, "small_stmt", 0, 2, states_15, - "\000\040\200\000\004\000\000\000\024\174\022\016\000\000\000\041\000\000\014\211\362\001\010"}, + "\340\373\126\373\343\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {272, "expr_stmt", 0, 6, states_16, - "\000\040\200\000\004\000\000\000\000\000\020\000\000\000\000\041\000\000\014\211\362\001\000"}, + "\340\173\002\120\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {273, "annassign", 0, 5, states_17, - "\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {274, "testlist_star_expr", 0, 3, states_18, - "\000\040\200\000\004\000\000\000\000\000\020\000\000\000\000\041\000\000\014\211\362\001\000"}, + "\340\173\002\120\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {275, "augassign", 0, 2, states_19, - "\000\000\000\000\000\000\340\377\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\340\377\003\000\000\000\000\000\000\000\000\000\000"}, {276, "del_stmt", 0, 3, states_20, - "\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {277, "pass_stmt", 0, 2, states_21, - "\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {278, "flow_stmt", 0, 2, states_22, - "\000\000\000\000\000\000\000\000\000\074\000\000\000\000\000\000\000\000\000\000\000\000\010"}, + "\000\000\024\000\043\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {279, "break_stmt", 0, 2, states_23, - "\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {280, "continue_stmt", 0, 2, states_24, - "\000\000\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {281, "return_stmt", 0, 3, states_25, - "\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {282, "yield_stmt", 0, 2, states_26, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\010"}, + "\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {283, "raise_stmt", 0, 5, states_27, - "\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {284, "import_stmt", 0, 2, states_28, - "\000\000\000\000\000\000\000\000\000\100\002\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\011\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {285, "import_name", 0, 3, states_29, - "\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {286, "import_from", 0, 8, states_30, - "\000\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {287, "import_as_name", 0, 4, states_31, - "\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {288, "dotted_as_name", 0, 4, states_32, - "\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {289, "import_as_names", 0, 3, states_33, - "\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {290, "dotted_as_names", 0, 2, states_34, - "\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {291, "dotted_name", 0, 2, states_35, - "\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {292, "global_stmt", 0, 3, states_36, - "\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {293, "nonlocal_stmt", 0, 3, states_37, - "\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {294, "assert_stmt", 0, 5, states_38, - "\000\000\000\000\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {295, "compound_stmt", 0, 2, states_39, - "\000\010\140\000\000\000\000\000\000\000\000\000\204\045\000\000\000\000\000\000\000\040\000"}, + "\000\004\251\004\034\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {296, "async_stmt", 0, 3, states_40, - "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {297, "if_stmt", 0, 8, states_41, - "\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {298, "while_stmt", 0, 8, states_42, - "\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {299, "for_stmt", 0, 11, states_43, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000"}, + "\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {300, "try_stmt", 0, 13, states_44, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {301, "with_stmt", 0, 6, states_45, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {302, "with_item", 0, 4, states_46, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\041\000\000\014\211\362\001\000"}, + "\240\173\002\120\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {303, "except_clause", 0, 5, states_47, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000"}, {304, "suite", 0, 5, states_48, - "\004\040\200\000\004\000\000\000\024\174\022\016\000\000\000\041\000\000\014\211\362\001\010"}, + "\344\373\126\373\343\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {305, "namedexpr_test", 0, 4, states_49, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\041\000\000\014\211\362\001\000"}, + "\240\173\002\120\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {306, "test", 0, 6, states_50, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\041\000\000\014\211\362\001\000"}, + "\240\173\002\120\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {307, "test_nocond", 0, 2, states_51, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\041\000\000\014\211\362\001\000"}, + "\240\173\002\120\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {308, "lambdef", 0, 5, states_52, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000"}, + "\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {309, "lambdef_nocond", 0, 5, states_53, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000"}, + "\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {310, "or_test", 0, 2, states_54, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\040\000\000\014\211\362\001\000"}, + "\240\173\002\100\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {311, "and_test", 0, 2, states_55, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\040\000\000\014\211\362\001\000"}, + "\240\173\002\100\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {312, "not_test", 0, 3, states_56, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\040\000\000\014\211\362\001\000"}, + "\240\173\002\100\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {313, "comparison", 0, 2, states_57, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\014\211\362\001\000"}, + "\240\173\002\000\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {314, "comp_op", 0, 4, states_58, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\040\377\000\000\000\000\000\000"}, + "\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000\004\000\340\017\000\000\000\000"}, {315, "star_expr", 0, 3, states_59, - "\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {316, "expr", 0, 2, states_60, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\014\211\362\001\000"}, + "\240\173\002\000\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {317, "xor_expr", 0, 2, states_61, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\014\211\362\001\000"}, + "\240\173\002\000\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {318, "and_expr", 0, 2, states_62, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\014\211\362\001\000"}, + "\240\173\002\000\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {319, "shift_expr", 0, 2, states_63, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\014\211\362\001\000"}, + "\240\173\002\000\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {320, "arith_expr", 0, 2, states_64, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\014\211\362\001\000"}, + "\240\173\002\000\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {321, "term", 0, 2, states_65, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\014\211\362\001\000"}, + "\240\173\002\000\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {322, "factor", 0, 3, states_66, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\014\211\362\001\000"}, + "\240\173\002\000\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {323, "power", 0, 4, states_67, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\210\362\001\000"}, + "\040\172\002\000\100\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {324, "atom_expr", 0, 3, states_68, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\210\362\001\000"}, + "\040\172\002\000\100\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {325, "atom", 0, 9, states_69, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\200\362\001\000"}, + "\040\172\000\000\100\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {326, "testlist_comp", 0, 5, states_70, - "\000\040\200\000\004\000\000\000\000\000\020\000\000\000\000\041\000\000\014\211\362\001\000"}, + "\340\173\002\120\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {327, "trailer", 0, 7, states_71, - "\000\040\000\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\200\000\000\000"}, + "\040\100\000\000\000\000\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000"}, {328, "subscriptlist", 0, 3, states_72, - "\000\040\200\010\000\000\000\000\000\000\020\000\000\000\000\041\000\000\014\211\362\001\000"}, + "\240\173\002\120\300\007\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {329, "subscript", 0, 5, states_73, - "\000\040\200\010\000\000\000\000\000\000\020\000\000\000\000\041\000\000\014\211\362\001\000"}, + "\240\173\002\120\300\007\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {330, "sliceop", 0, 3, states_74, - "\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {331, "exprlist", 0, 3, states_75, - "\000\040\200\000\004\000\000\000\000\000\020\000\000\000\000\000\000\000\014\211\362\001\000"}, + "\340\173\002\000\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {332, "testlist", 0, 3, states_76, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\041\000\000\014\211\362\001\000"}, + "\240\173\002\120\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {333, "dictorsetmaker", 0, 14, states_77, - "\000\040\200\000\014\000\000\000\000\000\020\000\000\000\000\041\000\000\014\211\362\001\000"}, + "\340\173\002\120\300\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {334, "classdef", 0, 8, states_78, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\040\000"}, + "\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {335, "arglist", 0, 3, states_79, - "\000\040\200\000\014\000\000\000\000\000\020\000\000\000\000\041\000\000\014\211\362\001\000"}, + "\340\173\002\120\300\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {336, "argument", 0, 4, states_80, - "\000\040\200\000\014\000\000\000\000\000\020\000\000\000\000\041\000\000\014\211\362\001\000"}, + "\340\173\002\120\300\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {337, "comp_iter", 0, 2, states_81, - "\000\000\040\000\000\000\000\000\000\000\000\000\004\001\000\000\000\000\000\000\000\000\000"}, + "\000\000\201\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {338, "sync_comp_for", 0, 6, states_82, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000"}, + "\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {339, "comp_for", 0, 3, states_83, - "\000\000\040\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000"}, + "\000\000\201\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {340, "comp_if", 0, 4, states_84, - "\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {341, "encoding_decl", 0, 2, states_85, - "\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {342, "yield_expr", 0, 3, states_86, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\010"}, + "\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {343, "yield_arg", 0, 3, states_87, - "\000\040\200\000\004\000\000\000\000\100\020\000\000\000\000\041\000\000\014\211\362\001\000"}, + "\340\173\002\121\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {344, "func_body_suite", 0, 7, states_88, - "\004\040\200\000\004\000\000\000\024\174\022\016\000\000\000\041\000\000\014\211\362\001\010"}, + "\344\373\126\373\343\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {345, "func_type_input", 0, 3, states_89, - "\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {346, "func_type", 0, 6, states_90, - "\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {347, "typelist", 0, 11, states_91, - "\000\040\200\000\014\000\000\000\000\000\020\000\000\000\000\041\000\000\014\211\362\001\000"}, + "\340\173\002\120\300\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, }; -static label labels[184] = { +static label labels[183] = { {0, "EMPTY"}, {256, 0}, {4, 0}, - {270, 0}, {295, 0}, + {270, 0}, + {7, 0}, + {16, 0}, + {14, 0}, + {15, 0}, + {52, 0}, + {49, 0}, + {1, "False"}, + {1, "None"}, + {1, "True"}, + {9, 0}, + {1, "assert"}, + {1, "async"}, + {1, "await"}, + {1, "break"}, + {1, "class"}, + {1, "continue"}, + {1, "def"}, + {1, "del"}, + {1, "for"}, + {1, "from"}, + {1, "global"}, + {1, "if"}, + {1, "import"}, + {1, "lambda"}, + {1, "nonlocal"}, + {1, "not"}, + {1, "pass"}, + {1, "raise"}, + {1, "return"}, + {1, "try"}, + {1, "while"}, + {1, "with"}, + {1, "yield"}, + {25, 0}, + {31, 0}, + {1, 0}, + {2, 0}, + {3, 0}, {257, 0}, - {269, 0}, {0, 0}, + {269, 0}, {258, 0}, {332, 0}, {259, 0}, - {49, 0}, {291, 0}, - {7, 0}, - {335, 0}, {8, 0}, + {335, 0}, {260, 0}, {261, 0}, + {262, 0}, {334, 0}, {263, 0}, - {262, 0}, - {1, "async"}, - {1, "def"}, - {1, 0}, {264, 0}, {51, 0}, - {306, 0}, {11, 0}, + {306, 0}, {56, 0}, {344, 0}, {265, 0}, + {35, 0}, {266, 0}, - {22, 0}, {12, 0}, - {16, 0}, - {35, 0}, + {22, 0}, {267, 0}, {268, 0}, {271, 0}, {13, 0}, - {272, 0}, + {294, 0}, {276, 0}, - {277, 0}, + {272, 0}, {278, 0}, - {284, 0}, {292, 0}, + {284, 0}, {293, 0}, - {294, 0}, + {277, 0}, {274, 0}, {273, 0}, {275, 0}, {342, 0}, {315, 0}, + {40, 0}, + {41, 0}, + {46, 0}, + {38, 0}, {36, 0}, {37, 0}, - {38, 0}, - {50, 0}, + {48, 0}, {39, 0}, - {40, 0}, - {41, 0}, - {42, 0}, - {43, 0}, {44, 0}, {45, 0}, - {46, 0}, - {48, 0}, - {1, "del"}, + {50, 0}, + {43, 0}, + {42, 0}, {331, 0}, - {1, "pass"}, {279, 0}, {280, 0}, - {281, 0}, {283, 0}, + {281, 0}, {282, 0}, - {1, "break"}, - {1, "continue"}, - {1, "return"}, - {1, "raise"}, - {1, "from"}, - {285, 0}, {286, 0}, - {1, "import"}, + {285, 0}, {290, 0}, {23, 0}, - {52, 0}, {289, 0}, {287, 0}, {1, "as"}, {288, 0}, - {1, "global"}, - {1, "nonlocal"}, - {1, "assert"}, - {297, 0}, - {298, 0}, + {296, 0}, {299, 0}, + {297, 0}, {300, 0}, + {298, 0}, {301, 0}, - {296, 0}, - {1, "if"}, {305, 0}, {304, 0}, {1, "elif"}, {1, "else"}, - {1, "while"}, - {1, "for"}, {1, "in"}, - {1, "try"}, - {303, 0}, {1, "finally"}, - {1, "with"}, + {303, 0}, {302, 0}, {316, 0}, {1, "except"}, {5, 0}, {6, 0}, {53, 0}, - {310, 0}, {308, 0}, + {310, 0}, {307, 0}, {309, 0}, - {1, "lambda"}, {311, 0}, {1, "or"}, {312, 0}, {1, "and"}, - {1, "not"}, {313, 0}, {314, 0}, + {28, 0}, {20, 0}, - {21, 0}, + {29, 0}, {27, 0}, + {21, 0}, {30, 0}, - {29, 0}, - {28, 0}, - {28, 0}, {1, "is"}, {317, 0}, {18, 0}, @@ -2455,40 +2454,27 @@ static label labels[184] = { {33, 0}, {34, 0}, {321, 0}, - {14, 0}, - {15, 0}, {322, 0}, - {17, 0}, {24, 0}, + {17, 0}, {47, 0}, - {31, 0}, {323, 0}, {324, 0}, - {1, "await"}, {325, 0}, {327, 0}, {326, 0}, - {9, 0}, {10, 0}, - {25, 0}, - {333, 0}, {26, 0}, - {2, 0}, - {3, 0}, - {1, "None"}, - {1, "True"}, - {1, "False"}, + {333, 0}, {339, 0}, {328, 0}, {329, 0}, {330, 0}, - {1, "class"}, {336, 0}, {337, 0}, {340, 0}, {338, 0}, {341, 0}, - {1, "yield"}, {343, 0}, {345, 0}, {346, 0}, @@ -2497,6 +2483,6 @@ static label labels[184] = { grammar _PyParser_Grammar = { 92, dfas, - {184, labels}, + {183, labels}, 256 }; From webhook-mailer at python.org Fri Mar 1 18:50:35 2019 From: webhook-mailer at python.org (Eric Snow) Date: Fri, 01 Mar 2019 23:50:35 -0000 Subject: [Python-checkins] bpo-36097: Use only public C-API in the_xxsubinterpreters module (adding as necessary). (#12003) Message-ID: https://github.com/python/cpython/commit/bcfa450f210074e16feb761ae5b3e966a2532fcf commit: bcfa450f210074e16feb761ae5b3e966a2532fcf branch: master author: Eric Snow committer: GitHub date: 2019-03-01T16:50:31-07:00 summary: bpo-36097: Use only public C-API in the_xxsubinterpreters module (adding as necessary). (#12003) files: A Include/cpython/interpreteridobject.h A Include/interpreteridobject.h A Objects/interpreteridobject.c M Include/cpython/pystate.h M Include/internal/pycore_pystate.h M Makefile.pre.in M Modules/_xxsubinterpretersmodule.c M Objects/object.c M PCbuild/pythoncore.vcxproj M PCbuild/pythoncore.vcxproj.filters M Python/pystate.c M setup.py diff --git a/Include/cpython/interpreteridobject.h b/Include/cpython/interpreteridobject.h new file mode 100644 index 000000000000..cb72c2b0895a --- /dev/null +++ b/Include/cpython/interpreteridobject.h @@ -0,0 +1,21 @@ +#ifndef Py_CPYTHON_INTERPRETERIDOBJECT_H +# error "this header file must not be included directly" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Interpreter ID Object */ + +PyAPI_DATA(PyTypeObject) _PyInterpreterID_Type; + +PyAPI_FUNC(PyObject *) _PyInterpreterID_New(int64_t); +PyAPI_FUNC(PyObject *) _PyInterpreterState_GetIDObject(PyInterpreterState *); +PyAPI_FUNC(PyInterpreterState *) _PyInterpreterID_LookUp(PyObject *); + +PyAPI_FUNC(int64_t) _Py_CoerceID(PyObject *); + +#ifdef __cplusplus +} +#endif diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h index 3fca78f9ddf2..5439d07e6af3 100644 --- a/Include/cpython/pystate.h +++ b/Include/cpython/pystate.h @@ -30,9 +30,13 @@ typedef struct { (_PyMainInterpreterConfig){.install_signal_handlers = -1} /* Note: _PyMainInterpreterConfig_INIT sets other fields to 0/NULL */ +PyAPI_FUNC(int) _PyInterpreterState_RequiresIDRef(PyInterpreterState *); +PyAPI_FUNC(void) _PyInterpreterState_RequireIDRef(PyInterpreterState *, int); + PyAPI_FUNC(_PyCoreConfig *) _PyInterpreterState_GetCoreConfig(PyInterpreterState *); PyAPI_FUNC(_PyMainInterpreterConfig *) _PyInterpreterState_GetMainConfig(PyInterpreterState *); +PyAPI_FUNC(PyObject *) _PyInterpreterState_GetMainModule(PyInterpreterState *); /* State unique per thread */ @@ -214,6 +218,65 @@ PyAPI_FUNC(PyThreadState *) PyThreadState_Next(PyThreadState *); typedef struct _frame *(*PyThreadFrameGetter)(PyThreadState *self_); +/* cross-interpreter data */ + +struct _xid; + +// _PyCrossInterpreterData is similar to Py_buffer as an effectively +// opaque struct that holds data outside the object machinery. This +// is necessary to pass safely between interpreters in the same process. +typedef struct _xid { + // data is the cross-interpreter-safe derivation of a Python object + // (see _PyObject_GetCrossInterpreterData). It will be NULL if the + // new_object func (below) encodes the data. + void *data; + // obj is the Python object from which the data was derived. This + // is non-NULL only if the data remains bound to the object in some + // way, such that the object must be "released" (via a decref) when + // the data is released. In that case the code that sets the field, + // likely a registered "crossinterpdatafunc", is responsible for + // ensuring it owns the reference (i.e. incref). + PyObject *obj; + // interp is the ID of the owning interpreter of the original + // object. It corresponds to the active interpreter when + // _PyObject_GetCrossInterpreterData() was called. This should only + // be set by the cross-interpreter machinery. + // + // We use the ID rather than the PyInterpreterState to avoid issues + // with deleted interpreters. Note that IDs are never re-used, so + // each one will always correspond to a specific interpreter + // (whether still alive or not). + int64_t interp; + // new_object is a function that returns a new object in the current + // interpreter given the data. The resulting object (a new + // reference) will be equivalent to the original object. This field + // is required. + PyObject *(*new_object)(struct _xid *); + // free is called when the data is released. If it is NULL then + // nothing will be done to free the data. For some types this is + // okay (e.g. bytes) and for those types this field should be set + // to NULL. However, for most the data was allocated just for + // cross-interpreter use, so it must be freed when + // _PyCrossInterpreterData_Release is called or the memory will + // leak. In that case, at the very least this field should be set + // to PyMem_RawFree (the default if not explicitly set to NULL). + // The call will happen with the original interpreter activated. + void (*free)(void *); +} _PyCrossInterpreterData; + +PyAPI_FUNC(int) _PyObject_GetCrossInterpreterData(PyObject *, _PyCrossInterpreterData *); +PyAPI_FUNC(PyObject *) _PyCrossInterpreterData_NewObject(_PyCrossInterpreterData *); +PyAPI_FUNC(void) _PyCrossInterpreterData_Release(_PyCrossInterpreterData *); + +PyAPI_FUNC(int) _PyObject_CheckCrossInterpreterData(PyObject *); + +/* cross-interpreter data registry */ + +typedef int (*crossinterpdatafunc)(PyObject *, struct _xid *); + +PyAPI_FUNC(int) _PyCrossInterpreterData_RegisterClass(PyTypeObject *, crossinterpdatafunc); +PyAPI_FUNC(crossinterpdatafunc) _PyCrossInterpreterData_Lookup(PyObject *); + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index f6c61e7bcbd6..7e78297da69a 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -30,6 +30,7 @@ struct _is { int64_t id; int64_t id_refcount; + int requires_idref; PyThread_type_lock id_mutex; int finalizing; @@ -92,66 +93,12 @@ PyAPI_FUNC(void) _PyInterpreterState_IDIncref(struct _is *); PyAPI_FUNC(void) _PyInterpreterState_IDDecref(struct _is *); -/* cross-interpreter data */ - -struct _xid; - -// _PyCrossInterpreterData is similar to Py_buffer as an effectively -// opaque struct that holds data outside the object machinery. This -// is necessary to pass safely between interpreters in the same process. -typedef struct _xid { - // data is the cross-interpreter-safe derivation of a Python object - // (see _PyObject_GetCrossInterpreterData). It will be NULL if the - // new_object func (below) encodes the data. - void *data; - // obj is the Python object from which the data was derived. This - // is non-NULL only if the data remains bound to the object in some - // way, such that the object must be "released" (via a decref) when - // the data is released. In that case the code that sets the field, - // likely a registered "crossinterpdatafunc", is responsible for - // ensuring it owns the reference (i.e. incref). - PyObject *obj; - // interp is the ID of the owning interpreter of the original - // object. It corresponds to the active interpreter when - // _PyObject_GetCrossInterpreterData() was called. This should only - // be set by the cross-interpreter machinery. - // - // We use the ID rather than the PyInterpreterState to avoid issues - // with deleted interpreters. - int64_t interp; - // new_object is a function that returns a new object in the current - // interpreter given the data. The resulting object (a new - // reference) will be equivalent to the original object. This field - // is required. - PyObject *(*new_object)(struct _xid *); - // free is called when the data is released. If it is NULL then - // nothing will be done to free the data. For some types this is - // okay (e.g. bytes) and for those types this field should be set - // to NULL. However, for most the data was allocated just for - // cross-interpreter use, so it must be freed when - // _PyCrossInterpreterData_Release is called or the memory will - // leak. In that case, at the very least this field should be set - // to PyMem_RawFree (the default if not explicitly set to NULL). - // The call will happen with the original interpreter activated. - void (*free)(void *); -} _PyCrossInterpreterData; - -typedef int (*crossinterpdatafunc)(PyObject *, _PyCrossInterpreterData *); -PyAPI_FUNC(int) _PyObject_CheckCrossInterpreterData(PyObject *); - -PyAPI_FUNC(int) _PyObject_GetCrossInterpreterData(PyObject *, _PyCrossInterpreterData *); -PyAPI_FUNC(PyObject *) _PyCrossInterpreterData_NewObject(_PyCrossInterpreterData *); -PyAPI_FUNC(void) _PyCrossInterpreterData_Release(_PyCrossInterpreterData *); - /* cross-interpreter data registry */ /* For now we use a global registry of shareable classes. An alternative would be to add a tp_* slot for a class's crossinterpdatafunc. It would be simpler and more efficient. */ -PyAPI_FUNC(int) _PyCrossInterpreterData_Register_Class(PyTypeObject *, crossinterpdatafunc); -PyAPI_FUNC(crossinterpdatafunc) _PyCrossInterpreterData_Lookup(PyObject *); - struct _xidregitem; struct _xidregitem { diff --git a/Include/interpreteridobject.h b/Include/interpreteridobject.h new file mode 100644 index 000000000000..e744fcdc9ff1 --- /dev/null +++ b/Include/interpreteridobject.h @@ -0,0 +1,17 @@ +#ifndef Py_INTERPRETERIDOBJECT_H +#define Py_INTERPRETERIDOBJECT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +# define Py_CPYTHON_INTERPRETERIDOBJECT_H +# include "cpython/interpreteridobject.h" +# undef Py_CPYTHON_INTERPRETERIDOBJECT_H +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERPRETERIDOBJECT_H */ diff --git a/Makefile.pre.in b/Makefile.pre.in index 135c3230292b..8042e8e81a05 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -391,6 +391,7 @@ OBJECT_OBJS= \ Objects/floatobject.o \ Objects/frameobject.o \ Objects/funcobject.o \ + Objects/interpreteridobject.o \ Objects/iterobject.o \ Objects/listobject.o \ Objects/longobject.o \ @@ -977,6 +978,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/funcobject.h \ $(srcdir)/Include/genobject.h \ $(srcdir)/Include/import.h \ + $(srcdir)/Include/interpreteridobject.h \ $(srcdir)/Include/intrcheck.h \ $(srcdir)/Include/iterobject.h \ $(srcdir)/Include/listobject.h \ @@ -1039,6 +1041,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/cpython/abstract.h \ $(srcdir)/Include/cpython/coreconfig.h \ $(srcdir)/Include/cpython/dictobject.h \ + $(srcdir)/Include/cpython/interpreteridobject.h \ $(srcdir)/Include/cpython/object.h \ $(srcdir)/Include/cpython/objimpl.h \ $(srcdir)/Include/cpython/pyerrors.h \ diff --git a/Modules/_xxsubinterpretersmodule.c b/Modules/_xxsubinterpretersmodule.c index 79c9def72629..1cf43b7ac76e 100644 --- a/Modules/_xxsubinterpretersmodule.c +++ b/Modules/_xxsubinterpretersmodule.c @@ -4,7 +4,7 @@ #include "Python.h" #include "frameobject.h" -#include "pycore_pystate.h" +#include "interpreteridobject.h" static char * @@ -31,38 +31,6 @@ _get_current(void) return _PyInterpreterState_Get(); } -static int64_t -_coerce_id(PyObject *orig) -{ - PyObject *pyid = PyNumber_Long(orig); - if (pyid == NULL) { - if (PyErr_ExceptionMatches(PyExc_TypeError)) { - PyErr_Format(PyExc_TypeError, - "'id' must be a non-negative int, got %R", orig); - } - else { - PyErr_Format(PyExc_ValueError, - "'id' must be a non-negative int, got %R", orig); - } - return -1; - } - int64_t id = PyLong_AsLongLong(pyid); - Py_DECREF(pyid); - if (id == -1 && PyErr_Occurred() != NULL) { - if (!PyErr_ExceptionMatches(PyExc_OverflowError)) { - PyErr_Format(PyExc_ValueError, - "'id' must be a non-negative int, got %R", orig); - } - return -1; - } - if (id < 0) { - PyErr_Format(PyExc_ValueError, - "'id' must be a non-negative int, got %R", orig); - return -1; - } - return id; -} - /* data-sharing-specific code ***********************************************/ @@ -71,6 +39,8 @@ struct _sharednsitem { _PyCrossInterpreterData data; }; +static void _sharednsitem_clear(struct _sharednsitem *); // forward + static int _sharednsitem_init(struct _sharednsitem *item, PyObject *key, PyObject *value) { @@ -79,6 +49,7 @@ _sharednsitem_init(struct _sharednsitem *item, PyObject *key, PyObject *value) return -1; } if (_PyObject_GetCrossInterpreterData(value, &item->data) != 0) { + _sharednsitem_clear(item); return -1; } return 0; @@ -89,6 +60,7 @@ _sharednsitem_clear(struct _sharednsitem *item) { if (item->name != NULL) { PyMem_Free(item->name); + item->name = NULL; } _PyCrossInterpreterData_Release(&item->data); } @@ -1339,13 +1311,13 @@ _channel_send(_channels *channels, int64_t id, PyObject *obj) return -1; } if (_PyObject_GetCrossInterpreterData(obj, data) != 0) { - PyMem_Free(data); PyThread_release_lock(mutex); + PyMem_Free(data); return -1; } // Add the data to the channel. - int res = _channel_add(chan, interp->id, data); + int res = _channel_add(chan, PyInterpreterState_GetID(interp), data); PyThread_release_lock(mutex); if (res != 0) { _PyCrossInterpreterData_Release(data); @@ -1373,7 +1345,7 @@ _channel_recv(_channels *channels, int64_t id) // Past this point we are responsible for releasing the mutex. // Pop off the next item from the channel. - _PyCrossInterpreterData *data = _channel_next(chan, interp->id); + _PyCrossInterpreterData *data = _channel_next(chan, PyInterpreterState_GetID(interp)); PyThread_release_lock(mutex); if (data == NULL) { if (!PyErr_Occurred()) { @@ -1410,7 +1382,7 @@ _channel_drop(_channels *channels, int64_t id, int send, int recv) // Past this point we are responsible for releasing the mutex. // Close one or both of the two ends. - int res = _channel_close_interpreter(chan, interp->id, send-recv); + int res = _channel_close_interpreter(chan, PyInterpreterState_GetID(interp), send-recv); PyThread_release_lock(mutex); return res; } @@ -1481,7 +1453,7 @@ channelid_new(PyTypeObject *cls, PyObject *args, PyObject *kwds) cid = ((channelid *)id)->id; } else { - cid = _coerce_id(id); + cid = _Py_CoerceID(id); if (cid < 0) { return NULL; } @@ -1875,7 +1847,7 @@ _run_script(PyInterpreterState *interp, const char *codestr, PyObject *excval = NULL; PyObject *tb = NULL; - PyObject *main_mod = PyMapping_GetItemString(interp->modules, "__main__"); + PyObject *main_mod = _PyInterpreterState_GetMainModule(interp); if (main_mod == NULL) { goto error; } @@ -1974,272 +1946,6 @@ _run_script_in_interpreter(PyInterpreterState *interp, const char *codestr, return result; } -/* InterpreterID class */ - -static PyTypeObject InterpreterIDtype; - -typedef struct interpid { - PyObject_HEAD - int64_t id; -} interpid; - -static interpid * -newinterpid(PyTypeObject *cls, int64_t id, int force) -{ - PyInterpreterState *interp = _PyInterpreterState_LookUpID(id); - if (interp == NULL) { - if (force) { - PyErr_Clear(); - } - else { - return NULL; - } - } - - interpid *self = PyObject_New(interpid, cls); - if (self == NULL) { - return NULL; - } - self->id = id; - - if (interp != NULL) { - _PyInterpreterState_IDIncref(interp); - } - return self; -} - -static PyObject * -interpid_new(PyTypeObject *cls, PyObject *args, PyObject *kwds) -{ - static char *kwlist[] = {"id", "force", NULL}; - PyObject *idobj; - int force = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwds, - "O|$p:InterpreterID.__init__", kwlist, - &idobj, &force)) { - return NULL; - } - - // Coerce and check the ID. - int64_t id; - if (PyObject_TypeCheck(idobj, &InterpreterIDtype)) { - id = ((interpid *)idobj)->id; - } - else { - id = _coerce_id(idobj); - if (id < 0) { - return NULL; - } - } - - return (PyObject *)newinterpid(cls, id, force); -} - -static void -interpid_dealloc(PyObject *v) -{ - int64_t id = ((interpid *)v)->id; - PyInterpreterState *interp = _PyInterpreterState_LookUpID(id); - if (interp != NULL) { - _PyInterpreterState_IDDecref(interp); - } - else { - // already deleted - PyErr_Clear(); - } - Py_TYPE(v)->tp_free(v); -} - -static PyObject * -interpid_repr(PyObject *self) -{ - PyTypeObject *type = Py_TYPE(self); - const char *name = _PyType_Name(type); - interpid *id = (interpid *)self; - return PyUnicode_FromFormat("%s(%" PRId64 ")", name, id->id); -} - -static PyObject * -interpid_str(PyObject *self) -{ - interpid *id = (interpid *)self; - return PyUnicode_FromFormat("%" PRId64 "", id->id); -} - -PyObject * -interpid_int(PyObject *self) -{ - interpid *id = (interpid *)self; - return PyLong_FromLongLong(id->id); -} - -static PyNumberMethods interpid_as_number = { - 0, /* nb_add */ - 0, /* nb_subtract */ - 0, /* nb_multiply */ - 0, /* nb_remainder */ - 0, /* nb_divmod */ - 0, /* nb_power */ - 0, /* nb_negative */ - 0, /* nb_positive */ - 0, /* nb_absolute */ - 0, /* nb_bool */ - 0, /* nb_invert */ - 0, /* nb_lshift */ - 0, /* nb_rshift */ - 0, /* nb_and */ - 0, /* nb_xor */ - 0, /* nb_or */ - (unaryfunc)interpid_int, /* nb_int */ - 0, /* nb_reserved */ - 0, /* nb_float */ - - 0, /* nb_inplace_add */ - 0, /* nb_inplace_subtract */ - 0, /* nb_inplace_multiply */ - 0, /* nb_inplace_remainder */ - 0, /* nb_inplace_power */ - 0, /* nb_inplace_lshift */ - 0, /* nb_inplace_rshift */ - 0, /* nb_inplace_and */ - 0, /* nb_inplace_xor */ - 0, /* nb_inplace_or */ - - 0, /* nb_floor_divide */ - 0, /* nb_true_divide */ - 0, /* nb_inplace_floor_divide */ - 0, /* nb_inplace_true_divide */ - - (unaryfunc)interpid_int, /* nb_index */ -}; - -static Py_hash_t -interpid_hash(PyObject *self) -{ - interpid *id = (interpid *)self; - PyObject *obj = PyLong_FromLongLong(id->id); - if (obj == NULL) { - return -1; - } - Py_hash_t hash = PyObject_Hash(obj); - Py_DECREF(obj); - return hash; -} - -static PyObject * -interpid_richcompare(PyObject *self, PyObject *other, int op) -{ - if (op != Py_EQ && op != Py_NE) { - Py_RETURN_NOTIMPLEMENTED; - } - - if (!PyObject_TypeCheck(self, &InterpreterIDtype)) { - Py_RETURN_NOTIMPLEMENTED; - } - - interpid *id = (interpid *)self; - int equal; - if (PyObject_TypeCheck(other, &InterpreterIDtype)) { - interpid *otherid = (interpid *)other; - equal = (id->id == otherid->id); - } - else { - other = PyNumber_Long(other); - if (other == NULL) { - PyErr_Clear(); - Py_RETURN_NOTIMPLEMENTED; - } - int64_t otherid = PyLong_AsLongLong(other); - Py_DECREF(other); - if (otherid == -1 && PyErr_Occurred() != NULL) { - return NULL; - } - if (otherid < 0) { - equal = 0; - } - else { - equal = (id->id == otherid); - } - } - - if ((op == Py_EQ && equal) || (op == Py_NE && !equal)) { - Py_RETURN_TRUE; - } - Py_RETURN_FALSE; -} - -PyDoc_STRVAR(interpid_doc, -"A interpreter ID identifies a interpreter and may be used as an int."); - -static PyTypeObject InterpreterIDtype = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) - "interpreters.InterpreterID", /* tp_name */ - sizeof(interpid), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)interpid_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - (reprfunc)interpid_repr, /* tp_repr */ - &interpid_as_number, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - interpid_hash, /* tp_hash */ - 0, /* tp_call */ - (reprfunc)interpid_str, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | - Py_TPFLAGS_LONG_SUBCLASS, /* tp_flags */ - interpid_doc, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - interpid_richcompare, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - interpid_new, /* tp_new */ -}; - -static PyObject * -_get_id(PyInterpreterState *interp) -{ - PY_INT64_T id = PyInterpreterState_GetID(interp); - if (id < 0) { - return NULL; - } - return (PyObject *)newinterpid(&InterpreterIDtype, id, 0); -} - -static PyInterpreterState * -_look_up(PyObject *requested_id) -{ - int64_t id; - if (PyObject_TypeCheck(requested_id, &InterpreterIDtype)) { - id = ((interpid *)requested_id)->id; - } - else { - id = PyLong_AsLongLong(requested_id); - if (id == -1 && PyErr_Occurred() != NULL) { - return NULL; - } - assert(id <= INT64_MAX); - } - return _PyInterpreterState_LookUpID(id); -} - /* module level code ********************************************************/ @@ -2283,17 +1989,16 @@ interp_create(PyObject *self, PyObject *args) PyErr_SetString(PyExc_RuntimeError, "interpreter creation failed"); return NULL; } - if (_PyInterpreterState_IDInitref(tstate->interp) != 0) { - goto error; - }; - return _get_id(tstate->interp); - -error: - // XXX Possible GILState issues? - save_tstate = PyThreadState_Swap(tstate); - Py_EndInterpreter(tstate); - PyThreadState_Swap(save_tstate); - return NULL; + PyObject *idobj = _PyInterpreterState_GetIDObject(tstate->interp); + if (idobj == NULL) { + // XXX Possible GILState issues? + save_tstate = PyThreadState_Swap(tstate); + Py_EndInterpreter(tstate); + PyThreadState_Swap(save_tstate); + return NULL; + } + _PyInterpreterState_RequireIDRef(tstate->interp, 1); + return idobj; } PyDoc_STRVAR(create_doc, @@ -2318,7 +2023,7 @@ interp_destroy(PyObject *self, PyObject *args, PyObject *kwds) } // Look up the interpreter. - PyInterpreterState *interp = _look_up(id); + PyInterpreterState *interp = _PyInterpreterID_LookUp(id); if (interp == NULL) { return NULL; } @@ -2374,7 +2079,7 @@ interp_list_all(PyObject *self, PyObject *Py_UNUSED(ignored)) interp = PyInterpreterState_Head(); while (interp != NULL) { - id = _get_id(interp); + id = _PyInterpreterState_GetIDObject(interp); if (id == NULL) { Py_DECREF(ids); return NULL; @@ -2406,7 +2111,7 @@ interp_get_current(PyObject *self, PyObject *Py_UNUSED(ignored)) if (interp == NULL) { return NULL; } - return _get_id(interp); + return _PyInterpreterState_GetIDObject(interp); } PyDoc_STRVAR(get_current_doc, @@ -2420,7 +2125,7 @@ interp_get_main(PyObject *self, PyObject *Py_UNUSED(ignored)) { // Currently, 0 is always the main interpreter. PY_INT64_T id = 0; - return (PyObject *)newinterpid(&InterpreterIDtype, id, 0); + return _PyInterpreterID_New(id); } PyDoc_STRVAR(get_main_doc, @@ -2446,7 +2151,7 @@ interp_run_string(PyObject *self, PyObject *args, PyObject *kwds) } // Look up the interpreter. - PyInterpreterState *interp = _look_up(id); + PyInterpreterState *interp = _PyInterpreterID_LookUp(id); if (interp == NULL) { return NULL; } @@ -2516,7 +2221,7 @@ interp_is_running(PyObject *self, PyObject *args, PyObject *kwds) return NULL; } - PyInterpreterState *interp = _look_up(id); + PyInterpreterState *interp = _PyInterpreterID_LookUp(id); if (interp == NULL) { return NULL; } @@ -2568,7 +2273,7 @@ channel_destroy(PyObject *self, PyObject *args, PyObject *kwds) "O:channel_destroy", kwlist, &id)) { return NULL; } - int64_t cid = _coerce_id(id); + int64_t cid = _Py_CoerceID(id); if (cid < 0) { return NULL; } @@ -2632,7 +2337,7 @@ channel_send(PyObject *self, PyObject *args, PyObject *kwds) "OO:channel_send", kwlist, &id, &obj)) { return NULL; } - int64_t cid = _coerce_id(id); + int64_t cid = _Py_CoerceID(id); if (cid < 0) { return NULL; } @@ -2657,7 +2362,7 @@ channel_recv(PyObject *self, PyObject *args, PyObject *kwds) "O:channel_recv", kwlist, &id)) { return NULL; } - int64_t cid = _coerce_id(id); + int64_t cid = _Py_CoerceID(id); if (cid < 0) { return NULL; } @@ -2683,7 +2388,7 @@ channel_close(PyObject *self, PyObject *args, PyObject *kwds) &id, &send, &recv, &force)) { return NULL; } - int64_t cid = _coerce_id(id); + int64_t cid = _Py_CoerceID(id); if (cid < 0) { return NULL; } @@ -2735,7 +2440,7 @@ channel_release(PyObject *self, PyObject *args, PyObject *kwds) &id, &send, &recv, &force)) { return NULL; } - int64_t cid = _coerce_id(id); + int64_t cid = _Py_CoerceID(id); if (cid < 0) { return NULL; } @@ -2837,10 +2542,6 @@ PyInit__xxsubinterpreters(void) if (PyType_Ready(&ChannelIDtype) != 0) { return NULL; } - InterpreterIDtype.tp_base = &PyLong_Type; - if (PyType_Ready(&InterpreterIDtype) != 0) { - return NULL; - } /* Create the module */ PyObject *module = PyModule_Create(&interpretersmodule); @@ -2862,12 +2563,12 @@ PyInit__xxsubinterpreters(void) if (PyDict_SetItemString(ns, "ChannelID", (PyObject *)&ChannelIDtype) != 0) { return NULL; } - Py_INCREF(&InterpreterIDtype); - if (PyDict_SetItemString(ns, "InterpreterID", (PyObject *)&InterpreterIDtype) != 0) { + Py_INCREF(&_PyInterpreterID_Type); + if (PyDict_SetItemString(ns, "InterpreterID", (PyObject *)&_PyInterpreterID_Type) != 0) { return NULL; } - if (_PyCrossInterpreterData_Register_Class(&ChannelIDtype, _channelid_shared)) { + if (_PyCrossInterpreterData_RegisterClass(&ChannelIDtype, _channelid_shared)) { return NULL; } diff --git a/Objects/interpreteridobject.c b/Objects/interpreteridobject.c new file mode 100644 index 000000000000..dd142b043d0a --- /dev/null +++ b/Objects/interpreteridobject.c @@ -0,0 +1,308 @@ +/* InterpreterID object */ + +#include "Python.h" +#include "internal/pycore_pystate.h" +#include "interpreteridobject.h" + + +int64_t +_Py_CoerceID(PyObject *orig) +{ + PyObject *pyid = PyNumber_Long(orig); + if (pyid == NULL) { + if (PyErr_ExceptionMatches(PyExc_TypeError)) { + PyErr_Format(PyExc_TypeError, + "'id' must be a non-negative int, got %R", orig); + } + else { + PyErr_Format(PyExc_ValueError, + "'id' must be a non-negative int, got %R", orig); + } + return -1; + } + int64_t id = PyLong_AsLongLong(pyid); + Py_DECREF(pyid); + if (id == -1 && PyErr_Occurred() != NULL) { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) { + PyErr_Format(PyExc_ValueError, + "'id' must be a non-negative int, got %R", orig); + } + return -1; + } + if (id < 0) { + PyErr_Format(PyExc_ValueError, + "'id' must be a non-negative int, got %R", orig); + return -1; + } + return id; +} + +typedef struct interpid { + PyObject_HEAD + int64_t id; +} interpid; + +static interpid * +newinterpid(PyTypeObject *cls, int64_t id, int force) +{ + PyInterpreterState *interp = _PyInterpreterState_LookUpID(id); + if (interp == NULL) { + if (force) { + PyErr_Clear(); + } + else { + return NULL; + } + } + + interpid *self = PyObject_New(interpid, cls); + if (self == NULL) { + return NULL; + } + self->id = id; + + if (interp != NULL) { + _PyInterpreterState_IDIncref(interp); + } + return self; +} + +static PyObject * +interpid_new(PyTypeObject *cls, PyObject *args, PyObject *kwds) +{ + static char *kwlist[] = {"id", "force", NULL}; + PyObject *idobj; + int force = 0; + if (!PyArg_ParseTupleAndKeywords(args, kwds, + "O|$p:InterpreterID.__init__", kwlist, + &idobj, &force)) { + return NULL; + } + + // Coerce and check the ID. + int64_t id; + if (PyObject_TypeCheck(idobj, &_PyInterpreterID_Type)) { + id = ((interpid *)idobj)->id; + } + else { + id = _Py_CoerceID(idobj); + if (id < 0) { + return NULL; + } + } + + return (PyObject *)newinterpid(cls, id, force); +} + +static void +interpid_dealloc(PyObject *v) +{ + int64_t id = ((interpid *)v)->id; + PyInterpreterState *interp = _PyInterpreterState_LookUpID(id); + if (interp != NULL) { + _PyInterpreterState_IDDecref(interp); + } + else { + // already deleted + PyErr_Clear(); + } + Py_TYPE(v)->tp_free(v); +} + +static PyObject * +interpid_repr(PyObject *self) +{ + PyTypeObject *type = Py_TYPE(self); + const char *name = _PyType_Name(type); + interpid *id = (interpid *)self; + return PyUnicode_FromFormat("%s(%" PRId64 ")", name, id->id); +} + +static PyObject * +interpid_str(PyObject *self) +{ + interpid *id = (interpid *)self; + return PyUnicode_FromFormat("%" PRId64 "", id->id); +} + +static PyObject * +interpid_int(PyObject *self) +{ + interpid *id = (interpid *)self; + return PyLong_FromLongLong(id->id); +} + +static PyNumberMethods interpid_as_number = { + 0, /* nb_add */ + 0, /* nb_subtract */ + 0, /* nb_multiply */ + 0, /* nb_remainder */ + 0, /* nb_divmod */ + 0, /* nb_power */ + 0, /* nb_negative */ + 0, /* nb_positive */ + 0, /* nb_absolute */ + 0, /* nb_bool */ + 0, /* nb_invert */ + 0, /* nb_lshift */ + 0, /* nb_rshift */ + 0, /* nb_and */ + 0, /* nb_xor */ + 0, /* nb_or */ + (unaryfunc)interpid_int, /* nb_int */ + 0, /* nb_reserved */ + 0, /* nb_float */ + + 0, /* nb_inplace_add */ + 0, /* nb_inplace_subtract */ + 0, /* nb_inplace_multiply */ + 0, /* nb_inplace_remainder */ + 0, /* nb_inplace_power */ + 0, /* nb_inplace_lshift */ + 0, /* nb_inplace_rshift */ + 0, /* nb_inplace_and */ + 0, /* nb_inplace_xor */ + 0, /* nb_inplace_or */ + + 0, /* nb_floor_divide */ + 0, /* nb_true_divide */ + 0, /* nb_inplace_floor_divide */ + 0, /* nb_inplace_true_divide */ + + (unaryfunc)interpid_int, /* nb_index */ +}; + +static Py_hash_t +interpid_hash(PyObject *self) +{ + interpid *id = (interpid *)self; + PyObject *obj = PyLong_FromLongLong(id->id); + if (obj == NULL) { + return -1; + } + Py_hash_t hash = PyObject_Hash(obj); + Py_DECREF(obj); + return hash; +} + +static PyObject * +interpid_richcompare(PyObject *self, PyObject *other, int op) +{ + if (op != Py_EQ && op != Py_NE) { + Py_RETURN_NOTIMPLEMENTED; + } + + if (!PyObject_TypeCheck(self, &_PyInterpreterID_Type)) { + Py_RETURN_NOTIMPLEMENTED; + } + + interpid *id = (interpid *)self; + int equal; + if (PyObject_TypeCheck(other, &_PyInterpreterID_Type)) { + interpid *otherid = (interpid *)other; + equal = (id->id == otherid->id); + } + else { + other = PyNumber_Long(other); + if (other == NULL) { + PyErr_Clear(); + Py_RETURN_NOTIMPLEMENTED; + } + int64_t otherid = PyLong_AsLongLong(other); + Py_DECREF(other); + if (otherid == -1 && PyErr_Occurred() != NULL) { + return NULL; + } + if (otherid < 0) { + equal = 0; + } + else { + equal = (id->id == otherid); + } + } + + if ((op == Py_EQ && equal) || (op == Py_NE && !equal)) { + Py_RETURN_TRUE; + } + Py_RETURN_FALSE; +} + +PyDoc_STRVAR(interpid_doc, +"A interpreter ID identifies a interpreter and may be used as an int."); + +PyTypeObject _PyInterpreterID_Type = { + PyVarObject_HEAD_INIT(&PyType_Type, 0) + "InterpreterID", /* tp_name */ + sizeof(interpid), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)interpid_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_as_async */ + (reprfunc)interpid_repr, /* tp_repr */ + &interpid_as_number, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + interpid_hash, /* tp_hash */ + 0, /* tp_call */ + (reprfunc)interpid_str, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | + Py_TPFLAGS_LONG_SUBCLASS, /* tp_flags */ + interpid_doc, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + interpid_richcompare, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + &PyLong_Type, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + interpid_new, /* tp_new */ +}; + +PyObject *_PyInterpreterID_New(int64_t id) +{ + return (PyObject *)newinterpid(&_PyInterpreterID_Type, id, 0); +} + +PyObject * +_PyInterpreterState_GetIDObject(PyInterpreterState *interp) +{ + if (_PyInterpreterState_IDInitref(interp) != 0) { + return NULL; + }; + PY_INT64_T id = PyInterpreterState_GetID(interp); + if (id < 0) { + return NULL; + } + return (PyObject *)newinterpid(&_PyInterpreterID_Type, id, 0); +} + +PyInterpreterState * +_PyInterpreterID_LookUp(PyObject *requested_id) +{ + int64_t id; + if (PyObject_TypeCheck(requested_id, &_PyInterpreterID_Type)) { + id = ((interpid *)requested_id)->id; + } + else { + id = PyLong_AsLongLong(requested_id); + if (id == -1 && PyErr_Occurred() != NULL) { + return NULL; + } + assert(id <= INT64_MAX); + } + return _PyInterpreterState_LookUpID(id); +} diff --git a/Objects/object.c b/Objects/object.c index cf5264b5d80b..b446d598130a 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -5,6 +5,7 @@ #include "pycore_pystate.h" #include "pycore_context.h" #include "frameobject.h" +#include "interpreteridobject.h" #ifdef __cplusplus extern "C" { @@ -1806,6 +1807,7 @@ _PyTypes_Init(void) INIT_TYPE(&PySeqIter_Type, "sequence iterator"); INIT_TYPE(&PyCoro_Type, "coroutine"); INIT_TYPE(&_PyCoroWrapper_Type, "coroutine wrapper"); + INIT_TYPE(&_PyInterpreterID_Type, "interpreter ID"); return _Py_INIT_OK(); #undef INIT_TYPE diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index bff7b95a84ae..c9ff2f88d8e0 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -154,6 +154,7 @@ + @@ -350,6 +351,7 @@ + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 03030744b155..5dfa193f048a 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -483,6 +483,9 @@ Include + + Include + Modules @@ -1043,6 +1046,9 @@ Objects + + Objects + Modules diff --git a/Python/pystate.c b/Python/pystate.c index d612d3a171b6..99a01efa6c72 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -403,7 +403,7 @@ _PyInterpreterState_IDDecref(PyInterpreterState *interp) int64_t refcount = interp->id_refcount; PyThread_release_lock(interp->id_mutex); - if (refcount == 0) { + if (refcount == 0 && interp->requires_idref) { // XXX Using the "head" thread isn't strictly correct. PyThreadState *tstate = PyInterpreterState_ThreadHead(interp); // XXX Possible GILState issues? @@ -413,6 +413,18 @@ _PyInterpreterState_IDDecref(PyInterpreterState *interp) } } +int +_PyInterpreterState_RequiresIDRef(PyInterpreterState *interp) +{ + return interp->requires_idref; +} + +void +_PyInterpreterState_RequireIDRef(PyInterpreterState *interp, int required) +{ + interp->requires_idref = required ? 1 : 0; +} + _PyCoreConfig * _PyInterpreterState_GetCoreConfig(PyInterpreterState *interp) { @@ -425,6 +437,16 @@ _PyInterpreterState_GetMainConfig(PyInterpreterState *interp) return &interp->config; } +PyObject * +_PyInterpreterState_GetMainModule(PyInterpreterState *interp) +{ + if (interp->modules == NULL) { + PyErr_SetString(PyExc_RuntimeError, "interpreter not initialized"); + return NULL; + } + return PyMapping_GetItemString(interp->modules, "__main__"); +} + /* Default implementation for _PyThreadState_GetFrame */ static struct _frame * threadstate_getframe(PyThreadState *self) @@ -1370,7 +1392,7 @@ _register_xidata(PyTypeObject *cls, crossinterpdatafunc getdata) static void _register_builtins_for_crossinterpreter_data(void); int -_PyCrossInterpreterData_Register_Class(PyTypeObject *cls, +_PyCrossInterpreterData_RegisterClass(PyTypeObject *cls, crossinterpdatafunc getdata) { if (!PyType_Check(cls)) { diff --git a/setup.py b/setup.py index b96961073b98..c278f08b8e6d 100644 --- a/setup.py +++ b/setup.py @@ -784,9 +784,7 @@ def detect_simple_extensions(self): self.add(Extension('syslog', ['syslogmodule.c'])) # Python interface to subinterpreter C-API. - self.add(Extension('_xxsubinterpreters', - ['_xxsubinterpretersmodule.c'], - define_macros=[('Py_BUILD_CORE', '')])) + self.add(Extension('_xxsubinterpreters', ['_xxsubinterpretersmodule.c'])) # # Here ends the simple stuff. From here on, modules need certain From webhook-mailer at python.org Fri Mar 1 23:31:04 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Sat, 02 Mar 2019 04:31:04 -0000 Subject: [Python-checkins] bpo-36103: change default buffer size of shutil.copyfileobj() (GH-12115) Message-ID: https://github.com/python/cpython/commit/4f1903061877776973c1bbfadd3d3f146920856e commit: 4f1903061877776973c1bbfadd3d3f146920856e branch: master author: Inada Naoki committer: GitHub date: 2019-03-02T13:31:01+09:00 summary: bpo-36103: change default buffer size of shutil.copyfileobj() (GH-12115) It is changed from 16KiB to 64KiB. The previous default value is used since 1990. coreutils chose 128 KiB as minimum buffer size for block device I/O. But shutil.copyfileobj() can be used for non block devices. So I choose more conservative value. As my quick benchmark, performance difference between 64KiB and 128 KiB is up to ~5%. On the other hand, performance difference between 32 KiB and 64 KiB can be more than 10% when file is fully buffered. This is why 64 KiB is rational value. files: A Misc/NEWS.d/next/Library/2019-03-01-16-10-01.bpo-36103.n6VgXL.rst M Doc/library/shutil.rst M Lib/shutil.py diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst index 79d6bd4a06c8..587be3befa09 100644 --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -424,7 +424,7 @@ On Linux, Solaris and other POSIX platforms where :func:`os.sendfile` supports copies between 2 regular file descriptors :func:`os.sendfile` is used. On Windows :func:`shutil.copyfile` uses a bigger default buffer size (1 MiB -instead of 16 KiB) and a :func:`memoryview`-based variant of +instead of 64 KiB) and a :func:`memoryview`-based variant of :func:`shutil.copyfileobj` is used. If the fast-copy operation fails and no data was written in the destination diff --git a/Lib/shutil.py b/Lib/shutil.py index 9b50c2a9833a..7dd470dfaba4 100644 --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -49,7 +49,7 @@ elif _WINDOWS: import nt -COPY_BUFSIZE = 1024 * 1024 if _WINDOWS else 16 * 1024 +COPY_BUFSIZE = 1024 * 1024 if _WINDOWS else 64 * 1024 _HAS_SENDFILE = posix and hasattr(os, "sendfile") _HAS_FCOPYFILE = posix and hasattr(posix, "_fcopyfile") # macOS diff --git a/Misc/NEWS.d/next/Library/2019-03-01-16-10-01.bpo-36103.n6VgXL.rst b/Misc/NEWS.d/next/Library/2019-03-01-16-10-01.bpo-36103.n6VgXL.rst new file mode 100644 index 000000000000..97ed658d3762 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-01-16-10-01.bpo-36103.n6VgXL.rst @@ -0,0 +1,3 @@ +Default buffer size used by ``shutil.copyfileobj()`` is changed from 16 KiB +to 64 KiB on non-Windows platform to reduce system call overhead. Contributed +by INADA Naoki. From webhook-mailer at python.org Fri Mar 1 23:37:37 2019 From: webhook-mailer at python.org (Alex Gaynor) Date: Sat, 02 Mar 2019 04:37:37 -0000 Subject: [Python-checkins] Remove some code which has been dead since 1994 (#12136) Message-ID: https://github.com/python/cpython/commit/8589f14bbe55fb1ff5c765af5281100c38f0df63 commit: 8589f14bbe55fb1ff5c765af5281100c38f0df63 branch: master author: Alex Gaynor committer: GitHub date: 2019-03-01T23:37:34-05:00 summary: Remove some code which has been dead since 1994 (#12136) files: M Parser/grammar1.c diff --git a/Parser/grammar1.c b/Parser/grammar1.c index 9e9904158da7..9c323911ab26 100644 --- a/Parser/grammar1.c +++ b/Parser/grammar1.c @@ -12,21 +12,10 @@ dfa * PyGrammar_FindDFA(grammar *g, int type) { dfa *d; -#if 1 /* Massive speed-up */ d = &g->g_dfa[type - NT_OFFSET]; assert(d->d_type == type); return d; -#else - /* Old, slow version */ - int i; - - for (i = g->g_ndfas, d = g->g_dfa; --i >= 0; d++) { - if (d->d_type == type) - return d; - } - Py_UNREACHABLE(); -#endif } const char * From webhook-mailer at python.org Sat Mar 2 14:12:15 2019 From: webhook-mailer at python.org (Benjamin Peterson) Date: Sat, 02 Mar 2019 19:12:15 -0000 Subject: [Python-checkins] bpo-32129: Avoid blurry IDLE application icon on macOS with Tk 8.6. Original patch by Kevin Walzer. (GH-12034) Message-ID: https://github.com/python/cpython/commit/59e824b4fc314b10c5d24ff0bf737a15787f0574 commit: 59e824b4fc314b10c5d24ff0bf737a15787f0574 branch: 2.7 author: Ned Deily committer: Benjamin Peterson date: 2019-03-02T10:14:24-08:00 summary: bpo-32129: Avoid blurry IDLE application icon on macOS with Tk 8.6. Original patch by Kevin Walzer. (GH-12034) files: A Misc/NEWS.d/next/IDLE/2019-02-25-12-59-24.bpo-32129.4qVCzD.rst M Lib/idlelib/PyShell.py diff --git a/Lib/idlelib/PyShell.py b/Lib/idlelib/PyShell.py index db854b65e22a..2ea7e6b939a6 100755 --- a/Lib/idlelib/PyShell.py +++ b/Lib/idlelib/PyShell.py @@ -1560,7 +1560,7 @@ def main(): if system() == 'Windows': iconfile = os.path.join(icondir, 'idle.ico') root.wm_iconbitmap(default=iconfile) - elif TkVersion >= 8.5: + elif TkVersion >= 8.5 and sys.platform != 'darwin': ext = '.png' if TkVersion >= 8.6 else '.gif' iconfiles = [os.path.join(icondir, 'idle_%d%s' % (size, ext)) for size in (16, 32, 48)] diff --git a/Misc/NEWS.d/next/IDLE/2019-02-25-12-59-24.bpo-32129.4qVCzD.rst b/Misc/NEWS.d/next/IDLE/2019-02-25-12-59-24.bpo-32129.4qVCzD.rst new file mode 100644 index 000000000000..54a5c7244140 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-02-25-12-59-24.bpo-32129.4qVCzD.rst @@ -0,0 +1,2 @@ +Avoid blurry IDLE application icon on macOS with Tk 8.6. Patch by Kevin +Walzer. From webhook-mailer at python.org Sun Mar 3 02:28:38 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Sun, 03 Mar 2019 07:28:38 -0000 Subject: [Python-checkins] Use names SEEK_SET, etc instead of magic number (GH-12057) Message-ID: https://github.com/python/cpython/commit/848037c1476ddf86dd2798fca35527a63c764a8a commit: 848037c1476ddf86dd2798fca35527a63c764a8a branch: master author: ngie-eign <1574099+ngie-eign at users.noreply.github.com> committer: Inada Naoki date: 2019-03-03T16:28:26+09:00 summary: Use names SEEK_SET, etc instead of magic number (GH-12057) The previous code hardcoded `SEEK_SET`, etc. While it's very unlikely that these values will change, it's best to use the definitions to avoid there being mismatches in behavior with the code in the future. Signed-off-by: Enji Cooper files: M Lib/_pyio.py M Modules/_io/textio.c diff --git a/Lib/_pyio.py b/Lib/_pyio.py index e4a879941e1d..b0593c3d3ab5 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -2386,18 +2386,18 @@ def _reset_encoder(position): raise ValueError("tell on closed file") if not self._seekable: raise UnsupportedOperation("underlying stream is not seekable") - if whence == 1: # seek relative to current position + if whence == SEEK_CUR: if cookie != 0: raise UnsupportedOperation("can't do nonzero cur-relative seeks") # Seeking to the current position should attempt to # sync the underlying buffer with the current position. whence = 0 cookie = self.tell() - if whence == 2: # seek relative to end of file + elif whence == SEEK_END: if cookie != 0: raise UnsupportedOperation("can't do nonzero end-relative seeks") self.flush() - position = self.buffer.seek(0, 2) + position = self.buffer.seek(0, whence) self._set_decoded_chars('') self._snapshot = None if self._decoder: diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index 14f94885b5f8..0f0092fd741e 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -2344,7 +2344,8 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) goto fail; } - if (whence == 1) { + switch (whence) { + case SEEK_CUR: /* seek relative to current position */ cmp = PyObject_RichCompareBool(cookieObj, _PyLong_Zero, Py_EQ); if (cmp < 0) @@ -2362,8 +2363,7 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) cookieObj = _PyObject_CallMethodId((PyObject *)self, &PyId_tell, NULL); if (cookieObj == NULL) goto fail; - } - else if (whence == 2) { + case SEEK_END: /* seek relative to end of file */ cmp = PyObject_RichCompareBool(cookieObj, _PyLong_Zero, Py_EQ); if (cmp < 0) @@ -2401,10 +2401,12 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) } } return res; - } - else if (whence != 0) { + case SEEK_SET: + break; + default: PyErr_Format(PyExc_ValueError, - "invalid whence (%d, should be 0, 1 or 2)", whence); + "invalid whence (%d, should be %d, %d or %d)", whence, + SEEK_SET, SEEK_CUR, SEEK_END); goto fail; } From webhook-mailer at python.org Sun Mar 3 09:35:36 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Sun, 03 Mar 2019 14:35:36 -0000 Subject: [Python-checkins] bpo-36091: Remove reference to async generator in Lib/types.py. (GH-11996) Message-ID: https://github.com/python/cpython/commit/0a6a412fb27d6874a0db5cc82a97f54d7c5fd0f2 commit: 0a6a412fb27d6874a0db5cc82a97f54d7c5fd0f2 branch: master author: Henry Chen committer: Serhiy Storchaka date: 2019-03-03T16:35:24+02:00 summary: bpo-36091: Remove reference to async generator in Lib/types.py. (GH-11996) files: A Misc/NEWS.d/next/Library/2019-02-23-06-49-06.bpo-36091.26o4Lc.rst M Lib/types.py diff --git a/Lib/types.py b/Lib/types.py index 53b588da7569..cf643088ea9c 100644 --- a/Lib/types.py +++ b/Lib/types.py @@ -62,7 +62,7 @@ def _m(self): pass GetSetDescriptorType = type(FunctionType.__code__) MemberDescriptorType = type(FunctionType.__globals__) -del sys, _f, _g, _C, _c, # Not for export +del sys, _f, _g, _C, _c, _ag # Not for export # Provide a PEP 3115 compliant mechanism for class creation diff --git a/Misc/NEWS.d/next/Library/2019-02-23-06-49-06.bpo-36091.26o4Lc.rst b/Misc/NEWS.d/next/Library/2019-02-23-06-49-06.bpo-36091.26o4Lc.rst new file mode 100644 index 000000000000..582be4493768 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-02-23-06-49-06.bpo-36091.26o4Lc.rst @@ -0,0 +1 @@ +Clean up reference to async generator in Lib/types. Patch by Henry Chen. \ No newline at end of file From webhook-mailer at python.org Sun Mar 3 09:54:44 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 03 Mar 2019 14:54:44 -0000 Subject: [Python-checkins] bpo-36091: Remove reference to async generator in Lib/types.py. (GH-11996) Message-ID: https://github.com/python/cpython/commit/cd0416466f8a6d5333d6ea52f6907c39b8a6c3bc commit: cd0416466f8a6d5333d6ea52f6907c39b8a6c3bc branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-03T06:54:39-08:00 summary: bpo-36091: Remove reference to async generator in Lib/types.py. (GH-11996) (cherry picked from commit 0a6a412fb27d6874a0db5cc82a97f54d7c5fd0f2) Co-authored-by: Henry Chen files: A Misc/NEWS.d/next/Library/2019-02-23-06-49-06.bpo-36091.26o4Lc.rst M Lib/types.py diff --git a/Lib/types.py b/Lib/types.py index ce4652f37189..2e0513ca1582 100644 --- a/Lib/types.py +++ b/Lib/types.py @@ -55,7 +55,7 @@ def _m(self): pass GetSetDescriptorType = type(FunctionType.__code__) MemberDescriptorType = type(FunctionType.__globals__) -del sys, _f, _g, _C, _c, # Not for export +del sys, _f, _g, _C, _c, _ag # Not for export # Provide a PEP 3115 compliant mechanism for class creation diff --git a/Misc/NEWS.d/next/Library/2019-02-23-06-49-06.bpo-36091.26o4Lc.rst b/Misc/NEWS.d/next/Library/2019-02-23-06-49-06.bpo-36091.26o4Lc.rst new file mode 100644 index 000000000000..582be4493768 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-02-23-06-49-06.bpo-36091.26o4Lc.rst @@ -0,0 +1 @@ +Clean up reference to async generator in Lib/types. Patch by Henry Chen. \ No newline at end of file From webhook-mailer at python.org Sun Mar 3 11:05:23 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Sun, 03 Mar 2019 16:05:23 -0000 Subject: [Python-checkins] fixed duplicated method name of test_getuserbase() (GH-12140) Message-ID: https://github.com/python/cpython/commit/45d8d2469a48589e950dad2452043188eb9399a3 commit: 45d8d2469a48589e950dad2452043188eb9399a3 branch: master author: native-api committer: Inada Naoki date: 2019-03-04T01:05:19+09:00 summary: fixed duplicated method name of test_getuserbase() (GH-12140) files: M Lib/test/test_site.py diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py index 735651ec7d75..8f04728ad188 100644 --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -181,7 +181,9 @@ def test_addsitedir(self): finally: pth_file.cleanup() - def test_getuserbase(self): + # This tests _getuserbase, hence the double underline + # to distinguish from a test for getuserbase + def test__getuserbase(self): self.assertEqual(site._getuserbase(), sysconfig._getuserbase()) def test_get_path(self): From webhook-mailer at python.org Sun Mar 3 11:22:42 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 03 Mar 2019 16:22:42 -0000 Subject: [Python-checkins] add missing break statement (GH-12147) Message-ID: https://github.com/python/cpython/commit/8c17d928eb4602201d02b475caffc63340df849e commit: 8c17d928eb4602201d02b475caffc63340df849e branch: master author: Inada Naoki committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-03T08:22:39-08:00 summary: add missing break statement (GH-12147) Bug introduced by 848037c. files: M Modules/_io/textio.c diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index 0f0092fd741e..8c391659ecd8 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -2363,6 +2363,8 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) cookieObj = _PyObject_CallMethodId((PyObject *)self, &PyId_tell, NULL); if (cookieObj == NULL) goto fail; + break; + case SEEK_END: /* seek relative to end of file */ cmp = PyObject_RichCompareBool(cookieObj, _PyLong_Zero, Py_EQ); @@ -2401,8 +2403,10 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) } } return res; + case SEEK_SET: break; + default: PyErr_Format(PyExc_ValueError, "invalid whence (%d, should be %d, %d or %d)", whence, From webhook-mailer at python.org Sun Mar 3 12:14:50 2019 From: webhook-mailer at python.org (Chris Withers) Date: Sun, 03 Mar 2019 17:14:50 -0000 Subject: [Python-checkins] Autospec functions should propagate mock calls to parent GH-11273 (#12039) Message-ID: https://github.com/python/cpython/commit/4b9459d3a311d9f6c3c3f20f1a0dec33ce4f08b9 commit: 4b9459d3a311d9f6c3c3f20f1a0dec33ce4f08b9 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Chris Withers date: 2019-03-03T17:14:44Z summary: Autospec functions should propagate mock calls to parent GH-11273 (#12039) (cherry picked from commit 9c3f284de598550be6687964c23fd7599e53b20e) Co-authored-by: Xtreak files: A Misc/NEWS.d/next/Library/2018-12-21-09-54-30.bpo-21478.5gsXtc.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 c97ea7984a6e..5b8e74414035 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -320,6 +320,14 @@ def __repr__(self): def _check_and_set_parent(parent, value, name, new_name): + # function passed to create_autospec will have mock + # attribute attached to which parent must be set + if isinstance(value, FunctionTypes): + try: + value = value.mock + except AttributeError: + pass + if not _is_instance_mock(value): return False if ((value._mock_name or value._mock_new_name) or diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index cf0ee8fbb234..447a502b57d6 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -1799,5 +1799,18 @@ def test_parent_attribute_of_call(self): self.assertEqual(type(call.parent().parent), _Call) + def test_parent_propagation_with_create_autospec(self): + + def foo(a, b): + pass + + mock = Mock() + mock.child = create_autospec(foo) + mock.child(1, 2) + + self.assertRaises(TypeError, mock.child, 1) + self.assertEqual(mock.mock_calls, [call.child(1, 2)]) + + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Library/2018-12-21-09-54-30.bpo-21478.5gsXtc.rst b/Misc/NEWS.d/next/Library/2018-12-21-09-54-30.bpo-21478.5gsXtc.rst new file mode 100644 index 000000000000..1000748c9c48 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-12-21-09-54-30.bpo-21478.5gsXtc.rst @@ -0,0 +1,2 @@ +Calls to a child function created with :func:`unittest.mock.create_autospec` +should propagate to the parent. Patch by Karthikeyan Singaravelan. From webhook-mailer at python.org Sun Mar 3 12:42:28 2019 From: webhook-mailer at python.org (Ned Deily) Date: Sun, 03 Mar 2019 17:42:28 -0000 Subject: [Python-checkins] bpo-36170: posix_spawn doesn't exist on 3.7 (GH-12143) Message-ID: https://github.com/python/cpython/commit/8b50400fbe607ef558d6c0033efa697c99417507 commit: 8b50400fbe607ef558d6c0033efa697c99417507 branch: master author: Mark Williams committer: Ned Deily date: 2019-03-03T12:42:25-05:00 summary: bpo-36170: posix_spawn doesn't exist on 3.7 (GH-12143) The 3.8 docs claim that `os.posix_spawn` was introduced in 3.7, but it wasn't; it will be introduced in 3.8. files: M Doc/library/os.rst diff --git a/Doc/library/os.rst b/Doc/library/os.rst index aa1316b1f24a..f8803af95200 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -3465,7 +3465,7 @@ written in Python, such as a mail server's external command delivery program. :c:data:`POSIX_SPAWN_SETSCHEDPARAM` and :c:data:`POSIX_SPAWN_SETSCHEDULER` flags. - .. versionadded:: 3.7 + .. versionadded:: 3.8 .. availability:: Unix. From webhook-mailer at python.org Sun Mar 3 17:09:17 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 03 Mar 2019 22:09:17 -0000 Subject: [Python-checkins] bpo-35899: Fix Enum handling of empty and weird strings (GH-11891) Message-ID: https://github.com/python/cpython/commit/8b914d2767acba3a9e78f1dacdc2d61dbfd7e304 commit: 8b914d2767acba3a9e78f1dacdc2d61dbfd7e304 branch: master author: Brennan D Baraban <34765317+bdbaraban at users.noreply.github.com> committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-03T14:09:11-08:00 summary: bpo-35899: Fix Enum handling of empty and weird strings (GH-11891) Co-authored-by: Maxwell Co-authored-by: St?phane Wirtel https://bugs.python.org/issue35899 files: A Misc/NEWS.d/next/Library/2019-02-16-07-11-02.bpo-35899.cjfn5a.rst M Lib/enum.py M Lib/test/test_enum.py diff --git a/Lib/enum.py b/Lib/enum.py index a958ed8748af..6ef17c7f6dc8 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -19,18 +19,19 @@ def _is_descriptor(obj): def _is_dunder(name): """Returns True if a __dunder__ name, False otherwise.""" - return (name[:2] == name[-2:] == '__' and - name[2:3] != '_' and - name[-3:-2] != '_' and - len(name) > 4) + return (len(name) > 4 and + name[:2] == name[-2:] == '__' and + name[2] != '_' and + name[-3] != '_') def _is_sunder(name): """Returns True if a _sunder_ name, False otherwise.""" - return (name[0] == name[-1] == '_' and + return (len(name) > 2 and + name[0] == name[-1] == '_' and name[1:2] != '_' and - name[-2:-1] != '_' and - len(name) > 2) + name[-2:-1] != '_') + def _make_class_unpicklable(cls): """Make the given class un-picklable.""" @@ -150,7 +151,7 @@ def __new__(metacls, cls, bases, classdict): _order_ = classdict.pop('_order_', None) # check for illegal enum names (any others?) - invalid_names = set(enum_members) & {'mro', } + invalid_names = set(enum_members) & {'mro', ''} if invalid_names: raise ValueError('Invalid enum member name: {0}'.format( ','.join(invalid_names))) diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index 99fc85074b70..770decf2f4bf 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -2730,6 +2730,23 @@ def cycle_enum(): self.assertEqual(256, len(seen), 'too many composite members created') +class TestEmptyAndNonLatinStrings(unittest.TestCase): + + def test_empty_string(self): + with self.assertRaises(ValueError): + empty_abc = Enum('empty_abc', ('', 'B', 'C')) + + def test_non_latin_character_string(self): + greek_abc = Enum('greek_abc', ('\u03B1', 'B', 'C')) + item = getattr(greek_abc, '\u03B1') + self.assertEqual(item.value, 1) + + def test_non_latin_number_string(self): + hebrew_123 = Enum('hebrew_123', ('\u05D0', '2', '3')) + item = getattr(hebrew_123, '\u05D0') + self.assertEqual(item.value, 1) + + class TestUnique(unittest.TestCase): def test_unique_clean(self): diff --git a/Misc/NEWS.d/next/Library/2019-02-16-07-11-02.bpo-35899.cjfn5a.rst b/Misc/NEWS.d/next/Library/2019-02-16-07-11-02.bpo-35899.cjfn5a.rst new file mode 100644 index 000000000000..73d4fa17b33d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-02-16-07-11-02.bpo-35899.cjfn5a.rst @@ -0,0 +1 @@ +Enum has been fixed to correctly handle empty strings and strings with non-Latin characters (ie. '?', '?') without crashing. Original patch contributed by Maxwell. Assisted by St?phane Wirtel. From webhook-mailer at python.org Sun Mar 3 18:09:14 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 03 Mar 2019 23:09:14 -0000 Subject: [Python-checkins] fixed duplicated method name of test_getuserbase() (GH-12140) Message-ID: https://github.com/python/cpython/commit/f78044339954b445064426f8428a87b53f842094 commit: f78044339954b445064426f8428a87b53f842094 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-03T15:09:10-08:00 summary: fixed duplicated method name of test_getuserbase() (GH-12140) (cherry picked from commit 45d8d2469a48589e950dad2452043188eb9399a3) Co-authored-by: native-api files: M Lib/test/test_site.py diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py index a30bd2f0067f..655a12ddd165 100644 --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -183,7 +183,9 @@ def test_addsitedir(self): finally: pth_file.cleanup() - def test_getuserbase(self): + # This tests _getuserbase, hence the double underline + # to distinguish from a test for getuserbase + def test__getuserbase(self): self.assertEqual(site._getuserbase(), sysconfig._getuserbase()) def test_get_path(self): From webhook-mailer at python.org Sun Mar 3 19:00:55 2019 From: webhook-mailer at python.org (larryhastings) Date: Mon, 04 Mar 2019 00:00:55 -0000 Subject: [Python-checkins] [3.5] bpo-33329: Fix multiprocessing regression on newer glibcs (GH-6575) (#12144) Message-ID: https://github.com/python/cpython/commit/8ec1fd11f2d524859cfefae76458fcfd22decf65 commit: 8ec1fd11f2d524859cfefae76458fcfd22decf65 branch: 3.5 author: Cheryl Sabella committer: larryhastings date: 2019-03-03T16:00:49-08:00 summary: [3.5] bpo-33329: Fix multiprocessing regression on newer glibcs (GH-6575) (#12144) Starting with glibc 2.27.9000-xxx, sigaddset() can return EINVAL for some reserved signal numbers between 1 and NSIG. The `range(1, NSIG)` idiom is commonly used to select all signals for blocking with `pthread_sigmask`. So we ignore the sigaddset() return value until we expose sigfillset() to provide a better idiom. (cherry picked from commit 25038ec) Co-authored-by: Antoine Pitrou files: A Misc/NEWS.d/next/Library/2018-04-23-13-21-39.bpo-33329.lQ-Eod.rst M Modules/signalmodule.c diff --git a/Misc/NEWS.d/next/Library/2018-04-23-13-21-39.bpo-33329.lQ-Eod.rst b/Misc/NEWS.d/next/Library/2018-04-23-13-21-39.bpo-33329.lQ-Eod.rst new file mode 100644 index 000000000000..d1a4e56d04b9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-04-23-13-21-39.bpo-33329.lQ-Eod.rst @@ -0,0 +1 @@ +Fix multiprocessing regression on newer glibcs diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index e0d06b434d5a..138e74e8a9a5 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -744,7 +744,6 @@ iterable_to_sigset(PyObject *iterable, sigset_t *mask) int result = -1; PyObject *iterator, *item; long signum; - int err; sigemptyset(mask); @@ -766,11 +765,14 @@ iterable_to_sigset(PyObject *iterable, sigset_t *mask) Py_DECREF(item); if (signum == -1 && PyErr_Occurred()) goto error; - if (0 < signum && signum < NSIG) - err = sigaddset(mask, (int)signum); - else - err = 1; - if (err) { + if (0 < signum && signum < NSIG) { + /* bpo-33329: ignore sigaddset() return value as it can fail + * for some reserved signals, but we want the `range(1, NSIG)` + * idiom to allow selecting all valid signals. + */ + (void) sigaddset(mask, (int)signum); + } + else { PyErr_Format(PyExc_ValueError, "signal number %ld out of range", signum); goto error; From webhook-mailer at python.org Sun Mar 3 21:23:23 2019 From: webhook-mailer at python.org (Lisa Roach) Date: Mon, 04 Mar 2019 02:23:23 -0000 Subject: [Python-checkins] fix typo in configparser doc (GH-12154) Message-ID: https://github.com/python/cpython/commit/45d75faa7211592509c7c9da148a74687f182894 commit: 45d75faa7211592509c7c9da148a74687f182894 branch: master author: Woko committer: Lisa Roach date: 2019-03-03T18:23:19-08:00 summary: fix typo in configparser doc (GH-12154) files: M Lib/configparser.py diff --git a/Lib/configparser.py b/Lib/configparser.py index 79a991084b8f..924cc56a3f15 100644 --- a/Lib/configparser.py +++ b/Lib/configparser.py @@ -56,7 +56,7 @@ When `interpolation` is given, it should be an Interpolation subclass instance. It will be used as the handler for option value - pre-processing when using getters. RawConfigParser object s don't do + pre-processing when using getters. RawConfigParser objects don't do any sort of interpolation, whereas ConfigParser uses an instance of BasicInterpolation. The library also provides a ``zc.buildbot`` inspired ExtendedInterpolation implementation. From webhook-mailer at python.org Sun Mar 3 23:10:39 2019 From: webhook-mailer at python.org (Andrew Kuchling) Date: Mon, 04 Mar 2019 04:10:39 -0000 Subject: [Python-checkins] bpo-20906: Various revisions to the Unicode howto (#8394) Message-ID: https://github.com/python/cpython/commit/97c288df614dd7856f5a0336925f56a7a2a5bc74 commit: 97c288df614dd7856f5a0336925f56a7a2a5bc74 branch: master author: Andrew Kuchling committer: GitHub date: 2019-03-03T23:10:28-05:00 summary: bpo-20906: Various revisions to the Unicode howto (#8394) * bpo-20906: Corrections & revisions to Unicode HOWTO * bpo-34484: don't describe range as a Private Use Area files: M Doc/howto/unicode.rst diff --git a/Doc/howto/unicode.rst b/Doc/howto/unicode.rst index be1fefb35a71..5339bf45bf0e 100644 --- a/Doc/howto/unicode.rst +++ b/Doc/howto/unicode.rst @@ -6,95 +6,48 @@ :Release: 1.12 -This HOWTO discusses Python support for Unicode, and explains -various problems that people commonly encounter when trying to work -with Unicode. +This HOWTO discusses Python's support for the Unicode specification +for representing textual data, and explains various problems that +people commonly encounter when trying to work with Unicode. + Introduction to Unicode ======================= -History of Character Codes --------------------------- - -In 1968, the American Standard Code for Information Interchange, better known by -its acronym ASCII, was standardized. ASCII defined numeric codes for various -characters, with the numeric values running from 0 to 127. For example, the -lowercase letter 'a' is assigned 97 as its code value. - -ASCII was an American-developed standard, so it only defined unaccented -characters. There was an 'e', but no '?' or '?'. This meant that languages -which required accented characters couldn't be faithfully represented in ASCII. -(Actually the missing accents matter for English, too, which contains words such -as 'na?ve' and 'caf?', and some publications have house styles which require -spellings such as 'co?perate'.) - -For a while people just wrote programs that didn't display accents. -In the mid-1980s an Apple II BASIC program written by a French speaker -might have lines like these: - -.. code-block:: basic - - PRINT "MISE A JOUR TERMINEE" - PRINT "PARAMETRES ENREGISTRES" - -Those messages should contain accents (termin?e, param?tre, enregistr?s) and -they just look wrong to someone who can read French. - -In the 1980s, almost all personal computers were 8-bit, meaning that bytes could -hold values ranging from 0 to 255. ASCII codes only went up to 127, so some -machines assigned values between 128 and 255 to accented characters. Different -machines had different codes, however, which led to problems exchanging files. -Eventually various commonly used sets of values for the 128--255 range emerged. -Some were true standards, defined by the International Organization for -Standardization, and some were *de facto* conventions that were invented by one -company or another and managed to catch on. - -255 characters aren't very many. For example, you can't fit both the accented -characters used in Western Europe and the Cyrillic alphabet used for Russian -into the 128--255 range because there are more than 128 such characters. - -You could write files using different codes (all your Russian files in a coding -system called KOI8, all your French files in a different coding system called -Latin1), but what if you wanted to write a French document that quotes some -Russian text? In the 1980s people began to want to solve this problem, and the -Unicode standardization effort began. - -Unicode started out using 16-bit characters instead of 8-bit characters. 16 -bits means you have 2^16 = 65,536 distinct values available, making it possible -to represent many different characters from many different alphabets; an initial -goal was to have Unicode contain the alphabets for every single human language. -It turns out that even 16 bits isn't enough to meet that goal, and the modern -Unicode specification uses a wider range of codes, 0 through 1,114,111 ( -``0x10FFFF`` in base 16). - -There's a related ISO standard, ISO 10646. Unicode and ISO 10646 were -originally separate efforts, but the specifications were merged with the 1.1 -revision of Unicode. - -(This discussion of Unicode's history is highly simplified. The -precise historical details aren't necessary for understanding how to -use Unicode effectively, but if you're curious, consult the Unicode -consortium site listed in the References or -the `Wikipedia entry for Unicode `_ -for more information.) - - Definitions ----------- +Today's programs need to be able to handle a wide variety of +characters. Applications are often internationalized to display +messages and output in a variety of user-selectable languages; the +same program might need to output an error message in English, French, +Japanese, Hebrew, or Russian. Web content can be written in any of +these languages and can also include a variety of emoji symbols. +Python's string type uses the Unicode Standard for representing +characters, which lets Python programs work with all these different +possible characters. + +Unicode (https://www.unicode.org/) is a specification that aims to +list every character used by human languages and give each character +its own unique code. The Unicode specifications are continually +revised and updated to add new languages and symbols. + A **character** is the smallest possible component of a text. 'A', 'B', 'C', -etc., are all different characters. So are '?' and '?'. Characters are -abstractions, and vary depending on the language or context you're talking -about. For example, the symbol for ohms (?) is usually drawn much like the -capital letter omega (?) in the Greek alphabet (they may even be the same in -some fonts), but these are two different characters that have different -meanings. - -The Unicode standard describes how characters are represented by **code -points**. A code point is an integer value, usually denoted in base 16. In the -standard, a code point is written using the notation ``U+12CA`` to mean the -character with value ``0x12ca`` (4,810 decimal). The Unicode standard contains -a lot of tables listing characters and their corresponding code points: +etc., are all different characters. So are '?' and '?'. Characters vary +depending on the language or context you're talking +about. For example, there's a character for "Roman Numeral One", '?', that's +separate from the uppercase letter 'I'. They'll usually look the same, +but these are two different characters that have different meanings. + +The Unicode standard describes how characters are represented by +**code points**. A code point value is an integer in the range 0 to +0x10FFFF (about 1.1 million values, with some 110 thousand assigned so +far). In the standard and in this document, a code point is written +using the notation ``U+265E`` to mean the character with value +``0x265e`` (9,822 in decimal). + +The Unicode standard contains a lot of tables listing characters and +their corresponding code points: .. code-block:: none @@ -103,10 +56,21 @@ a lot of tables listing characters and their corresponding code points: 0063 'c'; LATIN SMALL LETTER C ... 007B '{'; LEFT CURLY BRACKET + ... + 2167 '?': ROMAN NUMERAL EIGHT + 2168 '?': ROMAN NUMERAL NINE + ... + 265E '?': BLACK CHESS KNIGHT + 265F '?': BLACK CHESS PAWN + ... + 1F600 '?': GRINNING FACE + 1F609 '?': WINKING FACE + ... Strictly, these definitions imply that it's meaningless to say 'this is -character ``U+12CA``'. ``U+12CA`` is a code point, which represents some particular -character; in this case, it represents the character 'ETHIOPIC SYLLABLE WI'. In +character ``U+265E``'. ``U+265E`` is a code point, which represents some particular +character; in this case, it represents the character 'BLACK CHESS KNIGHT', +'?'. In informal contexts, this distinction between code points and characters will sometimes be forgotten. @@ -121,14 +85,17 @@ toolkit or a terminal's font renderer. Encodings --------- -To summarize the previous section: a Unicode string is a sequence of code -points, which are numbers from 0 through ``0x10FFFF`` (1,114,111 decimal). This -sequence needs to be represented as a set of bytes (meaning, values -from 0 through 255) in memory. The rules for translating a Unicode string -into a sequence of bytes are called an **encoding**. +To summarize the previous section: a Unicode string is a sequence of +code points, which are numbers from 0 through ``0x10FFFF`` (1,114,111 +decimal). This sequence of code points needs to be represented in +memory as a set of **code units**, and **code units** are then mapped +to 8-bit bytes. The rules for translating a Unicode string into a +sequence of bytes are called a **character encoding**, or just +an **encoding**. -The first encoding you might think of is an array of 32-bit integers. In this -representation, the string "Python" would look like this: +The first encoding you might think of is using 32-bit integers as the +code unit, and then using the CPU's representation of 32-bit integers. +In this representation, the string "Python" might look like this: .. code-block:: none @@ -152,40 +119,14 @@ problems. 3. It's not compatible with existing C functions such as ``strlen()``, so a new family of wide string functions would need to be used. -4. Many Internet standards are defined in terms of textual data, and can't - handle content with embedded zero bytes. - -Generally people don't use this encoding, instead choosing other -encodings that are more efficient and convenient. UTF-8 is probably -the most commonly supported encoding; it will be discussed below. - -Encodings don't have to handle every possible Unicode character, and most -encodings don't. The rules for converting a Unicode string into the ASCII -encoding, for example, are simple; for each code point: - -1. If the code point is < 128, each byte is the same as the value of the code - point. +Therefore this encoding isn't used very much, and people instead choose other +encodings that are more efficient and convenient, such as UTF-8. -2. If the code point is 128 or greater, the Unicode string can't be represented - in this encoding. (Python raises a :exc:`UnicodeEncodeError` exception in this - case.) - -Latin-1, also known as ISO-8859-1, is a similar encoding. Unicode code points -0--255 are identical to the Latin-1 values, so converting to this encoding simply -requires converting code points to byte values; if a code point larger than 255 -is encountered, the string can't be encoded into Latin-1. - -Encodings don't have to be simple one-to-one mappings like Latin-1. Consider -IBM's EBCDIC, which was used on IBM mainframes. Letter values weren't in one -block: 'a' through 'i' had values from 129 to 137, but 'j' through 'r' were 145 -through 153. If you wanted to use EBCDIC as an encoding, you'd probably use -some sort of lookup table to perform the conversion, but this is largely an -internal detail. - -UTF-8 is one of the most commonly used encodings. UTF stands for "Unicode -Transformation Format", and the '8' means that 8-bit numbers are used in the -encoding. (There are also a UTF-16 and UTF-32 encodings, but they are less -frequently used than UTF-8.) UTF-8 uses the following rules: +UTF-8 is one of the most commonly used encodings, and Python often +defaults to using it. UTF stands for "Unicode Transformation Format", +and the '8' means that 8-bit values are used in the encoding. (There +are also UTF-16 and UTF-32 encodings, but they are less frequently +used than UTF-8.) UTF-8 uses the following rules: 1. If the code point is < 128, it's represented by the corresponding byte value. 2. If the code point is >= 128, it's turned into a sequence of two, three, or @@ -215,6 +156,10 @@ glossary, and PDF versions of the Unicode specification. Be prepared for some difficult reading. `A chronology `_ of the origin and development of Unicode is also available on the site. +On the Computerphile Youtube channel, Tom Scott briefly +`discusses the history of Unicode and UTF-8 ` +(9 minutes 36 seconds). + To help understand the standard, Jukka Korpela has written `an introductory guide `_ to reading the Unicode character tables. @@ -238,7 +183,7 @@ Unicode features. The String Type --------------- -Since Python 3.0, the language features a :class:`str` type that contain Unicode +Since Python 3.0, the language's :class:`str` type contains Unicode characters, meaning any string created using ``"unicode rocks!"``, ``'unicode rocks!'``, or the triple-quoted string syntax is stored as Unicode. @@ -252,11 +197,6 @@ include a Unicode character in a string literal:: # 'File not found' error message. print("Fichier non trouv?") -You can use a different encoding from UTF-8 by putting a specially-formatted -comment as the first or second line of the source code:: - - # -*- coding: -*- - Side note: Python 3 also supports using Unicode characters in identifiers:: r?pertoire = "/tmp/records.log" @@ -299,7 +239,7 @@ The following examples show the differences:: >>> b'\x80abc'.decode("utf-8", "ignore") 'abc' -Encodings are specified as strings containing the encoding's name. Python 3.2 +Encodings are specified as strings containing the encoding's name. Python comes with roughly 100 different encodings; see the Python Library Reference at :ref:`standard-encodings` for a list. Some encodings have multiple names; for example, ``'latin-1'``, ``'iso_8859_1'`` and ``'8859``' are all synonyms for @@ -409,12 +349,13 @@ already mentioned. See also :pep:`263` for more information. Unicode Properties ------------------ -The Unicode specification includes a database of information about code points. -For each defined code point, the information includes the character's -name, its category, the numeric value if applicable (Unicode has characters -representing the Roman numerals and fractions such as one-third and -four-fifths). There are also properties related to the code point's use in -bidirectional text and other display-related properties. +The Unicode specification includes a database of information about +code points. For each defined code point, the information includes +the character's name, its category, the numeric value if applicable +(for characters representing numeric concepts such as the Roman +numerals, fractions such as one-third and four-fifths, etc.). There +are also display-related properties, such as how to use the code point +in bidirectional text. The following program displays some information about several characters, and prints the numeric value of one particular character:: @@ -451,6 +392,88 @@ other". See list of category codes. +Comparing Strings +----------------- + +Unicode adds some complication to comparing strings, because the same +set of characters can be represented by different sequences of code +points. For example, a letter like '?' can be represented as a single +code point U+00EA, or as U+0065 U+0302, which is the code point for +'e' followed by a code point for 'COMBINING CIRCUMFLEX ACCENT'. These +will produce the same output when printed, but one is a string of +length 1 and the other is of length 2. + +One tool for a case-insensitive comparison is the +:meth:`~str.casefold` string method that converts a string to a +case-insensitive form following an algorithm described by the Unicode +Standard. This algorithm has special handling for characters such as +the German letter '?' (code point U+00DF), which becomes the pair of +lowercase letters 'ss'. + +:: + + >>> street = 'G?rzenichstra?e' + >>> street.casefold() + 'g?rzenichstrasse' + +A second tool is the :mod:`unicodedata` module's +:func:`~unicodedata.normalize` function that converts strings to one +of several normal forms, where letters followed by a combining +character are replaced with single characters. :func:`normalize` can +be used to perform string comparisons that won't falsely report +inequality if two strings use combining characters differently: + +:: + + import unicodedata + + def compare_strs(s1, s2): + def NFD(s): + return unicodedata.normalize('NFD', s) + + return NFD(s1) == NFD(s2) + + single_char = '?' + multiple_chars = '\N{LATIN SMALL LETTER E}\N{COMBINING CIRCUMFLEX ACCENT}' + print('length of first string=', len(single_char)) + print('length of second string=', len(multiple_chars)) + print(compare_strs(single_char, multiple_chars)) + +When run, this outputs: + +.. code-block:: shell-session + + $ python3 compare-strs.py + length of first string= 1 + length of second string= 2 + True + +The first argument to the :func:`~unicodedata.normalize` function is a +string giving the desired normalization form, which can be one of +'NFC', 'NFKC', 'NFD', and 'NFKD'. + +The Unicode Standard also specifies how to do caseless comparisons:: + + import unicodedata + + def compare_caseless(s1, s2): + def NFD(s): + return unicodedata.normalize('NFD', s) + + return NFD(NFD(s1).casefold()) == NFD(NFD(s2).casefold()) + + # Example usage + single_char = '?' + multiple_chars = '\N{LATIN CAPITAL LETTER E}\N{COMBINING CIRCUMFLEX ACCENT}' + + print(compare_caseless(single_char, multiple_chars)) + +This will print ``True``. (Why is :func:`NFD` invoked twice? Because +there are a few characters that make :meth:`casefold` return a +non-normalized string, so the result needs to be normalized again. See +section 3.13 of the Unicode Standard for a discussion and an example.) + + Unicode Regular Expressions --------------------------- @@ -567,22 +590,22 @@ particular byte ordering and don't skip the BOM. In some areas, it is also convention to use a "BOM" at the start of UTF-8 encoded files; the name is misleading since UTF-8 is not byte-order dependent. -The mark simply announces that the file is encoded in UTF-8. Use the -'utf-8-sig' codec to automatically skip the mark if present for reading such -files. +The mark simply announces that the file is encoded in UTF-8. For reading such +files, use the 'utf-8-sig' codec to automatically skip the mark if present. Unicode filenames ----------------- -Most of the operating systems in common use today support filenames that contain -arbitrary Unicode characters. Usually this is implemented by converting the -Unicode string into some encoding that varies depending on the system. For -example, Mac OS X uses UTF-8 while Windows uses a configurable encoding; on -Windows, Python uses the name "mbcs" to refer to whatever the currently -configured encoding is. On Unix systems, there will only be a filesystem -encoding if you've set the ``LANG`` or ``LC_CTYPE`` environment variables; if -you haven't, the default encoding is UTF-8. +Most of the operating systems in common use today support filenames +that contain arbitrary Unicode characters. Usually this is +implemented by converting the Unicode string into some encoding that +varies depending on the system. Today Python is converging on using +UTF-8: Python on MacOS has used UTF-8 for several versions, and Python +3.6 switched to using UTF-8 on Windows as well. On Unix systems, +there will only be a filesystem encoding if you've set the ``LANG`` or +``LC_CTYPE`` environment variables; if you haven't, the default +encoding is again UTF-8. The :func:`sys.getfilesystemencoding` function returns the encoding to use on your current system, in case you want to do the encoding manually, but there's @@ -597,9 +620,9 @@ automatically converted to the right encoding for you:: Functions in the :mod:`os` module such as :func:`os.stat` will also accept Unicode filenames. -The :func:`os.listdir` function returns filenames and raises an issue: should it return +The :func:`os.listdir` function returns filenames, which raises an issue: should it return the Unicode version of filenames, or should it return bytes containing -the encoded versions? :func:`os.listdir` will do both, depending on whether you +the encoded versions? :func:`os.listdir` can do both, depending on whether you provided the directory path as bytes or a Unicode string. If you pass a Unicode string as the path, filenames will be decoded using the filesystem's encoding and a list of Unicode strings will be returned, while passing a byte @@ -619,16 +642,17 @@ will produce the following output: .. code-block:: shell-session - amk:~$ python t.py + $ python listdir-test.py [b'filename\xe4\x94\x80abc', ...] ['filename\u4500abc', ...] The first list contains UTF-8-encoded filenames, and the second list contains the Unicode versions. -Note that on most occasions, the Unicode APIs should be used. The bytes APIs -should only be used on systems where undecodable file names can be present, -i.e. Unix systems. +Note that on most occasions, you should can just stick with using +Unicode with these APIs. The bytes APIs should only be used on +systems where undecodable file names can be present; that's +pretty much only Unix systems now. Tips for Writing Unicode-aware Programs @@ -695,10 +719,10 @@ with the ``surrogateescape`` error handler:: f.write(data) The ``surrogateescape`` error handler will decode any non-ASCII bytes -as code points in the Unicode Private Use Area ranging from U+DC80 to -U+DCFF. These private code points will then be turned back into the -same bytes when the ``surrogateescape`` error handler is used when -encoding the data and writing it back out. +as code points in a special range running from U+DC80 to +U+DCFF. These code points will then turn back into the +same bytes when the ``surrogateescape`` error handler is used to +encode the data and write it back out. References @@ -730,4 +754,5 @@ Andrew Kuchling, and Ezio Melotti. Thanks to the following people who have noted errors or offered suggestions on this article: ?ric Araujo, Nicholas Bastin, Nick Coghlan, Marius Gedminas, Kent Johnson, Ken Krugler, Marc-Andr? -Lemburg, Martin von L?wis, Terry J. Reedy, Chad Whitacre. +Lemburg, Martin von L?wis, Terry J. Reedy, Serhiy Storchaka, +Eryk Sun, Chad Whitacre, Graham Wideman. From webhook-mailer at python.org Mon Mar 4 02:26:16 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Mon, 04 Mar 2019 07:26:16 -0000 Subject: [Python-checkins] Clean implementation of Parser/pgen and fix some style issues (GH-12156) Message-ID: https://github.com/python/cpython/commit/8bc401a55ce5dfcdd225c20786ba8e221a0bf29b commit: 8bc401a55ce5dfcdd225c20786ba8e221a0bf29b branch: master author: Pablo Galindo committer: GitHub date: 2019-03-04T07:26:13Z summary: Clean implementation of Parser/pgen and fix some style issues (GH-12156) files: M Parser/pgen/__main__.py M Parser/pgen/grammar.py M Parser/pgen/pgen.py M Parser/pgen/token.py diff --git a/Parser/pgen/__main__.py b/Parser/pgen/__main__.py index 965b08fd2343..eea52618422e 100644 --- a/Parser/pgen/__main__.py +++ b/Parser/pgen/__main__.py @@ -2,6 +2,7 @@ from .pgen import ParserGenerator + def main(): parser = argparse.ArgumentParser(description="Parser generator main program.") parser.add_argument( diff --git a/Parser/pgen/grammar.py b/Parser/pgen/grammar.py index bd405e674e44..05a37d67832d 100644 --- a/Parser/pgen/grammar.py +++ b/Parser/pgen/grammar.py @@ -1,19 +1,8 @@ import collections -class Grammar: - """Pgen parsing tables conversion class. - - Once initialized, this class supplies the grammar tables for the - parsing engine implemented by parse.py. The parsing engine - accesses the instance variables directly. The class here does not - provide initialization of the tables; several subclasses exist to - do this (see the conv and pgen modules). - The load() method reads the tables from a pickle file, which is - much faster than the other ways offered by subclasses. The pickle - file is written by calling dump() (after loading the grammar - tables using a subclass). The report() method prints a readable - representation of the tables to stdout, for debugging. +class Grammar: + """Pgen parsing tables class. The instance variables are as follows: @@ -36,8 +25,7 @@ class Grammar: dfas -- a dict mapping symbol numbers to (DFA, first) pairs, where DFA is an item from the states list above, and first is a set of tokens that can - begin this grammar rule (represented by a dict - whose values are always 1). + begin this grammar rule. labels -- a list of (x, y) pairs where x is either a token number or a symbol number, and y is either None @@ -92,14 +80,12 @@ def print_labels(self, writer): "static label labels[{n_labels}] = {{\n".format(n_labels=len(self.labels)) ) for label, name in self.labels: - if name is None: - writer(" {{{label}, 0}},\n".format(label=label)) - else: - writer( - ' {{{label}, "{label_name}"}},\n'.format( - label=label, label_name=name - ) + label_name = '"{}"'.format(name) if name is not None else 0 + writer( + ' {{{label}, {label_name}}},\n'.format( + label=label, label_name=label_name ) + ) writer("};\n") def print_dfas(self, writer): @@ -114,10 +100,9 @@ def print_dfas(self, writer): + "0, {n_states}, states_{dfa_index},\n".format( n_states=len(dfa), dfa_index=dfaindex ) + + ' "' ) - writer(' "') - k = [name for label, name in self.labels if label in first_sets] bitset = bytearray((len(self.labels) >> 3) + 1) for token in first_sets: bitset[token >> 3] |= 1 << (token & 7) diff --git a/Parser/pgen/pgen.py b/Parser/pgen/pgen.py index c878919f2ac4..d52d58f64e41 100644 --- a/Parser/pgen/pgen.py +++ b/Parser/pgen/pgen.py @@ -3,6 +3,7 @@ from . import grammar, token + class ParserGenerator(object): def __init__(self, grammar_file, token_file, stream=None, verbose=False): @@ -183,11 +184,8 @@ def parse(self): dfa = self.make_dfa(a, z) if self.verbose: self.dump_dfa(name, dfa) - oldlen = len(dfa) self.simplify_dfa(dfa) - newlen = len(dfa) dfas[name] = dfa - #print name, oldlen, newlen if startsymbol is None: startsymbol = name return dfas, startsymbol @@ -355,7 +353,7 @@ def raise_error(self, msg, *args): if args: try: msg = msg % args - except: + except Exception: msg = " ".join([msg] + list(map(str, args))) raise SyntaxError(msg, (self.filename, self.end[0], self.end[1], self.line)) diff --git a/Parser/pgen/token.py b/Parser/pgen/token.py index f9d45c450c45..008e241e175e 100644 --- a/Parser/pgen/token.py +++ b/Parser/pgen/token.py @@ -1,5 +1,6 @@ import itertools + def generate_tokens(tokens): numbers = itertools.count(0) for line in tokens: @@ -16,6 +17,7 @@ def generate_tokens(tokens): yield ('N_TOKENS', next(numbers)) yield ('NT_OFFSET', 256) + def generate_opmap(tokens): for line in tokens: line = line.strip() From webhook-mailer at python.org Mon Mar 4 04:02:32 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 04 Mar 2019 09:02:32 -0000 Subject: [Python-checkins] bpo-31904: Add encoding support for VxWorks RTOS (GH-12051) Message-ID: https://github.com/python/cpython/commit/f4b0a1c0da80318e0a4f4c70d2722f01ce3512dd commit: f4b0a1c0da80318e0a4f4c70d2722f01ce3512dd branch: master author: pxinwr committer: Victor Stinner date: 2019-03-04T10:02:06+01:00 summary: bpo-31904: Add encoding support for VxWorks RTOS (GH-12051) Use UTF-8 as the system encoding on VxWorks. The main reason are: 1. The locale is frequently misconfigured. 2. Missing some functions to deal with locale in VxWorks C library. files: A Misc/NEWS.d/next/Core and Builtins/2019-02-26-17-34-49.bpo-31904.R4KSj6.rst M Doc/c-api/sys.rst M Doc/c-api/unicode.rst M Doc/library/sys.rst M Include/cpython/coreconfig.h M Python/coreconfig.c M Python/fileutils.c diff --git a/Doc/c-api/sys.rst b/Doc/c-api/sys.rst index 0eee35a1285c..c8ea78363dfa 100644 --- a/Doc/c-api/sys.rst +++ b/Doc/c-api/sys.rst @@ -108,7 +108,7 @@ Operating System Utilities Encoding, highest priority to lowest priority: - * ``UTF-8`` on macOS and Android; + * ``UTF-8`` on macOS, Android, and VxWorks; * ``UTF-8`` on Windows if :c:data:`Py_LegacyWindowsFSEncodingFlag` is zero; * ``UTF-8`` if the Python UTF-8 mode is enabled; * ``ASCII`` if the ``LC_CTYPE`` locale is ``"C"``, @@ -154,7 +154,7 @@ Operating System Utilities Encoding, highest priority to lowest priority: - * ``UTF-8`` on macOS and Android; + * ``UTF-8`` on macOS, Android, and VxWorks; * ``UTF-8`` on Windows if :c:data:`Py_LegacyWindowsFSEncodingFlag` is zero; * ``UTF-8`` if the Python UTF-8 mode is enabled; * ``ASCII`` if the ``LC_CTYPE`` locale is ``"C"``, diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index 39c067d439cc..97c5ebcb1095 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -760,8 +760,8 @@ system. Py_ssize_t len, \ const char *errors) - Decode a string from UTF-8 on Android, or from the current locale encoding - on other platforms. The supported + Decode a string from UTF-8 on Android and VxWorks, or from the current + locale encoding on other platforms. The supported error handlers are ``"strict"`` and ``"surrogateescape"`` (:pep:`383`). The decoder uses ``"strict"`` error handler if *errors* is ``NULL``. *str* must end with a null character but @@ -796,8 +796,8 @@ system. .. c:function:: PyObject* PyUnicode_EncodeLocale(PyObject *unicode, const char *errors) - Encode a Unicode object to UTF-8 on Android, or to the current locale - encoding on other platforms. The + Encode a Unicode object to UTF-8 on Android and VxWorks, or to the current + locale encoding on other platforms. The supported error handlers are ``"strict"`` and ``"surrogateescape"`` (:pep:`383`). The encoder uses ``"strict"`` error handler if *errors* is ``NULL``. Return a :class:`bytes` object. *unicode* cannot diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 018f0c9f1061..0fa5bd462294 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -524,13 +524,17 @@ always available. * In the UTF-8 mode, the encoding is ``utf-8`` on any platform. - * On Mac OS X, the encoding is ``'utf-8'``. + * On macOS, the encoding is ``'utf-8'``. * On Unix, the encoding is the locale encoding. * On Windows, the encoding may be ``'utf-8'`` or ``'mbcs'``, depending on user configuration. + * On Android, the encoding is ``'utf-8'``. + + * On VxWorks, the encoding is ``'utf-8'``. + .. versionchanged:: 3.2 :func:`getfilesystemencoding` result cannot be ``None`` anymore. @@ -1023,7 +1027,7 @@ always available. Linux ``'linux'`` Windows ``'win32'`` Windows/Cygwin ``'cygwin'`` - Mac OS X ``'darwin'`` + macOS ``'darwin'`` ================ =========================== .. versionchanged:: 3.3 diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index e3ebf7365b94..8ad3b230612c 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -90,8 +90,8 @@ typedef struct { * The UTF-8 Mode uses UTF-8/surrogateescape; * If Python forces the usage of the ASCII encoding (ex: C locale or POSIX locale on FreeBSD or HP-UX), use ASCII/surrogateescape; - * locale encoding: ANSI code page on Windows, UTF-8 on Android, - LC_CTYPE locale encoding on other platforms; + * locale encoding: ANSI code page on Windows, UTF-8 on Android and + VxWorks, LC_CTYPE locale encoding on other platforms; * On Windows, "surrogateescape" error handler; * "surrogateescape" error handler if the LC_CTYPE locale is "C" or "POSIX"; * "surrogateescape" error handler if the LC_CTYPE locale has been coerced diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-02-26-17-34-49.bpo-31904.R4KSj6.rst b/Misc/NEWS.d/next/Core and Builtins/2019-02-26-17-34-49.bpo-31904.R4KSj6.rst new file mode 100644 index 000000000000..29514952fd74 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-02-26-17-34-49.bpo-31904.R4KSj6.rst @@ -0,0 +1 @@ +Use UTF-8 as the system encoding on VxWorks. diff --git a/Python/coreconfig.c b/Python/coreconfig.c index e1bf8b523ccf..c3eccb3b192a 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -1280,7 +1280,7 @@ get_locale_encoding(char **locale_encoding) #ifdef MS_WINDOWS char encoding[20]; PyOS_snprintf(encoding, sizeof(encoding), "cp%d", GetACP()); -#elif defined(__ANDROID__) +#elif defined(__ANDROID__) || defined(__VXWORKS__) const char *encoding = "UTF-8"; #else const char *encoding = nl_langinfo(CODESET); diff --git a/Python/fileutils.c b/Python/fileutils.c index 366bd007e1c9..75e015afaec3 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -536,7 +536,7 @@ _Py_DecodeLocaleEx(const char* arg, wchar_t **wstr, size_t *wlen, int current_locale, _Py_error_handler errors) { if (current_locale) { -#ifdef __ANDROID__ +#if defined(__ANDROID__) || defined(__VXWORKS__) return _Py_DecodeUTF8Ex(arg, strlen(arg), wstr, wlen, reason, errors); #else @@ -544,7 +544,7 @@ _Py_DecodeLocaleEx(const char* arg, wchar_t **wstr, size_t *wlen, #endif } -#if defined(__APPLE__) || defined(__ANDROID__) +#if defined(__APPLE__) || defined(__ANDROID__) || defined(__VXWORKS__) return _Py_DecodeUTF8Ex(arg, strlen(arg), wstr, wlen, reason, errors); #else @@ -569,7 +569,7 @@ _Py_DecodeLocaleEx(const char* arg, wchar_t **wstr, size_t *wlen, #endif return decode_current_locale(arg, wstr, wlen, reason, errors); -#endif /* __APPLE__ or __ANDROID__ */ +#endif /* __APPLE__ or __ANDROID__ or __VXWORKS__ */ } From webhook-mailer at python.org Mon Mar 4 05:22:12 2019 From: webhook-mailer at python.org (Larry Hastings) Date: Mon, 04 Mar 2019 10:22:12 -0000 Subject: [Python-checkins] PyDoc and blurb updates for 3.5.7rc1. Message-ID: https://github.com/python/cpython/commit/485fa7e0ad9b557fc94175fb482de5e2a8f9bf35 commit: 485fa7e0ad9b557fc94175fb482de5e2a8f9bf35 branch: 3.5 author: Larry Hastings committer: Larry Hastings date: 2019-03-03T18:00:25-08:00 summary: PyDoc and blurb updates for 3.5.7rc1. files: A Misc/NEWS.d/3.5.7rc1.rst D Misc/NEWS.d/next/Library/2018-03-24-15-08-24.bpo-33127.olJmHv.rst D Misc/NEWS.d/next/Library/2018-04-23-13-21-39.bpo-33329.lQ-Eod.rst D Misc/NEWS.d/next/Security/2018-09-10-16-05-39.bpo-34623.Ua9jMv.rst D Misc/NEWS.d/next/Security/2018-09-24-18-49-25.bpo-34791.78GmIG.rst D Misc/NEWS.d/next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst M Lib/pydoc_data/topics.py diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index 182f15bba4a8..5fa3c4ed2b32 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,13088 +1,79 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Thu Jul 19 17:54:59 2018 -topics = {'assert': '\n' - 'The "assert" statement\n' - '**********************\n' - '\n' - 'Assert statements are a convenient way to insert debugging ' - 'assertions\n' - 'into a program:\n' - '\n' - ' assert_stmt ::= "assert" expression ["," expression]\n' - '\n' - 'The simple form, "assert expression", is equivalent to\n' - '\n' - ' if __debug__:\n' - ' if not expression: raise AssertionError\n' - '\n' - 'The extended form, "assert expression1, expression2", is ' - 'equivalent to\n' - '\n' - ' if __debug__:\n' - ' if not expression1: raise AssertionError(expression2)\n' - '\n' - 'These equivalences assume that "__debug__" and "AssertionError" ' - 'refer\n' - 'to the built-in variables with those names. In the current\n' - 'implementation, the built-in variable "__debug__" is "True" ' - 'under\n' - 'normal circumstances, "False" when optimization is requested ' - '(command\n' - 'line option -O). The current code generator emits no code for ' - 'an\n' - 'assert statement when optimization is requested at compile ' - 'time. Note\n' - 'that it is unnecessary to include the source code for the ' - 'expression\n' - 'that failed in the error message; it will be displayed as part ' - 'of the\n' - 'stack trace.\n' - '\n' - 'Assignments to "__debug__" are illegal. The value for the ' - 'built-in\n' - 'variable is determined when the interpreter starts.\n', - 'assignment': '\n' - 'Assignment statements\n' - '*********************\n' - '\n' - 'Assignment statements are used to (re)bind names to values ' - 'and to\n' - 'modify attributes or items of mutable objects:\n' - '\n' - ' assignment_stmt ::= (target_list "=")+ ' - '(starred_expression | yield_expression)\n' - ' target_list ::= target ("," target)* [","]\n' - ' target ::= identifier\n' - ' | "(" target_list ")"\n' - ' | "[" [target_list] "]"\n' - ' | attributeref\n' - ' | subscription\n' - ' | slicing\n' - ' | "*" target\n' - '\n' - '(See section *Primaries* for the syntax definitions for\n' - '*attributeref*, *subscription*, and *slicing*.)\n' - '\n' - 'An assignment statement evaluates the expression list ' - '(remember that\n' - 'this can be a single expression or a comma-separated list, ' - 'the latter\n' - 'yielding a tuple) and assigns the single resulting object to ' - 'each of\n' - 'the target lists, from left to right.\n' - '\n' - 'Assignment is defined recursively depending on the form of ' - 'the target\n' - '(list). When a target is part of a mutable object (an ' - 'attribute\n' - 'reference, subscription or slicing), the mutable object ' - 'must\n' - 'ultimately perform the assignment and decide about its ' - 'validity, and\n' - 'may raise an exception if the assignment is unacceptable. ' - 'The rules\n' - 'observed by various types and the exceptions raised are ' - 'given with the\n' - 'definition of the object types (see section *The standard ' - 'type\n' - 'hierarchy*).\n' - '\n' - 'Assignment of an object to a target list, optionally ' - 'enclosed in\n' - 'parentheses or square brackets, is recursively defined as ' - 'follows.\n' - '\n' - '* If the target list is empty: The object must also be an ' - 'empty\n' - ' iterable.\n' - '\n' - '* If the target list is a single target in parentheses: The ' - 'object\n' - ' is assigned to that target.\n' - '\n' - '* If the target list is a comma-separated list of targets, ' - 'or a\n' - ' single target in square brackets: The object must be an ' - 'iterable\n' - ' with the same number of items as there are targets in the ' - 'target\n' - ' list, and the items are assigned, from left to right, to ' - 'the\n' - ' corresponding targets.\n' - '\n' - ' * If the target list contains one target prefixed with an\n' - ' asterisk, called a "starred" target: The object must be ' - 'an\n' - ' iterable with at least as many items as there are ' - 'targets in the\n' - ' target list, minus one. The first items of the iterable ' - 'are\n' - ' assigned, from left to right, to the targets before the ' - 'starred\n' - ' target. The final items of the iterable are assigned to ' - 'the\n' - ' targets after the starred target. A list of the ' - 'remaining items\n' - ' in the iterable is then assigned to the starred target ' - '(the list\n' - ' can be empty).\n' - '\n' - ' * Else: The object must be an iterable with the same ' - 'number of\n' - ' items as there are targets in the target list, and the ' - 'items are\n' - ' assigned, from left to right, to the corresponding ' - 'targets.\n' - '\n' - 'Assignment of an object to a single target is recursively ' - 'defined as\n' - 'follows.\n' - '\n' - '* If the target is an identifier (name):\n' - '\n' - ' * If the name does not occur in a "global" or "nonlocal" ' - 'statement\n' - ' in the current code block: the name is bound to the ' - 'object in the\n' - ' current local namespace.\n' - '\n' - ' * Otherwise: the name is bound to the object in the ' - 'global\n' - ' namespace or the outer namespace determined by ' - '"nonlocal",\n' - ' respectively.\n' - '\n' - ' The name is rebound if it was already bound. This may ' - 'cause the\n' - ' reference count for the object previously bound to the ' - 'name to reach\n' - ' zero, causing the object to be deallocated and its ' - 'destructor (if it\n' - ' has one) to be called.\n' - '\n' - '* If the target is an attribute reference: The primary ' - 'expression in\n' - ' the reference is evaluated. It should yield an object ' - 'with\n' - ' assignable attributes; if this is not the case, ' - '"TypeError" is\n' - ' raised. That object is then asked to assign the assigned ' - 'object to\n' - ' the given attribute; if it cannot perform the assignment, ' - 'it raises\n' - ' an exception (usually but not necessarily ' - '"AttributeError").\n' - '\n' - ' Note: If the object is a class instance and the attribute ' - 'reference\n' - ' occurs on both sides of the assignment operator, the RHS ' - 'expression,\n' - ' "a.x" can access either an instance attribute or (if no ' - 'instance\n' - ' attribute exists) a class attribute. The LHS target "a.x" ' - 'is always\n' - ' set as an instance attribute, creating it if necessary. ' - 'Thus, the\n' - ' two occurrences of "a.x" do not necessarily refer to the ' - 'same\n' - ' attribute: if the RHS expression refers to a class ' - 'attribute, the\n' - ' LHS creates a new instance attribute as the target of the\n' - ' assignment:\n' - '\n' - ' class Cls:\n' - ' x = 3 # class variable\n' - ' inst = Cls()\n' - ' inst.x = inst.x + 1 # writes inst.x as 4 leaving ' - 'Cls.x as 3\n' - '\n' - ' This description does not necessarily apply to descriptor\n' - ' attributes, such as properties created with "property()".\n' - '\n' - '* If the target is a subscription: The primary expression in ' - 'the\n' - ' reference is evaluated. It should yield either a mutable ' - 'sequence\n' - ' object (such as a list) or a mapping object (such as a ' - 'dictionary).\n' - ' Next, the subscript expression is evaluated.\n' - '\n' - ' If the primary is a mutable sequence object (such as a ' - 'list), the\n' - ' subscript must yield an integer. If it is negative, the ' - "sequence's\n" - ' length is added to it. The resulting value must be a ' - 'nonnegative\n' - " integer less than the sequence's length, and the sequence " - 'is asked\n' - ' to assign the assigned object to its item with that ' - 'index. If the\n' - ' index is out of range, "IndexError" is raised (assignment ' - 'to a\n' - ' subscripted sequence cannot add new items to a list).\n' - '\n' - ' If the primary is a mapping object (such as a dictionary), ' - 'the\n' - " subscript must have a type compatible with the mapping's " - 'key type,\n' - ' and the mapping is then asked to create a key/datum pair ' - 'which maps\n' - ' the subscript to the assigned object. This can either ' - 'replace an\n' - ' existing key/value pair with the same key value, or insert ' - 'a new\n' - ' key/value pair (if no key with the same value existed).\n' - '\n' - ' For user-defined objects, the "__setitem__()" method is ' - 'called with\n' - ' appropriate arguments.\n' - '\n' - '* If the target is a slicing: The primary expression in the\n' - ' reference is evaluated. It should yield a mutable ' - 'sequence object\n' - ' (such as a list). The assigned object should be a ' - 'sequence object\n' - ' of the same type. Next, the lower and upper bound ' - 'expressions are\n' - ' evaluated, insofar they are present; defaults are zero and ' - 'the\n' - " sequence's length. The bounds should evaluate to " - 'integers. If\n' - " either bound is negative, the sequence's length is added " - 'to it. The\n' - ' resulting bounds are clipped to lie between zero and the ' - "sequence's\n" - ' length, inclusive. Finally, the sequence object is asked ' - 'to replace\n' - ' the slice with the items of the assigned sequence. The ' - 'length of\n' - ' the slice may be different from the length of the assigned ' - 'sequence,\n' - ' thus changing the length of the target sequence, if the ' - 'target\n' - ' sequence allows it.\n' - '\n' - '**CPython implementation detail:** In the current ' - 'implementation, the\n' - 'syntax for targets is taken to be the same as for ' - 'expressions, and\n' - 'invalid syntax is rejected during the code generation phase, ' - 'causing\n' - 'less detailed error messages.\n' - '\n' - 'Although the definition of assignment implies that overlaps ' - 'between\n' - 'the left-hand side and the right-hand side are ' - "'simultaneous' (for\n" - 'example "a, b = b, a" swaps two variables), overlaps ' - '*within* the\n' - 'collection of assigned-to variables occur left-to-right, ' - 'sometimes\n' - 'resulting in confusion. For instance, the following program ' - 'prints\n' - '"[0, 2]":\n' - '\n' - ' x = [0, 1]\n' - ' i = 0\n' - ' i, x[i] = 1, 2 # i is updated, then x[i] is ' - 'updated\n' - ' print(x)\n' - '\n' - 'See also: **PEP 3132** - Extended Iterable Unpacking\n' - '\n' - ' The specification for the "*target" feature.\n' - '\n' - '\n' - 'Augmented assignment statements\n' - '===============================\n' - '\n' - 'Augmented assignment is the combination, in a single ' - 'statement, of a\n' - 'binary operation and an assignment statement:\n' - '\n' - ' augmented_assignment_stmt ::= augtarget augop ' - '(expression_list | yield_expression)\n' - ' augtarget ::= identifier | attributeref | ' - 'subscription | slicing\n' - ' augop ::= "+=" | "-=" | "*=" | "@=" | ' - '"/=" | "//=" | "%=" | "**="\n' - ' | ">>=" | "<<=" | "&=" | "^=" | "|="\n' - '\n' - '(See section *Primaries* for the syntax definitions of the ' - 'last three\n' - 'symbols.)\n' - '\n' - 'An augmented assignment evaluates the target (which, unlike ' - 'normal\n' - 'assignment statements, cannot be an unpacking) and the ' - 'expression\n' - 'list, performs the binary operation specific to the type of ' - 'assignment\n' - 'on the two operands, and assigns the result to the original ' - 'target.\n' - 'The target is only evaluated once.\n' - '\n' - 'An augmented assignment expression like "x += 1" can be ' - 'rewritten as\n' - '"x = x + 1" to achieve a similar, but not exactly equal ' - 'effect. In the\n' - 'augmented version, "x" is only evaluated once. Also, when ' - 'possible,\n' - 'the actual operation is performed *in-place*, meaning that ' - 'rather than\n' - 'creating a new object and assigning that to the target, the ' - 'old object\n' - 'is modified instead.\n' - '\n' - 'Unlike normal assignments, augmented assignments evaluate ' - 'the left-\n' - 'hand side *before* evaluating the right-hand side. For ' - 'example, "a[i]\n' - '+= f(x)" first looks-up "a[i]", then it evaluates "f(x)" and ' - 'performs\n' - 'the addition, and lastly, it writes the result back to ' - '"a[i]".\n' - '\n' - 'With the exception of assigning to tuples and multiple ' - 'targets in a\n' - 'single statement, the assignment done by augmented ' - 'assignment\n' - 'statements is handled the same way as normal assignments. ' - 'Similarly,\n' - 'with the exception of the possible *in-place* behavior, the ' - 'binary\n' - 'operation performed by augmented assignment is the same as ' - 'the normal\n' - 'binary operations.\n' - '\n' - 'For targets which are attribute references, the same *caveat ' - 'about\n' - 'class and instance attributes* applies as for regular ' - 'assignments.\n', - 'atom-identifiers': '\n' - 'Identifiers (Names)\n' - '*******************\n' - '\n' - 'An identifier occurring as an atom is a name. See ' - 'section\n' - '*Identifiers and keywords* for lexical definition and ' - 'section *Naming\n' - 'and binding* for documentation of naming and binding.\n' - '\n' - 'When the name is bound to an object, evaluation of the ' - 'atom yields\n' - 'that object. When a name is not bound, an attempt to ' - 'evaluate it\n' - 'raises a "NameError" exception.\n' - '\n' - '**Private name mangling:** When an identifier that ' - 'textually occurs in\n' - 'a class definition begins with two or more underscore ' - 'characters and\n' - 'does not end in two or more underscores, it is ' - 'considered a *private\n' - 'name* of that class. Private names are transformed to ' - 'a longer form\n' - 'before code is generated for them. The transformation ' - 'inserts the\n' - 'class name, with leading underscores removed and a ' - 'single underscore\n' - 'inserted, in front of the name. For example, the ' - 'identifier "__spam"\n' - 'occurring in a class named "Ham" will be transformed ' - 'to "_Ham__spam".\n' - 'This transformation is independent of the syntactical ' - 'context in which\n' - 'the identifier is used. If the transformed name is ' - 'extremely long\n' - '(longer than 255 characters), implementation defined ' - 'truncation may\n' - 'happen. If the class name consists only of ' - 'underscores, no\n' - 'transformation is done.\n', - 'atom-literals': '\n' - 'Literals\n' - '********\n' - '\n' - 'Python supports string and bytes literals and various ' - 'numeric\n' - 'literals:\n' - '\n' - ' literal ::= stringliteral | bytesliteral\n' - ' | integer | floatnumber | imagnumber\n' - '\n' - 'Evaluation of a literal yields an object of the given ' - 'type (string,\n' - 'bytes, integer, floating point number, complex number) ' - 'with the given\n' - 'value. The value may be approximated in the case of ' - 'floating point\n' - 'and imaginary (complex) literals. See section *Literals* ' - 'for details.\n' - '\n' - 'All literals correspond to immutable data types, and ' - 'hence the\n' - "object's identity is less important than its value. " - 'Multiple\n' - 'evaluations of literals with the same value (either the ' - 'same\n' - 'occurrence in the program text or a different occurrence) ' - 'may obtain\n' - 'the same object or a different object with the same ' - 'value.\n', - 'attribute-access': '\n' - 'Customizing attribute access\n' - '****************************\n' - '\n' - 'The following methods can be defined to customize the ' - 'meaning of\n' - 'attribute access (use of, assignment to, or deletion ' - 'of "x.name") for\n' - 'class instances.\n' - '\n' - 'object.__getattr__(self, name)\n' - '\n' - ' Called when an attribute lookup has not found the ' - 'attribute in the\n' - ' usual places (i.e. it is not an instance attribute ' - 'nor is it found\n' - ' in the class tree for "self"). "name" is the ' - 'attribute name. This\n' - ' method should return the (computed) attribute value ' - 'or raise an\n' - ' "AttributeError" exception.\n' - '\n' - ' Note that if the attribute is found through the ' - 'normal mechanism,\n' - ' "__getattr__()" is not called. (This is an ' - 'intentional asymmetry\n' - ' between "__getattr__()" and "__setattr__()".) This ' - 'is done both for\n' - ' efficiency reasons and because otherwise ' - '"__getattr__()" would have\n' - ' no way to access other attributes of the instance. ' - 'Note that at\n' - ' least for instance variables, you can fake total ' - 'control by not\n' - ' inserting any values in the instance attribute ' - 'dictionary (but\n' - ' instead inserting them in another object). See ' - 'the\n' - ' "__getattribute__()" method below for a way to ' - 'actually get total\n' - ' control over attribute access.\n' - '\n' - 'object.__getattribute__(self, name)\n' - '\n' - ' Called unconditionally to implement attribute ' - 'accesses for\n' - ' instances of the class. If the class also defines ' - '"__getattr__()",\n' - ' the latter will not be called unless ' - '"__getattribute__()" either\n' - ' calls it explicitly or raises an "AttributeError". ' - 'This method\n' - ' should return the (computed) attribute value or ' - 'raise an\n' - ' "AttributeError" exception. In order to avoid ' - 'infinite recursion in\n' - ' this method, its implementation should always call ' - 'the base class\n' - ' method with the same name to access any attributes ' - 'it needs, for\n' - ' example, "object.__getattribute__(self, name)".\n' - '\n' - ' Note: This method may still be bypassed when ' - 'looking up special\n' - ' methods as the result of implicit invocation via ' - 'language syntax\n' - ' or built-in functions. See *Special method ' - 'lookup*.\n' - '\n' - 'object.__setattr__(self, name, value)\n' - '\n' - ' Called when an attribute assignment is attempted. ' - 'This is called\n' - ' instead of the normal mechanism (i.e. store the ' - 'value in the\n' - ' instance dictionary). *name* is the attribute name, ' - '*value* is the\n' - ' value to be assigned to it.\n' - '\n' - ' If "__setattr__()" wants to assign to an instance ' - 'attribute, it\n' - ' should call the base class method with the same ' - 'name, for example,\n' - ' "object.__setattr__(self, name, value)".\n' - '\n' - 'object.__delattr__(self, name)\n' - '\n' - ' Like "__setattr__()" but for attribute deletion ' - 'instead of\n' - ' assignment. This should only be implemented if ' - '"del obj.name" is\n' - ' meaningful for the object.\n' - '\n' - 'object.__dir__(self)\n' - '\n' - ' Called when "dir()" is called on the object. A ' - 'sequence must be\n' - ' returned. "dir()" converts the returned sequence to ' - 'a list and\n' - ' sorts it.\n' - '\n' - '\n' - 'Implementing Descriptors\n' - '========================\n' - '\n' - 'The following methods only apply when an instance of ' - 'the class\n' - 'containing the method (a so-called *descriptor* class) ' - 'appears in an\n' - '*owner* class (the descriptor must be in either the ' - "owner's class\n" - 'dictionary or in the class dictionary for one of its ' - 'parents). In the\n' - 'examples below, "the attribute" refers to the ' - 'attribute whose name is\n' - "the key of the property in the owner class' " - '"__dict__".\n' - '\n' - 'object.__get__(self, instance, owner)\n' - '\n' - ' Called to get the attribute of the owner class ' - '(class attribute\n' - ' access) or of an instance of that class (instance ' - 'attribute\n' - ' access). *owner* is always the owner class, while ' - '*instance* is the\n' - ' instance that the attribute was accessed through, ' - 'or "None" when\n' - ' the attribute is accessed through the *owner*. ' - 'This method should\n' - ' return the (computed) attribute value or raise an ' - '"AttributeError"\n' - ' exception.\n' - '\n' - 'object.__set__(self, instance, value)\n' - '\n' - ' Called to set the attribute on an instance ' - '*instance* of the owner\n' - ' class to a new value, *value*.\n' - '\n' - 'object.__delete__(self, instance)\n' - '\n' - ' Called to delete the attribute on an instance ' - '*instance* of the\n' - ' owner class.\n' - '\n' - 'The attribute "__objclass__" is interpreted by the ' - '"inspect" module as\n' - 'specifying the class where this object was defined ' - '(setting this\n' - 'appropriately can assist in runtime introspection of ' - 'dynamic class\n' - 'attributes). For callables, it may indicate that an ' - 'instance of the\n' - 'given type (or a subclass) is expected or required as ' - 'the first\n' - 'positional argument (for example, CPython sets this ' - 'attribute for\n' - 'unbound methods that are implemented in C).\n' - '\n' - '\n' - 'Invoking Descriptors\n' - '====================\n' - '\n' - 'In general, a descriptor is an object attribute with ' - '"binding\n' - 'behavior", one whose attribute access has been ' - 'overridden by methods\n' - 'in the descriptor protocol: "__get__()", "__set__()", ' - 'and\n' - '"__delete__()". If any of those methods are defined ' - 'for an object, it\n' - 'is said to be a descriptor.\n' - '\n' - 'The default behavior for attribute access is to get, ' - 'set, or delete\n' - "the attribute from an object's dictionary. For " - 'instance, "a.x" has a\n' - 'lookup chain starting with "a.__dict__[\'x\']", then\n' - '"type(a).__dict__[\'x\']", and continuing through the ' - 'base classes of\n' - '"type(a)" excluding metaclasses.\n' - '\n' - 'However, if the looked-up value is an object defining ' - 'one of the\n' - 'descriptor methods, then Python may override the ' - 'default behavior and\n' - 'invoke the descriptor method instead. Where this ' - 'occurs in the\n' - 'precedence chain depends on which descriptor methods ' - 'were defined and\n' - 'how they were called.\n' - '\n' - 'The starting point for descriptor invocation is a ' - 'binding, "a.x". How\n' - 'the arguments are assembled depends on "a":\n' - '\n' - 'Direct Call\n' - ' The simplest and least common call is when user ' - 'code directly\n' - ' invokes a descriptor method: "x.__get__(a)".\n' - '\n' - 'Instance Binding\n' - ' If binding to an object instance, "a.x" is ' - 'transformed into the\n' - ' call: "type(a).__dict__[\'x\'].__get__(a, ' - 'type(a))".\n' - '\n' - 'Class Binding\n' - ' If binding to a class, "A.x" is transformed into ' - 'the call:\n' - ' "A.__dict__[\'x\'].__get__(None, A)".\n' - '\n' - 'Super Binding\n' - ' If "a" is an instance of "super", then the binding ' - '"super(B,\n' - ' obj).m()" searches "obj.__class__.__mro__" for the ' - 'base class "A"\n' - ' immediately preceding "B" and then invokes the ' - 'descriptor with the\n' - ' call: "A.__dict__[\'m\'].__get__(obj, ' - 'obj.__class__)".\n' - '\n' - 'For instance bindings, the precedence of descriptor ' - 'invocation depends\n' - 'on the which descriptor methods are defined. A ' - 'descriptor can define\n' - 'any combination of "__get__()", "__set__()" and ' - '"__delete__()". If it\n' - 'does not define "__get__()", then accessing the ' - 'attribute will return\n' - 'the descriptor object itself unless there is a value ' - "in the object's\n" - 'instance dictionary. If the descriptor defines ' - '"__set__()" and/or\n' - '"__delete__()", it is a data descriptor; if it defines ' - 'neither, it is\n' - 'a non-data descriptor. Normally, data descriptors ' - 'define both\n' - '"__get__()" and "__set__()", while non-data ' - 'descriptors have just the\n' - '"__get__()" method. Data descriptors with "__set__()" ' - 'and "__get__()"\n' - 'defined always override a redefinition in an instance ' - 'dictionary. In\n' - 'contrast, non-data descriptors can be overridden by ' - 'instances.\n' - '\n' - 'Python methods (including "staticmethod()" and ' - '"classmethod()") are\n' - 'implemented as non-data descriptors. Accordingly, ' - 'instances can\n' - 'redefine and override methods. This allows individual ' - 'instances to\n' - 'acquire behaviors that differ from other instances of ' - 'the same class.\n' - '\n' - 'The "property()" function is implemented as a data ' - 'descriptor.\n' - 'Accordingly, instances cannot override the behavior of ' - 'a property.\n' - '\n' - '\n' - '__slots__\n' - '=========\n' - '\n' - 'By default, instances of classes have a dictionary for ' - 'attribute\n' - 'storage. This wastes space for objects having very ' - 'few instance\n' - 'variables. The space consumption can become acute ' - 'when creating large\n' - 'numbers of instances.\n' - '\n' - 'The default can be overridden by defining *__slots__* ' - 'in a class\n' - 'definition. The *__slots__* declaration takes a ' - 'sequence of instance\n' - 'variables and reserves just enough space in each ' - 'instance to hold a\n' - 'value for each variable. Space is saved because ' - '*__dict__* is not\n' - 'created for each instance.\n' - '\n' - 'object.__slots__\n' - '\n' - ' This class variable can be assigned a string, ' - 'iterable, or sequence\n' - ' of strings with variable names used by instances. ' - '*__slots__*\n' - ' reserves space for the declared variables and ' - 'prevents the\n' - ' automatic creation of *__dict__* and *__weakref__* ' - 'for each\n' - ' instance.\n' - '\n' - '\n' - 'Notes on using *__slots__*\n' - '--------------------------\n' - '\n' - '* When inheriting from a class without *__slots__*, ' - 'the *__dict__*\n' - ' attribute of that class will always be accessible, ' - 'so a *__slots__*\n' - ' definition in the subclass is meaningless.\n' - '\n' - '* Without a *__dict__* variable, instances cannot be ' - 'assigned new\n' - ' variables not listed in the *__slots__* definition. ' - 'Attempts to\n' - ' assign to an unlisted variable name raises ' - '"AttributeError". If\n' - ' dynamic assignment of new variables is desired, then ' - 'add\n' - ' "\'__dict__\'" to the sequence of strings in the ' - '*__slots__*\n' - ' declaration.\n' - '\n' - '* Without a *__weakref__* variable for each instance, ' - 'classes\n' - ' defining *__slots__* do not support weak references ' - 'to its\n' - ' instances. If weak reference support is needed, then ' - 'add\n' - ' "\'__weakref__\'" to the sequence of strings in the ' - '*__slots__*\n' - ' declaration.\n' - '\n' - '* *__slots__* are implemented at the class level by ' - 'creating\n' - ' descriptors (*Implementing Descriptors*) for each ' - 'variable name. As\n' - ' a result, class attributes cannot be used to set ' - 'default values for\n' - ' instance variables defined by *__slots__*; ' - 'otherwise, the class\n' - ' attribute would overwrite the descriptor ' - 'assignment.\n' - '\n' - '* The action of a *__slots__* declaration is limited ' - 'to the class\n' - ' where it is defined. As a result, subclasses will ' - 'have a *__dict__*\n' - ' unless they also define *__slots__* (which must only ' - 'contain names\n' - ' of any *additional* slots).\n' - '\n' - '* If a class defines a slot also defined in a base ' - 'class, the\n' - ' instance variable defined by the base class slot is ' - 'inaccessible\n' - ' (except by retrieving its descriptor directly from ' - 'the base class).\n' - ' This renders the meaning of the program undefined. ' - 'In the future, a\n' - ' check may be added to prevent this.\n' - '\n' - '* Nonempty *__slots__* does not work for classes ' - 'derived from\n' - ' "variable-length" built-in types such as "int", ' - '"bytes" and "tuple".\n' - '\n' - '* Any non-string iterable may be assigned to ' - '*__slots__*. Mappings\n' - ' may also be used; however, in the future, special ' - 'meaning may be\n' - ' assigned to the values corresponding to each key.\n' - '\n' - '* *__class__* assignment works only if both classes ' - 'have the same\n' - ' *__slots__*.\n', - 'attribute-references': '\n' - 'Attribute references\n' - '********************\n' - '\n' - 'An attribute reference is a primary followed by a ' - 'period and a name:\n' - '\n' - ' attributeref ::= primary "." identifier\n' - '\n' - 'The primary must evaluate to an object of a type ' - 'that supports\n' - 'attribute references, which most objects do. This ' - 'object is then\n' - 'asked to produce the attribute whose name is the ' - 'identifier. This\n' - 'production can be customized by overriding the ' - '"__getattr__()" method.\n' - 'If this attribute is not available, the exception ' - '"AttributeError" is\n' - 'raised. Otherwise, the type and value of the ' - 'object produced is\n' - 'determined by the object. Multiple evaluations of ' - 'the same attribute\n' - 'reference may yield different objects.\n', - 'augassign': '\n' - 'Augmented assignment statements\n' - '*******************************\n' - '\n' - 'Augmented assignment is the combination, in a single ' - 'statement, of a\n' - 'binary operation and an assignment statement:\n' - '\n' - ' augmented_assignment_stmt ::= augtarget augop ' - '(expression_list | yield_expression)\n' - ' augtarget ::= identifier | attributeref | ' - 'subscription | slicing\n' - ' augop ::= "+=" | "-=" | "*=" | "@=" | ' - '"/=" | "//=" | "%=" | "**="\n' - ' | ">>=" | "<<=" | "&=" | "^=" | "|="\n' - '\n' - '(See section *Primaries* for the syntax definitions of the ' - 'last three\n' - 'symbols.)\n' - '\n' - 'An augmented assignment evaluates the target (which, unlike ' - 'normal\n' - 'assignment statements, cannot be an unpacking) and the ' - 'expression\n' - 'list, performs the binary operation specific to the type of ' - 'assignment\n' - 'on the two operands, and assigns the result to the original ' - 'target.\n' - 'The target is only evaluated once.\n' - '\n' - 'An augmented assignment expression like "x += 1" can be ' - 'rewritten as\n' - '"x = x + 1" to achieve a similar, but not exactly equal ' - 'effect. In the\n' - 'augmented version, "x" is only evaluated once. Also, when ' - 'possible,\n' - 'the actual operation is performed *in-place*, meaning that ' - 'rather than\n' - 'creating a new object and assigning that to the target, the ' - 'old object\n' - 'is modified instead.\n' - '\n' - 'Unlike normal assignments, augmented assignments evaluate the ' - 'left-\n' - 'hand side *before* evaluating the right-hand side. For ' - 'example, "a[i]\n' - '+= f(x)" first looks-up "a[i]", then it evaluates "f(x)" and ' - 'performs\n' - 'the addition, and lastly, it writes the result back to ' - '"a[i]".\n' - '\n' - 'With the exception of assigning to tuples and multiple ' - 'targets in a\n' - 'single statement, the assignment done by augmented ' - 'assignment\n' - 'statements is handled the same way as normal assignments. ' - 'Similarly,\n' - 'with the exception of the possible *in-place* behavior, the ' - 'binary\n' - 'operation performed by augmented assignment is the same as ' - 'the normal\n' - 'binary operations.\n' - '\n' - 'For targets which are attribute references, the same *caveat ' - 'about\n' - 'class and instance attributes* applies as for regular ' - 'assignments.\n', - 'binary': '\n' - 'Binary arithmetic operations\n' - '****************************\n' - '\n' - 'The binary arithmetic operations have the conventional priority\n' - 'levels. Note that some of these operations also apply to ' - 'certain non-\n' - 'numeric types. Apart from the power operator, there are only ' - 'two\n' - 'levels, one for multiplicative operators and one for additive\n' - 'operators:\n' - '\n' - ' m_expr ::= u_expr | m_expr "*" u_expr | m_expr "@" m_expr |\n' - ' m_expr "//" u_expr| m_expr "/" u_expr |\n' - ' m_expr "%" u_expr\n' - ' a_expr ::= m_expr | a_expr "+" m_expr | a_expr "-" m_expr\n' - '\n' - 'The "*" (multiplication) operator yields the product of its ' - 'arguments.\n' - 'The arguments must either both be numbers, or one argument must ' - 'be an\n' - 'integer and the other must be a sequence. In the former case, ' - 'the\n' - 'numbers are converted to a common type and then multiplied ' - 'together.\n' - 'In the latter case, sequence repetition is performed; a ' - 'negative\n' - 'repetition factor yields an empty sequence.\n' - '\n' - 'The "@" (at) operator is intended to be used for matrix\n' - 'multiplication. No builtin Python types implement this ' - 'operator.\n' - '\n' - 'New in version 3.5.\n' - '\n' - 'The "/" (division) and "//" (floor division) operators yield ' - 'the\n' - 'quotient of their arguments. The numeric arguments are first\n' - 'converted to a common type. Division of integers yields a float, ' - 'while\n' - 'floor division of integers results in an integer; the result is ' - 'that\n' - "of mathematical division with the 'floor' function applied to " - 'the\n' - 'result. Division by zero raises the "ZeroDivisionError" ' - 'exception.\n' - '\n' - 'The "%" (modulo) operator yields the remainder from the division ' - 'of\n' - 'the first argument by the second. The numeric arguments are ' - 'first\n' - 'converted to a common type. A zero right argument raises the\n' - '"ZeroDivisionError" exception. The arguments may be floating ' - 'point\n' - 'numbers, e.g., "3.14%0.7" equals "0.34" (since "3.14" equals ' - '"4*0.7 +\n' - '0.34".) The modulo operator always yields a result with the ' - 'same sign\n' - 'as its second operand (or zero); the absolute value of the ' - 'result is\n' - 'strictly smaller than the absolute value of the second operand ' - '[1].\n' - '\n' - 'The floor division and modulo operators are connected by the ' - 'following\n' - 'identity: "x == (x//y)*y + (x%y)". Floor division and modulo ' - 'are also\n' - 'connected with the built-in function "divmod()": "divmod(x, y) ' - '==\n' - '(x//y, x%y)". [2].\n' - '\n' - 'In addition to performing the modulo operation on numbers, the ' - '"%"\n' - 'operator is also overloaded by string objects to perform ' - 'old-style\n' - 'string formatting (also known as interpolation). The syntax ' - 'for\n' - 'string formatting is described in the Python Library Reference,\n' - 'section *printf-style String Formatting*.\n' - '\n' - 'The floor division operator, the modulo operator, and the ' - '"divmod()"\n' - 'function are not defined for complex numbers. Instead, convert ' - 'to a\n' - 'floating point number using the "abs()" function if ' - 'appropriate.\n' - '\n' - 'The "+" (addition) operator yields the sum of its arguments. ' - 'The\n' - 'arguments must either both be numbers or both be sequences of ' - 'the same\n' - 'type. In the former case, the numbers are converted to a common ' - 'type\n' - 'and then added together. In the latter case, the sequences are\n' - 'concatenated.\n' - '\n' - 'The "-" (subtraction) operator yields the difference of its ' - 'arguments.\n' - 'The numeric arguments are first converted to a common type.\n', - 'bitwise': '\n' - 'Binary bitwise operations\n' - '*************************\n' - '\n' - 'Each of the three bitwise operations has a different priority ' - 'level:\n' - '\n' - ' and_expr ::= shift_expr | and_expr "&" shift_expr\n' - ' xor_expr ::= and_expr | xor_expr "^" and_expr\n' - ' or_expr ::= xor_expr | or_expr "|" xor_expr\n' - '\n' - 'The "&" operator yields the bitwise AND of its arguments, which ' - 'must\n' - 'be integers.\n' - '\n' - 'The "^" operator yields the bitwise XOR (exclusive OR) of its\n' - 'arguments, which must be integers.\n' - '\n' - 'The "|" operator yields the bitwise (inclusive) OR of its ' - 'arguments,\n' - 'which must be integers.\n', - 'bltin-code-objects': '\n' - 'Code Objects\n' - '************\n' - '\n' - 'Code objects are used by the implementation to ' - 'represent "pseudo-\n' - 'compiled" executable Python code such as a function ' - 'body. They differ\n' - "from function objects because they don't contain a " - 'reference to their\n' - 'global execution environment. Code objects are ' - 'returned by the built-\n' - 'in "compile()" function and can be extracted from ' - 'function objects\n' - 'through their "__code__" attribute. See also the ' - '"code" module.\n' - '\n' - 'A code object can be executed or evaluated by ' - 'passing it (instead of a\n' - 'source string) to the "exec()" or "eval()" built-in ' - 'functions.\n' - '\n' - 'See *The standard type hierarchy* for more ' - 'information.\n', - 'bltin-ellipsis-object': '\n' - 'The Ellipsis Object\n' - '*******************\n' - '\n' - 'This object is commonly used by slicing (see ' - '*Slicings*). It supports\n' - 'no special operations. There is exactly one ' - 'ellipsis object, named\n' - '"Ellipsis" (a built-in name). "type(Ellipsis)()" ' - 'produces the\n' - '"Ellipsis" singleton.\n' - '\n' - 'It is written as "Ellipsis" or "...".\n', - 'bltin-null-object': '\n' - 'The Null Object\n' - '***************\n' - '\n' - "This object is returned by functions that don't " - 'explicitly return a\n' - 'value. It supports no special operations. There is ' - 'exactly one null\n' - 'object, named "None" (a built-in name). ' - '"type(None)()" produces the\n' - 'same singleton.\n' - '\n' - 'It is written as "None".\n', - 'bltin-type-objects': '\n' - 'Type Objects\n' - '************\n' - '\n' - 'Type objects represent the various object types. An ' - "object's type is\n" - 'accessed by the built-in function "type()". There ' - 'are no special\n' - 'operations on types. The standard module "types" ' - 'defines names for\n' - 'all standard built-in types.\n' - '\n' - 'Types are written like this: "".\n', - 'booleans': '\n' - 'Boolean operations\n' - '******************\n' - '\n' - ' or_test ::= and_test | or_test "or" and_test\n' - ' and_test ::= not_test | and_test "and" not_test\n' - ' not_test ::= comparison | "not" not_test\n' - '\n' - 'In the context of Boolean operations, and also when ' - 'expressions are\n' - 'used by control flow statements, the following values are ' - 'interpreted\n' - 'as false: "False", "None", numeric zero of all types, and ' - 'empty\n' - 'strings and containers (including strings, tuples, lists,\n' - 'dictionaries, sets and frozensets). All other values are ' - 'interpreted\n' - 'as true. User-defined objects can customize their truth value ' - 'by\n' - 'providing a "__bool__()" method.\n' - '\n' - 'The operator "not" yields "True" if its argument is false, ' - '"False"\n' - 'otherwise.\n' - '\n' - 'The expression "x and y" first evaluates *x*; if *x* is false, ' - 'its\n' - 'value is returned; otherwise, *y* is evaluated and the ' - 'resulting value\n' - 'is returned.\n' - '\n' - 'The expression "x or y" first evaluates *x*; if *x* is true, ' - 'its value\n' - 'is returned; otherwise, *y* is evaluated and the resulting ' - 'value is\n' - 'returned.\n' - '\n' - '(Note that neither "and" nor "or" restrict the value and type ' - 'they\n' - 'return to "False" and "True", but rather return the last ' - 'evaluated\n' - 'argument. This is sometimes useful, e.g., if "s" is a string ' - 'that\n' - 'should be replaced by a default value if it is empty, the ' - 'expression\n' - '"s or \'foo\'" yields the desired value. Because "not" has to ' - 'create a\n' - 'new value, it returns a boolean value regardless of the type ' - 'of its\n' - 'argument (for example, "not \'foo\'" produces "False" rather ' - 'than "\'\'".)\n', - 'break': '\n' - 'The "break" statement\n' - '*********************\n' - '\n' - ' break_stmt ::= "break"\n' - '\n' - '"break" may only occur syntactically nested in a "for" or ' - '"while"\n' - 'loop, but not nested in a function or class definition within ' - 'that\n' - 'loop.\n' - '\n' - 'It terminates the nearest enclosing loop, skipping the optional ' - '"else"\n' - 'clause if the loop has one.\n' - '\n' - 'If a "for" loop is terminated by "break", the loop control ' - 'target\n' - 'keeps its current value.\n' - '\n' - 'When "break" passes control out of a "try" statement with a ' - '"finally"\n' - 'clause, that "finally" clause is executed before really leaving ' - 'the\n' - 'loop.\n', - 'callable-types': '\n' - 'Emulating callable objects\n' - '**************************\n' - '\n' - 'object.__call__(self[, args...])\n' - '\n' - ' Called when the instance is "called" as a function; ' - 'if this method\n' - ' is defined, "x(arg1, arg2, ...)" is a shorthand for\n' - ' "x.__call__(arg1, arg2, ...)".\n', - 'calls': '\n' - 'Calls\n' - '*****\n' - '\n' - 'A call calls a callable object (e.g., a *function*) with a ' - 'possibly\n' - 'empty series of *arguments*:\n' - '\n' - ' call ::= primary "(" [argument_list [","] | ' - 'comprehension] ")"\n' - ' argument_list ::= positional_arguments ["," ' - 'starred_and_keywords]\n' - ' ["," keywords_arguments]\n' - ' | starred_and_keywords ["," ' - 'keywords_arguments]\n' - ' | keywords_arguments\n' - ' positional_arguments ::= ["*"] expression ("," ["*"] ' - 'expression)*\n' - ' starred_and_keywords ::= ("*" expression | keyword_item)\n' - ' ("," "*" expression | "," ' - 'keyword_item)*\n' - ' keywords_arguments ::= (keyword_item | "**" expression)\n' - ' ("," keyword_item | "," "**" ' - 'expression)*\n' - ' keyword_item ::= identifier "=" expression\n' - '\n' - 'An optional trailing comma may be present after the positional ' - 'and\n' - 'keyword arguments but does not affect the semantics.\n' - '\n' - 'The primary must evaluate to a callable object (user-defined\n' - 'functions, built-in functions, methods of built-in objects, ' - 'class\n' - 'objects, methods of class instances, and all objects having a\n' - '"__call__()" method are callable). All argument expressions are\n' - 'evaluated before the call is attempted. Please refer to section\n' - '*Function definitions* for the syntax of formal *parameter* ' - 'lists.\n' - '\n' - 'If keyword arguments are present, they are first converted to\n' - 'positional arguments, as follows. First, a list of unfilled ' - 'slots is\n' - 'created for the formal parameters. If there are N positional\n' - 'arguments, they are placed in the first N slots. Next, for each\n' - 'keyword argument, the identifier is used to determine the\n' - 'corresponding slot (if the identifier is the same as the first ' - 'formal\n' - 'parameter name, the first slot is used, and so on). If the slot ' - 'is\n' - 'already filled, a "TypeError" exception is raised. Otherwise, ' - 'the\n' - 'value of the argument is placed in the slot, filling it (even if ' - 'the\n' - 'expression is "None", it fills the slot). When all arguments ' - 'have\n' - 'been processed, the slots that are still unfilled are filled with ' - 'the\n' - 'corresponding default value from the function definition. ' - '(Default\n' - 'values are calculated, once, when the function is defined; thus, ' - 'a\n' - 'mutable object such as a list or dictionary used as default value ' - 'will\n' - "be shared by all calls that don't specify an argument value for " - 'the\n' - 'corresponding slot; this should usually be avoided.) If there ' - 'are any\n' - 'unfilled slots for which no default value is specified, a ' - '"TypeError"\n' - 'exception is raised. Otherwise, the list of filled slots is used ' - 'as\n' - 'the argument list for the call.\n' - '\n' - '**CPython implementation detail:** An implementation may provide\n' - 'built-in functions whose positional parameters do not have names, ' - 'even\n' - "if they are 'named' for the purpose of documentation, and which\n" - 'therefore cannot be supplied by keyword. In CPython, this is the ' - 'case\n' - 'for functions implemented in C that use "PyArg_ParseTuple()" to ' - 'parse\n' - 'their arguments.\n' - '\n' - 'If there are more positional arguments than there are formal ' - 'parameter\n' - 'slots, a "TypeError" exception is raised, unless a formal ' - 'parameter\n' - 'using the syntax "*identifier" is present; in this case, that ' - 'formal\n' - 'parameter receives a tuple containing the excess positional ' - 'arguments\n' - '(or an empty tuple if there were no excess positional ' - 'arguments).\n' - '\n' - 'If any keyword argument does not correspond to a formal ' - 'parameter\n' - 'name, a "TypeError" exception is raised, unless a formal ' - 'parameter\n' - 'using the syntax "**identifier" is present; in this case, that ' - 'formal\n' - 'parameter receives a dictionary containing the excess keyword\n' - 'arguments (using the keywords as keys and the argument values as\n' - 'corresponding values), or a (new) empty dictionary if there were ' - 'no\n' - 'excess keyword arguments.\n' - '\n' - 'If the syntax "*expression" appears in the function call, ' - '"expression"\n' - 'must evaluate to an *iterable*. Elements from these iterables ' - 'are\n' - 'treated as if they were additional positional arguments. For the ' - 'call\n' - '"f(x1, x2, *y, x3, x4)", if *y* evaluates to a sequence *y1*, ' - '...,\n' - '*yM*, this is equivalent to a call with M+4 positional arguments ' - '*x1*,\n' - '*x2*, *y1*, ..., *yM*, *x3*, *x4*.\n' - '\n' - 'A consequence of this is that although the "*expression" syntax ' - 'may\n' - 'appear *after* explicit keyword arguments, it is processed ' - '*before*\n' - 'the keyword arguments (and any "**expression" arguments -- see ' - 'below).\n' - 'So:\n' - '\n' - ' >>> def f(a, b):\n' - ' ... print(a, b)\n' - ' ...\n' - ' >>> f(b=1, *(2,))\n' - ' 2 1\n' - ' >>> f(a=1, *(2,))\n' - ' Traceback (most recent call last):\n' - ' File "", line 1, in \n' - " TypeError: f() got multiple values for keyword argument 'a'\n" - ' >>> f(1, *(2,))\n' - ' 1 2\n' - '\n' - 'It is unusual for both keyword arguments and the "*expression" ' - 'syntax\n' - 'to be used in the same call, so in practice this confusion does ' - 'not\n' - 'arise.\n' - '\n' - 'If the syntax "**expression" appears in the function call,\n' - '"expression" must evaluate to a *mapping*, the contents of which ' - 'are\n' - 'treated as additional keyword arguments. If a keyword is ' - 'already\n' - 'present (as an explicit keyword argument, or from another ' - 'unpacking),\n' - 'a "TypeError" exception is raised.\n' - '\n' - 'Formal parameters using the syntax "*identifier" or ' - '"**identifier"\n' - 'cannot be used as positional argument slots or as keyword ' - 'argument\n' - 'names.\n' - '\n' - 'Changed in version 3.5: Function calls accept any number of "*" ' - 'and\n' - '"**" unpackings, positional arguments may follow iterable ' - 'unpackings\n' - '("*"), and keyword arguments may follow dictionary unpackings ' - '("**").\n' - 'Originally proposed by **PEP 448**.\n' - '\n' - 'A call always returns some value, possibly "None", unless it ' - 'raises an\n' - 'exception. How this value is computed depends on the type of ' - 'the\n' - 'callable object.\n' - '\n' - 'If it is---\n' - '\n' - 'a user-defined function:\n' - ' The code block for the function is executed, passing it the\n' - ' argument list. The first thing the code block will do is bind ' - 'the\n' - ' formal parameters to the arguments; this is described in ' - 'section\n' - ' *Function definitions*. When the code block executes a ' - '"return"\n' - ' statement, this specifies the return value of the function ' - 'call.\n' - '\n' - 'a built-in function or method:\n' - ' The result is up to the interpreter; see *Built-in Functions* ' - 'for\n' - ' the descriptions of built-in functions and methods.\n' - '\n' - 'a class object:\n' - ' A new instance of that class is returned.\n' - '\n' - 'a class instance method:\n' - ' The corresponding user-defined function is called, with an ' - 'argument\n' - ' list that is one longer than the argument list of the call: ' - 'the\n' - ' instance becomes the first argument.\n' - '\n' - 'a class instance:\n' - ' The class must define a "__call__()" method; the effect is ' - 'then the\n' - ' same as if that method was called.\n', - 'class': '\n' - 'Class definitions\n' - '*****************\n' - '\n' - 'A class definition defines a class object (see section *The ' - 'standard\n' - 'type hierarchy*):\n' - '\n' - ' classdef ::= [decorators] "class" classname [inheritance] ' - '":" suite\n' - ' inheritance ::= "(" [argument_list] ")"\n' - ' classname ::= identifier\n' - '\n' - 'A class definition is an executable statement. The inheritance ' - 'list\n' - 'usually gives a list of base classes (see *Customizing class ' - 'creation*\n' - 'for more advanced uses), so each item in the list should evaluate ' - 'to a\n' - 'class object which allows subclassing. Classes without an ' - 'inheritance\n' - 'list inherit, by default, from the base class "object"; hence,\n' - '\n' - ' class Foo:\n' - ' pass\n' - '\n' - 'is equivalent to\n' - '\n' - ' class Foo(object):\n' - ' pass\n' - '\n' - "The class's suite is then executed in a new execution frame (see\n" - '*Naming and binding*), using a newly created local namespace and ' - 'the\n' - 'original global namespace. (Usually, the suite contains mostly\n' - "function definitions.) When the class's suite finishes " - 'execution, its\n' - 'execution frame is discarded but its local namespace is saved. ' - '[4] A\n' - 'class object is then created using the inheritance list for the ' - 'base\n' - 'classes and the saved local namespace for the attribute ' - 'dictionary.\n' - 'The class name is bound to this class object in the original ' - 'local\n' - 'namespace.\n' - '\n' - 'Class creation can be customized heavily using *metaclasses*.\n' - '\n' - 'Classes can also be decorated: just like when decorating ' - 'functions,\n' - '\n' - ' @f1(arg)\n' - ' @f2\n' - ' class Foo: pass\n' - '\n' - 'is roughly equivalent to\n' - '\n' - ' class Foo: pass\n' - ' Foo = f1(arg)(f2(Foo))\n' - '\n' - 'The evaluation rules for the decorator expressions are the same ' - 'as for\n' - 'function decorators. The result is then bound to the class ' - 'name.\n' - '\n' - "**Programmer's note:** Variables defined in the class definition " - 'are\n' - 'class attributes; they are shared by instances. Instance ' - 'attributes\n' - 'can be set in a method with "self.name = value". Both class and\n' - 'instance attributes are accessible through the notation ' - '""self.name"",\n' - 'and an instance attribute hides a class attribute with the same ' - 'name\n' - 'when accessed in this way. Class attributes can be used as ' - 'defaults\n' - 'for instance attributes, but using mutable values there can lead ' - 'to\n' - 'unexpected results. *Descriptors* can be used to create ' - 'instance\n' - 'variables with different implementation details.\n' - '\n' - 'See also: **PEP 3115** - Metaclasses in Python 3 **PEP 3129** -\n' - ' Class Decorators\n', - 'comparisons': '\n' - 'Comparisons\n' - '***********\n' - '\n' - 'Unlike C, all comparison operations in Python have the same ' - 'priority,\n' - 'which is lower than that of any arithmetic, shifting or ' - 'bitwise\n' - 'operation. Also unlike C, expressions like "a < b < c" ' - 'have the\n' - 'interpretation that is conventional in mathematics:\n' - '\n' - ' comparison ::= or_expr ( comp_operator or_expr )*\n' - ' comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "!="\n' - ' | "is" ["not"] | ["not"] "in"\n' - '\n' - 'Comparisons yield boolean values: "True" or "False".\n' - '\n' - 'Comparisons can be chained arbitrarily, e.g., "x < y <= z" ' - 'is\n' - 'equivalent to "x < y and y <= z", except that "y" is ' - 'evaluated only\n' - 'once (but in both cases "z" is not evaluated at all when "x ' - '< y" is\n' - 'found to be false).\n' - '\n' - 'Formally, if *a*, *b*, *c*, ..., *y*, *z* are expressions ' - 'and *op1*,\n' - '*op2*, ..., *opN* are comparison operators, then "a op1 b ' - 'op2 c ... y\n' - 'opN z" is equivalent to "a op1 b and b op2 c and ... y opN ' - 'z", except\n' - 'that each expression is evaluated at most once.\n' - '\n' - 'Note that "a op1 b op2 c" doesn\'t imply any kind of ' - 'comparison between\n' - '*a* and *c*, so that, e.g., "x < y > z" is perfectly legal ' - '(though\n' - 'perhaps not pretty).\n' - '\n' - '\n' - 'Value comparisons\n' - '=================\n' - '\n' - 'The operators "<", ">", "==", ">=", "<=", and "!=" compare ' - 'the values\n' - 'of two objects. The objects do not need to have the same ' - 'type.\n' - '\n' - 'Chapter *Objects, values and types* states that objects ' - 'have a value\n' - '(in addition to type and identity). The value of an object ' - 'is a\n' - 'rather abstract notion in Python: For example, there is no ' - 'canonical\n' - "access method for an object's value. Also, there is no " - 'requirement\n' - 'that the value of an object should be constructed in a ' - 'particular way,\n' - 'e.g. comprised of all its data attributes. Comparison ' - 'operators\n' - 'implement a particular notion of what the value of an ' - 'object is. One\n' - 'can think of them as defining the value of an object ' - 'indirectly, by\n' - 'means of their comparison implementation.\n' - '\n' - 'Because all types are (direct or indirect) subtypes of ' - '"object", they\n' - 'inherit the default comparison behavior from "object". ' - 'Types can\n' - 'customize their comparison behavior by implementing *rich ' - 'comparison\n' - 'methods* like "__lt__()", described in *Basic ' - 'customization*.\n' - '\n' - 'The default behavior for equality comparison ("==" and ' - '"!=") is based\n' - 'on the identity of the objects. Hence, equality comparison ' - 'of\n' - 'instances with the same identity results in equality, and ' - 'equality\n' - 'comparison of instances with different identities results ' - 'in\n' - 'inequality. A motivation for this default behavior is the ' - 'desire that\n' - 'all objects should be reflexive (i.e. "x is y" implies "x ' - '== y").\n' - '\n' - 'A default order comparison ("<", ">", "<=", and ">=") is ' - 'not provided;\n' - 'an attempt raises "TypeError". A motivation for this ' - 'default behavior\n' - 'is the lack of a similar invariant as for equality.\n' - '\n' - 'The behavior of the default equality comparison, that ' - 'instances with\n' - 'different identities are always unequal, may be in contrast ' - 'to what\n' - 'types will need that have a sensible definition of object ' - 'value and\n' - 'value-based equality. Such types will need to customize ' - 'their\n' - 'comparison behavior, and in fact, a number of built-in ' - 'types have done\n' - 'that.\n' - '\n' - 'The following list describes the comparison behavior of the ' - 'most\n' - 'important built-in types.\n' - '\n' - '* Numbers of built-in numeric types (*Numeric Types --- ' - 'int, float,\n' - ' complex*) and of the standard library types ' - '"fractions.Fraction" and\n' - ' "decimal.Decimal" can be compared within and across their ' - 'types,\n' - ' with the restriction that complex numbers do not support ' - 'order\n' - ' comparison. Within the limits of the types involved, ' - 'they compare\n' - ' mathematically (algorithmically) correct without loss of ' - 'precision.\n' - '\n' - ' The not-a-number values "float(\'NaN\')" and ' - '"Decimal(\'NaN\')" are\n' - ' special. They are identical to themselves ("x is x" is ' - 'true) but\n' - ' are not equal to themselves ("x == x" is false). ' - 'Additionally,\n' - ' comparing any number to a not-a-number value will return ' - '"False".\n' - ' For example, both "3 < float(\'NaN\')" and ' - '"float(\'NaN\') < 3" will\n' - ' return "False".\n' - '\n' - '* Binary sequences (instances of "bytes" or "bytearray") ' - 'can be\n' - ' compared within and across their types. They compare\n' - ' lexicographically using the numeric values of their ' - 'elements.\n' - '\n' - '* Strings (instances of "str") compare lexicographically ' - 'using the\n' - ' numerical Unicode code points (the result of the built-in ' - 'function\n' - ' "ord()") of their characters. [3]\n' - '\n' - ' Strings and binary sequences cannot be directly ' - 'compared.\n' - '\n' - '* Sequences (instances of "tuple", "list", or "range") can ' - 'be\n' - ' compared only within each of their types, with the ' - 'restriction that\n' - ' ranges do not support order comparison. Equality ' - 'comparison across\n' - ' these types results in unequality, and ordering ' - 'comparison across\n' - ' these types raises "TypeError".\n' - '\n' - ' Sequences compare lexicographically using comparison of\n' - ' corresponding elements, whereby reflexivity of the ' - 'elements is\n' - ' enforced.\n' - '\n' - ' In enforcing reflexivity of elements, the comparison of ' - 'collections\n' - ' assumes that for a collection element "x", "x == x" is ' - 'always true.\n' - ' Based on that assumption, element identity is compared ' - 'first, and\n' - ' element comparison is performed only for distinct ' - 'elements. This\n' - ' approach yields the same result as a strict element ' - 'comparison\n' - ' would, if the compared elements are reflexive. For ' - 'non-reflexive\n' - ' elements, the result is different than for strict ' - 'element\n' - ' comparison, and may be surprising: The non-reflexive ' - 'not-a-number\n' - ' values for example result in the following comparison ' - 'behavior when\n' - ' used in a list:\n' - '\n' - " >>> nan = float('NaN')\n" - ' >>> nan is nan\n' - ' True\n' - ' >>> nan == nan\n' - ' False <-- the defined non-reflexive ' - 'behavior of NaN\n' - ' >>> [nan] == [nan]\n' - ' True <-- list enforces reflexivity ' - 'and tests identity first\n' - '\n' - ' Lexicographical comparison between built-in collections ' - 'works as\n' - ' follows:\n' - '\n' - ' * For two collections to compare equal, they must be of ' - 'the same\n' - ' type, have the same length, and each pair of ' - 'corresponding\n' - ' elements must compare equal (for example, "[1,2] == ' - '(1,2)" is\n' - ' false because the type is not the same).\n' - '\n' - ' * Collections that support order comparison are ordered ' - 'the same\n' - ' as their first unequal elements (for example, "[1,2,x] ' - '<= [1,2,y]"\n' - ' has the same value as "x <= y"). If a corresponding ' - 'element does\n' - ' not exist, the shorter collection is ordered first (for ' - 'example,\n' - ' "[1,2] < [1,2,3]" is true).\n' - '\n' - '* Mappings (instances of "dict") compare equal if and only ' - 'if they\n' - ' have equal *(key, value)* pairs. Equality comparison of ' - 'the keys and\n' - ' values enforces reflexivity.\n' - '\n' - ' Order comparisons ("<", ">", "<=", and ">=") raise ' - '"TypeError".\n' - '\n' - '* Sets (instances of "set" or "frozenset") can be compared ' - 'within\n' - ' and across their types.\n' - '\n' - ' They define order comparison operators to mean subset and ' - 'superset\n' - ' tests. Those relations do not define total orderings ' - '(for example,\n' - ' the two sets "{1,2}" and "{2,3}" are not equal, nor ' - 'subsets of one\n' - ' another, nor supersets of one another). Accordingly, ' - 'sets are not\n' - ' appropriate arguments for functions which depend on total ' - 'ordering\n' - ' (for example, "min()", "max()", and "sorted()" produce ' - 'undefined\n' - ' results given a list of sets as inputs).\n' - '\n' - ' Comparison of sets enforces reflexivity of its elements.\n' - '\n' - '* Most other built-in types have no comparison methods ' - 'implemented,\n' - ' so they inherit the default comparison behavior.\n' - '\n' - 'User-defined classes that customize their comparison ' - 'behavior should\n' - 'follow some consistency rules, if possible:\n' - '\n' - '* Equality comparison should be reflexive. In other words, ' - 'identical\n' - ' objects should compare equal:\n' - '\n' - ' "x is y" implies "x == y"\n' - '\n' - '* Comparison should be symmetric. In other words, the ' - 'following\n' - ' expressions should have the same result:\n' - '\n' - ' "x == y" and "y == x"\n' - '\n' - ' "x != y" and "y != x"\n' - '\n' - ' "x < y" and "y > x"\n' - '\n' - ' "x <= y" and "y >= x"\n' - '\n' - '* Comparison should be transitive. The following ' - '(non-exhaustive)\n' - ' examples illustrate that:\n' - '\n' - ' "x > y and y > z" implies "x > z"\n' - '\n' - ' "x < y and y <= z" implies "x < z"\n' - '\n' - '* Inverse comparison should result in the boolean negation. ' - 'In other\n' - ' words, the following expressions should have the same ' - 'result:\n' - '\n' - ' "x == y" and "not x != y"\n' - '\n' - ' "x < y" and "not x >= y" (for total ordering)\n' - '\n' - ' "x > y" and "not x <= y" (for total ordering)\n' - '\n' - ' The last two expressions apply to totally ordered ' - 'collections (e.g.\n' - ' to sequences, but not to sets or mappings). See also the\n' - ' "total_ordering()" decorator.\n' - '\n' - '* The "hash()" result should be consistent with equality. ' - 'Objects\n' - ' that are equal should either have the same hash value, or ' - 'be marked\n' - ' as unhashable.\n' - '\n' - 'Python does not enforce these consistency rules. In fact, ' - 'the\n' - 'not-a-number values are an example for not following these ' - 'rules.\n' - '\n' - '\n' - 'Membership test operations\n' - '==========================\n' - '\n' - 'The operators "in" and "not in" test for membership. "x in ' - 's"\n' - 'evaluates to "True" if *x* is a member of *s*, and "False" ' - 'otherwise.\n' - '"x not in s" returns the negation of "x in s". All ' - 'built-in sequences\n' - 'and set types support this as well as dictionary, for which ' - '"in" tests\n' - 'whether the dictionary has a given key. For container types ' - 'such as\n' - 'list, tuple, set, frozenset, dict, or collections.deque, ' - 'the\n' - 'expression "x in y" is equivalent to "any(x is e or x == e ' - 'for e in\n' - 'y)".\n' - '\n' - 'For the string and bytes types, "x in y" is "True" if and ' - 'only if *x*\n' - 'is a substring of *y*. An equivalent test is "y.find(x) != ' - '-1".\n' - 'Empty strings are always considered to be a substring of ' - 'any other\n' - 'string, so """ in "abc"" will return "True".\n' - '\n' - 'For user-defined classes which define the "__contains__()" ' - 'method, "x\n' - 'in y" returns "True" if "y.__contains__(x)" returns a true ' - 'value, and\n' - '"False" otherwise.\n' - '\n' - 'For user-defined classes which do not define ' - '"__contains__()" but do\n' - 'define "__iter__()", "x in y" is "True" if some value "z" ' - 'with "x ==\n' - 'z" is produced while iterating over "y". If an exception ' - 'is raised\n' - 'during the iteration, it is as if "in" raised that ' - 'exception.\n' - '\n' - 'Lastly, the old-style iteration protocol is tried: if a ' - 'class defines\n' - '"__getitem__()", "x in y" is "True" if and only if there is ' - 'a non-\n' - 'negative integer index *i* such that "x == y[i]", and all ' - 'lower\n' - 'integer indices do not raise "IndexError" exception. (If ' - 'any other\n' - 'exception is raised, it is as if "in" raised that ' - 'exception).\n' - '\n' - 'The operator "not in" is defined to have the inverse true ' - 'value of\n' - '"in".\n' - '\n' - '\n' - 'Identity comparisons\n' - '====================\n' - '\n' - 'The operators "is" and "is not" test for object identity: ' - '"x is y" is\n' - 'true if and only if *x* and *y* are the same object. ' - 'Object identity\n' - 'is determined using the "id()" function. "x is not y" ' - 'yields the\n' - 'inverse truth value. [4]\n', - 'compound': '\n' - 'Compound statements\n' - '*******************\n' - '\n' - 'Compound statements contain (groups of) other statements; they ' - 'affect\n' - 'or control the execution of those other statements in some ' - 'way. In\n' - 'general, compound statements span multiple lines, although in ' - 'simple\n' - 'incarnations a whole compound statement may be contained in ' - 'one line.\n' - '\n' - 'The "if", "while" and "for" statements implement traditional ' - 'control\n' - 'flow constructs. "try" specifies exception handlers and/or ' - 'cleanup\n' - 'code for a group of statements, while the "with" statement ' - 'allows the\n' - 'execution of initialization and finalization code around a ' - 'block of\n' - 'code. Function and class definitions are also syntactically ' - 'compound\n' - 'statements.\n' - '\n' - "A compound statement consists of one or more 'clauses.' A " - 'clause\n' - "consists of a header and a 'suite.' The clause headers of a\n" - 'particular compound statement are all at the same indentation ' - 'level.\n' - 'Each clause header begins with a uniquely identifying keyword ' - 'and ends\n' - 'with a colon. A suite is a group of statements controlled by ' - 'a\n' - 'clause. A suite can be one or more semicolon-separated ' - 'simple\n' - 'statements on the same line as the header, following the ' - "header's\n" - 'colon, or it can be one or more indented statements on ' - 'subsequent\n' - 'lines. Only the latter form of a suite can contain nested ' - 'compound\n' - 'statements; the following is illegal, mostly because it ' - "wouldn't be\n" - 'clear to which "if" clause a following "else" clause would ' - 'belong:\n' - '\n' - ' if test1: if test2: print(x)\n' - '\n' - 'Also note that the semicolon binds tighter than the colon in ' - 'this\n' - 'context, so that in the following example, either all or none ' - 'of the\n' - '"print()" calls are executed:\n' - '\n' - ' if x < y < z: print(x); print(y); print(z)\n' - '\n' - 'Summarizing:\n' - '\n' - ' compound_stmt ::= if_stmt\n' - ' | while_stmt\n' - ' | for_stmt\n' - ' | try_stmt\n' - ' | with_stmt\n' - ' | funcdef\n' - ' | classdef\n' - ' | async_with_stmt\n' - ' | async_for_stmt\n' - ' | async_funcdef\n' - ' suite ::= stmt_list NEWLINE | NEWLINE INDENT ' - 'statement+ DEDENT\n' - ' statement ::= stmt_list NEWLINE | compound_stmt\n' - ' stmt_list ::= simple_stmt (";" simple_stmt)* [";"]\n' - '\n' - 'Note that statements always end in a "NEWLINE" possibly ' - 'followed by a\n' - '"DEDENT". Also note that optional continuation clauses always ' - 'begin\n' - 'with a keyword that cannot start a statement, thus there are ' - 'no\n' - 'ambiguities (the \'dangling "else"\' problem is solved in ' - 'Python by\n' - 'requiring nested "if" statements to be indented).\n' - '\n' - 'The formatting of the grammar rules in the following sections ' - 'places\n' - 'each clause on a separate line for clarity.\n' - '\n' - '\n' - 'The "if" statement\n' - '==================\n' - '\n' - 'The "if" statement is used for conditional execution:\n' - '\n' - ' if_stmt ::= "if" expression ":" suite\n' - ' ( "elif" expression ":" suite )*\n' - ' ["else" ":" suite]\n' - '\n' - 'It selects exactly one of the suites by evaluating the ' - 'expressions one\n' - 'by one until one is found to be true (see section *Boolean ' - 'operations*\n' - 'for the definition of true and false); then that suite is ' - 'executed\n' - '(and no other part of the "if" statement is executed or ' - 'evaluated).\n' - 'If all expressions are false, the suite of the "else" clause, ' - 'if\n' - 'present, is executed.\n' - '\n' - '\n' - 'The "while" statement\n' - '=====================\n' - '\n' - 'The "while" statement is used for repeated execution as long ' - 'as an\n' - 'expression is true:\n' - '\n' - ' while_stmt ::= "while" expression ":" suite\n' - ' ["else" ":" suite]\n' - '\n' - 'This repeatedly tests the expression and, if it is true, ' - 'executes the\n' - 'first suite; if the expression is false (which may be the ' - 'first time\n' - 'it is tested) the suite of the "else" clause, if present, is ' - 'executed\n' - 'and the loop terminates.\n' - '\n' - 'A "break" statement executed in the first suite terminates the ' - 'loop\n' - 'without executing the "else" clause\'s suite. A "continue" ' - 'statement\n' - 'executed in the first suite skips the rest of the suite and ' - 'goes back\n' - 'to testing the expression.\n' - '\n' - '\n' - 'The "for" statement\n' - '===================\n' - '\n' - 'The "for" statement is used to iterate over the elements of a ' - 'sequence\n' - '(such as a string, tuple or list) or other iterable object:\n' - '\n' - ' for_stmt ::= "for" target_list "in" expression_list ":" ' - 'suite\n' - ' ["else" ":" suite]\n' - '\n' - 'The expression list is evaluated once; it should yield an ' - 'iterable\n' - 'object. An iterator is created for the result of the\n' - '"expression_list". The suite is then executed once for each ' - 'item\n' - 'provided by the iterator, in the order returned by the ' - 'iterator. Each\n' - 'item in turn is assigned to the target list using the standard ' - 'rules\n' - 'for assignments (see *Assignment statements*), and then the ' - 'suite is\n' - 'executed. When the items are exhausted (which is immediately ' - 'when the\n' - 'sequence is empty or an iterator raises a "StopIteration" ' - 'exception),\n' - 'the suite in the "else" clause, if present, is executed, and ' - 'the loop\n' - 'terminates.\n' - '\n' - 'A "break" statement executed in the first suite terminates the ' - 'loop\n' - 'without executing the "else" clause\'s suite. A "continue" ' - 'statement\n' - 'executed in the first suite skips the rest of the suite and ' - 'continues\n' - 'with the next item, or with the "else" clause if there is no ' - 'next\n' - 'item.\n' - '\n' - 'The for-loop makes assignments to the variables(s) in the ' - 'target list.\n' - 'This overwrites all previous assignments to those variables ' - 'including\n' - 'those made in the suite of the for-loop:\n' - '\n' - ' for i in range(10):\n' - ' print(i)\n' - ' i = 5 # this will not affect the for-loop\n' - ' # because i will be overwritten with ' - 'the next\n' - ' # index in the range\n' - '\n' - 'Names in the target list are not deleted when the loop is ' - 'finished,\n' - 'but if the sequence is empty, they will not have been assigned ' - 'to at\n' - 'all by the loop. Hint: the built-in function "range()" ' - 'returns an\n' - 'iterator of integers suitable to emulate the effect of ' - 'Pascal\'s "for i\n' - ':= a to b do"; e.g., "list(range(3))" returns the list "[0, 1, ' - '2]".\n' - '\n' - 'Note: There is a subtlety when the sequence is being modified ' - 'by the\n' - ' loop (this can only occur for mutable sequences, i.e. ' - 'lists). An\n' - ' internal counter is used to keep track of which item is used ' - 'next,\n' - ' and this is incremented on each iteration. When this ' - 'counter has\n' - ' reached the length of the sequence the loop terminates. ' - 'This means\n' - ' that if the suite deletes the current (or a previous) item ' - 'from the\n' - ' sequence, the next item will be skipped (since it gets the ' - 'index of\n' - ' the current item which has already been treated). Likewise, ' - 'if the\n' - ' suite inserts an item in the sequence before the current ' - 'item, the\n' - ' current item will be treated again the next time through the ' - 'loop.\n' - ' This can lead to nasty bugs that can be avoided by making a\n' - ' temporary copy using a slice of the whole sequence, e.g.,\n' - '\n' - ' for x in a[:]:\n' - ' if x < 0: a.remove(x)\n' - '\n' - '\n' - 'The "try" statement\n' - '===================\n' - '\n' - 'The "try" statement specifies exception handlers and/or ' - 'cleanup code\n' - 'for a group of statements:\n' - '\n' - ' try_stmt ::= try1_stmt | try2_stmt\n' - ' try1_stmt ::= "try" ":" suite\n' - ' ("except" [expression ["as" identifier]] ":" ' - 'suite)+\n' - ' ["else" ":" suite]\n' - ' ["finally" ":" suite]\n' - ' try2_stmt ::= "try" ":" suite\n' - ' "finally" ":" suite\n' - '\n' - 'The "except" clause(s) specify one or more exception handlers. ' - 'When no\n' - 'exception occurs in the "try" clause, no exception handler is\n' - 'executed. When an exception occurs in the "try" suite, a ' - 'search for an\n' - 'exception handler is started. This search inspects the except ' - 'clauses\n' - 'in turn until one is found that matches the exception. An ' - 'expression-\n' - 'less except clause, if present, must be last; it matches any\n' - 'exception. For an except clause with an expression, that ' - 'expression\n' - 'is evaluated, and the clause matches the exception if the ' - 'resulting\n' - 'object is "compatible" with the exception. An object is ' - 'compatible\n' - 'with an exception if it is the class or a base class of the ' - 'exception\n' - 'object or a tuple containing an item compatible with the ' - 'exception.\n' - '\n' - 'If no except clause matches the exception, the search for an ' - 'exception\n' - 'handler continues in the surrounding code and on the ' - 'invocation stack.\n' - '[1]\n' - '\n' - 'If the evaluation of an expression in the header of an except ' - 'clause\n' - 'raises an exception, the original search for a handler is ' - 'canceled and\n' - 'a search starts for the new exception in the surrounding code ' - 'and on\n' - 'the call stack (it is treated as if the entire "try" statement ' - 'raised\n' - 'the exception).\n' - '\n' - 'When a matching except clause is found, the exception is ' - 'assigned to\n' - 'the target specified after the "as" keyword in that except ' - 'clause, if\n' - "present, and the except clause's suite is executed. All " - 'except\n' - 'clauses must have an executable block. When the end of this ' - 'block is\n' - 'reached, execution continues normally after the entire try ' - 'statement.\n' - '(This means that if two nested handlers exist for the same ' - 'exception,\n' - 'and the exception occurs in the try clause of the inner ' - 'handler, the\n' - 'outer handler will not handle the exception.)\n' - '\n' - 'When an exception has been assigned using "as target", it is ' - 'cleared\n' - 'at the end of the except clause. This is as if\n' - '\n' - ' except E as N:\n' - ' foo\n' - '\n' - 'was translated to\n' - '\n' - ' except E as N:\n' - ' try:\n' - ' foo\n' - ' finally:\n' - ' del N\n' - '\n' - 'This means the exception must be assigned to a different name ' - 'to be\n' - 'able to refer to it after the except clause. Exceptions are ' - 'cleared\n' - 'because with the traceback attached to them, they form a ' - 'reference\n' - 'cycle with the stack frame, keeping all locals in that frame ' - 'alive\n' - 'until the next garbage collection occurs.\n' - '\n' - "Before an except clause's suite is executed, details about " - 'the\n' - 'exception are stored in the "sys" module and can be accessed ' - 'via\n' - '"sys.exc_info()". "sys.exc_info()" returns a 3-tuple ' - 'consisting of the\n' - 'exception class, the exception instance and a traceback object ' - '(see\n' - 'section *The standard type hierarchy*) identifying the point ' - 'in the\n' - 'program where the exception occurred. "sys.exc_info()" values ' - 'are\n' - 'restored to their previous values (before the call) when ' - 'returning\n' - 'from a function that handled an exception.\n' - '\n' - 'The optional "else" clause is executed if and when control ' - 'flows off\n' - 'the end of the "try" clause. [2] Exceptions in the "else" ' - 'clause are\n' - 'not handled by the preceding "except" clauses.\n' - '\n' - 'If "finally" is present, it specifies a \'cleanup\' handler. ' - 'The "try"\n' - 'clause is executed, including any "except" and "else" ' - 'clauses. If an\n' - 'exception occurs in any of the clauses and is not handled, ' - 'the\n' - 'exception is temporarily saved. The "finally" clause is ' - 'executed. If\n' - 'there is a saved exception it is re-raised at the end of the ' - '"finally"\n' - 'clause. If the "finally" clause raises another exception, the ' - 'saved\n' - 'exception is set as the context of the new exception. If the ' - '"finally"\n' - 'clause executes a "return" or "break" statement, the saved ' - 'exception\n' - 'is discarded:\n' - '\n' - ' >>> def f():\n' - ' ... try:\n' - ' ... 1/0\n' - ' ... finally:\n' - ' ... return 42\n' - ' ...\n' - ' >>> f()\n' - ' 42\n' - '\n' - 'The exception information is not available to the program ' - 'during\n' - 'execution of the "finally" clause.\n' - '\n' - 'When a "return", "break" or "continue" statement is executed ' - 'in the\n' - '"try" suite of a "try"..."finally" statement, the "finally" ' - 'clause is\n' - 'also executed \'on the way out.\' A "continue" statement is ' - 'illegal in\n' - 'the "finally" clause. (The reason is a problem with the ' - 'current\n' - 'implementation --- this restriction may be lifted in the ' - 'future).\n' - '\n' - 'The return value of a function is determined by the last ' - '"return"\n' - 'statement executed. Since the "finally" clause always ' - 'executes, a\n' - '"return" statement executed in the "finally" clause will ' - 'always be the\n' - 'last one executed:\n' - '\n' - ' >>> def foo():\n' - ' ... try:\n' - " ... return 'try'\n" - ' ... finally:\n' - " ... return 'finally'\n" - ' ...\n' - ' >>> foo()\n' - " 'finally'\n" - '\n' - 'Additional information on exceptions can be found in section\n' - '*Exceptions*, and information on using the "raise" statement ' - 'to\n' - 'generate exceptions may be found in section *The raise ' - 'statement*.\n' - '\n' - '\n' - 'The "with" statement\n' - '====================\n' - '\n' - 'The "with" statement is used to wrap the execution of a block ' - 'with\n' - 'methods defined by a context manager (see section *With ' - 'Statement\n' - 'Context Managers*). This allows common ' - '"try"..."except"..."finally"\n' - 'usage patterns to be encapsulated for convenient reuse.\n' - '\n' - ' with_stmt ::= "with" with_item ("," with_item)* ":" suite\n' - ' with_item ::= expression ["as" target]\n' - '\n' - 'The execution of the "with" statement with one "item" proceeds ' - 'as\n' - 'follows:\n' - '\n' - '1. The context expression (the expression given in the ' - '"with_item")\n' - ' is evaluated to obtain a context manager.\n' - '\n' - '2. The context manager\'s "__exit__()" is loaded for later ' - 'use.\n' - '\n' - '3. The context manager\'s "__enter__()" method is invoked.\n' - '\n' - '4. 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' - ' method returns without an error, then "__exit__()" will ' - 'always be\n' - ' called. Thus, if an error occurs during the assignment to ' - 'the\n' - ' target list, it will be treated the same as an error ' - 'occurring\n' - ' within the suite would be. See step 6 below.\n' - '\n' - '5. The suite is executed.\n' - '\n' - '6. The context manager\'s "__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' - ' "None" arguments are supplied.\n' - '\n' - ' If the suite was exited due to an exception, and the return ' - 'value\n' - ' from the "__exit__()" method was false, the exception is ' - 'reraised.\n' - ' If the return value was true, the exception is suppressed, ' - 'and\n' - ' execution continues with the statement following the ' - '"with"\n' - ' statement.\n' - '\n' - ' If the suite was exited for any reason other than an ' - 'exception, the\n' - ' return value from "__exit__()" is ignored, and execution ' - 'proceeds\n' - ' at the normal location for the kind of exit that was ' - 'taken.\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' - '\n' - 'is equivalent to\n' - '\n' - ' with A() as a:\n' - ' with B() as b:\n' - ' suite\n' - '\n' - 'Changed in version 3.1: Support for multiple context ' - 'expressions.\n' - '\n' - 'See also: **PEP 343** - The "with" statement\n' - '\n' - ' The specification, background, and examples for the ' - 'Python "with"\n' - ' statement.\n' - '\n' - '\n' - 'Function definitions\n' - '====================\n' - '\n' - 'A function definition defines a user-defined function object ' - '(see\n' - 'section *The standard type hierarchy*):\n' - '\n' - ' funcdef ::= [decorators] "def" funcname "(" ' - '[parameter_list] ")" ["->" expression] ":" suite\n' - ' decorators ::= decorator+\n' - ' decorator ::= "@" dotted_name ["(" [argument_list ' - '[","]] ")"] NEWLINE\n' - ' dotted_name ::= identifier ("." identifier)*\n' - ' parameter_list ::= (defparameter ",")*\n' - ' | "*" [parameter] ("," defparameter)* ' - '["," "**" parameter]\n' - ' | "**" parameter\n' - ' | defparameter [","] )\n' - ' parameter ::= identifier [":" expression]\n' - ' defparameter ::= parameter ["=" expression]\n' - ' funcname ::= identifier\n' - '\n' - 'A function definition is an executable statement. Its ' - 'execution binds\n' - 'the function name in the current local namespace to a function ' - 'object\n' - '(a wrapper around the executable code for the function). ' - 'This\n' - 'function object contains a reference to the current global ' - 'namespace\n' - 'as the global namespace to be used when the function is ' - 'called.\n' - '\n' - 'The function definition does not execute the function body; ' - 'this gets\n' - 'executed only when the function is called. [3]\n' - '\n' - 'A function definition may be wrapped by one or more ' - '*decorator*\n' - 'expressions. Decorator expressions are evaluated when the ' - 'function is\n' - 'defined, in the scope that contains the function definition. ' - 'The\n' - 'result must be a callable, which is invoked with the function ' - 'object\n' - 'as the only argument. The returned value is bound to the ' - 'function name\n' - 'instead of the function object. Multiple decorators are ' - 'applied in\n' - 'nested fashion. For example, the following code\n' - '\n' - ' @f1(arg)\n' - ' @f2\n' - ' def func(): pass\n' - '\n' - 'is roughly equivalent to\n' - '\n' - ' def func(): pass\n' - ' func = f1(arg)(f2(func))\n' - '\n' - 'except that the original function is not temporarily bound to ' - 'the name\n' - '"func".\n' - '\n' - 'When one or more *parameters* have the form *parameter* "="\n' - '*expression*, the function is said to have "default parameter ' - 'values."\n' - 'For a parameter with a default value, the corresponding ' - '*argument* may\n' - "be omitted from a call, in which case the parameter's default " - 'value is\n' - 'substituted. If a parameter has a default value, all ' - 'following\n' - 'parameters up until the ""*"" must also have a default value ' - '--- this\n' - 'is a syntactic restriction that is not expressed by the ' - 'grammar.\n' - '\n' - '**Default parameter values are evaluated from left to right ' - 'when the\n' - 'function definition is executed.** This means that the ' - 'expression is\n' - 'evaluated once, when the function is defined, and that the ' - 'same "pre-\n' - 'computed" value is used for each call. This is especially ' - 'important\n' - 'to understand when a default parameter is a mutable object, ' - 'such as a\n' - 'list or a dictionary: if the function modifies the object ' - '(e.g. by\n' - 'appending an item to a list), the default value is in effect ' - 'modified.\n' - 'This is generally not what was intended. A way around this is ' - 'to use\n' - '"None" as the default, and explicitly test for it in the body ' - 'of the\n' - 'function, e.g.:\n' - '\n' - ' def whats_on_the_telly(penguin=None):\n' - ' if penguin is None:\n' - ' penguin = []\n' - ' penguin.append("property of the zoo")\n' - ' return penguin\n' - '\n' - 'Function call semantics are described in more detail in ' - 'section\n' - '*Calls*. A function call always assigns values to all ' - 'parameters\n' - 'mentioned in the parameter list, either from position ' - 'arguments, from\n' - 'keyword arguments, or from default values. If the form\n' - '""*identifier"" is present, it is initialized to a tuple ' - 'receiving any\n' - 'excess positional parameters, defaulting to the empty tuple. ' - 'If the\n' - 'form ""**identifier"" is present, it is initialized to a new\n' - 'dictionary receiving any excess keyword arguments, defaulting ' - 'to a new\n' - 'empty dictionary. Parameters after ""*"" or ""*identifier"" ' - 'are\n' - 'keyword-only parameters and may only be passed used keyword ' - 'arguments.\n' - '\n' - 'Parameters may have annotations of the form "": expression"" ' - 'following\n' - 'the parameter name. Any parameter may have an annotation even ' - 'those\n' - 'of the form "*identifier" or "**identifier". Functions may ' - 'have\n' - '"return" annotation of the form ""-> expression"" after the ' - 'parameter\n' - 'list. These annotations can be any valid Python expression ' - 'and are\n' - 'evaluated when the function definition is executed. ' - 'Annotations may\n' - 'be evaluated in a different order than they appear in the ' - 'source code.\n' - 'The presence of annotations does not change the semantics of ' - 'a\n' - 'function. The annotation values are available as values of a\n' - "dictionary keyed by the parameters' names in the " - '"__annotations__"\n' - 'attribute of the function object.\n' - '\n' - 'It is also possible to create anonymous functions (functions ' - 'not bound\n' - 'to a name), for immediate use in expressions. This uses ' - 'lambda\n' - 'expressions, described in section *Lambdas*. Note that the ' - 'lambda\n' - 'expression is merely a shorthand for a simplified function ' - 'definition;\n' - 'a function defined in a ""def"" statement can be passed around ' - 'or\n' - 'assigned to another name just like a function defined by a ' - 'lambda\n' - 'expression. The ""def"" form is actually more powerful since ' - 'it\n' - 'allows the execution of multiple statements and annotations.\n' - '\n' - "**Programmer's note:** Functions are first-class objects. A " - '""def""\n' - 'statement executed inside a function definition defines a ' - 'local\n' - 'function that can be returned or passed around. Free ' - 'variables used\n' - 'in the nested function can access the local variables of the ' - 'function\n' - 'containing the def. See section *Naming and binding* for ' - 'details.\n' - '\n' - 'See also: **PEP 3107** - Function Annotations\n' - '\n' - ' The original specification for function annotations.\n' - '\n' - '\n' - 'Class definitions\n' - '=================\n' - '\n' - 'A class definition defines a class object (see section *The ' - 'standard\n' - 'type hierarchy*):\n' - '\n' - ' classdef ::= [decorators] "class" classname ' - '[inheritance] ":" suite\n' - ' inheritance ::= "(" [argument_list] ")"\n' - ' classname ::= identifier\n' - '\n' - 'A class definition is an executable statement. The ' - 'inheritance list\n' - 'usually gives a list of base classes (see *Customizing class ' - 'creation*\n' - 'for more advanced uses), so each item in the list should ' - 'evaluate to a\n' - 'class object which allows subclassing. Classes without an ' - 'inheritance\n' - 'list inherit, by default, from the base class "object"; ' - 'hence,\n' - '\n' - ' class Foo:\n' - ' pass\n' - '\n' - 'is equivalent to\n' - '\n' - ' class Foo(object):\n' - ' pass\n' - '\n' - "The class's suite is then executed in a new execution frame " - '(see\n' - '*Naming and binding*), using a newly created local namespace ' - 'and the\n' - 'original global namespace. (Usually, the suite contains ' - 'mostly\n' - "function definitions.) When the class's suite finishes " - 'execution, its\n' - 'execution frame is discarded but its local namespace is saved. ' - '[4] A\n' - 'class object is then created using the inheritance list for ' - 'the base\n' - 'classes and the saved local namespace for the attribute ' - 'dictionary.\n' - 'The class name is bound to this class object in the original ' - 'local\n' - 'namespace.\n' - '\n' - 'Class creation can be customized heavily using *metaclasses*.\n' - '\n' - 'Classes can also be decorated: just like when decorating ' - 'functions,\n' - '\n' - ' @f1(arg)\n' - ' @f2\n' - ' class Foo: pass\n' - '\n' - 'is roughly equivalent to\n' - '\n' - ' class Foo: pass\n' - ' Foo = f1(arg)(f2(Foo))\n' - '\n' - 'The evaluation rules for the decorator expressions are the ' - 'same as for\n' - 'function decorators. The result is then bound to the class ' - 'name.\n' - '\n' - "**Programmer's note:** Variables defined in the class " - 'definition are\n' - 'class attributes; they are shared by instances. Instance ' - 'attributes\n' - 'can be set in a method with "self.name = value". Both class ' - 'and\n' - 'instance attributes are accessible through the notation ' - '""self.name"",\n' - 'and an instance attribute hides a class attribute with the ' - 'same name\n' - 'when accessed in this way. Class attributes can be used as ' - 'defaults\n' - 'for instance attributes, but using mutable values there can ' - 'lead to\n' - 'unexpected results. *Descriptors* can be used to create ' - 'instance\n' - 'variables with different implementation details.\n' - '\n' - 'See also: **PEP 3115** - Metaclasses in Python 3 **PEP 3129** ' - '-\n' - ' Class Decorators\n' - '\n' - '\n' - 'Coroutines\n' - '==========\n' - '\n' - 'New in version 3.5.\n' - '\n' - '\n' - 'Coroutine function definition\n' - '-----------------------------\n' - '\n' - ' async_funcdef ::= [decorators] "async" "def" funcname "(" ' - '[parameter_list] ")" ["->" expression] ":" suite\n' - '\n' - 'Execution of Python coroutines can be suspended and resumed at ' - 'many\n' - 'points (see *coroutine*). In the body of a coroutine, any ' - '"await" and\n' - '"async" identifiers become reserved keywords; "await" ' - 'expressions,\n' - '"async for" and "async with" can only be used in coroutine ' - 'bodies.\n' - '\n' - 'Functions defined with "async def" syntax are always ' - 'coroutine\n' - 'functions, even if they do not contain "await" or "async" ' - 'keywords.\n' - '\n' - 'It is a "SyntaxError" to use "yield" expressions in "async ' - 'def"\n' - 'coroutines.\n' - '\n' - 'An example of a coroutine function:\n' - '\n' - ' async def func(param1, param2):\n' - ' do_stuff()\n' - ' await some_coroutine()\n' - '\n' - '\n' - 'The "async for" statement\n' - '-------------------------\n' - '\n' - ' async_for_stmt ::= "async" for_stmt\n' - '\n' - 'An *asynchronous iterable* is able to call asynchronous code ' - 'in its\n' - '*iter* implementation, and *asynchronous iterator* can call\n' - 'asynchronous code in its *next* method.\n' - '\n' - 'The "async for" statement allows convenient iteration over\n' - 'asynchronous iterators.\n' - '\n' - 'The following code:\n' - '\n' - ' async for TARGET in ITER:\n' - ' BLOCK\n' - ' else:\n' - ' BLOCK2\n' - '\n' - 'Is semantically equivalent to:\n' - '\n' - ' iter = (ITER)\n' - ' iter = type(iter).__aiter__(iter)\n' - ' running = True\n' - ' while running:\n' - ' try:\n' - ' TARGET = await type(iter).__anext__(iter)\n' - ' except StopAsyncIteration:\n' - ' running = False\n' - ' else:\n' - ' BLOCK\n' - ' else:\n' - ' BLOCK2\n' - '\n' - 'See also "__aiter__()" and "__anext__()" for details.\n' - '\n' - 'It is a "SyntaxError" to use "async for" statement outside of ' - 'an\n' - '"async def" function.\n' - '\n' - '\n' - 'The "async with" statement\n' - '--------------------------\n' - '\n' - ' async_with_stmt ::= "async" with_stmt\n' - '\n' - 'An *asynchronous context manager* is a *context manager* that ' - 'is able\n' - 'to suspend execution in its *enter* and *exit* methods.\n' - '\n' - 'The following code:\n' - '\n' - ' async with EXPR as VAR:\n' - ' BLOCK\n' - '\n' - 'Is semantically equivalent to:\n' - '\n' - ' mgr = (EXPR)\n' - ' aexit = type(mgr).__aexit__\n' - ' aenter = type(mgr).__aenter__(mgr)\n' - ' exc = True\n' - '\n' - ' VAR = await aenter\n' - ' try:\n' - ' BLOCK\n' - ' except:\n' - ' if not await aexit(mgr, *sys.exc_info()):\n' - ' raise\n' - ' else:\n' - ' await aexit(mgr, None, None, None)\n' - '\n' - 'See also "__aenter__()" and "__aexit__()" for details.\n' - '\n' - 'It is a "SyntaxError" to use "async with" statement outside of ' - 'an\n' - '"async def" function.\n' - '\n' - 'See also: **PEP 492** - Coroutines with async and await ' - 'syntax\n' - '\n' - '-[ Footnotes ]-\n' - '\n' - '[1] The exception is propagated to the invocation stack ' - 'unless\n' - ' there is a "finally" clause which happens to raise ' - 'another\n' - ' exception. That new exception causes the old one to be ' - 'lost.\n' - '\n' - '[2] Currently, control "flows off the end" except in the case ' - 'of\n' - ' an exception or the execution of a "return", "continue", ' - 'or\n' - ' "break" statement.\n' - '\n' - '[3] A string literal appearing as the first statement in the\n' - " function body is transformed into the function's " - '"__doc__"\n' - " attribute and therefore the function's *docstring*.\n" - '\n' - '[4] A string literal appearing as the first statement in the ' - 'class\n' - ' body is transformed into the namespace\'s "__doc__" item ' - 'and\n' - " therefore the class's *docstring*.\n", - 'context-managers': '\n' - 'With Statement Context Managers\n' - '*******************************\n' - '\n' - 'A *context manager* is an object that defines the ' - 'runtime context to\n' - 'be established when executing a "with" statement. The ' - 'context manager\n' - 'handles the entry into, and the exit from, the desired ' - 'runtime context\n' - 'for the execution of the block of code. Context ' - 'managers are normally\n' - 'invoked using the "with" statement (described in ' - 'section *The with\n' - 'statement*), but can also be used by directly invoking ' - 'their methods.\n' - '\n' - 'Typical uses of context managers include saving and ' - 'restoring various\n' - 'kinds of global state, locking and unlocking ' - 'resources, closing opened\n' - 'files, etc.\n' - '\n' - 'For more information on context managers, see *Context ' - 'Manager Types*.\n' - '\n' - 'object.__enter__(self)\n' - '\n' - ' Enter the runtime context related to this object. ' - 'The "with"\n' - " statement will bind this method's return value to " - 'the target(s)\n' - ' specified in the "as" clause of the statement, if ' - 'any.\n' - '\n' - 'object.__exit__(self, exc_type, exc_value, traceback)\n' - '\n' - ' Exit the runtime context related to this object. ' - 'The parameters\n' - ' describe the exception that caused the context to ' - 'be exited. If the\n' - ' context was exited without an exception, all three ' - 'arguments will\n' - ' be "None".\n' - '\n' - ' If an exception is supplied, and the method wishes ' - 'to suppress the\n' - ' exception (i.e., prevent it from being propagated), ' - 'it should\n' - ' return a true value. Otherwise, the exception will ' - 'be processed\n' - ' normally upon exit from this method.\n' - '\n' - ' Note that "__exit__()" methods should not reraise ' - 'the passed-in\n' - " exception; this is the caller's responsibility.\n" - '\n' - 'See also: **PEP 343** - The "with" statement\n' - '\n' - ' The specification, background, and examples for ' - 'the Python "with"\n' - ' statement.\n', - 'continue': '\n' - 'The "continue" statement\n' - '************************\n' - '\n' - ' continue_stmt ::= "continue"\n' - '\n' - '"continue" may only occur syntactically nested in a "for" or ' - '"while"\n' - 'loop, but not nested in a function or class definition or ' - '"finally"\n' - 'clause within that loop. It continues with the next cycle of ' - 'the\n' - 'nearest enclosing loop.\n' - '\n' - 'When "continue" passes control out of a "try" statement with ' - 'a\n' - '"finally" clause, that "finally" clause is executed before ' - 'really\n' - 'starting the next loop cycle.\n', - 'conversions': '\n' - 'Arithmetic conversions\n' - '**********************\n' - '\n' - 'When a description of an arithmetic operator below uses the ' - 'phrase\n' - '"the numeric arguments are converted to a common type," ' - 'this means\n' - 'that the operator implementation for built-in types works ' - 'as follows:\n' - '\n' - '* If either argument is a complex number, the other is ' - 'converted to\n' - ' complex;\n' - '\n' - '* otherwise, if either argument is a floating point number, ' - 'the\n' - ' other is converted to floating point;\n' - '\n' - '* otherwise, both must be integers and no conversion is ' - 'necessary.\n' - '\n' - 'Some additional rules apply for certain operators (e.g., a ' - 'string as a\n' - "left argument to the '%' operator). Extensions must define " - 'their own\n' - 'conversion behavior.\n', - 'customization': '\n' - 'Basic customization\n' - '*******************\n' - '\n' - 'object.__new__(cls[, ...])\n' - '\n' - ' Called to create a new instance of class *cls*. ' - '"__new__()" is a\n' - ' static method (special-cased so you need not declare ' - 'it as such)\n' - ' that takes the class of which an instance was ' - 'requested as its\n' - ' first argument. The remaining arguments are those ' - 'passed to the\n' - ' object constructor expression (the call to the ' - 'class). The return\n' - ' value of "__new__()" should be the new object instance ' - '(usually an\n' - ' instance of *cls*).\n' - '\n' - ' Typical implementations create a new instance of the ' - 'class by\n' - ' invoking the superclass\'s "__new__()" method using\n' - ' "super().__new__(cls[, ...])" with appropriate ' - 'arguments and then\n' - ' modifying the newly-created instance as necessary ' - 'before returning\n' - ' it.\n' - '\n' - ' If "__new__()" returns an instance of *cls*, then the ' - 'new\n' - ' instance\'s "__init__()" method will be invoked like\n' - ' "__init__(self[, ...])", where *self* is the new ' - 'instance and the\n' - ' remaining arguments are the same as were passed to ' - '"__new__()".\n' - '\n' - ' If "__new__()" does not return an instance of *cls*, ' - 'then the new\n' - ' instance\'s "__init__()" method will not be invoked.\n' - '\n' - ' "__new__()" is intended mainly to allow subclasses of ' - 'immutable\n' - ' types (like int, str, or tuple) to customize instance ' - 'creation. It\n' - ' is also commonly overridden in custom metaclasses in ' - 'order to\n' - ' customize class creation.\n' - '\n' - 'object.__init__(self[, ...])\n' - '\n' - ' Called after the instance has been created (by ' - '"__new__()"), but\n' - ' before it is returned to the caller. The arguments ' - 'are those\n' - ' passed to the class constructor expression. If a base ' - 'class has an\n' - ' "__init__()" method, the derived class\'s "__init__()" ' - 'method, if\n' - ' any, must explicitly call it to ensure proper ' - 'initialization of the\n' - ' base class part of the instance; for example:\n' - ' "super().__init__([args...])".\n' - '\n' - ' Because "__new__()" and "__init__()" work together in ' - 'constructing\n' - ' objects ("__new__()" to create it, and "__init__()" to ' - 'customize\n' - ' it), no non-"None" value may be returned by ' - '"__init__()"; doing so\n' - ' will cause a "TypeError" to be raised at runtime.\n' - '\n' - 'object.__del__(self)\n' - '\n' - ' Called when the instance is about to be destroyed. ' - 'This is also\n' - ' called a destructor. If a base class has a ' - '"__del__()" method, the\n' - ' derived class\'s "__del__()" method, if any, must ' - 'explicitly call it\n' - ' to ensure proper deletion of the base class part of ' - 'the instance.\n' - ' Note that it is possible (though not recommended!) for ' - 'the\n' - ' "__del__()" method to postpone destruction of the ' - 'instance by\n' - ' creating a new reference to it. It may then be called ' - 'at a later\n' - ' time when this new reference is deleted. It is not ' - 'guaranteed that\n' - ' "__del__()" methods are called for objects that still ' - 'exist when\n' - ' the interpreter exits.\n' - '\n' - ' Note: "del x" doesn\'t directly call "x.__del__()" --- ' - 'the former\n' - ' decrements the reference count for "x" by one, and ' - 'the latter is\n' - ' only called when "x"\'s reference count reaches ' - 'zero. Some common\n' - ' situations that may prevent the reference count of ' - 'an object from\n' - ' going to zero include: circular references between ' - 'objects (e.g.,\n' - ' a doubly-linked list or a tree data structure with ' - 'parent and\n' - ' child pointers); a reference to the object on the ' - 'stack frame of\n' - ' a function that caught an exception (the traceback ' - 'stored in\n' - ' "sys.exc_info()[2]" keeps the stack frame alive); or ' - 'a reference\n' - ' to the object on the stack frame that raised an ' - 'unhandled\n' - ' exception in interactive mode (the traceback stored ' - 'in\n' - ' "sys.last_traceback" keeps the stack frame alive). ' - 'The first\n' - ' situation can only be remedied by explicitly ' - 'breaking the cycles;\n' - ' the second can be resolved by freeing the reference ' - 'to the\n' - ' traceback object when it is no longer useful, and ' - 'the third can\n' - ' be resolved by storing "None" in ' - '"sys.last_traceback". Circular\n' - ' references which are garbage are detected and ' - 'cleaned up when the\n' - " cyclic garbage collector is enabled (it's on by " - 'default). Refer\n' - ' to the documentation for the "gc" module for more ' - 'information\n' - ' about this topic.\n' - '\n' - ' Warning: Due to the precarious circumstances under ' - 'which\n' - ' "__del__()" methods are invoked, exceptions that ' - 'occur during\n' - ' their execution are ignored, and a warning is ' - 'printed to\n' - ' "sys.stderr" instead. Also, when "__del__()" is ' - 'invoked in\n' - ' response to a module being deleted (e.g., when ' - 'execution of the\n' - ' program is done), other globals referenced by the ' - '"__del__()"\n' - ' method may already have been deleted or in the ' - 'process of being\n' - ' torn down (e.g. the import machinery shutting ' - 'down). For this\n' - ' reason, "__del__()" methods should do the absolute ' - 'minimum needed\n' - ' to maintain external invariants. Starting with ' - 'version 1.5,\n' - ' Python guarantees that globals whose name begins ' - 'with a single\n' - ' underscore are deleted from their module before ' - 'other globals are\n' - ' deleted; if no other references to such globals ' - 'exist, this may\n' - ' help in assuring that imported modules are still ' - 'available at the\n' - ' time when the "__del__()" method is called.\n' - '\n' - 'object.__repr__(self)\n' - '\n' - ' Called by the "repr()" built-in function to compute ' - 'the "official"\n' - ' string representation of an object. If at all ' - 'possible, this\n' - ' should look like a valid Python expression that could ' - 'be used to\n' - ' recreate an object with the same value (given an ' - 'appropriate\n' - ' environment). If this is not possible, a string of ' - 'the form\n' - ' "<...some useful description...>" should be returned. ' - 'The return\n' - ' value must be a string object. If a class defines ' - '"__repr__()" but\n' - ' not "__str__()", then "__repr__()" is also used when ' - 'an "informal"\n' - ' string representation of instances of that class is ' - 'required.\n' - '\n' - ' This is typically used for debugging, so it is ' - 'important that the\n' - ' representation is information-rich and unambiguous.\n' - '\n' - 'object.__str__(self)\n' - '\n' - ' Called by "str(object)" and the built-in functions ' - '"format()" and\n' - ' "print()" to compute the "informal" or nicely ' - 'printable string\n' - ' representation of an object. The return value must be ' - 'a *string*\n' - ' object.\n' - '\n' - ' This method differs from "object.__repr__()" in that ' - 'there is no\n' - ' expectation that "__str__()" return a valid Python ' - 'expression: a\n' - ' more convenient or concise representation can be ' - 'used.\n' - '\n' - ' The default implementation defined by the built-in ' - 'type "object"\n' - ' calls "object.__repr__()".\n' - '\n' - 'object.__bytes__(self)\n' - '\n' - ' Called by "bytes()" to compute a byte-string ' - 'representation of an\n' - ' object. This should return a "bytes" object.\n' - '\n' - 'object.__format__(self, format_spec)\n' - '\n' - ' Called by the "format()" built-in function (and by ' - 'extension, the\n' - ' "str.format()" method of class "str") to produce a ' - '"formatted"\n' - ' string representation of an object. The "format_spec" ' - 'argument is a\n' - ' string that contains a description of the formatting ' - 'options\n' - ' desired. The interpretation of the "format_spec" ' - 'argument is up to\n' - ' the type implementing "__format__()", however most ' - 'classes will\n' - ' either delegate formatting to one of the built-in ' - 'types, or use a\n' - ' similar formatting option syntax.\n' - '\n' - ' See *Format Specification Mini-Language* for a ' - 'description of the\n' - ' standard formatting syntax.\n' - '\n' - ' The return value must be a string object.\n' - '\n' - ' Changed in version 3.4: The __format__ method of ' - '"object" itself\n' - ' raises a "TypeError" if passed any non-empty string.\n' - '\n' - 'object.__lt__(self, other)\n' - 'object.__le__(self, other)\n' - 'object.__eq__(self, other)\n' - 'object.__ne__(self, other)\n' - 'object.__gt__(self, other)\n' - 'object.__ge__(self, other)\n' - '\n' - ' These are the so-called "rich comparison" methods. ' - 'The\n' - ' correspondence between operator symbols and method ' - 'names is as\n' - ' follows: "xy" calls\n' - ' "x.__gt__(y)", and "x>=y" calls "x.__ge__(y)".\n' - '\n' - ' A rich comparison method may return the singleton ' - '"NotImplemented"\n' - ' if it does not implement the operation for a given ' - 'pair of\n' - ' arguments. By convention, "False" and "True" are ' - 'returned for a\n' - ' successful comparison. However, these methods can ' - 'return any value,\n' - ' so if the comparison operator is used in a Boolean ' - 'context (e.g.,\n' - ' in the condition of an "if" statement), Python will ' - 'call "bool()"\n' - ' on the value to determine if the result is true or ' - 'false.\n' - '\n' - ' By default, "__ne__()" delegates to "__eq__()" and ' - 'inverts the\n' - ' result unless it is "NotImplemented". There are no ' - 'other implied\n' - ' relationships among the comparison operators, for ' - 'example, the\n' - ' truth of "(x.__hash__".\n' - '\n' - ' If a class that does not override "__eq__()" wishes to ' - 'suppress\n' - ' hash support, it should include "__hash__ = None" in ' - 'the class\n' - ' definition. A class which defines its own "__hash__()" ' - 'that\n' - ' explicitly raises a "TypeError" would be incorrectly ' - 'identified as\n' - ' hashable by an "isinstance(obj, collections.Hashable)" ' - 'call.\n' - '\n' - ' Note: By default, the "__hash__()" values of str, ' - 'bytes and\n' - ' datetime objects are "salted" with an unpredictable ' - 'random value.\n' - ' Although they remain constant within an individual ' - 'Python\n' - ' process, they are not predictable between repeated ' - 'invocations of\n' - ' Python.This is intended to provide protection ' - 'against a denial-\n' - ' of-service caused by carefully-chosen inputs that ' - 'exploit the\n' - ' worst case performance of a dict insertion, O(n^2) ' - 'complexity.\n' - ' See ' - 'http://www.ocert.org/advisories/ocert-2011-003.html for\n' - ' details.Changing hash values affects the iteration ' - 'order of\n' - ' dicts, sets and other mappings. Python has never ' - 'made guarantees\n' - ' about this ordering (and it typically varies between ' - '32-bit and\n' - ' 64-bit builds).See also "PYTHONHASHSEED".\n' - '\n' - ' Changed in version 3.3: Hash randomization is enabled ' - 'by default.\n' - '\n' - 'object.__bool__(self)\n' - '\n' - ' Called to implement truth value testing and the ' - 'built-in operation\n' - ' "bool()"; should return "False" or "True". When this ' - 'method is not\n' - ' defined, "__len__()" is called, if it is defined, and ' - 'the object is\n' - ' considered true if its result is nonzero. If a class ' - 'defines\n' - ' neither "__len__()" nor "__bool__()", all its ' - 'instances are\n' - ' considered true.\n', - 'debugger': '\n' - '"pdb" --- The Python Debugger\n' - '*****************************\n' - '\n' - '**Source code:** Lib/pdb.py\n' - '\n' - '======================================================================\n' - '\n' - 'The module "pdb" defines an interactive source code debugger ' - 'for\n' - 'Python programs. It supports setting (conditional) ' - 'breakpoints and\n' - 'single stepping at the source line level, inspection of stack ' - 'frames,\n' - 'source code listing, and evaluation of arbitrary Python code ' - 'in the\n' - 'context of any stack frame. It also supports post-mortem ' - 'debugging\n' - 'and can be called under program control.\n' - '\n' - 'The debugger is extensible -- it is actually defined as the ' - 'class\n' - '"Pdb". This is currently undocumented but easily understood by ' - 'reading\n' - 'the source. The extension interface uses the modules "bdb" ' - 'and "cmd".\n' - '\n' - 'The debugger\'s prompt is "(Pdb)". Typical usage to run a ' - 'program under\n' - 'control of the debugger is:\n' - '\n' - ' >>> import pdb\n' - ' >>> import mymodule\n' - " >>> pdb.run('mymodule.test()')\n" - ' > (0)?()\n' - ' (Pdb) continue\n' - ' > (1)?()\n' - ' (Pdb) continue\n' - " NameError: 'spam'\n" - ' > (1)?()\n' - ' (Pdb)\n' - '\n' - 'Changed in version 3.3: Tab-completion via the "readline" ' - 'module is\n' - 'available for commands and command arguments, e.g. the current ' - 'global\n' - 'and local names are offered as arguments of the "p" command.\n' - '\n' - '"pdb.py" can also be invoked as a script to debug other ' - 'scripts. For\n' - 'example:\n' - '\n' - ' python3 -m pdb myscript.py\n' - '\n' - 'When invoked as a script, pdb will automatically enter ' - 'post-mortem\n' - 'debugging if the program being debugged exits abnormally. ' - 'After post-\n' - 'mortem debugging (or after normal exit of the program), pdb ' - 'will\n' - "restart the program. Automatic restarting preserves pdb's " - 'state (such\n' - 'as breakpoints) and in most cases is more useful than quitting ' - 'the\n' - "debugger upon program's exit.\n" - '\n' - 'New in version 3.2: "pdb.py" now accepts a "-c" option that ' - 'executes\n' - 'commands as if given in a ".pdbrc" file, see *Debugger ' - 'Commands*.\n' - '\n' - 'The typical usage to break into the debugger from a running ' - 'program is\n' - 'to insert\n' - '\n' - ' import pdb; pdb.set_trace()\n' - '\n' - 'at the location you want to break into the debugger. You can ' - 'then\n' - 'step through the code following this statement, and continue ' - 'running\n' - 'without the debugger using the "continue" command.\n' - '\n' - 'The typical usage to inspect a crashed program is:\n' - '\n' - ' >>> import pdb\n' - ' >>> import mymodule\n' - ' >>> mymodule.test()\n' - ' Traceback (most recent call last):\n' - ' File "", line 1, in \n' - ' File "./mymodule.py", line 4, in test\n' - ' test2()\n' - ' File "./mymodule.py", line 3, in test2\n' - ' print(spam)\n' - ' NameError: spam\n' - ' >>> pdb.pm()\n' - ' > ./mymodule.py(3)test2()\n' - ' -> print(spam)\n' - ' (Pdb)\n' - '\n' - 'The module defines the following functions; each enters the ' - 'debugger\n' - 'in a slightly different way:\n' - '\n' - 'pdb.run(statement, globals=None, locals=None)\n' - '\n' - ' Execute the *statement* (given as a string or a code ' - 'object) under\n' - ' debugger control. The debugger prompt appears before any ' - 'code is\n' - ' executed; you can set breakpoints and type "continue", or ' - 'you can\n' - ' step through the statement using "step" or "next" (all ' - 'these\n' - ' commands are explained below). The optional *globals* and ' - '*locals*\n' - ' arguments specify the environment in which the code is ' - 'executed; by\n' - ' default the dictionary of the module "__main__" is used. ' - '(See the\n' - ' explanation of the built-in "exec()" or "eval()" ' - 'functions.)\n' - '\n' - 'pdb.runeval(expression, globals=None, locals=None)\n' - '\n' - ' Evaluate the *expression* (given as a string or a code ' - 'object)\n' - ' under debugger control. When "runeval()" returns, it ' - 'returns the\n' - ' value of the expression. Otherwise this function is ' - 'similar to\n' - ' "run()".\n' - '\n' - 'pdb.runcall(function, *args, **kwds)\n' - '\n' - ' Call the *function* (a function or method object, not a ' - 'string)\n' - ' with the given arguments. When "runcall()" returns, it ' - 'returns\n' - ' whatever the function call returned. The debugger prompt ' - 'appears\n' - ' as soon as the function is entered.\n' - '\n' - 'pdb.set_trace()\n' - '\n' - ' Enter the debugger at the calling stack frame. This is ' - 'useful to\n' - ' hard-code a breakpoint at a given point in a program, even ' - 'if the\n' - ' code is not otherwise being debugged (e.g. when an ' - 'assertion\n' - ' fails).\n' - '\n' - 'pdb.post_mortem(traceback=None)\n' - '\n' - ' Enter post-mortem debugging of the given *traceback* ' - 'object. If no\n' - ' *traceback* is given, it uses the one of the exception that ' - 'is\n' - ' currently being handled (an exception must be being handled ' - 'if the\n' - ' default is to be used).\n' - '\n' - 'pdb.pm()\n' - '\n' - ' Enter post-mortem debugging of the traceback found in\n' - ' "sys.last_traceback".\n' - '\n' - 'The "run*" functions and "set_trace()" are aliases for ' - 'instantiating\n' - 'the "Pdb" class and calling the method of the same name. If ' - 'you want\n' - 'to access further features, you have to do this yourself:\n' - '\n' - "class class pdb.Pdb(completekey='tab', stdin=None, " - 'stdout=None, skip=None, nosigint=False)\n' - '\n' - ' "Pdb" is the debugger class.\n' - '\n' - ' The *completekey*, *stdin* and *stdout* arguments are ' - 'passed to the\n' - ' underlying "cmd.Cmd" class; see the description there.\n' - '\n' - ' The *skip* argument, if given, must be an iterable of ' - 'glob-style\n' - ' module name patterns. The debugger will not step into ' - 'frames that\n' - ' originate in a module that matches one of these patterns. ' - '[1]\n' - '\n' - ' By default, Pdb sets a handler for the SIGINT signal (which ' - 'is sent\n' - ' when the user presses "Ctrl-C" on the console) when you ' - 'give a\n' - ' "continue" command. This allows you to break into the ' - 'debugger\n' - ' again by pressing "Ctrl-C". If you want Pdb not to touch ' - 'the\n' - ' SIGINT handler, set *nosigint* to true.\n' - '\n' - ' Example call to enable tracing with *skip*:\n' - '\n' - " import pdb; pdb.Pdb(skip=['django.*']).set_trace()\n" - '\n' - ' New in version 3.1: The *skip* argument.\n' - '\n' - ' New in version 3.2: The *nosigint* argument. Previously, a ' - 'SIGINT\n' - ' handler was never set by Pdb.\n' - '\n' - ' run(statement, globals=None, locals=None)\n' - ' runeval(expression, globals=None, locals=None)\n' - ' runcall(function, *args, **kwds)\n' - ' set_trace()\n' - '\n' - ' See the documentation for the functions explained ' - 'above.\n' - '\n' - '\n' - 'Debugger Commands\n' - '=================\n' - '\n' - 'The commands recognized by the debugger are listed below. ' - 'Most\n' - 'commands can be abbreviated to one or two letters as ' - 'indicated; e.g.\n' - '"h(elp)" means that either "h" or "help" can be used to enter ' - 'the help\n' - 'command (but not "he" or "hel", nor "H" or "Help" or "HELP").\n' - 'Arguments to commands must be separated by whitespace (spaces ' - 'or\n' - 'tabs). Optional arguments are enclosed in square brackets ' - '("[]") in\n' - 'the command syntax; the square brackets must not be typed.\n' - 'Alternatives in the command syntax are separated by a vertical ' - 'bar\n' - '("|").\n' - '\n' - 'Entering a blank line repeats the last command entered. ' - 'Exception: if\n' - 'the last command was a "list" command, the next 11 lines are ' - 'listed.\n' - '\n' - "Commands that the debugger doesn't recognize are assumed to be " - 'Python\n' - 'statements and are executed in the context of the program ' - 'being\n' - 'debugged. Python statements can also be prefixed with an ' - 'exclamation\n' - 'point ("!"). This is a powerful way to inspect the program ' - 'being\n' - 'debugged; it is even possible to change a variable or call a ' - 'function.\n' - 'When an exception occurs in such a statement, the exception ' - 'name is\n' - "printed but the debugger's state is not changed.\n" - '\n' - 'The debugger supports *aliases*. Aliases can have parameters ' - 'which\n' - 'allows one a certain level of adaptability to the context ' - 'under\n' - 'examination.\n' - '\n' - 'Multiple commands may be entered on a single line, separated ' - 'by ";;".\n' - '(A single ";" is not used as it is the separator for multiple ' - 'commands\n' - 'in a line that is passed to the Python parser.) No ' - 'intelligence is\n' - 'applied to separating the commands; the input is split at the ' - 'first\n' - '";;" pair, even if it is in the middle of a quoted string.\n' - '\n' - 'If a file ".pdbrc" exists in the user\'s home directory or in ' - 'the\n' - 'current directory, it is read in and executed as if it had ' - 'been typed\n' - 'at the debugger prompt. This is particularly useful for ' - 'aliases. If\n' - 'both files exist, the one in the home directory is read first ' - 'and\n' - 'aliases defined there can be overridden by the local file.\n' - '\n' - 'Changed in version 3.2: ".pdbrc" can now contain commands ' - 'that\n' - 'continue debugging, such as "continue" or "next". Previously, ' - 'these\n' - 'commands had no effect.\n' - '\n' - 'h(elp) [command]\n' - '\n' - ' Without argument, print the list of available commands. ' - 'With a\n' - ' *command* as argument, print help about that command. ' - '"help pdb"\n' - ' displays the full documentation (the docstring of the ' - '"pdb"\n' - ' module). Since the *command* argument must be an ' - 'identifier, "help\n' - ' exec" must be entered to get help on the "!" command.\n' - '\n' - 'w(here)\n' - '\n' - ' Print a stack trace, with the most recent frame at the ' - 'bottom. An\n' - ' arrow indicates the current frame, which determines the ' - 'context of\n' - ' most commands.\n' - '\n' - 'd(own) [count]\n' - '\n' - ' Move the current frame *count* (default one) levels down in ' - 'the\n' - ' stack trace (to a newer frame).\n' - '\n' - 'u(p) [count]\n' - '\n' - ' Move the current frame *count* (default one) levels up in ' - 'the stack\n' - ' trace (to an older frame).\n' - '\n' - 'b(reak) [([filename:]lineno | function) [, condition]]\n' - '\n' - ' With a *lineno* argument, set a break there in the current ' - 'file.\n' - ' With a *function* argument, set a break at the first ' - 'executable\n' - ' statement within that function. The line number may be ' - 'prefixed\n' - ' with a filename and a colon, to specify a breakpoint in ' - 'another\n' - " file (probably one that hasn't been loaded yet). The file " - 'is\n' - ' searched on "sys.path". Note that each breakpoint is ' - 'assigned a\n' - ' number to which all the other breakpoint commands refer.\n' - '\n' - ' If a second argument is present, it is an expression which ' - 'must\n' - ' evaluate to true before the breakpoint is honored.\n' - '\n' - ' Without argument, list all breaks, including for each ' - 'breakpoint,\n' - ' the number of times that breakpoint has been hit, the ' - 'current\n' - ' ignore count, and the associated condition if any.\n' - '\n' - 'tbreak [([filename:]lineno | function) [, condition]]\n' - '\n' - ' Temporary breakpoint, which is removed automatically when ' - 'it is\n' - ' first hit. The arguments are the same as for "break".\n' - '\n' - 'cl(ear) [filename:lineno | bpnumber [bpnumber ...]]\n' - '\n' - ' With a *filename:lineno* argument, clear all the ' - 'breakpoints at\n' - ' this line. With a space separated list of breakpoint ' - 'numbers, clear\n' - ' those breakpoints. Without argument, clear all breaks (but ' - 'first\n' - ' ask confirmation).\n' - '\n' - 'disable [bpnumber [bpnumber ...]]\n' - '\n' - ' Disable the breakpoints given as a space separated list of\n' - ' breakpoint numbers. Disabling a breakpoint means it cannot ' - 'cause\n' - ' the program to stop execution, but unlike clearing a ' - 'breakpoint, it\n' - ' remains in the list of breakpoints and can be ' - '(re-)enabled.\n' - '\n' - 'enable [bpnumber [bpnumber ...]]\n' - '\n' - ' Enable the breakpoints specified.\n' - '\n' - 'ignore bpnumber [count]\n' - '\n' - ' Set the ignore count for the given breakpoint number. If ' - 'count is\n' - ' omitted, the ignore count is set to 0. A breakpoint ' - 'becomes active\n' - ' when the ignore count is zero. When non-zero, the count ' - 'is\n' - ' decremented each time the breakpoint is reached and the ' - 'breakpoint\n' - ' is not disabled and any associated condition evaluates to ' - 'true.\n' - '\n' - 'condition bpnumber [condition]\n' - '\n' - ' Set a new *condition* for the breakpoint, an expression ' - 'which must\n' - ' evaluate to true before the breakpoint is honored. If ' - '*condition*\n' - ' is absent, any existing condition is removed; i.e., the ' - 'breakpoint\n' - ' is made unconditional.\n' - '\n' - 'commands [bpnumber]\n' - '\n' - ' Specify a list of commands for breakpoint number ' - '*bpnumber*. The\n' - ' commands themselves appear on the following lines. Type a ' - 'line\n' - ' containing just "end" to terminate the commands. An ' - 'example:\n' - '\n' - ' (Pdb) commands 1\n' - ' (com) p some_variable\n' - ' (com) end\n' - ' (Pdb)\n' - '\n' - ' To remove all commands from a breakpoint, type commands and ' - 'follow\n' - ' it immediately with "end"; that is, give no commands.\n' - '\n' - ' With no *bpnumber* argument, commands refers to the last ' - 'breakpoint\n' - ' set.\n' - '\n' - ' You can use breakpoint commands to start your program up ' - 'again.\n' - ' Simply use the continue command, or step, or any other ' - 'command that\n' - ' resumes execution.\n' - '\n' - ' Specifying any command resuming execution (currently ' - 'continue,\n' - ' step, next, return, jump, quit and their abbreviations) ' - 'terminates\n' - ' the command list (as if that command was immediately ' - 'followed by\n' - ' end). This is because any time you resume execution (even ' - 'with a\n' - ' simple next or step), you may encounter another ' - 'breakpoint?which\n' - ' could have its own command list, leading to ambiguities ' - 'about which\n' - ' list to execute.\n' - '\n' - " If you use the 'silent' command in the command list, the " - 'usual\n' - ' message about stopping at a breakpoint is not printed. ' - 'This may be\n' - ' desirable for breakpoints that are to print a specific ' - 'message and\n' - ' then continue. If none of the other commands print ' - 'anything, you\n' - ' see no sign that the breakpoint was reached.\n' - '\n' - 's(tep)\n' - '\n' - ' Execute the current line, stop at the first possible ' - 'occasion\n' - ' (either in a function that is called or on the next line in ' - 'the\n' - ' current function).\n' - '\n' - 'n(ext)\n' - '\n' - ' Continue execution until the next line in the current ' - 'function is\n' - ' reached or it returns. (The difference between "next" and ' - '"step"\n' - ' is that "step" stops inside a called function, while ' - '"next"\n' - ' executes called functions at (nearly) full speed, only ' - 'stopping at\n' - ' the next line in the current function.)\n' - '\n' - 'unt(il) [lineno]\n' - '\n' - ' Without argument, continue execution until the line with a ' - 'number\n' - ' greater than the current one is reached.\n' - '\n' - ' With a line number, continue execution until a line with a ' - 'number\n' - ' greater or equal to that is reached. In both cases, also ' - 'stop when\n' - ' the current frame returns.\n' - '\n' - ' Changed in version 3.2: Allow giving an explicit line ' - 'number.\n' - '\n' - 'r(eturn)\n' - '\n' - ' Continue execution until the current function returns.\n' - '\n' - 'c(ont(inue))\n' - '\n' - ' Continue execution, only stop when a breakpoint is ' - 'encountered.\n' - '\n' - 'j(ump) lineno\n' - '\n' - ' Set the next line that will be executed. Only available in ' - 'the\n' - ' bottom-most frame. This lets you jump back and execute ' - 'code again,\n' - " or jump forward to skip code that you don't want to run.\n" - '\n' - ' It should be noted that not all jumps are allowed -- for ' - 'instance\n' - ' it is not possible to jump into the middle of a "for" loop ' - 'or out\n' - ' of a "finally" clause.\n' - '\n' - 'l(ist) [first[, last]]\n' - '\n' - ' List source code for the current file. Without arguments, ' - 'list 11\n' - ' lines around the current line or continue the previous ' - 'listing.\n' - ' With "." as argument, list 11 lines around the current ' - 'line. With\n' - ' one argument, list 11 lines around at that line. With two\n' - ' arguments, list the given range; if the second argument is ' - 'less\n' - ' than the first, it is interpreted as a count.\n' - '\n' - ' The current line in the current frame is indicated by ' - '"->". If an\n' - ' exception is being debugged, the line where the exception ' - 'was\n' - ' originally raised or propagated is indicated by ">>", if it ' - 'differs\n' - ' from the current line.\n' - '\n' - ' New in version 3.2: The ">>" marker.\n' - '\n' - 'll | longlist\n' - '\n' - ' List all source code for the current function or frame.\n' - ' Interesting lines are marked as for "list".\n' - '\n' - ' New in version 3.2.\n' - '\n' - 'a(rgs)\n' - '\n' - ' Print the argument list of the current function.\n' - '\n' - 'p expression\n' - '\n' - ' Evaluate the *expression* in the current context and print ' - 'its\n' - ' value.\n' - '\n' - ' Note: "print()" can also be used, but is not a debugger ' - 'command\n' - ' --- this executes the Python "print()" function.\n' - '\n' - 'pp expression\n' - '\n' - ' Like the "p" command, except the value of the expression is ' - 'pretty-\n' - ' printed using the "pprint" module.\n' - '\n' - 'whatis expression\n' - '\n' - ' Print the type of the *expression*.\n' - '\n' - 'source expression\n' - '\n' - ' Try to get source code for the given object and display ' - 'it.\n' - '\n' - ' New in version 3.2.\n' - '\n' - 'display [expression]\n' - '\n' - ' Display the value of the expression if it changed, each ' - 'time\n' - ' execution stops in the current frame.\n' - '\n' - ' Without expression, list all display expressions for the ' - 'current\n' - ' frame.\n' - '\n' - ' New in version 3.2.\n' - '\n' - 'undisplay [expression]\n' - '\n' - ' Do not display the expression any more in the current ' - 'frame.\n' - ' Without expression, clear all display expressions for the ' - 'current\n' - ' frame.\n' - '\n' - ' New in version 3.2.\n' - '\n' - 'interact\n' - '\n' - ' Start an interactive interpreter (using the "code" module) ' - 'whose\n' - ' global namespace contains all the (global and local) names ' - 'found in\n' - ' the current scope.\n' - '\n' - ' New in version 3.2.\n' - '\n' - 'alias [name [command]]\n' - '\n' - ' Create an alias called *name* that executes *command*. The ' - 'command\n' - ' must *not* be enclosed in quotes. Replaceable parameters ' - 'can be\n' - ' indicated by "%1", "%2", and so on, while "%*" is replaced ' - 'by all\n' - ' the parameters. If no command is given, the current alias ' - 'for\n' - ' *name* is shown. If no arguments are given, all aliases are ' - 'listed.\n' - '\n' - ' Aliases may be nested and can contain anything that can be ' - 'legally\n' - ' typed at the pdb prompt. Note that internal pdb commands ' - '*can* be\n' - ' overridden by aliases. Such a command is then hidden until ' - 'the\n' - ' alias is removed. Aliasing is recursively applied to the ' - 'first\n' - ' word of the command line; all other words in the line are ' - 'left\n' - ' alone.\n' - '\n' - ' As an example, here are two useful aliases (especially when ' - 'placed\n' - ' in the ".pdbrc" file):\n' - '\n' - ' # Print instance variables (usage "pi classInst")\n' - ' alias pi for k in %1.__dict__.keys(): ' - 'print("%1.",k,"=",%1.__dict__[k])\n' - ' # Print instance variables in self\n' - ' alias ps pi self\n' - '\n' - 'unalias name\n' - '\n' - ' Delete the specified alias.\n' - '\n' - '! statement\n' - '\n' - ' Execute the (one-line) *statement* in the context of the ' - 'current\n' - ' stack frame. The exclamation point can be omitted unless ' - 'the first\n' - ' word of the statement resembles a debugger command. To set ' - 'a\n' - ' global variable, you can prefix the assignment command with ' - 'a\n' - ' "global" statement on the same line, e.g.:\n' - '\n' - " (Pdb) global list_options; list_options = ['-l']\n" - ' (Pdb)\n' - '\n' - 'run [args ...]\n' - 'restart [args ...]\n' - '\n' - ' Restart the debugged Python program. If an argument is ' - 'supplied,\n' - ' it is split with "shlex" and the result is used as the new\n' - ' "sys.argv". History, breakpoints, actions and debugger ' - 'options are\n' - ' preserved. "restart" is an alias for "run".\n' - '\n' - 'q(uit)\n' - '\n' - ' Quit from the debugger. The program being executed is ' - 'aborted.\n' - '\n' - '-[ Footnotes ]-\n' - '\n' - '[1] Whether a frame is considered to originate in a certain ' - 'module\n' - ' is determined by the "__name__" in the frame globals.\n', - 'del': '\n' - 'The "del" statement\n' - '*******************\n' - '\n' - ' del_stmt ::= "del" target_list\n' - '\n' - 'Deletion is recursively defined very similar to the way assignment ' - 'is\n' - 'defined. Rather than spelling it out in full details, here are ' - 'some\n' - 'hints.\n' - '\n' - 'Deletion of a target list recursively deletes each target, from ' - 'left\n' - 'to right.\n' - '\n' - 'Deletion of a name removes the binding of that name from the local ' - 'or\n' - 'global namespace, depending on whether the name occurs in a ' - '"global"\n' - 'statement in the same code block. If the name is unbound, a\n' - '"NameError" exception will be raised.\n' - '\n' - 'Deletion of attribute references, subscriptions and slicings is ' - 'passed\n' - 'to the primary object involved; deletion of a slicing is in ' - 'general\n' - 'equivalent to assignment of an empty slice of the right type (but ' - 'even\n' - 'this is determined by the sliced object).\n' - '\n' - 'Changed in version 3.2: Previously it was illegal to delete a name\n' - 'from the local namespace if it occurs as a free variable in a ' - 'nested\n' - 'block.\n', - 'dict': '\n' - 'Dictionary displays\n' - '*******************\n' - '\n' - 'A dictionary display is a possibly empty series of key/datum ' - 'pairs\n' - 'enclosed in curly braces:\n' - '\n' - ' dict_display ::= "{" [key_datum_list | ' - 'dict_comprehension] "}"\n' - ' key_datum_list ::= key_datum ("," key_datum)* [","]\n' - ' key_datum ::= expression ":" expression | "**" ' - 'or_expr\n' - ' dict_comprehension ::= expression ":" expression comp_for\n' - '\n' - 'A dictionary display yields a new dictionary object.\n' - '\n' - 'If a comma-separated sequence of key/datum pairs is given, they ' - 'are\n' - 'evaluated from left to right to define the entries of the ' - 'dictionary:\n' - 'each key object is used as a key into the dictionary to store the\n' - 'corresponding datum. This means that you can specify the same ' - 'key\n' - "multiple times in the key/datum list, and the final dictionary's " - 'value\n' - 'for that key will be the last one given.\n' - '\n' - 'A double asterisk "**" denotes *dictionary unpacking*. Its ' - 'operand\n' - 'must be a *mapping*. Each mapping item is added to the new\n' - 'dictionary. Later values replace values already set by earlier\n' - 'key/datum pairs and earlier dictionary unpackings.\n' - '\n' - 'New in version 3.5: Unpacking into dictionary displays, ' - 'originally\n' - 'proposed by **PEP 448**.\n' - '\n' - 'A dict comprehension, in contrast to list and set comprehensions,\n' - 'needs two expressions separated with a colon followed by the ' - 'usual\n' - '"for" and "if" clauses. When the comprehension is run, the ' - 'resulting\n' - 'key and value elements are inserted in the new dictionary in the ' - 'order\n' - 'they are produced.\n' - '\n' - 'Restrictions on the types of the key values are listed earlier in\n' - 'section *The standard type hierarchy*. (To summarize, the key ' - 'type\n' - 'should be *hashable*, which excludes all mutable objects.) ' - 'Clashes\n' - 'between duplicate keys are not detected; the last datum ' - '(textually\n' - 'rightmost in the display) stored for a given key value prevails.\n', - 'dynamic-features': '\n' - 'Interaction with dynamic features\n' - '*********************************\n' - '\n' - 'Name resolution of free variables occurs at runtime, ' - 'not at compile\n' - 'time. This means that the following code will print ' - '42:\n' - '\n' - ' i = 10\n' - ' def f():\n' - ' print(i)\n' - ' i = 42\n' - ' f()\n' - '\n' - 'The "eval()" and "exec()" functions do not have access ' - 'to the full\n' - 'environment for resolving names. Names may be ' - 'resolved in the local\n' - 'and global namespaces of the caller. Free variables ' - 'are not resolved\n' - 'in the nearest enclosing namespace, but in the global ' - 'namespace. [1]\n' - 'The "exec()" and "eval()" functions have optional ' - 'arguments to\n' - 'override the global and local namespace. If only one ' - 'namespace is\n' - 'specified, it is used for both.\n', - 'else': '\n' - 'The "if" statement\n' - '******************\n' - '\n' - 'The "if" statement is used for conditional execution:\n' - '\n' - ' if_stmt ::= "if" expression ":" suite\n' - ' ( "elif" expression ":" suite )*\n' - ' ["else" ":" suite]\n' - '\n' - 'It selects exactly one of the suites by evaluating the expressions ' - 'one\n' - 'by one until one is found to be true (see section *Boolean ' - 'operations*\n' - 'for the definition of true and false); then that suite is ' - 'executed\n' - '(and no other part of the "if" statement is executed or ' - 'evaluated).\n' - 'If all expressions are false, the suite of the "else" clause, if\n' - 'present, is executed.\n', - 'exceptions': '\n' - 'Exceptions\n' - '**********\n' - '\n' - 'Exceptions are a means of breaking out of the normal flow of ' - 'control\n' - 'of a code block in order to handle errors or other ' - 'exceptional\n' - 'conditions. An exception is *raised* at the point where the ' - 'error is\n' - 'detected; it may be *handled* by the surrounding code block ' - 'or by any\n' - 'code block that directly or indirectly invoked the code ' - 'block where\n' - 'the error occurred.\n' - '\n' - 'The Python interpreter raises an exception when it detects a ' - 'run-time\n' - 'error (such as division by zero). A Python program can ' - 'also\n' - 'explicitly raise an exception with the "raise" statement. ' - 'Exception\n' - 'handlers are specified with the "try" ... "except" ' - 'statement. The\n' - '"finally" clause of such a statement can be used to specify ' - 'cleanup\n' - 'code which does not handle the exception, but is executed ' - 'whether an\n' - 'exception occurred or not in the preceding code.\n' - '\n' - 'Python uses the "termination" model of error handling: an ' - 'exception\n' - 'handler can find out what happened and continue execution at ' - 'an outer\n' - 'level, but it cannot repair the cause of the error and retry ' - 'the\n' - 'failing operation (except by re-entering the offending piece ' - 'of code\n' - 'from the top).\n' - '\n' - 'When an exception is not handled at all, the interpreter ' - 'terminates\n' - 'execution of the program, or returns to its interactive main ' - 'loop. In\n' - 'either case, it prints a stack backtrace, except when the ' - 'exception is\n' - '"SystemExit".\n' - '\n' - 'Exceptions are identified by class instances. The "except" ' - 'clause is\n' - 'selected depending on the class of the instance: it must ' - 'reference the\n' - 'class of the instance or a base class thereof. The instance ' - 'can be\n' - 'received by the handler and can carry additional information ' - 'about the\n' - 'exceptional condition.\n' - '\n' - 'Note: Exception messages are not part of the Python API. ' - 'Their\n' - ' contents may change from one version of Python to the next ' - 'without\n' - ' warning and should not be relied on by code which will run ' - 'under\n' - ' multiple versions of the interpreter.\n' - '\n' - 'See also the description of the "try" statement in section ' - '*The try\n' - 'statement* and "raise" statement in section *The raise ' - 'statement*.\n' - '\n' - '-[ Footnotes ]-\n' - '\n' - '[1] This limitation occurs because the code that is executed ' - 'by\n' - ' these operations is not available at the time the module ' - 'is\n' - ' compiled.\n', - 'execmodel': '\n' - 'Execution model\n' - '***************\n' - '\n' - '\n' - 'Structure of a program\n' - '======================\n' - '\n' - 'A Python program is constructed from code blocks. A *block* ' - 'is a piece\n' - 'of Python program text that is executed as a unit. The ' - 'following are\n' - 'blocks: a module, a function body, and a class definition. ' - 'Each\n' - 'command typed interactively is a block. A script file (a ' - 'file given\n' - 'as standard input to the interpreter or specified as a ' - 'command line\n' - 'argument to the interpreter) is a code block. A script ' - 'command (a\n' - 'command specified on the interpreter command line with the ' - "'**-c**'\n" - 'option) is a code block. The string argument passed to the ' - 'built-in\n' - 'functions "eval()" and "exec()" is a code block.\n' - '\n' - 'A code block is executed in an *execution frame*. A frame ' - 'contains\n' - 'some administrative information (used for debugging) and ' - 'determines\n' - "where and how execution continues after the code block's " - 'execution has\n' - 'completed.\n' - '\n' - '\n' - 'Naming and binding\n' - '==================\n' - '\n' - '\n' - 'Binding of names\n' - '----------------\n' - '\n' - '*Names* refer to objects. Names are introduced by name ' - 'binding\n' - 'operations.\n' - '\n' - 'The following constructs bind names: formal parameters to ' - 'functions,\n' - '"import" statements, class and function definitions (these ' - 'bind the\n' - 'class or function name in the defining block), and targets ' - 'that are\n' - 'identifiers if occurring in an assignment, "for" loop header, ' - 'or after\n' - '"as" in a "with" statement or "except" clause. The "import" ' - 'statement\n' - 'of the form "from ... import *" binds all names defined in ' - 'the\n' - 'imported module, except those beginning with an underscore. ' - 'This form\n' - 'may only be used at the module level.\n' - '\n' - 'A target occurring in a "del" statement is also considered ' - 'bound for\n' - 'this purpose (though the actual semantics are to unbind the ' - 'name).\n' - '\n' - 'Each assignment or import statement occurs within a block ' - 'defined by a\n' - 'class or function definition or at the module level (the ' - 'top-level\n' - 'code block).\n' - '\n' - 'If a name is bound in a block, it is a local variable of that ' - 'block,\n' - 'unless declared as "nonlocal" or "global". If a name is ' - 'bound at the\n' - 'module level, it is a global variable. (The variables of the ' - 'module\n' - 'code block are local and global.) If a variable is used in a ' - 'code\n' - 'block but not defined there, it is a *free variable*.\n' - '\n' - 'Each occurrence of a name in the program text refers to the ' - '*binding*\n' - 'of that name established by the following name resolution ' - 'rules.\n' - '\n' - '\n' - 'Resolution of names\n' - '-------------------\n' - '\n' - 'A *scope* defines the visibility of a name within a block. ' - 'If a local\n' - 'variable is defined in a block, its scope includes that ' - 'block. If the\n' - 'definition occurs in a function block, the scope extends to ' - 'any blocks\n' - 'contained within the defining one, unless a contained block ' - 'introduces\n' - 'a different binding for the name.\n' - '\n' - 'When a name is used in a code block, it is resolved using the ' - 'nearest\n' - 'enclosing scope. The set of all such scopes visible to a ' - 'code block\n' - "is called the block's *environment*.\n" - '\n' - 'When a name is not found at all, a "NameError" exception is ' - 'raised. If\n' - 'the current scope is a function scope, and the name refers to ' - 'a local\n' - 'variable that has not yet been bound to a value at the point ' - 'where the\n' - 'name is used, an "UnboundLocalError" exception is raised.\n' - '"UnboundLocalError" is a subclass of "NameError".\n' - '\n' - 'If a name binding operation occurs anywhere within a code ' - 'block, all\n' - 'uses of the name within the block are treated as references ' - 'to the\n' - 'current block. This can lead to errors when a name is used ' - 'within a\n' - 'block before it is bound. This rule is subtle. Python ' - 'lacks\n' - 'declarations and allows name binding operations to occur ' - 'anywhere\n' - 'within a code block. The local variables of a code block can ' - 'be\n' - 'determined by scanning the entire text of the block for name ' - 'binding\n' - 'operations.\n' - '\n' - 'If the "global" statement occurs within a block, all uses of ' - 'the name\n' - 'specified in the statement refer to the binding of that name ' - 'in the\n' - 'top-level namespace. Names are resolved in the top-level ' - 'namespace by\n' - 'searching the global namespace, i.e. the namespace of the ' - 'module\n' - 'containing the code block, and the builtins namespace, the ' - 'namespace\n' - 'of the module "builtins". The global namespace is searched ' - 'first. If\n' - 'the name is not found there, the builtins namespace is ' - 'searched. The\n' - '"global" statement must precede all uses of the name.\n' - '\n' - 'The "global" statement has the same scope as a name binding ' - 'operation\n' - 'in the same block. If the nearest enclosing scope for a free ' - 'variable\n' - 'contains a global statement, the free variable is treated as ' - 'a global.\n' - '\n' - 'The "nonlocal" statement causes corresponding names to refer ' - 'to\n' - 'previously bound variables in the nearest enclosing function ' - 'scope.\n' - '"SyntaxError" is raised at compile time if the given name ' - 'does not\n' - 'exist in any enclosing function scope.\n' - '\n' - 'The namespace for a module is automatically created the first ' - 'time a\n' - 'module is imported. The main module for a script is always ' - 'called\n' - '"__main__".\n' - '\n' - 'Class definition blocks and arguments to "exec()" and ' - '"eval()" are\n' - 'special in the context of name resolution. A class definition ' - 'is an\n' - 'executable statement that may use and define names. These ' - 'references\n' - 'follow the normal rules for name resolution with an exception ' - 'that\n' - 'unbound local variables are looked up in the global ' - 'namespace. The\n' - 'namespace of the class definition becomes the attribute ' - 'dictionary of\n' - 'the class. The scope of names defined in a class block is ' - 'limited to\n' - 'the class block; it does not extend to the code blocks of ' - 'methods --\n' - 'this includes comprehensions and generator expressions since ' - 'they are\n' - 'implemented using a function scope. This means that the ' - 'following\n' - 'will fail:\n' - '\n' - ' class A:\n' - ' a = 42\n' - ' b = list(a + i for i in range(10))\n' - '\n' - '\n' - 'Builtins and restricted execution\n' - '---------------------------------\n' - '\n' - 'The builtins namespace associated with the execution of a ' - 'code block\n' - 'is actually found by looking up the name "__builtins__" in ' - 'its global\n' - 'namespace; this should be a dictionary or a module (in the ' - 'latter case\n' - "the module's dictionary is used). By default, when in the " - '"__main__"\n' - 'module, "__builtins__" is the built-in module "builtins"; ' - 'when in any\n' - 'other module, "__builtins__" is an alias for the dictionary ' - 'of the\n' - '"builtins" module itself. "__builtins__" can be set to a ' - 'user-created\n' - 'dictionary to create a weak form of restricted execution.\n' - '\n' - '**CPython implementation detail:** Users should not touch\n' - '"__builtins__"; it is strictly an implementation detail. ' - 'Users\n' - 'wanting to override values in the builtins namespace should ' - '"import"\n' - 'the "builtins" module and modify its attributes ' - 'appropriately.\n' - '\n' - '\n' - 'Interaction with dynamic features\n' - '---------------------------------\n' - '\n' - 'Name resolution of free variables occurs at runtime, not at ' - 'compile\n' - 'time. This means that the following code will print 42:\n' - '\n' - ' i = 10\n' - ' def f():\n' - ' print(i)\n' - ' i = 42\n' - ' f()\n' - '\n' - 'The "eval()" and "exec()" functions do not have access to the ' - 'full\n' - 'environment for resolving names. Names may be resolved in ' - 'the local\n' - 'and global namespaces of the caller. Free variables are not ' - 'resolved\n' - 'in the nearest enclosing namespace, but in the global ' - 'namespace. [1]\n' - 'The "exec()" and "eval()" functions have optional arguments ' - 'to\n' - 'override the global and local namespace. If only one ' - 'namespace is\n' - 'specified, it is used for both.\n' - '\n' - '\n' - 'Exceptions\n' - '==========\n' - '\n' - 'Exceptions are a means of breaking out of the normal flow of ' - 'control\n' - 'of a code block in order to handle errors or other ' - 'exceptional\n' - 'conditions. An exception is *raised* at the point where the ' - 'error is\n' - 'detected; it may be *handled* by the surrounding code block ' - 'or by any\n' - 'code block that directly or indirectly invoked the code block ' - 'where\n' - 'the error occurred.\n' - '\n' - 'The Python interpreter raises an exception when it detects a ' - 'run-time\n' - 'error (such as division by zero). A Python program can also\n' - 'explicitly raise an exception with the "raise" statement. ' - 'Exception\n' - 'handlers are specified with the "try" ... "except" ' - 'statement. The\n' - '"finally" clause of such a statement can be used to specify ' - 'cleanup\n' - 'code which does not handle the exception, but is executed ' - 'whether an\n' - 'exception occurred or not in the preceding code.\n' - '\n' - 'Python uses the "termination" model of error handling: an ' - 'exception\n' - 'handler can find out what happened and continue execution at ' - 'an outer\n' - 'level, but it cannot repair the cause of the error and retry ' - 'the\n' - 'failing operation (except by re-entering the offending piece ' - 'of code\n' - 'from the top).\n' - '\n' - 'When an exception is not handled at all, the interpreter ' - 'terminates\n' - 'execution of the program, or returns to its interactive main ' - 'loop. In\n' - 'either case, it prints a stack backtrace, except when the ' - 'exception is\n' - '"SystemExit".\n' - '\n' - 'Exceptions are identified by class instances. The "except" ' - 'clause is\n' - 'selected depending on the class of the instance: it must ' - 'reference the\n' - 'class of the instance or a base class thereof. The instance ' - 'can be\n' - 'received by the handler and can carry additional information ' - 'about the\n' - 'exceptional condition.\n' - '\n' - 'Note: Exception messages are not part of the Python API. ' - 'Their\n' - ' contents may change from one version of Python to the next ' - 'without\n' - ' warning and should not be relied on by code which will run ' - 'under\n' - ' multiple versions of the interpreter.\n' - '\n' - 'See also the description of the "try" statement in section ' - '*The try\n' - 'statement* and "raise" statement in section *The raise ' - 'statement*.\n' - '\n' - '-[ Footnotes ]-\n' - '\n' - '[1] This limitation occurs because the code that is executed ' - 'by\n' - ' these operations is not available at the time the module ' - 'is\n' - ' compiled.\n', - 'exprlists': '\n' - 'Expression lists\n' - '****************\n' - '\n' - ' expression_list ::= expression ( "," expression )* ' - '[","]\n' - ' starred_list ::= starred_item ( "," starred_item )* ' - '[","]\n' - ' starred_expression ::= expression | ( starred_item "," )* ' - '[starred_item]\n' - ' starred_item ::= expression | "*" or_expr\n' - '\n' - 'Except when part of a list or set display, an expression ' - 'list\n' - 'containing at least one comma yields a tuple. The length of ' - 'the tuple\n' - 'is the number of expressions in the list. The expressions ' - 'are\n' - 'evaluated from left to right.\n' - '\n' - 'An asterisk "*" denotes *iterable unpacking*. Its operand ' - 'must be an\n' - '*iterable*. The iterable is expanded into a sequence of ' - 'items, which\n' - 'are included in the new tuple, list, or set, at the site of ' - 'the\n' - 'unpacking.\n' - '\n' - 'New in version 3.5: Iterable unpacking in expression lists, ' - 'originally\n' - 'proposed by **PEP 448**.\n' - '\n' - 'The trailing comma is required only to create a single tuple ' - '(a.k.a. a\n' - '*singleton*); it is optional in all other cases. A single ' - 'expression\n' - "without a trailing comma doesn't create a tuple, but rather " - 'yields the\n' - 'value of that expression. (To create an empty tuple, use an ' - 'empty pair\n' - 'of parentheses: "()".)\n', - 'floating': '\n' - 'Floating point literals\n' - '***********************\n' - '\n' - 'Floating point literals are described by the following ' - 'lexical\n' - 'definitions:\n' - '\n' - ' floatnumber ::= pointfloat | exponentfloat\n' - ' pointfloat ::= [intpart] fraction | intpart "."\n' - ' exponentfloat ::= (intpart | pointfloat) exponent\n' - ' intpart ::= digit+\n' - ' fraction ::= "." digit+\n' - ' exponent ::= ("e" | "E") ["+" | "-"] digit+\n' - '\n' - 'Note that the integer and exponent parts are always ' - 'interpreted using\n' - 'radix 10. For example, "077e010" is legal, and denotes the ' - 'same number\n' - 'as "77e10". The allowed range of floating point literals is\n' - 'implementation-dependent. Some examples of floating point ' - 'literals:\n' - '\n' - ' 3.14 10. .001 1e100 3.14e-10 0e0\n' - '\n' - 'Note that numeric literals do not include a sign; a phrase ' - 'like "-1"\n' - 'is actually an expression composed of the unary operator "-" ' - 'and the\n' - 'literal "1".\n', - 'for': '\n' - 'The "for" statement\n' - '*******************\n' - '\n' - 'The "for" statement is used to iterate over the elements of a ' - 'sequence\n' - '(such as a string, tuple or list) or other iterable object:\n' - '\n' - ' for_stmt ::= "for" target_list "in" expression_list ":" suite\n' - ' ["else" ":" suite]\n' - '\n' - 'The expression list is evaluated once; it should yield an iterable\n' - 'object. An iterator is created for the result of the\n' - '"expression_list". The suite is then executed once for each item\n' - 'provided by the iterator, in the order returned by the iterator. ' - 'Each\n' - 'item in turn is assigned to the target list using the standard ' - 'rules\n' - 'for assignments (see *Assignment statements*), and then the suite ' - 'is\n' - 'executed. When the items are exhausted (which is immediately when ' - 'the\n' - 'sequence is empty or an iterator raises a "StopIteration" ' - 'exception),\n' - 'the suite in the "else" clause, if present, is executed, and the ' - 'loop\n' - 'terminates.\n' - '\n' - 'A "break" statement executed in the first suite terminates the ' - 'loop\n' - 'without executing the "else" clause\'s suite. A "continue" ' - 'statement\n' - 'executed in the first suite skips the rest of the suite and ' - 'continues\n' - 'with the next item, or with the "else" clause if there is no next\n' - 'item.\n' - '\n' - 'The for-loop makes assignments to the variables(s) in the target ' - 'list.\n' - 'This overwrites all previous assignments to those variables ' - 'including\n' - 'those made in the suite of the for-loop:\n' - '\n' - ' for i in range(10):\n' - ' print(i)\n' - ' i = 5 # this will not affect the for-loop\n' - ' # because i will be overwritten with the ' - 'next\n' - ' # index in the range\n' - '\n' - 'Names in the target list are not deleted when the loop is ' - 'finished,\n' - 'but if the sequence is empty, they will not have been assigned to ' - 'at\n' - 'all by the loop. Hint: the built-in function "range()" returns an\n' - "iterator of integers suitable to emulate the effect of Pascal's " - '"for i\n' - ':= a to b do"; e.g., "list(range(3))" returns the list "[0, 1, ' - '2]".\n' - '\n' - 'Note: There is a subtlety when the sequence is being modified by ' - 'the\n' - ' loop (this can only occur for mutable sequences, i.e. lists). ' - 'An\n' - ' internal counter is used to keep track of which item is used ' - 'next,\n' - ' and this is incremented on each iteration. When this counter ' - 'has\n' - ' reached the length of the sequence the loop terminates. This ' - 'means\n' - ' that if the suite deletes the current (or a previous) item from ' - 'the\n' - ' sequence, the next item will be skipped (since it gets the index ' - 'of\n' - ' the current item which has already been treated). Likewise, if ' - 'the\n' - ' suite inserts an item in the sequence before the current item, ' - 'the\n' - ' current item will be treated again the next time through the ' - 'loop.\n' - ' This can lead to nasty bugs that can be avoided by making a\n' - ' temporary copy using a slice of the whole sequence, e.g.,\n' - '\n' - ' for x in a[:]:\n' - ' if x < 0: a.remove(x)\n', - 'formatstrings': '\n' - 'Format String Syntax\n' - '********************\n' - '\n' - 'The "str.format()" method and the "Formatter" class share ' - 'the same\n' - 'syntax for format strings (although in the case of ' - '"Formatter",\n' - 'subclasses can define their own format string syntax).\n' - '\n' - 'Format strings contain "replacement fields" surrounded by ' - 'curly braces\n' - '"{}". Anything that is not contained in braces is ' - 'considered literal\n' - 'text, which is copied unchanged to the output. If you ' - 'need to include\n' - 'a brace character in the literal text, it can be escaped ' - 'by doubling:\n' - '"{{" and "}}".\n' - '\n' - 'The grammar for a replacement field is as follows:\n' - '\n' - ' replacement_field ::= "{" [field_name] ["!" ' - 'conversion] [":" format_spec] "}"\n' - ' field_name ::= arg_name ("." attribute_name ' - '| "[" element_index "]")*\n' - ' arg_name ::= [identifier | integer]\n' - ' attribute_name ::= identifier\n' - ' element_index ::= integer | index_string\n' - ' index_string ::= +\n' - ' conversion ::= "r" | "s" | "a"\n' - ' format_spec ::= \n' - '\n' - 'In less formal terms, the replacement field can start ' - 'with a\n' - '*field_name* that specifies the object whose value is to ' - 'be formatted\n' - 'and inserted into the output instead of the replacement ' - 'field. The\n' - '*field_name* is optionally followed by a *conversion* ' - 'field, which is\n' - 'preceded by an exclamation point "\'!\'", and a ' - '*format_spec*, which is\n' - 'preceded by a colon "\':\'". These specify a non-default ' - 'format for the\n' - 'replacement value.\n' - '\n' - 'See also the *Format Specification Mini-Language* ' - 'section.\n' - '\n' - 'The *field_name* itself begins with an *arg_name* that is ' - 'either a\n' - "number or a keyword. If it's a number, it refers to a " - 'positional\n' - "argument, and if it's a keyword, it refers to a named " - 'keyword\n' - 'argument. If the numerical arg_names in a format string ' - 'are 0, 1, 2,\n' - '... in sequence, they can all be omitted (not just some) ' - 'and the\n' - 'numbers 0, 1, 2, ... will be automatically inserted in ' - 'that order.\n' - 'Because *arg_name* is not quote-delimited, it is not ' - 'possible to\n' - 'specify arbitrary dictionary keys (e.g., the strings ' - '"\'10\'" or\n' - '"\':-]\'") within a format string. The *arg_name* can be ' - 'followed by any\n' - 'number of index or attribute expressions. An expression ' - 'of the form\n' - '"\'.name\'" selects the named attribute using ' - '"getattr()", while an\n' - 'expression of the form "\'[index]\'" does an index lookup ' - 'using\n' - '"__getitem__()".\n' - '\n' - 'Changed in version 3.1: The positional argument ' - 'specifiers can be\n' - 'omitted, so "\'{} {}\'" is equivalent to "\'{0} {1}\'".\n' - '\n' - 'Some simple format string examples:\n' - '\n' - ' "First, thou shalt count to {0}" # References first ' - 'positional argument\n' - ' "Bring me a {}" # Implicitly ' - 'references the first positional argument\n' - ' "From {} to {}" # Same as "From {0} ' - 'to {1}"\n' - ' "My quest is {name}" # References keyword ' - "argument 'name'\n" - ' "Weight in tons {0.weight}" # \'weight\' ' - 'attribute of first positional arg\n' - ' "Units destroyed: {players[0]}" # First element of ' - "keyword argument 'players'.\n" - '\n' - 'The *conversion* field causes a type coercion before ' - 'formatting.\n' - 'Normally, the job of formatting a value is done by the ' - '"__format__()"\n' - 'method of the value itself. However, in some cases it is ' - 'desirable to\n' - 'force a type to be formatted as a string, overriding its ' - 'own\n' - 'definition of formatting. By converting the value to a ' - 'string before\n' - 'calling "__format__()", the normal formatting logic is ' - 'bypassed.\n' - '\n' - 'Three conversion flags are currently supported: "\'!s\'" ' - 'which calls\n' - '"str()" on the value, "\'!r\'" which calls "repr()" and ' - '"\'!a\'" which\n' - 'calls "ascii()".\n' - '\n' - 'Some examples:\n' - '\n' - ' "Harold\'s a clever {0!s}" # Calls str() on the ' - 'argument first\n' - ' "Bring out the holy {name!r}" # Calls repr() on the ' - 'argument first\n' - ' "More {!a}" # Calls ascii() on ' - 'the argument first\n' - '\n' - 'The *format_spec* field contains a specification of how ' - 'the value\n' - 'should be presented, including such details as field ' - 'width, alignment,\n' - 'padding, decimal precision and so on. Each value type ' - 'can define its\n' - 'own "formatting mini-language" or interpretation of the ' - '*format_spec*.\n' - '\n' - 'Most built-in types support a common formatting ' - 'mini-language, which\n' - 'is described in the next section.\n' - '\n' - 'A *format_spec* field can also include nested replacement ' - 'fields\n' - 'within it. These nested replacement fields may contain a ' - 'field name,\n' - 'conversion flag and format specification, but deeper ' - 'nesting is not\n' - 'allowed. The replacement fields within the format_spec ' - 'are\n' - 'substituted before the *format_spec* string is ' - 'interpreted. This\n' - 'allows the formatting of a value to be dynamically ' - 'specified.\n' - '\n' - 'See the *Format examples* section for some examples.\n' - '\n' - '\n' - 'Format Specification Mini-Language\n' - '==================================\n' - '\n' - '"Format specifications" are used within replacement ' - 'fields contained\n' - 'within a format string to define how individual values ' - 'are presented\n' - '(see *Format String Syntax*). They can also be passed ' - 'directly to the\n' - 'built-in "format()" function. Each formattable type may ' - 'define how\n' - 'the format specification is to be interpreted.\n' - '\n' - 'Most built-in types implement the following options for ' - 'format\n' - 'specifications, although some of the formatting options ' - 'are only\n' - 'supported by the numeric types.\n' - '\n' - 'A general convention is that an empty format string ' - '("""") produces\n' - 'the same result as if you had called "str()" on the ' - 'value. A non-empty\n' - 'format string typically modifies the result.\n' - '\n' - 'The general form of a *standard format specifier* is:\n' - '\n' - ' format_spec ::= ' - '[[fill]align][sign][#][0][width][,][.precision][type]\n' - ' fill ::= \n' - ' align ::= "<" | ">" | "=" | "^"\n' - ' sign ::= "+" | "-" | " "\n' - ' width ::= integer\n' - ' precision ::= integer\n' - ' type ::= "b" | "c" | "d" | "e" | "E" | "f" | ' - '"F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"\n' - '\n' - 'If a valid *align* value is specified, it can be preceded ' - 'by a *fill*\n' - 'character that can be any character and defaults to a ' - 'space if\n' - 'omitted. It is not possible to use a literal curly brace ' - '(""{"" or\n' - '""}"") as the *fill* character when using the ' - '"str.format()" method.\n' - 'However, it is possible to insert a curly brace with a ' - 'nested\n' - "replacement field. This limitation doesn't affect the " - '"format()"\n' - 'function.\n' - '\n' - 'The meaning of the various alignment options is as ' - 'follows:\n' - '\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - ' | Option | ' - 'Meaning ' - '|\n' - ' ' - '+===========+============================================================+\n' - ' | "\'<\'" | Forces the field to be left-aligned ' - 'within the available |\n' - ' | | space (this is the default for most ' - 'objects). |\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - ' | "\'>\'" | Forces the field to be right-aligned ' - 'within the available |\n' - ' | | space (this is the default for ' - 'numbers). |\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - ' | "\'=\'" | Forces the padding to be placed after ' - 'the sign (if any) |\n' - ' | | but before the digits. This is used for ' - 'printing fields |\n' - " | | in the form '+000000120'. This alignment " - 'option is only |\n' - ' | | valid for numeric types. It becomes the ' - "default when '0' |\n" - ' | | immediately precedes the field ' - 'width. |\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - ' | "\'^\'" | Forces the field to be centered within ' - 'the available |\n' - ' | | ' - 'space. ' - '|\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - '\n' - 'Note that unless a minimum field width is defined, the ' - 'field width\n' - 'will always be the same size as the data to fill it, so ' - 'that the\n' - 'alignment option has no meaning in this case.\n' - '\n' - 'The *sign* option is only valid for number types, and can ' - 'be one of\n' - 'the following:\n' - '\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - ' | Option | ' - 'Meaning ' - '|\n' - ' ' - '+===========+============================================================+\n' - ' | "\'+\'" | indicates that a sign should be used ' - 'for both positive as |\n' - ' | | well as negative ' - 'numbers. |\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - ' | "\'-\'" | indicates that a sign should be used ' - 'only for negative |\n' - ' | | numbers (this is the default ' - 'behavior). |\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - ' | space | indicates that a leading space should be ' - 'used on positive |\n' - ' | | numbers, and a minus sign on negative ' - 'numbers. |\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - '\n' - 'The "\'#\'" option causes the "alternate form" to be used ' - 'for the\n' - 'conversion. The alternate form is defined differently ' - 'for different\n' - 'types. This option is only valid for integer, float, ' - 'complex and\n' - 'Decimal types. For integers, when binary, octal, or ' - 'hexadecimal output\n' - 'is used, this option adds the prefix respective "\'0b\'", ' - '"\'0o\'", or\n' - '"\'0x\'" to the output value. For floats, complex and ' - 'Decimal the\n' - 'alternate form causes the result of the conversion to ' - 'always contain a\n' - 'decimal-point character, even if no digits follow it. ' - 'Normally, a\n' - 'decimal-point character appears in the result of these ' - 'conversions\n' - 'only if a digit follows it. In addition, for "\'g\'" and ' - '"\'G\'"\n' - 'conversions, trailing zeros are not removed from the ' - 'result.\n' - '\n' - 'The "\',\'" option signals the use of a comma for a ' - 'thousands separator.\n' - 'For a locale aware separator, use the "\'n\'" integer ' - 'presentation type\n' - 'instead.\n' - '\n' - 'Changed in version 3.1: Added the "\',\'" option (see ' - 'also **PEP 378**).\n' - '\n' - '*width* is a decimal integer defining the minimum field ' - 'width. If not\n' - 'specified, then the field width will be determined by the ' - 'content.\n' - '\n' - 'When no explicit alignment is given, preceding the ' - '*width* field by a\n' - 'zero ("\'0\'") character enables sign-aware zero-padding ' - 'for numeric\n' - 'types. This is equivalent to a *fill* character of ' - '"\'0\'" with an\n' - '*alignment* type of "\'=\'".\n' - '\n' - 'The *precision* is a decimal number indicating how many ' - 'digits should\n' - 'be displayed after the decimal point for a floating point ' - 'value\n' - 'formatted with "\'f\'" and "\'F\'", or before and after ' - 'the decimal point\n' - 'for a floating point value formatted with "\'g\'" or ' - '"\'G\'". For non-\n' - 'number types the field indicates the maximum field size - ' - 'in other\n' - 'words, how many characters will be used from the field ' - 'content. The\n' - '*precision* is not allowed for integer values.\n' - '\n' - 'Finally, the *type* determines how the data should be ' - 'presented.\n' - '\n' - 'The available string presentation types are:\n' - '\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - ' | Type | ' - 'Meaning ' - '|\n' - ' ' - '+===========+============================================================+\n' - ' | "\'s\'" | String format. This is the default ' - 'type for strings and |\n' - ' | | may be ' - 'omitted. |\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - ' | None | The same as ' - '"\'s\'". |\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - '\n' - 'The available integer presentation types are:\n' - '\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - ' | Type | ' - 'Meaning ' - '|\n' - ' ' - '+===========+============================================================+\n' - ' | "\'b\'" | Binary format. Outputs the number in ' - 'base 2. |\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - ' | "\'c\'" | Character. Converts the integer to the ' - 'corresponding |\n' - ' | | unicode character before ' - 'printing. |\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - ' | "\'d\'" | Decimal Integer. Outputs the number in ' - 'base 10. |\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - ' | "\'o\'" | Octal format. Outputs the number in ' - 'base 8. |\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - ' | "\'x\'" | Hex format. Outputs the number in base ' - '16, using lower- |\n' - ' | | case letters for the digits above ' - '9. |\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - ' | "\'X\'" | Hex format. Outputs the number in base ' - '16, using upper- |\n' - ' | | case letters for the digits above ' - '9. |\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - ' | "\'n\'" | Number. This is the same as "\'d\'", ' - 'except that it uses the |\n' - ' | | current locale setting to insert the ' - 'appropriate number |\n' - ' | | separator ' - 'characters. |\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - ' | None | The same as ' - '"\'d\'". |\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - '\n' - 'In addition to the above presentation types, integers can ' - 'be formatted\n' - 'with the floating point presentation types listed below ' - '(except "\'n\'"\n' - 'and "None"). When doing so, "float()" is used to convert ' - 'the integer\n' - 'to a floating point number before formatting.\n' - '\n' - 'The available presentation types for floating point and ' - 'decimal values\n' - 'are:\n' - '\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - ' | Type | ' - 'Meaning ' - '|\n' - ' ' - '+===========+============================================================+\n' - ' | "\'e\'" | Exponent notation. Prints the number ' - 'in scientific |\n' - " | | notation using the letter 'e' to " - 'indicate the exponent. |\n' - ' | | The default precision is ' - '"6". |\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - ' | "\'E\'" | Exponent notation. Same as "\'e\'" ' - 'except it uses an upper |\n' - " | | case 'E' as the separator " - 'character. |\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - ' | "\'f\'" | Fixed point. Displays the number as a ' - 'fixed-point number. |\n' - ' | | The default precision is ' - '"6". |\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - ' | "\'F\'" | Fixed point. Same as "\'f\'", but ' - 'converts "nan" to "NAN" |\n' - ' | | and "inf" to ' - '"INF". |\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - ' | "\'g\'" | General format. For a given precision ' - '"p >= 1", this |\n' - ' | | rounds the number to "p" significant ' - 'digits and then |\n' - ' | | formats the result in either fixed-point ' - 'format or in |\n' - ' | | scientific notation, depending on its ' - 'magnitude. The |\n' - ' | | precise rules are as follows: suppose ' - 'that the result |\n' - ' | | formatted with presentation type "\'e\'" ' - 'and precision "p-1" |\n' - ' | | would have exponent "exp". Then if "-4 ' - '<= exp < p", the |\n' - ' | | number is formatted with presentation ' - 'type "\'f\'" and |\n' - ' | | precision "p-1-exp". Otherwise, the ' - 'number is formatted |\n' - ' | | with presentation type "\'e\'" and ' - 'precision "p-1". In both |\n' - ' | | cases insignificant trailing zeros are ' - 'removed from the |\n' - ' | | significand, and the decimal point is ' - 'also removed if |\n' - ' | | there are no remaining digits following ' - 'it. Positive and |\n' - ' | | negative infinity, positive and negative ' - 'zero, and nans, |\n' - ' | | are formatted as "inf", "-inf", "0", ' - '"-0" and "nan" |\n' - ' | | respectively, regardless of the ' - 'precision. A precision of |\n' - ' | | "0" is treated as equivalent to a ' - 'precision of "1". The |\n' - ' | | default precision is ' - '"6". |\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - ' | "\'G\'" | General format. Same as "\'g\'" except ' - 'switches to "\'E\'" if |\n' - ' | | the number gets too large. The ' - 'representations of infinity |\n' - ' | | and NaN are uppercased, ' - 'too. |\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - ' | "\'n\'" | Number. This is the same as "\'g\'", ' - 'except that it uses the |\n' - ' | | current locale setting to insert the ' - 'appropriate number |\n' - ' | | separator ' - 'characters. |\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - ' | "\'%\'" | Percentage. Multiplies the number by ' - '100 and displays in |\n' - ' | | fixed ("\'f\'") format, followed by a ' - 'percent sign. |\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - ' | None | Similar to "\'g\'", except that ' - 'fixed-point notation, when |\n' - ' | | used, has at least one digit past the ' - 'decimal point. The |\n' - ' | | default precision is as high as needed ' - 'to represent the |\n' - ' | | particular value. The overall effect is ' - 'to match the |\n' - ' | | output of "str()" as altered by the ' - 'other format |\n' - ' | | ' - 'modifiers. ' - '|\n' - ' ' - '+-----------+------------------------------------------------------------+\n' - '\n' - '\n' - 'Format examples\n' - '===============\n' - '\n' - 'This section contains examples of the "str.format()" ' - 'syntax and\n' - 'comparison with the old "%"-formatting.\n' - '\n' - 'In most of the cases the syntax is similar to the old ' - '"%"-formatting,\n' - 'with the addition of the "{}" and with ":" used instead ' - 'of "%". For\n' - 'example, "\'%03.2f\'" can be translated to ' - '"\'{:03.2f}\'".\n' - '\n' - 'The new format syntax also supports new and different ' - 'options, shown\n' - 'in the follow examples.\n' - '\n' - 'Accessing arguments by position:\n' - '\n' - " >>> '{0}, {1}, {2}'.format('a', 'b', 'c')\n" - " 'a, b, c'\n" - " >>> '{}, {}, {}'.format('a', 'b', 'c') # 3.1+ only\n" - " 'a, b, c'\n" - " >>> '{2}, {1}, {0}'.format('a', 'b', 'c')\n" - " 'c, b, a'\n" - " >>> '{2}, {1}, {0}'.format(*'abc') # unpacking " - 'argument sequence\n' - " 'c, b, a'\n" - " >>> '{0}{1}{0}'.format('abra', 'cad') # arguments' " - 'indices can be repeated\n' - " 'abracadabra'\n" - '\n' - 'Accessing arguments by name:\n' - '\n' - " >>> 'Coordinates: {latitude}, " - "{longitude}'.format(latitude='37.24N', " - "longitude='-115.81W')\n" - " 'Coordinates: 37.24N, -115.81W'\n" - " >>> coord = {'latitude': '37.24N', 'longitude': " - "'-115.81W'}\n" - " >>> 'Coordinates: {latitude}, " - "{longitude}'.format(**coord)\n" - " 'Coordinates: 37.24N, -115.81W'\n" - '\n' - "Accessing arguments' attributes:\n" - '\n' - ' >>> c = 3-5j\n' - " >>> ('The complex number {0} is formed from the real " - "part {0.real} '\n" - " ... 'and the imaginary part {0.imag}.').format(c)\n" - " 'The complex number (3-5j) is formed from the real " - "part 3.0 and the imaginary part -5.0.'\n" - ' >>> class Point:\n' - ' ... def __init__(self, x, y):\n' - ' ... self.x, self.y = x, y\n' - ' ... def __str__(self):\n' - " ... return 'Point({self.x}, " - "{self.y})'.format(self=self)\n" - ' ...\n' - ' >>> str(Point(4, 2))\n' - " 'Point(4, 2)'\n" - '\n' - "Accessing arguments' items:\n" - '\n' - ' >>> coord = (3, 5)\n' - " >>> 'X: {0[0]}; Y: {0[1]}'.format(coord)\n" - " 'X: 3; Y: 5'\n" - '\n' - 'Replacing "%s" and "%r":\n' - '\n' - ' >>> "repr() shows quotes: {!r}; str() doesn\'t: ' - '{!s}".format(\'test1\', \'test2\')\n' - ' "repr() shows quotes: \'test1\'; str() doesn\'t: ' - 'test2"\n' - '\n' - 'Aligning the text and specifying a width:\n' - '\n' - " >>> '{:<30}'.format('left aligned')\n" - " 'left aligned '\n" - " >>> '{:>30}'.format('right aligned')\n" - " ' right aligned'\n" - " >>> '{:^30}'.format('centered')\n" - " ' centered '\n" - " >>> '{:*^30}'.format('centered') # use '*' as a fill " - 'char\n' - " '***********centered***********'\n" - '\n' - 'Replacing "%+f", "%-f", and "% f" and specifying a sign:\n' - '\n' - " >>> '{:+f}; {:+f}'.format(3.14, -3.14) # show it " - 'always\n' - " '+3.140000; -3.140000'\n" - " >>> '{: f}; {: f}'.format(3.14, -3.14) # show a space " - 'for positive numbers\n' - " ' 3.140000; -3.140000'\n" - " >>> '{:-f}; {:-f}'.format(3.14, -3.14) # show only " - "the minus -- same as '{:f}; {:f}'\n" - " '3.140000; -3.140000'\n" - '\n' - 'Replacing "%x" and "%o" and converting the value to ' - 'different bases:\n' - '\n' - ' >>> # format also supports binary numbers\n' - ' >>> "int: {0:d}; hex: {0:x}; oct: {0:o}; bin: ' - '{0:b}".format(42)\n' - " 'int: 42; hex: 2a; oct: 52; bin: 101010'\n" - ' >>> # with 0x, 0o, or 0b as prefix:\n' - ' >>> "int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: ' - '{0:#b}".format(42)\n' - " 'int: 42; hex: 0x2a; oct: 0o52; bin: 0b101010'\n" - '\n' - 'Using the comma as a thousands separator:\n' - '\n' - " >>> '{:,}'.format(1234567890)\n" - " '1,234,567,890'\n" - '\n' - 'Expressing a percentage:\n' - '\n' - ' >>> points = 19\n' - ' >>> total = 22\n' - " >>> 'Correct answers: {:.2%}'.format(points/total)\n" - " 'Correct answers: 86.36%'\n" - '\n' - 'Using type-specific formatting:\n' - '\n' - ' >>> import datetime\n' - ' >>> d = datetime.datetime(2010, 7, 4, 12, 15, 58)\n' - " >>> '{:%Y-%m-%d %H:%M:%S}'.format(d)\n" - " '2010-07-04 12:15:58'\n" - '\n' - 'Nesting arguments and more complex examples:\n' - '\n' - " >>> for align, text in zip('<^>', ['left', 'center', " - "'right']):\n" - " ... '{0:{fill}{align}16}'.format(text, fill=align, " - 'align=align)\n' - ' ...\n' - " 'left<<<<<<<<<<<<'\n" - " '^^^^^center^^^^^'\n" - " '>>>>>>>>>>>right'\n" - ' >>>\n' - ' >>> octets = [192, 168, 0, 1]\n' - " >>> '{:02X}{:02X}{:02X}{:02X}'.format(*octets)\n" - " 'C0A80001'\n" - ' >>> int(_, 16)\n' - ' 3232235521\n' - ' >>>\n' - ' >>> width = 5\n' - ' >>> for num in range(5,12): #doctest: ' - '+NORMALIZE_WHITESPACE\n' - " ... for base in 'dXob':\n" - " ... print('{0:{width}{base}}'.format(num, " - "base=base, width=width), end=' ')\n" - ' ... print()\n' - ' ...\n' - ' 5 5 5 101\n' - ' 6 6 6 110\n' - ' 7 7 7 111\n' - ' 8 8 10 1000\n' - ' 9 9 11 1001\n' - ' 10 A 12 1010\n' - ' 11 B 13 1011\n', - 'function': '\n' - 'Function definitions\n' - '********************\n' - '\n' - 'A function definition defines a user-defined function object ' - '(see\n' - 'section *The standard type hierarchy*):\n' - '\n' - ' funcdef ::= [decorators] "def" funcname "(" ' - '[parameter_list] ")" ["->" expression] ":" suite\n' - ' decorators ::= decorator+\n' - ' decorator ::= "@" dotted_name ["(" [argument_list ' - '[","]] ")"] NEWLINE\n' - ' dotted_name ::= identifier ("." identifier)*\n' - ' parameter_list ::= (defparameter ",")*\n' - ' | "*" [parameter] ("," defparameter)* ' - '["," "**" parameter]\n' - ' | "**" parameter\n' - ' | defparameter [","] )\n' - ' parameter ::= identifier [":" expression]\n' - ' defparameter ::= parameter ["=" expression]\n' - ' funcname ::= identifier\n' - '\n' - 'A function definition is an executable statement. Its ' - 'execution binds\n' - 'the function name in the current local namespace to a function ' - 'object\n' - '(a wrapper around the executable code for the function). ' - 'This\n' - 'function object contains a reference to the current global ' - 'namespace\n' - 'as the global namespace to be used when the function is ' - 'called.\n' - '\n' - 'The function definition does not execute the function body; ' - 'this gets\n' - 'executed only when the function is called. [3]\n' - '\n' - 'A function definition may be wrapped by one or more ' - '*decorator*\n' - 'expressions. Decorator expressions are evaluated when the ' - 'function is\n' - 'defined, in the scope that contains the function definition. ' - 'The\n' - 'result must be a callable, which is invoked with the function ' - 'object\n' - 'as the only argument. The returned value is bound to the ' - 'function name\n' - 'instead of the function object. Multiple decorators are ' - 'applied in\n' - 'nested fashion. For example, the following code\n' - '\n' - ' @f1(arg)\n' - ' @f2\n' - ' def func(): pass\n' - '\n' - 'is roughly equivalent to\n' - '\n' - ' def func(): pass\n' - ' func = f1(arg)(f2(func))\n' - '\n' - 'except that the original function is not temporarily bound to ' - 'the name\n' - '"func".\n' - '\n' - 'When one or more *parameters* have the form *parameter* "="\n' - '*expression*, the function is said to have "default parameter ' - 'values."\n' - 'For a parameter with a default value, the corresponding ' - '*argument* may\n' - "be omitted from a call, in which case the parameter's default " - 'value is\n' - 'substituted. If a parameter has a default value, all ' - 'following\n' - 'parameters up until the ""*"" must also have a default value ' - '--- this\n' - 'is a syntactic restriction that is not expressed by the ' - 'grammar.\n' - '\n' - '**Default parameter values are evaluated from left to right ' - 'when the\n' - 'function definition is executed.** This means that the ' - 'expression is\n' - 'evaluated once, when the function is defined, and that the ' - 'same "pre-\n' - 'computed" value is used for each call. This is especially ' - 'important\n' - 'to understand when a default parameter is a mutable object, ' - 'such as a\n' - 'list or a dictionary: if the function modifies the object ' - '(e.g. by\n' - 'appending an item to a list), the default value is in effect ' - 'modified.\n' - 'This is generally not what was intended. A way around this is ' - 'to use\n' - '"None" as the default, and explicitly test for it in the body ' - 'of the\n' - 'function, e.g.:\n' - '\n' - ' def whats_on_the_telly(penguin=None):\n' - ' if penguin is None:\n' - ' penguin = []\n' - ' penguin.append("property of the zoo")\n' - ' return penguin\n' - '\n' - 'Function call semantics are described in more detail in ' - 'section\n' - '*Calls*. A function call always assigns values to all ' - 'parameters\n' - 'mentioned in the parameter list, either from position ' - 'arguments, from\n' - 'keyword arguments, or from default values. If the form\n' - '""*identifier"" is present, it is initialized to a tuple ' - 'receiving any\n' - 'excess positional parameters, defaulting to the empty tuple. ' - 'If the\n' - 'form ""**identifier"" is present, it is initialized to a new\n' - 'dictionary receiving any excess keyword arguments, defaulting ' - 'to a new\n' - 'empty dictionary. Parameters after ""*"" or ""*identifier"" ' - 'are\n' - 'keyword-only parameters and may only be passed used keyword ' - 'arguments.\n' - '\n' - 'Parameters may have annotations of the form "": expression"" ' - 'following\n' - 'the parameter name. Any parameter may have an annotation even ' - 'those\n' - 'of the form "*identifier" or "**identifier". Functions may ' - 'have\n' - '"return" annotation of the form ""-> expression"" after the ' - 'parameter\n' - 'list. These annotations can be any valid Python expression ' - 'and are\n' - 'evaluated when the function definition is executed. ' - 'Annotations may\n' - 'be evaluated in a different order than they appear in the ' - 'source code.\n' - 'The presence of annotations does not change the semantics of ' - 'a\n' - 'function. The annotation values are available as values of a\n' - "dictionary keyed by the parameters' names in the " - '"__annotations__"\n' - 'attribute of the function object.\n' - '\n' - 'It is also possible to create anonymous functions (functions ' - 'not bound\n' - 'to a name), for immediate use in expressions. This uses ' - 'lambda\n' - 'expressions, described in section *Lambdas*. Note that the ' - 'lambda\n' - 'expression is merely a shorthand for a simplified function ' - 'definition;\n' - 'a function defined in a ""def"" statement can be passed around ' - 'or\n' - 'assigned to another name just like a function defined by a ' - 'lambda\n' - 'expression. The ""def"" form is actually more powerful since ' - 'it\n' - 'allows the execution of multiple statements and annotations.\n' - '\n' - "**Programmer's note:** Functions are first-class objects. A " - '""def""\n' - 'statement executed inside a function definition defines a ' - 'local\n' - 'function that can be returned or passed around. Free ' - 'variables used\n' - 'in the nested function can access the local variables of the ' - 'function\n' - 'containing the def. See section *Naming and binding* for ' - 'details.\n' - '\n' - 'See also: **PEP 3107** - Function Annotations\n' - '\n' - ' The original specification for function annotations.\n', - 'global': '\n' - 'The "global" statement\n' - '**********************\n' - '\n' - ' global_stmt ::= "global" identifier ("," identifier)*\n' - '\n' - 'The "global" statement is a declaration which holds for the ' - 'entire\n' - 'current code block. It means that the listed identifiers are to ' - 'be\n' - 'interpreted as globals. It would be impossible to assign to a ' - 'global\n' - 'variable without "global", although free variables may refer to\n' - 'globals without being declared global.\n' - '\n' - 'Names listed in a "global" statement must not be used in the ' - 'same code\n' - 'block textually preceding that "global" statement.\n' - '\n' - 'Names listed in a "global" statement must not be defined as ' - 'formal\n' - 'parameters or in a "for" loop control target, "class" ' - 'definition,\n' - 'function definition, or "import" statement.\n' - '\n' - '**CPython implementation detail:** The current implementation ' - 'does not\n' - 'enforce the two restrictions, but programs should not abuse ' - 'this\n' - 'freedom, as future implementations may enforce them or silently ' - 'change\n' - 'the meaning of the program.\n' - '\n' - '**Programmer\'s note:** "global" is a directive to the parser. ' - 'It\n' - 'applies only to code parsed at the same time as the "global"\n' - 'statement. In particular, a "global" statement contained in a ' - 'string\n' - 'or code object supplied to the built-in "exec()" function does ' - 'not\n' - 'affect the code block *containing* the function call, and code\n' - 'contained in such a string is unaffected by "global" statements ' - 'in the\n' - 'code containing the function call. The same applies to the ' - '"eval()"\n' - 'and "compile()" functions.\n', - 'id-classes': '\n' - 'Reserved classes of identifiers\n' - '*******************************\n' - '\n' - 'Certain classes of identifiers (besides keywords) have ' - 'special\n' - 'meanings. These classes are identified by the patterns of ' - 'leading and\n' - 'trailing underscore characters:\n' - '\n' - '"_*"\n' - ' Not imported by "from module import *". The special ' - 'identifier "_"\n' - ' is used in the interactive interpreter to store the ' - 'result of the\n' - ' last evaluation; it is stored in the "builtins" module. ' - 'When not\n' - ' in interactive mode, "_" has no special meaning and is ' - 'not defined.\n' - ' See section *The import statement*.\n' - '\n' - ' Note: The name "_" is often used in conjunction with\n' - ' internationalization; refer to the documentation for ' - 'the\n' - ' "gettext" module for more information on this ' - 'convention.\n' - '\n' - '"__*__"\n' - ' System-defined names. These names are defined by the ' - 'interpreter\n' - ' and its implementation (including the standard library). ' - 'Current\n' - ' system names are discussed in the *Special method names* ' - 'section\n' - ' and elsewhere. More will likely be defined in future ' - 'versions of\n' - ' Python. *Any* use of "__*__" names, in any context, that ' - 'does not\n' - ' follow explicitly documented use, is subject to breakage ' - 'without\n' - ' warning.\n' - '\n' - '"__*"\n' - ' Class-private names. Names in this category, when used ' - 'within the\n' - ' context of a class definition, are re-written to use a ' - 'mangled form\n' - ' to help avoid name clashes between "private" attributes ' - 'of base and\n' - ' derived classes. See section *Identifiers (Names)*.\n', - 'identifiers': '\n' - 'Identifiers and keywords\n' - '************************\n' - '\n' - 'Identifiers (also referred to as *names*) are described by ' - 'the\n' - 'following lexical definitions.\n' - '\n' - 'The syntax of identifiers in Python is based on the Unicode ' - 'standard\n' - 'annex UAX-31, with elaboration and changes as defined ' - 'below; see also\n' - '**PEP 3131** for further details.\n' - '\n' - 'Within the ASCII range (U+0001..U+007F), the valid ' - 'characters for\n' - 'identifiers are the same as in Python 2.x: the uppercase ' - 'and lowercase\n' - 'letters "A" through "Z", the underscore "_" and, except for ' - 'the first\n' - 'character, the digits "0" through "9".\n' - '\n' - 'Python 3.0 introduces additional characters from outside ' - 'the ASCII\n' - 'range (see **PEP 3131**). For these characters, the ' - 'classification\n' - 'uses the version of the Unicode Character Database as ' - 'included in the\n' - '"unicodedata" module.\n' - '\n' - 'Identifiers are unlimited in length. Case is significant.\n' - '\n' - ' identifier ::= xid_start xid_continue*\n' - ' id_start ::= \n' - ' id_continue ::= \n' - ' xid_start ::= \n' - ' xid_continue ::= \n' - '\n' - 'The Unicode category codes mentioned above stand for:\n' - '\n' - '* *Lu* - uppercase letters\n' - '\n' - '* *Ll* - lowercase letters\n' - '\n' - '* *Lt* - titlecase letters\n' - '\n' - '* *Lm* - modifier letters\n' - '\n' - '* *Lo* - other letters\n' - '\n' - '* *Nl* - letter numbers\n' - '\n' - '* *Mn* - nonspacing marks\n' - '\n' - '* *Mc* - spacing combining marks\n' - '\n' - '* *Nd* - decimal numbers\n' - '\n' - '* *Pc* - connector punctuations\n' - '\n' - '* *Other_ID_Start* - explicit list of characters in ' - 'PropList.txt to\n' - ' support backwards compatibility\n' - '\n' - '* *Other_ID_Continue* - likewise\n' - '\n' - 'All identifiers are converted into the normal form NFKC ' - 'while parsing;\n' - 'comparison of identifiers is based on NFKC.\n' - '\n' - 'A non-normative HTML file listing all valid identifier ' - 'characters for\n' - 'Unicode 4.1 can be found at https://www.dcl.hpi.uni-\n' - 'potsdam.de/home/loewis/table-3131.html.\n' - '\n' - '\n' - 'Keywords\n' - '========\n' - '\n' - 'The following identifiers are used as reserved words, or ' - '*keywords* of\n' - 'the language, and cannot be used as ordinary identifiers. ' - 'They must\n' - 'be spelled exactly as written here:\n' - '\n' - ' False class finally is return\n' - ' None continue for lambda try\n' - ' True def from nonlocal while\n' - ' and del global not with\n' - ' as elif if or yield\n' - ' assert else import pass\n' - ' break except in raise\n' - '\n' - '\n' - 'Reserved classes of identifiers\n' - '===============================\n' - '\n' - 'Certain classes of identifiers (besides keywords) have ' - 'special\n' - 'meanings. These classes are identified by the patterns of ' - 'leading and\n' - 'trailing underscore characters:\n' - '\n' - '"_*"\n' - ' Not imported by "from module import *". The special ' - 'identifier "_"\n' - ' is used in the interactive interpreter to store the ' - 'result of the\n' - ' last evaluation; it is stored in the "builtins" module. ' - 'When not\n' - ' in interactive mode, "_" has no special meaning and is ' - 'not defined.\n' - ' See section *The import statement*.\n' - '\n' - ' Note: The name "_" is often used in conjunction with\n' - ' internationalization; refer to the documentation for ' - 'the\n' - ' "gettext" module for more information on this ' - 'convention.\n' - '\n' - '"__*__"\n' - ' System-defined names. These names are defined by the ' - 'interpreter\n' - ' and its implementation (including the standard ' - 'library). Current\n' - ' system names are discussed in the *Special method names* ' - 'section\n' - ' and elsewhere. More will likely be defined in future ' - 'versions of\n' - ' Python. *Any* use of "__*__" names, in any context, ' - 'that does not\n' - ' follow explicitly documented use, is subject to breakage ' - 'without\n' - ' warning.\n' - '\n' - '"__*"\n' - ' Class-private names. Names in this category, when used ' - 'within the\n' - ' context of a class definition, are re-written to use a ' - 'mangled form\n' - ' to help avoid name clashes between "private" attributes ' - 'of base and\n' - ' derived classes. See section *Identifiers (Names)*.\n', - 'if': '\n' - 'The "if" statement\n' - '******************\n' - '\n' - 'The "if" statement is used for conditional execution:\n' - '\n' - ' if_stmt ::= "if" expression ":" suite\n' - ' ( "elif" expression ":" suite )*\n' - ' ["else" ":" suite]\n' - '\n' - 'It selects exactly one of the suites by evaluating the expressions ' - 'one\n' - 'by one until one is found to be true (see section *Boolean ' - 'operations*\n' - 'for the definition of true and false); then that suite is executed\n' - '(and no other part of the "if" statement is executed or evaluated).\n' - 'If all expressions are false, the suite of the "else" clause, if\n' - 'present, is executed.\n', - 'imaginary': '\n' - 'Imaginary literals\n' - '******************\n' - '\n' - 'Imaginary literals are described by the following lexical ' - 'definitions:\n' - '\n' - ' imagnumber ::= (floatnumber | intpart) ("j" | "J")\n' - '\n' - 'An imaginary literal yields a complex number with a real part ' - 'of 0.0.\n' - 'Complex numbers are represented as a pair of floating point ' - 'numbers\n' - 'and have the same restrictions on their range. To create a ' - 'complex\n' - 'number with a nonzero real part, add a floating point number ' - 'to it,\n' - 'e.g., "(3+4j)". Some examples of imaginary literals:\n' - '\n' - ' 3.14j 10.j 10j .001j 1e100j 3.14e-10j\n', - 'import': '\n' - 'The "import" statement\n' - '**********************\n' - '\n' - ' import_stmt ::= "import" module ["as" name] ( "," module ' - '["as" name] )*\n' - ' | "from" relative_module "import" identifier ' - '["as" name]\n' - ' ( "," identifier ["as" name] )*\n' - ' | "from" relative_module "import" "(" ' - 'identifier ["as" name]\n' - ' ( "," identifier ["as" name] )* [","] ")"\n' - ' | "from" module "import" "*"\n' - ' module ::= (identifier ".")* identifier\n' - ' relative_module ::= "."* module | "."+\n' - ' name ::= identifier\n' - '\n' - 'The basic import statement (no "from" clause) is executed in ' - 'two\n' - 'steps:\n' - '\n' - '1. find a module, loading and initializing it if necessary\n' - '\n' - '2. define a name or names in the local namespace for the scope\n' - ' where the "import" statement occurs.\n' - '\n' - 'When the statement contains multiple clauses (separated by ' - 'commas) the\n' - 'two steps are carried out separately for each clause, just as ' - 'though\n' - 'the clauses had been separated out into individual import ' - 'statements.\n' - '\n' - 'The details of the first step, finding and loading modules are\n' - 'described in greater detail in the section on the *import ' - 'system*,\n' - 'which also describes the various types of packages and modules ' - 'that\n' - 'can be imported, as well as all the hooks that can be used to\n' - 'customize the import system. Note that failures in this step ' - 'may\n' - 'indicate either that the module could not be located, *or* that ' - 'an\n' - 'error occurred while initializing the module, which includes ' - 'execution\n' - "of the module's code.\n" - '\n' - 'If the requested module is retrieved successfully, it will be ' - 'made\n' - 'available in the local namespace in one of three ways:\n' - '\n' - '* If the module name is followed by "as", then the name ' - 'following\n' - ' "as" is bound directly to the imported module.\n' - '\n' - '* If no other name is specified, and the module being imported ' - 'is a\n' - " top level module, the module's name is bound in the local " - 'namespace\n' - ' as a reference to the imported module\n' - '\n' - '* If the module being imported is *not* a top level module, then ' - 'the\n' - ' name of the top level package that contains the module is ' - 'bound in\n' - ' the local namespace as a reference to the top level package. ' - 'The\n' - ' imported module must be accessed using its full qualified ' - 'name\n' - ' rather than directly\n' - '\n' - 'The "from" form uses a slightly more complex process:\n' - '\n' - '1. find the module specified in the "from" clause, loading and\n' - ' initializing it if necessary;\n' - '\n' - '2. for each of the identifiers specified in the "import" ' - 'clauses:\n' - '\n' - ' 1. check if the imported module has an attribute by that ' - 'name\n' - '\n' - ' 2. if not, attempt to import a submodule with that name and ' - 'then\n' - ' check the imported module again for that attribute\n' - '\n' - ' 3. if the attribute is not found, "ImportError" is raised.\n' - '\n' - ' 4. otherwise, a reference to that value is stored in the ' - 'local\n' - ' namespace, using the name in the "as" clause if it is ' - 'present,\n' - ' otherwise using the attribute name\n' - '\n' - 'Examples:\n' - '\n' - ' import foo # foo imported and bound locally\n' - ' import foo.bar.baz # foo.bar.baz imported, foo bound ' - 'locally\n' - ' import foo.bar.baz as fbb # foo.bar.baz imported and bound ' - 'as fbb\n' - ' from foo.bar import baz # foo.bar.baz imported and bound ' - 'as baz\n' - ' from foo import attr # foo imported and foo.attr bound ' - 'as attr\n' - '\n' - 'If the list of identifiers is replaced by a star ("\'*\'"), all ' - 'public\n' - 'names defined in the module are bound in the local namespace for ' - 'the\n' - 'scope where the "import" statement occurs.\n' - '\n' - 'The *public names* defined by a module are determined by ' - 'checking the\n' - 'module\'s namespace for a variable named "__all__"; if defined, ' - 'it must\n' - 'be a sequence of strings which are names defined or imported by ' - 'that\n' - 'module. The names given in "__all__" are all considered public ' - 'and\n' - 'are required to exist. If "__all__" is not defined, the set of ' - 'public\n' - "names includes all names found in the module's namespace which " - 'do not\n' - 'begin with an underscore character ("\'_\'"). "__all__" should ' - 'contain\n' - 'the entire public API. It is intended to avoid accidentally ' - 'exporting\n' - 'items that are not part of the API (such as library modules ' - 'which were\n' - 'imported and used within the module).\n' - '\n' - 'The wild card form of import --- "from module import *" --- is ' - 'only\n' - 'allowed at the module level. Attempting to use it in class or\n' - 'function definitions will raise a "SyntaxError".\n' - '\n' - 'When specifying what module to import you do not have to specify ' - 'the\n' - 'absolute name of the module. When a module or package is ' - 'contained\n' - 'within another package it is possible to make a relative import ' - 'within\n' - 'the same top package without having to mention the package name. ' - 'By\n' - 'using leading dots in the specified module or package after ' - '"from" you\n' - 'can specify how high to traverse up the current package ' - 'hierarchy\n' - 'without specifying exact names. One leading dot means the ' - 'current\n' - 'package where the module making the import exists. Two dots ' - 'means up\n' - 'one package level. Three dots is up two levels, etc. So if you ' - 'execute\n' - '"from . import mod" from a module in the "pkg" package then you ' - 'will\n' - 'end up importing "pkg.mod". If you execute "from ..subpkg2 ' - 'import mod"\n' - 'from within "pkg.subpkg1" you will import "pkg.subpkg2.mod". ' - 'The\n' - 'specification for relative imports is contained within **PEP ' - '328**.\n' - '\n' - '"importlib.import_module()" is provided to support applications ' - 'that\n' - 'determine dynamically the modules to be loaded.\n' - '\n' - '\n' - 'Future statements\n' - '=================\n' - '\n' - 'A *future statement* is a directive to the compiler that a ' - 'particular\n' - 'module should be compiled using syntax or semantics that will ' - 'be\n' - 'available in a specified future release of Python where the ' - 'feature\n' - 'becomes standard.\n' - '\n' - 'The future statement is intended to ease migration to future ' - 'versions\n' - 'of Python that introduce incompatible changes to the language. ' - 'It\n' - 'allows use of the new features on a per-module basis before the\n' - 'release in which the feature becomes standard.\n' - '\n' - ' future_statement ::= "from" "__future__" "import" feature ' - '["as" name]\n' - ' ("," feature ["as" name])*\n' - ' | "from" "__future__" "import" "(" ' - 'feature ["as" name]\n' - ' ("," feature ["as" name])* [","] ")"\n' - ' feature ::= identifier\n' - ' name ::= identifier\n' - '\n' - 'A future statement must appear near the top of the module. The ' - 'only\n' - 'lines that can appear before a future statement are:\n' - '\n' - '* the module docstring (if any),\n' - '\n' - '* comments,\n' - '\n' - '* blank lines, and\n' - '\n' - '* other future statements.\n' - '\n' - 'The features recognized by Python 3.0 are "absolute_import",\n' - '"division", "generators", "unicode_literals", "print_function",\n' - '"nested_scopes" and "with_statement". They are all redundant ' - 'because\n' - 'they are always enabled, and only kept for backwards ' - 'compatibility.\n' - '\n' - 'A future statement is recognized and treated specially at ' - 'compile\n' - 'time: Changes to the semantics of core constructs are often\n' - 'implemented by generating different code. It may even be the ' - 'case\n' - 'that a new feature introduces new incompatible syntax (such as a ' - 'new\n' - 'reserved word), in which case the compiler may need to parse ' - 'the\n' - 'module differently. Such decisions cannot be pushed off until\n' - 'runtime.\n' - '\n' - 'For any given release, the compiler knows which feature names ' - 'have\n' - 'been defined, and raises a compile-time error if a future ' - 'statement\n' - 'contains a feature not known to it.\n' - '\n' - 'The direct runtime semantics are the same as for any import ' - 'statement:\n' - 'there is a standard module "__future__", described later, and it ' - 'will\n' - 'be imported in the usual way at the time the future statement ' - 'is\n' - 'executed.\n' - '\n' - 'The interesting runtime semantics depend on the specific ' - 'feature\n' - 'enabled by the future statement.\n' - '\n' - 'Note that there is nothing special about the statement:\n' - '\n' - ' import __future__ [as name]\n' - '\n' - "That is not a future statement; it's an ordinary import " - 'statement with\n' - 'no special semantics or syntax restrictions.\n' - '\n' - 'Code compiled by calls to the built-in functions "exec()" and\n' - '"compile()" that occur in a module "M" containing a future ' - 'statement\n' - 'will, by default, use the new syntax or semantics associated ' - 'with the\n' - 'future statement. This can be controlled by optional arguments ' - 'to\n' - '"compile()" --- see the documentation of that function for ' - 'details.\n' - '\n' - 'A future statement typed at an interactive interpreter prompt ' - 'will\n' - 'take effect for the rest of the interpreter session. If an\n' - 'interpreter is started with the *-i* option, is passed a script ' - 'name\n' - 'to execute, and the script includes a future statement, it will ' - 'be in\n' - 'effect in the interactive session started after the script is\n' - 'executed.\n' - '\n' - 'See also: **PEP 236** - Back to the __future__\n' - '\n' - ' The original proposal for the __future__ mechanism.\n', - 'in': '\n' - 'Membership test operations\n' - '**************************\n' - '\n' - 'The operators "in" and "not in" test for membership. "x in s"\n' - 'evaluates to "True" if *x* is a member of *s*, and "False" ' - 'otherwise.\n' - '"x not in s" returns the negation of "x in s". All built-in ' - 'sequences\n' - 'and set types support this as well as dictionary, for which "in" ' - 'tests\n' - 'whether the dictionary has a given key. For container types such as\n' - 'list, tuple, set, frozenset, dict, or collections.deque, the\n' - 'expression "x in y" is equivalent to "any(x is e or x == e for e in\n' - 'y)".\n' - '\n' - 'For the string and bytes types, "x in y" is "True" if and only if ' - '*x*\n' - 'is a substring of *y*. An equivalent test is "y.find(x) != -1".\n' - 'Empty strings are always considered to be a substring of any other\n' - 'string, so """ in "abc"" will return "True".\n' - '\n' - 'For user-defined classes which define the "__contains__()" method, ' - '"x\n' - 'in y" returns "True" if "y.__contains__(x)" returns a true value, ' - 'and\n' - '"False" otherwise.\n' - '\n' - 'For user-defined classes which do not define "__contains__()" but ' - 'do\n' - 'define "__iter__()", "x in y" is "True" if some value "z" with "x ' - '==\n' - 'z" is produced while iterating over "y". If an exception is raised\n' - 'during the iteration, it is as if "in" raised that exception.\n' - '\n' - 'Lastly, the old-style iteration protocol is tried: if a class ' - 'defines\n' - '"__getitem__()", "x in y" is "True" if and only if there is a non-\n' - 'negative integer index *i* such that "x == y[i]", and all lower\n' - 'integer indices do not raise "IndexError" exception. (If any other\n' - 'exception is raised, it is as if "in" raised that exception).\n' - '\n' - 'The operator "not in" is defined to have the inverse true value of\n' - '"in".\n', - 'integers': '\n' - 'Integer literals\n' - '****************\n' - '\n' - 'Integer literals are described by the following lexical ' - 'definitions:\n' - '\n' - ' integer ::= decimalinteger | octinteger | hexinteger ' - '| bininteger\n' - ' decimalinteger ::= nonzerodigit digit* | "0"+\n' - ' nonzerodigit ::= "1"..."9"\n' - ' digit ::= "0"..."9"\n' - ' octinteger ::= "0" ("o" | "O") octdigit+\n' - ' hexinteger ::= "0" ("x" | "X") hexdigit+\n' - ' bininteger ::= "0" ("b" | "B") bindigit+\n' - ' octdigit ::= "0"..."7"\n' - ' hexdigit ::= digit | "a"..."f" | "A"..."F"\n' - ' bindigit ::= "0" | "1"\n' - '\n' - 'There is no limit for the length of integer literals apart ' - 'from what\n' - 'can be stored in available memory.\n' - '\n' - 'Note that leading zeros in a non-zero decimal number are not ' - 'allowed.\n' - 'This is for disambiguation with C-style octal literals, which ' - 'Python\n' - 'used before version 3.0.\n' - '\n' - 'Some examples of integer literals:\n' - '\n' - ' 7 2147483647 0o177 ' - '0b100110111\n' - ' 3 79228162514264337593543950336 0o377 ' - '0xdeadbeef\n', - 'lambda': '\n' - 'Lambdas\n' - '*******\n' - '\n' - ' lambda_expr ::= "lambda" [parameter_list]: expression\n' - ' lambda_expr_nocond ::= "lambda" [parameter_list]: ' - 'expression_nocond\n' - '\n' - 'Lambda expressions (sometimes called lambda forms) are used to ' - 'create\n' - 'anonymous functions. The expression "lambda arguments: ' - 'expression"\n' - 'yields a function object. The unnamed object behaves like a ' - 'function\n' - 'object defined with:\n' - '\n' - ' def (arguments):\n' - ' return expression\n' - '\n' - 'See section *Function definitions* for the syntax of parameter ' - 'lists.\n' - 'Note that functions created with lambda expressions cannot ' - 'contain\n' - 'statements or annotations.\n', - 'lists': '\n' - 'List displays\n' - '*************\n' - '\n' - 'A list display is a possibly empty series of expressions enclosed ' - 'in\n' - 'square brackets:\n' - '\n' - ' list_display ::= "[" [starred_list | comprehension] "]"\n' - '\n' - 'A list display yields a new list object, the contents being ' - 'specified\n' - 'by either a list of expressions or a comprehension. When a ' - 'comma-\n' - 'separated list of expressions is supplied, its elements are ' - 'evaluated\n' - 'from left to right and placed into the list object in that ' - 'order.\n' - 'When a comprehension is supplied, the list is constructed from ' - 'the\n' - 'elements resulting from the comprehension.\n', - 'naming': '\n' - 'Naming and binding\n' - '******************\n' - '\n' - '\n' - 'Binding of names\n' - '================\n' - '\n' - '*Names* refer to objects. Names are introduced by name binding\n' - 'operations.\n' - '\n' - 'The following constructs bind names: formal parameters to ' - 'functions,\n' - '"import" statements, class and function definitions (these bind ' - 'the\n' - 'class or function name in the defining block), and targets that ' - 'are\n' - 'identifiers if occurring in an assignment, "for" loop header, or ' - 'after\n' - '"as" in a "with" statement or "except" clause. The "import" ' - 'statement\n' - 'of the form "from ... import *" binds all names defined in the\n' - 'imported module, except those beginning with an underscore. ' - 'This form\n' - 'may only be used at the module level.\n' - '\n' - 'A target occurring in a "del" statement is also considered bound ' - 'for\n' - 'this purpose (though the actual semantics are to unbind the ' - 'name).\n' - '\n' - 'Each assignment or import statement occurs within a block ' - 'defined by a\n' - 'class or function definition or at the module level (the ' - 'top-level\n' - 'code block).\n' - '\n' - 'If a name is bound in a block, it is a local variable of that ' - 'block,\n' - 'unless declared as "nonlocal" or "global". If a name is bound ' - 'at the\n' - 'module level, it is a global variable. (The variables of the ' - 'module\n' - 'code block are local and global.) If a variable is used in a ' - 'code\n' - 'block but not defined there, it is a *free variable*.\n' - '\n' - 'Each occurrence of a name in the program text refers to the ' - '*binding*\n' - 'of that name established by the following name resolution ' - 'rules.\n' - '\n' - '\n' - 'Resolution of names\n' - '===================\n' - '\n' - 'A *scope* defines the visibility of a name within a block. If a ' - 'local\n' - 'variable is defined in a block, its scope includes that block. ' - 'If the\n' - 'definition occurs in a function block, the scope extends to any ' - 'blocks\n' - 'contained within the defining one, unless a contained block ' - 'introduces\n' - 'a different binding for the name.\n' - '\n' - 'When a name is used in a code block, it is resolved using the ' - 'nearest\n' - 'enclosing scope. The set of all such scopes visible to a code ' - 'block\n' - "is called the block's *environment*.\n" - '\n' - 'When a name is not found at all, a "NameError" exception is ' - 'raised. If\n' - 'the current scope is a function scope, and the name refers to a ' - 'local\n' - 'variable that has not yet been bound to a value at the point ' - 'where the\n' - 'name is used, an "UnboundLocalError" exception is raised.\n' - '"UnboundLocalError" is a subclass of "NameError".\n' - '\n' - 'If a name binding operation occurs anywhere within a code block, ' - 'all\n' - 'uses of the name within the block are treated as references to ' - 'the\n' - 'current block. This can lead to errors when a name is used ' - 'within a\n' - 'block before it is bound. This rule is subtle. Python lacks\n' - 'declarations and allows name binding operations to occur ' - 'anywhere\n' - 'within a code block. The local variables of a code block can ' - 'be\n' - 'determined by scanning the entire text of the block for name ' - 'binding\n' - 'operations.\n' - '\n' - 'If the "global" statement occurs within a block, all uses of the ' - 'name\n' - 'specified in the statement refer to the binding of that name in ' - 'the\n' - 'top-level namespace. Names are resolved in the top-level ' - 'namespace by\n' - 'searching the global namespace, i.e. the namespace of the ' - 'module\n' - 'containing the code block, and the builtins namespace, the ' - 'namespace\n' - 'of the module "builtins". The global namespace is searched ' - 'first. If\n' - 'the name is not found there, the builtins namespace is ' - 'searched. The\n' - '"global" statement must precede all uses of the name.\n' - '\n' - 'The "global" statement has the same scope as a name binding ' - 'operation\n' - 'in the same block. If the nearest enclosing scope for a free ' - 'variable\n' - 'contains a global statement, the free variable is treated as a ' - 'global.\n' - '\n' - 'The "nonlocal" statement causes corresponding names to refer to\n' - 'previously bound variables in the nearest enclosing function ' - 'scope.\n' - '"SyntaxError" is raised at compile time if the given name does ' - 'not\n' - 'exist in any enclosing function scope.\n' - '\n' - 'The namespace for a module is automatically created the first ' - 'time a\n' - 'module is imported. The main module for a script is always ' - 'called\n' - '"__main__".\n' - '\n' - 'Class definition blocks and arguments to "exec()" and "eval()" ' - 'are\n' - 'special in the context of name resolution. A class definition is ' - 'an\n' - 'executable statement that may use and define names. These ' - 'references\n' - 'follow the normal rules for name resolution with an exception ' - 'that\n' - 'unbound local variables are looked up in the global namespace. ' - 'The\n' - 'namespace of the class definition becomes the attribute ' - 'dictionary of\n' - 'the class. The scope of names defined in a class block is ' - 'limited to\n' - 'the class block; it does not extend to the code blocks of ' - 'methods --\n' - 'this includes comprehensions and generator expressions since ' - 'they are\n' - 'implemented using a function scope. This means that the ' - 'following\n' - 'will fail:\n' - '\n' - ' class A:\n' - ' a = 42\n' - ' b = list(a + i for i in range(10))\n' - '\n' - '\n' - 'Builtins and restricted execution\n' - '=================================\n' - '\n' - 'The builtins namespace associated with the execution of a code ' - 'block\n' - 'is actually found by looking up the name "__builtins__" in its ' - 'global\n' - 'namespace; this should be a dictionary or a module (in the ' - 'latter case\n' - "the module's dictionary is used). By default, when in the " - '"__main__"\n' - 'module, "__builtins__" is the built-in module "builtins"; when ' - 'in any\n' - 'other module, "__builtins__" is an alias for the dictionary of ' - 'the\n' - '"builtins" module itself. "__builtins__" can be set to a ' - 'user-created\n' - 'dictionary to create a weak form of restricted execution.\n' - '\n' - '**CPython implementation detail:** Users should not touch\n' - '"__builtins__"; it is strictly an implementation detail. Users\n' - 'wanting to override values in the builtins namespace should ' - '"import"\n' - 'the "builtins" module and modify its attributes appropriately.\n' - '\n' - '\n' - 'Interaction with dynamic features\n' - '=================================\n' - '\n' - 'Name resolution of free variables occurs at runtime, not at ' - 'compile\n' - 'time. This means that the following code will print 42:\n' - '\n' - ' i = 10\n' - ' def f():\n' - ' print(i)\n' - ' i = 42\n' - ' f()\n' - '\n' - 'The "eval()" and "exec()" functions do not have access to the ' - 'full\n' - 'environment for resolving names. Names may be resolved in the ' - 'local\n' - 'and global namespaces of the caller. Free variables are not ' - 'resolved\n' - 'in the nearest enclosing namespace, but in the global ' - 'namespace. [1]\n' - 'The "exec()" and "eval()" functions have optional arguments to\n' - 'override the global and local namespace. If only one namespace ' - 'is\n' - 'specified, it is used for both.\n', - 'nonlocal': '\n' - 'The "nonlocal" statement\n' - '************************\n' - '\n' - ' nonlocal_stmt ::= "nonlocal" identifier ("," identifier)*\n' - '\n' - 'The "nonlocal" statement causes the listed identifiers to ' - 'refer to\n' - 'previously bound variables in the nearest enclosing scope ' - 'excluding\n' - 'globals. This is important because the default behavior for ' - 'binding is\n' - 'to search the local namespace first. The statement allows\n' - 'encapsulated code to rebind variables outside of the local ' - 'scope\n' - 'besides the global (module) scope.\n' - '\n' - 'Names listed in a "nonlocal" statement, unlike those listed in ' - 'a\n' - '"global" statement, must refer to pre-existing bindings in an\n' - 'enclosing scope (the scope in which a new binding should be ' - 'created\n' - 'cannot be determined unambiguously).\n' - '\n' - 'Names listed in a "nonlocal" statement must not collide with ' - 'pre-\n' - 'existing bindings in the local scope.\n' - '\n' - 'See also: **PEP 3104** - Access to Names in Outer Scopes\n' - '\n' - ' The specification for the "nonlocal" statement.\n', - 'numbers': '\n' - 'Numeric literals\n' - '****************\n' - '\n' - 'There are three types of numeric literals: integers, floating ' - 'point\n' - 'numbers, and imaginary numbers. There are no complex literals\n' - '(complex numbers can be formed by adding a real number and an\n' - 'imaginary number).\n' - '\n' - 'Note that numeric literals do not include a sign; a phrase like ' - '"-1"\n' - 'is actually an expression composed of the unary operator ' - '\'"-"\' and the\n' - 'literal "1".\n', - 'numeric-types': '\n' - 'Emulating numeric types\n' - '***********************\n' - '\n' - 'The following methods can be defined to emulate numeric ' - 'objects.\n' - 'Methods corresponding to operations that are not ' - 'supported by the\n' - 'particular kind of number implemented (e.g., bitwise ' - 'operations for\n' - 'non-integral numbers) should be left undefined.\n' - '\n' - 'object.__add__(self, other)\n' - 'object.__sub__(self, other)\n' - 'object.__mul__(self, other)\n' - 'object.__matmul__(self, other)\n' - 'object.__truediv__(self, other)\n' - 'object.__floordiv__(self, other)\n' - 'object.__mod__(self, other)\n' - 'object.__divmod__(self, other)\n' - 'object.__pow__(self, other[, modulo])\n' - 'object.__lshift__(self, other)\n' - 'object.__rshift__(self, other)\n' - 'object.__and__(self, other)\n' - 'object.__xor__(self, other)\n' - 'object.__or__(self, other)\n' - '\n' - ' These methods are called to implement the binary ' - 'arithmetic\n' - ' operations ("+", "-", "*", "@", "/", "//", "%", ' - '"divmod()",\n' - ' "pow()", "**", "<<", ">>", "&", "^", "|"). For ' - 'instance, to\n' - ' evaluate the expression "x + y", where *x* is an ' - 'instance of a\n' - ' class that has an "__add__()" method, "x.__add__(y)" ' - 'is called.\n' - ' The "__divmod__()" method should be the equivalent to ' - 'using\n' - ' "__floordiv__()" and "__mod__()"; it should not be ' - 'related to\n' - ' "__truediv__()". Note that "__pow__()" should be ' - 'defined to accept\n' - ' an optional third argument if the ternary version of ' - 'the built-in\n' - ' "pow()" function is to be supported.\n' - '\n' - ' If one of those methods does not support the operation ' - 'with the\n' - ' supplied arguments, it should return ' - '"NotImplemented".\n' - '\n' - 'object.__radd__(self, other)\n' - 'object.__rsub__(self, other)\n' - 'object.__rmul__(self, other)\n' - 'object.__rmatmul__(self, other)\n' - 'object.__rtruediv__(self, other)\n' - 'object.__rfloordiv__(self, other)\n' - 'object.__rmod__(self, other)\n' - 'object.__rdivmod__(self, other)\n' - 'object.__rpow__(self, other)\n' - 'object.__rlshift__(self, other)\n' - 'object.__rrshift__(self, other)\n' - 'object.__rand__(self, other)\n' - 'object.__rxor__(self, other)\n' - 'object.__ror__(self, other)\n' - '\n' - ' These methods are called to implement the binary ' - 'arithmetic\n' - ' operations ("+", "-", "*", "@", "/", "//", "%", ' - '"divmod()",\n' - ' "pow()", "**", "<<", ">>", "&", "^", "|") with ' - 'reflected (swapped)\n' - ' operands. These functions are only called if the left ' - 'operand does\n' - ' not support the corresponding operation and the ' - 'operands are of\n' - ' different types. [2] For instance, to evaluate the ' - 'expression "x -\n' - ' y", where *y* is an instance of a class that has an ' - '"__rsub__()"\n' - ' method, "y.__rsub__(x)" is called if "x.__sub__(y)" ' - 'returns\n' - ' *NotImplemented*.\n' - '\n' - ' Note that ternary "pow()" will not try calling ' - '"__rpow__()" (the\n' - ' coercion rules would become too complicated).\n' - '\n' - " Note: If the right operand's type is a subclass of the " - 'left\n' - " operand's type and that subclass provides the " - 'reflected method\n' - ' for the operation, this method will be called before ' - 'the left\n' - " operand's non-reflected method. This behavior " - 'allows subclasses\n' - " to override their ancestors' operations.\n" - '\n' - 'object.__iadd__(self, other)\n' - 'object.__isub__(self, other)\n' - 'object.__imul__(self, other)\n' - 'object.__imatmul__(self, other)\n' - 'object.__itruediv__(self, other)\n' - 'object.__ifloordiv__(self, other)\n' - 'object.__imod__(self, other)\n' - 'object.__ipow__(self, other[, modulo])\n' - 'object.__ilshift__(self, other)\n' - 'object.__irshift__(self, other)\n' - 'object.__iand__(self, other)\n' - 'object.__ixor__(self, other)\n' - 'object.__ior__(self, other)\n' - '\n' - ' These methods are called to implement the augmented ' - 'arithmetic\n' - ' assignments ("+=", "-=", "*=", "@=", "/=", "//=", ' - '"%=", "**=",\n' - ' "<<=", ">>=", "&=", "^=", "|="). These methods should ' - 'attempt to\n' - ' do the operation in-place (modifying *self*) and ' - 'return the result\n' - ' (which could be, but does not have to be, *self*). If ' - 'a specific\n' - ' method is not defined, the augmented assignment falls ' - 'back to the\n' - ' normal methods. For instance, if *x* is an instance ' - 'of a class\n' - ' with an "__iadd__()" method, "x += y" is equivalent to ' - '"x =\n' - ' x.__iadd__(y)" . Otherwise, "x.__add__(y)" and ' - '"y.__radd__(x)" are\n' - ' considered, as with the evaluation of "x + y". In ' - 'certain\n' - ' situations, augmented assignment can result in ' - 'unexpected errors\n' - " (see *Why does a_tuple[i] += ['item'] raise an " - 'exception when the\n' - ' addition works?*), but this behavior is in fact part ' - 'of the data\n' - ' model.\n' - '\n' - 'object.__neg__(self)\n' - 'object.__pos__(self)\n' - 'object.__abs__(self)\n' - 'object.__invert__(self)\n' - '\n' - ' Called to implement the unary arithmetic operations ' - '("-", "+",\n' - ' "abs()" and "~").\n' - '\n' - 'object.__complex__(self)\n' - 'object.__int__(self)\n' - 'object.__float__(self)\n' - 'object.__round__(self[, n])\n' - '\n' - ' Called to implement the built-in functions ' - '"complex()", "int()",\n' - ' "float()" and "round()". Should return a value of the ' - 'appropriate\n' - ' type.\n' - '\n' - 'object.__index__(self)\n' - '\n' - ' Called to implement "operator.index()", and whenever ' - 'Python needs\n' - ' to losslessly convert the numeric object to an integer ' - 'object (such\n' - ' as in slicing, or in the built-in "bin()", "hex()" and ' - '"oct()"\n' - ' functions). Presence of this method indicates that the ' - 'numeric\n' - ' object is an integer type. Must return an integer.\n' - '\n' - ' Note: In order to have a coherent integer type class, ' - 'when\n' - ' "__index__()" is defined "__int__()" should also be ' - 'defined, and\n' - ' both should return the same value.\n', - 'objects': '\n' - 'Objects, values and types\n' - '*************************\n' - '\n' - "*Objects* are Python's abstraction for data. All data in a " - 'Python\n' - 'program is represented by objects or by relations between ' - 'objects. (In\n' - "a sense, and in conformance to Von Neumann's model of a " - '"stored\n' - 'program computer," code is also represented by objects.)\n' - '\n' - "Every object has an identity, a type and a value. An object's\n" - '*identity* never changes once it has been created; you may ' - 'think of it\n' - 'as the object\'s address in memory. The \'"is"\' operator ' - 'compares the\n' - 'identity of two objects; the "id()" function returns an ' - 'integer\n' - 'representing its identity.\n' - '\n' - '**CPython implementation detail:** For CPython, "id(x)" is the ' - 'memory\n' - 'address where "x" is stored.\n' - '\n' - "An object's type determines the operations that the object " - 'supports\n' - '(e.g., "does it have a length?") and also defines the possible ' - 'values\n' - 'for objects of that type. The "type()" function returns an ' - "object's\n" - 'type (which is an object itself). Like its identity, an ' - "object's\n" - '*type* is also unchangeable. [1]\n' - '\n' - 'The *value* of some objects can change. Objects whose value ' - 'can\n' - 'change are said to be *mutable*; objects whose value is ' - 'unchangeable\n' - 'once they are created are called *immutable*. (The value of an\n' - 'immutable container object that contains a reference to a ' - 'mutable\n' - "object can change when the latter's value is changed; however " - 'the\n' - 'container is still considered immutable, because the collection ' - 'of\n' - 'objects it contains cannot be changed. So, immutability is ' - 'not\n' - 'strictly the same as having an unchangeable value, it is more ' - 'subtle.)\n' - "An object's mutability is determined by its type; for " - 'instance,\n' - 'numbers, strings and tuples are immutable, while dictionaries ' - 'and\n' - 'lists are mutable.\n' - '\n' - 'Objects are never explicitly destroyed; however, when they ' - 'become\n' - 'unreachable they may be garbage-collected. An implementation ' - 'is\n' - 'allowed to postpone garbage collection or omit it altogether ' - '--- it is\n' - 'a matter of implementation quality how garbage collection is\n' - 'implemented, as long as no objects are collected that are ' - 'still\n' - 'reachable.\n' - '\n' - '**CPython implementation detail:** CPython currently uses a ' - 'reference-\n' - 'counting scheme with (optional) delayed detection of cyclically ' - 'linked\n' - 'garbage, which collects most objects as soon as they become\n' - 'unreachable, but is not guaranteed to collect garbage ' - 'containing\n' - 'circular references. See the documentation of the "gc" module ' - 'for\n' - 'information on controlling the collection of cyclic garbage. ' - 'Other\n' - 'implementations act differently and CPython may change. Do not ' - 'depend\n' - 'on immediate finalization of objects when they become ' - 'unreachable (so\n' - 'you should always close files explicitly).\n' - '\n' - "Note that the use of the implementation's tracing or debugging\n" - 'facilities may keep objects alive that would normally be ' - 'collectable.\n' - 'Also note that catching an exception with a ' - '\'"try"..."except"\'\n' - 'statement may keep objects alive.\n' - '\n' - 'Some objects contain references to "external" resources such as ' - 'open\n' - 'files or windows. It is understood that these resources are ' - 'freed\n' - 'when the object is garbage-collected, but since garbage ' - 'collection is\n' - 'not guaranteed to happen, such objects also provide an explicit ' - 'way to\n' - 'release the external resource, usually a "close()" method. ' - 'Programs\n' - 'are strongly recommended to explicitly close such objects. ' - 'The\n' - '\'"try"..."finally"\' statement and the \'"with"\' statement ' - 'provide\n' - 'convenient ways to do this.\n' - '\n' - 'Some objects contain references to other objects; these are ' - 'called\n' - '*containers*. Examples of containers are tuples, lists and\n' - "dictionaries. The references are part of a container's value. " - 'In\n' - 'most cases, when we talk about the value of a container, we ' - 'imply the\n' - 'values, not the identities of the contained objects; however, ' - 'when we\n' - 'talk about the mutability of a container, only the identities ' - 'of the\n' - 'immediately contained objects are implied. So, if an ' - 'immutable\n' - 'container (like a tuple) contains a reference to a mutable ' - 'object, its\n' - 'value changes if that mutable object is changed.\n' - '\n' - 'Types affect almost all aspects of object behavior. Even the\n' - 'importance of object identity is affected in some sense: for ' - 'immutable\n' - 'types, operations that compute new values may actually return ' - 'a\n' - 'reference to any existing object with the same type and value, ' - 'while\n' - 'for mutable objects this is not allowed. E.g., after "a = 1; b ' - '= 1",\n' - '"a" and "b" may or may not refer to the same object with the ' - 'value\n' - 'one, depending on the implementation, but after "c = []; d = ' - '[]", "c"\n' - 'and "d" are guaranteed to refer to two different, unique, ' - 'newly\n' - 'created empty lists. (Note that "c = d = []" assigns the same ' - 'object\n' - 'to both "c" and "d".)\n', - 'operator-summary': '\n' - 'Operator precedence\n' - '*******************\n' - '\n' - 'The following table summarizes the operator precedence ' - 'in Python, from\n' - 'lowest precedence (least binding) to highest ' - 'precedence (most\n' - 'binding). Operators in the same box have the same ' - 'precedence. Unless\n' - 'the syntax is explicitly given, operators are binary. ' - 'Operators in\n' - 'the same box group left to right (except for ' - 'exponentiation, which\n' - 'groups from right to left).\n' - '\n' - 'Note that comparisons, membership tests, and identity ' - 'tests, all have\n' - 'the same precedence and have a left-to-right chaining ' - 'feature as\n' - 'described in the *Comparisons* section.\n' - '\n' - '+-------------------------------------------------+---------------------------------------+\n' - '| Operator | ' - 'Description |\n' - '+=================================================+=======================================+\n' - '| "lambda" | ' - 'Lambda expression |\n' - '+-------------------------------------------------+---------------------------------------+\n' - '| "if" -- "else" | ' - 'Conditional expression |\n' - '+-------------------------------------------------+---------------------------------------+\n' - '| "or" | ' - 'Boolean OR |\n' - '+-------------------------------------------------+---------------------------------------+\n' - '| "and" | ' - 'Boolean AND |\n' - '+-------------------------------------------------+---------------------------------------+\n' - '| "not" "x" | ' - 'Boolean NOT |\n' - '+-------------------------------------------------+---------------------------------------+\n' - '| "in", "not in", "is", "is not", "<", "<=", ">", | ' - 'Comparisons, including membership |\n' - '| ">=", "!=", "==" | ' - 'tests and identity tests |\n' - '+-------------------------------------------------+---------------------------------------+\n' - '| "|" | ' - 'Bitwise OR |\n' - '+-------------------------------------------------+---------------------------------------+\n' - '| "^" | ' - 'Bitwise XOR |\n' - '+-------------------------------------------------+---------------------------------------+\n' - '| "&" | ' - 'Bitwise AND |\n' - '+-------------------------------------------------+---------------------------------------+\n' - '| "<<", ">>" | ' - 'Shifts |\n' - '+-------------------------------------------------+---------------------------------------+\n' - '| "+", "-" | ' - 'Addition and subtraction |\n' - '+-------------------------------------------------+---------------------------------------+\n' - '| "*", "@", "/", "//", "%" | ' - 'Multiplication, matrix multiplication |\n' - '| | ' - 'division, remainder [5] |\n' - '+-------------------------------------------------+---------------------------------------+\n' - '| "+x", "-x", "~x" | ' - 'Positive, negative, bitwise NOT |\n' - '+-------------------------------------------------+---------------------------------------+\n' - '| "**" | ' - 'Exponentiation [6] |\n' - '+-------------------------------------------------+---------------------------------------+\n' - '| "await" "x" | ' - 'Await expression |\n' - '+-------------------------------------------------+---------------------------------------+\n' - '| "x[index]", "x[index:index]", | ' - 'Subscription, slicing, call, |\n' - '| "x(arguments...)", "x.attribute" | ' - 'attribute reference |\n' - '+-------------------------------------------------+---------------------------------------+\n' - '| "(expressions...)", "[expressions...]", "{key: | ' - 'Binding or tuple display, list |\n' - '| value...}", "{expressions...}" | ' - 'display, dictionary display, set |\n' - '| | ' - 'display |\n' - '+-------------------------------------------------+---------------------------------------+\n' - '\n' - '-[ Footnotes ]-\n' - '\n' - '[1] While "abs(x%y) < abs(y)" is true mathematically, ' - 'for floats\n' - ' it may not be true numerically due to roundoff. ' - 'For example, and\n' - ' assuming a platform on which a Python float is an ' - 'IEEE 754 double-\n' - ' precision number, in order that "-1e-100 % 1e100" ' - 'have the same\n' - ' sign as "1e100", the computed result is "-1e-100 + ' - '1e100", which\n' - ' is numerically exactly equal to "1e100". The ' - 'function\n' - ' "math.fmod()" returns a result whose sign matches ' - 'the sign of the\n' - ' first argument instead, and so returns "-1e-100" ' - 'in this case.\n' - ' Which approach is more appropriate depends on the ' - 'application.\n' - '\n' - '[2] If x is very close to an exact integer multiple of ' - "y, it's\n" - ' possible for "x//y" to be one larger than ' - '"(x-x%y)//y" due to\n' - ' rounding. In such cases, Python returns the ' - 'latter result, in\n' - ' order to preserve that "divmod(x,y)[0] * y + x % ' - 'y" be very close\n' - ' to "x".\n' - '\n' - '[3] The Unicode standard distinguishes between *code ' - 'points* (e.g.\n' - ' U+0041) and *abstract characters* (e.g. "LATIN ' - 'CAPITAL LETTER A").\n' - ' While most abstract characters in Unicode are only ' - 'represented\n' - ' using one code point, there is a number of ' - 'abstract characters\n' - ' that can in addition be represented using a ' - 'sequence of more than\n' - ' one code point. For example, the abstract ' - 'character "LATIN\n' - ' CAPITAL LETTER C WITH CEDILLA" can be represented ' - 'as a single\n' - ' *precomposed character* at code position U+00C7, ' - 'or as a sequence\n' - ' of a *base character* at code position U+0043 ' - '(LATIN CAPITAL\n' - ' LETTER C), followed by a *combining character* at ' - 'code position\n' - ' U+0327 (COMBINING CEDILLA).\n' - '\n' - ' The comparison operators on strings compare at the ' - 'level of\n' - ' Unicode code points. This may be counter-intuitive ' - 'to humans. For\n' - ' example, ""\\u00C7" == "\\u0043\\u0327"" is ' - '"False", even though both\n' - ' strings represent the same abstract character ' - '"LATIN CAPITAL\n' - ' LETTER C WITH CEDILLA".\n' - '\n' - ' To compare strings at the level of abstract ' - 'characters (that is,\n' - ' in a way intuitive to humans), use ' - '"unicodedata.normalize()".\n' - '\n' - '[4] Due to automatic garbage-collection, free lists, ' - 'and the\n' - ' dynamic nature of descriptors, you may notice ' - 'seemingly unusual\n' - ' behaviour in certain uses of the "is" operator, ' - 'like those\n' - ' involving comparisons between instance methods, or ' - 'constants.\n' - ' Check their documentation for more info.\n' - '\n' - '[5] The "%" operator is also used for string ' - 'formatting; the same\n' - ' precedence applies.\n' - '\n' - '[6] The power operator "**" binds less tightly than an ' - 'arithmetic\n' - ' or bitwise unary operator on its right, that is, ' - '"2**-1" is "0.5".\n', - 'pass': '\n' - 'The "pass" statement\n' - '********************\n' - '\n' - ' pass_stmt ::= "pass"\n' - '\n' - '"pass" is a null operation --- when it is executed, nothing ' - 'happens.\n' - 'It is useful as a placeholder when a statement is required\n' - 'syntactically, but no code needs to be executed, for example:\n' - '\n' - ' def f(arg): pass # a function that does nothing (yet)\n' - '\n' - ' class C: pass # a class with no methods (yet)\n', - 'power': '\n' - 'The power operator\n' - '******************\n' - '\n' - 'The power operator binds more tightly than unary operators on ' - 'its\n' - 'left; it binds less tightly than unary operators on its right. ' - 'The\n' - 'syntax is:\n' - '\n' - ' power ::= ( await_expr | primary ) ["**" u_expr]\n' - '\n' - 'Thus, in an unparenthesized sequence of power and unary ' - 'operators, the\n' - 'operators are evaluated from right to left (this does not ' - 'constrain\n' - 'the evaluation order for the operands): "-1**2" results in "-1".\n' - '\n' - 'The power operator has the same semantics as the built-in ' - '"pow()"\n' - 'function, when called with two arguments: it yields its left ' - 'argument\n' - 'raised to the power of its right argument. The numeric arguments ' - 'are\n' - 'first converted to a common type, and the result is of that ' - 'type.\n' - '\n' - 'For int operands, the result has the same type as the operands ' - 'unless\n' - 'the second argument is negative; in that case, all arguments are\n' - 'converted to float and a float result is delivered. For example,\n' - '"10**2" returns "100", but "10**-2" returns "0.01".\n' - '\n' - 'Raising "0.0" to a negative power results in a ' - '"ZeroDivisionError".\n' - 'Raising a negative number to a fractional power results in a ' - '"complex"\n' - 'number. (In earlier versions it raised a "ValueError".)\n', - 'raise': '\n' - 'The "raise" statement\n' - '*********************\n' - '\n' - ' raise_stmt ::= "raise" [expression ["from" expression]]\n' - '\n' - 'If no expressions are present, "raise" re-raises the last ' - 'exception\n' - 'that was active in the current scope. If no exception is active ' - 'in\n' - 'the current scope, a "RuntimeError" exception is raised ' - 'indicating\n' - 'that this is an error.\n' - '\n' - 'Otherwise, "raise" evaluates the first expression as the ' - 'exception\n' - 'object. It must be either a subclass or an instance of\n' - '"BaseException". If it is a class, the exception instance will ' - 'be\n' - 'obtained when needed by instantiating the class with no ' - 'arguments.\n' - '\n' - "The *type* of the exception is the exception instance's class, " - 'the\n' - '*value* is the instance itself.\n' - '\n' - 'A traceback object is normally created automatically when an ' - 'exception\n' - 'is raised and attached to it as the "__traceback__" attribute, ' - 'which\n' - 'is writable. You can create an exception and set your own ' - 'traceback in\n' - 'one step using the "with_traceback()" exception method (which ' - 'returns\n' - 'the same exception instance, with its traceback set to its ' - 'argument),\n' - 'like so:\n' - '\n' - ' raise Exception("foo occurred").with_traceback(tracebackobj)\n' - '\n' - 'The "from" clause is used for exception chaining: if given, the ' - 'second\n' - '*expression* must be another exception class or instance, which ' - 'will\n' - 'then be attached to the raised exception as the "__cause__" ' - 'attribute\n' - '(which is writable). If the raised exception is not handled, ' - 'both\n' - 'exceptions will be printed:\n' - '\n' - ' >>> try:\n' - ' ... print(1 / 0)\n' - ' ... except Exception as exc:\n' - ' ... raise RuntimeError("Something bad happened") from exc\n' - ' ...\n' - ' Traceback (most recent call last):\n' - ' File "", line 2, in \n' - ' ZeroDivisionError: int division or modulo by zero\n' - '\n' - ' The above exception was the direct cause of the following ' - 'exception:\n' - '\n' - ' Traceback (most recent call last):\n' - ' File "", line 4, in \n' - ' RuntimeError: Something bad happened\n' - '\n' - 'A similar mechanism works implicitly if an exception is raised ' - 'inside\n' - 'an exception handler or a "finally" clause: the previous ' - 'exception is\n' - 'then attached as the new exception\'s "__context__" attribute:\n' - '\n' - ' >>> try:\n' - ' ... print(1 / 0)\n' - ' ... except:\n' - ' ... raise RuntimeError("Something bad happened")\n' - ' ...\n' - ' Traceback (most recent call last):\n' - ' File "", line 2, in \n' - ' ZeroDivisionError: int division or modulo by zero\n' - '\n' - ' During handling of the above exception, another exception ' - 'occurred:\n' - '\n' - ' Traceback (most recent call last):\n' - ' File "", line 4, in \n' - ' RuntimeError: Something bad happened\n' - '\n' - 'Additional information on exceptions can be found in section\n' - '*Exceptions*, and information about handling exceptions is in ' - 'section\n' - '*The try statement*.\n', - 'return': '\n' - 'The "return" statement\n' - '**********************\n' - '\n' - ' return_stmt ::= "return" [expression_list]\n' - '\n' - '"return" may only occur syntactically nested in a function ' - 'definition,\n' - 'not within a nested class definition.\n' - '\n' - 'If an expression list is present, it is evaluated, else "None" ' - 'is\n' - 'substituted.\n' - '\n' - '"return" leaves the current function call with the expression ' - 'list (or\n' - '"None") as return value.\n' - '\n' - 'When "return" passes control out of a "try" statement with a ' - '"finally"\n' - 'clause, that "finally" clause is executed before really leaving ' - 'the\n' - 'function.\n' - '\n' - 'In a generator function, the "return" statement indicates that ' - 'the\n' - 'generator is done and will cause "StopIteration" to be raised. ' - 'The\n' - 'returned value (if any) is used as an argument to construct\n' - '"StopIteration" and becomes the "StopIteration.value" ' - 'attribute.\n', - 'sequence-types': '\n' - 'Emulating container types\n' - '*************************\n' - '\n' - 'The following methods can be defined to implement ' - 'container objects.\n' - 'Containers usually are sequences (such as lists or ' - 'tuples) or mappings\n' - '(like dictionaries), but can represent other containers ' - 'as well. The\n' - 'first set of methods is used either to emulate a ' - 'sequence or to\n' - 'emulate a mapping; the difference is that for a ' - 'sequence, the\n' - 'allowable keys should be the integers *k* for which "0 ' - '<= k < N" where\n' - '*N* is the length of the sequence, or slice objects, ' - 'which define a\n' - 'range of items. It is also recommended that mappings ' - 'provide the\n' - 'methods "keys()", "values()", "items()", "get()", ' - '"clear()",\n' - '"setdefault()", "pop()", "popitem()", "copy()", and ' - '"update()"\n' - "behaving similar to those for Python's standard " - 'dictionary objects.\n' - 'The "collections" module provides a "MutableMapping" ' - 'abstract base\n' - 'class to help create those methods from a base set of ' - '"__getitem__()",\n' - '"__setitem__()", "__delitem__()", and "keys()". Mutable ' - 'sequences\n' - 'should provide methods "append()", "count()", "index()", ' - '"extend()",\n' - '"insert()", "pop()", "remove()", "reverse()" and ' - '"sort()", like Python\n' - 'standard list objects. Finally, sequence types should ' - 'implement\n' - 'addition (meaning concatenation) and multiplication ' - '(meaning\n' - 'repetition) by defining the methods "__add__()", ' - '"__radd__()",\n' - '"__iadd__()", "__mul__()", "__rmul__()" and "__imul__()" ' - 'described\n' - 'below; they should not define other numerical ' - 'operators. It is\n' - 'recommended that both mappings and sequences implement ' - 'the\n' - '"__contains__()" method to allow efficient use of the ' - '"in" operator;\n' - 'for mappings, "in" should search the mapping\'s keys; ' - 'for sequences, it\n' - 'should search through the values. It is further ' - 'recommended that both\n' - 'mappings and sequences implement the "__iter__()" method ' - 'to allow\n' - 'efficient iteration through the container; for mappings, ' - '"__iter__()"\n' - 'should be the same as "keys()"; for sequences, it should ' - 'iterate\n' - 'through the values.\n' - '\n' - 'object.__len__(self)\n' - '\n' - ' Called to implement the built-in function "len()". ' - 'Should return\n' - ' the length of the object, an integer ">=" 0. Also, ' - 'an object that\n' - ' doesn\'t define a "__bool__()" method and whose ' - '"__len__()" method\n' - ' returns zero is considered to be false in a Boolean ' - 'context.\n' - '\n' - ' **CPython implementation detail:** In CPython, the ' - 'length is\n' - ' required to be at most "sys.maxsize". If the length ' - 'is larger than\n' - ' "sys.maxsize" some features (such as "len()") may ' - 'raise\n' - ' "OverflowError". To prevent raising "OverflowError" ' - 'by truth value\n' - ' testing, an object must define a "__bool__()" ' - 'method.\n' - '\n' - 'object.__length_hint__(self)\n' - '\n' - ' Called to implement "operator.length_hint()". Should ' - 'return an\n' - ' estimated length for the object (which may be greater ' - 'or less than\n' - ' the actual length). The length must be an integer ' - '">=" 0. This\n' - ' method is purely an optimization and is never ' - 'required for\n' - ' correctness.\n' - '\n' - ' New in version 3.4.\n' - '\n' - 'Note: Slicing is done exclusively with the following ' - 'three methods.\n' - ' A call like\n' - '\n' - ' a[1:2] = b\n' - '\n' - ' is translated to\n' - '\n' - ' a[slice(1, 2, None)] = b\n' - '\n' - ' and so forth. Missing slice items are always filled ' - 'in with "None".\n' - '\n' - 'object.__getitem__(self, key)\n' - '\n' - ' Called to implement evaluation of "self[key]". For ' - 'sequence types,\n' - ' the accepted keys should be integers and slice ' - 'objects. Note that\n' - ' the special interpretation of negative indexes (if ' - 'the class wishes\n' - ' to emulate a sequence type) is up to the ' - '"__getitem__()" method. If\n' - ' *key* is of an inappropriate type, "TypeError" may be ' - 'raised; if of\n' - ' a value outside the set of indexes for the sequence ' - '(after any\n' - ' special interpretation of negative values), ' - '"IndexError" should be\n' - ' raised. For mapping types, if *key* is missing (not ' - 'in the\n' - ' container), "KeyError" should be raised.\n' - '\n' - ' Note: "for" loops expect that an "IndexError" will be ' - 'raised for\n' - ' illegal indexes to allow proper detection of the ' - 'end of the\n' - ' sequence.\n' - '\n' - 'object.__missing__(self, key)\n' - '\n' - ' Called by "dict"."__getitem__()" to implement ' - '"self[key]" for dict\n' - ' subclasses when key is not in the dictionary.\n' - '\n' - 'object.__setitem__(self, key, value)\n' - '\n' - ' Called to implement assignment to "self[key]". Same ' - 'note as for\n' - ' "__getitem__()". This should only be implemented for ' - 'mappings if\n' - ' the objects support changes to the values for keys, ' - 'or if new keys\n' - ' can be added, or for sequences if elements can be ' - 'replaced. The\n' - ' same exceptions should be raised for improper *key* ' - 'values as for\n' - ' the "__getitem__()" method.\n' - '\n' - 'object.__delitem__(self, key)\n' - '\n' - ' Called to implement deletion of "self[key]". Same ' - 'note as for\n' - ' "__getitem__()". This should only be implemented for ' - 'mappings if\n' - ' the objects support removal of keys, or for sequences ' - 'if elements\n' - ' can be removed from the sequence. The same ' - 'exceptions should be\n' - ' raised for improper *key* values as for the ' - '"__getitem__()" method.\n' - '\n' - 'object.__iter__(self)\n' - '\n' - ' This method is called when an iterator is required ' - 'for a container.\n' - ' This method should return a new iterator object that ' - 'can iterate\n' - ' over all the objects in the container. For mappings, ' - 'it should\n' - ' iterate over the keys of the container.\n' - '\n' - ' Iterator objects also need to implement this method; ' - 'they are\n' - ' required to return themselves. For more information ' - 'on iterator\n' - ' objects, see *Iterator Types*.\n' - '\n' - 'object.__reversed__(self)\n' - '\n' - ' Called (if present) by the "reversed()" built-in to ' - 'implement\n' - ' reverse iteration. It should return a new iterator ' - 'object that\n' - ' iterates over all the objects in the container in ' - 'reverse order.\n' - '\n' - ' If the "__reversed__()" method is not provided, the ' - '"reversed()"\n' - ' built-in will fall back to using the sequence ' - 'protocol ("__len__()"\n' - ' and "__getitem__()"). Objects that support the ' - 'sequence protocol\n' - ' should only provide "__reversed__()" if they can ' - 'provide an\n' - ' implementation that is more efficient than the one ' - 'provided by\n' - ' "reversed()".\n' - '\n' - 'The membership test operators ("in" and "not in") are ' - 'normally\n' - 'implemented as an iteration through a sequence. ' - 'However, container\n' - 'objects can supply the following special method with a ' - 'more efficient\n' - 'implementation, which also does not require the object ' - 'be a sequence.\n' - '\n' - 'object.__contains__(self, item)\n' - '\n' - ' Called to implement membership test operators. ' - 'Should return true\n' - ' if *item* is in *self*, false otherwise. For mapping ' - 'objects, this\n' - ' should consider the keys of the mapping rather than ' - 'the values or\n' - ' the key-item pairs.\n' - '\n' - ' For objects that don\'t define "__contains__()", the ' - 'membership test\n' - ' first tries iteration via "__iter__()", then the old ' - 'sequence\n' - ' iteration protocol via "__getitem__()", see *this ' - 'section in the\n' - ' language reference*.\n', - 'shifting': '\n' - 'Shifting operations\n' - '*******************\n' - '\n' - 'The shifting operations have lower priority than the ' - 'arithmetic\n' - 'operations:\n' - '\n' - ' shift_expr ::= a_expr | shift_expr ( "<<" | ">>" ) a_expr\n' - '\n' - 'These operators accept integers as arguments. They shift the ' - 'first\n' - 'argument to the left or right by the number of bits given by ' - 'the\n' - 'second argument.\n' - '\n' - 'A right shift by *n* bits is defined as floor division by ' - '"pow(2,n)".\n' - 'A left shift by *n* bits is defined as multiplication with ' - '"pow(2,n)".\n' - '\n' - 'Note: In the current implementation, the right-hand operand ' - 'is\n' - ' required to be at most "sys.maxsize". If the right-hand ' - 'operand is\n' - ' larger than "sys.maxsize" an "OverflowError" exception is ' - 'raised.\n', - 'slicings': '\n' - 'Slicings\n' - '********\n' - '\n' - 'A slicing selects a range of items in a sequence object (e.g., ' - 'a\n' - 'string, tuple or list). Slicings may be used as expressions ' - 'or as\n' - 'targets in assignment or "del" statements. The syntax for a ' - 'slicing:\n' - '\n' - ' slicing ::= primary "[" slice_list "]"\n' - ' slice_list ::= slice_item ("," slice_item)* [","]\n' - ' slice_item ::= expression | proper_slice\n' - ' proper_slice ::= [lower_bound] ":" [upper_bound] [ ":" ' - '[stride] ]\n' - ' lower_bound ::= expression\n' - ' upper_bound ::= expression\n' - ' stride ::= expression\n' - '\n' - 'There is ambiguity in the formal syntax here: anything that ' - 'looks like\n' - 'an expression list also looks like a slice list, so any ' - 'subscription\n' - 'can be interpreted as a slicing. Rather than further ' - 'complicating the\n' - 'syntax, this is disambiguated by defining that in this case ' - 'the\n' - 'interpretation as a subscription takes priority over the\n' - 'interpretation as a slicing (this is the case if the slice ' - 'list\n' - 'contains no proper slice).\n' - '\n' - 'The semantics for a slicing are as follows. The primary is ' - 'indexed\n' - '(using the same "__getitem__()" method as normal subscription) ' - 'with a\n' - 'key that is constructed from the slice list, as follows. If ' - 'the slice\n' - 'list contains at least one comma, the key is a tuple ' - 'containing the\n' - 'conversion of the slice items; otherwise, the conversion of ' - 'the lone\n' - 'slice item is the key. The conversion of a slice item that is ' - 'an\n' - 'expression is that expression. The conversion of a proper ' - 'slice is a\n' - 'slice object (see section *The standard type hierarchy*) ' - 'whose\n' - '"start", "stop" and "step" attributes are the values of the\n' - 'expressions given as lower bound, upper bound and stride,\n' - 'respectively, substituting "None" for missing expressions.\n', - 'specialattrs': '\n' - 'Special Attributes\n' - '******************\n' - '\n' - 'The implementation adds a few special read-only attributes ' - 'to several\n' - 'object types, where they are relevant. Some of these are ' - 'not reported\n' - 'by the "dir()" built-in function.\n' - '\n' - 'object.__dict__\n' - '\n' - ' A dictionary or other mapping object used to store an ' - "object's\n" - ' (writable) attributes.\n' - '\n' - 'instance.__class__\n' - '\n' - ' The class to which a class instance belongs.\n' - '\n' - 'class.__bases__\n' - '\n' - ' The tuple of base classes of a class object.\n' - '\n' - 'definition.__name__\n' - '\n' - ' The name of the class, function, method, descriptor, or ' - 'generator\n' - ' instance.\n' - '\n' - 'definition.__qualname__\n' - '\n' - ' The *qualified name* of the class, function, method, ' - 'descriptor, or\n' - ' generator instance.\n' - '\n' - ' New in version 3.3.\n' - '\n' - 'class.__mro__\n' - '\n' - ' This attribute is a tuple of classes that are ' - 'considered when\n' - ' looking for base classes during method resolution.\n' - '\n' - 'class.mro()\n' - '\n' - ' This method can be overridden by a metaclass to ' - 'customize the\n' - ' method resolution order for its instances. It is ' - 'called at class\n' - ' instantiation, and its result is stored in "__mro__".\n' - '\n' - 'class.__subclasses__()\n' - '\n' - ' Each class keeps a list of weak references to its ' - 'immediate\n' - ' subclasses. This method returns a list of all those ' - 'references\n' - ' still alive. Example:\n' - '\n' - ' >>> int.__subclasses__()\n' - " []\n" - '\n' - '-[ Footnotes ]-\n' - '\n' - '[1] Additional information on these special methods may be ' - 'found\n' - ' in the Python Reference Manual (*Basic ' - 'customization*).\n' - '\n' - '[2] As a consequence, the list "[1, 2]" is considered ' - 'equal to\n' - ' "[1.0, 2.0]", and similarly for tuples.\n' - '\n' - "[3] They must have since the parser can't tell the type of " - 'the\n' - ' operands.\n' - '\n' - '[4] Cased characters are those with general category ' - 'property\n' - ' being one of "Lu" (Letter, uppercase), "Ll" (Letter, ' - 'lowercase),\n' - ' or "Lt" (Letter, titlecase).\n' - '\n' - '[5] To format only a tuple you should therefore provide a\n' - ' singleton tuple whose only element is the tuple to be ' - 'formatted.\n', - 'specialnames': '\n' - 'Special method names\n' - '********************\n' - '\n' - 'A class can implement certain operations that are invoked ' - 'by special\n' - 'syntax (such as arithmetic operations or subscripting and ' - 'slicing) by\n' - "defining methods with special names. This is Python's " - 'approach to\n' - '*operator overloading*, allowing classes to define their ' - 'own behavior\n' - 'with respect to language operators. For instance, if a ' - 'class defines\n' - 'a method named "__getitem__()", and "x" is an instance of ' - 'this class,\n' - 'then "x[i]" is roughly equivalent to ' - '"type(x).__getitem__(x, i)".\n' - 'Except where mentioned, attempts to execute an operation ' - 'raise an\n' - 'exception when no appropriate method is defined ' - '(typically\n' - '"AttributeError" or "TypeError").\n' - '\n' - 'When implementing a class that emulates any built-in type, ' - 'it is\n' - 'important that the emulation only be implemented to the ' - 'degree that it\n' - 'makes sense for the object being modelled. For example, ' - 'some\n' - 'sequences may work well with retrieval of individual ' - 'elements, but\n' - 'extracting a slice may not make sense. (One example of ' - 'this is the\n' - '"NodeList" interface in the W3C\'s Document Object ' - 'Model.)\n' - '\n' - '\n' - 'Basic customization\n' - '===================\n' - '\n' - 'object.__new__(cls[, ...])\n' - '\n' - ' Called to create a new instance of class *cls*. ' - '"__new__()" is a\n' - ' static method (special-cased so you need not declare it ' - 'as such)\n' - ' that takes the class of which an instance was requested ' - 'as its\n' - ' first argument. The remaining arguments are those ' - 'passed to the\n' - ' object constructor expression (the call to the class). ' - 'The return\n' - ' value of "__new__()" should be the new object instance ' - '(usually an\n' - ' instance of *cls*).\n' - '\n' - ' Typical implementations create a new instance of the ' - 'class by\n' - ' invoking the superclass\'s "__new__()" method using\n' - ' "super().__new__(cls[, ...])" with appropriate ' - 'arguments and then\n' - ' modifying the newly-created instance as necessary ' - 'before returning\n' - ' it.\n' - '\n' - ' If "__new__()" returns an instance of *cls*, then the ' - 'new\n' - ' instance\'s "__init__()" method will be invoked like\n' - ' "__init__(self[, ...])", where *self* is the new ' - 'instance and the\n' - ' remaining arguments are the same as were passed to ' - '"__new__()".\n' - '\n' - ' If "__new__()" does not return an instance of *cls*, ' - 'then the new\n' - ' instance\'s "__init__()" method will not be invoked.\n' - '\n' - ' "__new__()" is intended mainly to allow subclasses of ' - 'immutable\n' - ' types (like int, str, or tuple) to customize instance ' - 'creation. It\n' - ' is also commonly overridden in custom metaclasses in ' - 'order to\n' - ' customize class creation.\n' - '\n' - 'object.__init__(self[, ...])\n' - '\n' - ' Called after the instance has been created (by ' - '"__new__()"), but\n' - ' before it is returned to the caller. The arguments are ' - 'those\n' - ' passed to the class constructor expression. If a base ' - 'class has an\n' - ' "__init__()" method, the derived class\'s "__init__()" ' - 'method, if\n' - ' any, must explicitly call it to ensure proper ' - 'initialization of the\n' - ' base class part of the instance; for example:\n' - ' "super().__init__([args...])".\n' - '\n' - ' Because "__new__()" and "__init__()" work together in ' - 'constructing\n' - ' objects ("__new__()" to create it, and "__init__()" to ' - 'customize\n' - ' it), no non-"None" value may be returned by ' - '"__init__()"; doing so\n' - ' will cause a "TypeError" to be raised at runtime.\n' - '\n' - 'object.__del__(self)\n' - '\n' - ' Called when the instance is about to be destroyed. ' - 'This is also\n' - ' called a destructor. If a base class has a "__del__()" ' - 'method, the\n' - ' derived class\'s "__del__()" method, if any, must ' - 'explicitly call it\n' - ' to ensure proper deletion of the base class part of the ' - 'instance.\n' - ' Note that it is possible (though not recommended!) for ' - 'the\n' - ' "__del__()" method to postpone destruction of the ' - 'instance by\n' - ' creating a new reference to it. It may then be called ' - 'at a later\n' - ' time when this new reference is deleted. It is not ' - 'guaranteed that\n' - ' "__del__()" methods are called for objects that still ' - 'exist when\n' - ' the interpreter exits.\n' - '\n' - ' Note: "del x" doesn\'t directly call "x.__del__()" --- ' - 'the former\n' - ' decrements the reference count for "x" by one, and ' - 'the latter is\n' - ' only called when "x"\'s reference count reaches ' - 'zero. Some common\n' - ' situations that may prevent the reference count of an ' - 'object from\n' - ' going to zero include: circular references between ' - 'objects (e.g.,\n' - ' a doubly-linked list or a tree data structure with ' - 'parent and\n' - ' child pointers); a reference to the object on the ' - 'stack frame of\n' - ' a function that caught an exception (the traceback ' - 'stored in\n' - ' "sys.exc_info()[2]" keeps the stack frame alive); or ' - 'a reference\n' - ' to the object on the stack frame that raised an ' - 'unhandled\n' - ' exception in interactive mode (the traceback stored ' - 'in\n' - ' "sys.last_traceback" keeps the stack frame alive). ' - 'The first\n' - ' situation can only be remedied by explicitly breaking ' - 'the cycles;\n' - ' the second can be resolved by freeing the reference ' - 'to the\n' - ' traceback object when it is no longer useful, and the ' - 'third can\n' - ' be resolved by storing "None" in ' - '"sys.last_traceback". Circular\n' - ' references which are garbage are detected and cleaned ' - 'up when the\n' - " cyclic garbage collector is enabled (it's on by " - 'default). Refer\n' - ' to the documentation for the "gc" module for more ' - 'information\n' - ' about this topic.\n' - '\n' - ' Warning: Due to the precarious circumstances under ' - 'which\n' - ' "__del__()" methods are invoked, exceptions that ' - 'occur during\n' - ' their execution are ignored, and a warning is printed ' - 'to\n' - ' "sys.stderr" instead. Also, when "__del__()" is ' - 'invoked in\n' - ' response to a module being deleted (e.g., when ' - 'execution of the\n' - ' program is done), other globals referenced by the ' - '"__del__()"\n' - ' method may already have been deleted or in the ' - 'process of being\n' - ' torn down (e.g. the import machinery shutting down). ' - 'For this\n' - ' reason, "__del__()" methods should do the absolute ' - 'minimum needed\n' - ' to maintain external invariants. Starting with ' - 'version 1.5,\n' - ' Python guarantees that globals whose name begins with ' - 'a single\n' - ' underscore are deleted from their module before other ' - 'globals are\n' - ' deleted; if no other references to such globals ' - 'exist, this may\n' - ' help in assuring that imported modules are still ' - 'available at the\n' - ' time when the "__del__()" method is called.\n' - '\n' - 'object.__repr__(self)\n' - '\n' - ' Called by the "repr()" built-in function to compute the ' - '"official"\n' - ' string representation of an object. If at all ' - 'possible, this\n' - ' should look like a valid Python expression that could ' - 'be used to\n' - ' recreate an object with the same value (given an ' - 'appropriate\n' - ' environment). If this is not possible, a string of the ' - 'form\n' - ' "<...some useful description...>" should be returned. ' - 'The return\n' - ' value must be a string object. If a class defines ' - '"__repr__()" but\n' - ' not "__str__()", then "__repr__()" is also used when an ' - '"informal"\n' - ' string representation of instances of that class is ' - 'required.\n' - '\n' - ' This is typically used for debugging, so it is ' - 'important that the\n' - ' representation is information-rich and unambiguous.\n' - '\n' - 'object.__str__(self)\n' - '\n' - ' Called by "str(object)" and the built-in functions ' - '"format()" and\n' - ' "print()" to compute the "informal" or nicely printable ' - 'string\n' - ' representation of an object. The return value must be ' - 'a *string*\n' - ' object.\n' - '\n' - ' This method differs from "object.__repr__()" in that ' - 'there is no\n' - ' expectation that "__str__()" return a valid Python ' - 'expression: a\n' - ' more convenient or concise representation can be used.\n' - '\n' - ' The default implementation defined by the built-in type ' - '"object"\n' - ' calls "object.__repr__()".\n' - '\n' - 'object.__bytes__(self)\n' - '\n' - ' Called by "bytes()" to compute a byte-string ' - 'representation of an\n' - ' object. This should return a "bytes" object.\n' - '\n' - 'object.__format__(self, format_spec)\n' - '\n' - ' Called by the "format()" built-in function (and by ' - 'extension, the\n' - ' "str.format()" method of class "str") to produce a ' - '"formatted"\n' - ' string representation of an object. The "format_spec" ' - 'argument is a\n' - ' string that contains a description of the formatting ' - 'options\n' - ' desired. The interpretation of the "format_spec" ' - 'argument is up to\n' - ' the type implementing "__format__()", however most ' - 'classes will\n' - ' either delegate formatting to one of the built-in ' - 'types, or use a\n' - ' similar formatting option syntax.\n' - '\n' - ' See *Format Specification Mini-Language* for a ' - 'description of the\n' - ' standard formatting syntax.\n' - '\n' - ' The return value must be a string object.\n' - '\n' - ' Changed in version 3.4: The __format__ method of ' - '"object" itself\n' - ' raises a "TypeError" if passed any non-empty string.\n' - '\n' - 'object.__lt__(self, other)\n' - 'object.__le__(self, other)\n' - 'object.__eq__(self, other)\n' - 'object.__ne__(self, other)\n' - 'object.__gt__(self, other)\n' - 'object.__ge__(self, other)\n' - '\n' - ' These are the so-called "rich comparison" methods. The\n' - ' correspondence between operator symbols and method ' - 'names is as\n' - ' follows: "xy" calls\n' - ' "x.__gt__(y)", and "x>=y" calls "x.__ge__(y)".\n' - '\n' - ' A rich comparison method may return the singleton ' - '"NotImplemented"\n' - ' if it does not implement the operation for a given pair ' - 'of\n' - ' arguments. By convention, "False" and "True" are ' - 'returned for a\n' - ' successful comparison. However, these methods can ' - 'return any value,\n' - ' so if the comparison operator is used in a Boolean ' - 'context (e.g.,\n' - ' in the condition of an "if" statement), Python will ' - 'call "bool()"\n' - ' on the value to determine if the result is true or ' - 'false.\n' - '\n' - ' By default, "__ne__()" delegates to "__eq__()" and ' - 'inverts the\n' - ' result unless it is "NotImplemented". There are no ' - 'other implied\n' - ' relationships among the comparison operators, for ' - 'example, the\n' - ' truth of "(x.__hash__".\n' - '\n' - ' If a class that does not override "__eq__()" wishes to ' - 'suppress\n' - ' hash support, it should include "__hash__ = None" in ' - 'the class\n' - ' definition. A class which defines its own "__hash__()" ' - 'that\n' - ' explicitly raises a "TypeError" would be incorrectly ' - 'identified as\n' - ' hashable by an "isinstance(obj, collections.Hashable)" ' - 'call.\n' - '\n' - ' Note: By default, the "__hash__()" values of str, bytes ' - 'and\n' - ' datetime objects are "salted" with an unpredictable ' - 'random value.\n' - ' Although they remain constant within an individual ' - 'Python\n' - ' process, they are not predictable between repeated ' - 'invocations of\n' - ' Python.This is intended to provide protection against ' - 'a denial-\n' - ' of-service caused by carefully-chosen inputs that ' - 'exploit the\n' - ' worst case performance of a dict insertion, O(n^2) ' - 'complexity.\n' - ' See ' - 'http://www.ocert.org/advisories/ocert-2011-003.html for\n' - ' details.Changing hash values affects the iteration ' - 'order of\n' - ' dicts, sets and other mappings. Python has never ' - 'made guarantees\n' - ' about this ordering (and it typically varies between ' - '32-bit and\n' - ' 64-bit builds).See also "PYTHONHASHSEED".\n' - '\n' - ' Changed in version 3.3: Hash randomization is enabled ' - 'by default.\n' - '\n' - 'object.__bool__(self)\n' - '\n' - ' Called to implement truth value testing and the ' - 'built-in operation\n' - ' "bool()"; should return "False" or "True". When this ' - 'method is not\n' - ' defined, "__len__()" is called, if it is defined, and ' - 'the object is\n' - ' considered true if its result is nonzero. If a class ' - 'defines\n' - ' neither "__len__()" nor "__bool__()", all its instances ' - 'are\n' - ' considered true.\n' - '\n' - '\n' - 'Customizing attribute access\n' - '============================\n' - '\n' - 'The following methods can be defined to customize the ' - 'meaning of\n' - 'attribute access (use of, assignment to, or deletion of ' - '"x.name") for\n' - 'class instances.\n' - '\n' - 'object.__getattr__(self, name)\n' - '\n' - ' Called when an attribute lookup has not found the ' - 'attribute in the\n' - ' usual places (i.e. it is not an instance attribute nor ' - 'is it found\n' - ' in the class tree for "self"). "name" is the attribute ' - 'name. This\n' - ' method should return the (computed) attribute value or ' - 'raise an\n' - ' "AttributeError" exception.\n' - '\n' - ' Note that if the attribute is found through the normal ' - 'mechanism,\n' - ' "__getattr__()" is not called. (This is an intentional ' - 'asymmetry\n' - ' between "__getattr__()" and "__setattr__()".) This is ' - 'done both for\n' - ' efficiency reasons and because otherwise ' - '"__getattr__()" would have\n' - ' no way to access other attributes of the instance. ' - 'Note that at\n' - ' least for instance variables, you can fake total ' - 'control by not\n' - ' inserting any values in the instance attribute ' - 'dictionary (but\n' - ' instead inserting them in another object). See the\n' - ' "__getattribute__()" method below for a way to actually ' - 'get total\n' - ' control over attribute access.\n' - '\n' - 'object.__getattribute__(self, name)\n' - '\n' - ' Called unconditionally to implement attribute accesses ' - 'for\n' - ' instances of the class. If the class also defines ' - '"__getattr__()",\n' - ' the latter will not be called unless ' - '"__getattribute__()" either\n' - ' calls it explicitly or raises an "AttributeError". This ' - 'method\n' - ' should return the (computed) attribute value or raise ' - 'an\n' - ' "AttributeError" exception. In order to avoid infinite ' - 'recursion in\n' - ' this method, its implementation should always call the ' - 'base class\n' - ' method with the same name to access any attributes it ' - 'needs, for\n' - ' example, "object.__getattribute__(self, name)".\n' - '\n' - ' Note: This method may still be bypassed when looking up ' - 'special\n' - ' methods as the result of implicit invocation via ' - 'language syntax\n' - ' or built-in functions. See *Special method lookup*.\n' - '\n' - 'object.__setattr__(self, name, value)\n' - '\n' - ' Called when an attribute assignment is attempted. This ' - 'is called\n' - ' instead of the normal mechanism (i.e. store the value ' - 'in the\n' - ' instance dictionary). *name* is the attribute name, ' - '*value* is the\n' - ' value to be assigned to it.\n' - '\n' - ' If "__setattr__()" wants to assign to an instance ' - 'attribute, it\n' - ' should call the base class method with the same name, ' - 'for example,\n' - ' "object.__setattr__(self, name, value)".\n' - '\n' - 'object.__delattr__(self, name)\n' - '\n' - ' Like "__setattr__()" but for attribute deletion instead ' - 'of\n' - ' assignment. This should only be implemented if "del ' - 'obj.name" is\n' - ' meaningful for the object.\n' - '\n' - 'object.__dir__(self)\n' - '\n' - ' Called when "dir()" is called on the object. A sequence ' - 'must be\n' - ' returned. "dir()" converts the returned sequence to a ' - 'list and\n' - ' sorts it.\n' - '\n' - '\n' - 'Implementing Descriptors\n' - '------------------------\n' - '\n' - 'The following methods only apply when an instance of the ' - 'class\n' - 'containing the method (a so-called *descriptor* class) ' - 'appears in an\n' - '*owner* class (the descriptor must be in either the ' - "owner's class\n" - 'dictionary or in the class dictionary for one of its ' - 'parents). In the\n' - 'examples below, "the attribute" refers to the attribute ' - 'whose name is\n' - 'the key of the property in the owner class\' "__dict__".\n' - '\n' - 'object.__get__(self, instance, owner)\n' - '\n' - ' Called to get the attribute of the owner class (class ' - 'attribute\n' - ' access) or of an instance of that class (instance ' - 'attribute\n' - ' access). *owner* is always the owner class, while ' - '*instance* is the\n' - ' instance that the attribute was accessed through, or ' - '"None" when\n' - ' the attribute is accessed through the *owner*. This ' - 'method should\n' - ' return the (computed) attribute value or raise an ' - '"AttributeError"\n' - ' exception.\n' - '\n' - 'object.__set__(self, instance, value)\n' - '\n' - ' Called to set the attribute on an instance *instance* ' - 'of the owner\n' - ' class to a new value, *value*.\n' - '\n' - 'object.__delete__(self, instance)\n' - '\n' - ' Called to delete the attribute on an instance ' - '*instance* of the\n' - ' owner class.\n' - '\n' - 'The attribute "__objclass__" is interpreted by the ' - '"inspect" module as\n' - 'specifying the class where this object was defined ' - '(setting this\n' - 'appropriately can assist in runtime introspection of ' - 'dynamic class\n' - 'attributes). For callables, it may indicate that an ' - 'instance of the\n' - 'given type (or a subclass) is expected or required as the ' - 'first\n' - 'positional argument (for example, CPython sets this ' - 'attribute for\n' - 'unbound methods that are implemented in C).\n' - '\n' - '\n' - 'Invoking Descriptors\n' - '--------------------\n' - '\n' - 'In general, a descriptor is an object attribute with ' - '"binding\n' - 'behavior", one whose attribute access has been overridden ' - 'by methods\n' - 'in the descriptor protocol: "__get__()", "__set__()", ' - 'and\n' - '"__delete__()". If any of those methods are defined for an ' - 'object, it\n' - 'is said to be a descriptor.\n' - '\n' - 'The default behavior for attribute access is to get, set, ' - 'or delete\n' - "the attribute from an object's dictionary. For instance, " - '"a.x" has a\n' - 'lookup chain starting with "a.__dict__[\'x\']", then\n' - '"type(a).__dict__[\'x\']", and continuing through the base ' - 'classes of\n' - '"type(a)" excluding metaclasses.\n' - '\n' - 'However, if the looked-up value is an object defining one ' - 'of the\n' - 'descriptor methods, then Python may override the default ' - 'behavior and\n' - 'invoke the descriptor method instead. Where this occurs ' - 'in the\n' - 'precedence chain depends on which descriptor methods were ' - 'defined and\n' - 'how they were called.\n' - '\n' - 'The starting point for descriptor invocation is a binding, ' - '"a.x". How\n' - 'the arguments are assembled depends on "a":\n' - '\n' - 'Direct Call\n' - ' The simplest and least common call is when user code ' - 'directly\n' - ' invokes a descriptor method: "x.__get__(a)".\n' - '\n' - 'Instance Binding\n' - ' If binding to an object instance, "a.x" is transformed ' - 'into the\n' - ' call: "type(a).__dict__[\'x\'].__get__(a, type(a))".\n' - '\n' - 'Class Binding\n' - ' If binding to a class, "A.x" is transformed into the ' - 'call:\n' - ' "A.__dict__[\'x\'].__get__(None, A)".\n' - '\n' - 'Super Binding\n' - ' If "a" is an instance of "super", then the binding ' - '"super(B,\n' - ' obj).m()" searches "obj.__class__.__mro__" for the base ' - 'class "A"\n' - ' immediately preceding "B" and then invokes the ' - 'descriptor with the\n' - ' call: "A.__dict__[\'m\'].__get__(obj, obj.__class__)".\n' - '\n' - 'For instance bindings, the precedence of descriptor ' - 'invocation depends\n' - 'on the which descriptor methods are defined. A descriptor ' - 'can define\n' - 'any combination of "__get__()", "__set__()" and ' - '"__delete__()". If it\n' - 'does not define "__get__()", then accessing the attribute ' - 'will return\n' - 'the descriptor object itself unless there is a value in ' - "the object's\n" - 'instance dictionary. If the descriptor defines ' - '"__set__()" and/or\n' - '"__delete__()", it is a data descriptor; if it defines ' - 'neither, it is\n' - 'a non-data descriptor. Normally, data descriptors define ' - 'both\n' - '"__get__()" and "__set__()", while non-data descriptors ' - 'have just the\n' - '"__get__()" method. Data descriptors with "__set__()" and ' - '"__get__()"\n' - 'defined always override a redefinition in an instance ' - 'dictionary. In\n' - 'contrast, non-data descriptors can be overridden by ' - 'instances.\n' - '\n' - 'Python methods (including "staticmethod()" and ' - '"classmethod()") are\n' - 'implemented as non-data descriptors. Accordingly, ' - 'instances can\n' - 'redefine and override methods. This allows individual ' - 'instances to\n' - 'acquire behaviors that differ from other instances of the ' - 'same class.\n' - '\n' - 'The "property()" function is implemented as a data ' - 'descriptor.\n' - 'Accordingly, instances cannot override the behavior of a ' - 'property.\n' - '\n' - '\n' - '__slots__\n' - '---------\n' - '\n' - 'By default, instances of classes have a dictionary for ' - 'attribute\n' - 'storage. This wastes space for objects having very few ' - 'instance\n' - 'variables. The space consumption can become acute when ' - 'creating large\n' - 'numbers of instances.\n' - '\n' - 'The default can be overridden by defining *__slots__* in a ' - 'class\n' - 'definition. The *__slots__* declaration takes a sequence ' - 'of instance\n' - 'variables and reserves just enough space in each instance ' - 'to hold a\n' - 'value for each variable. Space is saved because ' - '*__dict__* is not\n' - 'created for each instance.\n' - '\n' - 'object.__slots__\n' - '\n' - ' This class variable can be assigned a string, iterable, ' - 'or sequence\n' - ' of strings with variable names used by instances. ' - '*__slots__*\n' - ' reserves space for the declared variables and prevents ' - 'the\n' - ' automatic creation of *__dict__* and *__weakref__* for ' - 'each\n' - ' instance.\n' - '\n' - '\n' - 'Notes on using *__slots__*\n' - '~~~~~~~~~~~~~~~~~~~~~~~~~~\n' - '\n' - '* When inheriting from a class without *__slots__*, the ' - '*__dict__*\n' - ' attribute of that class will always be accessible, so a ' - '*__slots__*\n' - ' definition in the subclass is meaningless.\n' - '\n' - '* Without a *__dict__* variable, instances cannot be ' - 'assigned new\n' - ' variables not listed in the *__slots__* definition. ' - 'Attempts to\n' - ' assign to an unlisted variable name raises ' - '"AttributeError". If\n' - ' dynamic assignment of new variables is desired, then ' - 'add\n' - ' "\'__dict__\'" to the sequence of strings in the ' - '*__slots__*\n' - ' declaration.\n' - '\n' - '* Without a *__weakref__* variable for each instance, ' - 'classes\n' - ' defining *__slots__* do not support weak references to ' - 'its\n' - ' instances. If weak reference support is needed, then ' - 'add\n' - ' "\'__weakref__\'" to the sequence of strings in the ' - '*__slots__*\n' - ' declaration.\n' - '\n' - '* *__slots__* are implemented at the class level by ' - 'creating\n' - ' descriptors (*Implementing Descriptors*) for each ' - 'variable name. As\n' - ' a result, class attributes cannot be used to set default ' - 'values for\n' - ' instance variables defined by *__slots__*; otherwise, ' - 'the class\n' - ' attribute would overwrite the descriptor assignment.\n' - '\n' - '* The action of a *__slots__* declaration is limited to ' - 'the class\n' - ' where it is defined. As a result, subclasses will have ' - 'a *__dict__*\n' - ' unless they also define *__slots__* (which must only ' - 'contain names\n' - ' of any *additional* slots).\n' - '\n' - '* If a class defines a slot also defined in a base class, ' - 'the\n' - ' instance variable defined by the base class slot is ' - 'inaccessible\n' - ' (except by retrieving its descriptor directly from the ' - 'base class).\n' - ' This renders the meaning of the program undefined. In ' - 'the future, a\n' - ' check may be added to prevent this.\n' - '\n' - '* Nonempty *__slots__* does not work for classes derived ' - 'from\n' - ' "variable-length" built-in types such as "int", "bytes" ' - 'and "tuple".\n' - '\n' - '* Any non-string iterable may be assigned to *__slots__*. ' - 'Mappings\n' - ' may also be used; however, in the future, special ' - 'meaning may be\n' - ' assigned to the values corresponding to each key.\n' - '\n' - '* *__class__* assignment works only if both classes have ' - 'the same\n' - ' *__slots__*.\n' - '\n' - '\n' - 'Customizing class creation\n' - '==========================\n' - '\n' - 'By default, classes are constructed using "type()". The ' - 'class body is\n' - 'executed in a new namespace and the class name is bound ' - 'locally to the\n' - 'result of "type(name, bases, namespace)".\n' - '\n' - 'The class creation process can be customized by passing ' - 'the\n' - '"metaclass" keyword argument in the class definition line, ' - 'or by\n' - 'inheriting from an existing class that included such an ' - 'argument. In\n' - 'the following example, both "MyClass" and "MySubclass" are ' - 'instances\n' - 'of "Meta":\n' - '\n' - ' class Meta(type):\n' - ' pass\n' - '\n' - ' class MyClass(metaclass=Meta):\n' - ' pass\n' - '\n' - ' class MySubclass(MyClass):\n' - ' pass\n' - '\n' - 'Any other keyword arguments that are specified in the ' - 'class definition\n' - 'are passed through to all metaclass operations described ' - 'below.\n' - '\n' - 'When a class definition is executed, the following steps ' - 'occur:\n' - '\n' - '* the appropriate metaclass is determined\n' - '\n' - '* the class namespace is prepared\n' - '\n' - '* the class body is executed\n' - '\n' - '* the class object is created\n' - '\n' - '\n' - 'Determining the appropriate metaclass\n' - '-------------------------------------\n' - '\n' - 'The appropriate metaclass for a class definition is ' - 'determined as\n' - 'follows:\n' - '\n' - '* if no bases and no explicit metaclass are given, then ' - '"type()" is\n' - ' used\n' - '\n' - '* if an explicit metaclass is given and it is *not* an ' - 'instance of\n' - ' "type()", then it is used directly as the metaclass\n' - '\n' - '* if an instance of "type()" is given as the explicit ' - 'metaclass, or\n' - ' bases are defined, then the most derived metaclass is ' - 'used\n' - '\n' - 'The most derived metaclass is selected from the explicitly ' - 'specified\n' - 'metaclass (if any) and the metaclasses (i.e. "type(cls)") ' - 'of all\n' - 'specified base classes. The most derived metaclass is one ' - 'which is a\n' - 'subtype of *all* of these candidate metaclasses. If none ' - 'of the\n' - 'candidate metaclasses meets that criterion, then the class ' - 'definition\n' - 'will fail with "TypeError".\n' - '\n' - '\n' - 'Preparing the class namespace\n' - '-----------------------------\n' - '\n' - 'Once the appropriate metaclass has been identified, then ' - 'the class\n' - 'namespace is prepared. If the metaclass has a ' - '"__prepare__" attribute,\n' - 'it is called as "namespace = metaclass.__prepare__(name, ' - 'bases,\n' - '**kwds)" (where the additional keyword arguments, if any, ' - 'come from\n' - 'the class definition).\n' - '\n' - 'If the metaclass has no "__prepare__" attribute, then the ' - 'class\n' - 'namespace is initialised as an empty "dict()" instance.\n' - '\n' - 'See also: **PEP 3115** - Metaclasses in Python 3000\n' - '\n' - ' Introduced the "__prepare__" namespace hook\n' - '\n' - '\n' - 'Executing the class body\n' - '------------------------\n' - '\n' - 'The class body is executed (approximately) as "exec(body, ' - 'globals(),\n' - 'namespace)". The key difference from a normal call to ' - '"exec()" is that\n' - 'lexical scoping allows the class body (including any ' - 'methods) to\n' - 'reference names from the current and outer scopes when the ' - 'class\n' - 'definition occurs inside a function.\n' - '\n' - 'However, even when the class definition occurs inside the ' - 'function,\n' - 'methods defined inside the class still cannot see names ' - 'defined at the\n' - 'class scope. Class variables must be accessed through the ' - 'first\n' - 'parameter of instance or class methods, and cannot be ' - 'accessed at all\n' - 'from static methods.\n' - '\n' - '\n' - 'Creating the class object\n' - '-------------------------\n' - '\n' - 'Once the class namespace has been populated by executing ' - 'the class\n' - 'body, the class object is created by calling ' - '"metaclass(name, bases,\n' - 'namespace, **kwds)" (the additional keywords passed here ' - 'are the same\n' - 'as those passed to "__prepare__").\n' - '\n' - 'This class object is the one that will be referenced by ' - 'the zero-\n' - 'argument form of "super()". "__class__" is an implicit ' - 'closure\n' - 'reference created by the compiler if any methods in a ' - 'class body refer\n' - 'to either "__class__" or "super". This allows the zero ' - 'argument form\n' - 'of "super()" to correctly identify the class being defined ' - 'based on\n' - 'lexical scoping, while the class or instance that was used ' - 'to make the\n' - 'current call is identified based on the first argument ' - 'passed to the\n' - 'method.\n' - '\n' - 'After the class object is created, it is passed to the ' - 'class\n' - 'decorators included in the class definition (if any) and ' - 'the resulting\n' - 'object is bound in the local namespace as the defined ' - 'class.\n' - '\n' - 'When a new class is created by "type.__new__", the object ' - 'provided as\n' - 'the namespace parameter is copied to a standard Python ' - 'dictionary and\n' - 'the original object is discarded. The new copy becomes the ' - '"__dict__"\n' - 'attribute of the class object.\n' - '\n' - 'See also: **PEP 3135** - New super\n' - '\n' - ' Describes the implicit "__class__" closure reference\n' - '\n' - '\n' - 'Metaclass example\n' - '-----------------\n' - '\n' - 'The potential uses for metaclasses are boundless. Some ' - 'ideas that have\n' - 'been explored include logging, interface checking, ' - 'automatic\n' - 'delegation, automatic property creation, proxies, ' - 'frameworks, and\n' - 'automatic resource locking/synchronization.\n' - '\n' - 'Here is an example of a metaclass that uses an\n' - '"collections.OrderedDict" to remember the order that class ' - 'variables\n' - 'are defined:\n' - '\n' - ' class OrderedClass(type):\n' - '\n' - ' @classmethod\n' - ' def __prepare__(metacls, name, bases, **kwds):\n' - ' return collections.OrderedDict()\n' - '\n' - ' def __new__(cls, name, bases, namespace, **kwds):\n' - ' result = type.__new__(cls, name, bases, ' - 'dict(namespace))\n' - ' result.members = tuple(namespace)\n' - ' return result\n' - '\n' - ' class A(metaclass=OrderedClass):\n' - ' def one(self): pass\n' - ' def two(self): pass\n' - ' def three(self): pass\n' - ' def four(self): pass\n' - '\n' - ' >>> A.members\n' - " ('__module__', 'one', 'two', 'three', 'four')\n" - '\n' - 'When the class definition for *A* gets executed, the ' - 'process begins\n' - 'with calling the metaclass\'s "__prepare__()" method which ' - 'returns an\n' - 'empty "collections.OrderedDict". That mapping records the ' - 'methods and\n' - 'attributes of *A* as they are defined within the body of ' - 'the class\n' - 'statement. Once those definitions are executed, the ' - 'ordered dictionary\n' - 'is fully populated and the metaclass\'s "__new__()" method ' - 'gets\n' - 'invoked. That method builds the new type and it saves the ' - 'ordered\n' - 'dictionary keys in an attribute called "members".\n' - '\n' - '\n' - 'Customizing instance and subclass checks\n' - '========================================\n' - '\n' - 'The following methods are used to override the default ' - 'behavior of the\n' - '"isinstance()" and "issubclass()" built-in functions.\n' - '\n' - 'In particular, the metaclass "abc.ABCMeta" implements ' - 'these methods in\n' - 'order to allow the addition of Abstract Base Classes ' - '(ABCs) as\n' - '"virtual base classes" to any class or type (including ' - 'built-in\n' - 'types), including other ABCs.\n' - '\n' - 'class.__instancecheck__(self, instance)\n' - '\n' - ' Return true if *instance* should be considered a ' - '(direct or\n' - ' indirect) instance of *class*. If defined, called to ' - 'implement\n' - ' "isinstance(instance, class)".\n' - '\n' - 'class.__subclasscheck__(self, subclass)\n' - '\n' - ' Return true if *subclass* should be considered a ' - '(direct or\n' - ' indirect) subclass of *class*. If defined, called to ' - 'implement\n' - ' "issubclass(subclass, class)".\n' - '\n' - 'Note that these methods are looked up on the type ' - '(metaclass) of a\n' - 'class. They cannot be defined as class methods in the ' - 'actual class.\n' - 'This is consistent with the lookup of special methods that ' - 'are called\n' - 'on instances, only in this case the instance is itself a ' - 'class.\n' - '\n' - 'See also: **PEP 3119** - Introducing Abstract Base ' - 'Classes\n' - '\n' - ' Includes the specification for customizing ' - '"isinstance()" and\n' - ' "issubclass()" behavior through "__instancecheck__()" ' - 'and\n' - ' "__subclasscheck__()", with motivation for this ' - 'functionality in\n' - ' the context of adding Abstract Base Classes (see the ' - '"abc"\n' - ' module) to the language.\n' - '\n' - '\n' - 'Emulating callable objects\n' - '==========================\n' - '\n' - 'object.__call__(self[, args...])\n' - '\n' - ' Called when the instance is "called" as a function; if ' - 'this method\n' - ' is defined, "x(arg1, arg2, ...)" is a shorthand for\n' - ' "x.__call__(arg1, arg2, ...)".\n' - '\n' - '\n' - 'Emulating container types\n' - '=========================\n' - '\n' - 'The following methods can be defined to implement ' - 'container objects.\n' - 'Containers usually are sequences (such as lists or tuples) ' - 'or mappings\n' - '(like dictionaries), but can represent other containers as ' - 'well. The\n' - 'first set of methods is used either to emulate a sequence ' - 'or to\n' - 'emulate a mapping; the difference is that for a sequence, ' - 'the\n' - 'allowable keys should be the integers *k* for which "0 <= ' - 'k < N" where\n' - '*N* is the length of the sequence, or slice objects, which ' - 'define a\n' - 'range of items. It is also recommended that mappings ' - 'provide the\n' - 'methods "keys()", "values()", "items()", "get()", ' - '"clear()",\n' - '"setdefault()", "pop()", "popitem()", "copy()", and ' - '"update()"\n' - "behaving similar to those for Python's standard dictionary " - 'objects.\n' - 'The "collections" module provides a "MutableMapping" ' - 'abstract base\n' - 'class to help create those methods from a base set of ' - '"__getitem__()",\n' - '"__setitem__()", "__delitem__()", and "keys()". Mutable ' - 'sequences\n' - 'should provide methods "append()", "count()", "index()", ' - '"extend()",\n' - '"insert()", "pop()", "remove()", "reverse()" and "sort()", ' - 'like Python\n' - 'standard list objects. Finally, sequence types should ' - 'implement\n' - 'addition (meaning concatenation) and multiplication ' - '(meaning\n' - 'repetition) by defining the methods "__add__()", ' - '"__radd__()",\n' - '"__iadd__()", "__mul__()", "__rmul__()" and "__imul__()" ' - 'described\n' - 'below; they should not define other numerical operators. ' - 'It is\n' - 'recommended that both mappings and sequences implement ' - 'the\n' - '"__contains__()" method to allow efficient use of the "in" ' - 'operator;\n' - 'for mappings, "in" should search the mapping\'s keys; for ' - 'sequences, it\n' - 'should search through the values. It is further ' - 'recommended that both\n' - 'mappings and sequences implement the "__iter__()" method ' - 'to allow\n' - 'efficient iteration through the container; for mappings, ' - '"__iter__()"\n' - 'should be the same as "keys()"; for sequences, it should ' - 'iterate\n' - 'through the values.\n' - '\n' - 'object.__len__(self)\n' - '\n' - ' Called to implement the built-in function "len()". ' - 'Should return\n' - ' the length of the object, an integer ">=" 0. Also, an ' - 'object that\n' - ' doesn\'t define a "__bool__()" method and whose ' - '"__len__()" method\n' - ' returns zero is considered to be false in a Boolean ' - 'context.\n' - '\n' - ' **CPython implementation detail:** In CPython, the ' - 'length is\n' - ' required to be at most "sys.maxsize". If the length is ' - 'larger than\n' - ' "sys.maxsize" some features (such as "len()") may ' - 'raise\n' - ' "OverflowError". To prevent raising "OverflowError" by ' - 'truth value\n' - ' testing, an object must define a "__bool__()" method.\n' - '\n' - 'object.__length_hint__(self)\n' - '\n' - ' Called to implement "operator.length_hint()". Should ' - 'return an\n' - ' estimated length for the object (which may be greater ' - 'or less than\n' - ' the actual length). The length must be an integer ">=" ' - '0. This\n' - ' method is purely an optimization and is never required ' - 'for\n' - ' correctness.\n' - '\n' - ' New in version 3.4.\n' - '\n' - 'Note: Slicing is done exclusively with the following three ' - 'methods.\n' - ' A call like\n' - '\n' - ' a[1:2] = b\n' - '\n' - ' is translated to\n' - '\n' - ' a[slice(1, 2, None)] = b\n' - '\n' - ' and so forth. Missing slice items are always filled in ' - 'with "None".\n' - '\n' - 'object.__getitem__(self, key)\n' - '\n' - ' Called to implement evaluation of "self[key]". For ' - 'sequence types,\n' - ' the accepted keys should be integers and slice ' - 'objects. Note that\n' - ' the special interpretation of negative indexes (if the ' - 'class wishes\n' - ' to emulate a sequence type) is up to the ' - '"__getitem__()" method. If\n' - ' *key* is of an inappropriate type, "TypeError" may be ' - 'raised; if of\n' - ' a value outside the set of indexes for the sequence ' - '(after any\n' - ' special interpretation of negative values), ' - '"IndexError" should be\n' - ' raised. For mapping types, if *key* is missing (not in ' - 'the\n' - ' container), "KeyError" should be raised.\n' - '\n' - ' Note: "for" loops expect that an "IndexError" will be ' - 'raised for\n' - ' illegal indexes to allow proper detection of the end ' - 'of the\n' - ' sequence.\n' - '\n' - 'object.__missing__(self, key)\n' - '\n' - ' Called by "dict"."__getitem__()" to implement ' - '"self[key]" for dict\n' - ' subclasses when key is not in the dictionary.\n' - '\n' - 'object.__setitem__(self, key, value)\n' - '\n' - ' Called to implement assignment to "self[key]". Same ' - 'note as for\n' - ' "__getitem__()". This should only be implemented for ' - 'mappings if\n' - ' the objects support changes to the values for keys, or ' - 'if new keys\n' - ' can be added, or for sequences if elements can be ' - 'replaced. The\n' - ' same exceptions should be raised for improper *key* ' - 'values as for\n' - ' the "__getitem__()" method.\n' - '\n' - 'object.__delitem__(self, key)\n' - '\n' - ' Called to implement deletion of "self[key]". Same note ' - 'as for\n' - ' "__getitem__()". This should only be implemented for ' - 'mappings if\n' - ' the objects support removal of keys, or for sequences ' - 'if elements\n' - ' can be removed from the sequence. The same exceptions ' - 'should be\n' - ' raised for improper *key* values as for the ' - '"__getitem__()" method.\n' - '\n' - 'object.__iter__(self)\n' - '\n' - ' This method is called when an iterator is required for ' - 'a container.\n' - ' This method should return a new iterator object that ' - 'can iterate\n' - ' over all the objects in the container. For mappings, ' - 'it should\n' - ' iterate over the keys of the container.\n' - '\n' - ' Iterator objects also need to implement this method; ' - 'they are\n' - ' required to return themselves. For more information on ' - 'iterator\n' - ' objects, see *Iterator Types*.\n' - '\n' - 'object.__reversed__(self)\n' - '\n' - ' Called (if present) by the "reversed()" built-in to ' - 'implement\n' - ' reverse iteration. It should return a new iterator ' - 'object that\n' - ' iterates over all the objects in the container in ' - 'reverse order.\n' - '\n' - ' If the "__reversed__()" method is not provided, the ' - '"reversed()"\n' - ' built-in will fall back to using the sequence protocol ' - '("__len__()"\n' - ' and "__getitem__()"). Objects that support the ' - 'sequence protocol\n' - ' should only provide "__reversed__()" if they can ' - 'provide an\n' - ' implementation that is more efficient than the one ' - 'provided by\n' - ' "reversed()".\n' - '\n' - 'The membership test operators ("in" and "not in") are ' - 'normally\n' - 'implemented as an iteration through a sequence. However, ' - 'container\n' - 'objects can supply the following special method with a ' - 'more efficient\n' - 'implementation, which also does not require the object be ' - 'a sequence.\n' - '\n' - 'object.__contains__(self, item)\n' - '\n' - ' Called to implement membership test operators. Should ' - 'return true\n' - ' if *item* is in *self*, false otherwise. For mapping ' - 'objects, this\n' - ' should consider the keys of the mapping rather than the ' - 'values or\n' - ' the key-item pairs.\n' - '\n' - ' For objects that don\'t define "__contains__()", the ' - 'membership test\n' - ' first tries iteration via "__iter__()", then the old ' - 'sequence\n' - ' iteration protocol via "__getitem__()", see *this ' - 'section in the\n' - ' language reference*.\n' - '\n' - '\n' - 'Emulating numeric types\n' - '=======================\n' - '\n' - 'The following methods can be defined to emulate numeric ' - 'objects.\n' - 'Methods corresponding to operations that are not supported ' - 'by the\n' - 'particular kind of number implemented (e.g., bitwise ' - 'operations for\n' - 'non-integral numbers) should be left undefined.\n' - '\n' - 'object.__add__(self, other)\n' - 'object.__sub__(self, other)\n' - 'object.__mul__(self, other)\n' - 'object.__matmul__(self, other)\n' - 'object.__truediv__(self, other)\n' - 'object.__floordiv__(self, other)\n' - 'object.__mod__(self, other)\n' - 'object.__divmod__(self, other)\n' - 'object.__pow__(self, other[, modulo])\n' - 'object.__lshift__(self, other)\n' - 'object.__rshift__(self, other)\n' - 'object.__and__(self, other)\n' - 'object.__xor__(self, other)\n' - 'object.__or__(self, other)\n' - '\n' - ' These methods are called to implement the binary ' - 'arithmetic\n' - ' operations ("+", "-", "*", "@", "/", "//", "%", ' - '"divmod()",\n' - ' "pow()", "**", "<<", ">>", "&", "^", "|"). For ' - 'instance, to\n' - ' evaluate the expression "x + y", where *x* is an ' - 'instance of a\n' - ' class that has an "__add__()" method, "x.__add__(y)" is ' - 'called.\n' - ' The "__divmod__()" method should be the equivalent to ' - 'using\n' - ' "__floordiv__()" and "__mod__()"; it should not be ' - 'related to\n' - ' "__truediv__()". Note that "__pow__()" should be ' - 'defined to accept\n' - ' an optional third argument if the ternary version of ' - 'the built-in\n' - ' "pow()" function is to be supported.\n' - '\n' - ' If one of those methods does not support the operation ' - 'with the\n' - ' supplied arguments, it should return "NotImplemented".\n' - '\n' - 'object.__radd__(self, other)\n' - 'object.__rsub__(self, other)\n' - 'object.__rmul__(self, other)\n' - 'object.__rmatmul__(self, other)\n' - 'object.__rtruediv__(self, other)\n' - 'object.__rfloordiv__(self, other)\n' - 'object.__rmod__(self, other)\n' - 'object.__rdivmod__(self, other)\n' - 'object.__rpow__(self, other)\n' - 'object.__rlshift__(self, other)\n' - 'object.__rrshift__(self, other)\n' - 'object.__rand__(self, other)\n' - 'object.__rxor__(self, other)\n' - 'object.__ror__(self, other)\n' - '\n' - ' These methods are called to implement the binary ' - 'arithmetic\n' - ' operations ("+", "-", "*", "@", "/", "//", "%", ' - '"divmod()",\n' - ' "pow()", "**", "<<", ">>", "&", "^", "|") with ' - 'reflected (swapped)\n' - ' operands. These functions are only called if the left ' - 'operand does\n' - ' not support the corresponding operation and the ' - 'operands are of\n' - ' different types. [2] For instance, to evaluate the ' - 'expression "x -\n' - ' y", where *y* is an instance of a class that has an ' - '"__rsub__()"\n' - ' method, "y.__rsub__(x)" is called if "x.__sub__(y)" ' - 'returns\n' - ' *NotImplemented*.\n' - '\n' - ' Note that ternary "pow()" will not try calling ' - '"__rpow__()" (the\n' - ' coercion rules would become too complicated).\n' - '\n' - " Note: If the right operand's type is a subclass of the " - 'left\n' - " operand's type and that subclass provides the " - 'reflected method\n' - ' for the operation, this method will be called before ' - 'the left\n' - " operand's non-reflected method. This behavior allows " - 'subclasses\n' - " to override their ancestors' operations.\n" - '\n' - 'object.__iadd__(self, other)\n' - 'object.__isub__(self, other)\n' - 'object.__imul__(self, other)\n' - 'object.__imatmul__(self, other)\n' - 'object.__itruediv__(self, other)\n' - 'object.__ifloordiv__(self, other)\n' - 'object.__imod__(self, other)\n' - 'object.__ipow__(self, other[, modulo])\n' - 'object.__ilshift__(self, other)\n' - 'object.__irshift__(self, other)\n' - 'object.__iand__(self, other)\n' - 'object.__ixor__(self, other)\n' - 'object.__ior__(self, other)\n' - '\n' - ' These methods are called to implement the augmented ' - 'arithmetic\n' - ' assignments ("+=", "-=", "*=", "@=", "/=", "//=", "%=", ' - '"**=",\n' - ' "<<=", ">>=", "&=", "^=", "|="). These methods should ' - 'attempt to\n' - ' do the operation in-place (modifying *self*) and return ' - 'the result\n' - ' (which could be, but does not have to be, *self*). If ' - 'a specific\n' - ' method is not defined, the augmented assignment falls ' - 'back to the\n' - ' normal methods. For instance, if *x* is an instance of ' - 'a class\n' - ' with an "__iadd__()" method, "x += y" is equivalent to ' - '"x =\n' - ' x.__iadd__(y)" . Otherwise, "x.__add__(y)" and ' - '"y.__radd__(x)" are\n' - ' considered, as with the evaluation of "x + y". In ' - 'certain\n' - ' situations, augmented assignment can result in ' - 'unexpected errors\n' - " (see *Why does a_tuple[i] += ['item'] raise an " - 'exception when the\n' - ' addition works?*), but this behavior is in fact part of ' - 'the data\n' - ' model.\n' - '\n' - 'object.__neg__(self)\n' - 'object.__pos__(self)\n' - 'object.__abs__(self)\n' - 'object.__invert__(self)\n' - '\n' - ' Called to implement the unary arithmetic operations ' - '("-", "+",\n' - ' "abs()" and "~").\n' - '\n' - 'object.__complex__(self)\n' - 'object.__int__(self)\n' - 'object.__float__(self)\n' - 'object.__round__(self[, n])\n' - '\n' - ' Called to implement the built-in functions "complex()", ' - '"int()",\n' - ' "float()" and "round()". Should return a value of the ' - 'appropriate\n' - ' type.\n' - '\n' - 'object.__index__(self)\n' - '\n' - ' Called to implement "operator.index()", and whenever ' - 'Python needs\n' - ' to losslessly convert the numeric object to an integer ' - 'object (such\n' - ' as in slicing, or in the built-in "bin()", "hex()" and ' - '"oct()"\n' - ' functions). Presence of this method indicates that the ' - 'numeric\n' - ' object is an integer type. Must return an integer.\n' - '\n' - ' Note: In order to have a coherent integer type class, ' - 'when\n' - ' "__index__()" is defined "__int__()" should also be ' - 'defined, and\n' - ' both should return the same value.\n' - '\n' - '\n' - 'With Statement Context Managers\n' - '===============================\n' - '\n' - 'A *context manager* is an object that defines the runtime ' - 'context to\n' - 'be established when executing a "with" statement. The ' - 'context manager\n' - 'handles the entry into, and the exit from, the desired ' - 'runtime context\n' - 'for the execution of the block of code. Context managers ' - 'are normally\n' - 'invoked using the "with" statement (described in section ' - '*The with\n' - 'statement*), but can also be used by directly invoking ' - 'their methods.\n' - '\n' - 'Typical uses of context managers include saving and ' - 'restoring various\n' - 'kinds of global state, locking and unlocking resources, ' - 'closing opened\n' - 'files, etc.\n' - '\n' - 'For more information on context managers, see *Context ' - 'Manager Types*.\n' - '\n' - 'object.__enter__(self)\n' - '\n' - ' Enter the runtime context related to this object. The ' - '"with"\n' - " statement will bind this method's return value to the " - 'target(s)\n' - ' specified in the "as" clause of the statement, if any.\n' - '\n' - 'object.__exit__(self, exc_type, exc_value, traceback)\n' - '\n' - ' Exit the runtime context related to this object. The ' - 'parameters\n' - ' describe the exception that caused the context to be ' - 'exited. If the\n' - ' context was exited without an exception, all three ' - 'arguments will\n' - ' be "None".\n' - '\n' - ' If an exception is supplied, and the method wishes to ' - 'suppress the\n' - ' exception (i.e., prevent it from being propagated), it ' - 'should\n' - ' return a true value. Otherwise, the exception will be ' - 'processed\n' - ' normally upon exit from this method.\n' - '\n' - ' Note that "__exit__()" methods should not reraise the ' - 'passed-in\n' - " exception; this is the caller's responsibility.\n" - '\n' - 'See also: **PEP 343** - The "with" statement\n' - '\n' - ' The specification, background, and examples for the ' - 'Python "with"\n' - ' statement.\n' - '\n' - '\n' - 'Special method lookup\n' - '=====================\n' - '\n' - 'For custom classes, implicit invocations of special ' - 'methods are only\n' - "guaranteed to work correctly if defined on an object's " - 'type, not in\n' - "the object's instance dictionary. That behaviour is the " - 'reason why\n' - 'the following code raises an exception:\n' - '\n' - ' >>> class C:\n' - ' ... pass\n' - ' ...\n' - ' >>> c = C()\n' - ' >>> c.__len__ = lambda: 5\n' - ' >>> len(c)\n' - ' Traceback (most recent call last):\n' - ' File "", line 1, in \n' - " TypeError: object of type 'C' has no len()\n" - '\n' - 'The rationale behind this behaviour lies with a number of ' - 'special\n' - 'methods such as "__hash__()" and "__repr__()" that are ' - 'implemented by\n' - 'all objects, including type objects. If the implicit ' - 'lookup of these\n' - 'methods used the conventional lookup process, they would ' - 'fail when\n' - 'invoked on the type object itself:\n' - '\n' - ' >>> 1 .__hash__() == hash(1)\n' - ' True\n' - ' >>> int.__hash__() == hash(int)\n' - ' Traceback (most recent call last):\n' - ' File "", line 1, in \n' - " TypeError: descriptor '__hash__' of 'int' object needs " - 'an argument\n' - '\n' - 'Incorrectly attempting to invoke an unbound method of a ' - 'class in this\n' - "way is sometimes referred to as 'metaclass confusion', and " - 'is avoided\n' - 'by bypassing the instance when looking up special ' - 'methods:\n' - '\n' - ' >>> type(1).__hash__(1) == hash(1)\n' - ' True\n' - ' >>> type(int).__hash__(int) == hash(int)\n' - ' True\n' - '\n' - 'In addition to bypassing any instance attributes in the ' - 'interest of\n' - 'correctness, implicit special method lookup generally also ' - 'bypasses\n' - 'the "__getattribute__()" method even of the object\'s ' - 'metaclass:\n' - '\n' - ' >>> class Meta(type):\n' - ' ... def __getattribute__(*args):\n' - ' ... print("Metaclass getattribute invoked")\n' - ' ... return type.__getattribute__(*args)\n' - ' ...\n' - ' >>> class C(object, metaclass=Meta):\n' - ' ... def __len__(self):\n' - ' ... return 10\n' - ' ... def __getattribute__(*args):\n' - ' ... print("Class getattribute invoked")\n' - ' ... return object.__getattribute__(*args)\n' - ' ...\n' - ' >>> c = C()\n' - ' >>> c.__len__() # Explicit lookup via ' - 'instance\n' - ' Class getattribute invoked\n' - ' 10\n' - ' >>> type(c).__len__(c) # Explicit lookup via ' - 'type\n' - ' Metaclass getattribute invoked\n' - ' 10\n' - ' >>> len(c) # Implicit lookup\n' - ' 10\n' - '\n' - 'Bypassing the "__getattribute__()" machinery in this ' - 'fashion provides\n' - 'significant scope for speed optimisations within the ' - 'interpreter, at\n' - 'the cost of some flexibility in the handling of special ' - 'methods (the\n' - 'special method *must* be set on the class object itself in ' - 'order to be\n' - 'consistently invoked by the interpreter).\n', - 'string-methods': '\n' - 'String Methods\n' - '**************\n' - '\n' - 'Strings implement all of the *common* sequence ' - 'operations, along with\n' - 'the additional methods described below.\n' - '\n' - 'Strings also support two styles of string formatting, ' - 'one providing a\n' - 'large degree of flexibility and customization (see ' - '"str.format()",\n' - '*Format String Syntax* and *Custom String Formatting*) ' - 'and the other\n' - 'based on C "printf" style formatting that handles a ' - 'narrower range of\n' - 'types and is slightly harder to use correctly, but is ' - 'often faster for\n' - 'the cases it can handle (*printf-style String ' - 'Formatting*).\n' - '\n' - 'The *Text Processing Services* section of the standard ' - 'library covers\n' - 'a number of other modules that provide various text ' - 'related utilities\n' - '(including regular expression support in the "re" ' - 'module).\n' - '\n' - 'str.capitalize()\n' - '\n' - ' Return a copy of the string with its first character ' - 'capitalized\n' - ' and the rest lowercased.\n' - '\n' - 'str.casefold()\n' - '\n' - ' Return a casefolded copy of the string. Casefolded ' - 'strings may be\n' - ' used for caseless matching.\n' - '\n' - ' Casefolding is similar to lowercasing but more ' - 'aggressive because\n' - ' it is intended to remove all case distinctions in a ' - 'string. For\n' - ' example, the German lowercase letter "\'?\'" is ' - 'equivalent to ""ss"".\n' - ' Since it is already lowercase, "lower()" would do ' - 'nothing to "\'?\'";\n' - ' "casefold()" converts it to ""ss"".\n' - '\n' - ' The casefolding algorithm is described in section ' - '3.13 of the\n' - ' Unicode Standard.\n' - '\n' - ' New in version 3.3.\n' - '\n' - 'str.center(width[, fillchar])\n' - '\n' - ' Return centered in a string of length *width*. ' - 'Padding is done\n' - ' using the specified *fillchar* (default is an ASCII ' - 'space). The\n' - ' original string is returned if *width* is less than ' - 'or equal to\n' - ' "len(s)".\n' - '\n' - 'str.count(sub[, start[, end]])\n' - '\n' - ' Return the number of non-overlapping occurrences of ' - 'substring *sub*\n' - ' in the range [*start*, *end*]. Optional arguments ' - '*start* and\n' - ' *end* are interpreted as in slice notation.\n' - '\n' - 'str.encode(encoding="utf-8", errors="strict")\n' - '\n' - ' Return an encoded version of the string as a bytes ' - 'object. Default\n' - ' encoding is "\'utf-8\'". *errors* may be given to set ' - 'a different\n' - ' error handling scheme. The default for *errors* is ' - '"\'strict\'",\n' - ' meaning that encoding errors raise a "UnicodeError". ' - 'Other possible\n' - ' values are "\'ignore\'", "\'replace\'", ' - '"\'xmlcharrefreplace\'",\n' - ' "\'backslashreplace\'" and any other name registered ' - 'via\n' - ' "codecs.register_error()", see section *Error ' - 'Handlers*. For a list\n' - ' of possible encodings, see section *Standard ' - 'Encodings*.\n' - '\n' - ' Changed in version 3.1: Support for keyword arguments ' - 'added.\n' - '\n' - 'str.endswith(suffix[, start[, end]])\n' - '\n' - ' Return "True" if the string ends with the specified ' - '*suffix*,\n' - ' otherwise return "False". *suffix* can also be a ' - 'tuple of suffixes\n' - ' to look for. With optional *start*, test beginning ' - 'at that\n' - ' position. With optional *end*, stop comparing at ' - 'that position.\n' - '\n' - 'str.expandtabs(tabsize=8)\n' - '\n' - ' Return a copy of the string where all tab characters ' - 'are replaced\n' - ' by one or more spaces, depending on the current ' - 'column and the\n' - ' given tab size. Tab positions occur every *tabsize* ' - 'characters\n' - ' (default is 8, giving tab positions at columns 0, 8, ' - '16 and so on).\n' - ' To expand the string, the current column is set to ' - 'zero and the\n' - ' string is examined character by character. If the ' - 'character is a\n' - ' tab ("\\t"), one or more space characters are ' - 'inserted in the result\n' - ' until the current column is equal to the next tab ' - 'position. (The\n' - ' tab character itself is not copied.) If the ' - 'character is a newline\n' - ' ("\\n") or return ("\\r"), it is copied and the ' - 'current column is\n' - ' reset to zero. Any other character is copied ' - 'unchanged and the\n' - ' current column is incremented by one regardless of ' - 'how the\n' - ' character is represented when printed.\n' - '\n' - " >>> '01\\t012\\t0123\\t01234'.expandtabs()\n" - " '01 012 0123 01234'\n" - " >>> '01\\t012\\t0123\\t01234'.expandtabs(4)\n" - " '01 012 0123 01234'\n" - '\n' - 'str.find(sub[, start[, end]])\n' - '\n' - ' Return the lowest index in the string where substring ' - '*sub* is\n' - ' found within the slice "s[start:end]". Optional ' - 'arguments *start*\n' - ' and *end* are interpreted as in slice notation. ' - 'Return "-1" if\n' - ' *sub* is not found.\n' - '\n' - ' Note: The "find()" method should be used only if you ' - 'need to know\n' - ' the position of *sub*. To check if *sub* is a ' - 'substring or not,\n' - ' use the "in" operator:\n' - '\n' - " >>> 'Py' in 'Python'\n" - ' True\n' - '\n' - 'str.format(*args, **kwargs)\n' - '\n' - ' Perform a string formatting operation. The string on ' - 'which this\n' - ' method is called can contain literal text or ' - 'replacement fields\n' - ' delimited by braces "{}". Each replacement field ' - 'contains either\n' - ' the numeric index of a positional argument, or the ' - 'name of a\n' - ' keyword argument. Returns a copy of the string where ' - 'each\n' - ' replacement field is replaced with the string value ' - 'of the\n' - ' corresponding argument.\n' - '\n' - ' >>> "The sum of 1 + 2 is {0}".format(1+2)\n' - " 'The sum of 1 + 2 is 3'\n" - '\n' - ' See *Format String Syntax* for a description of the ' - 'various\n' - ' formatting options that can be specified in format ' - 'strings.\n' - '\n' - 'str.format_map(mapping)\n' - '\n' - ' Similar to "str.format(**mapping)", except that ' - '"mapping" is used\n' - ' directly and not copied to a "dict". This is useful ' - 'if for example\n' - ' "mapping" is a dict subclass:\n' - '\n' - ' >>> class Default(dict):\n' - ' ... def __missing__(self, key):\n' - ' ... return key\n' - ' ...\n' - " >>> '{name} was born in " - "{country}'.format_map(Default(name='Guido'))\n" - " 'Guido was born in country'\n" - '\n' - ' New in version 3.2.\n' - '\n' - 'str.index(sub[, start[, end]])\n' - '\n' - ' Like "find()", but raise "ValueError" when the ' - 'substring is not\n' - ' found.\n' - '\n' - 'str.isalnum()\n' - '\n' - ' Return true if all characters in the string are ' - 'alphanumeric and\n' - ' there is at least one character, false otherwise. A ' - 'character "c"\n' - ' is alphanumeric if one of the following returns ' - '"True":\n' - ' "c.isalpha()", "c.isdecimal()", "c.isdigit()", or ' - '"c.isnumeric()".\n' - '\n' - 'str.isalpha()\n' - '\n' - ' Return true if all characters in the string are ' - 'alphabetic and\n' - ' there is at least one character, false otherwise. ' - 'Alphabetic\n' - ' characters are those characters defined in the ' - 'Unicode character\n' - ' database as "Letter", i.e., those with general ' - 'category property\n' - ' being one of "Lm", "Lt", "Lu", "Ll", or "Lo". Note ' - 'that this is\n' - ' different from the "Alphabetic" property defined in ' - 'the Unicode\n' - ' Standard.\n' - '\n' - 'str.isdecimal()\n' - '\n' - ' Return true if all characters in the string are ' - 'decimal characters\n' - ' and there is at least one character, false otherwise. ' - 'Decimal\n' - ' characters are those that can be used to form numbers ' - 'in base 10,\n' - ' e.g. U+0660, ARABIC-INDIC DIGIT ZERO. Formally a ' - 'decimal character\n' - ' is a character in the Unicode General Category "Nd".\n' - '\n' - 'str.isdigit()\n' - '\n' - ' Return true if all characters in the string are ' - 'digits and there is\n' - ' at least one character, false otherwise. Digits ' - 'include decimal\n' - ' characters and digits that need special handling, ' - 'such as the\n' - ' compatibility superscript digits. This covers digits ' - 'which cannot\n' - ' be used to form numbers in base 10, like the ' - 'Kharosthi numbers.\n' - ' Formally, a digit is a character that has the ' - 'property value\n' - ' Numeric_Type=Digit or Numeric_Type=Decimal.\n' - '\n' - 'str.isidentifier()\n' - '\n' - ' Return true if the string is a valid identifier ' - 'according to the\n' - ' language definition, section *Identifiers and ' - 'keywords*.\n' - '\n' - ' Use "keyword.iskeyword()" to test for reserved ' - 'identifiers such as\n' - ' "def" and "class".\n' - '\n' - 'str.islower()\n' - '\n' - ' Return true if all cased characters [4] in the string ' - 'are lowercase\n' - ' and there is at least one cased character, false ' - 'otherwise.\n' - '\n' - 'str.isnumeric()\n' - '\n' - ' Return true if all characters in the string are ' - 'numeric characters,\n' - ' and there is at least one character, false otherwise. ' - 'Numeric\n' - ' characters include digit characters, and all ' - 'characters that have\n' - ' the Unicode numeric value property, e.g. U+2155, ' - 'VULGAR FRACTION\n' - ' ONE FIFTH. Formally, numeric characters are those ' - 'with the\n' - ' property value Numeric_Type=Digit, ' - 'Numeric_Type=Decimal or\n' - ' Numeric_Type=Numeric.\n' - '\n' - 'str.isprintable()\n' - '\n' - ' Return true if all characters in the string are ' - 'printable or the\n' - ' string is empty, false otherwise. Nonprintable ' - 'characters are\n' - ' those characters defined in the Unicode character ' - 'database as\n' - ' "Other" or "Separator", excepting the ASCII space ' - '(0x20) which is\n' - ' considered printable. (Note that printable ' - 'characters in this\n' - ' context are those which should not be escaped when ' - '"repr()" is\n' - ' invoked on a string. It has no bearing on the ' - 'handling of strings\n' - ' written to "sys.stdout" or "sys.stderr".)\n' - '\n' - 'str.isspace()\n' - '\n' - ' Return true if there are only whitespace characters ' - 'in the string\n' - ' and there is at least one character, false ' - 'otherwise. Whitespace\n' - ' characters are those characters defined in the ' - 'Unicode character\n' - ' database as "Other" or "Separator" and those with ' - 'bidirectional\n' - ' property being one of "WS", "B", or "S".\n' - '\n' - 'str.istitle()\n' - '\n' - ' Return true if the string is a titlecased string and ' - 'there is at\n' - ' least one character, for example uppercase characters ' - 'may only\n' - ' follow uncased characters and lowercase characters ' - 'only cased ones.\n' - ' Return false otherwise.\n' - '\n' - 'str.isupper()\n' - '\n' - ' Return true if all cased characters [4] in the string ' - 'are uppercase\n' - ' and there is at least one cased character, false ' - 'otherwise.\n' - '\n' - 'str.join(iterable)\n' - '\n' - ' Return a string which is the concatenation of the ' - 'strings in\n' - ' *iterable*. A "TypeError" will be raised if there are ' - 'any non-\n' - ' string values in *iterable*, including "bytes" ' - 'objects. The\n' - ' separator between elements is the string providing ' - 'this method.\n' - '\n' - 'str.ljust(width[, fillchar])\n' - '\n' - ' Return the string left justified in a string of ' - 'length *width*.\n' - ' Padding is done using the specified *fillchar* ' - '(default is an ASCII\n' - ' space). The original string is returned if *width* is ' - 'less than or\n' - ' equal to "len(s)".\n' - '\n' - 'str.lower()\n' - '\n' - ' Return a copy of the string with all the cased ' - 'characters [4]\n' - ' converted to lowercase.\n' - '\n' - ' The lowercasing algorithm used is described in ' - 'section 3.13 of the\n' - ' Unicode Standard.\n' - '\n' - 'str.lstrip([chars])\n' - '\n' - ' Return a copy of the string with leading characters ' - 'removed. The\n' - ' *chars* argument is a string specifying the set of ' - 'characters to be\n' - ' removed. If omitted or "None", the *chars* argument ' - 'defaults to\n' - ' removing whitespace. The *chars* argument is not a ' - 'prefix; rather,\n' - ' all combinations of its values are stripped:\n' - '\n' - " >>> ' spacious '.lstrip()\n" - " 'spacious '\n" - " >>> 'www.example.com'.lstrip('cmowz.')\n" - " 'example.com'\n" - '\n' - 'static str.maketrans(x[, y[, z]])\n' - '\n' - ' This static method returns a translation table usable ' - 'for\n' - ' "str.translate()".\n' - '\n' - ' If there is only one argument, it must be a ' - 'dictionary mapping\n' - ' Unicode ordinals (integers) or characters (strings of ' - 'length 1) to\n' - ' Unicode ordinals, strings (of arbitrary lengths) or ' - '"None".\n' - ' Character keys will then be converted to ordinals.\n' - '\n' - ' If there are two arguments, they must be strings of ' - 'equal length,\n' - ' and in the resulting dictionary, each character in x ' - 'will be mapped\n' - ' to the character at the same position in y. If there ' - 'is a third\n' - ' argument, it must be a string, whose characters will ' - 'be mapped to\n' - ' "None" in the result.\n' - '\n' - 'str.partition(sep)\n' - '\n' - ' Split the string at the first occurrence of *sep*, ' - 'and return a\n' - ' 3-tuple containing the part before the separator, the ' - 'separator\n' - ' itself, and the part after the separator. If the ' - 'separator is not\n' - ' found, return a 3-tuple containing the string itself, ' - 'followed by\n' - ' two empty strings.\n' - '\n' - 'str.replace(old, new[, count])\n' - '\n' - ' Return a copy of the string with all occurrences of ' - 'substring *old*\n' - ' replaced by *new*. If the optional argument *count* ' - 'is given, only\n' - ' the first *count* occurrences are replaced.\n' - '\n' - 'str.rfind(sub[, start[, end]])\n' - '\n' - ' Return the highest index in the string where ' - 'substring *sub* is\n' - ' found, such that *sub* is contained within ' - '"s[start:end]".\n' - ' Optional arguments *start* and *end* are interpreted ' - 'as in slice\n' - ' notation. Return "-1" on failure.\n' - '\n' - 'str.rindex(sub[, start[, end]])\n' - '\n' - ' Like "rfind()" but raises "ValueError" when the ' - 'substring *sub* is\n' - ' not found.\n' - '\n' - 'str.rjust(width[, fillchar])\n' - '\n' - ' Return the string right justified in a string of ' - 'length *width*.\n' - ' Padding is done using the specified *fillchar* ' - '(default is an ASCII\n' - ' space). The original string is returned if *width* is ' - 'less than or\n' - ' equal to "len(s)".\n' - '\n' - 'str.rpartition(sep)\n' - '\n' - ' Split the string at the last occurrence of *sep*, and ' - 'return a\n' - ' 3-tuple containing the part before the separator, the ' - 'separator\n' - ' itself, and the part after the separator. If the ' - 'separator is not\n' - ' found, return a 3-tuple containing two empty strings, ' - 'followed by\n' - ' the string itself.\n' - '\n' - 'str.rsplit(sep=None, maxsplit=-1)\n' - '\n' - ' Return a list of the words in the string, using *sep* ' - 'as the\n' - ' delimiter string. If *maxsplit* is given, at most ' - '*maxsplit* splits\n' - ' are done, the *rightmost* ones. If *sep* is not ' - 'specified or\n' - ' "None", any whitespace string is a separator. Except ' - 'for splitting\n' - ' from the right, "rsplit()" behaves like "split()" ' - 'which is\n' - ' described in detail below.\n' - '\n' - 'str.rstrip([chars])\n' - '\n' - ' Return a copy of the string with trailing characters ' - 'removed. The\n' - ' *chars* argument is a string specifying the set of ' - 'characters to be\n' - ' removed. If omitted or "None", the *chars* argument ' - 'defaults to\n' - ' removing whitespace. The *chars* argument is not a ' - 'suffix; rather,\n' - ' all combinations of its values are stripped:\n' - '\n' - " >>> ' spacious '.rstrip()\n" - " ' spacious'\n" - " >>> 'mississippi'.rstrip('ipz')\n" - " 'mississ'\n" - '\n' - 'str.split(sep=None, maxsplit=-1)\n' - '\n' - ' Return a list of the words in the string, using *sep* ' - 'as the\n' - ' delimiter string. If *maxsplit* is given, at most ' - '*maxsplit*\n' - ' splits are done (thus, the list will have at most ' - '"maxsplit+1"\n' - ' elements). If *maxsplit* is not specified or "-1", ' - 'then there is\n' - ' no limit on the number of splits (all possible splits ' - 'are made).\n' - '\n' - ' If *sep* is given, consecutive delimiters are not ' - 'grouped together\n' - ' and are deemed to delimit empty strings (for ' - 'example,\n' - ' "\'1,,2\'.split(\',\')" returns "[\'1\', \'\', ' - '\'2\']"). The *sep* argument\n' - ' may consist of multiple characters (for example,\n' - ' "\'1<>2<>3\'.split(\'<>\')" returns "[\'1\', \'2\', ' - '\'3\']"). Splitting an\n' - ' empty string with a specified separator returns ' - '"[\'\']".\n' - '\n' - ' For example:\n' - '\n' - " >>> '1,2,3'.split(',')\n" - " ['1', '2', '3']\n" - " >>> '1,2,3'.split(',', maxsplit=1)\n" - " ['1', '2,3']\n" - " >>> '1,2,,3,'.split(',')\n" - " ['1', '2', '', '3', '']\n" - '\n' - ' If *sep* is not specified or is "None", a different ' - 'splitting\n' - ' algorithm is applied: runs of consecutive whitespace ' - 'are regarded\n' - ' as a single separator, and the result will contain no ' - 'empty strings\n' - ' at the start or end if the string has leading or ' - 'trailing\n' - ' whitespace. Consequently, splitting an empty string ' - 'or a string\n' - ' consisting of just whitespace with a "None" separator ' - 'returns "[]".\n' - '\n' - ' For example:\n' - '\n' - " >>> '1 2 3'.split()\n" - " ['1', '2', '3']\n" - " >>> '1 2 3'.split(maxsplit=1)\n" - " ['1', '2 3']\n" - " >>> ' 1 2 3 '.split()\n" - " ['1', '2', '3']\n" - '\n' - 'str.splitlines([keepends])\n' - '\n' - ' Return a list of the lines in the string, breaking at ' - 'line\n' - ' boundaries. Line breaks are not included in the ' - 'resulting list\n' - ' unless *keepends* is given and true.\n' - '\n' - ' This method splits on the following line boundaries. ' - 'In\n' - ' particular, the boundaries are a superset of ' - '*universal newlines*.\n' - '\n' - ' ' - '+-------------------------+-------------------------------+\n' - ' | Representation | ' - 'Description |\n' - ' ' - '+=========================+===============================+\n' - ' | "\\n" | Line ' - 'Feed |\n' - ' ' - '+-------------------------+-------------------------------+\n' - ' | "\\r" | Carriage ' - 'Return |\n' - ' ' - '+-------------------------+-------------------------------+\n' - ' | "\\r\\n" | Carriage Return + Line ' - 'Feed |\n' - ' ' - '+-------------------------+-------------------------------+\n' - ' | "\\v" or "\\x0b" | Line ' - 'Tabulation |\n' - ' ' - '+-------------------------+-------------------------------+\n' - ' | "\\f" or "\\x0c" | Form ' - 'Feed |\n' - ' ' - '+-------------------------+-------------------------------+\n' - ' | "\\x1c" | File ' - 'Separator |\n' - ' ' - '+-------------------------+-------------------------------+\n' - ' | "\\x1d" | Group ' - 'Separator |\n' - ' ' - '+-------------------------+-------------------------------+\n' - ' | "\\x1e" | Record ' - 'Separator |\n' - ' ' - '+-------------------------+-------------------------------+\n' - ' | "\\x85" | Next Line (C1 Control ' - 'Code) |\n' - ' ' - '+-------------------------+-------------------------------+\n' - ' | "\\u2028" | Line ' - 'Separator |\n' - ' ' - '+-------------------------+-------------------------------+\n' - ' | "\\u2029" | Paragraph ' - 'Separator |\n' - ' ' - '+-------------------------+-------------------------------+\n' - '\n' - ' Changed in version 3.2: "\\v" and "\\f" added to list ' - 'of line\n' - ' boundaries.\n' - '\n' - ' For example:\n' - '\n' - " >>> 'ab c\\n\\nde fg\\rkl\\r\\n'.splitlines()\n" - " ['ab c', '', 'de fg', 'kl']\n" - " >>> 'ab c\\n\\nde " - "fg\\rkl\\r\\n'.splitlines(keepends=True)\n" - " ['ab c\\n', '\\n', 'de fg\\r', 'kl\\r\\n']\n" - '\n' - ' Unlike "split()" when a delimiter string *sep* is ' - 'given, this\n' - ' method returns an empty list for the empty string, ' - 'and a terminal\n' - ' line break does not result in an extra line:\n' - '\n' - ' >>> "".splitlines()\n' - ' []\n' - ' >>> "One line\\n".splitlines()\n' - " ['One line']\n" - '\n' - ' For comparison, "split(\'\\n\')" gives:\n' - '\n' - " >>> ''.split('\\n')\n" - " ['']\n" - " >>> 'Two lines\\n'.split('\\n')\n" - " ['Two lines', '']\n" - '\n' - 'str.startswith(prefix[, start[, end]])\n' - '\n' - ' Return "True" if string starts with the *prefix*, ' - 'otherwise return\n' - ' "False". *prefix* can also be a tuple of prefixes to ' - 'look for.\n' - ' With optional *start*, test string beginning at that ' - 'position.\n' - ' With optional *end*, stop comparing string at that ' - 'position.\n' - '\n' - 'str.strip([chars])\n' - '\n' - ' Return a copy of the string with the leading and ' - 'trailing\n' - ' characters removed. The *chars* argument is a string ' - 'specifying the\n' - ' set of characters to be removed. If omitted or ' - '"None", the *chars*\n' - ' argument defaults to removing whitespace. The *chars* ' - 'argument is\n' - ' not a prefix or suffix; rather, all combinations of ' - 'its values are\n' - ' stripped:\n' - '\n' - " >>> ' spacious '.strip()\n" - " 'spacious'\n" - " >>> 'www.example.com'.strip('cmowz.')\n" - " 'example'\n" - '\n' - ' The outermost leading and trailing *chars* argument ' - 'values are\n' - ' stripped from the string. Characters are removed from ' - 'the leading\n' - ' end until reaching a string character that is not ' - 'contained in the\n' - ' set of characters in *chars*. A similar action takes ' - 'place on the\n' - ' trailing end. For example:\n' - '\n' - " >>> comment_string = '#....... Section 3.2.1 Issue " - "#32 .......'\n" - " >>> comment_string.strip('.#! ')\n" - " 'Section 3.2.1 Issue #32'\n" - '\n' - 'str.swapcase()\n' - '\n' - ' Return a copy of the string with uppercase characters ' - 'converted to\n' - ' lowercase and vice versa. Note that it is not ' - 'necessarily true that\n' - ' "s.swapcase().swapcase() == s".\n' - '\n' - 'str.title()\n' - '\n' - ' Return a titlecased version of the string where words ' - 'start with an\n' - ' uppercase character and the remaining characters are ' - 'lowercase.\n' - '\n' - ' For example:\n' - '\n' - " >>> 'Hello world'.title()\n" - " 'Hello World'\n" - '\n' - ' The algorithm uses a simple language-independent ' - 'definition of a\n' - ' word as groups of consecutive letters. The ' - 'definition works in\n' - ' many contexts but it means that apostrophes in ' - 'contractions and\n' - ' possessives form word boundaries, which may not be ' - 'the desired\n' - ' result:\n' - '\n' - ' >>> "they\'re bill\'s friends from the ' - 'UK".title()\n' - ' "They\'Re Bill\'S Friends From The Uk"\n' - '\n' - ' A workaround for apostrophes can be constructed using ' - 'regular\n' - ' expressions:\n' - '\n' - ' >>> import re\n' - ' >>> def titlecase(s):\n' - ' ... return re.sub(r"[A-Za-z]+(\'[A-Za-z]+)?",\n' - ' ... lambda mo: ' - 'mo.group(0)[0].upper() +\n' - ' ... ' - 'mo.group(0)[1:].lower(),\n' - ' ... s)\n' - ' ...\n' - ' >>> titlecase("they\'re bill\'s friends.")\n' - ' "They\'re Bill\'s Friends."\n' - '\n' - 'str.translate(table)\n' - '\n' - ' Return a copy of the string in which each character ' - 'has been mapped\n' - ' through the given translation table. The table must ' - 'be an object\n' - ' that implements indexing via "__getitem__()", ' - 'typically a *mapping*\n' - ' or *sequence*. When indexed by a Unicode ordinal (an ' - 'integer), the\n' - ' table object can do any of the following: return a ' - 'Unicode ordinal\n' - ' or a string, to map the character to one or more ' - 'other characters;\n' - ' return "None", to delete the character from the ' - 'return string; or\n' - ' raise a "LookupError" exception, to map the character ' - 'to itself.\n' - '\n' - ' You can use "str.maketrans()" to create a translation ' - 'map from\n' - ' character-to-character mappings in different ' - 'formats.\n' - '\n' - ' See also the "codecs" module for a more flexible ' - 'approach to custom\n' - ' character mappings.\n' - '\n' - 'str.upper()\n' - '\n' - ' Return a copy of the string with all the cased ' - 'characters [4]\n' - ' converted to uppercase. Note that ' - '"str.upper().isupper()" might be\n' - ' "False" if "s" contains uncased characters or if the ' - 'Unicode\n' - ' category of the resulting character(s) is not "Lu" ' - '(Letter,\n' - ' uppercase), but e.g. "Lt" (Letter, titlecase).\n' - '\n' - ' The uppercasing algorithm used is described in ' - 'section 3.13 of the\n' - ' Unicode Standard.\n' - '\n' - 'str.zfill(width)\n' - '\n' - ' Return a copy of the string left filled with ASCII ' - '"\'0\'" digits to\n' - ' make a string of length *width*. A leading sign ' - 'prefix\n' - ' ("\'+\'"/"\'-\'") is handled by inserting the padding ' - '*after* the sign\n' - ' character rather than before. The original string is ' - 'returned if\n' - ' *width* is less than or equal to "len(s)".\n' - '\n' - ' For example:\n' - '\n' - ' >>> "42".zfill(5)\n' - " '00042'\n" - ' >>> "-42".zfill(5)\n' - " '-0042'\n", - 'strings': '\n' - 'String and Bytes literals\n' - '*************************\n' - '\n' - 'String literals are described by the following lexical ' - 'definitions:\n' - '\n' - ' stringliteral ::= [stringprefix](shortstring | ' - 'longstring)\n' - ' stringprefix ::= "r" | "u" | "R" | "U"\n' - ' shortstring ::= "\'" shortstringitem* "\'" | \'"\' ' - 'shortstringitem* \'"\'\n' - ' longstring ::= "\'\'\'" longstringitem* "\'\'\'" | ' - '\'"""\' longstringitem* \'"""\'\n' - ' shortstringitem ::= shortstringchar | stringescapeseq\n' - ' longstringitem ::= longstringchar | stringescapeseq\n' - ' shortstringchar ::= \n' - ' longstringchar ::= \n' - ' stringescapeseq ::= "\\" \n' - '\n' - ' bytesliteral ::= bytesprefix(shortbytes | longbytes)\n' - ' bytesprefix ::= "b" | "B" | "br" | "Br" | "bR" | "BR" | ' - '"rb" | "rB" | "Rb" | "RB"\n' - ' shortbytes ::= "\'" shortbytesitem* "\'" | \'"\' ' - 'shortbytesitem* \'"\'\n' - ' longbytes ::= "\'\'\'" longbytesitem* "\'\'\'" | ' - '\'"""\' longbytesitem* \'"""\'\n' - ' shortbytesitem ::= shortbyteschar | bytesescapeseq\n' - ' longbytesitem ::= longbyteschar | bytesescapeseq\n' - ' shortbyteschar ::= \n' - ' longbyteschar ::= \n' - ' bytesescapeseq ::= "\\" \n' - '\n' - 'One syntactic restriction not indicated by these productions is ' - 'that\n' - 'whitespace is not allowed between the "stringprefix" or ' - '"bytesprefix"\n' - 'and the rest of the literal. The source character set is ' - 'defined by\n' - 'the encoding declaration; it is UTF-8 if no encoding ' - 'declaration is\n' - 'given in the source file; see section *Encoding declarations*.\n' - '\n' - 'In plain English: Both types of literals can be enclosed in ' - 'matching\n' - 'single quotes ("\'") or double quotes ("""). They can also be ' - 'enclosed\n' - 'in matching groups of three single or double quotes (these are\n' - 'generally referred to as *triple-quoted strings*). The ' - 'backslash\n' - '("\\") character is used to escape characters that otherwise ' - 'have a\n' - 'special meaning, such as newline, backslash itself, or the ' - 'quote\n' - 'character.\n' - '\n' - 'Bytes literals are always prefixed with "\'b\'" or "\'B\'"; ' - 'they produce\n' - 'an instance of the "bytes" type instead of the "str" type. ' - 'They may\n' - 'only contain ASCII characters; bytes with a numeric value of ' - '128 or\n' - 'greater must be expressed with escapes.\n' - '\n' - 'As of Python 3.3 it is possible again to prefix string literals ' - 'with a\n' - '"u" prefix to simplify maintenance of dual 2.x and 3.x ' - 'codebases.\n' - '\n' - 'Both string and bytes literals may optionally be prefixed with ' - 'a\n' - 'letter "\'r\'" or "\'R\'"; such strings are called *raw ' - 'strings* and treat\n' - 'backslashes as literal characters. As a result, in string ' - 'literals,\n' - '"\'\\U\'" and "\'\\u\'" escapes in raw strings are not treated ' - 'specially.\n' - "Given that Python 2.x's raw unicode literals behave differently " - 'than\n' - 'Python 3.x\'s the "\'ur\'" syntax is not supported.\n' - '\n' - 'New in version 3.3: The "\'rb\'" prefix of raw bytes literals ' - 'has been\n' - 'added as a synonym of "\'br\'".\n' - '\n' - 'New in version 3.3: Support for the unicode legacy literal\n' - '("u\'value\'") was reintroduced to simplify the maintenance of ' - 'dual\n' - 'Python 2.x and 3.x codebases. See **PEP 414** for more ' - 'information.\n' - '\n' - 'In triple-quoted literals, unescaped newlines and quotes are ' - 'allowed\n' - '(and are retained), except that three unescaped quotes in a ' - 'row\n' - 'terminate the literal. (A "quote" is the character used to ' - 'open the\n' - 'literal, i.e. either "\'" or """.)\n' - '\n' - 'Unless an "\'r\'" or "\'R\'" prefix is present, escape ' - 'sequences in string\n' - 'and bytes literals are interpreted according to rules similar ' - 'to those\n' - 'used by Standard C. The recognized escape sequences are:\n' - '\n' - '+-------------------+-----------------------------------+---------+\n' - '| Escape Sequence | Meaning | ' - 'Notes |\n' - '+===================+===================================+=========+\n' - '| "\\newline" | Backslash and newline ignored ' - '| |\n' - '+-------------------+-----------------------------------+---------+\n' - '| "\\\\" | Backslash ("\\") ' - '| |\n' - '+-------------------+-----------------------------------+---------+\n' - '| "\\\'" | Single quote ("\'") ' - '| |\n' - '+-------------------+-----------------------------------+---------+\n' - '| "\\"" | Double quote (""") ' - '| |\n' - '+-------------------+-----------------------------------+---------+\n' - '| "\\a" | ASCII Bell (BEL) ' - '| |\n' - '+-------------------+-----------------------------------+---------+\n' - '| "\\b" | ASCII Backspace (BS) ' - '| |\n' - '+-------------------+-----------------------------------+---------+\n' - '| "\\f" | ASCII Formfeed (FF) ' - '| |\n' - '+-------------------+-----------------------------------+---------+\n' - '| "\\n" | ASCII Linefeed (LF) ' - '| |\n' - '+-------------------+-----------------------------------+---------+\n' - '| "\\r" | ASCII Carriage Return (CR) ' - '| |\n' - '+-------------------+-----------------------------------+---------+\n' - '| "\\t" | ASCII Horizontal Tab (TAB) ' - '| |\n' - '+-------------------+-----------------------------------+---------+\n' - '| "\\v" | ASCII Vertical Tab (VT) ' - '| |\n' - '+-------------------+-----------------------------------+---------+\n' - '| "\\ooo" | Character with octal value *ooo* | ' - '(1,3) |\n' - '+-------------------+-----------------------------------+---------+\n' - '| "\\xhh" | Character with hex value *hh* | ' - '(2,3) |\n' - '+-------------------+-----------------------------------+---------+\n' - '\n' - 'Escape sequences only recognized in string literals are:\n' - '\n' - '+-------------------+-----------------------------------+---------+\n' - '| Escape Sequence | Meaning | ' - 'Notes |\n' - '+===================+===================================+=========+\n' - '| "\\N{name}" | Character named *name* in the | ' - '(4) |\n' - '| | Unicode database ' - '| |\n' - '+-------------------+-----------------------------------+---------+\n' - '| "\\uxxxx" | Character with 16-bit hex value | ' - '(5) |\n' - '| | *xxxx* ' - '| |\n' - '+-------------------+-----------------------------------+---------+\n' - '| "\\Uxxxxxxxx" | Character with 32-bit hex value | ' - '(6) |\n' - '| | *xxxxxxxx* ' - '| |\n' - '+-------------------+-----------------------------------+---------+\n' - '\n' - 'Notes:\n' - '\n' - '1. As in Standard C, up to three octal digits are accepted.\n' - '\n' - '2. Unlike in Standard C, exactly two hex digits are required.\n' - '\n' - '3. In a bytes literal, hexadecimal and octal escapes denote ' - 'the\n' - ' byte with the given value. In a string literal, these ' - 'escapes\n' - ' denote a Unicode character with the given value.\n' - '\n' - '4. Changed in version 3.3: Support for name aliases [1] has ' - 'been\n' - ' added.\n' - '\n' - '5. Exactly four hex digits are required.\n' - '\n' - '6. Any Unicode character can be encoded this way. Exactly ' - 'eight\n' - ' hex digits are required.\n' - '\n' - 'Unlike Standard C, all unrecognized escape sequences are left ' - 'in the\n' - 'string unchanged, i.e., *the backslash is left in the result*. ' - '(This\n' - 'behavior is useful when debugging: if an escape sequence is ' - 'mistyped,\n' - 'the resulting output is more easily recognized as broken.) It ' - 'is also\n' - 'important to note that the escape sequences only recognized in ' - 'string\n' - 'literals fall into the category of unrecognized escapes for ' - 'bytes\n' - 'literals.\n' - '\n' - 'Even in a raw literal, quotes can be escaped with a backslash, ' - 'but the\n' - 'backslash remains in the result; for example, "r"\\""" is a ' - 'valid\n' - 'string literal consisting of two characters: a backslash and a ' - 'double\n' - 'quote; "r"\\"" is not a valid string literal (even a raw string ' - 'cannot\n' - 'end in an odd number of backslashes). Specifically, *a raw ' - 'literal\n' - 'cannot end in a single backslash* (since the backslash would ' - 'escape\n' - 'the following quote character). Note also that a single ' - 'backslash\n' - 'followed by a newline is interpreted as those two characters as ' - 'part\n' - 'of the literal, *not* as a line continuation.\n', - 'subscriptions': '\n' - 'Subscriptions\n' - '*************\n' - '\n' - 'A subscription selects an item of a sequence (string, ' - 'tuple or list)\n' - 'or mapping (dictionary) object:\n' - '\n' - ' subscription ::= primary "[" expression_list "]"\n' - '\n' - 'The primary must evaluate to an object that supports ' - 'subscription\n' - '(lists or dictionaries for example). User-defined ' - 'objects can support\n' - 'subscription by defining a "__getitem__()" method.\n' - '\n' - 'For built-in objects, there are two types of objects that ' - 'support\n' - 'subscription:\n' - '\n' - 'If the primary is a mapping, the expression list must ' - 'evaluate to an\n' - 'object whose value is one of the keys of the mapping, and ' - 'the\n' - 'subscription selects the value in the mapping that ' - 'corresponds to that\n' - 'key. (The expression list is a tuple except if it has ' - 'exactly one\n' - 'item.)\n' - '\n' - 'If the primary is a sequence, the expression (list) must ' - 'evaluate to\n' - 'an integer or a slice (as discussed in the following ' - 'section).\n' - '\n' - 'The formal syntax makes no special provision for negative ' - 'indices in\n' - 'sequences; however, built-in sequences all provide a ' - '"__getitem__()"\n' - 'method that interprets negative indices by adding the ' - 'length of the\n' - 'sequence to the index (so that "x[-1]" selects the last ' - 'item of "x").\n' - 'The resulting value must be a nonnegative integer less ' - 'than the number\n' - 'of items in the sequence, and the subscription selects ' - 'the item whose\n' - 'index is that value (counting from zero). Since the ' - 'support for\n' - "negative indices and slicing occurs in the object's " - '"__getitem__()"\n' - 'method, subclasses overriding this method will need to ' - 'explicitly add\n' - 'that support.\n' - '\n' - "A string's items are characters. A character is not a " - 'separate data\n' - 'type but a string of exactly one character.\n', - 'truth': '\n' - 'Truth Value Testing\n' - '*******************\n' - '\n' - 'Any object can be tested for truth value, for use in an "if" or\n' - '"while" condition or as operand of the Boolean operations below. ' - 'The\n' - 'following values are considered false:\n' - '\n' - '* "None"\n' - '\n' - '* "False"\n' - '\n' - '* zero of any numeric type, for example, "0", "0.0", "0j".\n' - '\n' - '* any empty sequence, for example, "\'\'", "()", "[]".\n' - '\n' - '* any empty mapping, for example, "{}".\n' - '\n' - '* instances of user-defined classes, if the class defines a\n' - ' "__bool__()" or "__len__()" method, when that method returns ' - 'the\n' - ' integer zero or "bool" value "False". [1]\n' - '\n' - 'All other values are considered true --- so objects of many types ' - 'are\n' - 'always true.\n' - '\n' - 'Operations and built-in functions that have a Boolean result ' - 'always\n' - 'return "0" or "False" for false and "1" or "True" for true, ' - 'unless\n' - 'otherwise stated. (Important exception: the Boolean operations ' - '"or"\n' - 'and "and" always return one of their operands.)\n', - 'try': '\n' - 'The "try" statement\n' - '*******************\n' - '\n' - 'The "try" statement specifies exception handlers and/or cleanup ' - 'code\n' - 'for a group of statements:\n' - '\n' - ' try_stmt ::= try1_stmt | try2_stmt\n' - ' try1_stmt ::= "try" ":" suite\n' - ' ("except" [expression ["as" identifier]] ":" ' - 'suite)+\n' - ' ["else" ":" suite]\n' - ' ["finally" ":" suite]\n' - ' try2_stmt ::= "try" ":" suite\n' - ' "finally" ":" suite\n' - '\n' - 'The "except" clause(s) specify one or more exception handlers. When ' - 'no\n' - 'exception occurs in the "try" clause, no exception handler is\n' - 'executed. When an exception occurs in the "try" suite, a search for ' - 'an\n' - 'exception handler is started. This search inspects the except ' - 'clauses\n' - 'in turn until one is found that matches the exception. An ' - 'expression-\n' - 'less except clause, if present, must be last; it matches any\n' - 'exception. For an except clause with an expression, that ' - 'expression\n' - 'is evaluated, and the clause matches the exception if the ' - 'resulting\n' - 'object is "compatible" with the exception. An object is ' - 'compatible\n' - 'with an exception if it is the class or a base class of the ' - 'exception\n' - 'object or a tuple containing an item compatible with the ' - 'exception.\n' - '\n' - 'If no except clause matches the exception, the search for an ' - 'exception\n' - 'handler continues in the surrounding code and on the invocation ' - 'stack.\n' - '[1]\n' - '\n' - 'If the evaluation of an expression in the header of an except ' - 'clause\n' - 'raises an exception, the original search for a handler is canceled ' - 'and\n' - 'a search starts for the new exception in the surrounding code and ' - 'on\n' - 'the call stack (it is treated as if the entire "try" statement ' - 'raised\n' - 'the exception).\n' - '\n' - 'When a matching except clause is found, the exception is assigned ' - 'to\n' - 'the target specified after the "as" keyword in that except clause, ' - 'if\n' - "present, and the except clause's suite is executed. All except\n" - 'clauses must have an executable block. When the end of this block ' - 'is\n' - 'reached, execution continues normally after the entire try ' - 'statement.\n' - '(This means that if two nested handlers exist for the same ' - 'exception,\n' - 'and the exception occurs in the try clause of the inner handler, ' - 'the\n' - 'outer handler will not handle the exception.)\n' - '\n' - 'When an exception has been assigned using "as target", it is ' - 'cleared\n' - 'at the end of the except clause. This is as if\n' - '\n' - ' except E as N:\n' - ' foo\n' - '\n' - 'was translated to\n' - '\n' - ' except E as N:\n' - ' try:\n' - ' foo\n' - ' finally:\n' - ' del N\n' - '\n' - 'This means the exception must be assigned to a different name to ' - 'be\n' - 'able to refer to it after the except clause. Exceptions are ' - 'cleared\n' - 'because with the traceback attached to them, they form a reference\n' - 'cycle with the stack frame, keeping all locals in that frame alive\n' - 'until the next garbage collection occurs.\n' - '\n' - "Before an except clause's suite is executed, details about the\n" - 'exception are stored in the "sys" module and can be accessed via\n' - '"sys.exc_info()". "sys.exc_info()" returns a 3-tuple consisting of ' - 'the\n' - 'exception class, the exception instance and a traceback object ' - '(see\n' - 'section *The standard type hierarchy*) identifying the point in ' - 'the\n' - 'program where the exception occurred. "sys.exc_info()" values are\n' - 'restored to their previous values (before the call) when returning\n' - 'from a function that handled an exception.\n' - '\n' - 'The optional "else" clause is executed if and when control flows ' - 'off\n' - 'the end of the "try" clause. [2] Exceptions in the "else" clause ' - 'are\n' - 'not handled by the preceding "except" clauses.\n' - '\n' - 'If "finally" is present, it specifies a \'cleanup\' handler. The ' - '"try"\n' - 'clause is executed, including any "except" and "else" clauses. If ' - 'an\n' - 'exception occurs in any of the clauses and is not handled, the\n' - 'exception is temporarily saved. The "finally" clause is executed. ' - 'If\n' - 'there is a saved exception it is re-raised at the end of the ' - '"finally"\n' - 'clause. If the "finally" clause raises another exception, the ' - 'saved\n' - 'exception is set as the context of the new exception. If the ' - '"finally"\n' - 'clause executes a "return" or "break" statement, the saved ' - 'exception\n' - 'is discarded:\n' - '\n' - ' >>> def f():\n' - ' ... try:\n' - ' ... 1/0\n' - ' ... finally:\n' - ' ... return 42\n' - ' ...\n' - ' >>> f()\n' - ' 42\n' - '\n' - 'The exception information is not available to the program during\n' - 'execution of the "finally" clause.\n' - '\n' - 'When a "return", "break" or "continue" statement is executed in ' - 'the\n' - '"try" suite of a "try"..."finally" statement, the "finally" clause ' - 'is\n' - 'also executed \'on the way out.\' A "continue" statement is illegal ' - 'in\n' - 'the "finally" clause. (The reason is a problem with the current\n' - 'implementation --- this restriction may be lifted in the future).\n' - '\n' - 'The return value of a function is determined by the last "return"\n' - 'statement executed. Since the "finally" clause always executes, a\n' - '"return" statement executed in the "finally" clause will always be ' - 'the\n' - 'last one executed:\n' - '\n' - ' >>> def foo():\n' - ' ... try:\n' - " ... return 'try'\n" - ' ... finally:\n' - " ... return 'finally'\n" - ' ...\n' - ' >>> foo()\n' - " 'finally'\n" - '\n' - 'Additional information on exceptions can be found in section\n' - '*Exceptions*, and information on using the "raise" statement to\n' - 'generate exceptions may be found in section *The raise statement*.\n', - 'types': '\n' - 'The standard type hierarchy\n' - '***************************\n' - '\n' - 'Below is a list of the types that are built into Python. ' - 'Extension\n' - 'modules (written in C, Java, or other languages, depending on ' - 'the\n' - 'implementation) can define additional types. Future versions of\n' - 'Python may add types to the type hierarchy (e.g., rational ' - 'numbers,\n' - 'efficiently stored arrays of integers, etc.), although such ' - 'additions\n' - 'will often be provided via the standard library instead.\n' - '\n' - 'Some of the type descriptions below contain a paragraph listing\n' - "'special attributes.' These are attributes that provide access " - 'to the\n' - 'implementation and are not intended for general use. Their ' - 'definition\n' - 'may change in the future.\n' - '\n' - 'None\n' - ' This type has a single value. There is a single object with ' - 'this\n' - ' value. This object is accessed through the built-in name ' - '"None". It\n' - ' is used to signify the absence of a value in many situations, ' - 'e.g.,\n' - " it is returned from functions that don't explicitly return\n" - ' anything. Its truth value is false.\n' - '\n' - 'NotImplemented\n' - ' This type has a single value. There is a single object with ' - 'this\n' - ' value. This object is accessed through the built-in name\n' - ' "NotImplemented". Numeric methods and rich comparison methods\n' - ' should return this value if they do not implement the ' - 'operation for\n' - ' the operands provided. (The interpreter will then try the\n' - ' reflected operation, or some other fallback, depending on the\n' - ' operator.) Its truth value is true.\n' - '\n' - ' See *Implementing the arithmetic operations* for more ' - 'details.\n' - '\n' - 'Ellipsis\n' - ' This type has a single value. There is a single object with ' - 'this\n' - ' value. This object is accessed through the literal "..." or ' - 'the\n' - ' built-in name "Ellipsis". Its truth value is true.\n' - '\n' - '"numbers.Number"\n' - ' These are created by numeric literals and returned as results ' - 'by\n' - ' arithmetic operators and arithmetic built-in functions. ' - 'Numeric\n' - ' objects are immutable; once created their value never ' - 'changes.\n' - ' Python numbers are of course strongly related to mathematical\n' - ' numbers, but subject to the limitations of numerical ' - 'representation\n' - ' in computers.\n' - '\n' - ' Python distinguishes between integers, floating point numbers, ' - 'and\n' - ' complex numbers:\n' - '\n' - ' "numbers.Integral"\n' - ' These represent elements from the mathematical set of ' - 'integers\n' - ' (positive and negative).\n' - '\n' - ' There are two types of integers:\n' - '\n' - ' Integers ("int")\n' - '\n' - ' These represent numbers in an unlimited range, subject ' - 'to\n' - ' available (virtual) memory only. For the purpose of ' - 'shift\n' - ' and mask operations, a binary representation is assumed, ' - 'and\n' - " negative numbers are represented in a variant of 2's\n" - ' complement which gives the illusion of an infinite ' - 'string of\n' - ' sign bits extending to the left.\n' - '\n' - ' Booleans ("bool")\n' - ' These represent the truth values False and True. The ' - 'two\n' - ' objects representing the values "False" and "True" are ' - 'the\n' - ' only Boolean objects. The Boolean type is a subtype of ' - 'the\n' - ' integer type, and Boolean values behave like the values ' - '0 and\n' - ' 1, respectively, in almost all contexts, the exception ' - 'being\n' - ' that when converted to a string, the strings ""False"" ' - 'or\n' - ' ""True"" are returned, respectively.\n' - '\n' - ' The rules for integer representation are intended to give ' - 'the\n' - ' most meaningful interpretation of shift and mask ' - 'operations\n' - ' involving negative integers.\n' - '\n' - ' "numbers.Real" ("float")\n' - ' These represent machine-level double precision floating ' - 'point\n' - ' numbers. You are at the mercy of the underlying machine\n' - ' architecture (and C or Java implementation) for the ' - 'accepted\n' - ' range and handling of overflow. Python does not support ' - 'single-\n' - ' precision floating point numbers; the savings in processor ' - 'and\n' - ' memory usage that are usually the reason for using these ' - 'are\n' - ' dwarfed by the overhead of using objects in Python, so ' - 'there is\n' - ' no reason to complicate the language with two kinds of ' - 'floating\n' - ' point numbers.\n' - '\n' - ' "numbers.Complex" ("complex")\n' - ' These represent complex numbers as a pair of machine-level\n' - ' double precision floating point numbers. The same caveats ' - 'apply\n' - ' as for floating point numbers. The real and imaginary parts ' - 'of a\n' - ' complex number "z" can be retrieved through the read-only\n' - ' attributes "z.real" and "z.imag".\n' - '\n' - 'Sequences\n' - ' These represent finite ordered sets indexed by non-negative\n' - ' numbers. The built-in function "len()" returns the number of ' - 'items\n' - ' of a sequence. When the length of a sequence is *n*, the index ' - 'set\n' - ' contains the numbers 0, 1, ..., *n*-1. Item *i* of sequence ' - '*a* is\n' - ' selected by "a[i]".\n' - '\n' - ' Sequences also support slicing: "a[i:j]" selects all items ' - 'with\n' - ' index *k* such that *i* "<=" *k* "<" *j*. When used as an\n' - ' expression, a slice is a sequence of the same type. This ' - 'implies\n' - ' that the index set is renumbered so that it starts at 0.\n' - '\n' - ' Some sequences also support "extended slicing" with a third ' - '"step"\n' - ' parameter: "a[i:j:k]" selects all items of *a* with index *x* ' - 'where\n' - ' "x = i + n*k", *n* ">=" "0" and *i* "<=" *x* "<" *j*.\n' - '\n' - ' Sequences are distinguished according to their mutability:\n' - '\n' - ' Immutable sequences\n' - ' An object of an immutable sequence type cannot change once ' - 'it is\n' - ' created. (If the object contains references to other ' - 'objects,\n' - ' these other objects may be mutable and may be changed; ' - 'however,\n' - ' the collection of objects directly referenced by an ' - 'immutable\n' - ' object cannot change.)\n' - '\n' - ' The following types are immutable sequences:\n' - '\n' - ' Strings\n' - ' A string is a sequence of values that represent Unicode ' - 'code\n' - ' points. All the code points in the range "U+0000 - ' - 'U+10FFFF"\n' - " can be represented in a string. Python doesn't have a " - '"char"\n' - ' type; instead, every code point in the string is ' - 'represented\n' - ' as a string object with length "1". The built-in ' - 'function\n' - ' "ord()" converts a code point from its string form to ' - 'an\n' - ' integer in the range "0 - 10FFFF"; "chr()" converts an\n' - ' integer in the range "0 - 10FFFF" to the corresponding ' - 'length\n' - ' "1" string object. "str.encode()" can be used to convert ' - 'a\n' - ' "str" to "bytes" using the given text encoding, and\n' - ' "bytes.decode()" can be used to achieve the opposite.\n' - '\n' - ' Tuples\n' - ' The items of a tuple are arbitrary Python objects. ' - 'Tuples of\n' - ' two or more items are formed by comma-separated lists ' - 'of\n' - " expressions. A tuple of one item (a 'singleton') can " - 'be\n' - ' formed by affixing a comma to an expression (an ' - 'expression by\n' - ' itself does not create a tuple, since parentheses must ' - 'be\n' - ' usable for grouping of expressions). An empty tuple can ' - 'be\n' - ' formed by an empty pair of parentheses.\n' - '\n' - ' Bytes\n' - ' A bytes object is an immutable array. The items are ' - '8-bit\n' - ' bytes, represented by integers in the range 0 <= x < ' - '256.\n' - ' Bytes literals (like "b\'abc\'") and the built-in ' - 'function\n' - ' "bytes()" can be used to construct bytes objects. ' - 'Also,\n' - ' bytes objects can be decoded to strings via the ' - '"decode()"\n' - ' method.\n' - '\n' - ' Mutable sequences\n' - ' Mutable sequences can be changed after they are created. ' - 'The\n' - ' subscription and slicing notations can be used as the ' - 'target of\n' - ' assignment and "del" (delete) statements.\n' - '\n' - ' There are currently two intrinsic mutable sequence types:\n' - '\n' - ' Lists\n' - ' The items of a list are arbitrary Python objects. Lists ' - 'are\n' - ' formed by placing a comma-separated list of expressions ' - 'in\n' - ' square brackets. (Note that there are no special cases ' - 'needed\n' - ' to form lists of length 0 or 1.)\n' - '\n' - ' Byte Arrays\n' - ' A bytearray object is a mutable array. They are created ' - 'by\n' - ' the built-in "bytearray()" constructor. Aside from ' - 'being\n' - ' mutable (and hence unhashable), byte arrays otherwise ' - 'provide\n' - ' the same interface and functionality as immutable bytes\n' - ' objects.\n' - '\n' - ' The extension module "array" provides an additional example ' - 'of a\n' - ' mutable sequence type, as does the "collections" module.\n' - '\n' - 'Set types\n' - ' These represent unordered, finite sets of unique, immutable\n' - ' objects. As such, they cannot be indexed by any subscript. ' - 'However,\n' - ' they can be iterated over, and the built-in function "len()"\n' - ' returns the number of items in a set. Common uses for sets are ' - 'fast\n' - ' membership testing, removing duplicates from a sequence, and\n' - ' computing mathematical operations such as intersection, ' - 'union,\n' - ' difference, and symmetric difference.\n' - '\n' - ' For set elements, the same immutability rules apply as for\n' - ' dictionary keys. Note that numeric types obey the normal rules ' - 'for\n' - ' numeric comparison: if two numbers compare equal (e.g., "1" ' - 'and\n' - ' "1.0"), only one of them can be contained in a set.\n' - '\n' - ' There are currently two intrinsic set types:\n' - '\n' - ' Sets\n' - ' These represent a mutable set. They are created by the ' - 'built-in\n' - ' "set()" constructor and can be modified afterwards by ' - 'several\n' - ' methods, such as "add()".\n' - '\n' - ' Frozen sets\n' - ' These represent an immutable set. They are created by the\n' - ' built-in "frozenset()" constructor. As a frozenset is ' - 'immutable\n' - ' and *hashable*, it can be used again as an element of ' - 'another\n' - ' set, or as a dictionary key.\n' - '\n' - 'Mappings\n' - ' These represent finite sets of objects indexed by arbitrary ' - 'index\n' - ' sets. The subscript notation "a[k]" selects the item indexed ' - 'by "k"\n' - ' from the mapping "a"; this can be used in expressions and as ' - 'the\n' - ' target of assignments or "del" statements. The built-in ' - 'function\n' - ' "len()" returns the number of items in a mapping.\n' - '\n' - ' There is currently a single intrinsic mapping type:\n' - '\n' - ' Dictionaries\n' - ' These represent finite sets of objects indexed by nearly\n' - ' arbitrary values. The only types of values not acceptable ' - 'as\n' - ' keys are values containing lists or dictionaries or other\n' - ' mutable types that are compared by value rather than by ' - 'object\n' - ' identity, the reason being that the efficient ' - 'implementation of\n' - " dictionaries requires a key's hash value to remain " - 'constant.\n' - ' Numeric types used for keys obey the normal rules for ' - 'numeric\n' - ' comparison: if two numbers compare equal (e.g., "1" and ' - '"1.0")\n' - ' then they can be used interchangeably to index the same\n' - ' dictionary entry.\n' - '\n' - ' Dictionaries are mutable; they can be created by the ' - '"{...}"\n' - ' notation (see section *Dictionary displays*).\n' - '\n' - ' The extension modules "dbm.ndbm" and "dbm.gnu" provide\n' - ' additional examples of mapping types, as does the ' - '"collections"\n' - ' module.\n' - '\n' - 'Callable types\n' - ' These are the types to which the function call operation (see\n' - ' section *Calls*) can be applied:\n' - '\n' - ' User-defined functions\n' - ' A user-defined function object is created by a function\n' - ' definition (see section *Function definitions*). It should ' - 'be\n' - ' called with an argument list containing the same number of ' - 'items\n' - " as the function's formal parameter list.\n" - '\n' - ' Special attributes:\n' - '\n' - ' ' - '+---------------------------+---------------------------------+-------------+\n' - ' | Attribute | ' - 'Meaning | |\n' - ' ' - '+===========================+=================================+=============+\n' - ' | "__doc__" | The function\'s ' - 'documentation | Writable |\n' - ' | | string, or "None" ' - 'if | |\n' - ' | | unavailable; not inherited ' - 'by | |\n' - ' | | ' - 'subclasses | |\n' - ' ' - '+---------------------------+---------------------------------+-------------+\n' - ' | "__name__" | The function\'s ' - 'name | Writable |\n' - ' ' - '+---------------------------+---------------------------------+-------------+\n' - ' | "__qualname__" | The function\'s *qualified ' - 'name* | Writable |\n' - ' | | New in version ' - '3.3. | |\n' - ' ' - '+---------------------------+---------------------------------+-------------+\n' - ' | "__module__" | The name of the module ' - 'the | Writable |\n' - ' | | function was defined in, ' - 'or | |\n' - ' | | "None" if ' - 'unavailable. | |\n' - ' ' - '+---------------------------+---------------------------------+-------------+\n' - ' | "__defaults__" | A tuple containing ' - 'default | Writable |\n' - ' | | argument values for ' - 'those | |\n' - ' | | arguments that have ' - 'defaults, | |\n' - ' | | or "None" if no arguments ' - 'have | |\n' - ' | | a default ' - 'value | |\n' - ' ' - '+---------------------------+---------------------------------+-------------+\n' - ' | "__code__" | The code object ' - 'representing | Writable |\n' - ' | | the compiled function ' - 'body. | |\n' - ' ' - '+---------------------------+---------------------------------+-------------+\n' - ' | "__globals__" | A reference to the ' - 'dictionary | Read-only |\n' - ' | | that holds the ' - "function's | |\n" - ' | | global variables --- the ' - 'global | |\n' - ' | | namespace of the module ' - 'in | |\n' - ' | | which the function was ' - 'defined. | |\n' - ' ' - '+---------------------------+---------------------------------+-------------+\n' - ' | "__dict__" | The namespace ' - 'supporting | Writable |\n' - ' | | arbitrary function ' - 'attributes. | |\n' - ' ' - '+---------------------------+---------------------------------+-------------+\n' - ' | "__closure__" | "None" or a tuple of cells ' - 'that | Read-only |\n' - ' | | contain bindings for ' - 'the | |\n' - " | | function's free " - 'variables. | |\n' - ' ' - '+---------------------------+---------------------------------+-------------+\n' - ' | "__annotations__" | A dict containing ' - 'annotations | Writable |\n' - ' | | of parameters. The keys of ' - 'the | |\n' - ' | | dict are the parameter ' - 'names, | |\n' - ' | | and "\'return\'" for the ' - 'return | |\n' - ' | | annotation, if ' - 'provided. | |\n' - ' ' - '+---------------------------+---------------------------------+-------------+\n' - ' | "__kwdefaults__" | A dict containing defaults ' - 'for | Writable |\n' - ' | | keyword-only ' - 'parameters. | |\n' - ' ' - '+---------------------------+---------------------------------+-------------+\n' - '\n' - ' Most of the attributes labelled "Writable" check the type ' - 'of the\n' - ' assigned value.\n' - '\n' - ' Function objects also support getting and setting ' - 'arbitrary\n' - ' attributes, which can be used, for example, to attach ' - 'metadata\n' - ' to functions. Regular attribute dot-notation is used to ' - 'get and\n' - ' set such attributes. *Note that the current implementation ' - 'only\n' - ' supports function attributes on user-defined functions. ' - 'Function\n' - ' attributes on built-in functions may be supported in the\n' - ' future.*\n' - '\n' - " Additional information about a function's definition can " - 'be\n' - ' retrieved from its code object; see the description of ' - 'internal\n' - ' types below.\n' - '\n' - ' Instance methods\n' - ' An instance method object combines a class, a class ' - 'instance and\n' - ' any callable object (normally a user-defined function).\n' - '\n' - ' Special read-only attributes: "__self__" is the class ' - 'instance\n' - ' object, "__func__" is the function object; "__doc__" is ' - 'the\n' - ' method\'s documentation (same as "__func__.__doc__"); ' - '"__name__"\n' - ' is the method name (same as "__func__.__name__"); ' - '"__module__"\n' - ' is the name of the module the method was defined in, or ' - '"None"\n' - ' if unavailable.\n' - '\n' - ' Methods also support accessing (but not setting) the ' - 'arbitrary\n' - ' function attributes on the underlying function object.\n' - '\n' - ' User-defined method objects may be created when getting an\n' - ' attribute of a class (perhaps via an instance of that ' - 'class), if\n' - ' that attribute is a user-defined function object or a ' - 'class\n' - ' method object.\n' - '\n' - ' When an instance method object is created by retrieving a ' - 'user-\n' - ' defined function object from a class via one of its ' - 'instances,\n' - ' its "__self__" attribute is the instance, and the method ' - 'object\n' - ' is said to be bound. The new method\'s "__func__" ' - 'attribute is\n' - ' the original function object.\n' - '\n' - ' When a user-defined method object is created by retrieving\n' - ' another method object from a class or instance, the ' - 'behaviour is\n' - ' the same as for a function object, except that the ' - '"__func__"\n' - ' attribute of the new instance is not the original method ' - 'object\n' - ' but its "__func__" attribute.\n' - '\n' - ' When an instance method object is created by retrieving a ' - 'class\n' - ' method object from a class or instance, its "__self__" ' - 'attribute\n' - ' is the class itself, and its "__func__" attribute is the\n' - ' function object underlying the class method.\n' - '\n' - ' When an instance method object is called, the underlying\n' - ' function ("__func__") is called, inserting the class ' - 'instance\n' - ' ("__self__") in front of the argument list. For instance, ' - 'when\n' - ' "C" is a class which contains a definition for a function ' - '"f()",\n' - ' and "x" is an instance of "C", calling "x.f(1)" is ' - 'equivalent to\n' - ' calling "C.f(x, 1)".\n' - '\n' - ' When an instance method object is derived from a class ' - 'method\n' - ' object, the "class instance" stored in "__self__" will ' - 'actually\n' - ' be the class itself, so that calling either "x.f(1)" or ' - '"C.f(1)"\n' - ' is equivalent to calling "f(C,1)" where "f" is the ' - 'underlying\n' - ' function.\n' - '\n' - ' Note that the transformation from function object to ' - 'instance\n' - ' method object happens each time the attribute is retrieved ' - 'from\n' - ' the instance. In some cases, a fruitful optimization is ' - 'to\n' - ' assign the attribute to a local variable and call that ' - 'local\n' - ' variable. Also notice that this transformation only happens ' - 'for\n' - ' user-defined functions; other callable objects (and all ' - 'non-\n' - ' callable objects) are retrieved without transformation. It ' - 'is\n' - ' also important to note that user-defined functions which ' - 'are\n' - ' attributes of a class instance are not converted to bound\n' - ' methods; this *only* happens when the function is an ' - 'attribute\n' - ' of the class.\n' - '\n' - ' Generator functions\n' - ' A function or method which uses the "yield" statement (see\n' - ' section *The yield statement*) is called a *generator ' - 'function*.\n' - ' Such a function, when called, always returns an iterator ' - 'object\n' - ' which can be used to execute the body of the function: ' - 'calling\n' - ' the iterator\'s "iterator.__next__()" method will cause ' - 'the\n' - ' function to execute until it provides a value using the ' - '"yield"\n' - ' statement. When the function executes a "return" statement ' - 'or\n' - ' falls off the end, a "StopIteration" exception is raised ' - 'and the\n' - ' iterator will have reached the end of the set of values to ' - 'be\n' - ' returned.\n' - '\n' - ' Coroutine functions\n' - ' A function or method which is defined using "async def" is\n' - ' called a *coroutine function*. Such a function, when ' - 'called,\n' - ' returns a *coroutine* object. It may contain "await"\n' - ' expressions, as well as "async with" and "async for" ' - 'statements.\n' - ' See also the *Coroutine Objects* section.\n' - '\n' - ' Built-in functions\n' - ' A built-in function object is a wrapper around a C ' - 'function.\n' - ' Examples of built-in functions are "len()" and ' - '"math.sin()"\n' - ' ("math" is a standard built-in module). The number and type ' - 'of\n' - ' the arguments are determined by the C function. Special ' - 'read-\n' - ' only attributes: "__doc__" is the function\'s ' - 'documentation\n' - ' string, or "None" if unavailable; "__name__" is the ' - "function's\n" - ' name; "__self__" is set to "None" (but see the next item);\n' - ' "__module__" is the name of the module the function was ' - 'defined\n' - ' in or "None" if unavailable.\n' - '\n' - ' Built-in methods\n' - ' This is really a different disguise of a built-in function, ' - 'this\n' - ' time containing an object passed to the C function as an\n' - ' implicit extra argument. An example of a built-in method ' - 'is\n' - ' "alist.append()", assuming *alist* is a list object. In ' - 'this\n' - ' case, the special read-only attribute "__self__" is set to ' - 'the\n' - ' object denoted by *alist*.\n' - '\n' - ' Classes\n' - ' Classes are callable. These objects normally act as ' - 'factories\n' - ' for new instances of themselves, but variations are ' - 'possible for\n' - ' class types that override "__new__()". The arguments of ' - 'the\n' - ' call are passed to "__new__()" and, in the typical case, ' - 'to\n' - ' "__init__()" to initialize the new instance.\n' - '\n' - ' Class Instances\n' - ' Instances of arbitrary classes can be made callable by ' - 'defining\n' - ' a "__call__()" method in their class.\n' - '\n' - 'Modules\n' - ' Modules are a basic organizational unit of Python code, and ' - 'are\n' - ' created by the *import system* as invoked either by the ' - '"import"\n' - ' statement (see "import"), or by calling functions such as\n' - ' "importlib.import_module()" and built-in "__import__()". A ' - 'module\n' - ' object has a namespace implemented by a dictionary object ' - '(this is\n' - ' the dictionary referenced by the "__globals__" attribute of\n' - ' functions defined in the module). Attribute references are\n' - ' translated to lookups in this dictionary, e.g., "m.x" is ' - 'equivalent\n' - ' to "m.__dict__["x"]". A module object does not contain the ' - 'code\n' - " object used to initialize the module (since it isn't needed " - 'once\n' - ' the initialization is done).\n' - '\n' - " Attribute assignment updates the module's namespace " - 'dictionary,\n' - ' e.g., "m.x = 1" is equivalent to "m.__dict__["x"] = 1".\n' - '\n' - ' Special read-only attribute: "__dict__" is the module\'s ' - 'namespace\n' - ' as a dictionary object.\n' - '\n' - ' **CPython implementation detail:** Because of the way CPython\n' - ' clears module dictionaries, the module dictionary will be ' - 'cleared\n' - ' when the module falls out of scope even if the dictionary ' - 'still has\n' - ' live references. To avoid this, copy the dictionary or keep ' - 'the\n' - ' module around while using its dictionary directly.\n' - '\n' - ' Predefined (writable) attributes: "__name__" is the module\'s ' - 'name;\n' - ' "__doc__" is the module\'s documentation string, or "None" if\n' - ' unavailable; "__file__" is the pathname of the file from which ' - 'the\n' - ' module was loaded, if it was loaded from a file. The ' - '"__file__"\n' - ' attribute may be missing for certain types of modules, such as ' - 'C\n' - ' modules that are statically linked into the interpreter; for\n' - ' extension modules loaded dynamically from a shared library, it ' - 'is\n' - ' the pathname of the shared library file.\n' - '\n' - 'Custom classes\n' - ' Custom class types are typically created by class definitions ' - '(see\n' - ' section *Class definitions*). A class has a namespace ' - 'implemented\n' - ' by a dictionary object. Class attribute references are ' - 'translated\n' - ' to lookups in this dictionary, e.g., "C.x" is translated to\n' - ' "C.__dict__["x"]" (although there are a number of hooks which ' - 'allow\n' - ' for other means of locating attributes). When the attribute ' - 'name is\n' - ' not found there, the attribute search continues in the base\n' - ' classes. This search of the base classes uses the C3 method\n' - ' resolution order which behaves correctly even in the presence ' - 'of\n' - " 'diamond' inheritance structures where there are multiple\n" - ' inheritance paths leading back to a common ancestor. ' - 'Additional\n' - ' details on the C3 MRO used by Python can be found in the\n' - ' documentation accompanying the 2.3 release at\n' - ' https://www.python.org/download/releases/2.3/mro/.\n' - '\n' - ' When a class attribute reference (for class "C", say) would ' - 'yield a\n' - ' class method object, it is transformed into an instance ' - 'method\n' - ' object whose "__self__" attributes is "C". When it would ' - 'yield a\n' - ' static method object, it is transformed into the object ' - 'wrapped by\n' - ' the static method object. See section *Implementing ' - 'Descriptors*\n' - ' for another way in which attributes retrieved from a class ' - 'may\n' - ' differ from those actually contained in its "__dict__".\n' - '\n' - " Class attribute assignments update the class's dictionary, " - 'never\n' - ' the dictionary of a base class.\n' - '\n' - ' A class object can be called (see above) to yield a class ' - 'instance\n' - ' (see below).\n' - '\n' - ' Special attributes: "__name__" is the class name; "__module__" ' - 'is\n' - ' the module name in which the class was defined; "__dict__" is ' - 'the\n' - ' dictionary containing the class\'s namespace; "__bases__" is a ' - 'tuple\n' - ' containing the base classes, in the order of their occurrence ' - 'in\n' - ' the base class list; "__doc__" is the class\'s documentation ' - 'string,\n' - ' or "None" if undefined.\n' - '\n' - 'Class instances\n' - ' A class instance is created by calling a class object (see ' - 'above).\n' - ' A class instance has a namespace implemented as a dictionary ' - 'which\n' - ' is the first place in which attribute references are ' - 'searched.\n' - " When an attribute is not found there, and the instance's class " - 'has\n' - ' an attribute by that name, the search continues with the ' - 'class\n' - ' attributes. If a class attribute is found that is a ' - 'user-defined\n' - ' function object, it is transformed into an instance method ' - 'object\n' - ' whose "__self__" attribute is the instance. Static method ' - 'and\n' - ' class method objects are also transformed; see above under\n' - ' "Classes". See section *Implementing Descriptors* for another ' - 'way\n' - ' in which attributes of a class retrieved via its instances ' - 'may\n' - " differ from the objects actually stored in the class's " - '"__dict__".\n' - " If no class attribute is found, and the object's class has a\n" - ' "__getattr__()" method, that is called to satisfy the lookup.\n' - '\n' - " Attribute assignments and deletions update the instance's\n" - " dictionary, never a class's dictionary. If the class has a\n" - ' "__setattr__()" or "__delattr__()" method, this is called ' - 'instead\n' - ' of updating the instance dictionary directly.\n' - '\n' - ' Class instances can pretend to be numbers, sequences, or ' - 'mappings\n' - ' if they have methods with certain special names. See section\n' - ' *Special method names*.\n' - '\n' - ' Special attributes: "__dict__" is the attribute dictionary;\n' - ' "__class__" is the instance\'s class.\n' - '\n' - 'I/O objects (also known as file objects)\n' - ' A *file object* represents an open file. Various shortcuts ' - 'are\n' - ' available to create file objects: the "open()" built-in ' - 'function,\n' - ' and also "os.popen()", "os.fdopen()", and the "makefile()" ' - 'method\n' - ' of socket objects (and perhaps by other functions or methods\n' - ' provided by extension modules).\n' - '\n' - ' The objects "sys.stdin", "sys.stdout" and "sys.stderr" are\n' - ' initialized to file objects corresponding to the ' - "interpreter's\n" - ' standard input, output and error streams; they are all open in ' - 'text\n' - ' mode and therefore follow the interface defined by the\n' - ' "io.TextIOBase" abstract class.\n' - '\n' - 'Internal types\n' - ' A few types used internally by the interpreter are exposed to ' - 'the\n' - ' user. Their definitions may change with future versions of ' - 'the\n' - ' interpreter, but they are mentioned here for completeness.\n' - '\n' - ' Code objects\n' - ' Code objects represent *byte-compiled* executable Python ' - 'code,\n' - ' or *bytecode*. The difference between a code object and a\n' - ' function object is that the function object contains an ' - 'explicit\n' - " reference to the function's globals (the module in which it " - 'was\n' - ' defined), while a code object contains no context; also ' - 'the\n' - ' default argument values are stored in the function object, ' - 'not\n' - ' in the code object (because they represent values ' - 'calculated at\n' - ' run-time). Unlike function objects, code objects are ' - 'immutable\n' - ' and contain no references (directly or indirectly) to ' - 'mutable\n' - ' objects.\n' - '\n' - ' Special read-only attributes: "co_name" gives the function ' - 'name;\n' - ' "co_argcount" is the number of positional arguments ' - '(including\n' - ' arguments with default values); "co_nlocals" is the number ' - 'of\n' - ' local variables used by the function (including ' - 'arguments);\n' - ' "co_varnames" is a tuple containing the names of the local\n' - ' variables (starting with the argument names); "co_cellvars" ' - 'is a\n' - ' tuple containing the names of local variables that are\n' - ' referenced by nested functions; "co_freevars" is a tuple\n' - ' containing the names of free variables; "co_code" is a ' - 'string\n' - ' representing the sequence of bytecode instructions; ' - '"co_consts"\n' - ' is a tuple containing the literals used by the bytecode;\n' - ' "co_names" is a tuple containing the names used by the ' - 'bytecode;\n' - ' "co_filename" is the filename from which the code was ' - 'compiled;\n' - ' "co_firstlineno" is the first line number of the function;\n' - ' "co_lnotab" is a string encoding the mapping from bytecode\n' - ' offsets to line numbers (for details see the source code of ' - 'the\n' - ' interpreter); "co_stacksize" is the required stack size\n' - ' (including local variables); "co_flags" is an integer ' - 'encoding a\n' - ' number of flags for the interpreter.\n' - '\n' - ' The following flag bits are defined for "co_flags": bit ' - '"0x04"\n' - ' is set if the function uses the "*arguments" syntax to ' - 'accept an\n' - ' arbitrary number of positional arguments; bit "0x08" is set ' - 'if\n' - ' the function uses the "**keywords" syntax to accept ' - 'arbitrary\n' - ' keyword arguments; bit "0x20" is set if the function is a\n' - ' generator.\n' - '\n' - ' Future feature declarations ("from __future__ import ' - 'division")\n' - ' also use bits in "co_flags" to indicate whether a code ' - 'object\n' - ' was compiled with a particular feature enabled: bit ' - '"0x2000" is\n' - ' set if the function was compiled with future division ' - 'enabled;\n' - ' bits "0x10" and "0x1000" were used in earlier versions of\n' - ' Python.\n' - '\n' - ' Other bits in "co_flags" are reserved for internal use.\n' - '\n' - ' If a code object represents a function, the first item in\n' - ' "co_consts" is the documentation string of the function, ' - 'or\n' - ' "None" if undefined.\n' - '\n' - ' Frame objects\n' - ' Frame objects represent execution frames. They may occur ' - 'in\n' - ' traceback objects (see below).\n' - '\n' - ' Special read-only attributes: "f_back" is to the previous ' - 'stack\n' - ' frame (towards the caller), or "None" if this is the ' - 'bottom\n' - ' stack frame; "f_code" is the code object being executed in ' - 'this\n' - ' frame; "f_locals" is the dictionary used to look up local\n' - ' variables; "f_globals" is used for global variables;\n' - ' "f_builtins" is used for built-in (intrinsic) names; ' - '"f_lasti"\n' - ' gives the precise instruction (this is an index into the\n' - ' bytecode string of the code object).\n' - '\n' - ' Special writable attributes: "f_trace", if not "None", is ' - 'a\n' - ' function called at the start of each source code line (this ' - 'is\n' - ' used by the debugger); "f_lineno" is the current line ' - 'number of\n' - ' the frame --- writing to this from within a trace function ' - 'jumps\n' - ' to the given line (only for the bottom-most frame). A ' - 'debugger\n' - ' can implement a Jump command (aka Set Next Statement) by ' - 'writing\n' - ' to f_lineno.\n' - '\n' - ' Frame objects support one method:\n' - '\n' - ' frame.clear()\n' - '\n' - ' This method clears all references to local variables ' - 'held by\n' - ' the frame. Also, if the frame belonged to a generator, ' - 'the\n' - ' generator is finalized. This helps break reference ' - 'cycles\n' - ' involving frame objects (for example when catching an\n' - ' exception and storing its traceback for later use).\n' - '\n' - ' "RuntimeError" is raised if the frame is currently ' - 'executing.\n' - '\n' - ' New in version 3.4.\n' - '\n' - ' Traceback objects\n' - ' Traceback objects represent a stack trace of an exception. ' - 'A\n' - ' traceback object is created when an exception occurs. When ' - 'the\n' - ' search for an exception handler unwinds the execution ' - 'stack, at\n' - ' each unwound level a traceback object is inserted in front ' - 'of\n' - ' the current traceback. When an exception handler is ' - 'entered,\n' - ' the stack trace is made available to the program. (See ' - 'section\n' - ' *The try statement*.) It is accessible as the third item of ' - 'the\n' - ' tuple returned by "sys.exc_info()". When the program ' - 'contains no\n' - ' suitable handler, the stack trace is written (nicely ' - 'formatted)\n' - ' to the standard error stream; if the interpreter is ' - 'interactive,\n' - ' it is also made available to the user as ' - '"sys.last_traceback".\n' - '\n' - ' Special read-only attributes: "tb_next" is the next level ' - 'in the\n' - ' stack trace (towards the frame where the exception ' - 'occurred), or\n' - ' "None" if there is no next level; "tb_frame" points to the\n' - ' execution frame of the current level; "tb_lineno" gives the ' - 'line\n' - ' number where the exception occurred; "tb_lasti" indicates ' - 'the\n' - ' precise instruction. The line number and last instruction ' - 'in\n' - ' the traceback may differ from the line number of its frame\n' - ' object if the exception occurred in a "try" statement with ' - 'no\n' - ' matching except clause or with a finally clause.\n' - '\n' - ' Slice objects\n' - ' Slice objects are used to represent slices for ' - '"__getitem__()"\n' - ' methods. They are also created by the built-in "slice()"\n' - ' function.\n' - '\n' - ' Special read-only attributes: "start" is the lower bound; ' - '"stop"\n' - ' is the upper bound; "step" is the step value; each is ' - '"None" if\n' - ' omitted. These attributes can have any type.\n' - '\n' - ' Slice objects support one method:\n' - '\n' - ' slice.indices(self, length)\n' - '\n' - ' This method takes a single integer argument *length* ' - 'and\n' - ' computes information about the slice that the slice ' - 'object\n' - ' would describe if applied to a sequence of *length* ' - 'items.\n' - ' It returns a tuple of three integers; respectively these ' - 'are\n' - ' the *start* and *stop* indices and the *step* or stride\n' - ' length of the slice. Missing or out-of-bounds indices ' - 'are\n' - ' handled in a manner consistent with regular slices.\n' - '\n' - ' Static method objects\n' - ' Static method objects provide a way of defeating the\n' - ' transformation of function objects to method objects ' - 'described\n' - ' above. A static method object is a wrapper around any ' - 'other\n' - ' object, usually a user-defined method object. When a ' - 'static\n' - ' method object is retrieved from a class or a class ' - 'instance, the\n' - ' object actually returned is the wrapped object, which is ' - 'not\n' - ' subject to any further transformation. Static method ' - 'objects are\n' - ' not themselves callable, although the objects they wrap ' - 'usually\n' - ' are. Static method objects are created by the built-in\n' - ' "staticmethod()" constructor.\n' - '\n' - ' Class method objects\n' - ' A class method object, like a static method object, is a ' - 'wrapper\n' - ' around another object that alters the way in which that ' - 'object\n' - ' is retrieved from classes and class instances. The ' - 'behaviour of\n' - ' class method objects upon such retrieval is described ' - 'above,\n' - ' under "User-defined methods". Class method objects are ' - 'created\n' - ' by the built-in "classmethod()" constructor.\n', - 'typesfunctions': '\n' - 'Functions\n' - '*********\n' - '\n' - 'Function objects are created by function definitions. ' - 'The only\n' - 'operation on a function object is to call it: ' - '"func(argument-list)".\n' - '\n' - 'There are really two flavors of function objects: ' - 'built-in functions\n' - 'and user-defined functions. Both support the same ' - 'operation (to call\n' - 'the function), but the implementation is different, ' - 'hence the\n' - 'different object types.\n' - '\n' - 'See *Function definitions* for more information.\n', - 'typesmapping': '\n' - 'Mapping Types --- "dict"\n' - '************************\n' - '\n' - 'A *mapping* object maps *hashable* values to arbitrary ' - 'objects.\n' - 'Mappings are mutable objects. There is currently only one ' - 'standard\n' - 'mapping type, the *dictionary*. (For other containers see ' - 'the built-\n' - 'in "list", "set", and "tuple" classes, and the ' - '"collections" module.)\n' - '\n' - "A dictionary's keys are *almost* arbitrary values. Values " - 'that are\n' - 'not *hashable*, that is, values containing lists, ' - 'dictionaries or\n' - 'other mutable types (that are compared by value rather ' - 'than by object\n' - 'identity) may not be used as keys. Numeric types used for ' - 'keys obey\n' - 'the normal rules for numeric comparison: if two numbers ' - 'compare equal\n' - '(such as "1" and "1.0") then they can be used ' - 'interchangeably to index\n' - 'the same dictionary entry. (Note however, that since ' - 'computers store\n' - 'floating-point numbers as approximations it is usually ' - 'unwise to use\n' - 'them as dictionary keys.)\n' - '\n' - 'Dictionaries can be created by placing a comma-separated ' - 'list of "key:\n' - 'value" pairs within braces, for example: "{\'jack\': 4098, ' - "'sjoerd':\n" - '4127}" or "{4098: \'jack\', 4127: \'sjoerd\'}", or by the ' - '"dict"\n' - 'constructor.\n' - '\n' - 'class class dict(**kwarg)\n' - 'class class dict(mapping, **kwarg)\n' - 'class class dict(iterable, **kwarg)\n' - '\n' - ' Return a new dictionary initialized from an optional ' - 'positional\n' - ' argument and a possibly empty set of keyword ' - 'arguments.\n' - '\n' - ' If no positional argument is given, an empty dictionary ' - 'is created.\n' - ' If a positional argument is given and it is a mapping ' - 'object, a\n' - ' dictionary is created with the same key-value pairs as ' - 'the mapping\n' - ' object. Otherwise, the positional argument must be an ' - '*iterable*\n' - ' object. Each item in the iterable must itself be an ' - 'iterable with\n' - ' exactly two objects. The first object of each item ' - 'becomes a key\n' - ' in the new dictionary, and the second object the ' - 'corresponding\n' - ' value. If a key occurs more than once, the last value ' - 'for that key\n' - ' becomes the corresponding value in the new dictionary.\n' - '\n' - ' If keyword arguments are given, the keyword arguments ' - 'and their\n' - ' values are added to the dictionary created from the ' - 'positional\n' - ' argument. If a key being added is already present, the ' - 'value from\n' - ' the keyword argument replaces the value from the ' - 'positional\n' - ' argument.\n' - '\n' - ' To illustrate, the following examples all return a ' - 'dictionary equal\n' - ' to "{"one": 1, "two": 2, "three": 3}":\n' - '\n' - ' >>> a = dict(one=1, two=2, three=3)\n' - " >>> b = {'one': 1, 'two': 2, 'three': 3}\n" - " >>> c = dict(zip(['one', 'two', 'three'], [1, 2, " - '3]))\n' - " >>> d = dict([('two', 2), ('one', 1), ('three', " - '3)])\n' - " >>> e = dict({'three': 3, 'one': 1, 'two': 2})\n" - ' >>> a == b == c == d == e\n' - ' True\n' - '\n' - ' Providing keyword arguments as in the first example ' - 'only works for\n' - ' keys that are valid Python identifiers. Otherwise, any ' - 'valid keys\n' - ' can be used.\n' - '\n' - ' These are the operations that dictionaries support (and ' - 'therefore,\n' - ' custom mapping types should support too):\n' - '\n' - ' len(d)\n' - '\n' - ' Return the number of items in the dictionary *d*.\n' - '\n' - ' d[key]\n' - '\n' - ' Return the item of *d* with key *key*. Raises a ' - '"KeyError" if\n' - ' *key* is not in the map.\n' - '\n' - ' If a subclass of dict defines a method ' - '"__missing__()" and *key*\n' - ' is not present, the "d[key]" operation calls that ' - 'method with\n' - ' the key *key* as argument. The "d[key]" operation ' - 'then returns\n' - ' or raises whatever is returned or raised by the\n' - ' "__missing__(key)" call. No other operations or ' - 'methods invoke\n' - ' "__missing__()". If "__missing__()" is not defined, ' - '"KeyError"\n' - ' is raised. "__missing__()" must be a method; it ' - 'cannot be an\n' - ' instance variable:\n' - '\n' - ' >>> class Counter(dict):\n' - ' ... def __missing__(self, key):\n' - ' ... return 0\n' - ' >>> c = Counter()\n' - " >>> c['red']\n" - ' 0\n' - " >>> c['red'] += 1\n" - " >>> c['red']\n" - ' 1\n' - '\n' - ' The example above shows part of the implementation ' - 'of\n' - ' "collections.Counter". A different "__missing__" ' - 'method is used\n' - ' by "collections.defaultdict".\n' - '\n' - ' d[key] = value\n' - '\n' - ' Set "d[key]" to *value*.\n' - '\n' - ' del d[key]\n' - '\n' - ' Remove "d[key]" from *d*. Raises a "KeyError" if ' - '*key* is not\n' - ' in the map.\n' - '\n' - ' key in d\n' - '\n' - ' Return "True" if *d* has a key *key*, else "False".\n' - '\n' - ' key not in d\n' - '\n' - ' Equivalent to "not key in d".\n' - '\n' - ' iter(d)\n' - '\n' - ' Return an iterator over the keys of the dictionary. ' - 'This is a\n' - ' shortcut for "iter(d.keys())".\n' - '\n' - ' clear()\n' - '\n' - ' Remove all items from the dictionary.\n' - '\n' - ' copy()\n' - '\n' - ' Return a shallow copy of the dictionary.\n' - '\n' - ' classmethod fromkeys(seq[, value])\n' - '\n' - ' Create a new dictionary with keys from *seq* and ' - 'values set to\n' - ' *value*.\n' - '\n' - ' "fromkeys()" is a class method that returns a new ' - 'dictionary.\n' - ' *value* defaults to "None".\n' - '\n' - ' get(key[, default])\n' - '\n' - ' Return the value for *key* if *key* is in the ' - 'dictionary, else\n' - ' *default*. If *default* is not given, it defaults to ' - '"None", so\n' - ' that this method never raises a "KeyError".\n' - '\n' - ' items()\n' - '\n' - ' Return a new view of the dictionary\'s items ("(key, ' - 'value)"\n' - ' pairs). See the *documentation of view objects*.\n' - '\n' - ' keys()\n' - '\n' - " Return a new view of the dictionary's keys. See " - 'the\n' - ' *documentation of view objects*.\n' - '\n' - ' pop(key[, default])\n' - '\n' - ' If *key* is in the dictionary, remove it and return ' - 'its value,\n' - ' else return *default*. If *default* is not given ' - 'and *key* is\n' - ' not in the dictionary, a "KeyError" is raised.\n' - '\n' - ' popitem()\n' - '\n' - ' Remove and return an arbitrary "(key, value)" pair ' - 'from the\n' - ' dictionary.\n' - '\n' - ' "popitem()" is useful to destructively iterate over ' - 'a\n' - ' dictionary, as often used in set algorithms. If the ' - 'dictionary\n' - ' is empty, calling "popitem()" raises a "KeyError".\n' - '\n' - ' setdefault(key[, default])\n' - '\n' - ' If *key* is in the dictionary, return its value. If ' - 'not, insert\n' - ' *key* with a value of *default* and return ' - '*default*. *default*\n' - ' defaults to "None".\n' - '\n' - ' update([other])\n' - '\n' - ' Update the dictionary with the key/value pairs from ' - '*other*,\n' - ' overwriting existing keys. Return "None".\n' - '\n' - ' "update()" accepts either another dictionary object ' - 'or an\n' - ' iterable of key/value pairs (as tuples or other ' - 'iterables of\n' - ' length two). If keyword arguments are specified, ' - 'the dictionary\n' - ' is then updated with those key/value pairs: ' - '"d.update(red=1,\n' - ' blue=2)".\n' - '\n' - ' values()\n' - '\n' - " Return a new view of the dictionary's values. See " - 'the\n' - ' *documentation of view objects*.\n' - '\n' - ' Dictionaries compare equal if and only if they have the ' - 'same "(key,\n' - ' value)" pairs. Order comparisons (\'<\', \'<=\', ' - "'>=', '>') raise\n" - ' "TypeError".\n' - '\n' - 'See also: "types.MappingProxyType" can be used to create a ' - 'read-only\n' - ' view of a "dict".\n' - '\n' - '\n' - 'Dictionary view objects\n' - '=======================\n' - '\n' - 'The objects returned by "dict.keys()", "dict.values()" ' - 'and\n' - '"dict.items()" are *view objects*. They provide a dynamic ' - 'view on the\n' - "dictionary's entries, which means that when the dictionary " - 'changes,\n' - 'the view reflects these changes.\n' - '\n' - 'Dictionary views can be iterated over to yield their ' - 'respective data,\n' - 'and support membership tests:\n' - '\n' - 'len(dictview)\n' - '\n' - ' Return the number of entries in the dictionary.\n' - '\n' - 'iter(dictview)\n' - '\n' - ' Return an iterator over the keys, values or items ' - '(represented as\n' - ' tuples of "(key, value)") in the dictionary.\n' - '\n' - ' Keys and values are iterated over in an arbitrary order ' - 'which is\n' - ' non-random, varies across Python implementations, and ' - 'depends on\n' - " the dictionary's history of insertions and deletions. " - 'If keys,\n' - ' values and items views are iterated over with no ' - 'intervening\n' - ' modifications to the dictionary, the order of items ' - 'will directly\n' - ' correspond. This allows the creation of "(value, key)" ' - 'pairs using\n' - ' "zip()": "pairs = zip(d.values(), d.keys())". Another ' - 'way to\n' - ' create the same list is "pairs = [(v, k) for (k, v) in ' - 'd.items()]".\n' - '\n' - ' Iterating views while adding or deleting entries in the ' - 'dictionary\n' - ' may raise a "RuntimeError" or fail to iterate over all ' - 'entries.\n' - '\n' - 'x in dictview\n' - '\n' - ' Return "True" if *x* is in the underlying dictionary\'s ' - 'keys, values\n' - ' or items (in the latter case, *x* should be a "(key, ' - 'value)"\n' - ' tuple).\n' - '\n' - 'Keys views are set-like since their entries are unique and ' - 'hashable.\n' - 'If all values are hashable, so that "(key, value)" pairs ' - 'are unique\n' - 'and hashable, then the items view is also set-like. ' - '(Values views are\n' - 'not treated as set-like since the entries are generally ' - 'not unique.)\n' - 'For set-like views, all of the operations defined for the ' - 'abstract\n' - 'base class "collections.abc.Set" are available (for ' - 'example, "==",\n' - '"<", or "^").\n' - '\n' - 'An example of dictionary view usage:\n' - '\n' - " >>> dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, " - "'spam': 500}\n" - ' >>> keys = dishes.keys()\n' - ' >>> values = dishes.values()\n' - '\n' - ' >>> # iteration\n' - ' >>> n = 0\n' - ' >>> for val in values:\n' - ' ... n += val\n' - ' >>> print(n)\n' - ' 504\n' - '\n' - ' >>> # keys and values are iterated over in the same ' - 'order\n' - ' >>> list(keys)\n' - " ['eggs', 'bacon', 'sausage', 'spam']\n" - ' >>> list(values)\n' - ' [2, 1, 1, 500]\n' - '\n' - ' >>> # view objects are dynamic and reflect dict ' - 'changes\n' - " >>> del dishes['eggs']\n" - " >>> del dishes['sausage']\n" - ' >>> list(keys)\n' - " ['spam', 'bacon']\n" - '\n' - ' >>> # set operations\n' - " >>> keys & {'eggs', 'bacon', 'salad'}\n" - " {'bacon'}\n" - " >>> keys ^ {'sausage', 'juice'}\n" - " {'juice', 'sausage', 'bacon', 'spam'}\n", - 'typesmethods': '\n' - 'Methods\n' - '*******\n' - '\n' - 'Methods are functions that are called using the attribute ' - 'notation.\n' - 'There are two flavors: built-in methods (such as ' - '"append()" on lists)\n' - 'and class instance methods. Built-in methods are ' - 'described with the\n' - 'types that support them.\n' - '\n' - 'If you access a method (a function defined in a class ' - 'namespace)\n' - 'through an instance, you get a special object: a *bound ' - 'method* (also\n' - 'called *instance method*) object. When called, it will add ' - 'the "self"\n' - 'argument to the argument list. Bound methods have two ' - 'special read-\n' - 'only attributes: "m.__self__" is the object on which the ' - 'method\n' - 'operates, and "m.__func__" is the function implementing ' - 'the method.\n' - 'Calling "m(arg-1, arg-2, ..., arg-n)" is completely ' - 'equivalent to\n' - 'calling "m.__func__(m.__self__, arg-1, arg-2, ..., ' - 'arg-n)".\n' - '\n' - 'Like function objects, bound method objects support ' - 'getting arbitrary\n' - 'attributes. However, since method attributes are actually ' - 'stored on\n' - 'the underlying function object ("meth.__func__"), setting ' - 'method\n' - 'attributes on bound methods is disallowed. Attempting to ' - 'set an\n' - 'attribute on a method results in an "AttributeError" being ' - 'raised. In\n' - 'order to set a method attribute, you need to explicitly ' - 'set it on the\n' - 'underlying function object:\n' - '\n' - ' >>> class C:\n' - ' ... def method(self):\n' - ' ... pass\n' - ' ...\n' - ' >>> c = C()\n' - " >>> c.method.whoami = 'my name is method' # can't set " - 'on the method\n' - ' Traceback (most recent call last):\n' - ' File "", line 1, in \n' - " AttributeError: 'method' object has no attribute " - "'whoami'\n" - " >>> c.method.__func__.whoami = 'my name is method'\n" - ' >>> c.method.whoami\n' - " 'my name is method'\n" - '\n' - 'See *The standard type hierarchy* for more information.\n', - 'typesmodules': '\n' - 'Modules\n' - '*******\n' - '\n' - 'The only special operation on a module is attribute ' - 'access: "m.name",\n' - 'where *m* is a module and *name* accesses a name defined ' - "in *m*'s\n" - 'symbol table. Module attributes can be assigned to. (Note ' - 'that the\n' - '"import" statement is not, strictly speaking, an operation ' - 'on a module\n' - 'object; "import foo" does not require a module object ' - 'named *foo* to\n' - 'exist, rather it requires an (external) *definition* for a ' - 'module\n' - 'named *foo* somewhere.)\n' - '\n' - 'A special attribute of every module is "__dict__". This is ' - 'the\n' - "dictionary containing the module's symbol table. Modifying " - 'this\n' - "dictionary will actually change the module's symbol table, " - 'but direct\n' - 'assignment to the "__dict__" attribute is not possible ' - '(you can write\n' - '"m.__dict__[\'a\'] = 1", which defines "m.a" to be "1", ' - "but you can't\n" - 'write "m.__dict__ = {}"). Modifying "__dict__" directly ' - 'is not\n' - 'recommended.\n' - '\n' - 'Modules built into the interpreter are written like this: ' - '"". If loaded from a file, they are ' - 'written as\n' - '"".\n', - 'typesseq': '\n' - 'Sequence Types --- "list", "tuple", "range"\n' - '*******************************************\n' - '\n' - 'There are three basic sequence types: lists, tuples, and ' - 'range\n' - 'objects. Additional sequence types tailored for processing of ' - '*binary\n' - 'data* and *text strings* are described in dedicated sections.\n' - '\n' - '\n' - 'Common Sequence Operations\n' - '==========================\n' - '\n' - 'The operations in the following table are supported by most ' - 'sequence\n' - 'types, both mutable and immutable. The ' - '"collections.abc.Sequence" ABC\n' - 'is provided to make it easier to correctly implement these ' - 'operations\n' - 'on custom sequence types.\n' - '\n' - 'This table lists the sequence operations sorted in ascending ' - 'priority.\n' - 'In the table, *s* and *t* are sequences of the same type, *n*, ' - '*i*,\n' - '*j* and *k* are integers and *x* is an arbitrary object that ' - 'meets any\n' - 'type and value restrictions imposed by *s*.\n' - '\n' - 'The "in" and "not in" operations have the same priorities as ' - 'the\n' - 'comparison operations. The "+" (concatenation) and "*" ' - '(repetition)\n' - 'operations have the same priority as the corresponding ' - 'numeric\n' - 'operations. [3]\n' - '\n' - '+----------------------------+----------------------------------+------------+\n' - '| Operation | ' - 'Result | Notes |\n' - '+============================+==================================+============+\n' - '| "x in s" | "True" if an item of *s* ' - 'is | (1) |\n' - '| | equal to *x*, else ' - '"False" | |\n' - '+----------------------------+----------------------------------+------------+\n' - '| "x not in s" | "False" if an item of *s* ' - 'is | (1) |\n' - '| | equal to *x*, else ' - '"True" | |\n' - '+----------------------------+----------------------------------+------------+\n' - '| "s + t" | the concatenation of *s* and ' - '*t* | (6)(7) |\n' - '+----------------------------+----------------------------------+------------+\n' - '| "s * n" or "n * s" | equivalent to adding *s* ' - 'to | (2)(7) |\n' - '| | itself *n* ' - 'times | |\n' - '+----------------------------+----------------------------------+------------+\n' - '| "s[i]" | *i*th item of *s*, origin ' - '0 | (3) |\n' - '+----------------------------+----------------------------------+------------+\n' - '| "s[i:j]" | slice of *s* from *i* to ' - '*j* | (3)(4) |\n' - '+----------------------------+----------------------------------+------------+\n' - '| "s[i:j:k]" | slice of *s* from *i* to ' - '*j* | (3)(5) |\n' - '| | with step ' - '*k* | |\n' - '+----------------------------+----------------------------------+------------+\n' - '| "len(s)" | length of ' - '*s* | |\n' - '+----------------------------+----------------------------------+------------+\n' - '| "min(s)" | smallest item of ' - '*s* | |\n' - '+----------------------------+----------------------------------+------------+\n' - '| "max(s)" | largest item of ' - '*s* | |\n' - '+----------------------------+----------------------------------+------------+\n' - '| "s.index(x[, i[, j]])" | index of the first occurrence ' - 'of | (8) |\n' - '| | *x* in *s* (at or after ' - 'index | |\n' - '| | *i* and before index ' - '*j*) | |\n' - '+----------------------------+----------------------------------+------------+\n' - '| "s.count(x)" | total number of occurrences ' - 'of | |\n' - '| | *x* in ' - '*s* | |\n' - '+----------------------------+----------------------------------+------------+\n' - '\n' - 'Sequences of the same type also support comparisons. In ' - 'particular,\n' - 'tuples and lists are compared lexicographically by comparing\n' - 'corresponding elements. This means that to compare equal, ' - 'every\n' - 'element must compare equal and the two sequences must be of ' - 'the same\n' - 'type and have the same length. (For full details see ' - '*Comparisons* in\n' - 'the language reference.)\n' - '\n' - 'Notes:\n' - '\n' - '1. While the "in" and "not in" operations are used only for ' - 'simple\n' - ' containment testing in the general case, some specialised ' - 'sequences\n' - ' (such as "str", "bytes" and "bytearray") also use them for\n' - ' subsequence testing:\n' - '\n' - ' >>> "gg" in "eggs"\n' - ' True\n' - '\n' - '2. Values of *n* less than "0" are treated as "0" (which ' - 'yields an\n' - ' empty sequence of the same type as *s*). Note that items ' - 'in the\n' - ' sequence *s* are not copied; they are referenced multiple ' - 'times.\n' - ' This often haunts new Python programmers; consider:\n' - '\n' - ' >>> lists = [[]] * 3\n' - ' >>> lists\n' - ' [[], [], []]\n' - ' >>> lists[0].append(3)\n' - ' >>> lists\n' - ' [[3], [3], [3]]\n' - '\n' - ' What has happened is that "[[]]" is a one-element list ' - 'containing\n' - ' an empty list, so all three elements of "[[]] * 3" are ' - 'references\n' - ' to this single empty list. Modifying any of the elements ' - 'of\n' - ' "lists" modifies this single list. You can create a list ' - 'of\n' - ' different lists this way:\n' - '\n' - ' >>> lists = [[] for i in range(3)]\n' - ' >>> lists[0].append(3)\n' - ' >>> lists[1].append(5)\n' - ' >>> lists[2].append(7)\n' - ' >>> lists\n' - ' [[3], [5], [7]]\n' - '\n' - ' Further explanation is available in the FAQ entry *How do I ' - 'create\n' - ' a multidimensional list?*.\n' - '\n' - '3. If *i* or *j* is negative, the index is relative to the end ' - 'of\n' - ' sequence *s*: "len(s) + i" or "len(s) + j" is substituted. ' - 'But\n' - ' note that "-0" is still "0".\n' - '\n' - '4. The slice of *s* from *i* to *j* is defined as the sequence ' - 'of\n' - ' items with index *k* such that "i <= k < j". If *i* or *j* ' - 'is\n' - ' greater than "len(s)", use "len(s)". If *i* is omitted or ' - '"None",\n' - ' use "0". If *j* is omitted or "None", use "len(s)". If ' - '*i* is\n' - ' greater than or equal to *j*, the slice is empty.\n' - '\n' - '5. The slice of *s* from *i* to *j* with step *k* is defined ' - 'as the\n' - ' sequence of items with index "x = i + n*k" such that "0 <= ' - 'n <\n' - ' (j-i)/k". In other words, the indices are "i", "i+k", ' - '"i+2*k",\n' - ' "i+3*k" and so on, stopping when *j* is reached (but never\n' - ' including *j*). When *k* is positive, *i* and *j* are ' - 'reduced to\n' - ' "len(s)" if they are greater. When *k* is negative, *i* and ' - '*j* are\n' - ' reduced to "len(s) - 1" if they are greater. If *i* or *j* ' - 'are\n' - ' omitted or "None", they become "end" values (which end ' - 'depends on\n' - ' the sign of *k*). Note, *k* cannot be zero. If *k* is ' - '"None", it\n' - ' is treated like "1".\n' - '\n' - '6. Concatenating immutable sequences always results in a new\n' - ' object. This means that building up a sequence by repeated\n' - ' concatenation will have a quadratic runtime cost in the ' - 'total\n' - ' sequence length. To get a linear runtime cost, you must ' - 'switch to\n' - ' one of the alternatives below:\n' - '\n' - ' * if concatenating "str" objects, you can build a list and ' - 'use\n' - ' "str.join()" at the end or else write to an ' - '"io.StringIO"\n' - ' instance and retrieve its value when complete\n' - '\n' - ' * if concatenating "bytes" objects, you can similarly use\n' - ' "bytes.join()" or "io.BytesIO", or you can do in-place\n' - ' concatenation with a "bytearray" object. "bytearray" ' - 'objects are\n' - ' mutable and have an efficient overallocation mechanism\n' - '\n' - ' * if concatenating "tuple" objects, extend a "list" ' - 'instead\n' - '\n' - ' * for other types, investigate the relevant class ' - 'documentation\n' - '\n' - '7. Some sequence types (such as "range") only support item\n' - " sequences that follow specific patterns, and hence don't " - 'support\n' - ' sequence concatenation or repetition.\n' - '\n' - '8. "index" raises "ValueError" when *x* is not found in *s*. ' - 'When\n' - ' supported, the additional arguments to the index method ' - 'allow\n' - ' efficient searching of subsections of the sequence. Passing ' - 'the\n' - ' extra arguments is roughly equivalent to using ' - '"s[i:j].index(x)",\n' - ' only without copying any data and with the returned index ' - 'being\n' - ' relative to the start of the sequence rather than the start ' - 'of the\n' - ' slice.\n' - '\n' - '\n' - 'Immutable Sequence Types\n' - '========================\n' - '\n' - 'The only operation that immutable sequence types generally ' - 'implement\n' - 'that is not also implemented by mutable sequence types is ' - 'support for\n' - 'the "hash()" built-in.\n' - '\n' - 'This support allows immutable sequences, such as "tuple" ' - 'instances, to\n' - 'be used as "dict" keys and stored in "set" and "frozenset" ' - 'instances.\n' - '\n' - 'Attempting to hash an immutable sequence that contains ' - 'unhashable\n' - 'values will result in "TypeError".\n' - '\n' - '\n' - 'Mutable Sequence Types\n' - '======================\n' - '\n' - 'The operations in the following table are defined on mutable ' - 'sequence\n' - 'types. The "collections.abc.MutableSequence" ABC is provided ' - 'to make\n' - 'it easier to correctly implement these operations on custom ' - 'sequence\n' - 'types.\n' - '\n' - 'In the table *s* is an instance of a mutable sequence type, ' - '*t* is any\n' - 'iterable object and *x* is an arbitrary object that meets any ' - 'type and\n' - 'value restrictions imposed by *s* (for example, "bytearray" ' - 'only\n' - 'accepts integers that meet the value restriction "0 <= x <= ' - '255").\n' - '\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '| Operation | ' - 'Result | Notes |\n' - '+================================+==================================+=======================+\n' - '| "s[i] = x" | item *i* of *s* is replaced ' - 'by | |\n' - '| | ' - '*x* | |\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '| "s[i:j] = t" | slice of *s* from *i* to ' - '*j* is | |\n' - '| | replaced by the contents of ' - 'the | |\n' - '| | iterable ' - '*t* | |\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '| "del s[i:j]" | same as "s[i:j] = ' - '[]" | |\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '| "s[i:j:k] = t" | the elements of "s[i:j:k]" ' - 'are | (1) |\n' - '| | replaced by those of ' - '*t* | |\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '| "del s[i:j:k]" | removes the elements ' - 'of | |\n' - '| | "s[i:j:k]" from the ' - 'list | |\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '| "s.append(x)" | appends *x* to the end of ' - 'the | |\n' - '| | sequence (same ' - 'as | |\n' - '| | "s[len(s):len(s)] = ' - '[x]") | |\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '| "s.clear()" | removes all items from "s" ' - '(same | (5) |\n' - '| | as "del ' - 's[:]") | |\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '| "s.copy()" | creates a shallow copy of ' - '"s" | (5) |\n' - '| | (same as ' - '"s[:]") | |\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '| "s.extend(t)" or "s += t" | extends *s* with the ' - 'contents of | |\n' - '| | *t* (for the most part the ' - 'same | |\n' - '| | as "s[len(s):len(s)] = ' - 't") | |\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '| "s *= n" | updates *s* with its ' - 'contents | (6) |\n' - '| | repeated *n* ' - 'times | |\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '| "s.insert(i, x)" | inserts *x* into *s* at ' - 'the | |\n' - '| | index given by *i* (same ' - 'as | |\n' - '| | "s[i:i] = ' - '[x]") | |\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '| "s.pop([i])" | retrieves the item at *i* ' - 'and | (2) |\n' - '| | also removes it from ' - '*s* | |\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '| "s.remove(x)" | remove the first item from ' - '*s* | (3) |\n' - '| | where "s[i] == ' - 'x" | |\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '| "s.reverse()" | reverses the items of *s* ' - 'in | (4) |\n' - '| | ' - 'place | |\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '\n' - 'Notes:\n' - '\n' - '1. *t* must have the same length as the slice it is ' - 'replacing.\n' - '\n' - '2. The optional argument *i* defaults to "-1", so that by ' - 'default\n' - ' the last item is removed and returned.\n' - '\n' - '3. "remove" raises "ValueError" when *x* is not found in *s*.\n' - '\n' - '4. The "reverse()" method modifies the sequence in place for\n' - ' economy of space when reversing a large sequence. To ' - 'remind users\n' - ' that it operates by side effect, it does not return the ' - 'reversed\n' - ' sequence.\n' - '\n' - '5. "clear()" and "copy()" are included for consistency with ' - 'the\n' - " interfaces of mutable containers that don't support " - 'slicing\n' - ' operations (such as "dict" and "set")\n' - '\n' - ' New in version 3.3: "clear()" and "copy()" methods.\n' - '\n' - '6. The value *n* is an integer, or an object implementing\n' - ' "__index__()". Zero and negative values of *n* clear the ' - 'sequence.\n' - ' Items in the sequence are not copied; they are referenced ' - 'multiple\n' - ' times, as explained for "s * n" under *Common Sequence ' - 'Operations*.\n' - '\n' - '\n' - 'Lists\n' - '=====\n' - '\n' - 'Lists are mutable sequences, typically used to store ' - 'collections of\n' - 'homogeneous items (where the precise degree of similarity will ' - 'vary by\n' - 'application).\n' - '\n' - 'class class list([iterable])\n' - '\n' - ' Lists may be constructed in several ways:\n' - '\n' - ' * Using a pair of square brackets to denote the empty list: ' - '"[]"\n' - '\n' - ' * Using square brackets, separating items with commas: ' - '"[a]",\n' - ' "[a, b, c]"\n' - '\n' - ' * Using a list comprehension: "[x for x in iterable]"\n' - '\n' - ' * Using the type constructor: "list()" or "list(iterable)"\n' - '\n' - ' The constructor builds a list whose items are the same and ' - 'in the\n' - " same order as *iterable*'s items. *iterable* may be either " - 'a\n' - ' sequence, a container that supports iteration, or an ' - 'iterator\n' - ' object. If *iterable* is already a list, a copy is made ' - 'and\n' - ' returned, similar to "iterable[:]". For example, ' - '"list(\'abc\')"\n' - ' returns "[\'a\', \'b\', \'c\']" and "list( (1, 2, 3) )" ' - 'returns "[1, 2,\n' - ' 3]". If no argument is given, the constructor creates a new ' - 'empty\n' - ' list, "[]".\n' - '\n' - ' Many other operations also produce lists, including the ' - '"sorted()"\n' - ' built-in.\n' - '\n' - ' Lists implement all of the *common* and *mutable* sequence\n' - ' operations. Lists also provide the following additional ' - 'method:\n' - '\n' - ' sort(*, key=None, reverse=None)\n' - '\n' - ' This method sorts the list in place, using only "<" ' - 'comparisons\n' - ' between items. Exceptions are not suppressed - if any ' - 'comparison\n' - ' operations fail, the entire sort operation will fail ' - '(and the\n' - ' list will likely be left in a partially modified ' - 'state).\n' - '\n' - ' "sort()" accepts two arguments that can only be passed ' - 'by\n' - ' keyword (*keyword-only arguments*):\n' - '\n' - ' *key* specifies a function of one argument that is used ' - 'to\n' - ' extract a comparison key from each list element (for ' - 'example,\n' - ' "key=str.lower"). The key corresponding to each item in ' - 'the list\n' - ' is calculated once and then used for the entire sorting ' - 'process.\n' - ' The default value of "None" means that list items are ' - 'sorted\n' - ' directly without calculating a separate key value.\n' - '\n' - ' The "functools.cmp_to_key()" utility is available to ' - 'convert a\n' - ' 2.x style *cmp* function to a *key* function.\n' - '\n' - ' *reverse* is a boolean value. If set to "True", then ' - 'the list\n' - ' elements are sorted as if each comparison were ' - 'reversed.\n' - '\n' - ' This method modifies the sequence in place for economy ' - 'of space\n' - ' when sorting a large sequence. To remind users that it ' - 'operates\n' - ' by side effect, it does not return the sorted sequence ' - '(use\n' - ' "sorted()" to explicitly request a new sorted list ' - 'instance).\n' - '\n' - ' The "sort()" method is guaranteed to be stable. A sort ' - 'is\n' - ' stable if it guarantees not to change the relative order ' - 'of\n' - ' elements that compare equal --- this is helpful for ' - 'sorting in\n' - ' multiple passes (for example, sort by department, then ' - 'by salary\n' - ' grade).\n' - '\n' - ' **CPython implementation detail:** While a list is being ' - 'sorted,\n' - ' the effect of attempting to mutate, or even inspect, the ' - 'list is\n' - ' undefined. The C implementation of Python makes the ' - 'list appear\n' - ' empty for the duration, and raises "ValueError" if it ' - 'can detect\n' - ' that the list has been mutated during a sort.\n' - '\n' - '\n' - 'Tuples\n' - '======\n' - '\n' - 'Tuples are immutable sequences, typically used to store ' - 'collections of\n' - 'heterogeneous data (such as the 2-tuples produced by the ' - '"enumerate()"\n' - 'built-in). Tuples are also used for cases where an immutable ' - 'sequence\n' - 'of homogeneous data is needed (such as allowing storage in a ' - '"set" or\n' - '"dict" instance).\n' - '\n' - 'class class tuple([iterable])\n' - '\n' - ' Tuples may be constructed in a number of ways:\n' - '\n' - ' * Using a pair of parentheses to denote the empty tuple: ' - '"()"\n' - '\n' - ' * Using a trailing comma for a singleton tuple: "a," or ' - '"(a,)"\n' - '\n' - ' * Separating items with commas: "a, b, c" or "(a, b, c)"\n' - '\n' - ' * Using the "tuple()" built-in: "tuple()" or ' - '"tuple(iterable)"\n' - '\n' - ' The constructor builds a tuple whose items are the same and ' - 'in the\n' - " same order as *iterable*'s items. *iterable* may be either " - 'a\n' - ' sequence, a container that supports iteration, or an ' - 'iterator\n' - ' object. If *iterable* is already a tuple, it is returned\n' - ' unchanged. For example, "tuple(\'abc\')" returns "(\'a\', ' - '\'b\', \'c\')"\n' - ' and "tuple( [1, 2, 3] )" returns "(1, 2, 3)". If no ' - 'argument is\n' - ' given, the constructor creates a new empty tuple, "()".\n' - '\n' - ' Note that it is actually the comma which makes a tuple, not ' - 'the\n' - ' parentheses. The parentheses are optional, except in the ' - 'empty\n' - ' tuple case, or when they are needed to avoid syntactic ' - 'ambiguity.\n' - ' For example, "f(a, b, c)" is a function call with three ' - 'arguments,\n' - ' while "f((a, b, c))" is a function call with a 3-tuple as ' - 'the sole\n' - ' argument.\n' - '\n' - ' Tuples implement all of the *common* sequence operations.\n' - '\n' - 'For heterogeneous collections of data where access by name is ' - 'clearer\n' - 'than access by index, "collections.namedtuple()" may be a ' - 'more\n' - 'appropriate choice than a simple tuple object.\n' - '\n' - '\n' - 'Ranges\n' - '======\n' - '\n' - 'The "range" type represents an immutable sequence of numbers ' - 'and is\n' - 'commonly used for looping a specific number of times in "for" ' - 'loops.\n' - '\n' - 'class class range(stop)\n' - 'class class range(start, stop[, step])\n' - '\n' - ' The arguments to the range constructor must be integers ' - '(either\n' - ' built-in "int" or any object that implements the ' - '"__index__"\n' - ' special method). If the *step* argument is omitted, it ' - 'defaults to\n' - ' "1". If the *start* argument is omitted, it defaults to ' - '"0". If\n' - ' *step* is zero, "ValueError" is raised.\n' - '\n' - ' For a positive *step*, the contents of a range "r" are ' - 'determined\n' - ' by the formula "r[i] = start + step*i" where "i >= 0" and ' - '"r[i] <\n' - ' stop".\n' - '\n' - ' For a negative *step*, the contents of the range are still\n' - ' determined by the formula "r[i] = start + step*i", but the\n' - ' constraints are "i >= 0" and "r[i] > stop".\n' - '\n' - ' A range object will be empty if "r[0]" does not meet the ' - 'value\n' - ' constraint. Ranges do support negative indices, but these ' - 'are\n' - ' interpreted as indexing from the end of the sequence ' - 'determined by\n' - ' the positive indices.\n' - '\n' - ' Ranges containing absolute values larger than "sys.maxsize" ' - 'are\n' - ' permitted but some features (such as "len()") may raise\n' - ' "OverflowError".\n' - '\n' - ' Range examples:\n' - '\n' - ' >>> list(range(10))\n' - ' [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n' - ' >>> list(range(1, 11))\n' - ' [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n' - ' >>> list(range(0, 30, 5))\n' - ' [0, 5, 10, 15, 20, 25]\n' - ' >>> list(range(0, 10, 3))\n' - ' [0, 3, 6, 9]\n' - ' >>> list(range(0, -10, -1))\n' - ' [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]\n' - ' >>> list(range(0))\n' - ' []\n' - ' >>> list(range(1, 0))\n' - ' []\n' - '\n' - ' Ranges implement all of the *common* sequence operations ' - 'except\n' - ' concatenation and repetition (due to the fact that range ' - 'objects\n' - ' can only represent sequences that follow a strict pattern ' - 'and\n' - ' repetition and concatenation will usually violate that ' - 'pattern).\n' - '\n' - ' start\n' - '\n' - ' The value of the *start* parameter (or "0" if the ' - 'parameter was\n' - ' not supplied)\n' - '\n' - ' stop\n' - '\n' - ' The value of the *stop* parameter\n' - '\n' - ' step\n' - '\n' - ' The value of the *step* parameter (or "1" if the ' - 'parameter was\n' - ' not supplied)\n' - '\n' - 'The advantage of the "range" type over a regular "list" or ' - '"tuple" is\n' - 'that a "range" object will always take the same (small) amount ' - 'of\n' - 'memory, no matter the size of the range it represents (as it ' - 'only\n' - 'stores the "start", "stop" and "step" values, calculating ' - 'individual\n' - 'items and subranges as needed).\n' - '\n' - 'Range objects implement the "collections.abc.Sequence" ABC, ' - 'and\n' - 'provide features such as containment tests, element index ' - 'lookup,\n' - 'slicing and support for negative indices (see *Sequence Types ' - '---\n' - 'list, tuple, range*):\n' - '\n' - '>>> r = range(0, 20, 2)\n' - '>>> r\n' - 'range(0, 20, 2)\n' - '>>> 11 in r\n' - 'False\n' - '>>> 10 in r\n' - 'True\n' - '>>> r.index(10)\n' - '5\n' - '>>> r[5]\n' - '10\n' - '>>> r[:5]\n' - 'range(0, 10, 2)\n' - '>>> r[-1]\n' - '18\n' - '\n' - 'Testing range objects for equality with "==" and "!=" compares ' - 'them as\n' - 'sequences. That is, two range objects are considered equal if ' - 'they\n' - 'represent the same sequence of values. (Note that two range ' - 'objects\n' - 'that compare equal might have different "start", "stop" and ' - '"step"\n' - 'attributes, for example "range(0) == range(2, 1, 3)" or ' - '"range(0, 3,\n' - '2) == range(0, 4, 2)".)\n' - '\n' - 'Changed in version 3.2: Implement the Sequence ABC. Support ' - 'slicing\n' - 'and negative indices. Test "int" objects for membership in ' - 'constant\n' - 'time instead of iterating through all items.\n' - '\n' - "Changed in version 3.3: Define '==' and '!=' to compare range " - 'objects\n' - 'based on the sequence of values they define (instead of ' - 'comparing\n' - 'based on object identity).\n' - '\n' - 'New in version 3.3: The "start", "stop" and "step" ' - 'attributes.\n', - 'typesseq-mutable': '\n' - 'Mutable Sequence Types\n' - '**********************\n' - '\n' - 'The operations in the following table are defined on ' - 'mutable sequence\n' - 'types. The "collections.abc.MutableSequence" ABC is ' - 'provided to make\n' - 'it easier to correctly implement these operations on ' - 'custom sequence\n' - 'types.\n' - '\n' - 'In the table *s* is an instance of a mutable sequence ' - 'type, *t* is any\n' - 'iterable object and *x* is an arbitrary object that ' - 'meets any type and\n' - 'value restrictions imposed by *s* (for example, ' - '"bytearray" only\n' - 'accepts integers that meet the value restriction "0 <= ' - 'x <= 255").\n' - '\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '| Operation | ' - 'Result | ' - 'Notes |\n' - '+================================+==================================+=======================+\n' - '| "s[i] = x" | item *i* of *s* is ' - 'replaced by | |\n' - '| | ' - '*x* ' - '| |\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '| "s[i:j] = t" | slice of *s* from ' - '*i* to *j* is | |\n' - '| | replaced by the ' - 'contents of the | |\n' - '| | iterable ' - '*t* | |\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '| "del s[i:j]" | same as "s[i:j] = ' - '[]" | |\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '| "s[i:j:k] = t" | the elements of ' - '"s[i:j:k]" are | (1) |\n' - '| | replaced by those ' - 'of *t* | |\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '| "del s[i:j:k]" | removes the ' - 'elements of | |\n' - '| | "s[i:j:k]" from the ' - 'list | |\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '| "s.append(x)" | appends *x* to the ' - 'end of the | |\n' - '| | sequence (same ' - 'as | |\n' - '| | "s[len(s):len(s)] = ' - '[x]") | |\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '| "s.clear()" | removes all items ' - 'from "s" (same | (5) |\n' - '| | as "del ' - 's[:]") | |\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '| "s.copy()" | creates a shallow ' - 'copy of "s" | (5) |\n' - '| | (same as ' - '"s[:]") | |\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '| "s.extend(t)" or "s += t" | extends *s* with ' - 'the contents of | |\n' - '| | *t* (for the most ' - 'part the same | |\n' - '| | as ' - '"s[len(s):len(s)] = t") | ' - '|\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '| "s *= n" | updates *s* with ' - 'its contents | (6) |\n' - '| | repeated *n* ' - 'times | |\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '| "s.insert(i, x)" | inserts *x* into ' - '*s* at the | |\n' - '| | index given by *i* ' - '(same as | |\n' - '| | "s[i:i] = ' - '[x]") | |\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '| "s.pop([i])" | retrieves the item ' - 'at *i* and | (2) |\n' - '| | also removes it ' - 'from *s* | |\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '| "s.remove(x)" | remove the first ' - 'item from *s* | (3) |\n' - '| | where "s[i] == ' - 'x" | |\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '| "s.reverse()" | reverses the items ' - 'of *s* in | (4) |\n' - '| | ' - 'place ' - '| |\n' - '+--------------------------------+----------------------------------+-----------------------+\n' - '\n' - 'Notes:\n' - '\n' - '1. *t* must have the same length as the slice it is ' - 'replacing.\n' - '\n' - '2. The optional argument *i* defaults to "-1", so that ' - 'by default\n' - ' the last item is removed and returned.\n' - '\n' - '3. "remove" raises "ValueError" when *x* is not found ' - 'in *s*.\n' - '\n' - '4. The "reverse()" method modifies the sequence in ' - 'place for\n' - ' economy of space when reversing a large sequence. ' - 'To remind users\n' - ' that it operates by side effect, it does not return ' - 'the reversed\n' - ' sequence.\n' - '\n' - '5. "clear()" and "copy()" are included for consistency ' - 'with the\n' - " interfaces of mutable containers that don't support " - 'slicing\n' - ' operations (such as "dict" and "set")\n' - '\n' - ' New in version 3.3: "clear()" and "copy()" ' - 'methods.\n' - '\n' - '6. The value *n* is an integer, or an object ' - 'implementing\n' - ' "__index__()". Zero and negative values of *n* ' - 'clear the sequence.\n' - ' Items in the sequence are not copied; they are ' - 'referenced multiple\n' - ' times, as explained for "s * n" under *Common ' - 'Sequence Operations*.\n', - 'unary': '\n' - 'Unary arithmetic and bitwise operations\n' - '***************************************\n' - '\n' - 'All unary arithmetic and bitwise operations have the same ' - 'priority:\n' - '\n' - ' u_expr ::= power | "-" u_expr | "+" u_expr | "~" u_expr\n' - '\n' - 'The unary "-" (minus) operator yields the negation of its ' - 'numeric\n' - 'argument.\n' - '\n' - 'The unary "+" (plus) operator yields its numeric argument ' - 'unchanged.\n' - '\n' - 'The unary "~" (invert) operator yields the bitwise inversion of ' - 'its\n' - 'integer argument. The bitwise inversion of "x" is defined as\n' - '"-(x+1)". It only applies to integral numbers.\n' - '\n' - 'In all three cases, if the argument does not have the proper ' - 'type, a\n' - '"TypeError" exception is raised.\n', - 'while': '\n' - 'The "while" statement\n' - '*********************\n' - '\n' - 'The "while" statement is used for repeated execution as long as ' - 'an\n' - 'expression is true:\n' - '\n' - ' while_stmt ::= "while" expression ":" suite\n' - ' ["else" ":" suite]\n' - '\n' - 'This repeatedly tests the expression and, if it is true, executes ' - 'the\n' - 'first suite; if the expression is false (which may be the first ' - 'time\n' - 'it is tested) the suite of the "else" clause, if present, is ' - 'executed\n' - 'and the loop terminates.\n' - '\n' - 'A "break" statement executed in the first suite terminates the ' - 'loop\n' - 'without executing the "else" clause\'s suite. A "continue" ' - 'statement\n' - 'executed in the first suite skips the rest of the suite and goes ' - 'back\n' - 'to testing the expression.\n', - 'with': '\n' - 'The "with" statement\n' - '********************\n' - '\n' - 'The "with" statement is used to wrap the execution of a block ' - 'with\n' - 'methods defined by a context manager (see section *With Statement\n' - 'Context Managers*). This allows common ' - '"try"..."except"..."finally"\n' - 'usage patterns to be encapsulated for convenient reuse.\n' - '\n' - ' with_stmt ::= "with" with_item ("," with_item)* ":" suite\n' - ' with_item ::= expression ["as" target]\n' - '\n' - 'The execution of the "with" statement with one "item" proceeds as\n' - 'follows:\n' - '\n' - '1. The context expression (the expression given in the ' - '"with_item")\n' - ' is evaluated to obtain a context manager.\n' - '\n' - '2. The context manager\'s "__exit__()" is loaded for later use.\n' - '\n' - '3. The context manager\'s "__enter__()" method is invoked.\n' - '\n' - '4. 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' - ' method returns without an error, then "__exit__()" will ' - 'always be\n' - ' called. Thus, if an error occurs during the assignment to ' - 'the\n' - ' target list, it will be treated the same as an error ' - 'occurring\n' - ' within the suite would be. See step 6 below.\n' - '\n' - '5. The suite is executed.\n' - '\n' - '6. The context manager\'s "__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' - ' "None" arguments are supplied.\n' - '\n' - ' If the suite was exited due to an exception, and the return ' - 'value\n' - ' from the "__exit__()" method was false, the exception is ' - 'reraised.\n' - ' If the return value was true, the exception is suppressed, and\n' - ' execution continues with the statement following the "with"\n' - ' statement.\n' - '\n' - ' If the suite was exited for any reason other than an exception, ' - 'the\n' - ' return value from "__exit__()" is ignored, and execution ' - 'proceeds\n' - ' at the normal location for the kind of exit that was taken.\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' - '\n' - 'is equivalent to\n' - '\n' - ' with A() as a:\n' - ' with B() as b:\n' - ' suite\n' - '\n' - 'Changed in version 3.1: Support for multiple context expressions.\n' - '\n' - 'See also: **PEP 343** - The "with" statement\n' - '\n' - ' The specification, background, and examples for the Python ' - '"with"\n' - ' statement.\n', - 'yield': '\n' - 'The "yield" statement\n' - '*********************\n' - '\n' - ' yield_stmt ::= yield_expression\n' - '\n' - 'A "yield" statement is semantically equivalent to a *yield\n' - 'expression*. The yield statement can be used to omit the ' - 'parentheses\n' - 'that would otherwise be required in the equivalent yield ' - 'expression\n' - 'statement. For example, the yield statements\n' - '\n' - ' yield \n' - ' yield from \n' - '\n' - 'are equivalent to the yield expression statements\n' - '\n' - ' (yield )\n' - ' (yield from )\n' - '\n' - 'Yield expressions and statements are only used when defining a\n' - '*generator* function, and are only used in the body of the ' - 'generator\n' - 'function. Using yield in a function definition is sufficient to ' - 'cause\n' - 'that definition to create a generator function instead of a ' - 'normal\n' - 'function.\n' - '\n' - 'For full details of "yield" semantics, refer to the *Yield\n' - 'expressions* section.\n'} +# Autogenerated by Sphinx on Sun Mar 3 17:52:40 2019 +topics = {'assert': u'\nThe "assert" statement\n**********************\n\nAssert statements are a convenient way to insert debugging assertions\ninto a program:\n\n assert_stmt ::= "assert" expression ["," expression]\n\nThe simple form, "assert expression", is equivalent to\n\n if __debug__:\n if not expression: raise AssertionError\n\nThe extended form, "assert expression1, expression2", is equivalent to\n\n if __debug__:\n if not expression1: raise AssertionError(expression2)\n\nThese equivalences assume that "__debug__" and "AssertionError" refer\nto the built-in variables with those names. In the current\nimplementation, the built-in variable "__debug__" is "True" under\nnormal circumstances, "False" when optimization is requested (command\nline option -O). The current code generator emits no code for an\nassert statement when optimization is requested at compile time. Note\nthat it is unnecessary to include the source code for the expression\nthat failed in the error message; it will be displayed as part of the\nstack trace.\n\nAssignments to "__debug__" are illegal. The value for the built-in\nvariable is determined when the interpreter starts.\n', + 'assignment': u'\nAssignment statements\n*********************\n\nAssignment statements are used to (re)bind names to values and to\nmodify attributes or items of mutable objects:\n\n assignment_stmt ::= (target_list "=")+ (starred_expression | yield_expression)\n target_list ::= target ("," target)* [","]\n target ::= identifier\n | "(" target_list ")"\n | "[" [target_list] "]"\n | attributeref\n | subscription\n | slicing\n | "*" target\n\n(See section *Primaries* for the syntax definitions for\n*attributeref*, *subscription*, and *slicing*.)\n\nAn assignment statement evaluates the expression list (remember that\nthis can be a single expression or a comma-separated list, the latter\nyielding a tuple) and assigns the single resulting object to each of\nthe target lists, from left to right.\n\nAssignment is defined recursively depending on the form of the target\n(list). When a target is part of a mutable object (an attribute\nreference, subscription or slicing), the mutable object must\nultimately perform the assignment and decide about its validity, and\nmay raise an exception if the assignment is unacceptable. The rules\nobserved by various types and the exceptions raised are given with the\ndefinition of the object types (see section *The standard type\nhierarchy*).\n\nAssignment of an object to a target list, optionally enclosed in\nparentheses or square brackets, is recursively defined as follows.\n\n* If the target list is empty: The object must also be an empty\n iterable.\n\n* If the target list is a single target in parentheses: The object\n is assigned to that target.\n\n* If the target list is a comma-separated list of targets, or a\n single target in square brackets: The object must be an iterable\n with the same number of items as there are targets in the target\n list, and the items are assigned, from left to right, to the\n corresponding targets.\n\n * If the target list contains one target prefixed with an\n asterisk, called a "starred" target: The object must be an\n iterable with at least as many items as there are targets in the\n target list, minus one. The first items of the iterable are\n assigned, from left to right, to the targets before the starred\n target. The final items of the iterable are assigned to the\n targets after the starred target. A list of the remaining items\n in the iterable is then assigned to the starred target (the list\n can be empty).\n\n * Else: The object must be an iterable with the same number of\n items as there are targets in the target list, and the items are\n assigned, from left to right, to the corresponding targets.\n\nAssignment of an object to a single target is recursively defined as\nfollows.\n\n* If the target is an identifier (name):\n\n * If the name does not occur in a "global" or "nonlocal" statement\n in the current code block: the name is bound to the object in the\n current local namespace.\n\n * Otherwise: the name is bound to the object in the global\n namespace or the outer namespace determined by "nonlocal",\n respectively.\n\n The name is rebound if it was already bound. This may cause the\n reference count for the object previously bound to the name to reach\n zero, causing the object to be deallocated and its destructor (if it\n has one) to be called.\n\n* If the target is an attribute reference: The primary expression in\n the reference is evaluated. It should yield an object with\n assignable attributes; if this is not the case, "TypeError" is\n raised. That object is then asked to assign the assigned object to\n the given attribute; if it cannot perform the assignment, it raises\n an exception (usually but not necessarily "AttributeError").\n\n Note: If the object is a class instance and the attribute reference\n occurs on both sides of the assignment operator, the RHS expression,\n "a.x" can access either an instance attribute or (if no instance\n attribute exists) a class attribute. The LHS target "a.x" is always\n set as an instance attribute, creating it if necessary. Thus, the\n two occurrences of "a.x" do not necessarily refer to the same\n attribute: if the RHS expression refers to a class attribute, the\n LHS creates a new instance attribute as the target of the\n assignment:\n\n class Cls:\n x = 3 # class variable\n inst = Cls()\n inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 3\n\n This description does not necessarily apply to descriptor\n attributes, such as properties created with "property()".\n\n* If the target is a subscription: The primary expression in the\n reference is evaluated. It should yield either a mutable sequence\n object (such as a list) or a mapping object (such as a dictionary).\n Next, the subscript expression is evaluated.\n\n If the primary is a mutable sequence object (such as a list), the\n subscript must yield an integer. If it is negative, the sequence\'s\n length is added to it. The resulting value must be a nonnegative\n integer less than the sequence\'s length, and the sequence is asked\n to assign the assigned object to its item with that index. If the\n index is out of range, "IndexError" is raised (assignment to a\n subscripted sequence cannot add new items to a list).\n\n If the primary is a mapping object (such as a dictionary), the\n subscript must have a type compatible with the mapping\'s key type,\n and the mapping is then asked to create a key/datum pair which maps\n the subscript to the assigned object. This can either replace an\n existing key/value pair with the same key value, or insert a new\n key/value pair (if no key with the same value existed).\n\n For user-defined objects, the "__setitem__()" method is called with\n appropriate arguments.\n\n* If the target is a slicing: The primary expression in the\n reference is evaluated. It should yield a mutable sequence object\n (such as a list). The assigned object should be a sequence object\n of the same type. Next, the lower and upper bound expressions are\n evaluated, insofar they are present; defaults are zero and the\n sequence\'s length. The bounds should evaluate to integers. If\n either bound is negative, the sequence\'s length is added to it. The\n resulting bounds are clipped to lie between zero and the sequence\'s\n length, inclusive. Finally, the sequence object is asked to replace\n the slice with the items of the assigned sequence. The length of\n the slice may be different from the length of the assigned sequence,\n thus changing the length of the target sequence, if the target\n sequence allows it.\n\n**CPython implementation detail:** In the current implementation, the\nsyntax for targets is taken to be the same as for expressions, and\ninvalid syntax is rejected during the code generation phase, causing\nless detailed error messages.\n\nAlthough the definition of assignment implies that overlaps between\nthe left-hand side and the right-hand side are \'simultaneous\' (for\nexample "a, b = b, a" swaps two variables), overlaps *within* the\ncollection of assigned-to variables occur left-to-right, sometimes\nresulting in confusion. For instance, the following program prints\n"[0, 2]":\n\n x = [0, 1]\n i = 0\n i, x[i] = 1, 2 # i is updated, then x[i] is updated\n print(x)\n\nSee also: **PEP 3132** - Extended Iterable Unpacking\n\n The specification for the "*target" feature.\n\n\nAugmented assignment statements\n===============================\n\nAugmented assignment is the combination, in a single statement, of a\nbinary operation and an assignment statement:\n\n augmented_assignment_stmt ::= augtarget augop (expression_list | yield_expression)\n augtarget ::= identifier | attributeref | subscription | slicing\n augop ::= "+=" | "-=" | "*=" | "@=" | "/=" | "//=" | "%=" | "**="\n | ">>=" | "<<=" | "&=" | "^=" | "|="\n\n(See section *Primaries* for the syntax definitions of the last three\nsymbols.)\n\nAn augmented assignment evaluates the target (which, unlike normal\nassignment statements, cannot be an unpacking) and the expression\nlist, performs the binary operation specific to the type of assignment\non the two operands, and assigns the result to the original target.\nThe target is only evaluated once.\n\nAn augmented assignment expression like "x += 1" can be rewritten as\n"x = x + 1" to achieve a similar, but not exactly equal effect. In the\naugmented version, "x" is only evaluated once. Also, when possible,\nthe actual operation is performed *in-place*, meaning that rather than\ncreating a new object and assigning that to the target, the old object\nis modified instead.\n\nUnlike normal assignments, augmented assignments evaluate the left-\nhand side *before* evaluating the right-hand side. For example, "a[i]\n+= f(x)" first looks-up "a[i]", then it evaluates "f(x)" and performs\nthe addition, and lastly, it writes the result back to "a[i]".\n\nWith the exception of assigning to tuples and multiple targets in a\nsingle statement, the assignment done by augmented assignment\nstatements is handled the same way as normal assignments. Similarly,\nwith the exception of the possible *in-place* behavior, the binary\noperation performed by augmented assignment is the same as the normal\nbinary operations.\n\nFor targets which are attribute references, the same *caveat about\nclass and instance attributes* applies as for regular assignments.\n', + 'atom-identifiers': u'\nIdentifiers (Names)\n*******************\n\nAn identifier occurring as an atom is a name. See section\n*Identifiers and keywords* for lexical definition and section *Naming\nand binding* for documentation of naming and binding.\n\nWhen the name is bound to an object, evaluation of the atom yields\nthat object. When a name is not bound, an attempt to evaluate it\nraises a "NameError" exception.\n\n**Private name mangling:** When an identifier that textually occurs in\na class definition begins with two or more underscore characters and\ndoes not end in two or more underscores, it is considered a *private\nname* of that class. Private names are transformed to a longer form\nbefore code is generated for them. The transformation inserts the\nclass name, with leading underscores removed and a single underscore\ninserted, in front of the name. For example, the identifier "__spam"\noccurring in a class named "Ham" will be transformed to "_Ham__spam".\nThis transformation is independent of the syntactical context in which\nthe identifier is used. If the transformed name is extremely long\n(longer than 255 characters), implementation defined truncation may\nhappen. If the class name consists only of underscores, no\ntransformation is done.\n', + 'atom-literals': u"\nLiterals\n********\n\nPython supports string and bytes literals and various numeric\nliterals:\n\n literal ::= stringliteral | bytesliteral\n | integer | floatnumber | imagnumber\n\nEvaluation of a literal yields an object of the given type (string,\nbytes, integer, floating point number, complex number) with the given\nvalue. The value may be approximated in the case of floating point\nand imaginary (complex) literals. See section *Literals* for details.\n\nAll literals correspond to immutable data types, and hence the\nobject's identity is less important than its value. Multiple\nevaluations of literals with the same value (either the same\noccurrence in the program text or a different occurrence) may obtain\nthe same object or a different object with the same value.\n", + 'attribute-access': u'\nCustomizing attribute access\n****************************\n\nThe following methods can be defined to customize the meaning of\nattribute access (use of, assignment to, or deletion of "x.name") for\nclass instances.\n\nobject.__getattr__(self, name)\n\n Called when an attribute lookup has not found the attribute in the\n usual places (i.e. it is not an instance attribute nor is it found\n in the class tree for "self"). "name" is the attribute name. This\n method should return the (computed) attribute value or raise an\n "AttributeError" exception.\n\n Note that if the attribute is found through the normal mechanism,\n "__getattr__()" is not called. (This is an intentional asymmetry\n between "__getattr__()" and "__setattr__()".) This is done both for\n efficiency reasons and because otherwise "__getattr__()" would have\n no way to access other attributes of the instance. Note that at\n least for instance variables, you can fake total control by not\n inserting any values in the instance attribute dictionary (but\n instead inserting them in another object). See the\n "__getattribute__()" method below for a way to actually get total\n control over attribute access.\n\nobject.__getattribute__(self, name)\n\n Called unconditionally to implement attribute accesses for\n instances of the class. If the class also defines "__getattr__()",\n the latter will not be called unless "__getattribute__()" either\n calls it explicitly or raises an "AttributeError". This method\n should return the (computed) attribute value or raise an\n "AttributeError" exception. In order to avoid infinite recursion in\n this method, its implementation should always call the base class\n method with the same name to access any attributes it needs, for\n example, "object.__getattribute__(self, name)".\n\n Note: This method may still be bypassed when looking up special\n methods as the result of implicit invocation via language syntax\n or built-in functions. See *Special method lookup*.\n\nobject.__setattr__(self, name, value)\n\n Called when an attribute assignment is attempted. This is called\n instead of the normal mechanism (i.e. store the value in the\n instance dictionary). *name* is the attribute name, *value* is the\n value to be assigned to it.\n\n If "__setattr__()" wants to assign to an instance attribute, it\n should call the base class method with the same name, for example,\n "object.__setattr__(self, name, value)".\n\nobject.__delattr__(self, name)\n\n Like "__setattr__()" but for attribute deletion instead of\n assignment. This should only be implemented if "del obj.name" is\n meaningful for the object.\n\nobject.__dir__(self)\n\n Called when "dir()" is called on the object. A sequence must be\n returned. "dir()" converts the returned sequence to a list and\n sorts it.\n\n\nImplementing Descriptors\n========================\n\nThe following methods only apply when an instance of the class\ncontaining the method (a so-called *descriptor* class) appears in an\n*owner* class (the descriptor must be in either the owner\'s class\ndictionary or in the class dictionary for one of its parents). In the\nexamples below, "the attribute" refers to the attribute whose name is\nthe key of the property in the owner class\' "__dict__".\n\nobject.__get__(self, instance, owner)\n\n Called to get the attribute of the owner class (class attribute\n access) or of an instance of that class (instance attribute\n access). *owner* is always the owner class, while *instance* is the\n instance that the attribute was accessed through, or "None" when\n the attribute is accessed through the *owner*. This method should\n return the (computed) attribute value or raise an "AttributeError"\n exception.\n\nobject.__set__(self, instance, value)\n\n Called to set the attribute on an instance *instance* of the owner\n class to a new value, *value*.\n\nobject.__delete__(self, instance)\n\n Called to delete the attribute on an instance *instance* of the\n owner class.\n\nThe attribute "__objclass__" is interpreted by the "inspect" module as\nspecifying the class where this object was defined (setting this\nappropriately can assist in runtime introspection of dynamic class\nattributes). For callables, it may indicate that an instance of the\ngiven type (or a subclass) is expected or required as the first\npositional argument (for example, CPython sets this attribute for\nunbound methods that are implemented in C).\n\n\nInvoking Descriptors\n====================\n\nIn general, a descriptor is an object attribute with "binding\nbehavior", one whose attribute access has been overridden by methods\nin the descriptor protocol: "__get__()", "__set__()", and\n"__delete__()". If any of those methods are defined for an object, it\nis said to be a descriptor.\n\nThe default behavior for attribute access is to get, set, or delete\nthe attribute from an object\'s dictionary. For instance, "a.x" has a\nlookup chain starting with "a.__dict__[\'x\']", then\n"type(a).__dict__[\'x\']", and continuing through the base classes of\n"type(a)" excluding metaclasses.\n\nHowever, if the looked-up value is an object defining one of the\ndescriptor methods, then Python may override the default behavior and\ninvoke the descriptor method instead. Where this occurs in the\nprecedence chain depends on which descriptor methods were defined and\nhow they were called.\n\nThe starting point for descriptor invocation is a binding, "a.x". How\nthe arguments are assembled depends on "a":\n\nDirect Call\n The simplest and least common call is when user code directly\n invokes a descriptor method: "x.__get__(a)".\n\nInstance Binding\n If binding to an object instance, "a.x" is transformed into the\n call: "type(a).__dict__[\'x\'].__get__(a, type(a))".\n\nClass Binding\n If binding to a class, "A.x" is transformed into the call:\n "A.__dict__[\'x\'].__get__(None, A)".\n\nSuper Binding\n If "a" is an instance of "super", then the binding "super(B,\n obj).m()" searches "obj.__class__.__mro__" for the base class "A"\n immediately preceding "B" and then invokes the descriptor with the\n call: "A.__dict__[\'m\'].__get__(obj, obj.__class__)".\n\nFor instance bindings, the precedence of descriptor invocation depends\non the which descriptor methods are defined. A descriptor can define\nany combination of "__get__()", "__set__()" and "__delete__()". If it\ndoes not define "__get__()", then accessing the attribute will return\nthe descriptor object itself unless there is a value in the object\'s\ninstance dictionary. If the descriptor defines "__set__()" and/or\n"__delete__()", it is a data descriptor; if it defines neither, it is\na non-data descriptor. Normally, data descriptors define both\n"__get__()" and "__set__()", while non-data descriptors have just the\n"__get__()" method. Data descriptors with "__set__()" and "__get__()"\ndefined always override a redefinition in an instance dictionary. In\ncontrast, non-data descriptors can be overridden by instances.\n\nPython methods (including "staticmethod()" and "classmethod()") are\nimplemented as non-data descriptors. Accordingly, instances can\nredefine and override methods. This allows individual instances to\nacquire behaviors that differ from other instances of the same class.\n\nThe "property()" function is implemented as a data descriptor.\nAccordingly, instances cannot override the behavior of a property.\n\n\n__slots__\n=========\n\nBy default, instances of classes have a dictionary for attribute\nstorage. This wastes space for objects having very few instance\nvariables. The space consumption can become acute when creating large\nnumbers of instances.\n\nThe default can be overridden by defining *__slots__* in a class\ndefinition. The *__slots__* declaration takes a sequence of instance\nvariables and reserves just enough space in each instance to hold a\nvalue for each variable. Space is saved because *__dict__* is not\ncreated for each instance.\n\nobject.__slots__\n\n This class variable can be assigned a string, iterable, or sequence\n of strings with variable names used by instances. *__slots__*\n reserves space for the declared variables and prevents the\n automatic creation of *__dict__* and *__weakref__* for each\n instance.\n\n\nNotes on using *__slots__*\n--------------------------\n\n* When inheriting from a class without *__slots__*, the *__dict__*\n attribute of that class will always be accessible, so a *__slots__*\n definition in the subclass is meaningless.\n\n* Without a *__dict__* variable, instances cannot be assigned new\n variables not listed in the *__slots__* definition. Attempts to\n assign to an unlisted variable name raises "AttributeError". If\n dynamic assignment of new variables is desired, then add\n "\'__dict__\'" to the sequence of strings in the *__slots__*\n declaration.\n\n* Without a *__weakref__* variable for each instance, classes\n defining *__slots__* do not support weak references to its\n instances. If weak reference support is needed, then add\n "\'__weakref__\'" to the sequence of strings in the *__slots__*\n declaration.\n\n* *__slots__* are implemented at the class level by creating\n descriptors (*Implementing Descriptors*) for each variable name. As\n a result, class attributes cannot be used to set default values for\n instance variables defined by *__slots__*; otherwise, the class\n attribute would overwrite the descriptor assignment.\n\n* The action of a *__slots__* declaration is limited to the class\n where it is defined. As a result, subclasses will have a *__dict__*\n unless they also define *__slots__* (which must only contain names\n of any *additional* slots).\n\n* If a class defines a slot also defined in a base class, the\n instance variable defined by the base class slot is inaccessible\n (except by retrieving its descriptor directly from the base class).\n This renders the meaning of the program undefined. In the future, a\n check may be added to prevent this.\n\n* Nonempty *__slots__* does not work for classes derived from\n "variable-length" built-in types such as "int", "bytes" and "tuple".\n\n* Any non-string iterable may be assigned to *__slots__*. Mappings\n may also be used; however, in the future, special meaning may be\n assigned to the values corresponding to each key.\n\n* *__class__* assignment works only if both classes have the same\n *__slots__*.\n', + 'attribute-references': u'\nAttribute references\n********************\n\nAn attribute reference is a primary followed by a period and a name:\n\n attributeref ::= primary "." identifier\n\nThe primary must evaluate to an object of a type that supports\nattribute references, which most objects do. This object is then\nasked to produce the attribute whose name is the identifier. This\nproduction can be customized by overriding the "__getattr__()" method.\nIf this attribute is not available, the exception "AttributeError" is\nraised. Otherwise, the type and value of the object produced is\ndetermined by the object. Multiple evaluations of the same attribute\nreference may yield different objects.\n', + 'augassign': u'\nAugmented assignment statements\n*******************************\n\nAugmented assignment is the combination, in a single statement, of a\nbinary operation and an assignment statement:\n\n augmented_assignment_stmt ::= augtarget augop (expression_list | yield_expression)\n augtarget ::= identifier | attributeref | subscription | slicing\n augop ::= "+=" | "-=" | "*=" | "@=" | "/=" | "//=" | "%=" | "**="\n | ">>=" | "<<=" | "&=" | "^=" | "|="\n\n(See section *Primaries* for the syntax definitions of the last three\nsymbols.)\n\nAn augmented assignment evaluates the target (which, unlike normal\nassignment statements, cannot be an unpacking) and the expression\nlist, performs the binary operation specific to the type of assignment\non the two operands, and assigns the result to the original target.\nThe target is only evaluated once.\n\nAn augmented assignment expression like "x += 1" can be rewritten as\n"x = x + 1" to achieve a similar, but not exactly equal effect. In the\naugmented version, "x" is only evaluated once. Also, when possible,\nthe actual operation is performed *in-place*, meaning that rather than\ncreating a new object and assigning that to the target, the old object\nis modified instead.\n\nUnlike normal assignments, augmented assignments evaluate the left-\nhand side *before* evaluating the right-hand side. For example, "a[i]\n+= f(x)" first looks-up "a[i]", then it evaluates "f(x)" and performs\nthe addition, and lastly, it writes the result back to "a[i]".\n\nWith the exception of assigning to tuples and multiple targets in a\nsingle statement, the assignment done by augmented assignment\nstatements is handled the same way as normal assignments. Similarly,\nwith the exception of the possible *in-place* behavior, the binary\noperation performed by augmented assignment is the same as the normal\nbinary operations.\n\nFor targets which are attribute references, the same *caveat about\nclass and instance attributes* applies as for regular assignments.\n', + 'binary': u'\nBinary arithmetic operations\n****************************\n\nThe binary arithmetic operations have the conventional priority\nlevels. Note that some of these operations also apply to certain non-\nnumeric types. Apart from the power operator, there are only two\nlevels, one for multiplicative operators and one for additive\noperators:\n\n m_expr ::= u_expr | m_expr "*" u_expr | m_expr "@" m_expr |\n m_expr "//" u_expr| m_expr "/" u_expr |\n m_expr "%" u_expr\n a_expr ::= m_expr | a_expr "+" m_expr | a_expr "-" m_expr\n\nThe "*" (multiplication) operator yields the product of its arguments.\nThe arguments must either both be numbers, or one argument must be an\ninteger and the other must be a sequence. In the former case, the\nnumbers are converted to a common type and then multiplied together.\nIn the latter case, sequence repetition is performed; a negative\nrepetition factor yields an empty sequence.\n\nThe "@" (at) operator is intended to be used for matrix\nmultiplication. No builtin Python types implement this operator.\n\nNew in version 3.5.\n\nThe "/" (division) and "//" (floor division) operators yield the\nquotient of their arguments. The numeric arguments are first\nconverted to a common type. Division of integers yields a float, while\nfloor division of integers results in an integer; the result is that\nof mathematical division with the \'floor\' function applied to the\nresult. Division by zero raises the "ZeroDivisionError" exception.\n\nThe "%" (modulo) operator yields the remainder from the division of\nthe first argument by the second. The numeric arguments are first\nconverted to a common type. A zero right argument raises the\n"ZeroDivisionError" exception. The arguments may be floating point\nnumbers, e.g., "3.14%0.7" equals "0.34" (since "3.14" equals "4*0.7 +\n0.34".) The modulo operator always yields a result with the same sign\nas its second operand (or zero); the absolute value of the result is\nstrictly smaller than the absolute value of the second operand [1].\n\nThe floor division and modulo operators are connected by the following\nidentity: "x == (x//y)*y + (x%y)". Floor division and modulo are also\nconnected with the built-in function "divmod()": "divmod(x, y) ==\n(x//y, x%y)". [2].\n\nIn addition to performing the modulo operation on numbers, the "%"\noperator is also overloaded by string objects to perform old-style\nstring formatting (also known as interpolation). The syntax for\nstring formatting is described in the Python Library Reference,\nsection *printf-style String Formatting*.\n\nThe floor division operator, the modulo operator, and the "divmod()"\nfunction are not defined for complex numbers. Instead, convert to a\nfloating point number using the "abs()" function if appropriate.\n\nThe "+" (addition) operator yields the sum of its arguments. The\narguments must either both be numbers or both be sequences of the same\ntype. In the former case, the numbers are converted to a common type\nand then added together. In the latter case, the sequences are\nconcatenated.\n\nThe "-" (subtraction) operator yields the difference of its arguments.\nThe numeric arguments are first converted to a common type.\n', + 'bitwise': u'\nBinary bitwise operations\n*************************\n\nEach of the three bitwise operations has a different priority level:\n\n and_expr ::= shift_expr | and_expr "&" shift_expr\n xor_expr ::= and_expr | xor_expr "^" and_expr\n or_expr ::= xor_expr | or_expr "|" xor_expr\n\nThe "&" operator yields the bitwise AND of its arguments, which must\nbe integers.\n\nThe "^" operator yields the bitwise XOR (exclusive OR) of its\narguments, which must be integers.\n\nThe "|" operator yields the bitwise (inclusive) OR of its arguments,\nwhich must be integers.\n', + 'bltin-code-objects': u'\nCode Objects\n************\n\nCode objects are used by the implementation to represent "pseudo-\ncompiled" executable Python code such as a function body. They differ\nfrom function objects because they don\'t contain a reference to their\nglobal execution environment. Code objects are returned by the built-\nin "compile()" function and can be extracted from function objects\nthrough their "__code__" attribute. See also the "code" module.\n\nA code object can be executed or evaluated by passing it (instead of a\nsource string) to the "exec()" or "eval()" built-in functions.\n\nSee *The standard type hierarchy* for more information.\n', + 'bltin-ellipsis-object': u'\nThe Ellipsis Object\n*******************\n\nThis object is commonly used by slicing (see *Slicings*). It supports\nno special operations. There is exactly one ellipsis object, named\n"Ellipsis" (a built-in name). "type(Ellipsis)()" produces the\n"Ellipsis" singleton.\n\nIt is written as "Ellipsis" or "...".\n', + 'bltin-null-object': u'\nThe Null Object\n***************\n\nThis object is returned by functions that don\'t explicitly return a\nvalue. It supports no special operations. There is exactly one null\nobject, named "None" (a built-in name). "type(None)()" produces the\nsame singleton.\n\nIt is written as "None".\n', + 'bltin-type-objects': u'\nType Objects\n************\n\nType objects represent the various object types. An object\'s type is\naccessed by the built-in function "type()". There are no special\noperations on types. The standard module "types" defines names for\nall standard built-in types.\n\nTypes are written like this: "".\n', + 'booleans': u'\nBoolean operations\n******************\n\n or_test ::= and_test | or_test "or" and_test\n and_test ::= not_test | and_test "and" not_test\n not_test ::= comparison | "not" not_test\n\nIn the context of Boolean operations, and also when expressions are\nused by control flow statements, the following values are interpreted\nas false: "False", "None", numeric zero of all types, and empty\nstrings and containers (including strings, tuples, lists,\ndictionaries, sets and frozensets). All other values are interpreted\nas true. User-defined objects can customize their truth value by\nproviding a "__bool__()" method.\n\nThe operator "not" yields "True" if its argument is false, "False"\notherwise.\n\nThe expression "x and y" first evaluates *x*; if *x* is false, its\nvalue is returned; otherwise, *y* is evaluated and the resulting value\nis returned.\n\nThe expression "x or y" first evaluates *x*; if *x* is true, its value\nis returned; otherwise, *y* is evaluated and the resulting value is\nreturned.\n\n(Note that neither "and" nor "or" restrict the value and type they\nreturn to "False" and "True", but rather return the last evaluated\nargument. This is sometimes useful, e.g., if "s" is a string that\nshould be replaced by a default value if it is empty, the expression\n"s or \'foo\'" yields the desired value. Because "not" has to create a\nnew value, it returns a boolean value regardless of the type of its\nargument (for example, "not \'foo\'" produces "False" rather than "\'\'".)\n', + 'break': u'\nThe "break" statement\n*********************\n\n break_stmt ::= "break"\n\n"break" may only occur syntactically nested in a "for" or "while"\nloop, but not nested in a function or class definition within that\nloop.\n\nIt terminates the nearest enclosing loop, skipping the optional "else"\nclause if the loop has one.\n\nIf a "for" loop is terminated by "break", the loop control target\nkeeps its current value.\n\nWhen "break" passes control out of a "try" statement with a "finally"\nclause, that "finally" clause is executed before really leaving the\nloop.\n', + 'callable-types': u'\nEmulating callable objects\n**************************\n\nobject.__call__(self[, args...])\n\n Called when the instance is "called" as a function; if this method\n is defined, "x(arg1, arg2, ...)" is a shorthand for\n "x.__call__(arg1, arg2, ...)".\n', + 'calls': u'\nCalls\n*****\n\nA call calls a callable object (e.g., a *function*) with a possibly\nempty series of *arguments*:\n\n call ::= primary "(" [argument_list [","] | comprehension] ")"\n argument_list ::= positional_arguments ["," starred_and_keywords]\n ["," keywords_arguments]\n | starred_and_keywords ["," keywords_arguments]\n | keywords_arguments\n positional_arguments ::= ["*"] expression ("," ["*"] expression)*\n starred_and_keywords ::= ("*" expression | keyword_item)\n ("," "*" expression | "," keyword_item)*\n keywords_arguments ::= (keyword_item | "**" expression)\n ("," keyword_item | "," "**" expression)*\n keyword_item ::= identifier "=" expression\n\nAn optional trailing comma may be present after the positional and\nkeyword arguments but does not affect the semantics.\n\nThe primary must evaluate to a callable object (user-defined\nfunctions, built-in functions, methods of built-in objects, class\nobjects, methods of class instances, and all objects having a\n"__call__()" method are callable). All argument expressions are\nevaluated before the call is attempted. Please refer to section\n*Function definitions* for the syntax of formal *parameter* lists.\n\nIf keyword arguments are present, they are first converted to\npositional arguments, as follows. First, a list of unfilled slots is\ncreated for the formal parameters. If there are N positional\narguments, they are placed in the first N slots. Next, for each\nkeyword argument, the identifier is used to determine the\ncorresponding slot (if the identifier is the same as the first formal\nparameter name, the first slot is used, and so on). If the slot is\nalready filled, a "TypeError" exception is raised. Otherwise, the\nvalue of the argument is placed in the slot, filling it (even if the\nexpression is "None", it fills the slot). When all arguments have\nbeen processed, the slots that are still unfilled are filled with the\ncorresponding default value from the function definition. (Default\nvalues are calculated, once, when the function is defined; thus, a\nmutable object such as a list or dictionary used as default value will\nbe shared by all calls that don\'t specify an argument value for the\ncorresponding slot; this should usually be avoided.) If there are any\nunfilled slots for which no default value is specified, a "TypeError"\nexception is raised. Otherwise, the list of filled slots is used as\nthe argument list for the call.\n\n**CPython implementation detail:** An implementation may provide\nbuilt-in functions whose positional parameters do not have names, even\nif they are \'named\' for the purpose of documentation, and which\ntherefore cannot be supplied by keyword. In CPython, this is the case\nfor functions implemented in C that use "PyArg_ParseTuple()" to parse\ntheir arguments.\n\nIf there are more positional arguments than there are formal parameter\nslots, a "TypeError" exception is raised, unless a formal parameter\nusing the syntax "*identifier" is present; in this case, that formal\nparameter receives a tuple containing the excess positional arguments\n(or an empty tuple if there were no excess positional arguments).\n\nIf any keyword argument does not correspond to a formal parameter\nname, a "TypeError" exception is raised, unless a formal parameter\nusing the syntax "**identifier" is present; in this case, that formal\nparameter receives a dictionary containing the excess keyword\narguments (using the keywords as keys and the argument values as\ncorresponding values), or a (new) empty dictionary if there were no\nexcess keyword arguments.\n\nIf the syntax "*expression" appears in the function call, "expression"\nmust evaluate to an *iterable*. Elements from these iterables are\ntreated as if they were additional positional arguments. For the call\n"f(x1, x2, *y, x3, x4)", if *y* evaluates to a sequence *y1*, ...,\n*yM*, this is equivalent to a call with M+4 positional arguments *x1*,\n*x2*, *y1*, ..., *yM*, *x3*, *x4*.\n\nA consequence of this is that although the "*expression" syntax may\nappear *after* explicit keyword arguments, it is processed *before*\nthe keyword arguments (and any "**expression" arguments -- see below).\nSo:\n\n >>> def f(a, b):\n ... print(a, b)\n ...\n >>> f(b=1, *(2,))\n 2 1\n >>> f(a=1, *(2,))\n Traceback (most recent call last):\n File "", line 1, in \n TypeError: f() got multiple values for keyword argument \'a\'\n >>> f(1, *(2,))\n 1 2\n\nIt is unusual for both keyword arguments and the "*expression" syntax\nto be used in the same call, so in practice this confusion does not\narise.\n\nIf the syntax "**expression" appears in the function call,\n"expression" must evaluate to a *mapping*, the contents of which are\ntreated as additional keyword arguments. If a keyword is already\npresent (as an explicit keyword argument, or from another unpacking),\na "TypeError" exception is raised.\n\nFormal parameters using the syntax "*identifier" or "**identifier"\ncannot be used as positional argument slots or as keyword argument\nnames.\n\nChanged in version 3.5: Function calls accept any number of "*" and\n"**" unpackings, positional arguments may follow iterable unpackings\n("*"), and keyword arguments may follow dictionary unpackings ("**").\nOriginally proposed by **PEP 448**.\n\nA call always returns some value, possibly "None", unless it raises an\nexception. How this value is computed depends on the type of the\ncallable object.\n\nIf it is---\n\na user-defined function:\n The code block for the function is executed, passing it the\n argument list. The first thing the code block will do is bind the\n formal parameters to the arguments; this is described in section\n *Function definitions*. When the code block executes a "return"\n statement, this specifies the return value of the function call.\n\na built-in function or method:\n The result is up to the interpreter; see *Built-in Functions* for\n the descriptions of built-in functions and methods.\n\na class object:\n A new instance of that class is returned.\n\na class instance method:\n The corresponding user-defined function is called, with an argument\n list that is one longer than the argument list of the call: the\n instance becomes the first argument.\n\na class instance:\n The class must define a "__call__()" method; the effect is then the\n same as if that method was called.\n', + 'class': u'\nClass definitions\n*****************\n\nA class definition defines a class object (see section *The standard\ntype hierarchy*):\n\n classdef ::= [decorators] "class" classname [inheritance] ":" suite\n inheritance ::= "(" [argument_list] ")"\n classname ::= identifier\n\nA class definition is an executable statement. The inheritance list\nusually gives a list of base classes (see *Customizing class creation*\nfor more advanced uses), so each item in the list should evaluate to a\nclass object which allows subclassing. Classes without an inheritance\nlist inherit, by default, from the base class "object"; hence,\n\n class Foo:\n pass\n\nis equivalent to\n\n class Foo(object):\n pass\n\nThe class\'s suite is then executed in a new execution frame (see\n*Naming and binding*), using a newly created local namespace and the\noriginal global namespace. (Usually, the suite contains mostly\nfunction definitions.) When the class\'s suite finishes execution, its\nexecution frame is discarded but its local namespace is saved. [4] A\nclass object is then created using the inheritance list for the base\nclasses and the saved local namespace for the attribute dictionary.\nThe class name is bound to this class object in the original local\nnamespace.\n\nClass creation can be customized heavily using *metaclasses*.\n\nClasses can also be decorated: just like when decorating functions,\n\n @f1(arg)\n @f2\n class Foo: pass\n\nis roughly equivalent to\n\n class Foo: pass\n Foo = f1(arg)(f2(Foo))\n\nThe evaluation rules for the decorator expressions are the same as for\nfunction decorators. The result is then bound to the class name.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass attributes; they are shared by instances. Instance attributes\ncan be set in a method with "self.name = value". Both class and\ninstance attributes are accessible through the notation ""self.name"",\nand an instance attribute hides a class attribute with the same name\nwhen accessed in this way. Class attributes can be used as defaults\nfor instance attributes, but using mutable values there can lead to\nunexpected results. *Descriptors* can be used to create instance\nvariables with different implementation details.\n\nSee also: **PEP 3115** - Metaclasses in Python 3 **PEP 3129** -\n Class Decorators\n', + 'comparisons': u'\nComparisons\n***********\n\nUnlike C, all comparison operations in Python have the same priority,\nwhich is lower than that of any arithmetic, shifting or bitwise\noperation. Also unlike C, expressions like "a < b < c" have the\ninterpretation that is conventional in mathematics:\n\n comparison ::= or_expr ( comp_operator or_expr )*\n comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "!="\n | "is" ["not"] | ["not"] "in"\n\nComparisons yield boolean values: "True" or "False".\n\nComparisons can be chained arbitrarily, e.g., "x < y <= z" is\nequivalent to "x < y and y <= z", except that "y" is evaluated only\nonce (but in both cases "z" is not evaluated at all when "x < y" is\nfound to be false).\n\nFormally, if *a*, *b*, *c*, ..., *y*, *z* are expressions and *op1*,\n*op2*, ..., *opN* are comparison operators, then "a op1 b op2 c ... y\nopN z" is equivalent to "a op1 b and b op2 c and ... y opN z", except\nthat each expression is evaluated at most once.\n\nNote that "a op1 b op2 c" doesn\'t imply any kind of comparison between\n*a* and *c*, so that, e.g., "x < y > z" is perfectly legal (though\nperhaps not pretty).\n\n\nValue comparisons\n=================\n\nThe operators "<", ">", "==", ">=", "<=", and "!=" compare the values\nof two objects. The objects do not need to have the same type.\n\nChapter *Objects, values and types* states that objects have a value\n(in addition to type and identity). The value of an object is a\nrather abstract notion in Python: For example, there is no canonical\naccess method for an object\'s value. Also, there is no requirement\nthat the value of an object should be constructed in a particular way,\ne.g. comprised of all its data attributes. Comparison operators\nimplement a particular notion of what the value of an object is. One\ncan think of them as defining the value of an object indirectly, by\nmeans of their comparison implementation.\n\nBecause all types are (direct or indirect) subtypes of "object", they\ninherit the default comparison behavior from "object". Types can\ncustomize their comparison behavior by implementing *rich comparison\nmethods* like "__lt__()", described in *Basic customization*.\n\nThe default behavior for equality comparison ("==" and "!=") is based\non the identity of the objects. Hence, equality comparison of\ninstances with the same identity results in equality, and equality\ncomparison of instances with different identities results in\ninequality. A motivation for this default behavior is the desire that\nall objects should be reflexive (i.e. "x is y" implies "x == y").\n\nA default order comparison ("<", ">", "<=", and ">=") is not provided;\nan attempt raises "TypeError". A motivation for this default behavior\nis the lack of a similar invariant as for equality.\n\nThe behavior of the default equality comparison, that instances with\ndifferent identities are always unequal, may be in contrast to what\ntypes will need that have a sensible definition of object value and\nvalue-based equality. Such types will need to customize their\ncomparison behavior, and in fact, a number of built-in types have done\nthat.\n\nThe following list describes the comparison behavior of the most\nimportant built-in types.\n\n* Numbers of built-in numeric types (*Numeric Types --- int, float,\n complex*) and of the standard library types "fractions.Fraction" and\n "decimal.Decimal" can be compared within and across their types,\n with the restriction that complex numbers do not support order\n comparison. Within the limits of the types involved, they compare\n mathematically (algorithmically) correct without loss of precision.\n\n The not-a-number values "float(\'NaN\')" and "Decimal(\'NaN\')" are\n special. They are identical to themselves ("x is x" is true) but\n are not equal to themselves ("x == x" is false). Additionally,\n comparing any number to a not-a-number value will return "False".\n For example, both "3 < float(\'NaN\')" and "float(\'NaN\') < 3" will\n return "False".\n\n* Binary sequences (instances of "bytes" or "bytearray") can be\n compared within and across their types. They compare\n lexicographically using the numeric values of their elements.\n\n* Strings (instances of "str") compare lexicographically using the\n numerical Unicode code points (the result of the built-in function\n "ord()") of their characters. [3]\n\n Strings and binary sequences cannot be directly compared.\n\n* Sequences (instances of "tuple", "list", or "range") can be\n compared only within each of their types, with the restriction that\n ranges do not support order comparison. Equality comparison across\n these types results in unequality, and ordering comparison across\n these types raises "TypeError".\n\n Sequences compare lexicographically using comparison of\n corresponding elements, whereby reflexivity of the elements is\n enforced.\n\n In enforcing reflexivity of elements, the comparison of collections\n assumes that for a collection element "x", "x == x" is always true.\n Based on that assumption, element identity is compared first, and\n element comparison is performed only for distinct elements. This\n approach yields the same result as a strict element comparison\n would, if the compared elements are reflexive. For non-reflexive\n elements, the result is different than for strict element\n comparison, and may be surprising: The non-reflexive not-a-number\n values for example result in the following comparison behavior when\n used in a list:\n\n >>> nan = float(\'NaN\')\n >>> nan is nan\n True\n >>> nan == nan\n False <-- the defined non-reflexive behavior of NaN\n >>> [nan] == [nan]\n True <-- list enforces reflexivity and tests identity first\n\n Lexicographical comparison between built-in collections works as\n follows:\n\n * For two collections to compare equal, they must be of the same\n type, have the same length, and each pair of corresponding\n elements must compare equal (for example, "[1,2] == (1,2)" is\n false because the type is not the same).\n\n * Collections that support order comparison are ordered the same\n as their first unequal elements (for example, "[1,2,x] <= [1,2,y]"\n has the same value as "x <= y"). If a corresponding element does\n not exist, the shorter collection is ordered first (for example,\n "[1,2] < [1,2,3]" is true).\n\n* Mappings (instances of "dict") compare equal if and only if they\n have equal *(key, value)* pairs. Equality comparison of the keys and\n values enforces reflexivity.\n\n Order comparisons ("<", ">", "<=", and ">=") raise "TypeError".\n\n* Sets (instances of "set" or "frozenset") can be compared within\n and across their types.\n\n They define order comparison operators to mean subset and superset\n tests. Those relations do not define total orderings (for example,\n the two sets "{1,2}" and "{2,3}" are not equal, nor subsets of one\n another, nor supersets of one another). Accordingly, sets are not\n appropriate arguments for functions which depend on total ordering\n (for example, "min()", "max()", and "sorted()" produce undefined\n results given a list of sets as inputs).\n\n Comparison of sets enforces reflexivity of its elements.\n\n* Most other built-in types have no comparison methods implemented,\n so they inherit the default comparison behavior.\n\nUser-defined classes that customize their comparison behavior should\nfollow some consistency rules, if possible:\n\n* Equality comparison should be reflexive. In other words, identical\n objects should compare equal:\n\n "x is y" implies "x == y"\n\n* Comparison should be symmetric. In other words, the following\n expressions should have the same result:\n\n "x == y" and "y == x"\n\n "x != y" and "y != x"\n\n "x < y" and "y > x"\n\n "x <= y" and "y >= x"\n\n* Comparison should be transitive. The following (non-exhaustive)\n examples illustrate that:\n\n "x > y and y > z" implies "x > z"\n\n "x < y and y <= z" implies "x < z"\n\n* Inverse comparison should result in the boolean negation. In other\n words, the following expressions should have the same result:\n\n "x == y" and "not x != y"\n\n "x < y" and "not x >= y" (for total ordering)\n\n "x > y" and "not x <= y" (for total ordering)\n\n The last two expressions apply to totally ordered collections (e.g.\n to sequences, but not to sets or mappings). See also the\n "total_ordering()" decorator.\n\n* The "hash()" result should be consistent with equality. Objects\n that are equal should either have the same hash value, or be marked\n as unhashable.\n\nPython does not enforce these consistency rules. In fact, the\nnot-a-number values are an example for not following these rules.\n\n\nMembership test operations\n==========================\n\nThe operators "in" and "not in" test for membership. "x in s"\nevaluates to "True" if *x* is a member of *s*, and "False" otherwise.\n"x not in s" returns the negation of "x in s". All built-in sequences\nand set types support this as well as dictionary, for which "in" tests\nwhether the dictionary has a given key. For container types such as\nlist, tuple, set, frozenset, dict, or collections.deque, the\nexpression "x in y" is equivalent to "any(x is e or x == e for e in\ny)".\n\nFor the string and bytes types, "x in y" is "True" if and only if *x*\nis a substring of *y*. An equivalent test is "y.find(x) != -1".\nEmpty strings are always considered to be a substring of any other\nstring, so """ in "abc"" will return "True".\n\nFor user-defined classes which define the "__contains__()" method, "x\nin y" returns "True" if "y.__contains__(x)" returns a true value, and\n"False" otherwise.\n\nFor user-defined classes which do not define "__contains__()" but do\ndefine "__iter__()", "x in y" is "True" if some value "z" with "x ==\nz" is produced while iterating over "y". If an exception is raised\nduring the iteration, it is as if "in" raised that exception.\n\nLastly, the old-style iteration protocol is tried: if a class defines\n"__getitem__()", "x in y" is "True" if and only if there is a non-\nnegative integer index *i* such that "x == y[i]", and all lower\ninteger indices do not raise "IndexError" exception. (If any other\nexception is raised, it is as if "in" raised that exception).\n\nThe operator "not in" is defined to have the inverse true value of\n"in".\n\n\nIdentity comparisons\n====================\n\nThe operators "is" and "is not" test for object identity: "x is y" is\ntrue if and only if *x* and *y* are the same object. Object identity\nis determined using the "id()" function. "x is not y" yields the\ninverse truth value. [4]\n', + 'compound': u'\nCompound statements\n*******************\n\nCompound statements contain (groups of) other statements; they affect\nor control the execution of those other statements in some way. In\ngeneral, compound statements span multiple lines, although in simple\nincarnations a whole compound statement may be contained in one line.\n\nThe "if", "while" and "for" statements implement traditional control\nflow constructs. "try" specifies exception handlers and/or cleanup\ncode for a group of statements, while the "with" statement allows the\nexecution of initialization and finalization code around a block of\ncode. Function and class definitions are also syntactically compound\nstatements.\n\nA compound statement consists of one or more \'clauses.\' A clause\nconsists of a header and a \'suite.\' The clause headers of a\nparticular compound statement are all at the same indentation level.\nEach clause header begins with a uniquely identifying keyword and ends\nwith a colon. A suite is a group of statements controlled by a\nclause. A suite can be one or more semicolon-separated simple\nstatements on the same line as the header, following the header\'s\ncolon, or it can be one or more indented statements on subsequent\nlines. Only the latter form of a suite can contain nested compound\nstatements; the following is illegal, mostly because it wouldn\'t be\nclear to which "if" clause a following "else" clause would belong:\n\n if test1: if test2: print(x)\n\nAlso note that the semicolon binds tighter than the colon in this\ncontext, so that in the following example, either all or none of the\n"print()" calls are executed:\n\n if x < y < z: print(x); print(y); print(z)\n\nSummarizing:\n\n compound_stmt ::= if_stmt\n | while_stmt\n | for_stmt\n | try_stmt\n | with_stmt\n | funcdef\n | classdef\n | async_with_stmt\n | async_for_stmt\n | async_funcdef\n suite ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT\n statement ::= stmt_list NEWLINE | compound_stmt\n stmt_list ::= simple_stmt (";" simple_stmt)* [";"]\n\nNote that statements always end in a "NEWLINE" possibly followed by a\n"DEDENT". Also note that optional continuation clauses always begin\nwith a keyword that cannot start a statement, thus there are no\nambiguities (the \'dangling "else"\' problem is solved in Python by\nrequiring nested "if" statements to be indented).\n\nThe formatting of the grammar rules in the following sections places\neach clause on a separate line for clarity.\n\n\nThe "if" statement\n==================\n\nThe "if" statement is used for conditional execution:\n\n if_stmt ::= "if" expression ":" suite\n ( "elif" expression ":" suite )*\n ["else" ":" suite]\n\nIt selects exactly one of the suites by evaluating the expressions one\nby one until one is found to be true (see section *Boolean operations*\nfor the definition of true and false); then that suite is executed\n(and no other part of the "if" statement is executed or evaluated).\nIf all expressions are false, the suite of the "else" clause, if\npresent, is executed.\n\n\nThe "while" statement\n=====================\n\nThe "while" statement is used for repeated execution as long as an\nexpression is true:\n\n while_stmt ::= "while" expression ":" suite\n ["else" ":" suite]\n\nThis repeatedly tests the expression and, if it is true, executes the\nfirst suite; if the expression is false (which may be the first time\nit is tested) the suite of the "else" clause, if present, is executed\nand the loop terminates.\n\nA "break" statement executed in the first suite terminates the loop\nwithout executing the "else" clause\'s suite. A "continue" statement\nexecuted in the first suite skips the rest of the suite and goes back\nto testing the expression.\n\n\nThe "for" statement\n===================\n\nThe "for" statement is used to iterate over the elements of a sequence\n(such as a string, tuple or list) or other iterable object:\n\n for_stmt ::= "for" target_list "in" expression_list ":" suite\n ["else" ":" suite]\n\nThe expression list is evaluated once; it should yield an iterable\nobject. An iterator is created for the result of the\n"expression_list". The suite is then executed once for each item\nprovided by the iterator, in the order returned by the iterator. Each\nitem in turn is assigned to the target list using the standard rules\nfor assignments (see *Assignment statements*), and then the suite is\nexecuted. When the items are exhausted (which is immediately when the\nsequence is empty or an iterator raises a "StopIteration" exception),\nthe suite in the "else" clause, if present, is executed, and the loop\nterminates.\n\nA "break" statement executed in the first suite terminates the loop\nwithout executing the "else" clause\'s suite. A "continue" statement\nexecuted in the first suite skips the rest of the suite and continues\nwith the next item, or with the "else" clause if there is no next\nitem.\n\nThe for-loop makes assignments to the variables(s) in the target list.\nThis overwrites all previous assignments to those variables including\nthose made in the suite of the for-loop:\n\n for i in range(10):\n print(i)\n i = 5 # this will not affect the for-loop\n # because i will be overwritten with the next\n # index in the range\n\nNames in the target list are not deleted when the loop is finished,\nbut if the sequence is empty, they will not have been assigned to at\nall by the loop. Hint: the built-in function "range()" returns an\niterator of integers suitable to emulate the effect of Pascal\'s "for i\n:= a to b do"; e.g., "list(range(3))" returns the list "[0, 1, 2]".\n\nNote: There is a subtlety when the sequence is being modified by the\n loop (this can only occur for mutable sequences, i.e. lists). An\n internal counter is used to keep track of which item is used next,\n and this is incremented on each iteration. When this counter has\n reached the length of the sequence the loop terminates. This means\n that if the suite deletes the current (or a previous) item from the\n sequence, the next item will be skipped (since it gets the index of\n the current item which has already been treated). Likewise, if the\n suite inserts an item in the sequence before the current item, the\n current item will be treated again the next time through the loop.\n This can lead to nasty bugs that can be avoided by making a\n temporary copy using a slice of the whole sequence, e.g.,\n\n for x in a[:]:\n if x < 0: a.remove(x)\n\n\nThe "try" statement\n===================\n\nThe "try" statement specifies exception handlers and/or cleanup code\nfor a group of statements:\n\n try_stmt ::= try1_stmt | try2_stmt\n try1_stmt ::= "try" ":" suite\n ("except" [expression ["as" identifier]] ":" suite)+\n ["else" ":" suite]\n ["finally" ":" suite]\n try2_stmt ::= "try" ":" suite\n "finally" ":" suite\n\nThe "except" clause(s) specify one or more exception handlers. When no\nexception occurs in the "try" clause, no exception handler is\nexecuted. When an exception occurs in the "try" suite, a search for an\nexception handler is started. This search inspects the except clauses\nin turn until one is found that matches the exception. An expression-\nless except clause, if present, must be last; it matches any\nexception. For an except clause with an expression, that expression\nis evaluated, and the clause matches the exception if the resulting\nobject is "compatible" with the exception. An object is compatible\nwith an exception if it is the class or a base class of the exception\nobject or a tuple containing an item compatible with the exception.\n\nIf no except clause matches the exception, the search for an exception\nhandler continues in the surrounding code and on the invocation stack.\n[1]\n\nIf the evaluation of an expression in the header of an except clause\nraises an exception, the original search for a handler is canceled and\na search starts for the new exception in the surrounding code and on\nthe call stack (it is treated as if the entire "try" statement raised\nthe exception).\n\nWhen a matching except clause is found, the exception is assigned to\nthe target specified after the "as" keyword in that except clause, if\npresent, and the except clause\'s suite is executed. All except\nclauses must have an executable block. When the end of this block is\nreached, execution continues normally after the entire try statement.\n(This means that if two nested handlers exist for the same exception,\nand the exception occurs in the try clause of the inner handler, the\nouter handler will not handle the exception.)\n\nWhen an exception has been assigned using "as target", it is cleared\nat the end of the except clause. This is as if\n\n except E as N:\n foo\n\nwas translated to\n\n except E as N:\n try:\n foo\n finally:\n del N\n\nThis means the exception must be assigned to a different name to be\nable to refer to it after the except clause. Exceptions are cleared\nbecause with the traceback attached to them, they form a reference\ncycle with the stack frame, keeping all locals in that frame alive\nuntil the next garbage collection occurs.\n\nBefore an except clause\'s suite is executed, details about the\nexception are stored in the "sys" module and can be accessed via\n"sys.exc_info()". "sys.exc_info()" returns a 3-tuple consisting of the\nexception class, the exception instance and a traceback object (see\nsection *The standard type hierarchy*) identifying the point in the\nprogram where the exception occurred. "sys.exc_info()" values are\nrestored to their previous values (before the call) when returning\nfrom a function that handled an exception.\n\nThe optional "else" clause is executed if and when control flows off\nthe end of the "try" clause. [2] Exceptions in the "else" clause are\nnot handled by the preceding "except" clauses.\n\nIf "finally" is present, it specifies a \'cleanup\' handler. The "try"\nclause is executed, including any "except" and "else" clauses. If an\nexception occurs in any of the clauses and is not handled, the\nexception is temporarily saved. The "finally" clause is executed. If\nthere is a saved exception it is re-raised at the end of the "finally"\nclause. If the "finally" clause raises another exception, the saved\nexception is set as the context of the new exception. If the "finally"\nclause executes a "return" or "break" statement, the saved exception\nis discarded:\n\n >>> def f():\n ... try:\n ... 1/0\n ... finally:\n ... return 42\n ...\n >>> f()\n 42\n\nThe exception information is not available to the program during\nexecution of the "finally" clause.\n\nWhen a "return", "break" or "continue" statement is executed in the\n"try" suite of a "try"..."finally" statement, the "finally" clause is\nalso executed \'on the way out.\' A "continue" statement is illegal in\nthe "finally" clause. (The reason is a problem with the current\nimplementation --- this restriction may be lifted in the future).\n\nThe return value of a function is determined by the last "return"\nstatement executed. Since the "finally" clause always executes, a\n"return" statement executed in the "finally" clause will always be the\nlast one executed:\n\n >>> def foo():\n ... try:\n ... return \'try\'\n ... finally:\n ... return \'finally\'\n ...\n >>> foo()\n \'finally\'\n\nAdditional information on exceptions can be found in section\n*Exceptions*, and information on using the "raise" statement to\ngenerate exceptions may be found in section *The raise statement*.\n\n\nThe "with" statement\n====================\n\nThe "with" statement is used to wrap the execution of a block with\nmethods defined by a context manager (see section *With Statement\nContext Managers*). This allows common "try"..."except"..."finally"\nusage patterns to be encapsulated for convenient reuse.\n\n with_stmt ::= "with" with_item ("," with_item)* ":" suite\n with_item ::= expression ["as" target]\n\nThe execution of the "with" statement with one "item" proceeds as\nfollows:\n\n1. The context expression (the expression given in the "with_item")\n is evaluated to obtain a context manager.\n\n2. The context manager\'s "__exit__()" is loaded for later use.\n\n3. The context manager\'s "__enter__()" method is invoked.\n\n4. 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 method returns without an error, then "__exit__()" will always be\n called. Thus, if an error occurs during the assignment to the\n target list, it will be treated the same as an error occurring\n within the suite would be. See step 6 below.\n\n5. The suite is executed.\n\n6. The context manager\'s "__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 "None" arguments are supplied.\n\n If the suite was exited due to an exception, and the return value\n from the "__exit__()" method was false, the exception is reraised.\n If the return value was true, the exception is suppressed, and\n execution continues with the statement following the "with"\n statement.\n\n If the suite was exited for any reason other than an exception, the\n return value from "__exit__()" is ignored, and execution proceeds\n at the normal location for the kind of exit that was taken.\n\nWith more than one item, the context managers are processed as if\nmultiple "with" statements were nested:\n\n with A() as a, B() as b:\n suite\n\nis equivalent to\n\n with A() as a:\n with B() as b:\n suite\n\nChanged in version 3.1: Support for multiple context expressions.\n\nSee also: **PEP 343** - The "with" statement\n\n The specification, background, and examples for the Python "with"\n statement.\n\n\nFunction definitions\n====================\n\nA function definition defines a user-defined function object (see\nsection *The standard type hierarchy*):\n\n funcdef ::= [decorators] "def" funcname "(" [parameter_list] ")" ["->" expression] ":" suite\n decorators ::= decorator+\n decorator ::= "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE\n dotted_name ::= identifier ("." identifier)*\n parameter_list ::= (defparameter ",")*\n | "*" [parameter] ("," defparameter)* ["," "**" parameter]\n | "**" parameter\n | defparameter [","] )\n parameter ::= identifier [":" expression]\n defparameter ::= parameter ["=" expression]\n funcname ::= identifier\n\nA function definition is an executable statement. Its execution binds\nthe function name in the current local namespace to a function object\n(a wrapper around the executable code for the function). This\nfunction object contains a reference to the current global namespace\nas the global namespace to be used when the function is called.\n\nThe function definition does not execute the function body; this gets\nexecuted only when the function is called. [3]\n\nA function definition may be wrapped by one or more *decorator*\nexpressions. Decorator expressions are evaluated when the function is\ndefined, in the scope that contains the function definition. The\nresult must be a callable, which is invoked with the function object\nas the only argument. The returned value is bound to the function name\ninstead of the function object. Multiple decorators are applied in\nnested fashion. For example, the following code\n\n @f1(arg)\n @f2\n def func(): pass\n\nis roughly equivalent to\n\n def func(): pass\n func = f1(arg)(f2(func))\n\nexcept that the original function is not temporarily bound to the name\n"func".\n\nWhen one or more *parameters* have the form *parameter* "="\n*expression*, the function is said to have "default parameter values."\nFor a parameter with a default value, the corresponding *argument* may\nbe omitted from a call, in which case the parameter\'s default value is\nsubstituted. If a parameter has a default value, all following\nparameters up until the ""*"" must also have a default value --- this\nis a syntactic restriction that is not expressed by the grammar.\n\n**Default parameter values are evaluated from left to right when the\nfunction definition is executed.** This means that the expression is\nevaluated once, when the function is defined, and that the same "pre-\ncomputed" value is used for each call. This is especially important\nto understand when a default parameter is a mutable object, such as a\nlist or a dictionary: if the function modifies the object (e.g. by\nappending an item to a list), the default value is in effect modified.\nThis is generally not what was intended. A way around this is to use\n"None" as the default, and explicitly test for it in the body of the\nfunction, e.g.:\n\n def whats_on_the_telly(penguin=None):\n if penguin is None:\n penguin = []\n penguin.append("property of the zoo")\n return penguin\n\nFunction call semantics are described in more detail in section\n*Calls*. A function call always assigns values to all parameters\nmentioned in the parameter list, either from position arguments, from\nkeyword arguments, or from default values. If the form\n""*identifier"" is present, it is initialized to a tuple receiving any\nexcess positional parameters, defaulting to the empty tuple. If the\nform ""**identifier"" is present, it is initialized to a new\ndictionary receiving any excess keyword arguments, defaulting to a new\nempty dictionary. Parameters after ""*"" or ""*identifier"" are\nkeyword-only parameters and may only be passed used keyword arguments.\n\nParameters may have annotations of the form "": expression"" following\nthe parameter name. Any parameter may have an annotation even those\nof the form "*identifier" or "**identifier". Functions may have\n"return" annotation of the form ""-> expression"" after the parameter\nlist. These annotations can be any valid Python expression and are\nevaluated when the function definition is executed. Annotations may\nbe evaluated in a different order than they appear in the source code.\nThe presence of annotations does not change the semantics of a\nfunction. The annotation values are available as values of a\ndictionary keyed by the parameters\' names in the "__annotations__"\nattribute of the function object.\n\nIt is also possible to create anonymous functions (functions not bound\nto a name), for immediate use in expressions. This uses lambda\nexpressions, described in section *Lambdas*. Note that the lambda\nexpression is merely a shorthand for a simplified function definition;\na function defined in a ""def"" statement can be passed around or\nassigned to another name just like a function defined by a lambda\nexpression. The ""def"" form is actually more powerful since it\nallows the execution of multiple statements and annotations.\n\n**Programmer\'s note:** Functions are first-class objects. A ""def""\nstatement executed inside a function definition defines a local\nfunction that can be returned or passed around. Free variables used\nin the nested function can access the local variables of the function\ncontaining the def. See section *Naming and binding* for details.\n\nSee also: **PEP 3107** - Function Annotations\n\n The original specification for function annotations.\n\n\nClass definitions\n=================\n\nA class definition defines a class object (see section *The standard\ntype hierarchy*):\n\n classdef ::= [decorators] "class" classname [inheritance] ":" suite\n inheritance ::= "(" [argument_list] ")"\n classname ::= identifier\n\nA class definition is an executable statement. The inheritance list\nusually gives a list of base classes (see *Customizing class creation*\nfor more advanced uses), so each item in the list should evaluate to a\nclass object which allows subclassing. Classes without an inheritance\nlist inherit, by default, from the base class "object"; hence,\n\n class Foo:\n pass\n\nis equivalent to\n\n class Foo(object):\n pass\n\nThe class\'s suite is then executed in a new execution frame (see\n*Naming and binding*), using a newly created local namespace and the\noriginal global namespace. (Usually, the suite contains mostly\nfunction definitions.) When the class\'s suite finishes execution, its\nexecution frame is discarded but its local namespace is saved. [4] A\nclass object is then created using the inheritance list for the base\nclasses and the saved local namespace for the attribute dictionary.\nThe class name is bound to this class object in the original local\nnamespace.\n\nClass creation can be customized heavily using *metaclasses*.\n\nClasses can also be decorated: just like when decorating functions,\n\n @f1(arg)\n @f2\n class Foo: pass\n\nis roughly equivalent to\n\n class Foo: pass\n Foo = f1(arg)(f2(Foo))\n\nThe evaluation rules for the decorator expressions are the same as for\nfunction decorators. The result is then bound to the class name.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass attributes; they are shared by instances. Instance attributes\ncan be set in a method with "self.name = value". Both class and\ninstance attributes are accessible through the notation ""self.name"",\nand an instance attribute hides a class attribute with the same name\nwhen accessed in this way. Class attributes can be used as defaults\nfor instance attributes, but using mutable values there can lead to\nunexpected results. *Descriptors* can be used to create instance\nvariables with different implementation details.\n\nSee also: **PEP 3115** - Metaclasses in Python 3 **PEP 3129** -\n Class Decorators\n\n\nCoroutines\n==========\n\nNew in version 3.5.\n\n\nCoroutine function definition\n-----------------------------\n\n async_funcdef ::= [decorators] "async" "def" funcname "(" [parameter_list] ")" ["->" expression] ":" suite\n\nExecution of Python coroutines can be suspended and resumed at many\npoints (see *coroutine*). In the body of a coroutine, any "await" and\n"async" identifiers become reserved keywords; "await" expressions,\n"async for" and "async with" can only be used in coroutine bodies.\n\nFunctions defined with "async def" syntax are always coroutine\nfunctions, even if they do not contain "await" or "async" keywords.\n\nIt is a "SyntaxError" to use "yield" expressions in "async def"\ncoroutines.\n\nAn example of a coroutine function:\n\n async def func(param1, param2):\n do_stuff()\n await some_coroutine()\n\n\nThe "async for" statement\n-------------------------\n\n async_for_stmt ::= "async" for_stmt\n\nAn *asynchronous iterable* is able to call asynchronous code in its\n*iter* implementation, and *asynchronous iterator* can call\nasynchronous code in its *next* method.\n\nThe "async for" statement allows convenient iteration over\nasynchronous iterators.\n\nThe following code:\n\n async for TARGET in ITER:\n BLOCK\n else:\n BLOCK2\n\nIs semantically equivalent to:\n\n iter = (ITER)\n iter = type(iter).__aiter__(iter)\n running = True\n while running:\n try:\n TARGET = await type(iter).__anext__(iter)\n except StopAsyncIteration:\n running = False\n else:\n BLOCK\n else:\n BLOCK2\n\nSee also "__aiter__()" and "__anext__()" for details.\n\nIt is a "SyntaxError" to use "async for" statement outside of an\n"async def" function.\n\n\nThe "async with" statement\n--------------------------\n\n async_with_stmt ::= "async" with_stmt\n\nAn *asynchronous context manager* is a *context manager* that is able\nto suspend execution in its *enter* and *exit* methods.\n\nThe following code:\n\n async with EXPR as VAR:\n BLOCK\n\nIs semantically equivalent to:\n\n mgr = (EXPR)\n aexit = type(mgr).__aexit__\n aenter = type(mgr).__aenter__(mgr)\n exc = True\n\n VAR = await aenter\n try:\n BLOCK\n except:\n if not await aexit(mgr, *sys.exc_info()):\n raise\n else:\n await aexit(mgr, None, None, None)\n\nSee also "__aenter__()" and "__aexit__()" for details.\n\nIt is a "SyntaxError" to use "async with" statement outside of an\n"async def" function.\n\nSee also: **PEP 492** - Coroutines with async and await syntax\n\n-[ Footnotes ]-\n\n[1] The exception is propagated to the invocation stack unless\n there is a "finally" clause which happens to raise another\n exception. That new exception causes the old one to be lost.\n\n[2] Currently, control "flows off the end" except in the case of\n an exception or the execution of a "return", "continue", or\n "break" statement.\n\n[3] A string literal appearing as the first statement in the\n function body is transformed into the function\'s "__doc__"\n attribute and therefore the function\'s *docstring*.\n\n[4] A string literal appearing as the first statement in the class\n body is transformed into the namespace\'s "__doc__" item and\n therefore the class\'s *docstring*.\n', + 'context-managers': u'\nWith Statement Context Managers\n*******************************\n\nA *context manager* is an object that defines the runtime context to\nbe established when executing a "with" statement. The context manager\nhandles the entry into, and the exit from, the desired runtime context\nfor the execution of the block of code. Context managers are normally\ninvoked using the "with" statement (described in section *The with\nstatement*), but can also be used by directly invoking their methods.\n\nTypical uses of context managers include saving and restoring various\nkinds of global state, locking and unlocking resources, closing opened\nfiles, etc.\n\nFor more information on context managers, see *Context Manager Types*.\n\nobject.__enter__(self)\n\n Enter the runtime context related to this object. The "with"\n statement will bind this method\'s return value to the target(s)\n specified in the "as" clause of the statement, if any.\n\nobject.__exit__(self, exc_type, exc_value, traceback)\n\n Exit the runtime context related to this object. The parameters\n describe the exception that caused the context to be exited. If the\n context was exited without an exception, all three arguments will\n be "None".\n\n If an exception is supplied, and the method wishes to suppress the\n exception (i.e., prevent it from being propagated), it should\n return a true value. Otherwise, the exception will be processed\n normally upon exit from this method.\n\n Note that "__exit__()" methods should not reraise the passed-in\n exception; this is the caller\'s responsibility.\n\nSee also: **PEP 343** - The "with" statement\n\n The specification, background, and examples for the Python "with"\n statement.\n', + 'continue': u'\nThe "continue" statement\n************************\n\n continue_stmt ::= "continue"\n\n"continue" may only occur syntactically nested in a "for" or "while"\nloop, but not nested in a function or class definition or "finally"\nclause within that loop. It continues with the next cycle of the\nnearest enclosing loop.\n\nWhen "continue" passes control out of a "try" statement with a\n"finally" clause, that "finally" clause is executed before really\nstarting the next loop cycle.\n', + 'conversions': u'\nArithmetic conversions\n**********************\n\nWhen a description of an arithmetic operator below uses the phrase\n"the numeric arguments are converted to a common type," this means\nthat the operator implementation for built-in types works as follows:\n\n* If either argument is a complex number, the other is converted to\n complex;\n\n* otherwise, if either argument is a floating point number, the\n other is converted to floating point;\n\n* otherwise, both must be integers and no conversion is necessary.\n\nSome additional rules apply for certain operators (e.g., a string as a\nleft argument to the \'%\' operator). Extensions must define their own\nconversion behavior.\n', + 'customization': u'\nBasic customization\n*******************\n\nobject.__new__(cls[, ...])\n\n Called to create a new instance of class *cls*. "__new__()" is a\n static method (special-cased so you need not declare it as such)\n that takes the class of which an instance was requested as its\n first argument. The remaining arguments are those passed to the\n object constructor expression (the call to the class). The return\n value of "__new__()" should be the new object instance (usually an\n instance of *cls*).\n\n Typical implementations create a new instance of the class by\n invoking the superclass\'s "__new__()" method using\n "super().__new__(cls[, ...])" with appropriate arguments and then\n modifying the newly-created instance as necessary before returning\n it.\n\n If "__new__()" returns an instance of *cls*, then the new\n instance\'s "__init__()" method will be invoked like\n "__init__(self[, ...])", where *self* is the new instance and the\n remaining arguments are the same as were passed to "__new__()".\n\n If "__new__()" does not return an instance of *cls*, then the new\n instance\'s "__init__()" method will not be invoked.\n\n "__new__()" is intended mainly to allow subclasses of immutable\n types (like int, str, or tuple) to customize instance creation. It\n is also commonly overridden in custom metaclasses in order to\n customize class creation.\n\nobject.__init__(self[, ...])\n\n Called after the instance has been created (by "__new__()"), but\n before it is returned to the caller. The arguments are those\n passed to the class constructor expression. If a base class has an\n "__init__()" method, the derived class\'s "__init__()" method, if\n any, must explicitly call it to ensure proper initialization of the\n base class part of the instance; for example:\n "super().__init__([args...])".\n\n Because "__new__()" and "__init__()" work together in constructing\n objects ("__new__()" to create it, and "__init__()" to customize\n it), no non-"None" value may be returned by "__init__()"; doing so\n will cause a "TypeError" to be raised at runtime.\n\nobject.__del__(self)\n\n Called when the instance is about to be destroyed. This is also\n called a destructor. If a base class has a "__del__()" method, the\n derived class\'s "__del__()" method, if any, must explicitly call it\n to ensure proper deletion of the base class part of the instance.\n Note that it is possible (though not recommended!) for the\n "__del__()" method to postpone destruction of the instance by\n creating a new reference to it. It may then be called at a later\n time when this new reference is deleted. It is not guaranteed that\n "__del__()" methods are called for objects that still exist when\n the interpreter exits.\n\n Note: "del x" doesn\'t directly call "x.__del__()" --- the former\n decrements the reference count for "x" by one, and the latter is\n only called when "x"\'s reference count reaches zero. Some common\n situations that may prevent the reference count of an object from\n going to zero include: circular references between objects (e.g.,\n a doubly-linked list or a tree data structure with parent and\n child pointers); a reference to the object on the stack frame of\n a function that caught an exception (the traceback stored in\n "sys.exc_info()[2]" keeps the stack frame alive); or a reference\n to the object on the stack frame that raised an unhandled\n exception in interactive mode (the traceback stored in\n "sys.last_traceback" keeps the stack frame alive). The first\n situation can only be remedied by explicitly breaking the cycles;\n the second can be resolved by freeing the reference to the\n traceback object when it is no longer useful, and the third can\n be resolved by storing "None" in "sys.last_traceback". Circular\n references which are garbage are detected and cleaned up when the\n cyclic garbage collector is enabled (it\'s on by default). Refer\n to the documentation for the "gc" module for more information\n about this topic.\n\n Warning: Due to the precarious circumstances under which\n "__del__()" methods are invoked, exceptions that occur during\n their execution are ignored, and a warning is printed to\n "sys.stderr" instead. Also, when "__del__()" is invoked in\n response to a module being deleted (e.g., when execution of the\n program is done), other globals referenced by the "__del__()"\n method may already have been deleted or in the process of being\n torn down (e.g. the import machinery shutting down). For this\n reason, "__del__()" methods should do the absolute minimum needed\n to maintain external invariants. Starting with version 1.5,\n Python guarantees that globals whose name begins with a single\n underscore are deleted from their module before other globals are\n deleted; if no other references to such globals exist, this may\n help in assuring that imported modules are still available at the\n time when the "__del__()" method is called.\n\nobject.__repr__(self)\n\n Called by the "repr()" built-in function to compute the "official"\n string representation of an object. If at all possible, this\n should look like a valid Python expression that could be used to\n recreate an object with the same value (given an appropriate\n environment). If this is not possible, a string of the form\n "<...some useful description...>" should be returned. The return\n value must be a string object. If a class defines "__repr__()" but\n not "__str__()", then "__repr__()" is also used when an "informal"\n string representation of instances of that class is required.\n\n This is typically used for debugging, so it is important that the\n representation is information-rich and unambiguous.\n\nobject.__str__(self)\n\n Called by "str(object)" and the built-in functions "format()" and\n "print()" to compute the "informal" or nicely printable string\n representation of an object. The return value must be a *string*\n object.\n\n This method differs from "object.__repr__()" in that there is no\n expectation that "__str__()" return a valid Python expression: a\n more convenient or concise representation can be used.\n\n The default implementation defined by the built-in type "object"\n calls "object.__repr__()".\n\nobject.__bytes__(self)\n\n Called by "bytes()" to compute a byte-string representation of an\n object. This should return a "bytes" object.\n\nobject.__format__(self, format_spec)\n\n Called by the "format()" built-in function (and by extension, the\n "str.format()" method of class "str") to produce a "formatted"\n string representation of an object. The "format_spec" argument is a\n string that contains a description of the formatting options\n desired. The interpretation of the "format_spec" argument is up to\n the type implementing "__format__()", however most classes will\n either delegate formatting to one of the built-in types, or use a\n similar formatting option syntax.\n\n See *Format Specification Mini-Language* for a description of the\n standard formatting syntax.\n\n The return value must be a string object.\n\n Changed in version 3.4: The __format__ method of "object" itself\n raises a "TypeError" if passed any non-empty string.\n\nobject.__lt__(self, other)\nobject.__le__(self, other)\nobject.__eq__(self, other)\nobject.__ne__(self, other)\nobject.__gt__(self, other)\nobject.__ge__(self, other)\n\n These are the so-called "rich comparison" methods. The\n correspondence between operator symbols and method names is as\n follows: "xy" calls\n "x.__gt__(y)", and "x>=y" calls "x.__ge__(y)".\n\n A rich comparison method may return the singleton "NotImplemented"\n if it does not implement the operation for a given pair of\n arguments. By convention, "False" and "True" are returned for a\n successful comparison. However, these methods can return any value,\n so if the comparison operator is used in a Boolean context (e.g.,\n in the condition of an "if" statement), Python will call "bool()"\n on the value to determine if the result is true or false.\n\n By default, "__ne__()" delegates to "__eq__()" and inverts the\n result unless it is "NotImplemented". There are no other implied\n relationships among the comparison operators, for example, the\n truth of "(x.__hash__".\n\n If a class that does not override "__eq__()" wishes to suppress\n hash support, it should include "__hash__ = None" in the class\n definition. A class which defines its own "__hash__()" that\n explicitly raises a "TypeError" would be incorrectly identified as\n hashable by an "isinstance(obj, collections.Hashable)" call.\n\n Note: By default, the "__hash__()" values of str, bytes and\n datetime objects are "salted" with an unpredictable random value.\n Although they remain constant within an individual Python\n process, they are not predictable between repeated invocations of\n Python.This is intended to provide protection against a denial-\n of-service caused by carefully-chosen inputs that exploit the\n worst case performance of a dict insertion, O(n^2) complexity.\n See http://www.ocert.org/advisories/ocert-2011-003.html for\n details.Changing hash values affects the iteration order of\n dicts, sets and other mappings. Python has never made guarantees\n about this ordering (and it typically varies between 32-bit and\n 64-bit builds).See also "PYTHONHASHSEED".\n\n Changed in version 3.3: Hash randomization is enabled by default.\n\nobject.__bool__(self)\n\n Called to implement truth value testing and the built-in operation\n "bool()"; should return "False" or "True". When this method is not\n defined, "__len__()" is called, if it is defined, and the object is\n considered true if its result is nonzero. If a class defines\n neither "__len__()" nor "__bool__()", all its instances are\n considered true.\n', + 'debugger': u'\n"pdb" --- The Python Debugger\n*****************************\n\n**Source code:** Lib/pdb.py\n\n======================================================================\n\nThe module "pdb" defines an interactive source code debugger for\nPython programs. It supports setting (conditional) breakpoints and\nsingle stepping at the source line level, inspection of stack frames,\nsource code listing, and evaluation of arbitrary Python code in the\ncontext of any stack frame. It also supports post-mortem debugging\nand can be called under program control.\n\nThe debugger is extensible -- it is actually defined as the class\n"Pdb". This is currently undocumented but easily understood by reading\nthe source. The extension interface uses the modules "bdb" and "cmd".\n\nThe debugger\'s prompt is "(Pdb)". Typical usage to run a program under\ncontrol of the debugger is:\n\n >>> import pdb\n >>> import mymodule\n >>> pdb.run(\'mymodule.test()\')\n > (0)?()\n (Pdb) continue\n > (1)?()\n (Pdb) continue\n NameError: \'spam\'\n > (1)?()\n (Pdb)\n\nChanged in version 3.3: Tab-completion via the "readline" module is\navailable for commands and command arguments, e.g. the current global\nand local names are offered as arguments of the "p" command.\n\n"pdb.py" can also be invoked as a script to debug other scripts. For\nexample:\n\n python3 -m pdb myscript.py\n\nWhen invoked as a script, pdb will automatically enter post-mortem\ndebugging if the program being debugged exits abnormally. After post-\nmortem debugging (or after normal exit of the program), pdb will\nrestart the program. Automatic restarting preserves pdb\'s state (such\nas breakpoints) and in most cases is more useful than quitting the\ndebugger upon program\'s exit.\n\nNew in version 3.2: "pdb.py" now accepts a "-c" option that executes\ncommands as if given in a ".pdbrc" file, see *Debugger Commands*.\n\nThe typical usage to break into the debugger from a running program is\nto insert\n\n import pdb; pdb.set_trace()\n\nat the location you want to break into the debugger. You can then\nstep through the code following this statement, and continue running\nwithout the debugger using the "continue" command.\n\nThe typical usage to inspect a crashed program is:\n\n >>> import pdb\n >>> import mymodule\n >>> mymodule.test()\n Traceback (most recent call last):\n File "", line 1, in \n File "./mymodule.py", line 4, in test\n test2()\n File "./mymodule.py", line 3, in test2\n print(spam)\n NameError: spam\n >>> pdb.pm()\n > ./mymodule.py(3)test2()\n -> print(spam)\n (Pdb)\n\nThe module defines the following functions; each enters the debugger\nin a slightly different way:\n\npdb.run(statement, globals=None, locals=None)\n\n Execute the *statement* (given as a string or a code object) under\n debugger control. The debugger prompt appears before any code is\n executed; you can set breakpoints and type "continue", or you can\n step through the statement using "step" or "next" (all these\n commands are explained below). The optional *globals* and *locals*\n arguments specify the environment in which the code is executed; by\n default the dictionary of the module "__main__" is used. (See the\n explanation of the built-in "exec()" or "eval()" functions.)\n\npdb.runeval(expression, globals=None, locals=None)\n\n Evaluate the *expression* (given as a string or a code object)\n under debugger control. When "runeval()" returns, it returns the\n value of the expression. Otherwise this function is similar to\n "run()".\n\npdb.runcall(function, *args, **kwds)\n\n Call the *function* (a function or method object, not a string)\n with the given arguments. When "runcall()" returns, it returns\n whatever the function call returned. The debugger prompt appears\n as soon as the function is entered.\n\npdb.set_trace()\n\n Enter the debugger at the calling stack frame. This is useful to\n hard-code a breakpoint at a given point in a program, even if the\n code is not otherwise being debugged (e.g. when an assertion\n fails).\n\npdb.post_mortem(traceback=None)\n\n Enter post-mortem debugging of the given *traceback* object. If no\n *traceback* is given, it uses the one of the exception that is\n currently being handled (an exception must be being handled if the\n default is to be used).\n\npdb.pm()\n\n Enter post-mortem debugging of the traceback found in\n "sys.last_traceback".\n\nThe "run*" functions and "set_trace()" are aliases for instantiating\nthe "Pdb" class and calling the method of the same name. If you want\nto access further features, you have to do this yourself:\n\nclass class pdb.Pdb(completekey=\'tab\', stdin=None, stdout=None, skip=None, nosigint=False)\n\n "Pdb" is the debugger class.\n\n The *completekey*, *stdin* and *stdout* arguments are passed to the\n underlying "cmd.Cmd" class; see the description there.\n\n The *skip* argument, if given, must be an iterable of glob-style\n module name patterns. The debugger will not step into frames that\n originate in a module that matches one of these patterns. [1]\n\n By default, Pdb sets a handler for the SIGINT signal (which is sent\n when the user presses "Ctrl-C" on the console) when you give a\n "continue" command. This allows you to break into the debugger\n again by pressing "Ctrl-C". If you want Pdb not to touch the\n SIGINT handler, set *nosigint* to true.\n\n Example call to enable tracing with *skip*:\n\n import pdb; pdb.Pdb(skip=[\'django.*\']).set_trace()\n\n New in version 3.1: The *skip* argument.\n\n New in version 3.2: The *nosigint* argument. Previously, a SIGINT\n handler was never set by Pdb.\n\n run(statement, globals=None, locals=None)\n runeval(expression, globals=None, locals=None)\n runcall(function, *args, **kwds)\n set_trace()\n\n See the documentation for the functions explained above.\n\n\nDebugger Commands\n=================\n\nThe commands recognized by the debugger are listed below. Most\ncommands can be abbreviated to one or two letters as indicated; e.g.\n"h(elp)" means that either "h" or "help" can be used to enter the help\ncommand (but not "he" or "hel", nor "H" or "Help" or "HELP").\nArguments to commands must be separated by whitespace (spaces or\ntabs). Optional arguments are enclosed in square brackets ("[]") in\nthe command syntax; the square brackets must not be typed.\nAlternatives in the command syntax are separated by a vertical bar\n("|").\n\nEntering a blank line repeats the last command entered. Exception: if\nthe last command was a "list" command, the next 11 lines are listed.\n\nCommands that the debugger doesn\'t recognize are assumed to be Python\nstatements and are executed in the context of the program being\ndebugged. Python statements can also be prefixed with an exclamation\npoint ("!"). This is a powerful way to inspect the program being\ndebugged; it is even possible to change a variable or call a function.\nWhen an exception occurs in such a statement, the exception name is\nprinted but the debugger\'s state is not changed.\n\nThe debugger supports *aliases*. Aliases can have parameters which\nallows one a certain level of adaptability to the context under\nexamination.\n\nMultiple commands may be entered on a single line, separated by ";;".\n(A single ";" is not used as it is the separator for multiple commands\nin a line that is passed to the Python parser.) No intelligence is\napplied to separating the commands; the input is split at the first\n";;" pair, even if it is in the middle of a quoted string.\n\nIf a file ".pdbrc" exists in the user\'s home directory or in the\ncurrent directory, it is read in and executed as if it had been typed\nat the debugger prompt. This is particularly useful for aliases. If\nboth files exist, the one in the home directory is read first and\naliases defined there can be overridden by the local file.\n\nChanged in version 3.2: ".pdbrc" can now contain commands that\ncontinue debugging, such as "continue" or "next". Previously, these\ncommands had no effect.\n\nh(elp) [command]\n\n Without argument, print the list of available commands. With a\n *command* as argument, print help about that command. "help pdb"\n displays the full documentation (the docstring of the "pdb"\n module). Since the *command* argument must be an identifier, "help\n exec" must be entered to get help on the "!" command.\n\nw(here)\n\n Print a stack trace, with the most recent frame at the bottom. An\n arrow indicates the current frame, which determines the context of\n most commands.\n\nd(own) [count]\n\n Move the current frame *count* (default one) levels down in the\n stack trace (to a newer frame).\n\nu(p) [count]\n\n Move the current frame *count* (default one) levels up in the stack\n trace (to an older frame).\n\nb(reak) [([filename:]lineno | function) [, condition]]\n\n With a *lineno* argument, set a break there in the current file.\n With a *function* argument, set a break at the first executable\n statement within that function. The line number may be prefixed\n with a filename and a colon, to specify a breakpoint in another\n file (probably one that hasn\'t been loaded yet). The file is\n searched on "sys.path". Note that each breakpoint is assigned a\n number to which all the other breakpoint commands refer.\n\n If a second argument is present, it is an expression which must\n evaluate to true before the breakpoint is honored.\n\n Without argument, list all breaks, including for each breakpoint,\n the number of times that breakpoint has been hit, the current\n ignore count, and the associated condition if any.\n\ntbreak [([filename:]lineno | function) [, condition]]\n\n Temporary breakpoint, which is removed automatically when it is\n first hit. The arguments are the same as for "break".\n\ncl(ear) [filename:lineno | bpnumber [bpnumber ...]]\n\n With a *filename:lineno* argument, clear all the breakpoints at\n this line. With a space separated list of breakpoint numbers, clear\n those breakpoints. Without argument, clear all breaks (but first\n ask confirmation).\n\ndisable [bpnumber [bpnumber ...]]\n\n Disable the breakpoints given as a space separated list of\n breakpoint numbers. Disabling a breakpoint means it cannot cause\n the program to stop execution, but unlike clearing a breakpoint, it\n remains in the list of breakpoints and can be (re-)enabled.\n\nenable [bpnumber [bpnumber ...]]\n\n Enable the breakpoints specified.\n\nignore bpnumber [count]\n\n Set the ignore count for the given breakpoint number. If count is\n omitted, the ignore count is set to 0. A breakpoint becomes active\n when the ignore count is zero. When non-zero, the count is\n decremented each time the breakpoint is reached and the breakpoint\n is not disabled and any associated condition evaluates to true.\n\ncondition bpnumber [condition]\n\n Set a new *condition* for the breakpoint, an expression which must\n evaluate to true before the breakpoint is honored. If *condition*\n is absent, any existing condition is removed; i.e., the breakpoint\n is made unconditional.\n\ncommands [bpnumber]\n\n Specify a list of commands for breakpoint number *bpnumber*. The\n commands themselves appear on the following lines. Type a line\n containing just "end" to terminate the commands. An example:\n\n (Pdb) commands 1\n (com) p some_variable\n (com) end\n (Pdb)\n\n To remove all commands from a breakpoint, type commands and follow\n it immediately with "end"; that is, give no commands.\n\n With no *bpnumber* argument, commands refers to the last breakpoint\n set.\n\n You can use breakpoint commands to start your program up again.\n Simply use the continue command, or step, or any other command that\n resumes execution.\n\n Specifying any command resuming execution (currently continue,\n step, next, return, jump, quit and their abbreviations) terminates\n the command list (as if that command was immediately followed by\n end). This is because any time you resume execution (even with a\n simple next or step), you may encounter another breakpoint\u2014which\n could have its own command list, leading to ambiguities about which\n list to execute.\n\n If you use the \'silent\' command in the command list, the usual\n message about stopping at a breakpoint is not printed. This may be\n desirable for breakpoints that are to print a specific message and\n then continue. If none of the other commands print anything, you\n see no sign that the breakpoint was reached.\n\ns(tep)\n\n Execute the current line, stop at the first possible occasion\n (either in a function that is called or on the next line in the\n current function).\n\nn(ext)\n\n Continue execution until the next line in the current function is\n reached or it returns. (The difference between "next" and "step"\n is that "step" stops inside a called function, while "next"\n executes called functions at (nearly) full speed, only stopping at\n the next line in the current function.)\n\nunt(il) [lineno]\n\n Without argument, continue execution until the line with a number\n greater than the current one is reached.\n\n With a line number, continue execution until a line with a number\n greater or equal to that is reached. In both cases, also stop when\n the current frame returns.\n\n Changed in version 3.2: Allow giving an explicit line number.\n\nr(eturn)\n\n Continue execution until the current function returns.\n\nc(ont(inue))\n\n Continue execution, only stop when a breakpoint is encountered.\n\nj(ump) lineno\n\n Set the next line that will be executed. Only available in the\n bottom-most frame. This lets you jump back and execute code again,\n or jump forward to skip code that you don\'t want to run.\n\n It should be noted that not all jumps are allowed -- for instance\n it is not possible to jump into the middle of a "for" loop or out\n of a "finally" clause.\n\nl(ist) [first[, last]]\n\n List source code for the current file. Without arguments, list 11\n lines around the current line or continue the previous listing.\n With "." as argument, list 11 lines around the current line. With\n one argument, list 11 lines around at that line. With two\n arguments, list the given range; if the second argument is less\n than the first, it is interpreted as a count.\n\n The current line in the current frame is indicated by "->". If an\n exception is being debugged, the line where the exception was\n originally raised or propagated is indicated by ">>", if it differs\n from the current line.\n\n New in version 3.2: The ">>" marker.\n\nll | longlist\n\n List all source code for the current function or frame.\n Interesting lines are marked as for "list".\n\n New in version 3.2.\n\na(rgs)\n\n Print the argument list of the current function.\n\np expression\n\n Evaluate the *expression* in the current context and print its\n value.\n\n Note: "print()" can also be used, but is not a debugger command\n --- this executes the Python "print()" function.\n\npp expression\n\n Like the "p" command, except the value of the expression is pretty-\n printed using the "pprint" module.\n\nwhatis expression\n\n Print the type of the *expression*.\n\nsource expression\n\n Try to get source code for the given object and display it.\n\n New in version 3.2.\n\ndisplay [expression]\n\n Display the value of the expression if it changed, each time\n execution stops in the current frame.\n\n Without expression, list all display expressions for the current\n frame.\n\n New in version 3.2.\n\nundisplay [expression]\n\n Do not display the expression any more in the current frame.\n Without expression, clear all display expressions for the current\n frame.\n\n New in version 3.2.\n\ninteract\n\n Start an interactive interpreter (using the "code" module) whose\n global namespace contains all the (global and local) names found in\n the current scope.\n\n New in version 3.2.\n\nalias [name [command]]\n\n Create an alias called *name* that executes *command*. The command\n must *not* be enclosed in quotes. Replaceable parameters can be\n indicated by "%1", "%2", and so on, while "%*" is replaced by all\n the parameters. If no command is given, the current alias for\n *name* is shown. If no arguments are given, all aliases are listed.\n\n Aliases may be nested and can contain anything that can be legally\n typed at the pdb prompt. Note that internal pdb commands *can* be\n overridden by aliases. Such a command is then hidden until the\n alias is removed. Aliasing is recursively applied to the first\n word of the command line; all other words in the line are left\n alone.\n\n As an example, here are two useful aliases (especially when placed\n in the ".pdbrc" file):\n\n # Print instance variables (usage "pi classInst")\n alias pi for k in %1.__dict__.keys(): print("%1.",k,"=",%1.__dict__[k])\n # Print instance variables in self\n alias ps pi self\n\nunalias name\n\n Delete the specified alias.\n\n! statement\n\n Execute the (one-line) *statement* in the context of the current\n stack frame. The exclamation point can be omitted unless the first\n word of the statement resembles a debugger command. To set a\n global variable, you can prefix the assignment command with a\n "global" statement on the same line, e.g.:\n\n (Pdb) global list_options; list_options = [\'-l\']\n (Pdb)\n\nrun [args ...]\nrestart [args ...]\n\n Restart the debugged Python program. If an argument is supplied,\n it is split with "shlex" and the result is used as the new\n "sys.argv". History, breakpoints, actions and debugger options are\n preserved. "restart" is an alias for "run".\n\nq(uit)\n\n Quit from the debugger. The program being executed is aborted.\n\n-[ Footnotes ]-\n\n[1] Whether a frame is considered to originate in a certain module\n is determined by the "__name__" in the frame globals.\n', + 'del': u'\nThe "del" statement\n*******************\n\n del_stmt ::= "del" target_list\n\nDeletion is recursively defined very similar to the way assignment is\ndefined. Rather than spelling it out in full details, here are some\nhints.\n\nDeletion of a target list recursively deletes each target, from left\nto right.\n\nDeletion of a name removes the binding of that name from the local or\nglobal namespace, depending on whether the name occurs in a "global"\nstatement in the same code block. If the name is unbound, a\n"NameError" exception will be raised.\n\nDeletion of attribute references, subscriptions and slicings is passed\nto the primary object involved; deletion of a slicing is in general\nequivalent to assignment of an empty slice of the right type (but even\nthis is determined by the sliced object).\n\nChanged in version 3.2: Previously it was illegal to delete a name\nfrom the local namespace if it occurs as a free variable in a nested\nblock.\n', + 'dict': u'\nDictionary displays\n*******************\n\nA dictionary display is a possibly empty series of key/datum pairs\nenclosed in curly braces:\n\n dict_display ::= "{" [key_datum_list | dict_comprehension] "}"\n key_datum_list ::= key_datum ("," key_datum)* [","]\n key_datum ::= expression ":" expression | "**" or_expr\n dict_comprehension ::= expression ":" expression comp_for\n\nA dictionary display yields a new dictionary object.\n\nIf a comma-separated sequence of key/datum pairs is given, they are\nevaluated from left to right to define the entries of the dictionary:\neach key object is used as a key into the dictionary to store the\ncorresponding datum. This means that you can specify the same key\nmultiple times in the key/datum list, and the final dictionary\'s value\nfor that key will be the last one given.\n\nA double asterisk "**" denotes *dictionary unpacking*. Its operand\nmust be a *mapping*. Each mapping item is added to the new\ndictionary. Later values replace values already set by earlier\nkey/datum pairs and earlier dictionary unpackings.\n\nNew in version 3.5: Unpacking into dictionary displays, originally\nproposed by **PEP 448**.\n\nA dict comprehension, in contrast to list and set comprehensions,\nneeds two expressions separated with a colon followed by the usual\n"for" and "if" clauses. When the comprehension is run, the resulting\nkey and value elements are inserted in the new dictionary in the order\nthey are produced.\n\nRestrictions on the types of the key values are listed earlier in\nsection *The standard type hierarchy*. (To summarize, the key type\nshould be *hashable*, which excludes all mutable objects.) Clashes\nbetween duplicate keys are not detected; the last datum (textually\nrightmost in the display) stored for a given key value prevails.\n', + 'dynamic-features': u'\nInteraction with dynamic features\n*********************************\n\nName resolution of free variables occurs at runtime, not at compile\ntime. This means that the following code will print 42:\n\n i = 10\n def f():\n print(i)\n i = 42\n f()\n\nThe "eval()" and "exec()" functions do not have access to the full\nenvironment for resolving names. Names may be resolved in the local\nand global namespaces of the caller. Free variables are not resolved\nin the nearest enclosing namespace, but in the global namespace. [1]\nThe "exec()" and "eval()" functions have optional arguments to\noverride the global and local namespace. If only one namespace is\nspecified, it is used for both.\n', + 'else': u'\nThe "if" statement\n******************\n\nThe "if" statement is used for conditional execution:\n\n if_stmt ::= "if" expression ":" suite\n ( "elif" expression ":" suite )*\n ["else" ":" suite]\n\nIt selects exactly one of the suites by evaluating the expressions one\nby one until one is found to be true (see section *Boolean operations*\nfor the definition of true and false); then that suite is executed\n(and no other part of the "if" statement is executed or evaluated).\nIf all expressions are false, the suite of the "else" clause, if\npresent, is executed.\n', + 'exceptions': u'\nExceptions\n**********\n\nExceptions are a means of breaking out of the normal flow of control\nof a code block in order to handle errors or other exceptional\nconditions. An exception is *raised* at the point where the error is\ndetected; it may be *handled* by the surrounding code block or by any\ncode block that directly or indirectly invoked the code block where\nthe error occurred.\n\nThe Python interpreter raises an exception when it detects a run-time\nerror (such as division by zero). A Python program can also\nexplicitly raise an exception with the "raise" statement. Exception\nhandlers are specified with the "try" ... "except" statement. The\n"finally" clause of such a statement can be used to specify cleanup\ncode which does not handle the exception, but is executed whether an\nexception occurred or not in the preceding code.\n\nPython uses the "termination" model of error handling: an exception\nhandler can find out what happened and continue execution at an outer\nlevel, but it cannot repair the cause of the error and retry the\nfailing operation (except by re-entering the offending piece of code\nfrom the top).\n\nWhen an exception is not handled at all, the interpreter terminates\nexecution of the program, or returns to its interactive main loop. In\neither case, it prints a stack backtrace, except when the exception is\n"SystemExit".\n\nExceptions are identified by class instances. The "except" clause is\nselected depending on the class of the instance: it must reference the\nclass of the instance or a base class thereof. The instance can be\nreceived by the handler and can carry additional information about the\nexceptional condition.\n\nNote: Exception messages are not part of the Python API. Their\n contents may change from one version of Python to the next without\n warning and should not be relied on by code which will run under\n multiple versions of the interpreter.\n\nSee also the description of the "try" statement in section *The try\nstatement* and "raise" statement in section *The raise statement*.\n\n-[ Footnotes ]-\n\n[1] This limitation occurs because the code that is executed by\n these operations is not available at the time the module is\n compiled.\n', + 'execmodel': u'\nExecution model\n***************\n\n\nStructure of a program\n======================\n\nA Python program is constructed from code blocks. A *block* is a piece\nof Python program text that is executed as a unit. The following are\nblocks: a module, a function body, and a class definition. Each\ncommand typed interactively is a block. A script file (a file given\nas standard input to the interpreter or specified as a command line\nargument to the interpreter) is a code block. A script command (a\ncommand specified on the interpreter command line with the \'**-c**\'\noption) is a code block. The string argument passed to the built-in\nfunctions "eval()" and "exec()" is a code block.\n\nA code block is executed in an *execution frame*. A frame contains\nsome administrative information (used for debugging) and determines\nwhere and how execution continues after the code block\'s execution has\ncompleted.\n\n\nNaming and binding\n==================\n\n\nBinding of names\n----------------\n\n*Names* refer to objects. Names are introduced by name binding\noperations.\n\nThe following constructs bind names: formal parameters to functions,\n"import" statements, class and function definitions (these bind the\nclass or function name in the defining block), and targets that are\nidentifiers if occurring in an assignment, "for" loop header, or after\n"as" in a "with" statement or "except" clause. The "import" statement\nof the form "from ... import *" binds all names defined in the\nimported module, except those beginning with an underscore. This form\nmay only be used at the module level.\n\nA target occurring in a "del" statement is also considered bound for\nthis purpose (though the actual semantics are to unbind the name).\n\nEach assignment or import statement occurs within a block defined by a\nclass or function definition or at the module level (the top-level\ncode block).\n\nIf a name is bound in a block, it is a local variable of that block,\nunless declared as "nonlocal" or "global". If a name is bound at the\nmodule level, it is a global variable. (The variables of the module\ncode block are local and global.) If a variable is used in a code\nblock but not defined there, it is a *free variable*.\n\nEach occurrence of a name in the program text refers to the *binding*\nof that name established by the following name resolution rules.\n\n\nResolution of names\n-------------------\n\nA *scope* defines the visibility of a name within a block. If a local\nvariable is defined in a block, its scope includes that block. If the\ndefinition occurs in a function block, the scope extends to any blocks\ncontained within the defining one, unless a contained block introduces\na different binding for the name.\n\nWhen a name is used in a code block, it is resolved using the nearest\nenclosing scope. The set of all such scopes visible to a code block\nis called the block\'s *environment*.\n\nWhen a name is not found at all, a "NameError" exception is raised. If\nthe current scope is a function scope, and the name refers to a local\nvariable that has not yet been bound to a value at the point where the\nname is used, an "UnboundLocalError" exception is raised.\n"UnboundLocalError" is a subclass of "NameError".\n\nIf a name binding operation occurs anywhere within a code block, all\nuses of the name within the block are treated as references to the\ncurrent block. This can lead to errors when a name is used within a\nblock before it is bound. This rule is subtle. Python lacks\ndeclarations and allows name binding operations to occur anywhere\nwithin a code block. The local variables of a code block can be\ndetermined by scanning the entire text of the block for name binding\noperations.\n\nIf the "global" statement occurs within a block, all uses of the name\nspecified in the statement refer to the binding of that name in the\ntop-level namespace. Names are resolved in the top-level namespace by\nsearching the global namespace, i.e. the namespace of the module\ncontaining the code block, and the builtins namespace, the namespace\nof the module "builtins". The global namespace is searched first. If\nthe name is not found there, the builtins namespace is searched. The\n"global" statement must precede all uses of the name.\n\nThe "global" statement has the same scope as a name binding operation\nin the same block. If the nearest enclosing scope for a free variable\ncontains a global statement, the free variable is treated as a global.\n\nThe "nonlocal" statement causes corresponding names to refer to\npreviously bound variables in the nearest enclosing function scope.\n"SyntaxError" is raised at compile time if the given name does not\nexist in any enclosing function scope.\n\nThe namespace for a module is automatically created the first time a\nmodule is imported. The main module for a script is always called\n"__main__".\n\nClass definition blocks and arguments to "exec()" and "eval()" are\nspecial in the context of name resolution. A class definition is an\nexecutable statement that may use and define names. These references\nfollow the normal rules for name resolution with an exception that\nunbound local variables are looked up in the global namespace. The\nnamespace of the class definition becomes the attribute dictionary of\nthe class. The scope of names defined in a class block is limited to\nthe class block; it does not extend to the code blocks of methods --\nthis includes comprehensions and generator expressions since they are\nimplemented using a function scope. This means that the following\nwill fail:\n\n class A:\n a = 42\n b = list(a + i for i in range(10))\n\n\nBuiltins and restricted execution\n---------------------------------\n\nThe builtins namespace associated with the execution of a code block\nis actually found by looking up the name "__builtins__" in its global\nnamespace; this should be a dictionary or a module (in the latter case\nthe module\'s dictionary is used). By default, when in the "__main__"\nmodule, "__builtins__" is the built-in module "builtins"; when in any\nother module, "__builtins__" is an alias for the dictionary of the\n"builtins" module itself. "__builtins__" can be set to a user-created\ndictionary to create a weak form of restricted execution.\n\n**CPython implementation detail:** Users should not touch\n"__builtins__"; it is strictly an implementation detail. Users\nwanting to override values in the builtins namespace should "import"\nthe "builtins" module and modify its attributes appropriately.\n\n\nInteraction with dynamic features\n---------------------------------\n\nName resolution of free variables occurs at runtime, not at compile\ntime. This means that the following code will print 42:\n\n i = 10\n def f():\n print(i)\n i = 42\n f()\n\nThe "eval()" and "exec()" functions do not have access to the full\nenvironment for resolving names. Names may be resolved in the local\nand global namespaces of the caller. Free variables are not resolved\nin the nearest enclosing namespace, but in the global namespace. [1]\nThe "exec()" and "eval()" functions have optional arguments to\noverride the global and local namespace. If only one namespace is\nspecified, it is used for both.\n\n\nExceptions\n==========\n\nExceptions are a means of breaking out of the normal flow of control\nof a code block in order to handle errors or other exceptional\nconditions. An exception is *raised* at the point where the error is\ndetected; it may be *handled* by the surrounding code block or by any\ncode block that directly or indirectly invoked the code block where\nthe error occurred.\n\nThe Python interpreter raises an exception when it detects a run-time\nerror (such as division by zero). A Python program can also\nexplicitly raise an exception with the "raise" statement. Exception\nhandlers are specified with the "try" ... "except" statement. The\n"finally" clause of such a statement can be used to specify cleanup\ncode which does not handle the exception, but is executed whether an\nexception occurred or not in the preceding code.\n\nPython uses the "termination" model of error handling: an exception\nhandler can find out what happened and continue execution at an outer\nlevel, but it cannot repair the cause of the error and retry the\nfailing operation (except by re-entering the offending piece of code\nfrom the top).\n\nWhen an exception is not handled at all, the interpreter terminates\nexecution of the program, or returns to its interactive main loop. In\neither case, it prints a stack backtrace, except when the exception is\n"SystemExit".\n\nExceptions are identified by class instances. The "except" clause is\nselected depending on the class of the instance: it must reference the\nclass of the instance or a base class thereof. The instance can be\nreceived by the handler and can carry additional information about the\nexceptional condition.\n\nNote: Exception messages are not part of the Python API. Their\n contents may change from one version of Python to the next without\n warning and should not be relied on by code which will run under\n multiple versions of the interpreter.\n\nSee also the description of the "try" statement in section *The try\nstatement* and "raise" statement in section *The raise statement*.\n\n-[ Footnotes ]-\n\n[1] This limitation occurs because the code that is executed by\n these operations is not available at the time the module is\n compiled.\n', + 'exprlists': u'\nExpression lists\n****************\n\n expression_list ::= expression ( "," expression )* [","]\n starred_list ::= starred_item ( "," starred_item )* [","]\n starred_expression ::= expression | ( starred_item "," )* [starred_item]\n starred_item ::= expression | "*" or_expr\n\nExcept when part of a list or set display, an expression list\ncontaining at least one comma yields a tuple. The length of the tuple\nis the number of expressions in the list. The expressions are\nevaluated from left to right.\n\nAn asterisk "*" denotes *iterable unpacking*. Its operand must be an\n*iterable*. The iterable is expanded into a sequence of items, which\nare included in the new tuple, list, or set, at the site of the\nunpacking.\n\nNew in version 3.5: Iterable unpacking in expression lists, originally\nproposed by **PEP 448**.\n\nThe trailing comma is required only to create a single tuple (a.k.a. a\n*singleton*); it is optional in all other cases. A single expression\nwithout a trailing comma doesn\'t create a tuple, but rather yields the\nvalue of that expression. (To create an empty tuple, use an empty pair\nof parentheses: "()".)\n', + 'floating': u'\nFloating point literals\n***********************\n\nFloating point literals are described by the following lexical\ndefinitions:\n\n floatnumber ::= pointfloat | exponentfloat\n pointfloat ::= [intpart] fraction | intpart "."\n exponentfloat ::= (intpart | pointfloat) exponent\n intpart ::= digit+\n fraction ::= "." digit+\n exponent ::= ("e" | "E") ["+" | "-"] digit+\n\nNote that the integer and exponent parts are always interpreted using\nradix 10. For example, "077e010" is legal, and denotes the same number\nas "77e10". The allowed range of floating point literals is\nimplementation-dependent. Some examples of floating point literals:\n\n 3.14 10. .001 1e100 3.14e-10 0e0\n\nNote that numeric literals do not include a sign; a phrase like "-1"\nis actually an expression composed of the unary operator "-" and the\nliteral "1".\n', + 'for': u'\nThe "for" statement\n*******************\n\nThe "for" statement is used to iterate over the elements of a sequence\n(such as a string, tuple or list) or other iterable object:\n\n for_stmt ::= "for" target_list "in" expression_list ":" suite\n ["else" ":" suite]\n\nThe expression list is evaluated once; it should yield an iterable\nobject. An iterator is created for the result of the\n"expression_list". The suite is then executed once for each item\nprovided by the iterator, in the order returned by the iterator. Each\nitem in turn is assigned to the target list using the standard rules\nfor assignments (see *Assignment statements*), and then the suite is\nexecuted. When the items are exhausted (which is immediately when the\nsequence is empty or an iterator raises a "StopIteration" exception),\nthe suite in the "else" clause, if present, is executed, and the loop\nterminates.\n\nA "break" statement executed in the first suite terminates the loop\nwithout executing the "else" clause\'s suite. A "continue" statement\nexecuted in the first suite skips the rest of the suite and continues\nwith the next item, or with the "else" clause if there is no next\nitem.\n\nThe for-loop makes assignments to the variables(s) in the target list.\nThis overwrites all previous assignments to those variables including\nthose made in the suite of the for-loop:\n\n for i in range(10):\n print(i)\n i = 5 # this will not affect the for-loop\n # because i will be overwritten with the next\n # index in the range\n\nNames in the target list are not deleted when the loop is finished,\nbut if the sequence is empty, they will not have been assigned to at\nall by the loop. Hint: the built-in function "range()" returns an\niterator of integers suitable to emulate the effect of Pascal\'s "for i\n:= a to b do"; e.g., "list(range(3))" returns the list "[0, 1, 2]".\n\nNote: There is a subtlety when the sequence is being modified by the\n loop (this can only occur for mutable sequences, i.e. lists). An\n internal counter is used to keep track of which item is used next,\n and this is incremented on each iteration. When this counter has\n reached the length of the sequence the loop terminates. This means\n that if the suite deletes the current (or a previous) item from the\n sequence, the next item will be skipped (since it gets the index of\n the current item which has already been treated). Likewise, if the\n suite inserts an item in the sequence before the current item, the\n current item will be treated again the next time through the loop.\n This can lead to nasty bugs that can be avoided by making a\n temporary copy using a slice of the whole sequence, e.g.,\n\n for x in a[:]:\n if x < 0: a.remove(x)\n', + 'formatstrings': u'\nFormat String Syntax\n********************\n\nThe "str.format()" method and the "Formatter" class share the same\nsyntax for format strings (although in the case of "Formatter",\nsubclasses can define their own format string syntax).\n\nFormat strings contain "replacement fields" surrounded by curly braces\n"{}". Anything that is not contained in braces is considered literal\ntext, which is copied unchanged to the output. If you need to include\na brace character in the literal text, it can be escaped by doubling:\n"{{" and "}}".\n\nThe grammar for a replacement field is as follows:\n\n replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"\n field_name ::= arg_name ("." attribute_name | "[" element_index "]")*\n arg_name ::= [identifier | integer]\n attribute_name ::= identifier\n element_index ::= integer | index_string\n index_string ::= +\n conversion ::= "r" | "s" | "a"\n format_spec ::= \n\nIn less formal terms, the replacement field can start with a\n*field_name* that specifies the object whose value is to be formatted\nand inserted into the output instead of the replacement field. The\n*field_name* is optionally followed by a *conversion* field, which is\npreceded by an exclamation point "\'!\'", and a *format_spec*, which is\npreceded by a colon "\':\'". These specify a non-default format for the\nreplacement value.\n\nSee also the *Format Specification Mini-Language* section.\n\nThe *field_name* itself begins with an *arg_name* that is either a\nnumber or a keyword. If it\'s a number, it refers to a positional\nargument, and if it\'s a keyword, it refers to a named keyword\nargument. If the numerical arg_names in a format string are 0, 1, 2,\n... in sequence, they can all be omitted (not just some) and the\nnumbers 0, 1, 2, ... will be automatically inserted in that order.\nBecause *arg_name* is not quote-delimited, it is not possible to\nspecify arbitrary dictionary keys (e.g., the strings "\'10\'" or\n"\':-]\'") within a format string. The *arg_name* can be followed by any\nnumber of index or attribute expressions. An expression of the form\n"\'.name\'" selects the named attribute using "getattr()", while an\nexpression of the form "\'[index]\'" does an index lookup using\n"__getitem__()".\n\nChanged in version 3.1: The positional argument specifiers can be\nomitted, so "\'{} {}\'" is equivalent to "\'{0} {1}\'".\n\nSome simple format string examples:\n\n "First, thou shalt count to {0}" # References first positional argument\n "Bring me a {}" # Implicitly references the first positional argument\n "From {} to {}" # Same as "From {0} to {1}"\n "My quest is {name}" # References keyword argument \'name\'\n "Weight in tons {0.weight}" # \'weight\' attribute of first positional arg\n "Units destroyed: {players[0]}" # First element of keyword argument \'players\'.\n\nThe *conversion* field causes a type coercion before formatting.\nNormally, the job of formatting a value is done by the "__format__()"\nmethod of the value itself. However, in some cases it is desirable to\nforce a type to be formatted as a string, overriding its own\ndefinition of formatting. By converting the value to a string before\ncalling "__format__()", the normal formatting logic is bypassed.\n\nThree conversion flags are currently supported: "\'!s\'" which calls\n"str()" on the value, "\'!r\'" which calls "repr()" and "\'!a\'" which\ncalls "ascii()".\n\nSome examples:\n\n "Harold\'s a clever {0!s}" # Calls str() on the argument first\n "Bring out the holy {name!r}" # Calls repr() on the argument first\n "More {!a}" # Calls ascii() on the argument first\n\nThe *format_spec* field contains a specification of how the value\nshould be presented, including such details as field width, alignment,\npadding, decimal precision and so on. Each value type can define its\nown "formatting mini-language" or interpretation of the *format_spec*.\n\nMost built-in types support a common formatting mini-language, which\nis described in the next section.\n\nA *format_spec* field can also include nested replacement fields\nwithin it. These nested replacement fields may contain a field name,\nconversion flag and format specification, but deeper nesting is not\nallowed. The replacement fields within the format_spec are\nsubstituted before the *format_spec* string is interpreted. This\nallows the formatting of a value to be dynamically specified.\n\nSee the *Format examples* section for some examples.\n\n\nFormat Specification Mini-Language\n==================================\n\n"Format specifications" are used within replacement fields contained\nwithin a format string to define how individual values are presented\n(see *Format String Syntax*). They can also be passed directly to the\nbuilt-in "format()" function. Each formattable type may define how\nthe format specification is to be interpreted.\n\nMost built-in types implement the following options for format\nspecifications, although some of the formatting options are only\nsupported by the numeric types.\n\nA general convention is that an empty format string ("""") produces\nthe same result as if you had called "str()" on the value. A non-empty\nformat string typically modifies the result.\n\nThe general form of a *standard format specifier* is:\n\n format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type]\n fill ::= \n align ::= "<" | ">" | "=" | "^"\n sign ::= "+" | "-" | " "\n width ::= integer\n precision ::= integer\n type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"\n\nIf a valid *align* value is specified, it can be preceded by a *fill*\ncharacter that can be any character and defaults to a space if\nomitted. It is not possible to use a literal curly brace (""{"" or\n""}"") as the *fill* character when using the "str.format()" method.\nHowever, it is possible to insert a curly brace with a nested\nreplacement field. This limitation doesn\'t affect the "format()"\nfunction.\n\nThe meaning of the various alignment options is as follows:\n\n +-----------+------------------------------------------------------------+\n | Option | Meaning |\n +===========+============================================================+\n | "\'<\'" | Forces the field to be left-aligned within the available |\n | | space (this is the default for most objects). |\n +-----------+------------------------------------------------------------+\n | "\'>\'" | Forces the field to be right-aligned within the available |\n | | space (this is the default for numbers). |\n +-----------+------------------------------------------------------------+\n | "\'=\'" | Forces the padding to be placed after the sign (if any) |\n | | but before the digits. This is used for printing fields |\n | | in the form \'+000000120\'. This alignment option is only |\n | | valid for numeric types. It becomes the default when \'0\' |\n | | immediately precedes the field width. |\n +-----------+------------------------------------------------------------+\n | "\'^\'" | Forces the field to be centered within the available |\n | | space. |\n +-----------+------------------------------------------------------------+\n\nNote that unless a minimum field width is defined, the field width\nwill always be the same size as the data to fill it, so that the\nalignment option has no meaning in this case.\n\nThe *sign* option is only valid for number types, and can be one of\nthe following:\n\n +-----------+------------------------------------------------------------+\n | Option | Meaning |\n +===========+============================================================+\n | "\'+\'" | indicates that a sign should be used for both positive as |\n | | well as negative numbers. |\n +-----------+------------------------------------------------------------+\n | "\'-\'" | indicates that a sign should be used only for negative |\n | | numbers (this is the default behavior). |\n +-----------+------------------------------------------------------------+\n | space | indicates that a leading space should be used on positive |\n | | numbers, and a minus sign on negative numbers. |\n +-----------+------------------------------------------------------------+\n\nThe "\'#\'" option causes the "alternate form" to be used for the\nconversion. The alternate form is defined differently for different\ntypes. This option is only valid for integer, float, complex and\nDecimal types. For integers, when binary, octal, or hexadecimal output\nis used, this option adds the prefix respective "\'0b\'", "\'0o\'", or\n"\'0x\'" to the output value. For floats, complex and Decimal the\nalternate form causes the result of the conversion to always contain a\ndecimal-point character, even if no digits follow it. Normally, a\ndecimal-point character appears in the result of these conversions\nonly if a digit follows it. In addition, for "\'g\'" and "\'G\'"\nconversions, trailing zeros are not removed from the result.\n\nThe "\',\'" option signals the use of a comma for a thousands separator.\nFor a locale aware separator, use the "\'n\'" integer presentation type\ninstead.\n\nChanged in version 3.1: Added the "\',\'" option (see also **PEP 378**).\n\n*width* is a decimal integer defining the minimum field width. If not\nspecified, then the field width will be determined by the content.\n\nWhen no explicit alignment is given, preceding the *width* field by a\nzero ("\'0\'") character enables sign-aware zero-padding for numeric\ntypes. This is equivalent to a *fill* character of "\'0\'" with an\n*alignment* type of "\'=\'".\n\nThe *precision* is a decimal number indicating how many digits should\nbe displayed after the decimal point for a floating point value\nformatted with "\'f\'" and "\'F\'", or before and after the decimal point\nfor a floating point value formatted with "\'g\'" or "\'G\'". For non-\nnumber types the field indicates the maximum field size - in other\nwords, how many characters will be used from the field content. The\n*precision* is not allowed for integer values.\n\nFinally, the *type* determines how the data should be presented.\n\nThe available string presentation types are:\n\n +-----------+------------------------------------------------------------+\n | Type | Meaning |\n +===========+============================================================+\n | "\'s\'" | String format. This is the default type for strings and |\n | | may be omitted. |\n +-----------+------------------------------------------------------------+\n | None | The same as "\'s\'". |\n +-----------+------------------------------------------------------------+\n\nThe available integer presentation types are:\n\n +-----------+------------------------------------------------------------+\n | Type | Meaning |\n +===========+============================================================+\n | "\'b\'" | Binary format. Outputs the number in base 2. |\n +-----------+------------------------------------------------------------+\n | "\'c\'" | Character. Converts the integer to the corresponding |\n | | unicode character before printing. |\n +-----------+------------------------------------------------------------+\n | "\'d\'" | Decimal Integer. Outputs the number in base 10. |\n +-----------+------------------------------------------------------------+\n | "\'o\'" | Octal format. Outputs the number in base 8. |\n +-----------+------------------------------------------------------------+\n | "\'x\'" | Hex format. Outputs the number in base 16, using lower- |\n | | case letters for the digits above 9. |\n +-----------+------------------------------------------------------------+\n | "\'X\'" | Hex format. Outputs the number in base 16, using upper- |\n | | case letters for the digits above 9. |\n +-----------+------------------------------------------------------------+\n | "\'n\'" | Number. This is the same as "\'d\'", except that it uses the |\n | | current locale setting to insert the appropriate number |\n | | separator characters. |\n +-----------+------------------------------------------------------------+\n | None | The same as "\'d\'". |\n +-----------+------------------------------------------------------------+\n\nIn addition to the above presentation types, integers can be formatted\nwith the floating point presentation types listed below (except "\'n\'"\nand "None"). When doing so, "float()" is used to convert the integer\nto a floating point number before formatting.\n\nThe available presentation types for floating point and decimal values\nare:\n\n +-----------+------------------------------------------------------------+\n | Type | Meaning |\n +===========+============================================================+\n | "\'e\'" | Exponent notation. Prints the number in scientific |\n | | notation using the letter \'e\' to indicate the exponent. |\n | | The default precision is "6". |\n +-----------+------------------------------------------------------------+\n | "\'E\'" | Exponent notation. Same as "\'e\'" except it uses an upper |\n | | case \'E\' as the separator character. |\n +-----------+------------------------------------------------------------+\n | "\'f\'" | Fixed point. Displays the number as a fixed-point number. |\n | | The default precision is "6". |\n +-----------+------------------------------------------------------------+\n | "\'F\'" | Fixed point. Same as "\'f\'", but converts "nan" to "NAN" |\n | | and "inf" to "INF". |\n +-----------+------------------------------------------------------------+\n | "\'g\'" | General format. For a given precision "p >= 1", this |\n | | rounds the number to "p" significant digits and then |\n | | formats the result in either fixed-point format or in |\n | | scientific notation, depending on its magnitude. The |\n | | precise rules are as follows: suppose that the result |\n | | formatted with presentation type "\'e\'" and precision "p-1" |\n | | would have exponent "exp". Then if "-4 <= exp < p", the |\n | | number is formatted with presentation type "\'f\'" and |\n | | precision "p-1-exp". Otherwise, the number is formatted |\n | | with presentation type "\'e\'" and precision "p-1". In both |\n | | cases insignificant trailing zeros are removed from the |\n | | significand, and the decimal point is also removed if |\n | | there are no remaining digits following it. Positive and |\n | | negative infinity, positive and negative zero, and nans, |\n | | are formatted as "inf", "-inf", "0", "-0" and "nan" |\n | | respectively, regardless of the precision. A precision of |\n | | "0" is treated as equivalent to a precision of "1". The |\n | | default precision is "6". |\n +-----------+------------------------------------------------------------+\n | "\'G\'" | General format. Same as "\'g\'" except switches to "\'E\'" if |\n | | the number gets too large. The representations of infinity |\n | | and NaN are uppercased, too. |\n +-----------+------------------------------------------------------------+\n | "\'n\'" | Number. This is the same as "\'g\'", except that it uses the |\n | | current locale setting to insert the appropriate number |\n | | separator characters. |\n +-----------+------------------------------------------------------------+\n | "\'%\'" | Percentage. Multiplies the number by 100 and displays in |\n | | fixed ("\'f\'") format, followed by a percent sign. |\n +-----------+------------------------------------------------------------+\n | None | Similar to "\'g\'", except that fixed-point notation, when |\n | | used, has at least one digit past the decimal point. The |\n | | default precision is as high as needed to represent the |\n | | particular value. The overall effect is to match the |\n | | output of "str()" as altered by the other format |\n | | modifiers. |\n +-----------+------------------------------------------------------------+\n\n\nFormat examples\n===============\n\nThis section contains examples of the "str.format()" syntax and\ncomparison with the old "%"-formatting.\n\nIn most of the cases the syntax is similar to the old "%"-formatting,\nwith the addition of the "{}" and with ":" used instead of "%". For\nexample, "\'%03.2f\'" can be translated to "\'{:03.2f}\'".\n\nThe new format syntax also supports new and different options, shown\nin the follow examples.\n\nAccessing arguments by position:\n\n >>> \'{0}, {1}, {2}\'.format(\'a\', \'b\', \'c\')\n \'a, b, c\'\n >>> \'{}, {}, {}\'.format(\'a\', \'b\', \'c\') # 3.1+ only\n \'a, b, c\'\n >>> \'{2}, {1}, {0}\'.format(\'a\', \'b\', \'c\')\n \'c, b, a\'\n >>> \'{2}, {1}, {0}\'.format(*\'abc\') # unpacking argument sequence\n \'c, b, a\'\n >>> \'{0}{1}{0}\'.format(\'abra\', \'cad\') # arguments\' indices can be repeated\n \'abracadabra\'\n\nAccessing arguments by name:\n\n >>> \'Coordinates: {latitude}, {longitude}\'.format(latitude=\'37.24N\', longitude=\'-115.81W\')\n \'Coordinates: 37.24N, -115.81W\'\n >>> coord = {\'latitude\': \'37.24N\', \'longitude\': \'-115.81W\'}\n >>> \'Coordinates: {latitude}, {longitude}\'.format(**coord)\n \'Coordinates: 37.24N, -115.81W\'\n\nAccessing arguments\' attributes:\n\n >>> c = 3-5j\n >>> (\'The complex number {0} is formed from the real part {0.real} \'\n ... \'and the imaginary part {0.imag}.\').format(c)\n \'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.\'\n >>> class Point:\n ... def __init__(self, x, y):\n ... self.x, self.y = x, y\n ... def __str__(self):\n ... return \'Point({self.x}, {self.y})\'.format(self=self)\n ...\n >>> str(Point(4, 2))\n \'Point(4, 2)\'\n\nAccessing arguments\' items:\n\n >>> coord = (3, 5)\n >>> \'X: {0[0]}; Y: {0[1]}\'.format(coord)\n \'X: 3; Y: 5\'\n\nReplacing "%s" and "%r":\n\n >>> "repr() shows quotes: {!r}; str() doesn\'t: {!s}".format(\'test1\', \'test2\')\n "repr() shows quotes: \'test1\'; str() doesn\'t: test2"\n\nAligning the text and specifying a width:\n\n >>> \'{:<30}\'.format(\'left aligned\')\n \'left aligned \'\n >>> \'{:>30}\'.format(\'right aligned\')\n \' right aligned\'\n >>> \'{:^30}\'.format(\'centered\')\n \' centered \'\n >>> \'{:*^30}\'.format(\'centered\') # use \'*\' as a fill char\n \'***********centered***********\'\n\nReplacing "%+f", "%-f", and "% f" and specifying a sign:\n\n >>> \'{:+f}; {:+f}\'.format(3.14, -3.14) # show it always\n \'+3.140000; -3.140000\'\n >>> \'{: f}; {: f}\'.format(3.14, -3.14) # show a space for positive numbers\n \' 3.140000; -3.140000\'\n >>> \'{:-f}; {:-f}\'.format(3.14, -3.14) # show only the minus -- same as \'{:f}; {:f}\'\n \'3.140000; -3.140000\'\n\nReplacing "%x" and "%o" and converting the value to different bases:\n\n >>> # format also supports binary numbers\n >>> "int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}".format(42)\n \'int: 42; hex: 2a; oct: 52; bin: 101010\'\n >>> # with 0x, 0o, or 0b as prefix:\n >>> "int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}".format(42)\n \'int: 42; hex: 0x2a; oct: 0o52; bin: 0b101010\'\n\nUsing the comma as a thousands separator:\n\n >>> \'{:,}\'.format(1234567890)\n \'1,234,567,890\'\n\nExpressing a percentage:\n\n >>> points = 19\n >>> total = 22\n >>> \'Correct answers: {:.2%}\'.format(points/total)\n \'Correct answers: 86.36%\'\n\nUsing type-specific formatting:\n\n >>> import datetime\n >>> d = datetime.datetime(2010, 7, 4, 12, 15, 58)\n >>> \'{:%Y-%m-%d %H:%M:%S}\'.format(d)\n \'2010-07-04 12:15:58\'\n\nNesting arguments and more complex examples:\n\n >>> for align, text in zip(\'<^>\', [\'left\', \'center\', \'right\']):\n ... \'{0:{fill}{align}16}\'.format(text, fill=align, align=align)\n ...\n \'left<<<<<<<<<<<<\'\n \'^^^^^center^^^^^\'\n \'>>>>>>>>>>>right\'\n >>>\n >>> octets = [192, 168, 0, 1]\n >>> \'{:02X}{:02X}{:02X}{:02X}\'.format(*octets)\n \'C0A80001\'\n >>> int(_, 16)\n 3232235521\n >>>\n >>> width = 5\n >>> for num in range(5,12): #doctest: +NORMALIZE_WHITESPACE\n ... for base in \'dXob\':\n ... print(\'{0:{width}{base}}\'.format(num, base=base, width=width), end=\' \')\n ... print()\n ...\n 5 5 5 101\n 6 6 6 110\n 7 7 7 111\n 8 8 10 1000\n 9 9 11 1001\n 10 A 12 1010\n 11 B 13 1011\n', + 'function': u'\nFunction definitions\n********************\n\nA function definition defines a user-defined function object (see\nsection *The standard type hierarchy*):\n\n funcdef ::= [decorators] "def" funcname "(" [parameter_list] ")" ["->" expression] ":" suite\n decorators ::= decorator+\n decorator ::= "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE\n dotted_name ::= identifier ("." identifier)*\n parameter_list ::= (defparameter ",")*\n | "*" [parameter] ("," defparameter)* ["," "**" parameter]\n | "**" parameter\n | defparameter [","] )\n parameter ::= identifier [":" expression]\n defparameter ::= parameter ["=" expression]\n funcname ::= identifier\n\nA function definition is an executable statement. Its execution binds\nthe function name in the current local namespace to a function object\n(a wrapper around the executable code for the function). This\nfunction object contains a reference to the current global namespace\nas the global namespace to be used when the function is called.\n\nThe function definition does not execute the function body; this gets\nexecuted only when the function is called. [3]\n\nA function definition may be wrapped by one or more *decorator*\nexpressions. Decorator expressions are evaluated when the function is\ndefined, in the scope that contains the function definition. The\nresult must be a callable, which is invoked with the function object\nas the only argument. The returned value is bound to the function name\ninstead of the function object. Multiple decorators are applied in\nnested fashion. For example, the following code\n\n @f1(arg)\n @f2\n def func(): pass\n\nis roughly equivalent to\n\n def func(): pass\n func = f1(arg)(f2(func))\n\nexcept that the original function is not temporarily bound to the name\n"func".\n\nWhen one or more *parameters* have the form *parameter* "="\n*expression*, the function is said to have "default parameter values."\nFor a parameter with a default value, the corresponding *argument* may\nbe omitted from a call, in which case the parameter\'s default value is\nsubstituted. If a parameter has a default value, all following\nparameters up until the ""*"" must also have a default value --- this\nis a syntactic restriction that is not expressed by the grammar.\n\n**Default parameter values are evaluated from left to right when the\nfunction definition is executed.** This means that the expression is\nevaluated once, when the function is defined, and that the same "pre-\ncomputed" value is used for each call. This is especially important\nto understand when a default parameter is a mutable object, such as a\nlist or a dictionary: if the function modifies the object (e.g. by\nappending an item to a list), the default value is in effect modified.\nThis is generally not what was intended. A way around this is to use\n"None" as the default, and explicitly test for it in the body of the\nfunction, e.g.:\n\n def whats_on_the_telly(penguin=None):\n if penguin is None:\n penguin = []\n penguin.append("property of the zoo")\n return penguin\n\nFunction call semantics are described in more detail in section\n*Calls*. A function call always assigns values to all parameters\nmentioned in the parameter list, either from position arguments, from\nkeyword arguments, or from default values. If the form\n""*identifier"" is present, it is initialized to a tuple receiving any\nexcess positional parameters, defaulting to the empty tuple. If the\nform ""**identifier"" is present, it is initialized to a new\ndictionary receiving any excess keyword arguments, defaulting to a new\nempty dictionary. Parameters after ""*"" or ""*identifier"" are\nkeyword-only parameters and may only be passed used keyword arguments.\n\nParameters may have annotations of the form "": expression"" following\nthe parameter name. Any parameter may have an annotation even those\nof the form "*identifier" or "**identifier". Functions may have\n"return" annotation of the form ""-> expression"" after the parameter\nlist. These annotations can be any valid Python expression and are\nevaluated when the function definition is executed. Annotations may\nbe evaluated in a different order than they appear in the source code.\nThe presence of annotations does not change the semantics of a\nfunction. The annotation values are available as values of a\ndictionary keyed by the parameters\' names in the "__annotations__"\nattribute of the function object.\n\nIt is also possible to create anonymous functions (functions not bound\nto a name), for immediate use in expressions. This uses lambda\nexpressions, described in section *Lambdas*. Note that the lambda\nexpression is merely a shorthand for a simplified function definition;\na function defined in a ""def"" statement can be passed around or\nassigned to another name just like a function defined by a lambda\nexpression. The ""def"" form is actually more powerful since it\nallows the execution of multiple statements and annotations.\n\n**Programmer\'s note:** Functions are first-class objects. A ""def""\nstatement executed inside a function definition defines a local\nfunction that can be returned or passed around. Free variables used\nin the nested function can access the local variables of the function\ncontaining the def. See section *Naming and binding* for details.\n\nSee also: **PEP 3107** - Function Annotations\n\n The original specification for function annotations.\n', + 'global': u'\nThe "global" statement\n**********************\n\n global_stmt ::= "global" identifier ("," identifier)*\n\nThe "global" statement is a declaration which holds for the entire\ncurrent code block. It means that the listed identifiers are to be\ninterpreted as globals. It would be impossible to assign to a global\nvariable without "global", although free variables may refer to\nglobals without being declared global.\n\nNames listed in a "global" statement must not be used in the same code\nblock textually preceding that "global" statement.\n\nNames listed in a "global" statement must not be defined as formal\nparameters or in a "for" loop control target, "class" definition,\nfunction definition, or "import" statement.\n\n**CPython implementation detail:** The current implementation does not\nenforce the two restrictions, but programs should not abuse this\nfreedom, as future implementations may enforce them or silently change\nthe meaning of the program.\n\n**Programmer\'s note:** "global" is a directive to the parser. It\napplies only to code parsed at the same time as the "global"\nstatement. In particular, a "global" statement contained in a string\nor code object supplied to the built-in "exec()" function does not\naffect the code block *containing* the function call, and code\ncontained in such a string is unaffected by "global" statements in the\ncode containing the function call. The same applies to the "eval()"\nand "compile()" functions.\n', + 'id-classes': u'\nReserved classes of identifiers\n*******************************\n\nCertain classes of identifiers (besides keywords) have special\nmeanings. These classes are identified by the patterns of leading and\ntrailing underscore characters:\n\n"_*"\n Not imported by "from module import *". The special identifier "_"\n is used in the interactive interpreter to store the result of the\n last evaluation; it is stored in the "builtins" module. When not\n in interactive mode, "_" has no special meaning and is not defined.\n See section *The import statement*.\n\n Note: The name "_" is often used in conjunction with\n internationalization; refer to the documentation for the\n "gettext" module for more information on this convention.\n\n"__*__"\n System-defined names. These names are defined by the interpreter\n and its implementation (including the standard library). Current\n system names are discussed in the *Special method names* section\n and elsewhere. More will likely be defined in future versions of\n Python. *Any* use of "__*__" names, in any context, that does not\n follow explicitly documented use, is subject to breakage without\n warning.\n\n"__*"\n Class-private names. Names in this category, when used within the\n context of a class definition, are re-written to use a mangled form\n to help avoid name clashes between "private" attributes of base and\n derived classes. See section *Identifiers (Names)*.\n', + 'identifiers': u'\nIdentifiers and keywords\n************************\n\nIdentifiers (also referred to as *names*) are described by the\nfollowing lexical definitions.\n\nThe syntax of identifiers in Python is based on the Unicode standard\nannex UAX-31, with elaboration and changes as defined below; see also\n**PEP 3131** for further details.\n\nWithin the ASCII range (U+0001..U+007F), the valid characters for\nidentifiers are the same as in Python 2.x: the uppercase and lowercase\nletters "A" through "Z", the underscore "_" and, except for the first\ncharacter, the digits "0" through "9".\n\nPython 3.0 introduces additional characters from outside the ASCII\nrange (see **PEP 3131**). For these characters, the classification\nuses the version of the Unicode Character Database as included in the\n"unicodedata" module.\n\nIdentifiers are unlimited in length. Case is significant.\n\n identifier ::= xid_start xid_continue*\n id_start ::= \n id_continue ::= \n xid_start ::= \n xid_continue ::= \n\nThe Unicode category codes mentioned above stand for:\n\n* *Lu* - uppercase letters\n\n* *Ll* - lowercase letters\n\n* *Lt* - titlecase letters\n\n* *Lm* - modifier letters\n\n* *Lo* - other letters\n\n* *Nl* - letter numbers\n\n* *Mn* - nonspacing marks\n\n* *Mc* - spacing combining marks\n\n* *Nd* - decimal numbers\n\n* *Pc* - connector punctuations\n\n* *Other_ID_Start* - explicit list of characters in PropList.txt to\n support backwards compatibility\n\n* *Other_ID_Continue* - likewise\n\nAll identifiers are converted into the normal form NFKC while parsing;\ncomparison of identifiers is based on NFKC.\n\nA non-normative HTML file listing all valid identifier characters for\nUnicode 4.1 can be found at https://www.dcl.hpi.uni-\npotsdam.de/home/loewis/table-3131.html.\n\n\nKeywords\n========\n\nThe following identifiers are used as reserved words, or *keywords* of\nthe language, and cannot be used as ordinary identifiers. They must\nbe spelled exactly as written here:\n\n False class finally is return\n None continue for lambda try\n True def from nonlocal while\n and del global not with\n as elif if or yield\n assert else import pass\n break except in raise\n\n\nReserved classes of identifiers\n===============================\n\nCertain classes of identifiers (besides keywords) have special\nmeanings. These classes are identified by the patterns of leading and\ntrailing underscore characters:\n\n"_*"\n Not imported by "from module import *". The special identifier "_"\n is used in the interactive interpreter to store the result of the\n last evaluation; it is stored in the "builtins" module. When not\n in interactive mode, "_" has no special meaning and is not defined.\n See section *The import statement*.\n\n Note: The name "_" is often used in conjunction with\n internationalization; refer to the documentation for the\n "gettext" module for more information on this convention.\n\n"__*__"\n System-defined names. These names are defined by the interpreter\n and its implementation (including the standard library). Current\n system names are discussed in the *Special method names* section\n and elsewhere. More will likely be defined in future versions of\n Python. *Any* use of "__*__" names, in any context, that does not\n follow explicitly documented use, is subject to breakage without\n warning.\n\n"__*"\n Class-private names. Names in this category, when used within the\n context of a class definition, are re-written to use a mangled form\n to help avoid name clashes between "private" attributes of base and\n derived classes. See section *Identifiers (Names)*.\n', + 'if': u'\nThe "if" statement\n******************\n\nThe "if" statement is used for conditional execution:\n\n if_stmt ::= "if" expression ":" suite\n ( "elif" expression ":" suite )*\n ["else" ":" suite]\n\nIt selects exactly one of the suites by evaluating the expressions one\nby one until one is found to be true (see section *Boolean operations*\nfor the definition of true and false); then that suite is executed\n(and no other part of the "if" statement is executed or evaluated).\nIf all expressions are false, the suite of the "else" clause, if\npresent, is executed.\n', + 'imaginary': u'\nImaginary literals\n******************\n\nImaginary literals are described by the following lexical definitions:\n\n imagnumber ::= (floatnumber | intpart) ("j" | "J")\n\nAn imaginary literal yields a complex number with a real part of 0.0.\nComplex numbers are represented as a pair of floating point numbers\nand have the same restrictions on their range. To create a complex\nnumber with a nonzero real part, add a floating point number to it,\ne.g., "(3+4j)". Some examples of imaginary literals:\n\n 3.14j 10.j 10j .001j 1e100j 3.14e-10j\n', + 'import': u'\nThe "import" statement\n**********************\n\n import_stmt ::= "import" module ["as" name] ( "," module ["as" name] )*\n | "from" relative_module "import" identifier ["as" name]\n ( "," identifier ["as" name] )*\n | "from" relative_module "import" "(" identifier ["as" name]\n ( "," identifier ["as" name] )* [","] ")"\n | "from" module "import" "*"\n module ::= (identifier ".")* identifier\n relative_module ::= "."* module | "."+\n name ::= identifier\n\nThe basic import statement (no "from" clause) is executed in two\nsteps:\n\n1. find a module, loading and initializing it if necessary\n\n2. define a name or names in the local namespace for the scope\n where the "import" statement occurs.\n\nWhen the statement contains multiple clauses (separated by commas) the\ntwo steps are carried out separately for each clause, just as though\nthe clauses had been separated out into individual import statements.\n\nThe details of the first step, finding and loading modules are\ndescribed in greater detail in the section on the *import system*,\nwhich also describes the various types of packages and modules that\ncan be imported, as well as all the hooks that can be used to\ncustomize the import system. Note that failures in this step may\nindicate either that the module could not be located, *or* that an\nerror occurred while initializing the module, which includes execution\nof the module\'s code.\n\nIf the requested module is retrieved successfully, it will be made\navailable in the local namespace in one of three ways:\n\n* If the module name is followed by "as", then the name following\n "as" is bound directly to the imported module.\n\n* If no other name is specified, and the module being imported is a\n top level module, the module\'s name is bound in the local namespace\n as a reference to the imported module\n\n* If the module being imported is *not* a top level module, then the\n name of the top level package that contains the module is bound in\n the local namespace as a reference to the top level package. The\n imported module must be accessed using its full qualified name\n rather than directly\n\nThe "from" form uses a slightly more complex process:\n\n1. find the module specified in the "from" clause, loading and\n initializing it if necessary;\n\n2. for each of the identifiers specified in the "import" clauses:\n\n 1. check if the imported module has an attribute by that name\n\n 2. if not, attempt to import a submodule with that name and then\n check the imported module again for that attribute\n\n 3. if the attribute is not found, "ImportError" is raised.\n\n 4. otherwise, a reference to that value is stored in the local\n namespace, using the name in the "as" clause if it is present,\n otherwise using the attribute name\n\nExamples:\n\n import foo # foo imported and bound locally\n import foo.bar.baz # foo.bar.baz imported, foo bound locally\n import foo.bar.baz as fbb # foo.bar.baz imported and bound as fbb\n from foo.bar import baz # foo.bar.baz imported and bound as baz\n from foo import attr # foo imported and foo.attr bound as attr\n\nIf the list of identifiers is replaced by a star ("\'*\'"), all public\nnames defined in the module are bound in the local namespace for the\nscope where the "import" statement occurs.\n\nThe *public names* defined by a module are determined by checking the\nmodule\'s namespace for a variable named "__all__"; if defined, it must\nbe a sequence of strings which are names defined or imported by that\nmodule. The names given in "__all__" are all considered public and\nare required to exist. If "__all__" is not defined, the set of public\nnames includes all names found in the module\'s namespace which do not\nbegin with an underscore character ("\'_\'"). "__all__" should contain\nthe entire public API. It is intended to avoid accidentally exporting\nitems that are not part of the API (such as library modules which were\nimported and used within the module).\n\nThe wild card form of import --- "from module import *" --- is only\nallowed at the module level. Attempting to use it in class or\nfunction definitions will raise a "SyntaxError".\n\nWhen specifying what module to import you do not have to specify the\nabsolute name of the module. When a module or package is contained\nwithin another package it is possible to make a relative import within\nthe same top package without having to mention the package name. By\nusing leading dots in the specified module or package after "from" you\ncan specify how high to traverse up the current package hierarchy\nwithout specifying exact names. One leading dot means the current\npackage where the module making the import exists. Two dots means up\none package level. Three dots is up two levels, etc. So if you execute\n"from . import mod" from a module in the "pkg" package then you will\nend up importing "pkg.mod". If you execute "from ..subpkg2 import mod"\nfrom within "pkg.subpkg1" you will import "pkg.subpkg2.mod". The\nspecification for relative imports is contained within **PEP 328**.\n\n"importlib.import_module()" is provided to support applications that\ndetermine dynamically the modules to be loaded.\n\n\nFuture statements\n=================\n\nA *future statement* is a directive to the compiler that a particular\nmodule should be compiled using syntax or semantics that will be\navailable in a specified future release of Python where the feature\nbecomes standard.\n\nThe future statement is intended to ease migration to future versions\nof Python that introduce incompatible changes to the language. It\nallows use of the new features on a per-module basis before the\nrelease in which the feature becomes standard.\n\n future_statement ::= "from" "__future__" "import" feature ["as" name]\n ("," feature ["as" name])*\n | "from" "__future__" "import" "(" feature ["as" name]\n ("," feature ["as" name])* [","] ")"\n feature ::= identifier\n name ::= identifier\n\nA future statement must appear near the top of the module. The only\nlines that can appear before a future statement are:\n\n* the module docstring (if any),\n\n* comments,\n\n* blank lines, and\n\n* other future statements.\n\nThe features recognized by Python 3.0 are "absolute_import",\n"division", "generators", "unicode_literals", "print_function",\n"nested_scopes" and "with_statement". They are all redundant because\nthey are always enabled, and only kept for backwards compatibility.\n\nA future statement is recognized and treated specially at compile\ntime: Changes to the semantics of core constructs are often\nimplemented by generating different code. It may even be the case\nthat a new feature introduces new incompatible syntax (such as a new\nreserved word), in which case the compiler may need to parse the\nmodule differently. Such decisions cannot be pushed off until\nruntime.\n\nFor any given release, the compiler knows which feature names have\nbeen defined, and raises a compile-time error if a future statement\ncontains a feature not known to it.\n\nThe direct runtime semantics are the same as for any import statement:\nthere is a standard module "__future__", described later, and it will\nbe imported in the usual way at the time the future statement is\nexecuted.\n\nThe interesting runtime semantics depend on the specific feature\nenabled by the future statement.\n\nNote that there is nothing special about the statement:\n\n import __future__ [as name]\n\nThat is not a future statement; it\'s an ordinary import statement with\nno special semantics or syntax restrictions.\n\nCode compiled by calls to the built-in functions "exec()" and\n"compile()" that occur in a module "M" containing a future statement\nwill, by default, use the new syntax or semantics associated with the\nfuture statement. This can be controlled by optional arguments to\n"compile()" --- see the documentation of that function for details.\n\nA future statement typed at an interactive interpreter prompt will\ntake effect for the rest of the interpreter session. If an\ninterpreter is started with the *-i* option, is passed a script name\nto execute, and the script includes a future statement, it will be in\neffect in the interactive session started after the script is\nexecuted.\n\nSee also: **PEP 236** - Back to the __future__\n\n The original proposal for the __future__ mechanism.\n', + 'in': u'\nMembership test operations\n**************************\n\nThe operators "in" and "not in" test for membership. "x in s"\nevaluates to "True" if *x* is a member of *s*, and "False" otherwise.\n"x not in s" returns the negation of "x in s". All built-in sequences\nand set types support this as well as dictionary, for which "in" tests\nwhether the dictionary has a given key. For container types such as\nlist, tuple, set, frozenset, dict, or collections.deque, the\nexpression "x in y" is equivalent to "any(x is e or x == e for e in\ny)".\n\nFor the string and bytes types, "x in y" is "True" if and only if *x*\nis a substring of *y*. An equivalent test is "y.find(x) != -1".\nEmpty strings are always considered to be a substring of any other\nstring, so """ in "abc"" will return "True".\n\nFor user-defined classes which define the "__contains__()" method, "x\nin y" returns "True" if "y.__contains__(x)" returns a true value, and\n"False" otherwise.\n\nFor user-defined classes which do not define "__contains__()" but do\ndefine "__iter__()", "x in y" is "True" if some value "z" with "x ==\nz" is produced while iterating over "y". If an exception is raised\nduring the iteration, it is as if "in" raised that exception.\n\nLastly, the old-style iteration protocol is tried: if a class defines\n"__getitem__()", "x in y" is "True" if and only if there is a non-\nnegative integer index *i* such that "x == y[i]", and all lower\ninteger indices do not raise "IndexError" exception. (If any other\nexception is raised, it is as if "in" raised that exception).\n\nThe operator "not in" is defined to have the inverse true value of\n"in".\n', + 'integers': u'\nInteger literals\n****************\n\nInteger literals are described by the following lexical definitions:\n\n integer ::= decimalinteger | octinteger | hexinteger | bininteger\n decimalinteger ::= nonzerodigit digit* | "0"+\n nonzerodigit ::= "1"..."9"\n digit ::= "0"..."9"\n octinteger ::= "0" ("o" | "O") octdigit+\n hexinteger ::= "0" ("x" | "X") hexdigit+\n bininteger ::= "0" ("b" | "B") bindigit+\n octdigit ::= "0"..."7"\n hexdigit ::= digit | "a"..."f" | "A"..."F"\n bindigit ::= "0" | "1"\n\nThere is no limit for the length of integer literals apart from what\ncan be stored in available memory.\n\nNote that leading zeros in a non-zero decimal number are not allowed.\nThis is for disambiguation with C-style octal literals, which Python\nused before version 3.0.\n\nSome examples of integer literals:\n\n 7 2147483647 0o177 0b100110111\n 3 79228162514264337593543950336 0o377 0xdeadbeef\n', + 'lambda': u'\nLambdas\n*******\n\n lambda_expr ::= "lambda" [parameter_list]: expression\n lambda_expr_nocond ::= "lambda" [parameter_list]: expression_nocond\n\nLambda expressions (sometimes called lambda forms) are used to create\nanonymous functions. The expression "lambda arguments: expression"\nyields a function object. The unnamed object behaves like a function\nobject defined with:\n\n def (arguments):\n return expression\n\nSee section *Function definitions* for the syntax of parameter lists.\nNote that functions created with lambda expressions cannot contain\nstatements or annotations.\n', + 'lists': u'\nList displays\n*************\n\nA list display is a possibly empty series of expressions enclosed in\nsquare brackets:\n\n list_display ::= "[" [starred_list | comprehension] "]"\n\nA list display yields a new list object, the contents being specified\nby either a list of expressions or a comprehension. When a comma-\nseparated list of expressions is supplied, its elements are evaluated\nfrom left to right and placed into the list object in that order.\nWhen a comprehension is supplied, the list is constructed from the\nelements resulting from the comprehension.\n', + 'naming': u'\nNaming and binding\n******************\n\n\nBinding of names\n================\n\n*Names* refer to objects. Names are introduced by name binding\noperations.\n\nThe following constructs bind names: formal parameters to functions,\n"import" statements, class and function definitions (these bind the\nclass or function name in the defining block), and targets that are\nidentifiers if occurring in an assignment, "for" loop header, or after\n"as" in a "with" statement or "except" clause. The "import" statement\nof the form "from ... import *" binds all names defined in the\nimported module, except those beginning with an underscore. This form\nmay only be used at the module level.\n\nA target occurring in a "del" statement is also considered bound for\nthis purpose (though the actual semantics are to unbind the name).\n\nEach assignment or import statement occurs within a block defined by a\nclass or function definition or at the module level (the top-level\ncode block).\n\nIf a name is bound in a block, it is a local variable of that block,\nunless declared as "nonlocal" or "global". If a name is bound at the\nmodule level, it is a global variable. (The variables of the module\ncode block are local and global.) If a variable is used in a code\nblock but not defined there, it is a *free variable*.\n\nEach occurrence of a name in the program text refers to the *binding*\nof that name established by the following name resolution rules.\n\n\nResolution of names\n===================\n\nA *scope* defines the visibility of a name within a block. If a local\nvariable is defined in a block, its scope includes that block. If the\ndefinition occurs in a function block, the scope extends to any blocks\ncontained within the defining one, unless a contained block introduces\na different binding for the name.\n\nWhen a name is used in a code block, it is resolved using the nearest\nenclosing scope. The set of all such scopes visible to a code block\nis called the block\'s *environment*.\n\nWhen a name is not found at all, a "NameError" exception is raised. If\nthe current scope is a function scope, and the name refers to a local\nvariable that has not yet been bound to a value at the point where the\nname is used, an "UnboundLocalError" exception is raised.\n"UnboundLocalError" is a subclass of "NameError".\n\nIf a name binding operation occurs anywhere within a code block, all\nuses of the name within the block are treated as references to the\ncurrent block. This can lead to errors when a name is used within a\nblock before it is bound. This rule is subtle. Python lacks\ndeclarations and allows name binding operations to occur anywhere\nwithin a code block. The local variables of a code block can be\ndetermined by scanning the entire text of the block for name binding\noperations.\n\nIf the "global" statement occurs within a block, all uses of the name\nspecified in the statement refer to the binding of that name in the\ntop-level namespace. Names are resolved in the top-level namespace by\nsearching the global namespace, i.e. the namespace of the module\ncontaining the code block, and the builtins namespace, the namespace\nof the module "builtins". The global namespace is searched first. If\nthe name is not found there, the builtins namespace is searched. The\n"global" statement must precede all uses of the name.\n\nThe "global" statement has the same scope as a name binding operation\nin the same block. If the nearest enclosing scope for a free variable\ncontains a global statement, the free variable is treated as a global.\n\nThe "nonlocal" statement causes corresponding names to refer to\npreviously bound variables in the nearest enclosing function scope.\n"SyntaxError" is raised at compile time if the given name does not\nexist in any enclosing function scope.\n\nThe namespace for a module is automatically created the first time a\nmodule is imported. The main module for a script is always called\n"__main__".\n\nClass definition blocks and arguments to "exec()" and "eval()" are\nspecial in the context of name resolution. A class definition is an\nexecutable statement that may use and define names. These references\nfollow the normal rules for name resolution with an exception that\nunbound local variables are looked up in the global namespace. The\nnamespace of the class definition becomes the attribute dictionary of\nthe class. The scope of names defined in a class block is limited to\nthe class block; it does not extend to the code blocks of methods --\nthis includes comprehensions and generator expressions since they are\nimplemented using a function scope. This means that the following\nwill fail:\n\n class A:\n a = 42\n b = list(a + i for i in range(10))\n\n\nBuiltins and restricted execution\n=================================\n\nThe builtins namespace associated with the execution of a code block\nis actually found by looking up the name "__builtins__" in its global\nnamespace; this should be a dictionary or a module (in the latter case\nthe module\'s dictionary is used). By default, when in the "__main__"\nmodule, "__builtins__" is the built-in module "builtins"; when in any\nother module, "__builtins__" is an alias for the dictionary of the\n"builtins" module itself. "__builtins__" can be set to a user-created\ndictionary to create a weak form of restricted execution.\n\n**CPython implementation detail:** Users should not touch\n"__builtins__"; it is strictly an implementation detail. Users\nwanting to override values in the builtins namespace should "import"\nthe "builtins" module and modify its attributes appropriately.\n\n\nInteraction with dynamic features\n=================================\n\nName resolution of free variables occurs at runtime, not at compile\ntime. This means that the following code will print 42:\n\n i = 10\n def f():\n print(i)\n i = 42\n f()\n\nThe "eval()" and "exec()" functions do not have access to the full\nenvironment for resolving names. Names may be resolved in the local\nand global namespaces of the caller. Free variables are not resolved\nin the nearest enclosing namespace, but in the global namespace. [1]\nThe "exec()" and "eval()" functions have optional arguments to\noverride the global and local namespace. If only one namespace is\nspecified, it is used for both.\n', + 'nonlocal': u'\nThe "nonlocal" statement\n************************\n\n nonlocal_stmt ::= "nonlocal" identifier ("," identifier)*\n\nThe "nonlocal" statement causes the listed identifiers to refer to\npreviously bound variables in the nearest enclosing scope excluding\nglobals. This is important because the default behavior for binding is\nto search the local namespace first. The statement allows\nencapsulated code to rebind variables outside of the local scope\nbesides the global (module) scope.\n\nNames listed in a "nonlocal" statement, unlike those listed in a\n"global" statement, must refer to pre-existing bindings in an\nenclosing scope (the scope in which a new binding should be created\ncannot be determined unambiguously).\n\nNames listed in a "nonlocal" statement must not collide with pre-\nexisting bindings in the local scope.\n\nSee also: **PEP 3104** - Access to Names in Outer Scopes\n\n The specification for the "nonlocal" statement.\n', + 'numbers': u'\nNumeric literals\n****************\n\nThere are three types of numeric literals: integers, floating point\nnumbers, and imaginary numbers. There are no complex literals\n(complex numbers can be formed by adding a real number and an\nimaginary number).\n\nNote that numeric literals do not include a sign; a phrase like "-1"\nis actually an expression composed of the unary operator \'"-"\' and the\nliteral "1".\n', + 'numeric-types': u'\nEmulating numeric types\n***********************\n\nThe following methods can be defined to emulate numeric objects.\nMethods corresponding to operations that are not supported by the\nparticular kind of number implemented (e.g., bitwise operations for\nnon-integral numbers) should be left undefined.\n\nobject.__add__(self, other)\nobject.__sub__(self, other)\nobject.__mul__(self, other)\nobject.__matmul__(self, other)\nobject.__truediv__(self, other)\nobject.__floordiv__(self, other)\nobject.__mod__(self, other)\nobject.__divmod__(self, other)\nobject.__pow__(self, other[, modulo])\nobject.__lshift__(self, other)\nobject.__rshift__(self, other)\nobject.__and__(self, other)\nobject.__xor__(self, other)\nobject.__or__(self, other)\n\n These methods are called to implement the binary arithmetic\n operations ("+", "-", "*", "@", "/", "//", "%", "divmod()",\n "pow()", "**", "<<", ">>", "&", "^", "|"). For instance, to\n evaluate the expression "x + y", where *x* is an instance of a\n class that has an "__add__()" method, "x.__add__(y)" is called.\n The "__divmod__()" method should be the equivalent to using\n "__floordiv__()" and "__mod__()"; it should not be related to\n "__truediv__()". Note that "__pow__()" should be defined to accept\n an optional third argument if the ternary version of the built-in\n "pow()" function is to be supported.\n\n If one of those methods does not support the operation with the\n supplied arguments, it should return "NotImplemented".\n\nobject.__radd__(self, other)\nobject.__rsub__(self, other)\nobject.__rmul__(self, other)\nobject.__rmatmul__(self, other)\nobject.__rtruediv__(self, other)\nobject.__rfloordiv__(self, other)\nobject.__rmod__(self, other)\nobject.__rdivmod__(self, other)\nobject.__rpow__(self, other)\nobject.__rlshift__(self, other)\nobject.__rrshift__(self, other)\nobject.__rand__(self, other)\nobject.__rxor__(self, other)\nobject.__ror__(self, other)\n\n These methods are called to implement the binary arithmetic\n operations ("+", "-", "*", "@", "/", "//", "%", "divmod()",\n "pow()", "**", "<<", ">>", "&", "^", "|") with reflected (swapped)\n operands. These functions are only called if the left operand does\n not support the corresponding operation and the operands are of\n different types. [2] For instance, to evaluate the expression "x -\n y", where *y* is an instance of a class that has an "__rsub__()"\n method, "y.__rsub__(x)" is called if "x.__sub__(y)" returns\n *NotImplemented*.\n\n Note that ternary "pow()" will not try calling "__rpow__()" (the\n coercion rules would become too complicated).\n\n Note: If the right operand\'s type is a subclass of the left\n operand\'s type and that subclass provides the reflected method\n for the operation, this method will be called before the left\n operand\'s non-reflected method. This behavior allows subclasses\n to override their ancestors\' operations.\n\nobject.__iadd__(self, other)\nobject.__isub__(self, other)\nobject.__imul__(self, other)\nobject.__imatmul__(self, other)\nobject.__itruediv__(self, other)\nobject.__ifloordiv__(self, other)\nobject.__imod__(self, other)\nobject.__ipow__(self, other[, modulo])\nobject.__ilshift__(self, other)\nobject.__irshift__(self, other)\nobject.__iand__(self, other)\nobject.__ixor__(self, other)\nobject.__ior__(self, other)\n\n These methods are called to implement the augmented arithmetic\n assignments ("+=", "-=", "*=", "@=", "/=", "//=", "%=", "**=",\n "<<=", ">>=", "&=", "^=", "|="). These methods should attempt to\n do the operation in-place (modifying *self*) and return the result\n (which could be, but does not have to be, *self*). If a specific\n method is not defined, the augmented assignment falls back to the\n normal methods. For instance, if *x* is an instance of a class\n with an "__iadd__()" method, "x += y" is equivalent to "x =\n x.__iadd__(y)" . Otherwise, "x.__add__(y)" and "y.__radd__(x)" are\n considered, as with the evaluation of "x + y". In certain\n situations, augmented assignment can result in unexpected errors\n (see *Why does a_tuple[i] += [\'item\'] raise an exception when the\n addition works?*), but this behavior is in fact part of the data\n model.\n\nobject.__neg__(self)\nobject.__pos__(self)\nobject.__abs__(self)\nobject.__invert__(self)\n\n Called to implement the unary arithmetic operations ("-", "+",\n "abs()" and "~").\n\nobject.__complex__(self)\nobject.__int__(self)\nobject.__float__(self)\nobject.__round__(self[, n])\n\n Called to implement the built-in functions "complex()", "int()",\n "float()" and "round()". Should return a value of the appropriate\n type.\n\nobject.__index__(self)\n\n Called to implement "operator.index()", and whenever Python needs\n to losslessly convert the numeric object to an integer object (such\n as in slicing, or in the built-in "bin()", "hex()" and "oct()"\n functions). Presence of this method indicates that the numeric\n object is an integer type. Must return an integer.\n\n Note: In order to have a coherent integer type class, when\n "__index__()" is defined "__int__()" should also be defined, and\n both should return the same value.\n', + 'objects': u'\nObjects, values and types\n*************************\n\n*Objects* are Python\'s abstraction for data. All data in a Python\nprogram is represented by objects or by relations between objects. (In\na sense, and in conformance to Von Neumann\'s model of a "stored\nprogram computer," code is also represented by objects.)\n\nEvery object has an identity, a type and a value. An object\'s\n*identity* never changes once it has been created; you may think of it\nas the object\'s address in memory. The \'"is"\' operator compares the\nidentity of two objects; the "id()" function returns an integer\nrepresenting its identity.\n\n**CPython implementation detail:** For CPython, "id(x)" is the memory\naddress where "x" is stored.\n\nAn object\'s type determines the operations that the object supports\n(e.g., "does it have a length?") and also defines the possible values\nfor objects of that type. The "type()" function returns an object\'s\ntype (which is an object itself). Like its identity, an object\'s\n*type* is also unchangeable. [1]\n\nThe *value* of some objects can change. Objects whose value can\nchange are said to be *mutable*; objects whose value is unchangeable\nonce they are created are called *immutable*. (The value of an\nimmutable container object that contains a reference to a mutable\nobject can change when the latter\'s value is changed; however the\ncontainer is still considered immutable, because the collection of\nobjects it contains cannot be changed. So, immutability is not\nstrictly the same as having an unchangeable value, it is more subtle.)\nAn object\'s mutability is determined by its type; for instance,\nnumbers, strings and tuples are immutable, while dictionaries and\nlists are mutable.\n\nObjects are never explicitly destroyed; however, when they become\nunreachable they may be garbage-collected. An implementation is\nallowed to postpone garbage collection or omit it altogether --- it is\na matter of implementation quality how garbage collection is\nimplemented, as long as no objects are collected that are still\nreachable.\n\n**CPython implementation detail:** CPython currently uses a reference-\ncounting scheme with (optional) delayed detection of cyclically linked\ngarbage, which collects most objects as soon as they become\nunreachable, but is not guaranteed to collect garbage containing\ncircular references. See the documentation of the "gc" module for\ninformation on controlling the collection of cyclic garbage. Other\nimplementations act differently and CPython may change. Do not depend\non immediate finalization of objects when they become unreachable (so\nyou should always close files explicitly).\n\nNote that the use of the implementation\'s tracing or debugging\nfacilities may keep objects alive that would normally be collectable.\nAlso note that catching an exception with a \'"try"..."except"\'\nstatement may keep objects alive.\n\nSome objects contain references to "external" resources such as open\nfiles or windows. It is understood that these resources are freed\nwhen the object is garbage-collected, but since garbage collection is\nnot guaranteed to happen, such objects also provide an explicit way to\nrelease the external resource, usually a "close()" method. Programs\nare strongly recommended to explicitly close such objects. The\n\'"try"..."finally"\' statement and the \'"with"\' statement provide\nconvenient ways to do this.\n\nSome objects contain references to other objects; these are called\n*containers*. Examples of containers are tuples, lists and\ndictionaries. The references are part of a container\'s value. In\nmost cases, when we talk about the value of a container, we imply the\nvalues, not the identities of the contained objects; however, when we\ntalk about the mutability of a container, only the identities of the\nimmediately contained objects are implied. So, if an immutable\ncontainer (like a tuple) contains a reference to a mutable object, its\nvalue changes if that mutable object is changed.\n\nTypes affect almost all aspects of object behavior. Even the\nimportance of object identity is affected in some sense: for immutable\ntypes, operations that compute new values may actually return a\nreference to any existing object with the same type and value, while\nfor mutable objects this is not allowed. E.g., after "a = 1; b = 1",\n"a" and "b" may or may not refer to the same object with the value\none, depending on the implementation, but after "c = []; d = []", "c"\nand "d" are guaranteed to refer to two different, unique, newly\ncreated empty lists. (Note that "c = d = []" assigns the same object\nto both "c" and "d".)\n', + 'operator-summary': u'\nOperator precedence\n*******************\n\nThe following table summarizes the operator precedence in Python, from\nlowest precedence (least binding) to highest precedence (most\nbinding). Operators in the same box have the same precedence. Unless\nthe syntax is explicitly given, operators are binary. Operators in\nthe same box group left to right (except for exponentiation, which\ngroups from right to left).\n\nNote that comparisons, membership tests, and identity tests, all have\nthe same precedence and have a left-to-right chaining feature as\ndescribed in the *Comparisons* section.\n\n+-------------------------------------------------+---------------------------------------+\n| Operator | Description |\n+=================================================+=======================================+\n| "lambda" | Lambda expression |\n+-------------------------------------------------+---------------------------------------+\n| "if" -- "else" | Conditional expression |\n+-------------------------------------------------+---------------------------------------+\n| "or" | Boolean OR |\n+-------------------------------------------------+---------------------------------------+\n| "and" | Boolean AND |\n+-------------------------------------------------+---------------------------------------+\n| "not" "x" | Boolean NOT |\n+-------------------------------------------------+---------------------------------------+\n| "in", "not in", "is", "is not", "<", "<=", ">", | Comparisons, including membership |\n| ">=", "!=", "==" | tests and identity tests |\n+-------------------------------------------------+---------------------------------------+\n| "|" | Bitwise OR |\n+-------------------------------------------------+---------------------------------------+\n| "^" | Bitwise XOR |\n+-------------------------------------------------+---------------------------------------+\n| "&" | Bitwise AND |\n+-------------------------------------------------+---------------------------------------+\n| "<<", ">>" | Shifts |\n+-------------------------------------------------+---------------------------------------+\n| "+", "-" | Addition and subtraction |\n+-------------------------------------------------+---------------------------------------+\n| "*", "@", "/", "//", "%" | Multiplication, matrix multiplication |\n| | division, remainder [5] |\n+-------------------------------------------------+---------------------------------------+\n| "+x", "-x", "~x" | Positive, negative, bitwise NOT |\n+-------------------------------------------------+---------------------------------------+\n| "**" | Exponentiation [6] |\n+-------------------------------------------------+---------------------------------------+\n| "await" "x" | Await expression |\n+-------------------------------------------------+---------------------------------------+\n| "x[index]", "x[index:index]", | Subscription, slicing, call, |\n| "x(arguments...)", "x.attribute" | attribute reference |\n+-------------------------------------------------+---------------------------------------+\n| "(expressions...)", "[expressions...]", "{key: | Binding or tuple display, list |\n| value...}", "{expressions...}" | display, dictionary display, set |\n| | display |\n+-------------------------------------------------+---------------------------------------+\n\n-[ Footnotes ]-\n\n[1] While "abs(x%y) < abs(y)" is true mathematically, for floats\n it may not be true numerically due to roundoff. For example, and\n assuming a platform on which a Python float is an IEEE 754 double-\n precision number, in order that "-1e-100 % 1e100" have the same\n sign as "1e100", the computed result is "-1e-100 + 1e100", which\n is numerically exactly equal to "1e100". The function\n "math.fmod()" returns a result whose sign matches the sign of the\n first argument instead, and so returns "-1e-100" in this case.\n Which approach is more appropriate depends on the application.\n\n[2] If x is very close to an exact integer multiple of y, it\'s\n possible for "x//y" to be one larger than "(x-x%y)//y" due to\n rounding. In such cases, Python returns the latter result, in\n order to preserve that "divmod(x,y)[0] * y + x % y" be very close\n to "x".\n\n[3] The Unicode standard distinguishes between *code points* (e.g.\n U+0041) and *abstract characters* (e.g. "LATIN CAPITAL LETTER A").\n While most abstract characters in Unicode are only represented\n using one code point, there is a number of abstract characters\n that can in addition be represented using a sequence of more than\n one code point. For example, the abstract character "LATIN\n CAPITAL LETTER C WITH CEDILLA" can be represented as a single\n *precomposed character* at code position U+00C7, or as a sequence\n of a *base character* at code position U+0043 (LATIN CAPITAL\n LETTER C), followed by a *combining character* at code position\n U+0327 (COMBINING CEDILLA).\n\n The comparison operators on strings compare at the level of\n Unicode code points. This may be counter-intuitive to humans. For\n example, ""\\u00C7" == "\\u0043\\u0327"" is "False", even though both\n strings represent the same abstract character "LATIN CAPITAL\n LETTER C WITH CEDILLA".\n\n To compare strings at the level of abstract characters (that is,\n in a way intuitive to humans), use "unicodedata.normalize()".\n\n[4] Due to automatic garbage-collection, free lists, and the\n dynamic nature of descriptors, you may notice seemingly unusual\n behaviour in certain uses of the "is" operator, like those\n involving comparisons between instance methods, or constants.\n Check their documentation for more info.\n\n[5] The "%" operator is also used for string formatting; the same\n precedence applies.\n\n[6] The power operator "**" binds less tightly than an arithmetic\n or bitwise unary operator on its right, that is, "2**-1" is "0.5".\n', + 'pass': u'\nThe "pass" statement\n********************\n\n pass_stmt ::= "pass"\n\n"pass" is a null operation --- when it is executed, nothing happens.\nIt is useful as a placeholder when a statement is required\nsyntactically, but no code needs to be executed, for example:\n\n def f(arg): pass # a function that does nothing (yet)\n\n class C: pass # a class with no methods (yet)\n', + 'power': u'\nThe power operator\n******************\n\nThe power operator binds more tightly than unary operators on its\nleft; it binds less tightly than unary operators on its right. The\nsyntax is:\n\n power ::= ( await_expr | primary ) ["**" u_expr]\n\nThus, in an unparenthesized sequence of power and unary operators, the\noperators are evaluated from right to left (this does not constrain\nthe evaluation order for the operands): "-1**2" results in "-1".\n\nThe power operator has the same semantics as the built-in "pow()"\nfunction, when called with two arguments: it yields its left argument\nraised to the power of its right argument. The numeric arguments are\nfirst converted to a common type, and the result is of that type.\n\nFor int operands, the result has the same type as the operands unless\nthe second argument is negative; in that case, all arguments are\nconverted to float and a float result is delivered. For example,\n"10**2" returns "100", but "10**-2" returns "0.01".\n\nRaising "0.0" to a negative power results in a "ZeroDivisionError".\nRaising a negative number to a fractional power results in a "complex"\nnumber. (In earlier versions it raised a "ValueError".)\n', + 'raise': u'\nThe "raise" statement\n*********************\n\n raise_stmt ::= "raise" [expression ["from" expression]]\n\nIf no expressions are present, "raise" re-raises the last exception\nthat was active in the current scope. If no exception is active in\nthe current scope, a "RuntimeError" exception is raised indicating\nthat this is an error.\n\nOtherwise, "raise" evaluates the first expression as the exception\nobject. It must be either a subclass or an instance of\n"BaseException". If it is a class, the exception instance will be\nobtained when needed by instantiating the class with no arguments.\n\nThe *type* of the exception is the exception instance\'s class, the\n*value* is the instance itself.\n\nA traceback object is normally created automatically when an exception\nis raised and attached to it as the "__traceback__" attribute, which\nis writable. You can create an exception and set your own traceback in\none step using the "with_traceback()" exception method (which returns\nthe same exception instance, with its traceback set to its argument),\nlike so:\n\n raise Exception("foo occurred").with_traceback(tracebackobj)\n\nThe "from" clause is used for exception chaining: if given, the second\n*expression* must be another exception class or instance, which will\nthen be attached to the raised exception as the "__cause__" attribute\n(which is writable). If the raised exception is not handled, both\nexceptions will be printed:\n\n >>> try:\n ... print(1 / 0)\n ... except Exception as exc:\n ... raise RuntimeError("Something bad happened") from exc\n ...\n Traceback (most recent call last):\n File "", line 2, in \n ZeroDivisionError: int division or modulo by zero\n\n The above exception was the direct cause of the following exception:\n\n Traceback (most recent call last):\n File "", line 4, in \n RuntimeError: Something bad happened\n\nA similar mechanism works implicitly if an exception is raised inside\nan exception handler or a "finally" clause: the previous exception is\nthen attached as the new exception\'s "__context__" attribute:\n\n >>> try:\n ... print(1 / 0)\n ... except:\n ... raise RuntimeError("Something bad happened")\n ...\n Traceback (most recent call last):\n File "", line 2, in \n ZeroDivisionError: int division or modulo by zero\n\n During handling of the above exception, another exception occurred:\n\n Traceback (most recent call last):\n File "", line 4, in \n RuntimeError: Something bad happened\n\nAdditional information on exceptions can be found in section\n*Exceptions*, and information about handling exceptions is in section\n*The try statement*.\n', + 'return': u'\nThe "return" statement\n**********************\n\n return_stmt ::= "return" [expression_list]\n\n"return" may only occur syntactically nested in a function definition,\nnot within a nested class definition.\n\nIf an expression list is present, it is evaluated, else "None" is\nsubstituted.\n\n"return" leaves the current function call with the expression list (or\n"None") as return value.\n\nWhen "return" passes control out of a "try" statement with a "finally"\nclause, that "finally" clause is executed before really leaving the\nfunction.\n\nIn a generator function, the "return" statement indicates that the\ngenerator is done and will cause "StopIteration" to be raised. The\nreturned value (if any) is used as an argument to construct\n"StopIteration" and becomes the "StopIteration.value" attribute.\n', + 'sequence-types': u'\nEmulating container types\n*************************\n\nThe following methods can be defined to implement container objects.\nContainers usually are sequences (such as lists or tuples) or mappings\n(like dictionaries), but can represent other containers as well. The\nfirst set of methods is used either to emulate a sequence or to\nemulate a mapping; the difference is that for a sequence, the\nallowable keys should be the integers *k* for which "0 <= k < N" where\n*N* is the length of the sequence, or slice objects, which define a\nrange of items. It is also recommended that mappings provide the\nmethods "keys()", "values()", "items()", "get()", "clear()",\n"setdefault()", "pop()", "popitem()", "copy()", and "update()"\nbehaving similar to those for Python\'s standard dictionary objects.\nThe "collections" module provides a "MutableMapping" abstract base\nclass to help create those methods from a base set of "__getitem__()",\n"__setitem__()", "__delitem__()", and "keys()". Mutable sequences\nshould provide methods "append()", "count()", "index()", "extend()",\n"insert()", "pop()", "remove()", "reverse()" and "sort()", like Python\nstandard list objects. Finally, sequence types should implement\naddition (meaning concatenation) and multiplication (meaning\nrepetition) by defining the methods "__add__()", "__radd__()",\n"__iadd__()", "__mul__()", "__rmul__()" and "__imul__()" described\nbelow; they should not define other numerical operators. It is\nrecommended that both mappings and sequences implement the\n"__contains__()" method to allow efficient use of the "in" operator;\nfor mappings, "in" should search the mapping\'s keys; for sequences, it\nshould search through the values. It is further recommended that both\nmappings and sequences implement the "__iter__()" method to allow\nefficient iteration through the container; for mappings, "__iter__()"\nshould be the same as "keys()"; for sequences, it should iterate\nthrough the values.\n\nobject.__len__(self)\n\n Called to implement the built-in function "len()". Should return\n the length of the object, an integer ">=" 0. Also, an object that\n doesn\'t define a "__bool__()" method and whose "__len__()" method\n returns zero is considered to be false in a Boolean context.\n\n **CPython implementation detail:** In CPython, the length is\n required to be at most "sys.maxsize". If the length is larger than\n "sys.maxsize" some features (such as "len()") may raise\n "OverflowError". To prevent raising "OverflowError" by truth value\n testing, an object must define a "__bool__()" method.\n\nobject.__length_hint__(self)\n\n Called to implement "operator.length_hint()". Should return an\n estimated length for the object (which may be greater or less than\n the actual length). The length must be an integer ">=" 0. This\n method is purely an optimization and is never required for\n correctness.\n\n New in version 3.4.\n\nNote: Slicing is done exclusively with the following three methods.\n A call like\n\n a[1:2] = b\n\n is translated to\n\n a[slice(1, 2, None)] = b\n\n and so forth. Missing slice items are always filled in with "None".\n\nobject.__getitem__(self, key)\n\n Called to implement evaluation of "self[key]". For sequence types,\n the accepted keys should be integers and slice objects. Note that\n the special interpretation of negative indexes (if the class wishes\n to emulate a sequence type) is up to the "__getitem__()" method. If\n *key* is of an inappropriate type, "TypeError" may be raised; if of\n a value outside the set of indexes for the sequence (after any\n special interpretation of negative values), "IndexError" should be\n raised. For mapping types, if *key* is missing (not in the\n container), "KeyError" should be raised.\n\n Note: "for" loops expect that an "IndexError" will be raised for\n illegal indexes to allow proper detection of the end of the\n sequence.\n\nobject.__missing__(self, key)\n\n Called by "dict"."__getitem__()" to implement "self[key]" for dict\n subclasses when key is not in the dictionary.\n\nobject.__setitem__(self, key, value)\n\n Called to implement assignment to "self[key]". Same note as for\n "__getitem__()". This should only be implemented for mappings if\n the objects support changes to the values for keys, or if new keys\n can be added, or for sequences if elements can be replaced. The\n same exceptions should be raised for improper *key* values as for\n the "__getitem__()" method.\n\nobject.__delitem__(self, key)\n\n Called to implement deletion of "self[key]". Same note as for\n "__getitem__()". This should only be implemented for mappings if\n the objects support removal of keys, or for sequences if elements\n can be removed from the sequence. The same exceptions should be\n raised for improper *key* values as for the "__getitem__()" method.\n\nobject.__iter__(self)\n\n This method is called when an iterator is required for a container.\n This method should return a new iterator object that can iterate\n over all the objects in the container. For mappings, it should\n iterate over the keys of the container.\n\n Iterator objects also need to implement this method; they are\n required to return themselves. For more information on iterator\n objects, see *Iterator Types*.\n\nobject.__reversed__(self)\n\n Called (if present) by the "reversed()" built-in to implement\n reverse iteration. It should return a new iterator object that\n iterates over all the objects in the container in reverse order.\n\n If the "__reversed__()" method is not provided, the "reversed()"\n built-in will fall back to using the sequence protocol ("__len__()"\n and "__getitem__()"). Objects that support the sequence protocol\n should only provide "__reversed__()" if they can provide an\n implementation that is more efficient than the one provided by\n "reversed()".\n\nThe membership test operators ("in" and "not in") are normally\nimplemented as an iteration through a sequence. However, container\nobjects can supply the following special method with a more efficient\nimplementation, which also does not require the object be a sequence.\n\nobject.__contains__(self, item)\n\n Called to implement membership test operators. Should return true\n if *item* is in *self*, false otherwise. For mapping objects, this\n should consider the keys of the mapping rather than the values or\n the key-item pairs.\n\n For objects that don\'t define "__contains__()", the membership test\n first tries iteration via "__iter__()", then the old sequence\n iteration protocol via "__getitem__()", see *this section in the\n language reference*.\n', + 'shifting': u'\nShifting operations\n*******************\n\nThe shifting operations have lower priority than the arithmetic\noperations:\n\n shift_expr ::= a_expr | shift_expr ( "<<" | ">>" ) a_expr\n\nThese operators accept integers as arguments. They shift the first\nargument to the left or right by the number of bits given by the\nsecond argument.\n\nA right shift by *n* bits is defined as floor division by "pow(2,n)".\nA left shift by *n* bits is defined as multiplication with "pow(2,n)".\n\nNote: In the current implementation, the right-hand operand is\n required to be at most "sys.maxsize". If the right-hand operand is\n larger than "sys.maxsize" an "OverflowError" exception is raised.\n', + 'slicings': u'\nSlicings\n********\n\nA slicing selects a range of items in a sequence object (e.g., a\nstring, tuple or list). Slicings may be used as expressions or as\ntargets in assignment or "del" statements. The syntax for a slicing:\n\n slicing ::= primary "[" slice_list "]"\n slice_list ::= slice_item ("," slice_item)* [","]\n slice_item ::= expression | proper_slice\n proper_slice ::= [lower_bound] ":" [upper_bound] [ ":" [stride] ]\n lower_bound ::= expression\n upper_bound ::= expression\n stride ::= expression\n\nThere is ambiguity in the formal syntax here: anything that looks like\nan expression list also looks like a slice list, so any subscription\ncan be interpreted as a slicing. Rather than further complicating the\nsyntax, this is disambiguated by defining that in this case the\ninterpretation as a subscription takes priority over the\ninterpretation as a slicing (this is the case if the slice list\ncontains no proper slice).\n\nThe semantics for a slicing are as follows. The primary is indexed\n(using the same "__getitem__()" method as normal subscription) with a\nkey that is constructed from the slice list, as follows. If the slice\nlist contains at least one comma, the key is a tuple containing the\nconversion of the slice items; otherwise, the conversion of the lone\nslice item is the key. The conversion of a slice item that is an\nexpression is that expression. The conversion of a proper slice is a\nslice object (see section *The standard type hierarchy*) whose\n"start", "stop" and "step" attributes are the values of the\nexpressions given as lower bound, upper bound and stride,\nrespectively, substituting "None" for missing expressions.\n', + 'specialattrs': u'\nSpecial Attributes\n******************\n\nThe implementation adds a few special read-only attributes to several\nobject types, where they are relevant. Some of these are not reported\nby the "dir()" built-in function.\n\nobject.__dict__\n\n A dictionary or other mapping object used to store an object\'s\n (writable) attributes.\n\ninstance.__class__\n\n The class to which a class instance belongs.\n\nclass.__bases__\n\n The tuple of base classes of a class object.\n\ndefinition.__name__\n\n The name of the class, function, method, descriptor, or generator\n instance.\n\ndefinition.__qualname__\n\n The *qualified name* of the class, function, method, descriptor, or\n generator instance.\n\n New in version 3.3.\n\nclass.__mro__\n\n This attribute is a tuple of classes that are considered when\n looking for base classes during method resolution.\n\nclass.mro()\n\n This method can be overridden by a metaclass to customize the\n method resolution order for its instances. It is called at class\n instantiation, and its result is stored in "__mro__".\n\nclass.__subclasses__()\n\n Each class keeps a list of weak references to its immediate\n subclasses. This method returns a list of all those references\n still alive. Example:\n\n >>> int.__subclasses__()\n []\n\n-[ Footnotes ]-\n\n[1] Additional information on these special methods may be found\n in the Python Reference Manual (*Basic customization*).\n\n[2] As a consequence, the list "[1, 2]" is considered equal to\n "[1.0, 2.0]", and similarly for tuples.\n\n[3] They must have since the parser can\'t tell the type of the\n operands.\n\n[4] Cased characters are those with general category property\n being one of "Lu" (Letter, uppercase), "Ll" (Letter, lowercase),\n or "Lt" (Letter, titlecase).\n\n[5] To format only a tuple you should therefore provide a\n singleton tuple whose only element is the tuple to be formatted.\n', + 'specialnames': u'\nSpecial method names\n********************\n\nA class can implement certain operations that are invoked by special\nsyntax (such as arithmetic operations or subscripting and slicing) by\ndefining methods with special names. This is Python\'s approach to\n*operator overloading*, allowing classes to define their own behavior\nwith respect to language operators. For instance, if a class defines\na method named "__getitem__()", and "x" is an instance of this class,\nthen "x[i]" is roughly equivalent to "type(x).__getitem__(x, i)".\nExcept where mentioned, attempts to execute an operation raise an\nexception when no appropriate method is defined (typically\n"AttributeError" or "TypeError").\n\nWhen implementing a class that emulates any built-in type, it is\nimportant that the emulation only be implemented to the degree that it\nmakes sense for the object being modelled. For example, some\nsequences may work well with retrieval of individual elements, but\nextracting a slice may not make sense. (One example of this is the\n"NodeList" interface in the W3C\'s Document Object Model.)\n\n\nBasic customization\n===================\n\nobject.__new__(cls[, ...])\n\n Called to create a new instance of class *cls*. "__new__()" is a\n static method (special-cased so you need not declare it as such)\n that takes the class of which an instance was requested as its\n first argument. The remaining arguments are those passed to the\n object constructor expression (the call to the class). The return\n value of "__new__()" should be the new object instance (usually an\n instance of *cls*).\n\n Typical implementations create a new instance of the class by\n invoking the superclass\'s "__new__()" method using\n "super().__new__(cls[, ...])" with appropriate arguments and then\n modifying the newly-created instance as necessary before returning\n it.\n\n If "__new__()" returns an instance of *cls*, then the new\n instance\'s "__init__()" method will be invoked like\n "__init__(self[, ...])", where *self* is the new instance and the\n remaining arguments are the same as were passed to "__new__()".\n\n If "__new__()" does not return an instance of *cls*, then the new\n instance\'s "__init__()" method will not be invoked.\n\n "__new__()" is intended mainly to allow subclasses of immutable\n types (like int, str, or tuple) to customize instance creation. It\n is also commonly overridden in custom metaclasses in order to\n customize class creation.\n\nobject.__init__(self[, ...])\n\n Called after the instance has been created (by "__new__()"), but\n before it is returned to the caller. The arguments are those\n passed to the class constructor expression. If a base class has an\n "__init__()" method, the derived class\'s "__init__()" method, if\n any, must explicitly call it to ensure proper initialization of the\n base class part of the instance; for example:\n "super().__init__([args...])".\n\n Because "__new__()" and "__init__()" work together in constructing\n objects ("__new__()" to create it, and "__init__()" to customize\n it), no non-"None" value may be returned by "__init__()"; doing so\n will cause a "TypeError" to be raised at runtime.\n\nobject.__del__(self)\n\n Called when the instance is about to be destroyed. This is also\n called a destructor. If a base class has a "__del__()" method, the\n derived class\'s "__del__()" method, if any, must explicitly call it\n to ensure proper deletion of the base class part of the instance.\n Note that it is possible (though not recommended!) for the\n "__del__()" method to postpone destruction of the instance by\n creating a new reference to it. It may then be called at a later\n time when this new reference is deleted. It is not guaranteed that\n "__del__()" methods are called for objects that still exist when\n the interpreter exits.\n\n Note: "del x" doesn\'t directly call "x.__del__()" --- the former\n decrements the reference count for "x" by one, and the latter is\n only called when "x"\'s reference count reaches zero. Some common\n situations that may prevent the reference count of an object from\n going to zero include: circular references between objects (e.g.,\n a doubly-linked list or a tree data structure with parent and\n child pointers); a reference to the object on the stack frame of\n a function that caught an exception (the traceback stored in\n "sys.exc_info()[2]" keeps the stack frame alive); or a reference\n to the object on the stack frame that raised an unhandled\n exception in interactive mode (the traceback stored in\n "sys.last_traceback" keeps the stack frame alive). The first\n situation can only be remedied by explicitly breaking the cycles;\n the second can be resolved by freeing the reference to the\n traceback object when it is no longer useful, and the third can\n be resolved by storing "None" in "sys.last_traceback". Circular\n references which are garbage are detected and cleaned up when the\n cyclic garbage collector is enabled (it\'s on by default). Refer\n to the documentation for the "gc" module for more information\n about this topic.\n\n Warning: Due to the precarious circumstances under which\n "__del__()" methods are invoked, exceptions that occur during\n their execution are ignored, and a warning is printed to\n "sys.stderr" instead. Also, when "__del__()" is invoked in\n response to a module being deleted (e.g., when execution of the\n program is done), other globals referenced by the "__del__()"\n method may already have been deleted or in the process of being\n torn down (e.g. the import machinery shutting down). For this\n reason, "__del__()" methods should do the absolute minimum needed\n to maintain external invariants. Starting with version 1.5,\n Python guarantees that globals whose name begins with a single\n underscore are deleted from their module before other globals are\n deleted; if no other references to such globals exist, this may\n help in assuring that imported modules are still available at the\n time when the "__del__()" method is called.\n\nobject.__repr__(self)\n\n Called by the "repr()" built-in function to compute the "official"\n string representation of an object. If at all possible, this\n should look like a valid Python expression that could be used to\n recreate an object with the same value (given an appropriate\n environment). If this is not possible, a string of the form\n "<...some useful description...>" should be returned. The return\n value must be a string object. If a class defines "__repr__()" but\n not "__str__()", then "__repr__()" is also used when an "informal"\n string representation of instances of that class is required.\n\n This is typically used for debugging, so it is important that the\n representation is information-rich and unambiguous.\n\nobject.__str__(self)\n\n Called by "str(object)" and the built-in functions "format()" and\n "print()" to compute the "informal" or nicely printable string\n representation of an object. The return value must be a *string*\n object.\n\n This method differs from "object.__repr__()" in that there is no\n expectation that "__str__()" return a valid Python expression: a\n more convenient or concise representation can be used.\n\n The default implementation defined by the built-in type "object"\n calls "object.__repr__()".\n\nobject.__bytes__(self)\n\n Called by "bytes()" to compute a byte-string representation of an\n object. This should return a "bytes" object.\n\nobject.__format__(self, format_spec)\n\n Called by the "format()" built-in function (and by extension, the\n "str.format()" method of class "str") to produce a "formatted"\n string representation of an object. The "format_spec" argument is a\n string that contains a description of the formatting options\n desired. The interpretation of the "format_spec" argument is up to\n the type implementing "__format__()", however most classes will\n either delegate formatting to one of the built-in types, or use a\n similar formatting option syntax.\n\n See *Format Specification Mini-Language* for a description of the\n standard formatting syntax.\n\n The return value must be a string object.\n\n Changed in version 3.4: The __format__ method of "object" itself\n raises a "TypeError" if passed any non-empty string.\n\nobject.__lt__(self, other)\nobject.__le__(self, other)\nobject.__eq__(self, other)\nobject.__ne__(self, other)\nobject.__gt__(self, other)\nobject.__ge__(self, other)\n\n These are the so-called "rich comparison" methods. The\n correspondence between operator symbols and method names is as\n follows: "xy" calls\n "x.__gt__(y)", and "x>=y" calls "x.__ge__(y)".\n\n A rich comparison method may return the singleton "NotImplemented"\n if it does not implement the operation for a given pair of\n arguments. By convention, "False" and "True" are returned for a\n successful comparison. However, these methods can return any value,\n so if the comparison operator is used in a Boolean context (e.g.,\n in the condition of an "if" statement), Python will call "bool()"\n on the value to determine if the result is true or false.\n\n By default, "__ne__()" delegates to "__eq__()" and inverts the\n result unless it is "NotImplemented". There are no other implied\n relationships among the comparison operators, for example, the\n truth of "(x.__hash__".\n\n If a class that does not override "__eq__()" wishes to suppress\n hash support, it should include "__hash__ = None" in the class\n definition. A class which defines its own "__hash__()" that\n explicitly raises a "TypeError" would be incorrectly identified as\n hashable by an "isinstance(obj, collections.Hashable)" call.\n\n Note: By default, the "__hash__()" values of str, bytes and\n datetime objects are "salted" with an unpredictable random value.\n Although they remain constant within an individual Python\n process, they are not predictable between repeated invocations of\n Python.This is intended to provide protection against a denial-\n of-service caused by carefully-chosen inputs that exploit the\n worst case performance of a dict insertion, O(n^2) complexity.\n See http://www.ocert.org/advisories/ocert-2011-003.html for\n details.Changing hash values affects the iteration order of\n dicts, sets and other mappings. Python has never made guarantees\n about this ordering (and it typically varies between 32-bit and\n 64-bit builds).See also "PYTHONHASHSEED".\n\n Changed in version 3.3: Hash randomization is enabled by default.\n\nobject.__bool__(self)\n\n Called to implement truth value testing and the built-in operation\n "bool()"; should return "False" or "True". When this method is not\n defined, "__len__()" is called, if it is defined, and the object is\n considered true if its result is nonzero. If a class defines\n neither "__len__()" nor "__bool__()", all its instances are\n considered true.\n\n\nCustomizing attribute access\n============================\n\nThe following methods can be defined to customize the meaning of\nattribute access (use of, assignment to, or deletion of "x.name") for\nclass instances.\n\nobject.__getattr__(self, name)\n\n Called when an attribute lookup has not found the attribute in the\n usual places (i.e. it is not an instance attribute nor is it found\n in the class tree for "self"). "name" is the attribute name. This\n method should return the (computed) attribute value or raise an\n "AttributeError" exception.\n\n Note that if the attribute is found through the normal mechanism,\n "__getattr__()" is not called. (This is an intentional asymmetry\n between "__getattr__()" and "__setattr__()".) This is done both for\n efficiency reasons and because otherwise "__getattr__()" would have\n no way to access other attributes of the instance. Note that at\n least for instance variables, you can fake total control by not\n inserting any values in the instance attribute dictionary (but\n instead inserting them in another object). See the\n "__getattribute__()" method below for a way to actually get total\n control over attribute access.\n\nobject.__getattribute__(self, name)\n\n Called unconditionally to implement attribute accesses for\n instances of the class. If the class also defines "__getattr__()",\n the latter will not be called unless "__getattribute__()" either\n calls it explicitly or raises an "AttributeError". This method\n should return the (computed) attribute value or raise an\n "AttributeError" exception. In order to avoid infinite recursion in\n this method, its implementation should always call the base class\n method with the same name to access any attributes it needs, for\n example, "object.__getattribute__(self, name)".\n\n Note: This method may still be bypassed when looking up special\n methods as the result of implicit invocation via language syntax\n or built-in functions. See *Special method lookup*.\n\nobject.__setattr__(self, name, value)\n\n Called when an attribute assignment is attempted. This is called\n instead of the normal mechanism (i.e. store the value in the\n instance dictionary). *name* is the attribute name, *value* is the\n value to be assigned to it.\n\n If "__setattr__()" wants to assign to an instance attribute, it\n should call the base class method with the same name, for example,\n "object.__setattr__(self, name, value)".\n\nobject.__delattr__(self, name)\n\n Like "__setattr__()" but for attribute deletion instead of\n assignment. This should only be implemented if "del obj.name" is\n meaningful for the object.\n\nobject.__dir__(self)\n\n Called when "dir()" is called on the object. A sequence must be\n returned. "dir()" converts the returned sequence to a list and\n sorts it.\n\n\nImplementing Descriptors\n------------------------\n\nThe following methods only apply when an instance of the class\ncontaining the method (a so-called *descriptor* class) appears in an\n*owner* class (the descriptor must be in either the owner\'s class\ndictionary or in the class dictionary for one of its parents). In the\nexamples below, "the attribute" refers to the attribute whose name is\nthe key of the property in the owner class\' "__dict__".\n\nobject.__get__(self, instance, owner)\n\n Called to get the attribute of the owner class (class attribute\n access) or of an instance of that class (instance attribute\n access). *owner* is always the owner class, while *instance* is the\n instance that the attribute was accessed through, or "None" when\n the attribute is accessed through the *owner*. This method should\n return the (computed) attribute value or raise an "AttributeError"\n exception.\n\nobject.__set__(self, instance, value)\n\n Called to set the attribute on an instance *instance* of the owner\n class to a new value, *value*.\n\nobject.__delete__(self, instance)\n\n Called to delete the attribute on an instance *instance* of the\n owner class.\n\nThe attribute "__objclass__" is interpreted by the "inspect" module as\nspecifying the class where this object was defined (setting this\nappropriately can assist in runtime introspection of dynamic class\nattributes). For callables, it may indicate that an instance of the\ngiven type (or a subclass) is expected or required as the first\npositional argument (for example, CPython sets this attribute for\nunbound methods that are implemented in C).\n\n\nInvoking Descriptors\n--------------------\n\nIn general, a descriptor is an object attribute with "binding\nbehavior", one whose attribute access has been overridden by methods\nin the descriptor protocol: "__get__()", "__set__()", and\n"__delete__()". If any of those methods are defined for an object, it\nis said to be a descriptor.\n\nThe default behavior for attribute access is to get, set, or delete\nthe attribute from an object\'s dictionary. For instance, "a.x" has a\nlookup chain starting with "a.__dict__[\'x\']", then\n"type(a).__dict__[\'x\']", and continuing through the base classes of\n"type(a)" excluding metaclasses.\n\nHowever, if the looked-up value is an object defining one of the\ndescriptor methods, then Python may override the default behavior and\ninvoke the descriptor method instead. Where this occurs in the\nprecedence chain depends on which descriptor methods were defined and\nhow they were called.\n\nThe starting point for descriptor invocation is a binding, "a.x". How\nthe arguments are assembled depends on "a":\n\nDirect Call\n The simplest and least common call is when user code directly\n invokes a descriptor method: "x.__get__(a)".\n\nInstance Binding\n If binding to an object instance, "a.x" is transformed into the\n call: "type(a).__dict__[\'x\'].__get__(a, type(a))".\n\nClass Binding\n If binding to a class, "A.x" is transformed into the call:\n "A.__dict__[\'x\'].__get__(None, A)".\n\nSuper Binding\n If "a" is an instance of "super", then the binding "super(B,\n obj).m()" searches "obj.__class__.__mro__" for the base class "A"\n immediately preceding "B" and then invokes the descriptor with the\n call: "A.__dict__[\'m\'].__get__(obj, obj.__class__)".\n\nFor instance bindings, the precedence of descriptor invocation depends\non the which descriptor methods are defined. A descriptor can define\nany combination of "__get__()", "__set__()" and "__delete__()". If it\ndoes not define "__get__()", then accessing the attribute will return\nthe descriptor object itself unless there is a value in the object\'s\ninstance dictionary. If the descriptor defines "__set__()" and/or\n"__delete__()", it is a data descriptor; if it defines neither, it is\na non-data descriptor. Normally, data descriptors define both\n"__get__()" and "__set__()", while non-data descriptors have just the\n"__get__()" method. Data descriptors with "__set__()" and "__get__()"\ndefined always override a redefinition in an instance dictionary. In\ncontrast, non-data descriptors can be overridden by instances.\n\nPython methods (including "staticmethod()" and "classmethod()") are\nimplemented as non-data descriptors. Accordingly, instances can\nredefine and override methods. This allows individual instances to\nacquire behaviors that differ from other instances of the same class.\n\nThe "property()" function is implemented as a data descriptor.\nAccordingly, instances cannot override the behavior of a property.\n\n\n__slots__\n---------\n\nBy default, instances of classes have a dictionary for attribute\nstorage. This wastes space for objects having very few instance\nvariables. The space consumption can become acute when creating large\nnumbers of instances.\n\nThe default can be overridden by defining *__slots__* in a class\ndefinition. The *__slots__* declaration takes a sequence of instance\nvariables and reserves just enough space in each instance to hold a\nvalue for each variable. Space is saved because *__dict__* is not\ncreated for each instance.\n\nobject.__slots__\n\n This class variable can be assigned a string, iterable, or sequence\n of strings with variable names used by instances. *__slots__*\n reserves space for the declared variables and prevents the\n automatic creation of *__dict__* and *__weakref__* for each\n instance.\n\n\nNotes on using *__slots__*\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n* When inheriting from a class without *__slots__*, the *__dict__*\n attribute of that class will always be accessible, so a *__slots__*\n definition in the subclass is meaningless.\n\n* Without a *__dict__* variable, instances cannot be assigned new\n variables not listed in the *__slots__* definition. Attempts to\n assign to an unlisted variable name raises "AttributeError". If\n dynamic assignment of new variables is desired, then add\n "\'__dict__\'" to the sequence of strings in the *__slots__*\n declaration.\n\n* Without a *__weakref__* variable for each instance, classes\n defining *__slots__* do not support weak references to its\n instances. If weak reference support is needed, then add\n "\'__weakref__\'" to the sequence of strings in the *__slots__*\n declaration.\n\n* *__slots__* are implemented at the class level by creating\n descriptors (*Implementing Descriptors*) for each variable name. As\n a result, class attributes cannot be used to set default values for\n instance variables defined by *__slots__*; otherwise, the class\n attribute would overwrite the descriptor assignment.\n\n* The action of a *__slots__* declaration is limited to the class\n where it is defined. As a result, subclasses will have a *__dict__*\n unless they also define *__slots__* (which must only contain names\n of any *additional* slots).\n\n* If a class defines a slot also defined in a base class, the\n instance variable defined by the base class slot is inaccessible\n (except by retrieving its descriptor directly from the base class).\n This renders the meaning of the program undefined. In the future, a\n check may be added to prevent this.\n\n* Nonempty *__slots__* does not work for classes derived from\n "variable-length" built-in types such as "int", "bytes" and "tuple".\n\n* Any non-string iterable may be assigned to *__slots__*. Mappings\n may also be used; however, in the future, special meaning may be\n assigned to the values corresponding to each key.\n\n* *__class__* assignment works only if both classes have the same\n *__slots__*.\n\n\nCustomizing class creation\n==========================\n\nBy default, classes are constructed using "type()". The class body is\nexecuted in a new namespace and the class name is bound locally to the\nresult of "type(name, bases, namespace)".\n\nThe class creation process can be customized by passing the\n"metaclass" keyword argument in the class definition line, or by\ninheriting from an existing class that included such an argument. In\nthe following example, both "MyClass" and "MySubclass" are instances\nof "Meta":\n\n class Meta(type):\n pass\n\n class MyClass(metaclass=Meta):\n pass\n\n class MySubclass(MyClass):\n pass\n\nAny other keyword arguments that are specified in the class definition\nare passed through to all metaclass operations described below.\n\nWhen a class definition is executed, the following steps occur:\n\n* the appropriate metaclass is determined\n\n* the class namespace is prepared\n\n* the class body is executed\n\n* the class object is created\n\n\nDetermining the appropriate metaclass\n-------------------------------------\n\nThe appropriate metaclass for a class definition is determined as\nfollows:\n\n* if no bases and no explicit metaclass are given, then "type()" is\n used\n\n* if an explicit metaclass is given and it is *not* an instance of\n "type()", then it is used directly as the metaclass\n\n* if an instance of "type()" is given as the explicit metaclass, or\n bases are defined, then the most derived metaclass is used\n\nThe most derived metaclass is selected from the explicitly specified\nmetaclass (if any) and the metaclasses (i.e. "type(cls)") of all\nspecified base classes. The most derived metaclass is one which is a\nsubtype of *all* of these candidate metaclasses. If none of the\ncandidate metaclasses meets that criterion, then the class definition\nwill fail with "TypeError".\n\n\nPreparing the class namespace\n-----------------------------\n\nOnce the appropriate metaclass has been identified, then the class\nnamespace is prepared. If the metaclass has a "__prepare__" attribute,\nit is called as "namespace = metaclass.__prepare__(name, bases,\n**kwds)" (where the additional keyword arguments, if any, come from\nthe class definition).\n\nIf the metaclass has no "__prepare__" attribute, then the class\nnamespace is initialised as an empty "dict()" instance.\n\nSee also: **PEP 3115** - Metaclasses in Python 3000\n\n Introduced the "__prepare__" namespace hook\n\n\nExecuting the class body\n------------------------\n\nThe class body is executed (approximately) as "exec(body, globals(),\nnamespace)". The key difference from a normal call to "exec()" is that\nlexical scoping allows the class body (including any methods) to\nreference names from the current and outer scopes when the class\ndefinition occurs inside a function.\n\nHowever, even when the class definition occurs inside the function,\nmethods defined inside the class still cannot see names defined at the\nclass scope. Class variables must be accessed through the first\nparameter of instance or class methods, and cannot be accessed at all\nfrom static methods.\n\n\nCreating the class object\n-------------------------\n\nOnce the class namespace has been populated by executing the class\nbody, the class object is created by calling "metaclass(name, bases,\nnamespace, **kwds)" (the additional keywords passed here are the same\nas those passed to "__prepare__").\n\nThis class object is the one that will be referenced by the zero-\nargument form of "super()". "__class__" is an implicit closure\nreference created by the compiler if any methods in a class body refer\nto either "__class__" or "super". This allows the zero argument form\nof "super()" to correctly identify the class being defined based on\nlexical scoping, while the class or instance that was used to make the\ncurrent call is identified based on the first argument passed to the\nmethod.\n\nAfter the class object is created, it is passed to the class\ndecorators included in the class definition (if any) and the resulting\nobject is bound in the local namespace as the defined class.\n\nWhen a new class is created by "type.__new__", the object provided as\nthe namespace parameter is copied to a standard Python dictionary and\nthe original object is discarded. The new copy becomes the "__dict__"\nattribute of the class object.\n\nSee also: **PEP 3135** - New super\n\n Describes the implicit "__class__" closure reference\n\n\nMetaclass example\n-----------------\n\nThe potential uses for metaclasses are boundless. Some ideas that have\nbeen explored include logging, interface checking, automatic\ndelegation, automatic property creation, proxies, frameworks, and\nautomatic resource locking/synchronization.\n\nHere is an example of a metaclass that uses an\n"collections.OrderedDict" to remember the order that class variables\nare defined:\n\n class OrderedClass(type):\n\n @classmethod\n def __prepare__(metacls, name, bases, **kwds):\n return collections.OrderedDict()\n\n def __new__(cls, name, bases, namespace, **kwds):\n result = type.__new__(cls, name, bases, dict(namespace))\n result.members = tuple(namespace)\n return result\n\n class A(metaclass=OrderedClass):\n def one(self): pass\n def two(self): pass\n def three(self): pass\n def four(self): pass\n\n >>> A.members\n (\'__module__\', \'one\', \'two\', \'three\', \'four\')\n\nWhen the class definition for *A* gets executed, the process begins\nwith calling the metaclass\'s "__prepare__()" method which returns an\nempty "collections.OrderedDict". That mapping records the methods and\nattributes of *A* as they are defined within the body of the class\nstatement. Once those definitions are executed, the ordered dictionary\nis fully populated and the metaclass\'s "__new__()" method gets\ninvoked. That method builds the new type and it saves the ordered\ndictionary keys in an attribute called "members".\n\n\nCustomizing instance and subclass checks\n========================================\n\nThe following methods are used to override the default behavior of the\n"isinstance()" and "issubclass()" built-in functions.\n\nIn particular, the metaclass "abc.ABCMeta" implements these methods in\norder to allow the addition of Abstract Base Classes (ABCs) as\n"virtual base classes" to any class or type (including built-in\ntypes), including other ABCs.\n\nclass.__instancecheck__(self, instance)\n\n Return true if *instance* should be considered a (direct or\n indirect) instance of *class*. If defined, called to implement\n "isinstance(instance, class)".\n\nclass.__subclasscheck__(self, subclass)\n\n Return true if *subclass* should be considered a (direct or\n indirect) subclass of *class*. If defined, called to implement\n "issubclass(subclass, class)".\n\nNote that these methods are looked up on the type (metaclass) of a\nclass. They cannot be defined as class methods in the actual class.\nThis is consistent with the lookup of special methods that are called\non instances, only in this case the instance is itself a class.\n\nSee also: **PEP 3119** - Introducing Abstract Base Classes\n\n Includes the specification for customizing "isinstance()" and\n "issubclass()" behavior through "__instancecheck__()" and\n "__subclasscheck__()", with motivation for this functionality in\n the context of adding Abstract Base Classes (see the "abc"\n module) to the language.\n\n\nEmulating callable objects\n==========================\n\nobject.__call__(self[, args...])\n\n Called when the instance is "called" as a function; if this method\n is defined, "x(arg1, arg2, ...)" is a shorthand for\n "x.__call__(arg1, arg2, ...)".\n\n\nEmulating container types\n=========================\n\nThe following methods can be defined to implement container objects.\nContainers usually are sequences (such as lists or tuples) or mappings\n(like dictionaries), but can represent other containers as well. The\nfirst set of methods is used either to emulate a sequence or to\nemulate a mapping; the difference is that for a sequence, the\nallowable keys should be the integers *k* for which "0 <= k < N" where\n*N* is the length of the sequence, or slice objects, which define a\nrange of items. It is also recommended that mappings provide the\nmethods "keys()", "values()", "items()", "get()", "clear()",\n"setdefault()", "pop()", "popitem()", "copy()", and "update()"\nbehaving similar to those for Python\'s standard dictionary objects.\nThe "collections" module provides a "MutableMapping" abstract base\nclass to help create those methods from a base set of "__getitem__()",\n"__setitem__()", "__delitem__()", and "keys()". Mutable sequences\nshould provide methods "append()", "count()", "index()", "extend()",\n"insert()", "pop()", "remove()", "reverse()" and "sort()", like Python\nstandard list objects. Finally, sequence types should implement\naddition (meaning concatenation) and multiplication (meaning\nrepetition) by defining the methods "__add__()", "__radd__()",\n"__iadd__()", "__mul__()", "__rmul__()" and "__imul__()" described\nbelow; they should not define other numerical operators. It is\nrecommended that both mappings and sequences implement the\n"__contains__()" method to allow efficient use of the "in" operator;\nfor mappings, "in" should search the mapping\'s keys; for sequences, it\nshould search through the values. It is further recommended that both\nmappings and sequences implement the "__iter__()" method to allow\nefficient iteration through the container; for mappings, "__iter__()"\nshould be the same as "keys()"; for sequences, it should iterate\nthrough the values.\n\nobject.__len__(self)\n\n Called to implement the built-in function "len()". Should return\n the length of the object, an integer ">=" 0. Also, an object that\n doesn\'t define a "__bool__()" method and whose "__len__()" method\n returns zero is considered to be false in a Boolean context.\n\n **CPython implementation detail:** In CPython, the length is\n required to be at most "sys.maxsize". If the length is larger than\n "sys.maxsize" some features (such as "len()") may raise\n "OverflowError". To prevent raising "OverflowError" by truth value\n testing, an object must define a "__bool__()" method.\n\nobject.__length_hint__(self)\n\n Called to implement "operator.length_hint()". Should return an\n estimated length for the object (which may be greater or less than\n the actual length). The length must be an integer ">=" 0. This\n method is purely an optimization and is never required for\n correctness.\n\n New in version 3.4.\n\nNote: Slicing is done exclusively with the following three methods.\n A call like\n\n a[1:2] = b\n\n is translated to\n\n a[slice(1, 2, None)] = b\n\n and so forth. Missing slice items are always filled in with "None".\n\nobject.__getitem__(self, key)\n\n Called to implement evaluation of "self[key]". For sequence types,\n the accepted keys should be integers and slice objects. Note that\n the special interpretation of negative indexes (if the class wishes\n to emulate a sequence type) is up to the "__getitem__()" method. If\n *key* is of an inappropriate type, "TypeError" may be raised; if of\n a value outside the set of indexes for the sequence (after any\n special interpretation of negative values), "IndexError" should be\n raised. For mapping types, if *key* is missing (not in the\n container), "KeyError" should be raised.\n\n Note: "for" loops expect that an "IndexError" will be raised for\n illegal indexes to allow proper detection of the end of the\n sequence.\n\nobject.__missing__(self, key)\n\n Called by "dict"."__getitem__()" to implement "self[key]" for dict\n subclasses when key is not in the dictionary.\n\nobject.__setitem__(self, key, value)\n\n Called to implement assignment to "self[key]". Same note as for\n "__getitem__()". This should only be implemented for mappings if\n the objects support changes to the values for keys, or if new keys\n can be added, or for sequences if elements can be replaced. The\n same exceptions should be raised for improper *key* values as for\n the "__getitem__()" method.\n\nobject.__delitem__(self, key)\n\n Called to implement deletion of "self[key]". Same note as for\n "__getitem__()". This should only be implemented for mappings if\n the objects support removal of keys, or for sequences if elements\n can be removed from the sequence. The same exceptions should be\n raised for improper *key* values as for the "__getitem__()" method.\n\nobject.__iter__(self)\n\n This method is called when an iterator is required for a container.\n This method should return a new iterator object that can iterate\n over all the objects in the container. For mappings, it should\n iterate over the keys of the container.\n\n Iterator objects also need to implement this method; they are\n required to return themselves. For more information on iterator\n objects, see *Iterator Types*.\n\nobject.__reversed__(self)\n\n Called (if present) by the "reversed()" built-in to implement\n reverse iteration. It should return a new iterator object that\n iterates over all the objects in the container in reverse order.\n\n If the "__reversed__()" method is not provided, the "reversed()"\n built-in will fall back to using the sequence protocol ("__len__()"\n and "__getitem__()"). Objects that support the sequence protocol\n should only provide "__reversed__()" if they can provide an\n implementation that is more efficient than the one provided by\n "reversed()".\n\nThe membership test operators ("in" and "not in") are normally\nimplemented as an iteration through a sequence. However, container\nobjects can supply the following special method with a more efficient\nimplementation, which also does not require the object be a sequence.\n\nobject.__contains__(self, item)\n\n Called to implement membership test operators. Should return true\n if *item* is in *self*, false otherwise. For mapping objects, this\n should consider the keys of the mapping rather than the values or\n the key-item pairs.\n\n For objects that don\'t define "__contains__()", the membership test\n first tries iteration via "__iter__()", then the old sequence\n iteration protocol via "__getitem__()", see *this section in the\n language reference*.\n\n\nEmulating numeric types\n=======================\n\nThe following methods can be defined to emulate numeric objects.\nMethods corresponding to operations that are not supported by the\nparticular kind of number implemented (e.g., bitwise operations for\nnon-integral numbers) should be left undefined.\n\nobject.__add__(self, other)\nobject.__sub__(self, other)\nobject.__mul__(self, other)\nobject.__matmul__(self, other)\nobject.__truediv__(self, other)\nobject.__floordiv__(self, other)\nobject.__mod__(self, other)\nobject.__divmod__(self, other)\nobject.__pow__(self, other[, modulo])\nobject.__lshift__(self, other)\nobject.__rshift__(self, other)\nobject.__and__(self, other)\nobject.__xor__(self, other)\nobject.__or__(self, other)\n\n These methods are called to implement the binary arithmetic\n operations ("+", "-", "*", "@", "/", "//", "%", "divmod()",\n "pow()", "**", "<<", ">>", "&", "^", "|"). For instance, to\n evaluate the expression "x + y", where *x* is an instance of a\n class that has an "__add__()" method, "x.__add__(y)" is called.\n The "__divmod__()" method should be the equivalent to using\n "__floordiv__()" and "__mod__()"; it should not be related to\n "__truediv__()". Note that "__pow__()" should be defined to accept\n an optional third argument if the ternary version of the built-in\n "pow()" function is to be supported.\n\n If one of those methods does not support the operation with the\n supplied arguments, it should return "NotImplemented".\n\nobject.__radd__(self, other)\nobject.__rsub__(self, other)\nobject.__rmul__(self, other)\nobject.__rmatmul__(self, other)\nobject.__rtruediv__(self, other)\nobject.__rfloordiv__(self, other)\nobject.__rmod__(self, other)\nobject.__rdivmod__(self, other)\nobject.__rpow__(self, other)\nobject.__rlshift__(self, other)\nobject.__rrshift__(self, other)\nobject.__rand__(self, other)\nobject.__rxor__(self, other)\nobject.__ror__(self, other)\n\n These methods are called to implement the binary arithmetic\n operations ("+", "-", "*", "@", "/", "//", "%", "divmod()",\n "pow()", "**", "<<", ">>", "&", "^", "|") with reflected (swapped)\n operands. These functions are only called if the left operand does\n not support the corresponding operation and the operands are of\n different types. [2] For instance, to evaluate the expression "x -\n y", where *y* is an instance of a class that has an "__rsub__()"\n method, "y.__rsub__(x)" is called if "x.__sub__(y)" returns\n *NotImplemented*.\n\n Note that ternary "pow()" will not try calling "__rpow__()" (the\n coercion rules would become too complicated).\n\n Note: If the right operand\'s type is a subclass of the left\n operand\'s type and that subclass provides the reflected method\n for the operation, this method will be called before the left\n operand\'s non-reflected method. This behavior allows subclasses\n to override their ancestors\' operations.\n\nobject.__iadd__(self, other)\nobject.__isub__(self, other)\nobject.__imul__(self, other)\nobject.__imatmul__(self, other)\nobject.__itruediv__(self, other)\nobject.__ifloordiv__(self, other)\nobject.__imod__(self, other)\nobject.__ipow__(self, other[, modulo])\nobject.__ilshift__(self, other)\nobject.__irshift__(self, other)\nobject.__iand__(self, other)\nobject.__ixor__(self, other)\nobject.__ior__(self, other)\n\n These methods are called to implement the augmented arithmetic\n assignments ("+=", "-=", "*=", "@=", "/=", "//=", "%=", "**=",\n "<<=", ">>=", "&=", "^=", "|="). These methods should attempt to\n do the operation in-place (modifying *self*) and return the result\n (which could be, but does not have to be, *self*). If a specific\n method is not defined, the augmented assignment falls back to the\n normal methods. For instance, if *x* is an instance of a class\n with an "__iadd__()" method, "x += y" is equivalent to "x =\n x.__iadd__(y)" . Otherwise, "x.__add__(y)" and "y.__radd__(x)" are\n considered, as with the evaluation of "x + y". In certain\n situations, augmented assignment can result in unexpected errors\n (see *Why does a_tuple[i] += [\'item\'] raise an exception when the\n addition works?*), but this behavior is in fact part of the data\n model.\n\nobject.__neg__(self)\nobject.__pos__(self)\nobject.__abs__(self)\nobject.__invert__(self)\n\n Called to implement the unary arithmetic operations ("-", "+",\n "abs()" and "~").\n\nobject.__complex__(self)\nobject.__int__(self)\nobject.__float__(self)\nobject.__round__(self[, n])\n\n Called to implement the built-in functions "complex()", "int()",\n "float()" and "round()". Should return a value of the appropriate\n type.\n\nobject.__index__(self)\n\n Called to implement "operator.index()", and whenever Python needs\n to losslessly convert the numeric object to an integer object (such\n as in slicing, or in the built-in "bin()", "hex()" and "oct()"\n functions). Presence of this method indicates that the numeric\n object is an integer type. Must return an integer.\n\n Note: In order to have a coherent integer type class, when\n "__index__()" is defined "__int__()" should also be defined, and\n both should return the same value.\n\n\nWith Statement Context Managers\n===============================\n\nA *context manager* is an object that defines the runtime context to\nbe established when executing a "with" statement. The context manager\nhandles the entry into, and the exit from, the desired runtime context\nfor the execution of the block of code. Context managers are normally\ninvoked using the "with" statement (described in section *The with\nstatement*), but can also be used by directly invoking their methods.\n\nTypical uses of context managers include saving and restoring various\nkinds of global state, locking and unlocking resources, closing opened\nfiles, etc.\n\nFor more information on context managers, see *Context Manager Types*.\n\nobject.__enter__(self)\n\n Enter the runtime context related to this object. The "with"\n statement will bind this method\'s return value to the target(s)\n specified in the "as" clause of the statement, if any.\n\nobject.__exit__(self, exc_type, exc_value, traceback)\n\n Exit the runtime context related to this object. The parameters\n describe the exception that caused the context to be exited. If the\n context was exited without an exception, all three arguments will\n be "None".\n\n If an exception is supplied, and the method wishes to suppress the\n exception (i.e., prevent it from being propagated), it should\n return a true value. Otherwise, the exception will be processed\n normally upon exit from this method.\n\n Note that "__exit__()" methods should not reraise the passed-in\n exception; this is the caller\'s responsibility.\n\nSee also: **PEP 343** - The "with" statement\n\n The specification, background, and examples for the Python "with"\n statement.\n\n\nSpecial method lookup\n=====================\n\nFor custom classes, implicit invocations of special methods are only\nguaranteed to work correctly if defined on an object\'s type, not in\nthe object\'s instance dictionary. That behaviour is the reason why\nthe following code raises an exception:\n\n >>> class C:\n ... pass\n ...\n >>> c = C()\n >>> c.__len__ = lambda: 5\n >>> len(c)\n Traceback (most recent call last):\n File "", line 1, in \n TypeError: object of type \'C\' has no len()\n\nThe rationale behind this behaviour lies with a number of special\nmethods such as "__hash__()" and "__repr__()" that are implemented by\nall objects, including type objects. If the implicit lookup of these\nmethods used the conventional lookup process, they would fail when\ninvoked on the type object itself:\n\n >>> 1 .__hash__() == hash(1)\n True\n >>> int.__hash__() == hash(int)\n Traceback (most recent call last):\n File "", line 1, in \n TypeError: descriptor \'__hash__\' of \'int\' object needs an argument\n\nIncorrectly attempting to invoke an unbound method of a class in this\nway is sometimes referred to as \'metaclass confusion\', and is avoided\nby bypassing the instance when looking up special methods:\n\n >>> type(1).__hash__(1) == hash(1)\n True\n >>> type(int).__hash__(int) == hash(int)\n True\n\nIn addition to bypassing any instance attributes in the interest of\ncorrectness, implicit special method lookup generally also bypasses\nthe "__getattribute__()" method even of the object\'s metaclass:\n\n >>> class Meta(type):\n ... def __getattribute__(*args):\n ... print("Metaclass getattribute invoked")\n ... return type.__getattribute__(*args)\n ...\n >>> class C(object, metaclass=Meta):\n ... def __len__(self):\n ... return 10\n ... def __getattribute__(*args):\n ... print("Class getattribute invoked")\n ... return object.__getattribute__(*args)\n ...\n >>> c = C()\n >>> c.__len__() # Explicit lookup via instance\n Class getattribute invoked\n 10\n >>> type(c).__len__(c) # Explicit lookup via type\n Metaclass getattribute invoked\n 10\n >>> len(c) # Implicit lookup\n 10\n\nBypassing the "__getattribute__()" machinery in this fashion provides\nsignificant scope for speed optimisations within the interpreter, at\nthe cost of some flexibility in the handling of special methods (the\nspecial method *must* be set on the class object itself in order to be\nconsistently invoked by the interpreter).\n', + 'string-methods': u'\nString Methods\n**************\n\nStrings implement all of the *common* sequence operations, along with\nthe additional methods described below.\n\nStrings also support two styles of string formatting, one providing a\nlarge degree of flexibility and customization (see "str.format()",\n*Format String Syntax* and *Custom String Formatting*) and the other\nbased on C "printf" style formatting that handles a narrower range of\ntypes and is slightly harder to use correctly, but is often faster for\nthe cases it can handle (*printf-style String Formatting*).\n\nThe *Text Processing Services* section of the standard library covers\na number of other modules that provide various text related utilities\n(including regular expression support in the "re" module).\n\nstr.capitalize()\n\n Return a copy of the string with its first character capitalized\n and the rest lowercased.\n\nstr.casefold()\n\n Return a casefolded copy of the string. Casefolded strings may be\n used for caseless matching.\n\n Casefolding is similar to lowercasing but more aggressive because\n it is intended to remove all case distinctions in a string. For\n example, the German lowercase letter "\'\xdf\'" is equivalent to ""ss"".\n Since it is already lowercase, "lower()" would do nothing to "\'\xdf\'";\n "casefold()" converts it to ""ss"".\n\n The casefolding algorithm is described in section 3.13 of the\n Unicode Standard.\n\n New in version 3.3.\n\nstr.center(width[, fillchar])\n\n Return centered in a string of length *width*. Padding is done\n using the specified *fillchar* (default is an ASCII space). The\n original string is returned if *width* is less than or equal to\n "len(s)".\n\nstr.count(sub[, start[, end]])\n\n Return the number of non-overlapping occurrences of substring *sub*\n in the range [*start*, *end*]. Optional arguments *start* and\n *end* are interpreted as in slice notation.\n\nstr.encode(encoding="utf-8", errors="strict")\n\n Return an encoded version of the string as a bytes object. Default\n encoding is "\'utf-8\'". *errors* may be given to set a different\n error handling scheme. The default for *errors* is "\'strict\'",\n meaning that encoding errors raise a "UnicodeError". Other possible\n values are "\'ignore\'", "\'replace\'", "\'xmlcharrefreplace\'",\n "\'backslashreplace\'" and any other name registered via\n "codecs.register_error()", see section *Error Handlers*. For a list\n of possible encodings, see section *Standard Encodings*.\n\n Changed in version 3.1: Support for keyword arguments added.\n\nstr.endswith(suffix[, start[, end]])\n\n Return "True" if the string ends with the specified *suffix*,\n otherwise return "False". *suffix* can also be a tuple of suffixes\n to look for. With optional *start*, test beginning at that\n position. With optional *end*, stop comparing at that position.\n\nstr.expandtabs(tabsize=8)\n\n Return a copy of the string where all tab characters are replaced\n by one or more spaces, depending on the current column and the\n given tab size. Tab positions occur every *tabsize* characters\n (default is 8, giving tab positions at columns 0, 8, 16 and so on).\n To expand the string, the current column is set to zero and the\n string is examined character by character. If the character is a\n tab ("\\t"), one or more space characters are inserted in the result\n until the current column is equal to the next tab position. (The\n tab character itself is not copied.) If the character is a newline\n ("\\n") or return ("\\r"), it is copied and the current column is\n reset to zero. Any other character is copied unchanged and the\n current column is incremented by one regardless of how the\n character is represented when printed.\n\n >>> \'01\\t012\\t0123\\t01234\'.expandtabs()\n \'01 012 0123 01234\'\n >>> \'01\\t012\\t0123\\t01234\'.expandtabs(4)\n \'01 012 0123 01234\'\n\nstr.find(sub[, start[, end]])\n\n Return the lowest index in the string where substring *sub* is\n found within the slice "s[start:end]". Optional arguments *start*\n and *end* are interpreted as in slice notation. Return "-1" if\n *sub* is not found.\n\n Note: The "find()" method should be used only if you need to know\n the position of *sub*. To check if *sub* is a substring or not,\n use the "in" operator:\n\n >>> \'Py\' in \'Python\'\n True\n\nstr.format(*args, **kwargs)\n\n Perform a string formatting operation. The string on which this\n method is called can contain literal text or replacement fields\n delimited by braces "{}". Each replacement field contains either\n the numeric index of a positional argument, or the name of a\n keyword argument. Returns a copy of the string where each\n replacement field is replaced with the string value of the\n corresponding argument.\n\n >>> "The sum of 1 + 2 is {0}".format(1+2)\n \'The sum of 1 + 2 is 3\'\n\n See *Format String Syntax* for a description of the various\n formatting options that can be specified in format strings.\n\nstr.format_map(mapping)\n\n Similar to "str.format(**mapping)", except that "mapping" is used\n directly and not copied to a "dict". This is useful if for example\n "mapping" is a dict subclass:\n\n >>> class Default(dict):\n ... def __missing__(self, key):\n ... return key\n ...\n >>> \'{name} was born in {country}\'.format_map(Default(name=\'Guido\'))\n \'Guido was born in country\'\n\n New in version 3.2.\n\nstr.index(sub[, start[, end]])\n\n Like "find()", but raise "ValueError" when the substring is not\n found.\n\nstr.isalnum()\n\n Return true if all characters in the string are alphanumeric and\n there is at least one character, false otherwise. A character "c"\n is alphanumeric if one of the following returns "True":\n "c.isalpha()", "c.isdecimal()", "c.isdigit()", or "c.isnumeric()".\n\nstr.isalpha()\n\n Return true if all characters in the string are alphabetic and\n there is at least one character, false otherwise. Alphabetic\n characters are those characters defined in the Unicode character\n database as "Letter", i.e., those with general category property\n being one of "Lm", "Lt", "Lu", "Ll", or "Lo". Note that this is\n different from the "Alphabetic" property defined in the Unicode\n Standard.\n\nstr.isdecimal()\n\n Return true if all characters in the string are decimal characters\n and there is at least one character, false otherwise. Decimal\n characters are those that can be used to form numbers in base 10,\n e.g. U+0660, ARABIC-INDIC DIGIT ZERO. Formally a decimal character\n is a character in the Unicode General Category "Nd".\n\nstr.isdigit()\n\n Return true if all characters in the string are digits and there is\n at least one character, false otherwise. Digits include decimal\n characters and digits that need special handling, such as the\n compatibility superscript digits. This covers digits which cannot\n be used to form numbers in base 10, like the Kharosthi numbers.\n Formally, a digit is a character that has the property value\n Numeric_Type=Digit or Numeric_Type=Decimal.\n\nstr.isidentifier()\n\n Return true if the string is a valid identifier according to the\n language definition, section *Identifiers and keywords*.\n\n Use "keyword.iskeyword()" to test for reserved identifiers such as\n "def" and "class".\n\nstr.islower()\n\n Return true if all cased characters [4] in the string are lowercase\n and there is at least one cased character, false otherwise.\n\nstr.isnumeric()\n\n Return true if all characters in the string are numeric characters,\n and there is at least one character, false otherwise. Numeric\n characters include digit characters, and all characters that have\n the Unicode numeric value property, e.g. U+2155, VULGAR FRACTION\n ONE FIFTH. Formally, numeric characters are those with the\n property value Numeric_Type=Digit, Numeric_Type=Decimal or\n Numeric_Type=Numeric.\n\nstr.isprintable()\n\n Return true if all characters in the string are printable or the\n string is empty, false otherwise. Nonprintable characters are\n those characters defined in the Unicode character database as\n "Other" or "Separator", excepting the ASCII space (0x20) which is\n considered printable. (Note that printable characters in this\n context are those which should not be escaped when "repr()" is\n invoked on a string. It has no bearing on the handling of strings\n written to "sys.stdout" or "sys.stderr".)\n\nstr.isspace()\n\n Return true if there are only whitespace characters in the string\n and there is at least one character, false otherwise. Whitespace\n characters are those characters defined in the Unicode character\n database as "Other" or "Separator" and those with bidirectional\n property being one of "WS", "B", or "S".\n\nstr.istitle()\n\n Return true if the string is a titlecased string and there is at\n least one character, for example uppercase characters may only\n follow uncased characters and lowercase characters only cased ones.\n Return false otherwise.\n\nstr.isupper()\n\n Return true if all cased characters [4] in the string are uppercase\n and there is at least one cased character, false otherwise.\n\nstr.join(iterable)\n\n Return a string which is the concatenation of the strings in\n *iterable*. A "TypeError" will be raised if there are any non-\n string values in *iterable*, including "bytes" objects. The\n separator between elements is the string providing this method.\n\nstr.ljust(width[, fillchar])\n\n Return the string left justified in a string of length *width*.\n Padding is done using the specified *fillchar* (default is an ASCII\n space). The original string is returned if *width* is less than or\n equal to "len(s)".\n\nstr.lower()\n\n Return a copy of the string with all the cased characters [4]\n converted to lowercase.\n\n The lowercasing algorithm used is described in section 3.13 of the\n Unicode Standard.\n\nstr.lstrip([chars])\n\n Return a copy of the string with leading characters removed. The\n *chars* argument is a string specifying the set of characters to be\n removed. If omitted or "None", the *chars* argument defaults to\n removing whitespace. The *chars* argument is not a prefix; rather,\n all combinations of its values are stripped:\n\n >>> \' spacious \'.lstrip()\n \'spacious \'\n >>> \'www.example.com\'.lstrip(\'cmowz.\')\n \'example.com\'\n\nstatic str.maketrans(x[, y[, z]])\n\n This static method returns a translation table usable for\n "str.translate()".\n\n If there is only one argument, it must be a dictionary mapping\n Unicode ordinals (integers) or characters (strings of length 1) to\n Unicode ordinals, strings (of arbitrary lengths) or "None".\n Character keys will then be converted to ordinals.\n\n If there are two arguments, they must be strings of equal length,\n and in the resulting dictionary, each character in x will be mapped\n to the character at the same position in y. If there is a third\n argument, it must be a string, whose characters will be mapped to\n "None" in the result.\n\nstr.partition(sep)\n\n Split the string at the first occurrence of *sep*, and return a\n 3-tuple containing the part before the separator, the separator\n itself, and the part after the separator. If the separator is not\n found, return a 3-tuple containing the string itself, followed by\n two empty strings.\n\nstr.replace(old, new[, count])\n\n Return a copy of the string with all occurrences of substring *old*\n replaced by *new*. If the optional argument *count* is given, only\n the first *count* occurrences are replaced.\n\nstr.rfind(sub[, start[, end]])\n\n Return the highest index in the string where substring *sub* is\n found, such that *sub* is contained within "s[start:end]".\n Optional arguments *start* and *end* are interpreted as in slice\n notation. Return "-1" on failure.\n\nstr.rindex(sub[, start[, end]])\n\n Like "rfind()" but raises "ValueError" when the substring *sub* is\n not found.\n\nstr.rjust(width[, fillchar])\n\n Return the string right justified in a string of length *width*.\n Padding is done using the specified *fillchar* (default is an ASCII\n space). The original string is returned if *width* is less than or\n equal to "len(s)".\n\nstr.rpartition(sep)\n\n Split the string at the last occurrence of *sep*, and return a\n 3-tuple containing the part before the separator, the separator\n itself, and the part after the separator. If the separator is not\n found, return a 3-tuple containing two empty strings, followed by\n the string itself.\n\nstr.rsplit(sep=None, maxsplit=-1)\n\n Return a list of the words in the string, using *sep* as the\n delimiter string. If *maxsplit* is given, at most *maxsplit* splits\n are done, the *rightmost* ones. If *sep* is not specified or\n "None", any whitespace string is a separator. Except for splitting\n from the right, "rsplit()" behaves like "split()" which is\n described in detail below.\n\nstr.rstrip([chars])\n\n Return a copy of the string with trailing characters removed. The\n *chars* argument is a string specifying the set of characters to be\n removed. If omitted or "None", the *chars* argument defaults to\n removing whitespace. The *chars* argument is not a suffix; rather,\n all combinations of its values are stripped:\n\n >>> \' spacious \'.rstrip()\n \' spacious\'\n >>> \'mississippi\'.rstrip(\'ipz\')\n \'mississ\'\n\nstr.split(sep=None, maxsplit=-1)\n\n Return a list of the words in the string, using *sep* as the\n delimiter string. If *maxsplit* is given, at most *maxsplit*\n splits are done (thus, the list will have at most "maxsplit+1"\n elements). If *maxsplit* is not specified or "-1", then there is\n no limit on the number of splits (all possible splits are made).\n\n If *sep* is given, consecutive delimiters are not grouped together\n and are deemed to delimit empty strings (for example,\n "\'1,,2\'.split(\',\')" returns "[\'1\', \'\', \'2\']"). The *sep* argument\n may consist of multiple characters (for example,\n "\'1<>2<>3\'.split(\'<>\')" returns "[\'1\', \'2\', \'3\']"). Splitting an\n empty string with a specified separator returns "[\'\']".\n\n For example:\n\n >>> \'1,2,3\'.split(\',\')\n [\'1\', \'2\', \'3\']\n >>> \'1,2,3\'.split(\',\', maxsplit=1)\n [\'1\', \'2,3\']\n >>> \'1,2,,3,\'.split(\',\')\n [\'1\', \'2\', \'\', \'3\', \'\']\n\n If *sep* is not specified or is "None", a different splitting\n algorithm is applied: runs of consecutive whitespace are regarded\n as a single separator, and the result will contain no empty strings\n at the start or end if the string has leading or trailing\n whitespace. Consequently, splitting an empty string or a string\n consisting of just whitespace with a "None" separator returns "[]".\n\n For example:\n\n >>> \'1 2 3\'.split()\n [\'1\', \'2\', \'3\']\n >>> \'1 2 3\'.split(maxsplit=1)\n [\'1\', \'2 3\']\n >>> \' 1 2 3 \'.split()\n [\'1\', \'2\', \'3\']\n\nstr.splitlines([keepends])\n\n Return a list of the lines in the string, breaking at line\n boundaries. Line breaks are not included in the resulting list\n unless *keepends* is given and true.\n\n This method splits on the following line boundaries. In\n particular, the boundaries are a superset of *universal newlines*.\n\n +-------------------------+-------------------------------+\n | Representation | Description |\n +=========================+===============================+\n | "\\n" | Line Feed |\n +-------------------------+-------------------------------+\n | "\\r" | Carriage Return |\n +-------------------------+-------------------------------+\n | "\\r\\n" | Carriage Return + Line Feed |\n +-------------------------+-------------------------------+\n | "\\v" or "\\x0b" | Line Tabulation |\n +-------------------------+-------------------------------+\n | "\\f" or "\\x0c" | Form Feed |\n +-------------------------+-------------------------------+\n | "\\x1c" | File Separator |\n +-------------------------+-------------------------------+\n | "\\x1d" | Group Separator |\n +-------------------------+-------------------------------+\n | "\\x1e" | Record Separator |\n +-------------------------+-------------------------------+\n | "\\x85" | Next Line (C1 Control Code) |\n +-------------------------+-------------------------------+\n | "\\u2028" | Line Separator |\n +-------------------------+-------------------------------+\n | "\\u2029" | Paragraph Separator |\n +-------------------------+-------------------------------+\n\n Changed in version 3.2: "\\v" and "\\f" added to list of line\n boundaries.\n\n For example:\n\n >>> \'ab c\\n\\nde fg\\rkl\\r\\n\'.splitlines()\n [\'ab c\', \'\', \'de fg\', \'kl\']\n >>> \'ab c\\n\\nde fg\\rkl\\r\\n\'.splitlines(keepends=True)\n [\'ab c\\n\', \'\\n\', \'de fg\\r\', \'kl\\r\\n\']\n\n Unlike "split()" when a delimiter string *sep* is given, this\n method returns an empty list for the empty string, and a terminal\n line break does not result in an extra line:\n\n >>> "".splitlines()\n []\n >>> "One line\\n".splitlines()\n [\'One line\']\n\n For comparison, "split(\'\\n\')" gives:\n\n >>> \'\'.split(\'\\n\')\n [\'\']\n >>> \'Two lines\\n\'.split(\'\\n\')\n [\'Two lines\', \'\']\n\nstr.startswith(prefix[, start[, end]])\n\n Return "True" if string starts with the *prefix*, otherwise return\n "False". *prefix* can also be a tuple of prefixes to look for.\n With optional *start*, test string beginning at that position.\n With optional *end*, stop comparing string at that position.\n\nstr.strip([chars])\n\n Return a copy of the string with the leading and trailing\n characters removed. The *chars* argument is a string specifying the\n set of characters to be removed. If omitted or "None", the *chars*\n argument defaults to removing whitespace. The *chars* argument is\n not a prefix or suffix; rather, all combinations of its values are\n stripped:\n\n >>> \' spacious \'.strip()\n \'spacious\'\n >>> \'www.example.com\'.strip(\'cmowz.\')\n \'example\'\n\n The outermost leading and trailing *chars* argument values are\n stripped from the string. Characters are removed from the leading\n end until reaching a string character that is not contained in the\n set of characters in *chars*. A similar action takes place on the\n trailing end. For example:\n\n >>> comment_string = \'#....... Section 3.2.1 Issue #32 .......\'\n >>> comment_string.strip(\'.#! \')\n \'Section 3.2.1 Issue #32\'\n\nstr.swapcase()\n\n Return a copy of the string with uppercase characters converted to\n lowercase and vice versa. Note that it is not necessarily true that\n "s.swapcase().swapcase() == s".\n\nstr.title()\n\n Return a titlecased version of the string where words start with an\n uppercase character and the remaining characters are lowercase.\n\n For example:\n\n >>> \'Hello world\'.title()\n \'Hello World\'\n\n The algorithm uses a simple language-independent definition of a\n word as groups of consecutive letters. The definition works in\n many contexts but it means that apostrophes in contractions and\n possessives form word boundaries, which may not be the desired\n result:\n\n >>> "they\'re bill\'s friends from the UK".title()\n "They\'Re Bill\'S Friends From The Uk"\n\n A workaround for apostrophes can be constructed using regular\n expressions:\n\n >>> import re\n >>> def titlecase(s):\n ... return re.sub(r"[A-Za-z]+(\'[A-Za-z]+)?",\n ... lambda mo: mo.group(0)[0].upper() +\n ... mo.group(0)[1:].lower(),\n ... s)\n ...\n >>> titlecase("they\'re bill\'s friends.")\n "They\'re Bill\'s Friends."\n\nstr.translate(table)\n\n Return a copy of the string in which each character has been mapped\n through the given translation table. The table must be an object\n that implements indexing via "__getitem__()", typically a *mapping*\n or *sequence*. When indexed by a Unicode ordinal (an integer), the\n table object can do any of the following: return a Unicode ordinal\n or a string, to map the character to one or more other characters;\n return "None", to delete the character from the return string; or\n raise a "LookupError" exception, to map the character to itself.\n\n You can use "str.maketrans()" to create a translation map from\n character-to-character mappings in different formats.\n\n See also the "codecs" module for a more flexible approach to custom\n character mappings.\n\nstr.upper()\n\n Return a copy of the string with all the cased characters [4]\n converted to uppercase. Note that "str.upper().isupper()" might be\n "False" if "s" contains uncased characters or if the Unicode\n category of the resulting character(s) is not "Lu" (Letter,\n uppercase), but e.g. "Lt" (Letter, titlecase).\n\n The uppercasing algorithm used is described in section 3.13 of the\n Unicode Standard.\n\nstr.zfill(width)\n\n Return a copy of the string left filled with ASCII "\'0\'" digits to\n make a string of length *width*. A leading sign prefix\n ("\'+\'"/"\'-\'") is handled by inserting the padding *after* the sign\n character rather than before. The original string is returned if\n *width* is less than or equal to "len(s)".\n\n For example:\n\n >>> "42".zfill(5)\n \'00042\'\n >>> "-42".zfill(5)\n \'-0042\'\n', + 'strings': u'\nString and Bytes literals\n*************************\n\nString literals are described by the following lexical definitions:\n\n stringliteral ::= [stringprefix](shortstring | longstring)\n stringprefix ::= "r" | "u" | "R" | "U"\n shortstring ::= "\'" shortstringitem* "\'" | \'"\' shortstringitem* \'"\'\n longstring ::= "\'\'\'" longstringitem* "\'\'\'" | \'"""\' longstringitem* \'"""\'\n shortstringitem ::= shortstringchar | stringescapeseq\n longstringitem ::= longstringchar | stringescapeseq\n shortstringchar ::= \n longstringchar ::= \n stringescapeseq ::= "\\" \n\n bytesliteral ::= bytesprefix(shortbytes | longbytes)\n bytesprefix ::= "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB"\n shortbytes ::= "\'" shortbytesitem* "\'" | \'"\' shortbytesitem* \'"\'\n longbytes ::= "\'\'\'" longbytesitem* "\'\'\'" | \'"""\' longbytesitem* \'"""\'\n shortbytesitem ::= shortbyteschar | bytesescapeseq\n longbytesitem ::= longbyteschar | bytesescapeseq\n shortbyteschar ::= \n longbyteschar ::= \n bytesescapeseq ::= "\\" \n\nOne syntactic restriction not indicated by these productions is that\nwhitespace is not allowed between the "stringprefix" or "bytesprefix"\nand the rest of the literal. The source character set is defined by\nthe encoding declaration; it is UTF-8 if no encoding declaration is\ngiven in the source file; see section *Encoding declarations*.\n\nIn plain English: Both types of literals can be enclosed in matching\nsingle quotes ("\'") or double quotes ("""). They can also be enclosed\nin matching groups of three single or double quotes (these are\ngenerally referred to as *triple-quoted strings*). The backslash\n("\\") character is used to escape characters that otherwise have a\nspecial meaning, such as newline, backslash itself, or the quote\ncharacter.\n\nBytes literals are always prefixed with "\'b\'" or "\'B\'"; they produce\nan instance of the "bytes" type instead of the "str" type. They may\nonly contain ASCII characters; bytes with a numeric value of 128 or\ngreater must be expressed with escapes.\n\nAs of Python 3.3 it is possible again to prefix string literals with a\n"u" prefix to simplify maintenance of dual 2.x and 3.x codebases.\n\nBoth string and bytes literals may optionally be prefixed with a\nletter "\'r\'" or "\'R\'"; such strings are called *raw strings* and treat\nbackslashes as literal characters. As a result, in string literals,\n"\'\\U\'" and "\'\\u\'" escapes in raw strings are not treated specially.\nGiven that Python 2.x\'s raw unicode literals behave differently than\nPython 3.x\'s the "\'ur\'" syntax is not supported.\n\nNew in version 3.3: The "\'rb\'" prefix of raw bytes literals has been\nadded as a synonym of "\'br\'".\n\nNew in version 3.3: Support for the unicode legacy literal\n("u\'value\'") was reintroduced to simplify the maintenance of dual\nPython 2.x and 3.x codebases. See **PEP 414** for more information.\n\nIn triple-quoted literals, unescaped newlines and quotes are allowed\n(and are retained), except that three unescaped quotes in a row\nterminate the literal. (A "quote" is the character used to open the\nliteral, i.e. either "\'" or """.)\n\nUnless an "\'r\'" or "\'R\'" prefix is present, escape sequences in string\nand bytes literals are interpreted according to rules similar to those\nused by Standard C. The recognized escape sequences are:\n\n+-------------------+-----------------------------------+---------+\n| Escape Sequence | Meaning | Notes |\n+===================+===================================+=========+\n| "\\newline" | Backslash and newline ignored | |\n+-------------------+-----------------------------------+---------+\n| "\\\\" | Backslash ("\\") | |\n+-------------------+-----------------------------------+---------+\n| "\\\'" | Single quote ("\'") | |\n+-------------------+-----------------------------------+---------+\n| "\\"" | Double quote (""") | |\n+-------------------+-----------------------------------+---------+\n| "\\a" | ASCII Bell (BEL) | |\n+-------------------+-----------------------------------+---------+\n| "\\b" | ASCII Backspace (BS) | |\n+-------------------+-----------------------------------+---------+\n| "\\f" | ASCII Formfeed (FF) | |\n+-------------------+-----------------------------------+---------+\n| "\\n" | ASCII Linefeed (LF) | |\n+-------------------+-----------------------------------+---------+\n| "\\r" | ASCII Carriage Return (CR) | |\n+-------------------+-----------------------------------+---------+\n| "\\t" | ASCII Horizontal Tab (TAB) | |\n+-------------------+-----------------------------------+---------+\n| "\\v" | ASCII Vertical Tab (VT) | |\n+-------------------+-----------------------------------+---------+\n| "\\ooo" | Character with octal value *ooo* | (1,3) |\n+-------------------+-----------------------------------+---------+\n| "\\xhh" | Character with hex value *hh* | (2,3) |\n+-------------------+-----------------------------------+---------+\n\nEscape sequences only recognized in string literals are:\n\n+-------------------+-----------------------------------+---------+\n| Escape Sequence | Meaning | Notes |\n+===================+===================================+=========+\n| "\\N{name}" | Character named *name* in the | (4) |\n| | Unicode database | |\n+-------------------+-----------------------------------+---------+\n| "\\uxxxx" | Character with 16-bit hex value | (5) |\n| | *xxxx* | |\n+-------------------+-----------------------------------+---------+\n| "\\Uxxxxxxxx" | Character with 32-bit hex value | (6) |\n| | *xxxxxxxx* | |\n+-------------------+-----------------------------------+---------+\n\nNotes:\n\n1. As in Standard C, up to three octal digits are accepted.\n\n2. Unlike in Standard C, exactly two hex digits are required.\n\n3. In a bytes literal, hexadecimal and octal escapes denote the\n byte with the given value. In a string literal, these escapes\n denote a Unicode character with the given value.\n\n4. Changed in version 3.3: Support for name aliases [1] has been\n added.\n\n5. Exactly four hex digits are required.\n\n6. Any Unicode character can be encoded this way. Exactly eight\n hex digits are required.\n\nUnlike Standard C, all unrecognized escape sequences are left in the\nstring unchanged, i.e., *the backslash is left in the result*. (This\nbehavior is useful when debugging: if an escape sequence is mistyped,\nthe resulting output is more easily recognized as broken.) It is also\nimportant to note that the escape sequences only recognized in string\nliterals fall into the category of unrecognized escapes for bytes\nliterals.\n\nEven in a raw literal, quotes can be escaped with a backslash, but the\nbackslash remains in the result; for example, "r"\\""" is a valid\nstring literal consisting of two characters: a backslash and a double\nquote; "r"\\"" is not a valid string literal (even a raw string cannot\nend in an odd number of backslashes). Specifically, *a raw literal\ncannot end in a single backslash* (since the backslash would escape\nthe following quote character). Note also that a single backslash\nfollowed by a newline is interpreted as those two characters as part\nof the literal, *not* as a line continuation.\n', + 'subscriptions': u'\nSubscriptions\n*************\n\nA subscription selects an item of a sequence (string, tuple or list)\nor mapping (dictionary) object:\n\n subscription ::= primary "[" expression_list "]"\n\nThe primary must evaluate to an object that supports subscription\n(lists or dictionaries for example). User-defined objects can support\nsubscription by defining a "__getitem__()" method.\n\nFor built-in objects, there are two types of objects that support\nsubscription:\n\nIf the primary is a mapping, the expression list must evaluate to an\nobject whose value is one of the keys of the mapping, and the\nsubscription selects the value in the mapping that corresponds to that\nkey. (The expression list is a tuple except if it has exactly one\nitem.)\n\nIf the primary is a sequence, the expression (list) must evaluate to\nan integer or a slice (as discussed in the following section).\n\nThe formal syntax makes no special provision for negative indices in\nsequences; however, built-in sequences all provide a "__getitem__()"\nmethod that interprets negative indices by adding the length of the\nsequence to the index (so that "x[-1]" selects the last item of "x").\nThe resulting value must be a nonnegative integer less than the number\nof items in the sequence, and the subscription selects the item whose\nindex is that value (counting from zero). Since the support for\nnegative indices and slicing occurs in the object\'s "__getitem__()"\nmethod, subclasses overriding this method will need to explicitly add\nthat support.\n\nA string\'s items are characters. A character is not a separate data\ntype but a string of exactly one character.\n', + 'truth': u'\nTruth Value Testing\n*******************\n\nAny object can be tested for truth value, for use in an "if" or\n"while" condition or as operand of the Boolean operations below. The\nfollowing values are considered false:\n\n* "None"\n\n* "False"\n\n* zero of any numeric type, for example, "0", "0.0", "0j".\n\n* any empty sequence, for example, "\'\'", "()", "[]".\n\n* any empty mapping, for example, "{}".\n\n* instances of user-defined classes, if the class defines a\n "__bool__()" or "__len__()" method, when that method returns the\n integer zero or "bool" value "False". [1]\n\nAll other values are considered true --- so objects of many types are\nalways true.\n\nOperations and built-in functions that have a Boolean result always\nreturn "0" or "False" for false and "1" or "True" for true, unless\notherwise stated. (Important exception: the Boolean operations "or"\nand "and" always return one of their operands.)\n', + 'try': u'\nThe "try" statement\n*******************\n\nThe "try" statement specifies exception handlers and/or cleanup code\nfor a group of statements:\n\n try_stmt ::= try1_stmt | try2_stmt\n try1_stmt ::= "try" ":" suite\n ("except" [expression ["as" identifier]] ":" suite)+\n ["else" ":" suite]\n ["finally" ":" suite]\n try2_stmt ::= "try" ":" suite\n "finally" ":" suite\n\nThe "except" clause(s) specify one or more exception handlers. When no\nexception occurs in the "try" clause, no exception handler is\nexecuted. When an exception occurs in the "try" suite, a search for an\nexception handler is started. This search inspects the except clauses\nin turn until one is found that matches the exception. An expression-\nless except clause, if present, must be last; it matches any\nexception. For an except clause with an expression, that expression\nis evaluated, and the clause matches the exception if the resulting\nobject is "compatible" with the exception. An object is compatible\nwith an exception if it is the class or a base class of the exception\nobject or a tuple containing an item compatible with the exception.\n\nIf no except clause matches the exception, the search for an exception\nhandler continues in the surrounding code and on the invocation stack.\n[1]\n\nIf the evaluation of an expression in the header of an except clause\nraises an exception, the original search for a handler is canceled and\na search starts for the new exception in the surrounding code and on\nthe call stack (it is treated as if the entire "try" statement raised\nthe exception).\n\nWhen a matching except clause is found, the exception is assigned to\nthe target specified after the "as" keyword in that except clause, if\npresent, and the except clause\'s suite is executed. All except\nclauses must have an executable block. When the end of this block is\nreached, execution continues normally after the entire try statement.\n(This means that if two nested handlers exist for the same exception,\nand the exception occurs in the try clause of the inner handler, the\nouter handler will not handle the exception.)\n\nWhen an exception has been assigned using "as target", it is cleared\nat the end of the except clause. This is as if\n\n except E as N:\n foo\n\nwas translated to\n\n except E as N:\n try:\n foo\n finally:\n del N\n\nThis means the exception must be assigned to a different name to be\nable to refer to it after the except clause. Exceptions are cleared\nbecause with the traceback attached to them, they form a reference\ncycle with the stack frame, keeping all locals in that frame alive\nuntil the next garbage collection occurs.\n\nBefore an except clause\'s suite is executed, details about the\nexception are stored in the "sys" module and can be accessed via\n"sys.exc_info()". "sys.exc_info()" returns a 3-tuple consisting of the\nexception class, the exception instance and a traceback object (see\nsection *The standard type hierarchy*) identifying the point in the\nprogram where the exception occurred. "sys.exc_info()" values are\nrestored to their previous values (before the call) when returning\nfrom a function that handled an exception.\n\nThe optional "else" clause is executed if and when control flows off\nthe end of the "try" clause. [2] Exceptions in the "else" clause are\nnot handled by the preceding "except" clauses.\n\nIf "finally" is present, it specifies a \'cleanup\' handler. The "try"\nclause is executed, including any "except" and "else" clauses. If an\nexception occurs in any of the clauses and is not handled, the\nexception is temporarily saved. The "finally" clause is executed. If\nthere is a saved exception it is re-raised at the end of the "finally"\nclause. If the "finally" clause raises another exception, the saved\nexception is set as the context of the new exception. If the "finally"\nclause executes a "return" or "break" statement, the saved exception\nis discarded:\n\n >>> def f():\n ... try:\n ... 1/0\n ... finally:\n ... return 42\n ...\n >>> f()\n 42\n\nThe exception information is not available to the program during\nexecution of the "finally" clause.\n\nWhen a "return", "break" or "continue" statement is executed in the\n"try" suite of a "try"..."finally" statement, the "finally" clause is\nalso executed \'on the way out.\' A "continue" statement is illegal in\nthe "finally" clause. (The reason is a problem with the current\nimplementation --- this restriction may be lifted in the future).\n\nThe return value of a function is determined by the last "return"\nstatement executed. Since the "finally" clause always executes, a\n"return" statement executed in the "finally" clause will always be the\nlast one executed:\n\n >>> def foo():\n ... try:\n ... return \'try\'\n ... finally:\n ... return \'finally\'\n ...\n >>> foo()\n \'finally\'\n\nAdditional information on exceptions can be found in section\n*Exceptions*, and information on using the "raise" statement to\ngenerate exceptions may be found in section *The raise statement*.\n', + 'types': u'\nThe standard type hierarchy\n***************************\n\nBelow is a list of the types that are built into Python. Extension\nmodules (written in C, Java, or other languages, depending on the\nimplementation) can define additional types. Future versions of\nPython may add types to the type hierarchy (e.g., rational numbers,\nefficiently stored arrays of integers, etc.), although such additions\nwill often be provided via the standard library instead.\n\nSome of the type descriptions below contain a paragraph listing\n\'special attributes.\' These are attributes that provide access to the\nimplementation and are not intended for general use. Their definition\nmay change in the future.\n\nNone\n This type has a single value. There is a single object with this\n value. This object is accessed through the built-in name "None". It\n is used to signify the absence of a value in many situations, e.g.,\n it is returned from functions that don\'t explicitly return\n anything. Its truth value is false.\n\nNotImplemented\n This type has a single value. There is a single object with this\n value. This object is accessed through the built-in name\n "NotImplemented". Numeric methods and rich comparison methods\n should return this value if they do not implement the operation for\n the operands provided. (The interpreter will then try the\n reflected operation, or some other fallback, depending on the\n operator.) Its truth value is true.\n\n See *Implementing the arithmetic operations* for more details.\n\nEllipsis\n This type has a single value. There is a single object with this\n value. This object is accessed through the literal "..." or the\n built-in name "Ellipsis". Its truth value is true.\n\n"numbers.Number"\n These are created by numeric literals and returned as results by\n arithmetic operators and arithmetic built-in functions. Numeric\n objects are immutable; once created their value never changes.\n Python numbers are of course strongly related to mathematical\n numbers, but subject to the limitations of numerical representation\n in computers.\n\n Python distinguishes between integers, floating point numbers, and\n complex numbers:\n\n "numbers.Integral"\n These represent elements from the mathematical set of integers\n (positive and negative).\n\n There are two types of integers:\n\n Integers ("int")\n\n These represent numbers in an unlimited range, subject to\n available (virtual) memory only. For the purpose of shift\n and mask operations, a binary representation is assumed, and\n negative numbers are represented in a variant of 2\'s\n complement which gives the illusion of an infinite string of\n sign bits extending to the left.\n\n Booleans ("bool")\n These represent the truth values False and True. The two\n objects representing the values "False" and "True" are the\n only Boolean objects. The Boolean type is a subtype of the\n integer type, and Boolean values behave like the values 0 and\n 1, respectively, in almost all contexts, the exception being\n that when converted to a string, the strings ""False"" or\n ""True"" are returned, respectively.\n\n The rules for integer representation are intended to give the\n most meaningful interpretation of shift and mask operations\n involving negative integers.\n\n "numbers.Real" ("float")\n These represent machine-level double precision floating point\n numbers. You are at the mercy of the underlying machine\n architecture (and C or Java implementation) for the accepted\n range and handling of overflow. Python does not support single-\n precision floating point numbers; the savings in processor and\n memory usage that are usually the reason for using these are\n dwarfed by the overhead of using objects in Python, so there is\n no reason to complicate the language with two kinds of floating\n point numbers.\n\n "numbers.Complex" ("complex")\n These represent complex numbers as a pair of machine-level\n double precision floating point numbers. The same caveats apply\n as for floating point numbers. The real and imaginary parts of a\n complex number "z" can be retrieved through the read-only\n attributes "z.real" and "z.imag".\n\nSequences\n These represent finite ordered sets indexed by non-negative\n numbers. The built-in function "len()" returns the number of items\n of a sequence. When the length of a sequence is *n*, the index set\n contains the numbers 0, 1, ..., *n*-1. Item *i* of sequence *a* is\n selected by "a[i]".\n\n Sequences also support slicing: "a[i:j]" selects all items with\n index *k* such that *i* "<=" *k* "<" *j*. When used as an\n expression, a slice is a sequence of the same type. This implies\n that the index set is renumbered so that it starts at 0.\n\n Some sequences also support "extended slicing" with a third "step"\n parameter: "a[i:j:k]" selects all items of *a* with index *x* where\n "x = i + n*k", *n* ">=" "0" and *i* "<=" *x* "<" *j*.\n\n Sequences are distinguished according to their mutability:\n\n Immutable sequences\n An object of an immutable sequence type cannot change once it is\n created. (If the object contains references to other objects,\n these other objects may be mutable and may be changed; however,\n the collection of objects directly referenced by an immutable\n object cannot change.)\n\n The following types are immutable sequences:\n\n Strings\n A string is a sequence of values that represent Unicode code\n points. All the code points in the range "U+0000 - U+10FFFF"\n can be represented in a string. Python doesn\'t have a "char"\n type; instead, every code point in the string is represented\n as a string object with length "1". The built-in function\n "ord()" converts a code point from its string form to an\n integer in the range "0 - 10FFFF"; "chr()" converts an\n integer in the range "0 - 10FFFF" to the corresponding length\n "1" string object. "str.encode()" can be used to convert a\n "str" to "bytes" using the given text encoding, and\n "bytes.decode()" can be used to achieve the opposite.\n\n Tuples\n The items of a tuple are arbitrary Python objects. Tuples of\n two or more items are formed by comma-separated lists of\n expressions. A tuple of one item (a \'singleton\') can be\n formed by affixing a comma to an expression (an expression by\n itself does not create a tuple, since parentheses must be\n usable for grouping of expressions). An empty tuple can be\n formed by an empty pair of parentheses.\n\n Bytes\n A bytes object is an immutable array. The items are 8-bit\n bytes, represented by integers in the range 0 <= x < 256.\n Bytes literals (like "b\'abc\'") and the built-in function\n "bytes()" can be used to construct bytes objects. Also,\n bytes objects can be decoded to strings via the "decode()"\n method.\n\n Mutable sequences\n Mutable sequences can be changed after they are created. The\n subscription and slicing notations can be used as the target of\n assignment and "del" (delete) statements.\n\n There are currently two intrinsic mutable sequence types:\n\n Lists\n The items of a list are arbitrary Python objects. Lists are\n formed by placing a comma-separated list of expressions in\n square brackets. (Note that there are no special cases needed\n to form lists of length 0 or 1.)\n\n Byte Arrays\n A bytearray object is a mutable array. They are created by\n the built-in "bytearray()" constructor. Aside from being\n mutable (and hence unhashable), byte arrays otherwise provide\n the same interface and functionality as immutable bytes\n objects.\n\n The extension module "array" provides an additional example of a\n mutable sequence type, as does the "collections" module.\n\nSet types\n These represent unordered, finite sets of unique, immutable\n objects. As such, they cannot be indexed by any subscript. However,\n they can be iterated over, and the built-in function "len()"\n returns the number of items in a set. Common uses for sets are fast\n membership testing, removing duplicates from a sequence, and\n computing mathematical operations such as intersection, union,\n difference, and symmetric difference.\n\n For set elements, the same immutability rules apply as for\n dictionary keys. Note that numeric types obey the normal rules for\n numeric comparison: if two numbers compare equal (e.g., "1" and\n "1.0"), only one of them can be contained in a set.\n\n There are currently two intrinsic set types:\n\n Sets\n These represent a mutable set. They are created by the built-in\n "set()" constructor and can be modified afterwards by several\n methods, such as "add()".\n\n Frozen sets\n These represent an immutable set. They are created by the\n built-in "frozenset()" constructor. As a frozenset is immutable\n and *hashable*, it can be used again as an element of another\n set, or as a dictionary key.\n\nMappings\n These represent finite sets of objects indexed by arbitrary index\n sets. The subscript notation "a[k]" selects the item indexed by "k"\n from the mapping "a"; this can be used in expressions and as the\n target of assignments or "del" statements. The built-in function\n "len()" returns the number of items in a mapping.\n\n There is currently a single intrinsic mapping type:\n\n Dictionaries\n These represent finite sets of objects indexed by nearly\n arbitrary values. The only types of values not acceptable as\n keys are values containing lists or dictionaries or other\n mutable types that are compared by value rather than by object\n identity, the reason being that the efficient implementation of\n dictionaries requires a key\'s hash value to remain constant.\n Numeric types used for keys obey the normal rules for numeric\n comparison: if two numbers compare equal (e.g., "1" and "1.0")\n then they can be used interchangeably to index the same\n dictionary entry.\n\n Dictionaries are mutable; they can be created by the "{...}"\n notation (see section *Dictionary displays*).\n\n The extension modules "dbm.ndbm" and "dbm.gnu" provide\n additional examples of mapping types, as does the "collections"\n module.\n\nCallable types\n These are the types to which the function call operation (see\n section *Calls*) can be applied:\n\n User-defined functions\n A user-defined function object is created by a function\n definition (see section *Function definitions*). It should be\n called with an argument list containing the same number of items\n as the function\'s formal parameter list.\n\n Special attributes:\n\n +---------------------------+---------------------------------+-------------+\n | Attribute | Meaning | |\n +===========================+=================================+=============+\n | "__doc__" | The function\'s documentation | Writable |\n | | string, or "None" if | |\n | | unavailable; not inherited by | |\n | | subclasses | |\n +---------------------------+---------------------------------+-------------+\n | "__name__" | The function\'s name | Writable |\n +---------------------------+---------------------------------+-------------+\n | "__qualname__" | The function\'s *qualified name* | Writable |\n | | New in version 3.3. | |\n +---------------------------+---------------------------------+-------------+\n | "__module__" | The name of the module the | Writable |\n | | function was defined in, or | |\n | | "None" if unavailable. | |\n +---------------------------+---------------------------------+-------------+\n | "__defaults__" | A tuple containing default | Writable |\n | | argument values for those | |\n | | arguments that have defaults, | |\n | | or "None" if no arguments have | |\n | | a default value | |\n +---------------------------+---------------------------------+-------------+\n | "__code__" | The code object representing | Writable |\n | | the compiled function body. | |\n +---------------------------+---------------------------------+-------------+\n | "__globals__" | A reference to the dictionary | Read-only |\n | | that holds the function\'s | |\n | | global variables --- the global | |\n | | namespace of the module in | |\n | | which the function was defined. | |\n +---------------------------+---------------------------------+-------------+\n | "__dict__" | The namespace supporting | Writable |\n | | arbitrary function attributes. | |\n +---------------------------+---------------------------------+-------------+\n | "__closure__" | "None" or a tuple of cells that | Read-only |\n | | contain bindings for the | |\n | | function\'s free variables. | |\n +---------------------------+---------------------------------+-------------+\n | "__annotations__" | A dict containing annotations | Writable |\n | | of parameters. The keys of the | |\n | | dict are the parameter names, | |\n | | and "\'return\'" for the return | |\n | | annotation, if provided. | |\n +---------------------------+---------------------------------+-------------+\n | "__kwdefaults__" | A dict containing defaults for | Writable |\n | | keyword-only parameters. | |\n +---------------------------+---------------------------------+-------------+\n\n Most of the attributes labelled "Writable" check the type of the\n assigned value.\n\n Function objects also support getting and setting arbitrary\n attributes, which can be used, for example, to attach metadata\n to functions. Regular attribute dot-notation is used to get and\n set such attributes. *Note that the current implementation only\n supports function attributes on user-defined functions. Function\n attributes on built-in functions may be supported in the\n future.*\n\n Additional information about a function\'s definition can be\n retrieved from its code object; see the description of internal\n types below.\n\n Instance methods\n An instance method object combines a class, a class instance and\n any callable object (normally a user-defined function).\n\n Special read-only attributes: "__self__" is the class instance\n object, "__func__" is the function object; "__doc__" is the\n method\'s documentation (same as "__func__.__doc__"); "__name__"\n is the method name (same as "__func__.__name__"); "__module__"\n is the name of the module the method was defined in, or "None"\n if unavailable.\n\n Methods also support accessing (but not setting) the arbitrary\n function attributes on the underlying function object.\n\n User-defined method objects may be created when getting an\n attribute of a class (perhaps via an instance of that class), if\n that attribute is a user-defined function object or a class\n method object.\n\n When an instance method object is created by retrieving a user-\n defined function object from a class via one of its instances,\n its "__self__" attribute is the instance, and the method object\n is said to be bound. The new method\'s "__func__" attribute is\n the original function object.\n\n When a user-defined method object is created by retrieving\n another method object from a class or instance, the behaviour is\n the same as for a function object, except that the "__func__"\n attribute of the new instance is not the original method object\n but its "__func__" attribute.\n\n When an instance method object is created by retrieving a class\n method object from a class or instance, its "__self__" attribute\n is the class itself, and its "__func__" attribute is the\n function object underlying the class method.\n\n When an instance method object is called, the underlying\n function ("__func__") is called, inserting the class instance\n ("__self__") in front of the argument list. For instance, when\n "C" is a class which contains a definition for a function "f()",\n and "x" is an instance of "C", calling "x.f(1)" is equivalent to\n calling "C.f(x, 1)".\n\n When an instance method object is derived from a class method\n object, the "class instance" stored in "__self__" will actually\n be the class itself, so that calling either "x.f(1)" or "C.f(1)"\n is equivalent to calling "f(C,1)" where "f" is the underlying\n function.\n\n Note that the transformation from function object to instance\n method object happens each time the attribute is retrieved from\n the instance. In some cases, a fruitful optimization is to\n assign the attribute to a local variable and call that local\n variable. Also notice that this transformation only happens for\n user-defined functions; other callable objects (and all non-\n callable objects) are retrieved without transformation. It is\n also important to note that user-defined functions which are\n attributes of a class instance are not converted to bound\n methods; this *only* happens when the function is an attribute\n of the class.\n\n Generator functions\n A function or method which uses the "yield" statement (see\n section *The yield statement*) is called a *generator function*.\n Such a function, when called, always returns an iterator object\n which can be used to execute the body of the function: calling\n the iterator\'s "iterator.__next__()" method will cause the\n function to execute until it provides a value using the "yield"\n statement. When the function executes a "return" statement or\n falls off the end, a "StopIteration" exception is raised and the\n iterator will have reached the end of the set of values to be\n returned.\n\n Coroutine functions\n A function or method which is defined using "async def" is\n called a *coroutine function*. Such a function, when called,\n returns a *coroutine* object. It may contain "await"\n expressions, as well as "async with" and "async for" statements.\n See also the *Coroutine Objects* section.\n\n Built-in functions\n A built-in function object is a wrapper around a C function.\n Examples of built-in functions are "len()" and "math.sin()"\n ("math" is a standard built-in module). The number and type of\n the arguments are determined by the C function. Special read-\n only attributes: "__doc__" is the function\'s documentation\n string, or "None" if unavailable; "__name__" is the function\'s\n name; "__self__" is set to "None" (but see the next item);\n "__module__" is the name of the module the function was defined\n in or "None" if unavailable.\n\n Built-in methods\n This is really a different disguise of a built-in function, this\n time containing an object passed to the C function as an\n implicit extra argument. An example of a built-in method is\n "alist.append()", assuming *alist* is a list object. In this\n case, the special read-only attribute "__self__" is set to the\n object denoted by *alist*.\n\n Classes\n Classes are callable. These objects normally act as factories\n for new instances of themselves, but variations are possible for\n class types that override "__new__()". The arguments of the\n call are passed to "__new__()" and, in the typical case, to\n "__init__()" to initialize the new instance.\n\n Class Instances\n Instances of arbitrary classes can be made callable by defining\n a "__call__()" method in their class.\n\nModules\n Modules are a basic organizational unit of Python code, and are\n created by the *import system* as invoked either by the "import"\n statement (see "import"), or by calling functions such as\n "importlib.import_module()" and built-in "__import__()". A module\n object has a namespace implemented by a dictionary object (this is\n the dictionary referenced by the "__globals__" attribute of\n functions defined in the module). Attribute references are\n translated to lookups in this dictionary, e.g., "m.x" is equivalent\n to "m.__dict__["x"]". A module object does not contain the code\n object used to initialize the module (since it isn\'t needed once\n the initialization is done).\n\n Attribute assignment updates the module\'s namespace dictionary,\n e.g., "m.x = 1" is equivalent to "m.__dict__["x"] = 1".\n\n Special read-only attribute: "__dict__" is the module\'s namespace\n as a dictionary object.\n\n **CPython implementation detail:** Because of the way CPython\n clears module dictionaries, the module dictionary will be cleared\n when the module falls out of scope even if the dictionary still has\n live references. To avoid this, copy the dictionary or keep the\n module around while using its dictionary directly.\n\n Predefined (writable) attributes: "__name__" is the module\'s name;\n "__doc__" is the module\'s documentation string, or "None" if\n unavailable; "__file__" is the pathname of the file from which the\n module was loaded, if it was loaded from a file. The "__file__"\n attribute may be missing for certain types of modules, such as C\n modules that are statically linked into the interpreter; for\n extension modules loaded dynamically from a shared library, it is\n the pathname of the shared library file.\n\nCustom classes\n Custom class types are typically created by class definitions (see\n section *Class definitions*). A class has a namespace implemented\n by a dictionary object. Class attribute references are translated\n to lookups in this dictionary, e.g., "C.x" is translated to\n "C.__dict__["x"]" (although there are a number of hooks which allow\n for other means of locating attributes). When the attribute name is\n not found there, the attribute search continues in the base\n classes. This search of the base classes uses the C3 method\n resolution order which behaves correctly even in the presence of\n \'diamond\' inheritance structures where there are multiple\n inheritance paths leading back to a common ancestor. Additional\n details on the C3 MRO used by Python can be found in the\n documentation accompanying the 2.3 release at\n https://www.python.org/download/releases/2.3/mro/.\n\n When a class attribute reference (for class "C", say) would yield a\n class method object, it is transformed into an instance method\n object whose "__self__" attributes is "C". When it would yield a\n static method object, it is transformed into the object wrapped by\n the static method object. See section *Implementing Descriptors*\n for another way in which attributes retrieved from a class may\n differ from those actually contained in its "__dict__".\n\n Class attribute assignments update the class\'s dictionary, never\n the dictionary of a base class.\n\n A class object can be called (see above) to yield a class instance\n (see below).\n\n Special attributes: "__name__" is the class name; "__module__" is\n the module name in which the class was defined; "__dict__" is the\n dictionary containing the class\'s namespace; "__bases__" is a tuple\n containing the base classes, in the order of their occurrence in\n the base class list; "__doc__" is the class\'s documentation string,\n or "None" if undefined.\n\nClass instances\n A class instance is created by calling a class object (see above).\n A class instance has a namespace implemented as a dictionary which\n is the first place in which attribute references are searched.\n When an attribute is not found there, and the instance\'s class has\n an attribute by that name, the search continues with the class\n attributes. If a class attribute is found that is a user-defined\n function object, it is transformed into an instance method object\n whose "__self__" attribute is the instance. Static method and\n class method objects are also transformed; see above under\n "Classes". See section *Implementing Descriptors* for another way\n in which attributes of a class retrieved via its instances may\n differ from the objects actually stored in the class\'s "__dict__".\n If no class attribute is found, and the object\'s class has a\n "__getattr__()" method, that is called to satisfy the lookup.\n\n Attribute assignments and deletions update the instance\'s\n dictionary, never a class\'s dictionary. If the class has a\n "__setattr__()" or "__delattr__()" method, this is called instead\n of updating the instance dictionary directly.\n\n Class instances can pretend to be numbers, sequences, or mappings\n if they have methods with certain special names. See section\n *Special method names*.\n\n Special attributes: "__dict__" is the attribute dictionary;\n "__class__" is the instance\'s class.\n\nI/O objects (also known as file objects)\n A *file object* represents an open file. Various shortcuts are\n available to create file objects: the "open()" built-in function,\n and also "os.popen()", "os.fdopen()", and the "makefile()" method\n of socket objects (and perhaps by other functions or methods\n provided by extension modules).\n\n The objects "sys.stdin", "sys.stdout" and "sys.stderr" are\n initialized to file objects corresponding to the interpreter\'s\n standard input, output and error streams; they are all open in text\n mode and therefore follow the interface defined by the\n "io.TextIOBase" abstract class.\n\nInternal types\n A few types used internally by the interpreter are exposed to the\n user. Their definitions may change with future versions of the\n interpreter, but they are mentioned here for completeness.\n\n Code objects\n Code objects represent *byte-compiled* executable Python code,\n or *bytecode*. The difference between a code object and a\n function object is that the function object contains an explicit\n reference to the function\'s globals (the module in which it was\n defined), while a code object contains no context; also the\n default argument values are stored in the function object, not\n in the code object (because they represent values calculated at\n run-time). Unlike function objects, code objects are immutable\n and contain no references (directly or indirectly) to mutable\n objects.\n\n Special read-only attributes: "co_name" gives the function name;\n "co_argcount" is the number of positional arguments (including\n arguments with default values); "co_nlocals" is the number of\n local variables used by the function (including arguments);\n "co_varnames" is a tuple containing the names of the local\n variables (starting with the argument names); "co_cellvars" is a\n tuple containing the names of local variables that are\n referenced by nested functions; "co_freevars" is a tuple\n containing the names of free variables; "co_code" is a string\n representing the sequence of bytecode instructions; "co_consts"\n is a tuple containing the literals used by the bytecode;\n "co_names" is a tuple containing the names used by the bytecode;\n "co_filename" is the filename from which the code was compiled;\n "co_firstlineno" is the first line number of the function;\n "co_lnotab" is a string encoding the mapping from bytecode\n offsets to line numbers (for details see the source code of the\n interpreter); "co_stacksize" is the required stack size\n (including local variables); "co_flags" is an integer encoding a\n number of flags for the interpreter.\n\n The following flag bits are defined for "co_flags": bit "0x04"\n is set if the function uses the "*arguments" syntax to accept an\n arbitrary number of positional arguments; bit "0x08" is set if\n the function uses the "**keywords" syntax to accept arbitrary\n keyword arguments; bit "0x20" is set if the function is a\n generator.\n\n Future feature declarations ("from __future__ import division")\n also use bits in "co_flags" to indicate whether a code object\n was compiled with a particular feature enabled: bit "0x2000" is\n set if the function was compiled with future division enabled;\n bits "0x10" and "0x1000" were used in earlier versions of\n Python.\n\n Other bits in "co_flags" are reserved for internal use.\n\n If a code object represents a function, the first item in\n "co_consts" is the documentation string of the function, or\n "None" if undefined.\n\n Frame objects\n Frame objects represent execution frames. They may occur in\n traceback objects (see below).\n\n Special read-only attributes: "f_back" is to the previous stack\n frame (towards the caller), or "None" if this is the bottom\n stack frame; "f_code" is the code object being executed in this\n frame; "f_locals" is the dictionary used to look up local\n variables; "f_globals" is used for global variables;\n "f_builtins" is used for built-in (intrinsic) names; "f_lasti"\n gives the precise instruction (this is an index into the\n bytecode string of the code object).\n\n Special writable attributes: "f_trace", if not "None", is a\n function called at the start of each source code line (this is\n used by the debugger); "f_lineno" is the current line number of\n the frame --- writing to this from within a trace function jumps\n to the given line (only for the bottom-most frame). A debugger\n can implement a Jump command (aka Set Next Statement) by writing\n to f_lineno.\n\n Frame objects support one method:\n\n frame.clear()\n\n This method clears all references to local variables held by\n the frame. Also, if the frame belonged to a generator, the\n generator is finalized. This helps break reference cycles\n involving frame objects (for example when catching an\n exception and storing its traceback for later use).\n\n "RuntimeError" is raised if the frame is currently executing.\n\n New in version 3.4.\n\n Traceback objects\n Traceback objects represent a stack trace of an exception. A\n traceback object is created when an exception occurs. When the\n search for an exception handler unwinds the execution stack, at\n each unwound level a traceback object is inserted in front of\n the current traceback. When an exception handler is entered,\n the stack trace is made available to the program. (See section\n *The try statement*.) It is accessible as the third item of the\n tuple returned by "sys.exc_info()". When the program contains no\n suitable handler, the stack trace is written (nicely formatted)\n to the standard error stream; if the interpreter is interactive,\n it is also made available to the user as "sys.last_traceback".\n\n Special read-only attributes: "tb_next" is the next level in the\n stack trace (towards the frame where the exception occurred), or\n "None" if there is no next level; "tb_frame" points to the\n execution frame of the current level; "tb_lineno" gives the line\n number where the exception occurred; "tb_lasti" indicates the\n precise instruction. The line number and last instruction in\n the traceback may differ from the line number of its frame\n object if the exception occurred in a "try" statement with no\n matching except clause or with a finally clause.\n\n Slice objects\n Slice objects are used to represent slices for "__getitem__()"\n methods. They are also created by the built-in "slice()"\n function.\n\n Special read-only attributes: "start" is the lower bound; "stop"\n is the upper bound; "step" is the step value; each is "None" if\n omitted. These attributes can have any type.\n\n Slice objects support one method:\n\n slice.indices(self, length)\n\n This method takes a single integer argument *length* and\n computes information about the slice that the slice object\n would describe if applied to a sequence of *length* items.\n It returns a tuple of three integers; respectively these are\n the *start* and *stop* indices and the *step* or stride\n length of the slice. Missing or out-of-bounds indices are\n handled in a manner consistent with regular slices.\n\n Static method objects\n Static method objects provide a way of defeating the\n transformation of function objects to method objects described\n above. A static method object is a wrapper around any other\n object, usually a user-defined method object. When a static\n method object is retrieved from a class or a class instance, the\n object actually returned is the wrapped object, which is not\n subject to any further transformation. Static method objects are\n not themselves callable, although the objects they wrap usually\n are. Static method objects are created by the built-in\n "staticmethod()" constructor.\n\n Class method objects\n A class method object, like a static method object, is a wrapper\n around another object that alters the way in which that object\n is retrieved from classes and class instances. The behaviour of\n class method objects upon such retrieval is described above,\n under "User-defined methods". Class method objects are created\n by the built-in "classmethod()" constructor.\n', + 'typesfunctions': u'\nFunctions\n*********\n\nFunction objects are created by function definitions. The only\noperation on a function object is to call it: "func(argument-list)".\n\nThere are really two flavors of function objects: built-in functions\nand user-defined functions. Both support the same operation (to call\nthe function), but the implementation is different, hence the\ndifferent object types.\n\nSee *Function definitions* for more information.\n', + 'typesmapping': u'\nMapping Types --- "dict"\n************************\n\nA *mapping* object maps *hashable* values to arbitrary objects.\nMappings are mutable objects. There is currently only one standard\nmapping type, the *dictionary*. (For other containers see the built-\nin "list", "set", and "tuple" classes, and the "collections" module.)\n\nA dictionary\'s keys are *almost* arbitrary values. Values that are\nnot *hashable*, that is, values containing lists, dictionaries or\nother mutable types (that are compared by value rather than by object\nidentity) may not be used as keys. Numeric types used for keys obey\nthe normal rules for numeric comparison: if two numbers compare equal\n(such as "1" and "1.0") then they can be used interchangeably to index\nthe same dictionary entry. (Note however, that since computers store\nfloating-point numbers as approximations it is usually unwise to use\nthem as dictionary keys.)\n\nDictionaries can be created by placing a comma-separated list of "key:\nvalue" pairs within braces, for example: "{\'jack\': 4098, \'sjoerd\':\n4127}" or "{4098: \'jack\', 4127: \'sjoerd\'}", or by the "dict"\nconstructor.\n\nclass class dict(**kwarg)\nclass class dict(mapping, **kwarg)\nclass class dict(iterable, **kwarg)\n\n Return a new dictionary initialized from an optional positional\n argument and a possibly empty set of keyword arguments.\n\n If no positional argument is given, an empty dictionary is created.\n If a positional argument is given and it is a mapping object, a\n dictionary is created with the same key-value pairs as the mapping\n object. Otherwise, the positional argument must be an *iterable*\n object. Each item in the iterable must itself be an iterable with\n exactly two objects. The first object of each item becomes a key\n in the new dictionary, and the second object the corresponding\n value. If a key occurs more than once, the last value for that key\n becomes the corresponding value in the new dictionary.\n\n If keyword arguments are given, the keyword arguments and their\n values are added to the dictionary created from the positional\n argument. If a key being added is already present, the value from\n the keyword argument replaces the value from the positional\n argument.\n\n To illustrate, the following examples all return a dictionary equal\n to "{"one": 1, "two": 2, "three": 3}":\n\n >>> a = dict(one=1, two=2, three=3)\n >>> b = {\'one\': 1, \'two\': 2, \'three\': 3}\n >>> c = dict(zip([\'one\', \'two\', \'three\'], [1, 2, 3]))\n >>> d = dict([(\'two\', 2), (\'one\', 1), (\'three\', 3)])\n >>> e = dict({\'three\': 3, \'one\': 1, \'two\': 2})\n >>> a == b == c == d == e\n True\n\n Providing keyword arguments as in the first example only works for\n keys that are valid Python identifiers. Otherwise, any valid keys\n can be used.\n\n These are the operations that dictionaries support (and therefore,\n custom mapping types should support too):\n\n len(d)\n\n Return the number of items in the dictionary *d*.\n\n d[key]\n\n Return the item of *d* with key *key*. Raises a "KeyError" if\n *key* is not in the map.\n\n If a subclass of dict defines a method "__missing__()" and *key*\n is not present, the "d[key]" operation calls that method with\n the key *key* as argument. The "d[key]" operation then returns\n or raises whatever is returned or raised by the\n "__missing__(key)" call. No other operations or methods invoke\n "__missing__()". If "__missing__()" is not defined, "KeyError"\n is raised. "__missing__()" must be a method; it cannot be an\n instance variable:\n\n >>> class Counter(dict):\n ... def __missing__(self, key):\n ... return 0\n >>> c = Counter()\n >>> c[\'red\']\n 0\n >>> c[\'red\'] += 1\n >>> c[\'red\']\n 1\n\n The example above shows part of the implementation of\n "collections.Counter". A different "__missing__" method is used\n by "collections.defaultdict".\n\n d[key] = value\n\n Set "d[key]" to *value*.\n\n del d[key]\n\n Remove "d[key]" from *d*. Raises a "KeyError" if *key* is not\n in the map.\n\n key in d\n\n Return "True" if *d* has a key *key*, else "False".\n\n key not in d\n\n Equivalent to "not key in d".\n\n iter(d)\n\n Return an iterator over the keys of the dictionary. This is a\n shortcut for "iter(d.keys())".\n\n clear()\n\n Remove all items from the dictionary.\n\n copy()\n\n Return a shallow copy of the dictionary.\n\n classmethod fromkeys(seq[, value])\n\n Create a new dictionary with keys from *seq* and values set to\n *value*.\n\n "fromkeys()" is a class method that returns a new dictionary.\n *value* defaults to "None".\n\n get(key[, default])\n\n Return the value for *key* if *key* is in the dictionary, else\n *default*. If *default* is not given, it defaults to "None", so\n that this method never raises a "KeyError".\n\n items()\n\n Return a new view of the dictionary\'s items ("(key, value)"\n pairs). See the *documentation of view objects*.\n\n keys()\n\n Return a new view of the dictionary\'s keys. See the\n *documentation of view objects*.\n\n pop(key[, default])\n\n If *key* is in the dictionary, remove it and return its value,\n else return *default*. If *default* is not given and *key* is\n not in the dictionary, a "KeyError" is raised.\n\n popitem()\n\n Remove and return an arbitrary "(key, value)" pair from the\n dictionary.\n\n "popitem()" is useful to destructively iterate over a\n dictionary, as often used in set algorithms. If the dictionary\n is empty, calling "popitem()" raises a "KeyError".\n\n setdefault(key[, default])\n\n If *key* is in the dictionary, return its value. If not, insert\n *key* with a value of *default* and return *default*. *default*\n defaults to "None".\n\n update([other])\n\n Update the dictionary with the key/value pairs from *other*,\n overwriting existing keys. Return "None".\n\n "update()" accepts either another dictionary object or an\n iterable of key/value pairs (as tuples or other iterables of\n length two). If keyword arguments are specified, the dictionary\n is then updated with those key/value pairs: "d.update(red=1,\n blue=2)".\n\n values()\n\n Return a new view of the dictionary\'s values. See the\n *documentation of view objects*.\n\n Dictionaries compare equal if and only if they have the same "(key,\n value)" pairs. Order comparisons (\'<\', \'<=\', \'>=\', \'>\') raise\n "TypeError".\n\nSee also: "types.MappingProxyType" can be used to create a read-only\n view of a "dict".\n\n\nDictionary view objects\n=======================\n\nThe objects returned by "dict.keys()", "dict.values()" and\n"dict.items()" are *view objects*. They provide a dynamic view on the\ndictionary\'s entries, which means that when the dictionary changes,\nthe view reflects these changes.\n\nDictionary views can be iterated over to yield their respective data,\nand support membership tests:\n\nlen(dictview)\n\n Return the number of entries in the dictionary.\n\niter(dictview)\n\n Return an iterator over the keys, values or items (represented as\n tuples of "(key, value)") in the dictionary.\n\n Keys and values are iterated over in an arbitrary order which is\n non-random, varies across Python implementations, and depends on\n the dictionary\'s history of insertions and deletions. If keys,\n values and items views are iterated over with no intervening\n modifications to the dictionary, the order of items will directly\n correspond. This allows the creation of "(value, key)" pairs using\n "zip()": "pairs = zip(d.values(), d.keys())". Another way to\n create the same list is "pairs = [(v, k) for (k, v) in d.items()]".\n\n Iterating views while adding or deleting entries in the dictionary\n may raise a "RuntimeError" or fail to iterate over all entries.\n\nx in dictview\n\n Return "True" if *x* is in the underlying dictionary\'s keys, values\n or items (in the latter case, *x* should be a "(key, value)"\n tuple).\n\nKeys views are set-like since their entries are unique and hashable.\nIf all values are hashable, so that "(key, value)" pairs are unique\nand hashable, then the items view is also set-like. (Values views are\nnot treated as set-like since the entries are generally not unique.)\nFor set-like views, all of the operations defined for the abstract\nbase class "collections.abc.Set" are available (for example, "==",\n"<", or "^").\n\nAn example of dictionary view usage:\n\n >>> dishes = {\'eggs\': 2, \'sausage\': 1, \'bacon\': 1, \'spam\': 500}\n >>> keys = dishes.keys()\n >>> values = dishes.values()\n\n >>> # iteration\n >>> n = 0\n >>> for val in values:\n ... n += val\n >>> print(n)\n 504\n\n >>> # keys and values are iterated over in the same order\n >>> list(keys)\n [\'eggs\', \'bacon\', \'sausage\', \'spam\']\n >>> list(values)\n [2, 1, 1, 500]\n\n >>> # view objects are dynamic and reflect dict changes\n >>> del dishes[\'eggs\']\n >>> del dishes[\'sausage\']\n >>> list(keys)\n [\'spam\', \'bacon\']\n\n >>> # set operations\n >>> keys & {\'eggs\', \'bacon\', \'salad\'}\n {\'bacon\'}\n >>> keys ^ {\'sausage\', \'juice\'}\n {\'juice\', \'sausage\', \'bacon\', \'spam\'}\n', + 'typesmethods': u'\nMethods\n*******\n\nMethods are functions that are called using the attribute notation.\nThere are two flavors: built-in methods (such as "append()" on lists)\nand class instance methods. Built-in methods are described with the\ntypes that support them.\n\nIf you access a method (a function defined in a class namespace)\nthrough an instance, you get a special object: a *bound method* (also\ncalled *instance method*) object. When called, it will add the "self"\nargument to the argument list. Bound methods have two special read-\nonly attributes: "m.__self__" is the object on which the method\noperates, and "m.__func__" is the function implementing the method.\nCalling "m(arg-1, arg-2, ..., arg-n)" is completely equivalent to\ncalling "m.__func__(m.__self__, arg-1, arg-2, ..., arg-n)".\n\nLike function objects, bound method objects support getting arbitrary\nattributes. However, since method attributes are actually stored on\nthe underlying function object ("meth.__func__"), setting method\nattributes on bound methods is disallowed. Attempting to set an\nattribute on a method results in an "AttributeError" being raised. In\norder to set a method attribute, you need to explicitly set it on the\nunderlying function object:\n\n >>> class C:\n ... def method(self):\n ... pass\n ...\n >>> c = C()\n >>> c.method.whoami = \'my name is method\' # can\'t set on the method\n Traceback (most recent call last):\n File "", line 1, in \n AttributeError: \'method\' object has no attribute \'whoami\'\n >>> c.method.__func__.whoami = \'my name is method\'\n >>> c.method.whoami\n \'my name is method\'\n\nSee *The standard type hierarchy* for more information.\n', + 'typesmodules': u'\nModules\n*******\n\nThe only special operation on a module is attribute access: "m.name",\nwhere *m* is a module and *name* accesses a name defined in *m*\'s\nsymbol table. Module attributes can be assigned to. (Note that the\n"import" statement is not, strictly speaking, an operation on a module\nobject; "import foo" does not require a module object named *foo* to\nexist, rather it requires an (external) *definition* for a module\nnamed *foo* somewhere.)\n\nA special attribute of every module is "__dict__". This is the\ndictionary containing the module\'s symbol table. Modifying this\ndictionary will actually change the module\'s symbol table, but direct\nassignment to the "__dict__" attribute is not possible (you can write\n"m.__dict__[\'a\'] = 1", which defines "m.a" to be "1", but you can\'t\nwrite "m.__dict__ = {}"). Modifying "__dict__" directly is not\nrecommended.\n\nModules built into the interpreter are written like this: "". If loaded from a file, they are written as\n"".\n', + 'typesseq': u'\nSequence Types --- "list", "tuple", "range"\n*******************************************\n\nThere are three basic sequence types: lists, tuples, and range\nobjects. Additional sequence types tailored for processing of *binary\ndata* and *text strings* are described in dedicated sections.\n\n\nCommon Sequence Operations\n==========================\n\nThe operations in the following table are supported by most sequence\ntypes, both mutable and immutable. The "collections.abc.Sequence" ABC\nis provided to make it easier to correctly implement these operations\non custom sequence types.\n\nThis table lists the sequence operations sorted in ascending priority.\nIn the table, *s* and *t* are sequences of the same type, *n*, *i*,\n*j* and *k* are integers and *x* is an arbitrary object that meets any\ntype and value restrictions imposed by *s*.\n\nThe "in" and "not in" operations have the same priorities as the\ncomparison operations. The "+" (concatenation) and "*" (repetition)\noperations have the same priority as the corresponding numeric\noperations. [3]\n\n+----------------------------+----------------------------------+------------+\n| Operation | Result | Notes |\n+============================+==================================+============+\n| "x in s" | "True" if an item of *s* is | (1) |\n| | equal to *x*, else "False" | |\n+----------------------------+----------------------------------+------------+\n| "x not in s" | "False" if an item of *s* is | (1) |\n| | equal to *x*, else "True" | |\n+----------------------------+----------------------------------+------------+\n| "s + t" | the concatenation of *s* and *t* | (6)(7) |\n+----------------------------+----------------------------------+------------+\n| "s * n" or "n * s" | equivalent to adding *s* to | (2)(7) |\n| | itself *n* times | |\n+----------------------------+----------------------------------+------------+\n| "s[i]" | *i*th item of *s*, origin 0 | (3) |\n+----------------------------+----------------------------------+------------+\n| "s[i:j]" | slice of *s* from *i* to *j* | (3)(4) |\n+----------------------------+----------------------------------+------------+\n| "s[i:j:k]" | slice of *s* from *i* to *j* | (3)(5) |\n| | with step *k* | |\n+----------------------------+----------------------------------+------------+\n| "len(s)" | length of *s* | |\n+----------------------------+----------------------------------+------------+\n| "min(s)" | smallest item of *s* | |\n+----------------------------+----------------------------------+------------+\n| "max(s)" | largest item of *s* | |\n+----------------------------+----------------------------------+------------+\n| "s.index(x[, i[, j]])" | index of the first occurrence of | (8) |\n| | *x* in *s* (at or after index | |\n| | *i* and before index *j*) | |\n+----------------------------+----------------------------------+------------+\n| "s.count(x)" | total number of occurrences of | |\n| | *x* in *s* | |\n+----------------------------+----------------------------------+------------+\n\nSequences of the same type also support comparisons. In particular,\ntuples and lists are compared lexicographically by comparing\ncorresponding elements. This means that to compare equal, every\nelement must compare equal and the two sequences must be of the same\ntype and have the same length. (For full details see *Comparisons* in\nthe language reference.)\n\nNotes:\n\n1. While the "in" and "not in" operations are used only for simple\n containment testing in the general case, some specialised sequences\n (such as "str", "bytes" and "bytearray") also use them for\n subsequence testing:\n\n >>> "gg" in "eggs"\n True\n\n2. Values of *n* less than "0" are treated as "0" (which yields an\n empty sequence of the same type as *s*). Note that items in the\n sequence *s* are not copied; they are referenced multiple times.\n This often haunts new Python programmers; consider:\n\n >>> lists = [[]] * 3\n >>> lists\n [[], [], []]\n >>> lists[0].append(3)\n >>> lists\n [[3], [3], [3]]\n\n What has happened is that "[[]]" is a one-element list containing\n an empty list, so all three elements of "[[]] * 3" are references\n to this single empty list. Modifying any of the elements of\n "lists" modifies this single list. You can create a list of\n different lists this way:\n\n >>> lists = [[] for i in range(3)]\n >>> lists[0].append(3)\n >>> lists[1].append(5)\n >>> lists[2].append(7)\n >>> lists\n [[3], [5], [7]]\n\n Further explanation is available in the FAQ entry *How do I create\n a multidimensional list?*.\n\n3. If *i* or *j* is negative, the index is relative to the end of\n sequence *s*: "len(s) + i" or "len(s) + j" is substituted. But\n note that "-0" is still "0".\n\n4. The slice of *s* from *i* to *j* is defined as the sequence of\n items with index *k* such that "i <= k < j". If *i* or *j* is\n greater than "len(s)", use "len(s)". If *i* is omitted or "None",\n use "0". If *j* is omitted or "None", use "len(s)". If *i* is\n greater than or equal to *j*, the slice is empty.\n\n5. The slice of *s* from *i* to *j* with step *k* is defined as the\n sequence of items with index "x = i + n*k" such that "0 <= n <\n (j-i)/k". In other words, the indices are "i", "i+k", "i+2*k",\n "i+3*k" and so on, stopping when *j* is reached (but never\n including *j*). When *k* is positive, *i* and *j* are reduced to\n "len(s)" if they are greater. When *k* is negative, *i* and *j* are\n reduced to "len(s) - 1" if they are greater. If *i* or *j* are\n omitted or "None", they become "end" values (which end depends on\n the sign of *k*). Note, *k* cannot be zero. If *k* is "None", it\n is treated like "1".\n\n6. Concatenating immutable sequences always results in a new\n object. This means that building up a sequence by repeated\n concatenation will have a quadratic runtime cost in the total\n sequence length. To get a linear runtime cost, you must switch to\n one of the alternatives below:\n\n * if concatenating "str" objects, you can build a list and use\n "str.join()" at the end or else write to an "io.StringIO"\n instance and retrieve its value when complete\n\n * if concatenating "bytes" objects, you can similarly use\n "bytes.join()" or "io.BytesIO", or you can do in-place\n concatenation with a "bytearray" object. "bytearray" objects are\n mutable and have an efficient overallocation mechanism\n\n * if concatenating "tuple" objects, extend a "list" instead\n\n * for other types, investigate the relevant class documentation\n\n7. Some sequence types (such as "range") only support item\n sequences that follow specific patterns, and hence don\'t support\n sequence concatenation or repetition.\n\n8. "index" raises "ValueError" when *x* is not found in *s*. When\n supported, the additional arguments to the index method allow\n efficient searching of subsections of the sequence. Passing the\n extra arguments is roughly equivalent to using "s[i:j].index(x)",\n only without copying any data and with the returned index being\n relative to the start of the sequence rather than the start of the\n slice.\n\n\nImmutable Sequence Types\n========================\n\nThe only operation that immutable sequence types generally implement\nthat is not also implemented by mutable sequence types is support for\nthe "hash()" built-in.\n\nThis support allows immutable sequences, such as "tuple" instances, to\nbe used as "dict" keys and stored in "set" and "frozenset" instances.\n\nAttempting to hash an immutable sequence that contains unhashable\nvalues will result in "TypeError".\n\n\nMutable Sequence Types\n======================\n\nThe operations in the following table are defined on mutable sequence\ntypes. The "collections.abc.MutableSequence" ABC is provided to make\nit easier to correctly implement these operations on custom sequence\ntypes.\n\nIn the table *s* is an instance of a mutable sequence type, *t* is any\niterable object and *x* is an arbitrary object that meets any type and\nvalue restrictions imposed by *s* (for example, "bytearray" only\naccepts integers that meet the value restriction "0 <= x <= 255").\n\n+--------------------------------+----------------------------------+-----------------------+\n| Operation | Result | Notes |\n+================================+==================================+=======================+\n| "s[i] = x" | item *i* of *s* is replaced by | |\n| | *x* | |\n+--------------------------------+----------------------------------+-----------------------+\n| "s[i:j] = t" | slice of *s* from *i* to *j* is | |\n| | replaced by the contents of the | |\n| | iterable *t* | |\n+--------------------------------+----------------------------------+-----------------------+\n| "del s[i:j]" | same as "s[i:j] = []" | |\n+--------------------------------+----------------------------------+-----------------------+\n| "s[i:j:k] = t" | the elements of "s[i:j:k]" are | (1) |\n| | replaced by those of *t* | |\n+--------------------------------+----------------------------------+-----------------------+\n| "del s[i:j:k]" | removes the elements of | |\n| | "s[i:j:k]" from the list | |\n+--------------------------------+----------------------------------+-----------------------+\n| "s.append(x)" | appends *x* to the end of the | |\n| | sequence (same as | |\n| | "s[len(s):len(s)] = [x]") | |\n+--------------------------------+----------------------------------+-----------------------+\n| "s.clear()" | removes all items from "s" (same | (5) |\n| | as "del s[:]") | |\n+--------------------------------+----------------------------------+-----------------------+\n| "s.copy()" | creates a shallow copy of "s" | (5) |\n| | (same as "s[:]") | |\n+--------------------------------+----------------------------------+-----------------------+\n| "s.extend(t)" or "s += t" | extends *s* with the contents of | |\n| | *t* (for the most part the same | |\n| | as "s[len(s):len(s)] = t") | |\n+--------------------------------+----------------------------------+-----------------------+\n| "s *= n" | updates *s* with its contents | (6) |\n| | repeated *n* times | |\n+--------------------------------+----------------------------------+-----------------------+\n| "s.insert(i, x)" | inserts *x* into *s* at the | |\n| | index given by *i* (same as | |\n| | "s[i:i] = [x]") | |\n+--------------------------------+----------------------------------+-----------------------+\n| "s.pop([i])" | retrieves the item at *i* and | (2) |\n| | also removes it from *s* | |\n+--------------------------------+----------------------------------+-----------------------+\n| "s.remove(x)" | remove the first item from *s* | (3) |\n| | where "s[i] == x" | |\n+--------------------------------+----------------------------------+-----------------------+\n| "s.reverse()" | reverses the items of *s* in | (4) |\n| | place | |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is replacing.\n\n2. The optional argument *i* defaults to "-1", so that by default\n the last item is removed and returned.\n\n3. "remove" raises "ValueError" when *x* is not found in *s*.\n\n4. The "reverse()" method modifies the sequence in place for\n economy of space when reversing a large sequence. To remind users\n that it operates by side effect, it does not return the reversed\n sequence.\n\n5. "clear()" and "copy()" are included for consistency with the\n interfaces of mutable containers that don\'t support slicing\n operations (such as "dict" and "set")\n\n New in version 3.3: "clear()" and "copy()" methods.\n\n6. The value *n* is an integer, or an object implementing\n "__index__()". Zero and negative values of *n* clear the sequence.\n Items in the sequence are not copied; they are referenced multiple\n times, as explained for "s * n" under *Common Sequence Operations*.\n\n\nLists\n=====\n\nLists are mutable sequences, typically used to store collections of\nhomogeneous items (where the precise degree of similarity will vary by\napplication).\n\nclass class list([iterable])\n\n Lists may be constructed in several ways:\n\n * Using a pair of square brackets to denote the empty list: "[]"\n\n * Using square brackets, separating items with commas: "[a]",\n "[a, b, c]"\n\n * Using a list comprehension: "[x for x in iterable]"\n\n * Using the type constructor: "list()" or "list(iterable)"\n\n The constructor builds a list whose items are the same and in the\n same order as *iterable*\'s items. *iterable* may be either a\n sequence, a container that supports iteration, or an iterator\n object. If *iterable* is already a list, a copy is made and\n returned, similar to "iterable[:]". For example, "list(\'abc\')"\n returns "[\'a\', \'b\', \'c\']" and "list( (1, 2, 3) )" returns "[1, 2,\n 3]". If no argument is given, the constructor creates a new empty\n list, "[]".\n\n Many other operations also produce lists, including the "sorted()"\n built-in.\n\n Lists implement all of the *common* and *mutable* sequence\n operations. Lists also provide the following additional method:\n\n sort(*, key=None, reverse=None)\n\n This method sorts the list in place, using only "<" comparisons\n between items. Exceptions are not suppressed - if any comparison\n operations fail, the entire sort operation will fail (and the\n list will likely be left in a partially modified state).\n\n "sort()" accepts two arguments that can only be passed by\n keyword (*keyword-only arguments*):\n\n *key* specifies a function of one argument that is used to\n extract a comparison key from each list element (for example,\n "key=str.lower"). The key corresponding to each item in the list\n is calculated once and then used for the entire sorting process.\n The default value of "None" means that list items are sorted\n directly without calculating a separate key value.\n\n The "functools.cmp_to_key()" utility is available to convert a\n 2.x style *cmp* function to a *key* function.\n\n *reverse* is a boolean value. If set to "True", then the list\n elements are sorted as if each comparison were reversed.\n\n This method modifies the sequence in place for economy of space\n when sorting a large sequence. To remind users that it operates\n by side effect, it does not return the sorted sequence (use\n "sorted()" to explicitly request a new sorted list instance).\n\n The "sort()" method is guaranteed to be stable. A sort is\n stable if it guarantees not to change the relative order of\n elements that compare equal --- this is helpful for sorting in\n multiple passes (for example, sort by department, then by salary\n grade).\n\n **CPython implementation detail:** While a list is being sorted,\n the effect of attempting to mutate, or even inspect, the list is\n undefined. The C implementation of Python makes the list appear\n empty for the duration, and raises "ValueError" if it can detect\n that the list has been mutated during a sort.\n\n\nTuples\n======\n\nTuples are immutable sequences, typically used to store collections of\nheterogeneous data (such as the 2-tuples produced by the "enumerate()"\nbuilt-in). Tuples are also used for cases where an immutable sequence\nof homogeneous data is needed (such as allowing storage in a "set" or\n"dict" instance).\n\nclass class tuple([iterable])\n\n Tuples may be constructed in a number of ways:\n\n * Using a pair of parentheses to denote the empty tuple: "()"\n\n * Using a trailing comma for a singleton tuple: "a," or "(a,)"\n\n * Separating items with commas: "a, b, c" or "(a, b, c)"\n\n * Using the "tuple()" built-in: "tuple()" or "tuple(iterable)"\n\n The constructor builds a tuple whose items are the same and in the\n same order as *iterable*\'s items. *iterable* may be either a\n sequence, a container that supports iteration, or an iterator\n object. If *iterable* is already a tuple, it is returned\n unchanged. For example, "tuple(\'abc\')" returns "(\'a\', \'b\', \'c\')"\n and "tuple( [1, 2, 3] )" returns "(1, 2, 3)". If no argument is\n given, the constructor creates a new empty tuple, "()".\n\n Note that it is actually the comma which makes a tuple, not the\n parentheses. The parentheses are optional, except in the empty\n tuple case, or when they are needed to avoid syntactic ambiguity.\n For example, "f(a, b, c)" is a function call with three arguments,\n while "f((a, b, c))" is a function call with a 3-tuple as the sole\n argument.\n\n Tuples implement all of the *common* sequence operations.\n\nFor heterogeneous collections of data where access by name is clearer\nthan access by index, "collections.namedtuple()" may be a more\nappropriate choice than a simple tuple object.\n\n\nRanges\n======\n\nThe "range" type represents an immutable sequence of numbers and is\ncommonly used for looping a specific number of times in "for" loops.\n\nclass class range(stop)\nclass class range(start, stop[, step])\n\n The arguments to the range constructor must be integers (either\n built-in "int" or any object that implements the "__index__"\n special method). If the *step* argument is omitted, it defaults to\n "1". If the *start* argument is omitted, it defaults to "0". If\n *step* is zero, "ValueError" is raised.\n\n For a positive *step*, the contents of a range "r" are determined\n by the formula "r[i] = start + step*i" where "i >= 0" and "r[i] <\n stop".\n\n For a negative *step*, the contents of the range are still\n determined by the formula "r[i] = start + step*i", but the\n constraints are "i >= 0" and "r[i] > stop".\n\n A range object will be empty if "r[0]" does not meet the value\n constraint. Ranges do support negative indices, but these are\n interpreted as indexing from the end of the sequence determined by\n the positive indices.\n\n Ranges containing absolute values larger than "sys.maxsize" are\n permitted but some features (such as "len()") may raise\n "OverflowError".\n\n Range examples:\n\n >>> list(range(10))\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n >>> list(range(1, 11))\n [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n >>> list(range(0, 30, 5))\n [0, 5, 10, 15, 20, 25]\n >>> list(range(0, 10, 3))\n [0, 3, 6, 9]\n >>> list(range(0, -10, -1))\n [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]\n >>> list(range(0))\n []\n >>> list(range(1, 0))\n []\n\n Ranges implement all of the *common* sequence operations except\n concatenation and repetition (due to the fact that range objects\n can only represent sequences that follow a strict pattern and\n repetition and concatenation will usually violate that pattern).\n\n start\n\n The value of the *start* parameter (or "0" if the parameter was\n not supplied)\n\n stop\n\n The value of the *stop* parameter\n\n step\n\n The value of the *step* parameter (or "1" if the parameter was\n not supplied)\n\nThe advantage of the "range" type over a regular "list" or "tuple" is\nthat a "range" object will always take the same (small) amount of\nmemory, no matter the size of the range it represents (as it only\nstores the "start", "stop" and "step" values, calculating individual\nitems and subranges as needed).\n\nRange objects implement the "collections.abc.Sequence" ABC, and\nprovide features such as containment tests, element index lookup,\nslicing and support for negative indices (see *Sequence Types ---\nlist, tuple, range*):\n\n>>> r = range(0, 20, 2)\n>>> r\nrange(0, 20, 2)\n>>> 11 in r\nFalse\n>>> 10 in r\nTrue\n>>> r.index(10)\n5\n>>> r[5]\n10\n>>> r[:5]\nrange(0, 10, 2)\n>>> r[-1]\n18\n\nTesting range objects for equality with "==" and "!=" compares them as\nsequences. That is, two range objects are considered equal if they\nrepresent the same sequence of values. (Note that two range objects\nthat compare equal might have different "start", "stop" and "step"\nattributes, for example "range(0) == range(2, 1, 3)" or "range(0, 3,\n2) == range(0, 4, 2)".)\n\nChanged in version 3.2: Implement the Sequence ABC. Support slicing\nand negative indices. Test "int" objects for membership in constant\ntime instead of iterating through all items.\n\nChanged in version 3.3: Define \'==\' and \'!=\' to compare range objects\nbased on the sequence of values they define (instead of comparing\nbased on object identity).\n\nNew in version 3.3: The "start", "stop" and "step" attributes.\n', + 'typesseq-mutable': u'\nMutable Sequence Types\n**********************\n\nThe operations in the following table are defined on mutable sequence\ntypes. The "collections.abc.MutableSequence" ABC is provided to make\nit easier to correctly implement these operations on custom sequence\ntypes.\n\nIn the table *s* is an instance of a mutable sequence type, *t* is any\niterable object and *x* is an arbitrary object that meets any type and\nvalue restrictions imposed by *s* (for example, "bytearray" only\naccepts integers that meet the value restriction "0 <= x <= 255").\n\n+--------------------------------+----------------------------------+-----------------------+\n| Operation | Result | Notes |\n+================================+==================================+=======================+\n| "s[i] = x" | item *i* of *s* is replaced by | |\n| | *x* | |\n+--------------------------------+----------------------------------+-----------------------+\n| "s[i:j] = t" | slice of *s* from *i* to *j* is | |\n| | replaced by the contents of the | |\n| | iterable *t* | |\n+--------------------------------+----------------------------------+-----------------------+\n| "del s[i:j]" | same as "s[i:j] = []" | |\n+--------------------------------+----------------------------------+-----------------------+\n| "s[i:j:k] = t" | the elements of "s[i:j:k]" are | (1) |\n| | replaced by those of *t* | |\n+--------------------------------+----------------------------------+-----------------------+\n| "del s[i:j:k]" | removes the elements of | |\n| | "s[i:j:k]" from the list | |\n+--------------------------------+----------------------------------+-----------------------+\n| "s.append(x)" | appends *x* to the end of the | |\n| | sequence (same as | |\n| | "s[len(s):len(s)] = [x]") | |\n+--------------------------------+----------------------------------+-----------------------+\n| "s.clear()" | removes all items from "s" (same | (5) |\n| | as "del s[:]") | |\n+--------------------------------+----------------------------------+-----------------------+\n| "s.copy()" | creates a shallow copy of "s" | (5) |\n| | (same as "s[:]") | |\n+--------------------------------+----------------------------------+-----------------------+\n| "s.extend(t)" or "s += t" | extends *s* with the contents of | |\n| | *t* (for the most part the same | |\n| | as "s[len(s):len(s)] = t") | |\n+--------------------------------+----------------------------------+-----------------------+\n| "s *= n" | updates *s* with its contents | (6) |\n| | repeated *n* times | |\n+--------------------------------+----------------------------------+-----------------------+\n| "s.insert(i, x)" | inserts *x* into *s* at the | |\n| | index given by *i* (same as | |\n| | "s[i:i] = [x]") | |\n+--------------------------------+----------------------------------+-----------------------+\n| "s.pop([i])" | retrieves the item at *i* and | (2) |\n| | also removes it from *s* | |\n+--------------------------------+----------------------------------+-----------------------+\n| "s.remove(x)" | remove the first item from *s* | (3) |\n| | where "s[i] == x" | |\n+--------------------------------+----------------------------------+-----------------------+\n| "s.reverse()" | reverses the items of *s* in | (4) |\n| | place | |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is replacing.\n\n2. The optional argument *i* defaults to "-1", so that by default\n the last item is removed and returned.\n\n3. "remove" raises "ValueError" when *x* is not found in *s*.\n\n4. The "reverse()" method modifies the sequence in place for\n economy of space when reversing a large sequence. To remind users\n that it operates by side effect, it does not return the reversed\n sequence.\n\n5. "clear()" and "copy()" are included for consistency with the\n interfaces of mutable containers that don\'t support slicing\n operations (such as "dict" and "set")\n\n New in version 3.3: "clear()" and "copy()" methods.\n\n6. The value *n* is an integer, or an object implementing\n "__index__()". Zero and negative values of *n* clear the sequence.\n Items in the sequence are not copied; they are referenced multiple\n times, as explained for "s * n" under *Common Sequence Operations*.\n', + 'unary': u'\nUnary arithmetic and bitwise operations\n***************************************\n\nAll unary arithmetic and bitwise operations have the same priority:\n\n u_expr ::= power | "-" u_expr | "+" u_expr | "~" u_expr\n\nThe unary "-" (minus) operator yields the negation of its numeric\nargument.\n\nThe unary "+" (plus) operator yields its numeric argument unchanged.\n\nThe unary "~" (invert) operator yields the bitwise inversion of its\ninteger argument. The bitwise inversion of "x" is defined as\n"-(x+1)". It only applies to integral numbers.\n\nIn all three cases, if the argument does not have the proper type, a\n"TypeError" exception is raised.\n', + 'while': u'\nThe "while" statement\n*********************\n\nThe "while" statement is used for repeated execution as long as an\nexpression is true:\n\n while_stmt ::= "while" expression ":" suite\n ["else" ":" suite]\n\nThis repeatedly tests the expression and, if it is true, executes the\nfirst suite; if the expression is false (which may be the first time\nit is tested) the suite of the "else" clause, if present, is executed\nand the loop terminates.\n\nA "break" statement executed in the first suite terminates the loop\nwithout executing the "else" clause\'s suite. A "continue" statement\nexecuted in the first suite skips the rest of the suite and goes back\nto testing the expression.\n', + 'with': u'\nThe "with" statement\n********************\n\nThe "with" statement is used to wrap the execution of a block with\nmethods defined by a context manager (see section *With Statement\nContext Managers*). This allows common "try"..."except"..."finally"\nusage patterns to be encapsulated for convenient reuse.\n\n with_stmt ::= "with" with_item ("," with_item)* ":" suite\n with_item ::= expression ["as" target]\n\nThe execution of the "with" statement with one "item" proceeds as\nfollows:\n\n1. The context expression (the expression given in the "with_item")\n is evaluated to obtain a context manager.\n\n2. The context manager\'s "__exit__()" is loaded for later use.\n\n3. The context manager\'s "__enter__()" method is invoked.\n\n4. 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 method returns without an error, then "__exit__()" will always be\n called. Thus, if an error occurs during the assignment to the\n target list, it will be treated the same as an error occurring\n within the suite would be. See step 6 below.\n\n5. The suite is executed.\n\n6. The context manager\'s "__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 "None" arguments are supplied.\n\n If the suite was exited due to an exception, and the return value\n from the "__exit__()" method was false, the exception is reraised.\n If the return value was true, the exception is suppressed, and\n execution continues with the statement following the "with"\n statement.\n\n If the suite was exited for any reason other than an exception, the\n return value from "__exit__()" is ignored, and execution proceeds\n at the normal location for the kind of exit that was taken.\n\nWith more than one item, the context managers are processed as if\nmultiple "with" statements were nested:\n\n with A() as a, B() as b:\n suite\n\nis equivalent to\n\n with A() as a:\n with B() as b:\n suite\n\nChanged in version 3.1: Support for multiple context expressions.\n\nSee also: **PEP 343** - The "with" statement\n\n The specification, background, and examples for the Python "with"\n statement.\n', + 'yield': u'\nThe "yield" statement\n*********************\n\n yield_stmt ::= yield_expression\n\nA "yield" statement is semantically equivalent to a *yield\nexpression*. The yield statement can be used to omit the parentheses\nthat would otherwise be required in the equivalent yield expression\nstatement. For example, the yield statements\n\n yield \n yield from \n\nare equivalent to the yield expression statements\n\n (yield )\n (yield from )\n\nYield expressions and statements are only used when defining a\n*generator* function, and are only used in the body of the generator\nfunction. Using yield in a function definition is sufficient to cause\nthat definition to create a generator function instead of a normal\nfunction.\n\nFor full details of "yield" semantics, refer to the *Yield\nexpressions* section.\n'} diff --git a/Misc/NEWS.d/3.5.7rc1.rst b/Misc/NEWS.d/3.5.7rc1.rst new file mode 100644 index 000000000000..5462c3c95a2a --- /dev/null +++ b/Misc/NEWS.d/3.5.7rc1.rst @@ -0,0 +1,49 @@ +.. bpo: 35746 +.. date: 2019-01-15-18-16-05 +.. nonce: nMSd0j +.. release date: 2019-03-03 +.. section: Security + +[CVE-2019-5010] Fix a NULL pointer deref in ssl module. The cert parser did +not handle CRL distribution points with empty DP or URI correctly. A +malicious or buggy certificate can result into segfault. Vulnerability +(TALOS-2018-0758) reported by Colin Read and Nicolas Edet of Cisco. + +.. + +.. bpo: 34791 +.. date: 2018-09-24-18-49-25 +.. nonce: 78GmIG +.. section: Security + +The xml.sax and xml.dom.domreg no longer use environment variables to +override parser implementations when sys.flags.ignore_environment is set by +-E or -I arguments. + +.. + +.. bpo: 34623 +.. date: 2018-09-10-16-05-39 +.. nonce: Ua9jMv +.. section: Security + +CVE-2018-14647: The C accelerated _elementtree module now initializes hash +randomization salt from _Py_HashSecret instead of libexpat's default CSPRNG. + +.. + +.. bpo: 33329 +.. date: 2018-04-23-13-21-39 +.. nonce: lQ-Eod +.. section: Library + +Fix multiprocessing regression on newer glibcs + +.. + +.. bpo: 33127 +.. date: 2018-03-24-15-08-24 +.. nonce: olJmHv +.. section: Library + +The ssl module now compiles with LibreSSL 2.7.1. diff --git a/Misc/NEWS.d/next/Library/2018-03-24-15-08-24.bpo-33127.olJmHv.rst b/Misc/NEWS.d/next/Library/2018-03-24-15-08-24.bpo-33127.olJmHv.rst deleted file mode 100644 index 635aabbde031..000000000000 --- a/Misc/NEWS.d/next/Library/2018-03-24-15-08-24.bpo-33127.olJmHv.rst +++ /dev/null @@ -1 +0,0 @@ -The ssl module now compiles with LibreSSL 2.7.1. diff --git a/Misc/NEWS.d/next/Library/2018-04-23-13-21-39.bpo-33329.lQ-Eod.rst b/Misc/NEWS.d/next/Library/2018-04-23-13-21-39.bpo-33329.lQ-Eod.rst deleted file mode 100644 index d1a4e56d04b9..000000000000 --- a/Misc/NEWS.d/next/Library/2018-04-23-13-21-39.bpo-33329.lQ-Eod.rst +++ /dev/null @@ -1 +0,0 @@ -Fix multiprocessing regression on newer glibcs diff --git a/Misc/NEWS.d/next/Security/2018-09-10-16-05-39.bpo-34623.Ua9jMv.rst b/Misc/NEWS.d/next/Security/2018-09-10-16-05-39.bpo-34623.Ua9jMv.rst deleted file mode 100644 index cbaa4b750644..000000000000 --- a/Misc/NEWS.d/next/Security/2018-09-10-16-05-39.bpo-34623.Ua9jMv.rst +++ /dev/null @@ -1,2 +0,0 @@ -CVE-2018-14647: The C accelerated _elementtree module now initializes hash -randomization salt from _Py_HashSecret instead of libexpat's default CSPRNG. diff --git a/Misc/NEWS.d/next/Security/2018-09-24-18-49-25.bpo-34791.78GmIG.rst b/Misc/NEWS.d/next/Security/2018-09-24-18-49-25.bpo-34791.78GmIG.rst deleted file mode 100644 index afb59f8cb0eb..000000000000 --- a/Misc/NEWS.d/next/Security/2018-09-24-18-49-25.bpo-34791.78GmIG.rst +++ /dev/null @@ -1,3 +0,0 @@ -The xml.sax and xml.dom.domreg no longer use environment variables to -override parser implementations when sys.flags.ignore_environment is set by --E or -I arguments. diff --git a/Misc/NEWS.d/next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst b/Misc/NEWS.d/next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst deleted file mode 100644 index fc703b9c2469..000000000000 --- a/Misc/NEWS.d/next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst +++ /dev/null @@ -1,4 +0,0 @@ -[CVE-2019-5010] Fix a NULL pointer deref in ssl module. The cert parser did -not handle CRL distribution points with empty DP or URI correctly. A -malicious or buggy certificate can result into segfault. Vulnerability -(TALOS-2018-0758) reported by Colin Read and Nicolas Edet of Cisco. From webhook-mailer at python.org Mon Mar 4 08:01:51 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 04 Mar 2019 13:01:51 -0000 Subject: [Python-checkins] bpo-20906: Various revisions to the Unicode howto (GH-8394) Message-ID: https://github.com/python/cpython/commit/84fa6b9e5932af981cb299c0c5ac80b9cc37c3fa commit: 84fa6b9e5932af981cb299c0c5ac80b9cc37c3fa branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-04T05:01:47-08:00 summary: bpo-20906: Various revisions to the Unicode howto (GH-8394) * bpo-20906: Corrections & revisions to Unicode HOWTO * bpo-34484: don't describe range as a Private Use Area (cherry picked from commit 97c288df614dd7856f5a0336925f56a7a2a5bc74) Co-authored-by: Andrew Kuchling files: M Doc/howto/unicode.rst diff --git a/Doc/howto/unicode.rst b/Doc/howto/unicode.rst index be1fefb35a71..5339bf45bf0e 100644 --- a/Doc/howto/unicode.rst +++ b/Doc/howto/unicode.rst @@ -6,95 +6,48 @@ :Release: 1.12 -This HOWTO discusses Python support for Unicode, and explains -various problems that people commonly encounter when trying to work -with Unicode. +This HOWTO discusses Python's support for the Unicode specification +for representing textual data, and explains various problems that +people commonly encounter when trying to work with Unicode. + Introduction to Unicode ======================= -History of Character Codes --------------------------- - -In 1968, the American Standard Code for Information Interchange, better known by -its acronym ASCII, was standardized. ASCII defined numeric codes for various -characters, with the numeric values running from 0 to 127. For example, the -lowercase letter 'a' is assigned 97 as its code value. - -ASCII was an American-developed standard, so it only defined unaccented -characters. There was an 'e', but no '?' or '?'. This meant that languages -which required accented characters couldn't be faithfully represented in ASCII. -(Actually the missing accents matter for English, too, which contains words such -as 'na?ve' and 'caf?', and some publications have house styles which require -spellings such as 'co?perate'.) - -For a while people just wrote programs that didn't display accents. -In the mid-1980s an Apple II BASIC program written by a French speaker -might have lines like these: - -.. code-block:: basic - - PRINT "MISE A JOUR TERMINEE" - PRINT "PARAMETRES ENREGISTRES" - -Those messages should contain accents (termin?e, param?tre, enregistr?s) and -they just look wrong to someone who can read French. - -In the 1980s, almost all personal computers were 8-bit, meaning that bytes could -hold values ranging from 0 to 255. ASCII codes only went up to 127, so some -machines assigned values between 128 and 255 to accented characters. Different -machines had different codes, however, which led to problems exchanging files. -Eventually various commonly used sets of values for the 128--255 range emerged. -Some were true standards, defined by the International Organization for -Standardization, and some were *de facto* conventions that were invented by one -company or another and managed to catch on. - -255 characters aren't very many. For example, you can't fit both the accented -characters used in Western Europe and the Cyrillic alphabet used for Russian -into the 128--255 range because there are more than 128 such characters. - -You could write files using different codes (all your Russian files in a coding -system called KOI8, all your French files in a different coding system called -Latin1), but what if you wanted to write a French document that quotes some -Russian text? In the 1980s people began to want to solve this problem, and the -Unicode standardization effort began. - -Unicode started out using 16-bit characters instead of 8-bit characters. 16 -bits means you have 2^16 = 65,536 distinct values available, making it possible -to represent many different characters from many different alphabets; an initial -goal was to have Unicode contain the alphabets for every single human language. -It turns out that even 16 bits isn't enough to meet that goal, and the modern -Unicode specification uses a wider range of codes, 0 through 1,114,111 ( -``0x10FFFF`` in base 16). - -There's a related ISO standard, ISO 10646. Unicode and ISO 10646 were -originally separate efforts, but the specifications were merged with the 1.1 -revision of Unicode. - -(This discussion of Unicode's history is highly simplified. The -precise historical details aren't necessary for understanding how to -use Unicode effectively, but if you're curious, consult the Unicode -consortium site listed in the References or -the `Wikipedia entry for Unicode `_ -for more information.) - - Definitions ----------- +Today's programs need to be able to handle a wide variety of +characters. Applications are often internationalized to display +messages and output in a variety of user-selectable languages; the +same program might need to output an error message in English, French, +Japanese, Hebrew, or Russian. Web content can be written in any of +these languages and can also include a variety of emoji symbols. +Python's string type uses the Unicode Standard for representing +characters, which lets Python programs work with all these different +possible characters. + +Unicode (https://www.unicode.org/) is a specification that aims to +list every character used by human languages and give each character +its own unique code. The Unicode specifications are continually +revised and updated to add new languages and symbols. + A **character** is the smallest possible component of a text. 'A', 'B', 'C', -etc., are all different characters. So are '?' and '?'. Characters are -abstractions, and vary depending on the language or context you're talking -about. For example, the symbol for ohms (?) is usually drawn much like the -capital letter omega (?) in the Greek alphabet (they may even be the same in -some fonts), but these are two different characters that have different -meanings. - -The Unicode standard describes how characters are represented by **code -points**. A code point is an integer value, usually denoted in base 16. In the -standard, a code point is written using the notation ``U+12CA`` to mean the -character with value ``0x12ca`` (4,810 decimal). The Unicode standard contains -a lot of tables listing characters and their corresponding code points: +etc., are all different characters. So are '?' and '?'. Characters vary +depending on the language or context you're talking +about. For example, there's a character for "Roman Numeral One", '?', that's +separate from the uppercase letter 'I'. They'll usually look the same, +but these are two different characters that have different meanings. + +The Unicode standard describes how characters are represented by +**code points**. A code point value is an integer in the range 0 to +0x10FFFF (about 1.1 million values, with some 110 thousand assigned so +far). In the standard and in this document, a code point is written +using the notation ``U+265E`` to mean the character with value +``0x265e`` (9,822 in decimal). + +The Unicode standard contains a lot of tables listing characters and +their corresponding code points: .. code-block:: none @@ -103,10 +56,21 @@ a lot of tables listing characters and their corresponding code points: 0063 'c'; LATIN SMALL LETTER C ... 007B '{'; LEFT CURLY BRACKET + ... + 2167 '?': ROMAN NUMERAL EIGHT + 2168 '?': ROMAN NUMERAL NINE + ... + 265E '?': BLACK CHESS KNIGHT + 265F '?': BLACK CHESS PAWN + ... + 1F600 '?': GRINNING FACE + 1F609 '?': WINKING FACE + ... Strictly, these definitions imply that it's meaningless to say 'this is -character ``U+12CA``'. ``U+12CA`` is a code point, which represents some particular -character; in this case, it represents the character 'ETHIOPIC SYLLABLE WI'. In +character ``U+265E``'. ``U+265E`` is a code point, which represents some particular +character; in this case, it represents the character 'BLACK CHESS KNIGHT', +'?'. In informal contexts, this distinction between code points and characters will sometimes be forgotten. @@ -121,14 +85,17 @@ toolkit or a terminal's font renderer. Encodings --------- -To summarize the previous section: a Unicode string is a sequence of code -points, which are numbers from 0 through ``0x10FFFF`` (1,114,111 decimal). This -sequence needs to be represented as a set of bytes (meaning, values -from 0 through 255) in memory. The rules for translating a Unicode string -into a sequence of bytes are called an **encoding**. +To summarize the previous section: a Unicode string is a sequence of +code points, which are numbers from 0 through ``0x10FFFF`` (1,114,111 +decimal). This sequence of code points needs to be represented in +memory as a set of **code units**, and **code units** are then mapped +to 8-bit bytes. The rules for translating a Unicode string into a +sequence of bytes are called a **character encoding**, or just +an **encoding**. -The first encoding you might think of is an array of 32-bit integers. In this -representation, the string "Python" would look like this: +The first encoding you might think of is using 32-bit integers as the +code unit, and then using the CPU's representation of 32-bit integers. +In this representation, the string "Python" might look like this: .. code-block:: none @@ -152,40 +119,14 @@ problems. 3. It's not compatible with existing C functions such as ``strlen()``, so a new family of wide string functions would need to be used. -4. Many Internet standards are defined in terms of textual data, and can't - handle content with embedded zero bytes. - -Generally people don't use this encoding, instead choosing other -encodings that are more efficient and convenient. UTF-8 is probably -the most commonly supported encoding; it will be discussed below. - -Encodings don't have to handle every possible Unicode character, and most -encodings don't. The rules for converting a Unicode string into the ASCII -encoding, for example, are simple; for each code point: - -1. If the code point is < 128, each byte is the same as the value of the code - point. +Therefore this encoding isn't used very much, and people instead choose other +encodings that are more efficient and convenient, such as UTF-8. -2. If the code point is 128 or greater, the Unicode string can't be represented - in this encoding. (Python raises a :exc:`UnicodeEncodeError` exception in this - case.) - -Latin-1, also known as ISO-8859-1, is a similar encoding. Unicode code points -0--255 are identical to the Latin-1 values, so converting to this encoding simply -requires converting code points to byte values; if a code point larger than 255 -is encountered, the string can't be encoded into Latin-1. - -Encodings don't have to be simple one-to-one mappings like Latin-1. Consider -IBM's EBCDIC, which was used on IBM mainframes. Letter values weren't in one -block: 'a' through 'i' had values from 129 to 137, but 'j' through 'r' were 145 -through 153. If you wanted to use EBCDIC as an encoding, you'd probably use -some sort of lookup table to perform the conversion, but this is largely an -internal detail. - -UTF-8 is one of the most commonly used encodings. UTF stands for "Unicode -Transformation Format", and the '8' means that 8-bit numbers are used in the -encoding. (There are also a UTF-16 and UTF-32 encodings, but they are less -frequently used than UTF-8.) UTF-8 uses the following rules: +UTF-8 is one of the most commonly used encodings, and Python often +defaults to using it. UTF stands for "Unicode Transformation Format", +and the '8' means that 8-bit values are used in the encoding. (There +are also UTF-16 and UTF-32 encodings, but they are less frequently +used than UTF-8.) UTF-8 uses the following rules: 1. If the code point is < 128, it's represented by the corresponding byte value. 2. If the code point is >= 128, it's turned into a sequence of two, three, or @@ -215,6 +156,10 @@ glossary, and PDF versions of the Unicode specification. Be prepared for some difficult reading. `A chronology `_ of the origin and development of Unicode is also available on the site. +On the Computerphile Youtube channel, Tom Scott briefly +`discusses the history of Unicode and UTF-8 ` +(9 minutes 36 seconds). + To help understand the standard, Jukka Korpela has written `an introductory guide `_ to reading the Unicode character tables. @@ -238,7 +183,7 @@ Unicode features. The String Type --------------- -Since Python 3.0, the language features a :class:`str` type that contain Unicode +Since Python 3.0, the language's :class:`str` type contains Unicode characters, meaning any string created using ``"unicode rocks!"``, ``'unicode rocks!'``, or the triple-quoted string syntax is stored as Unicode. @@ -252,11 +197,6 @@ include a Unicode character in a string literal:: # 'File not found' error message. print("Fichier non trouv?") -You can use a different encoding from UTF-8 by putting a specially-formatted -comment as the first or second line of the source code:: - - # -*- coding: -*- - Side note: Python 3 also supports using Unicode characters in identifiers:: r?pertoire = "/tmp/records.log" @@ -299,7 +239,7 @@ The following examples show the differences:: >>> b'\x80abc'.decode("utf-8", "ignore") 'abc' -Encodings are specified as strings containing the encoding's name. Python 3.2 +Encodings are specified as strings containing the encoding's name. Python comes with roughly 100 different encodings; see the Python Library Reference at :ref:`standard-encodings` for a list. Some encodings have multiple names; for example, ``'latin-1'``, ``'iso_8859_1'`` and ``'8859``' are all synonyms for @@ -409,12 +349,13 @@ already mentioned. See also :pep:`263` for more information. Unicode Properties ------------------ -The Unicode specification includes a database of information about code points. -For each defined code point, the information includes the character's -name, its category, the numeric value if applicable (Unicode has characters -representing the Roman numerals and fractions such as one-third and -four-fifths). There are also properties related to the code point's use in -bidirectional text and other display-related properties. +The Unicode specification includes a database of information about +code points. For each defined code point, the information includes +the character's name, its category, the numeric value if applicable +(for characters representing numeric concepts such as the Roman +numerals, fractions such as one-third and four-fifths, etc.). There +are also display-related properties, such as how to use the code point +in bidirectional text. The following program displays some information about several characters, and prints the numeric value of one particular character:: @@ -451,6 +392,88 @@ other". See list of category codes. +Comparing Strings +----------------- + +Unicode adds some complication to comparing strings, because the same +set of characters can be represented by different sequences of code +points. For example, a letter like '?' can be represented as a single +code point U+00EA, or as U+0065 U+0302, which is the code point for +'e' followed by a code point for 'COMBINING CIRCUMFLEX ACCENT'. These +will produce the same output when printed, but one is a string of +length 1 and the other is of length 2. + +One tool for a case-insensitive comparison is the +:meth:`~str.casefold` string method that converts a string to a +case-insensitive form following an algorithm described by the Unicode +Standard. This algorithm has special handling for characters such as +the German letter '?' (code point U+00DF), which becomes the pair of +lowercase letters 'ss'. + +:: + + >>> street = 'G?rzenichstra?e' + >>> street.casefold() + 'g?rzenichstrasse' + +A second tool is the :mod:`unicodedata` module's +:func:`~unicodedata.normalize` function that converts strings to one +of several normal forms, where letters followed by a combining +character are replaced with single characters. :func:`normalize` can +be used to perform string comparisons that won't falsely report +inequality if two strings use combining characters differently: + +:: + + import unicodedata + + def compare_strs(s1, s2): + def NFD(s): + return unicodedata.normalize('NFD', s) + + return NFD(s1) == NFD(s2) + + single_char = '?' + multiple_chars = '\N{LATIN SMALL LETTER E}\N{COMBINING CIRCUMFLEX ACCENT}' + print('length of first string=', len(single_char)) + print('length of second string=', len(multiple_chars)) + print(compare_strs(single_char, multiple_chars)) + +When run, this outputs: + +.. code-block:: shell-session + + $ python3 compare-strs.py + length of first string= 1 + length of second string= 2 + True + +The first argument to the :func:`~unicodedata.normalize` function is a +string giving the desired normalization form, which can be one of +'NFC', 'NFKC', 'NFD', and 'NFKD'. + +The Unicode Standard also specifies how to do caseless comparisons:: + + import unicodedata + + def compare_caseless(s1, s2): + def NFD(s): + return unicodedata.normalize('NFD', s) + + return NFD(NFD(s1).casefold()) == NFD(NFD(s2).casefold()) + + # Example usage + single_char = '?' + multiple_chars = '\N{LATIN CAPITAL LETTER E}\N{COMBINING CIRCUMFLEX ACCENT}' + + print(compare_caseless(single_char, multiple_chars)) + +This will print ``True``. (Why is :func:`NFD` invoked twice? Because +there are a few characters that make :meth:`casefold` return a +non-normalized string, so the result needs to be normalized again. See +section 3.13 of the Unicode Standard for a discussion and an example.) + + Unicode Regular Expressions --------------------------- @@ -567,22 +590,22 @@ particular byte ordering and don't skip the BOM. In some areas, it is also convention to use a "BOM" at the start of UTF-8 encoded files; the name is misleading since UTF-8 is not byte-order dependent. -The mark simply announces that the file is encoded in UTF-8. Use the -'utf-8-sig' codec to automatically skip the mark if present for reading such -files. +The mark simply announces that the file is encoded in UTF-8. For reading such +files, use the 'utf-8-sig' codec to automatically skip the mark if present. Unicode filenames ----------------- -Most of the operating systems in common use today support filenames that contain -arbitrary Unicode characters. Usually this is implemented by converting the -Unicode string into some encoding that varies depending on the system. For -example, Mac OS X uses UTF-8 while Windows uses a configurable encoding; on -Windows, Python uses the name "mbcs" to refer to whatever the currently -configured encoding is. On Unix systems, there will only be a filesystem -encoding if you've set the ``LANG`` or ``LC_CTYPE`` environment variables; if -you haven't, the default encoding is UTF-8. +Most of the operating systems in common use today support filenames +that contain arbitrary Unicode characters. Usually this is +implemented by converting the Unicode string into some encoding that +varies depending on the system. Today Python is converging on using +UTF-8: Python on MacOS has used UTF-8 for several versions, and Python +3.6 switched to using UTF-8 on Windows as well. On Unix systems, +there will only be a filesystem encoding if you've set the ``LANG`` or +``LC_CTYPE`` environment variables; if you haven't, the default +encoding is again UTF-8. The :func:`sys.getfilesystemencoding` function returns the encoding to use on your current system, in case you want to do the encoding manually, but there's @@ -597,9 +620,9 @@ automatically converted to the right encoding for you:: Functions in the :mod:`os` module such as :func:`os.stat` will also accept Unicode filenames. -The :func:`os.listdir` function returns filenames and raises an issue: should it return +The :func:`os.listdir` function returns filenames, which raises an issue: should it return the Unicode version of filenames, or should it return bytes containing -the encoded versions? :func:`os.listdir` will do both, depending on whether you +the encoded versions? :func:`os.listdir` can do both, depending on whether you provided the directory path as bytes or a Unicode string. If you pass a Unicode string as the path, filenames will be decoded using the filesystem's encoding and a list of Unicode strings will be returned, while passing a byte @@ -619,16 +642,17 @@ will produce the following output: .. code-block:: shell-session - amk:~$ python t.py + $ python listdir-test.py [b'filename\xe4\x94\x80abc', ...] ['filename\u4500abc', ...] The first list contains UTF-8-encoded filenames, and the second list contains the Unicode versions. -Note that on most occasions, the Unicode APIs should be used. The bytes APIs -should only be used on systems where undecodable file names can be present, -i.e. Unix systems. +Note that on most occasions, you should can just stick with using +Unicode with these APIs. The bytes APIs should only be used on +systems where undecodable file names can be present; that's +pretty much only Unix systems now. Tips for Writing Unicode-aware Programs @@ -695,10 +719,10 @@ with the ``surrogateescape`` error handler:: f.write(data) The ``surrogateescape`` error handler will decode any non-ASCII bytes -as code points in the Unicode Private Use Area ranging from U+DC80 to -U+DCFF. These private code points will then be turned back into the -same bytes when the ``surrogateescape`` error handler is used when -encoding the data and writing it back out. +as code points in a special range running from U+DC80 to +U+DCFF. These code points will then turn back into the +same bytes when the ``surrogateescape`` error handler is used to +encode the data and write it back out. References @@ -730,4 +754,5 @@ Andrew Kuchling, and Ezio Melotti. Thanks to the following people who have noted errors or offered suggestions on this article: ?ric Araujo, Nicholas Bastin, Nick Coghlan, Marius Gedminas, Kent Johnson, Ken Krugler, Marc-Andr? -Lemburg, Martin von L?wis, Terry J. Reedy, Chad Whitacre. +Lemburg, Martin von L?wis, Terry J. Reedy, Serhiy Storchaka, +Eryk Sun, Chad Whitacre, Graham Wideman. From webhook-mailer at python.org Mon Mar 4 08:21:32 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 04 Mar 2019 13:21:32 -0000 Subject: [Python-checkins] Revert: bpo-33608: Factor out a private, per-interpreter _Py_AddPendingCall(). (GH-11617) (GH-12159) Message-ID: https://github.com/python/cpython/commit/4d61e6e3b802399be62a521d6fa785698cb670b5 commit: 4d61e6e3b802399be62a521d6fa785698cb670b5 branch: master author: Victor Stinner committer: GitHub date: 2019-03-04T14:21:28+01:00 summary: Revert: bpo-33608: Factor out a private, per-interpreter _Py_AddPendingCall(). (GH-11617) (GH-12159) * Revert "bpo-36097: Use only public C-API in the_xxsubinterpreters module (adding as necessary). (#12003)" This reverts commit bcfa450f210074e16feb761ae5b3e966a2532fcf. * Revert "bpo-33608: Simplify ceval's DISPATCH by hoisting eval_breaker ahead of time. (gh-12062)" This reverts commit bda918bf65a88560ec453aaba0758a9c0d49b449. * Revert "bpo-33608: Use _Py_AddPendingCall() in _PyCrossInterpreterData_Release(). (gh-12024)" This reverts commit b05b711a2cef6c6c381e01069dedac372e0b9fb2. * Revert "bpo-33608: Factor out a private, per-interpreter _Py_AddPendingCall(). (GH-11617)" This reverts commit ef4ac967e2f3a9a18330cc6abe14adb4bc3d0465. files: D Include/cpython/interpreteridobject.h D Include/interpreteridobject.h D Objects/interpreteridobject.c M Include/ceval.h M Include/cpython/pystate.h M Include/internal/pycore_atomic.h M Include/internal/pycore_ceval.h M Include/internal/pycore_pystate.h M Makefile.pre.in M Modules/_testcapimodule.c M Modules/_xxsubinterpretersmodule.c M Modules/signalmodule.c M Objects/object.c M PCbuild/pythoncore.vcxproj M PCbuild/pythoncore.vcxproj.filters M Python/ceval.c M Python/ceval_gil.h M Python/pylifecycle.c M Python/pystate.c M setup.py diff --git a/Include/ceval.h b/Include/ceval.h index 9c6d420bc234..11283c0a570b 100644 --- a/Include/ceval.h +++ b/Include/ceval.h @@ -221,7 +221,7 @@ PyAPI_FUNC(Py_ssize_t) _PyEval_RequestCodeExtraIndex(freefunc); #ifndef Py_LIMITED_API PyAPI_FUNC(int) _PyEval_SliceIndex(PyObject *, Py_ssize_t *); PyAPI_FUNC(int) _PyEval_SliceIndexNotNone(PyObject *, Py_ssize_t *); -PyAPI_FUNC(void) _PyEval_SignalAsyncExc(PyInterpreterState *); +PyAPI_FUNC(void) _PyEval_SignalAsyncExc(void); #endif /* Masks and values used by FORMAT_VALUE opcode. */ diff --git a/Include/cpython/interpreteridobject.h b/Include/cpython/interpreteridobject.h deleted file mode 100644 index cb72c2b0895a..000000000000 --- a/Include/cpython/interpreteridobject.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef Py_CPYTHON_INTERPRETERIDOBJECT_H -# error "this header file must not be included directly" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* Interpreter ID Object */ - -PyAPI_DATA(PyTypeObject) _PyInterpreterID_Type; - -PyAPI_FUNC(PyObject *) _PyInterpreterID_New(int64_t); -PyAPI_FUNC(PyObject *) _PyInterpreterState_GetIDObject(PyInterpreterState *); -PyAPI_FUNC(PyInterpreterState *) _PyInterpreterID_LookUp(PyObject *); - -PyAPI_FUNC(int64_t) _Py_CoerceID(PyObject *); - -#ifdef __cplusplus -} -#endif diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h index 5439d07e6af3..3fca78f9ddf2 100644 --- a/Include/cpython/pystate.h +++ b/Include/cpython/pystate.h @@ -30,13 +30,9 @@ typedef struct { (_PyMainInterpreterConfig){.install_signal_handlers = -1} /* Note: _PyMainInterpreterConfig_INIT sets other fields to 0/NULL */ -PyAPI_FUNC(int) _PyInterpreterState_RequiresIDRef(PyInterpreterState *); -PyAPI_FUNC(void) _PyInterpreterState_RequireIDRef(PyInterpreterState *, int); - PyAPI_FUNC(_PyCoreConfig *) _PyInterpreterState_GetCoreConfig(PyInterpreterState *); PyAPI_FUNC(_PyMainInterpreterConfig *) _PyInterpreterState_GetMainConfig(PyInterpreterState *); -PyAPI_FUNC(PyObject *) _PyInterpreterState_GetMainModule(PyInterpreterState *); /* State unique per thread */ @@ -218,65 +214,6 @@ PyAPI_FUNC(PyThreadState *) PyThreadState_Next(PyThreadState *); typedef struct _frame *(*PyThreadFrameGetter)(PyThreadState *self_); -/* cross-interpreter data */ - -struct _xid; - -// _PyCrossInterpreterData is similar to Py_buffer as an effectively -// opaque struct that holds data outside the object machinery. This -// is necessary to pass safely between interpreters in the same process. -typedef struct _xid { - // data is the cross-interpreter-safe derivation of a Python object - // (see _PyObject_GetCrossInterpreterData). It will be NULL if the - // new_object func (below) encodes the data. - void *data; - // obj is the Python object from which the data was derived. This - // is non-NULL only if the data remains bound to the object in some - // way, such that the object must be "released" (via a decref) when - // the data is released. In that case the code that sets the field, - // likely a registered "crossinterpdatafunc", is responsible for - // ensuring it owns the reference (i.e. incref). - PyObject *obj; - // interp is the ID of the owning interpreter of the original - // object. It corresponds to the active interpreter when - // _PyObject_GetCrossInterpreterData() was called. This should only - // be set by the cross-interpreter machinery. - // - // We use the ID rather than the PyInterpreterState to avoid issues - // with deleted interpreters. Note that IDs are never re-used, so - // each one will always correspond to a specific interpreter - // (whether still alive or not). - int64_t interp; - // new_object is a function that returns a new object in the current - // interpreter given the data. The resulting object (a new - // reference) will be equivalent to the original object. This field - // is required. - PyObject *(*new_object)(struct _xid *); - // free is called when the data is released. If it is NULL then - // nothing will be done to free the data. For some types this is - // okay (e.g. bytes) and for those types this field should be set - // to NULL. However, for most the data was allocated just for - // cross-interpreter use, so it must be freed when - // _PyCrossInterpreterData_Release is called or the memory will - // leak. In that case, at the very least this field should be set - // to PyMem_RawFree (the default if not explicitly set to NULL). - // The call will happen with the original interpreter activated. - void (*free)(void *); -} _PyCrossInterpreterData; - -PyAPI_FUNC(int) _PyObject_GetCrossInterpreterData(PyObject *, _PyCrossInterpreterData *); -PyAPI_FUNC(PyObject *) _PyCrossInterpreterData_NewObject(_PyCrossInterpreterData *); -PyAPI_FUNC(void) _PyCrossInterpreterData_Release(_PyCrossInterpreterData *); - -PyAPI_FUNC(int) _PyObject_CheckCrossInterpreterData(PyObject *); - -/* cross-interpreter data registry */ - -typedef int (*crossinterpdatafunc)(PyObject *, struct _xid *); - -PyAPI_FUNC(int) _PyCrossInterpreterData_RegisterClass(PyTypeObject *, crossinterpdatafunc); -PyAPI_FUNC(crossinterpdatafunc) _PyCrossInterpreterData_Lookup(PyObject *); - #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_atomic.h b/Include/internal/pycore_atomic.h index 7aa7eed6f7c2..5669f71b941f 100644 --- a/Include/internal/pycore_atomic.h +++ b/Include/internal/pycore_atomic.h @@ -58,10 +58,10 @@ typedef struct _Py_atomic_int { atomic_thread_fence(ORDER) #define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ - atomic_store_explicit(&((ATOMIC_VAL)->_value), NEW_VAL, ORDER) + atomic_store_explicit(&(ATOMIC_VAL)->_value, NEW_VAL, ORDER) #define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ - atomic_load_explicit(&((ATOMIC_VAL)->_value), ORDER) + atomic_load_explicit(&(ATOMIC_VAL)->_value, ORDER) /* Use builtin atomic operations in GCC >= 4.7 */ #elif defined(HAVE_BUILTIN_ATOMIC) @@ -92,14 +92,14 @@ typedef struct _Py_atomic_int { (assert((ORDER) == __ATOMIC_RELAXED \ || (ORDER) == __ATOMIC_SEQ_CST \ || (ORDER) == __ATOMIC_RELEASE), \ - __atomic_store_n(&((ATOMIC_VAL)->_value), NEW_VAL, ORDER)) + __atomic_store_n(&(ATOMIC_VAL)->_value, NEW_VAL, ORDER)) #define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ (assert((ORDER) == __ATOMIC_RELAXED \ || (ORDER) == __ATOMIC_SEQ_CST \ || (ORDER) == __ATOMIC_ACQUIRE \ || (ORDER) == __ATOMIC_CONSUME), \ - __atomic_load_n(&((ATOMIC_VAL)->_value), ORDER)) + __atomic_load_n(&(ATOMIC_VAL)->_value, ORDER)) /* Only support GCC (for expression statements) and x86 (for simple * atomic semantics) and MSVC x86/x64/ARM */ @@ -324,7 +324,7 @@ inline intptr_t _Py_atomic_load_64bit(volatile uintptr_t* value, int order) { } #else -#define _Py_atomic_load_64bit(ATOMIC_VAL, ORDER) *(ATOMIC_VAL) +#define _Py_atomic_load_64bit(ATOMIC_VAL, ORDER) *ATOMIC_VAL #endif inline int _Py_atomic_load_32bit(volatile int* value, int order) { @@ -359,15 +359,15 @@ inline int _Py_atomic_load_32bit(volatile int* value, int order) { } #define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ - if (sizeof((ATOMIC_VAL)->_value) == 8) { \ - _Py_atomic_store_64bit((volatile long long*)&((ATOMIC_VAL)->_value), NEW_VAL, ORDER) } else { \ - _Py_atomic_store_32bit((volatile long*)&((ATOMIC_VAL)->_value), NEW_VAL, ORDER) } + if (sizeof(*ATOMIC_VAL._value) == 8) { \ + _Py_atomic_store_64bit((volatile long long*)ATOMIC_VAL._value, NEW_VAL, ORDER) } else { \ + _Py_atomic_store_32bit((volatile long*)ATOMIC_VAL._value, NEW_VAL, ORDER) } #define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ ( \ - sizeof((ATOMIC_VAL)->_value) == 8 ? \ - _Py_atomic_load_64bit((volatile long long*)&((ATOMIC_VAL)->_value), ORDER) : \ - _Py_atomic_load_32bit((volatile long*)&((ATOMIC_VAL)->_value), ORDER) \ + sizeof(*(ATOMIC_VAL._value)) == 8 ? \ + _Py_atomic_load_64bit((volatile long long*)ATOMIC_VAL._value, ORDER) : \ + _Py_atomic_load_32bit((volatile long*)ATOMIC_VAL._value, ORDER) \ ) #elif defined(_M_ARM) || defined(_M_ARM64) typedef enum _Py_memory_order { @@ -391,13 +391,13 @@ typedef struct _Py_atomic_int { #define _Py_atomic_store_64bit(ATOMIC_VAL, NEW_VAL, ORDER) \ switch (ORDER) { \ case _Py_memory_order_acquire: \ - _InterlockedExchange64_acq((__int64 volatile*)&((ATOMIC_VAL)->_value), (__int64)NEW_VAL); \ + _InterlockedExchange64_acq((__int64 volatile*)ATOMIC_VAL, (__int64)NEW_VAL); \ break; \ case _Py_memory_order_release: \ - _InterlockedExchange64_rel((__int64 volatile*)&((ATOMIC_VAL)->_value), (__int64)NEW_VAL); \ + _InterlockedExchange64_rel((__int64 volatile*)ATOMIC_VAL, (__int64)NEW_VAL); \ break; \ default: \ - _InterlockedExchange64((__int64 volatile*)&((ATOMIC_VAL)->_value), (__int64)NEW_VAL); \ + _InterlockedExchange64((__int64 volatile*)ATOMIC_VAL, (__int64)NEW_VAL); \ break; \ } #else @@ -407,13 +407,13 @@ typedef struct _Py_atomic_int { #define _Py_atomic_store_32bit(ATOMIC_VAL, NEW_VAL, ORDER) \ switch (ORDER) { \ case _Py_memory_order_acquire: \ - _InterlockedExchange_acq((volatile long*)&((ATOMIC_VAL)->_value), (int)NEW_VAL); \ + _InterlockedExchange_acq((volatile long*)ATOMIC_VAL, (int)NEW_VAL); \ break; \ case _Py_memory_order_release: \ - _InterlockedExchange_rel((volatile long*)&((ATOMIC_VAL)->_value), (int)NEW_VAL); \ + _InterlockedExchange_rel((volatile long*)ATOMIC_VAL, (int)NEW_VAL); \ break; \ default: \ - _InterlockedExchange((volatile long*)&((ATOMIC_VAL)->_value), (int)NEW_VAL); \ + _InterlockedExchange((volatile long*)ATOMIC_VAL, (int)NEW_VAL); \ break; \ } @@ -454,7 +454,7 @@ inline intptr_t _Py_atomic_load_64bit(volatile uintptr_t* value, int order) { } #else -#define _Py_atomic_load_64bit(ATOMIC_VAL, ORDER) *(ATOMIC_VAL) +#define _Py_atomic_load_64bit(ATOMIC_VAL, ORDER) *ATOMIC_VAL #endif inline int _Py_atomic_load_32bit(volatile int* value, int order) { @@ -489,15 +489,15 @@ inline int _Py_atomic_load_32bit(volatile int* value, int order) { } #define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ - if (sizeof((ATOMIC_VAL)->_value) == 8) { \ - _Py_atomic_store_64bit(&((ATOMIC_VAL)->_value), NEW_VAL, ORDER) } else { \ - _Py_atomic_store_32bit(&((ATOMIC_VAL)->_value), NEW_VAL, ORDER) } + if (sizeof(*ATOMIC_VAL._value) == 8) { \ + _Py_atomic_store_64bit(ATOMIC_VAL._value, NEW_VAL, ORDER) } else { \ + _Py_atomic_store_32bit(ATOMIC_VAL._value, NEW_VAL, ORDER) } #define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ ( \ - sizeof((ATOMIC_VAL)->_value) == 8 ? \ - _Py_atomic_load_64bit(&((ATOMIC_VAL)->_value), ORDER) : \ - _Py_atomic_load_32bit(&((ATOMIC_VAL)->_value), ORDER) \ + sizeof(*(ATOMIC_VAL._value)) == 8 ? \ + _Py_atomic_load_64bit(ATOMIC_VAL._value, ORDER) : \ + _Py_atomic_load_32bit(ATOMIC_VAL._value, ORDER) \ ) #endif #else /* !gcc x86 !_msc_ver */ diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index 5a80f6fee06e..b9f2d7d17585 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -11,12 +11,8 @@ extern "C" { #include "pycore_atomic.h" #include "pythread.h" -struct _is; // See PyInterpreterState in cpython/pystate.h. - -PyAPI_FUNC(int) _Py_AddPendingCall(struct _is*, unsigned long, int (*)(void *), void *); -PyAPI_FUNC(int) _Py_MakePendingCalls(struct _is*); - struct _pending_calls { + unsigned long main_thread; PyThread_type_lock lock; /* Request for running pending calls. */ _Py_atomic_int calls_to_do; @@ -26,7 +22,6 @@ struct _pending_calls { int async_exc; #define NPENDINGCALLS 32 struct { - unsigned long thread_id; int (*func)(void *); void *arg; } calls[NPENDINGCALLS]; @@ -34,13 +29,6 @@ struct _pending_calls { int last; }; -struct _ceval_interpreter_state { - /* This single variable consolidates all requests to break out of - the fast path in the eval loop. */ - _Py_atomic_int eval_breaker; - struct _pending_calls pending; -}; - #include "pycore_gil.h" struct _ceval_runtime_state { @@ -51,8 +39,12 @@ struct _ceval_runtime_state { c_tracefunc. This speeds up the if statement in PyEval_EvalFrameEx() after fast_next_opcode. */ int tracing_possible; + /* This single variable consolidates all requests to break out of + the fast path in the eval loop. */ + _Py_atomic_int eval_breaker; /* Request for dropping the GIL */ _Py_atomic_int gil_drop_request; + struct _pending_calls pending; /* Request for checking signals. */ _Py_atomic_int signals_pending; struct _gil_runtime_state gil; diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 7e78297da69a..7796223b59e6 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -11,7 +11,6 @@ extern "C" { #include "pystate.h" #include "pythread.h" -#include "pycore_atomic.h" #include "pycore_ceval.h" #include "pycore_pathconfig.h" #include "pycore_pymem.h" @@ -30,11 +29,8 @@ struct _is { int64_t id; int64_t id_refcount; - int requires_idref; PyThread_type_lock id_mutex; - int finalizing; - PyObject *modules; PyObject *modules_by_index; PyObject *sysdict; @@ -82,8 +78,6 @@ struct _is { PyObject *pyexitmodule; uint64_t tstate_next_unique_id; - - struct _ceval_interpreter_state ceval; }; PyAPI_FUNC(struct _is*) _PyInterpreterState_LookUpID(PY_INT64_T); @@ -93,12 +87,66 @@ PyAPI_FUNC(void) _PyInterpreterState_IDIncref(struct _is *); PyAPI_FUNC(void) _PyInterpreterState_IDDecref(struct _is *); +/* cross-interpreter data */ + +struct _xid; + +// _PyCrossInterpreterData is similar to Py_buffer as an effectively +// opaque struct that holds data outside the object machinery. This +// is necessary to pass safely between interpreters in the same process. +typedef struct _xid { + // data is the cross-interpreter-safe derivation of a Python object + // (see _PyObject_GetCrossInterpreterData). It will be NULL if the + // new_object func (below) encodes the data. + void *data; + // obj is the Python object from which the data was derived. This + // is non-NULL only if the data remains bound to the object in some + // way, such that the object must be "released" (via a decref) when + // the data is released. In that case the code that sets the field, + // likely a registered "crossinterpdatafunc", is responsible for + // ensuring it owns the reference (i.e. incref). + PyObject *obj; + // interp is the ID of the owning interpreter of the original + // object. It corresponds to the active interpreter when + // _PyObject_GetCrossInterpreterData() was called. This should only + // be set by the cross-interpreter machinery. + // + // We use the ID rather than the PyInterpreterState to avoid issues + // with deleted interpreters. + int64_t interp; + // new_object is a function that returns a new object in the current + // interpreter given the data. The resulting object (a new + // reference) will be equivalent to the original object. This field + // is required. + PyObject *(*new_object)(struct _xid *); + // free is called when the data is released. If it is NULL then + // nothing will be done to free the data. For some types this is + // okay (e.g. bytes) and for those types this field should be set + // to NULL. However, for most the data was allocated just for + // cross-interpreter use, so it must be freed when + // _PyCrossInterpreterData_Release is called or the memory will + // leak. In that case, at the very least this field should be set + // to PyMem_RawFree (the default if not explicitly set to NULL). + // The call will happen with the original interpreter activated. + void (*free)(void *); +} _PyCrossInterpreterData; + +typedef int (*crossinterpdatafunc)(PyObject *, _PyCrossInterpreterData *); +PyAPI_FUNC(int) _PyObject_CheckCrossInterpreterData(PyObject *); + +PyAPI_FUNC(int) _PyObject_GetCrossInterpreterData(PyObject *, _PyCrossInterpreterData *); +PyAPI_FUNC(PyObject *) _PyCrossInterpreterData_NewObject(_PyCrossInterpreterData *); +PyAPI_FUNC(void) _PyCrossInterpreterData_Release(_PyCrossInterpreterData *); + /* cross-interpreter data registry */ /* For now we use a global registry of shareable classes. An alternative would be to add a tp_* slot for a class's crossinterpdatafunc. It would be simpler and more efficient. */ +PyAPI_FUNC(int) _PyCrossInterpreterData_Register_Class(PyTypeObject *, crossinterpdatafunc); +PyAPI_FUNC(crossinterpdatafunc) _PyCrossInterpreterData_Lookup(PyObject *); + struct _xidregitem; struct _xidregitem { @@ -159,8 +207,6 @@ typedef struct pyruntimestate { struct _xidregitem *head; } xidregistry; - unsigned long main_thread; - #define NEXITFUNCS 32 void (*exitfuncs[NEXITFUNCS])(void); int nexitfuncs; diff --git a/Include/interpreteridobject.h b/Include/interpreteridobject.h deleted file mode 100644 index e744fcdc9ff1..000000000000 --- a/Include/interpreteridobject.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef Py_INTERPRETERIDOBJECT_H -#define Py_INTERPRETERIDOBJECT_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef Py_LIMITED_API -# define Py_CPYTHON_INTERPRETERIDOBJECT_H -# include "cpython/interpreteridobject.h" -# undef Py_CPYTHON_INTERPRETERIDOBJECT_H -#endif - -#ifdef __cplusplus -} -#endif -#endif /* !Py_INTERPRETERIDOBJECT_H */ diff --git a/Makefile.pre.in b/Makefile.pre.in index 8042e8e81a05..135c3230292b 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -391,7 +391,6 @@ OBJECT_OBJS= \ Objects/floatobject.o \ Objects/frameobject.o \ Objects/funcobject.o \ - Objects/interpreteridobject.o \ Objects/iterobject.o \ Objects/listobject.o \ Objects/longobject.o \ @@ -978,7 +977,6 @@ PYTHON_HEADERS= \ $(srcdir)/Include/funcobject.h \ $(srcdir)/Include/genobject.h \ $(srcdir)/Include/import.h \ - $(srcdir)/Include/interpreteridobject.h \ $(srcdir)/Include/intrcheck.h \ $(srcdir)/Include/iterobject.h \ $(srcdir)/Include/listobject.h \ @@ -1041,7 +1039,6 @@ PYTHON_HEADERS= \ $(srcdir)/Include/cpython/abstract.h \ $(srcdir)/Include/cpython/coreconfig.h \ $(srcdir)/Include/cpython/dictobject.h \ - $(srcdir)/Include/cpython/interpreteridobject.h \ $(srcdir)/Include/cpython/object.h \ $(srcdir)/Include/cpython/objimpl.h \ $(srcdir)/Include/cpython/pyerrors.h \ diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 5b0da783e5e2..350ef771630e 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -2445,7 +2445,6 @@ pending_threadfunc(PyObject *self, PyObject *arg) Py_INCREF(callable); Py_BEGIN_ALLOW_THREADS - /* XXX Use the internal _Py_AddPendingCall(). */ r = Py_AddPendingCall(&_pending_callback, callable); Py_END_ALLOW_THREADS diff --git a/Modules/_xxsubinterpretersmodule.c b/Modules/_xxsubinterpretersmodule.c index 1cf43b7ac76e..79c9def72629 100644 --- a/Modules/_xxsubinterpretersmodule.c +++ b/Modules/_xxsubinterpretersmodule.c @@ -4,7 +4,7 @@ #include "Python.h" #include "frameobject.h" -#include "interpreteridobject.h" +#include "pycore_pystate.h" static char * @@ -31,6 +31,38 @@ _get_current(void) return _PyInterpreterState_Get(); } +static int64_t +_coerce_id(PyObject *orig) +{ + PyObject *pyid = PyNumber_Long(orig); + if (pyid == NULL) { + if (PyErr_ExceptionMatches(PyExc_TypeError)) { + PyErr_Format(PyExc_TypeError, + "'id' must be a non-negative int, got %R", orig); + } + else { + PyErr_Format(PyExc_ValueError, + "'id' must be a non-negative int, got %R", orig); + } + return -1; + } + int64_t id = PyLong_AsLongLong(pyid); + Py_DECREF(pyid); + if (id == -1 && PyErr_Occurred() != NULL) { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) { + PyErr_Format(PyExc_ValueError, + "'id' must be a non-negative int, got %R", orig); + } + return -1; + } + if (id < 0) { + PyErr_Format(PyExc_ValueError, + "'id' must be a non-negative int, got %R", orig); + return -1; + } + return id; +} + /* data-sharing-specific code ***********************************************/ @@ -39,8 +71,6 @@ struct _sharednsitem { _PyCrossInterpreterData data; }; -static void _sharednsitem_clear(struct _sharednsitem *); // forward - static int _sharednsitem_init(struct _sharednsitem *item, PyObject *key, PyObject *value) { @@ -49,7 +79,6 @@ _sharednsitem_init(struct _sharednsitem *item, PyObject *key, PyObject *value) return -1; } if (_PyObject_GetCrossInterpreterData(value, &item->data) != 0) { - _sharednsitem_clear(item); return -1; } return 0; @@ -60,7 +89,6 @@ _sharednsitem_clear(struct _sharednsitem *item) { if (item->name != NULL) { PyMem_Free(item->name); - item->name = NULL; } _PyCrossInterpreterData_Release(&item->data); } @@ -1311,13 +1339,13 @@ _channel_send(_channels *channels, int64_t id, PyObject *obj) return -1; } if (_PyObject_GetCrossInterpreterData(obj, data) != 0) { - PyThread_release_lock(mutex); PyMem_Free(data); + PyThread_release_lock(mutex); return -1; } // Add the data to the channel. - int res = _channel_add(chan, PyInterpreterState_GetID(interp), data); + int res = _channel_add(chan, interp->id, data); PyThread_release_lock(mutex); if (res != 0) { _PyCrossInterpreterData_Release(data); @@ -1345,7 +1373,7 @@ _channel_recv(_channels *channels, int64_t id) // Past this point we are responsible for releasing the mutex. // Pop off the next item from the channel. - _PyCrossInterpreterData *data = _channel_next(chan, PyInterpreterState_GetID(interp)); + _PyCrossInterpreterData *data = _channel_next(chan, interp->id); PyThread_release_lock(mutex); if (data == NULL) { if (!PyErr_Occurred()) { @@ -1382,7 +1410,7 @@ _channel_drop(_channels *channels, int64_t id, int send, int recv) // Past this point we are responsible for releasing the mutex. // Close one or both of the two ends. - int res = _channel_close_interpreter(chan, PyInterpreterState_GetID(interp), send-recv); + int res = _channel_close_interpreter(chan, interp->id, send-recv); PyThread_release_lock(mutex); return res; } @@ -1453,7 +1481,7 @@ channelid_new(PyTypeObject *cls, PyObject *args, PyObject *kwds) cid = ((channelid *)id)->id; } else { - cid = _Py_CoerceID(id); + cid = _coerce_id(id); if (cid < 0) { return NULL; } @@ -1847,7 +1875,7 @@ _run_script(PyInterpreterState *interp, const char *codestr, PyObject *excval = NULL; PyObject *tb = NULL; - PyObject *main_mod = _PyInterpreterState_GetMainModule(interp); + PyObject *main_mod = PyMapping_GetItemString(interp->modules, "__main__"); if (main_mod == NULL) { goto error; } @@ -1946,6 +1974,272 @@ _run_script_in_interpreter(PyInterpreterState *interp, const char *codestr, return result; } +/* InterpreterID class */ + +static PyTypeObject InterpreterIDtype; + +typedef struct interpid { + PyObject_HEAD + int64_t id; +} interpid; + +static interpid * +newinterpid(PyTypeObject *cls, int64_t id, int force) +{ + PyInterpreterState *interp = _PyInterpreterState_LookUpID(id); + if (interp == NULL) { + if (force) { + PyErr_Clear(); + } + else { + return NULL; + } + } + + interpid *self = PyObject_New(interpid, cls); + if (self == NULL) { + return NULL; + } + self->id = id; + + if (interp != NULL) { + _PyInterpreterState_IDIncref(interp); + } + return self; +} + +static PyObject * +interpid_new(PyTypeObject *cls, PyObject *args, PyObject *kwds) +{ + static char *kwlist[] = {"id", "force", NULL}; + PyObject *idobj; + int force = 0; + if (!PyArg_ParseTupleAndKeywords(args, kwds, + "O|$p:InterpreterID.__init__", kwlist, + &idobj, &force)) { + return NULL; + } + + // Coerce and check the ID. + int64_t id; + if (PyObject_TypeCheck(idobj, &InterpreterIDtype)) { + id = ((interpid *)idobj)->id; + } + else { + id = _coerce_id(idobj); + if (id < 0) { + return NULL; + } + } + + return (PyObject *)newinterpid(cls, id, force); +} + +static void +interpid_dealloc(PyObject *v) +{ + int64_t id = ((interpid *)v)->id; + PyInterpreterState *interp = _PyInterpreterState_LookUpID(id); + if (interp != NULL) { + _PyInterpreterState_IDDecref(interp); + } + else { + // already deleted + PyErr_Clear(); + } + Py_TYPE(v)->tp_free(v); +} + +static PyObject * +interpid_repr(PyObject *self) +{ + PyTypeObject *type = Py_TYPE(self); + const char *name = _PyType_Name(type); + interpid *id = (interpid *)self; + return PyUnicode_FromFormat("%s(%" PRId64 ")", name, id->id); +} + +static PyObject * +interpid_str(PyObject *self) +{ + interpid *id = (interpid *)self; + return PyUnicode_FromFormat("%" PRId64 "", id->id); +} + +PyObject * +interpid_int(PyObject *self) +{ + interpid *id = (interpid *)self; + return PyLong_FromLongLong(id->id); +} + +static PyNumberMethods interpid_as_number = { + 0, /* nb_add */ + 0, /* nb_subtract */ + 0, /* nb_multiply */ + 0, /* nb_remainder */ + 0, /* nb_divmod */ + 0, /* nb_power */ + 0, /* nb_negative */ + 0, /* nb_positive */ + 0, /* nb_absolute */ + 0, /* nb_bool */ + 0, /* nb_invert */ + 0, /* nb_lshift */ + 0, /* nb_rshift */ + 0, /* nb_and */ + 0, /* nb_xor */ + 0, /* nb_or */ + (unaryfunc)interpid_int, /* nb_int */ + 0, /* nb_reserved */ + 0, /* nb_float */ + + 0, /* nb_inplace_add */ + 0, /* nb_inplace_subtract */ + 0, /* nb_inplace_multiply */ + 0, /* nb_inplace_remainder */ + 0, /* nb_inplace_power */ + 0, /* nb_inplace_lshift */ + 0, /* nb_inplace_rshift */ + 0, /* nb_inplace_and */ + 0, /* nb_inplace_xor */ + 0, /* nb_inplace_or */ + + 0, /* nb_floor_divide */ + 0, /* nb_true_divide */ + 0, /* nb_inplace_floor_divide */ + 0, /* nb_inplace_true_divide */ + + (unaryfunc)interpid_int, /* nb_index */ +}; + +static Py_hash_t +interpid_hash(PyObject *self) +{ + interpid *id = (interpid *)self; + PyObject *obj = PyLong_FromLongLong(id->id); + if (obj == NULL) { + return -1; + } + Py_hash_t hash = PyObject_Hash(obj); + Py_DECREF(obj); + return hash; +} + +static PyObject * +interpid_richcompare(PyObject *self, PyObject *other, int op) +{ + if (op != Py_EQ && op != Py_NE) { + Py_RETURN_NOTIMPLEMENTED; + } + + if (!PyObject_TypeCheck(self, &InterpreterIDtype)) { + Py_RETURN_NOTIMPLEMENTED; + } + + interpid *id = (interpid *)self; + int equal; + if (PyObject_TypeCheck(other, &InterpreterIDtype)) { + interpid *otherid = (interpid *)other; + equal = (id->id == otherid->id); + } + else { + other = PyNumber_Long(other); + if (other == NULL) { + PyErr_Clear(); + Py_RETURN_NOTIMPLEMENTED; + } + int64_t otherid = PyLong_AsLongLong(other); + Py_DECREF(other); + if (otherid == -1 && PyErr_Occurred() != NULL) { + return NULL; + } + if (otherid < 0) { + equal = 0; + } + else { + equal = (id->id == otherid); + } + } + + if ((op == Py_EQ && equal) || (op == Py_NE && !equal)) { + Py_RETURN_TRUE; + } + Py_RETURN_FALSE; +} + +PyDoc_STRVAR(interpid_doc, +"A interpreter ID identifies a interpreter and may be used as an int."); + +static PyTypeObject InterpreterIDtype = { + PyVarObject_HEAD_INIT(&PyType_Type, 0) + "interpreters.InterpreterID", /* tp_name */ + sizeof(interpid), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)interpid_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_as_async */ + (reprfunc)interpid_repr, /* tp_repr */ + &interpid_as_number, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + interpid_hash, /* tp_hash */ + 0, /* tp_call */ + (reprfunc)interpid_str, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | + Py_TPFLAGS_LONG_SUBCLASS, /* tp_flags */ + interpid_doc, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + interpid_richcompare, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + interpid_new, /* tp_new */ +}; + +static PyObject * +_get_id(PyInterpreterState *interp) +{ + PY_INT64_T id = PyInterpreterState_GetID(interp); + if (id < 0) { + return NULL; + } + return (PyObject *)newinterpid(&InterpreterIDtype, id, 0); +} + +static PyInterpreterState * +_look_up(PyObject *requested_id) +{ + int64_t id; + if (PyObject_TypeCheck(requested_id, &InterpreterIDtype)) { + id = ((interpid *)requested_id)->id; + } + else { + id = PyLong_AsLongLong(requested_id); + if (id == -1 && PyErr_Occurred() != NULL) { + return NULL; + } + assert(id <= INT64_MAX); + } + return _PyInterpreterState_LookUpID(id); +} + /* module level code ********************************************************/ @@ -1989,16 +2283,17 @@ interp_create(PyObject *self, PyObject *args) PyErr_SetString(PyExc_RuntimeError, "interpreter creation failed"); return NULL; } - PyObject *idobj = _PyInterpreterState_GetIDObject(tstate->interp); - if (idobj == NULL) { - // XXX Possible GILState issues? - save_tstate = PyThreadState_Swap(tstate); - Py_EndInterpreter(tstate); - PyThreadState_Swap(save_tstate); - return NULL; - } - _PyInterpreterState_RequireIDRef(tstate->interp, 1); - return idobj; + if (_PyInterpreterState_IDInitref(tstate->interp) != 0) { + goto error; + }; + return _get_id(tstate->interp); + +error: + // XXX Possible GILState issues? + save_tstate = PyThreadState_Swap(tstate); + Py_EndInterpreter(tstate); + PyThreadState_Swap(save_tstate); + return NULL; } PyDoc_STRVAR(create_doc, @@ -2023,7 +2318,7 @@ interp_destroy(PyObject *self, PyObject *args, PyObject *kwds) } // Look up the interpreter. - PyInterpreterState *interp = _PyInterpreterID_LookUp(id); + PyInterpreterState *interp = _look_up(id); if (interp == NULL) { return NULL; } @@ -2079,7 +2374,7 @@ interp_list_all(PyObject *self, PyObject *Py_UNUSED(ignored)) interp = PyInterpreterState_Head(); while (interp != NULL) { - id = _PyInterpreterState_GetIDObject(interp); + id = _get_id(interp); if (id == NULL) { Py_DECREF(ids); return NULL; @@ -2111,7 +2406,7 @@ interp_get_current(PyObject *self, PyObject *Py_UNUSED(ignored)) if (interp == NULL) { return NULL; } - return _PyInterpreterState_GetIDObject(interp); + return _get_id(interp); } PyDoc_STRVAR(get_current_doc, @@ -2125,7 +2420,7 @@ interp_get_main(PyObject *self, PyObject *Py_UNUSED(ignored)) { // Currently, 0 is always the main interpreter. PY_INT64_T id = 0; - return _PyInterpreterID_New(id); + return (PyObject *)newinterpid(&InterpreterIDtype, id, 0); } PyDoc_STRVAR(get_main_doc, @@ -2151,7 +2446,7 @@ interp_run_string(PyObject *self, PyObject *args, PyObject *kwds) } // Look up the interpreter. - PyInterpreterState *interp = _PyInterpreterID_LookUp(id); + PyInterpreterState *interp = _look_up(id); if (interp == NULL) { return NULL; } @@ -2221,7 +2516,7 @@ interp_is_running(PyObject *self, PyObject *args, PyObject *kwds) return NULL; } - PyInterpreterState *interp = _PyInterpreterID_LookUp(id); + PyInterpreterState *interp = _look_up(id); if (interp == NULL) { return NULL; } @@ -2273,7 +2568,7 @@ channel_destroy(PyObject *self, PyObject *args, PyObject *kwds) "O:channel_destroy", kwlist, &id)) { return NULL; } - int64_t cid = _Py_CoerceID(id); + int64_t cid = _coerce_id(id); if (cid < 0) { return NULL; } @@ -2337,7 +2632,7 @@ channel_send(PyObject *self, PyObject *args, PyObject *kwds) "OO:channel_send", kwlist, &id, &obj)) { return NULL; } - int64_t cid = _Py_CoerceID(id); + int64_t cid = _coerce_id(id); if (cid < 0) { return NULL; } @@ -2362,7 +2657,7 @@ channel_recv(PyObject *self, PyObject *args, PyObject *kwds) "O:channel_recv", kwlist, &id)) { return NULL; } - int64_t cid = _Py_CoerceID(id); + int64_t cid = _coerce_id(id); if (cid < 0) { return NULL; } @@ -2388,7 +2683,7 @@ channel_close(PyObject *self, PyObject *args, PyObject *kwds) &id, &send, &recv, &force)) { return NULL; } - int64_t cid = _Py_CoerceID(id); + int64_t cid = _coerce_id(id); if (cid < 0) { return NULL; } @@ -2440,7 +2735,7 @@ channel_release(PyObject *self, PyObject *args, PyObject *kwds) &id, &send, &recv, &force)) { return NULL; } - int64_t cid = _Py_CoerceID(id); + int64_t cid = _coerce_id(id); if (cid < 0) { return NULL; } @@ -2542,6 +2837,10 @@ PyInit__xxsubinterpreters(void) if (PyType_Ready(&ChannelIDtype) != 0) { return NULL; } + InterpreterIDtype.tp_base = &PyLong_Type; + if (PyType_Ready(&InterpreterIDtype) != 0) { + return NULL; + } /* Create the module */ PyObject *module = PyModule_Create(&interpretersmodule); @@ -2563,12 +2862,12 @@ PyInit__xxsubinterpreters(void) if (PyDict_SetItemString(ns, "ChannelID", (PyObject *)&ChannelIDtype) != 0) { return NULL; } - Py_INCREF(&_PyInterpreterID_Type); - if (PyDict_SetItemString(ns, "InterpreterID", (PyObject *)&_PyInterpreterID_Type) != 0) { + Py_INCREF(&InterpreterIDtype); + if (PyDict_SetItemString(ns, "InterpreterID", (PyObject *)&InterpreterIDtype) != 0) { return NULL; } - if (_PyCrossInterpreterData_RegisterClass(&ChannelIDtype, _channelid_shared)) { + if (_PyCrossInterpreterData_Register_Class(&ChannelIDtype, _channelid_shared)) { return NULL; } diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index ac3b6c7c5617..f29720bcaf36 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -19,7 +19,6 @@ #include #endif #endif -#include "internal/pycore_pystate.h" #ifdef HAVE_SIGNAL_H #include @@ -296,10 +295,8 @@ trip_signal(int sig_num) { /* Py_AddPendingCall() isn't signal-safe, but we still use it for this exceptional case. */ - _Py_AddPendingCall(_PyRuntime.interpreters.main, - main_thread, - report_wakeup_send_error, - (void *)(intptr_t) last_error); + Py_AddPendingCall(report_wakeup_send_error, + (void *)(intptr_t) last_error); } } } @@ -316,10 +313,8 @@ trip_signal(int sig_num) { /* Py_AddPendingCall() isn't signal-safe, but we still use it for this exceptional case. */ - _Py_AddPendingCall(_PyRuntime.interpreters.main, - main_thread, - report_wakeup_write_error, - (void *)(intptr_t)errno); + Py_AddPendingCall(report_wakeup_write_error, + (void *)(intptr_t)errno); } } } diff --git a/Objects/interpreteridobject.c b/Objects/interpreteridobject.c deleted file mode 100644 index dd142b043d0a..000000000000 --- a/Objects/interpreteridobject.c +++ /dev/null @@ -1,308 +0,0 @@ -/* InterpreterID object */ - -#include "Python.h" -#include "internal/pycore_pystate.h" -#include "interpreteridobject.h" - - -int64_t -_Py_CoerceID(PyObject *orig) -{ - PyObject *pyid = PyNumber_Long(orig); - if (pyid == NULL) { - if (PyErr_ExceptionMatches(PyExc_TypeError)) { - PyErr_Format(PyExc_TypeError, - "'id' must be a non-negative int, got %R", orig); - } - else { - PyErr_Format(PyExc_ValueError, - "'id' must be a non-negative int, got %R", orig); - } - return -1; - } - int64_t id = PyLong_AsLongLong(pyid); - Py_DECREF(pyid); - if (id == -1 && PyErr_Occurred() != NULL) { - if (!PyErr_ExceptionMatches(PyExc_OverflowError)) { - PyErr_Format(PyExc_ValueError, - "'id' must be a non-negative int, got %R", orig); - } - return -1; - } - if (id < 0) { - PyErr_Format(PyExc_ValueError, - "'id' must be a non-negative int, got %R", orig); - return -1; - } - return id; -} - -typedef struct interpid { - PyObject_HEAD - int64_t id; -} interpid; - -static interpid * -newinterpid(PyTypeObject *cls, int64_t id, int force) -{ - PyInterpreterState *interp = _PyInterpreterState_LookUpID(id); - if (interp == NULL) { - if (force) { - PyErr_Clear(); - } - else { - return NULL; - } - } - - interpid *self = PyObject_New(interpid, cls); - if (self == NULL) { - return NULL; - } - self->id = id; - - if (interp != NULL) { - _PyInterpreterState_IDIncref(interp); - } - return self; -} - -static PyObject * -interpid_new(PyTypeObject *cls, PyObject *args, PyObject *kwds) -{ - static char *kwlist[] = {"id", "force", NULL}; - PyObject *idobj; - int force = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwds, - "O|$p:InterpreterID.__init__", kwlist, - &idobj, &force)) { - return NULL; - } - - // Coerce and check the ID. - int64_t id; - if (PyObject_TypeCheck(idobj, &_PyInterpreterID_Type)) { - id = ((interpid *)idobj)->id; - } - else { - id = _Py_CoerceID(idobj); - if (id < 0) { - return NULL; - } - } - - return (PyObject *)newinterpid(cls, id, force); -} - -static void -interpid_dealloc(PyObject *v) -{ - int64_t id = ((interpid *)v)->id; - PyInterpreterState *interp = _PyInterpreterState_LookUpID(id); - if (interp != NULL) { - _PyInterpreterState_IDDecref(interp); - } - else { - // already deleted - PyErr_Clear(); - } - Py_TYPE(v)->tp_free(v); -} - -static PyObject * -interpid_repr(PyObject *self) -{ - PyTypeObject *type = Py_TYPE(self); - const char *name = _PyType_Name(type); - interpid *id = (interpid *)self; - return PyUnicode_FromFormat("%s(%" PRId64 ")", name, id->id); -} - -static PyObject * -interpid_str(PyObject *self) -{ - interpid *id = (interpid *)self; - return PyUnicode_FromFormat("%" PRId64 "", id->id); -} - -static PyObject * -interpid_int(PyObject *self) -{ - interpid *id = (interpid *)self; - return PyLong_FromLongLong(id->id); -} - -static PyNumberMethods interpid_as_number = { - 0, /* nb_add */ - 0, /* nb_subtract */ - 0, /* nb_multiply */ - 0, /* nb_remainder */ - 0, /* nb_divmod */ - 0, /* nb_power */ - 0, /* nb_negative */ - 0, /* nb_positive */ - 0, /* nb_absolute */ - 0, /* nb_bool */ - 0, /* nb_invert */ - 0, /* nb_lshift */ - 0, /* nb_rshift */ - 0, /* nb_and */ - 0, /* nb_xor */ - 0, /* nb_or */ - (unaryfunc)interpid_int, /* nb_int */ - 0, /* nb_reserved */ - 0, /* nb_float */ - - 0, /* nb_inplace_add */ - 0, /* nb_inplace_subtract */ - 0, /* nb_inplace_multiply */ - 0, /* nb_inplace_remainder */ - 0, /* nb_inplace_power */ - 0, /* nb_inplace_lshift */ - 0, /* nb_inplace_rshift */ - 0, /* nb_inplace_and */ - 0, /* nb_inplace_xor */ - 0, /* nb_inplace_or */ - - 0, /* nb_floor_divide */ - 0, /* nb_true_divide */ - 0, /* nb_inplace_floor_divide */ - 0, /* nb_inplace_true_divide */ - - (unaryfunc)interpid_int, /* nb_index */ -}; - -static Py_hash_t -interpid_hash(PyObject *self) -{ - interpid *id = (interpid *)self; - PyObject *obj = PyLong_FromLongLong(id->id); - if (obj == NULL) { - return -1; - } - Py_hash_t hash = PyObject_Hash(obj); - Py_DECREF(obj); - return hash; -} - -static PyObject * -interpid_richcompare(PyObject *self, PyObject *other, int op) -{ - if (op != Py_EQ && op != Py_NE) { - Py_RETURN_NOTIMPLEMENTED; - } - - if (!PyObject_TypeCheck(self, &_PyInterpreterID_Type)) { - Py_RETURN_NOTIMPLEMENTED; - } - - interpid *id = (interpid *)self; - int equal; - if (PyObject_TypeCheck(other, &_PyInterpreterID_Type)) { - interpid *otherid = (interpid *)other; - equal = (id->id == otherid->id); - } - else { - other = PyNumber_Long(other); - if (other == NULL) { - PyErr_Clear(); - Py_RETURN_NOTIMPLEMENTED; - } - int64_t otherid = PyLong_AsLongLong(other); - Py_DECREF(other); - if (otherid == -1 && PyErr_Occurred() != NULL) { - return NULL; - } - if (otherid < 0) { - equal = 0; - } - else { - equal = (id->id == otherid); - } - } - - if ((op == Py_EQ && equal) || (op == Py_NE && !equal)) { - Py_RETURN_TRUE; - } - Py_RETURN_FALSE; -} - -PyDoc_STRVAR(interpid_doc, -"A interpreter ID identifies a interpreter and may be used as an int."); - -PyTypeObject _PyInterpreterID_Type = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) - "InterpreterID", /* tp_name */ - sizeof(interpid), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)interpid_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - (reprfunc)interpid_repr, /* tp_repr */ - &interpid_as_number, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - interpid_hash, /* tp_hash */ - 0, /* tp_call */ - (reprfunc)interpid_str, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | - Py_TPFLAGS_LONG_SUBCLASS, /* tp_flags */ - interpid_doc, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - interpid_richcompare, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - &PyLong_Type, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - interpid_new, /* tp_new */ -}; - -PyObject *_PyInterpreterID_New(int64_t id) -{ - return (PyObject *)newinterpid(&_PyInterpreterID_Type, id, 0); -} - -PyObject * -_PyInterpreterState_GetIDObject(PyInterpreterState *interp) -{ - if (_PyInterpreterState_IDInitref(interp) != 0) { - return NULL; - }; - PY_INT64_T id = PyInterpreterState_GetID(interp); - if (id < 0) { - return NULL; - } - return (PyObject *)newinterpid(&_PyInterpreterID_Type, id, 0); -} - -PyInterpreterState * -_PyInterpreterID_LookUp(PyObject *requested_id) -{ - int64_t id; - if (PyObject_TypeCheck(requested_id, &_PyInterpreterID_Type)) { - id = ((interpid *)requested_id)->id; - } - else { - id = PyLong_AsLongLong(requested_id); - if (id == -1 && PyErr_Occurred() != NULL) { - return NULL; - } - assert(id <= INT64_MAX); - } - return _PyInterpreterState_LookUpID(id); -} diff --git a/Objects/object.c b/Objects/object.c index b446d598130a..cf5264b5d80b 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -5,7 +5,6 @@ #include "pycore_pystate.h" #include "pycore_context.h" #include "frameobject.h" -#include "interpreteridobject.h" #ifdef __cplusplus extern "C" { @@ -1807,7 +1806,6 @@ _PyTypes_Init(void) INIT_TYPE(&PySeqIter_Type, "sequence iterator"); INIT_TYPE(&PyCoro_Type, "coroutine"); INIT_TYPE(&_PyCoroWrapper_Type, "coroutine wrapper"); - INIT_TYPE(&_PyInterpreterID_Type, "interpreter ID"); return _Py_INIT_OK(); #undef INIT_TYPE diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index c9ff2f88d8e0..bff7b95a84ae 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -154,7 +154,6 @@ - @@ -351,7 +350,6 @@ - diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 5dfa193f048a..03030744b155 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -483,9 +483,6 @@ Include - - Include - Modules @@ -1046,9 +1043,6 @@ Objects - - Objects - Modules diff --git a/Python/ceval.c b/Python/ceval.c index be75ade909d7..b311248c6a20 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -96,61 +96,61 @@ static long dxp[256]; /* This can set eval_breaker to 0 even though gil_drop_request became 1. We believe this is all right because the eval loop will release the GIL eventually anyway. */ -#define COMPUTE_EVAL_BREAKER(interp) \ +#define COMPUTE_EVAL_BREAKER() \ _Py_atomic_store_relaxed( \ - &interp->ceval.eval_breaker, \ + &_PyRuntime.ceval.eval_breaker, \ GIL_REQUEST | \ _Py_atomic_load_relaxed(&_PyRuntime.ceval.signals_pending) | \ - _Py_atomic_load_relaxed(&interp->ceval.pending.calls_to_do) | \ - interp->ceval.pending.async_exc) + _Py_atomic_load_relaxed(&_PyRuntime.ceval.pending.calls_to_do) | \ + _PyRuntime.ceval.pending.async_exc) -#define SET_GIL_DROP_REQUEST(interp) \ +#define SET_GIL_DROP_REQUEST() \ do { \ _Py_atomic_store_relaxed(&_PyRuntime.ceval.gil_drop_request, 1); \ - _Py_atomic_store_relaxed(&interp->ceval.eval_breaker, 1); \ + _Py_atomic_store_relaxed(&_PyRuntime.ceval.eval_breaker, 1); \ } while (0) -#define RESET_GIL_DROP_REQUEST(interp) \ +#define RESET_GIL_DROP_REQUEST() \ do { \ _Py_atomic_store_relaxed(&_PyRuntime.ceval.gil_drop_request, 0); \ - COMPUTE_EVAL_BREAKER(interp); \ + COMPUTE_EVAL_BREAKER(); \ } while (0) /* Pending calls are only modified under pending_lock */ -#define SIGNAL_PENDING_CALLS(interp) \ +#define SIGNAL_PENDING_CALLS() \ do { \ - _Py_atomic_store_relaxed(&interp->ceval.pending.calls_to_do, 1); \ - _Py_atomic_store_relaxed(&interp->ceval.eval_breaker, 1); \ + _Py_atomic_store_relaxed(&_PyRuntime.ceval.pending.calls_to_do, 1); \ + _Py_atomic_store_relaxed(&_PyRuntime.ceval.eval_breaker, 1); \ } while (0) -#define UNSIGNAL_PENDING_CALLS(interp) \ +#define UNSIGNAL_PENDING_CALLS() \ do { \ - _Py_atomic_store_relaxed(&interp->ceval.pending.calls_to_do, 0); \ - COMPUTE_EVAL_BREAKER(interp); \ + _Py_atomic_store_relaxed(&_PyRuntime.ceval.pending.calls_to_do, 0); \ + COMPUTE_EVAL_BREAKER(); \ } while (0) #define SIGNAL_PENDING_SIGNALS() \ do { \ _Py_atomic_store_relaxed(&_PyRuntime.ceval.signals_pending, 1); \ - _Py_atomic_store_relaxed(&_PyRuntime.interpreters.main->ceval.eval_breaker, 1); \ + _Py_atomic_store_relaxed(&_PyRuntime.ceval.eval_breaker, 1); \ } while (0) #define UNSIGNAL_PENDING_SIGNALS() \ do { \ _Py_atomic_store_relaxed(&_PyRuntime.ceval.signals_pending, 0); \ - COMPUTE_EVAL_BREAKER(_PyRuntime.interpreters.main); \ + COMPUTE_EVAL_BREAKER(); \ } while (0) -#define SIGNAL_ASYNC_EXC(interp) \ +#define SIGNAL_ASYNC_EXC() \ do { \ - interp->ceval.pending.async_exc = 1; \ - _Py_atomic_store_relaxed(&interp->ceval.eval_breaker, 1); \ + _PyRuntime.ceval.pending.async_exc = 1; \ + _Py_atomic_store_relaxed(&_PyRuntime.ceval.eval_breaker, 1); \ } while (0) -#define UNSIGNAL_ASYNC_EXC(interp) \ +#define UNSIGNAL_ASYNC_EXC() \ do { \ - interp->ceval.pending.async_exc = 0; \ - COMPUTE_EVAL_BREAKER(interp); \ + _PyRuntime.ceval.pending.async_exc = 0; \ + COMPUTE_EVAL_BREAKER(); \ } while (0) @@ -174,6 +174,9 @@ PyEval_InitThreads(void) PyThread_init_thread(); create_gil(); take_gil(_PyThreadState_GET()); + _PyRuntime.ceval.pending.main_thread = PyThread_get_thread_ident(); + if (!_PyRuntime.ceval.pending.lock) + _PyRuntime.ceval.pending.lock = PyThread_allocate_lock(); } void @@ -240,11 +243,9 @@ PyEval_ReInitThreads(void) if (!gil_created()) return; recreate_gil(); - // This will be reset in make_pending_calls() below. - current_tstate->interp->ceval.pending.lock = NULL; - + _PyRuntime.ceval.pending.lock = PyThread_allocate_lock(); take_gil(current_tstate); - _PyRuntime.main_thread = PyThread_get_thread_ident(); + _PyRuntime.ceval.pending.main_thread = PyThread_get_thread_ident(); /* Destroy all threads except the current one */ _PyThreadState_DeleteExcept(current_tstate); @@ -254,9 +255,9 @@ PyEval_ReInitThreads(void) raised. */ void -_PyEval_SignalAsyncExc(PyInterpreterState *interp) +_PyEval_SignalAsyncExc(void) { - SIGNAL_ASYNC_EXC(interp); + SIGNAL_ASYNC_EXC(); } PyThreadState * @@ -322,58 +323,17 @@ _PyEval_SignalReceived(void) SIGNAL_PENDING_SIGNALS(); } -static int -_add_pending_call(PyInterpreterState *interp, unsigned long thread_id, int (*func)(void *), void *arg) -{ - int i = interp->ceval.pending.last; - int j = (i + 1) % NPENDINGCALLS; - if (j == interp->ceval.pending.first) { - return -1; /* Queue full */ - } - interp->ceval.pending.calls[i].thread_id = thread_id; - interp->ceval.pending.calls[i].func = func; - interp->ceval.pending.calls[i].arg = arg; - interp->ceval.pending.last = j; - return 0; -} - -/* pop one item off the queue while holding the lock */ -static void -_pop_pending_call(PyInterpreterState *interp, int (**func)(void *), void **arg) -{ - int i = interp->ceval.pending.first; - if (i == interp->ceval.pending.last) { - return; /* Queue empty */ - } - - *func = interp->ceval.pending.calls[i].func; - *arg = interp->ceval.pending.calls[i].arg; - interp->ceval.pending.first = (i + 1) % NPENDINGCALLS; - - unsigned long thread_id = interp->ceval.pending.calls[i].thread_id; - if (thread_id && PyThread_get_thread_ident() != thread_id) { - // Thread mismatch, so move it to the end of the list - // and start over. - _Py_AddPendingCall(interp, thread_id, *func, *arg); - return; - } -} - -int -Py_AddPendingCall(int (*func)(void *), void *arg) -{ - PyInterpreterState *interp = _PyRuntime.interpreters.main; - return _Py_AddPendingCall(interp, _PyRuntime.main_thread, func, arg); -} - /* This implementation is thread-safe. It allows scheduling to be made from any thread, and even from an executing callback. */ int -_Py_AddPendingCall(PyInterpreterState *interp, unsigned long thread_id, int (*func)(void *), void *arg) +Py_AddPendingCall(int (*func)(void *), void *arg) { + int i, j, result=0; + PyThread_type_lock lock = _PyRuntime.ceval.pending.lock; + /* try a few times for the lock. Since this mechanism is used * for signal handling (on the main thread), there is a (slim) * chance that a signal is delivered on the same thread while we @@ -385,9 +345,7 @@ _Py_AddPendingCall(PyInterpreterState *interp, unsigned long thread_id, int (*fu * We also check for lock being NULL, in the unlikely case that * this function is called before any bytecode evaluation takes place. */ - PyThread_type_lock lock = interp->ceval.pending.lock; if (lock != NULL) { - int i; for (i = 0; i<100; i++) { if (PyThread_acquire_lock(lock, NOWAIT_LOCK)) break; @@ -396,21 +354,17 @@ _Py_AddPendingCall(PyInterpreterState *interp, unsigned long thread_id, int (*fu return -1; } - int result = -1; - if (interp->finalizing) { - PyObject *exc, *val, *tb; - PyErr_Fetch(&exc, &val, &tb); - PyErr_SetString(PyExc_SystemError, "Py_AddPendingCall: cannot add pending calls (interpreter shutting down)"); - PyErr_Print(); - PyErr_Restore(exc, val, tb); - goto done; + i = _PyRuntime.ceval.pending.last; + j = (i + 1) % NPENDINGCALLS; + if (j == _PyRuntime.ceval.pending.first) { + result = -1; /* Queue full */ + } else { + _PyRuntime.ceval.pending.calls[i].func = func; + _PyRuntime.ceval.pending.calls[i].arg = arg; + _PyRuntime.ceval.pending.last = j; } - - result = _add_pending_call(interp, thread_id, func, arg); /* signal main loop */ - SIGNAL_PENDING_CALLS(interp); - -done: + SIGNAL_PENDING_CALLS(); if (lock != NULL) PyThread_release_lock(lock); return result; @@ -420,7 +374,9 @@ static int handle_signals(void) { /* Only handle signals on main thread. */ - if (PyThread_get_thread_ident() != _PyRuntime.main_thread) { + if (_PyRuntime.ceval.pending.main_thread && + PyThread_get_thread_ident() != _PyRuntime.ceval.pending.main_thread) + { return 0; } /* @@ -440,10 +396,17 @@ handle_signals(void) } static int -make_pending_calls(PyInterpreterState *interp) +make_pending_calls(void) { static int busy = 0; + /* only service pending calls on main thread */ + if (_PyRuntime.ceval.pending.main_thread && + PyThread_get_thread_ident() != _PyRuntime.ceval.pending.main_thread) + { + return 0; + } + /* don't perform recursive pending calls */ if (busy) { return 0; @@ -451,13 +414,13 @@ make_pending_calls(PyInterpreterState *interp) busy = 1; /* unsignal before starting to call callbacks, so that any callback added in-between re-signals */ - UNSIGNAL_PENDING_CALLS(interp); + UNSIGNAL_PENDING_CALLS(); int res = 0; - if (!interp->ceval.pending.lock) { + if (!_PyRuntime.ceval.pending.lock) { /* initial allocation of the lock */ - interp->ceval.pending.lock = PyThread_allocate_lock(); - if (interp->ceval.pending.lock == NULL) { + _PyRuntime.ceval.pending.lock = PyThread_allocate_lock(); + if (_PyRuntime.ceval.pending.lock == NULL) { res = -1; goto error; } @@ -465,18 +428,24 @@ make_pending_calls(PyInterpreterState *interp) /* perform a bounded number of calls, in case of recursion */ for (int i=0; iceval.pending.lock, WAIT_LOCK); - _pop_pending_call(interp, &func, &arg); - PyThread_release_lock(interp->ceval.pending.lock); - + PyThread_acquire_lock(_PyRuntime.ceval.pending.lock, WAIT_LOCK); + j = _PyRuntime.ceval.pending.first; + if (j == _PyRuntime.ceval.pending.last) { + func = NULL; /* Queue empty */ + } else { + func = _PyRuntime.ceval.pending.calls[j].func; + arg = _PyRuntime.ceval.pending.calls[j].arg; + _PyRuntime.ceval.pending.first = (j + 1) % NPENDINGCALLS; + } + PyThread_release_lock(_PyRuntime.ceval.pending.lock); /* having released the lock, perform the callback */ - if (func == NULL) { + if (func == NULL) break; - } res = func(arg); if (res) { goto error; @@ -488,18 +457,10 @@ make_pending_calls(PyInterpreterState *interp) error: busy = 0; - SIGNAL_PENDING_CALLS(interp); /* We're not done yet */ + SIGNAL_PENDING_CALLS(); return res; } -int -_Py_MakePendingCalls(PyInterpreterState *interp) -{ - assert(PyGILState_Check()); - - return make_pending_calls(interp); -} - /* Py_MakePendingCalls() is a simple wrapper for the sake of backward-compatibility. */ int @@ -514,8 +475,12 @@ Py_MakePendingCalls(void) return res; } - PyInterpreterState *interp = _PyRuntime.interpreters.main; - return make_pending_calls(interp); + res = make_pending_calls(); + if (res != 0) { + return res; + } + + return 0; } /* The interpreter's recursion limit */ @@ -637,7 +602,6 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) PyObject **fastlocals, **freevars; PyObject *retval = NULL; /* Return value */ PyThreadState *tstate = _PyThreadState_GET(); - _Py_atomic_int *eval_breaker = &tstate->interp->ceval.eval_breaker; PyCodeObject *co; /* when tracing we set things up so that @@ -723,7 +687,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) #define DISPATCH() \ { \ - if (!_Py_atomic_load_relaxed(eval_breaker)) { \ + if (!_Py_atomic_load_relaxed(&_PyRuntime.ceval.eval_breaker)) { \ FAST_DISPATCH(); \ } \ continue; \ @@ -1025,7 +989,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) async I/O handler); see Py_AddPendingCall() and Py_MakePendingCalls() above. */ - if (_Py_atomic_load_relaxed(eval_breaker)) { + if (_Py_atomic_load_relaxed(&_PyRuntime.ceval.eval_breaker)) { opcode = _Py_OPCODE(*next_instr); if (opcode == SETUP_FINALLY || opcode == SETUP_WITH || @@ -1058,9 +1022,9 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) } } if (_Py_atomic_load_relaxed( - &(tstate->interp->ceval.pending.calls_to_do))) + &_PyRuntime.ceval.pending.calls_to_do)) { - if (_Py_MakePendingCalls(tstate->interp) != 0) { + if (make_pending_calls() != 0) { goto error; } } @@ -1092,7 +1056,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) if (tstate->async_exc != NULL) { PyObject *exc = tstate->async_exc; tstate->async_exc = NULL; - UNSIGNAL_ASYNC_EXC(tstate->interp); + UNSIGNAL_ASYNC_EXC(); PyErr_SetNone(exc); Py_DECREF(exc); goto error; diff --git a/Python/ceval_gil.h b/Python/ceval_gil.h index d9ad3616fa24..f2d5fdba0153 100644 --- a/Python/ceval_gil.h +++ b/Python/ceval_gil.h @@ -176,7 +176,7 @@ static void drop_gil(PyThreadState *tstate) &_PyRuntime.ceval.gil.last_holder) ) == tstate) { - RESET_GIL_DROP_REQUEST(tstate->interp); + RESET_GIL_DROP_REQUEST(); /* NOTE: if COND_WAIT does not atomically start waiting when releasing the mutex, another thread can run through, take the GIL and drop it again, and reset the condition @@ -213,7 +213,7 @@ static void take_gil(PyThreadState *tstate) if (timed_out && _Py_atomic_load_relaxed(&_PyRuntime.ceval.gil.locked) && _PyRuntime.ceval.gil.switch_number == saved_switchnum) { - SET_GIL_DROP_REQUEST(tstate->interp); + SET_GIL_DROP_REQUEST(); } } _ready: @@ -239,10 +239,10 @@ static void take_gil(PyThreadState *tstate) MUTEX_UNLOCK(_PyRuntime.ceval.gil.switch_mutex); #endif if (_Py_atomic_load_relaxed(&_PyRuntime.ceval.gil_drop_request)) { - RESET_GIL_DROP_REQUEST(tstate->interp); + RESET_GIL_DROP_REQUEST(); } if (tstate->async_exc != NULL) { - _PyEval_SignalAsyncExc(tstate->interp); + _PyEval_SignalAsyncExc(); } MUTEX_UNLOCK(_PyRuntime.ceval.gil.mutex); diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 088e7aa9313d..a5cfc07c488e 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1460,32 +1460,8 @@ Py_EndInterpreter(PyThreadState *tstate) if (tstate->frame != NULL) Py_FatalError("Py_EndInterpreter: thread still has a frame"); - // Mark as finalizing. - if (interp->ceval.pending.lock != NULL) { - PyThread_acquire_lock(interp->ceval.pending.lock, 1); - } - interp->finalizing = 1; - if (interp->ceval.pending.lock != NULL) { - PyThread_release_lock(interp->ceval.pending.lock); - } - - // Wrap up existing threads. wait_for_thread_shutdown(); - // Make any pending calls. - if (_Py_atomic_load_relaxed( - &(interp->ceval.pending.calls_to_do))) - { - // XXX Ensure that the interpreter is running in the current thread? - if (_Py_MakePendingCalls(interp) < 0) { - PyObject *exc, *val, *tb; - PyErr_Fetch(&exc, &val, &tb); - PyErr_BadInternalCall(); - _PyErr_ChainExceptions(exc, val, tb); - PyErr_Print(); - } - } - call_py_exitfuncs(interp); if (tstate != interp->tstate_head || tstate->next != NULL) diff --git a/Python/pystate.c b/Python/pystate.c index 99a01efa6c72..49497b7c3767 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -133,19 +133,28 @@ PyInterpreterState_New(void) return NULL; } - memset(interp, 0, sizeof(*interp)); interp->id_refcount = -1; + interp->id_mutex = NULL; + interp->modules = NULL; + interp->modules_by_index = NULL; + interp->sysdict = NULL; + interp->builtins = NULL; + interp->builtins_copy = NULL; + interp->tstate_head = NULL; interp->check_interval = 100; - - interp->ceval.pending.lock = PyThread_allocate_lock(); - if (interp->ceval.pending.lock == NULL) { - PyErr_SetString(PyExc_RuntimeError, - "failed to create interpreter ceval pending mutex"); - return NULL; - } + interp->num_threads = 0; + interp->pythread_stacksize = 0; + interp->codec_search_path = NULL; + interp->codec_search_cache = NULL; + interp->codec_error_registry = NULL; + interp->codecs_initialized = 0; + interp->fscodec_initialized = 0; interp->core_config = _PyCoreConfig_INIT; interp->config = _PyMainInterpreterConfig_INIT; + interp->importlib = NULL; + interp->import_func = NULL; interp->eval_frame = _PyEval_EvalFrameDefault; + interp->co_extra_user_count = 0; #ifdef HAVE_DLOPEN #if HAVE_DECL_RTLD_NOW interp->dlopenflags = RTLD_NOW; @@ -153,10 +162,13 @@ PyInterpreterState_New(void) interp->dlopenflags = RTLD_LAZY; #endif #endif - - if (_PyRuntime.main_thread == 0) { - _PyRuntime.main_thread = PyThread_get_thread_ident(); - } +#ifdef HAVE_FORK + interp->before_forkers = NULL; + interp->after_forkers_parent = NULL; + interp->after_forkers_child = NULL; +#endif + interp->pyexitfunc = NULL; + interp->pyexitmodule = NULL; HEAD_LOCK(); if (_PyRuntime.interpreters.next_id < 0) { @@ -211,9 +223,6 @@ PyInterpreterState_Clear(PyInterpreterState *interp) Py_CLEAR(interp->after_forkers_parent); Py_CLEAR(interp->after_forkers_child); #endif - // XXX Once we have one allocator per interpreter (i.e. - // per-interpreter GC) we must ensure that all of the interpreter's - // objects have been cleaned up at the point. } @@ -254,9 +263,6 @@ PyInterpreterState_Delete(PyInterpreterState *interp) if (interp->id_mutex != NULL) { PyThread_free_lock(interp->id_mutex); } - if (interp->ceval.pending.lock != NULL) { - PyThread_free_lock(interp->ceval.pending.lock); - } PyMem_RawFree(interp); } @@ -328,37 +334,26 @@ PyInterpreterState_GetID(PyInterpreterState *interp) } -static PyInterpreterState * -interp_look_up_id(PY_INT64_T requested_id) +PyInterpreterState * +_PyInterpreterState_LookUpID(PY_INT64_T requested_id) { + if (requested_id < 0) + goto error; + PyInterpreterState *interp = PyInterpreterState_Head(); while (interp != NULL) { PY_INT64_T id = PyInterpreterState_GetID(interp); - if (id < 0) { + if (id < 0) return NULL; - } - if (requested_id == id) { + if (requested_id == id) return interp; - } interp = PyInterpreterState_Next(interp); } - return NULL; -} -PyInterpreterState * -_PyInterpreterState_LookUpID(PY_INT64_T requested_id) -{ - PyInterpreterState *interp = NULL; - if (requested_id >= 0) { - HEAD_UNLOCK(); - interp = interp_look_up_id(requested_id); - HEAD_UNLOCK(); - } - if (interp == NULL && !PyErr_Occurred()) { - PyErr_Format(PyExc_RuntimeError, - "unrecognized interpreter ID %lld", requested_id); - } - return interp; +error: + PyErr_Format(PyExc_RuntimeError, + "unrecognized interpreter ID %lld", requested_id); + return NULL; } @@ -403,7 +398,7 @@ _PyInterpreterState_IDDecref(PyInterpreterState *interp) int64_t refcount = interp->id_refcount; PyThread_release_lock(interp->id_mutex); - if (refcount == 0 && interp->requires_idref) { + if (refcount == 0) { // XXX Using the "head" thread isn't strictly correct. PyThreadState *tstate = PyInterpreterState_ThreadHead(interp); // XXX Possible GILState issues? @@ -413,18 +408,6 @@ _PyInterpreterState_IDDecref(PyInterpreterState *interp) } } -int -_PyInterpreterState_RequiresIDRef(PyInterpreterState *interp) -{ - return interp->requires_idref; -} - -void -_PyInterpreterState_RequireIDRef(PyInterpreterState *interp, int required) -{ - interp->requires_idref = required ? 1 : 0; -} - _PyCoreConfig * _PyInterpreterState_GetCoreConfig(PyInterpreterState *interp) { @@ -437,16 +420,6 @@ _PyInterpreterState_GetMainConfig(PyInterpreterState *interp) return &interp->config; } -PyObject * -_PyInterpreterState_GetMainModule(PyInterpreterState *interp) -{ - if (interp->modules == NULL) { - PyErr_SetString(PyExc_RuntimeError, "interpreter not initialized"); - return NULL; - } - return PyMapping_GetItemString(interp->modules, "__main__"); -} - /* Default implementation for _PyThreadState_GetFrame */ static struct _frame * threadstate_getframe(PyThreadState *self) @@ -899,7 +872,7 @@ PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc) p->async_exc = exc; HEAD_UNLOCK(); Py_XDECREF(old_exc); - _PyEval_SignalAsyncExc(interp); + _PyEval_SignalAsyncExc(); return 1; } } @@ -1313,7 +1286,7 @@ _PyObject_GetCrossInterpreterData(PyObject *obj, _PyCrossInterpreterData *data) return 0; } -static int +static void _release_xidata(void *arg) { _PyCrossInterpreterData *data = (_PyCrossInterpreterData *)arg; @@ -1321,8 +1294,30 @@ _release_xidata(void *arg) data->free(data->data); } Py_XDECREF(data->obj); - PyMem_Free(data); - return 0; +} + +static void +_call_in_interpreter(PyInterpreterState *interp, + void (*func)(void *), void *arg) +{ + /* We would use Py_AddPendingCall() if it weren't specific to the + * main interpreter (see bpo-33608). In the meantime we take a + * naive approach. + */ + PyThreadState *save_tstate = NULL; + if (interp != _PyInterpreterState_Get()) { + // XXX Using the "head" thread isn't strictly correct. + PyThreadState *tstate = PyInterpreterState_ThreadHead(interp); + // XXX Possible GILState issues? + save_tstate = PyThreadState_Swap(tstate); + } + + func(arg); + + // Switch back. + if (save_tstate != NULL) { + PyThreadState_Swap(save_tstate); + } } void @@ -1333,7 +1328,7 @@ _PyCrossInterpreterData_Release(_PyCrossInterpreterData *data) return; } - // Get the original interpreter. + // Switch to the original interpreter. PyInterpreterState *interp = _PyInterpreterState_LookUpID(data->interp); if (interp == NULL) { // The intepreter was already destroyed. @@ -1342,24 +1337,9 @@ _PyCrossInterpreterData_Release(_PyCrossInterpreterData *data) } return; } - // XXX There's an ever-so-slight race here... - if (interp->finalizing) { - // XXX Someone leaked some memory... - return; - } // "Release" the data and/or the object. - _PyCrossInterpreterData *copied = PyMem_Malloc(sizeof(_PyCrossInterpreterData)); - if (copied == NULL) { - PyErr_SetString(PyExc_MemoryError, - "Not enough memory to preserve cross-interpreter data"); - PyErr_Print(); - return; - } - memcpy(copied, data, sizeof(_PyCrossInterpreterData)); - if (_Py_AddPendingCall(interp, 0, _release_xidata, copied) != 0) { - // XXX Queue full or couldn't get lock. Try again somehow? - } + _call_in_interpreter(interp, _release_xidata, data); } PyObject * @@ -1392,7 +1372,7 @@ _register_xidata(PyTypeObject *cls, crossinterpdatafunc getdata) static void _register_builtins_for_crossinterpreter_data(void); int -_PyCrossInterpreterData_RegisterClass(PyTypeObject *cls, +_PyCrossInterpreterData_Register_Class(PyTypeObject *cls, crossinterpdatafunc getdata) { if (!PyType_Check(cls)) { diff --git a/setup.py b/setup.py index c278f08b8e6d..b96961073b98 100644 --- a/setup.py +++ b/setup.py @@ -784,7 +784,9 @@ def detect_simple_extensions(self): self.add(Extension('syslog', ['syslogmodule.c'])) # Python interface to subinterpreter C-API. - self.add(Extension('_xxsubinterpreters', ['_xxsubinterpretersmodule.c'])) + self.add(Extension('_xxsubinterpreters', + ['_xxsubinterpretersmodule.c'], + define_macros=[('Py_BUILD_CORE', '')])) # # Here ends the simple stuff. From here on, modules need certain From webhook-mailer at python.org Mon Mar 4 09:48:47 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 04 Mar 2019 14:48:47 -0000 Subject: [Python-checkins] bpo-35198 Fix C++ extension compilation on AIX (GH-10437) Message-ID: https://github.com/python/cpython/commit/800d5cd75025876d79ab05980925a05d8e36b63d commit: 800d5cd75025876d79ab05980925a05d8e36b63d branch: master author: Kevin Adler committer: Victor Stinner date: 2019-03-04T15:48:40+01:00 summary: bpo-35198 Fix C++ extension compilation on AIX (GH-10437) For C++ extensions, distutils tries to replace the C compiler with the C++ compiler, but it assumes that C compiler is the first element after any environment variables set. On AIX, linking goes through ld_so_aix, so it is the first element and the compiler is the next element. Thus the replacement is faulty: ld_so_aix gcc ... -> g++ gcc ... Also, it assumed that self.compiler_cxx had only 1 element or that there were the same number of elements as the linker has and in the same order. This might not be the case, so instead concatenate everything together. files: A Misc/NEWS.d/next/Library/2018-11-09-12-45-28.bpo-35198.EJ8keW.rst M Lib/distutils/unixccompiler.py diff --git a/Lib/distutils/unixccompiler.py b/Lib/distutils/unixccompiler.py index ab4d4de15661..d10a78da3114 100644 --- a/Lib/distutils/unixccompiler.py +++ b/Lib/distutils/unixccompiler.py @@ -188,7 +188,15 @@ def link(self, target_desc, objects, i = 1 while '=' in linker[i]: i += 1 - linker[i] = self.compiler_cxx[i] + + if os.path.basename(linker[i]) == 'ld_so_aix': + # AIX platforms prefix the compiler with the ld_so_aix + # script, so we need to adjust our linker index + offset = 1 + else: + offset = 0 + + linker[i+offset] = self.compiler_cxx[i] if sys.platform == 'darwin': linker = _osx_support.compiler_fixup(linker, ld_args) diff --git a/Misc/NEWS.d/next/Library/2018-11-09-12-45-28.bpo-35198.EJ8keW.rst b/Misc/NEWS.d/next/Library/2018-11-09-12-45-28.bpo-35198.EJ8keW.rst new file mode 100644 index 000000000000..4ce7a7e3423c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-11-09-12-45-28.bpo-35198.EJ8keW.rst @@ -0,0 +1 @@ +Fix C++ extension compilation on AIX From webhook-mailer at python.org Mon Mar 4 10:06:40 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 04 Mar 2019 15:06:40 -0000 Subject: [Python-checkins] bpo-35198 Fix C++ extension compilation on AIX (GH-10437) Message-ID: https://github.com/python/cpython/commit/06e9953d5e3f0144ec8247b61541e7be85d55b50 commit: 06e9953d5e3f0144ec8247b61541e7be85d55b50 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-04T07:06:36-08:00 summary: bpo-35198 Fix C++ extension compilation on AIX (GH-10437) For C++ extensions, distutils tries to replace the C compiler with the C++ compiler, but it assumes that C compiler is the first element after any environment variables set. On AIX, linking goes through ld_so_aix, so it is the first element and the compiler is the next element. Thus the replacement is faulty: ld_so_aix gcc ... -> g++ gcc ... Also, it assumed that self.compiler_cxx had only 1 element or that there were the same number of elements as the linker has and in the same order. This might not be the case, so instead concatenate everything together. (cherry picked from commit 800d5cd75025876d79ab05980925a05d8e36b63d) Co-authored-by: Kevin Adler files: A Misc/NEWS.d/next/Library/2018-11-09-12-45-28.bpo-35198.EJ8keW.rst M Lib/distutils/unixccompiler.py diff --git a/Lib/distutils/unixccompiler.py b/Lib/distutils/unixccompiler.py index ab4d4de15661..d10a78da3114 100644 --- a/Lib/distutils/unixccompiler.py +++ b/Lib/distutils/unixccompiler.py @@ -188,7 +188,15 @@ def link(self, target_desc, objects, i = 1 while '=' in linker[i]: i += 1 - linker[i] = self.compiler_cxx[i] + + if os.path.basename(linker[i]) == 'ld_so_aix': + # AIX platforms prefix the compiler with the ld_so_aix + # script, so we need to adjust our linker index + offset = 1 + else: + offset = 0 + + linker[i+offset] = self.compiler_cxx[i] if sys.platform == 'darwin': linker = _osx_support.compiler_fixup(linker, ld_args) diff --git a/Misc/NEWS.d/next/Library/2018-11-09-12-45-28.bpo-35198.EJ8keW.rst b/Misc/NEWS.d/next/Library/2018-11-09-12-45-28.bpo-35198.EJ8keW.rst new file mode 100644 index 000000000000..4ce7a7e3423c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-11-09-12-45-28.bpo-35198.EJ8keW.rst @@ -0,0 +1 @@ +Fix C++ extension compilation on AIX From webhook-mailer at python.org Mon Mar 4 10:40:29 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 04 Mar 2019 15:40:29 -0000 Subject: [Python-checkins] [2.7] bpo-13096: Fix memory leak in ctypes POINTER handling of large values (GH-12100) Message-ID: https://github.com/python/cpython/commit/710dcfd2f4bee034894a39026388f9c21ea976f1 commit: 710dcfd2f4bee034894a39026388f9c21ea976f1 branch: 2.7 author: stratakis committer: Victor Stinner date: 2019-03-04T16:40:25+01:00 summary: [2.7] bpo-13096: Fix memory leak in ctypes POINTER handling of large values (GH-12100) files: A Misc/NEWS.d/next/Library/2019-03-04-16-13-01.bpo-13096.SGPt_n.rst M Modules/_ctypes/callproc.c diff --git a/Misc/NEWS.d/next/Library/2019-03-04-16-13-01.bpo-13096.SGPt_n.rst b/Misc/NEWS.d/next/Library/2019-03-04-16-13-01.bpo-13096.SGPt_n.rst new file mode 100644 index 000000000000..2bf49c855f60 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-04-16-13-01.bpo-13096.SGPt_n.rst @@ -0,0 +1 @@ +Fix memory leak in ctypes POINTER handling of large values. diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index 209734208578..defcde1ff3e9 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -1831,6 +1831,7 @@ POINTER(PyObject *self, PyObject *cls) "s(O){}", buf, &PyCPointer_Type); + PyMem_Free(buf); if (result == NULL) return result; key = PyLong_FromVoidPtr(result); From webhook-mailer at python.org Mon Mar 4 10:45:46 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 04 Mar 2019 15:45:46 -0000 Subject: [Python-checkins] bpo-36179: Fix ref leaks in _hashopenssl (GH-12158) Message-ID: https://github.com/python/cpython/commit/b7bc283ab6a23ee98784400ebffe7fe410232a2e commit: b7bc283ab6a23ee98784400ebffe7fe410232a2e branch: master author: Christian Heimes committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-04T07:45:41-08:00 summary: bpo-36179: Fix ref leaks in _hashopenssl (GH-12158) Fix two unlikely reference leaks in _hashopenssl. The leaks only occur in out-of-memory cases. Thanks to Charalampos Stratakis. Signed-off-by: Christian Heimes https://bugs.python.org/issue36179 files: A Misc/NEWS.d/next/Library/2019-03-04-10-42-46.bpo-36179.jEyuI-.rst M Modules/_hashopenssl.c diff --git a/Misc/NEWS.d/next/Library/2019-03-04-10-42-46.bpo-36179.jEyuI-.rst b/Misc/NEWS.d/next/Library/2019-03-04-10-42-46.bpo-36179.jEyuI-.rst new file mode 100644 index 000000000000..61a98778b78e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-04-10-42-46.bpo-36179.jEyuI-.rst @@ -0,0 +1,2 @@ +Fix two unlikely reference leaks in _hashopenssl. The leaks only occur in +out-of-memory cases. diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c index 9091025761b9..aae558c99303 100644 --- a/Modules/_hashopenssl.c +++ b/Modules/_hashopenssl.c @@ -109,17 +109,18 @@ newEVPobject(PyObject *name) return NULL; } + /* save the name for .name to return */ + Py_INCREF(name); + retval->name = name; + retval->lock = NULL; + retval->ctx = EVP_MD_CTX_new(); if (retval->ctx == NULL) { + Py_DECREF(retval); PyErr_NoMemory(); return NULL; } - /* save the name for .name to return */ - Py_INCREF(name); - retval->name = name; - retval->lock = NULL; - return retval; } @@ -182,6 +183,7 @@ EVP_copy_impl(EVPobject *self) return NULL; if (!locked_EVP_MD_CTX_copy(newobj->ctx, self)) { + Py_DECREF(newobj); return _setException(PyExc_ValueError); } return (PyObject *)newobj; From webhook-mailer at python.org Mon Mar 4 11:17:34 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 04 Mar 2019 16:17:34 -0000 Subject: [Python-checkins] bpo-36179: Fix ref leaks in _hashopenssl (GH-12158) Message-ID: https://github.com/python/cpython/commit/a59d33a1b08bd3dc9dc2584d4360ca81b0f1ad49 commit: a59d33a1b08bd3dc9dc2584d4360ca81b0f1ad49 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-04T08:17:30-08:00 summary: bpo-36179: Fix ref leaks in _hashopenssl (GH-12158) Fix two unlikely reference leaks in _hashopenssl. The leaks only occur in out-of-memory cases. Thanks to Charalampos Stratakis. Signed-off-by: Christian Heimes https://bugs.python.org/issue36179 (cherry picked from commit b7bc283ab6a23ee98784400ebffe7fe410232a2e) Co-authored-by: Christian Heimes files: A Misc/NEWS.d/next/Library/2019-03-04-10-42-46.bpo-36179.jEyuI-.rst M Modules/_hashopenssl.c diff --git a/Misc/NEWS.d/next/Library/2019-03-04-10-42-46.bpo-36179.jEyuI-.rst b/Misc/NEWS.d/next/Library/2019-03-04-10-42-46.bpo-36179.jEyuI-.rst new file mode 100644 index 000000000000..61a98778b78e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-04-10-42-46.bpo-36179.jEyuI-.rst @@ -0,0 +1,2 @@ +Fix two unlikely reference leaks in _hashopenssl. The leaks only occur in +out-of-memory cases. diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c index 31d05409f249..b1f0d397aa7e 100644 --- a/Modules/_hashopenssl.c +++ b/Modules/_hashopenssl.c @@ -112,17 +112,18 @@ newEVPobject(PyObject *name) return NULL; } + /* save the name for .name to return */ + Py_INCREF(name); + retval->name = name; + retval->lock = NULL; + retval->ctx = EVP_MD_CTX_new(); if (retval->ctx == NULL) { + Py_DECREF(retval); PyErr_NoMemory(); return NULL; } - /* save the name for .name to return */ - Py_INCREF(name); - retval->name = name; - retval->lock = NULL; - return retval; } @@ -181,6 +182,7 @@ EVP_copy(EVPobject *self, PyObject *unused) return NULL; if (!locked_EVP_MD_CTX_copy(newobj->ctx, self)) { + Py_DECREF(newobj); return _setException(PyExc_ValueError); } return (PyObject *)newobj; From webhook-mailer at python.org Mon Mar 4 12:10:52 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 04 Mar 2019 17:10:52 -0000 Subject: [Python-checkins] [2.7] bpo-36179: Fix ref leaks in _hashopenssl (GH-12158) (GH-12166) Message-ID: https://github.com/python/cpython/commit/84b5ac9ba6fd71ba9d0ef98e2a166a35189b263f commit: 84b5ac9ba6fd71ba9d0ef98e2a166a35189b263f branch: 2.7 author: Christian Heimes committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-04T09:10:45-08:00 summary: [2.7] bpo-36179: Fix ref leaks in _hashopenssl (GH-12158) (GH-12166) Fix two unlikely reference leaks in _hashopenssl. The leaks only occur in out-of-memory cases. Thanks to Charalampos Stratakis. Signed-off-by: Christian Heimes https://bugs.python.org/issue36179. (cherry picked from commit b7bc283ab6a23ee98784400ebffe7fe410232a2e) Co-authored-by: Christian Heimes https://bugs.python.org/issue36179 files: A Misc/NEWS.d/next/Library/2019-03-04-10-42-46.bpo-36179.jEyuI-.rst M Modules/_hashopenssl.c diff --git a/Misc/NEWS.d/next/Library/2019-03-04-10-42-46.bpo-36179.jEyuI-.rst b/Misc/NEWS.d/next/Library/2019-03-04-10-42-46.bpo-36179.jEyuI-.rst new file mode 100644 index 000000000000..61a98778b78e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-04-10-42-46.bpo-36179.jEyuI-.rst @@ -0,0 +1,2 @@ +Fix two unlikely reference leaks in _hashopenssl. The leaks only occur in +out-of-memory cases. diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c index de69f6fcd037..78445ebabdd3 100644 --- a/Modules/_hashopenssl.c +++ b/Modules/_hashopenssl.c @@ -133,12 +133,6 @@ newEVPobject(PyObject *name) if (retval == NULL) return NULL; - retval->ctx = EVP_MD_CTX_new(); - if (retval->ctx == NULL) { - PyErr_NoMemory(); - return NULL; - } - /* save the name for .name to return */ Py_INCREF(name); retval->name = name; @@ -146,6 +140,13 @@ newEVPobject(PyObject *name) retval->lock = NULL; #endif + retval->ctx = EVP_MD_CTX_new(); + if (retval->ctx == NULL) { + Py_DECREF(retval); + PyErr_NoMemory(); + return NULL; + } + return retval; } @@ -205,6 +206,7 @@ EVP_copy(EVPobject *self, PyObject *unused) return NULL; if (!locked_EVP_MD_CTX_copy(newobj->ctx, self)) { + Py_DECREF(newobj); return _setException(PyExc_ValueError); } return (PyObject *)newobj; From webhook-mailer at python.org Mon Mar 4 13:12:08 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Mon, 04 Mar 2019 18:12:08 -0000 Subject: [Python-checkins] Fixed a missing . and a missing capital letter. (GH-12170) Message-ID: https://github.com/python/cpython/commit/7e9ce4c89e9a34ff84a89831812bc8b42d37ac1f commit: 7e9ce4c89e9a34ff84a89831812bc8b42d37ac1f branch: master author: Jules Lasne (jlasne) committer: Serhiy Storchaka date: 2019-03-04T20:12:04+02:00 summary: Fixed a missing . and a missing capital letter. (GH-12170) files: M Doc/library/subprocess.rst diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index e7844587e908..9ba0d30da569 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -959,7 +959,7 @@ The :mod:`subprocess` module exposes the following constants. .. data:: CREATE_NO_WINDOW A :class:`Popen` ``creationflags`` parameter to specify that a new process - will not create a window + will not create a window. .. versionadded:: 3.7 @@ -1295,7 +1295,7 @@ Replacing functions from the :mod:`popen2` module * :class:`Popen` raises an exception if the execution fails. -* the *capturestderr* argument is replaced with the *stderr* argument. +* The *capturestderr* argument is replaced with the *stderr* argument. * ``stdin=PIPE`` and ``stdout=PIPE`` must be specified. From webhook-mailer at python.org Mon Mar 4 13:52:13 2019 From: webhook-mailer at python.org (T. Wouters) Date: Mon, 04 Mar 2019 18:52:13 -0000 Subject: [Python-checkins] [2.7] bpo-36149 Fix potential use of uninitialized memory in cPickle (#12105) Message-ID: https://github.com/python/cpython/commit/d9bf7f4198871132714cfe7d702baaa02206e9f1 commit: d9bf7f4198871132714cfe7d702baaa02206e9f1 branch: 2.7 author: T. Wouters committer: GitHub date: 2019-03-04T10:52:07-08:00 summary: [2.7] bpo-36149 Fix potential use of uninitialized memory in cPickle (#12105) Fix off-by-one bug in cPickle that caused it to use uninitialised memory on truncated pickles read from FILE*s. files: A Misc/NEWS.d/next/Core and Builtins/2019-02-28-13-52-18.bpo-36149.GJdnh4.rst M Modules/cPickle.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-02-28-13-52-18.bpo-36149.GJdnh4.rst b/Misc/NEWS.d/next/Core and Builtins/2019-02-28-13-52-18.bpo-36149.GJdnh4.rst new file mode 100644 index 000000000000..672db6c1fc07 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-02-28-13-52-18.bpo-36149.GJdnh4.rst @@ -0,0 +1,2 @@ +Fix use of uninitialized memory in cPickle when reading a truncated pickle +from a file object. diff --git a/Modules/cPickle.c b/Modules/cPickle.c index 914ebb3eebee..f7c6feccafd0 100644 --- a/Modules/cPickle.c +++ b/Modules/cPickle.c @@ -586,12 +586,15 @@ readline_file(Unpicklerobject *self, char **s) while (1) { Py_ssize_t bigger; char *newbuf; - for (; i < (self->buf_size - 1); i++) { - if (feof(self->fp) || - (self->buf[i] = getc(self->fp)) == '\n') { - self->buf[i + 1] = '\0'; + while (i < (self->buf_size - 1)) { + int newchar = getc(self->fp); + if (newchar != EOF) { + self->buf[i++] = newchar; + } + if (newchar == EOF || newchar == '\n') { + self->buf[i] = '\0'; *s = self->buf; - return i + 1; + return i; } } if (self->buf_size > (PY_SSIZE_T_MAX >> 1)) { From webhook-mailer at python.org Mon Mar 4 14:41:44 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 04 Mar 2019 19:41:44 -0000 Subject: [Python-checkins] Fixed a missing . and a missing capital letter. (GH-12170) Message-ID: https://github.com/python/cpython/commit/3f1f9f0eee815264e615a7f600a4d7693710ac6b commit: 3f1f9f0eee815264e615a7f600a4d7693710ac6b branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-04T11:41:31-08:00 summary: Fixed a missing . and a missing capital letter. (GH-12170) (cherry picked from commit 7e9ce4c89e9a34ff84a89831812bc8b42d37ac1f) Co-authored-by: Jules Lasne (jlasne) files: M Doc/library/subprocess.rst diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index ff91b5d4c758..18be75c10ce4 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -959,7 +959,7 @@ The :mod:`subprocess` module exposes the following constants. .. data:: CREATE_NO_WINDOW A :class:`Popen` ``creationflags`` parameter to specify that a new process - will not create a window + will not create a window. .. versionadded:: 3.7 @@ -1295,7 +1295,7 @@ Replacing functions from the :mod:`popen2` module * :class:`Popen` raises an exception if the execution fails. -* the *capturestderr* argument is replaced with the *stderr* argument. +* The *capturestderr* argument is replaced with the *stderr* argument. * ``stdin=PIPE`` and ``stdout=PIPE`` must be specified. From webhook-mailer at python.org Mon Mar 4 20:01:31 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 05 Mar 2019 01:01:31 -0000 Subject: [Python-checkins] bpo-36142: Add _PyPreConfig structure (GH-12172) Message-ID: https://github.com/python/cpython/commit/cad1f747da47849ab5d8b0b881f7a0b94564d290 commit: cad1f747da47849ab5d8b0b881f7a0b94564d290 branch: master author: Victor Stinner committer: GitHub date: 2019-03-05T02:01:27+01:00 summary: bpo-36142: Add _PyPreConfig structure (GH-12172) * Add _PyPreConfig structure * Move 'ignored' and 'use_environment' fields from _PyCoreConfig to _PyPreConfig * Add a new "_PyPreConfig preconfig;" field to _PyCoreConfig files: M Include/cpython/coreconfig.h M Include/internal/pycore_coreconfig.h M Modules/main.c M Programs/_freeze_importlib.c M Programs/_testembed.c M Python/coreconfig.c M Python/pathconfig.c M Python/preconfig.c M Python/sysmodule.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index 8ad3b230612c..7997d59c8647 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -46,16 +46,35 @@ typedef struct { #define _Py_INIT_FAILED(err) \ (err.msg != NULL || err.exitcode != -1) -/* --- _PyCoreConfig ---------------------------------------------- */ +/* --- _PyPreConfig ----------------------------------------------- */ typedef struct { - /* Install signal handlers? Yes by default. */ - int install_signal_handlers; + /* If greater than 0, enable isolated mode: sys.path contains + neither the script's directory nor the user's site-packages directory. + + Set to 1 by the -I command line option. If set to -1 (default), inherit + Py_IsolatedFlag value. */ + int isolated; /* If greater than 0: use environment variables. Set to 0 by -E command line option. If set to -1 (default), it is set to !Py_IgnoreEnvironmentFlag. */ int use_environment; +} _PyPreConfig; + +#define _PyPreConfig_INIT \ + (_PyPreConfig){ \ + .isolated = -1, \ + .use_environment = -1} + + +/* --- _PyCoreConfig ---------------------------------------------- */ + +typedef struct { + _PyPreConfig preconfig; + + /* Install signal handlers? Yes by default. */ + int install_signal_handlers; int use_hash_seed; /* PYTHONHASHSEED=x */ unsigned long hash_seed; @@ -152,13 +171,6 @@ typedef struct { wchar_t *dll_path; /* Windows DLL path */ #endif - /* If greater than 0, enable isolated mode: sys.path contains - neither the script's directory nor the user's site-packages directory. - - Set to 1 by the -I command line option. If set to -1 (default), inherit - Py_IsolatedFlag value. */ - int isolated; - /* If equal to zero, disable the import of the module site and the site-dependent manipulations of sys.path that it entails. Also disable these manipulations if site is explicitly imported later (call @@ -336,8 +348,8 @@ typedef struct { #define _PyCoreConfig_INIT \ (_PyCoreConfig){ \ + .preconfig = _PyPreConfig_INIT, \ .install_signal_handlers = 1, \ - .use_environment = -1, \ .use_hash_seed = -1, \ .faulthandler = -1, \ .tracemalloc = -1, \ @@ -345,7 +357,6 @@ typedef struct { .utf8_mode = -1, \ .argc = -1, \ .nmodule_search_path = -1, \ - .isolated = -1, \ .site_import = -1, \ .bytes_warning = -1, \ .inspect = -1, \ diff --git a/Include/internal/pycore_coreconfig.h b/Include/internal/pycore_coreconfig.h index 9f3a4c72b16d..6469fcacbf42 100644 --- a/Include/internal/pycore_coreconfig.h +++ b/Include/internal/pycore_coreconfig.h @@ -34,6 +34,19 @@ PyAPI_FUNC(_PyInitError) _PyArgv_Decode(const _PyArgv *args, PyAPI_FUNC(void) _Py_ClearArgcArgv(void); PyAPI_FUNC(int) _Py_SetArgcArgv(int argc, wchar_t * const *argv); +/* --- _PyPreConfig ----------------------------------------------- */ + +PyAPI_FUNC(void) _PyPreConfig_Clear(_PyPreConfig *config); +PyAPI_FUNC(int) _PyPreConfig_Copy(_PyPreConfig *config, + const _PyPreConfig *config2); +PyAPI_FUNC(void) _PyPreConfig_GetGlobalConfig(_PyPreConfig *config); +PyAPI_FUNC(void) _PyPreConfig_SetGlobalConfig(const _PyPreConfig *config); +PyAPI_FUNC(_PyInitError) _PyPreConfig_Read(_PyPreConfig *config); +PyAPI_FUNC(int) _PyPreConfig_AsDict(const _PyPreConfig *config, + PyObject *dict); + + + /* --- _PyCoreConfig ---------------------------------------------- */ PyAPI_FUNC(_PyInitError) _PyCoreConfig_Read(_PyCoreConfig *config); diff --git a/Modules/main.c b/Modules/main.c index fdeaf1d12ad2..ff2e2f071168 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -487,7 +487,7 @@ pymain_header(const _PyCoreConfig *config) static void pymain_import_readline(const _PyCoreConfig *config) { - if (config->isolated) { + if (config->preconfig.isolated) { return; } if (!config->inspect && RUN_CODE(config)) { @@ -779,7 +779,7 @@ pymain_run_python(PyInterpreterState *interp, int *exitcode) goto done; } } - else if (!config->isolated) { + else if (!config->preconfig.isolated) { PyObject *path0 = _PyPathConfig_ComputeArgv0(config->argc, config->argv); if (path0 == NULL) { diff --git a/Programs/_freeze_importlib.c b/Programs/_freeze_importlib.c index d0e40c96a7a8..e6c51a4a1dfb 100644 --- a/Programs/_freeze_importlib.c +++ b/Programs/_freeze_importlib.c @@ -77,9 +77,9 @@ main(int argc, char *argv[]) text[text_size] = '\0'; _PyCoreConfig config = _PyCoreConfig_INIT; + config.preconfig.use_environment = 0; config.user_site_directory = 0; config.site_import = 0; - config.use_environment = 0; config.program_name = L"./_freeze_importlib"; /* Don't install importlib, since it could execute outdated bytecode. */ config._install_importlib = 0; diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 6b5311be27ac..7b4d8c2347fb 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -606,15 +606,15 @@ static int test_init_isolated(void) /* Test _PyCoreConfig.isolated=1 */ _PyCoreConfig config = _PyCoreConfig_INIT; + Py_IsolatedFlag = 0; + config.preconfig.isolated = 1; + /* Set coerce_c_locale and utf8_mode to not depend on the locale */ config.coerce_c_locale = 0; config.utf8_mode = 0; /* Use path starting with "./" avoids a search along the PATH */ config.program_name = L"./_testembed"; - Py_IsolatedFlag = 0; - config.isolated = 1; - test_init_env_putenvs(); _PyInitError err = _Py_InitializeFromConfig(&config); if (_Py_INIT_FAILED(err)) { diff --git a/Python/coreconfig.c b/Python/coreconfig.c index c3eccb3b192a..3486da4048d3 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -439,6 +439,8 @@ Py_GetArgcArgv(int *argc, wchar_t ***argv) void _PyCoreConfig_Clear(_PyCoreConfig *config) { + _PyPreConfig_Clear(&config->preconfig); + #define CLEAR(ATTR) \ do { \ PyMem_RawFree(ATTR); \ @@ -488,6 +490,10 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) { _PyCoreConfig_Clear(config); + if (_PyPreConfig_Copy(&config->preconfig, &config2->preconfig) < 0) { + return -1; + } + #define COPY_ATTR(ATTR) config->ATTR = config2->ATTR #define COPY_STR_ATTR(ATTR) \ do { \ @@ -519,7 +525,6 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) } while (0) COPY_ATTR(install_signal_handlers); - COPY_ATTR(use_environment); COPY_ATTR(use_hash_seed); COPY_ATTR(hash_seed); COPY_ATTR(_install_importlib); @@ -557,7 +562,6 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) #endif COPY_WSTR_ATTR(base_exec_prefix); - COPY_ATTR(isolated); COPY_ATTR(site_import); COPY_ATTR(bytes_warning); COPY_ATTR(inspect); @@ -595,9 +599,9 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) const char* _PyCoreConfig_GetEnv(const _PyCoreConfig *config, const char *name) { - assert(config->use_environment >= 0); + assert(config->preconfig.use_environment >= 0); - if (!config->use_environment) { + if (!config->preconfig.use_environment) { return NULL; } @@ -616,9 +620,9 @@ _PyCoreConfig_GetEnvDup(const _PyCoreConfig *config, wchar_t **dest, wchar_t *wname, char *name) { - assert(config->use_environment >= 0); + assert(config->preconfig.use_environment >= 0); - if (!config->use_environment) { + if (!config->preconfig.use_environment) { *dest = NULL; return 0; } @@ -662,6 +666,8 @@ _PyCoreConfig_GetEnvDup(const _PyCoreConfig *config, void _PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config) { + _PyPreConfig_GetGlobalConfig(&config->preconfig); + #define COPY_FLAG(ATTR, VALUE) \ if (config->ATTR == -1) { \ config->ATTR = VALUE; \ @@ -672,7 +678,6 @@ _PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config) } COPY_FLAG(utf8_mode, Py_UTF8Mode); - COPY_FLAG(isolated, Py_IsolatedFlag); COPY_FLAG(bytes_warning, Py_BytesWarningFlag); COPY_FLAG(inspect, Py_InspectFlag); COPY_FLAG(interactive, Py_InteractiveFlag); @@ -686,7 +691,6 @@ _PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config) #endif COPY_FLAG(_frozen, Py_FrozenFlag); - COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); COPY_NOT_FLAG(buffered_stdio, Py_UnbufferedStdioFlag); COPY_NOT_FLAG(site_import, Py_NoSiteFlag); COPY_NOT_FLAG(write_bytecode, Py_DontWriteBytecodeFlag); @@ -701,6 +705,8 @@ _PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config) void _PyCoreConfig_SetGlobalConfig(const _PyCoreConfig *config) { + _PyPreConfig_SetGlobalConfig(&config->preconfig); + #define COPY_FLAG(ATTR, VAR) \ if (config->ATTR != -1) { \ VAR = config->ATTR; \ @@ -711,7 +717,6 @@ _PyCoreConfig_SetGlobalConfig(const _PyCoreConfig *config) } COPY_FLAG(utf8_mode, Py_UTF8Mode); - COPY_FLAG(isolated, Py_IsolatedFlag); COPY_FLAG(bytes_warning, Py_BytesWarningFlag); COPY_FLAG(inspect, Py_InspectFlag); COPY_FLAG(interactive, Py_InteractiveFlag); @@ -725,7 +730,6 @@ _PyCoreConfig_SetGlobalConfig(const _PyCoreConfig *config) #endif COPY_FLAG(_frozen, Py_FrozenFlag); - COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); COPY_NOT_FLAG(buffered_stdio, Py_UnbufferedStdioFlag); COPY_NOT_FLAG(site_import, Py_NoSiteFlag); COPY_NOT_FLAG(write_bytecode, Py_DontWriteBytecodeFlag); @@ -1497,10 +1501,15 @@ _PyCoreConfig_Read(_PyCoreConfig *config) _PyInitError err; _PyCoreConfig_GetGlobalConfig(config); - assert(config->use_environment >= 0); - if (config->isolated > 0) { - config->use_environment = 0; + err = _PyPreConfig_Read(&config->preconfig); + if (_Py_INIT_FAILED(err)) { + return err; + } + + assert(config->preconfig.use_environment >= 0); + + if (config->preconfig.isolated > 0) { config->user_site_directory = 0; } @@ -1510,7 +1519,7 @@ _PyCoreConfig_Read(_PyCoreConfig *config) } #endif - if (config->use_environment) { + if (config->preconfig.use_environment) { err = config_read_env_vars(config); if (_Py_INIT_FAILED(err)) { return err; @@ -1611,7 +1620,7 @@ _PyCoreConfig_Read(_PyCoreConfig *config) } assert(config->coerce_c_locale >= 0); - assert(config->use_environment >= 0); + assert(config->preconfig.use_environment >= 0); assert(config->filesystem_encoding != NULL); assert(config->filesystem_errors != NULL); assert(config->stdio_encoding != NULL); @@ -1679,18 +1688,23 @@ _PyCoreConfig_Write(const _PyCoreConfig *config) PyObject * _PyCoreConfig_AsDict(const _PyCoreConfig *config) { - PyObject *dict, *obj; + PyObject *dict; dict = PyDict_New(); if (dict == NULL) { return NULL; } + if (_PyPreConfig_AsDict(&config->preconfig, dict) < 0) { + Py_DECREF(dict); + return NULL; + } + #define SET_ITEM(KEY, EXPR) \ do { \ - obj = (EXPR); \ + PyObject *obj = (EXPR); \ if (obj == NULL) { \ - return NULL; \ + goto fail; \ } \ int res = PyDict_SetItemString(dict, (KEY), obj); \ Py_DECREF(obj); \ @@ -1718,7 +1732,6 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) SET_ITEM(#OPTIONS, _Py_wstrlist_as_pylist(config->NOPTION, config->OPTIONS)) SET_ITEM_INT(install_signal_handlers); - SET_ITEM_INT(use_environment); SET_ITEM_INT(use_hash_seed); SET_ITEM_UINT(hash_seed); SET_ITEM_STR(allocator); @@ -1752,7 +1765,6 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) #ifdef MS_WINDOWS SET_ITEM_WSTR(dll_path); #endif - SET_ITEM_INT(isolated); SET_ITEM_INT(site_import); SET_ITEM_INT(bytes_warning); SET_ITEM_INT(inspect); @@ -1828,14 +1840,6 @@ cmdline_clear(_PyCmdline *cmdline) } -static _PyInitError -cmdline_decode_argv(_PyCmdline *cmdline) -{ - assert(cmdline->argv == NULL); - return _PyArgv_Decode(cmdline->args, &cmdline->argv); -} - - /* --- _PyCoreConfig command line parser -------------------------- */ /* Parse the command line arguments */ @@ -1912,7 +1916,7 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, break; case 'I': - config->isolated++; + config->preconfig.isolated++; break; /* case 'J': reserved for Jython */ @@ -1934,7 +1938,7 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, break; case 'E': - config->use_environment = 0; + config->preconfig.use_environment = 0; break; case 't': @@ -2272,7 +2276,7 @@ config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline) return err; } - if (config->use_environment) { + if (config->preconfig.use_environment) { err = cmdline_init_env_warnoptions(cmdline, config); if (_Py_INIT_FAILED(err)) { return err; diff --git a/Python/pathconfig.c b/Python/pathconfig.c index f96f0153e210..41fc9e2142e9 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -330,7 +330,7 @@ _PyCoreConfig_CalculatePathConfig(_PyCoreConfig *config) #endif if (path_config.isolated != -1) { - config->isolated = path_config.isolated; + config->preconfig.isolated = path_config.isolated; } if (path_config.site_import != -1) { config->site_import = path_config.site_import; diff --git a/Python/preconfig.c b/Python/preconfig.c index 8102924e7165..bb1e830ebf59 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -90,3 +90,116 @@ _PyArgv_Decode(const _PyArgv *args, wchar_t*** argv_p) *argv_p = argv; return _Py_INIT_OK(); } + + +/* --- _PyPreConfig ----------------------------------------------- */ + +void +_PyPreConfig_Clear(_PyPreConfig *config) +{ +} + + +int +_PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2) +{ + _PyPreConfig_Clear(config); + +#define COPY_ATTR(ATTR) config->ATTR = config2->ATTR + + COPY_ATTR(isolated); + COPY_ATTR(use_environment); + +#undef COPY_ATTR + return 0; +} + + +void +_PyPreConfig_GetGlobalConfig(_PyPreConfig *config) +{ +#define COPY_FLAG(ATTR, VALUE) \ + if (config->ATTR == -1) { \ + config->ATTR = VALUE; \ + } +#define COPY_NOT_FLAG(ATTR, VALUE) \ + if (config->ATTR == -1) { \ + config->ATTR = !(VALUE); \ + } + + COPY_FLAG(isolated, Py_IsolatedFlag); + COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); + +#undef COPY_FLAG +#undef COPY_NOT_FLAG +} + + +void +_PyPreConfig_SetGlobalConfig(const _PyPreConfig *config) +{ +#define COPY_FLAG(ATTR, VAR) \ + if (config->ATTR != -1) { \ + VAR = config->ATTR; \ + } +#define COPY_NOT_FLAG(ATTR, VAR) \ + if (config->ATTR != -1) { \ + VAR = !config->ATTR; \ + } + + COPY_FLAG(isolated, Py_IsolatedFlag); + COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); + +#undef COPY_FLAG +#undef COPY_NOT_FLAG +} + + +_PyInitError +_PyPreConfig_Read(_PyPreConfig *config) +{ + _PyPreConfig_GetGlobalConfig(config); + + if (config->isolated > 0) { + config->use_environment = 0; + } + + /* Default values */ + if (config->use_environment < 0) { + config->use_environment = 0; + } + + assert(config->use_environment >= 0); + + return _Py_INIT_OK(); +} + + +int +_PyPreConfig_AsDict(const _PyPreConfig *config, PyObject *dict) +{ +#define SET_ITEM(KEY, EXPR) \ + do { \ + PyObject *obj = (EXPR); \ + if (obj == NULL) { \ + goto fail; \ + } \ + int res = PyDict_SetItemString(dict, (KEY), obj); \ + Py_DECREF(obj); \ + if (res < 0) { \ + goto fail; \ + } \ + } while (0) +#define SET_ITEM_INT(ATTR) \ + SET_ITEM(#ATTR, PyLong_FromLong(config->ATTR)) + + SET_ITEM_INT(isolated); + SET_ITEM_INT(use_environment); + return 0; + +fail: + return -1; + +#undef SET_ITEM +#undef SET_ITEM_INT +} diff --git a/Python/sysmodule.c b/Python/sysmodule.c index dd39305f39af..4b122805d782 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -2172,14 +2172,14 @@ make_flags(void) SetFlag(!config->write_bytecode); SetFlag(!config->user_site_directory); SetFlag(!config->site_import); - SetFlag(!config->use_environment); + SetFlag(!config->preconfig.use_environment); SetFlag(config->verbose); /* SetFlag(saw_unbuffered_flag); */ /* SetFlag(skipfirstline); */ SetFlag(config->bytes_warning); SetFlag(config->quiet); SetFlag(config->use_hash_seed == 0 || config->hash_seed != 0); - SetFlag(config->isolated); + SetFlag(config->preconfig.isolated); PyStructSequence_SET_ITEM(seq, pos++, PyBool_FromLong(config->dev_mode)); SetFlag(config->utf8_mode); #undef SetFlag From webhook-mailer at python.org Mon Mar 4 20:44:15 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 05 Mar 2019 01:44:15 -0000 Subject: [Python-checkins] bpo-36142: Add _PyPreConfig_ReadFromArgv() (GH-12173) Message-ID: https://github.com/python/cpython/commit/6dcb54228e7520abd058897440c26e323f62afcd commit: 6dcb54228e7520abd058897440c26e323f62afcd branch: master author: Victor Stinner committer: GitHub date: 2019-03-05T02:44:12+01:00 summary: bpo-36142: Add _PyPreConfig_ReadFromArgv() (GH-12173) The new function is now responsible to parse -E and -I command line arguments. files: M Include/internal/pycore_coreconfig.h M Include/internal/pycore_getopt.h M Modules/main.c M Python/coreconfig.c M Python/getopt.c M Python/pathconfig.c M Python/preconfig.c M Python/pylifecycle.c diff --git a/Include/internal/pycore_coreconfig.h b/Include/internal/pycore_coreconfig.h index 6469fcacbf42..5135969bcfc9 100644 --- a/Include/internal/pycore_coreconfig.h +++ b/Include/internal/pycore_coreconfig.h @@ -44,12 +44,13 @@ PyAPI_FUNC(void) _PyPreConfig_SetGlobalConfig(const _PyPreConfig *config); PyAPI_FUNC(_PyInitError) _PyPreConfig_Read(_PyPreConfig *config); PyAPI_FUNC(int) _PyPreConfig_AsDict(const _PyPreConfig *config, PyObject *dict); - +PyAPI_FUNC(_PyInitError) _PyPreConfig_ReadFromArgv(_PyPreConfig *config, + const _PyArgv *args); +PyAPI_FUNC(void) _PyPreConfig_Write(const _PyPreConfig *config); /* --- _PyCoreConfig ---------------------------------------------- */ -PyAPI_FUNC(_PyInitError) _PyCoreConfig_Read(_PyCoreConfig *config); PyAPI_FUNC(void) _PyCoreConfig_Clear(_PyCoreConfig *); PyAPI_FUNC(int) _PyCoreConfig_Copy( _PyCoreConfig *config, @@ -67,8 +68,11 @@ PyAPI_FUNC(int) _PyCoreConfig_GetEnvDup( wchar_t **dest, wchar_t *wname, char *name); +PyAPI_FUNC(_PyInitError) _PyCoreConfig_Read(_PyCoreConfig *config, + const _PyPreConfig *preconfig); PyAPI_FUNC(_PyInitError) _PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, - const _PyArgv *args); + const _PyArgv *args, + const _PyPreConfig *preconfig); PyAPI_FUNC(void) _PyCoreConfig_Write(const _PyCoreConfig *config); #ifdef __cplusplus diff --git a/Include/internal/pycore_getopt.h b/Include/internal/pycore_getopt.h index e6f4654a666b..1d30f5bb99f8 100644 --- a/Include/internal/pycore_getopt.h +++ b/Include/internal/pycore_getopt.h @@ -17,7 +17,6 @@ typedef struct { int val; } _PyOS_LongOption; -extern int _PyOS_GetOpt(int argc, wchar_t **argv, wchar_t *optstring, - const _PyOS_LongOption *longopts, int *longindex); +extern int _PyOS_GetOpt(int argc, wchar_t **argv, int *longindex); #endif /* !Py_INTERNAL_PYGETOPT_H */ diff --git a/Modules/main.c b/Modules/main.c index ff2e2f071168..34032adca57e 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -286,20 +286,32 @@ _PyMainInterpreterConfig_Read(_PyMainInterpreterConfig *main_config, /* --- pymain_init() ---------------------------------------------- */ -static void -config_clear(_PyCoreConfig *config) +static _PyInitError +preconfig_read_write(_PyPreConfig *config, const _PyArgv *args) { + _PyInitError err; + PyMemAllocatorEx old_alloc; _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - _PyCoreConfig_Clear(config); + _PyPreConfig_GetGlobalConfig(config); + + err = _PyPreConfig_ReadFromArgv(config, args); PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); + + if (_Py_INIT_FAILED(err)) { + return err; + } + + _PyPreConfig_Write(config); + return _Py_INIT_OK(); } static _PyInitError -config_read_write(_PyCoreConfig *config, const _PyArgv *args) +config_read_write(_PyCoreConfig *config, const _PyArgv *args, + const _PyPreConfig *preconfig) { _PyInitError err; @@ -308,7 +320,7 @@ config_read_write(_PyCoreConfig *config, const _PyArgv *args) _PyCoreConfig_GetGlobalConfig(config); - err = _PyCoreConfig_ReadFromArgv(config, args); + err = _PyCoreConfig_ReadFromArgv(config, args, preconfig); PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); @@ -344,6 +356,7 @@ static _PyInitError pymain_init(const _PyArgv *args, PyInterpreterState **interp_p) { _PyInitError err; + PyMemAllocatorEx old_alloc; err = _PyRuntime_Initialize(); if (_Py_INIT_FAILED(err)) { @@ -359,10 +372,18 @@ pymain_init(const _PyArgv *args, PyInterpreterState **interp_p) fedisableexcept(FE_OVERFLOW); #endif + _PyPreConfig local_preconfig = _PyPreConfig_INIT; + _PyPreConfig *preconfig = &local_preconfig; + _PyCoreConfig local_config = _PyCoreConfig_INIT; _PyCoreConfig *config = &local_config; - err = config_read_write(config, args); + err = preconfig_read_write(preconfig, args); + if (_Py_INIT_FAILED(err)) { + goto done; + } + + err = config_read_write(config, args, preconfig); if (_Py_INIT_FAILED(err)) { goto done; } @@ -382,7 +403,12 @@ pymain_init(const _PyArgv *args, PyInterpreterState **interp_p) err = _Py_INIT_OK(); done: - config_clear(config); + _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); + + _PyPreConfig_Clear(preconfig); + _PyCoreConfig_Clear(config); + + PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); return err; } diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 3486da4048d3..a6aa89bf8c5d 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -23,13 +23,6 @@ /* --- Command line options --------------------------------------- */ -#define PROGRAM_OPTS L"bBc:dEhiIJm:OqRsStuvVW:xX:?" - -static const _PyOS_LongOption longoptions[] = { - {L"check-hash-based-pycs", 1, 0}, - {NULL, 0, 0}, -}; - /* Short usage message (with %s for argv0) */ static const char usage_line[] = "usage: %ls [option] ... [-c cmd | -m mod | file | -] [arg] ...\n"; @@ -1483,28 +1476,61 @@ config_init_fs_encoding(_PyCoreConfig *config) } -/* Read configuration settings from standard locations - * - * This function doesn't make any changes to the interpreter state - it - * merely populates any missing configuration settings. This allows an - * embedding application to completely override a config option by - * setting it before calling this function, or else modify the default - * setting before passing the fully populated config to Py_EndInitialization. - * - * More advanced selective initialization tricks are possible by calling - * this function multiple times with various preconfigured settings. - */ +static _PyInitError +_PyCoreConfig_ReadPreConfig(_PyCoreConfig *config) +{ + _PyInitError err; + _PyPreConfig local_preconfig = _PyPreConfig_INIT; + _PyPreConfig_GetGlobalConfig(&local_preconfig); + + if (_PyPreConfig_Copy(&local_preconfig, &config->preconfig) < 0) { + err = _Py_INIT_NO_MEMORY(); + goto done; + } + + err = _PyPreConfig_Read(&local_preconfig); + if (_Py_INIT_FAILED(err)) { + goto done; + } + + if (_PyPreConfig_Copy(&config->preconfig, &local_preconfig) < 0) { + err = _Py_INIT_NO_MEMORY(); + goto done; + } + err = _Py_INIT_OK(); + +done: + _PyPreConfig_Clear(&local_preconfig); + return err; +} + + +/* Read the configuration into _PyCoreConfig and initialize the LC_CTYPE + locale: enable UTF-8 mode (PEP 540) and/or coerce the C locale (PEP 538). + Read the configuration from: + + * Environment variables + * Py_xxx global configuration variables + + See _PyCoreConfig_ReadFromArgv() to parse also command line arguments. */ _PyInitError -_PyCoreConfig_Read(_PyCoreConfig *config) +_PyCoreConfig_Read(_PyCoreConfig *config, const _PyPreConfig *preconfig) { _PyInitError err; _PyCoreConfig_GetGlobalConfig(config); - err = _PyPreConfig_Read(&config->preconfig); - if (_Py_INIT_FAILED(err)) { - return err; + if (preconfig != NULL) { + if (_PyPreConfig_Copy(&config->preconfig, preconfig) < 0) { + return _Py_INIT_NO_MEMORY(); + } + } + else { + err = _PyCoreConfig_ReadPreConfig(config); + if (_Py_INIT_FAILED(err)) { + return err; + } } assert(config->preconfig.use_environment >= 0); @@ -1851,8 +1877,7 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, _PyOS_ResetGetOpt(); do { int longindex = -1; - int c = _PyOS_GetOpt(cmdline->args->argc, cmdline->argv, PROGRAM_OPTS, - longoptions, &longindex); + int c = _PyOS_GetOpt(cmdline->args->argc, cmdline->argv, &longindex); if (c == EOF) { break; } @@ -1915,8 +1940,9 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, config->interactive++; break; + case 'E': case 'I': - config->preconfig.isolated++; + /* option handled by _PyPreConfig_ReadFromArgv() */ break; /* case 'J': reserved for Jython */ @@ -1937,10 +1963,6 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, config->site_import = 0; break; - case 'E': - config->preconfig.use_environment = 0; - break; - case 't': /* ignored for backwards compatibility */ break; @@ -2235,7 +2257,8 @@ config_usage(int error, const wchar_t* program) /* Parse command line options and environment variables. */ static _PyInitError -config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline) +config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, + const _PyPreConfig *preconfig) { int need_usage = 0; _PyInitError err; @@ -2271,7 +2294,7 @@ config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline) return err; } - err = _PyCoreConfig_Read(config); + err = _PyCoreConfig_Read(config, preconfig); if (_Py_INIT_FAILED(err)) { return err; } @@ -2296,7 +2319,8 @@ config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline) static _PyInitError -config_read_from_argv_impl(_PyCoreConfig *config, const _PyArgv *args) +config_read_from_argv_impl(_PyCoreConfig *config, const _PyArgv *args, + const _PyPreConfig *preconfig) { _PyInitError err; @@ -2309,7 +2333,7 @@ config_read_from_argv_impl(_PyCoreConfig *config, const _PyArgv *args) goto done; } - err = config_from_cmdline(config, &cmdline); + err = config_from_cmdline(config, &cmdline, preconfig); if (_Py_INIT_FAILED(err)) { goto done; } @@ -2330,7 +2354,8 @@ config_read_from_argv_impl(_PyCoreConfig *config, const _PyArgv *args) * Environment variables * Py_xxx global configuration variables */ _PyInitError -_PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, const _PyArgv *args) +_PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, const _PyArgv *args, + const _PyPreConfig *preconfig) { _PyInitError err; int init_utf8_mode = Py_UTF8Mode; @@ -2381,7 +2406,7 @@ _PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, const _PyArgv *args) Py_LegacyWindowsFSEncodingFlag = config->legacy_windows_fs_encoding; #endif - err = config_read_from_argv_impl(config, args); + err = config_read_from_argv_impl(config, args, preconfig); if (_Py_INIT_FAILED(err)) { goto done; } diff --git a/Python/getopt.c b/Python/getopt.c index c165a94a2d84..1dc872041ff5 100644 --- a/Python/getopt.c +++ b/Python/getopt.c @@ -43,6 +43,16 @@ wchar_t *_PyOS_optarg = NULL; /* optional argument */ static wchar_t *opt_ptr = L""; +/* Python command line short and long options */ + +#define SHORT_OPTS L"bBc:dEhiIJm:OqRsStuvVW:xX:?" + +static const _PyOS_LongOption longopts[] = { + {L"check-hash-based-pycs", 1, 0}, + {NULL, 0, 0}, +}; + + void _PyOS_ResetGetOpt(void) { _PyOS_opterr = 1; @@ -51,8 +61,7 @@ void _PyOS_ResetGetOpt(void) opt_ptr = L""; } -int _PyOS_GetOpt(int argc, wchar_t **argv, wchar_t *optstring, - const _PyOS_LongOption *longopts, int *longindex) +int _PyOS_GetOpt(int argc, wchar_t **argv, int *longindex) { wchar_t *ptr; wchar_t option; @@ -128,7 +137,7 @@ int _PyOS_GetOpt(int argc, wchar_t **argv, wchar_t *optstring, return '_'; } - if ((ptr = wcschr(optstring, option)) == NULL) { + if ((ptr = wcschr(SHORT_OPTS, option)) == NULL) { if (_PyOS_opterr) fprintf(stderr, "Unknown option: -%c\n", (char)option); return '_'; diff --git a/Python/pathconfig.c b/Python/pathconfig.c index 41fc9e2142e9..14dbba78af12 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -393,7 +393,7 @@ pathconfig_global_init(void) _PyInitError err; _PyCoreConfig config = _PyCoreConfig_INIT; - err = _PyCoreConfig_Read(&config); + err = _PyCoreConfig_Read(&config, NULL); if (_Py_INIT_FAILED(err)) { goto error; } diff --git a/Python/preconfig.c b/Python/preconfig.c index bb1e830ebf59..af70f3871ccd 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -1,5 +1,6 @@ #include "Python.h" #include "pycore_coreconfig.h" +#include "pycore_getopt.h" #define DECODE_LOCALE_ERR(NAME, LEN) \ @@ -92,6 +93,25 @@ _PyArgv_Decode(const _PyArgv *args, wchar_t*** argv_p) } +/* --- _PyPreCmdline ------------------------------------------------- */ + +typedef struct { + const _PyArgv *args; + int argc; + wchar_t **argv; +} _PyPreCmdline; + + +static void +precmdline_clear(_PyPreCmdline *cmdline) +{ + if (cmdline->args->use_bytes_argv && cmdline->argv != NULL) { + _Py_wstrlist_clear(cmdline->args->argc, cmdline->argv); + } + cmdline->argv = NULL; +} + + /* --- _PyPreConfig ----------------------------------------------- */ void @@ -169,6 +189,7 @@ _PyPreConfig_Read(_PyPreConfig *config) config->use_environment = 0; } + assert(config->isolated >= 0); assert(config->use_environment >= 0); return _Py_INIT_OK(); @@ -203,3 +224,76 @@ _PyPreConfig_AsDict(const _PyPreConfig *config, PyObject *dict) #undef SET_ITEM #undef SET_ITEM_INT } + + +/* Parse the command line arguments */ +static _PyInitError +preconfig_parse_cmdline(_PyPreConfig *config, _PyPreCmdline *cmdline) +{ + _PyOS_ResetGetOpt(); + /* Don't log parsing errors into stderr here: _PyCoreConfig_ReadFromArgv() + is responsible for that */ + _PyOS_opterr = 0; + do { + int longindex = -1; + int c = _PyOS_GetOpt(cmdline->args->argc, cmdline->argv, &longindex); + + if (c == EOF || c == 'c' || c == 'm') { + break; + } + + switch (c) { + case 'E': + config->use_environment = 0; + break; + + case 'I': + config->isolated++; + break; + + default: + /* ignore other argument: + handled by _PyCoreConfig_ReadFromArgv() */ + break; + } + } while (1); + + return _Py_INIT_OK(); +} + + +_PyInitError +_PyPreConfig_ReadFromArgv(_PyPreConfig *config, const _PyArgv *args) +{ + _PyInitError err; + + _PyPreCmdline cmdline; + memset(&cmdline, 0, sizeof(cmdline)); + cmdline.args = args; + + err = _PyArgv_Decode(cmdline.args, &cmdline.argv); + if (_Py_INIT_FAILED(err)) { + goto done; + } + + err = preconfig_parse_cmdline(config, &cmdline); + if (_Py_INIT_FAILED(err)) { + goto done; + } + + err = _PyPreConfig_Read(config); + if (_Py_INIT_FAILED(err)) { + goto done; + } + err = _Py_INIT_OK(); + +done: + precmdline_clear(&cmdline); + return err; +} + + +void +_PyPreConfig_Write(const _PyPreConfig *config) +{ +} diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index a5cfc07c488e..7cf4a6d032c8 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -763,7 +763,7 @@ _Py_InitializeCore(PyInterpreterState **interp_p, _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); if (_PyCoreConfig_Copy(&config, src_config) >= 0) { - err = _PyCoreConfig_Read(&config); + err = _PyCoreConfig_Read(&config, NULL); } else { err = _Py_INIT_ERR("failed to copy core config"); From webhook-mailer at python.org Mon Mar 4 23:43:57 2019 From: webhook-mailer at python.org (Benjamin Peterson) Date: Tue, 05 Mar 2019 04:43:57 -0000 Subject: [Python-checkins] Doc: Use `option` word for command line interface. (GH-12142) Message-ID: https://github.com/python/cpython/commit/0983fcd0d5bd00c6b0dd3040760226f67aa831cd commit: 0983fcd0d5bd00c6b0dd3040760226f67aa831cd branch: master author: NAKAMURA Osamu committer: Benjamin Peterson date: 2019-03-04T20:43:43-08:00 summary: Doc: Use `option` word for command line interface. (GH-12142) For command line option, `option` is better than `parameter`. files: M Doc/library/compileall.rst diff --git a/Doc/library/compileall.rst b/Doc/library/compileall.rst index 2d6c52b656bd..5e08616e9347 100644 --- a/Doc/library/compileall.rst +++ b/Doc/library/compileall.rst @@ -105,7 +105,7 @@ compile Python sources. byte-code file ending in ``.pyc``, never ``.pyo``. .. versionchanged:: 3.7 - Added the ``--invalidation-mode`` parameter. + Added the ``--invalidation-mode`` option. There is no command-line option to control the optimization level used by the From webhook-mailer at python.org Mon Mar 4 23:49:52 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 05 Mar 2019 04:49:52 -0000 Subject: [Python-checkins] Doc: Use `option` word for command line interface. (GH-12142) Message-ID: https://github.com/python/cpython/commit/bf35cc2593562c24df172ce2da30303af9ad6d92 commit: bf35cc2593562c24df172ce2da30303af9ad6d92 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-04T20:49:47-08:00 summary: Doc: Use `option` word for command line interface. (GH-12142) For command line option, `option` is better than `parameter`. (cherry picked from commit 0983fcd0d5bd00c6b0dd3040760226f67aa831cd) Co-authored-by: NAKAMURA Osamu files: M Doc/library/compileall.rst diff --git a/Doc/library/compileall.rst b/Doc/library/compileall.rst index 5151f3a5237a..258de28e3b6e 100644 --- a/Doc/library/compileall.rst +++ b/Doc/library/compileall.rst @@ -105,7 +105,7 @@ compile Python sources. byte-code file ending in ``.pyc``, never ``.pyo``. .. versionchanged:: 3.7 - Added the ``--invalidation-mode`` parameter. + Added the ``--invalidation-mode`` option. There is no command-line option to control the optimization level used by the From webhook-mailer at python.org Tue Mar 5 00:19:39 2019 From: webhook-mailer at python.org (Benjamin Peterson) Date: Tue, 05 Mar 2019 05:19:39 -0000 Subject: [Python-checkins] closes bpo-36188: Clean up 'unbound' method left-overs. (GH-12169) Message-ID: https://github.com/python/cpython/commit/b727239575894b060db37792e86aab818c00817a commit: b727239575894b060db37792e86aab818c00817a branch: master author: Martijn Pieters committer: Benjamin Peterson date: 2019-03-04T21:19:34-08:00 summary: closes bpo-36188: Clean up 'unbound' method left-overs. (GH-12169) Methods are always bound, and `__self__` can no longer be `NULL` (`method_new()` and `PyMethod_New()` both explicitly check for this). Moreover, once a bound method is bound, it *stays* bound and won't be re-bound to something else, so the section in the datamodel that talks about accessing an methods in a different descriptor-binding context doesn't apply any more in Python 3. files: A Misc/NEWS.d/next/Core and Builtins/2019-03-04-18-05-31.bpo-36188.EuUZNz.rst M Doc/reference/datamodel.rst M Objects/classobject.c diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 9422ae66cb9c..c3e79ce6c881 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -578,12 +578,6 @@ Callable types to be bound. The new method's :attr:`__func__` attribute is the original function object. - When a user-defined method object is created by retrieving another method - object from a class or instance, the behaviour is the same as for a - function object, except that the :attr:`__func__` attribute of the new - instance is not the original method object but its :attr:`__func__` - attribute. - When an instance method object is created by retrieving a class method object from a class or instance, its :attr:`__self__` attribute is the class itself, and its :attr:`__func__` attribute is the function object diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-04-18-05-31.bpo-36188.EuUZNz.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-04-18-05-31.bpo-36188.EuUZNz.rst new file mode 100644 index 000000000000..f018e31ede91 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-04-18-05-31.bpo-36188.EuUZNz.rst @@ -0,0 +1,2 @@ +Cleaned up left-over vestiges of Python 2 unbound method handling in method objects and documentation. +Patch by Martijn Pieters \ No newline at end of file diff --git a/Objects/classobject.c b/Objects/classobject.c index 0d1cf7a95ccc..1ee897847fb0 100644 --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -267,10 +267,7 @@ static Py_hash_t method_hash(PyMethodObject *a) { Py_hash_t x, y; - if (a->im_self == NULL) - x = _Py_HashPointer(Py_None); - else - x = _Py_HashPointer(a->im_self); + x = _Py_HashPointer(a->im_self); y = PyObject_Hash(a->im_func); if (y == -1) return -1; @@ -294,11 +291,6 @@ method_call(PyObject *method, PyObject *args, PyObject *kwargs) PyObject *self, *func; self = PyMethod_GET_SELF(method); - if (self == NULL) { - PyErr_BadInternalCall(); - return NULL; - } - func = PyMethod_GET_FUNCTION(method); return _PyObject_Call_Prepend(func, self, args, kwargs); @@ -307,15 +299,8 @@ method_call(PyObject *method, PyObject *args, PyObject *kwargs) static PyObject * method_descr_get(PyObject *meth, PyObject *obj, PyObject *cls) { - /* Don't rebind an already bound method of a class that's not a base - class of cls. */ - if (PyMethod_GET_SELF(meth) != NULL) { - /* Already bound */ - Py_INCREF(meth); - return meth; - } - /* Bind it to obj */ - return PyMethod_New(PyMethod_GET_FUNCTION(meth), obj); + Py_INCREF(meth); + return meth; } PyTypeObject PyMethod_Type = { From webhook-mailer at python.org Tue Mar 5 03:06:02 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Tue, 05 Mar 2019 08:06:02 -0000 Subject: [Python-checkins] bpo-22831: Use "with" to avoid possible fd leaks in tests (part 1). (GH-10928) Message-ID: https://github.com/python/cpython/commit/9e4861f52349011cd5916eef8e8344575e8ac426 commit: 9e4861f52349011cd5916eef8e8344575e8ac426 branch: master author: Serhiy Storchaka committer: GitHub date: 2019-03-05T10:05:57+02:00 summary: bpo-22831: Use "with" to avoid possible fd leaks in tests (part 1). (GH-10928) files: M Lib/test/test_dbm_dumb.py M Lib/test/test_mmap.py M Lib/test/test_socket.py M Lib/test/test_tarfile.py M Lib/test/test_zipfile64.py diff --git a/Lib/test/test_dbm_dumb.py b/Lib/test/test_dbm_dumb.py index a971359d33ff..0a60778207d9 100644 --- a/Lib/test/test_dbm_dumb.py +++ b/Lib/test/test_dbm_dumb.py @@ -2,6 +2,7 @@ Original by Roger E. Masse """ +import contextlib import io import operator import os @@ -32,12 +33,11 @@ class DumbDBMTestCase(unittest.TestCase): } def test_dumbdbm_creation(self): - f = dumbdbm.open(_fname, 'c') - self.assertEqual(list(f.keys()), []) - for key in self._dict: - f[key] = self._dict[key] - self.read_helper(f) - f.close() + with contextlib.closing(dumbdbm.open(_fname, 'c')) as f: + self.assertEqual(list(f.keys()), []) + for key in self._dict: + f[key] = self._dict[key] + self.read_helper(f) @unittest.skipUnless(hasattr(os, 'umask'), 'test needs os.umask()') def test_dumbdbm_creation_mode(self): @@ -69,78 +69,70 @@ def test_close_twice(self): def test_dumbdbm_modification(self): self.init_db() - f = dumbdbm.open(_fname, 'w') - self._dict[b'g'] = f[b'g'] = b"indented" - self.read_helper(f) - # setdefault() works as in the dict interface - self.assertEqual(f.setdefault(b'xxx', b'foo'), b'foo') - self.assertEqual(f[b'xxx'], b'foo') - f.close() + with contextlib.closing(dumbdbm.open(_fname, 'w')) as f: + self._dict[b'g'] = f[b'g'] = b"indented" + self.read_helper(f) + # setdefault() works as in the dict interface + self.assertEqual(f.setdefault(b'xxx', b'foo'), b'foo') + self.assertEqual(f[b'xxx'], b'foo') def test_dumbdbm_read(self): self.init_db() - f = dumbdbm.open(_fname, 'r') - self.read_helper(f) - with self.assertRaisesRegex(dumbdbm.error, - 'The database is opened for reading only'): - f[b'g'] = b'x' - with self.assertRaisesRegex(dumbdbm.error, - 'The database is opened for reading only'): - del f[b'a'] - # get() works as in the dict interface - self.assertEqual(f.get(b'a'), self._dict[b'a']) - self.assertEqual(f.get(b'xxx', b'foo'), b'foo') - self.assertIsNone(f.get(b'xxx')) - with self.assertRaises(KeyError): - f[b'xxx'] - f.close() + with contextlib.closing(dumbdbm.open(_fname, 'r')) as f: + self.read_helper(f) + with self.assertRaisesRegex(dumbdbm.error, + 'The database is opened for reading only'): + f[b'g'] = b'x' + with self.assertRaisesRegex(dumbdbm.error, + 'The database is opened for reading only'): + del f[b'a'] + # get() works as in the dict interface + self.assertEqual(f.get(b'a'), self._dict[b'a']) + self.assertEqual(f.get(b'xxx', b'foo'), b'foo') + self.assertIsNone(f.get(b'xxx')) + with self.assertRaises(KeyError): + f[b'xxx'] def test_dumbdbm_keys(self): self.init_db() - f = dumbdbm.open(_fname) - keys = self.keys_helper(f) - f.close() + with contextlib.closing(dumbdbm.open(_fname)) as f: + keys = self.keys_helper(f) def test_write_contains(self): - f = dumbdbm.open(_fname) - f[b'1'] = b'hello' - self.assertIn(b'1', f) - f.close() + with contextlib.closing(dumbdbm.open(_fname)) as f: + f[b'1'] = b'hello' + self.assertIn(b'1', f) def test_write_write_read(self): # test for bug #482460 - f = dumbdbm.open(_fname) - f[b'1'] = b'hello' - f[b'1'] = b'hello2' - f.close() - f = dumbdbm.open(_fname) - self.assertEqual(f[b'1'], b'hello2') - f.close() + with contextlib.closing(dumbdbm.open(_fname)) as f: + f[b'1'] = b'hello' + f[b'1'] = b'hello2' + with contextlib.closing(dumbdbm.open(_fname)) as f: + self.assertEqual(f[b'1'], b'hello2') def test_str_read(self): self.init_db() - f = dumbdbm.open(_fname, 'r') - self.assertEqual(f['\u00fc'], self._dict['\u00fc'.encode('utf-8')]) + with contextlib.closing(dumbdbm.open(_fname, 'r')) as f: + self.assertEqual(f['\u00fc'], self._dict['\u00fc'.encode('utf-8')]) def test_str_write_contains(self): self.init_db() - f = dumbdbm.open(_fname) - f['\u00fc'] = b'!' - f['1'] = 'a' - f.close() - f = dumbdbm.open(_fname, 'r') - self.assertIn('\u00fc', f) - self.assertEqual(f['\u00fc'.encode('utf-8')], - self._dict['\u00fc'.encode('utf-8')]) - self.assertEqual(f[b'1'], b'a') + with contextlib.closing(dumbdbm.open(_fname)) as f: + f['\u00fc'] = b'!' + f['1'] = 'a' + with contextlib.closing(dumbdbm.open(_fname, 'r')) as f: + self.assertIn('\u00fc', f) + self.assertEqual(f['\u00fc'.encode('utf-8')], + self._dict['\u00fc'.encode('utf-8')]) + self.assertEqual(f[b'1'], b'a') def test_line_endings(self): # test for bug #1172763: dumbdbm would die if the line endings # weren't what was expected. - f = dumbdbm.open(_fname) - f[b'1'] = b'hello' - f[b'2'] = b'hello2' - f.close() + with contextlib.closing(dumbdbm.open(_fname)) as f: + f[b'1'] = b'hello' + f[b'2'] = b'hello2' # Mangle the file by changing the line separator to Windows or Unix with io.open(_fname + '.dir', 'rb') as file: @@ -163,10 +155,9 @@ def read_helper(self, f): self.assertEqual(self._dict[key], f[key]) def init_db(self): - f = dumbdbm.open(_fname, 'n') - for k in self._dict: - f[k] = self._dict[k] - f.close() + with contextlib.closing(dumbdbm.open(_fname, 'n')) as f: + for k in self._dict: + f[k] = self._dict[k] def keys_helper(self, f): keys = sorted(f.keys()) @@ -180,25 +171,23 @@ def test_random(self): import random d = {} # mirror the database for dummy in range(5): - f = dumbdbm.open(_fname) - for dummy in range(100): - k = random.choice('abcdefghijklm') - if random.random() < 0.2: - if k in d: - del d[k] - del f[k] - else: - v = random.choice((b'a', b'b', b'c')) * random.randrange(10000) - d[k] = v - f[k] = v - self.assertEqual(f[k], v) - f.close() - - f = dumbdbm.open(_fname) - expected = sorted((k.encode("latin-1"), v) for k, v in d.items()) - got = sorted(f.items()) - self.assertEqual(expected, got) - f.close() + with contextlib.closing(dumbdbm.open(_fname)) as f: + for dummy in range(100): + k = random.choice('abcdefghijklm') + if random.random() < 0.2: + if k in d: + del d[k] + del f[k] + else: + v = random.choice((b'a', b'b', b'c')) * random.randrange(10000) + d[k] = v + f[k] = v + self.assertEqual(f[k], v) + + with contextlib.closing(dumbdbm.open(_fname)) as f: + expected = sorted((k.encode("latin-1"), v) for k, v in d.items()) + got = sorted(f.items()) + self.assertEqual(expected, got) def test_context_manager(self): with dumbdbm.open(_fname, 'c') as db: diff --git a/Lib/test/test_mmap.py b/Lib/test/test_mmap.py index 3e6ecfc95660..dd857a0632ae 100644 --- a/Lib/test/test_mmap.py +++ b/Lib/test/test_mmap.py @@ -268,13 +268,12 @@ def test_tougher_find(self): def test_find_end(self): # test the new 'end' parameter works as expected - f = open(TESTFN, 'wb+') - data = b'one two ones' - n = len(data) - f.write(data) - f.flush() - m = mmap.mmap(f.fileno(), n) - f.close() + with open(TESTFN, 'wb+') as f: + data = b'one two ones' + n = len(data) + f.write(data) + f.flush() + m = mmap.mmap(f.fileno(), n) self.assertEqual(m.find(b'one'), 0) self.assertEqual(m.find(b'ones'), 8) @@ -287,13 +286,12 @@ def test_find_end(self): def test_rfind(self): # test the new 'end' parameter works as expected - f = open(TESTFN, 'wb+') - data = b'one two ones' - n = len(data) - f.write(data) - f.flush() - m = mmap.mmap(f.fileno(), n) - f.close() + with open(TESTFN, 'wb+') as f: + data = b'one two ones' + n = len(data) + f.write(data) + f.flush() + m = mmap.mmap(f.fileno(), n) self.assertEqual(m.rfind(b'one'), 8) self.assertEqual(m.rfind(b'one '), 0) @@ -306,30 +304,23 @@ def test_rfind(self): def test_double_close(self): # make sure a double close doesn't crash on Solaris (Bug# 665913) - f = open(TESTFN, 'wb+') - - f.write(2**16 * b'a') # Arbitrary character - f.close() + with open(TESTFN, 'wb+') as f: + f.write(2**16 * b'a') # Arbitrary character - f = open(TESTFN, 'rb') - mf = mmap.mmap(f.fileno(), 2**16, access=mmap.ACCESS_READ) - mf.close() - mf.close() - f.close() + with open(TESTFN, 'rb') as f: + mf = mmap.mmap(f.fileno(), 2**16, access=mmap.ACCESS_READ) + mf.close() + mf.close() def test_entire_file(self): # test mapping of entire file by passing 0 for map length - f = open(TESTFN, "wb+") + with open(TESTFN, "wb+") as f: + f.write(2**16 * b'm') # Arbitrary character - f.write(2**16 * b'm') # Arbitrary character - f.close() - - f = open(TESTFN, "rb+") - mf = mmap.mmap(f.fileno(), 0) - self.assertEqual(len(mf), 2**16, "Map size should equal file size.") - self.assertEqual(mf.read(2**16), 2**16 * b"m") - mf.close() - f.close() + with open(TESTFN, "rb+") as f, \ + mmap.mmap(f.fileno(), 0) as mf: + self.assertEqual(len(mf), 2**16, "Map size should equal file size.") + self.assertEqual(mf.read(2**16), 2**16 * b"m") def test_length_0_offset(self): # Issue #10916: test mapping of remainder of file by passing 0 for @@ -355,16 +346,15 @@ def test_length_0_large_offset(self): def test_move(self): # make move works everywhere (64-bit format problem earlier) - f = open(TESTFN, 'wb+') + with open(TESTFN, 'wb+') as f: - f.write(b"ABCDEabcde") # Arbitrary character - f.flush() + f.write(b"ABCDEabcde") # Arbitrary character + f.flush() - mf = mmap.mmap(f.fileno(), 10) - mf.move(5, 0, 5) - self.assertEqual(mf[:], b"ABCDEABCDE", "Map move should have duplicated front 5") - mf.close() - f.close() + mf = mmap.mmap(f.fileno(), 10) + mf.move(5, 0, 5) + self.assertEqual(mf[:], b"ABCDEABCDE", "Map move should have duplicated front 5") + mf.close() # more excessive test data = b"0123456789" @@ -562,10 +552,9 @@ def test_prot_readonly(self): mapsize = 10 with open(TESTFN, "wb") as fp: fp.write(b"a"*mapsize) - f = open(TESTFN, "rb") - m = mmap.mmap(f.fileno(), mapsize, prot=mmap.PROT_READ) - self.assertRaises(TypeError, m.write, "foo") - f.close() + with open(TESTFN, "rb") as f: + m = mmap.mmap(f.fileno(), mapsize, prot=mmap.PROT_READ) + self.assertRaises(TypeError, m.write, "foo") def test_error(self): self.assertIs(mmap.error, OSError) @@ -574,9 +563,8 @@ def test_io_methods(self): data = b"0123456789" with open(TESTFN, "wb") as fp: fp.write(b"x"*len(data)) - f = open(TESTFN, "r+b") - m = mmap.mmap(f.fileno(), len(data)) - f.close() + with open(TESTFN, "r+b") as f: + m = mmap.mmap(f.fileno(), len(data)) # Test write_byte() for i in range(len(data)): self.assertEqual(m.tell(), i) diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 571f45c2b030..08c7cdef73dd 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -799,10 +799,9 @@ def test_csocket_repr(self): self.assertEqual(repr(s), expected) def test_weakref(self): - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - p = proxy(s) - self.assertEqual(p.fileno(), s.fileno()) - s.close() + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + p = proxy(s) + self.assertEqual(p.fileno(), s.fileno()) s = None try: p.fileno() @@ -1072,9 +1071,8 @@ def testDefaultTimeout(self): # Testing default timeout # The default timeout should initially be None self.assertEqual(socket.getdefaulttimeout(), None) - s = socket.socket() - self.assertEqual(s.gettimeout(), None) - s.close() + with socket.socket() as s: + self.assertEqual(s.gettimeout(), None) # Set the default timeout to 10, and see if it propagates with socket_setdefaulttimeout(10): @@ -1297,9 +1295,8 @@ def testSetSockOpt(self): def testSendAfterClose(self): # testing send() after close() with timeout - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - sock.settimeout(1) - sock.close() + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: + sock.settimeout(1) self.assertRaises(OSError, sock.send, b"spam") def testCloseException(self): @@ -1317,16 +1314,15 @@ def testCloseException(self): def testNewAttributes(self): # testing .family, .type and .protocol - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.assertEqual(sock.family, socket.AF_INET) - if hasattr(socket, 'SOCK_CLOEXEC'): - self.assertIn(sock.type, - (socket.SOCK_STREAM | socket.SOCK_CLOEXEC, - socket.SOCK_STREAM)) - else: - self.assertEqual(sock.type, socket.SOCK_STREAM) - self.assertEqual(sock.proto, 0) - sock.close() + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: + self.assertEqual(sock.family, socket.AF_INET) + if hasattr(socket, 'SOCK_CLOEXEC'): + self.assertIn(sock.type, + (socket.SOCK_STREAM | socket.SOCK_CLOEXEC, + socket.SOCK_STREAM)) + else: + self.assertEqual(sock.type, socket.SOCK_STREAM) + self.assertEqual(sock.proto, 0) def test_getsockaddrarg(self): sock = socket.socket() @@ -1601,10 +1597,9 @@ def test_listen_backlog(self): def test_listen_backlog_overflow(self): # Issue 15989 import _testcapi - srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - srv.bind((HOST, 0)) - self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1) - srv.close() + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv: + srv.bind((HOST, 0)) + self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1) @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.') def test_flowinfo(self): diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index 5e4d75ecfce1..5e5a3c3cea83 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -132,49 +132,47 @@ def test_fileobj_seek(self): data = fobj.read() tarinfo = self.tar.getmember("ustar/regtype") - fobj = self.tar.extractfile(tarinfo) - - text = fobj.read() - fobj.seek(0) - self.assertEqual(0, fobj.tell(), - "seek() to file's start failed") - fobj.seek(2048, 0) - self.assertEqual(2048, fobj.tell(), - "seek() to absolute position failed") - fobj.seek(-1024, 1) - self.assertEqual(1024, fobj.tell(), - "seek() to negative relative position failed") - fobj.seek(1024, 1) - self.assertEqual(2048, fobj.tell(), - "seek() to positive relative position failed") - s = fobj.read(10) - self.assertEqual(s, data[2048:2058], - "read() after seek failed") - fobj.seek(0, 2) - self.assertEqual(tarinfo.size, fobj.tell(), - "seek() to file's end failed") - self.assertEqual(fobj.read(), b"", - "read() at file's end did not return empty string") - fobj.seek(-tarinfo.size, 2) - self.assertEqual(0, fobj.tell(), - "relative seek() to file's end failed") - fobj.seek(512) - s1 = fobj.readlines() - fobj.seek(512) - s2 = fobj.readlines() - self.assertEqual(s1, s2, - "readlines() after seek failed") - fobj.seek(0) - self.assertEqual(len(fobj.readline()), fobj.tell(), - "tell() after readline() failed") - fobj.seek(512) - self.assertEqual(len(fobj.readline()) + 512, fobj.tell(), - "tell() after seek() and readline() failed") - fobj.seek(0) - line = fobj.readline() - self.assertEqual(fobj.read(), data[len(line):], - "read() after readline() failed") - fobj.close() + with self.tar.extractfile(tarinfo) as fobj: + text = fobj.read() + fobj.seek(0) + self.assertEqual(0, fobj.tell(), + "seek() to file's start failed") + fobj.seek(2048, 0) + self.assertEqual(2048, fobj.tell(), + "seek() to absolute position failed") + fobj.seek(-1024, 1) + self.assertEqual(1024, fobj.tell(), + "seek() to negative relative position failed") + fobj.seek(1024, 1) + self.assertEqual(2048, fobj.tell(), + "seek() to positive relative position failed") + s = fobj.read(10) + self.assertEqual(s, data[2048:2058], + "read() after seek failed") + fobj.seek(0, 2) + self.assertEqual(tarinfo.size, fobj.tell(), + "seek() to file's end failed") + self.assertEqual(fobj.read(), b"", + "read() at file's end did not return empty string") + fobj.seek(-tarinfo.size, 2) + self.assertEqual(0, fobj.tell(), + "relative seek() to file's end failed") + fobj.seek(512) + s1 = fobj.readlines() + fobj.seek(512) + s2 = fobj.readlines() + self.assertEqual(s1, s2, + "readlines() after seek failed") + fobj.seek(0) + self.assertEqual(len(fobj.readline()), fobj.tell(), + "tell() after readline() failed") + fobj.seek(512) + self.assertEqual(len(fobj.readline()) + 512, fobj.tell(), + "tell() after seek() and readline() failed") + fobj.seek(0) + line = fobj.readline() + self.assertEqual(fobj.read(), data[len(line):], + "read() after readline() failed") def test_fileobj_text(self): with self.tar.extractfile("ustar/regtype") as fobj: @@ -486,15 +484,14 @@ def test_fileobj_with_offset(self): fobj.seek(offset) # Test if the tarfile starts with the second member. - tar = tar.open(self.tarname, mode="r:", fileobj=fobj) - t = tar.next() - self.assertEqual(t.name, name) - # Read to the end of fileobj and test if seeking back to the - # beginning works. - tar.getmembers() - self.assertEqual(tar.extractfile(t).read(), data, - "seek back did not work") - tar.close() + with tar.open(self.tarname, mode="r:", fileobj=fobj) as tar: + t = tar.next() + self.assertEqual(t.name, name) + # Read to the end of fileobj and test if seeking back to the + # beginning works. + tar.getmembers() + self.assertEqual(tar.extractfile(t).read(), data, + "seek back did not work") def test_fail_comp(self): # For Gzip and Bz2 Tests: fail with a ReadError on an uncompressed file. @@ -1042,9 +1039,8 @@ class WriteTestBase(TarTest): def test_fileobj_no_close(self): fobj = io.BytesIO() - tar = tarfile.open(fileobj=fobj, mode=self.mode) - tar.addfile(tarfile.TarInfo("foo")) - tar.close() + with tarfile.open(fileobj=fobj, mode=self.mode) as tar: + tar.addfile(tarfile.TarInfo("foo")) self.assertFalse(fobj.closed, "external fileobjs must never closed") # Issue #20238: Incomplete gzip output with mode="w:gz" data = fobj.getvalue() @@ -1306,19 +1302,16 @@ def test_extractall_symlinks(self): with open(source_file,'w') as f: f.write('something\n') os.symlink(source_file, target_file) - tar = tarfile.open(temparchive,'w') - tar.add(source_file) - tar.add(target_file) - tar.close() + with tarfile.open(temparchive, 'w') as tar: + tar.add(source_file) + tar.add(target_file) # Let's extract it to the location which contains the symlink - tar = tarfile.open(temparchive,'r') - # this should not raise OSError: [Errno 17] File exists - try: - tar.extractall(path=tempdir) - except OSError: - self.fail("extractall failed with symlinked files") - finally: - tar.close() + with tarfile.open(temparchive) as tar: + # this should not raise OSError: [Errno 17] File exists + try: + tar.extractall(path=tempdir) + except OSError: + self.fail("extractall failed with symlinked files") finally: support.unlink(temparchive) support.rmtree(tempdir) diff --git a/Lib/test/test_zipfile64.py b/Lib/test/test_zipfile64.py index 524dcf021324..56746bc08f63 100644 --- a/Lib/test/test_zipfile64.py +++ b/Lib/test/test_zipfile64.py @@ -31,42 +31,39 @@ def setUp(self): self.data = '\n'.join(line_gen).encode('ascii') # And write it to a file. - fp = open(TESTFN, "wb") - fp.write(self.data) - fp.close() + with open(TESTFN, "wb") as fp: + fp.write(self.data) def zipTest(self, f, compression): # Create the ZIP archive. - zipfp = zipfile.ZipFile(f, "w", compression) - - # It will contain enough copies of self.data to reach about 6 GiB of - # raw data to store. - filecount = 6*1024**3 // len(self.data) - - next_time = time.monotonic() + _PRINT_WORKING_MSG_INTERVAL - for num in range(filecount): - zipfp.writestr("testfn%d" % num, self.data) - # Print still working message since this test can be really slow - if next_time <= time.monotonic(): - next_time = time.monotonic() + _PRINT_WORKING_MSG_INTERVAL - print(( - ' zipTest still writing %d of %d, be patient...' % - (num, filecount)), file=sys.__stdout__) - sys.__stdout__.flush() - zipfp.close() + with zipfile.ZipFile(f, "w", compression) as zipfp: + + # It will contain enough copies of self.data to reach about 6 GiB of + # raw data to store. + filecount = 6*1024**3 // len(self.data) + + next_time = time.monotonic() + _PRINT_WORKING_MSG_INTERVAL + for num in range(filecount): + zipfp.writestr("testfn%d" % num, self.data) + # Print still working message since this test can be really slow + if next_time <= time.monotonic(): + next_time = time.monotonic() + _PRINT_WORKING_MSG_INTERVAL + print(( + ' zipTest still writing %d of %d, be patient...' % + (num, filecount)), file=sys.__stdout__) + sys.__stdout__.flush() # Read the ZIP archive - zipfp = zipfile.ZipFile(f, "r", compression) - for num in range(filecount): - self.assertEqual(zipfp.read("testfn%d" % num), self.data) - # Print still working message since this test can be really slow - if next_time <= time.monotonic(): - next_time = time.monotonic() + _PRINT_WORKING_MSG_INTERVAL - print(( - ' zipTest still reading %d of %d, be patient...' % - (num, filecount)), file=sys.__stdout__) - sys.__stdout__.flush() - zipfp.close() + with zipfile.ZipFile(f, "r", compression) as zipfp: + for num in range(filecount): + self.assertEqual(zipfp.read("testfn%d" % num), self.data) + # Print still working message since this test can be really slow + if next_time <= time.monotonic(): + next_time = time.monotonic() + _PRINT_WORKING_MSG_INTERVAL + print(( + ' zipTest still reading %d of %d, be patient...' % + (num, filecount)), file=sys.__stdout__) + sys.__stdout__.flush() def testStored(self): # Try the temp file first. If we do TESTFN2 first, then it hogs @@ -95,56 +92,50 @@ class OtherTests(unittest.TestCase): def testMoreThan64kFiles(self): # This test checks that more than 64k files can be added to an archive, # and that the resulting archive can be read properly by ZipFile - zipf = zipfile.ZipFile(TESTFN, mode="w", allowZip64=True) - zipf.debug = 100 - numfiles = (1 << 16) * 3//2 - for i in range(numfiles): - zipf.writestr("foo%08d" % i, "%d" % (i**3 % 57)) - self.assertEqual(len(zipf.namelist()), numfiles) - zipf.close() - - zipf2 = zipfile.ZipFile(TESTFN, mode="r") - self.assertEqual(len(zipf2.namelist()), numfiles) - for i in range(numfiles): - content = zipf2.read("foo%08d" % i).decode('ascii') - self.assertEqual(content, "%d" % (i**3 % 57)) - zipf2.close() + with zipfile.ZipFile(TESTFN, mode="w", allowZip64=True) as zipf: + zipf.debug = 100 + numfiles = (1 << 16) * 3//2 + for i in range(numfiles): + zipf.writestr("foo%08d" % i, "%d" % (i**3 % 57)) + self.assertEqual(len(zipf.namelist()), numfiles) + + with zipfile.ZipFile(TESTFN, mode="r") as zipf2: + self.assertEqual(len(zipf2.namelist()), numfiles) + for i in range(numfiles): + content = zipf2.read("foo%08d" % i).decode('ascii') + self.assertEqual(content, "%d" % (i**3 % 57)) def testMoreThan64kFilesAppend(self): - zipf = zipfile.ZipFile(TESTFN, mode="w", allowZip64=False) - zipf.debug = 100 - numfiles = (1 << 16) - 1 - for i in range(numfiles): - zipf.writestr("foo%08d" % i, "%d" % (i**3 % 57)) - self.assertEqual(len(zipf.namelist()), numfiles) - with self.assertRaises(zipfile.LargeZipFile): - zipf.writestr("foo%08d" % numfiles, b'') - self.assertEqual(len(zipf.namelist()), numfiles) - zipf.close() - - zipf = zipfile.ZipFile(TESTFN, mode="a", allowZip64=False) - zipf.debug = 100 - self.assertEqual(len(zipf.namelist()), numfiles) - with self.assertRaises(zipfile.LargeZipFile): - zipf.writestr("foo%08d" % numfiles, b'') - self.assertEqual(len(zipf.namelist()), numfiles) - zipf.close() - - zipf = zipfile.ZipFile(TESTFN, mode="a", allowZip64=True) - zipf.debug = 100 - self.assertEqual(len(zipf.namelist()), numfiles) - numfiles2 = (1 << 16) * 3//2 - for i in range(numfiles, numfiles2): - zipf.writestr("foo%08d" % i, "%d" % (i**3 % 57)) - self.assertEqual(len(zipf.namelist()), numfiles2) - zipf.close() - - zipf2 = zipfile.ZipFile(TESTFN, mode="r") - self.assertEqual(len(zipf2.namelist()), numfiles2) - for i in range(numfiles2): - content = zipf2.read("foo%08d" % i).decode('ascii') - self.assertEqual(content, "%d" % (i**3 % 57)) - zipf2.close() + with zipfile.ZipFile(TESTFN, mode="w", allowZip64=False) as zipf: + zipf.debug = 100 + numfiles = (1 << 16) - 1 + for i in range(numfiles): + zipf.writestr("foo%08d" % i, "%d" % (i**3 % 57)) + self.assertEqual(len(zipf.namelist()), numfiles) + with self.assertRaises(zipfile.LargeZipFile): + zipf.writestr("foo%08d" % numfiles, b'') + self.assertEqual(len(zipf.namelist()), numfiles) + + with zipfile.ZipFile(TESTFN, mode="a", allowZip64=False) as zipf: + zipf.debug = 100 + self.assertEqual(len(zipf.namelist()), numfiles) + with self.assertRaises(zipfile.LargeZipFile): + zipf.writestr("foo%08d" % numfiles, b'') + self.assertEqual(len(zipf.namelist()), numfiles) + + with zipfile.ZipFile(TESTFN, mode="a", allowZip64=True) as zipf: + zipf.debug = 100 + self.assertEqual(len(zipf.namelist()), numfiles) + numfiles2 = (1 << 16) * 3//2 + for i in range(numfiles, numfiles2): + zipf.writestr("foo%08d" % i, "%d" % (i**3 % 57)) + self.assertEqual(len(zipf.namelist()), numfiles2) + + with zipfile.ZipFile(TESTFN, mode="r") as zipf2: + self.assertEqual(len(zipf2.namelist()), numfiles2) + for i in range(numfiles2): + content = zipf2.read("foo%08d" % i).decode('ascii') + self.assertEqual(content, "%d" % (i**3 % 57)) def tearDown(self): support.unlink(TESTFN) From webhook-mailer at python.org Tue Mar 5 03:06:30 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Tue, 05 Mar 2019 08:06:30 -0000 Subject: [Python-checkins] bpo-22831: Use "with" to avoid possible fd leaks in tests (part 2). (GH-10929) Message-ID: https://github.com/python/cpython/commit/5b10b9824780b2181158902067912ee9e7b04657 commit: 5b10b9824780b2181158902067912ee9e7b04657 branch: master author: Serhiy Storchaka committer: GitHub date: 2019-03-05T10:06:26+02:00 summary: bpo-22831: Use "with" to avoid possible fd leaks in tests (part 2). (GH-10929) files: M Lib/test/support/__init__.py M Lib/test/support/script_helper.py M Lib/test/test_argparse.py M Lib/test/test_binhex.py M Lib/test/test_bool.py M Lib/test/test_codecs.py M Lib/test/test_epoll.py M Lib/test/test_float.py M Lib/test/test_ioctl.py M Lib/test/test_os.py M Lib/test/test_pipes.py M Lib/test/test_poll.py M Lib/test/test_random.py M Lib/test/test_runpy.py M Lib/test/test_select.py M Lib/test/test_shelve.py M Lib/test/test_site.py M Lib/test/test_socketserver.py M Lib/test/test_tempfile.py M Lib/test/test_threading.py M Lib/test/test_urllib2.py M Lib/test/test_urllib2_localnet.py M Lib/test/test_xmlrpc.py M Lib/test/test_zipimport.py M Lib/test/test_zipimport_support.py diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index c0938d90010a..5bd15a2feae9 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -706,9 +706,8 @@ def find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM): issue if/when we come across it. """ - tempsock = socket.socket(family, socktype) - port = bind_port(tempsock) - tempsock.close() + with socket.socket(family, socktype) as tempsock: + port = bind_port(tempsock) del tempsock return port @@ -1785,10 +1784,11 @@ def start(self): sys.stderr.flush() return - watchdog_script = findfile("memory_watchdog.py") - self.mem_watchdog = subprocess.Popen([sys.executable, watchdog_script], - stdin=f, stderr=subprocess.DEVNULL) - f.close() + with f: + watchdog_script = findfile("memory_watchdog.py") + self.mem_watchdog = subprocess.Popen([sys.executable, watchdog_script], + stdin=f, + stderr=subprocess.DEVNULL) self.started = True def stop(self): diff --git a/Lib/test/support/script_helper.py b/Lib/test/support/script_helper.py index 64b25aab8004..27a47f2c4e66 100644 --- a/Lib/test/support/script_helper.py +++ b/Lib/test/support/script_helper.py @@ -205,31 +205,28 @@ def make_script(script_dir, script_basename, source, omit_suffix=False): script_filename += os.extsep + 'py' script_name = os.path.join(script_dir, script_filename) # The script should be encoded to UTF-8, the default string encoding - script_file = open(script_name, 'w', encoding='utf-8') - script_file.write(source) - script_file.close() + with open(script_name, 'w', encoding='utf-8') as script_file: + script_file.write(source) importlib.invalidate_caches() return script_name def make_zip_script(zip_dir, zip_basename, script_name, name_in_zip=None): zip_filename = zip_basename+os.extsep+'zip' zip_name = os.path.join(zip_dir, zip_filename) - zip_file = zipfile.ZipFile(zip_name, 'w') - if name_in_zip is None: - parts = script_name.split(os.sep) - if len(parts) >= 2 and parts[-2] == '__pycache__': - legacy_pyc = make_legacy_pyc(source_from_cache(script_name)) - name_in_zip = os.path.basename(legacy_pyc) - script_name = legacy_pyc - else: - name_in_zip = os.path.basename(script_name) - zip_file.write(script_name, name_in_zip) - zip_file.close() + with zipfile.ZipFile(zip_name, 'w') as zip_file: + if name_in_zip is None: + parts = script_name.split(os.sep) + if len(parts) >= 2 and parts[-2] == '__pycache__': + legacy_pyc = make_legacy_pyc(source_from_cache(script_name)) + name_in_zip = os.path.basename(legacy_pyc) + script_name = legacy_pyc + else: + name_in_zip = os.path.basename(script_name) + zip_file.write(script_name, name_in_zip) #if test.support.verbose: - # zip_file = zipfile.ZipFile(zip_name, 'r') - # print 'Contents of %r:' % zip_name - # zip_file.printdir() - # zip_file.close() + # with zipfile.ZipFile(zip_name, 'r') as zip_file: + # print 'Contents of %r:' % zip_name + # zip_file.printdir() return zip_name, os.path.join(zip_name, name_in_zip) def make_pkg(pkg_dir, init_source=''): @@ -252,17 +249,15 @@ def make_zip_pkg(zip_dir, zip_basename, pkg_name, script_basename, script_name_in_zip = os.path.join(pkg_names[-1], os.path.basename(script_name)) zip_filename = zip_basename+os.extsep+'zip' zip_name = os.path.join(zip_dir, zip_filename) - zip_file = zipfile.ZipFile(zip_name, 'w') - for name in pkg_names: - init_name_in_zip = os.path.join(name, init_basename) - zip_file.write(init_name, init_name_in_zip) - zip_file.write(script_name, script_name_in_zip) - zip_file.close() + with zipfile.ZipFile(zip_name, 'w') as zip_file: + for name in pkg_names: + init_name_in_zip = os.path.join(name, init_basename) + zip_file.write(init_name, init_name_in_zip) + zip_file.write(script_name, script_name_in_zip) for name in unlink: os.unlink(name) #if test.support.verbose: - # zip_file = zipfile.ZipFile(zip_name, 'r') - # print 'Contents of %r:' % zip_name - # zip_file.printdir() - # zip_file.close() + # with zipfile.ZipFile(zip_name, 'r') as zip_file: + # print 'Contents of %r:' % zip_name + # zip_file.printdir() return zip_name, os.path.join(zip_name, script_name_in_zip) diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index c0c7cb05940b..e849c7ba49bc 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -1379,9 +1379,8 @@ def setUp(self): ('invalid', '@no-such-path\n'), ] for path, text in file_texts: - file = open(path, 'w') - file.write(text) - file.close() + with open(path, 'w') as file: + file.write(text) parser_signature = Sig(fromfile_prefix_chars='@') argument_signatures = [ @@ -1410,9 +1409,8 @@ def setUp(self): ('hello', 'hello world!\n'), ] for path, text in file_texts: - file = open(path, 'w') - file.write(text) - file.close() + with open(path, 'w') as file: + file.write(text) class FromFileConverterArgumentParser(ErrorRaisingArgumentParser): @@ -1493,9 +1491,8 @@ class TestFileTypeR(TempDirMixin, ParserTestCase): def setUp(self): super(TestFileTypeR, self).setUp() for file_name in ['foo', 'bar']: - file = open(os.path.join(self.temp_dir, file_name), 'w') - file.write(file_name) - file.close() + with open(os.path.join(self.temp_dir, file_name), 'w') as file: + file.write(file_name) self.create_readonly_file('readonly') argument_signatures = [ @@ -1534,9 +1531,8 @@ class TestFileTypeRB(TempDirMixin, ParserTestCase): def setUp(self): super(TestFileTypeRB, self).setUp() for file_name in ['foo', 'bar']: - file = open(os.path.join(self.temp_dir, file_name), 'w') - file.write(file_name) - file.close() + with open(os.path.join(self.temp_dir, file_name), 'w') as file: + file.write(file_name) argument_signatures = [ Sig('-x', type=argparse.FileType('rb')), diff --git a/Lib/test/test_binhex.py b/Lib/test/test_binhex.py index 21f446325a08..2f3d53afbd13 100644 --- a/Lib/test/test_binhex.py +++ b/Lib/test/test_binhex.py @@ -23,17 +23,15 @@ def tearDown(self): DATA = b'Jack is my hero' def test_binhex(self): - f = open(self.fname1, 'wb') - f.write(self.DATA) - f.close() + with open(self.fname1, 'wb') as f: + f.write(self.DATA) binhex.binhex(self.fname1, self.fname2) binhex.hexbin(self.fname2, self.fname1) - f = open(self.fname1, 'rb') - finish = f.readline() - f.close() + with open(self.fname1, 'rb') as f: + finish = f.readline() self.assertEqual(self.DATA, finish) diff --git a/Lib/test/test_bool.py b/Lib/test/test_bool.py index c5a1f1f2c2b2..909a59a9d2af 100644 --- a/Lib/test/test_bool.py +++ b/Lib/test/test_bool.py @@ -20,13 +20,11 @@ class C(bool): def test_print(self): try: - fo = open(support.TESTFN, "w") - print(False, True, file=fo) - fo.close() - fo = open(support.TESTFN, "r") - self.assertEqual(fo.read(), 'False True\n') + with open(support.TESTFN, "w") as fo: + print(False, True, file=fo) + with open(support.TESTFN, "r") as fi: + self.assertEqual(fi.read(), 'False True\n') finally: - fo.close() os.remove(support.TESTFN) def test_repr(self): @@ -245,9 +243,8 @@ def test_boolean(self): def test_fileclosed(self): try: - f = open(support.TESTFN, "w") - self.assertIs(f.closed, False) - f.close() + with open(support.TESTFN, "w") as f: + self.assertIs(f.closed, False) self.assertIs(f.closed, True) finally: os.remove(support.TESTFN) diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index 79cddb8715b2..893212e243ef 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -1242,9 +1242,8 @@ def test_errors(self): class RecodingTest(unittest.TestCase): def test_recoding(self): f = io.BytesIO() - f2 = codecs.EncodedFile(f, "unicode_internal", "utf-8") - f2.write("a") - f2.close() + with codecs.EncodedFile(f, "unicode_internal", "utf-8") as f2: + f2.write("a") # Python used to crash on this at exit because of a refcount # bug in _codecsmodule.c diff --git a/Lib/test/test_epoll.py b/Lib/test/test_epoll.py index efb54f42deb3..53ce1d55ff9c 100644 --- a/Lib/test/test_epoll.py +++ b/Lib/test/test_epoll.py @@ -143,18 +143,17 @@ def test_add(self): def test_fromfd(self): server, client = self._connected_pair() - ep = select.epoll(2) - ep2 = select.epoll.fromfd(ep.fileno()) + with select.epoll(2) as ep: + ep2 = select.epoll.fromfd(ep.fileno()) - ep2.register(server.fileno(), select.EPOLLIN | select.EPOLLOUT) - ep2.register(client.fileno(), select.EPOLLIN | select.EPOLLOUT) + ep2.register(server.fileno(), select.EPOLLIN | select.EPOLLOUT) + ep2.register(client.fileno(), select.EPOLLIN | select.EPOLLOUT) - events = ep.poll(1, 4) - events2 = ep2.poll(0.9, 4) - self.assertEqual(len(events), 2) - self.assertEqual(len(events2), 2) + events = ep.poll(1, 4) + events2 = ep2.poll(0.9, 4) + self.assertEqual(len(events), 2) + self.assertEqual(len(events2), 2) - ep.close() try: ep2.poll(1, 4) except OSError as e: diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py index 49c1fbcd4ef8..5278d716de23 100644 --- a/Lib/test/test_float.py +++ b/Lib/test/test_float.py @@ -722,15 +722,14 @@ def test_issue35560(self): class ReprTestCase(unittest.TestCase): def test_repr(self): - floats_file = open(os.path.join(os.path.split(__file__)[0], - 'floating_points.txt')) - for line in floats_file: - line = line.strip() - if not line or line.startswith('#'): - continue - v = eval(line) - self.assertEqual(v, eval(repr(v))) - floats_file.close() + with open(os.path.join(os.path.split(__file__)[0], + 'floating_points.txt')) as floats_file: + for line in floats_file: + line = line.strip() + if not line or line.startswith('#'): + continue + v = eval(line) + self.assertEqual(v, eval(repr(v))) @unittest.skipUnless(getattr(sys, 'float_repr_style', '') == 'short', "applies only when using short float repr style") diff --git a/Lib/test/test_ioctl.py b/Lib/test/test_ioctl.py index b82b65135aa3..d1a5db90810d 100644 --- a/Lib/test/test_ioctl.py +++ b/Lib/test/test_ioctl.py @@ -11,9 +11,9 @@ except OSError: raise unittest.SkipTest("Unable to open /dev/tty") else: - # Skip if another process is in foreground - r = fcntl.ioctl(tty, termios.TIOCGPGRP, " ") - tty.close() + with tty: + # Skip if another process is in foreground + r = fcntl.ioctl(tty, termios.TIOCGPGRP, " ") rpgrp = struct.unpack("i", r)[0] if rpgrp not in (os.getpgrp(), os.getsid(0)): raise unittest.SkipTest("Neither the process group nor the session " diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 2340b848d9b7..746be1239bb4 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -1200,9 +1200,8 @@ def test_exist_ok_s_isgid_directory(self): def test_exist_ok_existing_regular_file(self): base = support.TESTFN path = os.path.join(support.TESTFN, 'dir1') - f = open(path, 'w') - f.write('abc') - f.close() + with open(path, 'w') as f: + f.write('abc') self.assertRaises(OSError, os.makedirs, path) self.assertRaises(OSError, os.makedirs, path, exist_ok=False) self.assertRaises(OSError, os.makedirs, path, exist_ok=True) diff --git a/Lib/test/test_pipes.py b/Lib/test/test_pipes.py index ad01d08481c3..1d538b9898b8 100644 --- a/Lib/test/test_pipes.py +++ b/Lib/test/test_pipes.py @@ -23,9 +23,8 @@ def testSimplePipe1(self): self.skipTest('tr is not available') t = pipes.Template() t.append(s_command, pipes.STDIN_STDOUT) - f = t.open(TESTFN, 'w') - f.write('hello world #1') - f.close() + with t.open(TESTFN, 'w') as f: + f.write('hello world #1') with open(TESTFN) as f: self.assertEqual(f.read(), 'HELLO WORLD #1') diff --git a/Lib/test/test_poll.py b/Lib/test/test_poll.py index 445032dfb841..ef966bf0f560 100644 --- a/Lib/test/test_poll.py +++ b/Lib/test/test_poll.py @@ -83,13 +83,12 @@ def test_poll_unit_tests(self): r = p.poll() self.assertEqual(r[0], (FD, select.POLLNVAL)) - f = open(TESTFN, 'w') - fd = f.fileno() - p = select.poll() - p.register(f) - r = p.poll() - self.assertEqual(r[0][0], fd) - f.close() + with open(TESTFN, 'w') as f: + fd = f.fileno() + p = select.poll() + p.register(f) + r = p.poll() + self.assertEqual(r[0][0], fd) r = p.poll() self.assertEqual(r[0], (fd, select.POLLNVAL)) os.unlink(TESTFN) diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py index b35cb39e751b..e818a7b28d43 100644 --- a/Lib/test/test_random.py +++ b/Lib/test/test_random.py @@ -268,9 +268,8 @@ def test_bug_1727780(self): ("randv2_64.pck", 866), ("randv3.pck", 343)] for file, value in files: - f = open(support.findfile(file),"rb") - r = pickle.load(f) - f.close() + with open(support.findfile(file),"rb") as f: + r = pickle.load(f) self.assertEqual(int(r.random()*1000), value) def test_bug_9025(self): diff --git a/Lib/test/test_runpy.py b/Lib/test/test_runpy.py index 02b4d62567e5..800b483b7e15 100644 --- a/Lib/test/test_runpy.py +++ b/Lib/test/test_runpy.py @@ -238,9 +238,8 @@ def _make_pkg(self, source, depth, mod_base="runpy_test", if verbose > 1: print(" Next level in:", sub_dir) if verbose > 1: print(" Created:", pkg_fname) mod_fname = os.path.join(sub_dir, test_fname) - mod_file = open(mod_fname, "w") - mod_file.write(source) - mod_file.close() + with open(mod_fname, "w") as mod_file: + mod_file.write(source) if verbose > 1: print(" Created:", mod_fname) mod_name = (pkg_name+".")*depth + mod_base mod_spec = importlib.util.spec_from_file_location(mod_name, diff --git a/Lib/test/test_select.py b/Lib/test/test_select.py index a973f3f48d6a..458998a62fdf 100644 --- a/Lib/test/test_select.py +++ b/Lib/test/test_select.py @@ -46,24 +46,23 @@ def test_returned_list_identity(self): def test_select(self): cmd = 'for i in 0 1 2 3 4 5 6 7 8 9; do echo testing...; sleep 1; done' - p = os.popen(cmd, 'r') - for tout in (0, 1, 2, 4, 8, 16) + (None,)*10: - if support.verbose: - print('timeout =', tout) - rfd, wfd, xfd = select.select([p], [], [], tout) - if (rfd, wfd, xfd) == ([], [], []): - continue - if (rfd, wfd, xfd) == ([p], [], []): - line = p.readline() + with os.popen(cmd) as p: + for tout in (0, 1, 2, 4, 8, 16) + (None,)*10: if support.verbose: - print(repr(line)) - if not line: + print('timeout =', tout) + rfd, wfd, xfd = select.select([p], [], [], tout) + if (rfd, wfd, xfd) == ([], [], []): + continue + if (rfd, wfd, xfd) == ([p], [], []): + line = p.readline() if support.verbose: - print('EOF') - break - continue - self.fail('Unexpected return values from select():', rfd, wfd, xfd) - p.close() + print(repr(line)) + if not line: + if support.verbose: + print('EOF') + break + continue + self.fail('Unexpected return values from select():', rfd, wfd, xfd) # Issue 16230: Crash on select resized list def test_select_mutated(self): diff --git a/Lib/test/test_shelve.py b/Lib/test/test_shelve.py index b71af2bac740..9ffe2cbeae4d 100644 --- a/Lib/test/test_shelve.py +++ b/Lib/test/test_shelve.py @@ -88,15 +88,13 @@ def test_proto2_file_shelf(self): def test_in_memory_shelf(self): d1 = byteskeydict() - s = shelve.Shelf(d1, protocol=0) - s['key1'] = (1,2,3,4) - self.assertEqual(s['key1'], (1,2,3,4)) - s.close() + with shelve.Shelf(d1, protocol=0) as s: + s['key1'] = (1,2,3,4) + self.assertEqual(s['key1'], (1,2,3,4)) d2 = byteskeydict() - s = shelve.Shelf(d2, protocol=1) - s['key1'] = (1,2,3,4) - self.assertEqual(s['key1'], (1,2,3,4)) - s.close() + with shelve.Shelf(d2, protocol=1) as s: + s['key1'] = (1,2,3,4) + self.assertEqual(s['key1'], (1,2,3,4)) self.assertEqual(len(d1), 1) self.assertEqual(len(d2), 1) @@ -104,20 +102,18 @@ def test_in_memory_shelf(self): def test_mutable_entry(self): d1 = byteskeydict() - s = shelve.Shelf(d1, protocol=2, writeback=False) - s['key1'] = [1,2,3,4] - self.assertEqual(s['key1'], [1,2,3,4]) - s['key1'].append(5) - self.assertEqual(s['key1'], [1,2,3,4]) - s.close() + with shelve.Shelf(d1, protocol=2, writeback=False) as s: + s['key1'] = [1,2,3,4] + self.assertEqual(s['key1'], [1,2,3,4]) + s['key1'].append(5) + self.assertEqual(s['key1'], [1,2,3,4]) d2 = byteskeydict() - s = shelve.Shelf(d2, protocol=2, writeback=True) - s['key1'] = [1,2,3,4] - self.assertEqual(s['key1'], [1,2,3,4]) - s['key1'].append(5) - self.assertEqual(s['key1'], [1,2,3,4,5]) - s.close() + with shelve.Shelf(d2, protocol=2, writeback=True) as s: + s['key1'] = [1,2,3,4] + self.assertEqual(s['key1'], [1,2,3,4]) + s['key1'].append(5) + self.assertEqual(s['key1'], [1,2,3,4,5]) self.assertEqual(len(d1), 1) self.assertEqual(len(d2), 1) @@ -140,11 +136,10 @@ def test_writeback_also_writes_immediately(self): d = {} key = 'key' encodedkey = key.encode('utf-8') - s = shelve.Shelf(d, writeback=True) - s[key] = [1] - p1 = d[encodedkey] # Will give a KeyError if backing store not updated - s['key'].append(2) - s.close() + with shelve.Shelf(d, writeback=True) as s: + s[key] = [1] + p1 = d[encodedkey] # Will give a KeyError if backing store not updated + s['key'].append(2) p2 = d[encodedkey] self.assertNotEqual(p1, p2) # Write creates new object in store diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py index 8f04728ad188..8643da0540f3 100644 --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -125,10 +125,9 @@ def make_pth(self, contents, pth_dir='.', pth_name=TESTFN): pth_dir = os.path.abspath(pth_dir) pth_basename = pth_name + '.pth' pth_fn = os.path.join(pth_dir, pth_basename) - pth_file = open(pth_fn, 'w', encoding='utf-8') - self.addCleanup(lambda: os.remove(pth_fn)) - pth_file.write(contents) - pth_file.close() + with open(pth_fn, 'w', encoding='utf-8') as pth_file: + self.addCleanup(lambda: os.remove(pth_fn)) + pth_file.write(contents) return pth_dir, pth_basename def test_addpackage_import_bad_syntax(self): diff --git a/Lib/test/test_socketserver.py b/Lib/test/test_socketserver.py index 6584ba5ba864..8aed4b61a237 100644 --- a/Lib/test/test_socketserver.py +++ b/Lib/test/test_socketserver.py @@ -157,27 +157,25 @@ def run_server(self, svrcls, hdlrbase, testfunc): if verbose: print("done") def stream_examine(self, proto, addr): - s = socket.socket(proto, socket.SOCK_STREAM) - s.connect(addr) - s.sendall(TEST_STR) - buf = data = receive(s, 100) - while data and b'\n' not in buf: - data = receive(s, 100) - buf += data - self.assertEqual(buf, TEST_STR) - s.close() + with socket.socket(proto, socket.SOCK_STREAM) as s: + s.connect(addr) + s.sendall(TEST_STR) + buf = data = receive(s, 100) + while data and b'\n' not in buf: + data = receive(s, 100) + buf += data + self.assertEqual(buf, TEST_STR) def dgram_examine(self, proto, addr): - s = socket.socket(proto, socket.SOCK_DGRAM) - if HAVE_UNIX_SOCKETS and proto == socket.AF_UNIX: - s.bind(self.pickaddr(proto)) - s.sendto(TEST_STR, addr) - buf = data = receive(s, 100) - while data and b'\n' not in buf: - data = receive(s, 100) - buf += data - self.assertEqual(buf, TEST_STR) - s.close() + with socket.socket(proto, socket.SOCK_DGRAM) as s: + if HAVE_UNIX_SOCKETS and proto == socket.AF_UNIX: + s.bind(self.pickaddr(proto)) + s.sendto(TEST_STR, addr) + buf = data = receive(s, 100) + while data and b'\n' not in buf: + data = receive(s, 100) + buf += data + self.assertEqual(buf, TEST_STR) def test_TCPServer(self): self.run_server(socketserver.TCPServer, diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py index 3c0b9a74e5c8..489141d6ad72 100644 --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -573,9 +573,8 @@ def test_directory_writable(self): # sneaky: just instantiate a NamedTemporaryFile, which # defaults to writing into the directory returned by # gettempdir. - file = tempfile.NamedTemporaryFile() - file.write(b"blat") - file.close() + with tempfile.NamedTemporaryFile() as file: + file.write(b"blat") def test_same_thing(self): # gettempdir always returns the same object @@ -891,9 +890,8 @@ def test_del_on_close(self): # A NamedTemporaryFile is deleted when closed dir = tempfile.mkdtemp() try: - f = tempfile.NamedTemporaryFile(dir=dir) - f.write(b'blat') - f.close() + with tempfile.NamedTemporaryFile(dir=dir) as f: + f.write(b'blat') self.assertFalse(os.path.exists(f.name), "NamedTemporaryFile %s exists after close" % f.name) finally: diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index af2d6b59b971..2ddc77b266b5 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -788,13 +788,11 @@ def test_4_daemon_threads(self): def random_io(): '''Loop for a while sleeping random tiny amounts and doing some I/O.''' while True: - in_f = open(os.__file__, 'rb') - stuff = in_f.read(200) - null_f = open(os.devnull, 'wb') - null_f.write(stuff) - time.sleep(random.random() / 1995) - null_f.close() - in_f.close() + with open(os.__file__, 'rb') as in_f: + stuff = in_f.read(200) + with open(os.devnull, 'wb') as null_f: + null_f.write(stuff) + time.sleep(random.random() / 1995) thread_has_run.add(threading.current_thread()) def main(): diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py index 876fcd4199fb..c6d275e16b09 100644 --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -57,10 +57,8 @@ def test_trivial(self): else: file_url = "file://%s" % fname - f = urllib.request.urlopen(file_url) - - f.read() - f.close() + with urllib.request.urlopen(file_url) as f: + f.read() def test_parse_http_list(self): tests = [ diff --git a/Lib/test/test_urllib2_localnet.py b/Lib/test/test_urllib2_localnet.py index 77dec0ce713c..591b48d6d4d7 100644 --- a/Lib/test/test_urllib2_localnet.py +++ b/Lib/test/test_urllib2_localnet.py @@ -371,10 +371,9 @@ def test_proxy_qop_auth_works(self): self.proxy_digest_handler.add_password(self.REALM, self.URL, self.USER, self.PASSWD) self.digest_auth_handler.set_qop("auth") - result = self.opener.open(self.URL) - while result.read(): - pass - result.close() + with self.opener.open(self.URL) as result: + while result.read(): + pass def test_proxy_qop_auth_int_works_or_throws_urlerror(self): self.proxy_digest_handler.add_password(self.REALM, self.URL, @@ -386,11 +385,11 @@ def test_proxy_qop_auth_int_works_or_throws_urlerror(self): # It's okay if we don't support auth-int, but we certainly # shouldn't receive any kind of exception here other than # a URLError. - result = None - if result: - while result.read(): - pass - result.close() + pass + else: + with result: + while result.read(): + pass def GetRequestHandler(responses): @@ -611,14 +610,11 @@ def test_sending_headers(self): def test_basic(self): handler = self.start_server() - open_url = urllib.request.urlopen("http://localhost:%s" % handler.port) - for attr in ("read", "close", "info", "geturl"): - self.assertTrue(hasattr(open_url, attr), "object returned from " - "urlopen lacks the %s attribute" % attr) - try: + with urllib.request.urlopen("http://localhost:%s" % handler.port) as open_url: + for attr in ("read", "close", "info", "geturl"): + self.assertTrue(hasattr(open_url, attr), "object returned from " + "urlopen lacks the %s attribute" % attr) self.assertTrue(open_url.read(), "calling 'read' failed") - finally: - open_url.close() def test_info(self): handler = self.start_server() diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py index 916e9c49a97c..9c8b6958c620 100644 --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -821,10 +821,9 @@ def test_nonascii_methodname(self): def test_404(self): # send POST with http.client, it should return 404 header and # 'Not Found' message. - conn = http.client.HTTPConnection(ADDR, PORT) - conn.request('POST', '/this-is-not-valid') - response = conn.getresponse() - conn.close() + with contextlib.closing(http.client.HTTPConnection(ADDR, PORT)) as conn: + conn.request('POST', '/this-is-not-valid') + response = conn.getresponse() self.assertEqual(response.status, 404) self.assertEqual(response.reason, 'Not Found') @@ -944,9 +943,8 @@ def test_unicode_host(self): def test_partial_post(self): # Check that a partial POST doesn't make the server loop: issue #14001. - conn = http.client.HTTPConnection(ADDR, PORT) - conn.request('POST', '/RPC2 HTTP/1.0\r\nContent-Length: 100\r\n\r\nbye') - conn.close() + with contextlib.closing(http.client.HTTPConnection(ADDR, PORT)) as conn: + conn.request('POST', '/RPC2 HTTP/1.0\r\nContent-Length: 100\r\n\r\nbye') def test_context_manager(self): with xmlrpclib.ServerProxy(URL) as server: diff --git a/Lib/test/test_zipimport.py b/Lib/test/test_zipimport.py index e98b09021c5f..d4f619e9acdb 100644 --- a/Lib/test/test_zipimport.py +++ b/Lib/test/test_zipimport.py @@ -422,57 +422,53 @@ def testZipImporterMethods(self): packdir2 + TESTMOD + pyc_ext: (NOW, test_pyc), "spam" + pyc_ext: (NOW, test_pyc)} - z = ZipFile(TEMP_ZIP, "w") - try: + self.addCleanup(support.unlink, TEMP_ZIP) + with ZipFile(TEMP_ZIP, "w") as z: for name, (mtime, data) in files.items(): zinfo = ZipInfo(name, time.localtime(mtime)) zinfo.compress_type = self.compression zinfo.comment = b"spam" z.writestr(zinfo, data) - z.close() - - zi = zipimport.zipimporter(TEMP_ZIP) - self.assertEqual(zi.archive, TEMP_ZIP) - self.assertEqual(zi.is_package(TESTPACK), True) - - find_mod = zi.find_module('spam') - self.assertIsNotNone(find_mod) - self.assertIsInstance(find_mod, zipimport.zipimporter) - self.assertFalse(find_mod.is_package('spam')) - load_mod = find_mod.load_module('spam') - self.assertEqual(find_mod.get_filename('spam'), load_mod.__file__) - - mod = zi.load_module(TESTPACK) - self.assertEqual(zi.get_filename(TESTPACK), mod.__file__) - - existing_pack_path = importlib.import_module(TESTPACK).__path__[0] - expected_path_path = os.path.join(TEMP_ZIP, TESTPACK) - self.assertEqual(existing_pack_path, expected_path_path) - - self.assertEqual(zi.is_package(packdir + '__init__'), False) - self.assertEqual(zi.is_package(packdir + TESTPACK2), True) - self.assertEqual(zi.is_package(packdir2 + TESTMOD), False) - - mod_path = packdir2 + TESTMOD - mod_name = module_path_to_dotted_name(mod_path) - mod = importlib.import_module(mod_name) - self.assertTrue(mod_name in sys.modules) - self.assertEqual(zi.get_source(TESTPACK), None) - self.assertEqual(zi.get_source(mod_path), None) - self.assertEqual(zi.get_filename(mod_path), mod.__file__) - # To pass in the module name instead of the path, we must use the - # right importer - loader = mod.__loader__ - self.assertEqual(loader.get_source(mod_name), None) - self.assertEqual(loader.get_filename(mod_name), mod.__file__) - - # test prefix and archivepath members - zi2 = zipimport.zipimporter(TEMP_ZIP + os.sep + TESTPACK) - self.assertEqual(zi2.archive, TEMP_ZIP) - self.assertEqual(zi2.prefix, TESTPACK + os.sep) - finally: - z.close() - os.remove(TEMP_ZIP) + + zi = zipimport.zipimporter(TEMP_ZIP) + self.assertEqual(zi.archive, TEMP_ZIP) + self.assertEqual(zi.is_package(TESTPACK), True) + + find_mod = zi.find_module('spam') + self.assertIsNotNone(find_mod) + self.assertIsInstance(find_mod, zipimport.zipimporter) + self.assertFalse(find_mod.is_package('spam')) + load_mod = find_mod.load_module('spam') + self.assertEqual(find_mod.get_filename('spam'), load_mod.__file__) + + mod = zi.load_module(TESTPACK) + self.assertEqual(zi.get_filename(TESTPACK), mod.__file__) + + existing_pack_path = importlib.import_module(TESTPACK).__path__[0] + expected_path_path = os.path.join(TEMP_ZIP, TESTPACK) + self.assertEqual(existing_pack_path, expected_path_path) + + self.assertEqual(zi.is_package(packdir + '__init__'), False) + self.assertEqual(zi.is_package(packdir + TESTPACK2), True) + self.assertEqual(zi.is_package(packdir2 + TESTMOD), False) + + mod_path = packdir2 + TESTMOD + mod_name = module_path_to_dotted_name(mod_path) + mod = importlib.import_module(mod_name) + self.assertTrue(mod_name in sys.modules) + self.assertEqual(zi.get_source(TESTPACK), None) + self.assertEqual(zi.get_source(mod_path), None) + self.assertEqual(zi.get_filename(mod_path), mod.__file__) + # To pass in the module name instead of the path, we must use the + # right importer + loader = mod.__loader__ + self.assertEqual(loader.get_source(mod_name), None) + self.assertEqual(loader.get_filename(mod_name), mod.__file__) + + # test prefix and archivepath members + zi2 = zipimport.zipimporter(TEMP_ZIP + os.sep + TESTPACK) + self.assertEqual(zi2.archive, TEMP_ZIP) + self.assertEqual(zi2.prefix, TESTPACK + os.sep) def testZipImporterMethodsInSubDirectory(self): packdir = TESTPACK + os.sep @@ -480,67 +476,60 @@ def testZipImporterMethodsInSubDirectory(self): files = {packdir2 + "__init__" + pyc_ext: (NOW, test_pyc), packdir2 + TESTMOD + pyc_ext: (NOW, test_pyc)} - z = ZipFile(TEMP_ZIP, "w") - try: + self.addCleanup(support.unlink, TEMP_ZIP) + with ZipFile(TEMP_ZIP, "w") as z: for name, (mtime, data) in files.items(): zinfo = ZipInfo(name, time.localtime(mtime)) zinfo.compress_type = self.compression zinfo.comment = b"eggs" z.writestr(zinfo, data) - z.close() - - zi = zipimport.zipimporter(TEMP_ZIP + os.sep + packdir) - self.assertEqual(zi.archive, TEMP_ZIP) - self.assertEqual(zi.prefix, packdir) - self.assertEqual(zi.is_package(TESTPACK2), True) - mod = zi.load_module(TESTPACK2) - self.assertEqual(zi.get_filename(TESTPACK2), mod.__file__) - - self.assertEqual( - zi.is_package(TESTPACK2 + os.sep + '__init__'), False) - self.assertEqual( - zi.is_package(TESTPACK2 + os.sep + TESTMOD), False) - - pkg_path = TEMP_ZIP + os.sep + packdir + TESTPACK2 - zi2 = zipimport.zipimporter(pkg_path) - find_mod_dotted = zi2.find_module(TESTMOD) - self.assertIsNotNone(find_mod_dotted) - self.assertIsInstance(find_mod_dotted, zipimport.zipimporter) - self.assertFalse(zi2.is_package(TESTMOD)) - load_mod = find_mod_dotted.load_module(TESTMOD) - self.assertEqual( - find_mod_dotted.get_filename(TESTMOD), load_mod.__file__) - - mod_path = TESTPACK2 + os.sep + TESTMOD - mod_name = module_path_to_dotted_name(mod_path) - mod = importlib.import_module(mod_name) - self.assertTrue(mod_name in sys.modules) - self.assertEqual(zi.get_source(TESTPACK2), None) - self.assertEqual(zi.get_source(mod_path), None) - self.assertEqual(zi.get_filename(mod_path), mod.__file__) - # To pass in the module name instead of the path, we must use the - # right importer. - loader = mod.__loader__ - self.assertEqual(loader.get_source(mod_name), None) - self.assertEqual(loader.get_filename(mod_name), mod.__file__) - finally: - z.close() - os.remove(TEMP_ZIP) + + zi = zipimport.zipimporter(TEMP_ZIP + os.sep + packdir) + self.assertEqual(zi.archive, TEMP_ZIP) + self.assertEqual(zi.prefix, packdir) + self.assertEqual(zi.is_package(TESTPACK2), True) + mod = zi.load_module(TESTPACK2) + self.assertEqual(zi.get_filename(TESTPACK2), mod.__file__) + + self.assertEqual( + zi.is_package(TESTPACK2 + os.sep + '__init__'), False) + self.assertEqual( + zi.is_package(TESTPACK2 + os.sep + TESTMOD), False) + + pkg_path = TEMP_ZIP + os.sep + packdir + TESTPACK2 + zi2 = zipimport.zipimporter(pkg_path) + find_mod_dotted = zi2.find_module(TESTMOD) + self.assertIsNotNone(find_mod_dotted) + self.assertIsInstance(find_mod_dotted, zipimport.zipimporter) + self.assertFalse(zi2.is_package(TESTMOD)) + load_mod = find_mod_dotted.load_module(TESTMOD) + self.assertEqual( + find_mod_dotted.get_filename(TESTMOD), load_mod.__file__) + + mod_path = TESTPACK2 + os.sep + TESTMOD + mod_name = module_path_to_dotted_name(mod_path) + mod = importlib.import_module(mod_name) + self.assertTrue(mod_name in sys.modules) + self.assertEqual(zi.get_source(TESTPACK2), None) + self.assertEqual(zi.get_source(mod_path), None) + self.assertEqual(zi.get_filename(mod_path), mod.__file__) + # To pass in the module name instead of the path, we must use the + # right importer. + loader = mod.__loader__ + self.assertEqual(loader.get_source(mod_name), None) + self.assertEqual(loader.get_filename(mod_name), mod.__file__) def testGetData(self): - z = ZipFile(TEMP_ZIP, "w") - z.compression = self.compression - try: + self.addCleanup(support.unlink, TEMP_ZIP) + with ZipFile(TEMP_ZIP, "w") as z: + z.compression = self.compression name = "testdata.dat" data = bytes(x for x in range(256)) z.writestr(name, data) - z.close() - zi = zipimport.zipimporter(TEMP_ZIP) - self.assertEqual(data, zi.get_data(name)) - self.assertIn('zipimporter object', repr(zi)) - finally: - z.close() - os.remove(TEMP_ZIP) + + zi = zipimport.zipimporter(TEMP_ZIP) + self.assertEqual(data, zi.get_data(name)) + self.assertIn('zipimporter object', repr(zi)) def testImporterAttr(self): src = """if 1: # indent hack @@ -643,15 +632,12 @@ def testTraceback(self): "need an unencodable filename") def testUnencodable(self): filename = support.TESTFN_UNENCODABLE + ".zip" - z = ZipFile(filename, "w") - zinfo = ZipInfo(TESTMOD + ".py", time.localtime(NOW)) - zinfo.compress_type = self.compression - z.writestr(zinfo, test_src) - z.close() - try: - zipimport.zipimporter(filename).load_module(TESTMOD) - finally: - os.remove(filename) + self.addCleanup(support.unlink, filename) + with ZipFile(filename, "w") as z: + zinfo = ZipInfo(TESTMOD + ".py", time.localtime(NOW)) + zinfo.compress_type = self.compression + z.writestr(zinfo, test_src) + zipimport.zipimporter(filename).load_module(TESTMOD) def testBytesPath(self): filename = support.TESTFN + ".zip" diff --git a/Lib/test/test_zipimport_support.py b/Lib/test/test_zipimport_support.py index 84d526c3db53..88561017503f 100644 --- a/Lib/test/test_zipimport_support.py +++ b/Lib/test/test_zipimport_support.py @@ -122,15 +122,13 @@ def test_doctest_issue4197(self): test_src) zip_name, run_name = make_zip_script(d, 'test_zip', script_name) - z = zipfile.ZipFile(zip_name, 'a') - for mod_name, src in sample_sources.items(): - z.writestr(mod_name + ".py", src) - z.close() + with zipfile.ZipFile(zip_name, 'a') as z: + for mod_name, src in sample_sources.items(): + z.writestr(mod_name + ".py", src) if verbose: - zip_file = zipfile.ZipFile(zip_name, 'r') - print ('Contents of %r:' % zip_name) - zip_file.printdir() - zip_file.close() + with zipfile.ZipFile(zip_name, 'r') as zip_file: + print ('Contents of %r:' % zip_name) + zip_file.printdir() os.remove(script_name) sys.path.insert(0, zip_name) import test_zipped_doctest From webhook-mailer at python.org Tue Mar 5 06:32:15 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 05 Mar 2019 11:32:15 -0000 Subject: [Python-checkins] bpo-36142: Add _PyPreConfig.utf8_mode (GH-12174) Message-ID: https://github.com/python/cpython/commit/5a02e0d1c8a526fc4e80a2fb8b4a9d5bc64c7d82 commit: 5a02e0d1c8a526fc4e80a2fb8b4a9d5bc64c7d82 branch: master author: Victor Stinner committer: GitHub date: 2019-03-05T12:32:09+01:00 summary: bpo-36142: Add _PyPreConfig.utf8_mode (GH-12174) * Move following fields from _PyCoreConfig to _PyPreConfig: * coerce_c_locale * coerce_c_locale_warn * legacy_windows_stdio * utf8_mode * _PyPreConfig_ReadFromArgv() is now responsible to choose the filesystem encoding * _PyPreConfig_Write() now sets the LC_CTYPE locale files: M Include/cpython/coreconfig.h M Include/internal/pycore_coreconfig.h M Programs/_testembed.c M Python/coreconfig.c M Python/preconfig.c M Python/pylifecycle.c M Python/sysmodule.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index 7997d59c8647..306577cf5b43 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -60,12 +60,42 @@ typedef struct { Set to 0 by -E command line option. If set to -1 (default), it is set to !Py_IgnoreEnvironmentFlag. */ int use_environment; + + int coerce_c_locale; /* PYTHONCOERCECLOCALE, -1 means unknown */ + int coerce_c_locale_warn; /* PYTHONCOERCECLOCALE=warn */ + +#ifdef MS_WINDOWS + /* If greater than 1, use the "mbcs" encoding instead of the UTF-8 + encoding for the filesystem encoding. + + Set to 1 if the PYTHONLEGACYWINDOWSFSENCODING environment variable is + set to a non-empty string. If set to -1 (default), inherit + Py_LegacyWindowsFSEncodingFlag value. + + See PEP 529 for more details. */ + int legacy_windows_fs_encoding; +#endif + + /* Enable UTF-8 mode? + Set by -X utf8 command line option and PYTHONUTF8 environment variable. + If set to -1 (default), inherit Py_UTF8Mode value. */ + int utf8_mode; } _PyPreConfig; +#ifdef MS_WINDOWS +# define _PyPreConfig_WINDOWS_INIT \ + .legacy_windows_fs_encoding = -1, +#else +# define _PyPreConfig_WINDOWS_INIT +#endif + #define _PyPreConfig_INIT \ (_PyPreConfig){ \ + _PyPreConfig_WINDOWS_INIT \ .isolated = -1, \ - .use_environment = -1} + .use_environment = -1, \ + .coerce_c_locale = -1, \ + .utf8_mode = -1} /* --- _PyCoreConfig ---------------------------------------------- */ @@ -95,8 +125,6 @@ typedef struct { int show_alloc_count; /* -X showalloccount */ int dump_refs; /* PYTHONDUMPREFS */ int malloc_stats; /* PYTHONMALLOCSTATS */ - int coerce_c_locale; /* PYTHONCOERCECLOCALE, -1 means unknown */ - int coerce_c_locale_warn; /* PYTHONCOERCECLOCALE=warn */ /* Python filesystem encoding and error handler: sys.getfilesystemencoding() and sys.getfilesystemencodeerrors(). @@ -134,11 +162,6 @@ typedef struct { char *filesystem_encoding; char *filesystem_errors; - /* Enable UTF-8 mode? - Set by -X utf8 command line option and PYTHONUTF8 environment variable. - If set to -1 (default), inherit Py_UTF8Mode value. */ - int utf8_mode; - wchar_t *pycache_prefix; /* PYTHONPYCACHEPREFIX, -X pycache_prefix=PATH */ wchar_t *program_name; /* Program name, see also Py_GetProgramName() */ @@ -277,16 +300,6 @@ typedef struct { char *stdio_errors; #ifdef MS_WINDOWS - /* If greater than 1, use the "mbcs" encoding instead of the UTF-8 - encoding for the filesystem encoding. - - Set to 1 if the PYTHONLEGACYWINDOWSFSENCODING environment variable is - set to a non-empty string. If set to -1 (default), inherit - Py_LegacyWindowsFSEncodingFlag value. - - See PEP 529 for more details. */ - int legacy_windows_fs_encoding; - /* If greater than zero, use io.FileIO instead of WindowsConsoleIO for sys standard streams. @@ -340,7 +353,6 @@ typedef struct { #ifdef MS_WINDOWS # define _PyCoreConfig_WINDOWS_INIT \ - .legacy_windows_fs_encoding = -1, \ .legacy_windows_stdio = -1, #else # define _PyCoreConfig_WINDOWS_INIT @@ -348,13 +360,12 @@ typedef struct { #define _PyCoreConfig_INIT \ (_PyCoreConfig){ \ + _PyCoreConfig_WINDOWS_INIT \ .preconfig = _PyPreConfig_INIT, \ .install_signal_handlers = 1, \ .use_hash_seed = -1, \ .faulthandler = -1, \ .tracemalloc = -1, \ - .coerce_c_locale = -1, \ - .utf8_mode = -1, \ .argc = -1, \ .nmodule_search_path = -1, \ .site_import = -1, \ @@ -368,7 +379,6 @@ typedef struct { .quiet = -1, \ .user_site_directory = -1, \ .buffered_stdio = -1, \ - _PyCoreConfig_WINDOWS_INIT \ ._install_importlib = 1, \ ._check_hash_pycs_mode = "default", \ ._frozen = -1} diff --git a/Include/internal/pycore_coreconfig.h b/Include/internal/pycore_coreconfig.h index 5135969bcfc9..8df182c09f6f 100644 --- a/Include/internal/pycore_coreconfig.h +++ b/Include/internal/pycore_coreconfig.h @@ -36,11 +36,24 @@ PyAPI_FUNC(int) _Py_SetArgcArgv(int argc, wchar_t * const *argv); /* --- _PyPreConfig ----------------------------------------------- */ +PyAPI_FUNC(int) _Py_str_to_int( + const char *str, + int *result); +PyAPI_FUNC(const wchar_t*) _Py_get_xoption( + int nxoption, + wchar_t * const *xoptions, + const wchar_t *name); + PyAPI_FUNC(void) _PyPreConfig_Clear(_PyPreConfig *config); PyAPI_FUNC(int) _PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2); PyAPI_FUNC(void) _PyPreConfig_GetGlobalConfig(_PyPreConfig *config); PyAPI_FUNC(void) _PyPreConfig_SetGlobalConfig(const _PyPreConfig *config); +PyAPI_FUNC(const char*) _PyPreConfig_GetEnv(const _PyPreConfig *config, + const char *name); +PyAPI_FUNC(void) _Py_get_env_flag(_PyPreConfig *config, + int *flag, + const char *name); PyAPI_FUNC(_PyInitError) _PyPreConfig_Read(_PyPreConfig *config); PyAPI_FUNC(int) _PyPreConfig_AsDict(const _PyPreConfig *config, PyObject *dict); diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 7b4d8c2347fb..9923f8df20e9 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -461,7 +461,7 @@ static int test_init_from_config(void) putenv("PYTHONUTF8=0"); Py_UTF8Mode = 0; - config.utf8_mode = 1; + config.preconfig.utf8_mode = 1; putenv("PYTHONPYCACHEPREFIX=env_pycache_prefix"); config.pycache_prefix = L"conf_pycache_prefix"; @@ -610,8 +610,8 @@ static int test_init_isolated(void) config.preconfig.isolated = 1; /* Set coerce_c_locale and utf8_mode to not depend on the locale */ - config.coerce_c_locale = 0; - config.utf8_mode = 0; + config.preconfig.coerce_c_locale = 0; + config.preconfig.utf8_mode = 0; /* Use path starting with "./" avoids a search along the PATH */ config.program_name = L"./_testembed"; diff --git a/Python/coreconfig.c b/Python/coreconfig.c index a6aa89bf8c5d..e372de482475 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -531,10 +531,6 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) COPY_ATTR(dump_refs); COPY_ATTR(malloc_stats); - COPY_ATTR(coerce_c_locale); - COPY_ATTR(coerce_c_locale_warn); - COPY_ATTR(utf8_mode); - COPY_WSTR_ATTR(pycache_prefix); COPY_WSTR_ATTR(module_search_path_env); COPY_WSTR_ATTR(home); @@ -571,7 +567,6 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) COPY_STR_ATTR(stdio_encoding); COPY_STR_ATTR(stdio_errors); #ifdef MS_WINDOWS - COPY_ATTR(legacy_windows_fs_encoding); COPY_ATTR(legacy_windows_stdio); #endif COPY_ATTR(skip_source_first_line); @@ -592,19 +587,7 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) const char* _PyCoreConfig_GetEnv(const _PyCoreConfig *config, const char *name) { - assert(config->preconfig.use_environment >= 0); - - if (!config->preconfig.use_environment) { - return NULL; - } - - const char *var = getenv(name); - if (var && var[0] != '\0') { - return var; - } - else { - return NULL; - } + return _PyPreConfig_GetEnv(&config->preconfig, name); } @@ -670,7 +653,6 @@ _PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config) config->ATTR = !(VALUE); \ } - COPY_FLAG(utf8_mode, Py_UTF8Mode); COPY_FLAG(bytes_warning, Py_BytesWarningFlag); COPY_FLAG(inspect, Py_InspectFlag); COPY_FLAG(interactive, Py_InteractiveFlag); @@ -679,7 +661,6 @@ _PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config) COPY_FLAG(verbose, Py_VerboseFlag); COPY_FLAG(quiet, Py_QuietFlag); #ifdef MS_WINDOWS - COPY_FLAG(legacy_windows_fs_encoding, Py_LegacyWindowsFSEncodingFlag); COPY_FLAG(legacy_windows_stdio, Py_LegacyWindowsStdioFlag); #endif COPY_FLAG(_frozen, Py_FrozenFlag); @@ -709,7 +690,6 @@ _PyCoreConfig_SetGlobalConfig(const _PyCoreConfig *config) VAR = !config->ATTR; \ } - COPY_FLAG(utf8_mode, Py_UTF8Mode); COPY_FLAG(bytes_warning, Py_BytesWarningFlag); COPY_FLAG(inspect, Py_InspectFlag); COPY_FLAG(interactive, Py_InteractiveFlag); @@ -718,7 +698,6 @@ _PyCoreConfig_SetGlobalConfig(const _PyCoreConfig *config) COPY_FLAG(verbose, Py_VerboseFlag); COPY_FLAG(quiet, Py_QuietFlag); #ifdef MS_WINDOWS - COPY_FLAG(legacy_windows_fs_encoding, Py_LegacyWindowsFSEncodingFlag); COPY_FLAG(legacy_windows_stdio, Py_LegacyWindowsStdioFlag); #endif COPY_FLAG(_frozen, Py_FrozenFlag); @@ -838,23 +817,7 @@ config_init_executable(_PyCoreConfig *config) static const wchar_t* config_get_xoption(const _PyCoreConfig *config, wchar_t *name) { - int nxoption = config->nxoption; - wchar_t **xoptions = config->xoptions; - for (int i=0; i < nxoption; i++) { - wchar_t *option = xoptions[i]; - size_t len; - wchar_t *sep = wcschr(option, L'='); - if (sep != NULL) { - len = (sep - option); - } - else { - len = wcslen(option); - } - if (wcsncmp(option, name, len) == 0 && name[len] == L'\0') { - return option; - } - } - return NULL; + return _Py_get_xoption(config->nxoption, config->xoptions, name); } @@ -915,67 +878,6 @@ config_init_hash_seed(_PyCoreConfig *config) } -static _PyInitError -config_init_utf8_mode(_PyCoreConfig *config) -{ - const wchar_t *xopt = config_get_xoption(config, L"utf8"); - if (xopt) { - wchar_t *sep = wcschr(xopt, L'='); - if (sep) { - xopt = sep + 1; - if (wcscmp(xopt, L"1") == 0) { - config->utf8_mode = 1; - } - else if (wcscmp(xopt, L"0") == 0) { - config->utf8_mode = 0; - } - else { - return _Py_INIT_USER_ERR("invalid -X utf8 option value"); - } - } - else { - config->utf8_mode = 1; - } - return _Py_INIT_OK(); - } - - const char *opt = _PyCoreConfig_GetEnv(config, "PYTHONUTF8"); - if (opt) { - if (strcmp(opt, "1") == 0) { - config->utf8_mode = 1; - } - else if (strcmp(opt, "0") == 0) { - config->utf8_mode = 0; - } - else { - return _Py_INIT_USER_ERR("invalid PYTHONUTF8 environment " - "variable value"); - } - return _Py_INIT_OK(); - } - - return _Py_INIT_OK(); -} - - -static int -config_str_to_int(const char *str, int *result) -{ - const char *endptr = str; - errno = 0; - long value = strtol(str, (char **)&endptr, 10); - if (*endptr != '\0' || errno == ERANGE) { - return -1; - } - if (value < INT_MIN || value > INT_MAX) { - return -1; - } - - *result = (int)value; - return 0; -} - - static int config_wstr_to_int(const wchar_t *wstr, int *result) { @@ -994,27 +896,12 @@ config_wstr_to_int(const wchar_t *wstr, int *result) } -static void -get_env_flag(_PyCoreConfig *config, int *flag, const char *name) -{ - const char *var = _PyCoreConfig_GetEnv(config, name); - if (!var) { - return; - } - int value; - if (config_str_to_int(var, &value) < 0 || value < 0) { - /* PYTHONDEBUG=text and PYTHONDEBUG=-2 behave as PYTHONDEBUG=1 */ - value = 1; - } - if (*flag < value) { - *flag = value; - } -} - - static _PyInitError config_read_env_vars(_PyCoreConfig *config) { +#define get_env_flag(CONFIG, ATTR, NAME) \ + _Py_get_env_flag(&(CONFIG)->preconfig, (ATTR), (NAME)) + /* Get environment variables */ get_env_flag(config, &config->parser_debug, "PYTHONDEBUG"); get_env_flag(config, &config->verbose, "PYTHONVERBOSE"); @@ -1040,8 +927,6 @@ config_read_env_vars(_PyCoreConfig *config) } #ifdef MS_WINDOWS - get_env_flag(config, &config->legacy_windows_fs_encoding, - "PYTHONLEGACYWINDOWSFSENCODING"); get_env_flag(config, &config->legacy_windows_stdio, "PYTHONLEGACYWINDOWSSTDIO"); #endif @@ -1057,23 +942,6 @@ config_read_env_vars(_PyCoreConfig *config) config->malloc_stats = 1; } - const char *env = _PyCoreConfig_GetEnv(config, "PYTHONCOERCECLOCALE"); - if (env) { - if (strcmp(env, "0") == 0) { - if (config->coerce_c_locale < 0) { - config->coerce_c_locale = 0; - } - } - else if (strcmp(env, "warn") == 0) { - config->coerce_c_locale_warn = 1; - } - else { - if (config->coerce_c_locale < 0) { - config->coerce_c_locale = 1; - } - } - } - wchar_t *path; int res = _PyCoreConfig_GetEnvDup(config, &path, L"PYTHONPATH", "PYTHONPATH"); @@ -1090,6 +958,8 @@ config_read_env_vars(_PyCoreConfig *config) } return _Py_INIT_OK(); + +#undef get_env_flag } @@ -1101,7 +971,7 @@ config_init_tracemalloc(_PyCoreConfig *config) const char *env = _PyCoreConfig_GetEnv(config, "PYTHONTRACEMALLOC"); if (env) { - if (!config_str_to_int(env, &nframe)) { + if (!_Py_str_to_int(env, &nframe)) { valid = (nframe >= 0); } else { @@ -1213,37 +1083,6 @@ config_read_complex_options(_PyCoreConfig *config) } -static void -config_init_locale(_PyCoreConfig *config) -{ - /* Test also if coerce_c_locale equals 1: PYTHONCOERCECLOCALE=1 doesn't - imply that the C locale is always coerced. It is only coerced if - if the LC_CTYPE locale is "C". */ - if (config->coerce_c_locale != 0) { - /* The C locale enables the C locale coercion (PEP 538) */ - if (_Py_LegacyLocaleDetected()) { - config->coerce_c_locale = 1; - } - else { - config->coerce_c_locale = 0; - } - } - -#ifndef MS_WINDOWS - if (config->utf8_mode < 0) { - /* The C locale and the POSIX locale enable the UTF-8 Mode (PEP 540) */ - const char *ctype_loc = setlocale(LC_CTYPE, NULL); - if (ctype_loc != NULL - && (strcmp(ctype_loc, "C") == 0 - || strcmp(ctype_loc, "POSIX") == 0)) - { - config->utf8_mode = 1; - } - } -#endif -} - - static const char * get_stdio_errors(const _PyCoreConfig *config) { @@ -1365,7 +1204,7 @@ config_init_stdio_encoding(_PyCoreConfig *config) } /* UTF-8 Mode uses UTF-8/surrogateescape */ - if (config->utf8_mode) { + if (config->preconfig.utf8_mode) { if (config->stdio_encoding == NULL) { config->stdio_encoding = _PyMem_RawStrdup("utf-8"); if (config->stdio_encoding == NULL) { @@ -1403,7 +1242,7 @@ static _PyInitError config_init_fs_encoding(_PyCoreConfig *config) { #ifdef MS_WINDOWS - if (config->legacy_windows_fs_encoding) { + if (config->preconfig.legacy_windows_fs_encoding) { /* Legacy Windows filesystem encoding: mbcs/replace */ if (config->filesystem_encoding == NULL) { config->filesystem_encoding = _PyMem_RawStrdup("mbcs"); @@ -1438,7 +1277,7 @@ config_init_fs_encoding(_PyCoreConfig *config) } #else if (config->filesystem_encoding == NULL) { - if (config->utf8_mode) { + if (config->preconfig.utf8_mode) { /* UTF-8 Mode use: utf-8/surrogateescape */ config->filesystem_encoding = _PyMem_RawStrdup("utf-8"); /* errors defaults to surrogateescape above */ @@ -1539,12 +1378,6 @@ _PyCoreConfig_Read(_PyCoreConfig *config, const _PyPreConfig *preconfig) config->user_site_directory = 0; } -#ifdef MS_WINDOWS - if (config->legacy_windows_fs_encoding) { - config->utf8_mode = 0; - } -#endif - if (config->preconfig.use_environment) { err = config_read_env_vars(config); if (_Py_INIT_FAILED(err)) { @@ -1565,13 +1398,6 @@ _PyCoreConfig_Read(_PyCoreConfig *config, const _PyPreConfig *preconfig) return err; } - if (config->utf8_mode < 0) { - err = config_init_utf8_mode(config); - if (_Py_INIT_FAILED(err)) { - return err; - } - } - if (config->home == NULL) { err = config_init_home(config); if (_Py_INIT_FAILED(err)) { @@ -1593,10 +1419,6 @@ _PyCoreConfig_Read(_PyCoreConfig *config, const _PyPreConfig *preconfig) } } - if (config->coerce_c_locale != 0 || config->utf8_mode < 0) { - config_init_locale(config); - } - if (config->_install_importlib) { err = _PyCoreConfig_InitPathConfig(config); if (_Py_INIT_FAILED(err)) { @@ -1623,12 +1445,6 @@ _PyCoreConfig_Read(_PyCoreConfig *config, const _PyPreConfig *preconfig) if (config->tracemalloc < 0) { config->tracemalloc = 0; } - if (config->coerce_c_locale < 0) { - config->coerce_c_locale = 0; - } - if (config->utf8_mode < 0) { - config->utf8_mode = 0; - } if (config->argc < 0) { config->argc = 0; } @@ -1645,7 +1461,6 @@ _PyCoreConfig_Read(_PyCoreConfig *config, const _PyPreConfig *preconfig) return err; } - assert(config->coerce_c_locale >= 0); assert(config->preconfig.use_environment >= 0); assert(config->filesystem_encoding != NULL); assert(config->filesystem_errors != NULL); @@ -1703,9 +1518,6 @@ config_init_stdio(const _PyCoreConfig *config) void _PyCoreConfig_Write(const _PyCoreConfig *config) { - if (config->coerce_c_locale) { - _Py_CoerceLegacyLocale(config->coerce_c_locale_warn); - } _PyCoreConfig_SetGlobalConfig(config); config_init_stdio(config); } @@ -1769,11 +1581,8 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) SET_ITEM_INT(show_alloc_count); SET_ITEM_INT(dump_refs); SET_ITEM_INT(malloc_stats); - SET_ITEM_INT(coerce_c_locale); - SET_ITEM_INT(coerce_c_locale_warn); SET_ITEM_STR(filesystem_encoding); SET_ITEM_STR(filesystem_errors); - SET_ITEM_INT(utf8_mode); SET_ITEM_WSTR(pycache_prefix); SET_ITEM_WSTR(program_name); SET_ITEM_WSTRLIST(argc, argv); @@ -1805,7 +1614,6 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) SET_ITEM_STR(stdio_encoding); SET_ITEM_STR(stdio_errors); #ifdef MS_WINDOWS - SET_ITEM_INT(legacy_windows_fs_encoding); SET_ITEM_INT(legacy_windows_stdio); #endif SET_ITEM_INT(skip_source_first_line); @@ -2318,33 +2126,6 @@ config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, } -static _PyInitError -config_read_from_argv_impl(_PyCoreConfig *config, const _PyArgv *args, - const _PyPreConfig *preconfig) -{ - _PyInitError err; - - _PyCmdline cmdline; - memset(&cmdline, 0, sizeof(cmdline)); - cmdline.args = args; - - err = _PyArgv_Decode(cmdline.args, &cmdline.argv); - if (_Py_INIT_FAILED(err)) { - goto done; - } - - err = config_from_cmdline(config, &cmdline, preconfig); - if (_Py_INIT_FAILED(err)) { - goto done; - } - err = _Py_INIT_OK(); - -done: - cmdline_clear(&cmdline); - return err; -} - - /* Read the configuration into _PyCoreConfig and initialize the LC_CTYPE locale: enable UTF-8 mode (PEP 540) and/or coerce the C locale (PEP 538). @@ -2358,118 +2139,23 @@ _PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, const _PyArgv *args, const _PyPreConfig *preconfig) { _PyInitError err; - int init_utf8_mode = Py_UTF8Mode; -#ifdef MS_WINDOWS - int init_legacy_encoding = Py_LegacyWindowsFSEncodingFlag; -#endif - _PyCoreConfig save_config = _PyCoreConfig_INIT; - int locale_coerced = 0; - int loops = 0; - char *init_ctype_locale = NULL; - /* copy LC_CTYPE locale */ - const char *loc = setlocale(LC_CTYPE, NULL); - if (loc == NULL) { - err = _Py_INIT_ERR("failed to LC_CTYPE locale"); - goto done; - } - init_ctype_locale = _PyMem_RawStrdup(loc); - if (init_ctype_locale == NULL) { - err = _Py_INIT_NO_MEMORY(); - goto done; - } + _PyCmdline cmdline; + memset(&cmdline, 0, sizeof(cmdline)); + cmdline.args = args; - if (_PyCoreConfig_Copy(&save_config, config) < 0) { - err = _Py_INIT_NO_MEMORY(); + err = _PyArgv_Decode(cmdline.args, &cmdline.argv); + if (_Py_INIT_FAILED(err)) { goto done; } - /* Set LC_CTYPE to the user preferred locale */ - _Py_SetLocaleFromEnv(LC_CTYPE); - - while (1) { - int utf8_mode = config->utf8_mode; - int encoding_changed = 0; - - /* Watchdog to prevent an infinite loop */ - loops++; - if (loops == 3) { - err = _Py_INIT_ERR("Encoding changed twice while " - "reading the configuration"); - goto done; - } - - /* bpo-34207: Py_DecodeLocale() and Py_EncodeLocale() depend - on Py_UTF8Mode and Py_LegacyWindowsFSEncodingFlag. */ - Py_UTF8Mode = config->utf8_mode; -#ifdef MS_WINDOWS - Py_LegacyWindowsFSEncodingFlag = config->legacy_windows_fs_encoding; -#endif - - err = config_read_from_argv_impl(config, args, preconfig); - if (_Py_INIT_FAILED(err)) { - goto done; - } - if (locale_coerced) { - config->coerce_c_locale = 1; - } - - /* The legacy C locale assumes ASCII as the default text encoding, which - * causes problems not only for the CPython runtime, but also other - * components like GNU readline. - * - * Accordingly, when the CLI detects it, it attempts to coerce it to a - * more capable UTF-8 based alternative. - * - * See the documentation of the PYTHONCOERCECLOCALE setting for more - * details. - */ - if (config->coerce_c_locale && !locale_coerced) { - locale_coerced = 1; - _Py_CoerceLegacyLocale(0); - encoding_changed = 1; - } - - if (utf8_mode == -1) { - if (config->utf8_mode == 1) { - /* UTF-8 Mode enabled */ - encoding_changed = 1; - } - } - else { - if (config->utf8_mode != utf8_mode) { - encoding_changed = 1; - } - } - - if (!encoding_changed) { - break; - } - - /* Reset the configuration before reading again the configuration, - just keep UTF-8 Mode value. */ - int new_utf8_mode = config->utf8_mode; - int new_coerce_c_locale = config->coerce_c_locale; - if (_PyCoreConfig_Copy(config, &save_config) < 0) { - err = _Py_INIT_NO_MEMORY(); - goto done; - } - config->utf8_mode = new_utf8_mode; - config->coerce_c_locale = new_coerce_c_locale; - - /* The encoding changed: read again the configuration - with the new encoding */ + err = config_from_cmdline(config, &cmdline, preconfig); + if (_Py_INIT_FAILED(err)) { + goto done; } err = _Py_INIT_OK(); done: - if (init_ctype_locale != NULL) { - setlocale(LC_CTYPE, init_ctype_locale); - } - _PyCoreConfig_Clear(&save_config); - Py_UTF8Mode = init_utf8_mode ; -#ifdef MS_WINDOWS - Py_LegacyWindowsFSEncodingFlag = init_legacy_encoding; -#endif + cmdline_clear(&cmdline); return err; } diff --git a/Python/preconfig.c b/Python/preconfig.c index af70f3871ccd..3befecfaa036 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -1,6 +1,8 @@ #include "Python.h" #include "pycore_coreconfig.h" #include "pycore_getopt.h" +#include "pycore_pystate.h" /* _PyRuntime_Initialize() */ +#include /* setlocale() */ #define DECODE_LOCALE_ERR(NAME, LEN) \ @@ -99,6 +101,8 @@ typedef struct { const _PyArgv *args; int argc; wchar_t **argv; + int nxoption; /* Number of -X options */ + wchar_t **xoptions; /* -X options */ } _PyPreCmdline; @@ -109,6 +113,10 @@ precmdline_clear(_PyPreCmdline *cmdline) _Py_wstrlist_clear(cmdline->args->argc, cmdline->argv); } cmdline->argv = NULL; + + _Py_wstrlist_clear(cmdline->nxoption, cmdline->xoptions); + cmdline->nxoption = 0; + cmdline->xoptions = NULL; } @@ -129,6 +137,12 @@ _PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2) COPY_ATTR(isolated); COPY_ATTR(use_environment); + COPY_ATTR(coerce_c_locale); + COPY_ATTR(coerce_c_locale_warn); +#ifdef MS_WINDOWS + COPY_ATTR(legacy_windows_fs_encoding); +#endif + COPY_ATTR(utf8_mode); #undef COPY_ATTR return 0; @@ -149,6 +163,10 @@ _PyPreConfig_GetGlobalConfig(_PyPreConfig *config) COPY_FLAG(isolated, Py_IsolatedFlag); COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); +#ifdef MS_WINDOWS + COPY_FLAG(legacy_windows_fs_encoding, Py_LegacyWindowsFSEncodingFlag); +#endif + COPY_FLAG(utf8_mode, Py_UTF8Mode); #undef COPY_FLAG #undef COPY_NOT_FLAG @@ -169,14 +187,161 @@ _PyPreConfig_SetGlobalConfig(const _PyPreConfig *config) COPY_FLAG(isolated, Py_IsolatedFlag); COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); +#ifdef MS_WINDOWS + COPY_FLAG(legacy_windows_fs_encoding, Py_LegacyWindowsFSEncodingFlag); +#endif + COPY_FLAG(utf8_mode, Py_UTF8Mode); #undef COPY_FLAG #undef COPY_NOT_FLAG } -_PyInitError -_PyPreConfig_Read(_PyPreConfig *config) +const char* +_PyPreConfig_GetEnv(const _PyPreConfig *config, const char *name) +{ + assert(config->use_environment >= 0); + + if (!config->use_environment) { + return NULL; + } + + const char *var = getenv(name); + if (var && var[0] != '\0') { + return var; + } + else { + return NULL; + } +} + + +int +_Py_str_to_int(const char *str, int *result) +{ + const char *endptr = str; + errno = 0; + long value = strtol(str, (char **)&endptr, 10); + if (*endptr != '\0' || errno == ERANGE) { + return -1; + } + if (value < INT_MIN || value > INT_MAX) { + return -1; + } + + *result = (int)value; + return 0; +} + + +void +_Py_get_env_flag(_PyPreConfig *config, int *flag, const char *name) +{ + const char *var = _PyPreConfig_GetEnv(config, name); + if (!var) { + return; + } + int value; + if (_Py_str_to_int(var, &value) < 0 || value < 0) { + /* PYTHONDEBUG=text and PYTHONDEBUG=-2 behave as PYTHONDEBUG=1 */ + value = 1; + } + if (*flag < value) { + *flag = value; + } +} + + +const wchar_t* +_Py_get_xoption(int nxoption, wchar_t * const *xoptions, const wchar_t *name) +{ + for (int i=0; i < nxoption; i++) { + const wchar_t *option = xoptions[i]; + size_t len; + wchar_t *sep = wcschr(option, L'='); + if (sep != NULL) { + len = (sep - option); + } + else { + len = wcslen(option); + } + if (wcsncmp(option, name, len) == 0 && name[len] == L'\0') { + return option; + } + } + return NULL; +} + + +static _PyInitError +preconfig_init_utf8_mode(_PyPreConfig *config, const _PyPreCmdline *cmdline) +{ + const wchar_t *xopt; + if (cmdline) { + xopt = _Py_get_xoption(cmdline->nxoption, cmdline->xoptions, L"utf8"); + } + else { + xopt = NULL; + } + if (xopt) { + wchar_t *sep = wcschr(xopt, L'='); + if (sep) { + xopt = sep + 1; + if (wcscmp(xopt, L"1") == 0) { + config->utf8_mode = 1; + } + else if (wcscmp(xopt, L"0") == 0) { + config->utf8_mode = 0; + } + else { + return _Py_INIT_USER_ERR("invalid -X utf8 option value"); + } + } + else { + config->utf8_mode = 1; + } + return _Py_INIT_OK(); + } + + const char *opt = _PyPreConfig_GetEnv(config, "PYTHONUTF8"); + if (opt) { + if (strcmp(opt, "1") == 0) { + config->utf8_mode = 1; + } + else if (strcmp(opt, "0") == 0) { + config->utf8_mode = 0; + } + else { + return _Py_INIT_USER_ERR("invalid PYTHONUTF8 environment " + "variable value"); + } + return _Py_INIT_OK(); + } + + return _Py_INIT_OK(); +} + + +static void +preconfig_init_locale(_PyPreConfig *config) +{ + /* Test also if coerce_c_locale equals 1: PYTHONCOERCECLOCALE=1 doesn't + imply that the C locale is always coerced. It is only coerced if + if the LC_CTYPE locale is "C". */ + if (config->coerce_c_locale != 0) { + /* The C locale enables the C locale coercion (PEP 538) */ + if (_Py_LegacyLocaleDetected()) { + config->coerce_c_locale = 1; + } + else { + config->coerce_c_locale = 0; + } + } +} + + +static _PyInitError +preconfig_read(_PyPreConfig *config, const _PyPreCmdline *cmdline) { _PyPreConfig_GetGlobalConfig(config); @@ -189,6 +354,69 @@ _PyPreConfig_Read(_PyPreConfig *config) config->use_environment = 0; } + if (config->use_environment) { +#ifdef MS_WINDOWS + _Py_get_env_flag(config, &config->legacy_windows_fs_encoding, + "PYTHONLEGACYWINDOWSFSENCODING"); +#endif + + const char *env = _PyPreConfig_GetEnv(config, "PYTHONCOERCECLOCALE"); + if (env) { + if (strcmp(env, "0") == 0) { + if (config->coerce_c_locale < 0) { + config->coerce_c_locale = 0; + } + } + else if (strcmp(env, "warn") == 0) { + config->coerce_c_locale_warn = 1; + } + else { + if (config->coerce_c_locale < 0) { + config->coerce_c_locale = 1; + } + } + } + } + +#ifdef MS_WINDOWS + if (config->legacy_windows_fs_encoding) { + config->utf8_mode = 0; + } +#endif + + if (config->utf8_mode < 0) { + _PyInitError err = preconfig_init_utf8_mode(config, cmdline); + if (_Py_INIT_FAILED(err)) { + return err; + } + } + + if (config->coerce_c_locale != 0) { + preconfig_init_locale(config); + } + +#ifndef MS_WINDOWS + if (config->utf8_mode < 0) { + /* The C locale and the POSIX locale enable the UTF-8 Mode (PEP 540) */ + const char *ctype_loc = setlocale(LC_CTYPE, NULL); + if (ctype_loc != NULL + && (strcmp(ctype_loc, "C") == 0 + || strcmp(ctype_loc, "POSIX") == 0)) + { + config->utf8_mode = 1; + } + } +#endif + + if (config->coerce_c_locale < 0) { + config->coerce_c_locale = 0; + } + if (config->utf8_mode < 0) { + config->utf8_mode = 0; + } + + assert(config->coerce_c_locale >= 0); + assert(config->utf8_mode >= 0); assert(config->isolated >= 0); assert(config->use_environment >= 0); @@ -196,6 +424,13 @@ _PyPreConfig_Read(_PyPreConfig *config) } +_PyInitError +_PyPreConfig_Read(_PyPreConfig *config) +{ + return preconfig_read(config, NULL); +} + + int _PyPreConfig_AsDict(const _PyPreConfig *config, PyObject *dict) { @@ -216,6 +451,12 @@ _PyPreConfig_AsDict(const _PyPreConfig *config, PyObject *dict) SET_ITEM_INT(isolated); SET_ITEM_INT(use_environment); + SET_ITEM_INT(coerce_c_locale); + SET_ITEM_INT(coerce_c_locale_warn); + SET_ITEM_INT(utf8_mode); +#ifdef MS_WINDOWS + SET_ITEM_INT(legacy_windows_fs_encoding); +#endif return 0; fail: @@ -251,6 +492,18 @@ preconfig_parse_cmdline(_PyPreConfig *config, _PyPreCmdline *cmdline) config->isolated++; break; + case 'X': + { + _PyInitError err; + err = _Py_wstrlist_append(&cmdline->nxoption, + &cmdline->xoptions, + _PyOS_optarg); + if (_Py_INIT_FAILED(err)) { + return err; + } + break; + } + default: /* ignore other argument: handled by _PyCoreConfig_ReadFromArgv() */ @@ -262,8 +515,8 @@ preconfig_parse_cmdline(_PyPreConfig *config, _PyPreCmdline *cmdline) } -_PyInitError -_PyPreConfig_ReadFromArgv(_PyPreConfig *config, const _PyArgv *args) +static _PyInitError +preconfig_from_argv(_PyPreConfig *config, const _PyArgv *args) { _PyInitError err; @@ -281,7 +534,7 @@ _PyPreConfig_ReadFromArgv(_PyPreConfig *config, const _PyArgv *args) goto done; } - err = _PyPreConfig_Read(config); + err = preconfig_read(config, &cmdline); if (_Py_INIT_FAILED(err)) { goto done; } @@ -293,7 +546,144 @@ _PyPreConfig_ReadFromArgv(_PyPreConfig *config, const _PyArgv *args) } +/* Read the preconfiguration. */ +_PyInitError +_PyPreConfig_ReadFromArgv(_PyPreConfig *config, const _PyArgv *args) +{ + _PyInitError err; + + err = _PyRuntime_Initialize(); + if (_Py_INIT_FAILED(err)) { + return err; + } + + char *init_ctype_locale = NULL; + int init_utf8_mode = Py_UTF8Mode; +#ifdef MS_WINDOWS + int init_legacy_encoding = Py_LegacyWindowsFSEncodingFlag; +#endif + _PyPreConfig save_config = _PyPreConfig_INIT; + int locale_coerced = 0; + int loops = 0; + + /* copy LC_CTYPE locale */ + const char *loc = setlocale(LC_CTYPE, NULL); + if (loc == NULL) { + err = _Py_INIT_ERR("failed to LC_CTYPE locale"); + goto done; + } + init_ctype_locale = _PyMem_RawStrdup(loc); + if (init_ctype_locale == NULL) { + err = _Py_INIT_NO_MEMORY(); + goto done; + } + + if (_PyPreConfig_Copy(&save_config, config) < 0) { + err = _Py_INIT_NO_MEMORY(); + goto done; + } + + /* Set LC_CTYPE to the user preferred locale */ + _Py_SetLocaleFromEnv(LC_CTYPE); + + while (1) { + int utf8_mode = config->utf8_mode; + + /* Watchdog to prevent an infinite loop */ + loops++; + if (loops == 3) { + err = _Py_INIT_ERR("Encoding changed twice while " + "reading the configuration"); + goto done; + } + + /* bpo-34207: Py_DecodeLocale() and Py_EncodeLocale() depend + on Py_UTF8Mode and Py_LegacyWindowsFSEncodingFlag. */ + Py_UTF8Mode = config->utf8_mode; +#ifdef MS_WINDOWS + Py_LegacyWindowsFSEncodingFlag = config->legacy_windows_fs_encoding; +#endif + + err = preconfig_from_argv(config, args); + if (_Py_INIT_FAILED(err)) { + goto done; + } + + if (locale_coerced) { + config->coerce_c_locale = 1; + } + + /* The legacy C locale assumes ASCII as the default text encoding, which + * causes problems not only for the CPython runtime, but also other + * components like GNU readline. + * + * Accordingly, when the CLI detects it, it attempts to coerce it to a + * more capable UTF-8 based alternative. + * + * See the documentation of the PYTHONCOERCECLOCALE setting for more + * details. + */ + int encoding_changed = 0; + if (config->coerce_c_locale && !locale_coerced) { + locale_coerced = 1; + _Py_CoerceLegacyLocale(0); + encoding_changed = 1; + } + + if (utf8_mode == -1) { + if (config->utf8_mode == 1) { + /* UTF-8 Mode enabled */ + encoding_changed = 1; + } + } + else { + if (config->utf8_mode != utf8_mode) { + encoding_changed = 1; + } + } + + if (!encoding_changed) { + break; + } + + /* Reset the configuration before reading again the configuration, + just keep UTF-8 Mode value. */ + int new_utf8_mode = config->utf8_mode; + int new_coerce_c_locale = config->coerce_c_locale; + if (_PyPreConfig_Copy(config, &save_config) < 0) { + err = _Py_INIT_NO_MEMORY(); + goto done; + } + config->utf8_mode = new_utf8_mode; + config->coerce_c_locale = new_coerce_c_locale; + + /* The encoding changed: read again the configuration + with the new encoding */ + } + err = _Py_INIT_OK(); + +done: + if (init_ctype_locale != NULL) { + setlocale(LC_CTYPE, init_ctype_locale); + } + _PyPreConfig_Clear(&save_config); + Py_UTF8Mode = init_utf8_mode ; +#ifdef MS_WINDOWS + Py_LegacyWindowsFSEncodingFlag = init_legacy_encoding; +#endif + return err; +} + + void _PyPreConfig_Write(const _PyPreConfig *config) { + _PyPreConfig_SetGlobalConfig(config); + + if (config->coerce_c_locale) { + _Py_CoerceLegacyLocale(config->coerce_c_locale_warn); + } + + /* Set LC_CTYPE to the user preferred locale */ + _Py_SetLocaleFromEnv(LC_CTYPE); } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 7cf4a6d032c8..dec890485b33 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -287,7 +287,7 @@ static const char *_C_LOCALE_WARNING = static void _emit_stderr_warning_for_legacy_locale(const _PyCoreConfig *core_config) { - if (core_config->coerce_c_locale_warn && _Py_LegacyLocaleDetected()) { + if (core_config->preconfig.coerce_c_locale_warn && _Py_LegacyLocaleDetected()) { PySys_FormatStderr("%s", _C_LOCALE_WARNING); } } diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 4b122805d782..50ba1a71e4c5 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -2181,7 +2181,7 @@ make_flags(void) SetFlag(config->use_hash_seed == 0 || config->hash_seed != 0); SetFlag(config->preconfig.isolated); PyStructSequence_SET_ITEM(seq, pos++, PyBool_FromLong(config->dev_mode)); - SetFlag(config->utf8_mode); + SetFlag(config->preconfig.utf8_mode); #undef SetFlag if (PyErr_Occurred()) { From webhook-mailer at python.org Tue Mar 5 09:19:03 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 05 Mar 2019 14:19:03 -0000 Subject: [Python-checkins] [2.7] bpo-36019: Use pythontest.net in urllib network tests (GH-11941) (GH-12177) Message-ID: https://github.com/python/cpython/commit/84772e0ab49ee09acb44e30551aa5cfc1eafe5dc commit: 84772e0ab49ee09acb44e30551aa5cfc1eafe5dc branch: 2.7 author: St?phane Wirtel committer: Victor Stinner date: 2019-03-05T15:18:58+01:00 summary: [2.7] bpo-36019: Use pythontest.net in urllib network tests (GH-11941) (GH-12177) Use test_support.TEST_HTTP_URL (pythontest.net) instead of http://www.example.com/. files: A Misc/NEWS.d/next/Tests/2019-03-05-13-27-36.bpo-36019.ebUjCm.rst M Doc/library/test.rst M Lib/test/support/__init__.py M Lib/test/test_urllib2net.py M Lib/test/test_urllibnet.py diff --git a/Doc/library/test.rst b/Doc/library/test.rst index eef5d16c2404..9d78c90f55d5 100644 --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -246,6 +246,11 @@ The :mod:`test.support` module defines the following constants: Set to a name that is safe to use as the name of a temporary file. Any temporary file that is created should be closed and unlinked (removed). + +.. data:: TEST_HTTP_URL + + Define the URL of a dedicated HTTP server for the network tests. + The :mod:`test.support` module defines the following functions: diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 9effdddd27dc..ccc11c1b4b0a 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -720,6 +720,10 @@ def u(s): # module name. TESTFN = "{}_{}_tmp".format(TESTFN, os.getpid()) +# Define the URL of a dedicated HTTP server for the network tests. +# The URL must use clear-text HTTP: no redirection to encrypted HTTPS. +TEST_HTTP_URL = "http://www.pythontest.net" + # Save the initial cwd SAVEDCWD = os.getcwd() diff --git a/Lib/test/test_urllib2net.py b/Lib/test/test_urllib2net.py index ee0b7fe453e6..1cd80f283cd8 100644 --- a/Lib/test/test_urllib2net.py +++ b/Lib/test/test_urllib2net.py @@ -85,7 +85,7 @@ def test_close(self): # underlying socket # delve deep into response to fetch socket._socketobject - response = _urlopen_with_retry("http://www.example.com/") + response = _urlopen_with_retry(test_support.TEST_HTTP_URL) abused_fileobject = response.fp self.assertIs(abused_fileobject.__class__, socket._fileobject) httpresponse = abused_fileobject._sock @@ -169,7 +169,7 @@ def test_urlwithfrag(self): "http://www.pythontest.net/index.html#frag") def test_fileno(self): - req = urllib2.Request("http://www.example.com") + req = urllib2.Request(test_support.TEST_HTTP_URL) opener = urllib2.build_opener() res = opener.open(req) try: @@ -180,7 +180,7 @@ def test_fileno(self): res.close() def test_custom_headers(self): - url = "http://www.example.com" + url = test_support.TEST_HTTP_URL with test_support.transient_internet(url): opener = urllib2.build_opener() request = urllib2.Request(url) @@ -258,14 +258,14 @@ def _extra_handlers(self): class TimeoutTest(unittest.TestCase): def test_http_basic(self): self.assertIsNone(socket.getdefaulttimeout()) - url = "http://www.example.com" + url = test_support.TEST_HTTP_URL with test_support.transient_internet(url, timeout=None): u = _urlopen_with_retry(url) self.assertIsNone(u.fp._sock.fp._sock.gettimeout()) def test_http_default_timeout(self): self.assertIsNone(socket.getdefaulttimeout()) - url = "http://www.example.com" + url = test_support.TEST_HTTP_URL with test_support.transient_internet(url): socket.setdefaulttimeout(60) try: @@ -276,7 +276,7 @@ def test_http_default_timeout(self): def test_http_no_timeout(self): self.assertIsNone(socket.getdefaulttimeout()) - url = "http://www.example.com" + url = test_support.TEST_HTTP_URL with test_support.transient_internet(url): socket.setdefaulttimeout(60) try: @@ -286,7 +286,7 @@ def test_http_no_timeout(self): self.assertIsNone(u.fp._sock.fp._sock.gettimeout()) def test_http_timeout(self): - url = "http://www.example.com" + url = test_support.TEST_HTTP_URL with test_support.transient_internet(url): u = _urlopen_with_retry(url, timeout=120) self.assertEqual(u.fp._sock.fp._sock.gettimeout(), 120) diff --git a/Lib/test/test_urllibnet.py b/Lib/test/test_urllibnet.py index a4b4d9250394..3f2d8dcd43b0 100644 --- a/Lib/test/test_urllibnet.py +++ b/Lib/test/test_urllibnet.py @@ -43,7 +43,7 @@ def tearDown(self): socket.setdefaulttimeout(None) def testURLread(self): - f = _open_with_retry(urllib.urlopen, "http://www.example.com/") + f = _open_with_retry(urllib.urlopen, test_support.TEST_HTTP_URL) x = f.read() class urlopenNetworkTests(unittest.TestCase): @@ -66,7 +66,7 @@ def urlopen(self, *args): def test_basic(self): # Simple test expected to pass. - open_url = self.urlopen("http://www.example.com/") + open_url = self.urlopen(test_support.TEST_HTTP_URL) for attr in ("read", "readline", "readlines", "fileno", "close", "info", "geturl"): self.assertTrue(hasattr(open_url, attr), "object returned from " @@ -78,7 +78,7 @@ def test_basic(self): def test_readlines(self): # Test both readline and readlines. - open_url = self.urlopen("http://www.example.com/") + open_url = self.urlopen(test_support.TEST_HTTP_URL) try: self.assertIsInstance(open_url.readline(), basestring, "readline did not return a string") @@ -89,7 +89,7 @@ def test_readlines(self): def test_info(self): # Test 'info'. - open_url = self.urlopen("http://www.example.com/") + open_url = self.urlopen(test_support.TEST_HTTP_URL) try: info_obj = open_url.info() finally: @@ -101,13 +101,12 @@ def test_info(self): def test_geturl(self): # Make sure same URL as opened is returned by geturl. - URL = "http://www.example.com/" - open_url = self.urlopen(URL) + open_url = self.urlopen(test_support.TEST_HTTP_URL) try: gotten_url = open_url.geturl() finally: open_url.close() - self.assertEqual(gotten_url, URL) + self.assertEqual(gotten_url, test_support.TEST_HTTP_URL) def test_getcode(self): # test getcode() with the fancy opener to get 404 error codes @@ -123,12 +122,13 @@ def test_getcode(self): @unittest.skipUnless(hasattr(os, 'fdopen'), 'os.fdopen not available') def test_fileno(self): # Make sure fd returned by fileno is valid. - open_url = self.urlopen("http://www.example.com/") + open_url = self.urlopen(test_support.TEST_HTTP_URL) fd = open_url.fileno() FILE = os.fdopen(fd) try: - self.assertTrue(FILE.read(), "reading from file created using fd " - "returned by fileno failed") + self.assertTrue(FILE.read(), + "reading from file created using fd " + "returned by fileno failed") finally: FILE.close() @@ -161,7 +161,7 @@ def urlretrieve(self, *args): def test_basic(self): # Test basic functionality. - file_location,info = self.urlretrieve("http://www.example.com/") + file_location,info = self.urlretrieve(test_support.TEST_HTTP_URL) self.assertTrue(os.path.exists(file_location), "file location returned by" " urlretrieve is not a valid path") FILE = file(file_location) @@ -174,7 +174,7 @@ def test_basic(self): def test_specified_path(self): # Make sure that specifying the location of the file to write to works. - file_location,info = self.urlretrieve("http://www.example.com/", + file_location,info = self.urlretrieve(test_support.TEST_HTTP_URL, test_support.TESTFN) self.assertEqual(file_location, test_support.TESTFN) self.assertTrue(os.path.exists(file_location)) @@ -187,13 +187,13 @@ def test_specified_path(self): def test_header(self): # Make sure header returned as 2nd value from urlretrieve is good. - file_location, header = self.urlretrieve("http://www.example.com/") + file_location, header = self.urlretrieve(test_support.TEST_HTTP_URL) os.unlink(file_location) self.assertIsInstance(header, mimetools.Message, "header is not an instance of mimetools.Message") def test_data_header(self): - logo = "http://www.example.com/" + logo = test_support.TEST_HTTP_URL file_location, fileheaders = self.urlretrieve(logo) os.unlink(file_location) datevalue = fileheaders.getheader('Date') diff --git a/Misc/NEWS.d/next/Tests/2019-03-05-13-27-36.bpo-36019.ebUjCm.rst b/Misc/NEWS.d/next/Tests/2019-03-05-13-27-36.bpo-36019.ebUjCm.rst new file mode 100644 index 000000000000..c4abaf1fb476 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-03-05-13-27-36.bpo-36019.ebUjCm.rst @@ -0,0 +1,2 @@ +Add test.support.TEST_HTTP_URL and replace references of +http://www.example.com by this new constant. Contributed by St?phane Wirtel. From webhook-mailer at python.org Tue Mar 5 10:10:57 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 05 Mar 2019 15:10:57 -0000 Subject: [Python-checkins] bpo-33012: Fix compilation warnings in memoryobject.c and _collectionsmodule.c (GH-12179) Message-ID: https://github.com/python/cpython/commit/359a2f3daba49fde0d3a07fb3c7a8b051c450d08 commit: 359a2f3daba49fde0d3a07fb3c7a8b051c450d08 branch: master author: St?phane Wirtel committer: Victor Stinner date: 2019-03-05T16:10:53+01:00 summary: bpo-33012: Fix compilation warnings in memoryobject.c and _collectionsmodule.c (GH-12179) Cast function pointers to (void(*)(void)) before casting to (PyCFunction) to make "warning: cast between incompatible function types" false alarm quiet. files: M Modules/_collectionsmodule.c M Objects/memoryobject.c diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index 1c9e866e62f0..afd2731b8264 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -2453,7 +2453,7 @@ static PyMemberDef tuplegetter_members[] = { }; static PyMethodDef tuplegetter_methods[] = { - {"__reduce__", (PyCFunction) tuplegetter_reduce, METH_NOARGS, NULL}, + {"__reduce__", (PyCFunction)(void(*)(void))tuplegetter_reduce, METH_NOARGS, NULL}, {NULL}, }; diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c index d835704bdaae..6bbb413c3c10 100644 --- a/Objects/memoryobject.c +++ b/Objects/memoryobject.c @@ -3109,7 +3109,7 @@ Return a readonly version of the memoryview."); static PyMethodDef memory_methods[] = { {"release", (PyCFunction)memory_release, METH_NOARGS, memory_release_doc}, - {"tobytes", (PyCFunction)memory_tobytes, METH_VARARGS|METH_KEYWORDS, memory_tobytes_doc}, + {"tobytes", (PyCFunction)(void(*)(void))memory_tobytes, METH_VARARGS|METH_KEYWORDS, memory_tobytes_doc}, {"hex", (PyCFunction)memory_hex, METH_NOARGS, memory_hex_doc}, {"tolist", (PyCFunction)memory_tolist, METH_NOARGS, memory_tolist_doc}, {"cast", (PyCFunction)(void(*)(void))memory_cast, METH_VARARGS|METH_KEYWORDS, memory_cast_doc}, From webhook-mailer at python.org Tue Mar 5 10:17:46 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 05 Mar 2019 15:17:46 -0000 Subject: [Python-checkins] [3.7] bpo-29571: Fix test_re.test_locale_flag() (GH-12178) Message-ID: https://github.com/python/cpython/commit/279657bac2856039ba422c18a3d7f227b455e9d6 commit: 279657bac2856039ba422c18a3d7f227b455e9d6 branch: 3.7 author: Victor Stinner committer: GitHub date: 2019-03-05T16:17:43+01:00 summary: [3.7] bpo-29571: Fix test_re.test_locale_flag() (GH-12178) Use locale.getpreferredencoding() rather than locale.getlocale() to get the locale encoding. With some locales, locale.getlocale() returns the wrong encoding. For example, on Fedora 29, locale.getlocale() returns ISO-8859-1 encoding for the "en_IN" locale, whereas locale.getpreferredencoding() reports the correct encoding: UTF-8. On Windows, set temporarily the LC_CTYPE locale to the user preferred encoding to ensure that it uses the ANSI code page, to be consistent with locale.getpreferredencoding(). files: A Misc/NEWS.d/next/Tests/2019-03-05-13-48-39.bpo-29571.ecGuKR.rst M Lib/test/test_re.py diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index 0b710e3766ab..5ef6d7b12c50 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -1516,8 +1516,18 @@ def test_ascii_and_unicode_flag(self): self.assertRaises(re.error, re.compile, r'(?au)\w') def test_locale_flag(self): - import locale - _, enc = locale.getlocale(locale.LC_CTYPE) + # On Windows, Python 3.7 doesn't call setlocale(LC_CTYPE, "") at + # startup and so the LC_CTYPE locale uses Latin1 encoding by default, + # whereas getpreferredencoding() returns the ANSI code page. Set + # temporarily the LC_CTYPE locale to the user preferred encoding to + # ensure that it uses the ANSI code page. + oldloc = locale.setlocale(locale.LC_CTYPE, None) + locale.setlocale(locale.LC_CTYPE, "") + self.addCleanup(locale.setlocale, locale.LC_CTYPE, oldloc) + + # Get the current locale encoding + enc = locale.getpreferredencoding(False) + # Search non-ASCII letter for i in range(128, 256): try: diff --git a/Misc/NEWS.d/next/Tests/2019-03-05-13-48-39.bpo-29571.ecGuKR.rst b/Misc/NEWS.d/next/Tests/2019-03-05-13-48-39.bpo-29571.ecGuKR.rst new file mode 100644 index 000000000000..f89aec5e8d52 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-03-05-13-48-39.bpo-29571.ecGuKR.rst @@ -0,0 +1,6 @@ +Fix ``test_re.test_locale_flag()``: use ``locale.getpreferredencoding()`` +rather than ``locale.getlocale()`` to get the locale encoding. With some +locales, ``locale.getlocale()`` returns the wrong encoding. On Windows, set +temporarily the ``LC_CTYPE`` locale to the user preferred encoding to ensure +that it uses the ANSI code page, to be consistent with +``locale.getpreferredencoding()``. From webhook-mailer at python.org Tue Mar 5 11:37:56 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 05 Mar 2019 16:37:56 -0000 Subject: [Python-checkins] bpo-36142: Add _PyPreConfig.allocator (GH-12181) Message-ID: https://github.com/python/cpython/commit/b35be4b3334fbc471a39abbeb68110867b72e3e5 commit: b35be4b3334fbc471a39abbeb68110867b72e3e5 branch: master author: Victor Stinner committer: GitHub date: 2019-03-05T17:37:44+01:00 summary: bpo-36142: Add _PyPreConfig.allocator (GH-12181) * Move 'allocator' and 'dev_mode' fields from _PyCoreConfig to _PyPreConfig. * Fix InitConfigTests of test_embed: dev_mode sets allocator to "debug", add a new tests for env vars with dev mode enabled. files: M Include/cpython/coreconfig.h M Lib/test/test_embed.py M Programs/_testembed.c M Python/coreconfig.c M Python/preconfig.c M Python/pylifecycle.c M Python/sysmodule.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index 306577cf5b43..267357676bf0 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -80,6 +80,9 @@ typedef struct { Set by -X utf8 command line option and PYTHONUTF8 environment variable. If set to -1 (default), inherit Py_UTF8Mode value. */ int utf8_mode; + + int dev_mode; /* Development mode. PYTHONDEVMODE, -X dev */ + char *allocator; /* Memory allocator: PYTHONMALLOC */ } _PyPreConfig; #ifdef MS_WINDOWS @@ -109,9 +112,6 @@ typedef struct { int use_hash_seed; /* PYTHONHASHSEED=x */ unsigned long hash_seed; - const char *allocator; /* Memory allocator: PYTHONMALLOC */ - int dev_mode; /* PYTHONDEVMODE, -X dev */ - /* Enable faulthandler? Set to 1 by -X faulthandler and PYTHONFAULTHANDLER. -1 means unset. */ int faulthandler; diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 6c245ebcd194..1f236a985ad6 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -561,30 +561,36 @@ def test_init_from_config(self): } self.check_config("init_from_config", config) + INIT_ENV_CONFIG = { + 'use_hash_seed': 1, + 'hash_seed': 42, + 'allocator': 'malloc_debug', + 'tracemalloc': 2, + 'import_time': 1, + 'malloc_stats': 1, + 'utf8_mode': 1, + 'filesystem_encoding': 'utf-8', + 'filesystem_errors': UTF8_MODE_ERRORS, + 'inspect': 1, + 'optimization_level': 2, + 'pycache_prefix': 'env_pycache_prefix', + 'write_bytecode': 0, + 'verbose': 1, + 'buffered_stdio': 0, + 'stdio_encoding': 'iso8859-1', + 'stdio_errors': 'replace', + 'user_site_directory': 0, + 'faulthandler': 1, + } + def test_init_env(self): - config = { - 'use_hash_seed': 1, - 'hash_seed': 42, - 'allocator': 'malloc_debug', - 'tracemalloc': 2, - 'import_time': 1, - 'malloc_stats': 1, - 'utf8_mode': 1, - 'filesystem_encoding': 'utf-8', - 'filesystem_errors': self.UTF8_MODE_ERRORS, - 'inspect': 1, - 'optimization_level': 2, - 'pycache_prefix': 'env_pycache_prefix', - 'write_bytecode': 0, - 'verbose': 1, - 'buffered_stdio': 0, - 'stdio_encoding': 'iso8859-1', - 'stdio_errors': 'replace', - 'user_site_directory': 0, - 'faulthandler': 1, - 'dev_mode': 1, - } - self.check_config("init_env", config) + self.check_config("init_env", self.INIT_ENV_CONFIG) + + def test_init_env_dev_mode(self): + config = dict(self.INIT_ENV_CONFIG, + allocator='debug', + dev_mode=1) + self.check_config("init_env_dev_mode", config) def test_init_dev_mode(self): config = { diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 9923f8df20e9..70bf96036a2a 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -437,7 +437,7 @@ static int test_init_from_config(void) config.hash_seed = 123; putenv("PYTHONMALLOC=malloc"); - config.allocator = "malloc_debug"; + config.preconfig.allocator = "malloc_debug"; /* dev_mode=1 is tested in test_init_dev_mode() */ @@ -577,7 +577,6 @@ static void test_init_env_putenvs(void) putenv("PYTHONPYCACHEPREFIX=env_pycache_prefix"); putenv("PYTHONNOUSERSITE=1"); putenv("PYTHONFAULTHANDLER=1"); - putenv("PYTHONDEVMODE=1"); putenv("PYTHONIOENCODING=iso8859-1:replace"); /* FIXME: test PYTHONWARNINGS */ /* FIXME: test PYTHONEXECUTABLE */ @@ -589,6 +588,15 @@ static void test_init_env_putenvs(void) } +static void test_init_env_dev_mode_putenvs(void) +{ + test_init_env_putenvs(); + putenv("PYTHONMALLOC=malloc"); + putenv("PYTHONFAULTHANDLER="); + putenv("PYTHONDEVMODE=1"); +} + + static int test_init_env(void) { /* Test initialization from environment variables */ @@ -601,6 +609,18 @@ static int test_init_env(void) } +static int test_init_env_dev_mode(void) +{ + /* Test initialization from environment variables */ + Py_IgnoreEnvironmentFlag = 0; + test_init_env_dev_mode_putenvs(); + _testembed_Py_Initialize(); + dump_config(); + Py_Finalize(); + return 0; +} + + static int test_init_isolated(void) { /* Test _PyCoreConfig.isolated=1 */ @@ -615,7 +635,7 @@ static int test_init_isolated(void) /* Use path starting with "./" avoids a search along the PATH */ config.program_name = L"./_testembed"; - test_init_env_putenvs(); + test_init_env_dev_mode_putenvs(); _PyInitError err = _Py_InitializeFromConfig(&config); if (_Py_INIT_FAILED(err)) { _Py_ExitInitError(err); @@ -631,7 +651,7 @@ static int test_init_dev_mode(void) _PyCoreConfig config = _PyCoreConfig_INIT; putenv("PYTHONFAULTHANDLER="); putenv("PYTHONMALLOC="); - config.dev_mode = 1; + config.preconfig.dev_mode = 1; config.program_name = L"./_testembed"; _PyInitError err = _Py_InitializeFromConfig(&config); if (_Py_INIT_FAILED(err)) { @@ -673,6 +693,7 @@ static struct TestCase TestCases[] = { { "init_global_config", test_init_global_config }, { "init_from_config", test_init_from_config }, { "init_env", test_init_env }, + { "init_env_dev_mode", test_init_env_dev_mode }, { "init_dev_mode", test_init_dev_mode }, { "init_isolated", test_init_isolated }, { NULL, NULL } diff --git a/Python/coreconfig.c b/Python/coreconfig.c index e372de482475..42441e24aa61 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -521,8 +521,6 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) COPY_ATTR(use_hash_seed); COPY_ATTR(hash_seed); COPY_ATTR(_install_importlib); - COPY_ATTR(allocator); - COPY_ATTR(dev_mode); COPY_ATTR(faulthandler); COPY_ATTR(tracemalloc); COPY_ATTR(import_time); @@ -931,10 +929,6 @@ config_read_env_vars(_PyCoreConfig *config) "PYTHONLEGACYWINDOWSSTDIO"); #endif - if (config->allocator == NULL) { - config->allocator = _PyCoreConfig_GetEnv(config, "PYTHONMALLOC"); - } - if (_PyCoreConfig_GetEnv(config, "PYTHONDUMPREFS")) { config->dump_refs = 1; } @@ -1059,11 +1053,6 @@ config_read_complex_options(_PyCoreConfig *config) || config_get_xoption(config, L"importtime")) { config->import_time = 1; } - if (config_get_xoption(config, L"dev" ) || - _PyCoreConfig_GetEnv(config, "PYTHONDEVMODE")) - { - config->dev_mode = 1; - } _PyInitError err; if (config->tracemalloc < 0) { @@ -1427,13 +1416,10 @@ _PyCoreConfig_Read(_PyCoreConfig *config, const _PyPreConfig *preconfig) } /* default values */ - if (config->dev_mode) { + if (config->preconfig.dev_mode) { if (config->faulthandler < 0) { config->faulthandler = 1; } - if (config->allocator == NULL) { - config->allocator = "debug"; - } } if (config->use_hash_seed < 0) { config->use_hash_seed = 0; @@ -1572,8 +1558,6 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) SET_ITEM_INT(install_signal_handlers); SET_ITEM_INT(use_hash_seed); SET_ITEM_UINT(hash_seed); - SET_ITEM_STR(allocator); - SET_ITEM_INT(dev_mode); SET_ITEM_INT(faulthandler); SET_ITEM_INT(tracemalloc); SET_ITEM_INT(import_time); @@ -1950,7 +1934,7 @@ config_init_warnoptions(_PyCoreConfig *config, const _PyCmdline *cmdline) * the lowest precedence entries first so that later entries override them. */ - if (config->dev_mode) { + if (config->preconfig.dev_mode) { err = _Py_wstrlist_append(&config->nwarnoption, &config->warnoptions, L"default"); diff --git a/Python/preconfig.c b/Python/preconfig.c index 3befecfaa036..98e0edead177 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -125,6 +125,15 @@ precmdline_clear(_PyPreCmdline *cmdline) void _PyPreConfig_Clear(_PyPreConfig *config) { +#define CLEAR(ATTR) \ + do { \ + PyMem_RawFree(ATTR); \ + ATTR = NULL; \ + } while (0) + + CLEAR(config->allocator); + +#undef CLEAR } @@ -134,6 +143,15 @@ _PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2) _PyPreConfig_Clear(config); #define COPY_ATTR(ATTR) config->ATTR = config2->ATTR +#define COPY_STR_ATTR(ATTR) \ + do { \ + if (config2->ATTR != NULL) { \ + config->ATTR = _PyMem_RawStrdup(config2->ATTR); \ + if (config->ATTR == NULL) { \ + return -1; \ + } \ + } \ + } while (0) COPY_ATTR(isolated); COPY_ATTR(use_environment); @@ -143,8 +161,11 @@ _PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2) COPY_ATTR(legacy_windows_fs_encoding); #endif COPY_ATTR(utf8_mode); + COPY_ATTR(dev_mode); + COPY_STR_ATTR(allocator); #undef COPY_ATTR +#undef COPY_STR_ATTR return 0; } @@ -345,6 +366,7 @@ preconfig_read(_PyPreConfig *config, const _PyPreCmdline *cmdline) { _PyPreConfig_GetGlobalConfig(config); + /* isolated and use_environment */ if (config->isolated > 0) { config->use_environment = 0; } @@ -354,6 +376,7 @@ preconfig_read(_PyPreConfig *config, const _PyPreCmdline *cmdline) config->use_environment = 0; } + /* legacy_windows_fs_encoding, utf8_mode, coerce_c_locale */ if (config->use_environment) { #ifdef MS_WINDOWS _Py_get_env_flag(config, &config->legacy_windows_fs_encoding, @@ -414,11 +437,43 @@ preconfig_read(_PyPreConfig *config, const _PyPreCmdline *cmdline) if (config->utf8_mode < 0) { config->utf8_mode = 0; } + if (config->coerce_c_locale < 0) { + config->coerce_c_locale = 0; + } + + /* dev_mode */ + if ((cmdline && _Py_get_xoption(cmdline->nxoption, cmdline->xoptions, L"dev")) + || _PyPreConfig_GetEnv(config, "PYTHONDEVMODE")) + { + config->dev_mode = 1; + } + if (config->dev_mode < 0) { + config->dev_mode = 0; + } + + /* allocator */ + if (config->dev_mode && config->allocator == NULL) { + config->allocator = _PyMem_RawStrdup("debug"); + if (config->allocator == NULL) { + return _Py_INIT_NO_MEMORY(); + } + } + + if (config->allocator == NULL) { + const char *allocator = _PyPreConfig_GetEnv(config, "PYTHONMALLOC"); + if (allocator) { + config->allocator = _PyMem_RawStrdup(allocator); + if (config->allocator == NULL) { + return _Py_INIT_NO_MEMORY(); + } + } + } assert(config->coerce_c_locale >= 0); assert(config->utf8_mode >= 0); assert(config->isolated >= 0); assert(config->use_environment >= 0); + assert(config->dev_mode >= 0); return _Py_INIT_OK(); } @@ -448,6 +503,12 @@ _PyPreConfig_AsDict(const _PyPreConfig *config, PyObject *dict) } while (0) #define SET_ITEM_INT(ATTR) \ SET_ITEM(#ATTR, PyLong_FromLong(config->ATTR)) +#define FROM_STRING(STR) \ + ((STR != NULL) ? \ + PyUnicode_FromString(STR) \ + : (Py_INCREF(Py_None), Py_None)) +#define SET_ITEM_STR(ATTR) \ + SET_ITEM(#ATTR, FROM_STRING(config->ATTR)) SET_ITEM_INT(isolated); SET_ITEM_INT(use_environment); @@ -457,13 +518,17 @@ _PyPreConfig_AsDict(const _PyPreConfig *config, PyObject *dict) #ifdef MS_WINDOWS SET_ITEM_INT(legacy_windows_fs_encoding); #endif + SET_ITEM_INT(dev_mode); + SET_ITEM_STR(allocator); return 0; fail: return -1; +#undef FROM_STRING #undef SET_ITEM #undef SET_ITEM_INT +#undef SET_ITEM_STR } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index dec890485b33..c955a1d94fd6 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -482,9 +482,9 @@ _Py_Initialize_ReconfigureCore(PyInterpreterState **interp_p, /* bpo-34008: For backward compatibility reasons, calling Py_Main() after Py_Initialize() ignores the new configuration. */ - if (core_config->allocator != NULL) { + if (core_config->preconfig.allocator != NULL) { const char *allocator = _PyMem_GetAllocatorsName(); - if (allocator == NULL || strcmp(core_config->allocator, allocator) != 0) { + if (allocator == NULL || strcmp(core_config->preconfig.allocator, allocator) != 0) { return _Py_INIT_USER_ERR("cannot modify memory allocator " "after first Py_Initialize()"); } @@ -521,8 +521,8 @@ pycore_init_runtime(const _PyCoreConfig *core_config) return err; } - if (core_config->allocator != NULL) { - if (_PyMem_SetupAllocators(core_config->allocator) < 0) { + if (core_config->preconfig.allocator != NULL) { + if (_PyMem_SetupAllocators(core_config->preconfig.allocator) < 0) { return _Py_INIT_USER_ERR("Unknown PYTHONMALLOC allocator"); } } diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 50ba1a71e4c5..99fd460ff5ab 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -2180,7 +2180,7 @@ make_flags(void) SetFlag(config->quiet); SetFlag(config->use_hash_seed == 0 || config->hash_seed != 0); SetFlag(config->preconfig.isolated); - PyStructSequence_SET_ITEM(seq, pos++, PyBool_FromLong(config->dev_mode)); + PyStructSequence_SET_ITEM(seq, pos++, PyBool_FromLong(config->preconfig.dev_mode)); SetFlag(config->preconfig.utf8_mode); #undef SetFlag From webhook-mailer at python.org Tue Mar 5 11:41:13 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Tue, 05 Mar 2019 16:41:13 -0000 Subject: [Python-checkins] Fix the C function signature for _collections._tuplegetter.__reduce__. (GH-12180) Message-ID: https://github.com/python/cpython/commit/adfffc7343ce7ebc88ec734a803d3247ba8927fb commit: adfffc7343ce7ebc88ec734a803d3247ba8927fb branch: master author: Serhiy Storchaka committer: GitHub date: 2019-03-05T18:41:09+02:00 summary: Fix the C function signature for _collections._tuplegetter.__reduce__. (GH-12180) Correctly fixes bpo-36197. files: M Modules/_collectionsmodule.c diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index afd2731b8264..8fb5fc233a65 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -2441,7 +2441,7 @@ tuplegetter_dealloc(_tuplegetterobject *self) } static PyObject* -tuplegetter_reduce(_tuplegetterobject *self) +tuplegetter_reduce(_tuplegetterobject *self, PyObject *Py_UNUSED(ignored)) { return Py_BuildValue("(O(nO))", (PyObject*) Py_TYPE(self), self->index, self->doc); } @@ -2453,7 +2453,7 @@ static PyMemberDef tuplegetter_members[] = { }; static PyMethodDef tuplegetter_methods[] = { - {"__reduce__", (PyCFunction)(void(*)(void))tuplegetter_reduce, METH_NOARGS, NULL}, + {"__reduce__", (PyCFunction)tuplegetter_reduce, METH_NOARGS, NULL}, {NULL}, }; From webhook-mailer at python.org Tue Mar 5 13:42:20 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Tue, 05 Mar 2019 18:42:20 -0000 Subject: [Python-checkins] bpo-36187: Remove NamedStore. (GH-12167) Message-ID: https://github.com/python/cpython/commit/d8b3a98c9098c66a714fd5593e1928af0ffbc631 commit: d8b3a98c9098c66a714fd5593e1928af0ffbc631 branch: master author: Serhiy Storchaka committer: GitHub date: 2019-03-05T20:42:06+02:00 summary: bpo-36187: Remove NamedStore. (GH-12167) NamedStore has been replaced with Store. The difference between NamedStore and Store is handled when precess the NamedExpr node one level upper. files: M Include/Python-ast.h M Lib/test/test_syntax.py M Parser/Python.asdl M Python/Python-ast.c M Python/ast.c M Python/compile.c M Python/symtable.c diff --git a/Include/Python-ast.h b/Include/Python-ast.h index 106cecff887e..52ba12755ef9 100644 --- a/Include/Python-ast.h +++ b/Include/Python-ast.h @@ -17,7 +17,7 @@ typedef struct _stmt *stmt_ty; typedef struct _expr *expr_ty; typedef enum _expr_context { Load=1, Store=2, Del=3, AugLoad=4, AugStore=5, - Param=6, NamedStore=7 } expr_context_ty; + Param=6 } expr_context_ty; typedef struct _slice *slice_ty; diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index a0f487d4ed76..4a2899ebca30 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -43,6 +43,10 @@ Traceback (most recent call last): SyntaxError: cannot assign to True +>>> (True := 1) +Traceback (most recent call last): +SyntaxError: cannot use named assignment with True + >>> obj.__debug__ = 1 Traceback (most recent call last): SyntaxError: cannot assign to __debug__ diff --git a/Parser/Python.asdl b/Parser/Python.asdl index 85b686d78a3b..1ccd2ca223f0 100644 --- a/Parser/Python.asdl +++ b/Parser/Python.asdl @@ -91,7 +91,7 @@ module Python -- col_offset is the byte offset in the utf8 string the parser uses attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset) - expr_context = Load | Store | Del | AugLoad | AugStore | Param | NamedStore + expr_context = Load | Store | Del | AugLoad | AugStore | Param slice = Slice(expr? lower, expr? upper, expr? step) | ExtSlice(slice* dims) diff --git a/Python/Python-ast.c b/Python/Python-ast.c index 5467d192ee69..92ec15757144 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -365,8 +365,7 @@ static char *Tuple_fields[]={ }; static PyTypeObject *expr_context_type; static PyObject *Load_singleton, *Store_singleton, *Del_singleton, -*AugLoad_singleton, *AugStore_singleton, *Param_singleton, -*NamedStore_singleton; +*AugLoad_singleton, *AugStore_singleton, *Param_singleton; static PyObject* ast2obj_expr_context(expr_context_ty); static PyTypeObject *Load_type; static PyTypeObject *Store_type; @@ -374,7 +373,6 @@ static PyTypeObject *Del_type; static PyTypeObject *AugLoad_type; static PyTypeObject *AugStore_type; static PyTypeObject *Param_type; -static PyTypeObject *NamedStore_type; static PyTypeObject *slice_type; static PyObject* ast2obj_slice(void*); static PyTypeObject *Slice_type; @@ -993,10 +991,6 @@ static int init_types(void) if (!Param_type) return 0; Param_singleton = PyType_GenericNew(Param_type, NULL, NULL); if (!Param_singleton) return 0; - NamedStore_type = make_type("NamedStore", expr_context_type, NULL, 0); - if (!NamedStore_type) return 0; - NamedStore_singleton = PyType_GenericNew(NamedStore_type, NULL, NULL); - if (!NamedStore_singleton) return 0; slice_type = make_type("slice", &AST_type, NULL, 0); if (!slice_type) return 0; if (!add_attributes(slice_type, NULL, 0)) return 0; @@ -3657,9 +3651,6 @@ PyObject* ast2obj_expr_context(expr_context_ty o) case Param: Py_INCREF(Param_singleton); return Param_singleton; - case NamedStore: - Py_INCREF(NamedStore_singleton); - return NamedStore_singleton; default: /* should never happen, but just in case ... */ PyErr_Format(PyExc_SystemError, "unknown expr_context found"); @@ -7608,14 +7599,6 @@ obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena* arena) *out = Param; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)NamedStore_type); - if (isinstance == -1) { - return 1; - } - if (isinstance) { - *out = NamedStore; - return 0; - } PyErr_Format(PyExc_TypeError, "expected some sort of expr_context, but got %R", obj); return 1; @@ -8828,8 +8811,6 @@ PyInit__ast(void) return NULL; if (PyDict_SetItemString(d, "Param", (PyObject*)Param_type) < 0) return NULL; - if (PyDict_SetItemString(d, "NamedStore", (PyObject*)NamedStore_type) < 0) - return NULL; if (PyDict_SetItemString(d, "slice", (PyObject*)slice_type) < 0) return NULL; if (PyDict_SetItemString(d, "Slice", (PyObject*)Slice_type) < 0) return diff --git a/Python/ast.c b/Python/ast.c index 62ff868de5e4..2e960485f47c 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -94,8 +94,6 @@ expr_context_name(expr_context_ty ctx) return "Load"; case Store: return "Store"; - case NamedStore: - return "NamedStore"; case Del: return "Del"; case AugLoad: @@ -1029,6 +1027,80 @@ copy_location(expr_ty e, const node *n) return e; } +static const char * +get_expr_name(expr_ty e) +{ + switch (e->kind) { + case Attribute_kind: + return "attribute"; + case Subscript_kind: + return "subscript"; + case Starred_kind: + return "starred"; + case Name_kind: + return "name"; + case List_kind: + return "list"; + case Tuple_kind: + return "tuple"; + case Lambda_kind: + return "lambda"; + case Call_kind: + return "function call"; + case BoolOp_kind: + case BinOp_kind: + case UnaryOp_kind: + return "operator"; + case GeneratorExp_kind: + return "generator expression"; + case Yield_kind: + case YieldFrom_kind: + return "yield expression"; + case Await_kind: + return "await expression"; + case ListComp_kind: + return "list comprehension"; + case SetComp_kind: + return "set comprehension"; + case DictComp_kind: + return "dict comprehension"; + case Dict_kind: + return "dict display"; + case Set_kind: + return "set display"; + case JoinedStr_kind: + case FormattedValue_kind: + return "f-string expression"; + case Constant_kind: { + PyObject *value = e->v.Constant.value; + if (value == Py_None) { + return "None"; + } + if (value == Py_False) { + return "False"; + } + if (value == Py_True) { + return "True"; + } + if (value == Py_Ellipsis) { + return "Ellipsis"; + } + return "literal"; + } + case Compare_kind: + return "comparison"; + case IfExp_kind: + return "conditional expression"; + case NamedExpr_kind: + return "named expression"; + default: + PyErr_Format(PyExc_SystemError, + "unexpected expression in assignment %d (line %d)", + e->kind, e->lineno); + return NULL; + } +} + /* Set the context ctx for expr_ty e, recursively traversing e. Only sets context for expr kinds that "can appear in assignment context" @@ -1040,10 +1112,6 @@ static int set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n) { asdl_seq *s = NULL; - /* If a particular expression type can't be used for assign / delete, - set expr_name to its name and an error message will be generated. - */ - const char* expr_name = NULL; /* The ast defines augmented store and load contexts, but the implementation here doesn't actually use them. The code may be @@ -1056,136 +1124,41 @@ set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n) switch (e->kind) { case Attribute_kind: - if (ctx == NamedStore) { - expr_name = "attribute"; - break; - } - e->v.Attribute.ctx = ctx; if (ctx == Store && forbidden_name(c, e->v.Attribute.attr, n, 1)) return 0; break; case Subscript_kind: - if (ctx == NamedStore) { - expr_name = "subscript"; - break; - } - e->v.Subscript.ctx = ctx; break; case Starred_kind: - if (ctx == NamedStore) { - expr_name = "starred"; - break; - } - e->v.Starred.ctx = ctx; if (!set_context(c, e->v.Starred.value, ctx, n)) return 0; break; case Name_kind: - if (ctx == Store || ctx == NamedStore) { + if (ctx == Store) { if (forbidden_name(c, e->v.Name.id, n, 0)) return 0; /* forbidden_name() calls ast_error() */ } e->v.Name.ctx = ctx; break; case List_kind: - if (ctx == NamedStore) { - expr_name = "list"; - break; - } - e->v.List.ctx = ctx; s = e->v.List.elts; break; case Tuple_kind: - if (ctx == NamedStore) { - expr_name = "tuple"; - break; - } - e->v.Tuple.ctx = ctx; s = e->v.Tuple.elts; break; - case Lambda_kind: - expr_name = "lambda"; - break; - case Call_kind: - expr_name = "function call"; - break; - case BoolOp_kind: - case BinOp_kind: - case UnaryOp_kind: - expr_name = "operator"; - break; - case GeneratorExp_kind: - expr_name = "generator expression"; - break; - case Yield_kind: - case YieldFrom_kind: - expr_name = "yield expression"; - break; - case Await_kind: - expr_name = "await expression"; - break; - case ListComp_kind: - expr_name = "list comprehension"; - break; - case SetComp_kind: - expr_name = "set comprehension"; - break; - case DictComp_kind: - expr_name = "dict comprehension"; - break; - case Dict_kind: - expr_name = "dict display"; - break; - case Set_kind: - expr_name = "set display"; - break; - case JoinedStr_kind: - case FormattedValue_kind: - expr_name = "f-string expression"; - break; - case Constant_kind: { - PyObject *value = e->v.Constant.value; - if (value == Py_None || value == Py_False || value == Py_True - || value == Py_Ellipsis) - { - return ast_error(c, n, "cannot %s %R", - ctx == Store ? "assign to" : "delete", - value); + default: { + const char *expr_name = get_expr_name(e); + if (expr_name != NULL) { + ast_error(c, n, "cannot %s %s", + ctx == Store ? "assign to" : "delete", + expr_name); } - expr_name = "literal"; - break; - } - case Compare_kind: - expr_name = "comparison"; - break; - case IfExp_kind: - expr_name = "conditional expression"; - break; - case NamedExpr_kind: - expr_name = "named expression"; - break; - default: - PyErr_Format(PyExc_SystemError, - "unexpected expression in %sassignment %d (line %d)", - ctx == NamedStore ? "named ": "", - e->kind, e->lineno); return 0; - } - /* Check for error string set by switch */ - if (expr_name) { - if (ctx == NamedStore) { - return ast_error(c, n, "cannot use named assignment with %s", - expr_name); - } - else { - return ast_error(c, n, "cannot %s %s", - ctx == Store ? "assign to" : "delete", - expr_name); } } @@ -1895,7 +1868,15 @@ ast_for_namedexpr(struct compiling *c, const node *n) if (!value) return NULL; - if (!set_context(c, target, NamedStore, n)) + if (target->kind != Name_kind) { + const char *expr_name = get_expr_name(target); + if (expr_name != NULL) { + ast_error(c, n, "cannot use named assignment with %s", expr_name); + } + return NULL; + } + + if (!set_context(c, target, Store, n)) return NULL; return NamedExpr(target, value, LINENO(n), n->n_col_offset, n->n_end_lineno, diff --git a/Python/compile.c b/Python/compile.c index 18877d96da10..c26210675d87 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -3429,7 +3429,6 @@ compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx) op = (c->u->u_ste->ste_type == ClassBlock) ? LOAD_CLASSDEREF : LOAD_DEREF; break; case Store: - case NamedStore: op = STORE_DEREF; break; case AugLoad: @@ -3447,7 +3446,6 @@ compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx) switch (ctx) { case Load: op = LOAD_FAST; break; case Store: - case NamedStore: op = STORE_FAST; break; case Del: op = DELETE_FAST; break; @@ -3466,7 +3464,6 @@ compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx) switch (ctx) { case Load: op = LOAD_GLOBAL; break; case Store: - case NamedStore: op = STORE_GLOBAL; break; case Del: op = DELETE_GLOBAL; break; @@ -3484,7 +3481,6 @@ compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx) switch (ctx) { case Load: op = LOAD_NAME; break; case Store: - case NamedStore: op = STORE_NAME; break; case Del: op = DELETE_NAME; break; @@ -3604,7 +3600,7 @@ static int compiler_list(struct compiler *c, expr_ty e) { asdl_seq *elts = e->v.List.elts; - if (e->v.List.ctx == Store || e->v.List.ctx == NamedStore) { + if (e->v.List.ctx == Store) { return assignment_helper(c, elts); } else if (e->v.List.ctx == Load) { @@ -3620,7 +3616,7 @@ static int compiler_tuple(struct compiler *c, expr_ty e) { asdl_seq *elts = e->v.Tuple.elts; - if (e->v.Tuple.ctx == Store || e->v.Tuple.ctx == NamedStore) { + if (e->v.Tuple.ctx == Store) { return assignment_helper(c, elts); } else if (e->v.Tuple.ctx == Load) { @@ -5154,7 +5150,6 @@ compiler_handle_subscr(struct compiler *c, const char *kind, case AugStore:/* fall through to Store */ case Store: op = STORE_SUBSCR; break; case Del: op = DELETE_SUBSCR; break; - case NamedStore: case Param: PyErr_Format(PyExc_SystemError, "invalid %s kind %d in subscript\n", diff --git a/Python/symtable.c b/Python/symtable.c index 6e2df2f3c9ce..1d68a7d939fa 100644 --- a/Python/symtable.c +++ b/Python/symtable.c @@ -1452,6 +1452,10 @@ symtable_visit_expr(struct symtable *st, expr_ty e) } switch (e->kind) { case NamedExpr_kind: + if (st->st_cur->ste_comprehension) { + if (!symtable_extend_namedexpr_scope(st, e->v.NamedExpr.target)) + VISIT_QUIT(st, 0); + } VISIT(st, expr, e->v.NamedExpr.value); VISIT(st, expr, e->v.NamedExpr.target); break; @@ -1555,11 +1559,6 @@ symtable_visit_expr(struct symtable *st, expr_ty e) VISIT(st, expr, e->v.Starred.value); break; case Name_kind: - /* Special-case: named expr */ - if (e->v.Name.ctx == NamedStore && st->st_cur->ste_comprehension) { - if(!symtable_extend_namedexpr_scope(st, e)) - VISIT_QUIT(st, 0); - } if (!symtable_add_def(st, e->v.Name.id, e->v.Name.ctx == Load ? USE : DEF_LOCAL)) VISIT_QUIT(st, 0); From webhook-mailer at python.org Tue Mar 5 17:31:59 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 05 Mar 2019 22:31:59 -0000 Subject: [Python-checkins] bpo-36142: Add _PyMem_GetDebugAllocatorsName() (GH-12185) Message-ID: https://github.com/python/cpython/commit/a9df651eb4c18a07ec309df190419613e95cba7b commit: a9df651eb4c18a07ec309df190419613e95cba7b branch: master author: Victor Stinner committer: GitHub date: 2019-03-05T23:31:54+01:00 summary: bpo-36142: Add _PyMem_GetDebugAllocatorsName() (GH-12185) The development mode now uses the effective name of the debug memory allocator ("pymalloc_debug" or "malloc_debug"). So the name doesn't change after setting the memory allocator. files: M Include/internal/pycore_pymem.h M Lib/test/test_embed.py M Objects/obmalloc.c M Programs/_testembed.c M Python/preconfig.c diff --git a/Include/internal/pycore_pymem.h b/Include/internal/pycore_pymem.h index 1e7da87cd75c..fedc7cc119bf 100644 --- a/Include/internal/pycore_pymem.h +++ b/Include/internal/pycore_pymem.h @@ -155,6 +155,8 @@ PyAPI_FUNC(int) _PyMem_SetDefaultAllocator( PyMemAllocatorDomain domain, PyMemAllocatorEx *old_alloc); +PyAPI_FUNC(const char*) _PyMem_GetDebugAllocatorsName(void); + #ifdef __cplusplus } #endif diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 1f236a985ad6..2827e8708e11 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -336,6 +336,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'legacy_windows_fs_encoding': 0, 'legacy_windows_stdio': 0, }) + DEBUG_ALLOCATOR = 'pymalloc_debug' if support.with_pymalloc() else 'malloc_debug' # main config COPY_MAIN_CONFIG = ( @@ -588,7 +589,7 @@ def test_init_env(self): def test_init_env_dev_mode(self): config = dict(self.INIT_ENV_CONFIG, - allocator='debug', + allocator=self.DEBUG_ALLOCATOR, dev_mode=1) self.check_config("init_env_dev_mode", config) @@ -596,7 +597,7 @@ def test_init_dev_mode(self): config = { 'dev_mode': 1, 'faulthandler': 1, - 'allocator': 'debug', + 'allocator': self.DEBUG_ALLOCATOR, } self.check_config("init_dev_mode", config) diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index 1c2a32050f93..1afbcca14f28 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -221,6 +221,20 @@ static PyMemAllocatorEx _PyObject = PYOBJ_ALLOC; #endif +/* Get the effective name of "debug" memory allocators, + as if _PyMem_GetAllocatorsName() is called after + _PyMem_SetupAllocators("debug"). */ +const char* +_PyMem_GetDebugAllocatorsName(void) +{ +#ifdef WITH_PYMALLOC + return "pymalloc_debug"; +#else + return "malloc_debug"; +#endif +} + + static int pymem_set_default_allocator(PyMemAllocatorDomain domain, int debug, PyMemAllocatorEx *old_alloc) diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 70bf96036a2a..170672e4439a 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -139,6 +139,9 @@ static int test_forced_io_encoding(void) static int test_pre_initialization_api(void) { + /* the test doesn't support custom memory allocators */ + putenv("PYTHONMALLOC="); + /* Leading "./" ensures getpath.c can still find the standard library */ _Py_EMBED_PREINIT_CHECK("Checking Py_DecodeLocale\n"); wchar_t *program = Py_DecodeLocale("./spam", NULL); @@ -235,6 +238,9 @@ static void bpo20891_thread(void *lockp) static int test_bpo20891(void) { + /* the test doesn't support custom memory allocators */ + putenv("PYTHONMALLOC="); + /* bpo-20891: Calling PyGILState_Ensure in a non-Python thread before calling PyEval_InitThreads() must not crash. PyGILState_Ensure() must call PyEval_InitThreads() for us in this case. */ diff --git a/Python/preconfig.c b/Python/preconfig.c index 98e0edead177..46e1809fc548 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -453,7 +453,8 @@ preconfig_read(_PyPreConfig *config, const _PyPreCmdline *cmdline) /* allocator */ if (config->dev_mode && config->allocator == NULL) { - config->allocator = _PyMem_RawStrdup("debug"); + const char *allocator = _PyMem_GetDebugAllocatorsName(); + config->allocator = _PyMem_RawStrdup(allocator); if (config->allocator == NULL) { return _Py_INIT_NO_MEMORY(); } From webhook-mailer at python.org Tue Mar 5 18:37:01 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 05 Mar 2019 23:37:01 -0000 Subject: [Python-checkins] bpo-36142: _PyPreConfig_Write() sets the allocator (GH-12186) Message-ID: https://github.com/python/cpython/commit/7d2ef3ef5042356aaeaf832ad4204b7dad2e1b8c commit: 7d2ef3ef5042356aaeaf832ad4204b7dad2e1b8c branch: master author: Victor Stinner committer: GitHub date: 2019-03-06T00:36:56+01:00 summary: bpo-36142: _PyPreConfig_Write() sets the allocator (GH-12186) * _PyPreConfig_Write() now sets the memory allocator. * _PyPreConfig_Write() gets a return type: _PyInitError. * _Py_InitializeCore() now reads and writes the pre-configuration (set the memory allocator, configure the locale) before reading and writing the core configuration. files: M Include/internal/pycore_coreconfig.h M Modules/main.c M Python/preconfig.c M Python/pylifecycle.c diff --git a/Include/internal/pycore_coreconfig.h b/Include/internal/pycore_coreconfig.h index 8df182c09f6f..b34416bfd7d9 100644 --- a/Include/internal/pycore_coreconfig.h +++ b/Include/internal/pycore_coreconfig.h @@ -59,7 +59,7 @@ PyAPI_FUNC(int) _PyPreConfig_AsDict(const _PyPreConfig *config, PyObject *dict); PyAPI_FUNC(_PyInitError) _PyPreConfig_ReadFromArgv(_PyPreConfig *config, const _PyArgv *args); -PyAPI_FUNC(void) _PyPreConfig_Write(const _PyPreConfig *config); +PyAPI_FUNC(_PyInitError) _PyPreConfig_Write(const _PyPreConfig *config); /* --- _PyCoreConfig ---------------------------------------------- */ diff --git a/Modules/main.c b/Modules/main.c index 34032adca57e..9a2347e2b277 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -304,8 +304,7 @@ preconfig_read_write(_PyPreConfig *config, const _PyArgv *args) return err; } - _PyPreConfig_Write(config); - return _Py_INIT_OK(); + return _PyPreConfig_Write(config); } diff --git a/Python/preconfig.c b/Python/preconfig.c index 46e1809fc548..69242032151a 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -741,9 +741,35 @@ _PyPreConfig_ReadFromArgv(_PyPreConfig *config, const _PyArgv *args) } -void +static _PyInitError +_PyPreConfig_Reconfigure(const _PyPreConfig *config) +{ + if (config->allocator != NULL) { + const char *allocator = _PyMem_GetAllocatorsName(); + if (allocator == NULL || strcmp(config->allocator, allocator) != 0) { + return _Py_INIT_USER_ERR("cannot modify memory allocator " + "after first Py_Initialize()"); + } + } + return _Py_INIT_OK(); +} + + +_PyInitError _PyPreConfig_Write(const _PyPreConfig *config) { + if (_PyRuntime.core_initialized) { + /* bpo-34008: Calling Py_Main() after Py_Initialize() ignores + the new configuration. */ + return _PyPreConfig_Reconfigure(config); + } + + if (config->allocator != NULL) { + if (_PyMem_SetupAllocators(config->allocator) < 0) { + return _Py_INIT_USER_ERR("Unknown PYTHONMALLOC allocator"); + } + } + _PyPreConfig_SetGlobalConfig(config); if (config->coerce_c_locale) { @@ -752,4 +778,6 @@ _PyPreConfig_Write(const _PyPreConfig *config) /* Set LC_CTYPE to the user preferred locale */ _Py_SetLocaleFromEnv(LC_CTYPE); + + return _Py_INIT_OK(); } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index c955a1d94fd6..f72af8638402 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -480,16 +480,6 @@ _Py_Initialize_ReconfigureCore(PyInterpreterState **interp_p, } *interp_p = interp; - /* bpo-34008: For backward compatibility reasons, calling Py_Main() after - Py_Initialize() ignores the new configuration. */ - if (core_config->preconfig.allocator != NULL) { - const char *allocator = _PyMem_GetAllocatorsName(); - if (allocator == NULL || strcmp(core_config->preconfig.allocator, allocator) != 0) { - return _Py_INIT_USER_ERR("cannot modify memory allocator " - "after first Py_Initialize()"); - } - } - _PyCoreConfig_SetGlobalConfig(core_config); if (_PyCoreConfig_Copy(&interp->core_config, core_config) < 0) { @@ -521,12 +511,6 @@ pycore_init_runtime(const _PyCoreConfig *core_config) return err; } - if (core_config->preconfig.allocator != NULL) { - if (_PyMem_SetupAllocators(core_config->preconfig.allocator) < 0) { - return _Py_INIT_USER_ERR("Unknown PYTHONMALLOC allocator"); - } - } - /* Py_Finalize leaves _Py_Finalizing set in order to help daemon * threads behave a little more gracefully at interpreter shutdown. * We clobber it here so the new interpreter can start with a clean @@ -728,6 +712,65 @@ _Py_InitializeCore_impl(PyInterpreterState **interp_p, return _Py_INIT_OK(); } + +static _PyInitError +pyinit_preconfig(_PyPreConfig *preconfig, const _PyPreConfig *src_preconfig) +{ + _PyInitError err; + PyMemAllocatorEx old_alloc; + + /* Set LC_CTYPE to the user preferred locale */ + _Py_SetLocaleFromEnv(LC_CTYPE); + + _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); + if (_PyPreConfig_Copy(preconfig, src_preconfig) >= 0) { + err = _PyPreConfig_Read(preconfig); + } + else { + err = _Py_INIT_ERR("failed to copy pre config"); + } + PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); + + if (_Py_INIT_FAILED(err)) { + return err; + } + + return _PyPreConfig_Write(preconfig); +} + + +static _PyInitError +pyinit_coreconfig(_PyCoreConfig *config, const _PyCoreConfig *src_config, + PyInterpreterState **interp_p) +{ + PyMemAllocatorEx old_alloc; + _PyInitError err; + + /* Set LC_CTYPE to the user preferred locale */ + _Py_SetLocaleFromEnv(LC_CTYPE); + + _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); + if (_PyCoreConfig_Copy(config, src_config) >= 0) { + err = _PyCoreConfig_Read(config, NULL); + } + else { + err = _Py_INIT_ERR("failed to copy core config"); + } + PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); + + if (_Py_INIT_FAILED(err)) { + return err; + } + + if (!_PyRuntime.core_initialized) { + return _Py_InitializeCore_impl(interp_p, config); + } + else { + return _Py_Initialize_ReconfigureCore(interp_p, config); + } +} + + /* Begin interpreter initialization * * On return, the first thread and interpreter state have been created, @@ -749,41 +792,23 @@ _PyInitError _Py_InitializeCore(PyInterpreterState **interp_p, const _PyCoreConfig *src_config) { - assert(src_config != NULL); - PyMemAllocatorEx old_alloc; _PyInitError err; - /* Copy the configuration, since _PyCoreConfig_Read() modifies it - (and the input configuration is read only). */ - _PyCoreConfig config = _PyCoreConfig_INIT; - - /* Set LC_CTYPE to the user preferred locale */ - _Py_SetLocaleFromEnv(LC_CTYPE); + assert(src_config != NULL); - _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - if (_PyCoreConfig_Copy(&config, src_config) >= 0) { - err = _PyCoreConfig_Read(&config, NULL); - } - else { - err = _Py_INIT_ERR("failed to copy core config"); - } - PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); + _PyCoreConfig local_config = _PyCoreConfig_INIT; + err = pyinit_preconfig(&local_config.preconfig, &src_config->preconfig); if (_Py_INIT_FAILED(err)) { goto done; } - if (!_PyRuntime.core_initialized) { - err = _Py_InitializeCore_impl(interp_p, &config); - } - else { - err = _Py_Initialize_ReconfigureCore(interp_p, &config); - } + err = pyinit_coreconfig(&local_config, src_config, interp_p); done: _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - _PyCoreConfig_Clear(&config); + _PyCoreConfig_Clear(&local_config); PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); return err; From webhook-mailer at python.org Tue Mar 5 19:13:50 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 06 Mar 2019 00:13:50 -0000 Subject: [Python-checkins] bpo-36142: Add _PyPreConfig_SetAllocator() (GH-12187) Message-ID: https://github.com/python/cpython/commit/c656e25667c9acc0d13e5bb16d3df2938d0f614b commit: c656e25667c9acc0d13e5bb16d3df2938d0f614b branch: master author: Victor Stinner committer: GitHub date: 2019-03-06T01:13:43+01:00 summary: bpo-36142: Add _PyPreConfig_SetAllocator() (GH-12187) * _PyPreConfig_Write() now reallocates the pre-configuration with the new memory allocator. * It is no longer needed to force the "default raw memory allocator" to clear pre-configuration and core configuration. Simplify the code. * _PyPreConfig_Write() now does nothing if called after Py_Initialize(): no longer check if the allocator is the same. * Remove _PyMem_GetDebugAllocatorsName(): dev mode sets again allocator to "debug". files: M Include/internal/pycore_coreconfig.h M Include/internal/pycore_pymem.h M Lib/test/test_embed.py M Modules/main.c M Objects/obmalloc.c M Python/preconfig.c M Python/pylifecycle.c diff --git a/Include/internal/pycore_coreconfig.h b/Include/internal/pycore_coreconfig.h index b34416bfd7d9..0917a6ac2a34 100644 --- a/Include/internal/pycore_coreconfig.h +++ b/Include/internal/pycore_coreconfig.h @@ -59,7 +59,7 @@ PyAPI_FUNC(int) _PyPreConfig_AsDict(const _PyPreConfig *config, PyObject *dict); PyAPI_FUNC(_PyInitError) _PyPreConfig_ReadFromArgv(_PyPreConfig *config, const _PyArgv *args); -PyAPI_FUNC(_PyInitError) _PyPreConfig_Write(const _PyPreConfig *config); +PyAPI_FUNC(_PyInitError) _PyPreConfig_Write(_PyPreConfig *config); /* --- _PyCoreConfig ---------------------------------------------- */ diff --git a/Include/internal/pycore_pymem.h b/Include/internal/pycore_pymem.h index fedc7cc119bf..1e7da87cd75c 100644 --- a/Include/internal/pycore_pymem.h +++ b/Include/internal/pycore_pymem.h @@ -155,8 +155,6 @@ PyAPI_FUNC(int) _PyMem_SetDefaultAllocator( PyMemAllocatorDomain domain, PyMemAllocatorEx *old_alloc); -PyAPI_FUNC(const char*) _PyMem_GetDebugAllocatorsName(void); - #ifdef __cplusplus } #endif diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 2827e8708e11..1f236a985ad6 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -336,7 +336,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'legacy_windows_fs_encoding': 0, 'legacy_windows_stdio': 0, }) - DEBUG_ALLOCATOR = 'pymalloc_debug' if support.with_pymalloc() else 'malloc_debug' # main config COPY_MAIN_CONFIG = ( @@ -589,7 +588,7 @@ def test_init_env(self): def test_init_env_dev_mode(self): config = dict(self.INIT_ENV_CONFIG, - allocator=self.DEBUG_ALLOCATOR, + allocator='debug', dev_mode=1) self.check_config("init_env_dev_mode", config) @@ -597,7 +596,7 @@ def test_init_dev_mode(self): config = { 'dev_mode': 1, 'faulthandler': 1, - 'allocator': self.DEBUG_ALLOCATOR, + 'allocator': 'debug', } self.check_config("init_dev_mode", config) diff --git a/Modules/main.c b/Modules/main.c index 9a2347e2b277..14055c8101c8 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -289,17 +289,9 @@ _PyMainInterpreterConfig_Read(_PyMainInterpreterConfig *main_config, static _PyInitError preconfig_read_write(_PyPreConfig *config, const _PyArgv *args) { - _PyInitError err; - - PyMemAllocatorEx old_alloc; - _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - _PyPreConfig_GetGlobalConfig(config); - err = _PyPreConfig_ReadFromArgv(config, args); - - PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - + _PyInitError err = _PyPreConfig_ReadFromArgv(config, args); if (_Py_INIT_FAILED(err)) { return err; } @@ -312,17 +304,9 @@ static _PyInitError config_read_write(_PyCoreConfig *config, const _PyArgv *args, const _PyPreConfig *preconfig) { - _PyInitError err; - - PyMemAllocatorEx old_alloc; - _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - _PyCoreConfig_GetGlobalConfig(config); - err = _PyCoreConfig_ReadFromArgv(config, args, preconfig); - - PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - + _PyInitError err = _PyCoreConfig_ReadFromArgv(config, args, preconfig); if (_Py_INIT_FAILED(err)) { return err; } @@ -355,7 +339,6 @@ static _PyInitError pymain_init(const _PyArgv *args, PyInterpreterState **interp_p) { _PyInitError err; - PyMemAllocatorEx old_alloc; err = _PyRuntime_Initialize(); if (_Py_INIT_FAILED(err)) { @@ -402,12 +385,8 @@ pymain_init(const _PyArgv *args, PyInterpreterState **interp_p) err = _Py_INIT_OK(); done: - _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - _PyPreConfig_Clear(preconfig); _PyCoreConfig_Clear(config); - - PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); return err; } diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index 1afbcca14f28..1c2a32050f93 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -221,20 +221,6 @@ static PyMemAllocatorEx _PyObject = PYOBJ_ALLOC; #endif -/* Get the effective name of "debug" memory allocators, - as if _PyMem_GetAllocatorsName() is called after - _PyMem_SetupAllocators("debug"). */ -const char* -_PyMem_GetDebugAllocatorsName(void) -{ -#ifdef WITH_PYMALLOC - return "pymalloc_debug"; -#else - return "malloc_debug"; -#endif -} - - static int pymem_set_default_allocator(PyMemAllocatorDomain domain, int debug, PyMemAllocatorEx *old_alloc) diff --git a/Python/preconfig.c b/Python/preconfig.c index 69242032151a..ee9dca4bdc92 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -125,15 +125,8 @@ precmdline_clear(_PyPreCmdline *cmdline) void _PyPreConfig_Clear(_PyPreConfig *config) { -#define CLEAR(ATTR) \ - do { \ - PyMem_RawFree(ATTR); \ - ATTR = NULL; \ - } while (0) - - CLEAR(config->allocator); - -#undef CLEAR + PyMem_RawFree(config->allocator); + config->allocator = NULL; } @@ -453,8 +446,7 @@ preconfig_read(_PyPreConfig *config, const _PyPreCmdline *cmdline) /* allocator */ if (config->dev_mode && config->allocator == NULL) { - const char *allocator = _PyMem_GetDebugAllocatorsName(); - config->allocator = _PyMem_RawStrdup(allocator); + config->allocator = _PyMem_RawStrdup("debug"); if (config->allocator == NULL) { return _Py_INIT_NO_MEMORY(); } @@ -742,31 +734,56 @@ _PyPreConfig_ReadFromArgv(_PyPreConfig *config, const _PyArgv *args) static _PyInitError -_PyPreConfig_Reconfigure(const _PyPreConfig *config) +_PyPreConfig_SetAllocator(_PyPreConfig *config) { - if (config->allocator != NULL) { - const char *allocator = _PyMem_GetAllocatorsName(); - if (allocator == NULL || strcmp(config->allocator, allocator) != 0) { - return _Py_INIT_USER_ERR("cannot modify memory allocator " - "after first Py_Initialize()"); - } + assert(!_PyRuntime.core_initialized); + + PyMemAllocatorEx old_alloc; + PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); + + if (_PyMem_SetupAllocators(config->allocator) < 0) { + return _Py_INIT_USER_ERR("Unknown PYTHONMALLOC allocator"); + } + + /* Copy the pre-configuration with the new allocator */ + _PyPreConfig config2 = _PyPreConfig_INIT; + if (_PyPreConfig_Copy(&config2, config) < 0) { + _PyPreConfig_Clear(&config2); + PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); + return _Py_INIT_NO_MEMORY(); } + + /* Free the old config and replace config with config2. Since config now + owns the data, don't free config2. */ + PyMemAllocatorEx new_alloc; + PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &new_alloc); + PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); + _PyPreConfig_Clear(config); + PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &new_alloc); + + *config = config2; + return _Py_INIT_OK(); } +/* Write the pre-configuration. + + If the memory allocator is changed, config is re-allocated with new + allocator. So calling _PyPreConfig_Clear(config) is safe after this call. */ _PyInitError -_PyPreConfig_Write(const _PyPreConfig *config) +_PyPreConfig_Write(_PyPreConfig *config) { if (_PyRuntime.core_initialized) { /* bpo-34008: Calling Py_Main() after Py_Initialize() ignores the new configuration. */ - return _PyPreConfig_Reconfigure(config); + return _Py_INIT_OK(); } if (config->allocator != NULL) { - if (_PyMem_SetupAllocators(config->allocator) < 0) { - return _Py_INIT_USER_ERR("Unknown PYTHONMALLOC allocator"); + _PyInitError err = _PyPreConfig_SetAllocator(config); + if (_Py_INIT_FAILED(err)) { + return err; } } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index f72af8638402..522a4275a51d 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -716,21 +716,14 @@ _Py_InitializeCore_impl(PyInterpreterState **interp_p, static _PyInitError pyinit_preconfig(_PyPreConfig *preconfig, const _PyPreConfig *src_preconfig) { - _PyInitError err; - PyMemAllocatorEx old_alloc; - /* Set LC_CTYPE to the user preferred locale */ _Py_SetLocaleFromEnv(LC_CTYPE); - _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - if (_PyPreConfig_Copy(preconfig, src_preconfig) >= 0) { - err = _PyPreConfig_Read(preconfig); + if (_PyPreConfig_Copy(preconfig, src_preconfig) < 0) { + return _Py_INIT_ERR("failed to copy pre config"); } - else { - err = _Py_INIT_ERR("failed to copy pre config"); - } - PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); + _PyInitError err = _PyPreConfig_Read(preconfig); if (_Py_INIT_FAILED(err)) { return err; } @@ -743,21 +736,15 @@ static _PyInitError pyinit_coreconfig(_PyCoreConfig *config, const _PyCoreConfig *src_config, PyInterpreterState **interp_p) { - PyMemAllocatorEx old_alloc; - _PyInitError err; /* Set LC_CTYPE to the user preferred locale */ _Py_SetLocaleFromEnv(LC_CTYPE); - _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - if (_PyCoreConfig_Copy(config, src_config) >= 0) { - err = _PyCoreConfig_Read(config, NULL); - } - else { - err = _Py_INIT_ERR("failed to copy core config"); + if (_PyCoreConfig_Copy(config, src_config) < 0) { + return _Py_INIT_ERR("failed to copy core config"); } - PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); + _PyInitError err = _PyCoreConfig_Read(config, NULL); if (_Py_INIT_FAILED(err)) { return err; } @@ -792,7 +779,6 @@ _PyInitError _Py_InitializeCore(PyInterpreterState **interp_p, const _PyCoreConfig *src_config) { - PyMemAllocatorEx old_alloc; _PyInitError err; assert(src_config != NULL); @@ -807,10 +793,7 @@ _Py_InitializeCore(PyInterpreterState **interp_p, err = pyinit_coreconfig(&local_config, src_config, interp_p); done: - _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); _PyCoreConfig_Clear(&local_config); - PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - return err; } From webhook-mailer at python.org Tue Mar 5 19:44:37 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 06 Mar 2019 00:44:37 -0000 Subject: [Python-checkins] bpo-36142: _PyPreConfig_Read() sets LC_CTYPE (GH-12188) Message-ID: https://github.com/python/cpython/commit/4fffd380a4070aff39b7fd443d90e60746c1b623 commit: 4fffd380a4070aff39b7fd443d90e60746c1b623 branch: master author: Victor Stinner committer: GitHub date: 2019-03-06T01:44:31+01:00 summary: bpo-36142: _PyPreConfig_Read() sets LC_CTYPE (GH-12188) * _PyPreConfig_Read() now sets temporarily LC_CTYPE to the user preferred locale, as _PyPreConfig_Write() will do permanentely. * Fix _PyCoreConfig_Clear(): clear run_xxx attributes * _Py_SetArgcArgv() doesn't have to be exported * _PyCoreConfig_SetGlobalConfig() no longer applies preconfig files: M Include/internal/pycore_coreconfig.h M Python/coreconfig.c M Python/preconfig.c M Python/pylifecycle.c diff --git a/Include/internal/pycore_coreconfig.h b/Include/internal/pycore_coreconfig.h index 0917a6ac2a34..153309de4ff6 100644 --- a/Include/internal/pycore_coreconfig.h +++ b/Include/internal/pycore_coreconfig.h @@ -32,7 +32,6 @@ PyAPI_FUNC(_PyInitError) _PyArgv_Decode(const _PyArgv *args, /* --- Py_GetArgcArgv() helpers ----------------------------------- */ PyAPI_FUNC(void) _Py_ClearArgcArgv(void); -PyAPI_FUNC(int) _Py_SetArgcArgv(int argc, wchar_t * const *argv); /* --- _PyPreConfig ----------------------------------------------- */ diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 42441e24aa61..cd4ef22ff69e 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -387,7 +387,7 @@ _Py_ClearArgcArgv(void) } -int +static int _Py_SetArgcArgv(int argc, wchar_t * const *argv) { int res; @@ -473,6 +473,9 @@ _PyCoreConfig_Clear(_PyCoreConfig *config) CLEAR(config->filesystem_errors); CLEAR(config->stdio_encoding); CLEAR(config->stdio_errors); + CLEAR(config->run_command); + CLEAR(config->run_module); + CLEAR(config->run_filename); #undef CLEAR #undef CLEAR_WSTRLIST } @@ -677,8 +680,6 @@ _PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config) void _PyCoreConfig_SetGlobalConfig(const _PyCoreConfig *config) { - _PyPreConfig_SetGlobalConfig(&config->preconfig); - #define COPY_FLAG(ATTR, VAR) \ if (config->ATTR != -1) { \ VAR = config->ATTR; \ @@ -812,6 +813,7 @@ config_init_executable(_PyCoreConfig *config) return _Py_INIT_OK(); } + static const wchar_t* config_get_xoption(const _PyCoreConfig *config, wchar_t *name) { @@ -897,35 +899,34 @@ config_wstr_to_int(const wchar_t *wstr, int *result) static _PyInitError config_read_env_vars(_PyCoreConfig *config) { -#define get_env_flag(CONFIG, ATTR, NAME) \ - _Py_get_env_flag(&(CONFIG)->preconfig, (ATTR), (NAME)) + _PyPreConfig *preconfig = &config->preconfig; /* Get environment variables */ - get_env_flag(config, &config->parser_debug, "PYTHONDEBUG"); - get_env_flag(config, &config->verbose, "PYTHONVERBOSE"); - get_env_flag(config, &config->optimization_level, "PYTHONOPTIMIZE"); - get_env_flag(config, &config->inspect, "PYTHONINSPECT"); + _Py_get_env_flag(preconfig, &config->parser_debug, "PYTHONDEBUG"); + _Py_get_env_flag(preconfig, &config->verbose, "PYTHONVERBOSE"); + _Py_get_env_flag(preconfig, &config->optimization_level, "PYTHONOPTIMIZE"); + _Py_get_env_flag(preconfig, &config->inspect, "PYTHONINSPECT"); int dont_write_bytecode = 0; - get_env_flag(config, &dont_write_bytecode, "PYTHONDONTWRITEBYTECODE"); + _Py_get_env_flag(preconfig, &dont_write_bytecode, "PYTHONDONTWRITEBYTECODE"); if (dont_write_bytecode) { config->write_bytecode = 0; } int no_user_site_directory = 0; - get_env_flag(config, &no_user_site_directory, "PYTHONNOUSERSITE"); + _Py_get_env_flag(preconfig, &no_user_site_directory, "PYTHONNOUSERSITE"); if (no_user_site_directory) { config->user_site_directory = 0; } int unbuffered_stdio = 0; - get_env_flag(config, &unbuffered_stdio, "PYTHONUNBUFFERED"); + _Py_get_env_flag(preconfig, &unbuffered_stdio, "PYTHONUNBUFFERED"); if (unbuffered_stdio) { config->buffered_stdio = 0; } #ifdef MS_WINDOWS - get_env_flag(config, &config->legacy_windows_stdio, + _Py_get_env_flag(preconfig, &config->legacy_windows_stdio, "PYTHONLEGACYWINDOWSSTDIO"); #endif @@ -952,8 +953,6 @@ config_read_env_vars(_PyCoreConfig *config) } return _Py_INIT_OK(); - -#undef get_env_flag } @@ -1333,10 +1332,7 @@ _PyCoreConfig_ReadPreConfig(_PyCoreConfig *config) } -/* Read the configuration into _PyCoreConfig and initialize the LC_CTYPE - locale: enable UTF-8 mode (PEP 540) and/or coerce the C locale (PEP 538). - - Read the configuration from: +/* Read the configuration into _PyCoreConfig from: * Environment variables * Py_xxx global configuration variables @@ -1497,8 +1493,6 @@ config_init_stdio(const _PyCoreConfig *config) /* Write the configuration: - - coerce the LC_CTYPE locale (PEP 538) - - UTF-8 mode (PEP 540) - set Py_xxx global configuration variables - initialize C standard streams (stdin, stdout, stderr) */ void @@ -2110,10 +2104,7 @@ config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, } -/* Read the configuration into _PyCoreConfig and initialize the LC_CTYPE - locale: enable UTF-8 mode (PEP 540) and/or coerce the C locale (PEP 538). - - Read the configuration from: +/* Read the configuration into _PyCoreConfig from: * Command line arguments * Environment variables diff --git a/Python/preconfig.c b/Python/preconfig.c index ee9dca4bdc92..45093d271885 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -472,10 +472,50 @@ preconfig_read(_PyPreConfig *config, const _PyPreCmdline *cmdline) } +static _PyInitError +get_ctype_locale(char **locale_p) +{ + const char *loc = setlocale(LC_CTYPE, NULL); + if (loc == NULL) { + return _Py_INIT_ERR("failed to LC_CTYPE locale"); + } + + char *copy = _PyMem_RawStrdup(loc); + if (copy == NULL) { + return _Py_INIT_NO_MEMORY(); + } + + *locale_p = copy; + return _Py_INIT_OK(); +} + + +/* Read the configuration from: + + - environment variables + - Py_xxx global configuration variables + - the LC_CTYPE locale + + See _PyPreConfig_ReadFromArgv() to parse also command line arguments. */ _PyInitError _PyPreConfig_Read(_PyPreConfig *config) { - return preconfig_read(config, NULL); + _PyInitError err; + char *old_loc; + + err = get_ctype_locale(&old_loc); + if (_Py_INIT_FAILED(err)) { + return err; + } + + /* Set LC_CTYPE to the user preferred locale */ + _Py_SetLocaleFromEnv(LC_CTYPE); + + err = preconfig_read(config, NULL); + + setlocale(LC_CTYPE, old_loc); + + return err; } @@ -604,7 +644,14 @@ preconfig_from_argv(_PyPreConfig *config, const _PyArgv *args) } -/* Read the preconfiguration. */ +/* Read the configuration from: + + - command line arguments + - environment variables + - Py_xxx global configuration variables + - the LC_CTYPE locale + + See _PyPreConfig_ReadFromArgv() to parse also command line arguments. */ _PyInitError _PyPreConfig_ReadFromArgv(_PyPreConfig *config, const _PyArgv *args) { @@ -624,15 +671,8 @@ _PyPreConfig_ReadFromArgv(_PyPreConfig *config, const _PyArgv *args) int locale_coerced = 0; int loops = 0; - /* copy LC_CTYPE locale */ - const char *loc = setlocale(LC_CTYPE, NULL); - if (loc == NULL) { - err = _Py_INIT_ERR("failed to LC_CTYPE locale"); - goto done; - } - init_ctype_locale = _PyMem_RawStrdup(loc); - if (init_ctype_locale == NULL) { - err = _Py_INIT_NO_MEMORY(); + err = get_ctype_locale(&init_ctype_locale); + if (_Py_INIT_FAILED(err)) { goto done; } @@ -767,15 +807,23 @@ _PyPreConfig_SetAllocator(_PyPreConfig *config) } -/* Write the pre-configuration. +/* Write the pre-configuration: + + - set the memory allocators + - set Py_xxx global configuration variables + - set the LC_CTYPE locale (coerce C locale, PEP 538) and set the UTF-8 mode + (PEP 540) If the memory allocator is changed, config is re-allocated with new - allocator. So calling _PyPreConfig_Clear(config) is safe after this call. */ + allocator. So calling _PyPreConfig_Clear(config) is safe after this call. + + Do nothing if called after Py_Initialize(): ignore the new + pre-configuration. */ _PyInitError _PyPreConfig_Write(_PyPreConfig *config) { if (_PyRuntime.core_initialized) { - /* bpo-34008: Calling Py_Main() after Py_Initialize() ignores + /* bpo-34008: Calling this functions after Py_Initialize() ignores the new configuration. */ return _Py_INIT_OK(); } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 522a4275a51d..08107296be06 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -716,9 +716,6 @@ _Py_InitializeCore_impl(PyInterpreterState **interp_p, static _PyInitError pyinit_preconfig(_PyPreConfig *preconfig, const _PyPreConfig *src_preconfig) { - /* Set LC_CTYPE to the user preferred locale */ - _Py_SetLocaleFromEnv(LC_CTYPE); - if (_PyPreConfig_Copy(preconfig, src_preconfig) < 0) { return _Py_INIT_ERR("failed to copy pre config"); } @@ -736,10 +733,6 @@ static _PyInitError pyinit_coreconfig(_PyCoreConfig *config, const _PyCoreConfig *src_config, PyInterpreterState **interp_p) { - - /* Set LC_CTYPE to the user preferred locale */ - _Py_SetLocaleFromEnv(LC_CTYPE); - if (_PyCoreConfig_Copy(config, src_config) < 0) { return _Py_INIT_ERR("failed to copy core config"); } From webhook-mailer at python.org Wed Mar 6 05:31:20 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 06 Mar 2019 10:31:20 -0000 Subject: [Python-checkins] Add more tests for pdf() and cdf() (GH-12190) Message-ID: https://github.com/python/cpython/commit/18ee50d5dad81124c3fa0121c1ed7be0cd21d3b2 commit: 18ee50d5dad81124c3fa0121c1ed7be0cd21d3b2 branch: master author: Raymond Hettinger committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-06T02:31:14-08:00 summary: Add more tests for pdf() and cdf() (GH-12190) files: M Lib/test/test_statistics.py diff --git a/Lib/test/test_statistics.py b/Lib/test/test_statistics.py index 4adc5e4cbf4a..3f14e63c23f9 100644 --- a/Lib/test/test_statistics.py +++ b/Lib/test/test_statistics.py @@ -2101,14 +2101,28 @@ def test_pdf(self): self.assertLess(X.pdf(99), X.pdf(100)) self.assertLess(X.pdf(101), X.pdf(100)) # Test symmetry - self.assertAlmostEqual(X.pdf(99), X.pdf(101)) - self.assertAlmostEqual(X.pdf(98), X.pdf(102)) - self.assertAlmostEqual(X.pdf(97), X.pdf(103)) + for i in range(50): + self.assertAlmostEqual(X.pdf(100 - i), X.pdf(100 + i)) # Test vs CDF dx = 2.0 ** -10 for x in range(90, 111): est_pdf = (X.cdf(x + dx) - X.cdf(x)) / dx self.assertAlmostEqual(X.pdf(x), est_pdf, places=4) + # Test vs table of known values -- CRC 26th Edition + Z = NormalDist() + for x, px in enumerate([ + 0.3989, 0.3989, 0.3989, 0.3988, 0.3986, + 0.3984, 0.3982, 0.3980, 0.3977, 0.3973, + 0.3970, 0.3965, 0.3961, 0.3956, 0.3951, + 0.3945, 0.3939, 0.3932, 0.3925, 0.3918, + 0.3910, 0.3902, 0.3894, 0.3885, 0.3876, + 0.3867, 0.3857, 0.3847, 0.3836, 0.3825, + 0.3814, 0.3802, 0.3790, 0.3778, 0.3765, + 0.3752, 0.3739, 0.3725, 0.3712, 0.3697, + 0.3683, 0.3668, 0.3653, 0.3637, 0.3621, + 0.3605, 0.3589, 0.3572, 0.3555, 0.3538, + ]): + self.assertAlmostEqual(Z.pdf(x / 100.0), px, places=4) # Error case: variance is zero Y = NormalDist(100, 0) with self.assertRaises(statistics.StatisticsError): @@ -2127,6 +2141,18 @@ def test_cdf(self): self.assertEqual(cdfs, sorted(cdfs)) # Verify center self.assertAlmostEqual(X.cdf(100), 0.50) + # Check against a table of known values + # https://en.wikipedia.org/wiki/Standard_normal_table#Cumulative + Z = NormalDist() + for z, cum_prob in [ + (0.00, 0.50000), (0.01, 0.50399), (0.02, 0.50798), + (0.14, 0.55567), (0.29, 0.61409), (0.33, 0.62930), + (0.54, 0.70540), (0.60, 0.72575), (1.17, 0.87900), + (1.60, 0.94520), (2.05, 0.97982), (2.89, 0.99807), + (3.52, 0.99978), (3.98, 0.99997), (4.07, 0.99998), + ]: + self.assertAlmostEqual(Z.cdf(z), cum_prob, places=5) + self.assertAlmostEqual(Z.cdf(-z), 1.0 - cum_prob, places=5) # Error case: variance is zero Y = NormalDist(100, 0) with self.assertRaises(statistics.StatisticsError): From webhook-mailer at python.org Wed Mar 6 06:42:24 2019 From: webhook-mailer at python.org (Donald Stufft) Date: Wed, 06 Mar 2019 11:42:24 -0000 Subject: [Python-checkins] bpo-35807: Upgrade ensurepip bundled pip and setuptools (GH-12189) Message-ID: https://github.com/python/cpython/commit/01e0f439f5009f37b95ab516e91906fcc7fcb8c3 commit: 01e0f439f5009f37b95ab516e91906fcc7fcb8c3 branch: master author: Pradyun Gedam committer: Donald Stufft date: 2019-03-06T06:42:21-05:00 summary: bpo-35807: Upgrade ensurepip bundled pip and setuptools (GH-12189) * Update pip to 19.0.3 * Update setuptools to 40.8.0 files: A Lib/ensurepip/_bundled/pip-19.0.3-py2.py3-none-any.whl A Lib/ensurepip/_bundled/setuptools-40.8.0-py2.py3-none-any.whl A Misc/NEWS.d/next/Library/2019-03-06-13-21-33.bpo-35807.W7mmu3.rst D Lib/ensurepip/_bundled/pip-18.1-py2.py3-none-any.whl D Lib/ensurepip/_bundled/setuptools-40.6.2-py2.py3-none-any.whl M Lib/ensurepip/__init__.py diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py index 09c572db71cb..526dfd004a41 100644 --- a/Lib/ensurepip/__init__.py +++ b/Lib/ensurepip/__init__.py @@ -8,9 +8,9 @@ __all__ = ["version", "bootstrap"] -_SETUPTOOLS_VERSION = "40.6.2" +_SETUPTOOLS_VERSION = "40.8.0" -_PIP_VERSION = "18.1" +_PIP_VERSION = "19.0.3" _PROJECTS = [ ("setuptools", _SETUPTOOLS_VERSION), diff --git a/Lib/ensurepip/_bundled/pip-18.1-py2.py3-none-any.whl b/Lib/ensurepip/_bundled/pip-19.0.3-py2.py3-none-any.whl similarity index 50% rename from Lib/ensurepip/_bundled/pip-18.1-py2.py3-none-any.whl rename to Lib/ensurepip/_bundled/pip-19.0.3-py2.py3-none-any.whl index c3c146f6da27..24f247caa0ab 100644 Binary files a/Lib/ensurepip/_bundled/pip-18.1-py2.py3-none-any.whl and b/Lib/ensurepip/_bundled/pip-19.0.3-py2.py3-none-any.whl differ diff --git a/Lib/ensurepip/_bundled/setuptools-40.6.2-py2.py3-none-any.whl b/Lib/ensurepip/_bundled/setuptools-40.8.0-py2.py3-none-any.whl similarity index 81% rename from Lib/ensurepip/_bundled/setuptools-40.6.2-py2.py3-none-any.whl rename to Lib/ensurepip/_bundled/setuptools-40.8.0-py2.py3-none-any.whl index 4c8a619571d1..fdc66e9330e0 100644 Binary files a/Lib/ensurepip/_bundled/setuptools-40.6.2-py2.py3-none-any.whl and b/Lib/ensurepip/_bundled/setuptools-40.8.0-py2.py3-none-any.whl differ diff --git a/Misc/NEWS.d/next/Library/2019-03-06-13-21-33.bpo-35807.W7mmu3.rst b/Misc/NEWS.d/next/Library/2019-03-06-13-21-33.bpo-35807.W7mmu3.rst new file mode 100644 index 000000000000..1109fbed3f9c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-06-13-21-33.bpo-35807.W7mmu3.rst @@ -0,0 +1 @@ +Update ensurepip to install pip 19.0.3 and setuptools 40.8.0. From webhook-mailer at python.org Wed Mar 6 06:51:56 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 06 Mar 2019 11:51:56 -0000 Subject: [Python-checkins] bpo-36142: PYTHONMALLOC overrides PYTHONDEV (GH-12191) Message-ID: https://github.com/python/cpython/commit/25d13f37aa6743282d0b8b4df687ff89999964b2 commit: 25d13f37aa6743282d0b8b4df687ff89999964b2 branch: master author: Victor Stinner committer: GitHub date: 2019-03-06T12:51:53+01:00 summary: bpo-36142: PYTHONMALLOC overrides PYTHONDEV (GH-12191) bpo-34247, bpo-36142: The PYTHONMALLOC environment variable has the priority over PYTHONDEV env var and "-X dev" command line option. For example, PYTHONMALLOC=malloc PYTHONDEVMODE=1 sets the memory allocators to "malloc" (and not to "debug"). Add an unit test. files: M Lib/test/test_embed.py M Programs/_testembed.c M Python/preconfig.c diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 1f236a985ad6..952bc327ddb3 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -524,7 +524,7 @@ def test_init_from_config(self): 'install_signal_handlers': 0, 'use_hash_seed': 1, 'hash_seed': 123, - 'allocator': 'malloc_debug', + 'allocator': 'malloc', 'tracemalloc': 2, 'import_time': 1, 'show_ref_count': 1, @@ -564,7 +564,7 @@ def test_init_from_config(self): INIT_ENV_CONFIG = { 'use_hash_seed': 1, 'hash_seed': 42, - 'allocator': 'malloc_debug', + 'allocator': 'malloc', 'tracemalloc': 2, 'import_time': 1, 'malloc_stats': 1, @@ -592,6 +592,12 @@ def test_init_env_dev_mode(self): dev_mode=1) self.check_config("init_env_dev_mode", config) + def test_init_env_dev_mode(self): + config = dict(self.INIT_ENV_CONFIG, + allocator='malloc', + dev_mode=1) + self.check_config("init_env_dev_mode_alloc", config) + def test_init_dev_mode(self): config = { 'dev_mode': 1, diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 170672e4439a..bba25108bdf7 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -442,8 +442,8 @@ static int test_init_from_config(void) config.use_hash_seed = 1; config.hash_seed = 123; - putenv("PYTHONMALLOC=malloc"); - config.preconfig.allocator = "malloc_debug"; + putenv("PYTHONMALLOC=malloc_debug"); + config.preconfig.allocator = "malloc"; /* dev_mode=1 is tested in test_init_dev_mode() */ @@ -570,7 +570,7 @@ static int test_init_from_config(void) static void test_init_env_putenvs(void) { putenv("PYTHONHASHSEED=42"); - putenv("PYTHONMALLOC=malloc_debug"); + putenv("PYTHONMALLOC=malloc"); putenv("PYTHONTRACEMALLOC=2"); putenv("PYTHONPROFILEIMPORTTIME=1"); putenv("PYTHONMALLOCSTATS=1"); @@ -594,20 +594,32 @@ static void test_init_env_putenvs(void) } +static int test_init_env(void) +{ + /* Test initialization from environment variables */ + Py_IgnoreEnvironmentFlag = 0; + test_init_env_putenvs(); + _testembed_Py_Initialize(); + dump_config(); + Py_Finalize(); + return 0; +} + + static void test_init_env_dev_mode_putenvs(void) { test_init_env_putenvs(); - putenv("PYTHONMALLOC=malloc"); + putenv("PYTHONMALLOC="); putenv("PYTHONFAULTHANDLER="); putenv("PYTHONDEVMODE=1"); } -static int test_init_env(void) +static int test_init_env_dev_mode(void) { /* Test initialization from environment variables */ Py_IgnoreEnvironmentFlag = 0; - test_init_env_putenvs(); + test_init_env_dev_mode_putenvs(); _testembed_Py_Initialize(); dump_config(); Py_Finalize(); @@ -615,11 +627,12 @@ static int test_init_env(void) } -static int test_init_env_dev_mode(void) +static int test_init_env_dev_mode_alloc(void) { /* Test initialization from environment variables */ Py_IgnoreEnvironmentFlag = 0; test_init_env_dev_mode_putenvs(); + putenv("PYTHONMALLOC=malloc"); _testembed_Py_Initialize(); dump_config(); Py_Finalize(); @@ -700,6 +713,7 @@ static struct TestCase TestCases[] = { { "init_from_config", test_init_from_config }, { "init_env", test_init_env }, { "init_env_dev_mode", test_init_env_dev_mode }, + { "init_env_dev_mode_alloc", test_init_env_dev_mode_alloc }, { "init_dev_mode", test_init_dev_mode }, { "init_isolated", test_init_isolated }, { NULL, NULL } diff --git a/Python/preconfig.c b/Python/preconfig.c index 45093d271885..50d66b124922 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -445,14 +445,11 @@ preconfig_read(_PyPreConfig *config, const _PyPreCmdline *cmdline) } /* allocator */ - if (config->dev_mode && config->allocator == NULL) { - config->allocator = _PyMem_RawStrdup("debug"); - if (config->allocator == NULL) { - return _Py_INIT_NO_MEMORY(); - } - } - if (config->allocator == NULL) { + /* bpo-34247. The PYTHONMALLOC environment variable has the priority + over PYTHONDEV env var and "-X dev" command line option. + For example, PYTHONMALLOC=malloc PYTHONDEVMODE=1 sets the memory + allocators to "malloc" (and not to "debug"). */ const char *allocator = _PyPreConfig_GetEnv(config, "PYTHONMALLOC"); if (allocator) { config->allocator = _PyMem_RawStrdup(allocator); @@ -462,6 +459,13 @@ preconfig_read(_PyPreConfig *config, const _PyPreCmdline *cmdline) } } + if (config->dev_mode && config->allocator == NULL) { + config->allocator = _PyMem_RawStrdup("debug"); + if (config->allocator == NULL) { + return _Py_INIT_NO_MEMORY(); + } + } + assert(config->coerce_c_locale >= 0); assert(config->utf8_mode >= 0); assert(config->isolated >= 0); From webhook-mailer at python.org Wed Mar 6 09:12:11 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 06 Mar 2019 14:12:11 -0000 Subject: [Python-checkins] [2.7] bpo-36186: Fix linuxaudiodev.linux_audio_device() error handling (GH-12163) Message-ID: https://github.com/python/cpython/commit/b2aefd77e1da438aed649d018d6aa504ec35eac8 commit: b2aefd77e1da438aed649d018d6aa504ec35eac8 branch: 2.7 author: stratakis committer: Victor Stinner date: 2019-03-06T15:11:56+01:00 summary: [2.7] bpo-36186: Fix linuxaudiodev.linux_audio_device() error handling (GH-12163) Fix linuxaudiodev.linux_audio_device() error handling: close the internal file descriptor if it fails to open the device. files: A Misc/NEWS.d/next/Library/2019-03-04-16-39-16.bpo-36186.Hqw1A_.rst M Modules/linuxaudiodev.c diff --git a/Misc/NEWS.d/next/Library/2019-03-04-16-39-16.bpo-36186.Hqw1A_.rst b/Misc/NEWS.d/next/Library/2019-03-04-16-39-16.bpo-36186.Hqw1A_.rst new file mode 100644 index 000000000000..a14d155ae973 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-04-16-39-16.bpo-36186.Hqw1A_.rst @@ -0,0 +1 @@ +Fix linuxaudiodev.linux_audio_device() error handling: close the internal file descriptor if it fails to open the device. diff --git a/Modules/linuxaudiodev.c b/Modules/linuxaudiodev.c index 7fe20ae19544..f5135d911290 100644 --- a/Modules/linuxaudiodev.c +++ b/Modules/linuxaudiodev.c @@ -126,10 +126,12 @@ newladobject(PyObject *arg) } if (imode == O_WRONLY && ioctl(fd, SNDCTL_DSP_NONBLOCK, NULL) == -1) { PyErr_SetFromErrnoWithFilename(LinuxAudioError, basedev); + close(fd); return NULL; } if (ioctl(fd, SNDCTL_DSP_GETFMTS, &afmts) == -1) { PyErr_SetFromErrnoWithFilename(LinuxAudioError, basedev); + close(fd); return NULL; } /* Create and initialize the object */ From webhook-mailer at python.org Wed Mar 6 09:14:12 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 06 Mar 2019 14:14:12 -0000 Subject: [Python-checkins] bpo-36147: Fix a memory leak in ctypes s_get() (GH-12102) Message-ID: https://github.com/python/cpython/commit/098b139816f379271b8d4de2561b5805dd47d229 commit: 098b139816f379271b8d4de2561b5805dd47d229 branch: 2.7 author: stratakis committer: Victor Stinner date: 2019-03-06T15:14:06+01:00 summary: bpo-36147: Fix a memory leak in ctypes s_get() (GH-12102) The s_get() function leaks the result variable on low memory. Partially backport commit 19b52545df898ec911c44e29f75badb902924c0 to fix it. files: M Modules/_ctypes/cfield.c diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c index 46f041b00e39..1b495fc9ac53 100644 --- a/Modules/_ctypes/cfield.c +++ b/Modules/_ctypes/cfield.c @@ -1291,24 +1291,16 @@ U_set(void *ptr, PyObject *value, Py_ssize_t length) static PyObject * s_get(void *ptr, Py_ssize_t size) { - PyObject *result; - size_t slen; + Py_ssize_t i; + char *p; - result = PyString_FromString((char *)ptr); - if (!result) - return NULL; - /* chop off at the first NUL character, if any. - * On error, result will be deallocated and set to NULL. - */ - slen = strlen(PyString_AS_STRING(result)); - size = min(size, (Py_ssize_t)slen); - if (result->ob_refcnt == 1) { - /* shorten the result */ - _PyString_Resize(&result, size); - return result; - } else - /* cannot shorten the result */ - return PyString_FromStringAndSize(ptr, size); + p = (char *)ptr; + for (i = 0; i < size; ++i) { + if (*p++ == '\0') + break; + } + + return PyBytes_FromStringAndSize((char *)ptr, (Py_ssize_t)i); } static PyObject * From webhook-mailer at python.org Wed Mar 6 09:35:43 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 06 Mar 2019 14:35:43 -0000 Subject: [Python-checkins] bpo-36209: Fix typo on hashlib error message (GH-12194) Message-ID: https://github.com/python/cpython/commit/b71e28ea91259ca3914e2ff84fc126795ea6b848 commit: b71e28ea91259ca3914e2ff84fc126795ea6b848 branch: master author: Emmanuel Arias committer: Victor Stinner date: 2019-03-06T15:35:35+01:00 summary: bpo-36209: Fix typo on hashlib error message (GH-12194) files: M Modules/_hashopenssl.c diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c index aae558c99303..e560c18b63c3 100644 --- a/Modules/_hashopenssl.c +++ b/Modules/_hashopenssl.c @@ -775,7 +775,7 @@ _hashlib_scrypt_impl(PyObject *module, Py_buffer *password, Py_buffer *salt, if (!retval) { /* sorry, can't do much better */ PyErr_SetString(PyExc_ValueError, - "Invalid paramemter combination for n, r, p, maxmem."); + "Invalid parameter combination for n, r, p, maxmem."); return NULL; } From webhook-mailer at python.org Wed Mar 6 09:54:59 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 06 Mar 2019 14:54:59 -0000 Subject: [Python-checkins] bpo-36209: Fix typo on hashlib error message (GH-12194) Message-ID: https://github.com/python/cpython/commit/42c649347a11789666c461ecbd3bdca27b957c9b commit: 42c649347a11789666c461ecbd3bdca27b957c9b branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-06T06:54:54-08:00 summary: bpo-36209: Fix typo on hashlib error message (GH-12194) (cherry picked from commit b71e28ea91259ca3914e2ff84fc126795ea6b848) Co-authored-by: Emmanuel Arias files: M Modules/_hashopenssl.c diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c index b1f0d397aa7e..b69f16c61a50 100644 --- a/Modules/_hashopenssl.c +++ b/Modules/_hashopenssl.c @@ -826,7 +826,7 @@ _hashlib_scrypt_impl(PyObject *module, Py_buffer *password, Py_buffer *salt, if (!retval) { /* sorry, can't do much better */ PyErr_SetString(PyExc_ValueError, - "Invalid paramemter combination for n, r, p, maxmem."); + "Invalid parameter combination for n, r, p, maxmem."); return NULL; } From webhook-mailer at python.org Wed Mar 6 10:52:45 2019 From: webhook-mailer at python.org (Benjamin Peterson) Date: Wed, 06 Mar 2019 15:52:45 -0000 Subject: [Python-checkins] closes bpo-36139: release GIL around munmap(). (GH-12073) Message-ID: https://github.com/python/cpython/commit/bb9593af0ac835b93c2834d44b72fa34e30efed0 commit: bb9593af0ac835b93c2834d44b72fa34e30efed0 branch: master author: Davide Rizzo committer: Benjamin Peterson date: 2019-03-06T07:52:34-08:00 summary: closes bpo-36139: release GIL around munmap(). (GH-12073) files: A Misc/NEWS.d/next/Library/2019-03-06-13-07-29.bpo-36139.6kedum.rst M Modules/mmapmodule.c diff --git a/Misc/NEWS.d/next/Library/2019-03-06-13-07-29.bpo-36139.6kedum.rst b/Misc/NEWS.d/next/Library/2019-03-06-13-07-29.bpo-36139.6kedum.rst new file mode 100644 index 000000000000..9dcd857cd256 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-06-13-07-29.bpo-36139.6kedum.rst @@ -0,0 +1 @@ +Release GIL when closing :class:`~mmap.mmap` objects. diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index f4caf8799f10..326288cccde5 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -117,6 +117,7 @@ typedef struct { static void mmap_object_dealloc(mmap_object *m_obj) { + Py_BEGIN_ALLOW_THREADS #ifdef MS_WINDOWS if (m_obj->data != NULL) UnmapViewOfFile (m_obj->data); @@ -135,6 +136,7 @@ mmap_object_dealloc(mmap_object *m_obj) munmap(m_obj->data, m_obj->size); } #endif /* UNIX */ + Py_END_ALLOW_THREADS if (m_obj->weakreflist != NULL) PyObject_ClearWeakRefs((PyObject *) m_obj); @@ -157,28 +159,37 @@ mmap_close_method(mmap_object *self, PyObject *unused) again. TODO - should we check for errors in the close operations??? */ - if (self->data != NULL) { - UnmapViewOfFile(self->data); - self->data = NULL; + HANDLE map_handle = self->map_handle; + HANDLE file_handle = self->file_handle; + char *data = self->data; + self->map_handle = NULL; + self->file_handle = INVALID_HANDLE_VALUE; + self->data = NULL; + Py_BEGIN_ALLOW_THREADS + if (data != NULL) { + UnmapViewOfFile(data); } - if (self->map_handle != NULL) { - CloseHandle(self->map_handle); - self->map_handle = NULL; + if (map_handle != NULL) { + CloseHandle(map_handle); } - if (self->file_handle != INVALID_HANDLE_VALUE) { - CloseHandle(self->file_handle); - self->file_handle = INVALID_HANDLE_VALUE; + if (file_handle != INVALID_HANDLE_VALUE) { + CloseHandle(file_handle); } + Py_END_ALLOW_THREADS #endif /* MS_WINDOWS */ #ifdef UNIX - if (0 <= self->fd) - (void) close(self->fd); + int fd = self->fd; + char *data = self->data; self->fd = -1; - if (self->data != NULL) { - munmap(self->data, self->size); - self->data = NULL; + self->data = NULL; + Py_BEGIN_ALLOW_THREADS + if (0 <= fd) + (void) close(fd); + if (data != NULL) { + munmap(data, self->size); } + Py_END_ALLOW_THREADS #endif Py_RETURN_NONE; From webhook-mailer at python.org Wed Mar 6 11:54:16 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 06 Mar 2019 16:54:16 -0000 Subject: [Python-checkins] bpo-9566: Fix compiler warnings in gcmodule.c (GH-11010) Message-ID: https://github.com/python/cpython/commit/edad38e3e05586ba58291f47756eb3fb808f5577 commit: edad38e3e05586ba58291f47756eb3fb808f5577 branch: master author: Jeremy Kloth committer: Victor Stinner date: 2019-03-06T17:54:12+01:00 summary: bpo-9566: Fix compiler warnings in gcmodule.c (GH-11010) Change PyDTrace_GC_DONE() argument type from int to Py_ssize_t. files: M Include/pydtrace.h diff --git a/Include/pydtrace.h b/Include/pydtrace.h index 037961d429c6..7a04278166b0 100644 --- a/Include/pydtrace.h +++ b/Include/pydtrace.h @@ -29,7 +29,7 @@ static inline void PyDTrace_LINE(const char *arg0, const char *arg1, int arg2) { static inline void PyDTrace_FUNCTION_ENTRY(const char *arg0, const char *arg1, int arg2) {} static inline void PyDTrace_FUNCTION_RETURN(const char *arg0, const char *arg1, int arg2) {} static inline void PyDTrace_GC_START(int arg0) {} -static inline void PyDTrace_GC_DONE(int arg0) {} +static inline void PyDTrace_GC_DONE(Py_ssize_t arg0) {} static inline void PyDTrace_INSTANCE_NEW_START(int arg0) {} static inline void PyDTrace_INSTANCE_NEW_DONE(int arg0) {} static inline void PyDTrace_INSTANCE_DELETE_START(int arg0) {} From webhook-mailer at python.org Wed Mar 6 12:08:34 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 06 Mar 2019 17:08:34 -0000 Subject: [Python-checkins] bpo-36139: Fix mmap_object_dealloc(): hold the GIL to call PyMem_Free() (GH-12199) Message-ID: https://github.com/python/cpython/commit/dc078947a5033a048d804e244e847b5844734439 commit: dc078947a5033a048d804e244e847b5844734439 branch: master author: Davide Rizzo committer: Victor Stinner date: 2019-03-06T18:08:31+01:00 summary: bpo-36139: Fix mmap_object_dealloc(): hold the GIL to call PyMem_Free() (GH-12199) files: M Modules/mmapmodule.c diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index 326288cccde5..6ddbf70d9a97 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -117,26 +117,28 @@ typedef struct { static void mmap_object_dealloc(mmap_object *m_obj) { - Py_BEGIN_ALLOW_THREADS #ifdef MS_WINDOWS + Py_BEGIN_ALLOW_THREADS if (m_obj->data != NULL) UnmapViewOfFile (m_obj->data); if (m_obj->map_handle != NULL) CloseHandle (m_obj->map_handle); if (m_obj->file_handle != INVALID_HANDLE_VALUE) CloseHandle (m_obj->file_handle); + Py_END_ALLOW_THREADS if (m_obj->tagname) PyMem_Free(m_obj->tagname); #endif /* MS_WINDOWS */ #ifdef UNIX + Py_BEGIN_ALLOW_THREADS if (m_obj->fd >= 0) (void) close(m_obj->fd); if (m_obj->data!=NULL) { munmap(m_obj->data, m_obj->size); } -#endif /* UNIX */ Py_END_ALLOW_THREADS +#endif /* UNIX */ if (m_obj->weakreflist != NULL) PyObject_ClearWeakRefs((PyObject *) m_obj); From webhook-mailer at python.org Thu Mar 7 00:16:50 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Thu, 07 Mar 2019 05:16:50 -0000 Subject: [Python-checkins] bpo-36185: Fix typo in Doc/c-api/objbuffer.rst. (GH-12204) Message-ID: https://github.com/python/cpython/commit/ecc161d1209bf6d21f0fd6bef28476eda7cdaf79 commit: ecc161d1209bf6d21f0fd6bef28476eda7cdaf79 branch: master author: Emmanuel Arias committer: Serhiy Storchaka date: 2019-03-07T07:16:41+02:00 summary: bpo-36185: Fix typo in Doc/c-api/objbuffer.rst. (GH-12204) files: M Doc/c-api/objbuffer.rst diff --git a/Doc/c-api/objbuffer.rst b/Doc/c-api/objbuffer.rst index 9ad7c571c4d8..3572564b13e9 100644 --- a/Doc/c-api/objbuffer.rst +++ b/Doc/c-api/objbuffer.rst @@ -42,7 +42,7 @@ an object, and :c:func:`PyBuffer_Release` when the buffer view can be released. Otherwise returns ``0``. This function always succeeds. Note that this function tries to get and release a buffer, and exceptions - which occur while calling correspoding functions will get suppressed. + which occur while calling corresponding functions will get suppressed. To get error reporting use :c:func:`PyObject_GetBuffer()` instead. From webhook-mailer at python.org Thu Mar 7 00:23:25 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Thu, 07 Mar 2019 05:23:25 -0000 Subject: [Python-checkins] Fix the documentation for set.copy() (GH-12176) Message-ID: https://github.com/python/cpython/commit/e942e7b5c91995ae1ad967ef2c0f116a5d8555de commit: e942e7b5c91995ae1ad967ef2c0f116a5d8555de branch: master author: Andre Delfino committer: Serhiy Storchaka date: 2019-03-07T07:23:21+02:00 summary: Fix the documentation for set.copy() (GH-12176) Remove 's' mention as there's no argument. files: M Doc/library/stdtypes.rst diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index d1b1b8c636e9..c9fbfd098f2c 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -4020,7 +4020,7 @@ The constructors for both classes work the same: .. method:: copy() - Return a new set with a shallow copy of *s*. + Return a shallow copy of the set. Note, the non-operator versions of :meth:`union`, :meth:`intersection`, From webhook-mailer at python.org Thu Mar 7 00:24:57 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 07 Mar 2019 05:24:57 -0000 Subject: [Python-checkins] bpo-36185: Fix typo in Doc/c-api/objbuffer.rst. (GH-12204) Message-ID: https://github.com/python/cpython/commit/ca5ba3c8ac1dad511461d4251ffffc6a1ca19de2 commit: ca5ba3c8ac1dad511461d4251ffffc6a1ca19de2 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-06T21:24:55-08:00 summary: bpo-36185: Fix typo in Doc/c-api/objbuffer.rst. (GH-12204) (cherry picked from commit ecc161d1209bf6d21f0fd6bef28476eda7cdaf79) Co-authored-by: Emmanuel Arias files: M Doc/c-api/objbuffer.rst diff --git a/Doc/c-api/objbuffer.rst b/Doc/c-api/objbuffer.rst index 9ad7c571c4d8..3572564b13e9 100644 --- a/Doc/c-api/objbuffer.rst +++ b/Doc/c-api/objbuffer.rst @@ -42,7 +42,7 @@ an object, and :c:func:`PyBuffer_Release` when the buffer view can be released. Otherwise returns ``0``. This function always succeeds. Note that this function tries to get and release a buffer, and exceptions - which occur while calling correspoding functions will get suppressed. + which occur while calling corresponding functions will get suppressed. To get error reporting use :c:func:`PyObject_GetBuffer()` instead. From webhook-mailer at python.org Thu Mar 7 00:29:52 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 07 Mar 2019 05:29:52 -0000 Subject: [Python-checkins] Fix the documentation for set.copy() (GH-12176) Message-ID: https://github.com/python/cpython/commit/68041e0f6bf005f4adfecd1f3ba567394b5de6cd commit: 68041e0f6bf005f4adfecd1f3ba567394b5de6cd branch: 2.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-06T21:29:48-08:00 summary: Fix the documentation for set.copy() (GH-12176) Remove 's' mention as there's no argument. (cherry picked from commit e942e7b5c91995ae1ad967ef2c0f116a5d8555de) Co-authored-by: Andre Delfino files: M Doc/library/stdtypes.rst diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index ff68738abcda..b4fe19a5f081 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1909,7 +1909,7 @@ The constructors for both classes work the same: .. method:: copy() - Return a new set with a shallow copy of *s*. + Return a shallow copy of the set. Note, the non-operator versions of :meth:`union`, :meth:`intersection`, From webhook-mailer at python.org Thu Mar 7 00:30:36 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 07 Mar 2019 05:30:36 -0000 Subject: [Python-checkins] Fix the documentation for set.copy() (GH-12176) Message-ID: https://github.com/python/cpython/commit/bf44f48b63c4896c4d744a5c5af7861f8e25ecea commit: bf44f48b63c4896c4d744a5c5af7861f8e25ecea branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-06T21:30:33-08:00 summary: Fix the documentation for set.copy() (GH-12176) Remove 's' mention as there's no argument. (cherry picked from commit e942e7b5c91995ae1ad967ef2c0f116a5d8555de) Co-authored-by: Andre Delfino files: M Doc/library/stdtypes.rst diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 057c5d5f35c0..c21cb0d9ea0f 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -3975,7 +3975,7 @@ The constructors for both classes work the same: .. method:: copy() - Return a new set with a shallow copy of *s*. + Return a shallow copy of the set. Note, the non-operator versions of :meth:`union`, :meth:`intersection`, From webhook-mailer at python.org Thu Mar 7 01:59:45 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Thu, 07 Mar 2019 06:59:45 -0000 Subject: [Python-checkins] bpo-36169 : Add overlap() method to statistics.NormalDist (GH-12149) Message-ID: https://github.com/python/cpython/commit/318d537daabf2bd5f781255c7e25bfce260cf227 commit: 318d537daabf2bd5f781255c7e25bfce260cf227 branch: master author: Raymond Hettinger committer: GitHub date: 2019-03-06T22:59:40-08:00 summary: bpo-36169 : Add overlap() method to statistics.NormalDist (GH-12149) files: A Misc/NEWS.d/next/Library/2019-03-03-11-37-09.bpo-36169.8nWJy7.rst M Doc/library/statistics.rst M Lib/statistics.py M Lib/test/test_statistics.py diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst index 8f8c0098f84a..be0215af6036 100644 --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -549,6 +549,28 @@ of applications in statistics, including simulations and hypothesis testing. compute the probability that a random variable *X* will be less than or equal to *x*. Mathematically, it is written ``P(X <= x)``. + .. method:: NormalDist.overlap(other) + + Compute the `overlapping coefficient (OVL) + `_ + between two normal distributions. + + Measures the agreement between two normal probability distributions. + Returns a value between 0.0 and 1.0 giving the overlapping area for + two probability density functions. + + In this `example from John M. Linacre + `_ about 80% of each + distribution overlaps the other: + + .. doctest:: + + >>> N1 = NormalDist(2.4, 1.6) + >>> N2 = NormalDist(3.2, 2.0) + >>> ovl = N1.overlap(N2) + >>> f'{ovl * 100.0 :.1f}%' + '80.4%' + Instances of :class:`NormalDist` support addition, subtraction, multiplication and division by a constant. These operations are used for translation and scaling. For example: @@ -595,6 +617,16 @@ determine the percentage of students with scores between 1100 and 1200: >>> f'{fraction * 100 :.1f}% score between 1100 and 1200' '18.2% score between 1100 and 1200' +What percentage of men and women will have the same height in `two normally +distributed populations with known means and standard deviations +`_? + + >>> men = NormalDist(70, 4) + >>> women = NormalDist(65, 3.5) + >>> ovl = men.overlap(women) + >>> round(ovl * 100.0, 1) + 50.3 + To estimate the distribution for a model than isn't easy to solve analytically, :class:`NormalDist` can generate input samples for a `Monte Carlo simulation `_ of the diff --git a/Lib/statistics.py b/Lib/statistics.py index e917a5dddd8b..e85aaa996cc7 100644 --- a/Lib/statistics.py +++ b/Lib/statistics.py @@ -91,7 +91,7 @@ from decimal import Decimal from itertools import groupby from bisect import bisect_left, bisect_right -from math import hypot, sqrt, fabs, exp, erf, tau +from math import hypot, sqrt, fabs, exp, erf, tau, log, fsum @@ -740,6 +740,41 @@ def cdf(self, x): raise StatisticsError('cdf() not defined when sigma is zero') return 0.5 * (1.0 + erf((x - self.mu) / (self.sigma * sqrt(2.0)))) + def overlap(self, other): + '''Compute the overlapping coefficient (OVL) between two normal distributions. + + Measures the agreement between two normal probability distributions. + Returns a value between 0.0 and 1.0 giving the overlapping area in + the two underlying probability density functions. + + >>> N1 = NormalDist(2.4, 1.6) + >>> N2 = NormalDist(3.2, 2.0) + >>> N1.overlap(N2) + 0.8035050657330205 + + ''' + # See: "The overlapping coefficient as a measure of agreement between + # probability distributions and point estimation of the overlap of two + # normal densities" -- Henry F. Inman and Edwin L. Bradley Jr + # http://dx.doi.org/10.1080/03610928908830127 + if not isinstance(other, NormalDist): + raise TypeError('Expected another NormalDist instance') + X, Y = self, other + if (Y.sigma, Y.mu) < (X.sigma, X.mu): # sort to assure commutativity + X, Y = Y, X + X_var, Y_var = X.variance, Y.variance + if not X_var or not Y_var: + raise StatisticsError('overlap() not defined when sigma is zero') + dv = Y_var - X_var + dm = fabs(Y.mu - X.mu) + if not dv: + return 2.0 * NormalDist(dm, 2.0 * X.sigma).cdf(0) + a = X.mu * Y_var - Y.mu * X_var + b = X.sigma * Y.sigma * sqrt(dm**2.0 + dv * log(Y_var / X_var)) + x1 = (a + b) / dv + x2 = (a - b) / dv + return 1.0 - (fabs(Y.cdf(x1) - X.cdf(x1)) + fabs(Y.cdf(x2) - X.cdf(x2))) + @property def mean(self): 'Arithmetic mean of the normal distribution' diff --git a/Lib/test/test_statistics.py b/Lib/test/test_statistics.py index 3f14e63c23f9..132b9823fd21 100644 --- a/Lib/test/test_statistics.py +++ b/Lib/test/test_statistics.py @@ -2162,6 +2162,68 @@ def test_cdf(self): self.assertEqual(X.cdf(float('Inf')), 1.0) self.assertTrue(math.isnan(X.cdf(float('NaN')))) + def test_overlap(self): + NormalDist = statistics.NormalDist + + # Match examples from Imman and Bradley + for X1, X2, published_result in [ + (NormalDist(0.0, 2.0), NormalDist(1.0, 2.0), 0.80258), + (NormalDist(0.0, 1.0), NormalDist(1.0, 2.0), 0.60993), + ]: + self.assertAlmostEqual(X1.overlap(X2), published_result, places=4) + self.assertAlmostEqual(X2.overlap(X1), published_result, places=4) + + # Check against integration of the PDF + def overlap_numeric(X, Y, *, steps=8_192, z=5): + 'Numerical integration cross-check for overlap() ' + fsum = math.fsum + center = (X.mu + Y.mu) / 2.0 + width = z * max(X.sigma, Y.sigma) + start = center - width + dx = 2.0 * width / steps + x_arr = [start + i*dx for i in range(steps)] + xp = list(map(X.pdf, x_arr)) + yp = list(map(Y.pdf, x_arr)) + total = max(fsum(xp), fsum(yp)) + return fsum(map(min, xp, yp)) / total + + for X1, X2 in [ + # Examples from Imman and Bradley + (NormalDist(0.0, 2.0), NormalDist(1.0, 2.0)), + (NormalDist(0.0, 1.0), NormalDist(1.0, 2.0)), + # Example from https://www.rasch.org/rmt/rmt101r.htm + (NormalDist(0.0, 1.0), NormalDist(1.0, 2.0)), + # Gender heights from http://www.usablestats.com/lessons/normal + (NormalDist(70, 4), NormalDist(65, 3.5)), + # Misc cases with equal standard deviations + (NormalDist(100, 15), NormalDist(110, 15)), + (NormalDist(-100, 15), NormalDist(110, 15)), + (NormalDist(-100, 15), NormalDist(-110, 15)), + # Misc cases with unequal standard deviations + (NormalDist(100, 12), NormalDist(110, 15)), + (NormalDist(100, 12), NormalDist(150, 15)), + (NormalDist(100, 12), NormalDist(150, 35)), + # Misc cases with small values + (NormalDist(1.000, 0.002), NormalDist(1.001, 0.003)), + (NormalDist(1.000, 0.002), NormalDist(1.006, 0.0003)), + (NormalDist(1.000, 0.002), NormalDist(1.001, 0.099)), + ]: + self.assertAlmostEqual(X1.overlap(X2), overlap_numeric(X1, X2), places=5) + self.assertAlmostEqual(X2.overlap(X1), overlap_numeric(X1, X2), places=5) + + # Error cases + X = NormalDist() + with self.assertRaises(TypeError): + X.overlap() # too few arguments + with self.assertRaises(TypeError): + X.overlap(X, X) # too may arguments + with self.assertRaises(TypeError): + X.overlap(None) # right operand not a NormalDist + with self.assertRaises(statistics.StatisticsError): + X.overlap(NormalDist(1, 0)) # right operand sigma is zero + with self.assertRaises(statistics.StatisticsError): + NormalDist(1, 0).overlap(X) # left operand sigma is zero + def test_properties(self): X = statistics.NormalDist(100, 15) self.assertEqual(X.mean, 100) diff --git a/Misc/NEWS.d/next/Library/2019-03-03-11-37-09.bpo-36169.8nWJy7.rst b/Misc/NEWS.d/next/Library/2019-03-03-11-37-09.bpo-36169.8nWJy7.rst new file mode 100644 index 000000000000..49afa2eed294 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-03-11-37-09.bpo-36169.8nWJy7.rst @@ -0,0 +1,2 @@ +Add overlap() method to statistics.NormalDist. Computes the overlapping +coefficient for two normal distributions. From webhook-mailer at python.org Thu Mar 7 02:24:01 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 07 Mar 2019 07:24:01 -0000 Subject: [Python-checkins] Refine statistics.NormalDist documentation and improve test coverage (GH-12208) Message-ID: https://github.com/python/cpython/commit/1f58f4fa6a0e3c60cee8df4a35c8dcf3903acde8 commit: 1f58f4fa6a0e3c60cee8df4a35c8dcf3903acde8 branch: master author: Raymond Hettinger committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-06T23:23:55-08:00 summary: Refine statistics.NormalDist documentation and improve test coverage (GH-12208) files: M Doc/library/statistics.rst M Lib/test/test_statistics.py diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst index be0215af6036..157500ed4b4a 100644 --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -479,7 +479,7 @@ measurements as a single entity. Normal distributions arise from the `Central Limit Theorem `_ and have a wide range -of applications in statistics, including simulations and hypothesis testing. +of applications in statistics. .. class:: NormalDist(mu=0.0, sigma=1.0) @@ -492,19 +492,19 @@ of applications in statistics, including simulations and hypothesis testing. .. attribute:: mean - A read-only property representing the `arithmetic mean + A read-only property for the `arithmetic mean `_ of a normal distribution. .. attribute:: stdev - A read-only property representing the `standard deviation + A read-only property for the `standard deviation `_ of a normal distribution. .. attribute:: variance - A read-only property representing the `variance + A read-only property for the `variance `_ of a normal distribution. Equal to the square of the standard deviation. @@ -584,8 +584,8 @@ of applications in statistics, including simulations and hypothesis testing. Dividing a constant by an instance of :class:`NormalDist` is not supported. Since normal distributions arise from additive effects of independent - variables, it is possible to `add and subtract two normally distributed - random variables + variables, it is possible to `add and subtract two independent normally + distributed random variables `_ represented as instances of :class:`NormalDist`. For example: @@ -607,15 +607,15 @@ of applications in statistics, including simulations and hypothesis testing. For example, given `historical data for SAT exams `_ showing that scores -are normally distributed with a mean of 1060 and standard deviation of 192, +are normally distributed with a mean of 1060 and a standard deviation of 192, determine the percentage of students with scores between 1100 and 1200: .. doctest:: >>> sat = NormalDist(1060, 195) - >>> fraction = sat.cdf(1200) - sat.cdf(1100) + >>> fraction = sat.cdf(1200 + 0.5) - sat.cdf(1100 - 0.5) >>> f'{fraction * 100 :.1f}% score between 1100 and 1200' - '18.2% score between 1100 and 1200' + '18.4% score between 1100 and 1200' What percentage of men and women will have the same height in `two normally distributed populations with known means and standard deviations @@ -644,20 +644,12 @@ model: Normal distributions commonly arise in machine learning problems. -Wikipedia has a `nice example with a Naive Bayesian Classifier -`_. The challenge -is to guess a person's gender from measurements of normally distributed -features including height, weight, and foot size. +Wikipedia has a `nice example of a Naive Bayesian Classifier +`_. The challenge is to +predict a person's gender from measurements of normally distributed features +including height, weight, and foot size. -The `prior probability `_ of -being male or female is 50%: - -.. doctest:: - - >>> prior_male = 0.5 - >>> prior_female = 0.5 - -We also have a training dataset with measurements for eight people. These +We're given a training dataset with measurements for eight people. The measurements are assumed to be normally distributed, so we summarize the data with :class:`NormalDist`: @@ -670,8 +662,8 @@ with :class:`NormalDist`: >>> foot_size_male = NormalDist.from_samples([12, 11, 12, 10]) >>> foot_size_female = NormalDist.from_samples([6, 8, 7, 9]) -We observe a new person whose feature measurements are known but whose gender -is unknown: +Next, we encounter a new person whose feature measurements are known but whose +gender is unknown: .. doctest:: @@ -679,19 +671,23 @@ is unknown: >>> wt = 130 # weight >>> fs = 8 # foot size -The posterior is the product of the prior times each likelihood of a -feature measurement given the gender: +Starting with a 50% `prior probability +`_ of being male or female, +we compute the posterior as the prior times the product of likelihoods for the +feature measurements given the gender: .. doctest:: + >>> prior_male = 0.5 + >>> prior_female = 0.5 >>> posterior_male = (prior_male * height_male.pdf(ht) * ... weight_male.pdf(wt) * foot_size_male.pdf(fs)) >>> posterior_female = (prior_female * height_female.pdf(ht) * ... weight_female.pdf(wt) * foot_size_female.pdf(fs)) -The final prediction is awarded to the largest posterior -- this is known as -the `maximum a posteriori +The final prediction goes to the largest posterior. This is known as the +`maximum a posteriori `_ or MAP: .. doctest:: diff --git a/Lib/test/test_statistics.py b/Lib/test/test_statistics.py index 132b9823fd21..a63e4bf6cc84 100644 --- a/Lib/test/test_statistics.py +++ b/Lib/test/test_statistics.py @@ -2123,6 +2123,7 @@ def test_pdf(self): 0.3605, 0.3589, 0.3572, 0.3555, 0.3538, ]): self.assertAlmostEqual(Z.pdf(x / 100.0), px, places=4) + self.assertAlmostEqual(Z.pdf(-x / 100.0), px, places=4) # Error case: variance is zero Y = NormalDist(100, 0) with self.assertRaises(statistics.StatisticsError): @@ -2262,7 +2263,7 @@ def test_translation_and_scaling(self): self.assertEqual(X * y, NormalDist(1000, 150)) # __mul__ self.assertEqual(y * X, NormalDist(1000, 150)) # __rmul__ self.assertEqual(X / y, NormalDist(10, 1.5)) # __truediv__ - with self.assertRaises(TypeError): + with self.assertRaises(TypeError): # __rtruediv__ y / X def test_equality(self): From webhook-mailer at python.org Thu Mar 7 11:02:33 2019 From: webhook-mailer at python.org (Steve Dower) Date: Thu, 07 Mar 2019 16:02:33 -0000 Subject: [Python-checkins] bpo-36216: Add check for characters in netloc that normalize to separators (GH-12201) Message-ID: https://github.com/python/cpython/commit/16e6f7dee7f02bb81aa6b385b982dcdda5b99286 commit: 16e6f7dee7f02bb81aa6b385b982dcdda5b99286 branch: master author: Steve Dower committer: GitHub date: 2019-03-07T08:02:26-08:00 summary: bpo-36216: Add check for characters in netloc that normalize to separators (GH-12201) files: A Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst M Doc/library/urllib.parse.rst M Lib/test/test_urlparse.py M Lib/urllib/parse.py diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst index 913e933d657c..af15f5bbfff3 100644 --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -124,6 +124,11 @@ or on combining URL components into a URL string. Unmatched square brackets in the :attr:`netloc` attribute will raise a :exc:`ValueError`. + Characters in the :attr:`netloc` attribute that decompose under NFKC + normalization (as used by the IDNA encoding) into any of ``/``, ``?``, + ``#``, ``@``, or ``:`` will raise a :exc:`ValueError`. If the URL is + decomposed before parsing, no error will be raised. + .. versionchanged:: 3.2 Added IPv6 URL parsing capabilities. @@ -136,6 +141,10 @@ or on combining URL components into a URL string. Out-of-range port numbers now raise :exc:`ValueError`, instead of returning :const:`None`. + .. versionchanged:: 3.8 + Characters that affect netloc parsing under NFKC normalization will + now raise :exc:`ValueError`. + .. function:: parse_qs(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace', max_num_fields=None) @@ -259,10 +268,19 @@ or on combining URL components into a URL string. Unmatched square brackets in the :attr:`netloc` attribute will raise a :exc:`ValueError`. + Characters in the :attr:`netloc` attribute that decompose under NFKC + normalization (as used by the IDNA encoding) into any of ``/``, ``?``, + ``#``, ``@``, or ``:`` will raise a :exc:`ValueError`. If the URL is + decomposed before parsing, no error will be raised. + .. versionchanged:: 3.6 Out-of-range port numbers now raise :exc:`ValueError`, instead of returning :const:`None`. + .. versionchanged:: 3.8 + Characters that affect netloc parsing under NFKC normalization will + now raise :exc:`ValueError`. + .. function:: urlunsplit(parts) diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index 9c71be53afd4..0faf2bbb6459 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -1,3 +1,5 @@ +import sys +import unicodedata import unittest import urllib.parse @@ -994,6 +996,27 @@ def test_all(self): expected.append(name) self.assertCountEqual(urllib.parse.__all__, expected) + def test_urlsplit_normalization(self): + # Certain characters should never occur in the netloc, + # including under normalization. + # Ensure that ALL of them are detected and cause an error + illegal_chars = '/:#?@' + hex_chars = {'{:04X}'.format(ord(c)) for c in illegal_chars} + denorm_chars = [ + c for c in map(chr, range(128, sys.maxunicode)) + if (hex_chars & set(unicodedata.decomposition(c).split())) + and c not in illegal_chars + ] + # Sanity check that we found at least one such character + self.assertIn('\u2100', denorm_chars) + self.assertIn('\uFF03', denorm_chars) + + for scheme in ["http", "https", "ftp"]: + for c in denorm_chars: + url = "{}://netloc{}false.netloc/path".format(scheme, c) + with self.subTest(url=url, char='{:04X}'.format(ord(c))): + with self.assertRaises(ValueError): + urllib.parse.urlsplit(url) class Utility_Tests(unittest.TestCase): """Testcase to test the various utility functions in the urllib.""" diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index dc2171144fc8..8b6c9b106091 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -396,6 +396,21 @@ def _splitnetloc(url, start=0): delim = min(delim, wdelim) # use earliest delim position return url[start:delim], url[delim:] # return (domain, rest) +def _checknetloc(netloc): + if not netloc or netloc.isascii(): + return + # looking for characters like \u2100 that expand to 'a/c' + # IDNA uses NFKC equivalence, so normalize for this check + import unicodedata + netloc2 = unicodedata.normalize('NFKC', netloc) + if netloc == netloc2: + return + _, _, netloc = netloc.rpartition('@') # anything to the left of '@' is okay + for c in '/?#@:': + if c in netloc2: + raise ValueError("netloc '" + netloc2 + "' contains invalid " + + "characters under NFKC normalization") + def urlsplit(url, scheme='', allow_fragments=True): """Parse a URL into 5 components: :///?# @@ -424,6 +439,7 @@ def urlsplit(url, scheme='', allow_fragments=True): url, fragment = url.split('#', 1) if '?' in url: url, query = url.split('?', 1) + _checknetloc(netloc) v = SplitResult('http', netloc, url, query, fragment) _parse_cache[key] = v return _coerce_result(v) @@ -447,6 +463,7 @@ def urlsplit(url, scheme='', allow_fragments=True): url, fragment = url.split('#', 1) if '?' in url: url, query = url.split('?', 1) + _checknetloc(netloc) v = SplitResult(scheme, netloc, url, query, fragment) _parse_cache[key] = v return _coerce_result(v) diff --git a/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst b/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst new file mode 100644 index 000000000000..5546394157f9 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst @@ -0,0 +1,3 @@ +Changes urlsplit() to raise ValueError when the URL contains characters that +decompose under IDNA encoding (NFKC-normalization) into characters that +affect how the URL is parsed. From webhook-mailer at python.org Thu Mar 7 11:54:35 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 07 Mar 2019 16:54:35 -0000 Subject: [Python-checkins] NormalDist.overlap() only needs one example (GH-12218) Message-ID: https://github.com/python/cpython/commit/14bab7abeea195c97f4166740ee1d15471964244 commit: 14bab7abeea195c97f4166740ee1d15471964244 branch: master author: Raymond Hettinger committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-07T08:54:31-08:00 summary: NormalDist.overlap() only needs one example (GH-12218) files: M Doc/library/statistics.rst diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst index 157500ed4b4a..9aa83331ee0e 100644 --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -553,23 +553,10 @@ of applications in statistics. Compute the `overlapping coefficient (OVL) `_ - between two normal distributions. - - Measures the agreement between two normal probability distributions. - Returns a value between 0.0 and 1.0 giving the overlapping area for - two probability density functions. - - In this `example from John M. Linacre - `_ about 80% of each - distribution overlaps the other: - - .. doctest:: - - >>> N1 = NormalDist(2.4, 1.6) - >>> N2 = NormalDist(3.2, 2.0) - >>> ovl = N1.overlap(N2) - >>> f'{ovl * 100.0 :.1f}%' - '80.4%' + between two normal distributions, giving a measure of agreement. + Returns a value between 0.0 and 1.0 giving `the overlapping area for + two probability density functions + `_. Instances of :class:`NormalDist` support addition, subtraction, multiplication and division by a constant. These operations From webhook-mailer at python.org Thu Mar 7 12:08:34 2019 From: webhook-mailer at python.org (Steve Dower) Date: Thu, 07 Mar 2019 17:08:34 -0000 Subject: [Python-checkins] bpo-36216: Add check for characters in netloc that normalize to separators (GH-12201) Message-ID: https://github.com/python/cpython/commit/daad2c482c91de32d8305abbccc76a5de8b3a8be commit: daad2c482c91de32d8305abbccc76a5de8b3a8be branch: 3.7 author: Steve Dower committer: GitHub date: 2019-03-07T09:08:18-08:00 summary: bpo-36216: Add check for characters in netloc that normalize to separators (GH-12201) files: A Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst M Doc/library/urllib.parse.rst M Lib/test/test_urlparse.py M Lib/urllib/parse.py diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst index 0c8f0f607314..b565e1edd321 100644 --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -124,6 +124,11 @@ or on combining URL components into a URL string. Unmatched square brackets in the :attr:`netloc` attribute will raise a :exc:`ValueError`. + Characters in the :attr:`netloc` attribute that decompose under NFKC + normalization (as used by the IDNA encoding) into any of ``/``, ``?``, + ``#``, ``@``, or ``:`` will raise a :exc:`ValueError`. If the URL is + decomposed before parsing, no error will be raised. + .. versionchanged:: 3.2 Added IPv6 URL parsing capabilities. @@ -136,6 +141,10 @@ or on combining URL components into a URL string. Out-of-range port numbers now raise :exc:`ValueError`, instead of returning :const:`None`. + .. versionchanged:: 3.7.3 + Characters that affect netloc parsing under NFKC normalization will + now raise :exc:`ValueError`. + .. function:: parse_qs(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace', max_num_fields=None) @@ -257,10 +266,19 @@ or on combining URL components into a URL string. Unmatched square brackets in the :attr:`netloc` attribute will raise a :exc:`ValueError`. + Characters in the :attr:`netloc` attribute that decompose under NFKC + normalization (as used by the IDNA encoding) into any of ``/``, ``?``, + ``#``, ``@``, or ``:`` will raise a :exc:`ValueError`. If the URL is + decomposed before parsing, no error will be raised. + .. versionchanged:: 3.6 Out-of-range port numbers now raise :exc:`ValueError`, instead of returning :const:`None`. + .. versionchanged:: 3.7.3 + Characters that affect netloc parsing under NFKC normalization will + now raise :exc:`ValueError`. + .. function:: urlunsplit(parts) diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index be50b47603aa..e6638aee2244 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -1,3 +1,5 @@ +import sys +import unicodedata import unittest import urllib.parse @@ -984,6 +986,27 @@ def test_all(self): expected.append(name) self.assertCountEqual(urllib.parse.__all__, expected) + def test_urlsplit_normalization(self): + # Certain characters should never occur in the netloc, + # including under normalization. + # Ensure that ALL of them are detected and cause an error + illegal_chars = '/:#?@' + hex_chars = {'{:04X}'.format(ord(c)) for c in illegal_chars} + denorm_chars = [ + c for c in map(chr, range(128, sys.maxunicode)) + if (hex_chars & set(unicodedata.decomposition(c).split())) + and c not in illegal_chars + ] + # Sanity check that we found at least one such character + self.assertIn('\u2100', denorm_chars) + self.assertIn('\uFF03', denorm_chars) + + for scheme in ["http", "https", "ftp"]: + for c in denorm_chars: + url = "{}://netloc{}false.netloc/path".format(scheme, c) + with self.subTest(url=url, char='{:04X}'.format(ord(c))): + with self.assertRaises(ValueError): + urllib.parse.urlsplit(url) class Utility_Tests(unittest.TestCase): """Testcase to test the various utility functions in the urllib.""" diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index f691ab74f87f..39c5d6a80824 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -391,6 +391,21 @@ def _splitnetloc(url, start=0): delim = min(delim, wdelim) # use earliest delim position return url[start:delim], url[delim:] # return (domain, rest) +def _checknetloc(netloc): + if not netloc or netloc.isascii(): + return + # looking for characters like \u2100 that expand to 'a/c' + # IDNA uses NFKC equivalence, so normalize for this check + import unicodedata + netloc2 = unicodedata.normalize('NFKC', netloc) + if netloc == netloc2: + return + _, _, netloc = netloc.rpartition('@') # anything to the left of '@' is okay + for c in '/?#@:': + if c in netloc2: + raise ValueError("netloc '" + netloc2 + "' contains invalid " + + "characters under NFKC normalization") + def urlsplit(url, scheme='', allow_fragments=True): """Parse a URL into 5 components: :///?# @@ -419,6 +434,7 @@ def urlsplit(url, scheme='', allow_fragments=True): url, fragment = url.split('#', 1) if '?' in url: url, query = url.split('?', 1) + _checknetloc(netloc) v = SplitResult('http', netloc, url, query, fragment) _parse_cache[key] = v return _coerce_result(v) @@ -442,6 +458,7 @@ def urlsplit(url, scheme='', allow_fragments=True): url, fragment = url.split('#', 1) if '?' in url: url, query = url.split('?', 1) + _checknetloc(netloc) v = SplitResult(scheme, netloc, url, query, fragment) _parse_cache[key] = v return _coerce_result(v) diff --git a/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst b/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst new file mode 100644 index 000000000000..5546394157f9 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst @@ -0,0 +1,3 @@ +Changes urlsplit() to raise ValueError when the URL contains characters that +decompose under IDNA encoding (NFKC-normalization) into characters that +affect how the URL is parsed. From webhook-mailer at python.org Thu Mar 7 12:08:48 2019 From: webhook-mailer at python.org (Steve Dower) Date: Thu, 07 Mar 2019 17:08:48 -0000 Subject: [Python-checkins] bpo-36216: Add check for characters in netloc that normalize to separators (GH-12201) Message-ID: https://github.com/python/cpython/commit/e37ef41289b77e0f0bb9a6aedb0360664c55bdd5 commit: e37ef41289b77e0f0bb9a6aedb0360664c55bdd5 branch: 2.7 author: Steve Dower committer: GitHub date: 2019-03-07T09:08:45-08:00 summary: bpo-36216: Add check for characters in netloc that normalize to separators (GH-12201) files: A Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst M Doc/library/urlparse.rst M Lib/test/test_urlparse.py M Lib/urlparse.py diff --git a/Doc/library/urlparse.rst b/Doc/library/urlparse.rst index 22249da54fbb..0989c88c3022 100644 --- a/Doc/library/urlparse.rst +++ b/Doc/library/urlparse.rst @@ -119,12 +119,22 @@ The :mod:`urlparse` module defines the following functions: See section :ref:`urlparse-result-object` for more information on the result object. + Characters in the :attr:`netloc` attribute that decompose under NFKC + normalization (as used by the IDNA encoding) into any of ``/``, ``?``, + ``#``, ``@``, or ``:`` will raise a :exc:`ValueError`. If the URL is + decomposed before parsing, or is not a Unicode string, no error will be + raised. + .. versionchanged:: 2.5 Added attributes to return value. .. versionchanged:: 2.7 Added IPv6 URL parsing capabilities. + .. versionchanged:: 2.7.17 + Characters that affect netloc parsing under NFKC normalization will + now raise :exc:`ValueError`. + .. function:: parse_qs(qs[, keep_blank_values[, strict_parsing[, max_num_fields]]]) @@ -232,11 +242,21 @@ The :mod:`urlparse` module defines the following functions: See section :ref:`urlparse-result-object` for more information on the result object. + Characters in the :attr:`netloc` attribute that decompose under NFKC + normalization (as used by the IDNA encoding) into any of ``/``, ``?``, + ``#``, ``@``, or ``:`` will raise a :exc:`ValueError`. If the URL is + decomposed before parsing, or is not a Unicode string, no error will be + raised. + .. versionadded:: 2.2 .. versionchanged:: 2.5 Added attributes to return value. + .. versionchanged:: 2.7.17 + Characters that affect netloc parsing under NFKC normalization will + now raise :exc:`ValueError`. + .. function:: urlunsplit(parts) diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index 4e1ded73c266..73b0228ea8e3 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -1,4 +1,6 @@ from test import test_support +import sys +import unicodedata import unittest import urlparse @@ -624,6 +626,28 @@ def test_portseparator(self): self.assertEqual(urlparse.urlparse("http://www.python.org:80"), ('http','www.python.org:80','','','','')) + def test_urlsplit_normalization(self): + # Certain characters should never occur in the netloc, + # including under normalization. + # Ensure that ALL of them are detected and cause an error + illegal_chars = u'/:#?@' + hex_chars = {'{:04X}'.format(ord(c)) for c in illegal_chars} + denorm_chars = [ + c for c in map(unichr, range(128, sys.maxunicode)) + if (hex_chars & set(unicodedata.decomposition(c).split())) + and c not in illegal_chars + ] + # Sanity check that we found at least one such character + self.assertIn(u'\u2100', denorm_chars) + self.assertIn(u'\uFF03', denorm_chars) + + for scheme in [u"http", u"https", u"ftp"]: + for c in denorm_chars: + url = u"{}://netloc{}false.netloc/path".format(scheme, c) + print "Checking %r" % url + with self.assertRaises(ValueError): + urlparse.urlsplit(url) + def test_main(): test_support.run_unittest(UrlParseTestCase) diff --git a/Lib/urlparse.py b/Lib/urlparse.py index f7c2b032b097..54eda08651ab 100644 --- a/Lib/urlparse.py +++ b/Lib/urlparse.py @@ -165,6 +165,21 @@ def _splitnetloc(url, start=0): delim = min(delim, wdelim) # use earliest delim position return url[start:delim], url[delim:] # return (domain, rest) +def _checknetloc(netloc): + if not netloc or not isinstance(netloc, unicode): + return + # looking for characters like \u2100 that expand to 'a/c' + # IDNA uses NFKC equivalence, so normalize for this check + import unicodedata + netloc2 = unicodedata.normalize('NFKC', netloc) + if netloc == netloc2: + return + _, _, netloc = netloc.rpartition('@') # anything to the left of '@' is okay + for c in '/?#@:': + if c in netloc2: + raise ValueError("netloc '" + netloc2 + "' contains invalid " + + "characters under NFKC normalization") + def urlsplit(url, scheme='', allow_fragments=True): """Parse a URL into 5 components: :///?# @@ -193,6 +208,7 @@ def urlsplit(url, scheme='', allow_fragments=True): url, fragment = url.split('#', 1) if '?' in url: url, query = url.split('?', 1) + _checknetloc(netloc) v = SplitResult(scheme, netloc, url, query, fragment) _parse_cache[key] = v return v @@ -216,6 +232,7 @@ def urlsplit(url, scheme='', allow_fragments=True): url, fragment = url.split('#', 1) if '?' in url: url, query = url.split('?', 1) + _checknetloc(netloc) v = SplitResult(scheme, netloc, url, query, fragment) _parse_cache[key] = v return v diff --git a/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst b/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst new file mode 100644 index 000000000000..1e1ad92c6feb --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst @@ -0,0 +1,3 @@ +Changes urlsplit() to raise ValueError when the URL contains characters that +decompose under IDNA encoding (NFKC-normalization) into characters that +affect how the URL is parsed. \ No newline at end of file From webhook-mailer at python.org Thu Mar 7 12:09:18 2019 From: webhook-mailer at python.org (Steve Dower) Date: Thu, 07 Mar 2019 17:09:18 -0000 Subject: [Python-checkins] bpo-36108: Avoid failing the build on race condition in clean (GH-12217) Message-ID: https://github.com/python/cpython/commit/2f8f56499c20af70ff5037fdbc5d738e56d9eab0 commit: 2f8f56499c20af70ff5037fdbc5d738e56d9eab0 branch: master author: Steve Dower committer: GitHub date: 2019-03-07T09:09:15-08:00 summary: bpo-36108: Avoid failing the build on race condition in clean (GH-12217) files: M PCbuild/openssl.props diff --git a/PCbuild/openssl.props b/PCbuild/openssl.props index 257cc857d0ec..8c78cd4ab108 100644 --- a/PCbuild/openssl.props +++ b/PCbuild/openssl.props @@ -23,6 +23,6 @@ - + \ No newline at end of file From webhook-mailer at python.org Thu Mar 7 12:44:57 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 07 Mar 2019 17:44:57 -0000 Subject: [Python-checkins] bpo-36108: Avoid failing the build on race condition in clean (GH-12217) Message-ID: https://github.com/python/cpython/commit/34b398559fc47745473a39313a9e2ec17fe1d9ad commit: 34b398559fc47745473a39313a9e2ec17fe1d9ad branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-07T09:44:53-08:00 summary: bpo-36108: Avoid failing the build on race condition in clean (GH-12217) (cherry picked from commit 2f8f56499c20af70ff5037fdbc5d738e56d9eab0) Co-authored-by: Steve Dower files: M PCbuild/openssl.props diff --git a/PCbuild/openssl.props b/PCbuild/openssl.props index 257cc857d0ec..8c78cd4ab108 100644 --- a/PCbuild/openssl.props +++ b/PCbuild/openssl.props @@ -23,6 +23,6 @@ - + \ No newline at end of file From webhook-mailer at python.org Thu Mar 7 13:20:35 2019 From: webhook-mailer at python.org (Steve Dower) Date: Thu, 07 Mar 2019 18:20:35 -0000 Subject: [Python-checkins] bpo-36140: Fix an incorrect check in msidb_getsummaryinformation() (GH-12074) Message-ID: https://github.com/python/cpython/commit/bf94cc7b496a379e1f604aa2e4080bb70ca4020e commit: bf94cc7b496a379e1f604aa2e4080bb70ca4020e branch: master author: Zackery Spytz committer: Steve Dower date: 2019-03-07T10:20:13-08:00 summary: bpo-36140: Fix an incorrect check in msidb_getsummaryinformation() (GH-12074) files: M PC/_msi.c diff --git a/PC/_msi.c b/PC/_msi.c index 99aef52e422b..ae30acbc9b48 100644 --- a/PC/_msi.c +++ b/PC/_msi.c @@ -916,7 +916,7 @@ msidb_getsummaryinformation(msiobj *db, PyObject *args) return msierror(status); oresult = PyObject_NEW(struct msiobj, &summary_Type); - if (!result) { + if (!oresult) { MsiCloseHandle(result); return NULL; } From webhook-mailer at python.org Thu Mar 7 13:39:47 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 07 Mar 2019 18:39:47 -0000 Subject: [Python-checkins] bpo-36140: Fix an incorrect check in msidb_getsummaryinformation() (GH-12074) Message-ID: https://github.com/python/cpython/commit/6ba95c38c556ad4d254c5af34f439a1307ed585c commit: 6ba95c38c556ad4d254c5af34f439a1307ed585c branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-07T10:39:34-08:00 summary: bpo-36140: Fix an incorrect check in msidb_getsummaryinformation() (GH-12074) (cherry picked from commit bf94cc7b496a379e1f604aa2e4080bb70ca4020e) Co-authored-by: Zackery Spytz files: M PC/_msi.c diff --git a/PC/_msi.c b/PC/_msi.c index 99aef52e422b..ae30acbc9b48 100644 --- a/PC/_msi.c +++ b/PC/_msi.c @@ -916,7 +916,7 @@ msidb_getsummaryinformation(msiobj *db, PyObject *args) return msierror(status); oresult = PyObject_NEW(struct msiobj, &summary_Type); - if (!result) { + if (!oresult) { MsiCloseHandle(result); return NULL; } From webhook-mailer at python.org Thu Mar 7 13:49:20 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 07 Mar 2019 18:49:20 -0000 Subject: [Python-checkins] bpo-36140: Fix an incorrect check in msidb_getsummaryinformation() (GH-12074) Message-ID: https://github.com/python/cpython/commit/b19943ec97b80db97dd93ed714615f757cc12ad3 commit: b19943ec97b80db97dd93ed714615f757cc12ad3 branch: 2.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-07T10:49:15-08:00 summary: bpo-36140: Fix an incorrect check in msidb_getsummaryinformation() (GH-12074) (cherry picked from commit bf94cc7b496a379e1f604aa2e4080bb70ca4020e) Co-authored-by: Zackery Spytz files: M PC/_msi.c diff --git a/PC/_msi.c b/PC/_msi.c index 4000f00c763b..3c46d8349cfd 100644 --- a/PC/_msi.c +++ b/PC/_msi.c @@ -894,7 +894,7 @@ msidb_getsummaryinformation(msiobj *db, PyObject *args) return msierror(status); oresult = PyObject_NEW(struct msiobj, &summary_Type); - if (!result) { + if (!oresult) { MsiCloseHandle(result); return NULL; } From webhook-mailer at python.org Thu Mar 7 15:38:16 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 07 Mar 2019 20:38:16 -0000 Subject: [Python-checkins] bpo-35975: Support parsing earlier minor versions of Python 3 (GH-12086) Message-ID: https://github.com/python/cpython/commit/495da292255b92dd73758fdd0e4c7d27d82b1e57 commit: 495da292255b92dd73758fdd0e4c7d27d82b1e57 branch: master author: Guido van Rossum committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-07T12:38:08-08:00 summary: bpo-35975: Support parsing earlier minor versions of Python 3 (GH-12086) This adds a `feature_version` flag to `ast.parse()` (documented) and `compile()` (hidden) that allow tweaking the parser to support older versions of the grammar. In particular if `feature_version` is 5 or 6, the hacks for the `async` and `await` keyword from PEP 492 are reinstated. (For 7 or higher, these are unconditionally treated as keywords, but they are still special tokens rather than `NAME` tokens that the parser driver recognizes.) https://bugs.python.org/issue35975 files: A Misc/NEWS.d/next/Core and Builtins/2019-02-27-16-49-08.bpo-35975.IescLY.rst M Doc/library/ast.rst M Doc/library/token-list.inc M Doc/library/token.rst M Grammar/Grammar M Grammar/Tokens M Include/Python-ast.h M Include/compile.h M Include/parsetok.h M Include/token.h M Lib/ast.py M Lib/keyword.py M Lib/test/test_parser.py M Lib/test/test_type_comments.py M Lib/token.py M Modules/main.c M Modules/parsermodule.c M Parser/asdl_c.py M Parser/parsetok.c M Parser/token.c M Parser/tokenizer.c M Parser/tokenizer.h M Python/Python-ast.c M Python/ast.c M Python/bltinmodule.c M Python/clinic/bltinmodule.c.h M Python/compile.c M Python/graminit.c M Python/pythonrun.c diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index 3df7f9ebc70c..1884bea80e80 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -126,7 +126,7 @@ The abstract grammar is currently defined as follows: Apart from the node classes, the :mod:`ast` module defines these utility functions and classes for traversing abstract syntax trees: -.. function:: parse(source, filename='', mode='exec', *, type_comments=False) +.. function:: parse(source, filename='', mode='exec', *, type_comments=False, feature_version=-1) Parse the source into an AST node. Equivalent to ``compile(source, filename, mode, ast.PyCF_ONLY_AST)``. @@ -145,13 +145,19 @@ and classes for traversing abstract syntax trees: modified to correspond to :pep:`484` "signature type comments", e.g. ``(str, int) -> List[str]``. + Also, setting ``feature_version`` to the minor version of an + earlier Python 3 version will attempt to parse using that version's + grammar. For example, setting ``feature_version=4`` will allow + the use of ``async`` and ``await`` as variable names. The lowest + supported value is 4; the highest is ``sys.version_info[1]``. + .. warning:: It is possible to crash the Python interpreter with a sufficiently large/complex string due to stack depth limitations in Python's AST compiler. .. versionchanged:: 3.8 - Added ``type_comments=True`` and ``mode='func_type'``. + Added ``type_comments``, ``mode='func_type'`` and ``feature_version``. .. function:: literal_eval(node_or_string) diff --git a/Doc/library/token-list.inc b/Doc/library/token-list.inc index cb9fcd79effc..877d39a432ed 100644 --- a/Doc/library/token-list.inc +++ b/Doc/library/token-list.inc @@ -203,6 +203,10 @@ .. data:: OP +.. data:: AWAIT + +.. data:: ASYNC + .. data:: TYPE_IGNORE .. data:: TYPE_COMMENT diff --git a/Doc/library/token.rst b/Doc/library/token.rst index 4936e9aa08f4..5c641ef46d14 100644 --- a/Doc/library/token.rst +++ b/Doc/library/token.rst @@ -88,3 +88,6 @@ the :mod:`tokenize` module. .. versionchanged:: 3.8 Added :data:`TYPE_COMMENT`. + Added :data:`AWAIT` and :data:`ASYNC` tokens back (they're needed + to support parsing older Python versions for :func:`ast.parse` with + ``feature_version`` set to 6 or lower). diff --git a/Grammar/Grammar b/Grammar/Grammar index a42597805979..eaebdc4340f4 100644 --- a/Grammar/Grammar +++ b/Grammar/Grammar @@ -18,7 +18,7 @@ decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE decorators: decorator+ decorated: decorators (classdef | funcdef | async_funcdef) -async_funcdef: 'async' funcdef +async_funcdef: ASYNC funcdef funcdef: 'def' NAME parameters ['->' test] ':' [TYPE_COMMENT] func_body_suite parameters: '(' [typedargslist] ')' @@ -70,7 +70,7 @@ nonlocal_stmt: 'nonlocal' NAME (',' NAME)* assert_stmt: 'assert' test [',' test] compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated | async_stmt -async_stmt: 'async' (funcdef | with_stmt | for_stmt) +async_stmt: ASYNC (funcdef | with_stmt | for_stmt) if_stmt: 'if' namedexpr_test ':' suite ('elif' namedexpr_test ':' suite)* ['else' ':' suite] while_stmt: 'while' namedexpr_test ':' suite ['else' ':' suite] for_stmt: 'for' exprlist 'in' testlist ':' [TYPE_COMMENT] suite ['else' ':' suite] @@ -106,7 +106,7 @@ arith_expr: term (('+'|'-') term)* term: factor (('*'|'@'|'/'|'%'|'//') factor)* factor: ('+'|'-'|'~') factor | power power: atom_expr ['**' factor] -atom_expr: ['await'] atom trailer* +atom_expr: [AWAIT] atom trailer* atom: ('(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']' | '{' [dictorsetmaker] '}' | @@ -144,7 +144,7 @@ argument: ( test [comp_for] | comp_iter: comp_for | comp_if sync_comp_for: 'for' exprlist 'in' or_test [comp_iter] -comp_for: ['async'] sync_comp_for +comp_for: [ASYNC] sync_comp_for comp_if: 'if' test_nocond [comp_iter] # not used in grammar, but may appear in "node" passed from Parser to Compiler diff --git a/Grammar/Tokens b/Grammar/Tokens index 1d45e05ea21d..9de2da5d15fc 100644 --- a/Grammar/Tokens +++ b/Grammar/Tokens @@ -55,6 +55,8 @@ ELLIPSIS '...' COLONEQUAL ':=' OP +AWAIT +ASYNC TYPE_IGNORE TYPE_COMMENT ERRORTOKEN diff --git a/Include/Python-ast.h b/Include/Python-ast.h index 52ba12755ef9..8265bed8d6e9 100644 --- a/Include/Python-ast.h +++ b/Include/Python-ast.h @@ -703,6 +703,7 @@ type_ignore_ty _Py_TypeIgnore(int lineno, PyArena *arena); PyObject* PyAST_mod2obj(mod_ty t); mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode); +mod_ty PyAST_obj2mod_ex(PyObject* ast, PyArena* arena, int mode, int feature_version); int PyAST_Check(PyObject* obj); #ifdef __cplusplus diff --git a/Include/compile.h b/Include/compile.h index d0bbed8f558b..13708678675f 100644 --- a/Include/compile.h +++ b/Include/compile.h @@ -27,6 +27,7 @@ PyAPI_FUNC(PyCodeObject *) PyNode_Compile(struct _node *, const char *); #ifndef Py_LIMITED_API typedef struct { int cf_flags; /* bitmask of CO_xxx flags relevant to future */ + int cf_feature_version; /* minor Python version (PyCF_ONLY_AST) */ } PyCompilerFlags; #endif diff --git a/Include/parsetok.h b/Include/parsetok.h index be49f0005ac6..935d733e90a5 100644 --- a/Include/parsetok.h +++ b/Include/parsetok.h @@ -35,6 +35,7 @@ typedef struct { #define PyPARSE_IGNORE_COOKIE 0x0010 #define PyPARSE_BARRY_AS_BDFL 0x0020 #define PyPARSE_TYPE_COMMENTS 0x0040 +#define PyPARSE_ASYNC_HACKS 0x0080 PyAPI_FUNC(node *) PyParser_ParseString(const char *, grammar *, int, perrdetail *); diff --git a/Include/token.h b/Include/token.h index ef6bf969b7c9..e08708baf196 100644 --- a/Include/token.h +++ b/Include/token.h @@ -65,10 +65,12 @@ extern "C" { #define ELLIPSIS 52 #define COLONEQUAL 53 #define OP 54 -#define TYPE_IGNORE 55 -#define TYPE_COMMENT 56 -#define ERRORTOKEN 57 -#define N_TOKENS 61 +#define AWAIT 55 +#define ASYNC 56 +#define TYPE_IGNORE 57 +#define TYPE_COMMENT 58 +#define ERRORTOKEN 59 +#define N_TOKENS 63 #define NT_OFFSET 256 /* Special definitions for cooperation with parser */ diff --git a/Lib/ast.py b/Lib/ast.py index 470a74b3b5ff..64e7a2551fb1 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -27,7 +27,8 @@ from _ast import * -def parse(source, filename='', mode='exec', *, type_comments=False): +def parse(source, filename='', mode='exec', *, + type_comments=False, feature_version=-1): """ Parse the source into an AST node. Equivalent to compile(source, filename, mode, PyCF_ONLY_AST). @@ -36,7 +37,8 @@ def parse(source, filename='', mode='exec', *, type_comments=False): flags = PyCF_ONLY_AST if type_comments: flags |= PyCF_TYPE_COMMENTS - return compile(source, filename, mode, flags) + return compile(source, filename, mode, flags, + feature_version=feature_version) def literal_eval(node_or_string): diff --git a/Lib/keyword.py b/Lib/keyword.py index 431991dcf4ac..150c2bc46d22 100755 --- a/Lib/keyword.py +++ b/Lib/keyword.py @@ -20,8 +20,6 @@ 'and', 'as', 'assert', - 'async', - 'await', 'break', 'class', 'continue', @@ -52,6 +50,10 @@ #--end keywords-- ] +kwlist.append('async') +kwlist.append('await') +kwlist.sort() + iskeyword = frozenset(kwlist).__contains__ def main(): diff --git a/Lib/test/test_parser.py b/Lib/test/test_parser.py index 0afeb322e9b5..5548a871c024 100644 --- a/Lib/test/test_parser.py +++ b/Lib/test/test_parser.py @@ -916,7 +916,7 @@ def XXXROUNDUP(n): return (n + 3) & ~3 return 1 << (n - 1).bit_length() - basesize = support.calcobjsize('Pii') + basesize = support.calcobjsize('Piii') nodesize = struct.calcsize('hP3iP0h2i') def sizeofchildren(node): if node is None: diff --git a/Lib/test/test_type_comments.py b/Lib/test/test_type_comments.py index 3065ddca2d9a..cac6e8b25d21 100644 --- a/Lib/test/test_type_comments.py +++ b/Lib/test/test_type_comments.py @@ -1,4 +1,5 @@ import ast +import sys import unittest @@ -20,6 +21,29 @@ def bar(): # type: () -> None return await bar() """ +asyncvar = """\ +async = 12 +await = 13 +""" + +asynccomp = """\ +async def foo(xs): + [x async for x in xs] +""" + +matmul = """\ +a = b @ c +""" + +fstring = """\ +a = 42 +f"{a}" +""" + +underscorednumber = """\ +a = 42_42_42 +""" + redundantdef = """\ def foo(): # type: () -> int # type: () -> str @@ -155,80 +179,117 @@ def favk( class TypeCommentTests(unittest.TestCase): - def parse(self, source): - return ast.parse(source, type_comments=True) + lowest = 4 # Lowest minor version supported + highest = sys.version_info[1] # Highest minor version + + def parse(self, source, feature_version=highest): + return ast.parse(source, type_comments=True, + feature_version=feature_version) + + def parse_all(self, source, minver=lowest, maxver=highest, expected_regex=""): + for feature_version in range(self.lowest, self.highest + 1): + if minver <= feature_version <= maxver: + try: + yield self.parse(source, feature_version) + except SyntaxError as err: + raise SyntaxError(str(err) + f" feature_version={feature_version}") + else: + with self.assertRaisesRegex(SyntaxError, expected_regex, + msg=f"feature_version={feature_version}"): + self.parse(source, feature_version) def classic_parse(self, source): return ast.parse(source) def test_funcdef(self): - tree = self.parse(funcdef) - self.assertEqual(tree.body[0].type_comment, "() -> int") - self.assertEqual(tree.body[1].type_comment, "() -> None") + for tree in self.parse_all(funcdef): + self.assertEqual(tree.body[0].type_comment, "() -> int") + self.assertEqual(tree.body[1].type_comment, "() -> None") tree = self.classic_parse(funcdef) self.assertEqual(tree.body[0].type_comment, None) self.assertEqual(tree.body[1].type_comment, None) def test_asyncdef(self): - tree = self.parse(asyncdef) - self.assertEqual(tree.body[0].type_comment, "() -> int") - self.assertEqual(tree.body[1].type_comment, "() -> int") + for tree in self.parse_all(asyncdef, minver=5): + self.assertEqual(tree.body[0].type_comment, "() -> int") + self.assertEqual(tree.body[1].type_comment, "() -> int") tree = self.classic_parse(asyncdef) self.assertEqual(tree.body[0].type_comment, None) self.assertEqual(tree.body[1].type_comment, None) + def test_asyncvar(self): + for tree in self.parse_all(asyncvar, maxver=6): + pass + + def test_asynccomp(self): + for tree in self.parse_all(asynccomp, minver=6): + pass + + def test_matmul(self): + for tree in self.parse_all(matmul, minver=5): + pass + + def test_fstring(self): + for tree in self.parse_all(fstring, minver=6): + pass + + def test_underscorednumber(self): + for tree in self.parse_all(underscorednumber, minver=6): + pass + def test_redundantdef(self): - with self.assertRaisesRegex(SyntaxError, "^Cannot have two type comments on def"): - tree = self.parse(redundantdef) + for tree in self.parse_all(redundantdef, maxver=0, + expected_regex="^Cannot have two type comments on def"): + pass def test_nonasciidef(self): - tree = self.parse(nonasciidef) - self.assertEqual(tree.body[0].type_comment, "() -> ?????t") + for tree in self.parse_all(nonasciidef): + self.assertEqual(tree.body[0].type_comment, "() -> ?????t") def test_forstmt(self): - tree = self.parse(forstmt) - self.assertEqual(tree.body[0].type_comment, "int") + for tree in self.parse_all(forstmt): + self.assertEqual(tree.body[0].type_comment, "int") tree = self.classic_parse(forstmt) self.assertEqual(tree.body[0].type_comment, None) def test_withstmt(self): - tree = self.parse(withstmt) - self.assertEqual(tree.body[0].type_comment, "int") + for tree in self.parse_all(withstmt): + self.assertEqual(tree.body[0].type_comment, "int") tree = self.classic_parse(withstmt) self.assertEqual(tree.body[0].type_comment, None) def test_vardecl(self): - tree = self.parse(vardecl) - self.assertEqual(tree.body[0].type_comment, "int") + for tree in self.parse_all(vardecl): + self.assertEqual(tree.body[0].type_comment, "int") tree = self.classic_parse(vardecl) self.assertEqual(tree.body[0].type_comment, None) def test_ignores(self): - tree = self.parse(ignores) - self.assertEqual([ti.lineno for ti in tree.type_ignores], [2, 5]) + for tree in self.parse_all(ignores): + self.assertEqual([ti.lineno for ti in tree.type_ignores], [2, 5]) tree = self.classic_parse(ignores) self.assertEqual(tree.type_ignores, []) def test_longargs(self): - tree = self.parse(longargs) - for t in tree.body: - # The expected args are encoded in the function name - todo = set(t.name[1:]) - self.assertEqual(len(t.args.args), - len(todo) - bool(t.args.vararg) - bool(t.args.kwarg)) - self.assertTrue(t.name.startswith('f'), t.name) - for c in t.name[1:]: - todo.remove(c) - if c == 'v': - arg = t.args.vararg - elif c == 'k': - arg = t.args.kwarg - else: - assert 0 <= ord(c) - ord('a') < len(t.args.args) - arg = t.args.args[ord(c) - ord('a')] - self.assertEqual(arg.arg, c) # That's the argument name - self.assertEqual(arg.type_comment, arg.arg.upper()) - assert not todo + for tree in self.parse_all(longargs): + for t in tree.body: + # The expected args are encoded in the function name + todo = set(t.name[1:]) + self.assertEqual(len(t.args.args), + len(todo) - bool(t.args.vararg) - bool(t.args.kwarg)) + self.assertTrue(t.name.startswith('f'), t.name) + for c in t.name[1:]: + todo.remove(c) + if c == 'v': + arg = t.args.vararg + elif c == 'k': + arg = t.args.kwarg + else: + assert 0 <= ord(c) - ord('a') < len(t.args.args) + arg = t.args.args[ord(c) - ord('a')] + self.assertEqual(arg.arg, c) # That's the argument name + self.assertEqual(arg.type_comment, arg.arg.upper()) + assert not todo tree = self.classic_parse(longargs) for t in tree.body: for arg in t.args.args + [t.args.vararg, t.args.kwarg]: @@ -247,8 +308,8 @@ def test_inappropriate_type_comments(self): def check_both_ways(source): ast.parse(source, type_comments=False) - with self.assertRaises(SyntaxError): - ast.parse(source, type_comments=True) + for tree in self.parse_all(source, maxver=0): + pass check_both_ways("pass # type: int\n") check_both_ways("foo() # type: int\n") diff --git a/Lib/token.py b/Lib/token.py index 9bf80a5950a2..493bf0426508 100644 --- a/Lib/token.py +++ b/Lib/token.py @@ -58,14 +58,16 @@ ELLIPSIS = 52 COLONEQUAL = 53 OP = 54 -TYPE_IGNORE = 55 -TYPE_COMMENT = 56 +AWAIT = 55 +ASYNC = 56 +TYPE_IGNORE = 57 +TYPE_COMMENT = 58 # These aren't used by the C tokenizer but are needed for tokenize.py -ERRORTOKEN = 57 -COMMENT = 58 -NL = 59 -ENCODING = 60 -N_TOKENS = 61 +ERRORTOKEN = 59 +COMMENT = 60 +NL = 61 +ENCODING = 62 +N_TOKENS = 63 # Special definitions for cooperation with parser NT_OFFSET = 256 diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-02-27-16-49-08.bpo-35975.IescLY.rst b/Misc/NEWS.d/next/Core and Builtins/2019-02-27-16-49-08.bpo-35975.IescLY.rst new file mode 100644 index 000000000000..3bbfc74469c9 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-02-27-16-49-08.bpo-35975.IescLY.rst @@ -0,0 +1,7 @@ +Add a ``feature_version`` flag to ``ast.parse()`` (documented) and +``compile()`` (hidden) that allows tweaking the parser to support older +versions of the grammar. In particular, if ``feature_version`` is 5 or 6, +the hacks for the ``async`` and ``await`` keyword from PEP 492 are +reinstated. (For 7 or higher, these are unconditionally treated as keywords, +but they are still special tokens rather than ``NAME`` tokens that the +parser driver recognizes.) diff --git a/Modules/main.c b/Modules/main.c index 14055c8101c8..ae99901f1d89 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -799,7 +799,7 @@ pymain_run_python(PyInterpreterState *interp, int *exitcode) Py_DECREF(path0); } - PyCompilerFlags cf = {.cf_flags = 0}; + PyCompilerFlags cf = {.cf_flags = 0, .cf_feature_version = PY_MINOR_VERSION}; pymain_header(config); pymain_import_readline(config); diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c index 87f58d340c2d..d4e2be643e71 100644 --- a/Modules/parsermodule.c +++ b/Modules/parsermodule.c @@ -341,6 +341,7 @@ parser_newstobject(node *st, int type) o->st_node = st; o->st_type = type; o->st_flags.cf_flags = 0; + o->st_flags.cf_feature_version = PY_MINOR_VERSION; } else { PyNode_Free(st); @@ -584,8 +585,10 @@ parser_do_parse(PyObject *args, PyObject *kw, const char *argspec, int type) if (n) { res = parser_newstobject(n, type); - if (res) + if (res) { ((PyST_Object *)res)->st_flags.cf_flags = flags & PyCF_MASK; + ((PyST_Object *)res)->st_flags.cf_feature_version = PY_MINOR_VERSION; + } } else { PyParser_SetError(&err); diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index 1526995e3f8b..52247559d1a9 100644 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -1188,6 +1188,11 @@ class PartingShots(StaticVisitor): /* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */ mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode) +{ + return PyAST_obj2mod_ex(ast, arena, mode, PY_MINOR_VERSION); +} + +mod_ty PyAST_obj2mod_ex(PyObject* ast, PyArena* arena, int mode, int feature_version) { mod_ty res; PyObject *req_type[3]; @@ -1269,6 +1274,7 @@ def main(srcfile, dump_module=False): f.write("\n") f.write("PyObject* PyAST_mod2obj(mod_ty t);\n") f.write("mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode);\n") + f.write("mod_ty PyAST_obj2mod_ex(PyObject* ast, PyArena* arena, int mode, int feature_version);\n") f.write("int PyAST_Check(PyObject* obj);\n") f.write('\n') f.write('#ifdef __cplusplus\n') diff --git a/Parser/parsetok.c b/Parser/parsetok.c index 7a6c88651943..ba33a9a0586f 100644 --- a/Parser/parsetok.c +++ b/Parser/parsetok.c @@ -101,6 +101,8 @@ PyParser_ParseStringObject(const char *s, PyObject *filename, Py_INCREF(err_ret->filename); tok->filename = err_ret->filename; + if (*flags & PyPARSE_ASYNC_HACKS) + tok->async_hacks = 1; return parsetok(tok, g, start, err_ret, flags); } diff --git a/Parser/token.c b/Parser/token.c index 228ecffc8415..a48966890090 100644 --- a/Parser/token.c +++ b/Parser/token.c @@ -61,6 +61,8 @@ const char * const _PyParser_TokenNames[] = { "ELLIPSIS", "COLONEQUAL", "OP", + "AWAIT", + "ASYNC", "TYPE_IGNORE", "TYPE_COMMENT", "", diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index 44ec41512cb1..8f0a9c810053 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -84,6 +84,11 @@ tok_new(void) tok->decoding_buffer = NULL; tok->type_comments = 0; + tok->async_hacks = 0; + tok->async_def = 0; + tok->async_def_indent = 0; + tok->async_def_nl = 0; + return tok; } @@ -1196,6 +1201,31 @@ tok_get(struct tok_state *tok, char **p_start, char **p_end) } } + /* Peek ahead at the next character */ + c = tok_nextc(tok); + tok_backup(tok, c); + /* Check if we are closing an async function */ + if (tok->async_def + && !blankline + /* Due to some implementation artifacts of type comments, + * a TYPE_COMMENT at the start of a function won't set an + * indentation level and it will produce a NEWLINE after it. + * To avoid spuriously ending an async function due to this, + * wait until we have some non-newline char in front of us. */ + && c != '\n' + && tok->level == 0 + /* There was a NEWLINE after ASYNC DEF, + so we're past the signature. */ + && tok->async_def_nl + /* Current indentation level is less than where + the async function was defined */ + && tok->async_def_indent >= tok->indent) + { + tok->async_def = 0; + tok->async_def_indent = 0; + tok->async_def_nl = 0; + } + again: tok->start = NULL; /* Skip spaces */ @@ -1310,6 +1340,50 @@ tok_get(struct tok_state *tok, char **p_start, char **p_end) *p_start = tok->start; *p_end = tok->cur; + /* async/await parsing block. */ + if (tok->cur - tok->start == 5 && tok->start[0] == 'a') { + /* May be an 'async' or 'await' token. For Python 3.7 or + later we recognize them unconditionally. For Python + 3.5 or 3.6 we recognize 'async' in front of 'def', and + either one inside of 'async def'. (Technically we + shouldn't recognize these at all for 3.4 or earlier, + but there's no *valid* Python 3.4 code that would be + rejected, and async functions will be rejected in a + later phase.) */ + if (!tok->async_hacks || tok->async_def) { + /* Always recognize the keywords. */ + if (memcmp(tok->start, "async", 5) == 0) { + return ASYNC; + } + if (memcmp(tok->start, "await", 5) == 0) { + return AWAIT; + } + } + else if (memcmp(tok->start, "async", 5) == 0) { + /* The current token is 'async'. + Look ahead one token to see if that is 'def'. */ + + struct tok_state ahead_tok; + char *ahead_tok_start = NULL, *ahead_tok_end = NULL; + int ahead_tok_kind; + + memcpy(&ahead_tok, tok, sizeof(ahead_tok)); + ahead_tok_kind = tok_get(&ahead_tok, &ahead_tok_start, + &ahead_tok_end); + + if (ahead_tok_kind == NAME + && ahead_tok.cur - ahead_tok.start == 3 + && memcmp(ahead_tok.start, "def", 3) == 0) + { + /* The next token is going to be 'def', so instead of + returning a plain NAME token, return ASYNC. */ + tok->async_def_indent = tok->indent; + tok->async_def = 1; + return ASYNC; + } + } + } + return NAME; } @@ -1322,6 +1396,11 @@ tok_get(struct tok_state *tok, char **p_start, char **p_end) *p_start = tok->start; *p_end = tok->cur - 1; /* Leave '\n' out of the string */ tok->cont_line = 0; + if (tok->async_def) { + /* We're somewhere inside an 'async def' function, and + we've encountered a NEWLINE after its signature. */ + tok->async_def_nl = 1; + } return NEWLINE; } diff --git a/Parser/tokenizer.h b/Parser/tokenizer.h index 22e91f7dca76..06c7a14b70b0 100644 --- a/Parser/tokenizer.h +++ b/Parser/tokenizer.h @@ -64,6 +64,13 @@ struct tok_state { const char* input; /* Tokenizer's newline translated copy of the string. */ int type_comments; /* Whether to look for type comments */ + + /* async/await related fields (still needed depending on feature_version) */ + int async_hacks; /* =1 if async/await aren't always keywords */ + int async_def; /* =1 if tokens are inside an 'async def' body. */ + int async_def_indent; /* Indentation level of the outermost 'async def'. */ + int async_def_nl; /* =1 if the outermost 'async def' had at least one + NEWLINE token after it. */ }; extern struct tok_state *PyTokenizer_FromString(const char *, int); diff --git a/Python/Python-ast.c b/Python/Python-ast.c index 92ec15757144..0411f9f07f27 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -8899,6 +8899,11 @@ PyObject* PyAST_mod2obj(mod_ty t) /* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */ mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode) +{ + return PyAST_obj2mod_ex(ast, arena, mode, PY_MINOR_VERSION); +} + +mod_ty PyAST_obj2mod_ex(PyObject* ast, PyArena* arena, int mode, int feature_version) { mod_ty res; PyObject *req_type[3]; diff --git a/Python/ast.c b/Python/ast.c index 2e960485f47c..d4ee1b351fe1 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -564,6 +564,7 @@ struct compiling { PyArena *c_arena; /* Arena for allocating memory. */ PyObject *c_filename; /* filename */ PyObject *c_normalize; /* Normalization function from unicodedata. */ + int c_feature_version; /* Latest minor version of Python for allowed features */ }; static asdl_seq *seq_for_testlist(struct compiling *, const node *); @@ -783,6 +784,7 @@ PyAST_FromNodeObject(const node *n, PyCompilerFlags *flags, /* borrowed reference */ c.c_filename = filename; c.c_normalize = NULL; + c.c_feature_version = flags->cf_feature_version; if (TYPE(n) == encoding_decl) n = CHILD(n, 0); @@ -955,7 +957,7 @@ PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename_str, */ static operator_ty -get_operator(const node *n) +get_operator(struct compiling *c, const node *n) { switch (TYPE(n)) { case VBAR: @@ -975,6 +977,11 @@ get_operator(const node *n) case STAR: return Mult; case AT: + if (c->c_feature_version < 5) { + ast_error(c, n, + "The '@' operator is only supported in Python 3.5 and greater"); + return (operator_ty)0; + } return MatMult; case SLASH: return Div; @@ -1209,6 +1216,11 @@ ast_for_augassign(struct compiling *c, const node *n) else return Mult; case '@': + if (c->c_feature_version < 5) { + ast_error(c, n, + "The '@' operator is only supported in Python 3.5 and greater"); + return (operator_ty)0; + } return MatMult; default: PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n)); @@ -1518,7 +1530,7 @@ ast_for_arguments(struct compiling *c, const node *n) } else if (found_default) { ast_error(c, n, - "non-default argument follows default argument"); + "non-default argument follows default argument"); return NULL; } arg = ast_for_arg(c, ch); @@ -1719,6 +1731,12 @@ ast_for_funcdef_impl(struct compiling *c, const node *n0, node *tc; string type_comment = NULL; + if (is_async && c->c_feature_version < 5) { + ast_error(c, n, + "Async functions are only supported in Python 3.5 and greater"); + return NULL; + } + REQ(n, funcdef); name = NEW_IDENTIFIER(CHILD(n, name_i)); @@ -1772,10 +1790,9 @@ ast_for_funcdef_impl(struct compiling *c, const node *n0, static stmt_ty ast_for_async_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq) { - /* async_funcdef: 'async' funcdef */ + /* async_funcdef: ASYNC funcdef */ REQ(n, async_funcdef); - REQ(CHILD(n, 0), NAME); - assert(strcmp(STR(CHILD(n, 0)), "async") == 0); + REQ(CHILD(n, 0), ASYNC); REQ(CHILD(n, 1), funcdef); return ast_for_funcdef_impl(c, n, decorator_seq, @@ -1794,10 +1811,9 @@ ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq) static stmt_ty ast_for_async_stmt(struct compiling *c, const node *n) { - /* async_stmt: 'async' (funcdef | with_stmt | for_stmt) */ + /* async_stmt: ASYNC (funcdef | with_stmt | for_stmt) */ REQ(n, async_stmt); - REQ(CHILD(n, 0), NAME); - assert(strcmp(STR(CHILD(n, 0)), "async") == 0); + REQ(CHILD(n, 0), ASYNC); switch (TYPE(CHILD(n, 1))) { case funcdef: @@ -1948,8 +1964,7 @@ count_comp_fors(struct compiling *c, const node *n) n_fors++; REQ(n, comp_for); if (NCH(n) == 2) { - REQ(CHILD(n, 0), NAME); - assert(strcmp(STR(CHILD(n, 0)), "async") == 0); + REQ(CHILD(n, 0), ASYNC); n = CHILD(n, 1); } else if (NCH(n) == 1) { @@ -2034,8 +2049,7 @@ ast_for_comprehension(struct compiling *c, const node *n) if (NCH(n) == 2) { is_async = 1; - REQ(CHILD(n, 0), NAME); - assert(strcmp(STR(CHILD(n, 0)), "async") == 0); + REQ(CHILD(n, 0), ASYNC); sync_n = CHILD(n, 1); } else { @@ -2043,6 +2057,13 @@ ast_for_comprehension(struct compiling *c, const node *n) } REQ(sync_n, sync_comp_for); + /* Async comprehensions only allowed in Python 3.6 and greater */ + if (is_async && c->c_feature_version < 6) { + ast_error(c, n, + "Async comprehensions are only supported in Python 3.6 and greater"); + return NULL; + } + for_ch = CHILD(sync_n, 1); t = ast_for_exprlist(c, for_ch, Store); if (!t) @@ -2337,7 +2358,15 @@ ast_for_atom(struct compiling *c, const node *n) return str; } case NUMBER: { - PyObject *pynum = parsenumber(c, STR(ch)); + PyObject *pynum; + /* Underscores in numeric literals are only allowed in Python 3.6 or greater */ + /* Check for underscores here rather than in parse_number so we can report a line number on error */ + if (c->c_feature_version < 6 && strchr(STR(ch), '_') != NULL) { + ast_error(c, ch, + "Underscores in numeric literals are only supported in Python 3.6 and greater"); + return NULL; + } + pynum = parsenumber(c, STR(ch)); if (!pynum) return NULL; @@ -2420,8 +2449,8 @@ ast_for_atom(struct compiling *c, const node *n) TYPE(CHILD(ch, 3 - is_dict)) == comp_for) { /* It's a dictionary comprehension. */ if (is_dict) { - ast_error(c, n, "dict unpacking cannot be used in " - "dict comprehension"); + ast_error(c, n, + "dict unpacking cannot be used in dict comprehension"); return NULL; } res = ast_for_dictcomp(c, ch); @@ -2524,7 +2553,7 @@ ast_for_binop(struct compiling *c, const node *n) if (!expr2) return NULL; - newoperator = get_operator(CHILD(n, 1)); + newoperator = get_operator(c, CHILD(n, 1)); if (!newoperator) return NULL; @@ -2539,7 +2568,7 @@ ast_for_binop(struct compiling *c, const node *n) expr_ty tmp_result, tmp; const node* next_oper = CHILD(n, i * 2 + 1); - newoperator = get_operator(next_oper); + newoperator = get_operator(c, next_oper); if (!newoperator) return NULL; @@ -2678,7 +2707,12 @@ ast_for_atom_expr(struct compiling *c, const node *n) REQ(n, atom_expr); nch = NCH(n); - if (TYPE(CHILD(n, 0)) == NAME && strcmp(STR(CHILD(n, 0)), "await") == 0) { + if (TYPE(CHILD(n, 0)) == AWAIT) { + if (c->c_feature_version < 5) { + ast_error(c, n, + "Await expressions are only supported in Python 3.5 and greater"); + return NULL; + } start = 1; assert(nch > 1); } @@ -2775,7 +2809,7 @@ ast_for_expr(struct compiling *c, const node *n) term: factor (('*'|'@'|'/'|'%'|'//') factor)* factor: ('+'|'-'|'~') factor | power power: atom_expr ['**' factor] - atom_expr: ['await'] atom trailer* + atom_expr: [AWAIT] atom trailer* yield_expr: 'yield' [yield_arg] */ @@ -3233,6 +3267,13 @@ ast_for_expr_stmt(struct compiling *c, const node *n) node *deep, *ann = CHILD(n, 1); int simple = 1; + /* AnnAssigns are only allowed in Python 3.6 or greater */ + if (c->c_feature_version < 6) { + ast_error(c, ch, + "Variable annotation syntax is only supported in Python 3.6 and greater"); + return NULL; + } + /* we keep track of parens to qualify (x) as expression not name */ deep = ch; while (NCH(deep) == 1) { @@ -4050,6 +4091,13 @@ ast_for_for_stmt(struct compiling *c, const node *n0, bool is_async) int end_lineno, end_col_offset; int has_type_comment; string type_comment; + + if (is_async && c->c_feature_version < 5) { + ast_error(c, n, + "Async for loops are only supported in Python 3.5 and greater"); + return NULL; + } + /* for_stmt: 'for' exprlist 'in' testlist ':' [TYPE_COMMENT] suite ['else' ':' suite] */ REQ(n, for_stmt); @@ -4278,6 +4326,12 @@ ast_for_with_stmt(struct compiling *c, const node *n0, bool is_async) asdl_seq *items, *body; string type_comment; + if (is_async && c->c_feature_version < 5) { + ast_error(c, n, + "Async with statements are only supported in Python 3.5 and greater"); + return NULL; + } + REQ(n, with_stmt); has_type_comment = TYPE(CHILD(n, NCH(n) - 2)) == TYPE_COMMENT; @@ -4768,6 +4822,7 @@ fstring_compile_expr(const char *expr_start, const char *expr_end, str[len+2] = 0; cf.cf_flags = PyCF_ONLY_AST; + cf.cf_feature_version = PY_MINOR_VERSION; mod_n = PyParser_SimpleParseStringFlagsFilename(str, "", Py_eval_input, 0); if (!mod_n) { @@ -5568,6 +5623,13 @@ parsestr(struct compiling *c, const node *n, int *bytesmode, int *rawmode, } } } + + /* fstrings are only allowed in Python 3.6 and greater */ + if (fmode && c->c_feature_version < 6) { + ast_error(c, n, "Format strings are only supported in Python 3.6 and greater"); + return -1; + } + if (fmode && *bytesmode) { PyErr_BadInternalCall(); return -1; diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index a19b8b8ddc86..7a2b259cbd89 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -745,6 +745,7 @@ compile as builtin_compile flags: int = 0 dont_inherit: bool(accept={int}) = False optimize: int = -1 + feature_version: int = -1 Compile source into a code object that can be executed by exec() or eval(). @@ -763,8 +764,8 @@ in addition to any features explicitly specified. static PyObject * builtin_compile_impl(PyObject *module, PyObject *source, PyObject *filename, const char *mode, int flags, int dont_inherit, - int optimize) -/*[clinic end generated code: output=1fa176e33452bb63 input=0ff726f595eb9fcd]*/ + int optimize, int feature_version) +/*[clinic end generated code: output=b0c09c84f116d3d7 input=5fcc30651a6acaa9]*/ { PyObject *source_copy; const char *str; @@ -775,6 +776,10 @@ builtin_compile_impl(PyObject *module, PyObject *source, PyObject *filename, PyObject *result; cf.cf_flags = flags | PyCF_SOURCE_IS_UTF8; + cf.cf_feature_version = PY_MINOR_VERSION; + if (feature_version >= 0 && (flags & PyCF_ONLY_AST)) { + cf.cf_feature_version = feature_version; + } if (flags & ~(PyCF_MASK | PyCF_MASK_OBSOLETE | PyCF_DONT_IMPLY_DEDENT | PyCF_ONLY_AST | PyCF_TYPE_COMMENTS)) @@ -981,6 +986,7 @@ builtin_eval_impl(PyObject *module, PyObject *source, PyObject *globals, } cf.cf_flags = PyCF_SOURCE_IS_UTF8; + cf.cf_feature_version = PY_MINOR_VERSION; str = source_as_string(source, "eval", "string, bytes or code", &cf, &source_copy); if (str == NULL) return NULL; @@ -1068,6 +1074,7 @@ builtin_exec_impl(PyObject *module, PyObject *source, PyObject *globals, const char *str; PyCompilerFlags cf; cf.cf_flags = PyCF_SOURCE_IS_UTF8; + cf.cf_feature_version = PY_MINOR_VERSION; str = source_as_string(source, "exec", "string, bytes or code", &cf, &source_copy); diff --git a/Python/clinic/bltinmodule.c.h b/Python/clinic/bltinmodule.c.h index 1b82f773edd8..df9970942b74 100644 --- a/Python/clinic/bltinmodule.c.h +++ b/Python/clinic/bltinmodule.c.h @@ -151,7 +151,7 @@ builtin_chr(PyObject *module, PyObject *arg) PyDoc_STRVAR(builtin_compile__doc__, "compile($module, /, source, filename, mode, flags=0,\n" -" dont_inherit=False, optimize=-1)\n" +" dont_inherit=False, optimize=-1, feature_version=-1)\n" "--\n" "\n" "Compile source into a code object that can be executed by exec() or eval().\n" @@ -173,26 +173,27 @@ PyDoc_STRVAR(builtin_compile__doc__, static PyObject * builtin_compile_impl(PyObject *module, PyObject *source, PyObject *filename, const char *mode, int flags, int dont_inherit, - int optimize); + int optimize, int feature_version); static PyObject * builtin_compile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"source", "filename", "mode", "flags", "dont_inherit", "optimize", NULL}; - static _PyArg_Parser _parser = {"OO&s|iii:compile", _keywords, 0}; + static const char * const _keywords[] = {"source", "filename", "mode", "flags", "dont_inherit", "optimize", "feature_version", NULL}; + static _PyArg_Parser _parser = {"OO&s|iiii:compile", _keywords, 0}; PyObject *source; PyObject *filename; const char *mode; int flags = 0; int dont_inherit = 0; int optimize = -1; + int feature_version = -1; if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &source, PyUnicode_FSDecoder, &filename, &mode, &flags, &dont_inherit, &optimize)) { + &source, PyUnicode_FSDecoder, &filename, &mode, &flags, &dont_inherit, &optimize, &feature_version)) { goto exit; } - return_value = builtin_compile_impl(module, source, filename, mode, flags, dont_inherit, optimize); + return_value = builtin_compile_impl(module, source, filename, mode, flags, dont_inherit, optimize, feature_version); exit: return return_value; @@ -754,4 +755,4 @@ builtin_issubclass(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=54e5e33dcc2659e0 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=00b97a48ea49eaf2 input=a9049054013a1b77]*/ diff --git a/Python/compile.c b/Python/compile.c index c26210675d87..697833752bb0 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -330,6 +330,7 @@ PyAST_CompileObject(mod_ty mod, PyObject *filename, PyCompilerFlags *flags, goto finally; if (!flags) { local_flags.cf_flags = 0; + local_flags.cf_feature_version = PY_MINOR_VERSION; flags = &local_flags; } merged = c.c_future->ff_features | flags->cf_flags; diff --git a/Python/graminit.c b/Python/graminit.c index 6cb7bbc9f76f..24f6f6c72a6b 100644 --- a/Python/graminit.c +++ b/Python/graminit.c @@ -106,7 +106,7 @@ static state states_5[3] = { {1, arcs_5_2}, }; static arc arcs_6_0[1] = { - {16, 1}, + {38, 1}, }; static arc arcs_6_1[1] = { {56, 2}, @@ -120,7 +120,7 @@ static state states_6[3] = { {1, arcs_6_2}, }; static arc arcs_7_0[1] = { - {21, 1}, + {19, 1}, }; static arc arcs_7_1[1] = { {40, 2}, @@ -583,7 +583,7 @@ static state states_19[2] = { {1, arcs_19_1}, }; static arc arcs_20_0[1] = { - {22, 1}, + {20, 1}, }; static arc arcs_20_1[1] = { {98, 2}, @@ -597,7 +597,7 @@ static state states_20[3] = { {1, arcs_20_2}, }; static arc arcs_21_0[1] = { - {31, 1}, + {29, 1}, }; static arc arcs_21_1[1] = { {0, 1}, @@ -621,7 +621,7 @@ static state states_22[2] = { {1, arcs_22_1}, }; static arc arcs_23_0[1] = { - {18, 1}, + {16, 1}, }; static arc arcs_23_1[1] = { {0, 1}, @@ -631,7 +631,7 @@ static state states_23[2] = { {1, arcs_23_1}, }; static arc arcs_24_0[1] = { - {20, 1}, + {18, 1}, }; static arc arcs_24_1[1] = { {0, 1}, @@ -641,7 +641,7 @@ static state states_24[2] = { {1, arcs_24_1}, }; static arc arcs_25_0[1] = { - {33, 1}, + {31, 1}, }; static arc arcs_25_1[2] = { {80, 2}, @@ -666,14 +666,14 @@ static state states_26[2] = { {1, arcs_26_1}, }; static arc arcs_27_0[1] = { - {32, 1}, + {30, 1}, }; static arc arcs_27_1[2] = { {60, 2}, {0, 1}, }; static arc arcs_27_2[2] = { - {24, 3}, + {22, 3}, {0, 2}, }; static arc arcs_27_3[1] = { @@ -701,7 +701,7 @@ static state states_28[2] = { {1, arcs_28_1}, }; static arc arcs_29_0[1] = { - {27, 1}, + {25, 1}, }; static arc arcs_29_1[1] = { {106, 2}, @@ -715,7 +715,7 @@ static state states_29[3] = { {1, arcs_29_2}, }; static arc arcs_30_0[1] = { - {24, 1}, + {22, 1}, }; static arc arcs_30_1[3] = { {107, 2}, @@ -725,11 +725,11 @@ static arc arcs_30_1[3] = { static arc arcs_30_2[4] = { {107, 2}, {9, 2}, - {27, 4}, + {25, 4}, {49, 3}, }; static arc arcs_30_3[1] = { - {27, 4}, + {25, 4}, }; static arc arcs_30_4[3] = { {5, 5}, @@ -832,7 +832,7 @@ static state states_35[2] = { {2, arcs_35_1}, }; static arc arcs_36_0[1] = { - {25, 1}, + {23, 1}, }; static arc arcs_36_1[1] = { {40, 2}, @@ -847,7 +847,7 @@ static state states_36[3] = { {2, arcs_36_2}, }; static arc arcs_37_0[1] = { - {29, 1}, + {27, 1}, }; static arc arcs_37_1[1] = { {40, 2}, @@ -903,7 +903,7 @@ static state states_39[2] = { {1, arcs_39_1}, }; static arc arcs_40_0[1] = { - {16, 1}, + {38, 1}, }; static arc arcs_40_1[3] = { {113, 2}, @@ -919,7 +919,7 @@ static state states_40[3] = { {1, arcs_40_2}, }; static arc arcs_41_0[1] = { - {26, 1}, + {24, 1}, }; static arc arcs_41_1[1] = { {118, 2}, @@ -955,7 +955,7 @@ static state states_41[8] = { {1, arcs_41_7}, }; static arc arcs_42_0[1] = { - {35, 1}, + {33, 1}, }; static arc arcs_42_1[1] = { {118, 2}, @@ -990,7 +990,7 @@ static state states_42[8] = { {1, arcs_42_7}, }; static arc arcs_43_0[1] = { - {23, 1}, + {21, 1}, }; static arc arcs_43_1[1] = { {98, 2}, @@ -1038,7 +1038,7 @@ static state states_43[11] = { {1, arcs_43_10}, }; static arc arcs_44_0[1] = { - {34, 1}, + {32, 1}, }; static arc arcs_44_1[1] = { {59, 2}, @@ -1097,7 +1097,7 @@ static state states_44[13] = { {2, arcs_44_12}, }; static arc arcs_45_0[1] = { - {36, 1}, + {34, 1}, }; static arc arcs_45_1[1] = { {125, 2}, @@ -1218,7 +1218,7 @@ static arc arcs_50_1[1] = { {0, 1}, }; static arc arcs_50_2[2] = { - {26, 3}, + {24, 3}, {0, 2}, }; static arc arcs_50_3[1] = { @@ -1250,7 +1250,7 @@ static state states_51[2] = { {1, arcs_51_1}, }; static arc arcs_52_0[1] = { - {28, 1}, + {26, 1}, }; static arc arcs_52_1[2] = { {59, 2}, @@ -1273,7 +1273,7 @@ static state states_52[5] = { {1, arcs_52_4}, }; static arc arcs_53_0[1] = { - {28, 1}, + {26, 1}, }; static arc arcs_53_1[2] = { {59, 2}, @@ -1318,7 +1318,7 @@ static state states_55[2] = { {2, arcs_55_1}, }; static arc arcs_56_0[2] = { - {30, 1}, + {28, 1}, {139, 2}, }; static arc arcs_56_1[1] = { @@ -1353,13 +1353,13 @@ static arc arcs_58_0[10] = { {146, 1}, {122, 1}, {147, 2}, - {30, 3}, + {28, 3}, }; static arc arcs_58_1[1] = { {0, 1}, }; static arc arcs_58_2[2] = { - {30, 1}, + {28, 1}, {0, 2}, }; static arc arcs_58_3[1] = { @@ -1460,7 +1460,7 @@ static state states_65[2] = { static arc arcs_66_0[4] = { {7, 1}, {8, 1}, - {39, 1}, + {37, 1}, {162, 2}, }; static arc arcs_66_1[1] = { @@ -1494,7 +1494,7 @@ static state states_67[4] = { {1, arcs_67_3}, }; static arc arcs_68_0[2] = { - {17, 1}, + {39, 1}, {164, 2}, }; static arc arcs_68_1[1] = { @@ -1516,7 +1516,7 @@ static arc arcs_69_0[10] = { {12, 2}, {13, 2}, {14, 3}, - {38, 4}, + {36, 4}, {40, 2}, {41, 2}, {42, 5}, @@ -1788,7 +1788,7 @@ static state states_77[14] = { {1, arcs_77_13}, }; static arc arcs_78_0[1] = { - {19, 1}, + {17, 1}, }; static arc arcs_78_1[1] = { {40, 2}, @@ -1874,7 +1874,7 @@ static state states_81[2] = { {1, arcs_81_1}, }; static arc arcs_82_0[1] = { - {23, 1}, + {21, 1}, }; static arc arcs_82_1[1] = { {98, 2}, @@ -1901,7 +1901,7 @@ static state states_82[6] = { {1, arcs_82_5}, }; static arc arcs_83_0[2] = { - {16, 1}, + {38, 1}, {177, 2}, }; static arc arcs_83_1[1] = { @@ -1916,7 +1916,7 @@ static state states_83[3] = { {1, arcs_83_2}, }; static arc arcs_84_0[1] = { - {26, 1}, + {24, 1}, }; static arc arcs_84_1[1] = { {133, 2}, @@ -1945,7 +1945,7 @@ static state states_85[2] = { {1, arcs_85_1}, }; static arc arcs_86_0[1] = { - {37, 1}, + {35, 1}, }; static arc arcs_86_1[2] = { {179, 2}, @@ -1960,7 +1960,7 @@ static state states_86[3] = { {1, arcs_86_2}, }; static arc arcs_87_0[2] = { - {24, 1}, + {22, 1}, {80, 2}, }; static arc arcs_87_1[1] = { @@ -2115,7 +2115,7 @@ static dfa dfas[92] = { {257, "file_input", 0, 2, states_1, "\344\377\377\377\377\027\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {258, "eval_input", 0, 3, states_2, - "\240\173\002\120\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\240\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {259, "decorator", 0, 7, states_3, "\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {260, "decorators", 0, 2, states_4, @@ -2123,9 +2123,9 @@ static dfa dfas[92] = { {261, "decorated", 0, 3, states_5, "\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {262, "async_funcdef", 0, 3, states_6, - "\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {263, "funcdef", 0, 9, states_7, - "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {264, "parameters", 0, 4, states_8, "\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {265, "typedargslist", 0, 22, states_9, @@ -2139,39 +2139,39 @@ static dfa dfas[92] = { {269, "stmt", 0, 2, states_13, "\340\377\377\377\377\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {270, "simple_stmt", 0, 4, states_14, - "\340\373\126\373\343\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\340\373\325\376\270\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {271, "small_stmt", 0, 2, states_15, - "\340\373\126\373\343\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\340\373\325\376\270\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {272, "expr_stmt", 0, 6, states_16, - "\340\173\002\120\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\340\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {273, "annassign", 0, 5, states_17, "\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {274, "testlist_star_expr", 0, 3, states_18, - "\340\173\002\120\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\340\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {275, "augassign", 0, 2, states_19, "\000\000\000\000\000\000\000\000\000\000\340\377\003\000\000\000\000\000\000\000\000\000\000"}, {276, "del_stmt", 0, 3, states_20, - "\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {277, "pass_stmt", 0, 2, states_21, - "\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {278, "flow_stmt", 0, 2, states_22, - "\000\000\024\000\043\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\005\300\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {279, "break_stmt", 0, 2, states_23, - "\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {280, "continue_stmt", 0, 2, states_24, - "\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {281, "return_stmt", 0, 3, states_25, - "\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {282, "yield_stmt", 0, 2, states_26, - "\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {283, "raise_stmt", 0, 5, states_27, - "\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {284, "import_stmt", 0, 2, states_28, - "\000\000\000\011\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\100\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {285, "import_name", 0, 3, states_29, - "\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {286, "import_from", 0, 8, states_30, - "\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {287, "import_as_name", 0, 4, states_31, "\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {288, "dotted_as_name", 0, 4, states_32, @@ -2183,117 +2183,117 @@ static dfa dfas[92] = { {291, "dotted_name", 0, 2, states_35, "\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {292, "global_stmt", 0, 3, states_36, - "\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {293, "nonlocal_stmt", 0, 3, states_37, - "\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {294, "assert_stmt", 0, 5, states_38, "\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {295, "compound_stmt", 0, 2, states_39, - "\000\004\251\004\034\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\004\052\001\107\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {296, "async_stmt", 0, 3, states_40, - "\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {297, "if_stmt", 0, 8, states_41, - "\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {298, "while_stmt", 0, 8, states_42, - "\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {299, "for_stmt", 0, 11, states_43, - "\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {300, "try_stmt", 0, 13, states_44, - "\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {301, "with_stmt", 0, 6, states_45, - "\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {302, "with_item", 0, 4, states_46, - "\240\173\002\120\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\240\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {303, "except_clause", 0, 5, states_47, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000"}, {304, "suite", 0, 5, states_48, - "\344\373\126\373\343\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\344\373\325\376\270\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {305, "namedexpr_test", 0, 4, states_49, - "\240\173\002\120\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\240\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {306, "test", 0, 6, states_50, - "\240\173\002\120\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\240\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {307, "test_nocond", 0, 2, states_51, - "\240\173\002\120\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\240\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {308, "lambdef", 0, 5, states_52, - "\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {309, "lambdef_nocond", 0, 5, states_53, - "\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {310, "or_test", 0, 2, states_54, - "\240\173\002\100\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\240\173\000\020\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {311, "and_test", 0, 2, states_55, - "\240\173\002\100\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\240\173\000\020\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {312, "not_test", 0, 3, states_56, - "\240\173\002\100\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\240\173\000\020\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {313, "comparison", 0, 2, states_57, - "\240\173\002\000\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\240\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {314, "comp_op", 0, 4, states_58, - "\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000\004\000\340\017\000\000\000\000"}, + "\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\004\000\340\017\000\000\000\000"}, {315, "star_expr", 0, 3, states_59, "\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {316, "expr", 0, 2, states_60, - "\240\173\002\000\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\240\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {317, "xor_expr", 0, 2, states_61, - "\240\173\002\000\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\240\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {318, "and_expr", 0, 2, states_62, - "\240\173\002\000\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\240\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {319, "shift_expr", 0, 2, states_63, - "\240\173\002\000\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\240\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {320, "arith_expr", 0, 2, states_64, - "\240\173\002\000\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\240\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {321, "term", 0, 2, states_65, - "\240\173\002\000\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\240\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {322, "factor", 0, 3, states_66, - "\240\173\002\000\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\240\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {323, "power", 0, 4, states_67, - "\040\172\002\000\100\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\040\172\000\000\220\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {324, "atom_expr", 0, 3, states_68, - "\040\172\002\000\100\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\040\172\000\000\220\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {325, "atom", 0, 9, states_69, - "\040\172\000\000\100\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\040\172\000\000\020\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {326, "testlist_comp", 0, 5, states_70, - "\340\173\002\120\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\340\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {327, "trailer", 0, 7, states_71, "\040\100\000\000\000\000\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000"}, {328, "subscriptlist", 0, 3, states_72, - "\240\173\002\120\300\007\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\240\173\000\024\260\007\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {329, "subscript", 0, 5, states_73, - "\240\173\002\120\300\007\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\240\173\000\024\260\007\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {330, "sliceop", 0, 3, states_74, "\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {331, "exprlist", 0, 3, states_75, - "\340\173\002\000\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\340\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {332, "testlist", 0, 3, states_76, - "\240\173\002\120\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\240\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {333, "dictorsetmaker", 0, 14, states_77, - "\340\173\002\120\300\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\340\173\000\024\260\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {334, "classdef", 0, 8, states_78, - "\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {335, "arglist", 0, 3, states_79, - "\340\173\002\120\300\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\340\173\000\024\260\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {336, "argument", 0, 4, states_80, - "\340\173\002\120\300\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\340\173\000\024\260\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {337, "comp_iter", 0, 2, states_81, - "\000\000\201\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\040\001\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {338, "sync_comp_for", 0, 6, states_82, - "\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {339, "comp_for", 0, 3, states_83, - "\000\000\201\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\040\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {340, "comp_if", 0, 4, states_84, - "\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {341, "encoding_decl", 0, 2, states_85, "\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {342, "yield_expr", 0, 3, states_86, - "\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {343, "yield_arg", 0, 3, states_87, - "\340\173\002\121\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\340\173\100\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {344, "func_body_suite", 0, 7, states_88, - "\344\373\126\373\343\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\344\373\325\376\270\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {345, "func_type_input", 0, 3, states_89, "\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {346, "func_type", 0, 6, states_90, "\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {347, "typelist", 0, 11, states_91, - "\340\173\002\120\300\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\340\173\000\024\260\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, }; static label labels[183] = { {0, "EMPTY"}, @@ -2312,8 +2312,6 @@ static label labels[183] = { {1, "True"}, {9, 0}, {1, "assert"}, - {1, "async"}, - {1, "await"}, {1, "break"}, {1, "class"}, {1, "continue"}, @@ -2336,6 +2334,8 @@ static label labels[183] = { {1, "yield"}, {25, 0}, {31, 0}, + {56, 0}, + {55, 0}, {1, 0}, {2, 0}, {3, 0}, @@ -2357,7 +2357,7 @@ static label labels[183] = { {51, 0}, {11, 0}, {306, 0}, - {56, 0}, + {58, 0}, {344, 0}, {265, 0}, {35, 0}, diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 906877a0a853..199ea82434e9 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -105,6 +105,7 @@ PyRun_InteractiveLoopFlags(FILE *fp, const char *filename_str, PyCompilerFlags * if (flags == NULL) { flags = &local_flags; local_flags.cf_flags = 0; + local_flags.cf_feature_version = PY_MINOR_VERSION; } v = _PySys_GetObjectId(&PyId_ps1); if (v == NULL) { @@ -1165,6 +1166,7 @@ Py_SymtableStringObject(const char *str, PyObject *filename, int start) return NULL; flags.cf_flags = 0; + flags.cf_feature_version = PY_MINOR_VERSION; mod = PyParser_ASTFromStringObject(str, filename, start, &flags, arena); if (mod == NULL) { PyArena_Free(arena); @@ -1198,12 +1200,15 @@ PyParser_ASTFromStringObject(const char *s, PyObject *filename, int start, PyCompilerFlags localflags; perrdetail err; int iflags = PARSER_FLAGS(flags); + if (flags && flags->cf_feature_version < 7) + iflags |= PyPARSE_ASYNC_HACKS; node *n = PyParser_ParseStringObject(s, filename, &_PyParser_Grammar, start, &err, &iflags); if (flags == NULL) { localflags.cf_flags = 0; + localflags.cf_feature_version = PY_MINOR_VERSION; flags = &localflags; } if (n) { @@ -1249,6 +1254,7 @@ PyParser_ASTFromFileObject(FILE *fp, PyObject *filename, const char* enc, start, ps1, ps2, &err, &iflags); if (flags == NULL) { localflags.cf_flags = 0; + localflags.cf_feature_version = PY_MINOR_VERSION; flags = &localflags; } if (n) { From webhook-mailer at python.org Thu Mar 7 20:09:44 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 08 Mar 2019 01:09:44 -0000 Subject: [Python-checkins] Fix typo (double 'the') in CODEOWNERS (GH-12227) Message-ID: https://github.com/python/cpython/commit/f2320b37d9c85d8ddfc0c6afa81b77cd5f6e5ef2 commit: f2320b37d9c85d8ddfc0c6afa81b77cd5f6e5ef2 branch: master author: Benedikt Werner <1benediktwerner at gmail.com> committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-07T17:09:40-08:00 summary: Fix typo (double 'the') in CODEOWNERS (GH-12227) files: M .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 224d95fd1971..03e36cfcedd4 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -23,7 +23,7 @@ # Import (including importlib). # Ignoring importlib.h so as to not get flagged on -# all pull requests that change the the emitted +# all pull requests that change the emitted # bytecode. **/*import*.c @python/import-team **/*import*.py @python/import-team From webhook-mailer at python.org Thu Mar 7 20:44:39 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 08 Mar 2019 01:44:39 -0000 Subject: [Python-checkins] Fix typo (double 'the') in CODEOWNERS (GH-12227) Message-ID: https://github.com/python/cpython/commit/f13a06b1a8f49144ed3e238857cf4c322f3ec54f commit: f13a06b1a8f49144ed3e238857cf4c322f3ec54f branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-07T17:44:31-08:00 summary: Fix typo (double 'the') in CODEOWNERS (GH-12227) (cherry picked from commit f2320b37d9c85d8ddfc0c6afa81b77cd5f6e5ef2) Co-authored-by: Benedikt Werner <1benediktwerner at gmail.com> files: M .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 17d7ef4d7a24..84c534145de8 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -18,7 +18,7 @@ # Import (including importlib). # Ignoring importlib.h so as to not get flagged on -# all pull requests that change the the emitted +# all pull requests that change the emitted # bytecode. **/*import*.c @python/import-team **/*import*.py @python/import-team From webhook-mailer at python.org Thu Mar 7 22:16:15 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Fri, 08 Mar 2019 03:16:15 -0000 Subject: [Python-checkins] [2.7] IDLE: Fix typo in keybindingDialog.py (GH-2322) (GH-12231) Message-ID: https://github.com/python/cpython/commit/498468d9c3f53d9cfdd79cf1dc83251316d6d3df commit: 498468d9c3f53d9cfdd79cf1dc83251316d6d3df branch: 2.7 author: Terry Jan Reedy committer: GitHub date: 2019-03-07T22:16:07-05:00 summary: [2.7] IDLE: Fix typo in keybindingDialog.py (GH-2322) (GH-12231) Cherry picked by hand from a0e911b files: M Lib/idlelib/keybindingDialog.py diff --git a/Lib/idlelib/keybindingDialog.py b/Lib/idlelib/keybindingDialog.py index 755f1af47e21..9713c79aae22 100644 --- a/Lib/idlelib/keybindingDialog.py +++ b/Lib/idlelib/keybindingDialog.py @@ -182,7 +182,7 @@ def ClearKeySeq(self): def LoadFinalKeyList(self): #these tuples are also available for use in validity checks - self.functionKeys=('F1','F2','F2','F4','F5','F6','F7','F8','F9', + self.functionKeys=('F1','F2','F3','F4','F5','F6','F7','F8','F9', 'F10','F11','F12') self.alphanumKeys=tuple(string.ascii_lowercase+string.digits) self.punctuationKeys=tuple('~!@#%^&*()_-+={}[]|;:,.<>/?') From webhook-mailer at python.org Fri Mar 8 03:04:37 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Fri, 08 Mar 2019 08:04:37 -0000 Subject: [Python-checkins] bpo-34162: Add entries for idlelib/NEWS.txt (#12232) Message-ID: https://github.com/python/cpython/commit/8a1bab92915dd5c88832706c56af2f5611181d50 commit: 8a1bab92915dd5c88832706c56af2f5611181d50 branch: master author: Terry Jan Reedy committer: GitHub date: 2019-03-08T03:04:32-05:00 summary: bpo-34162: Add entries for idlelib/NEWS.txt (#12232) files: M Lib/idlelib/NEWS.txt diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 715b013e11df..58050f6ce965 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,12 @@ Released on 2019-10-20? ====================================== +bpl-36152: Remove colorizer.ColorDelegator.close_when_done and the +corresponding argument of .close(). In IDLE, both have always been +None or False since 2007. + +bpo-36096: Make colorizer state variables instance-only. + bpo-24310: Document settings dialog font tab sample. bpo-35689: Add docstrings and tests for colorizer. From webhook-mailer at python.org Fri Mar 8 03:25:57 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 08 Mar 2019 08:25:57 -0000 Subject: [Python-checkins] bpo-34162: Add entries for idlelib/NEWS.txt (GH-12232) Message-ID: https://github.com/python/cpython/commit/02351ed1ba601445735c6a6eae6f9b1d37fae8cd commit: 02351ed1ba601445735c6a6eae6f9b1d37fae8cd branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-08T00:25:52-08:00 summary: bpo-34162: Add entries for idlelib/NEWS.txt (GH-12232) (cherry picked from commit 8a1bab92915dd5c88832706c56af2f5611181d50) Co-authored-by: Terry Jan Reedy files: M Lib/idlelib/NEWS.txt diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 367d933ec2ed..d2c150b8e2a9 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,12 @@ Released on 2019-??-?? ====================================== +bpl-36152: Remove colorizer.ColorDelegator.close_when_done and the +corresponding argument of .close(). In IDLE, both have always been +None or False since 2007. + +bpo-36096: Make colorizer state variables instance-only. + bpo-24310: Document settings dialog font tab sample. bpo-35689: Add docstrings and tests for colorizer. From webhook-mailer at python.org Fri Mar 8 13:58:21 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 08 Mar 2019 18:58:21 -0000 Subject: [Python-checkins] bpo-35843: Implement __getitem__ for _NamespacePath (GH-11690) Message-ID: https://github.com/python/cpython/commit/ab9b31f94737895f0121f26ba3ad718ebbc24fe1 commit: ab9b31f94737895f0121f26ba3ad718ebbc24fe1 branch: master author: Anthony Sottile committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-08T10:58:00-08:00 summary: bpo-35843: Implement __getitem__ for _NamespacePath (GH-11690) files: A Misc/NEWS.d/next/Library/2019-01-28-10-19-40.bpo-35843.7rXGQE.rst M Lib/importlib/_bootstrap_external.py M Lib/test/test_importlib/test_namespace_pkgs.py M Python/importlib_external.h diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index 71fdd0cb59fe..146c6472f706 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -1163,6 +1163,9 @@ def _recalculate(self): def __iter__(self): return iter(self._recalculate()) + def __getitem__(self, index): + return self._recalculate()[index] + def __setitem__(self, index, path): self._path[index] = path diff --git a/Lib/test/test_importlib/test_namespace_pkgs.py b/Lib/test/test_importlib/test_namespace_pkgs.py index 8e4b5d66fecc..a8f95a035e24 100644 --- a/Lib/test/test_importlib/test_namespace_pkgs.py +++ b/Lib/test/test_importlib/test_namespace_pkgs.py @@ -332,6 +332,12 @@ def test_namespace_origin_consistency(self): self.assertIsNone(foo.__spec__.origin) self.assertIsNone(foo.__file__) + def test_path_indexable(self): + # bpo-35843 + import foo + expected_path = os.path.join(self.root, 'portion1', 'foo') + self.assertEqual(foo.__path__[0], expected_path) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2019-01-28-10-19-40.bpo-35843.7rXGQE.rst b/Misc/NEWS.d/next/Library/2019-01-28-10-19-40.bpo-35843.7rXGQE.rst new file mode 100644 index 000000000000..1a9eaf0d1390 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-01-28-10-19-40.bpo-35843.7rXGQE.rst @@ -0,0 +1 @@ +Implement ``__getitem__`` for ``_NamespacePath``. Patch by Anthony Sottile. diff --git a/Python/importlib_external.h b/Python/importlib_external.h index ca83eb575c20..ea4d89534900 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -1771,883 +1771,892 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,115,22,0,0,0,8,2,4,6,8,4,8,4,8,3, 8,8,8,6,8,6,8,4,8,4,2,1,114,15,1,0, 0,99,0,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,64,0,0,0,115,96,0,0,0,101,0,90,1,100, + 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,83,0,41,23,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,4,0,0,0,3,0,0,0,67,0,0,0,115,36,0, - 0,0,124,1,124,0,95,0,124,2,124,0,95,1,116,2, - 124,0,160,3,161,0,131,1,124,0,95,4,124,3,124,0, - 95,5,100,0,83,0,114,110,0,0,0,41,6,218,5,95, - 110,97,109,101,218,5,95,112,97,116,104,114,112,0,0,0, - 218,16,95,103,101,116,95,112,97,114,101,110,116,95,112,97, - 116,104,218,17,95,108,97,115,116,95,112,97,114,101,110,116, - 95,112,97,116,104,218,12,95,112,97,116,104,95,102,105,110, - 100,101,114,169,4,114,119,0,0,0,114,117,0,0,0,114, - 44,0,0,0,90,11,112,97,116,104,95,102,105,110,100,101, - 114,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,209,0,0,0,106,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,4,0,0,0,3,0,0,0, - 67,0,0,0,115,38,0,0,0,124,0,106,0,160,1,100, - 1,161,1,92,3,125,1,125,2,125,3,124,2,100,2,107, - 2,114,30,100,3,83,0,124,1,100,4,102,2,83,0,41, - 5,122,62,82,101,116,117,114,110,115,32,97,32,116,117,112, - 108,101,32,111,102,32,40,112,97,114,101,110,116,45,109,111, - 100,117,108,101,45,110,97,109,101,44,32,112,97,114,101,110, - 116,45,112,97,116,104,45,97,116,116,114,45,110,97,109,101, - 41,114,71,0,0,0,114,40,0,0,0,41,2,114,8,0, - 0,0,114,44,0,0,0,90,8,95,95,112,97,116,104,95, - 95,41,2,114,23,1,0,0,114,41,0,0,0,41,4,114, - 119,0,0,0,114,13,1,0,0,218,3,100,111,116,90,2, - 109,101,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,23,95,102,105,110,100,95,112,97,114,101,110,116,95, - 112,97,116,104,95,110,97,109,101,115,112,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,3,0,0,0, - 3,0,0,0,67,0,0,0,115,28,0,0,0,124,0,160, - 0,161,0,92,2,125,1,125,2,116,1,116,2,106,3,124, - 1,25,0,124,2,131,2,83,0,114,110,0,0,0,41,4, - 114,30,1,0,0,114,130,0,0,0,114,8,0,0,0,218, - 7,109,111,100,117,108,101,115,41,3,114,119,0,0,0,90, - 18,112,97,114,101,110,116,95,109,111,100,117,108,101,95,110, - 97,109,101,90,14,112,97,116,104,95,97,116,116,114,95,110, - 97,109,101,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,114,25,1,0,0,122,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,3,0, - 0,0,4,0,0,0,67,0,0,0,115,80,0,0,0,116, - 0,124,0,160,1,161,0,131,1,125,1,124,1,124,0,106, - 2,107,3,114,74,124,0,160,3,124,0,106,4,124,1,161, - 2,125,2,124,2,100,0,107,9,114,68,124,2,106,5,100, - 0,107,8,114,68,124,2,106,6,114,68,124,2,106,6,124, - 0,95,7,124,1,124,0,95,2,124,0,106,7,83,0,114, - 110,0,0,0,41,8,114,112,0,0,0,114,25,1,0,0, - 114,26,1,0,0,114,27,1,0,0,114,23,1,0,0,114, - 140,0,0,0,114,178,0,0,0,114,24,1,0,0,41,3, - 114,119,0,0,0,90,11,112,97,114,101,110,116,95,112,97, - 116,104,114,187,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,12,95,114,101,99,97,108,99,117, - 108,97,116,101,126,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,1,0,0,0,3,0,0,0,67,0,0,0,115, - 12,0,0,0,116,0,124,0,160,1,161,0,131,1,83,0, - 114,110,0,0,0,41,2,114,5,1,0,0,114,32,1,0, - 0,114,246,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,8,95,95,105,116,101,114,95,95,139, - 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,3,0,0,0,0,0,0,0,3,0,0,0, - 3,0,0,0,67,0,0,0,115,14,0,0,0,124,2,124, - 0,106,0,124,1,60,0,100,0,83,0,114,110,0,0,0, - 41,1,114,24,1,0,0,41,3,114,119,0,0,0,218,5, - 105,110,100,101,120,114,44,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,11,95,95,115,101,116, - 105,116,101,109,95,95,142,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, + 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,4,0,0,0,3,0,0, + 0,67,0,0,0,115,36,0,0,0,124,1,124,0,95,0, + 124,2,124,0,95,1,116,2,124,0,160,3,161,0,131,1, + 124,0,95,4,124,3,124,0,95,5,100,0,83,0,114,110, + 0,0,0,41,6,218,5,95,110,97,109,101,218,5,95,112, + 97,116,104,114,112,0,0,0,218,16,95,103,101,116,95,112, + 97,114,101,110,116,95,112,97,116,104,218,17,95,108,97,115, + 116,95,112,97,114,101,110,116,95,112,97,116,104,218,12,95, + 112,97,116,104,95,102,105,110,100,101,114,169,4,114,119,0, + 0,0,114,117,0,0,0,114,44,0,0,0,90,11,112,97, + 116,104,95,102,105,110,100,101,114,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,209,0,0,0,106,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, + 4,0,0,0,3,0,0,0,67,0,0,0,115,38,0,0, + 0,124,0,106,0,160,1,100,1,161,1,92,3,125,1,125, + 2,125,3,124,2,100,2,107,2,114,30,100,3,83,0,124, + 1,100,4,102,2,83,0,41,5,122,62,82,101,116,117,114, + 110,115,32,97,32,116,117,112,108,101,32,111,102,32,40,112, + 97,114,101,110,116,45,109,111,100,117,108,101,45,110,97,109, + 101,44,32,112,97,114,101,110,116,45,112,97,116,104,45,97, + 116,116,114,45,110,97,109,101,41,114,71,0,0,0,114,40, + 0,0,0,41,2,114,8,0,0,0,114,44,0,0,0,90, + 8,95,95,112,97,116,104,95,95,41,2,114,23,1,0,0, + 114,41,0,0,0,41,4,114,119,0,0,0,114,13,1,0, + 0,218,3,100,111,116,90,2,109,101,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,23,95,102,105,110,100, + 95,112,97,114,101,110,116,95,112,97,116,104,95,110,97,109, + 101,115,112,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,3,0,0,0,3,0,0,0,67,0,0,0, + 115,28,0,0,0,124,0,160,0,161,0,92,2,125,1,125, + 2,116,1,116,2,106,3,124,1,25,0,124,2,131,2,83, + 0,114,110,0,0,0,41,4,114,30,1,0,0,114,130,0, + 0,0,114,8,0,0,0,218,7,109,111,100,117,108,101,115, + 41,3,114,119,0,0,0,90,18,112,97,114,101,110,116,95, + 109,111,100,117,108,101,95,110,97,109,101,90,14,112,97,116, + 104,95,97,116,116,114,95,110,97,109,101,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,25,1,0,0,122, + 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,3,0,0,0,4,0,0,0,67,0, + 0,0,115,80,0,0,0,116,0,124,0,160,1,161,0,131, + 1,125,1,124,1,124,0,106,2,107,3,114,74,124,0,160, + 3,124,0,106,4,124,1,161,2,125,2,124,2,100,0,107, + 9,114,68,124,2,106,5,100,0,107,8,114,68,124,2,106, + 6,114,68,124,2,106,6,124,0,95,7,124,1,124,0,95, + 2,124,0,106,7,83,0,114,110,0,0,0,41,8,114,112, + 0,0,0,114,25,1,0,0,114,26,1,0,0,114,27,1, + 0,0,114,23,1,0,0,114,140,0,0,0,114,178,0,0, + 0,114,24,1,0,0,41,3,114,119,0,0,0,90,11,112, + 97,114,101,110,116,95,112,97,116,104,114,187,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,12, + 95,114,101,99,97,108,99,117,108,97,116,101,126,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,1,0,0,0,3, + 0,0,0,67,0,0,0,115,12,0,0,0,116,0,124,0, + 160,1,161,0,131,1,83,0,114,110,0,0,0,41,2,114, + 5,1,0,0,114,32,1,0,0,114,246,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,8,95, + 95,105,116,101,114,95,95,139,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,2,0,0,0,2,0,0,0,67,0,0,0, + 115,12,0,0,0,124,0,160,0,161,0,124,1,25,0,83, + 0,114,110,0,0,0,169,1,114,32,1,0,0,41,2,114, + 119,0,0,0,218,5,105,110,100,101,120,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,11,95,95,103,101, + 116,105,116,101,109,95,95,142,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,3,0,0,0,3,0,0,0,67, + 0,0,0,115,14,0,0,0,124,2,124,0,106,0,124,1, + 60,0,100,0,83,0,114,110,0,0,0,41,1,114,24,1, + 0,0,41,3,114,119,0,0,0,114,35,1,0,0,114,44, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,218,11,95,95,115,101,116,105,116,101,109,95,95,145, + 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,1, + 0,0,0,3,0,0,0,67,0,0,0,115,12,0,0,0, + 116,0,124,0,160,1,161,0,131,1,83,0,114,110,0,0, + 0,41,2,114,22,0,0,0,114,32,1,0,0,114,246,0, + 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,218,7,95,95,108,101,110,95,95,148,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,1,0,0,0,3,0,0,0,67,0, - 0,0,115,12,0,0,0,116,0,124,0,160,1,161,0,131, - 1,83,0,114,110,0,0,0,41,2,114,22,0,0,0,114, - 32,1,0,0,114,246,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,7,95,95,108,101,110,95, - 95,145,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,1,0,0, - 0,3,0,0,0,67,0,0,0,115,12,0,0,0,100,1, - 160,0,124,0,106,1,161,1,83,0,41,2,78,122,20,95, - 78,97,109,101,115,112,97,99,101,80,97,116,104,40,123,33, - 114,125,41,41,2,114,62,0,0,0,114,24,1,0,0,114, - 246,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,8,95,95,114,101,112,114,95,95,148,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,2,0,0,0,3,0, - 0,0,67,0,0,0,115,12,0,0,0,124,1,124,0,160, - 0,161,0,107,6,83,0,114,110,0,0,0,41,1,114,32, - 1,0,0,169,2,114,119,0,0,0,218,4,105,116,101,109, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 12,95,95,99,111,110,116,97,105,110,115,95,95,151,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,2,0, - 0,0,3,0,0,0,67,0,0,0,115,16,0,0,0,124, - 0,106,0,160,1,124,1,161,1,1,0,100,0,83,0,114, - 110,0,0,0,41,2,114,24,1,0,0,114,186,0,0,0, - 114,38,1,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,186,0,0,0,154,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,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,30,1,0,0,114,25,1,0, - 0,114,32,1,0,0,114,33,1,0,0,114,35,1,0,0, - 114,36,1,0,0,114,37,1,0,0,114,40,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,99,4,0, - 0,115,22,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,114,22,1,0, - 0,99,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,4,0,0,0,4,0,0,0, - 67,0,0,0,115,18,0,0,0,116,0,124,1,124,2,124, - 3,131,3,124,0,95,1,100,0,83,0,114,110,0,0,0, - 41,2,114,22,1,0,0,114,24,1,0,0,114,28,1,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,209,0,0,0,160,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,2,0,0,0,3,0,0,0,67,0,0,0, - 115,12,0,0,0,100,1,160,0,124,1,106,1,161,1,83, - 0,41,2,122,115,82,101,116,117,114,110,32,114,101,112,114, - 32,102,111,114,32,116,104,101,32,109,111,100,117,108,101,46, - 10,10,32,32,32,32,32,32,32,32,84,104,101,32,109,101, - 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, - 101,100,46,32,32,84,104,101,32,105,109,112,111,114,116,32, - 109,97,99,104,105,110,101,114,121,32,100,111,101,115,32,116, - 104,101,32,106,111,98,32,105,116,115,101,108,102,46,10,10, - 32,32,32,32,32,32,32,32,122,25,60,109,111,100,117,108, - 101,32,123,33,114,125,32,40,110,97,109,101,115,112,97,99, - 101,41,62,41,2,114,62,0,0,0,114,125,0,0,0,41, - 2,114,193,0,0,0,114,216,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,11,109,111,100,117, - 108,101,95,114,101,112,114,163,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,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, - 172,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,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, - 0,0,100,1,83,0,41,2,78,114,40,0,0,0,114,3, - 0,0,0,114,219,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,229,0,0,0,175,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,2,0,0, - 0,6,0,0,0,67,0,0,0,115,16,0,0,0,116,0, - 100,1,100,2,100,3,100,4,100,5,141,4,83,0,41,6, - 78,114,40,0,0,0,122,8,60,115,116,114,105,110,103,62, - 114,215,0,0,0,84,41,1,114,231,0,0,0,41,1,114, - 232,0,0,0,114,219,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,213,0,0,0,178,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,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,181,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,2,0,0,0,1,0,0,0, - 67,0,0,0,115,4,0,0,0,100,0,83,0,114,110,0, - 0,0,114,3,0,0,0,114,252,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,217,0,0,0, - 184,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,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,0,115,12,0,0,0,100,1,160,0,124,0,106,1,161, + 1,83,0,41,2,78,122,20,95,78,97,109,101,115,112,97, + 99,101,80,97,116,104,40,123,33,114,125,41,41,2,114,62, + 0,0,0,114,24,1,0,0,114,246,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,8,95,95, + 114,101,112,114,95,95,151,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,2,0,0,0,3,0,0,0,67,0,0,0,115, + 12,0,0,0,124,1,124,0,160,0,161,0,107,6,83,0, + 114,110,0,0,0,114,34,1,0,0,169,2,114,119,0,0, + 0,218,4,105,116,101,109,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,12,95,95,99,111,110,116,97,105, + 110,115,95,95,154,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,2,0,0,0,3,0,0,0,67,0,0, + 0,115,16,0,0,0,124,0,106,0,160,1,124,1,161,1, + 1,0,100,0,83,0,114,110,0,0,0,41,2,114,24,1, + 0,0,114,186,0,0,0,114,40,1,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,186,0,0,0, + 157,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,99,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,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,4,0,0,0,4,0,0,0,67,0, + 0,0,115,18,0,0,0,116,0,124,1,124,2,124,3,131, + 3,124,0,95,1,100,0,83,0,114,110,0,0,0,41,2, + 114,22,1,0,0,114,24,1,0,0,114,28,1,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,209, + 0,0,0,163,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,2,0,0,0,3,0,0,0,67,0,0,0,115,12, + 0,0,0,100,1,160,0,124,1,106,1,161,1,83,0,41, + 2,122,115,82,101,116,117,114,110,32,114,101,112,114,32,102, + 111,114,32,116,104,101,32,109,111,100,117,108,101,46,10,10, + 32,32,32,32,32,32,32,32,84,104,101,32,109,101,116,104, + 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, + 46,32,32,84,104,101,32,105,109,112,111,114,116,32,109,97, + 99,104,105,110,101,114,121,32,100,111,101,115,32,116,104,101, + 32,106,111,98,32,105,116,115,101,108,102,46,10,10,32,32, + 32,32,32,32,32,32,122,25,60,109,111,100,117,108,101,32, + 123,33,114,125,32,40,110,97,109,101,115,112,97,99,101,41, + 62,41,2,114,62,0,0,0,114,125,0,0,0,41,2,114, + 193,0,0,0,114,216,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,11,109,111,100,117,108,101, + 95,114,101,112,114,166,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,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,175,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,2, + 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, + 100,1,83,0,41,2,78,114,40,0,0,0,114,3,0,0, 0,114,219,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,220,0,0,0,187,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,42,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,41,1,0, - 0,159,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,41,1,0, - 0,99,0,0,0,0,0,0,0,0,0,0,0,0,4,0, - 0,0,64,0,0,0,115,106,0,0,0,101,0,90,1,100, - 0,90,2,100,1,90,3,101,4,100,2,100,3,132,0,131, - 1,90,5,101,4,100,4,100,5,132,0,131,1,90,6,101, - 4,100,6,100,7,132,0,131,1,90,7,101,4,100,8,100, - 9,132,0,131,1,90,8,101,4,100,17,100,11,100,12,132, - 1,131,1,90,9,101,4,100,18,100,13,100,14,132,1,131, - 1,90,10,101,4,100,19,100,15,100,16,132,1,131,1,90, - 11,100,10,83,0,41,20,218,10,80,97,116,104,70,105,110, - 100,101,114,122,62,77,101,116,97,32,112,97,116,104,32,102, - 105,110,100,101,114,32,102,111,114,32,115,121,115,46,112,97, - 116,104,32,97,110,100,32,112,97,99,107,97,103,101,32,95, - 95,112,97,116,104,95,95,32,97,116,116,114,105,98,117,116, - 101,115,46,99,1,0,0,0,0,0,0,0,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,44,1,0,0,41,3,114,193,0,0,0,114,117,0,0, - 0,218,6,102,105,110,100,101,114,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,44,1,0,0,205,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,3,0,0,0,9,0,0,0,67, - 0,0,0,115,84,0,0,0,116,0,106,1,100,1,107,9, - 114,28,116,0,106,1,115,28,116,2,160,3,100,2,116,4, - 161,2,1,0,116,0,106,1,68,0,93,44,125,2,122,14, - 124,2,124,1,131,1,87,0,2,0,1,0,83,0,4,0, - 116,5,107,10,114,76,1,0,1,0,1,0,89,0,113,34, - 89,0,113,34,88,0,113,34,100,1,83,0,41,3,122,46, - 83,101,97,114,99,104,32,115,121,115,46,112,97,116,104,95, - 104,111,111,107,115,32,102,111,114,32,97,32,102,105,110,100, - 101,114,32,102,111,114,32,39,112,97,116,104,39,46,78,122, - 23,115,121,115,46,112,97,116,104,95,104,111,111,107,115,32, - 105,115,32,101,109,112,116,121,41,6,114,8,0,0,0,218, - 10,112,97,116,104,95,104,111,111,107,115,114,75,0,0,0, - 114,76,0,0,0,114,138,0,0,0,114,118,0,0,0,41, - 3,114,193,0,0,0,114,44,0,0,0,90,4,104,111,111, - 107,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,11,95,112,97,116,104,95,104,111,111,107,115,215,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,3,0,0,0,8,0,0,0,67, - 0,0,0,115,104,0,0,0,124,1,100,1,107,2,114,44, - 122,12,116,0,160,1,161,0,125,1,87,0,110,22,4,0, - 116,2,107,10,114,42,1,0,1,0,1,0,89,0,100,2, - 83,0,88,0,122,14,116,3,106,4,124,1,25,0,125,2, - 87,0,110,40,4,0,116,5,107,10,114,98,1,0,1,0, - 1,0,124,0,160,6,124,1,161,1,125,2,124,2,116,3, - 106,4,124,1,60,0,89,0,110,2,88,0,124,2,83,0, - 41,3,122,210,71,101,116,32,116,104,101,32,102,105,110,100, - 101,114,32,102,111,114,32,116,104,101,32,112,97,116,104,32, - 101,110,116,114,121,32,102,114,111,109,32,115,121,115,46,112, + 114,6,0,0,0,114,229,0,0,0,178,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,2,0,0,0,6, + 0,0,0,67,0,0,0,115,16,0,0,0,116,0,100,1, + 100,2,100,3,100,4,100,5,141,4,83,0,41,6,78,114, + 40,0,0,0,122,8,60,115,116,114,105,110,103,62,114,215, + 0,0,0,84,41,1,114,231,0,0,0,41,1,114,232,0, + 0,0,114,219,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,213,0,0,0,181,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,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,184,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,2,0,0,0,1,0,0,0,67,0, + 0,0,115,4,0,0,0,100,0,83,0,114,110,0,0,0, + 114,3,0,0,0,114,252,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,217,0,0,0,187,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, + 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,190,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,162, + 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,4,0,0,0, + 64,0,0,0,115,106,0,0,0,101,0,90,1,100,0,90, + 2,100,1,90,3,101,4,100,2,100,3,132,0,131,1,90, + 5,101,4,100,4,100,5,132,0,131,1,90,6,101,4,100, + 6,100,7,132,0,131,1,90,7,101,4,100,8,100,9,132, + 0,131,1,90,8,101,4,100,17,100,11,100,12,132,1,131, + 1,90,9,101,4,100,18,100,13,100,14,132,1,131,1,90, + 10,101,4,100,19,100,15,100,16,132,1,131,1,90,11,100, + 10,83,0,41,20,218,10,80,97,116,104,70,105,110,100,101, + 114,122,62,77,101,116,97,32,112,97,116,104,32,102,105,110, + 100,101,114,32,102,111,114,32,115,121,115,46,112,97,116,104, + 32,97,110,100,32,112,97,99,107,97,103,101,32,95,95,112, + 97,116,104,95,95,32,97,116,116,114,105,98,117,116,101,115, + 46,99,1,0,0,0,0,0,0,0,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,46,10,10,32,32,32,32,32,32,32,32,73,102,32, - 116,104,101,32,112,97,116,104,32,101,110,116,114,121,32,105, - 115,32,110,111,116,32,105,110,32,116,104,101,32,99,97,99, - 104,101,44,32,102,105,110,100,32,116,104,101,32,97,112,112, - 114,111,112,114,105,97,116,101,32,102,105,110,100,101,114,10, - 32,32,32,32,32,32,32,32,97,110,100,32,99,97,99,104, - 101,32,105,116,46,32,73,102,32,110,111,32,102,105,110,100, - 101,114,32,105,115,32,97,118,97,105,108,97,98,108,101,44, - 32,115,116,111,114,101,32,78,111,110,101,46,10,10,32,32, - 32,32,32,32,32,32,114,40,0,0,0,78,41,7,114,2, - 0,0,0,114,55,0,0,0,114,2,1,0,0,114,8,0, - 0,0,114,46,1,0,0,218,8,75,101,121,69,114,114,111, - 114,114,50,1,0,0,41,3,114,193,0,0,0,114,44,0, - 0,0,114,48,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,228,4,0,0, - 115,22,0,0,0,0,8,8,1,2,1,12,1,14,3,8, - 1,2,1,14,1,14,1,10,1,16,1,122,31,80,97,116, - 104,70,105,110,100,101,114,46,95,112,97,116,104,95,105,109, - 112,111,114,116,101,114,95,99,97,99,104,101,99,3,0,0, - 0,0,0,0,0,6,0,0,0,4,0,0,0,67,0,0, - 0,115,82,0,0,0,116,0,124,2,100,1,131,2,114,26, - 124,2,160,1,124,1,161,1,92,2,125,3,125,4,110,14, - 124,2,160,2,124,1,161,1,125,3,103,0,125,4,124,3, - 100,0,107,9,114,60,116,3,160,4,124,1,124,3,161,2, - 83,0,116,3,160,5,124,1,100,0,161,2,125,5,124,4, - 124,5,95,6,124,5,83,0,41,2,78,114,137,0,0,0, - 41,7,114,128,0,0,0,114,137,0,0,0,114,206,0,0, - 0,114,134,0,0,0,114,201,0,0,0,114,183,0,0,0, - 114,178,0,0,0,41,6,114,193,0,0,0,114,139,0,0, - 0,114,48,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,250,4,0,0,115,18,0,0,0,0, - 4,10,1,16,2,10,1,4,1,8,1,12,1,12,1,6, - 1,122,27,80,97,116,104,70,105,110,100,101,114,46,95,108, - 101,103,97,99,121,95,103,101,116,95,115,112,101,99,78,99, - 4,0,0,0,0,0,0,0,9,0,0,0,5,0,0,0, - 67,0,0,0,115,166,0,0,0,103,0,125,4,124,2,68, - 0,93,134,125,5,116,0,124,5,116,1,116,2,102,2,131, - 2,115,28,113,8,124,0,160,3,124,5,161,1,125,6,124, - 6,100,1,107,9,114,8,116,4,124,6,100,2,131,2,114, - 70,124,6,160,5,124,1,124,3,161,2,125,7,110,12,124, - 0,160,6,124,1,124,6,161,2,125,7,124,7,100,1,107, - 8,114,92,113,8,124,7,106,7,100,1,107,9,114,110,124, - 7,2,0,1,0,83,0,124,7,106,8,125,8,124,8,100, - 1,107,8,114,132,116,9,100,3,131,1,130,1,124,4,160, - 10,124,8,161,1,1,0,113,8,116,11,160,12,124,1,100, - 1,161,2,125,7,124,4,124,7,95,8,124,7,83,0,41, - 4,122,63,70,105,110,100,32,116,104,101,32,108,111,97,100, - 101,114,32,111,114,32,110,97,109,101,115,112,97,99,101,95, - 112,97,116,104,32,102,111,114,32,116,104,105,115,32,109,111, - 100,117,108,101,47,112,97,99,107,97,103,101,32,110,97,109, - 101,46,78,114,203,0,0,0,122,19,115,112,101,99,32,109, - 105,115,115,105,110,103,32,108,111,97,100,101,114,41,13,114, - 161,0,0,0,114,85,0,0,0,218,5,98,121,116,101,115, - 114,52,1,0,0,114,128,0,0,0,114,203,0,0,0,114, - 53,1,0,0,114,140,0,0,0,114,178,0,0,0,114,118, - 0,0,0,114,167,0,0,0,114,134,0,0,0,114,183,0, - 0,0,41,9,114,193,0,0,0,114,139,0,0,0,114,44, - 0,0,0,114,202,0,0,0,218,14,110,97,109,101,115,112, - 97,99,101,95,112,97,116,104,90,5,101,110,116,114,121,114, - 48,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,9,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,6,0,0,0,5,0,0,0, - 67,0,0,0,115,100,0,0,0,124,2,100,1,107,8,114, - 14,116,0,106,1,125,2,124,0,160,2,124,1,124,2,124, - 3,161,3,125,4,124,4,100,1,107,8,114,40,100,1,83, - 0,124,4,106,3,100,1,107,8,114,92,124,4,106,4,125, - 5,124,5,114,86,100,1,124,4,95,5,116,6,124,1,124, - 5,124,0,106,2,131,3,124,4,95,4,124,4,83,0,100, - 1,83,0,110,4,124,4,83,0,100,1,83,0,41,2,122, - 141,84,114,121,32,116,111,32,102,105,110,100,32,97,32,115, - 112,101,99,32,102,111,114,32,39,102,117,108,108,110,97,109, - 101,39,32,111,110,32,115,121,115,46,112,97,116,104,32,111, - 114,32,39,112,97,116,104,39,46,10,10,32,32,32,32,32, - 32,32,32,84,104,101,32,115,101,97,114,99,104,32,105,115, - 32,98,97,115,101,100,32,111,110,32,115,121,115,46,112,97, - 116,104,95,104,111,111,107,115,32,97,110,100,32,115,121,115, - 46,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99, - 97,99,104,101,46,10,32,32,32,32,32,32,32,32,78,41, - 7,114,8,0,0,0,114,44,0,0,0,114,56,1,0,0, - 114,140,0,0,0,114,178,0,0,0,114,181,0,0,0,114, - 22,1,0,0,41,6,114,193,0,0,0,114,139,0,0,0, - 114,44,0,0,0,114,202,0,0,0,114,187,0,0,0,114, - 55,1,0,0,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,114,203,0,0,0,41,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,4,0,0,0,4,0, - 0,0,67,0,0,0,115,30,0,0,0,124,0,160,0,124, - 1,124,2,161,2,125,3,124,3,100,1,107,8,114,24,100, - 1,83,0,124,3,106,1,83,0,41,2,122,170,102,105,110, - 100,32,116,104,101,32,109,111,100,117,108,101,32,111,110,32, - 115,121,115,46,112,97,116,104,32,111,114,32,39,112,97,116, - 104,39,32,98,97,115,101,100,32,111,110,32,115,121,115,46, - 112,97,116,104,95,104,111,111,107,115,32,97,110,100,10,32, - 32,32,32,32,32,32,32,115,121,115,46,112,97,116,104,95, - 105,109,112,111,114,116,101,114,95,99,97,99,104,101,46,10, - 10,32,32,32,32,32,32,32,32,84,104,105,115,32,109,101, - 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, - 101,100,46,32,32,85,115,101,32,102,105,110,100,95,115,112, - 101,99,40,41,32,105,110,115,116,101,97,100,46,10,10,32, - 32,32,32,32,32,32,32,78,114,204,0,0,0,114,205,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,206,0,0,0,65,5,0,0,115,8,0,0,0,0, - 8,12,1,8,1,4,1,122,22,80,97,116,104,70,105,110, - 100,101,114,46,102,105,110,100,95,109,111,100,117,108,101,41, - 1,78,41,2,78,78,41,1,78,41,12,114,125,0,0,0, - 114,124,0,0,0,114,126,0,0,0,114,127,0,0,0,114, - 207,0,0,0,114,44,1,0,0,114,50,1,0,0,114,52, - 1,0,0,114,53,1,0,0,114,56,1,0,0,114,203,0, - 0,0,114,206,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,43,1,0,0, - 201,4,0,0,115,30,0,0,0,8,2,4,2,2,1,10, - 9,2,1,10,12,2,1,10,21,2,1,10,14,2,1,12, - 31,2,1,12,23,2,1,114,43,1,0,0,99,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,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,2,0,0,0,3,0,0,0,51,0,0,0,115,22,0, - 0,0,124,0,93,14,125,1,124,1,136,0,102,2,86,0, - 1,0,113,2,100,0,83,0,114,110,0,0,0,114,3,0, - 0,0,114,16,1,0,0,169,1,114,140,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,19,1,0,0,94,5,0, - 0,115,4,0,0,0,4,0,2,0,122,38,70,105,108,101, - 70,105,110,100,101,114,46,95,95,105,110,105,116,95,95,46, - 60,108,111,99,97,108,115,62,46,60,103,101,110,101,120,112, - 114,62,114,71,0,0,0,114,105,0,0,0,78,41,7,114, - 167,0,0,0,218,8,95,108,111,97,100,101,114,115,114,44, - 0,0,0,218,11,95,112,97,116,104,95,109,116,105,109,101, - 218,3,115,101,116,218,11,95,112,97,116,104,95,99,97,99, - 104,101,218,19,95,114,101,108,97,120,101,100,95,112,97,116, - 104,95,99,97,99,104,101,41,5,114,119,0,0,0,114,44, - 0,0,0,218,14,108,111,97,100,101,114,95,100,101,116,97, - 105,108,115,90,7,108,111,97,100,101,114,115,114,189,0,0, - 0,114,3,0,0,0,114,58,1,0,0,114,6,0,0,0, - 114,209,0,0,0,88,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,1,0,0,0, - 2,0,0,0,67,0,0,0,115,10,0,0,0,100,1,124, - 0,95,0,100,2,83,0,41,3,122,31,73,110,118,97,108, - 105,100,97,116,101,32,116,104,101,32,100,105,114,101,99,116, - 111,114,121,32,109,116,105,109,101,46,114,105,0,0,0,78, - 41,1,114,60,1,0,0,114,246,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,44,1,0,0, - 102,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,3,0,0,0,3,0,0,0,67,0,0,0,115,42, - 0,0,0,124,0,160,0,124,1,161,1,125,2,124,2,100, - 1,107,8,114,26,100,1,103,0,102,2,83,0,124,2,106, - 1,124,2,106,2,112,38,103,0,102,2,83,0,41,2,122, - 197,84,114,121,32,116,111,32,102,105,110,100,32,97,32,108, - 111,97,100,101,114,32,102,111,114,32,116,104,101,32,115,112, - 101,99,105,102,105,101,100,32,109,111,100,117,108,101,44,32, - 111,114,32,116,104,101,32,110,97,109,101,115,112,97,99,101, - 10,32,32,32,32,32,32,32,32,112,97,99,107,97,103,101, - 32,112,111,114,116,105,111,110,115,46,32,82,101,116,117,114, - 110,115,32,40,108,111,97,100,101,114,44,32,108,105,115,116, - 45,111,102,45,112,111,114,116,105,111,110,115,41,46,10,10, - 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, - 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,32,32,85,115,101,32,102,105,110,100,95,115,112,101, - 99,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, - 32,32,32,32,32,32,78,41,3,114,203,0,0,0,114,140, - 0,0,0,114,178,0,0,0,41,3,114,119,0,0,0,114, - 139,0,0,0,114,187,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,137,0,0,0,108,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,7, - 0,0,0,6,0,0,0,67,0,0,0,115,26,0,0,0, - 124,1,124,2,124,3,131,2,125,6,116,0,124,2,124,3, - 124,6,124,4,100,1,141,4,83,0,41,2,78,114,177,0, - 0,0,41,1,114,190,0,0,0,41,7,114,119,0,0,0, - 114,188,0,0,0,114,139,0,0,0,114,44,0,0,0,90, - 4,115,109,115,108,114,202,0,0,0,114,140,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,56, - 1,0,0,120,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,14,0,0,0,8,0,0,0,67,0,0,0, - 115,102,1,0,0,100,1,125,3,124,1,160,0,100,2,161, - 1,100,3,25,0,125,4,122,24,116,1,124,0,106,2,112, - 34,116,3,160,4,161,0,131,1,106,5,125,5,87,0,110, - 24,4,0,116,6,107,10,114,66,1,0,1,0,1,0,100, - 4,125,5,89,0,110,2,88,0,124,5,124,0,106,7,107, - 3,114,92,124,0,160,8,161,0,1,0,124,5,124,0,95, - 7,116,9,131,0,114,114,124,0,106,10,125,6,124,4,160, - 11,161,0,125,7,110,10,124,0,106,12,125,6,124,4,125, - 7,124,7,124,6,107,6,114,218,116,13,124,0,106,2,124, - 4,131,2,125,8,124,0,106,14,68,0,93,58,92,2,125, - 9,125,10,100,5,124,9,23,0,125,11,116,13,124,8,124, - 11,131,2,125,12,116,15,124,12,131,1,114,208,124,0,160, - 16,124,10,124,1,124,12,124,8,103,1,124,2,161,5,2, - 0,1,0,83,0,113,150,116,17,124,8,131,1,125,3,124, - 0,106,14,68,0,93,86,92,2,125,9,125,10,116,13,124, - 0,106,2,124,4,124,9,23,0,131,2,125,12,116,18,106, - 19,100,6,124,12,100,3,100,7,141,3,1,0,124,7,124, - 9,23,0,124,6,107,6,144,1,114,54,116,15,124,12,131, - 1,144,1,114,54,124,0,160,16,124,10,124,1,124,12,100, - 8,124,2,161,5,2,0,1,0,83,0,113,224,124,3,144, - 1,114,98,116,18,160,19,100,9,124,8,161,2,1,0,116, - 18,160,20,124,1,100,8,161,2,125,13,124,8,103,1,124, - 13,95,21,124,13,83,0,100,8,83,0,41,10,122,111,84, + 104,101,218,5,105,116,101,109,115,114,128,0,0,0,114,46, + 1,0,0,41,3,114,193,0,0,0,114,117,0,0,0,218, + 6,102,105,110,100,101,114,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,46,1,0,0,208,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,3,0,0,0,9,0,0,0,67,0,0, + 0,115,84,0,0,0,116,0,106,1,100,1,107,9,114,28, + 116,0,106,1,115,28,116,2,160,3,100,2,116,4,161,2, + 1,0,116,0,106,1,68,0,93,44,125,2,122,14,124,2, + 124,1,131,1,87,0,2,0,1,0,83,0,4,0,116,5, + 107,10,114,76,1,0,1,0,1,0,89,0,113,34,89,0, + 113,34,88,0,113,34,100,1,83,0,41,3,122,46,83,101, + 97,114,99,104,32,115,121,115,46,112,97,116,104,95,104,111, + 111,107,115,32,102,111,114,32,97,32,102,105,110,100,101,114, + 32,102,111,114,32,39,112,97,116,104,39,46,78,122,23,115, + 121,115,46,112,97,116,104,95,104,111,111,107,115,32,105,115, + 32,101,109,112,116,121,41,6,114,8,0,0,0,218,10,112, + 97,116,104,95,104,111,111,107,115,114,75,0,0,0,114,76, + 0,0,0,114,138,0,0,0,114,118,0,0,0,41,3,114, + 193,0,0,0,114,44,0,0,0,90,4,104,111,111,107,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,11, + 95,112,97,116,104,95,104,111,111,107,115,218,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,3,0,0,0,8,0,0,0,67,0,0, + 0,115,104,0,0,0,124,1,100,1,107,2,114,44,122,12, + 116,0,160,1,161,0,125,1,87,0,110,22,4,0,116,2, + 107,10,114,42,1,0,1,0,1,0,89,0,100,2,83,0, + 88,0,122,14,116,3,106,4,124,1,25,0,125,2,87,0, + 110,40,4,0,116,5,107,10,114,98,1,0,1,0,1,0, + 124,0,160,6,124,1,161,1,125,2,124,2,116,3,106,4, + 124,1,60,0,89,0,110,2,88,0,124,2,83,0,41,3, + 122,210,71,101,116,32,116,104,101,32,102,105,110,100,101,114, + 32,102,111,114,32,116,104,101,32,112,97,116,104,32,101,110, + 116,114,121,32,102,114,111,109,32,115,121,115,46,112,97,116, + 104,95,105,109,112,111,114,116,101,114,95,99,97,99,104,101, + 46,10,10,32,32,32,32,32,32,32,32,73,102,32,116,104, + 101,32,112,97,116,104,32,101,110,116,114,121,32,105,115,32, + 110,111,116,32,105,110,32,116,104,101,32,99,97,99,104,101, + 44,32,102,105,110,100,32,116,104,101,32,97,112,112,114,111, + 112,114,105,97,116,101,32,102,105,110,100,101,114,10,32,32, + 32,32,32,32,32,32,97,110,100,32,99,97,99,104,101,32, + 105,116,46,32,73,102,32,110,111,32,102,105,110,100,101,114, + 32,105,115,32,97,118,97,105,108,97,98,108,101,44,32,115, + 116,111,114,101,32,78,111,110,101,46,10,10,32,32,32,32, + 32,32,32,32,114,40,0,0,0,78,41,7,114,2,0,0, + 0,114,55,0,0,0,114,2,1,0,0,114,8,0,0,0, + 114,48,1,0,0,218,8,75,101,121,69,114,114,111,114,114, + 52,1,0,0,41,3,114,193,0,0,0,114,44,0,0,0, + 114,50,1,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,218,20,95,112,97,116,104,95,105,109,112,111, + 114,116,101,114,95,99,97,99,104,101,231,4,0,0,115,22, + 0,0,0,0,8,8,1,2,1,12,1,14,3,8,1,2, + 1,14,1,14,1,10,1,16,1,122,31,80,97,116,104,70, + 105,110,100,101,114,46,95,112,97,116,104,95,105,109,112,111, + 114,116,101,114,95,99,97,99,104,101,99,3,0,0,0,0, + 0,0,0,6,0,0,0,4,0,0,0,67,0,0,0,115, + 82,0,0,0,116,0,124,2,100,1,131,2,114,26,124,2, + 160,1,124,1,161,1,92,2,125,3,125,4,110,14,124,2, + 160,2,124,1,161,1,125,3,103,0,125,4,124,3,100,0, + 107,9,114,60,116,3,160,4,124,1,124,3,161,2,83,0, + 116,3,160,5,124,1,100,0,161,2,125,5,124,4,124,5, + 95,6,124,5,83,0,41,2,78,114,137,0,0,0,41,7, + 114,128,0,0,0,114,137,0,0,0,114,206,0,0,0,114, + 134,0,0,0,114,201,0,0,0,114,183,0,0,0,114,178, + 0,0,0,41,6,114,193,0,0,0,114,139,0,0,0,114, + 50,1,0,0,114,140,0,0,0,114,141,0,0,0,114,187, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,218,16,95,108,101,103,97,99,121,95,103,101,116,95, + 115,112,101,99,253,4,0,0,115,18,0,0,0,0,4,10, + 1,16,2,10,1,4,1,8,1,12,1,12,1,6,1,122, + 27,80,97,116,104,70,105,110,100,101,114,46,95,108,101,103, + 97,99,121,95,103,101,116,95,115,112,101,99,78,99,4,0, + 0,0,0,0,0,0,9,0,0,0,5,0,0,0,67,0, + 0,0,115,166,0,0,0,103,0,125,4,124,2,68,0,93, + 134,125,5,116,0,124,5,116,1,116,2,102,2,131,2,115, + 28,113,8,124,0,160,3,124,5,161,1,125,6,124,6,100, + 1,107,9,114,8,116,4,124,6,100,2,131,2,114,70,124, + 6,160,5,124,1,124,3,161,2,125,7,110,12,124,0,160, + 6,124,1,124,6,161,2,125,7,124,7,100,1,107,8,114, + 92,113,8,124,7,106,7,100,1,107,9,114,110,124,7,2, + 0,1,0,83,0,124,7,106,8,125,8,124,8,100,1,107, + 8,114,132,116,9,100,3,131,1,130,1,124,4,160,10,124, + 8,161,1,1,0,113,8,116,11,160,12,124,1,100,1,161, + 2,125,7,124,4,124,7,95,8,124,7,83,0,41,4,122, + 63,70,105,110,100,32,116,104,101,32,108,111,97,100,101,114, + 32,111,114,32,110,97,109,101,115,112,97,99,101,95,112,97, + 116,104,32,102,111,114,32,116,104,105,115,32,109,111,100,117, + 108,101,47,112,97,99,107,97,103,101,32,110,97,109,101,46, + 78,114,203,0,0,0,122,19,115,112,101,99,32,109,105,115, + 115,105,110,103,32,108,111,97,100,101,114,41,13,114,161,0, + 0,0,114,85,0,0,0,218,5,98,121,116,101,115,114,54, + 1,0,0,114,128,0,0,0,114,203,0,0,0,114,55,1, + 0,0,114,140,0,0,0,114,178,0,0,0,114,118,0,0, + 0,114,167,0,0,0,114,134,0,0,0,114,183,0,0,0, + 41,9,114,193,0,0,0,114,139,0,0,0,114,44,0,0, + 0,114,202,0,0,0,218,14,110,97,109,101,115,112,97,99, + 101,95,112,97,116,104,90,5,101,110,116,114,121,114,50,1, + 0,0,114,187,0,0,0,114,141,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,9,95,103,101, + 116,95,115,112,101,99,12,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,6,0,0,0,5,0,0,0,67,0, + 0,0,115,100,0,0,0,124,2,100,1,107,8,114,14,116, + 0,106,1,125,2,124,0,160,2,124,1,124,2,124,3,161, + 3,125,4,124,4,100,1,107,8,114,40,100,1,83,0,124, + 4,106,3,100,1,107,8,114,92,124,4,106,4,125,5,124, + 5,114,86,100,1,124,4,95,5,116,6,124,1,124,5,124, + 0,106,2,131,3,124,4,95,4,124,4,83,0,100,1,83, + 0,110,4,124,4,83,0,100,1,83,0,41,2,122,141,84, 114,121,32,116,111,32,102,105,110,100,32,97,32,115,112,101, - 99,32,102,111,114,32,116,104,101,32,115,112,101,99,105,102, - 105,101,100,32,109,111,100,117,108,101,46,10,10,32,32,32, - 32,32,32,32,32,82,101,116,117,114,110,115,32,116,104,101, - 32,109,97,116,99,104,105,110,103,32,115,112,101,99,44,32, - 111,114,32,78,111,110,101,32,105,102,32,110,111,116,32,102, - 111,117,110,100,46,10,32,32,32,32,32,32,32,32,70,114, - 71,0,0,0,114,28,0,0,0,114,105,0,0,0,114,209, - 0,0,0,122,9,116,114,121,105,110,103,32,123,125,41,1, - 90,9,118,101,114,98,111,115,105,116,121,78,122,25,112,111, - 115,115,105,98,108,101,32,110,97,109,101,115,112,97,99,101, - 32,102,111,114,32,123,125,41,22,114,41,0,0,0,114,49, - 0,0,0,114,44,0,0,0,114,2,0,0,0,114,55,0, - 0,0,114,9,1,0,0,114,50,0,0,0,114,60,1,0, - 0,218,11,95,102,105,108,108,95,99,97,99,104,101,114,7, - 0,0,0,114,63,1,0,0,114,106,0,0,0,114,62,1, - 0,0,114,38,0,0,0,114,59,1,0,0,114,54,0,0, - 0,114,56,1,0,0,114,56,0,0,0,114,134,0,0,0, - 114,149,0,0,0,114,183,0,0,0,114,178,0,0,0,41, - 14,114,119,0,0,0,114,139,0,0,0,114,202,0,0,0, - 90,12,105,115,95,110,97,109,101,115,112,97,99,101,90,11, - 116,97,105,108,95,109,111,100,117,108,101,114,169,0,0,0, - 90,5,99,97,99,104,101,90,12,99,97,99,104,101,95,109, - 111,100,117,108,101,90,9,98,97,115,101,95,112,97,116,104, - 114,17,1,0,0,114,188,0,0,0,90,13,105,110,105,116, - 95,102,105,108,101,110,97,109,101,90,9,102,117,108,108,95, - 112,97,116,104,114,187,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,203,0,0,0,125,5,0, - 0,115,74,0,0,0,0,5,4,1,14,1,2,1,24,1, - 14,1,10,1,10,1,8,1,6,2,6,1,6,1,10,2, - 6,1,4,2,8,1,12,1,14,1,8,1,10,1,8,1, - 26,4,8,2,14,1,16,1,16,1,14,1,10,1,10,1, - 2,0,2,255,10,2,6,1,12,1,12,1,8,1,4,1, - 122,20,70,105,108,101,70,105,110,100,101,114,46,102,105,110, - 100,95,115,112,101,99,99,1,0,0,0,0,0,0,0,9, - 0,0,0,10,0,0,0,67,0,0,0,115,190,0,0,0, - 124,0,106,0,125,1,122,22,116,1,160,2,124,1,112,22, - 116,1,160,3,161,0,161,1,125,2,87,0,110,30,4,0, - 116,4,116,5,116,6,102,3,107,10,114,58,1,0,1,0, - 1,0,103,0,125,2,89,0,110,2,88,0,116,7,106,8, - 160,9,100,1,161,1,115,84,116,10,124,2,131,1,124,0, - 95,11,110,74,116,10,131,0,125,3,124,2,68,0,93,56, - 125,4,124,4,160,12,100,2,161,1,92,3,125,5,125,6, - 125,7,124,6,114,136,100,3,160,13,124,5,124,7,160,14, - 161,0,161,2,125,8,110,4,124,5,125,8,124,3,160,15, - 124,8,161,1,1,0,113,94,124,3,124,0,95,11,116,7, - 106,8,160,9,116,16,161,1,114,186,100,4,100,5,132,0, - 124,2,68,0,131,1,124,0,95,17,100,6,83,0,41,7, - 122,68,70,105,108,108,32,116,104,101,32,99,97,99,104,101, - 32,111,102,32,112,111,116,101,110,116,105,97,108,32,109,111, - 100,117,108,101,115,32,97,110,100,32,112,97,99,107,97,103, - 101,115,32,102,111,114,32,116,104,105,115,32,100,105,114,101, - 99,116,111,114,121,46,114,0,0,0,0,114,71,0,0,0, - 114,61,0,0,0,99,1,0,0,0,0,0,0,0,2,0, - 0,0,4,0,0,0,83,0,0,0,115,20,0,0,0,104, - 0,124,0,93,12,125,1,124,1,160,0,161,0,146,2,113, - 4,83,0,114,3,0,0,0,41,1,114,106,0,0,0,41, - 2,114,32,0,0,0,90,2,102,110,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,9,60,115,101,116,99, - 111,109,112,62,202,5,0,0,115,4,0,0,0,6,0,2, - 0,122,41,70,105,108,101,70,105,110,100,101,114,46,95,102, - 105,108,108,95,99,97,99,104,101,46,60,108,111,99,97,108, - 115,62,46,60,115,101,116,99,111,109,112,62,78,41,18,114, - 44,0,0,0,114,2,0,0,0,114,6,1,0,0,114,55, - 0,0,0,114,2,1,0,0,218,15,80,101,114,109,105,115, - 115,105,111,110,69,114,114,111,114,218,18,78,111,116,65,68, - 105,114,101,99,116,111,114,121,69,114,114,111,114,114,8,0, - 0,0,114,9,0,0,0,114,10,0,0,0,114,61,1,0, - 0,114,62,1,0,0,114,101,0,0,0,114,62,0,0,0, - 114,106,0,0,0,218,3,97,100,100,114,11,0,0,0,114, - 63,1,0,0,41,9,114,119,0,0,0,114,44,0,0,0, - 114,7,1,0,0,90,21,108,111,119,101,114,95,115,117,102, - 102,105,120,95,99,111,110,116,101,110,116,115,114,39,1,0, - 0,114,117,0,0,0,114,29,1,0,0,114,17,1,0,0, - 90,8,110,101,119,95,110,97,109,101,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,65,1,0,0,173,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,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,1,0,0,0,4,0,0,0,19,0,0,0,115,34,0, - 0,0,116,0,124,0,131,1,115,20,116,1,100,1,124,0, - 100,2,141,2,130,1,136,0,124,0,102,1,136,1,158,2, - 142,0,83,0,41,3,122,45,80,97,116,104,32,104,111,111, - 107,32,102,111,114,32,105,109,112,111,114,116,108,105,98,46, - 109,97,99,104,105,110,101,114,121,46,70,105,108,101,70,105, - 110,100,101,114,46,122,30,111,110,108,121,32,100,105,114,101, - 99,116,111,114,105,101,115,32,97,114,101,32,115,117,112,112, - 111,114,116,101,100,114,48,0,0,0,41,2,114,56,0,0, - 0,114,118,0,0,0,114,48,0,0,0,169,2,114,193,0, - 0,0,114,64,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,214,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,64, - 1,0,0,114,71,1,0,0,114,3,0,0,0,114,70,1, - 0,0,114,6,0,0,0,218,9,112,97,116,104,95,104,111, - 111,107,204,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,1,0, - 0,0,3,0,0,0,67,0,0,0,115,12,0,0,0,100, - 1,160,0,124,0,106,1,161,1,83,0,41,2,78,122,16, - 70,105,108,101,70,105,110,100,101,114,40,123,33,114,125,41, - 41,2,114,62,0,0,0,114,44,0,0,0,114,246,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,37,1,0,0,222,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,44,1,0,0,114,143,0,0,0,114,206,0, - 0,0,114,137,0,0,0,114,56,1,0,0,114,203,0,0, - 0,114,65,1,0,0,114,207,0,0,0,114,72,1,0,0, - 114,37,1,0,0,114,3,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,57,1,0,0,79,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,57,1, - 0,0,99,4,0,0,0,0,0,0,0,6,0,0,0,8, - 0,0,0,67,0,0,0,115,146,0,0,0,124,0,160,0, - 100,1,161,1,125,4,124,0,160,0,100,2,161,1,125,5, - 124,4,115,66,124,5,114,36,124,5,106,1,125,4,110,30, - 124,2,124,3,107,2,114,56,116,2,124,1,124,2,131,2, - 125,4,110,10,116,3,124,1,124,2,131,2,125,4,124,5, - 115,84,116,4,124,1,124,2,124,4,100,3,141,3,125,5, - 122,36,124,5,124,0,100,2,60,0,124,4,124,0,100,1, - 60,0,124,2,124,0,100,4,60,0,124,3,124,0,100,5, - 60,0,87,0,110,20,4,0,116,5,107,10,114,140,1,0, - 1,0,1,0,89,0,110,2,88,0,100,0,83,0,41,6, - 78,218,10,95,95,108,111,97,100,101,114,95,95,218,8,95, - 95,115,112,101,99,95,95,114,58,1,0,0,90,8,95,95, - 102,105,108,101,95,95,90,10,95,95,99,97,99,104,101,100, - 95,95,41,6,218,3,103,101,116,114,140,0,0,0,114,14, - 1,0,0,114,8,1,0,0,114,190,0,0,0,218,9,69, - 120,99,101,112,116,105,111,110,41,6,90,2,110,115,114,117, - 0,0,0,90,8,112,97,116,104,110,97,109,101,90,9,99, - 112,97,116,104,110,97,109,101,114,140,0,0,0,114,187,0, + 99,32,102,111,114,32,39,102,117,108,108,110,97,109,101,39, + 32,111,110,32,115,121,115,46,112,97,116,104,32,111,114,32, + 39,112,97,116,104,39,46,10,10,32,32,32,32,32,32,32, + 32,84,104,101,32,115,101,97,114,99,104,32,105,115,32,98, + 97,115,101,100,32,111,110,32,115,121,115,46,112,97,116,104, + 95,104,111,111,107,115,32,97,110,100,32,115,121,115,46,112, + 97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,99, + 104,101,46,10,32,32,32,32,32,32,32,32,78,41,7,114, + 8,0,0,0,114,44,0,0,0,114,58,1,0,0,114,140, + 0,0,0,114,178,0,0,0,114,181,0,0,0,114,22,1, + 0,0,41,6,114,193,0,0,0,114,139,0,0,0,114,44, + 0,0,0,114,202,0,0,0,114,187,0,0,0,114,57,1, 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,14,95,102,105,120,95,117,112,95,109,111,100,117,108, - 101,228,5,0,0,115,34,0,0,0,0,2,10,1,10,1, - 4,1,4,1,8,1,8,1,12,2,10,1,4,1,14,1, - 2,1,8,1,8,1,8,1,12,1,14,2,114,77,1,0, - 0,99,0,0,0,0,0,0,0,0,3,0,0,0,3,0, - 0,0,67,0,0,0,115,38,0,0,0,116,0,116,1,160, - 2,161,0,102,2,125,0,116,3,116,4,102,2,125,1,116, - 5,116,6,102,2,125,2,124,0,124,1,124,2,103,3,83, - 0,41,1,122,95,82,101,116,117,114,110,115,32,97,32,108, - 105,115,116,32,111,102,32,102,105,108,101,45,98,97,115,101, - 100,32,109,111,100,117,108,101,32,108,111,97,100,101,114,115, - 46,10,10,32,32,32,32,69,97,99,104,32,105,116,101,109, - 32,105,115,32,97,32,116,117,112,108,101,32,40,108,111,97, - 100,101,114,44,32,115,117,102,102,105,120,101,115,41,46,10, - 32,32,32,32,41,7,114,15,1,0,0,114,163,0,0,0, - 218,18,101,120,116,101,110,115,105,111,110,95,115,117,102,102, - 105,120,101,115,114,8,1,0,0,114,102,0,0,0,114,14, - 1,0,0,114,89,0,0,0,41,3,90,10,101,120,116,101, - 110,115,105,111,110,115,90,6,115,111,117,114,99,101,90,8, - 98,121,116,101,99,111,100,101,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,184,0,0,0,251,5,0,0, - 115,8,0,0,0,0,5,12,1,8,1,8,1,114,184,0, - 0,0,99,1,0,0,0,0,0,0,0,12,0,0,0,9, - 0,0,0,67,0,0,0,115,178,1,0,0,124,0,97,0, - 116,0,106,1,97,1,116,0,106,2,97,2,116,1,106,3, - 116,4,25,0,125,1,100,1,68,0,93,48,125,2,124,2, - 116,1,106,3,107,7,114,56,116,0,160,5,124,2,161,1, - 125,3,110,10,116,1,106,3,124,2,25,0,125,3,116,6, - 124,1,124,2,124,3,131,3,1,0,113,30,100,2,100,3, - 103,1,102,2,100,4,100,5,100,3,103,2,102,2,102,2, - 125,4,124,4,68,0,93,110,92,2,125,5,125,6,116,7, - 100,6,100,7,132,0,124,6,68,0,131,1,131,1,115,136, - 116,8,130,1,124,6,100,8,25,0,125,7,124,5,116,1, - 106,3,107,6,114,170,116,1,106,3,124,5,25,0,125,8, - 1,0,113,226,113,106,122,20,116,0,160,5,124,5,161,1, - 125,8,87,0,1,0,113,226,87,0,113,106,4,0,116,9, - 107,10,114,214,1,0,1,0,1,0,89,0,113,106,89,0, - 113,106,88,0,113,106,116,9,100,9,131,1,130,1,116,6, - 124,1,100,10,124,8,131,3,1,0,116,6,124,1,100,11, - 124,7,131,3,1,0,116,6,124,1,100,12,100,13,160,10, - 124,6,161,1,131,3,1,0,116,6,124,1,100,14,100,15, - 100,16,132,0,124,6,68,0,131,1,131,3,1,0,116,0, - 160,5,100,17,161,1,125,9,116,6,124,1,100,17,124,9, - 131,3,1,0,116,0,160,5,100,18,161,1,125,10,116,6, - 124,1,100,18,124,10,131,3,1,0,124,5,100,4,107,2, - 144,1,114,110,116,0,160,5,100,19,161,1,125,11,116,6, - 124,1,100,20,124,11,131,3,1,0,116,6,124,1,100,21, - 116,11,131,0,131,3,1,0,116,12,160,13,116,2,160,14, - 161,0,161,1,1,0,124,5,100,4,107,2,144,1,114,174, - 116,15,160,16,100,22,161,1,1,0,100,23,116,12,107,6, - 144,1,114,174,100,24,116,17,95,18,100,25,83,0,41,26, - 122,205,83,101,116,117,112,32,116,104,101,32,112,97,116,104, - 45,98,97,115,101,100,32,105,109,112,111,114,116,101,114,115, - 32,102,111,114,32,105,109,112,111,114,116,108,105,98,32,98, - 121,32,105,109,112,111,114,116,105,110,103,32,110,101,101,100, - 101,100,10,32,32,32,32,98,117,105,108,116,45,105,110,32, - 109,111,100,117,108,101,115,32,97,110,100,32,105,110,106,101, - 99,116,105,110,103,32,116,104,101,109,32,105,110,116,111,32, - 116,104,101,32,103,108,111,98,97,108,32,110,97,109,101,115, - 112,97,99,101,46,10,10,32,32,32,32,79,116,104,101,114, - 32,99,111,109,112,111,110,101,110,116,115,32,97,114,101,32, - 101,120,116,114,97,99,116,101,100,32,102,114,111,109,32,116, - 104,101,32,99,111,114,101,32,98,111,111,116,115,116,114,97, - 112,32,109,111,100,117,108,101,46,10,10,32,32,32,32,41, - 4,114,64,0,0,0,114,75,0,0,0,218,8,98,117,105, - 108,116,105,110,115,114,160,0,0,0,90,5,112,111,115,105, - 120,250,1,47,90,2,110,116,250,1,92,99,1,0,0,0, - 0,0,0,0,2,0,0,0,3,0,0,0,115,0,0,0, - 115,26,0,0,0,124,0,93,18,125,1,116,0,124,1,131, - 1,100,0,107,2,86,0,1,0,113,2,100,1,83,0,41, - 2,114,39,0,0,0,78,41,1,114,22,0,0,0,41,2, - 114,32,0,0,0,114,95,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,19,1,0,0,31,6, - 0,0,115,4,0,0,0,4,0,2,0,122,25,95,115,101, - 116,117,112,46,60,108,111,99,97,108,115,62,46,60,103,101, - 110,101,120,112,114,62,114,73,0,0,0,122,30,105,109,112, - 111,114,116,108,105,98,32,114,101,113,117,105,114,101,115,32, - 112,111,115,105,120,32,111,114,32,110,116,114,2,0,0,0, - 114,35,0,0,0,114,31,0,0,0,114,40,0,0,0,114, - 58,0,0,0,99,1,0,0,0,0,0,0,0,2,0,0, - 0,4,0,0,0,83,0,0,0,115,22,0,0,0,104,0, - 124,0,93,14,125,1,100,0,124,1,155,0,157,2,146,2, - 113,4,83,0,41,1,114,74,0,0,0,114,3,0,0,0, - 41,2,114,32,0,0,0,218,1,115,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,66,1,0,0,47,6, - 0,0,115,4,0,0,0,6,0,2,0,122,25,95,115,101, - 116,117,112,46,60,108,111,99,97,108,115,62,46,60,115,101, - 116,99,111,109,112,62,90,7,95,116,104,114,101,97,100,90, - 8,95,119,101,97,107,114,101,102,90,6,119,105,110,114,101, - 103,114,192,0,0,0,114,7,0,0,0,122,4,46,112,121, - 119,122,6,95,100,46,112,121,100,84,78,41,19,114,134,0, - 0,0,114,8,0,0,0,114,163,0,0,0,114,31,1,0, - 0,114,125,0,0,0,90,18,95,98,117,105,108,116,105,110, - 95,102,114,111,109,95,110,97,109,101,114,129,0,0,0,218, - 3,97,108,108,114,23,0,0,0,114,118,0,0,0,114,36, - 0,0,0,114,13,0,0,0,114,21,1,0,0,114,167,0, - 0,0,114,78,1,0,0,114,102,0,0,0,114,186,0,0, - 0,114,191,0,0,0,114,195,0,0,0,41,12,218,17,95, - 98,111,111,116,115,116,114,97,112,95,109,111,100,117,108,101, - 90,11,115,101,108,102,95,109,111,100,117,108,101,90,12,98, - 117,105,108,116,105,110,95,110,97,109,101,90,14,98,117,105, - 108,116,105,110,95,109,111,100,117,108,101,90,10,111,115,95, - 100,101,116,97,105,108,115,90,10,98,117,105,108,116,105,110, - 95,111,115,114,31,0,0,0,114,35,0,0,0,90,9,111, - 115,95,109,111,100,117,108,101,90,13,116,104,114,101,97,100, - 95,109,111,100,117,108,101,90,14,119,101,97,107,114,101,102, - 95,109,111,100,117,108,101,90,13,119,105,110,114,101,103,95, - 109,111,100,117,108,101,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,6,95,115,101,116,117,112,6,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,85,1,0,0,99,1,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,85,1,0,0,114,184,0,0,0,114, - 8,0,0,0,114,49,1,0,0,114,167,0,0,0,114,57, - 1,0,0,114,72,1,0,0,218,9,109,101,116,97,95,112, - 97,116,104,114,186,0,0,0,114,43,1,0,0,41,2,114, - 84,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, - 71,6,0,0,115,8,0,0,0,0,2,8,1,6,1,20, - 1,114,87,1,0,0,41,63,114,127,0,0,0,114,12,0, - 0,0,90,37,95,67,65,83,69,95,73,78,83,69,78,83, - 73,84,73,86,69,95,80,76,65,84,70,79,82,77,83,95, - 66,89,84,69,83,95,75,69,89,114,11,0,0,0,114,13, - 0,0,0,114,20,0,0,0,114,27,0,0,0,114,29,0, - 0,0,114,38,0,0,0,114,47,0,0,0,114,49,0,0, - 0,114,53,0,0,0,114,54,0,0,0,114,56,0,0,0, - 114,59,0,0,0,114,69,0,0,0,218,4,116,121,112,101, - 218,8,95,95,99,111,100,101,95,95,114,162,0,0,0,114, - 18,0,0,0,114,148,0,0,0,114,17,0,0,0,114,24, - 0,0,0,114,236,0,0,0,114,92,0,0,0,114,88,0, - 0,0,114,102,0,0,0,114,89,0,0,0,90,23,68,69, - 66,85,71,95,66,89,84,69,67,79,68,69,95,83,85,70, - 70,73,88,69,83,90,27,79,80,84,73,77,73,90,69,68, - 95,66,89,84,69,67,79,68,69,95,83,85,70,70,73,88, - 69,83,114,98,0,0,0,114,103,0,0,0,114,109,0,0, - 0,114,113,0,0,0,114,115,0,0,0,114,136,0,0,0, - 114,143,0,0,0,114,152,0,0,0,114,156,0,0,0,114, - 158,0,0,0,114,165,0,0,0,114,170,0,0,0,114,171, - 0,0,0,114,176,0,0,0,218,6,111,98,106,101,99,116, - 114,185,0,0,0,114,190,0,0,0,114,191,0,0,0,114, - 208,0,0,0,114,221,0,0,0,114,239,0,0,0,114,8, - 1,0,0,114,14,1,0,0,114,21,1,0,0,114,15,1, - 0,0,114,22,1,0,0,114,41,1,0,0,114,43,1,0, - 0,114,57,1,0,0,114,77,1,0,0,114,184,0,0,0, - 114,85,1,0,0,114,87,1,0,0,114,3,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,8, - 60,109,111,100,117,108,101,62,1,0,0,0,115,126,0,0, - 0,4,22,4,1,4,1,2,1,2,255,4,4,8,17,8, - 5,8,5,8,6,8,6,8,12,8,10,8,9,8,5,8, - 7,8,9,12,22,10,127,0,7,16,1,12,2,4,1,4, - 2,6,2,6,2,8,2,18,71,8,40,8,19,8,12,8, - 12,8,28,8,17,8,33,8,28,8,24,16,13,14,10,12, - 11,8,14,6,3,6,1,2,255,12,68,14,64,14,29,16, - 127,0,17,14,68,18,45,18,26,4,3,18,53,14,60,14, - 42,14,127,0,7,14,127,0,22,12,23,8,11,8,65, + 0,114,203,0,0,0,44,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,4,0,0,0,4,0,0,0, + 67,0,0,0,115,30,0,0,0,124,0,160,0,124,1,124, + 2,161,2,125,3,124,3,100,1,107,8,114,24,100,1,83, + 0,124,3,106,1,83,0,41,2,122,170,102,105,110,100,32, + 116,104,101,32,109,111,100,117,108,101,32,111,110,32,115,121, + 115,46,112,97,116,104,32,111,114,32,39,112,97,116,104,39, + 32,98,97,115,101,100,32,111,110,32,115,121,115,46,112,97, + 116,104,95,104,111,111,107,115,32,97,110,100,10,32,32,32, + 32,32,32,32,32,115,121,115,46,112,97,116,104,95,105,109, + 112,111,114,116,101,114,95,99,97,99,104,101,46,10,10,32, + 32,32,32,32,32,32,32,84,104,105,115,32,109,101,116,104, + 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, + 46,32,32,85,115,101,32,102,105,110,100,95,115,112,101,99, + 40,41,32,105,110,115,116,101,97,100,46,10,10,32,32,32, + 32,32,32,32,32,78,114,204,0,0,0,114,205,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 206,0,0,0,68,5,0,0,115,8,0,0,0,0,8,12, + 1,8,1,4,1,122,22,80,97,116,104,70,105,110,100,101, + 114,46,102,105,110,100,95,109,111,100,117,108,101,41,1,78, + 41,2,78,78,41,1,78,41,12,114,125,0,0,0,114,124, + 0,0,0,114,126,0,0,0,114,127,0,0,0,114,207,0, + 0,0,114,46,1,0,0,114,52,1,0,0,114,54,1,0, + 0,114,55,1,0,0,114,58,1,0,0,114,203,0,0,0, + 114,206,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,45,1,0,0,204,4, + 0,0,115,30,0,0,0,8,2,4,2,2,1,10,9,2, + 1,10,12,2,1,10,21,2,1,10,14,2,1,12,31,2, + 1,12,23,2,1,114,45,1,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,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,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,2, + 0,0,0,3,0,0,0,51,0,0,0,115,22,0,0,0, + 124,0,93,14,125,1,124,1,136,0,102,2,86,0,1,0, + 113,2,100,0,83,0,114,110,0,0,0,114,3,0,0,0, + 114,16,1,0,0,169,1,114,140,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,19,1,0,0,97,5,0,0,115, + 4,0,0,0,4,0,2,0,122,38,70,105,108,101,70,105, + 110,100,101,114,46,95,95,105,110,105,116,95,95,46,60,108, + 111,99,97,108,115,62,46,60,103,101,110,101,120,112,114,62, + 114,71,0,0,0,114,105,0,0,0,78,41,7,114,167,0, + 0,0,218,8,95,108,111,97,100,101,114,115,114,44,0,0, + 0,218,11,95,112,97,116,104,95,109,116,105,109,101,218,3, + 115,101,116,218,11,95,112,97,116,104,95,99,97,99,104,101, + 218,19,95,114,101,108,97,120,101,100,95,112,97,116,104,95, + 99,97,99,104,101,41,5,114,119,0,0,0,114,44,0,0, + 0,218,14,108,111,97,100,101,114,95,100,101,116,97,105,108, + 115,90,7,108,111,97,100,101,114,115,114,189,0,0,0,114, + 3,0,0,0,114,60,1,0,0,114,6,0,0,0,114,209, + 0,0,0,91,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,1,0,0,0,2,0, + 0,0,67,0,0,0,115,10,0,0,0,100,1,124,0,95, + 0,100,2,83,0,41,3,122,31,73,110,118,97,108,105,100, + 97,116,101,32,116,104,101,32,100,105,114,101,99,116,111,114, + 121,32,109,116,105,109,101,46,114,105,0,0,0,78,41,1, + 114,62,1,0,0,114,246,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,46,1,0,0,105,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, + 3,0,0,0,3,0,0,0,67,0,0,0,115,42,0,0, + 0,124,0,160,0,124,1,161,1,125,2,124,2,100,1,107, + 8,114,26,100,1,103,0,102,2,83,0,124,2,106,1,124, + 2,106,2,112,38,103,0,102,2,83,0,41,2,122,197,84, + 114,121,32,116,111,32,102,105,110,100,32,97,32,108,111,97, + 100,101,114,32,102,111,114,32,116,104,101,32,115,112,101,99, + 105,102,105,101,100,32,109,111,100,117,108,101,44,32,111,114, + 32,116,104,101,32,110,97,109,101,115,112,97,99,101,10,32, + 32,32,32,32,32,32,32,112,97,99,107,97,103,101,32,112, + 111,114,116,105,111,110,115,46,32,82,101,116,117,114,110,115, + 32,40,108,111,97,100,101,114,44,32,108,105,115,116,45,111, + 102,45,112,111,114,116,105,111,110,115,41,46,10,10,32,32, + 32,32,32,32,32,32,84,104,105,115,32,109,101,116,104,111, + 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, + 32,32,85,115,101,32,102,105,110,100,95,115,112,101,99,40, + 41,32,105,110,115,116,101,97,100,46,10,10,32,32,32,32, + 32,32,32,32,78,41,3,114,203,0,0,0,114,140,0,0, + 0,114,178,0,0,0,41,3,114,119,0,0,0,114,139,0, + 0,0,114,187,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,137,0,0,0,111,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,7,0,0, + 0,6,0,0,0,67,0,0,0,115,26,0,0,0,124,1, + 124,2,124,3,131,2,125,6,116,0,124,2,124,3,124,6, + 124,4,100,1,141,4,83,0,41,2,78,114,177,0,0,0, + 41,1,114,190,0,0,0,41,7,114,119,0,0,0,114,188, + 0,0,0,114,139,0,0,0,114,44,0,0,0,90,4,115, + 109,115,108,114,202,0,0,0,114,140,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,58,1,0, + 0,123,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,14,0,0,0,8,0,0,0,67,0,0,0,115,102, + 1,0,0,100,1,125,3,124,1,160,0,100,2,161,1,100, + 3,25,0,125,4,122,24,116,1,124,0,106,2,112,34,116, + 3,160,4,161,0,131,1,106,5,125,5,87,0,110,24,4, + 0,116,6,107,10,114,66,1,0,1,0,1,0,100,4,125, + 5,89,0,110,2,88,0,124,5,124,0,106,7,107,3,114, + 92,124,0,160,8,161,0,1,0,124,5,124,0,95,7,116, + 9,131,0,114,114,124,0,106,10,125,6,124,4,160,11,161, + 0,125,7,110,10,124,0,106,12,125,6,124,4,125,7,124, + 7,124,6,107,6,114,218,116,13,124,0,106,2,124,4,131, + 2,125,8,124,0,106,14,68,0,93,58,92,2,125,9,125, + 10,100,5,124,9,23,0,125,11,116,13,124,8,124,11,131, + 2,125,12,116,15,124,12,131,1,114,208,124,0,160,16,124, + 10,124,1,124,12,124,8,103,1,124,2,161,5,2,0,1, + 0,83,0,113,150,116,17,124,8,131,1,125,3,124,0,106, + 14,68,0,93,86,92,2,125,9,125,10,116,13,124,0,106, + 2,124,4,124,9,23,0,131,2,125,12,116,18,106,19,100, + 6,124,12,100,3,100,7,141,3,1,0,124,7,124,9,23, + 0,124,6,107,6,144,1,114,54,116,15,124,12,131,1,144, + 1,114,54,124,0,160,16,124,10,124,1,124,12,100,8,124, + 2,161,5,2,0,1,0,83,0,113,224,124,3,144,1,114, + 98,116,18,160,19,100,9,124,8,161,2,1,0,116,18,160, + 20,124,1,100,8,161,2,125,13,124,8,103,1,124,13,95, + 21,124,13,83,0,100,8,83,0,41,10,122,111,84,114,121, + 32,116,111,32,102,105,110,100,32,97,32,115,112,101,99,32, + 102,111,114,32,116,104,101,32,115,112,101,99,105,102,105,101, + 100,32,109,111,100,117,108,101,46,10,10,32,32,32,32,32, + 32,32,32,82,101,116,117,114,110,115,32,116,104,101,32,109, + 97,116,99,104,105,110,103,32,115,112,101,99,44,32,111,114, + 32,78,111,110,101,32,105,102,32,110,111,116,32,102,111,117, + 110,100,46,10,32,32,32,32,32,32,32,32,70,114,71,0, + 0,0,114,28,0,0,0,114,105,0,0,0,114,209,0,0, + 0,122,9,116,114,121,105,110,103,32,123,125,41,1,90,9, + 118,101,114,98,111,115,105,116,121,78,122,25,112,111,115,115, + 105,98,108,101,32,110,97,109,101,115,112,97,99,101,32,102, + 111,114,32,123,125,41,22,114,41,0,0,0,114,49,0,0, + 0,114,44,0,0,0,114,2,0,0,0,114,55,0,0,0, + 114,9,1,0,0,114,50,0,0,0,114,62,1,0,0,218, + 11,95,102,105,108,108,95,99,97,99,104,101,114,7,0,0, + 0,114,65,1,0,0,114,106,0,0,0,114,64,1,0,0, + 114,38,0,0,0,114,61,1,0,0,114,54,0,0,0,114, + 58,1,0,0,114,56,0,0,0,114,134,0,0,0,114,149, + 0,0,0,114,183,0,0,0,114,178,0,0,0,41,14,114, + 119,0,0,0,114,139,0,0,0,114,202,0,0,0,90,12, + 105,115,95,110,97,109,101,115,112,97,99,101,90,11,116,97, + 105,108,95,109,111,100,117,108,101,114,169,0,0,0,90,5, + 99,97,99,104,101,90,12,99,97,99,104,101,95,109,111,100, + 117,108,101,90,9,98,97,115,101,95,112,97,116,104,114,17, + 1,0,0,114,188,0,0,0,90,13,105,110,105,116,95,102, + 105,108,101,110,97,109,101,90,9,102,117,108,108,95,112,97, + 116,104,114,187,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,203,0,0,0,128,5,0,0,115, + 74,0,0,0,0,5,4,1,14,1,2,1,24,1,14,1, + 10,1,10,1,8,1,6,2,6,1,6,1,10,2,6,1, + 4,2,8,1,12,1,14,1,8,1,10,1,8,1,26,4, + 8,2,14,1,16,1,16,1,14,1,10,1,10,1,2,0, + 2,255,10,2,6,1,12,1,12,1,8,1,4,1,122,20, + 70,105,108,101,70,105,110,100,101,114,46,102,105,110,100,95, + 115,112,101,99,99,1,0,0,0,0,0,0,0,9,0,0, + 0,10,0,0,0,67,0,0,0,115,190,0,0,0,124,0, + 106,0,125,1,122,22,116,1,160,2,124,1,112,22,116,1, + 160,3,161,0,161,1,125,2,87,0,110,30,4,0,116,4, + 116,5,116,6,102,3,107,10,114,58,1,0,1,0,1,0, + 103,0,125,2,89,0,110,2,88,0,116,7,106,8,160,9, + 100,1,161,1,115,84,116,10,124,2,131,1,124,0,95,11, + 110,74,116,10,131,0,125,3,124,2,68,0,93,56,125,4, + 124,4,160,12,100,2,161,1,92,3,125,5,125,6,125,7, + 124,6,114,136,100,3,160,13,124,5,124,7,160,14,161,0, + 161,2,125,8,110,4,124,5,125,8,124,3,160,15,124,8, + 161,1,1,0,113,94,124,3,124,0,95,11,116,7,106,8, + 160,9,116,16,161,1,114,186,100,4,100,5,132,0,124,2, + 68,0,131,1,124,0,95,17,100,6,83,0,41,7,122,68, + 70,105,108,108,32,116,104,101,32,99,97,99,104,101,32,111, + 102,32,112,111,116,101,110,116,105,97,108,32,109,111,100,117, + 108,101,115,32,97,110,100,32,112,97,99,107,97,103,101,115, + 32,102,111,114,32,116,104,105,115,32,100,105,114,101,99,116, + 111,114,121,46,114,0,0,0,0,114,71,0,0,0,114,61, + 0,0,0,99,1,0,0,0,0,0,0,0,2,0,0,0, + 4,0,0,0,83,0,0,0,115,20,0,0,0,104,0,124, + 0,93,12,125,1,124,1,160,0,161,0,146,2,113,4,83, + 0,114,3,0,0,0,41,1,114,106,0,0,0,41,2,114, + 32,0,0,0,90,2,102,110,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,218,9,60,115,101,116,99,111,109, + 112,62,205,5,0,0,115,4,0,0,0,6,0,2,0,122, + 41,70,105,108,101,70,105,110,100,101,114,46,95,102,105,108, + 108,95,99,97,99,104,101,46,60,108,111,99,97,108,115,62, + 46,60,115,101,116,99,111,109,112,62,78,41,18,114,44,0, + 0,0,114,2,0,0,0,114,6,1,0,0,114,55,0,0, + 0,114,2,1,0,0,218,15,80,101,114,109,105,115,115,105, + 111,110,69,114,114,111,114,218,18,78,111,116,65,68,105,114, + 101,99,116,111,114,121,69,114,114,111,114,114,8,0,0,0, + 114,9,0,0,0,114,10,0,0,0,114,63,1,0,0,114, + 64,1,0,0,114,101,0,0,0,114,62,0,0,0,114,106, + 0,0,0,218,3,97,100,100,114,11,0,0,0,114,65,1, + 0,0,41,9,114,119,0,0,0,114,44,0,0,0,114,7, + 1,0,0,90,21,108,111,119,101,114,95,115,117,102,102,105, + 120,95,99,111,110,116,101,110,116,115,114,41,1,0,0,114, + 117,0,0,0,114,29,1,0,0,114,17,1,0,0,90,8, + 110,101,119,95,110,97,109,101,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,67,1,0,0,176,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,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,1, + 0,0,0,4,0,0,0,19,0,0,0,115,34,0,0,0, + 116,0,124,0,131,1,115,20,116,1,100,1,124,0,100,2, + 141,2,130,1,136,0,124,0,102,1,136,1,158,2,142,0, + 83,0,41,3,122,45,80,97,116,104,32,104,111,111,107,32, + 102,111,114,32,105,109,112,111,114,116,108,105,98,46,109,97, + 99,104,105,110,101,114,121,46,70,105,108,101,70,105,110,100, + 101,114,46,122,30,111,110,108,121,32,100,105,114,101,99,116, + 111,114,105,101,115,32,97,114,101,32,115,117,112,112,111,114, + 116,101,100,114,48,0,0,0,41,2,114,56,0,0,0,114, + 118,0,0,0,114,48,0,0,0,169,2,114,193,0,0,0, + 114,66,1,0,0,114,3,0,0,0,114,6,0,0,0,218, + 24,112,97,116,104,95,104,111,111,107,95,102,111,114,95,70, + 105,108,101,70,105,110,100,101,114,217,5,0,0,115,6,0, + 0,0,0,2,8,1,12,1,122,54,70,105,108,101,70,105, + 110,100,101,114,46,112,97,116,104,95,104,111,111,107,46,60, + 108,111,99,97,108,115,62,46,112,97,116,104,95,104,111,111, + 107,95,102,111,114,95,70,105,108,101,70,105,110,100,101,114, + 114,3,0,0,0,41,3,114,193,0,0,0,114,66,1,0, + 0,114,73,1,0,0,114,3,0,0,0,114,72,1,0,0, + 114,6,0,0,0,218,9,112,97,116,104,95,104,111,111,107, + 207,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,1,0,0,0, + 3,0,0,0,67,0,0,0,115,12,0,0,0,100,1,160, + 0,124,0,106,1,161,1,83,0,41,2,78,122,16,70,105, + 108,101,70,105,110,100,101,114,40,123,33,114,125,41,41,2, + 114,62,0,0,0,114,44,0,0,0,114,246,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,39, + 1,0,0,225,5,0,0,115,2,0,0,0,0,1,122,19, + 70,105,108,101,70,105,110,100,101,114,46,95,95,114,101,112, + 114,95,95,41,1,78,41,15,114,125,0,0,0,114,124,0, + 0,0,114,126,0,0,0,114,127,0,0,0,114,209,0,0, + 0,114,46,1,0,0,114,143,0,0,0,114,206,0,0,0, + 114,137,0,0,0,114,58,1,0,0,114,203,0,0,0,114, + 67,1,0,0,114,207,0,0,0,114,74,1,0,0,114,39, + 1,0,0,114,3,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,59,1,0,0,82,5,0,0, + 115,22,0,0,0,8,2,4,7,8,14,8,4,4,2,8, + 12,8,5,10,48,8,31,2,1,10,17,114,59,1,0,0, + 99,4,0,0,0,0,0,0,0,6,0,0,0,8,0,0, + 0,67,0,0,0,115,146,0,0,0,124,0,160,0,100,1, + 161,1,125,4,124,0,160,0,100,2,161,1,125,5,124,4, + 115,66,124,5,114,36,124,5,106,1,125,4,110,30,124,2, + 124,3,107,2,114,56,116,2,124,1,124,2,131,2,125,4, + 110,10,116,3,124,1,124,2,131,2,125,4,124,5,115,84, + 116,4,124,1,124,2,124,4,100,3,141,3,125,5,122,36, + 124,5,124,0,100,2,60,0,124,4,124,0,100,1,60,0, + 124,2,124,0,100,4,60,0,124,3,124,0,100,5,60,0, + 87,0,110,20,4,0,116,5,107,10,114,140,1,0,1,0, + 1,0,89,0,110,2,88,0,100,0,83,0,41,6,78,218, + 10,95,95,108,111,97,100,101,114,95,95,218,8,95,95,115, + 112,101,99,95,95,114,60,1,0,0,90,8,95,95,102,105, + 108,101,95,95,90,10,95,95,99,97,99,104,101,100,95,95, + 41,6,218,3,103,101,116,114,140,0,0,0,114,14,1,0, + 0,114,8,1,0,0,114,190,0,0,0,218,9,69,120,99, + 101,112,116,105,111,110,41,6,90,2,110,115,114,117,0,0, + 0,90,8,112,97,116,104,110,97,109,101,90,9,99,112,97, + 116,104,110,97,109,101,114,140,0,0,0,114,187,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, + 14,95,102,105,120,95,117,112,95,109,111,100,117,108,101,231, + 5,0,0,115,34,0,0,0,0,2,10,1,10,1,4,1, + 4,1,8,1,8,1,12,2,10,1,4,1,14,1,2,1, + 8,1,8,1,8,1,12,1,14,2,114,79,1,0,0,99, + 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, + 67,0,0,0,115,38,0,0,0,116,0,116,1,160,2,161, + 0,102,2,125,0,116,3,116,4,102,2,125,1,116,5,116, + 6,102,2,125,2,124,0,124,1,124,2,103,3,83,0,41, + 1,122,95,82,101,116,117,114,110,115,32,97,32,108,105,115, + 116,32,111,102,32,102,105,108,101,45,98,97,115,101,100,32, + 109,111,100,117,108,101,32,108,111,97,100,101,114,115,46,10, + 10,32,32,32,32,69,97,99,104,32,105,116,101,109,32,105, + 115,32,97,32,116,117,112,108,101,32,40,108,111,97,100,101, + 114,44,32,115,117,102,102,105,120,101,115,41,46,10,32,32, + 32,32,41,7,114,15,1,0,0,114,163,0,0,0,218,18, + 101,120,116,101,110,115,105,111,110,95,115,117,102,102,105,120, + 101,115,114,8,1,0,0,114,102,0,0,0,114,14,1,0, + 0,114,89,0,0,0,41,3,90,10,101,120,116,101,110,115, + 105,111,110,115,90,6,115,111,117,114,99,101,90,8,98,121, + 116,101,99,111,100,101,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,114,184,0,0,0,254,5,0,0,115,8, + 0,0,0,0,5,12,1,8,1,8,1,114,184,0,0,0, + 99,1,0,0,0,0,0,0,0,12,0,0,0,9,0,0, + 0,67,0,0,0,115,178,1,0,0,124,0,97,0,116,0, + 106,1,97,1,116,0,106,2,97,2,116,1,106,3,116,4, + 25,0,125,1,100,1,68,0,93,48,125,2,124,2,116,1, + 106,3,107,7,114,56,116,0,160,5,124,2,161,1,125,3, + 110,10,116,1,106,3,124,2,25,0,125,3,116,6,124,1, + 124,2,124,3,131,3,1,0,113,30,100,2,100,3,103,1, + 102,2,100,4,100,5,100,3,103,2,102,2,102,2,125,4, + 124,4,68,0,93,110,92,2,125,5,125,6,116,7,100,6, + 100,7,132,0,124,6,68,0,131,1,131,1,115,136,116,8, + 130,1,124,6,100,8,25,0,125,7,124,5,116,1,106,3, + 107,6,114,170,116,1,106,3,124,5,25,0,125,8,1,0, + 113,226,113,106,122,20,116,0,160,5,124,5,161,1,125,8, + 87,0,1,0,113,226,87,0,113,106,4,0,116,9,107,10, + 114,214,1,0,1,0,1,0,89,0,113,106,89,0,113,106, + 88,0,113,106,116,9,100,9,131,1,130,1,116,6,124,1, + 100,10,124,8,131,3,1,0,116,6,124,1,100,11,124,7, + 131,3,1,0,116,6,124,1,100,12,100,13,160,10,124,6, + 161,1,131,3,1,0,116,6,124,1,100,14,100,15,100,16, + 132,0,124,6,68,0,131,1,131,3,1,0,116,0,160,5, + 100,17,161,1,125,9,116,6,124,1,100,17,124,9,131,3, + 1,0,116,0,160,5,100,18,161,1,125,10,116,6,124,1, + 100,18,124,10,131,3,1,0,124,5,100,4,107,2,144,1, + 114,110,116,0,160,5,100,19,161,1,125,11,116,6,124,1, + 100,20,124,11,131,3,1,0,116,6,124,1,100,21,116,11, + 131,0,131,3,1,0,116,12,160,13,116,2,160,14,161,0, + 161,1,1,0,124,5,100,4,107,2,144,1,114,174,116,15, + 160,16,100,22,161,1,1,0,100,23,116,12,107,6,144,1, + 114,174,100,24,116,17,95,18,100,25,83,0,41,26,122,205, + 83,101,116,117,112,32,116,104,101,32,112,97,116,104,45,98, + 97,115,101,100,32,105,109,112,111,114,116,101,114,115,32,102, + 111,114,32,105,109,112,111,114,116,108,105,98,32,98,121,32, + 105,109,112,111,114,116,105,110,103,32,110,101,101,100,101,100, + 10,32,32,32,32,98,117,105,108,116,45,105,110,32,109,111, + 100,117,108,101,115,32,97,110,100,32,105,110,106,101,99,116, + 105,110,103,32,116,104,101,109,32,105,110,116,111,32,116,104, + 101,32,103,108,111,98,97,108,32,110,97,109,101,115,112,97, + 99,101,46,10,10,32,32,32,32,79,116,104,101,114,32,99, + 111,109,112,111,110,101,110,116,115,32,97,114,101,32,101,120, + 116,114,97,99,116,101,100,32,102,114,111,109,32,116,104,101, + 32,99,111,114,101,32,98,111,111,116,115,116,114,97,112,32, + 109,111,100,117,108,101,46,10,10,32,32,32,32,41,4,114, + 64,0,0,0,114,75,0,0,0,218,8,98,117,105,108,116, + 105,110,115,114,160,0,0,0,90,5,112,111,115,105,120,250, + 1,47,90,2,110,116,250,1,92,99,1,0,0,0,0,0, + 0,0,2,0,0,0,3,0,0,0,115,0,0,0,115,26, + 0,0,0,124,0,93,18,125,1,116,0,124,1,131,1,100, + 0,107,2,86,0,1,0,113,2,100,1,83,0,41,2,114, + 39,0,0,0,78,41,1,114,22,0,0,0,41,2,114,32, + 0,0,0,114,95,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,19,1,0,0,34,6,0,0, + 115,4,0,0,0,4,0,2,0,122,25,95,115,101,116,117, + 112,46,60,108,111,99,97,108,115,62,46,60,103,101,110,101, + 120,112,114,62,114,73,0,0,0,122,30,105,109,112,111,114, + 116,108,105,98,32,114,101,113,117,105,114,101,115,32,112,111, + 115,105,120,32,111,114,32,110,116,114,2,0,0,0,114,35, + 0,0,0,114,31,0,0,0,114,40,0,0,0,114,58,0, + 0,0,99,1,0,0,0,0,0,0,0,2,0,0,0,4, + 0,0,0,83,0,0,0,115,22,0,0,0,104,0,124,0, + 93,14,125,1,100,0,124,1,155,0,157,2,146,2,113,4, + 83,0,41,1,114,74,0,0,0,114,3,0,0,0,41,2, + 114,32,0,0,0,218,1,115,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,68,1,0,0,50,6,0,0, + 115,4,0,0,0,6,0,2,0,122,25,95,115,101,116,117, + 112,46,60,108,111,99,97,108,115,62,46,60,115,101,116,99, + 111,109,112,62,90,7,95,116,104,114,101,97,100,90,8,95, + 119,101,97,107,114,101,102,90,6,119,105,110,114,101,103,114, + 192,0,0,0,114,7,0,0,0,122,4,46,112,121,119,122, + 6,95,100,46,112,121,100,84,78,41,19,114,134,0,0,0, + 114,8,0,0,0,114,163,0,0,0,114,31,1,0,0,114, + 125,0,0,0,90,18,95,98,117,105,108,116,105,110,95,102, + 114,111,109,95,110,97,109,101,114,129,0,0,0,218,3,97, + 108,108,114,23,0,0,0,114,118,0,0,0,114,36,0,0, + 0,114,13,0,0,0,114,21,1,0,0,114,167,0,0,0, + 114,80,1,0,0,114,102,0,0,0,114,186,0,0,0,114, + 191,0,0,0,114,195,0,0,0,41,12,218,17,95,98,111, + 111,116,115,116,114,97,112,95,109,111,100,117,108,101,90,11, + 115,101,108,102,95,109,111,100,117,108,101,90,12,98,117,105, + 108,116,105,110,95,110,97,109,101,90,14,98,117,105,108,116, + 105,110,95,109,111,100,117,108,101,90,10,111,115,95,100,101, + 116,97,105,108,115,90,10,98,117,105,108,116,105,110,95,111, + 115,114,31,0,0,0,114,35,0,0,0,90,9,111,115,95, + 109,111,100,117,108,101,90,13,116,104,114,101,97,100,95,109, + 111,100,117,108,101,90,14,119,101,97,107,114,101,102,95,109, + 111,100,117,108,101,90,13,119,105,110,114,101,103,95,109,111, + 100,117,108,101,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,218,6,95,115,101,116,117,112,9,6,0,0,115, + 78,0,0,0,0,8,4,1,6,1,6,3,10,1,8,1, + 10,1,12,2,10,1,14,3,22,1,12,2,22,1,8,1, + 10,1,10,1,6,2,2,1,10,1,10,1,14,1,12,2, + 8,1,12,1,12,1,18,1,22,3,10,1,12,3,10,1, + 12,3,10,1,10,1,12,3,14,1,14,1,10,1,10,1, + 10,1,114,87,1,0,0,99,1,0,0,0,0,0,0,0, + 2,0,0,0,4,0,0,0,67,0,0,0,115,50,0,0, + 0,116,0,124,0,131,1,1,0,116,1,131,0,125,1,116, + 2,106,3,160,4,116,5,106,6,124,1,142,0,103,1,161, + 1,1,0,116,2,106,7,160,8,116,9,161,1,1,0,100, + 1,83,0,41,2,122,41,73,110,115,116,97,108,108,32,116, + 104,101,32,112,97,116,104,45,98,97,115,101,100,32,105,109, + 112,111,114,116,32,99,111,109,112,111,110,101,110,116,115,46, + 78,41,10,114,87,1,0,0,114,184,0,0,0,114,8,0, + 0,0,114,51,1,0,0,114,167,0,0,0,114,59,1,0, + 0,114,74,1,0,0,218,9,109,101,116,97,95,112,97,116, + 104,114,186,0,0,0,114,45,1,0,0,41,2,114,86,1, + 0,0,90,17,115,117,112,112,111,114,116,101,100,95,108,111, + 97,100,101,114,115,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,218,8,95,105,110,115,116,97,108,108,74,6, + 0,0,115,8,0,0,0,0,2,8,1,6,1,20,1,114, + 89,1,0,0,41,63,114,127,0,0,0,114,12,0,0,0, + 90,37,95,67,65,83,69,95,73,78,83,69,78,83,73,84, + 73,86,69,95,80,76,65,84,70,79,82,77,83,95,66,89, + 84,69,83,95,75,69,89,114,11,0,0,0,114,13,0,0, + 0,114,20,0,0,0,114,27,0,0,0,114,29,0,0,0, + 114,38,0,0,0,114,47,0,0,0,114,49,0,0,0,114, + 53,0,0,0,114,54,0,0,0,114,56,0,0,0,114,59, + 0,0,0,114,69,0,0,0,218,4,116,121,112,101,218,8, + 95,95,99,111,100,101,95,95,114,162,0,0,0,114,18,0, + 0,0,114,148,0,0,0,114,17,0,0,0,114,24,0,0, + 0,114,236,0,0,0,114,92,0,0,0,114,88,0,0,0, + 114,102,0,0,0,114,89,0,0,0,90,23,68,69,66,85, + 71,95,66,89,84,69,67,79,68,69,95,83,85,70,70,73, + 88,69,83,90,27,79,80,84,73,77,73,90,69,68,95,66, + 89,84,69,67,79,68,69,95,83,85,70,70,73,88,69,83, + 114,98,0,0,0,114,103,0,0,0,114,109,0,0,0,114, + 113,0,0,0,114,115,0,0,0,114,136,0,0,0,114,143, + 0,0,0,114,152,0,0,0,114,156,0,0,0,114,158,0, + 0,0,114,165,0,0,0,114,170,0,0,0,114,171,0,0, + 0,114,176,0,0,0,218,6,111,98,106,101,99,116,114,185, + 0,0,0,114,190,0,0,0,114,191,0,0,0,114,208,0, + 0,0,114,221,0,0,0,114,239,0,0,0,114,8,1,0, + 0,114,14,1,0,0,114,21,1,0,0,114,15,1,0,0, + 114,22,1,0,0,114,43,1,0,0,114,45,1,0,0,114, + 59,1,0,0,114,79,1,0,0,114,184,0,0,0,114,87, + 1,0,0,114,89,1,0,0,114,3,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,8,60,109, + 111,100,117,108,101,62,1,0,0,0,115,126,0,0,0,4, + 22,4,1,4,1,2,1,2,255,4,4,8,17,8,5,8, + 5,8,6,8,6,8,12,8,10,8,9,8,5,8,7,8, + 9,12,22,10,127,0,7,16,1,12,2,4,1,4,2,6, + 2,6,2,8,2,18,71,8,40,8,19,8,12,8,12,8, + 28,8,17,8,33,8,28,8,24,16,13,14,10,12,11,8, + 14,6,3,6,1,2,255,12,68,14,64,14,29,16,127,0, + 17,14,68,18,45,18,26,4,3,18,53,14,63,14,42,14, + 127,0,7,14,127,0,22,12,23,8,11,8,65, }; From webhook-mailer at python.org Fri Mar 8 14:07:00 2019 From: webhook-mailer at python.org (Eric Snow) Date: Fri, 08 Mar 2019 19:07:00 -0000 Subject: [Python-checkins] Fix the Py_atomic_* macros. (#12240) Message-ID: https://github.com/python/cpython/commit/2aab5d310ca752912d5e2f79658edb6684f928c7 commit: 2aab5d310ca752912d5e2f79658edb6684f928c7 branch: master author: Eric Snow committer: GitHub date: 2019-03-08T12:06:56-07:00 summary: Fix the Py_atomic_* macros. (#12240) The macros were working only because our usage happened to parse correctly. Changing that usage (e.g. with pointers) would break the macros. This fixes that. files: M Include/internal/pycore_atomic.h diff --git a/Include/internal/pycore_atomic.h b/Include/internal/pycore_atomic.h index 5669f71b941f..7aa7eed6f7c2 100644 --- a/Include/internal/pycore_atomic.h +++ b/Include/internal/pycore_atomic.h @@ -58,10 +58,10 @@ typedef struct _Py_atomic_int { atomic_thread_fence(ORDER) #define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ - atomic_store_explicit(&(ATOMIC_VAL)->_value, NEW_VAL, ORDER) + atomic_store_explicit(&((ATOMIC_VAL)->_value), NEW_VAL, ORDER) #define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ - atomic_load_explicit(&(ATOMIC_VAL)->_value, ORDER) + atomic_load_explicit(&((ATOMIC_VAL)->_value), ORDER) /* Use builtin atomic operations in GCC >= 4.7 */ #elif defined(HAVE_BUILTIN_ATOMIC) @@ -92,14 +92,14 @@ typedef struct _Py_atomic_int { (assert((ORDER) == __ATOMIC_RELAXED \ || (ORDER) == __ATOMIC_SEQ_CST \ || (ORDER) == __ATOMIC_RELEASE), \ - __atomic_store_n(&(ATOMIC_VAL)->_value, NEW_VAL, ORDER)) + __atomic_store_n(&((ATOMIC_VAL)->_value), NEW_VAL, ORDER)) #define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ (assert((ORDER) == __ATOMIC_RELAXED \ || (ORDER) == __ATOMIC_SEQ_CST \ || (ORDER) == __ATOMIC_ACQUIRE \ || (ORDER) == __ATOMIC_CONSUME), \ - __atomic_load_n(&(ATOMIC_VAL)->_value, ORDER)) + __atomic_load_n(&((ATOMIC_VAL)->_value), ORDER)) /* Only support GCC (for expression statements) and x86 (for simple * atomic semantics) and MSVC x86/x64/ARM */ @@ -324,7 +324,7 @@ inline intptr_t _Py_atomic_load_64bit(volatile uintptr_t* value, int order) { } #else -#define _Py_atomic_load_64bit(ATOMIC_VAL, ORDER) *ATOMIC_VAL +#define _Py_atomic_load_64bit(ATOMIC_VAL, ORDER) *(ATOMIC_VAL) #endif inline int _Py_atomic_load_32bit(volatile int* value, int order) { @@ -359,15 +359,15 @@ inline int _Py_atomic_load_32bit(volatile int* value, int order) { } #define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ - if (sizeof(*ATOMIC_VAL._value) == 8) { \ - _Py_atomic_store_64bit((volatile long long*)ATOMIC_VAL._value, NEW_VAL, ORDER) } else { \ - _Py_atomic_store_32bit((volatile long*)ATOMIC_VAL._value, NEW_VAL, ORDER) } + if (sizeof((ATOMIC_VAL)->_value) == 8) { \ + _Py_atomic_store_64bit((volatile long long*)&((ATOMIC_VAL)->_value), NEW_VAL, ORDER) } else { \ + _Py_atomic_store_32bit((volatile long*)&((ATOMIC_VAL)->_value), NEW_VAL, ORDER) } #define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ ( \ - sizeof(*(ATOMIC_VAL._value)) == 8 ? \ - _Py_atomic_load_64bit((volatile long long*)ATOMIC_VAL._value, ORDER) : \ - _Py_atomic_load_32bit((volatile long*)ATOMIC_VAL._value, ORDER) \ + sizeof((ATOMIC_VAL)->_value) == 8 ? \ + _Py_atomic_load_64bit((volatile long long*)&((ATOMIC_VAL)->_value), ORDER) : \ + _Py_atomic_load_32bit((volatile long*)&((ATOMIC_VAL)->_value), ORDER) \ ) #elif defined(_M_ARM) || defined(_M_ARM64) typedef enum _Py_memory_order { @@ -391,13 +391,13 @@ typedef struct _Py_atomic_int { #define _Py_atomic_store_64bit(ATOMIC_VAL, NEW_VAL, ORDER) \ switch (ORDER) { \ case _Py_memory_order_acquire: \ - _InterlockedExchange64_acq((__int64 volatile*)ATOMIC_VAL, (__int64)NEW_VAL); \ + _InterlockedExchange64_acq((__int64 volatile*)&((ATOMIC_VAL)->_value), (__int64)NEW_VAL); \ break; \ case _Py_memory_order_release: \ - _InterlockedExchange64_rel((__int64 volatile*)ATOMIC_VAL, (__int64)NEW_VAL); \ + _InterlockedExchange64_rel((__int64 volatile*)&((ATOMIC_VAL)->_value), (__int64)NEW_VAL); \ break; \ default: \ - _InterlockedExchange64((__int64 volatile*)ATOMIC_VAL, (__int64)NEW_VAL); \ + _InterlockedExchange64((__int64 volatile*)&((ATOMIC_VAL)->_value), (__int64)NEW_VAL); \ break; \ } #else @@ -407,13 +407,13 @@ typedef struct _Py_atomic_int { #define _Py_atomic_store_32bit(ATOMIC_VAL, NEW_VAL, ORDER) \ switch (ORDER) { \ case _Py_memory_order_acquire: \ - _InterlockedExchange_acq((volatile long*)ATOMIC_VAL, (int)NEW_VAL); \ + _InterlockedExchange_acq((volatile long*)&((ATOMIC_VAL)->_value), (int)NEW_VAL); \ break; \ case _Py_memory_order_release: \ - _InterlockedExchange_rel((volatile long*)ATOMIC_VAL, (int)NEW_VAL); \ + _InterlockedExchange_rel((volatile long*)&((ATOMIC_VAL)->_value), (int)NEW_VAL); \ break; \ default: \ - _InterlockedExchange((volatile long*)ATOMIC_VAL, (int)NEW_VAL); \ + _InterlockedExchange((volatile long*)&((ATOMIC_VAL)->_value), (int)NEW_VAL); \ break; \ } @@ -454,7 +454,7 @@ inline intptr_t _Py_atomic_load_64bit(volatile uintptr_t* value, int order) { } #else -#define _Py_atomic_load_64bit(ATOMIC_VAL, ORDER) *ATOMIC_VAL +#define _Py_atomic_load_64bit(ATOMIC_VAL, ORDER) *(ATOMIC_VAL) #endif inline int _Py_atomic_load_32bit(volatile int* value, int order) { @@ -489,15 +489,15 @@ inline int _Py_atomic_load_32bit(volatile int* value, int order) { } #define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ - if (sizeof(*ATOMIC_VAL._value) == 8) { \ - _Py_atomic_store_64bit(ATOMIC_VAL._value, NEW_VAL, ORDER) } else { \ - _Py_atomic_store_32bit(ATOMIC_VAL._value, NEW_VAL, ORDER) } + if (sizeof((ATOMIC_VAL)->_value) == 8) { \ + _Py_atomic_store_64bit(&((ATOMIC_VAL)->_value), NEW_VAL, ORDER) } else { \ + _Py_atomic_store_32bit(&((ATOMIC_VAL)->_value), NEW_VAL, ORDER) } #define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ ( \ - sizeof(*(ATOMIC_VAL._value)) == 8 ? \ - _Py_atomic_load_64bit(ATOMIC_VAL._value, ORDER) : \ - _Py_atomic_load_32bit(ATOMIC_VAL._value, ORDER) \ + sizeof((ATOMIC_VAL)->_value) == 8 ? \ + _Py_atomic_load_64bit(&((ATOMIC_VAL)->_value), ORDER) : \ + _Py_atomic_load_32bit(&((ATOMIC_VAL)->_value), ORDER) \ ) #endif #else /* !gcc x86 !_msc_ver */ From webhook-mailer at python.org Fri Mar 8 16:44:28 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 08 Mar 2019 21:44:28 -0000 Subject: [Python-checkins] bpo-35899: Fix Enum handling of empty and weird strings (GH-11891) Message-ID: https://github.com/python/cpython/commit/8755f0aeb67125a154e5665a24276fe85d269d85 commit: 8755f0aeb67125a154e5665a24276fe85d269d85 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-08T13:44:21-08:00 summary: bpo-35899: Fix Enum handling of empty and weird strings (GH-11891) Co-authored-by: Maxwell Co-authored-by: St?phane Wirtel https://bugs.python.org/issue35899 (cherry picked from commit 8b914d2767acba3a9e78f1dacdc2d61dbfd7e304) Co-authored-by: Brennan D Baraban <34765317+bdbaraban at users.noreply.github.com> files: A Misc/NEWS.d/next/Library/2019-02-16-07-11-02.bpo-35899.cjfn5a.rst M Lib/enum.py M Lib/test/test_enum.py diff --git a/Lib/enum.py b/Lib/enum.py index 8984cac60955..5e97a9e8d810 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -25,18 +25,19 @@ def _is_descriptor(obj): def _is_dunder(name): """Returns True if a __dunder__ name, False otherwise.""" - return (name[:2] == name[-2:] == '__' and - name[2:3] != '_' and - name[-3:-2] != '_' and - len(name) > 4) + return (len(name) > 4 and + name[:2] == name[-2:] == '__' and + name[2] != '_' and + name[-3] != '_') def _is_sunder(name): """Returns True if a _sunder_ name, False otherwise.""" - return (name[0] == name[-1] == '_' and + return (len(name) > 2 and + name[0] == name[-1] == '_' and name[1:2] != '_' and - name[-2:-1] != '_' and - len(name) > 2) + name[-2:-1] != '_') + def _make_class_unpicklable(cls): """Make the given class un-picklable.""" @@ -156,7 +157,7 @@ def __new__(metacls, cls, bases, classdict): _order_ = classdict.pop('_order_', None) # check for illegal enum names (any others?) - invalid_names = set(enum_members) & {'mro', } + invalid_names = set(enum_members) & {'mro', ''} if invalid_names: raise ValueError('Invalid enum member name: {0}'.format( ','.join(invalid_names))) diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index fdc3dd9c38a0..29a429ccd998 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -2738,6 +2738,23 @@ def cycle_enum(): self.assertEqual(256, len(seen), 'too many composite members created') +class TestEmptyAndNonLatinStrings(unittest.TestCase): + + def test_empty_string(self): + with self.assertRaises(ValueError): + empty_abc = Enum('empty_abc', ('', 'B', 'C')) + + def test_non_latin_character_string(self): + greek_abc = Enum('greek_abc', ('\u03B1', 'B', 'C')) + item = getattr(greek_abc, '\u03B1') + self.assertEqual(item.value, 1) + + def test_non_latin_number_string(self): + hebrew_123 = Enum('hebrew_123', ('\u05D0', '2', '3')) + item = getattr(hebrew_123, '\u05D0') + self.assertEqual(item.value, 1) + + class TestUnique(unittest.TestCase): def test_unique_clean(self): diff --git a/Misc/NEWS.d/next/Library/2019-02-16-07-11-02.bpo-35899.cjfn5a.rst b/Misc/NEWS.d/next/Library/2019-02-16-07-11-02.bpo-35899.cjfn5a.rst new file mode 100644 index 000000000000..73d4fa17b33d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-02-16-07-11-02.bpo-35899.cjfn5a.rst @@ -0,0 +1 @@ +Enum has been fixed to correctly handle empty strings and strings with non-Latin characters (ie. '?', '?') without crashing. Original patch contributed by Maxwell. Assisted by St?phane Wirtel. From webhook-mailer at python.org Fri Mar 8 16:44:42 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 08 Mar 2019 21:44:42 -0000 Subject: [Python-checkins] bpo-35807: Upgrade ensurepip bundled pip and setuptools (GH-12189) Message-ID: https://github.com/python/cpython/commit/572205adf06fc5afa64984740c4775af45942d5c commit: 572205adf06fc5afa64984740c4775af45942d5c branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-08T13:44:39-08:00 summary: bpo-35807: Upgrade ensurepip bundled pip and setuptools (GH-12189) * Update pip to 19.0.3 * Update setuptools to 40.8.0 (cherry picked from commit 01e0f439f5009f37b95ab516e91906fcc7fcb8c3) Co-authored-by: Pradyun Gedam files: A Lib/ensurepip/_bundled/pip-19.0.3-py2.py3-none-any.whl A Lib/ensurepip/_bundled/setuptools-40.8.0-py2.py3-none-any.whl A Misc/NEWS.d/next/Library/2019-03-06-13-21-33.bpo-35807.W7mmu3.rst D Lib/ensurepip/_bundled/pip-18.1-py2.py3-none-any.whl D Lib/ensurepip/_bundled/setuptools-40.6.2-py2.py3-none-any.whl M Lib/ensurepip/__init__.py diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py index 09c572db71cb..526dfd004a41 100644 --- a/Lib/ensurepip/__init__.py +++ b/Lib/ensurepip/__init__.py @@ -8,9 +8,9 @@ __all__ = ["version", "bootstrap"] -_SETUPTOOLS_VERSION = "40.6.2" +_SETUPTOOLS_VERSION = "40.8.0" -_PIP_VERSION = "18.1" +_PIP_VERSION = "19.0.3" _PROJECTS = [ ("setuptools", _SETUPTOOLS_VERSION), diff --git a/Lib/ensurepip/_bundled/pip-18.1-py2.py3-none-any.whl b/Lib/ensurepip/_bundled/pip-19.0.3-py2.py3-none-any.whl similarity index 50% rename from Lib/ensurepip/_bundled/pip-18.1-py2.py3-none-any.whl rename to Lib/ensurepip/_bundled/pip-19.0.3-py2.py3-none-any.whl index c3c146f6da27..24f247caa0ab 100644 Binary files a/Lib/ensurepip/_bundled/pip-18.1-py2.py3-none-any.whl and b/Lib/ensurepip/_bundled/pip-19.0.3-py2.py3-none-any.whl differ diff --git a/Lib/ensurepip/_bundled/setuptools-40.6.2-py2.py3-none-any.whl b/Lib/ensurepip/_bundled/setuptools-40.8.0-py2.py3-none-any.whl similarity index 81% rename from Lib/ensurepip/_bundled/setuptools-40.6.2-py2.py3-none-any.whl rename to Lib/ensurepip/_bundled/setuptools-40.8.0-py2.py3-none-any.whl index 4c8a619571d1..fdc66e9330e0 100644 Binary files a/Lib/ensurepip/_bundled/setuptools-40.6.2-py2.py3-none-any.whl and b/Lib/ensurepip/_bundled/setuptools-40.8.0-py2.py3-none-any.whl differ diff --git a/Misc/NEWS.d/next/Library/2019-03-06-13-21-33.bpo-35807.W7mmu3.rst b/Misc/NEWS.d/next/Library/2019-03-06-13-21-33.bpo-35807.W7mmu3.rst new file mode 100644 index 000000000000..1109fbed3f9c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-06-13-21-33.bpo-35807.W7mmu3.rst @@ -0,0 +1 @@ +Update ensurepip to install pip 19.0.3 and setuptools 40.8.0. From webhook-mailer at python.org Fri Mar 8 16:45:05 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 08 Mar 2019 21:45:05 -0000 Subject: [Python-checkins] bpo-35807: Upgrade ensurepip bundled pip and setuptools (GH-12189) Message-ID: https://github.com/python/cpython/commit/55438d713978a1913ef12c8a801848626228aad6 commit: 55438d713978a1913ef12c8a801848626228aad6 branch: 2.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-08T13:45:01-08:00 summary: bpo-35807: Upgrade ensurepip bundled pip and setuptools (GH-12189) * Update pip to 19.0.3 * Update setuptools to 40.8.0 (cherry picked from commit 01e0f439f5009f37b95ab516e91906fcc7fcb8c3) Co-authored-by: Pradyun Gedam files: A Lib/ensurepip/_bundled/pip-19.0.3-py2.py3-none-any.whl A Lib/ensurepip/_bundled/setuptools-40.8.0-py2.py3-none-any.whl A Misc/NEWS.d/next/Library/2019-03-06-13-21-33.bpo-35807.W7mmu3.rst D Lib/ensurepip/_bundled/pip-18.1-py2.py3-none-any.whl D Lib/ensurepip/_bundled/setuptools-40.6.2-py2.py3-none-any.whl M Lib/ensurepip/__init__.py diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py index 5021ebf77e16..cbadfaa41a26 100644 --- a/Lib/ensurepip/__init__.py +++ b/Lib/ensurepip/__init__.py @@ -12,9 +12,9 @@ __all__ = ["version", "bootstrap"] -_SETUPTOOLS_VERSION = "40.6.2" +_SETUPTOOLS_VERSION = "40.8.0" -_PIP_VERSION = "18.1" +_PIP_VERSION = "19.0.3" _PROJECTS = [ ("setuptools", _SETUPTOOLS_VERSION), diff --git a/Lib/ensurepip/_bundled/pip-18.1-py2.py3-none-any.whl b/Lib/ensurepip/_bundled/pip-19.0.3-py2.py3-none-any.whl similarity index 50% rename from Lib/ensurepip/_bundled/pip-18.1-py2.py3-none-any.whl rename to Lib/ensurepip/_bundled/pip-19.0.3-py2.py3-none-any.whl index c3c146f6da27..24f247caa0ab 100644 Binary files a/Lib/ensurepip/_bundled/pip-18.1-py2.py3-none-any.whl and b/Lib/ensurepip/_bundled/pip-19.0.3-py2.py3-none-any.whl differ diff --git a/Lib/ensurepip/_bundled/setuptools-40.6.2-py2.py3-none-any.whl b/Lib/ensurepip/_bundled/setuptools-40.8.0-py2.py3-none-any.whl similarity index 81% rename from Lib/ensurepip/_bundled/setuptools-40.6.2-py2.py3-none-any.whl rename to Lib/ensurepip/_bundled/setuptools-40.8.0-py2.py3-none-any.whl index 4c8a619571d1..fdc66e9330e0 100644 Binary files a/Lib/ensurepip/_bundled/setuptools-40.6.2-py2.py3-none-any.whl and b/Lib/ensurepip/_bundled/setuptools-40.8.0-py2.py3-none-any.whl differ diff --git a/Misc/NEWS.d/next/Library/2019-03-06-13-21-33.bpo-35807.W7mmu3.rst b/Misc/NEWS.d/next/Library/2019-03-06-13-21-33.bpo-35807.W7mmu3.rst new file mode 100644 index 000000000000..1109fbed3f9c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-06-13-21-33.bpo-35807.W7mmu3.rst @@ -0,0 +1 @@ +Update ensurepip to install pip 19.0.3 and setuptools 40.8.0. From webhook-mailer at python.org Fri Mar 8 17:01:31 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Fri, 08 Mar 2019 22:01:31 -0000 Subject: [Python-checkins] bpo-35661: Store the venv prompt in pyvenv.cfg (GH-11440) Message-ID: https://github.com/python/cpython/commit/d5a70c6b0355f247931f6be80b78a0ff1869c56f commit: d5a70c6b0355f247931f6be80b78a0ff1869c56f branch: master author: Cheryl Sabella committer: GitHub date: 2019-03-08T17:01:27-05:00 summary: bpo-35661: Store the venv prompt in pyvenv.cfg (GH-11440) files: A Misc/NEWS.d/next/Library/2019-01-05-16-16-20.bpo-35661.H_UOXc.rst M Lib/test/test_venv.py M Lib/venv/__init__.py diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index 347544a67722..1ddec72927fa 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -113,10 +113,16 @@ def test_prompt(self): builder = venv.EnvBuilder() context = builder.ensure_directories(self.env_dir) self.assertEqual(context.prompt, '(%s) ' % env_name) + builder.create(self.env_dir) + data = self.get_text_file_contents('pyvenv.cfg') + self.assertNotIn("prompt = ", data) builder = venv.EnvBuilder(prompt='My prompt') context = builder.ensure_directories(self.env_dir) self.assertEqual(context.prompt, '(My prompt) ') + builder.create(self.env_dir) + data = self.get_text_file_contents('pyvenv.cfg') + self.assertIn("prompt = 'My prompt'\n", data) @skipInVenv def test_prefixes(self): diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py index d5ab38958bb2..a309b861c5f4 100644 --- a/Lib/venv/__init__.py +++ b/Lib/venv/__init__.py @@ -154,6 +154,8 @@ def create_configuration(self, context): incl = 'false' f.write('include-system-site-packages = %s\n' % incl) f.write('version = %d.%d.%d\n' % sys.version_info[:3]) + if self.prompt is not None: + f.write(f'prompt = {self.prompt!r}\n') def symlink_or_copy(self, src, dst, relative_symlinks_ok=False): """ diff --git a/Misc/NEWS.d/next/Library/2019-01-05-16-16-20.bpo-35661.H_UOXc.rst b/Misc/NEWS.d/next/Library/2019-01-05-16-16-20.bpo-35661.H_UOXc.rst new file mode 100644 index 000000000000..431898686115 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-01-05-16-16-20.bpo-35661.H_UOXc.rst @@ -0,0 +1 @@ +Store the venv prompt in pyvenv.cfg. From webhook-mailer at python.org Fri Mar 8 19:25:58 2019 From: webhook-mailer at python.org (Eric Snow) Date: Sat, 09 Mar 2019 00:25:58 -0000 Subject: [Python-checkins] Simplify DISPATCH by hoisting eval_breaker ahead of time. (gh-12243) Message-ID: https://github.com/python/cpython/commit/7bda9de5504382931822baecba7f85028031c2cd commit: 7bda9de5504382931822baecba7f85028031c2cd branch: master author: Eric Snow committer: GitHub date: 2019-03-08T17:25:54-07:00 summary: Simplify DISPATCH by hoisting eval_breaker ahead of time. (gh-12243) files: M Python/ceval.c diff --git a/Python/ceval.c b/Python/ceval.c index b311248c6a20..ab6a5e0f1218 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -602,6 +602,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) PyObject **fastlocals, **freevars; PyObject *retval = NULL; /* Return value */ PyThreadState *tstate = _PyThreadState_GET(); + _Py_atomic_int *eval_breaker = &_PyRuntime.ceval.eval_breaker; PyCodeObject *co; /* when tracing we set things up so that @@ -687,7 +688,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) #define DISPATCH() \ { \ - if (!_Py_atomic_load_relaxed(&_PyRuntime.ceval.eval_breaker)) { \ + if (!_Py_atomic_load_relaxed(eval_breaker)) { \ FAST_DISPATCH(); \ } \ continue; \ @@ -989,7 +990,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) async I/O handler); see Py_AddPendingCall() and Py_MakePendingCalls() above. */ - if (_Py_atomic_load_relaxed(&_PyRuntime.ceval.eval_breaker)) { + if (_Py_atomic_load_relaxed(eval_breaker)) { opcode = _Py_OPCODE(*next_instr); if (opcode == SETUP_FINALLY || opcode == SETUP_WITH || From webhook-mailer at python.org Sat Mar 9 00:47:18 2019 From: webhook-mailer at python.org (Eric Snow) Date: Sat, 09 Mar 2019 05:47:18 -0000 Subject: [Python-checkins] bpo-33608: Minor cleanup related to pending calls. (gh-12247) Message-ID: https://github.com/python/cpython/commit/5be45a6105d656c551adeee7770afdc3b806fbb5 commit: 5be45a6105d656c551adeee7770afdc3b806fbb5 branch: master author: Eric Snow committer: GitHub date: 2019-03-08T22:47:07-07:00 summary: bpo-33608: Minor cleanup related to pending calls. (gh-12247) files: M Include/internal/pycore_ceval.h M Include/internal/pycore_pystate.h M Python/ceval.c M Python/pylifecycle.c M Python/pystate.c diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index b9f2d7d17585..c8e09bac074d 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -12,7 +12,6 @@ extern "C" { #include "pythread.h" struct _pending_calls { - unsigned long main_thread; PyThread_type_lock lock; /* Request for running pending calls. */ _Py_atomic_int calls_to_do; diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 7796223b59e6..2b913de076aa 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -31,6 +31,8 @@ struct _is { int64_t id_refcount; PyThread_type_lock id_mutex; + int finalizing; + PyObject *modules; PyObject *modules_by_index; PyObject *sysdict; @@ -207,6 +209,8 @@ typedef struct pyruntimestate { struct _xidregitem *head; } xidregistry; + unsigned long main_thread; + #define NEXITFUNCS 32 void (*exitfuncs[NEXITFUNCS])(void); int nexitfuncs; diff --git a/Python/ceval.c b/Python/ceval.c index ab6a5e0f1218..356335a7c391 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -174,9 +174,11 @@ PyEval_InitThreads(void) PyThread_init_thread(); create_gil(); take_gil(_PyThreadState_GET()); - _PyRuntime.ceval.pending.main_thread = PyThread_get_thread_ident(); - if (!_PyRuntime.ceval.pending.lock) + // Set it to the ID of the main thread of the main interpreter. + _PyRuntime.main_thread = PyThread_get_thread_ident(); + if (!_PyRuntime.ceval.pending.lock) { _PyRuntime.ceval.pending.lock = PyThread_allocate_lock(); + } } void @@ -243,9 +245,9 @@ PyEval_ReInitThreads(void) if (!gil_created()) return; recreate_gil(); - _PyRuntime.ceval.pending.lock = PyThread_allocate_lock(); take_gil(current_tstate); - _PyRuntime.ceval.pending.main_thread = PyThread_get_thread_ident(); + _PyRuntime.main_thread = PyThread_get_thread_ident(); + _PyRuntime.ceval.pending.lock = PyThread_allocate_lock(); /* Destroy all threads except the current one */ _PyThreadState_DeleteExcept(current_tstate); @@ -323,6 +325,35 @@ _PyEval_SignalReceived(void) SIGNAL_PENDING_SIGNALS(); } +/* Push one item onto the queue while holding the lock. */ +static int +_push_pending_call(int (*func)(void *), void *arg) +{ + int i = _PyRuntime.ceval.pending.last; + int j = (i + 1) % NPENDINGCALLS; + if (j == _PyRuntime.ceval.pending.first) { + return -1; /* Queue full */ + } + _PyRuntime.ceval.pending.calls[i].func = func; + _PyRuntime.ceval.pending.calls[i].arg = arg; + _PyRuntime.ceval.pending.last = j; + return 0; +} + +/* Pop one item off the queue while holding the lock. */ +static void +_pop_pending_call(int (**func)(void *), void **arg) +{ + int i = _PyRuntime.ceval.pending.first; + if (i == _PyRuntime.ceval.pending.last) { + return; /* Queue empty */ + } + + *func = _PyRuntime.ceval.pending.calls[i].func; + *arg = _PyRuntime.ceval.pending.calls[i].arg; + _PyRuntime.ceval.pending.first = (i + 1) % NPENDINGCALLS; +} + /* This implementation is thread-safe. It allows scheduling to be made from any thread, and even from an executing callback. @@ -331,7 +362,6 @@ _PyEval_SignalReceived(void) int Py_AddPendingCall(int (*func)(void *), void *arg) { - int i, j, result=0; PyThread_type_lock lock = _PyRuntime.ceval.pending.lock; /* try a few times for the lock. Since this mechanism is used @@ -346,6 +376,7 @@ Py_AddPendingCall(int (*func)(void *), void *arg) * this function is called before any bytecode evaluation takes place. */ if (lock != NULL) { + int i; for (i = 0; i<100; i++) { if (PyThread_acquire_lock(lock, NOWAIT_LOCK)) break; @@ -354,15 +385,8 @@ Py_AddPendingCall(int (*func)(void *), void *arg) return -1; } - i = _PyRuntime.ceval.pending.last; - j = (i + 1) % NPENDINGCALLS; - if (j == _PyRuntime.ceval.pending.first) { - result = -1; /* Queue full */ - } else { - _PyRuntime.ceval.pending.calls[i].func = func; - _PyRuntime.ceval.pending.calls[i].arg = arg; - _PyRuntime.ceval.pending.last = j; - } + int result = _push_pending_call(func, arg); + /* signal main loop */ SIGNAL_PENDING_CALLS(); if (lock != NULL) @@ -373,10 +397,10 @@ Py_AddPendingCall(int (*func)(void *), void *arg) static int handle_signals(void) { - /* Only handle signals on main thread. */ - if (_PyRuntime.ceval.pending.main_thread && - PyThread_get_thread_ident() != _PyRuntime.ceval.pending.main_thread) - { + /* Only handle signals on main thread. PyEval_InitThreads must + * have been called already. + */ + if (PyThread_get_thread_ident() != _PyRuntime.main_thread) { return 0; } /* @@ -401,9 +425,7 @@ make_pending_calls(void) static int busy = 0; /* only service pending calls on main thread */ - if (_PyRuntime.ceval.pending.main_thread && - PyThread_get_thread_ident() != _PyRuntime.ceval.pending.main_thread) - { + if (PyThread_get_thread_ident() != _PyRuntime.main_thread) { return 0; } @@ -428,24 +450,18 @@ make_pending_calls(void) /* perform a bounded number of calls, in case of recursion */ for (int i=0; iframe != NULL) Py_FatalError("Py_EndInterpreter: thread still has a frame"); + interp->finalizing = 1; wait_for_thread_shutdown(); diff --git a/Python/pystate.c b/Python/pystate.c index 49497b7c3767..ec8dba8ee58d 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -60,6 +60,8 @@ _PyRuntimeState_Init_impl(_PyRuntimeState *runtime) return _Py_INIT_ERR("Can't initialize threads for cross-interpreter data registry"); } + // runtime->main_thread is set in PyEval_InitThreads(). + return _Py_INIT_OK(); } @@ -133,28 +135,12 @@ PyInterpreterState_New(void) return NULL; } + memset(interp, 0, sizeof(*interp)); interp->id_refcount = -1; - interp->id_mutex = NULL; - interp->modules = NULL; - interp->modules_by_index = NULL; - interp->sysdict = NULL; - interp->builtins = NULL; - interp->builtins_copy = NULL; - interp->tstate_head = NULL; interp->check_interval = 100; - interp->num_threads = 0; - interp->pythread_stacksize = 0; - interp->codec_search_path = NULL; - interp->codec_search_cache = NULL; - interp->codec_error_registry = NULL; - interp->codecs_initialized = 0; - interp->fscodec_initialized = 0; interp->core_config = _PyCoreConfig_INIT; interp->config = _PyMainInterpreterConfig_INIT; - interp->importlib = NULL; - interp->import_func = NULL; interp->eval_frame = _PyEval_EvalFrameDefault; - interp->co_extra_user_count = 0; #ifdef HAVE_DLOPEN #if HAVE_DECL_RTLD_NOW interp->dlopenflags = RTLD_NOW; @@ -162,13 +148,6 @@ PyInterpreterState_New(void) interp->dlopenflags = RTLD_LAZY; #endif #endif -#ifdef HAVE_FORK - interp->before_forkers = NULL; - interp->after_forkers_parent = NULL; - interp->after_forkers_child = NULL; -#endif - interp->pyexitfunc = NULL; - interp->pyexitmodule = NULL; HEAD_LOCK(); if (_PyRuntime.interpreters.next_id < 0) { @@ -223,6 +202,9 @@ PyInterpreterState_Clear(PyInterpreterState *interp) Py_CLEAR(interp->after_forkers_parent); Py_CLEAR(interp->after_forkers_child); #endif + // XXX Once we have one allocator per interpreter (i.e. + // per-interpreter GC) we must ensure that all of the interpreter's + // objects have been cleaned up at the point. } @@ -334,28 +316,39 @@ PyInterpreterState_GetID(PyInterpreterState *interp) } -PyInterpreterState * -_PyInterpreterState_LookUpID(PY_INT64_T requested_id) +static PyInterpreterState * +interp_look_up_id(PY_INT64_T requested_id) { - if (requested_id < 0) - goto error; - PyInterpreterState *interp = PyInterpreterState_Head(); while (interp != NULL) { PY_INT64_T id = PyInterpreterState_GetID(interp); - if (id < 0) + if (id < 0) { return NULL; - if (requested_id == id) + } + if (requested_id == id) { return interp; + } interp = PyInterpreterState_Next(interp); } - -error: - PyErr_Format(PyExc_RuntimeError, - "unrecognized interpreter ID %lld", requested_id); return NULL; } +PyInterpreterState * +_PyInterpreterState_LookUpID(PY_INT64_T requested_id) +{ + PyInterpreterState *interp = NULL; + if (requested_id >= 0) { + HEAD_LOCK(); + interp = interp_look_up_id(requested_id); + HEAD_UNLOCK(); + } + if (interp == NULL && !PyErr_Occurred()) { + PyErr_Format(PyExc_RuntimeError, + "unrecognized interpreter ID %lld", requested_id); + } + return interp; +} + int _PyInterpreterState_IDInitref(PyInterpreterState *interp) From webhook-mailer at python.org Sat Mar 9 01:44:39 2019 From: webhook-mailer at python.org (Eric Snow) Date: Sat, 09 Mar 2019 06:44:39 -0000 Subject: [Python-checkins] bpo-33608: Make sure locks in the runtime are properly re-created. (gh-12245) Message-ID: https://github.com/python/cpython/commit/8479a3426eb7d1840473f7788e639954363ed37e commit: 8479a3426eb7d1840473f7788e639954363ed37e branch: master author: Eric Snow committer: GitHub date: 2019-03-08T23:44:33-07:00 summary: bpo-33608: Make sure locks in the runtime are properly re-created. (gh-12245) files: M Include/internal/pycore_pystate.h M Modules/posixmodule.c M Python/ceval.c M Python/pystate.c diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 2b913de076aa..456dda2e8490 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -229,6 +229,7 @@ typedef struct pyruntimestate { PyAPI_DATA(_PyRuntimeState) _PyRuntime; PyAPI_FUNC(_PyInitError) _PyRuntimeState_Init(_PyRuntimeState *); PyAPI_FUNC(void) _PyRuntimeState_Fini(_PyRuntimeState *); +PyAPI_FUNC(void) _PyRuntimeState_ReInitThreads(void); /* Initialize _PyRuntimeState. Return NULL on success, or return an error message on failure. */ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 540ee9d925bf..3f760183575a 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -429,6 +429,7 @@ PyOS_AfterFork_Child(void) PyEval_ReInitThreads(); _PyImport_ReInitLock(); _PySignal_AfterFork(); + _PyRuntimeState_ReInitThreads(); run_at_forkers(_PyInterpreterState_Get()->after_forkers_child, 0); } diff --git a/Python/ceval.c b/Python/ceval.c index 356335a7c391..373cde9a17bb 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -174,10 +174,10 @@ PyEval_InitThreads(void) PyThread_init_thread(); create_gil(); take_gil(_PyThreadState_GET()); - // Set it to the ID of the main thread of the main interpreter. - _PyRuntime.main_thread = PyThread_get_thread_ident(); - if (!_PyRuntime.ceval.pending.lock) { - _PyRuntime.ceval.pending.lock = PyThread_allocate_lock(); + + _PyRuntime.ceval.pending.lock = PyThread_allocate_lock(); + if (_PyRuntime.ceval.pending.lock == NULL) { + return Py_FatalError("Can't initialize threads for pending calls"); } } @@ -246,8 +246,11 @@ PyEval_ReInitThreads(void) return; recreate_gil(); take_gil(current_tstate); - _PyRuntime.main_thread = PyThread_get_thread_ident(); + _PyRuntime.ceval.pending.lock = PyThread_allocate_lock(); + if (_PyRuntime.ceval.pending.lock == NULL) { + Py_FatalError("Can't initialize threads for pending calls"); + } /* Destroy all threads except the current one */ _PyThreadState_DeleteExcept(current_tstate); @@ -362,35 +365,12 @@ _pop_pending_call(int (**func)(void *), void **arg) int Py_AddPendingCall(int (*func)(void *), void *arg) { - PyThread_type_lock lock = _PyRuntime.ceval.pending.lock; - - /* try a few times for the lock. Since this mechanism is used - * for signal handling (on the main thread), there is a (slim) - * chance that a signal is delivered on the same thread while we - * hold the lock during the Py_MakePendingCalls() function. - * This avoids a deadlock in that case. - * Note that signals can be delivered on any thread. In particular, - * on Windows, a SIGINT is delivered on a system-created worker - * thread. - * We also check for lock being NULL, in the unlikely case that - * this function is called before any bytecode evaluation takes place. - */ - if (lock != NULL) { - int i; - for (i = 0; i<100; i++) { - if (PyThread_acquire_lock(lock, NOWAIT_LOCK)) - break; - } - if (i == 100) - return -1; - } - + PyThread_acquire_lock(_PyRuntime.ceval.pending.lock, WAIT_LOCK); int result = _push_pending_call(func, arg); + PyThread_release_lock(_PyRuntime.ceval.pending.lock); /* signal main loop */ SIGNAL_PENDING_CALLS(); - if (lock != NULL) - PyThread_release_lock(lock); return result; } @@ -439,15 +419,6 @@ make_pending_calls(void) UNSIGNAL_PENDING_CALLS(); int res = 0; - if (!_PyRuntime.ceval.pending.lock) { - /* initial allocation of the lock */ - _PyRuntime.ceval.pending.lock = PyThread_allocate_lock(); - if (_PyRuntime.ceval.pending.lock == NULL) { - res = -1; - goto error; - } - } - /* perform a bounded number of calls, in case of recursion */ for (int i=0; imain_thread is set in PyEval_InitThreads(). + // Set it to the ID of the main thread of the main interpreter. + runtime->main_thread = PyThread_get_thread_ident(); return _Py_INIT_OK(); } @@ -94,6 +95,32 @@ _PyRuntimeState_Fini(_PyRuntimeState *runtime) PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); } +/* This function is called from PyOS_AfterFork_Child to ensure that + * newly created child processes do not share locks with the parent. + */ + +void +_PyRuntimeState_ReInitThreads(void) +{ + // This was initially set in _PyRuntimeState_Init(). + _PyRuntime.main_thread = PyThread_get_thread_ident(); + + _PyRuntime.interpreters.mutex = PyThread_allocate_lock(); + if (_PyRuntime.interpreters.mutex == NULL) { + Py_FatalError("Can't initialize lock for runtime interpreters"); + } + + _PyRuntime.interpreters.main->id_mutex = PyThread_allocate_lock(); + if (_PyRuntime.interpreters.main->id_mutex == NULL) { + Py_FatalError("Can't initialize ID lock for main interpreter"); + } + + _PyRuntime.xidregistry.mutex = PyThread_allocate_lock(); + if (_PyRuntime.xidregistry.mutex == NULL) { + Py_FatalError("Can't initialize lock for cross-interpreter data registry"); + } +} + #define HEAD_LOCK() PyThread_acquire_lock(_PyRuntime.interpreters.mutex, \ WAIT_LOCK) #define HEAD_UNLOCK() PyThread_release_lock(_PyRuntime.interpreters.mutex) From webhook-mailer at python.org Sat Mar 9 03:42:28 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 09 Mar 2019 08:42:28 -0000 Subject: [Python-checkins] Make a documentation link target more specific (GH-12249) Message-ID: https://github.com/python/cpython/commit/d70a359adfdbe02538559cceaa0b459d055651be commit: d70a359adfdbe02538559cceaa0b459d055651be branch: master author: Raymond Hettinger committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-09T00:42:23-08:00 summary: Make a documentation link target more specific (GH-12249) files: M Doc/library/statistics.rst diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst index 9aa83331ee0e..3e1443424340 100644 --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -632,9 +632,9 @@ model: Normal distributions commonly arise in machine learning problems. Wikipedia has a `nice example of a Naive Bayesian Classifier -`_. The challenge is to -predict a person's gender from measurements of normally distributed features -including height, weight, and foot size. +`_. +The challenge is to predict a person's gender from measurements of normally +distributed features including height, weight, and foot size. We're given a training dataset with measurements for eight people. The measurements are assumed to be normally distributed, so we summarize the data From webhook-mailer at python.org Sat Mar 9 10:35:53 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Sat, 09 Mar 2019 15:35:53 -0000 Subject: [Python-checkins] Remove d_initial from the parser as it is unused (GH-12212) Message-ID: https://github.com/python/cpython/commit/1b304f992ddfc1cc40758dd633bc6a2595399189 commit: 1b304f992ddfc1cc40758dd633bc6a2595399189 branch: master author: tyomitch committer: Pablo Galindo date: 2019-03-09T15:35:50Z summary: Remove d_initial from the parser as it is unused (GH-12212) d_initial, the first state of a particular DFA in the parser has always been initialized to 0 in the old pgen as well as the new pgen. As this value is not used and the first state of each DFA is assumed to be the first element in the array representing it, remove d_initial from the parser to reduce complexity. files: M Include/grammar.h M Modules/parsermodule.c M Parser/pgen/grammar.py M Python/graminit.c diff --git a/Include/grammar.h b/Include/grammar.h index e1703f4b3603..68b928c97189 100644 --- a/Include/grammar.h +++ b/Include/grammar.h @@ -50,7 +50,6 @@ typedef struct { typedef struct { int d_type; /* Non-terminal this represents */ char *d_name; /* For printing */ - int d_initial; /* Initial state */ int d_nstates; state *d_state; /* Array of states */ bitset d_first; diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c index d4e2be643e71..b0a749a3bc17 100644 --- a/Modules/parsermodule.c +++ b/Modules/parsermodule.c @@ -662,7 +662,7 @@ validate_node(node *tree) REQ(tree, nt_dfa->d_type); /* Run the DFA for this nonterminal. */ - dfa_state = &nt_dfa->d_state[nt_dfa->d_initial]; + dfa_state = nt_dfa->d_state; for (pos = 0; pos < nch; ++pos) { node *ch = CHILD(tree, pos); int ch_type = TYPE(ch); diff --git a/Parser/pgen/grammar.py b/Parser/pgen/grammar.py index 05a37d67832d..340bf64f6d23 100644 --- a/Parser/pgen/grammar.py +++ b/Parser/pgen/grammar.py @@ -97,7 +97,7 @@ def print_dfas(self, writer): ' {{{dfa_symbol}, "{symbol_name}", '.format( dfa_symbol=symbol, symbol_name=self.number2symbol[symbol] ) - + "0, {n_states}, states_{dfa_index},\n".format( + + "{n_states}, states_{dfa_index},\n".format( n_states=len(dfa), dfa_index=dfaindex ) + ' "' diff --git a/Python/graminit.c b/Python/graminit.c index 24f6f6c72a6b..441502e90876 100644 --- a/Python/graminit.c +++ b/Python/graminit.c @@ -2110,189 +2110,189 @@ static state states_91[11] = { {2, arcs_91_10}, }; static dfa dfas[92] = { - {256, "single_input", 0, 3, states_0, + {256, "single_input", 3, states_0, "\344\377\377\377\377\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {257, "file_input", 0, 2, states_1, + {257, "file_input", 2, states_1, "\344\377\377\377\377\027\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {258, "eval_input", 0, 3, states_2, + {258, "eval_input", 3, states_2, "\240\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {259, "decorator", 0, 7, states_3, + {259, "decorator", 7, states_3, "\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {260, "decorators", 0, 2, states_4, + {260, "decorators", 2, states_4, "\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {261, "decorated", 0, 3, states_5, + {261, "decorated", 3, states_5, "\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {262, "async_funcdef", 0, 3, states_6, + {262, "async_funcdef", 3, states_6, "\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {263, "funcdef", 0, 9, states_7, + {263, "funcdef", 9, states_7, "\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {264, "parameters", 0, 4, states_8, + {264, "parameters", 4, states_8, "\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {265, "typedargslist", 0, 22, states_9, + {265, "typedargslist", 22, states_9, "\100\000\000\000\000\001\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {266, "tfpdef", 0, 4, states_10, + {266, "tfpdef", 4, states_10, "\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {267, "varargslist", 0, 18, states_11, + {267, "varargslist", 18, states_11, "\100\000\000\000\000\001\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {268, "vfpdef", 0, 2, states_12, + {268, "vfpdef", 2, states_12, "\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {269, "stmt", 0, 2, states_13, + {269, "stmt", 2, states_13, "\340\377\377\377\377\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {270, "simple_stmt", 0, 4, states_14, + {270, "simple_stmt", 4, states_14, "\340\373\325\376\270\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {271, "small_stmt", 0, 2, states_15, + {271, "small_stmt", 2, states_15, "\340\373\325\376\270\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {272, "expr_stmt", 0, 6, states_16, + {272, "expr_stmt", 6, states_16, "\340\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {273, "annassign", 0, 5, states_17, + {273, "annassign", 5, states_17, "\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {274, "testlist_star_expr", 0, 3, states_18, + {274, "testlist_star_expr", 3, states_18, "\340\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {275, "augassign", 0, 2, states_19, + {275, "augassign", 2, states_19, "\000\000\000\000\000\000\000\000\000\000\340\377\003\000\000\000\000\000\000\000\000\000\000"}, - {276, "del_stmt", 0, 3, states_20, + {276, "del_stmt", 3, states_20, "\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {277, "pass_stmt", 0, 2, states_21, + {277, "pass_stmt", 2, states_21, "\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {278, "flow_stmt", 0, 2, states_22, + {278, "flow_stmt", 2, states_22, "\000\000\005\300\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {279, "break_stmt", 0, 2, states_23, + {279, "break_stmt", 2, states_23, "\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {280, "continue_stmt", 0, 2, states_24, + {280, "continue_stmt", 2, states_24, "\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {281, "return_stmt", 0, 3, states_25, + {281, "return_stmt", 3, states_25, "\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {282, "yield_stmt", 0, 2, states_26, + {282, "yield_stmt", 2, states_26, "\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {283, "raise_stmt", 0, 5, states_27, + {283, "raise_stmt", 5, states_27, "\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {284, "import_stmt", 0, 2, states_28, + {284, "import_stmt", 2, states_28, "\000\000\100\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {285, "import_name", 0, 3, states_29, + {285, "import_name", 3, states_29, "\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {286, "import_from", 0, 8, states_30, + {286, "import_from", 8, states_30, "\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {287, "import_as_name", 0, 4, states_31, + {287, "import_as_name", 4, states_31, "\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {288, "dotted_as_name", 0, 4, states_32, + {288, "dotted_as_name", 4, states_32, "\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {289, "import_as_names", 0, 3, states_33, + {289, "import_as_names", 3, states_33, "\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {290, "dotted_as_names", 0, 2, states_34, + {290, "dotted_as_names", 2, states_34, "\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {291, "dotted_name", 0, 2, states_35, + {291, "dotted_name", 2, states_35, "\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {292, "global_stmt", 0, 3, states_36, + {292, "global_stmt", 3, states_36, "\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {293, "nonlocal_stmt", 0, 3, states_37, + {293, "nonlocal_stmt", 3, states_37, "\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {294, "assert_stmt", 0, 5, states_38, + {294, "assert_stmt", 5, states_38, "\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {295, "compound_stmt", 0, 2, states_39, + {295, "compound_stmt", 2, states_39, "\000\004\052\001\107\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {296, "async_stmt", 0, 3, states_40, + {296, "async_stmt", 3, states_40, "\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {297, "if_stmt", 0, 8, states_41, + {297, "if_stmt", 8, states_41, "\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {298, "while_stmt", 0, 8, states_42, + {298, "while_stmt", 8, states_42, "\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {299, "for_stmt", 0, 11, states_43, + {299, "for_stmt", 11, states_43, "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {300, "try_stmt", 0, 13, states_44, + {300, "try_stmt", 13, states_44, "\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {301, "with_stmt", 0, 6, states_45, + {301, "with_stmt", 6, states_45, "\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {302, "with_item", 0, 4, states_46, + {302, "with_item", 4, states_46, "\240\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {303, "except_clause", 0, 5, states_47, + {303, "except_clause", 5, states_47, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000"}, - {304, "suite", 0, 5, states_48, + {304, "suite", 5, states_48, "\344\373\325\376\270\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {305, "namedexpr_test", 0, 4, states_49, + {305, "namedexpr_test", 4, states_49, "\240\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {306, "test", 0, 6, states_50, + {306, "test", 6, states_50, "\240\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {307, "test_nocond", 0, 2, states_51, + {307, "test_nocond", 2, states_51, "\240\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {308, "lambdef", 0, 5, states_52, + {308, "lambdef", 5, states_52, "\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {309, "lambdef_nocond", 0, 5, states_53, + {309, "lambdef_nocond", 5, states_53, "\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {310, "or_test", 0, 2, states_54, + {310, "or_test", 2, states_54, "\240\173\000\020\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {311, "and_test", 0, 2, states_55, + {311, "and_test", 2, states_55, "\240\173\000\020\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {312, "not_test", 0, 3, states_56, + {312, "not_test", 3, states_56, "\240\173\000\020\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {313, "comparison", 0, 2, states_57, + {313, "comparison", 2, states_57, "\240\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {314, "comp_op", 0, 4, states_58, + {314, "comp_op", 4, states_58, "\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\004\000\340\017\000\000\000\000"}, - {315, "star_expr", 0, 3, states_59, + {315, "star_expr", 3, states_59, "\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {316, "expr", 0, 2, states_60, + {316, "expr", 2, states_60, "\240\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {317, "xor_expr", 0, 2, states_61, + {317, "xor_expr", 2, states_61, "\240\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {318, "and_expr", 0, 2, states_62, + {318, "and_expr", 2, states_62, "\240\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {319, "shift_expr", 0, 2, states_63, + {319, "shift_expr", 2, states_63, "\240\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {320, "arith_expr", 0, 2, states_64, + {320, "arith_expr", 2, states_64, "\240\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {321, "term", 0, 2, states_65, + {321, "term", 2, states_65, "\240\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {322, "factor", 0, 3, states_66, + {322, "factor", 3, states_66, "\240\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {323, "power", 0, 4, states_67, + {323, "power", 4, states_67, "\040\172\000\000\220\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {324, "atom_expr", 0, 3, states_68, + {324, "atom_expr", 3, states_68, "\040\172\000\000\220\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {325, "atom", 0, 9, states_69, + {325, "atom", 9, states_69, "\040\172\000\000\020\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {326, "testlist_comp", 0, 5, states_70, + {326, "testlist_comp", 5, states_70, "\340\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {327, "trailer", 0, 7, states_71, + {327, "trailer", 7, states_71, "\040\100\000\000\000\000\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000"}, - {328, "subscriptlist", 0, 3, states_72, + {328, "subscriptlist", 3, states_72, "\240\173\000\024\260\007\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {329, "subscript", 0, 5, states_73, + {329, "subscript", 5, states_73, "\240\173\000\024\260\007\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {330, "sliceop", 0, 3, states_74, + {330, "sliceop", 3, states_74, "\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {331, "exprlist", 0, 3, states_75, + {331, "exprlist", 3, states_75, "\340\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {332, "testlist", 0, 3, states_76, + {332, "testlist", 3, states_76, "\240\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {333, "dictorsetmaker", 0, 14, states_77, + {333, "dictorsetmaker", 14, states_77, "\340\173\000\024\260\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {334, "classdef", 0, 8, states_78, + {334, "classdef", 8, states_78, "\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {335, "arglist", 0, 3, states_79, + {335, "arglist", 3, states_79, "\340\173\000\024\260\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {336, "argument", 0, 4, states_80, + {336, "argument", 4, states_80, "\340\173\000\024\260\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {337, "comp_iter", 0, 2, states_81, + {337, "comp_iter", 2, states_81, "\000\000\040\001\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {338, "sync_comp_for", 0, 6, states_82, + {338, "sync_comp_for", 6, states_82, "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {339, "comp_for", 0, 3, states_83, + {339, "comp_for", 3, states_83, "\000\000\040\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {340, "comp_if", 0, 4, states_84, + {340, "comp_if", 4, states_84, "\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {341, "encoding_decl", 0, 2, states_85, + {341, "encoding_decl", 2, states_85, "\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {342, "yield_expr", 0, 3, states_86, + {342, "yield_expr", 3, states_86, "\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {343, "yield_arg", 0, 3, states_87, + {343, "yield_arg", 3, states_87, "\340\173\100\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {344, "func_body_suite", 0, 7, states_88, + {344, "func_body_suite", 7, states_88, "\344\373\325\376\270\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {345, "func_type_input", 0, 3, states_89, + {345, "func_type_input", 3, states_89, "\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {346, "func_type", 0, 6, states_90, + {346, "func_type", 6, states_90, "\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {347, "typelist", 0, 11, states_91, + {347, "typelist", 11, states_91, "\340\173\000\024\260\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, }; static label labels[183] = { From webhook-mailer at python.org Sat Mar 9 12:38:10 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 09 Mar 2019 17:38:10 -0000 Subject: [Python-checkins] Fix typos and improve grammar in threading.Barrier docstrings (GH-12210) Message-ID: https://github.com/python/cpython/commit/62fa51f1216e788310d3118f4259f1b4b1e529fe commit: 62fa51f1216e788310d3118f4259f1b4b1e529fe branch: master author: Carl Bordum Hansen committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-09T09:38:05-08:00 summary: Fix typos and improve grammar in threading.Barrier docstrings (GH-12210) files: M Lib/threading.py diff --git a/Lib/threading.py b/Lib/threading.py index 000981f6d963..0ebbd6776ef4 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -568,8 +568,8 @@ class Barrier: """Implements a Barrier. Useful for synchronizing a fixed number of threads at known synchronization - points. Threads block on 'wait()' and are simultaneously once they have all - made that call. + points. Threads block on 'wait()' and are simultaneously awoken once they + have all made that call. """ @@ -578,7 +578,7 @@ def __init__(self, parties, action=None, timeout=None): 'action' is a callable which, when supplied, will be called by one of the threads after they have all entered the barrier and just prior to - releasing them all. If a 'timeout' is provided, it is uses as the + releasing them all. If a 'timeout' is provided, it is used as the default for all subsequent 'wait()' calls. """ From webhook-mailer at python.org Sat Mar 9 12:56:43 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 09 Mar 2019 17:56:43 -0000 Subject: [Python-checkins] Fix typos and improve grammar in threading.Barrier docstrings (GH-12210) Message-ID: https://github.com/python/cpython/commit/4e2079d8965f8843f974d32208b06d3d3cb980ef commit: 4e2079d8965f8843f974d32208b06d3d3cb980ef branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-09T09:56:40-08:00 summary: Fix typos and improve grammar in threading.Barrier docstrings (GH-12210) (cherry picked from commit 62fa51f1216e788310d3118f4259f1b4b1e529fe) Co-authored-by: Carl Bordum Hansen files: M Lib/threading.py diff --git a/Lib/threading.py b/Lib/threading.py index f260a7cceca4..318b3301126a 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -568,8 +568,8 @@ class Barrier: """Implements a Barrier. Useful for synchronizing a fixed number of threads at known synchronization - points. Threads block on 'wait()' and are simultaneously once they have all - made that call. + points. Threads block on 'wait()' and are simultaneously awoken once they + have all made that call. """ @@ -578,7 +578,7 @@ def __init__(self, parties, action=None, timeout=None): 'action' is a callable which, when supplied, will be called by one of the threads after they have all entered the barrier and just prior to - releasing them all. If a 'timeout' is provided, it is uses as the + releasing them all. If a 'timeout' is provided, it is used as the default for all subsequent 'wait()' calls. """ From webhook-mailer at python.org Sat Mar 9 14:18:13 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Sat, 09 Mar 2019 19:18:13 -0000 Subject: [Python-checkins] Rework integer overflow path in math.prod and add more tests (GH-11809) Message-ID: https://github.com/python/cpython/commit/0411411c6b16a574144dfb59a7780b057ca8e750 commit: 0411411c6b16a574144dfb59a7780b057ca8e750 branch: master author: Pablo Galindo committer: GitHub date: 2019-03-09T19:18:08Z summary: Rework integer overflow path in math.prod and add more tests (GH-11809) The overflow check was relying on undefined behaviour as it was using the result of the multiplication to do the check, and once the overflow has already happened, any operation on the result is undefined behaviour. Some extra checks that exercise code paths related to this are also added. files: 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 856b1e8ac11e..cb05dee0e0fd 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -1595,6 +1595,92 @@ def test_mtestfile(self): self.fail('Failures in test_mtestfile:\n ' + '\n '.join(failures)) + def test_prod(self): + prod = math.prod + self.assertEqual(prod([]), 1) + self.assertEqual(prod([], start=5), 5) + self.assertEqual(prod(list(range(2,8))), 5040) + self.assertEqual(prod(iter(list(range(2,8)))), 5040) + self.assertEqual(prod(range(1, 10), start=10), 3628800) + + self.assertEqual(prod([1, 2, 3, 4, 5]), 120) + self.assertEqual(prod([1.0, 2.0, 3.0, 4.0, 5.0]), 120.0) + self.assertEqual(prod([1, 2, 3, 4.0, 5.0]), 120.0) + self.assertEqual(prod([1.0, 2.0, 3.0, 4, 5]), 120.0) + + # Test overflow in fast-path for integers + self.assertEqual(prod([1, 1, 2**32, 1, 1]), 2**32) + # Test overflow in fast-path for floats + self.assertEqual(prod([1.0, 1.0, 2**32, 1, 1]), float(2**32)) + + self.assertRaises(TypeError, prod) + self.assertRaises(TypeError, prod, 42) + self.assertRaises(TypeError, prod, ['a', 'b', 'c']) + self.assertRaises(TypeError, prod, ['a', 'b', 'c'], '') + self.assertRaises(TypeError, prod, [b'a', b'c'], b'') + values = [bytearray(b'a'), bytearray(b'b')] + self.assertRaises(TypeError, prod, values, bytearray(b'')) + self.assertRaises(TypeError, prod, [[1], [2], [3]]) + self.assertRaises(TypeError, prod, [{2:3}]) + self.assertRaises(TypeError, prod, [{2:3}]*2, {2:3}) + self.assertRaises(TypeError, prod, [[1], [2], [3]], []) + with self.assertRaises(TypeError): + prod([10, 20], [30, 40]) # start is a keyword-only argument + + self.assertEqual(prod([0, 1, 2, 3]), 0) + self.assertEqual(prod([1, 0, 2, 3]), 0) + self.assertEqual(prod([1, 2, 3, 0]), 0) + + def _naive_prod(iterable, start=1): + for elem in iterable: + start *= elem + return start + + # Big integers + + iterable = range(1, 10000) + self.assertEqual(prod(iterable), _naive_prod(iterable)) + iterable = range(-10000, -1) + self.assertEqual(prod(iterable), _naive_prod(iterable)) + iterable = range(-1000, 1000) + self.assertEqual(prod(iterable), 0) + + # Big floats + + iterable = [float(x) for x in range(1, 1000)] + self.assertEqual(prod(iterable), _naive_prod(iterable)) + iterable = [float(x) for x in range(-1000, -1)] + self.assertEqual(prod(iterable), _naive_prod(iterable)) + iterable = [float(x) for x in range(-1000, 1000)] + self.assertIsNaN(prod(iterable)) + + # Float tests + + self.assertIsNaN(prod([1, 2, 3, float("nan"), 2, 3])) + self.assertIsNaN(prod([1, 0, float("nan"), 2, 3])) + self.assertIsNaN(prod([1, float("nan"), 0, 3])) + self.assertIsNaN(prod([1, float("inf"), float("nan"),3])) + self.assertIsNaN(prod([1, float("-inf"), float("nan"),3])) + self.assertIsNaN(prod([1, float("nan"), float("inf"),3])) + self.assertIsNaN(prod([1, float("nan"), float("-inf"),3])) + + self.assertEqual(prod([1, 2, 3, float('inf'),-3,4]), float('-inf')) + self.assertEqual(prod([1, 2, 3, float('-inf'),-3,4]), float('inf')) + + self.assertIsNaN(prod([1,2,0,float('inf'), -3, 4])) + self.assertIsNaN(prod([1,2,0,float('-inf'), -3, 4])) + self.assertIsNaN(prod([1, 2, 3, float('inf'), -3, 0, 3])) + self.assertIsNaN(prod([1, 2, 3, float('-inf'), -3, 0, 2])) + + # Type preservation + + self.assertEqual(type(prod([1, 2, 3, 4, 5, 6])), int) + self.assertEqual(type(prod([1, 2.0, 3, 4, 5, 6])), float) + self.assertEqual(type(prod(range(1, 10000))), int) + self.assertEqual(type(prod(range(1, 10000), start=1.0)), float) + self.assertEqual(type(prod([1, decimal.Decimal(2.0), 3, 4, 5, 6])), + decimal.Decimal) + # Custom assertions. def assertIsNaN(self, value): @@ -1724,41 +1810,6 @@ def test_fractions(self): self.assertAllClose(fraction_examples, rel_tol=1e-8) self.assertAllNotClose(fraction_examples, rel_tol=1e-9) - def test_prod(self): - prod = math.prod - self.assertEqual(prod([]), 1) - self.assertEqual(prod([], start=5), 5) - self.assertEqual(prod(list(range(2,8))), 5040) - self.assertEqual(prod(iter(list(range(2,8)))), 5040) - self.assertEqual(prod(range(1, 10), start=10), 3628800) - - self.assertEqual(prod([1, 2, 3, 4, 5]), 120) - self.assertEqual(prod([1.0, 2.0, 3.0, 4.0, 5.0]), 120.0) - self.assertEqual(prod([1, 2, 3, 4.0, 5.0]), 120.0) - self.assertEqual(prod([1.0, 2.0, 3.0, 4, 5]), 120.0) - - # Test overflow in fast-path for integers - self.assertEqual(prod([1, 1, 2**32, 1, 1]), 2**32) - # Test overflow in fast-path for floats - self.assertEqual(prod([1.0, 1.0, 2**32, 1, 1]), float(2**32)) - - self.assertRaises(TypeError, prod) - self.assertRaises(TypeError, prod, 42) - self.assertRaises(TypeError, prod, ['a', 'b', 'c']) - self.assertRaises(TypeError, prod, ['a', 'b', 'c'], '') - self.assertRaises(TypeError, prod, [b'a', b'c'], b'') - values = [bytearray(b'a'), bytearray(b'b')] - self.assertRaises(TypeError, prod, values, bytearray(b'')) - self.assertRaises(TypeError, prod, [[1], [2], [3]]) - self.assertRaises(TypeError, prod, [{2:3}]) - self.assertRaises(TypeError, prod, [{2:3}]*2, {2:3}) - self.assertRaises(TypeError, prod, [[1], [2], [3]], []) - with self.assertRaises(TypeError): - prod([10, 20], [30, 40]) # start is a keyword-only argument - - self.assertEqual(prod([0, 1, 2, 3]), 0) - self.assertEqual(prod([1, 0, 2, 3]), 0) - self.assertEqual(prod(range(10)), 0) def test_main(): from doctest import DocFileSuite diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index fd0eb327c743..ba8423211c2b 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -2493,6 +2493,55 @@ math_isclose_impl(PyObject *module, double a, double b, double rel_tol, (diff <= abs_tol)); } +static inline int +_check_long_mult_overflow(long a, long b) { + + /* From Python2's int_mul code: + + Integer overflow checking for * is painful: Python tried a couple ways, but + they didn't work on all platforms, or failed in endcases (a product of + -sys.maxint-1 has been a particular pain). + + Here's another way: + + The native long product x*y is either exactly right or *way* off, being + just the last n bits of the true product, where n is the number of bits + in a long (the delivered product is the true product plus i*2**n for + some integer i). + + The native double product (double)x * (double)y is subject to three + rounding errors: on a sizeof(long)==8 box, each cast to double can lose + info, and even on a sizeof(long)==4 box, the multiplication can lose info. + But, unlike the native long product, it's not in *range* trouble: even + if sizeof(long)==32 (256-bit longs), the product easily fits in the + dynamic range of a double. So the leading 50 (or so) bits of the double + product are correct. + + We check these two ways against each other, and declare victory if they're + approximately the same. Else, because the native long product is the only + one that can lose catastrophic amounts of information, it's the native long + product that must have overflowed. + + */ + + long longprod = (long)((unsigned long)a * b); + double doubleprod = (double)a * (double)b; + double doubled_longprod = (double)longprod; + + if (doubled_longprod == doubleprod) { + return 0; + } + + const double diff = doubled_longprod - doubleprod; + const double absdiff = diff >= 0.0 ? diff : -diff; + const double absprod = doubleprod >= 0.0 ? doubleprod : -doubleprod; + + if (32.0 * absdiff <= absprod) { + return 0; + } + + return 1; +} /*[clinic input] math.prod @@ -2558,11 +2607,8 @@ math_prod_impl(PyObject *module, PyObject *iterable, PyObject *start) } if (PyLong_CheckExact(item)) { long b = PyLong_AsLongAndOverflow(item, &overflow); - long x = i_result * b; - /* Continue if there is no overflow */ - if (overflow == 0 - && x < LONG_MAX && x > LONG_MIN - && !(b != 0 && x / b != i_result)) { + if (overflow == 0 && !_check_long_mult_overflow(i_result, b)) { + long x = i_result * b; i_result = x; Py_DECREF(item); continue; From webhook-mailer at python.org Sat Mar 9 19:26:11 2019 From: webhook-mailer at python.org (Benjamin Peterson) Date: Sun, 10 Mar 2019 00:26:11 -0000 Subject: [Python-checkins] closes bpo-33376: Update to Unicode 12.0.0. (GH-12256) Message-ID: https://github.com/python/cpython/commit/738c19f4c5475da186de03e966bd6648e5ced4c4 commit: 738c19f4c5475da186de03e966bd6648e5ced4c4 branch: master author: Benjamin Peterson committer: GitHub date: 2019-03-09T16:25:55-08:00 summary: closes bpo-33376: Update to Unicode 12.0.0. (GH-12256) files: A Misc/NEWS.d/next/Core and Builtins/2019-03-09-15-47-05.bpo-36252.sCQFKq.rst M Doc/library/stdtypes.rst M Doc/library/unicodedata.rst M Doc/reference/lexical_analysis.rst M Doc/whatsnew/3.8.rst M Lib/test/test_unicodedata.py M Modules/unicodedata_db.h M Modules/unicodename_db.h M Objects/unicodetype_db.h M Tools/unicode/makeunicodedata.py diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index c9fbfd098f2c..66915a7c560a 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -351,7 +351,7 @@ Notes: The numeric literals accepted include the digits ``0`` to ``9`` or any Unicode equivalent (code points with the ``Nd`` property). - See http://www.unicode.org/Public/10.0.0/ucd/extracted/DerivedNumericType.txt + See http://www.unicode.org/Public/12.0.0/ucd/extracted/DerivedNumericType.txt for a complete list of code points with the ``Nd`` property. diff --git a/Doc/library/unicodedata.rst b/Doc/library/unicodedata.rst index 17e848bf552b..b019fa5b3bc9 100644 --- a/Doc/library/unicodedata.rst +++ b/Doc/library/unicodedata.rst @@ -17,8 +17,8 @@ This module provides access to the Unicode Character Database (UCD) which defines character properties for all Unicode characters. The data contained in -this database is compiled from the `UCD version 11.0.0 -`_. +this database is compiled from the `UCD version 12.0.0 +`_. The module uses the same names and symbols as defined by Unicode Standard Annex #44, `"Unicode Character Database" @@ -175,6 +175,6 @@ Examples: .. rubric:: Footnotes -.. [#] http://www.unicode.org/Public/11.0.0/ucd/NameAliases.txt +.. [#] http://www.unicode.org/Public/12.0.0/ucd/NameAliases.txt -.. [#] http://www.unicode.org/Public/11.0.0/ucd/NamedSequences.txt +.. [#] http://www.unicode.org/Public/12.0.0/ucd/NamedSequences.txt diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index 6ec2f8ed5acb..fb04ccc839aa 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -316,7 +316,7 @@ The Unicode category codes mentioned above stand for: * *Nd* - decimal numbers * *Pc* - connector punctuations * *Other_ID_Start* - explicit list of characters in `PropList.txt - `_ to support backwards + `_ to support backwards compatibility * *Other_ID_Continue* - likewise diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 154fd66630ea..9cd5a3a937dc 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -157,6 +157,10 @@ Improved Modules to cast the result to the desired type: ``OrderedDict(nt._asdict())``. (Contributed by Raymond Hettinger in :issue:`35864`.) +* The :mod:`unicodedata` module has been upgraded to use the `Unicode 12.0.0 + `_ + release. + asyncio ------- diff --git a/Lib/test/test_unicodedata.py b/Lib/test/test_unicodedata.py index 170778fa977d..3c0916e26ad3 100644 --- a/Lib/test/test_unicodedata.py +++ b/Lib/test/test_unicodedata.py @@ -20,7 +20,7 @@ class UnicodeMethodsTest(unittest.TestCase): # update this, if the database changes - expectedchecksum = '97a41f208c53d5e08c77c1175187e95386b82b6f' + expectedchecksum = '9129d6f2bdf008a81c2476e5b5127014a62130c1' def test_method_checksum(self): h = hashlib.sha1() @@ -80,7 +80,7 @@ class UnicodeFunctionsTest(UnicodeDatabaseTest): # Update this if the database changes. Make sure to do a full rebuild # (e.g. 'make distclean && make') to get the correct checksum. - expectedchecksum = '4f73278b19c2ec3099724c132f0b90a1d25c19e4' + expectedchecksum = '4cb02a243aed7c251067386dd738189146fddf94' def test_function_checksum(self): data = [] h = hashlib.sha1() diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-09-15-47-05.bpo-36252.sCQFKq.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-09-15-47-05.bpo-36252.sCQFKq.rst new file mode 100644 index 000000000000..b79bc493f4fc --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-09-15-47-05.bpo-36252.sCQFKq.rst @@ -0,0 +1 @@ +Update Unicode databases to version 12.0.0. diff --git a/Modules/unicodedata_db.h b/Modules/unicodedata_db.h index c6e42302da4e..11c7dc87244a 100644 --- a/Modules/unicodedata_db.h +++ b/Modules/unicodedata_db.h @@ -1,6 +1,6 @@ -/* this file was generated by Tools/unicode/makeunicodedata.py 3.2 */ +/* this file was generated by Tools/unicode/makeunicodedata.py 3.3 */ -#define UNIDATA_VERSION "11.0.0" +#define UNIDATA_VERSION "12.0.0" /* a list of unique database records */ const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = { {0, 0, 0, 0, 0, 0}, @@ -699,7 +699,7 @@ static const char *decomp_prefix[] = { }; /* index tables for the database records */ #define SHIFT 7 -static unsigned char index1[] = { +static unsigned short index1[] = { 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, 41, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, @@ -736,40 +736,40 @@ static unsigned char index1[] = { 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 123, 124, 125, 126, 127, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 138, 41, 41, 145, 138, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 138, 157, 138, 158, 138, 159, - 160, 161, 162, 163, 164, 165, 138, 166, 167, 138, 168, 169, 170, 171, - 138, 172, 173, 138, 138, 174, 175, 138, 138, 176, 177, 178, 179, 138, - 180, 138, 138, 41, 41, 41, 41, 41, 41, 41, 181, 182, 41, 183, 138, 138, + 149, 150, 151, 152, 153, 154, 155, 156, 138, 157, 138, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 138, 167, 168, 138, 169, 170, 171, 172, + 138, 173, 174, 138, 175, 176, 177, 138, 138, 178, 179, 180, 181, 138, + 182, 138, 183, 41, 41, 41, 41, 41, 41, 41, 184, 185, 41, 186, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 41, 41, 41, 41, 41, 41, 41, 41, 184, 138, 138, + 138, 138, 138, 138, 138, 41, 41, 41, 41, 41, 41, 41, 41, 187, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 41, 41, 41, 41, 185, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 41, 41, 41, 41, 188, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 41, 41, 41, 41, 186, 187, 188, 189, 138, 138, 138, 138, 190, - 191, 192, 193, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 138, 138, 41, 41, 41, 41, 189, 190, 191, 192, 138, 138, 138, 138, 193, + 194, 195, 196, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 101, 101, 101, 101, 101, 101, 194, 101, 101, 101, 101, 101, - 195, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 101, 101, 101, 101, 101, 101, 101, 101, 197, 101, 101, 101, 101, 101, + 198, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 101, 101, 196, 101, 101, 197, 138, 138, 138, + 138, 138, 138, 138, 138, 101, 101, 199, 101, 101, 200, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 198, 199, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 201, 202, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 78, 200, - 201, 202, 203, 204, 205, 138, 206, 207, 208, 209, 210, 211, 212, 213, 78, - 78, 78, 78, 214, 215, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 216, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 217, 218, 219, 138, 138, 138, 138, 138, 220, 221, 138, 138, - 222, 223, 138, 138, 224, 225, 226, 227, 228, 138, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 78, 203, + 204, 205, 206, 207, 208, 138, 209, 210, 211, 212, 213, 214, 215, 216, 78, + 78, 78, 78, 217, 218, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 219, 138, 220, 138, 138, 221, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 222, 223, 224, 138, 138, 138, 138, 138, 225, 226, 227, 138, + 228, 229, 138, 138, 230, 231, 232, 233, 234, 138, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, @@ -794,19 +794,19 @@ static unsigned char index1[] = { 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 101, 101, 101, 244, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 251, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 245, 101, 246, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 252, 101, 253, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 247, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 254, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 101, 248, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 101, 101, 101, 255, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 122, 122, 122, 122, 249, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 122, 122, 122, 122, 256, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, @@ -1209,7 +1209,7 @@ static unsigned char index1[] = { 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 250, 138, 251, 252, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 257, 138, 258, 259, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, @@ -1282,7 +1282,7 @@ static unsigned char index1[] = { 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, - 121, 121, 121, 121, 121, 121, 121, 253, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 260, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, @@ -1319,7 +1319,7 @@ static unsigned char index1[] = { 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, - 121, 253, + 121, 260, }; static unsigned short index2[] = { @@ -1505,7 +1505,7 @@ static unsigned short index2[] = { 0, 0, 48, 135, 135, 135, 140, 140, 140, 140, 0, 135, 135, 151, 0, 135, 135, 135, 143, 0, 0, 0, 0, 0, 0, 0, 152, 153, 0, 48, 48, 48, 0, 0, 0, 0, 0, 48, 48, 135, 135, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, - 145, 0, 0, 0, 0, 0, 0, 0, 0, 154, 154, 154, 154, 154, 154, 154, 80, 48, + 145, 0, 0, 0, 0, 0, 0, 0, 83, 154, 154, 154, 154, 154, 154, 154, 80, 48, 135, 140, 140, 83, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, @@ -1534,88 +1534,89 @@ static unsigned short index2[] = { 0, 85, 48, 48, 48, 48, 48, 48, 53, 135, 159, 159, 159, 159, 135, 135, 135, 83, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 48, 0, 0, 48, 48, 0, 48, 0, - 0, 48, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, - 0, 48, 48, 48, 0, 48, 0, 48, 0, 0, 48, 48, 0, 48, 48, 48, 48, 135, 48, - 157, 135, 135, 135, 135, 160, 160, 0, 135, 135, 48, 0, 0, 48, 48, 48, 48, - 48, 0, 53, 0, 161, 161, 161, 161, 135, 135, 0, 0, 145, 145, 145, 145, - 145, 145, 145, 145, 145, 145, 0, 0, 157, 157, 48, 48, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 48, 0, 48, 48, 48, 48, 48, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 0, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 135, 48, 157, 135, 135, 135, 135, 160, 160, 143, 135, 135, 48, 0, 0, 48, + 48, 48, 48, 48, 0, 53, 0, 161, 161, 161, 161, 135, 135, 0, 0, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 157, 157, 48, 48, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 48, 80, 80, 80, 83, 83, 83, 83, 83, 83, 83, 83, 162, 83, + 83, 83, 83, 83, 83, 80, 83, 80, 80, 80, 86, 86, 80, 80, 80, 80, 80, 80, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 80, 86, 80, 86, 80, 163, 164, 165, 164, + 165, 140, 140, 48, 48, 48, 144, 48, 48, 48, 48, 0, 48, 48, 48, 48, 144, + 48, 48, 48, 48, 144, 48, 48, 48, 48, 144, 48, 48, 48, 48, 144, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 144, 48, 48, 48, 0, 0, 0, 0, 166, + 167, 168, 169, 168, 168, 170, 168, 170, 167, 167, 167, 167, 135, 140, + 167, 168, 81, 81, 143, 83, 81, 81, 48, 48, 48, 48, 48, 135, 135, 135, + 135, 135, 135, 168, 135, 135, 135, 135, 0, 135, 135, 135, 135, 168, 135, + 135, 135, 135, 168, 135, 135, 135, 135, 168, 135, 135, 135, 135, 168, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 168, 135, + 135, 135, 0, 80, 80, 80, 80, 80, 80, 80, 80, 86, 80, 80, 80, 80, 80, 80, + 0, 80, 80, 83, 83, 83, 83, 83, 80, 80, 80, 80, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 48, 80, 80, 80, 83, 83, 83, 83, 83, 83, 83, 83, 162, 83, 83, 83, - 83, 83, 83, 80, 83, 80, 80, 80, 86, 86, 80, 80, 80, 80, 80, 80, 145, 145, - 145, 145, 145, 145, 145, 145, 145, 145, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 80, 86, 80, 86, 80, 163, 164, 165, 164, 165, 140, - 140, 48, 48, 48, 144, 48, 48, 48, 48, 0, 48, 48, 48, 48, 144, 48, 48, 48, - 48, 144, 48, 48, 48, 48, 144, 48, 48, 48, 48, 144, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 144, 48, 48, 48, 0, 0, 0, 0, 166, 167, 168, - 169, 168, 168, 170, 168, 170, 167, 167, 167, 167, 135, 140, 167, 168, 81, - 81, 143, 83, 81, 81, 48, 48, 48, 48, 48, 135, 135, 135, 135, 135, 135, - 168, 135, 135, 135, 135, 0, 135, 135, 135, 135, 168, 135, 135, 135, 135, - 168, 135, 135, 135, 135, 168, 135, 135, 135, 135, 168, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 168, 135, 135, 135, 0, 80, - 80, 80, 80, 80, 80, 80, 80, 86, 80, 80, 80, 80, 80, 80, 0, 80, 80, 83, - 83, 83, 83, 83, 80, 80, 80, 80, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 141, 48, 48, 48, 48, 140, 140, 135, 150, 135, 135, 140, 135, - 135, 135, 135, 135, 146, 140, 143, 143, 140, 140, 135, 135, 48, 145, 145, - 145, 145, 145, 145, 145, 145, 145, 145, 83, 83, 83, 83, 83, 83, 48, 48, - 48, 48, 48, 48, 140, 140, 135, 135, 48, 48, 48, 48, 135, 135, 135, 48, - 140, 140, 140, 48, 48, 140, 140, 140, 140, 140, 140, 140, 48, 48, 48, - 135, 135, 135, 135, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 135, 140, 140, 135, 135, 140, 140, 140, 140, 140, 140, 86, 48, 140, 145, - 145, 145, 145, 145, 145, 145, 145, 145, 145, 140, 140, 140, 135, 80, 80, + 48, 48, 48, 48, 48, 48, 48, 141, 48, 48, 48, 48, 140, 140, 135, 150, 135, + 135, 140, 135, 135, 135, 135, 135, 146, 140, 143, 143, 140, 140, 135, + 135, 48, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 83, 83, 83, + 83, 83, 83, 48, 48, 48, 48, 48, 48, 140, 140, 135, 135, 48, 48, 48, 48, + 135, 135, 135, 48, 140, 140, 140, 48, 48, 140, 140, 140, 140, 140, 140, + 140, 48, 48, 48, 135, 135, 135, 135, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 135, 140, 140, 135, 135, 140, 140, 140, 140, 140, 140, + 86, 48, 140, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 140, 140, + 140, 135, 80, 80, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 0, 44, 0, 0, 0, 0, 0, 44, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, + 44, 44, 44, 44, 44, 44, 0, 44, 0, 0, 0, 0, 0, 44, 0, 0, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 83, - 51, 47, 47, 47, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 47, 47, 47, 83, 51, 47, 47, 47, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 48, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 48, 48, 48, 48, 48, 48, 48, 48, + 171, 171, 171, 171, 48, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 172, 172, 172, 172, 172, 172, 172, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 0, 0, - 48, 48, 48, 48, 48, 48, 48, 0, 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, + 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 0, 48, 48, 48, + 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, - 0, 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, + 48, 48, 48, 48, 48, 0, 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, + 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 81, 81, 81, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 0, 0, 0, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 81, 81, + 81, 83, 83, 83, 83, 83, 83, 83, 83, 83, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 0, + 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 0, 0, 47, 47, 47, 47, 47, 47, 0, 0, 84, 48, 48, 48, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 47, 47, 47, 47, 47, 47, 0, 0, + 84, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, @@ -1635,362 +1636,361 @@ static unsigned short index2[] = { 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 80, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 173, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 164, 165, 0, + 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 173, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 164, 165, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 83, 83, 83, 174, 174, 174, 48, 48, 48, 48, 48, 48, 48, + 48, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 0, 48, 48, 48, 48, 135, 135, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 135, 135, 143, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 48, 48, 48, 0, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 83, 83, 83, 174, 174, 174, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, - 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, - 48, 48, 48, 135, 135, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, - 143, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, - 48, 48, 0, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 140, + 135, 135, 135, 135, 135, 135, 135, 140, 140, 140, 140, 140, 140, 140, + 140, 135, 140, 140, 135, 135, 135, 135, 135, 135, 135, 135, 135, 143, + 135, 83, 83, 83, 53, 83, 83, 83, 85, 48, 81, 0, 0, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 0, 0, 0, 0, 0, 0, 138, 138, 138, 138, 138, 138, + 84, 138, 138, 138, 138, 135, 135, 135, 175, 0, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 140, 135, 135, - 135, 135, 135, 135, 135, 140, 140, 140, 140, 140, 140, 140, 140, 135, - 140, 140, 135, 135, 135, 135, 135, 135, 135, 135, 135, 143, 135, 83, 83, - 83, 53, 83, 83, 83, 85, 48, 81, 0, 0, 145, 145, 145, 145, 145, 145, 145, - 145, 145, 145, 0, 0, 0, 0, 0, 0, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 0, 0, 0, 0, 0, 0, 138, 138, 138, 138, 138, 138, 84, 138, 138, - 138, 138, 135, 135, 135, 175, 0, 145, 145, 145, 145, 145, 145, 145, 145, - 145, 145, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 53, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, + 48, 48, 135, 135, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 135, - 135, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 88, - 48, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 88, 48, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 0, 135, 135, 135, 140, 140, 140, 140, 135, 135, 140, - 140, 140, 0, 0, 0, 0, 140, 140, 135, 140, 140, 140, 140, 140, 140, 87, - 81, 86, 0, 0, 0, 0, 26, 0, 0, 0, 138, 138, 145, 145, 145, 145, 145, 145, - 145, 145, 145, 145, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, - 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 0, 135, 135, 135, 140, 140, 140, 140, + 135, 135, 140, 140, 140, 0, 0, 0, 0, 140, 140, 135, 140, 140, 140, 140, + 140, 140, 87, 81, 86, 0, 0, 0, 0, 26, 0, 0, 0, 138, 138, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, - 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 149, 0, 0, 0, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 81, 86, 140, 140, 135, 0, 0, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 149, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 81, 86, 140, 140, 135, 0, 0, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 135, 140, 135, 135, 135, 135, - 135, 135, 135, 0, 143, 140, 135, 140, 140, 135, 135, 135, 135, 135, 135, - 135, 135, 140, 140, 140, 140, 140, 140, 135, 135, 81, 81, 81, 81, 81, 81, - 81, 81, 0, 0, 86, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, - 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, - 0, 0, 83, 83, 83, 83, 83, 83, 83, 53, 83, 83, 83, 83, 83, 83, 0, 0, 81, - 81, 81, 81, 81, 86, 86, 86, 86, 86, 86, 81, 81, 86, 82, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 135, 140, + 135, 135, 135, 135, 135, 135, 135, 0, 143, 140, 135, 140, 140, 135, 135, + 135, 135, 135, 135, 135, 135, 140, 140, 140, 140, 140, 140, 135, 135, 81, + 81, 81, 81, 81, 81, 81, 81, 0, 0, 86, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 0, 0, 0, 0, 0, 0, 83, 83, 83, 83, 83, 83, 83, 53, 83, 83, 83, + 83, 83, 83, 0, 0, 81, 81, 81, 81, 81, 86, 86, 86, 86, 86, 86, 81, 81, 86, + 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 135, 135, 135, 140, 48, 141, 48, - 141, 48, 141, 48, 141, 48, 141, 48, 48, 48, 141, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 135, 135, 135, + 140, 48, 141, 48, 141, 48, 141, 48, 141, 48, 141, 48, 48, 48, 141, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 146, 147, 135, 135, 135, 135, 135, - 148, 135, 148, 140, 140, 148, 148, 135, 148, 176, 48, 48, 48, 48, 48, 48, - 48, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 83, 83, - 83, 83, 83, 83, 83, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, 86, 81, - 81, 81, 81, 81, 81, 81, 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 0, 135, - 135, 140, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 135, 135, - 135, 135, 140, 140, 135, 135, 176, 143, 135, 135, 48, 48, 145, 145, 145, - 145, 145, 145, 145, 145, 145, 145, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 146, 147, 135, + 135, 135, 135, 135, 148, 135, 148, 140, 140, 148, 148, 135, 148, 176, 48, + 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 83, 83, 83, 83, 83, 83, 83, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 81, 86, 81, 81, 81, 81, 81, 81, 81, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 0, 0, 0, 135, 135, 140, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 146, - 140, 135, 135, 140, 140, 140, 135, 140, 135, 135, 135, 176, 176, 0, 0, 0, - 0, 0, 0, 0, 0, 83, 83, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 140, 135, 135, 135, 135, 140, 140, 135, 135, 176, 143, 135, + 135, 48, 48, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 140, 140, 140, 140, 140, 140, 140, 140, - 135, 135, 135, 135, 135, 135, 135, 135, 140, 140, 135, 146, 0, 0, 0, 83, - 83, 83, 83, 83, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, - 0, 48, 48, 48, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 53, 53, 53, 53, 53, 83, 83, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 48, 48, 48, 48, 48, 48, 146, 140, 135, 135, 140, 140, 140, 135, 140, 135, + 135, 135, 176, 176, 0, 0, 0, 0, 0, 0, 0, 0, 83, 83, 83, 83, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 140, + 140, 140, 140, 140, 140, 140, 135, 135, 135, 135, 135, 135, 135, 135, + 140, 140, 135, 146, 0, 0, 0, 83, 83, 83, 83, 83, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 0, 0, 0, 48, 48, 48, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 53, 53, 53, 53, 53, 53, 83, 83, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, + 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 0, 0, 44, 44, 44, 83, 83, 83, 83, 83, 83, 83, 83, 0, 0, 0, 0, - 0, 0, 0, 0, 81, 81, 81, 83, 177, 86, 86, 86, 86, 86, 81, 81, 86, 86, 86, - 86, 81, 140, 177, 177, 177, 177, 177, 177, 177, 48, 48, 48, 48, 86, 48, - 48, 48, 48, 140, 140, 81, 48, 48, 140, 81, 81, 0, 0, 0, 0, 0, 0, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 44, 44, 44, 83, 83, 83, + 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 81, 81, 81, 83, 177, 86, 86, + 86, 86, 86, 81, 81, 86, 86, 86, 86, 81, 140, 177, 177, 177, 177, 177, + 177, 177, 48, 48, 48, 48, 86, 48, 48, 48, 48, 48, 48, 81, 48, 48, 140, + 81, 81, 48, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 51, 51, 51, 53, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 53, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 53, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 51, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 51, 51, 51, + 53, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 53, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 53, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 51, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 81, 81, 86, 81, 81, 81, 81, 81, - 81, 81, 86, 81, 81, 178, 179, 86, 180, 81, 81, 81, 81, 81, 81, 81, 81, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 81, 81, 86, 81, 81, 81, 81, 81, 81, 81, 86, 81, 81, 178, 179, 86, + 180, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 181, 88, 88, 86, 0, 81, 182, - 86, 81, 86, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, - 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, - 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, - 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, - 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, - 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, - 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, - 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, - 43, 38, 43, 38, 43, 38, 43, 38, 43, 43, 43, 43, 43, 35, 183, 47, 47, 44, - 47, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, - 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, - 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, - 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, - 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, - 43, 44, 47, 44, 47, 44, 47, 43, 43, 43, 43, 43, 43, 43, 43, 38, 38, 38, - 38, 38, 38, 38, 38, 43, 43, 43, 43, 43, 43, 0, 0, 38, 38, 38, 38, 38, 38, - 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, 38, 38, 38, 38, 38, 38, 38, 38, 43, - 43, 43, 43, 43, 43, 43, 43, 38, 38, 38, 38, 38, 38, 38, 38, 43, 43, 43, - 43, 43, 43, 0, 0, 38, 38, 38, 38, 38, 38, 0, 0, 43, 43, 43, 43, 43, 43, - 43, 43, 0, 38, 0, 38, 0, 38, 0, 38, 43, 43, 43, 43, 43, 43, 43, 43, 38, - 38, 38, 38, 38, 38, 38, 38, 43, 184, 43, 184, 43, 184, 43, 184, 43, 184, - 43, 184, 43, 184, 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, 185, 185, 185, - 185, 185, 185, 185, 185, 43, 43, 43, 43, 43, 43, 43, 43, 185, 185, 185, - 185, 185, 185, 185, 185, 43, 43, 43, 43, 43, 43, 43, 43, 185, 185, 185, - 185, 185, 185, 185, 185, 43, 43, 43, 43, 43, 0, 43, 43, 38, 38, 38, 186, - 185, 58, 184, 58, 58, 76, 43, 43, 43, 0, 43, 43, 38, 186, 38, 186, 185, - 76, 76, 76, 43, 43, 43, 184, 0, 0, 43, 43, 38, 38, 38, 186, 0, 76, 76, - 76, 43, 43, 43, 184, 43, 43, 43, 43, 38, 38, 38, 186, 38, 76, 187, 187, - 0, 0, 43, 43, 43, 0, 43, 43, 38, 186, 38, 186, 185, 187, 58, 0, 188, 188, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 175, 175, 175, 190, 191, - 192, 193, 84, 192, 192, 192, 22, 194, 195, 196, 197, 198, 195, 196, 197, - 198, 22, 22, 22, 138, 199, 199, 199, 22, 200, 201, 202, 203, 204, 205, - 206, 21, 207, 110, 207, 208, 209, 22, 194, 194, 138, 28, 36, 22, 194, - 138, 199, 210, 210, 138, 138, 138, 211, 164, 165, 194, 194, 194, 138, - 138, 138, 138, 138, 138, 138, 138, 78, 138, 210, 138, 138, 194, 138, 138, - 138, 138, 138, 138, 138, 189, 175, 175, 175, 175, 175, 0, 212, 213, 214, - 215, 175, 175, 175, 175, 175, 175, 216, 51, 0, 0, 34, 216, 216, 216, 216, - 216, 217, 217, 218, 219, 220, 221, 216, 34, 34, 34, 34, 216, 216, 216, - 216, 216, 217, 217, 218, 219, 220, 0, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 0, 0, 0, 85, 85, 85, 85, 85, 85, 85, 85, 222, 223, 85, - 85, 23, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 81, 177, - 177, 81, 81, 81, 81, 177, 177, 177, 81, 81, 82, 82, 82, 82, 81, 82, 82, - 82, 177, 177, 81, 86, 81, 177, 177, 86, 86, 86, 86, 81, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 49, 225, 26, 225, 224, 49, 26, 225, - 35, 49, 49, 49, 35, 35, 49, 49, 49, 46, 26, 49, 225, 26, 78, 49, 49, 49, - 49, 49, 26, 26, 224, 225, 225, 26, 49, 26, 226, 26, 49, 26, 186, 226, 49, - 49, 227, 35, 49, 49, 44, 49, 35, 157, 157, 157, 157, 35, 26, 224, 35, 35, - 49, 49, 228, 78, 78, 78, 78, 49, 35, 35, 35, 35, 26, 78, 26, 26, 47, 80, - 229, 229, 229, 37, 37, 229, 229, 229, 229, 229, 229, 37, 37, 37, 37, 229, - 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 231, 231, - 231, 231, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 231, 231, - 231, 231, 231, 231, 174, 174, 174, 44, 47, 174, 174, 174, 174, 37, 26, - 26, 0, 0, 0, 0, 40, 40, 40, 40, 40, 30, 30, 30, 30, 30, 232, 232, 26, 26, - 26, 26, 78, 26, 26, 78, 26, 26, 78, 26, 26, 26, 26, 26, 26, 26, 232, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 233, 232, 232, 26, 26, 40, - 26, 40, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 40, 234, 235, 235, 236, 78, 78, 40, - 235, 236, 234, 235, 236, 234, 78, 40, 78, 235, 237, 238, 78, 235, 234, - 78, 78, 78, 235, 234, 234, 235, 40, 235, 235, 234, 234, 40, 236, 40, 236, - 40, 40, 40, 40, 235, 239, 228, 235, 228, 228, 234, 234, 234, 40, 40, 40, - 40, 78, 234, 78, 234, 235, 235, 234, 234, 234, 236, 234, 234, 236, 234, - 234, 236, 235, 236, 234, 234, 235, 78, 78, 78, 78, 78, 235, 234, 234, - 234, 78, 78, 78, 78, 78, 78, 78, 78, 78, 234, 240, 40, 236, 78, 235, 235, - 235, 235, 234, 234, 235, 235, 78, 232, 240, 240, 236, 236, 234, 234, 236, - 236, 234, 234, 236, 236, 234, 234, 234, 234, 234, 234, 236, 236, 235, - 235, 236, 236, 235, 235, 236, 236, 234, 234, 234, 78, 78, 234, 234, 234, - 234, 78, 78, 40, 78, 78, 234, 40, 78, 78, 78, 78, 78, 78, 78, 78, 234, - 234, 78, 40, 234, 234, 234, 234, 234, 234, 236, 236, 236, 236, 234, 234, - 234, 234, 234, 234, 234, 234, 234, 78, 78, 78, 78, 78, 234, 235, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 234, 234, 234, 234, 234, 78, 78, 234, 234, - 78, 78, 78, 78, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 236, - 236, 236, 236, 234, 234, 234, 234, 234, 234, 236, 236, 236, 236, 78, 78, - 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, - 234, 234, 26, 26, 26, 26, 26, 26, 26, 26, 164, 165, 164, 165, 26, 26, 26, - 26, 26, 26, 30, 26, 26, 26, 26, 26, 26, 26, 241, 241, 26, 26, 26, 26, - 234, 234, 26, 26, 26, 26, 26, 26, 26, 242, 243, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 81, 81, 181, 88, 88, 86, 0, 81, 182, 86, 81, 86, 38, 43, 38, 43, 38, 43, + 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, + 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, + 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, + 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, + 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, + 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, + 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, + 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, + 43, 43, 43, 43, 35, 183, 47, 47, 44, 47, 38, 43, 38, 43, 38, 43, 38, 43, + 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, + 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, + 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, + 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, + 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 44, 47, 44, 47, 44, 47, 43, 43, + 43, 43, 43, 43, 43, 43, 38, 38, 38, 38, 38, 38, 38, 38, 43, 43, 43, 43, + 43, 43, 0, 0, 38, 38, 38, 38, 38, 38, 0, 0, 43, 43, 43, 43, 43, 43, 43, + 43, 38, 38, 38, 38, 38, 38, 38, 38, 43, 43, 43, 43, 43, 43, 43, 43, 38, + 38, 38, 38, 38, 38, 38, 38, 43, 43, 43, 43, 43, 43, 0, 0, 38, 38, 38, 38, + 38, 38, 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, 0, 38, 0, 38, 0, 38, 0, 38, + 43, 43, 43, 43, 43, 43, 43, 43, 38, 38, 38, 38, 38, 38, 38, 38, 43, 184, + 43, 184, 43, 184, 43, 184, 43, 184, 43, 184, 43, 184, 0, 0, 43, 43, 43, + 43, 43, 43, 43, 43, 185, 185, 185, 185, 185, 185, 185, 185, 43, 43, 43, + 43, 43, 43, 43, 43, 185, 185, 185, 185, 185, 185, 185, 185, 43, 43, 43, + 43, 43, 43, 43, 43, 185, 185, 185, 185, 185, 185, 185, 185, 43, 43, 43, + 43, 43, 0, 43, 43, 38, 38, 38, 186, 185, 58, 184, 58, 58, 76, 43, 43, 43, + 0, 43, 43, 38, 186, 38, 186, 185, 76, 76, 76, 43, 43, 43, 184, 0, 0, 43, + 43, 38, 38, 38, 186, 0, 76, 76, 76, 43, 43, 43, 184, 43, 43, 43, 43, 38, + 38, 38, 186, 38, 76, 187, 187, 0, 0, 43, 43, 43, 0, 43, 43, 38, 186, 38, + 186, 185, 187, 58, 0, 188, 188, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 175, 175, 175, 190, 191, 192, 193, 84, 192, 192, 192, 22, 194, 195, + 196, 197, 198, 195, 196, 197, 198, 22, 22, 22, 138, 199, 199, 199, 22, + 200, 201, 202, 203, 204, 205, 206, 21, 207, 110, 207, 208, 209, 22, 194, + 194, 138, 28, 36, 22, 194, 138, 199, 210, 210, 138, 138, 138, 211, 164, + 165, 194, 194, 194, 138, 138, 138, 138, 138, 138, 138, 138, 78, 138, 210, + 138, 138, 194, 138, 138, 138, 138, 138, 138, 138, 189, 175, 175, 175, + 175, 175, 0, 212, 213, 214, 215, 175, 175, 175, 175, 175, 175, 216, 51, + 0, 0, 34, 216, 216, 216, 216, 216, 217, 217, 218, 219, 220, 221, 216, 34, + 34, 34, 34, 216, 216, 216, 216, 216, 217, 217, 218, 219, 220, 0, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0, 0, 0, 85, 85, 85, 85, 85, + 85, 85, 85, 222, 223, 85, 85, 23, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 81, 81, 177, 177, 81, 81, 81, 81, 177, 177, 177, 81, 81, 82, + 82, 82, 82, 81, 82, 82, 82, 177, 177, 81, 86, 81, 177, 177, 86, 86, 86, + 86, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 49, 225, + 26, 225, 224, 49, 26, 225, 35, 49, 49, 49, 35, 35, 49, 49, 49, 46, 26, + 49, 225, 26, 78, 49, 49, 49, 49, 49, 26, 26, 224, 225, 225, 26, 49, 26, + 226, 26, 49, 26, 186, 226, 49, 49, 227, 35, 49, 49, 44, 49, 35, 157, 157, + 157, 157, 35, 26, 224, 35, 35, 49, 49, 228, 78, 78, 78, 78, 49, 35, 35, + 35, 35, 26, 78, 26, 26, 47, 80, 229, 229, 229, 37, 37, 229, 229, 229, + 229, 229, 229, 37, 37, 37, 37, 229, 230, 230, 230, 230, 230, 230, 230, + 230, 230, 230, 230, 230, 231, 231, 231, 231, 230, 230, 230, 230, 230, + 230, 230, 230, 230, 230, 231, 231, 231, 231, 231, 231, 174, 174, 174, 44, + 47, 174, 174, 174, 174, 37, 26, 26, 0, 0, 0, 0, 40, 40, 40, 40, 40, 30, + 30, 30, 30, 30, 232, 232, 26, 26, 26, 26, 78, 26, 26, 78, 26, 26, 78, 26, + 26, 26, 26, 26, 26, 26, 232, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 30, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 233, 232, 232, 26, 26, 40, 26, 40, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 40, + 234, 235, 235, 236, 78, 78, 40, 235, 236, 234, 235, 236, 234, 78, 40, 78, + 235, 237, 238, 78, 235, 234, 78, 78, 78, 235, 234, 234, 235, 40, 235, + 235, 234, 234, 40, 236, 40, 236, 40, 40, 40, 40, 235, 239, 228, 235, 228, + 228, 234, 234, 234, 40, 40, 40, 40, 78, 234, 78, 234, 235, 235, 234, 234, + 234, 236, 234, 234, 236, 234, 234, 236, 235, 236, 234, 234, 235, 78, 78, + 78, 78, 78, 235, 234, 234, 234, 78, 78, 78, 78, 78, 78, 78, 78, 78, 234, + 240, 40, 236, 78, 235, 235, 235, 235, 234, 234, 235, 235, 78, 232, 240, + 240, 236, 236, 234, 234, 236, 236, 234, 234, 236, 236, 234, 234, 234, + 234, 234, 234, 236, 236, 235, 235, 236, 236, 235, 235, 236, 236, 234, + 234, 234, 78, 78, 234, 234, 234, 234, 78, 78, 40, 78, 78, 234, 40, 78, + 78, 78, 78, 78, 78, 78, 78, 234, 234, 78, 40, 234, 234, 234, 234, 234, + 234, 236, 236, 236, 236, 234, 234, 234, 234, 234, 234, 234, 234, 234, 78, + 78, 78, 78, 78, 234, 235, 78, 78, 78, 78, 78, 78, 78, 78, 78, 234, 234, + 234, 234, 234, 78, 78, 234, 234, 78, 78, 78, 78, 234, 234, 234, 234, 234, + 234, 234, 234, 234, 234, 236, 236, 236, 236, 234, 234, 234, 234, 234, + 234, 236, 236, 236, 236, 78, 78, 234, 234, 234, 234, 234, 234, 234, 234, + 234, 234, 234, 234, 234, 234, 234, 234, 26, 26, 26, 26, 26, 26, 26, 26, + 164, 165, 164, 165, 26, 26, 26, 26, 26, 26, 30, 26, 26, 26, 26, 26, 26, + 26, 241, 241, 26, 26, 26, 26, 234, 234, 26, 26, 26, 26, 26, 26, 26, 242, + 243, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 26, 78, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 80, 26, 26, 26, 26, 26, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 26, 78, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 80, + 26, 26, 26, 26, 26, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 78, 78, 78, 78, 78, 78, 26, 26, 26, - 26, 26, 26, 26, 241, 241, 241, 241, 26, 26, 26, 241, 26, 26, 241, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 78, 78, + 78, 78, 78, 78, 26, 26, 26, 26, 26, 26, 26, 241, 241, 241, 241, 26, 26, + 26, 241, 26, 26, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 244, 244, 244, 244, 244, 244, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, - 244, 244, 229, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, - 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 30, 30, 30, 30, 30, 30, + 244, 244, 244, 244, 244, 244, 229, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 26, 26, - 26, 26, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 26, 26, 26, 26, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 26, 26, 30, 30, 30, 30, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 30, 26, 30, 30, 30, 30, 30, - 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 30, 30, 26, 26, 30, 40, 26, 26, - 26, 26, 30, 30, 26, 26, 30, 40, 26, 26, 26, 26, 30, 30, 30, 26, 26, 30, - 26, 26, 30, 30, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 30, 30, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, - 26, 26, 26, 26, 26, 26, 26, 26, 78, 78, 78, 78, 78, 246, 246, 78, 26, 26, - 26, 26, 26, 30, 30, 26, 26, 30, 26, 26, 26, 26, 30, 30, 26, 26, 26, 26, - 241, 241, 26, 26, 26, 26, 26, 26, 30, 26, 30, 26, 26, 26, 26, 26, 26, 26, + 30, 30, 30, 30, 30, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 26, + 26, 30, 30, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 30, 26, + 30, 30, 30, 30, 30, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 30, 30, 26, + 26, 30, 40, 26, 26, 26, 26, 30, 30, 26, 26, 30, 40, 26, 26, 26, 26, 30, + 30, 30, 26, 26, 30, 26, 26, 30, 30, 30, 30, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 30, 30, 30, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 30, 26, 26, 26, 26, 26, 26, 26, 26, 78, 78, 78, 78, 78, + 246, 246, 78, 26, 26, 26, 26, 26, 30, 30, 26, 26, 30, 26, 26, 26, 26, 30, + 30, 26, 26, 26, 26, 241, 241, 26, 26, 26, 26, 26, 26, 30, 26, 30, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 26, 30, 26, 26, + 26, 26, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 30, 26, 30, 30, 30, + 26, 30, 30, 30, 30, 26, 30, 30, 26, 40, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 30, 30, 26, 241, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 80, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, + 30, 26, 26, 26, 26, 241, 241, 30, 30, 30, 30, 30, 30, 30, 30, 241, 30, + 30, 30, 30, 30, 241, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 26, 30, 26, 26, 26, 26, 30, 30, 241, 30, 30, 30, 30, 30, 30, 30, 241, + 241, 30, 241, 30, 30, 30, 30, 241, 30, 30, 241, 30, 30, 26, 26, 26, 26, + 26, 241, 26, 26, 26, 26, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 30, 26, 30, 26, 26, 26, 26, 26, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 30, 30, 26, 30, 30, 30, 26, 30, 30, 30, 30, 26, - 30, 30, 26, 40, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 30, 26, 241, - 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 80, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 30, 26, 26, 26, 26, 241, - 241, 30, 30, 30, 30, 30, 30, 30, 30, 241, 30, 30, 30, 30, 30, 241, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 26, 30, 26, 26, 26, 26, - 30, 30, 241, 30, 30, 30, 30, 30, 30, 30, 241, 241, 30, 241, 30, 30, 30, - 30, 241, 30, 30, 241, 30, 30, 26, 26, 26, 26, 26, 241, 26, 26, 26, 26, - 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 26, 241, 26, 26, 26, - 26, 241, 241, 241, 26, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 164, 165, 164, 165, 164, 165, 164, 165, 164, 165, - 164, 165, 164, 165, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 26, 241, 241, 241, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 241, 26, 241, 26, 26, 26, 26, 241, 241, 241, 26, 241, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 164, 165, 164, 165, 164, + 165, 164, 165, 164, 165, 164, 165, 164, 165, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 26, 241, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 234, - 78, 78, 234, 234, 164, 165, 78, 234, 234, 78, 234, 234, 234, 78, 78, 78, - 78, 78, 234, 234, 234, 234, 78, 78, 78, 78, 78, 234, 234, 234, 78, 78, - 78, 234, 234, 234, 234, 9, 10, 9, 10, 9, 10, 9, 10, 164, 165, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 80, 80, 80, 80, 80, + 26, 26, 26, 26, 26, 26, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 241, 234, 78, 78, 234, 234, 164, 165, 78, 234, 234, 78, 234, + 234, 234, 78, 78, 78, 78, 78, 234, 234, 234, 234, 78, 78, 78, 78, 78, + 234, 234, 234, 78, 78, 78, 234, 234, 234, 234, 9, 10, 9, 10, 9, 10, 9, + 10, 164, 165, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 78, 78, 78, + 80, 80, 80, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 164, 165, 9, 10, 164, 165, 164, 165, 164, 165, 164, 165, 164, - 165, 164, 165, 164, 165, 164, 165, 164, 165, 78, 78, 234, 234, 234, 234, - 234, 234, 78, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, - 234, 234, 78, 78, 78, 78, 78, 78, 78, 78, 234, 78, 78, 78, 78, 78, 78, - 78, 234, 234, 234, 234, 234, 234, 78, 78, 78, 234, 78, 78, 78, 78, 234, - 234, 234, 234, 234, 78, 234, 234, 78, 78, 164, 165, 164, 165, 234, 78, - 78, 78, 78, 234, 78, 234, 234, 234, 78, 78, 234, 234, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 234, 234, 234, 234, 234, 234, 78, 78, 164, 165, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 234, 234, 228, 234, 234, 234, - 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 78, 234, - 234, 234, 234, 78, 78, 234, 78, 234, 78, 78, 234, 78, 234, 234, 234, 234, - 78, 78, 78, 78, 78, 234, 234, 78, 78, 78, 78, 78, 78, 234, 234, 234, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 234, 234, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 234, 234, 78, 78, 78, 78, 234, 234, 234, 234, 78, 234, 234, 78, 78, 234, - 228, 218, 218, 78, 78, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, + 78, 78, 78, 78, 78, 78, 78, 78, 164, 165, 9, 10, 164, 165, 164, 165, 164, + 165, 164, 165, 164, 165, 164, 165, 164, 165, 164, 165, 164, 165, 78, 78, + 234, 234, 234, 234, 234, 234, 78, 234, 234, 234, 234, 234, 234, 234, 234, + 234, 234, 234, 234, 234, 234, 78, 78, 78, 78, 78, 78, 78, 78, 234, 78, + 78, 78, 78, 78, 78, 78, 234, 234, 234, 234, 234, 234, 78, 78, 78, 234, + 78, 78, 78, 78, 234, 234, 234, 234, 234, 78, 234, 234, 78, 78, 164, 165, + 164, 165, 234, 78, 78, 78, 78, 234, 78, 234, 234, 234, 78, 78, 234, 234, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 234, 234, 234, 234, 234, 234, 78, + 78, 164, 165, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 234, 234, + 228, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, + 234, 234, 234, 78, 234, 234, 234, 234, 78, 78, 234, 78, 234, 78, 78, 234, + 78, 234, 234, 234, 234, 78, 78, 78, 78, 78, 234, 234, 78, 78, 78, 78, 78, + 78, 234, 234, 234, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 234, 234, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 234, 234, 78, 78, 78, 78, 234, 234, 234, 234, 78, + 234, 234, 78, 78, 234, 228, 218, 218, 78, 78, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, - 234, 234, 234, 234, 234, 78, 78, 234, 234, 234, 234, 234, 234, 234, 234, - 78, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, + 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 78, 78, 234, 234, 234, + 234, 234, 234, 234, 234, 78, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, - 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 78, 78, 78, - 78, 78, 247, 78, 234, 78, 78, 78, 234, 234, 234, 234, 234, 78, 78, 78, - 78, 78, 234, 234, 234, 78, 78, 78, 78, 234, 78, 78, 78, 234, 234, 234, - 234, 234, 78, 234, 78, 78, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, + 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, + 234, 234, 234, 78, 78, 78, 78, 78, 247, 78, 234, 78, 78, 78, 234, 234, + 234, 234, 234, 78, 78, 78, 78, 78, 234, 234, 234, 78, 78, 78, 78, 234, + 78, 78, 78, 234, 234, 234, 234, 234, 78, 234, 78, 78, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 26, 26, 78, 78, 78, 78, 78, 78, 26, 26, 26, 241, 26, 26, - 26, 26, 241, 30, 30, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 26, 26, + 26, 26, 26, 26, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 26, 26, 78, 78, 78, 78, 78, 78, + 26, 26, 26, 241, 26, 26, 26, 26, 241, 30, 30, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 26, 26, 26, 26, 26, + 26, 26, 26, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 248, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 248, 26, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 44, 44, 44, 44, 44, 44, 44, 44, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 44, 47, 44, - 44, 44, 47, 47, 44, 47, 44, 47, 44, 47, 44, 44, 44, 44, 47, 44, 47, 47, - 44, 47, 47, 47, 47, 47, 47, 51, 51, 44, 44, 44, 47, 44, 47, 44, 47, 44, + 47, 47, 0, 44, 47, 44, 44, 44, 47, 47, 44, 47, 44, 47, 44, 47, 44, 44, + 44, 44, 47, 44, 47, 47, 44, 47, 47, 47, 47, 47, 47, 51, 51, 44, 44, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, - 47, 44, 47, 47, 26, 26, 26, 26, 26, 26, 44, 47, 44, 47, 81, 81, 81, 44, - 47, 0, 0, 0, 0, 0, 138, 138, 138, 138, 154, 138, 138, 47, 47, 47, 47, 47, + 47, 44, 47, 44, 47, 44, 47, 44, 47, 47, 26, 26, 26, 26, 26, 26, 44, 47, + 44, 47, 81, 81, 81, 44, 47, 0, 0, 0, 0, 0, 138, 138, 138, 138, 154, 138, + 138, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 0, 0, - 0, 0, 0, 47, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 47, 47, 47, 0, 47, 0, 0, 0, 0, 0, 47, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 51, 83, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, - 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, - 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, - 0, 48, 48, 48, 48, 48, 48, 48, 0, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 51, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, + 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, + 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, + 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 138, 138, 28, 36, 28, 36, 138, 138, 138, 28, 36, 138, 28, - 36, 138, 138, 138, 138, 138, 138, 138, 138, 138, 84, 138, 138, 84, 138, - 28, 36, 138, 138, 28, 36, 164, 165, 164, 165, 164, 165, 164, 165, 138, - 138, 138, 138, 138, 52, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 84, 84, 138, 138, 138, 138, 84, 138, 197, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 138, 138, 28, 36, 28, 36, 138, + 138, 138, 28, 36, 138, 28, 36, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 84, 138, 138, 84, 138, 28, 36, 138, 138, 28, 36, 164, 165, 164, 165, + 164, 165, 164, 165, 138, 138, 138, 138, 138, 52, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 84, 84, 138, 138, 138, 138, 84, 138, 197, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 0, 241, 241, 241, 241, 249, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 0, 241, 241, 241, 241, + 249, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, @@ -2005,63 +2005,63 @@ static unsigned short index2[] = { 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, - 249, 249, 249, 249, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 0, 0, 0, 0, 250, 251, 251, 251, 241, 252, 171, 253, - 254, 255, 254, 255, 254, 255, 254, 255, 254, 255, 241, 241, 254, 255, - 254, 255, 254, 255, 254, 255, 256, 257, 258, 258, 241, 253, 253, 253, - 253, 253, 253, 253, 253, 253, 259, 260, 261, 262, 263, 263, 256, 252, - 252, 252, 252, 252, 249, 241, 264, 264, 264, 252, 171, 251, 241, 26, 0, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 265, 171, 265, - 171, 265, 171, 265, 171, 265, 171, 265, 171, 265, 171, 265, 171, 265, - 171, 265, 171, 265, 171, 265, 171, 171, 265, 171, 265, 171, 265, 171, - 171, 171, 171, 171, 171, 265, 265, 171, 265, 265, 171, 265, 265, 171, - 265, 265, 171, 265, 265, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 265, - 171, 171, 0, 0, 266, 266, 267, 267, 252, 268, 269, 256, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 265, 171, 265, 171, 265, 171, + 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 0, 0, 0, 0, 250, + 251, 251, 251, 241, 252, 171, 253, 254, 255, 254, 255, 254, 255, 254, + 255, 254, 255, 241, 241, 254, 255, 254, 255, 254, 255, 254, 255, 256, + 257, 258, 258, 241, 253, 253, 253, 253, 253, 253, 253, 253, 253, 259, + 260, 261, 262, 263, 263, 256, 252, 252, 252, 252, 252, 249, 241, 264, + 264, 264, 252, 171, 251, 241, 26, 0, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 265, 171, 265, 171, 265, 171, 265, 171, 265, 171, 265, 171, 265, 171, 265, 171, 265, 171, 265, 171, 265, 171, 265, 171, - 265, 171, 265, 171, 171, 265, 171, 265, 171, 265, 171, 171, 171, 171, - 171, 171, 265, 265, 171, 265, 265, 171, 265, 265, 171, 265, 265, 171, - 265, 265, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 265, 171, 171, 265, - 265, 265, 265, 251, 252, 252, 268, 269, 0, 0, 0, 0, 0, 171, 171, 171, + 171, 265, 171, 265, 171, 265, 171, 171, 171, 171, 171, 171, 265, 265, + 171, 265, 265, 171, 265, 265, 171, 265, 265, 171, 265, 265, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 265, 171, 171, 0, 0, 266, 266, 267, 267, + 252, 268, 269, 256, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 265, 171, 265, 171, 265, 171, 265, 171, 265, 171, 265, 171, 265, + 171, 265, 171, 265, 171, 265, 171, 265, 171, 265, 171, 171, 265, 171, + 265, 171, 265, 171, 171, 171, 171, 171, 171, 265, 265, 171, 265, 265, + 171, 265, 265, 171, 265, 265, 171, 265, 265, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 265, 171, 171, 265, 265, 265, 265, 251, 252, 252, 268, + 269, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 269, 269, + 171, 171, 171, 171, 171, 0, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, 0, 270, 270, 271, 271, 271, 271, - 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 171, 171, 171, 171, + 269, 0, 270, 270, 271, 271, 271, 271, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 241, 241, + 171, 171, 0, 0, 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 249, 249, 0, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, - 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 273, 273, 273, 273, 273, 273, 273, 273, 249, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 249, 249, 0, 271, 271, 271, 271, + 271, 271, 271, 271, 271, 271, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 249, 249, - 249, 270, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 273, 273, 273, 273, 273, 273, + 273, 273, 249, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 249, 249, 249, 270, 271, 271, 271, 271, 271, 271, + 271, 271, 271, 271, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 272, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 249, 249, 249, 249, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 249, 249, 249, 249, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 0, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 0, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, @@ -2069,17 +2069,17 @@ static unsigned short index2[] = { 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 249, 249, 249, 249, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 249, 249, 249, 249, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 249, 249, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 249, 249, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 249, 171, 171, 171, 171, 171, 171, 171, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 249, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, @@ -2092,11 +2092,11 @@ static unsigned short index2[] = { 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 171, 171, 171, 171, 171, 171, 171, 171, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, @@ -2104,10 +2104,10 @@ static unsigned short index2[] = { 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 252, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 252, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, @@ -2115,99 +2115,99 @@ static unsigned short index2[] = { 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 241, 241, 241, 241, 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 53, 53, 53, 53, - 53, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 138, 138, - 138, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 145, - 145, 145, 145, 145, 145, 145, 145, 145, 145, 48, 48, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 47, 44, 47, 44, 47, 44, 47, - 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, - 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, - 44, 47, 48, 81, 82, 82, 82, 138, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 138, 52, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, - 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 51, 51, 81, 81, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 53, 53, 53, 53, 53, 53, 83, 83, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 53, 138, 138, 138, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 48, 81, 82, 82, 82, 138, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 138, 52, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 51, 51, 81, 81, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 174, 174, 174, - 174, 174, 174, 174, 174, 174, 174, 81, 81, 83, 83, 83, 83, 83, 83, 0, 0, - 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 54, 54, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 47, 47, - 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, - 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, - 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, - 44, 47, 44, 47, 44, 47, 44, 47, 51, 47, 47, 47, 47, 47, 47, 47, 47, 44, - 47, 44, 47, 44, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 52, 275, 275, 44, - 47, 44, 47, 48, 44, 47, 44, 47, 47, 47, 44, 47, 44, 47, 44, 47, 44, 47, - 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 44, 44, 44, 44, 47, - 44, 44, 44, 44, 44, 47, 44, 47, 44, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 48, 51, 51, 47, 48, 48, 48, 48, 48, 48, 48, 135, 48, 48, 48, 143, - 48, 48, 48, 48, 135, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 140, 135, 135, 140, 26, 26, - 26, 26, 0, 0, 0, 0, 149, 149, 149, 149, 149, 149, 80, 80, 85, 227, 0, 0, - 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 81, + 81, 83, 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 54, 54, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 47, 44, 47, 47, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 51, + 47, 47, 47, 47, 47, 47, 47, 47, 44, 47, 44, 47, 44, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 47, 52, 275, 275, 44, 47, 44, 47, 48, 44, 47, 44, 47, 47, + 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 44, 44, 44, 44, 47, 44, 44, 44, 44, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 47, 44, 47, 0, 0, 44, 47, 44, 44, 44, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 51, 51, 47, 48, + 48, 48, 48, 48, 48, 48, 135, 48, 48, 48, 143, 48, 48, 48, 48, 135, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 138, 138, 138, 138, 0, 0, 0, 0, 0, 0, 0, 0, 140, 140, 48, 48, 48, 48, + 48, 48, 48, 48, 140, 140, 135, 135, 140, 26, 26, 26, 26, 0, 0, 0, 0, 149, + 149, 149, 149, 149, 149, 80, 80, 85, 227, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 143, 135, 0, 0, 0, 0, - 0, 0, 0, 0, 83, 83, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, - 0, 0, 0, 0, 0, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 48, 48, 48, 48, 48, 48, 83, 83, 83, 48, 83, 48, 48, 135, - 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 138, 138, 138, 138, + 0, 0, 0, 0, 0, 0, 0, 0, 140, 140, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 135, 135, 135, 135, 135, 86, 86, 86, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 140, 176, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 171, 171, 171, 171, 171, 171, 171, + 48, 48, 48, 48, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 143, 135, 0, 0, 0, 0, 0, 0, 0, 0, 83, 83, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 48, 48, + 48, 48, 48, 48, 83, 83, 83, 48, 83, 48, 48, 135, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, + 135, 135, 135, 86, 86, 86, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 140, 176, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 83, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 135, 135, 135, 140, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 146, 140, 140, 135, 135, 135, - 135, 140, 140, 135, 140, 140, 140, 176, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 0, 53, 145, 145, 145, 145, 145, 145, 145, 145, 145, - 145, 0, 0, 0, 0, 83, 83, 48, 48, 48, 48, 48, 135, 53, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 48, 48, - 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 135, 135, 135, 135, 140, - 140, 135, 135, 140, 140, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, - 135, 48, 48, 48, 48, 48, 48, 48, 48, 135, 140, 0, 0, 145, 145, 145, 145, - 145, 145, 145, 145, 145, 145, 0, 0, 83, 83, 83, 83, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 48, 48, 48, 48, 48, 48, - 80, 80, 80, 48, 140, 135, 140, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 81, 48, 81, 81, 86, 48, 48, 81, 81, 48, 48, 48, 48, 48, - 81, 81, 48, 81, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 48, 48, 53, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 140, 135, 135, 140, 140, 83, 83, 48, 53, 53, 140, 143, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, - 48, 0, 0, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, - 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 47, 47, 47, 47, 47, 47, + 171, 171, 171, 0, 0, 0, 135, 135, 135, 140, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 146, 140, 140, 135, 135, 135, 135, 140, 140, 135, 135, + 140, 140, 176, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 0, 53, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 83, 83, 48, + 48, 48, 48, 48, 135, 53, 48, 48, 48, 48, 48, 48, 48, 48, 48, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 48, 48, 48, 48, 48, 0, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 135, 135, 135, 135, 135, 135, 140, 140, 135, 135, 140, 140, + 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 135, 48, 48, 48, 48, 48, + 48, 48, 48, 135, 140, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 0, 0, 83, 83, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 53, 48, 48, 48, 48, 48, 48, 80, 80, 80, 48, 140, 135, + 140, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 81, 48, 81, + 81, 86, 48, 48, 81, 81, 48, 48, 48, 48, 48, 81, 81, 48, 81, 48, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, + 53, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 135, 135, + 140, 140, 83, 83, 48, 53, 53, 140, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, + 48, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, + 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, + 48, 48, 48, 48, 48, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 275, 51, 51, 51, 51, + 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 275, 51, 51, 51, 51, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 140, 140, 135, 140, 140, 135, 140, 140, - 83, 140, 143, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, - 0, 0, 0, 0, 0, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, + 48, 48, 48, 140, 140, 135, 140, 140, 135, 140, 140, 83, 140, 143, 0, 0, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, @@ -2218,12 +2218,13 @@ static unsigned short index2[] = { 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, - 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 48, 48, 48, + 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, + 265, 265, 265, 265, 265, 265, 265, 265, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 276, 276, 276, 276, + 48, 48, 48, 48, 48, 0, 0, 0, 0, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, @@ -2232,8 +2233,7 @@ static unsigned short index2[] = { 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 276, 276, 276, 276, 276, 276, 276, 276, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, @@ -2242,6 +2242,7 @@ static unsigned short index2[] = { 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, @@ -2251,37 +2252,37 @@ static unsigned short index2[] = { 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 171, 171, + 278, 171, 278, 171, 171, 278, 278, 278, 278, 278, 278, 278, 278, 278, + 278, 171, 278, 171, 278, 171, 171, 278, 278, 171, 171, 171, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 171, 171, 278, 171, 278, 171, 171, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 278, 171, 278, 171, 278, 171, 171, 278, 278, 171, - 171, 171, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 0, - 0, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 0, 0, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 278, 278, 278, 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 35, 35, 35, 35, 35, 0, 0, 0, 0, 0, 279, 280, 279, 281, 281, 281, 281, - 281, 281, 281, 281, 281, 217, 279, 279, 279, 279, 279, 279, 279, 279, - 279, 279, 279, 279, 279, 0, 279, 279, 279, 279, 279, 0, 279, 0, 279, 279, - 0, 279, 279, 0, 279, 279, 279, 279, 279, 279, 279, 279, 279, 281, 131, + 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, + 35, 35, 35, 35, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 35, 35, + 35, 0, 0, 0, 0, 0, 279, 280, 279, 281, 281, 281, 281, 281, 281, 281, 281, + 281, 217, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, + 279, 0, 279, 279, 279, 279, 279, 0, 279, 0, 279, 279, 0, 279, 279, 0, + 279, 279, 279, 279, 279, 279, 279, 279, 279, 281, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, @@ -2298,26 +2299,26 @@ static unsigned short index2[] = { 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 283, 197, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 283, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 284, 26, 0, 0, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 285, 285, 285, 285, 285, 285, 285, 286, 287, - 285, 0, 0, 0, 0, 0, 0, 81, 81, 81, 81, 81, 81, 81, 86, 86, 86, 86, 86, - 86, 86, 81, 81, 285, 288, 288, 289, 289, 286, 287, 286, 287, 286, 287, - 286, 287, 286, 287, 286, 287, 286, 287, 286, 287, 251, 251, 286, 287, - 285, 285, 285, 285, 289, 289, 289, 290, 285, 290, 0, 285, 290, 285, 285, - 288, 291, 292, 291, 292, 291, 292, 293, 285, 285, 294, 295, 296, 296, - 297, 0, 285, 298, 293, 285, 0, 0, 0, 0, 131, 131, 131, 118, 131, 0, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 284, 26, 0, 0, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 285, 285, 285, 285, 285, 285, 285, 286, 287, 285, 0, 0, 0, 0, + 0, 0, 81, 81, 81, 81, 81, 81, 81, 86, 86, 86, 86, 86, 86, 86, 81, 81, + 285, 288, 288, 289, 289, 286, 287, 286, 287, 286, 287, 286, 287, 286, + 287, 286, 287, 286, 287, 286, 287, 251, 251, 286, 287, 285, 285, 285, + 285, 289, 289, 289, 290, 285, 290, 0, 285, 290, 285, 285, 288, 291, 292, + 291, 292, 291, 292, 293, 285, 285, 294, 295, 296, 296, 297, 0, 285, 298, + 293, 285, 0, 0, 0, 0, 131, 131, 131, 118, 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, @@ -2327,144 +2328,144 @@ static unsigned short index2[] = { 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 175, 0, 299, 299, 300, 301, - 300, 299, 299, 302, 303, 299, 304, 305, 306, 305, 305, 307, 307, 307, - 307, 307, 307, 307, 307, 307, 307, 305, 299, 308, 309, 308, 299, 299, + 131, 131, 131, 131, 131, 0, 0, 175, 0, 299, 299, 300, 301, 300, 299, 299, + 302, 303, 299, 304, 305, 306, 305, 305, 307, 307, 307, 307, 307, 307, + 307, 307, 307, 307, 305, 299, 308, 309, 308, 299, 299, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, - 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 302, 299, - 303, 311, 312, 311, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, - 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, - 313, 313, 302, 309, 303, 309, 302, 303, 314, 315, 316, 314, 314, 317, - 317, 317, 317, 317, 317, 317, 317, 317, 317, 318, 317, 317, 317, 317, + 310, 310, 310, 310, 310, 310, 310, 310, 310, 302, 299, 303, 311, 312, + 311, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 302, + 309, 303, 309, 302, 303, 314, 315, 316, 314, 314, 317, 317, 317, 317, + 317, 317, 317, 317, 317, 317, 318, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, - 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 318, - 318, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, + 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 318, 318, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, - 317, 317, 317, 317, 0, 0, 0, 317, 317, 317, 317, 317, 317, 0, 0, 317, - 317, 317, 317, 317, 317, 0, 0, 317, 317, 317, 317, 317, 317, 0, 0, 317, - 317, 317, 0, 0, 0, 301, 301, 309, 311, 319, 301, 301, 0, 320, 321, 321, - 321, 321, 320, 320, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 322, 322, 322, 26, 30, - 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 0, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, + 317, 0, 0, 0, 317, 317, 317, 317, 317, 317, 0, 0, 317, 317, 317, 317, + 317, 317, 0, 0, 317, 317, 317, 317, 317, 317, 0, 0, 317, 317, 317, 0, 0, + 0, 301, 301, 309, 311, 319, 301, 301, 0, 320, 321, 321, 321, 321, 320, + 320, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 322, 322, 322, 26, 30, 0, 0, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 0, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 83, 138, 83, 0, 0, 0, 0, 149, - 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 0, 0, 0, 0, 0, 83, 138, 83, 0, 0, 0, 0, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, - 149, 149, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 323, 323, 323, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 0, + 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, - 323, 323, 323, 323, 323, 323, 323, 323, 154, 154, 154, 154, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 154, 154, 26, 80, - 80, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 26, 0, + 323, 323, 323, 323, 323, 154, 154, 154, 154, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 154, 154, 26, 80, 80, 0, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 80, 80, 80, 80, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 324, + 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, - 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 0, 0, 0, 0, + 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 149, 149, 149, - 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 174, 48, 48, 48, 48, 48, 48, 48, - 48, 174, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 149, 149, 149, 149, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 174, 48, 48, 48, 48, 48, 48, 48, 48, 174, 0, 0, + 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 81, 81, 81, 81, 81, 0, 0, 0, 0, 0, 48, + 48, 48, 48, 48, 81, 81, 81, 81, 81, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 83, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 0, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 48, 48, - 48, 48, 48, 48, 48, 48, 83, 174, 174, 174, 174, 174, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, + 48, 48, 83, 174, 174, 174, 174, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 47, 47, 47, 47, 47, 47, + 44, 44, 44, 44, 44, 44, 44, 44, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 48, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, - 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 47, 47, 47, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, - 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 0, - 0, 107, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 0, 0, 107, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 0, 107, 107, 0, 0, 0, 107, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 0, 104, 325, 325, 325, 325, 325, 325, 325, 325, + 107, 107, 0, 107, 107, 0, 0, 0, 107, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 326, 326, 325, 325, 325, - 325, 325, 325, 325, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 0, 104, 325, 325, 325, 325, 325, 325, 325, 325, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 325, 325, 325, - 325, 325, 325, 325, 325, 325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 107, 107, 0, 0, - 0, 0, 0, 325, 325, 325, 325, 325, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 326, 326, 325, 325, 325, 325, 325, + 325, 325, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 325, 325, 325, 325, 325, 325, 0, 0, 0, 138, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 325, 325, 325, 325, 325, + 325, 325, 325, 325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 0, 107, 107, 0, 0, 0, 0, 0, 325, + 325, 325, 325, 325, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 325, 325, + 325, 325, 325, 325, 0, 0, 0, 138, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, + 107, 107, 107, 107, 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 0, 0, 0, 0, 325, 325, 107, 107, 325, 325, 325, 325, - 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 0, 0, 325, + 107, 107, 107, 0, 0, 0, 0, 325, 325, 107, 107, 325, 325, 325, 325, 325, + 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 0, 0, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, - 325, 325, 325, 107, 135, 135, 135, 0, 135, 135, 0, 0, 0, 0, 0, 135, 86, - 135, 81, 107, 107, 107, 107, 0, 107, 107, 107, 0, 107, 107, 107, 107, + 325, 325, 107, 135, 135, 135, 0, 135, 135, 0, 0, 0, 0, 0, 135, 86, 135, + 81, 107, 107, 107, 107, 0, 107, 107, 107, 0, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 0, 81, 177, 86, 0, + 0, 0, 0, 143, 325, 325, 325, 325, 325, 325, 325, 325, 325, 0, 0, 0, 0, 0, + 0, 0, 104, 104, 104, 104, 104, 104, 104, 104, 104, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 0, 81, 177, 86, - 0, 0, 0, 0, 143, 325, 325, 325, 325, 325, 325, 325, 325, 325, 0, 0, 0, 0, - 0, 0, 0, 104, 104, 104, 104, 104, 104, 104, 104, 104, 0, 0, 0, 0, 0, 0, - 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 325, 325, 104, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, @@ -2525,6 +2526,12 @@ static unsigned short index2[] = { 118, 118, 118, 86, 86, 81, 81, 81, 86, 81, 86, 86, 86, 86, 330, 330, 330, 330, 113, 113, 113, 113, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, 135, 140, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, @@ -2580,7 +2587,7 @@ static unsigned short index2[] = { 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 140, 140, 135, 135, 135, 135, 135, 135, 135, 135, 140, 140, 143, 135, 135, 140, 146, 48, 48, 48, 48, 83, 83, 83, 83, 83, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, - 0, 83, 0, 83, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 83, 0, 83, 81, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, @@ -2605,7 +2612,7 @@ static unsigned short index2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 140, - 135, 140, 140, 135, 135, 135, 135, 135, 135, 176, 146, 0, 0, 0, 0, 0, 0, + 135, 140, 140, 135, 135, 135, 135, 135, 135, 176, 146, 48, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2628,45 +2635,51 @@ static unsigned short index2[] = { 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 149, 149, 149, 149, 149, 149, 149, 149, - 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 135, 135, 135, 135, 135, - 135, 155, 155, 135, 135, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, + 48, 48, 48, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 143, 135, 135, 135, 135, - 140, 48, 135, 135, 135, 135, 83, 83, 83, 83, 83, 83, 83, 83, 143, 0, 0, - 0, 0, 0, 0, 0, 0, 48, 135, 135, 135, 135, 135, 135, 140, 140, 135, 135, - 135, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 140, 140, 135, 135, 135, + 135, 0, 0, 135, 135, 140, 140, 140, 140, 143, 48, 83, 48, 140, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 135, 135, 135, 135, 135, 135, 155, 155, 135, 135, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 140, 135, 143, 83, 83, 83, 48, 83, 83, - 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, + 143, 135, 135, 135, 135, 140, 48, 135, 135, 135, 135, 83, 83, 83, 83, 83, + 83, 83, 83, 143, 0, 0, 0, 0, 0, 0, 0, 0, 48, 135, 135, 135, 135, 135, + 135, 140, 140, 135, 135, 135, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 140, 135, + 143, 83, 83, 83, 48, 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 140, 135, 135, 135, 135, 135, 135, 135, - 0, 135, 135, 135, 135, 135, 135, 140, 331, 48, 83, 83, 83, 83, 83, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, - 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 0, 0, 0, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, + 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 135, 135, + 135, 135, 135, 135, 135, 0, 135, 135, 135, 135, 135, 135, 140, 331, 48, + 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 0, 0, 0, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 0, 0, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 0, 140, 135, - 135, 135, 135, 135, 135, 135, 140, 135, 135, 140, 135, 135, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 0, 140, 135, 135, 135, 135, 135, 135, 135, 140, 135, + 135, 140, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, - 48, 48, 48, 48, 48, 0, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 0, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 135, 135, 135, 135, 0, - 0, 0, 135, 0, 135, 135, 0, 135, 135, 135, 146, 135, 143, 143, 48, 135, 0, - 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, - 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 0, 48, 48, 0, 48, 48, 48, 48, 48, + 135, 135, 135, 135, 135, 135, 0, 0, 0, 135, 0, 135, 135, 0, 135, 135, + 135, 146, 135, 143, 143, 48, 135, 0, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, + 48, 0, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 140, 140, 140, 140, 0, 135, 135, - 0, 140, 140, 135, 140, 143, 48, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, - 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 140, 140, 140, 140, 140, 0, 135, 135, 0, 140, 140, 135, 140, 143, 48, 0, + 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2674,14 +2687,21 @@ static unsigned short index2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 135, 135, 140, 140, 83, 83, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 140, 140, 83, 83, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 26, 26, 26, 26, 26, 26, 26, 26, 85, 85, 85, 85, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 174, 174, 174, 174, 174, 174, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, @@ -2689,77 +2709,77 @@ static unsigned short index2[] = { 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, - 174, 174, 174, 174, 174, 0, 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 174, 0, 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 190, 190, 190, 190, + 190, 190, 190, 190, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, - 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 145, - 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 83, 83, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 177, 177, 177, 177, 177, - 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 0, 0, 177, 177, 177, 177, 177, 83, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 81, 81, 81, 81, 81, 81, 81, 83, 83, 83, 83, 83, 80, 80, 80, 80, - 53, 53, 53, 53, 83, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, - 145, 145, 145, 145, 145, 145, 0, 149, 149, 149, 149, 149, 149, 149, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 81, + 81, 81, 81, 81, 81, 81, 83, 83, 83, 83, 83, 80, 80, 80, 80, 53, 53, 53, + 53, 83, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 0, 149, 149, 149, 149, 149, 149, 149, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 44, 44, 44, 44, 44, 44, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 83, 83, - 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 47, 47, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 140, 140, 140, 140, 140, + 48, 48, 48, 48, 48, 0, 0, 0, 0, 135, 48, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 135, 135, 135, 53, 53, 53, - 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 140, 140, 140, 140, 140, 140, 140, 0, 0, 0, 0, 0, 0, 0, 135, 135, 135, + 135, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 252, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252, 252, 251, 252, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, @@ -2767,22 +2787,23 @@ static unsigned short index2[] = { 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 0, 0, 0, 0, + 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, @@ -2792,88 +2813,79 @@ static unsigned short index2[] = { 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, + 171, 171, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 0, 0, 80, 135, 177, 83, 175, 175, 175, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, + 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 80, 135, 177, 83, + 175, 175, 175, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 332, 332, 332, 332, 332, 332, 332, - 333, 333, 177, 177, 177, 80, 80, 80, 334, 333, 333, 333, 333, 333, 175, - 175, 175, 175, 175, 175, 175, 175, 86, 86, 86, 86, 86, 86, 86, 86, 80, - 80, 81, 81, 81, 81, 81, 86, 86, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 81, 81, 81, 81, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 332, 332, 332, 332, 332, 332, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 332, 332, 332, 332, 332, 332, 332, 333, 333, 177, 177, 177, + 80, 80, 80, 334, 333, 333, 333, 333, 333, 175, 175, 175, 175, 175, 175, + 175, 175, 86, 86, 86, 86, 86, 86, 86, 86, 80, 80, 81, 81, 81, 81, 81, 86, + 86, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 332, 332, 332, 332, 332, + 332, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, + 80, 80, 80, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 81, 81, 81, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 81, 81, + 81, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, - 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 0, 0, 0, 0, 0, 0, - 0, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 0, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, + 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 0, 0, 0, 0, 0, 0, 0, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 0, 49, 49, 0, 0, - 49, 0, 0, 49, 49, 0, 0, 49, 49, 49, 49, 0, 49, 49, 49, 49, 49, 49, 49, - 49, 35, 35, 35, 35, 0, 35, 0, 35, 35, 35, 35, 35, 35, 35, 0, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 49, 49, 0, 49, 49, 49, 49, 0, 0, 49, 49, 49, 49, - 49, 49, 49, 49, 0, 49, 49, 49, 49, 49, 49, 49, 0, 35, 35, 35, 35, 35, 35, + 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, + 35, 35, 35, 35, 35, 35, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 49, 49, 0, 49, 49, 49, 49, 0, 49, 49, 49, 49, 49, 0, 49, 0, 0, 0, - 49, 49, 49, 49, 49, 49, 49, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, + 35, 35, 35, 35, 35, 49, 0, 49, 49, 0, 0, 49, 0, 0, 49, 49, 0, 0, 49, 49, + 49, 49, 0, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 0, 35, 0, 35, + 35, 35, 35, 35, 35, 35, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, + 0, 49, 49, 49, 49, 0, 0, 49, 49, 49, 49, 49, 49, 49, 49, 0, 49, 49, 49, + 49, 49, 49, 49, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 0, 49, 49, + 49, 49, 0, 49, 49, 49, 49, 49, 0, 49, 0, 0, 0, 49, 49, 49, 49, 49, 49, + 49, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, @@ -2883,47 +2895,69 @@ static unsigned short index2[] = { 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 0, 0, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 335, 35, 35, 35, + 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 228, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 335, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 228, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 335, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 228, 35, 35, 35, 35, 35, - 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 0, 0, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 335, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 228, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 335, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 228, 35, 35, 35, 35, 35, 35, 49, 35, 0, 0, 336, 336, 336, 336, - 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 35, 35, 228, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 335, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 228, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 335, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 228, 35, 35, 35, 35, 35, 35, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 335, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 228, 35, 35, 35, + 35, 35, 35, 49, 35, 0, 0, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 336, 336, 336, 336, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 80, 80, 80, 80, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 80, 80, 80, + 80, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 80, - 80, 80, 80, 80, 80, 80, 80, 135, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 135, 80, 80, 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 135, 135, 135, 135, 135, 0, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, + 135, 135, 135, 135, 135, 135, 135, 135, 80, 80, 80, 80, 80, 80, 80, 80, + 135, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 135, 80, 80, + 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, + 135, 135, 135, 135, 0, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 81, 81, 81, 81, 81, + 81, 0, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 0, 0, 81, 81, 81, 81, 81, 81, 81, 0, 81, 81, 0, 81, 81, 81, 81, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 81, 81, 81, 81, 81, 81, 81, 0, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 0, 0, 81, 81, 81, 81, 81, 81, 81, 0, 81, 81, - 0, 81, 81, 81, 81, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 0, 0, 0, 81, 81, 81, 81, 81, 81, 81, 53, 53, 53, 53, 53, 53, 53, 0, + 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 48, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 81, 81, 81, 81, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 0, 0, 0, 0, 0, 85, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, @@ -2937,105 +2971,110 @@ static unsigned short index2[] = { 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 0, - 325, 325, 325, 325, 325, 325, 325, 325, 325, 86, 86, 86, 86, 86, 86, 86, + 107, 107, 107, 107, 0, 0, 325, 325, 325, 325, 325, 325, 325, 325, 325, + 86, 86, 86, 86, 86, 86, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 327, 327, 327, 327, - 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, + 0, 0, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, - 327, 327, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, + 327, 327, 327, 327, 327, 327, 327, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, - 328, 328, 328, 328, 328, 328, 328, 328, 81, 81, 81, 81, 81, 81, 146, 0, - 0, 0, 0, 0, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 0, 0, 0, 0, - 104, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 81, 81, + 81, 81, 81, 81, 146, 137, 0, 0, 0, 0, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 0, 0, 0, 0, 104, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, - 330, 330, 330, 330, 330, 133, 330, 330, 330, 111, 330, 330, 330, 330, 0, + 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 133, 330, 330, 330, + 111, 330, 330, 330, 330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 330, 330, 330, 330, 330, 330, 330, + 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, + 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, + 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 133, 330, 330, 330, + 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 131, 131, 131, 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 131, 131, 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 0, 131, 131, 0, 131, 0, 0, 131, 0, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 0, 131, 131, 131, 131, 0, 131, 0, 131, - 0, 0, 0, 0, 0, 0, 131, 0, 0, 0, 0, 131, 0, 131, 0, 131, 0, 131, 131, 131, - 0, 131, 131, 0, 131, 0, 0, 131, 0, 131, 0, 131, 0, 131, 0, 131, 0, 131, - 131, 0, 131, 0, 0, 131, 131, 131, 131, 0, 131, 131, 131, 131, 131, 131, - 131, 0, 131, 131, 131, 131, 0, 131, 131, 131, 131, 0, 131, 0, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 0, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 0, 0, 0, - 131, 131, 131, 0, 131, 131, 131, 131, 131, 0, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 78, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 241, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 131, 131, + 0, 131, 0, 0, 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 0, 131, 131, 131, 131, 0, 131, 0, 131, 0, 0, 0, 0, 0, 0, 131, 0, 0, 0, 0, + 131, 0, 131, 0, 131, 0, 131, 131, 131, 0, 131, 131, 0, 131, 0, 0, 131, 0, + 131, 0, 131, 0, 131, 0, 131, 0, 131, 131, 0, 131, 0, 0, 131, 131, 131, + 131, 0, 131, 131, 131, 131, 131, 131, 131, 0, 131, 131, 131, 131, 0, 131, + 131, 131, 131, 0, 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 0, 0, 0, 0, 0, 131, 131, 131, 0, 131, 131, 131, 131, + 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 26, 26, 26, 26, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, - 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 241, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 154, 154, 0, 0, 0, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 154, 154, 0, 0, 0, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, - 244, 244, 244, 244, 244, 244, 244, 337, 26, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 337, 26, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, - 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 338, 338, - 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, - 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 224, 224, 0, 0, 0, 0, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, + 338, 338, 224, 224, 224, 0, 0, 0, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, - 338, 338, 270, 338, 244, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, - 338, 338, 338, 338, 338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 338, 338, 338, 338, 338, 338, 338, 338, 270, 338, 244, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 338, 338, 338, 338, 338, 338, 338, + 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 272, 272, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 272, 272, 272, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 0, 0, 0, 0, 272, 272, 272, 272, 272, 272, 272, 272, 272, 0, 0, 0, 0, - 0, 0, 0, 272, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 241, - 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 272, 272, 272, 272, 272, 272, 0, 0, 0, 0, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 0, 0, 0, 0, 0, 0, 0, 272, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 241, 241, 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 26, 26, 26, 26, 241, 241, 241, 241, 241, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 26, 26, 26, 241, 26, 26, 26, - 241, 241, 241, 339, 339, 339, 339, 339, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 26, 26, 26, 26, 241, 241, + 241, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 26, 26, 26, 241, 26, 26, 26, 241, 241, 241, 339, 339, 339, 339, 339, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 26, 241, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 26, 241, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, @@ -3047,108 +3086,116 @@ static unsigned short index2[] = { 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 26, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 26, + 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, - 241, 241, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 241, 241, 241, 241, 241, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 241, 241, 241, 241, 26, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 241, 241, 241, 241, 241, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 241, 241, + 26, 26, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 26, 26, 26, 26, 26, 26, - 241, 26, 26, 26, 241, 241, 241, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 0, 0, 0, 26, 26, - 26, 26, 241, 241, 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, + 241, 241, 26, 26, 26, 26, 26, 26, 241, 26, 26, 26, 241, 241, 241, 26, 26, + 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 241, 241, 0, 0, 0, 26, 26, 26, 26, 241, 241, 241, 241, 241, 241, + 241, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, - 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, + 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, + 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 241, 241, 241, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 0, 0, 241, 241, 241, 241, 0, - 0, 0, 241, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 0, 0, 0, 0, 0, 0, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 0, 241, 241, 241, 241, 0, 0, + 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 0, 0, + 241, 241, 241, 241, 241, 241, 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 0, 0, 241, 241, 241, 241, 0, 0, 0, 0, 241, 241, 241, 0, 0, 0, + 0, 0, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 241, + 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, @@ -3156,8 +3203,9 @@ static unsigned short index2[] = { 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, @@ -3169,23 +3217,23 @@ static unsigned short index2[] = { 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 0, 0, 0, 0, 0, 0, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, - 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, @@ -3198,7 +3246,8 @@ static unsigned short index2[] = { 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 277, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, @@ -3207,7 +3256,7 @@ static unsigned short index2[] = { 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 0, 0, + 277, 277, 277, 277, 277, 277, 277, 0, 0, }; /* decomposition data */ @@ -4171,110 +4220,110 @@ static unsigned int decomp_data[] = { 266, 75, 266, 76, 266, 77, 266, 78, 266, 79, 266, 80, 266, 81, 266, 82, 266, 83, 266, 84, 266, 85, 266, 86, 266, 87, 266, 88, 266, 89, 266, 90, 522, 72, 86, 522, 77, 86, 522, 83, 68, 522, 83, 83, 778, 80, 80, 86, 522, - 87, 67, 515, 77, 67, 515, 77, 68, 522, 68, 74, 522, 12411, 12363, 522, - 12467, 12467, 266, 12469, 266, 25163, 266, 23383, 266, 21452, 266, 12487, - 266, 20108, 266, 22810, 266, 35299, 266, 22825, 266, 20132, 266, 26144, - 266, 28961, 266, 26009, 266, 21069, 266, 24460, 266, 20877, 266, 26032, - 266, 21021, 266, 32066, 266, 29983, 266, 36009, 266, 22768, 266, 21561, - 266, 28436, 266, 25237, 266, 25429, 266, 19968, 266, 19977, 266, 36938, - 266, 24038, 266, 20013, 266, 21491, 266, 25351, 266, 36208, 266, 25171, - 266, 31105, 266, 31354, 266, 21512, 266, 28288, 266, 26377, 266, 26376, - 266, 30003, 266, 21106, 266, 21942, 266, 37197, 770, 12308, 26412, 12309, - 770, 12308, 19977, 12309, 770, 12308, 20108, 12309, 770, 12308, 23433, - 12309, 770, 12308, 28857, 12309, 770, 12308, 25171, 12309, 770, 12308, - 30423, 12309, 770, 12308, 21213, 12309, 770, 12308, 25943, 12309, 263, - 24471, 263, 21487, 256, 20029, 256, 20024, 256, 20033, 256, 131362, 256, - 20320, 256, 20398, 256, 20411, 256, 20482, 256, 20602, 256, 20633, 256, - 20711, 256, 20687, 256, 13470, 256, 132666, 256, 20813, 256, 20820, 256, - 20836, 256, 20855, 256, 132380, 256, 13497, 256, 20839, 256, 20877, 256, - 132427, 256, 20887, 256, 20900, 256, 20172, 256, 20908, 256, 20917, 256, - 168415, 256, 20981, 256, 20995, 256, 13535, 256, 21051, 256, 21062, 256, - 21106, 256, 21111, 256, 13589, 256, 21191, 256, 21193, 256, 21220, 256, - 21242, 256, 21253, 256, 21254, 256, 21271, 256, 21321, 256, 21329, 256, - 21338, 256, 21363, 256, 21373, 256, 21375, 256, 21375, 256, 21375, 256, - 133676, 256, 28784, 256, 21450, 256, 21471, 256, 133987, 256, 21483, 256, - 21489, 256, 21510, 256, 21662, 256, 21560, 256, 21576, 256, 21608, 256, - 21666, 256, 21750, 256, 21776, 256, 21843, 256, 21859, 256, 21892, 256, - 21892, 256, 21913, 256, 21931, 256, 21939, 256, 21954, 256, 22294, 256, - 22022, 256, 22295, 256, 22097, 256, 22132, 256, 20999, 256, 22766, 256, - 22478, 256, 22516, 256, 22541, 256, 22411, 256, 22578, 256, 22577, 256, - 22700, 256, 136420, 256, 22770, 256, 22775, 256, 22790, 256, 22810, 256, - 22818, 256, 22882, 256, 136872, 256, 136938, 256, 23020, 256, 23067, 256, - 23079, 256, 23000, 256, 23142, 256, 14062, 256, 14076, 256, 23304, 256, - 23358, 256, 23358, 256, 137672, 256, 23491, 256, 23512, 256, 23527, 256, - 23539, 256, 138008, 256, 23551, 256, 23558, 256, 24403, 256, 23586, 256, - 14209, 256, 23648, 256, 23662, 256, 23744, 256, 23693, 256, 138724, 256, - 23875, 256, 138726, 256, 23918, 256, 23915, 256, 23932, 256, 24033, 256, - 24034, 256, 14383, 256, 24061, 256, 24104, 256, 24125, 256, 24169, 256, - 14434, 256, 139651, 256, 14460, 256, 24240, 256, 24243, 256, 24246, 256, - 24266, 256, 172946, 256, 24318, 256, 140081, 256, 140081, 256, 33281, - 256, 24354, 256, 24354, 256, 14535, 256, 144056, 256, 156122, 256, 24418, - 256, 24427, 256, 14563, 256, 24474, 256, 24525, 256, 24535, 256, 24569, - 256, 24705, 256, 14650, 256, 14620, 256, 24724, 256, 141012, 256, 24775, - 256, 24904, 256, 24908, 256, 24910, 256, 24908, 256, 24954, 256, 24974, - 256, 25010, 256, 24996, 256, 25007, 256, 25054, 256, 25074, 256, 25078, - 256, 25104, 256, 25115, 256, 25181, 256, 25265, 256, 25300, 256, 25424, - 256, 142092, 256, 25405, 256, 25340, 256, 25448, 256, 25475, 256, 25572, - 256, 142321, 256, 25634, 256, 25541, 256, 25513, 256, 14894, 256, 25705, - 256, 25726, 256, 25757, 256, 25719, 256, 14956, 256, 25935, 256, 25964, - 256, 143370, 256, 26083, 256, 26360, 256, 26185, 256, 15129, 256, 26257, - 256, 15112, 256, 15076, 256, 20882, 256, 20885, 256, 26368, 256, 26268, - 256, 32941, 256, 17369, 256, 26391, 256, 26395, 256, 26401, 256, 26462, - 256, 26451, 256, 144323, 256, 15177, 256, 26618, 256, 26501, 256, 26706, - 256, 26757, 256, 144493, 256, 26766, 256, 26655, 256, 26900, 256, 15261, - 256, 26946, 256, 27043, 256, 27114, 256, 27304, 256, 145059, 256, 27355, - 256, 15384, 256, 27425, 256, 145575, 256, 27476, 256, 15438, 256, 27506, - 256, 27551, 256, 27578, 256, 27579, 256, 146061, 256, 138507, 256, - 146170, 256, 27726, 256, 146620, 256, 27839, 256, 27853, 256, 27751, 256, - 27926, 256, 27966, 256, 28023, 256, 27969, 256, 28009, 256, 28024, 256, - 28037, 256, 146718, 256, 27956, 256, 28207, 256, 28270, 256, 15667, 256, - 28363, 256, 28359, 256, 147153, 256, 28153, 256, 28526, 256, 147294, 256, - 147342, 256, 28614, 256, 28729, 256, 28702, 256, 28699, 256, 15766, 256, - 28746, 256, 28797, 256, 28791, 256, 28845, 256, 132389, 256, 28997, 256, - 148067, 256, 29084, 256, 148395, 256, 29224, 256, 29237, 256, 29264, 256, - 149000, 256, 29312, 256, 29333, 256, 149301, 256, 149524, 256, 29562, - 256, 29579, 256, 16044, 256, 29605, 256, 16056, 256, 16056, 256, 29767, - 256, 29788, 256, 29809, 256, 29829, 256, 29898, 256, 16155, 256, 29988, - 256, 150582, 256, 30014, 256, 150674, 256, 30064, 256, 139679, 256, - 30224, 256, 151457, 256, 151480, 256, 151620, 256, 16380, 256, 16392, - 256, 30452, 256, 151795, 256, 151794, 256, 151833, 256, 151859, 256, - 30494, 256, 30495, 256, 30495, 256, 30538, 256, 16441, 256, 30603, 256, - 16454, 256, 16534, 256, 152605, 256, 30798, 256, 30860, 256, 30924, 256, - 16611, 256, 153126, 256, 31062, 256, 153242, 256, 153285, 256, 31119, - 256, 31211, 256, 16687, 256, 31296, 256, 31306, 256, 31311, 256, 153980, - 256, 154279, 256, 154279, 256, 31470, 256, 16898, 256, 154539, 256, - 31686, 256, 31689, 256, 16935, 256, 154752, 256, 31954, 256, 17056, 256, - 31976, 256, 31971, 256, 32000, 256, 155526, 256, 32099, 256, 17153, 256, - 32199, 256, 32258, 256, 32325, 256, 17204, 256, 156200, 256, 156231, 256, - 17241, 256, 156377, 256, 32634, 256, 156478, 256, 32661, 256, 32762, 256, - 32773, 256, 156890, 256, 156963, 256, 32864, 256, 157096, 256, 32880, - 256, 144223, 256, 17365, 256, 32946, 256, 33027, 256, 17419, 256, 33086, - 256, 23221, 256, 157607, 256, 157621, 256, 144275, 256, 144284, 256, - 33281, 256, 33284, 256, 36766, 256, 17515, 256, 33425, 256, 33419, 256, - 33437, 256, 21171, 256, 33457, 256, 33459, 256, 33469, 256, 33510, 256, - 158524, 256, 33509, 256, 33565, 256, 33635, 256, 33709, 256, 33571, 256, - 33725, 256, 33767, 256, 33879, 256, 33619, 256, 33738, 256, 33740, 256, - 33756, 256, 158774, 256, 159083, 256, 158933, 256, 17707, 256, 34033, - 256, 34035, 256, 34070, 256, 160714, 256, 34148, 256, 159532, 256, 17757, - 256, 17761, 256, 159665, 256, 159954, 256, 17771, 256, 34384, 256, 34396, - 256, 34407, 256, 34409, 256, 34473, 256, 34440, 256, 34574, 256, 34530, - 256, 34681, 256, 34600, 256, 34667, 256, 34694, 256, 17879, 256, 34785, - 256, 34817, 256, 17913, 256, 34912, 256, 34915, 256, 161383, 256, 35031, - 256, 35038, 256, 17973, 256, 35066, 256, 13499, 256, 161966, 256, 162150, - 256, 18110, 256, 18119, 256, 35488, 256, 35565, 256, 35722, 256, 35925, - 256, 162984, 256, 36011, 256, 36033, 256, 36123, 256, 36215, 256, 163631, - 256, 133124, 256, 36299, 256, 36284, 256, 36336, 256, 133342, 256, 36564, - 256, 36664, 256, 165330, 256, 165357, 256, 37012, 256, 37105, 256, 37137, - 256, 165678, 256, 37147, 256, 37432, 256, 37591, 256, 37592, 256, 37500, - 256, 37881, 256, 37909, 256, 166906, 256, 38283, 256, 18837, 256, 38327, - 256, 167287, 256, 18918, 256, 38595, 256, 23986, 256, 38691, 256, 168261, - 256, 168474, 256, 19054, 256, 19062, 256, 38880, 256, 168970, 256, 19122, - 256, 169110, 256, 38923, 256, 38923, 256, 38953, 256, 169398, 256, 39138, - 256, 19251, 256, 39209, 256, 39335, 256, 39362, 256, 39422, 256, 19406, - 256, 170800, 256, 39698, 256, 40000, 256, 40189, 256, 19662, 256, 19693, - 256, 40295, 256, 172238, 256, 19704, 256, 172293, 256, 172558, 256, - 172689, 256, 40635, 256, 19798, 256, 40697, 256, 40702, 256, 40709, 256, - 40719, 256, 40726, 256, 40763, 256, 173568, + 87, 67, 515, 77, 67, 515, 77, 68, 515, 77, 82, 522, 68, 74, 522, 12411, + 12363, 522, 12467, 12467, 266, 12469, 266, 25163, 266, 23383, 266, 21452, + 266, 12487, 266, 20108, 266, 22810, 266, 35299, 266, 22825, 266, 20132, + 266, 26144, 266, 28961, 266, 26009, 266, 21069, 266, 24460, 266, 20877, + 266, 26032, 266, 21021, 266, 32066, 266, 29983, 266, 36009, 266, 22768, + 266, 21561, 266, 28436, 266, 25237, 266, 25429, 266, 19968, 266, 19977, + 266, 36938, 266, 24038, 266, 20013, 266, 21491, 266, 25351, 266, 36208, + 266, 25171, 266, 31105, 266, 31354, 266, 21512, 266, 28288, 266, 26377, + 266, 26376, 266, 30003, 266, 21106, 266, 21942, 266, 37197, 770, 12308, + 26412, 12309, 770, 12308, 19977, 12309, 770, 12308, 20108, 12309, 770, + 12308, 23433, 12309, 770, 12308, 28857, 12309, 770, 12308, 25171, 12309, + 770, 12308, 30423, 12309, 770, 12308, 21213, 12309, 770, 12308, 25943, + 12309, 263, 24471, 263, 21487, 256, 20029, 256, 20024, 256, 20033, 256, + 131362, 256, 20320, 256, 20398, 256, 20411, 256, 20482, 256, 20602, 256, + 20633, 256, 20711, 256, 20687, 256, 13470, 256, 132666, 256, 20813, 256, + 20820, 256, 20836, 256, 20855, 256, 132380, 256, 13497, 256, 20839, 256, + 20877, 256, 132427, 256, 20887, 256, 20900, 256, 20172, 256, 20908, 256, + 20917, 256, 168415, 256, 20981, 256, 20995, 256, 13535, 256, 21051, 256, + 21062, 256, 21106, 256, 21111, 256, 13589, 256, 21191, 256, 21193, 256, + 21220, 256, 21242, 256, 21253, 256, 21254, 256, 21271, 256, 21321, 256, + 21329, 256, 21338, 256, 21363, 256, 21373, 256, 21375, 256, 21375, 256, + 21375, 256, 133676, 256, 28784, 256, 21450, 256, 21471, 256, 133987, 256, + 21483, 256, 21489, 256, 21510, 256, 21662, 256, 21560, 256, 21576, 256, + 21608, 256, 21666, 256, 21750, 256, 21776, 256, 21843, 256, 21859, 256, + 21892, 256, 21892, 256, 21913, 256, 21931, 256, 21939, 256, 21954, 256, + 22294, 256, 22022, 256, 22295, 256, 22097, 256, 22132, 256, 20999, 256, + 22766, 256, 22478, 256, 22516, 256, 22541, 256, 22411, 256, 22578, 256, + 22577, 256, 22700, 256, 136420, 256, 22770, 256, 22775, 256, 22790, 256, + 22810, 256, 22818, 256, 22882, 256, 136872, 256, 136938, 256, 23020, 256, + 23067, 256, 23079, 256, 23000, 256, 23142, 256, 14062, 256, 14076, 256, + 23304, 256, 23358, 256, 23358, 256, 137672, 256, 23491, 256, 23512, 256, + 23527, 256, 23539, 256, 138008, 256, 23551, 256, 23558, 256, 24403, 256, + 23586, 256, 14209, 256, 23648, 256, 23662, 256, 23744, 256, 23693, 256, + 138724, 256, 23875, 256, 138726, 256, 23918, 256, 23915, 256, 23932, 256, + 24033, 256, 24034, 256, 14383, 256, 24061, 256, 24104, 256, 24125, 256, + 24169, 256, 14434, 256, 139651, 256, 14460, 256, 24240, 256, 24243, 256, + 24246, 256, 24266, 256, 172946, 256, 24318, 256, 140081, 256, 140081, + 256, 33281, 256, 24354, 256, 24354, 256, 14535, 256, 144056, 256, 156122, + 256, 24418, 256, 24427, 256, 14563, 256, 24474, 256, 24525, 256, 24535, + 256, 24569, 256, 24705, 256, 14650, 256, 14620, 256, 24724, 256, 141012, + 256, 24775, 256, 24904, 256, 24908, 256, 24910, 256, 24908, 256, 24954, + 256, 24974, 256, 25010, 256, 24996, 256, 25007, 256, 25054, 256, 25074, + 256, 25078, 256, 25104, 256, 25115, 256, 25181, 256, 25265, 256, 25300, + 256, 25424, 256, 142092, 256, 25405, 256, 25340, 256, 25448, 256, 25475, + 256, 25572, 256, 142321, 256, 25634, 256, 25541, 256, 25513, 256, 14894, + 256, 25705, 256, 25726, 256, 25757, 256, 25719, 256, 14956, 256, 25935, + 256, 25964, 256, 143370, 256, 26083, 256, 26360, 256, 26185, 256, 15129, + 256, 26257, 256, 15112, 256, 15076, 256, 20882, 256, 20885, 256, 26368, + 256, 26268, 256, 32941, 256, 17369, 256, 26391, 256, 26395, 256, 26401, + 256, 26462, 256, 26451, 256, 144323, 256, 15177, 256, 26618, 256, 26501, + 256, 26706, 256, 26757, 256, 144493, 256, 26766, 256, 26655, 256, 26900, + 256, 15261, 256, 26946, 256, 27043, 256, 27114, 256, 27304, 256, 145059, + 256, 27355, 256, 15384, 256, 27425, 256, 145575, 256, 27476, 256, 15438, + 256, 27506, 256, 27551, 256, 27578, 256, 27579, 256, 146061, 256, 138507, + 256, 146170, 256, 27726, 256, 146620, 256, 27839, 256, 27853, 256, 27751, + 256, 27926, 256, 27966, 256, 28023, 256, 27969, 256, 28009, 256, 28024, + 256, 28037, 256, 146718, 256, 27956, 256, 28207, 256, 28270, 256, 15667, + 256, 28363, 256, 28359, 256, 147153, 256, 28153, 256, 28526, 256, 147294, + 256, 147342, 256, 28614, 256, 28729, 256, 28702, 256, 28699, 256, 15766, + 256, 28746, 256, 28797, 256, 28791, 256, 28845, 256, 132389, 256, 28997, + 256, 148067, 256, 29084, 256, 148395, 256, 29224, 256, 29237, 256, 29264, + 256, 149000, 256, 29312, 256, 29333, 256, 149301, 256, 149524, 256, + 29562, 256, 29579, 256, 16044, 256, 29605, 256, 16056, 256, 16056, 256, + 29767, 256, 29788, 256, 29809, 256, 29829, 256, 29898, 256, 16155, 256, + 29988, 256, 150582, 256, 30014, 256, 150674, 256, 30064, 256, 139679, + 256, 30224, 256, 151457, 256, 151480, 256, 151620, 256, 16380, 256, + 16392, 256, 30452, 256, 151795, 256, 151794, 256, 151833, 256, 151859, + 256, 30494, 256, 30495, 256, 30495, 256, 30538, 256, 16441, 256, 30603, + 256, 16454, 256, 16534, 256, 152605, 256, 30798, 256, 30860, 256, 30924, + 256, 16611, 256, 153126, 256, 31062, 256, 153242, 256, 153285, 256, + 31119, 256, 31211, 256, 16687, 256, 31296, 256, 31306, 256, 31311, 256, + 153980, 256, 154279, 256, 154279, 256, 31470, 256, 16898, 256, 154539, + 256, 31686, 256, 31689, 256, 16935, 256, 154752, 256, 31954, 256, 17056, + 256, 31976, 256, 31971, 256, 32000, 256, 155526, 256, 32099, 256, 17153, + 256, 32199, 256, 32258, 256, 32325, 256, 17204, 256, 156200, 256, 156231, + 256, 17241, 256, 156377, 256, 32634, 256, 156478, 256, 32661, 256, 32762, + 256, 32773, 256, 156890, 256, 156963, 256, 32864, 256, 157096, 256, + 32880, 256, 144223, 256, 17365, 256, 32946, 256, 33027, 256, 17419, 256, + 33086, 256, 23221, 256, 157607, 256, 157621, 256, 144275, 256, 144284, + 256, 33281, 256, 33284, 256, 36766, 256, 17515, 256, 33425, 256, 33419, + 256, 33437, 256, 21171, 256, 33457, 256, 33459, 256, 33469, 256, 33510, + 256, 158524, 256, 33509, 256, 33565, 256, 33635, 256, 33709, 256, 33571, + 256, 33725, 256, 33767, 256, 33879, 256, 33619, 256, 33738, 256, 33740, + 256, 33756, 256, 158774, 256, 159083, 256, 158933, 256, 17707, 256, + 34033, 256, 34035, 256, 34070, 256, 160714, 256, 34148, 256, 159532, 256, + 17757, 256, 17761, 256, 159665, 256, 159954, 256, 17771, 256, 34384, 256, + 34396, 256, 34407, 256, 34409, 256, 34473, 256, 34440, 256, 34574, 256, + 34530, 256, 34681, 256, 34600, 256, 34667, 256, 34694, 256, 17879, 256, + 34785, 256, 34817, 256, 17913, 256, 34912, 256, 34915, 256, 161383, 256, + 35031, 256, 35038, 256, 17973, 256, 35066, 256, 13499, 256, 161966, 256, + 162150, 256, 18110, 256, 18119, 256, 35488, 256, 35565, 256, 35722, 256, + 35925, 256, 162984, 256, 36011, 256, 36033, 256, 36123, 256, 36215, 256, + 163631, 256, 133124, 256, 36299, 256, 36284, 256, 36336, 256, 133342, + 256, 36564, 256, 36664, 256, 165330, 256, 165357, 256, 37012, 256, 37105, + 256, 37137, 256, 165678, 256, 37147, 256, 37432, 256, 37591, 256, 37592, + 256, 37500, 256, 37881, 256, 37909, 256, 166906, 256, 38283, 256, 18837, + 256, 38327, 256, 167287, 256, 18918, 256, 38595, 256, 23986, 256, 38691, + 256, 168261, 256, 168474, 256, 19054, 256, 19062, 256, 38880, 256, + 168970, 256, 19122, 256, 169110, 256, 38923, 256, 38923, 256, 38953, 256, + 169398, 256, 39138, 256, 19251, 256, 39209, 256, 39335, 256, 39362, 256, + 39422, 256, 19406, 256, 170800, 256, 39698, 256, 40000, 256, 40189, 256, + 19662, 256, 19693, 256, 40295, 256, 172238, 256, 19704, 256, 172293, 256, + 172558, 256, 172689, 256, 40635, 256, 19798, 256, 40697, 256, 40702, 256, + 40709, 256, 40719, 256, 40726, 256, 40763, 256, 173568, }; /* index tables for the decomposition data */ @@ -5385,80 +5434,80 @@ static unsigned short decomp_index2[] = { 12964, 12966, 12968, 12970, 12972, 12974, 12976, 12978, 12980, 12982, 12984, 12986, 12988, 12990, 12992, 12994, 12996, 12998, 13000, 13003, 13006, 13009, 13012, 13016, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13019, 13022, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 13025, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13028, 13031, - 13034, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13036, 13038, 13040, 13042, - 13044, 13046, 13048, 13050, 13052, 13054, 13056, 13058, 13060, 13062, - 13064, 13066, 13068, 13070, 13072, 13074, 13076, 13078, 13080, 13082, - 13084, 13086, 13088, 13090, 13092, 13094, 13096, 13098, 13100, 13102, - 13104, 13106, 13108, 13110, 13112, 13114, 13116, 13118, 13120, 13122, 0, - 0, 0, 0, 13124, 13128, 13132, 13136, 13140, 13144, 13148, 13152, 13156, - 0, 0, 0, 0, 0, 0, 0, 13160, 13162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 13164, 13166, 13168, 13170, 13172, 13174, - 13176, 13178, 13180, 13182, 13184, 13186, 13188, 13190, 13192, 13194, - 13196, 13198, 13200, 13202, 13204, 13206, 13208, 13210, 13212, 13214, - 13216, 13218, 13220, 13222, 13224, 13226, 13228, 13230, 13232, 13234, - 13236, 13238, 13240, 13242, 13244, 13246, 13248, 13250, 13252, 13254, - 13256, 13258, 13260, 13262, 13264, 13266, 13268, 13270, 13272, 13274, - 13276, 13278, 13280, 13282, 13284, 13286, 13288, 13290, 13292, 13294, - 13296, 13298, 13300, 13302, 13304, 13306, 13308, 13310, 13312, 13314, - 13316, 13318, 13320, 13322, 13324, 13326, 13328, 13330, 13332, 13334, - 13336, 13338, 13340, 13342, 13344, 13346, 13348, 13350, 13352, 13354, - 13356, 13358, 13360, 13362, 13364, 13366, 13368, 13370, 13372, 13374, - 13376, 13378, 13380, 13382, 13384, 13386, 13388, 13390, 13392, 13394, - 13396, 13398, 13400, 13402, 13404, 13406, 13408, 13410, 13412, 13414, - 13416, 13418, 13420, 13422, 13424, 13426, 13428, 13430, 13432, 13434, - 13436, 13438, 13440, 13442, 13444, 13446, 13448, 13450, 13452, 13454, - 13456, 13458, 13460, 13462, 13464, 13466, 13468, 13470, 13472, 13474, - 13476, 13478, 13480, 13482, 13484, 13486, 13488, 13490, 13492, 13494, - 13496, 13498, 13500, 13502, 13504, 13506, 13508, 13510, 13512, 13514, - 13516, 13518, 13520, 13522, 13524, 13526, 13528, 13530, 13532, 13534, - 13536, 13538, 13540, 13542, 13544, 13546, 13548, 13550, 13552, 13554, - 13556, 13558, 13560, 13562, 13564, 13566, 13568, 13570, 13572, 13574, - 13576, 13578, 13580, 13582, 13584, 13586, 13588, 13590, 13592, 13594, - 13596, 13598, 13600, 13602, 13604, 13606, 13608, 13610, 13612, 13614, - 13616, 13618, 13620, 13622, 13624, 13626, 13628, 13630, 13632, 13634, - 13636, 13638, 13640, 13642, 13644, 13646, 13648, 13650, 13652, 13654, - 13656, 13658, 13660, 13662, 13664, 13666, 13668, 13670, 13672, 13674, - 13676, 13678, 13680, 13682, 13684, 13686, 13688, 13690, 13692, 13694, - 13696, 13698, 13700, 13702, 13704, 13706, 13708, 13710, 13712, 13714, - 13716, 13718, 13720, 13722, 13724, 13726, 13728, 13730, 13732, 13734, - 13736, 13738, 13740, 13742, 13744, 13746, 13748, 13750, 13752, 13754, - 13756, 13758, 13760, 13762, 13764, 13766, 13768, 13770, 13772, 13774, - 13776, 13778, 13780, 13782, 13784, 13786, 13788, 13790, 13792, 13794, - 13796, 13798, 13800, 13802, 13804, 13806, 13808, 13810, 13812, 13814, - 13816, 13818, 13820, 13822, 13824, 13826, 13828, 13830, 13832, 13834, - 13836, 13838, 13840, 13842, 13844, 13846, 13848, 13850, 13852, 13854, - 13856, 13858, 13860, 13862, 13864, 13866, 13868, 13870, 13872, 13874, - 13876, 13878, 13880, 13882, 13884, 13886, 13888, 13890, 13892, 13894, - 13896, 13898, 13900, 13902, 13904, 13906, 13908, 13910, 13912, 13914, - 13916, 13918, 13920, 13922, 13924, 13926, 13928, 13930, 13932, 13934, - 13936, 13938, 13940, 13942, 13944, 13946, 13948, 13950, 13952, 13954, - 13956, 13958, 13960, 13962, 13964, 13966, 13968, 13970, 13972, 13974, - 13976, 13978, 13980, 13982, 13984, 13986, 13988, 13990, 13992, 13994, - 13996, 13998, 14000, 14002, 14004, 14006, 14008, 14010, 14012, 14014, - 14016, 14018, 14020, 14022, 14024, 14026, 14028, 14030, 14032, 14034, - 14036, 14038, 14040, 14042, 14044, 14046, 14048, 14050, 14052, 14054, - 14056, 14058, 14060, 14062, 14064, 14066, 14068, 14070, 14072, 14074, - 14076, 14078, 14080, 14082, 14084, 14086, 14088, 14090, 14092, 14094, - 14096, 14098, 14100, 14102, 14104, 14106, 14108, 14110, 14112, 14114, - 14116, 14118, 14120, 14122, 14124, 14126, 14128, 14130, 14132, 14134, - 14136, 14138, 14140, 14142, 14144, 14146, 14148, 14150, 14152, 14154, - 14156, 14158, 14160, 14162, 14164, 14166, 14168, 14170, 14172, 14174, - 14176, 14178, 14180, 14182, 14184, 14186, 14188, 14190, 14192, 14194, - 14196, 14198, 14200, 14202, 14204, 14206, 14208, 14210, 14212, 14214, - 14216, 14218, 14220, 14222, 14224, 14226, 14228, 14230, 14232, 14234, - 14236, 14238, 14240, 14242, 14244, 14246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13019, 13022, 13025, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 13028, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13031, + 13034, 13037, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13039, 13041, 13043, + 13045, 13047, 13049, 13051, 13053, 13055, 13057, 13059, 13061, 13063, + 13065, 13067, 13069, 13071, 13073, 13075, 13077, 13079, 13081, 13083, + 13085, 13087, 13089, 13091, 13093, 13095, 13097, 13099, 13101, 13103, + 13105, 13107, 13109, 13111, 13113, 13115, 13117, 13119, 13121, 13123, + 13125, 0, 0, 0, 0, 13127, 13131, 13135, 13139, 13143, 13147, 13151, + 13155, 13159, 0, 0, 0, 0, 0, 0, 0, 13163, 13165, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13167, 13169, 13171, 13173, + 13175, 13177, 13179, 13181, 13183, 13185, 13187, 13189, 13191, 13193, + 13195, 13197, 13199, 13201, 13203, 13205, 13207, 13209, 13211, 13213, + 13215, 13217, 13219, 13221, 13223, 13225, 13227, 13229, 13231, 13233, + 13235, 13237, 13239, 13241, 13243, 13245, 13247, 13249, 13251, 13253, + 13255, 13257, 13259, 13261, 13263, 13265, 13267, 13269, 13271, 13273, + 13275, 13277, 13279, 13281, 13283, 13285, 13287, 13289, 13291, 13293, + 13295, 13297, 13299, 13301, 13303, 13305, 13307, 13309, 13311, 13313, + 13315, 13317, 13319, 13321, 13323, 13325, 13327, 13329, 13331, 13333, + 13335, 13337, 13339, 13341, 13343, 13345, 13347, 13349, 13351, 13353, + 13355, 13357, 13359, 13361, 13363, 13365, 13367, 13369, 13371, 13373, + 13375, 13377, 13379, 13381, 13383, 13385, 13387, 13389, 13391, 13393, + 13395, 13397, 13399, 13401, 13403, 13405, 13407, 13409, 13411, 13413, + 13415, 13417, 13419, 13421, 13423, 13425, 13427, 13429, 13431, 13433, + 13435, 13437, 13439, 13441, 13443, 13445, 13447, 13449, 13451, 13453, + 13455, 13457, 13459, 13461, 13463, 13465, 13467, 13469, 13471, 13473, + 13475, 13477, 13479, 13481, 13483, 13485, 13487, 13489, 13491, 13493, + 13495, 13497, 13499, 13501, 13503, 13505, 13507, 13509, 13511, 13513, + 13515, 13517, 13519, 13521, 13523, 13525, 13527, 13529, 13531, 13533, + 13535, 13537, 13539, 13541, 13543, 13545, 13547, 13549, 13551, 13553, + 13555, 13557, 13559, 13561, 13563, 13565, 13567, 13569, 13571, 13573, + 13575, 13577, 13579, 13581, 13583, 13585, 13587, 13589, 13591, 13593, + 13595, 13597, 13599, 13601, 13603, 13605, 13607, 13609, 13611, 13613, + 13615, 13617, 13619, 13621, 13623, 13625, 13627, 13629, 13631, 13633, + 13635, 13637, 13639, 13641, 13643, 13645, 13647, 13649, 13651, 13653, + 13655, 13657, 13659, 13661, 13663, 13665, 13667, 13669, 13671, 13673, + 13675, 13677, 13679, 13681, 13683, 13685, 13687, 13689, 13691, 13693, + 13695, 13697, 13699, 13701, 13703, 13705, 13707, 13709, 13711, 13713, + 13715, 13717, 13719, 13721, 13723, 13725, 13727, 13729, 13731, 13733, + 13735, 13737, 13739, 13741, 13743, 13745, 13747, 13749, 13751, 13753, + 13755, 13757, 13759, 13761, 13763, 13765, 13767, 13769, 13771, 13773, + 13775, 13777, 13779, 13781, 13783, 13785, 13787, 13789, 13791, 13793, + 13795, 13797, 13799, 13801, 13803, 13805, 13807, 13809, 13811, 13813, + 13815, 13817, 13819, 13821, 13823, 13825, 13827, 13829, 13831, 13833, + 13835, 13837, 13839, 13841, 13843, 13845, 13847, 13849, 13851, 13853, + 13855, 13857, 13859, 13861, 13863, 13865, 13867, 13869, 13871, 13873, + 13875, 13877, 13879, 13881, 13883, 13885, 13887, 13889, 13891, 13893, + 13895, 13897, 13899, 13901, 13903, 13905, 13907, 13909, 13911, 13913, + 13915, 13917, 13919, 13921, 13923, 13925, 13927, 13929, 13931, 13933, + 13935, 13937, 13939, 13941, 13943, 13945, 13947, 13949, 13951, 13953, + 13955, 13957, 13959, 13961, 13963, 13965, 13967, 13969, 13971, 13973, + 13975, 13977, 13979, 13981, 13983, 13985, 13987, 13989, 13991, 13993, + 13995, 13997, 13999, 14001, 14003, 14005, 14007, 14009, 14011, 14013, + 14015, 14017, 14019, 14021, 14023, 14025, 14027, 14029, 14031, 14033, + 14035, 14037, 14039, 14041, 14043, 14045, 14047, 14049, 14051, 14053, + 14055, 14057, 14059, 14061, 14063, 14065, 14067, 14069, 14071, 14073, + 14075, 14077, 14079, 14081, 14083, 14085, 14087, 14089, 14091, 14093, + 14095, 14097, 14099, 14101, 14103, 14105, 14107, 14109, 14111, 14113, + 14115, 14117, 14119, 14121, 14123, 14125, 14127, 14129, 14131, 14133, + 14135, 14137, 14139, 14141, 14143, 14145, 14147, 14149, 14151, 14153, + 14155, 14157, 14159, 14161, 14163, 14165, 14167, 14169, 14171, 14173, + 14175, 14177, 14179, 14181, 14183, 14185, 14187, 14189, 14191, 14193, + 14195, 14197, 14199, 14201, 14203, 14205, 14207, 14209, 14211, 14213, + 14215, 14217, 14219, 14221, 14223, 14225, 14227, 14229, 14231, 14233, + 14235, 14237, 14239, 14241, 14243, 14245, 14247, 14249, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; /* NFC pairs */ @@ -5959,53 +6008,53 @@ static unsigned char changes_3_2_0_index[] = { 2, 2, 2, 2, 2, 2, 2, 114, 115, 116, 117, 118, 119, 2, 2, 120, 121, 122, 2, 123, 124, 125, 126, 127, 128, 2, 129, 130, 131, 132, 133, 134, 2, 51, 51, 135, 2, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 2, - 147, 2, 148, 2, 149, 150, 151, 152, 153, 154, 155, 2, 156, 157, 2, 158, - 159, 160, 161, 2, 162, 163, 2, 2, 164, 165, 2, 2, 166, 167, 168, 169, 2, - 170, 2, 2, 51, 51, 51, 51, 51, 51, 51, 171, 172, 51, 173, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 51, 51, 51, 51, 51, - 51, 51, 174, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 51, 51, 51, 175, 2, 2, 2, 2, 2, 2, + 147, 2, 148, 149, 150, 151, 152, 153, 154, 155, 156, 2, 157, 158, 2, 159, + 160, 161, 162, 2, 163, 164, 2, 165, 166, 167, 2, 2, 168, 169, 170, 171, + 2, 172, 2, 173, 51, 51, 51, 51, 51, 51, 51, 174, 175, 51, 176, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 51, 51, 51, 51, + 51, 51, 51, 177, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 51, 51, 51, 178, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 51, 51, 51, 176, 177, 178, - 179, 2, 2, 2, 2, 89, 180, 181, 182, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 51, 51, 51, 179, 180, 181, + 182, 2, 2, 2, 2, 89, 183, 184, 185, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 183, 51, 51, 51, 51, 51, 184, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 51, 51, 103, 51, 51, 51, 51, 51, 186, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 51, 185, 51, 51, 186, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 187, 188, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 189, 190, 191, 192, 193, 2, 2, 194, 2, - 2, 2, 195, 196, 197, 51, 51, 51, 51, 51, 198, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 199, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 200, 201, 2, 2, - 2, 2, 2, 202, 203, 2, 2, 204, 205, 2, 2, 206, 207, 208, 209, 210, 2, 51, - 51, 51, 51, 51, 51, 51, 211, 212, 213, 214, 215, 216, 217, 218, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 219, 220, 98, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 87, 221, 2, 222, 223, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 51, 187, 51, 51, 188, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 189, 190, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 224, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 225, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 191, 192, 193, 194, 195, 2, 2, 196, 2, + 2, 2, 197, 198, 199, 51, 51, 51, 51, 51, 200, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 201, 2, 202, 2, 2, 203, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 204, 205, 2, + 2, 2, 2, 2, 206, 207, 208, 2, 209, 210, 2, 2, 211, 212, 213, 214, 215, 2, + 51, 51, 51, 51, 51, 51, 51, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 225, 226, 98, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 87, 227, 2, 228, 229, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 226, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 230, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 231, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 232, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 227, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 233, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 228, 51, 229, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 234, 51, 235, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 230, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 236, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 231, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 224, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 51, 237, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 230, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -6240,7 +6289,7 @@ static unsigned char changes_3_2_0_index[] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 232, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 238, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -6304,7 +6353,7 @@ static unsigned char changes_3_2_0_index[] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static unsigned char changes_3_2_0_data[] = { @@ -6430,7 +6479,7 @@ static unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 20, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, @@ -6447,9 +6496,9 @@ static unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 9, 0, 0, 9, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 0, 0, 0, + 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6517,7 +6566,7 @@ static unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6581,7 +6630,7 @@ static unsigned char changes_3_2_0_data[] = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -6694,9 +6743,9 @@ static unsigned char changes_3_2_0_data[] = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -6721,7 +6770,7 @@ static unsigned char changes_3_2_0_data[] = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6869,8 +6918,8 @@ static unsigned char changes_3_2_0_data[] = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -6909,7 +6958,7 @@ static unsigned char changes_3_2_0_data[] = { 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -7107,115 +7156,126 @@ static unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, 9, 9, 9, 9, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, - 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 9, 0, 0, 9, 0, - 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, + 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, + 9, 9, 0, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 0, + 0, 9, 9, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 9, 0, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 0, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, - 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7223,8 +7283,13 @@ static unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7242,8 +7307,8 @@ static unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -7281,206 +7346,222 @@ static unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, + 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 57, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 0, 0, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 9, 9, 9, 9, 0, 9, 0, 9, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 9, 0, 9, - 0, 9, 0, 9, 9, 9, 0, 9, 9, 0, 9, 0, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, - 9, 0, 9, 0, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, - 9, 9, 9, 0, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 0, 9, 9, 9, 9, 9, - 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, + 9, 0, 9, 0, 0, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, + 0, 9, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 9, 0, 9, 0, 9, 0, 9, 9, 9, 0, 9, + 9, 0, 9, 0, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, 9, 0, 9, 0, 0, 9, 9, 9, + 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 0, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 0, 0, 0, - 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, + 9, 9, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, diff --git a/Modules/unicodename_db.h b/Modules/unicodename_db.h index ba79e89bc1d4..8fa87a02cd26 100644 --- a/Modules/unicodename_db.h +++ b/Modules/unicodename_db.h @@ -1,4 +1,4 @@ -/* this file was generated by Tools/unicode/makeunicodedata.py 3.2 */ +/* this file was generated by Tools/unicode/makeunicodedata.py 3.3 */ #define NAME_MAXLEN 256 @@ -15,97 +15,97 @@ static unsigned char lexicon[] = { 76, 76, 65, 66, 73, 67, 211, 83, 73, 71, 78, 87, 82, 73, 84, 73, 78, 199, 84, 73, 77, 69, 211, 66, 65, 77, 85, 205, 65, 78, 196, 66, 79, 76, 196, 65, 78, 65, 84, 79, 76, 73, 65, 206, 72, 65, 78, 71, 85, 204, 76, 73, 78, - 69, 65, 210, 71, 82, 69, 69, 203, 76, 73, 71, 65, 84, 85, 82, 197, 77, - 85, 83, 73, 67, 65, 204, 69, 84, 72, 73, 79, 80, 73, 195, 78, 85, 77, 66, - 69, 210, 67, 79, 77, 66, 73, 78, 73, 78, 199, 70, 79, 210, 193, 67, 89, - 82, 73, 76, 76, 73, 195, 73, 84, 65, 76, 73, 195, 78, 85, 83, 72, 213, - 82, 65, 68, 73, 67, 65, 204, 83, 65, 78, 83, 45, 83, 69, 82, 73, 198, 67, - 73, 82, 67, 76, 69, 196, 83, 81, 85, 65, 82, 197, 84, 65, 77, 73, 204, + 69, 65, 210, 78, 85, 77, 66, 69, 210, 71, 82, 69, 69, 203, 76, 73, 71, + 65, 84, 85, 82, 197, 77, 85, 83, 73, 67, 65, 204, 69, 84, 72, 73, 79, 80, + 73, 195, 70, 79, 210, 67, 79, 77, 66, 73, 78, 73, 78, 199, 193, 67, 89, + 82, 73, 76, 76, 73, 195, 73, 84, 65, 76, 73, 195, 84, 65, 77, 73, 204, + 78, 85, 83, 72, 213, 82, 65, 68, 73, 67, 65, 204, 83, 65, 78, 83, 45, 83, + 69, 82, 73, 198, 67, 73, 82, 67, 76, 69, 196, 83, 81, 85, 65, 82, 197, 70, 73, 78, 65, 204, 84, 65, 201, 76, 69, 70, 212, 65, 82, 82, 79, 87, - 128, 82, 73, 71, 72, 212, 86, 65, 201, 68, 79, 85, 66, 76, 197, 72, 69, - 78, 84, 65, 73, 71, 65, 78, 193, 83, 73, 71, 78, 128, 65, 66, 79, 86, 69, - 128, 66, 69, 76, 79, 87, 128, 65, 82, 82, 79, 215, 86, 65, 82, 73, 65, - 84, 73, 79, 206, 66, 82, 65, 73, 76, 76, 197, 80, 65, 84, 84, 69, 82, - 206, 65, 128, 66, 76, 65, 67, 203, 66, 89, 90, 65, 78, 84, 73, 78, 197, - 85, 128, 87, 72, 73, 84, 197, 73, 128, 73, 83, 79, 76, 65, 84, 69, 196, - 77, 79, 68, 73, 70, 73, 69, 210, 194, 75, 65, 84, 65, 75, 65, 78, 193, - 79, 128, 77, 89, 65, 78, 77, 65, 210, 68, 79, 212, 79, 198, 77, 65, 82, + 128, 68, 79, 85, 66, 76, 197, 82, 73, 71, 72, 212, 86, 65, 201, 83, 73, + 71, 78, 128, 72, 69, 78, 84, 65, 73, 71, 65, 78, 193, 65, 66, 79, 86, 69, + 128, 66, 76, 65, 67, 203, 87, 72, 73, 84, 197, 66, 69, 76, 79, 87, 128, + 65, 82, 82, 79, 215, 86, 65, 82, 73, 65, 84, 73, 79, 206, 65, 128, 66, + 82, 65, 73, 76, 76, 197, 80, 65, 84, 84, 69, 82, 206, 85, 128, 66, 89, + 90, 65, 78, 84, 73, 78, 197, 73, 128, 73, 83, 79, 76, 65, 84, 69, 196, + 75, 65, 84, 65, 75, 65, 78, 193, 79, 128, 77, 79, 68, 73, 70, 73, 69, + 210, 194, 77, 89, 65, 78, 77, 65, 210, 68, 79, 212, 79, 198, 77, 65, 82, 75, 128, 75, 65, 78, 71, 88, 201, 75, 73, 75, 65, 75, 85, 201, 77, 69, 78, 68, 197, 84, 73, 66, 69, 84, 65, 206, 86, 69, 82, 84, 73, 67, 65, - 204, 73, 78, 73, 84, 73, 65, 204, 72, 69, 65, 86, 217, 77, 69, 69, 205, - 67, 79, 80, 84, 73, 195, 75, 72, 77, 69, 210, 65, 66, 79, 86, 197, 82, - 73, 71, 72, 84, 87, 65, 82, 68, 211, 67, 65, 82, 82, 73, 69, 210, 89, 69, - 200, 71, 69, 79, 82, 71, 73, 65, 206, 67, 72, 69, 82, 79, 75, 69, 197, - 77, 79, 78, 71, 79, 76, 73, 65, 206, 80, 76, 85, 211, 68, 69, 86, 65, 78, - 65, 71, 65, 82, 201, 79, 78, 69, 128, 83, 81, 85, 65, 82, 69, 196, 80, - 72, 65, 83, 69, 45, 197, 83, 84, 82, 79, 75, 69, 128, 83, 89, 77, 66, 79, - 76, 128, 84, 87, 79, 128, 76, 69, 70, 84, 87, 65, 82, 68, 211, 67, 79, - 78, 83, 79, 78, 65, 78, 212, 79, 78, 197, 66, 79, 216, 77, 73, 68, 68, - 76, 197, 84, 73, 76, 197, 68, 85, 80, 76, 79, 89, 65, 206, 86, 79, 67, - 65, 76, 73, 195, 74, 79, 78, 71, 83, 69, 79, 78, 199, 77, 65, 82, 203, - 84, 87, 207, 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, 90, 69, 196, 84, 72, - 65, 205, 71, 79, 78, 68, 201, 72, 69, 66, 82, 69, 215, 85, 208, 77, 73, - 65, 207, 84, 72, 82, 69, 197, 71, 76, 65, 71, 79, 76, 73, 84, 73, 195, - 72, 79, 79, 75, 128, 76, 79, 215, 79, 86, 69, 210, 68, 82, 65, 87, 73, - 78, 71, 211, 72, 73, 71, 200, 77, 65, 76, 65, 89, 65, 76, 65, 205, 72, - 77, 79, 78, 199, 73, 78, 68, 69, 216, 80, 65, 72, 65, 87, 200, 68, 79, - 87, 206, 67, 72, 79, 83, 69, 79, 78, 199, 84, 72, 82, 69, 69, 128, 70, - 79, 85, 82, 128, 72, 65, 76, 70, 87, 73, 68, 84, 200, 72, 65, 78, 68, 45, - 70, 73, 83, 212, 77, 69, 82, 79, 73, 84, 73, 195, 66, 65, 76, 73, 78, 69, - 83, 197, 73, 68, 69, 79, 71, 82, 65, 80, 72, 73, 195, 72, 65, 128, 83, - 67, 82, 73, 80, 212, 73, 68, 69, 79, 71, 82, 65, 205, 80, 72, 65, 83, 69, - 45, 196, 84, 79, 128, 65, 76, 67, 72, 69, 77, 73, 67, 65, 204, 65, 76, - 69, 198, 70, 73, 86, 69, 128, 83, 73, 78, 72, 65, 76, 193, 78, 85, 77, - 69, 82, 73, 195, 66, 65, 82, 128, 84, 79, 78, 197, 72, 65, 76, 198, 66, - 82, 65, 72, 77, 201, 75, 65, 128, 72, 85, 78, 71, 65, 82, 73, 65, 206, - 84, 72, 85, 77, 194, 66, 65, 82, 194, 72, 65, 200, 80, 65, 128, 78, 79, - 82, 84, 200, 89, 65, 128, 70, 85, 76, 76, 87, 73, 68, 84, 200, 76, 73, - 71, 72, 212, 77, 65, 128, 66, 82, 65, 67, 75, 69, 84, 128, 69, 81, 85, - 65, 204, 76, 79, 78, 199, 82, 65, 128, 83, 73, 88, 128, 76, 65, 128, 84, - 65, 199, 68, 79, 77, 73, 78, 207, 69, 73, 71, 72, 84, 128, 78, 65, 128, - 65, 67, 85, 84, 69, 128, 70, 82, 65, 75, 84, 85, 210, 83, 69, 86, 69, 78, - 128, 67, 72, 65, 82, 65, 67, 84, 69, 210, 78, 73, 78, 69, 128, 79, 80, - 69, 206, 80, 72, 65, 83, 69, 45, 195, 83, 65, 128, 66, 69, 78, 71, 65, - 76, 201, 66, 72, 65, 73, 75, 83, 85, 75, 201, 68, 79, 85, 66, 76, 69, 45, - 83, 84, 82, 85, 67, 203, 84, 69, 76, 85, 71, 213, 65, 82, 77, 69, 78, 73, - 65, 206, 72, 73, 82, 65, 71, 65, 78, 193, 77, 69, 68, 73, 65, 204, 90, - 90, 89, 88, 128, 90, 90, 89, 84, 128, 90, 90, 89, 82, 88, 128, 90, 90, - 89, 82, 128, 90, 90, 89, 80, 128, 90, 90, 89, 65, 128, 90, 90, 89, 128, - 90, 90, 85, 88, 128, 90, 90, 85, 82, 88, 128, 90, 90, 85, 82, 128, 90, - 90, 85, 80, 128, 90, 90, 85, 128, 90, 90, 83, 89, 65, 128, 90, 90, 83, - 65, 128, 90, 90, 79, 88, 128, 90, 90, 79, 80, 128, 90, 90, 79, 128, 90, - 90, 73, 88, 128, 90, 90, 73, 84, 128, 90, 90, 73, 80, 128, 90, 90, 73, - 69, 88, 128, 90, 90, 73, 69, 84, 128, 90, 90, 73, 69, 80, 128, 90, 90, - 73, 69, 128, 90, 90, 73, 128, 90, 90, 69, 88, 128, 90, 90, 69, 80, 128, - 90, 90, 69, 69, 128, 90, 90, 69, 128, 90, 90, 65, 88, 128, 90, 90, 65, - 84, 128, 90, 90, 65, 80, 128, 90, 90, 65, 65, 128, 90, 90, 65, 128, 90, - 89, 71, 79, 83, 128, 90, 87, 83, 80, 128, 90, 87, 78, 74, 128, 90, 87, - 78, 66, 83, 80, 128, 90, 87, 74, 128, 90, 87, 202, 90, 87, 65, 82, 65, - 75, 65, 89, 128, 90, 87, 65, 128, 90, 85, 84, 128, 90, 85, 79, 88, 128, - 90, 85, 79, 80, 128, 90, 85, 79, 128, 90, 85, 77, 128, 90, 85, 66, 85, - 82, 128, 90, 85, 53, 128, 90, 85, 181, 90, 213, 90, 83, 72, 65, 128, 90, - 82, 65, 128, 90, 81, 65, 80, 72, 193, 90, 79, 84, 128, 90, 79, 79, 128, - 90, 79, 77, 66, 73, 69, 128, 90, 79, 65, 128, 90, 76, 65, 77, 193, 90, - 76, 65, 128, 90, 76, 193, 90, 74, 69, 128, 90, 73, 90, 50, 128, 90, 73, - 81, 65, 65, 128, 90, 73, 80, 80, 69, 82, 45, 77, 79, 85, 84, 200, 90, 73, - 78, 79, 82, 128, 90, 73, 76, 68, 69, 128, 90, 73, 71, 90, 65, 199, 90, - 73, 71, 128, 90, 73, 68, 193, 90, 73, 66, 128, 90, 73, 194, 90, 73, 51, - 128, 90, 201, 90, 72, 89, 88, 128, 90, 72, 89, 84, 128, 90, 72, 89, 82, - 88, 128, 90, 72, 89, 82, 128, 90, 72, 89, 80, 128, 90, 72, 89, 128, 90, - 72, 87, 69, 128, 90, 72, 87, 65, 128, 90, 72, 85, 88, 128, 90, 72, 85, - 84, 128, 90, 72, 85, 82, 88, 128, 90, 72, 85, 82, 128, 90, 72, 85, 80, - 128, 90, 72, 85, 79, 88, 128, 90, 72, 85, 79, 80, 128, 90, 72, 85, 79, - 128, 90, 72, 85, 128, 90, 72, 79, 88, 128, 90, 72, 79, 84, 128, 90, 72, - 79, 80, 128, 90, 72, 79, 79, 128, 90, 72, 79, 73, 128, 90, 72, 79, 128, - 90, 72, 73, 86, 69, 84, 69, 128, 90, 72, 73, 76, 128, 90, 72, 73, 128, - 90, 72, 69, 88, 128, 90, 72, 69, 84, 128, 90, 72, 69, 80, 128, 90, 72, - 69, 69, 128, 90, 72, 69, 128, 90, 72, 197, 90, 72, 65, 89, 73, 78, 128, - 90, 72, 65, 88, 128, 90, 72, 65, 84, 128, 90, 72, 65, 82, 128, 90, 72, - 65, 80, 128, 90, 72, 65, 73, 78, 128, 90, 72, 65, 65, 128, 90, 72, 65, - 128, 90, 72, 128, 90, 69, 85, 83, 128, 90, 69, 84, 65, 128, 90, 69, 82, - 79, 128, 90, 69, 82, 207, 90, 69, 78, 128, 90, 69, 77, 76, 89, 65, 128, - 90, 69, 77, 76, 74, 65, 128, 90, 69, 66, 82, 193, 90, 69, 50, 128, 90, - 197, 90, 65, 89, 78, 128, 90, 65, 89, 73, 78, 128, 90, 65, 89, 73, 206, + 204, 73, 78, 73, 84, 73, 65, 204, 72, 69, 65, 86, 217, 72, 77, 79, 78, + 199, 77, 69, 69, 205, 67, 79, 80, 84, 73, 195, 75, 72, 77, 69, 210, 65, + 66, 79, 86, 197, 82, 73, 71, 72, 84, 87, 65, 82, 68, 211, 67, 65, 82, 82, + 73, 69, 210, 89, 69, 200, 71, 69, 79, 82, 71, 73, 65, 206, 67, 72, 69, + 82, 79, 75, 69, 197, 77, 79, 78, 71, 79, 76, 73, 65, 206, 79, 78, 197, + 80, 76, 85, 211, 84, 87, 207, 79, 78, 69, 128, 68, 69, 86, 65, 78, 65, + 71, 65, 82, 201, 84, 87, 79, 128, 83, 81, 85, 65, 82, 69, 196, 80, 72, + 65, 83, 69, 45, 197, 83, 89, 77, 66, 79, 76, 128, 83, 84, 82, 79, 75, 69, + 128, 76, 69, 70, 84, 87, 65, 82, 68, 211, 67, 79, 78, 83, 79, 78, 65, 78, + 212, 77, 73, 65, 207, 86, 79, 67, 65, 76, 73, 195, 66, 79, 216, 77, 73, + 68, 68, 76, 197, 84, 73, 76, 197, 68, 85, 80, 76, 79, 89, 65, 206, 84, + 72, 82, 69, 197, 74, 79, 78, 71, 83, 69, 79, 78, 199, 77, 65, 82, 203, + 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, 90, 69, 196, 84, 72, 65, 205, 71, + 79, 78, 68, 201, 72, 79, 79, 75, 128, 72, 69, 66, 82, 69, 215, 85, 208, + 71, 76, 65, 71, 79, 76, 73, 84, 73, 195, 76, 79, 215, 79, 86, 69, 210, + 83, 73, 89, 65, 209, 68, 82, 65, 87, 73, 78, 71, 211, 72, 73, 71, 200, + 77, 65, 76, 65, 89, 65, 76, 65, 205, 73, 78, 68, 69, 216, 80, 65, 72, 65, + 87, 200, 84, 72, 82, 69, 69, 128, 68, 79, 87, 206, 70, 79, 85, 82, 128, + 67, 72, 79, 83, 69, 79, 78, 199, 72, 65, 76, 70, 87, 73, 68, 84, 200, 72, + 65, 78, 68, 45, 70, 73, 83, 212, 77, 69, 82, 79, 73, 84, 73, 195, 66, 65, + 76, 73, 78, 69, 83, 197, 72, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 73, 195, 83, 67, 82, 73, 80, 212, 70, 73, 86, 69, 128, 73, 68, 69, 79, + 71, 82, 65, 205, 80, 72, 65, 83, 69, 45, 196, 84, 79, 128, 65, 76, 67, + 72, 69, 77, 73, 67, 65, 204, 65, 76, 69, 198, 84, 79, 78, 197, 83, 73, + 78, 72, 65, 76, 193, 66, 65, 82, 128, 75, 65, 128, 78, 85, 77, 69, 82, + 73, 195, 72, 65, 76, 198, 66, 82, 65, 72, 77, 201, 72, 85, 78, 71, 65, + 82, 73, 65, 206, 80, 65, 128, 84, 72, 85, 77, 194, 84, 85, 82, 78, 69, + 196, 89, 65, 128, 66, 65, 82, 194, 77, 65, 128, 83, 73, 88, 128, 72, 65, + 200, 82, 65, 128, 84, 72, 79, 85, 83, 65, 78, 68, 128, 69, 73, 71, 72, + 84, 128, 76, 65, 128, 78, 79, 82, 84, 200, 70, 85, 76, 76, 87, 73, 68, + 84, 200, 76, 73, 71, 72, 212, 78, 65, 128, 83, 69, 86, 69, 78, 128, 66, + 82, 65, 67, 75, 69, 84, 128, 69, 81, 85, 65, 204, 76, 79, 78, 199, 78, + 73, 78, 69, 128, 83, 65, 128, 84, 65, 199, 68, 79, 77, 73, 78, 207, 65, + 67, 85, 84, 69, 128, 70, 82, 65, 75, 84, 85, 210, 72, 73, 82, 65, 71, 65, + 78, 193, 84, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 210, 70, 82, 65, + 67, 84, 73, 79, 206, 79, 80, 69, 206, 80, 72, 65, 83, 69, 45, 195, 84, + 69, 76, 85, 71, 213, 90, 90, 89, 88, 128, 90, 90, 89, 84, 128, 90, 90, + 89, 82, 88, 128, 90, 90, 89, 82, 128, 90, 90, 89, 80, 128, 90, 90, 89, + 65, 128, 90, 90, 89, 128, 90, 90, 85, 88, 128, 90, 90, 85, 82, 88, 128, + 90, 90, 85, 82, 128, 90, 90, 85, 80, 128, 90, 90, 85, 128, 90, 90, 83, + 89, 65, 128, 90, 90, 83, 65, 128, 90, 90, 79, 88, 128, 90, 90, 79, 80, + 128, 90, 90, 79, 128, 90, 90, 73, 88, 128, 90, 90, 73, 84, 128, 90, 90, + 73, 80, 128, 90, 90, 73, 69, 88, 128, 90, 90, 73, 69, 84, 128, 90, 90, + 73, 69, 80, 128, 90, 90, 73, 69, 128, 90, 90, 73, 128, 90, 90, 69, 88, + 128, 90, 90, 69, 80, 128, 90, 90, 69, 69, 128, 90, 90, 69, 128, 90, 90, + 65, 88, 128, 90, 90, 65, 84, 128, 90, 90, 65, 80, 128, 90, 90, 65, 65, + 128, 90, 90, 65, 128, 90, 89, 71, 79, 83, 128, 90, 87, 83, 80, 128, 90, + 87, 78, 74, 128, 90, 87, 78, 66, 83, 80, 128, 90, 87, 74, 128, 90, 87, + 202, 90, 87, 65, 82, 65, 75, 65, 89, 128, 90, 87, 65, 128, 90, 85, 84, + 128, 90, 85, 79, 88, 128, 90, 85, 79, 80, 128, 90, 85, 79, 128, 90, 85, + 77, 128, 90, 85, 66, 85, 82, 128, 90, 85, 53, 128, 90, 85, 181, 90, 213, + 90, 83, 72, 65, 128, 90, 82, 65, 128, 90, 81, 65, 80, 72, 193, 90, 79, + 84, 128, 90, 79, 79, 128, 90, 79, 77, 66, 73, 69, 128, 90, 79, 65, 128, + 90, 76, 65, 77, 193, 90, 76, 65, 128, 90, 76, 193, 90, 74, 69, 128, 90, + 73, 90, 50, 128, 90, 73, 81, 65, 65, 128, 90, 73, 80, 80, 69, 82, 45, 77, + 79, 85, 84, 200, 90, 73, 78, 79, 82, 128, 90, 73, 76, 68, 69, 128, 90, + 73, 71, 90, 65, 199, 90, 73, 71, 128, 90, 73, 68, 193, 90, 73, 66, 128, + 90, 73, 194, 90, 73, 51, 128, 90, 201, 90, 72, 89, 88, 128, 90, 72, 89, + 84, 128, 90, 72, 89, 82, 88, 128, 90, 72, 89, 82, 128, 90, 72, 89, 80, + 128, 90, 72, 89, 128, 90, 72, 87, 69, 128, 90, 72, 87, 65, 128, 90, 72, + 85, 88, 128, 90, 72, 85, 84, 128, 90, 72, 85, 82, 88, 128, 90, 72, 85, + 82, 128, 90, 72, 85, 80, 128, 90, 72, 85, 79, 88, 128, 90, 72, 85, 79, + 80, 128, 90, 72, 85, 79, 128, 90, 72, 85, 128, 90, 72, 79, 88, 128, 90, + 72, 79, 84, 128, 90, 72, 79, 80, 128, 90, 72, 79, 79, 128, 90, 72, 79, + 73, 128, 90, 72, 79, 128, 90, 72, 73, 86, 69, 84, 69, 128, 90, 72, 73, + 76, 128, 90, 72, 73, 128, 90, 72, 69, 88, 128, 90, 72, 69, 84, 128, 90, + 72, 69, 80, 128, 90, 72, 69, 69, 128, 90, 72, 69, 128, 90, 72, 197, 90, + 72, 65, 89, 73, 78, 128, 90, 72, 65, 88, 128, 90, 72, 65, 84, 128, 90, + 72, 65, 82, 128, 90, 72, 65, 80, 128, 90, 72, 65, 73, 78, 128, 90, 72, + 65, 65, 128, 90, 72, 65, 128, 90, 72, 128, 90, 69, 85, 83, 128, 90, 69, + 84, 65, 128, 90, 69, 82, 79, 128, 90, 69, 82, 207, 90, 69, 78, 128, 90, + 69, 77, 76, 89, 65, 128, 90, 69, 77, 76, 74, 65, 128, 90, 69, 66, 82, + 193, 90, 69, 50, 128, 90, 197, 90, 65, 89, 78, 128, 90, 65, 89, 73, 78, + 45, 89, 79, 68, 72, 128, 90, 65, 89, 73, 78, 128, 90, 65, 89, 73, 206, 90, 65, 86, 73, 89, 65, 78, 73, 128, 90, 65, 84, 65, 128, 90, 65, 82, 81, 65, 128, 90, 65, 82, 76, 128, 90, 65, 81, 69, 198, 90, 65, 78, 65, 66, 65, 90, 65, 210, 90, 65, 77, 88, 128, 90, 65, 76, 128, 90, 65, 204, 90, @@ -134,277 +134,280 @@ static unsigned char lexicon[] = { 85, 211, 89, 85, 82, 88, 128, 89, 85, 82, 128, 89, 85, 81, 128, 89, 85, 209, 89, 85, 80, 128, 89, 85, 79, 88, 128, 89, 85, 79, 84, 128, 89, 85, 79, 80, 128, 89, 85, 79, 77, 128, 89, 85, 79, 128, 89, 85, 78, 128, 89, - 85, 77, 128, 89, 85, 74, 128, 89, 85, 69, 81, 128, 89, 85, 69, 128, 89, - 85, 68, 72, 128, 89, 85, 68, 200, 89, 85, 65, 78, 128, 89, 85, 65, 69, - 78, 128, 89, 85, 45, 89, 69, 79, 128, 89, 85, 45, 89, 69, 128, 89, 85, - 45, 85, 128, 89, 85, 45, 79, 128, 89, 85, 45, 73, 128, 89, 85, 45, 69, - 79, 128, 89, 85, 45, 69, 128, 89, 85, 45, 65, 69, 128, 89, 85, 45, 65, - 128, 89, 85, 45, 52, 128, 89, 85, 45, 51, 128, 89, 85, 45, 50, 128, 89, - 85, 45, 49, 128, 89, 85, 128, 89, 213, 89, 82, 89, 128, 89, 80, 83, 73, - 76, 73, 128, 89, 80, 79, 82, 82, 79, 73, 128, 89, 80, 79, 75, 82, 73, 83, - 73, 83, 128, 89, 80, 79, 75, 82, 73, 83, 73, 211, 89, 80, 79, 71, 69, 71, - 82, 65, 77, 77, 69, 78, 73, 128, 89, 79, 89, 128, 89, 79, 88, 128, 89, - 79, 87, 68, 128, 89, 79, 85, 84, 72, 70, 85, 76, 78, 69, 83, 83, 128, 89, - 79, 85, 84, 72, 70, 85, 204, 89, 79, 213, 89, 79, 84, 128, 89, 79, 82, - 73, 128, 89, 79, 81, 128, 89, 79, 209, 89, 79, 80, 128, 89, 79, 79, 128, - 89, 79, 77, 79, 128, 89, 79, 71, 72, 128, 89, 79, 68, 72, 128, 89, 79, - 68, 128, 89, 79, 196, 89, 79, 65, 128, 89, 79, 45, 89, 69, 79, 128, 89, - 79, 45, 89, 65, 69, 128, 89, 79, 45, 89, 65, 128, 89, 79, 45, 79, 128, - 89, 79, 45, 73, 128, 89, 79, 45, 69, 79, 128, 89, 79, 45, 65, 69, 128, - 89, 79, 45, 65, 128, 89, 79, 45, 54, 128, 89, 79, 45, 53, 128, 89, 79, - 45, 52, 128, 89, 79, 45, 51, 128, 89, 79, 45, 50, 128, 89, 79, 45, 49, - 128, 89, 79, 128, 89, 207, 89, 73, 90, 69, 84, 128, 89, 73, 88, 128, 89, + 85, 77, 128, 89, 85, 74, 128, 89, 85, 73, 128, 89, 85, 69, 81, 128, 89, + 85, 69, 128, 89, 85, 68, 72, 128, 89, 85, 68, 200, 89, 85, 65, 78, 128, + 89, 85, 65, 69, 78, 128, 89, 85, 45, 89, 69, 79, 128, 89, 85, 45, 89, 69, + 128, 89, 85, 45, 85, 128, 89, 85, 45, 79, 128, 89, 85, 45, 73, 128, 89, + 85, 45, 69, 79, 128, 89, 85, 45, 69, 128, 89, 85, 45, 65, 69, 128, 89, + 85, 45, 65, 128, 89, 85, 45, 52, 128, 89, 85, 45, 51, 128, 89, 85, 45, + 50, 128, 89, 85, 45, 49, 128, 89, 85, 128, 89, 213, 89, 82, 89, 128, 89, + 80, 83, 73, 76, 73, 128, 89, 80, 79, 82, 82, 79, 73, 128, 89, 80, 79, 75, + 82, 73, 83, 73, 83, 128, 89, 80, 79, 75, 82, 73, 83, 73, 211, 89, 80, 79, + 71, 69, 71, 82, 65, 77, 77, 69, 78, 73, 128, 89, 79, 89, 128, 89, 79, 88, + 128, 89, 79, 87, 68, 128, 89, 79, 85, 84, 72, 70, 85, 76, 78, 69, 83, 83, + 128, 89, 79, 85, 84, 72, 70, 85, 204, 89, 79, 213, 89, 79, 84, 128, 89, + 79, 82, 73, 128, 89, 79, 81, 128, 89, 79, 209, 89, 79, 80, 128, 89, 79, + 79, 128, 89, 79, 77, 79, 128, 89, 79, 71, 72, 128, 89, 79, 68, 128, 89, + 79, 196, 89, 79, 65, 128, 89, 79, 45, 89, 79, 128, 89, 79, 45, 89, 69, + 79, 128, 89, 79, 45, 89, 65, 69, 128, 89, 79, 45, 89, 65, 128, 89, 79, + 45, 79, 128, 89, 79, 45, 73, 128, 89, 79, 45, 69, 79, 128, 89, 79, 45, + 65, 69, 128, 89, 79, 45, 65, 128, 89, 79, 45, 54, 128, 89, 79, 45, 53, + 128, 89, 79, 45, 52, 128, 89, 79, 45, 51, 128, 89, 79, 45, 50, 128, 89, + 79, 45, 49, 128, 89, 207, 89, 73, 90, 69, 84, 128, 89, 73, 88, 128, 89, 73, 87, 78, 128, 89, 73, 84, 128, 89, 73, 80, 128, 89, 73, 78, 71, 128, - 89, 73, 73, 128, 89, 73, 199, 89, 73, 69, 88, 128, 89, 73, 69, 84, 128, - 89, 73, 69, 80, 128, 89, 73, 69, 69, 128, 89, 73, 69, 128, 89, 73, 68, - 68, 73, 83, 200, 89, 73, 45, 85, 128, 89, 73, 128, 89, 72, 69, 128, 89, - 70, 69, 83, 73, 83, 128, 89, 70, 69, 83, 73, 211, 89, 70, 69, 206, 89, - 69, 89, 128, 89, 69, 87, 128, 89, 69, 85, 88, 128, 89, 69, 85, 82, 65, - 69, 128, 89, 69, 85, 81, 128, 89, 69, 85, 77, 128, 89, 69, 85, 65, 69, - 84, 128, 89, 69, 85, 65, 69, 128, 89, 69, 84, 73, 86, 128, 89, 69, 83, - 84, 85, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 83, 83, 65, 78, 71, 75, - 73, 89, 69, 79, 75, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 83, 73, 79, - 83, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 80, 65, 78, 83, 73, 79, 83, - 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 77, 73, 69, 85, 77, 128, 89, 69, - 83, 73, 69, 85, 78, 71, 45, 75, 73, 89, 69, 79, 75, 128, 89, 69, 83, 73, - 69, 85, 78, 71, 45, 75, 72, 73, 69, 85, 75, 72, 128, 89, 69, 83, 73, 69, - 85, 78, 71, 45, 72, 73, 69, 85, 72, 128, 89, 69, 83, 73, 69, 85, 78, 71, - 128, 89, 69, 82, 85, 128, 89, 69, 82, 213, 89, 69, 82, 73, 128, 89, 69, - 82, 65, 200, 89, 69, 82, 128, 89, 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, - 128, 89, 69, 79, 45, 89, 65, 128, 89, 69, 79, 45, 85, 128, 89, 69, 79, - 45, 79, 128, 89, 69, 78, 73, 83, 69, 201, 89, 69, 78, 65, 80, 128, 89, - 69, 78, 128, 89, 69, 206, 89, 69, 76, 76, 79, 87, 128, 89, 69, 76, 76, - 79, 215, 89, 69, 73, 78, 128, 89, 69, 72, 128, 89, 69, 69, 71, 128, 89, - 69, 69, 128, 89, 69, 65, 210, 89, 69, 65, 128, 89, 65, 90, 90, 128, 89, - 65, 90, 72, 128, 89, 65, 90, 128, 89, 65, 89, 68, 128, 89, 65, 89, 65, - 78, 78, 65, 128, 89, 65, 89, 128, 89, 65, 87, 78, 128, 89, 65, 87, 128, - 89, 65, 86, 128, 89, 65, 85, 128, 89, 65, 84, 84, 128, 89, 65, 84, 73, - 128, 89, 65, 84, 72, 128, 89, 65, 84, 128, 89, 65, 83, 83, 128, 89, 65, - 83, 72, 128, 89, 65, 83, 128, 89, 65, 82, 82, 128, 89, 65, 82, 78, 128, - 89, 65, 82, 128, 89, 65, 210, 89, 65, 81, 128, 89, 65, 80, 128, 89, 65, - 78, 83, 65, 89, 65, 128, 89, 65, 78, 71, 128, 89, 65, 78, 199, 89, 65, - 78, 128, 89, 65, 77, 79, 75, 128, 89, 65, 77, 65, 75, 75, 65, 78, 128, - 89, 65, 77, 128, 89, 65, 76, 128, 89, 65, 75, 72, 72, 128, 89, 65, 75, - 72, 128, 89, 65, 75, 65, 83, 72, 128, 89, 65, 75, 128, 89, 65, 74, 85, - 82, 86, 69, 68, 73, 195, 89, 65, 74, 128, 89, 65, 73, 128, 89, 65, 72, - 72, 128, 89, 65, 72, 128, 89, 65, 71, 78, 128, 89, 65, 71, 72, 72, 128, - 89, 65, 71, 72, 128, 89, 65, 71, 128, 89, 65, 70, 213, 89, 65, 70, 128, - 89, 65, 69, 77, 77, 65, 69, 128, 89, 65, 68, 72, 128, 89, 65, 68, 68, 72, - 128, 89, 65, 68, 68, 128, 89, 65, 68, 128, 89, 65, 67, 72, 128, 89, 65, - 66, 72, 128, 89, 65, 66, 128, 89, 65, 65, 82, 85, 128, 89, 65, 65, 73, - 128, 89, 65, 65, 68, 79, 128, 89, 65, 45, 89, 79, 128, 89, 65, 45, 85, - 128, 89, 65, 45, 79, 128, 89, 65, 45, 53, 128, 89, 65, 45, 52, 128, 89, - 65, 45, 51, 128, 89, 65, 45, 50, 128, 89, 65, 45, 49, 128, 89, 48, 48, - 56, 128, 89, 48, 48, 55, 128, 89, 48, 48, 54, 128, 89, 48, 48, 53, 128, - 89, 48, 48, 52, 128, 89, 48, 48, 51, 128, 89, 48, 48, 50, 128, 89, 48, - 48, 49, 65, 128, 89, 48, 48, 49, 128, 89, 45, 67, 82, 69, 197, 88, 89, - 88, 128, 88, 89, 85, 128, 88, 89, 84, 128, 88, 89, 82, 88, 128, 88, 89, - 82, 128, 88, 89, 80, 128, 88, 89, 79, 79, 74, 128, 88, 89, 79, 79, 128, - 88, 89, 79, 128, 88, 89, 73, 128, 88, 89, 69, 69, 205, 88, 89, 69, 69, - 128, 88, 89, 69, 128, 88, 89, 65, 65, 128, 88, 89, 65, 128, 88, 89, 128, - 88, 87, 73, 128, 88, 87, 69, 69, 128, 88, 87, 69, 128, 88, 87, 65, 65, - 128, 88, 87, 65, 128, 88, 87, 128, 88, 86, 69, 128, 88, 86, 65, 128, 88, - 85, 79, 88, 128, 88, 85, 79, 128, 88, 85, 128, 88, 83, 72, 65, 65, 89, - 65, 84, 72, 73, 89, 65, 128, 88, 79, 88, 128, 88, 79, 84, 128, 88, 79, - 82, 128, 88, 79, 80, 72, 128, 88, 79, 80, 128, 88, 79, 65, 128, 88, 79, - 128, 88, 73, 88, 128, 88, 73, 84, 128, 88, 73, 82, 79, 206, 88, 73, 80, - 128, 88, 73, 69, 88, 128, 88, 73, 69, 84, 128, 88, 73, 69, 80, 128, 88, - 73, 69, 128, 88, 73, 65, 78, 71, 81, 201, 88, 73, 65, 66, 128, 88, 73, - 128, 88, 71, 128, 88, 69, 89, 78, 128, 88, 69, 83, 84, 69, 211, 88, 69, - 72, 128, 88, 69, 69, 128, 88, 69, 128, 88, 65, 85, 83, 128, 88, 65, 85, - 128, 88, 65, 80, 72, 128, 88, 65, 78, 128, 88, 65, 65, 128, 88, 65, 128, - 88, 48, 48, 56, 65, 128, 88, 48, 48, 56, 128, 88, 48, 48, 55, 128, 88, - 48, 48, 54, 65, 128, 88, 48, 48, 54, 128, 88, 48, 48, 53, 128, 88, 48, - 48, 52, 66, 128, 88, 48, 48, 52, 65, 128, 88, 48, 48, 52, 128, 88, 48, - 48, 51, 128, 88, 48, 48, 50, 128, 88, 48, 48, 49, 128, 88, 45, 216, 87, - 90, 128, 87, 89, 78, 78, 128, 87, 89, 78, 206, 87, 86, 73, 128, 87, 86, - 69, 128, 87, 86, 65, 128, 87, 86, 128, 87, 85, 80, 128, 87, 85, 79, 88, - 128, 87, 85, 79, 80, 128, 87, 85, 79, 128, 87, 85, 78, 74, 207, 87, 85, - 78, 128, 87, 85, 76, 85, 128, 87, 85, 76, 213, 87, 85, 73, 128, 87, 85, - 69, 128, 87, 85, 65, 69, 84, 128, 87, 85, 65, 69, 78, 128, 87, 85, 128, - 87, 82, 217, 87, 82, 79, 78, 71, 128, 87, 82, 73, 83, 212, 87, 82, 73, - 78, 75, 76, 69, 83, 128, 87, 82, 73, 78, 75, 76, 69, 211, 87, 82, 73, 78, - 75, 76, 69, 68, 128, 87, 82, 69, 83, 84, 76, 69, 82, 83, 128, 87, 82, 69, - 78, 67, 72, 128, 87, 82, 69, 65, 84, 200, 87, 82, 65, 80, 80, 69, 196, - 87, 82, 65, 80, 128, 87, 79, 88, 128, 87, 79, 87, 128, 87, 79, 82, 83, - 72, 73, 80, 128, 87, 79, 82, 82, 73, 69, 196, 87, 79, 82, 76, 196, 87, - 79, 82, 75, 69, 82, 128, 87, 79, 82, 75, 128, 87, 79, 82, 203, 87, 79, - 82, 68, 83, 80, 65, 67, 69, 128, 87, 79, 82, 196, 87, 79, 80, 128, 87, - 79, 79, 78, 128, 87, 79, 79, 76, 128, 87, 79, 79, 68, 83, 45, 67, 82, 69, - 197, 87, 79, 79, 68, 128, 87, 79, 78, 128, 87, 79, 206, 87, 79, 77, 69, - 78, 211, 87, 79, 77, 69, 206, 87, 79, 77, 65, 78, 211, 87, 79, 77, 65, - 78, 128, 87, 79, 77, 65, 206, 87, 79, 76, 79, 83, 79, 128, 87, 79, 76, - 198, 87, 79, 69, 128, 87, 79, 65, 128, 87, 79, 45, 55, 128, 87, 79, 45, - 54, 128, 87, 79, 45, 53, 128, 87, 79, 45, 52, 128, 87, 79, 45, 51, 128, - 87, 79, 45, 50, 128, 87, 79, 45, 49, 128, 87, 73, 84, 72, 79, 85, 212, - 87, 73, 84, 72, 73, 78, 128, 87, 73, 84, 72, 73, 206, 87, 73, 82, 69, - 196, 87, 73, 78, 84, 69, 82, 128, 87, 73, 78, 75, 73, 78, 199, 87, 73, - 78, 75, 128, 87, 73, 78, 74, 65, 128, 87, 73, 78, 71, 83, 128, 87, 73, - 78, 69, 128, 87, 73, 78, 197, 87, 73, 78, 68, 85, 128, 87, 73, 78, 68, - 79, 87, 128, 87, 73, 78, 68, 128, 87, 73, 78, 196, 87, 73, 78, 128, 87, - 73, 76, 84, 69, 196, 87, 73, 71, 78, 89, 65, 78, 128, 87, 73, 71, 71, 76, - 217, 87, 73, 71, 71, 76, 69, 83, 128, 87, 73, 68, 84, 72, 128, 87, 73, - 68, 69, 78, 73, 78, 199, 87, 73, 68, 69, 45, 72, 69, 65, 68, 69, 196, 87, - 73, 68, 197, 87, 73, 65, 78, 71, 87, 65, 65, 75, 128, 87, 73, 65, 78, 71, - 128, 87, 73, 45, 53, 128, 87, 73, 45, 52, 128, 87, 73, 45, 51, 128, 87, - 73, 45, 50, 128, 87, 73, 45, 49, 128, 87, 72, 79, 76, 197, 87, 72, 73, - 84, 69, 45, 70, 69, 65, 84, 72, 69, 82, 69, 196, 87, 72, 73, 84, 69, 128, - 87, 72, 69, 69, 76, 69, 196, 87, 72, 69, 69, 76, 67, 72, 65, 73, 210, 87, - 72, 69, 69, 76, 128, 87, 72, 69, 69, 204, 87, 72, 69, 65, 84, 128, 87, - 72, 65, 76, 69, 128, 87, 72, 128, 87, 71, 128, 87, 69, 88, 128, 87, 69, - 85, 88, 128, 87, 69, 83, 84, 69, 82, 206, 87, 69, 83, 84, 45, 67, 82, 69, - 197, 87, 69, 83, 84, 128, 87, 69, 83, 212, 87, 69, 80, 128, 87, 69, 79, - 128, 87, 69, 78, 128, 87, 69, 76, 76, 128, 87, 69, 73, 71, 72, 212, 87, - 69, 73, 69, 82, 83, 84, 82, 65, 83, 211, 87, 69, 73, 128, 87, 69, 69, 78, - 128, 87, 69, 68, 71, 69, 45, 84, 65, 73, 76, 69, 196, 87, 69, 68, 71, 69, - 128, 87, 69, 68, 68, 73, 78, 71, 128, 87, 69, 66, 128, 87, 69, 65, 82, - 217, 87, 69, 65, 80, 79, 78, 128, 87, 69, 45, 52, 128, 87, 69, 45, 51, - 128, 87, 69, 45, 50, 128, 87, 69, 45, 49, 128, 87, 67, 128, 87, 66, 128, - 87, 65, 89, 128, 87, 65, 217, 87, 65, 88, 73, 78, 199, 87, 65, 88, 128, - 87, 65, 87, 45, 65, 89, 73, 78, 45, 82, 69, 83, 72, 128, 87, 65, 87, 128, - 87, 65, 215, 87, 65, 86, 217, 87, 65, 86, 73, 78, 199, 87, 65, 86, 69, - 83, 128, 87, 65, 86, 69, 128, 87, 65, 86, 197, 87, 65, 85, 128, 87, 65, - 84, 84, 79, 128, 87, 65, 84, 69, 82, 77, 69, 76, 79, 78, 128, 87, 65, 84, - 69, 82, 128, 87, 65, 84, 69, 210, 87, 65, 84, 67, 72, 128, 87, 65, 84, - 128, 87, 65, 83, 84, 73, 78, 71, 128, 87, 65, 83, 84, 69, 66, 65, 83, 75, - 69, 84, 128, 87, 65, 83, 83, 65, 76, 76, 65, 77, 128, 87, 65, 83, 76, 65, - 128, 87, 65, 83, 76, 193, 87, 65, 83, 65, 76, 76, 65, 77, 128, 87, 65, - 83, 65, 76, 76, 65, 205, 87, 65, 82, 78, 73, 78, 199, 87, 65, 82, 65, 78, - 199, 87, 65, 81, 70, 65, 128, 87, 65, 80, 128, 87, 65, 78, 73, 78, 199, - 87, 65, 78, 71, 75, 85, 79, 81, 128, 87, 65, 78, 68, 69, 82, 69, 82, 128, - 87, 65, 78, 128, 87, 65, 76, 76, 80, 76, 65, 78, 197, 87, 65, 76, 76, - 128, 87, 65, 76, 204, 87, 65, 76, 75, 128, 87, 65, 76, 203, 87, 65, 73, - 84, 73, 78, 71, 128, 87, 65, 73, 83, 84, 128, 87, 65, 73, 128, 87, 65, - 69, 78, 128, 87, 65, 69, 128, 87, 65, 68, 68, 65, 128, 87, 65, 65, 86, - 85, 128, 87, 65, 45, 53, 128, 87, 65, 45, 52, 128, 87, 65, 45, 51, 128, - 87, 65, 45, 50, 128, 87, 65, 45, 49, 128, 87, 48, 50, 53, 128, 87, 48, - 50, 52, 65, 128, 87, 48, 50, 52, 128, 87, 48, 50, 51, 128, 87, 48, 50, - 50, 128, 87, 48, 50, 49, 128, 87, 48, 50, 48, 128, 87, 48, 49, 57, 128, - 87, 48, 49, 56, 65, 128, 87, 48, 49, 56, 128, 87, 48, 49, 55, 65, 128, - 87, 48, 49, 55, 128, 87, 48, 49, 54, 128, 87, 48, 49, 53, 128, 87, 48, - 49, 52, 65, 128, 87, 48, 49, 52, 128, 87, 48, 49, 51, 128, 87, 48, 49, - 50, 128, 87, 48, 49, 49, 128, 87, 48, 49, 48, 65, 128, 87, 48, 49, 48, - 128, 87, 48, 48, 57, 65, 128, 87, 48, 48, 57, 128, 87, 48, 48, 56, 128, - 87, 48, 48, 55, 128, 87, 48, 48, 54, 128, 87, 48, 48, 53, 128, 87, 48, - 48, 52, 128, 87, 48, 48, 51, 65, 128, 87, 48, 48, 51, 128, 87, 48, 48, - 50, 128, 87, 48, 48, 49, 128, 86, 90, 77, 69, 84, 128, 86, 89, 88, 128, - 86, 89, 84, 128, 86, 89, 82, 88, 128, 86, 89, 82, 128, 86, 89, 80, 128, - 86, 89, 128, 86, 87, 74, 128, 86, 87, 65, 128, 86, 85, 88, 128, 86, 85, - 85, 128, 86, 85, 84, 128, 86, 85, 82, 88, 128, 86, 85, 82, 128, 86, 85, - 80, 128, 86, 85, 76, 71, 65, 210, 86, 85, 76, 67, 65, 78, 85, 83, 128, - 86, 85, 69, 81, 128, 86, 84, 83, 128, 86, 84, 128, 86, 83, 57, 57, 128, - 86, 83, 57, 56, 128, 86, 83, 57, 55, 128, 86, 83, 57, 54, 128, 86, 83, - 57, 53, 128, 86, 83, 57, 52, 128, 86, 83, 57, 51, 128, 86, 83, 57, 50, - 128, 86, 83, 57, 49, 128, 86, 83, 57, 48, 128, 86, 83, 57, 128, 86, 83, - 56, 57, 128, 86, 83, 56, 56, 128, 86, 83, 56, 55, 128, 86, 83, 56, 54, - 128, 86, 83, 56, 53, 128, 86, 83, 56, 52, 128, 86, 83, 56, 51, 128, 86, - 83, 56, 50, 128, 86, 83, 56, 49, 128, 86, 83, 56, 48, 128, 86, 83, 56, - 128, 86, 83, 55, 57, 128, 86, 83, 55, 56, 128, 86, 83, 55, 55, 128, 86, - 83, 55, 54, 128, 86, 83, 55, 53, 128, 86, 83, 55, 52, 128, 86, 83, 55, - 51, 128, 86, 83, 55, 50, 128, 86, 83, 55, 49, 128, 86, 83, 55, 48, 128, - 86, 83, 55, 128, 86, 83, 54, 57, 128, 86, 83, 54, 56, 128, 86, 83, 54, - 55, 128, 86, 83, 54, 54, 128, 86, 83, 54, 53, 128, 86, 83, 54, 52, 128, - 86, 83, 54, 51, 128, 86, 83, 54, 50, 128, 86, 83, 54, 49, 128, 86, 83, - 54, 48, 128, 86, 83, 54, 128, 86, 83, 53, 57, 128, 86, 83, 53, 56, 128, - 86, 83, 53, 55, 128, 86, 83, 53, 54, 128, 86, 83, 53, 53, 128, 86, 83, - 53, 52, 128, 86, 83, 53, 51, 128, 86, 83, 53, 50, 128, 86, 83, 53, 49, - 128, 86, 83, 53, 48, 128, 86, 83, 53, 128, 86, 83, 52, 57, 128, 86, 83, - 52, 56, 128, 86, 83, 52, 55, 128, 86, 83, 52, 54, 128, 86, 83, 52, 53, - 128, 86, 83, 52, 52, 128, 86, 83, 52, 51, 128, 86, 83, 52, 50, 128, 86, - 83, 52, 49, 128, 86, 83, 52, 48, 128, 86, 83, 52, 128, 86, 83, 51, 57, - 128, 86, 83, 51, 56, 128, 86, 83, 51, 55, 128, 86, 83, 51, 54, 128, 86, - 83, 51, 53, 128, 86, 83, 51, 52, 128, 86, 83, 51, 51, 128, 86, 83, 51, - 50, 128, 86, 83, 51, 49, 128, 86, 83, 51, 48, 128, 86, 83, 51, 128, 86, - 83, 50, 57, 128, 86, 83, 50, 56, 128, 86, 83, 50, 55, 128, 86, 83, 50, - 54, 128, 86, 83, 50, 53, 54, 128, 86, 83, 50, 53, 53, 128, 86, 83, 50, - 53, 52, 128, 86, 83, 50, 53, 51, 128, 86, 83, 50, 53, 50, 128, 86, 83, - 50, 53, 49, 128, 86, 83, 50, 53, 48, 128, 86, 83, 50, 53, 128, 86, 83, - 50, 52, 57, 128, 86, 83, 50, 52, 56, 128, 86, 83, 50, 52, 55, 128, 86, - 83, 50, 52, 54, 128, 86, 83, 50, 52, 53, 128, 86, 83, 50, 52, 52, 128, - 86, 83, 50, 52, 51, 128, 86, 83, 50, 52, 50, 128, 86, 83, 50, 52, 49, - 128, 86, 83, 50, 52, 48, 128, 86, 83, 50, 52, 128, 86, 83, 50, 51, 57, - 128, 86, 83, 50, 51, 56, 128, 86, 83, 50, 51, 55, 128, 86, 83, 50, 51, - 54, 128, 86, 83, 50, 51, 53, 128, 86, 83, 50, 51, 52, 128, 86, 83, 50, - 51, 51, 128, 86, 83, 50, 51, 50, 128, 86, 83, 50, 51, 49, 128, 86, 83, - 50, 51, 48, 128, 86, 83, 50, 51, 128, 86, 83, 50, 50, 57, 128, 86, 83, - 50, 50, 56, 128, 86, 83, 50, 50, 55, 128, 86, 83, 50, 50, 54, 128, 86, - 83, 50, 50, 53, 128, 86, 83, 50, 50, 52, 128, 86, 83, 50, 50, 51, 128, - 86, 83, 50, 50, 50, 128, 86, 83, 50, 50, 49, 128, 86, 83, 50, 50, 48, - 128, 86, 83, 50, 50, 128, 86, 83, 50, 49, 57, 128, 86, 83, 50, 49, 56, - 128, 86, 83, 50, 49, 55, 128, 86, 83, 50, 49, 54, 128, 86, 83, 50, 49, - 53, 128, 86, 83, 50, 49, 52, 128, 86, 83, 50, 49, 51, 128, 86, 83, 50, - 49, 50, 128, 86, 83, 50, 49, 49, 128, 86, 83, 50, 49, 48, 128, 86, 83, - 50, 49, 128, 86, 83, 50, 48, 57, 128, 86, 83, 50, 48, 56, 128, 86, 83, - 50, 48, 55, 128, 86, 83, 50, 48, 54, 128, 86, 83, 50, 48, 53, 128, 86, - 83, 50, 48, 52, 128, 86, 83, 50, 48, 51, 128, 86, 83, 50, 48, 50, 128, - 86, 83, 50, 48, 49, 128, 86, 83, 50, 48, 48, 128, 86, 83, 50, 48, 128, - 86, 83, 50, 128, 86, 83, 49, 57, 57, 128, 86, 83, 49, 57, 56, 128, 86, - 83, 49, 57, 55, 128, 86, 83, 49, 57, 54, 128, 86, 83, 49, 57, 53, 128, - 86, 83, 49, 57, 52, 128, 86, 83, 49, 57, 51, 128, 86, 83, 49, 57, 50, - 128, 86, 83, 49, 57, 49, 128, 86, 83, 49, 57, 48, 128, 86, 83, 49, 57, - 128, 86, 83, 49, 56, 57, 128, 86, 83, 49, 56, 56, 128, 86, 83, 49, 56, - 55, 128, 86, 83, 49, 56, 54, 128, 86, 83, 49, 56, 53, 128, 86, 83, 49, - 56, 52, 128, 86, 83, 49, 56, 51, 128, 86, 83, 49, 56, 50, 128, 86, 83, - 49, 56, 49, 128, 86, 83, 49, 56, 48, 128, 86, 83, 49, 56, 128, 86, 83, - 49, 55, 57, 128, 86, 83, 49, 55, 56, 128, 86, 83, 49, 55, 55, 128, 86, - 83, 49, 55, 54, 128, 86, 83, 49, 55, 53, 128, 86, 83, 49, 55, 52, 128, - 86, 83, 49, 55, 51, 128, 86, 83, 49, 55, 50, 128, 86, 83, 49, 55, 49, - 128, 86, 83, 49, 55, 48, 128, 86, 83, 49, 55, 128, 86, 83, 49, 54, 57, - 128, 86, 83, 49, 54, 56, 128, 86, 83, 49, 54, 55, 128, 86, 83, 49, 54, - 54, 128, 86, 83, 49, 54, 53, 128, 86, 83, 49, 54, 52, 128, 86, 83, 49, - 54, 51, 128, 86, 83, 49, 54, 50, 128, 86, 83, 49, 54, 49, 128, 86, 83, - 49, 54, 48, 128, 86, 83, 49, 54, 128, 86, 83, 49, 53, 57, 128, 86, 83, - 49, 53, 56, 128, 86, 83, 49, 53, 55, 128, 86, 83, 49, 53, 54, 128, 86, - 83, 49, 53, 53, 128, 86, 83, 49, 53, 52, 128, 86, 83, 49, 53, 51, 128, - 86, 83, 49, 53, 50, 128, 86, 83, 49, 53, 49, 128, 86, 83, 49, 53, 48, - 128, 86, 83, 49, 53, 128, 86, 83, 49, 52, 57, 128, 86, 83, 49, 52, 56, - 128, 86, 83, 49, 52, 55, 128, 86, 83, 49, 52, 54, 128, 86, 83, 49, 52, - 53, 128, 86, 83, 49, 52, 52, 128, 86, 83, 49, 52, 51, 128, 86, 83, 49, - 52, 50, 128, 86, 83, 49, 52, 49, 128, 86, 83, 49, 52, 48, 128, 86, 83, - 49, 52, 128, 86, 83, 49, 51, 57, 128, 86, 83, 49, 51, 56, 128, 86, 83, - 49, 51, 55, 128, 86, 83, 49, 51, 54, 128, 86, 83, 49, 51, 53, 128, 86, - 83, 49, 51, 52, 128, 86, 83, 49, 51, 51, 128, 86, 83, 49, 51, 50, 128, - 86, 83, 49, 51, 49, 128, 86, 83, 49, 51, 48, 128, 86, 83, 49, 51, 128, - 86, 83, 49, 50, 57, 128, 86, 83, 49, 50, 56, 128, 86, 83, 49, 50, 55, - 128, 86, 83, 49, 50, 54, 128, 86, 83, 49, 50, 53, 128, 86, 83, 49, 50, - 52, 128, 86, 83, 49, 50, 51, 128, 86, 83, 49, 50, 50, 128, 86, 83, 49, - 50, 49, 128, 86, 83, 49, 50, 48, 128, 86, 83, 49, 50, 128, 86, 83, 49, - 49, 57, 128, 86, 83, 49, 49, 56, 128, 86, 83, 49, 49, 55, 128, 86, 83, - 49, 49, 54, 128, 86, 83, 49, 49, 53, 128, 86, 83, 49, 49, 52, 128, 86, - 83, 49, 49, 51, 128, 86, 83, 49, 49, 50, 128, 86, 83, 49, 49, 49, 128, - 86, 83, 49, 49, 48, 128, 86, 83, 49, 49, 128, 86, 83, 49, 48, 57, 128, - 86, 83, 49, 48, 56, 128, 86, 83, 49, 48, 55, 128, 86, 83, 49, 48, 54, - 128, 86, 83, 49, 48, 53, 128, 86, 83, 49, 48, 52, 128, 86, 83, 49, 48, - 51, 128, 86, 83, 49, 48, 50, 128, 86, 83, 49, 48, 49, 128, 86, 83, 49, - 48, 48, 128, 86, 83, 49, 48, 128, 86, 83, 49, 128, 86, 83, 128, 86, 82, - 65, 67, 72, 89, 128, 86, 79, 88, 128, 86, 79, 87, 69, 76, 45, 67, 65, 82, - 82, 73, 69, 210, 86, 79, 87, 128, 86, 79, 85, 128, 86, 79, 84, 128, 86, - 79, 211, 86, 79, 80, 128, 86, 79, 79, 73, 128, 86, 79, 79, 128, 86, 79, - 77, 73, 84, 73, 78, 71, 128, 86, 79, 77, 128, 86, 79, 76, 85, 77, 197, - 86, 79, 76, 84, 65, 71, 197, 86, 79, 76, 76, 69, 89, 66, 65, 76, 76, 128, - 86, 79, 76, 67, 65, 78, 79, 128, 86, 79, 76, 65, 80, 85, 203, 86, 79, 73, - 196, 86, 79, 73, 67, 73, 78, 71, 128, 86, 79, 73, 67, 69, 76, 69, 83, - 211, 86, 79, 73, 67, 69, 196, 86, 79, 68, 128, 86, 79, 67, 65, 76, 73, - 90, 65, 84, 73, 79, 206, 86, 79, 67, 65, 204, 86, 79, 128, 86, 73, 89, - 79, 128, 86, 73, 88, 128, 86, 73, 84, 82, 73, 79, 76, 45, 50, 128, 86, - 73, 84, 82, 73, 79, 76, 128, 86, 73, 84, 65, 69, 45, 50, 128, 86, 73, 84, - 65, 69, 128, 86, 73, 84, 128, 86, 73, 83, 73, 71, 79, 84, 72, 73, 195, - 86, 73, 83, 65, 82, 71, 65, 89, 65, 128, 86, 73, 83, 65, 82, 71, 65, 128, - 86, 73, 83, 65, 82, 71, 193, 86, 73, 82, 73, 65, 77, 128, 86, 73, 82, 71, - 79, 128, 86, 73, 82, 71, 65, 128, 86, 73, 82, 65, 77, 65, 128, 86, 73, - 80, 128, 86, 73, 79, 76, 73, 78, 128, 86, 73, 78, 69, 71, 65, 82, 45, 51, - 128, 86, 73, 78, 69, 71, 65, 82, 45, 50, 128, 86, 73, 78, 69, 71, 65, 82, - 128, 86, 73, 78, 69, 71, 65, 210, 86, 73, 78, 69, 128, 86, 73, 78, 197, - 86, 73, 78, 128, 86, 73, 76, 76, 65, 71, 69, 128, 86, 73, 73, 128, 86, - 73, 71, 73, 78, 84, 73, 76, 69, 128, 86, 73, 69, 88, 128, 86, 73, 69, 87, - 73, 78, 199, 86, 73, 69, 87, 68, 65, 84, 193, 86, 73, 69, 84, 128, 86, - 73, 69, 212, 86, 73, 69, 80, 128, 86, 73, 69, 128, 86, 73, 68, 74, 45, - 50, 128, 86, 73, 68, 74, 128, 86, 73, 68, 69, 79, 67, 65, 83, 83, 69, 84, - 84, 69, 128, 86, 73, 68, 69, 207, 86, 73, 68, 65, 128, 86, 73, 67, 84, - 79, 82, 217, 86, 73, 66, 82, 65, 84, 73, 79, 206, 86, 72, 65, 128, 86, - 70, 65, 128, 86, 69, 89, 90, 128, 86, 69, 88, 128, 86, 69, 87, 128, 86, - 69, 215, 86, 69, 85, 88, 128, 86, 69, 85, 77, 128, 86, 69, 85, 65, 69, - 80, 69, 78, 128, 86, 69, 85, 65, 69, 128, 86, 69, 83, 84, 65, 128, 86, + 89, 73, 73, 128, 89, 73, 72, 128, 89, 73, 199, 89, 73, 69, 88, 128, 89, + 73, 69, 84, 128, 89, 73, 69, 80, 128, 89, 73, 69, 69, 128, 89, 73, 69, + 128, 89, 73, 68, 68, 73, 83, 200, 89, 73, 45, 85, 128, 89, 73, 128, 89, + 72, 69, 128, 89, 70, 69, 83, 73, 83, 128, 89, 70, 69, 83, 73, 211, 89, + 70, 69, 206, 89, 69, 89, 128, 89, 69, 87, 128, 89, 69, 85, 88, 128, 89, + 69, 85, 82, 65, 69, 128, 89, 69, 85, 81, 128, 89, 69, 85, 77, 128, 89, + 69, 85, 65, 69, 84, 128, 89, 69, 85, 65, 69, 128, 89, 69, 84, 73, 86, + 128, 89, 69, 83, 84, 85, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 83, 83, + 65, 78, 71, 75, 73, 89, 69, 79, 75, 128, 89, 69, 83, 73, 69, 85, 78, 71, + 45, 83, 73, 79, 83, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 80, 65, 78, + 83, 73, 79, 83, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 77, 73, 69, 85, + 77, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 75, 73, 89, 69, 79, 75, 128, + 89, 69, 83, 73, 69, 85, 78, 71, 45, 75, 72, 73, 69, 85, 75, 72, 128, 89, + 69, 83, 73, 69, 85, 78, 71, 45, 72, 73, 69, 85, 72, 128, 89, 69, 83, 73, + 69, 85, 78, 71, 128, 89, 69, 82, 85, 128, 89, 69, 82, 213, 89, 69, 82, + 73, 128, 89, 69, 82, 65, 200, 89, 69, 82, 128, 89, 69, 79, 82, 73, 78, + 72, 73, 69, 85, 72, 128, 89, 69, 79, 45, 89, 65, 128, 89, 69, 79, 45, 85, + 128, 89, 69, 79, 45, 79, 128, 89, 69, 78, 73, 83, 69, 201, 89, 69, 78, + 65, 80, 128, 89, 69, 78, 128, 89, 69, 206, 89, 69, 76, 76, 79, 87, 128, + 89, 69, 76, 76, 79, 215, 89, 69, 73, 78, 128, 89, 69, 72, 128, 89, 69, + 69, 71, 128, 89, 69, 69, 128, 89, 69, 65, 210, 89, 69, 65, 128, 89, 65, + 90, 90, 128, 89, 65, 90, 72, 128, 89, 65, 90, 128, 89, 65, 89, 68, 128, + 89, 65, 89, 65, 78, 78, 65, 128, 89, 65, 89, 128, 89, 65, 87, 78, 73, 78, + 199, 89, 65, 87, 78, 128, 89, 65, 87, 128, 89, 65, 86, 128, 89, 65, 85, + 128, 89, 65, 84, 84, 128, 89, 65, 84, 73, 128, 89, 65, 84, 72, 128, 89, + 65, 84, 128, 89, 65, 83, 83, 128, 89, 65, 83, 72, 128, 89, 65, 83, 128, + 89, 65, 82, 82, 128, 89, 65, 82, 78, 128, 89, 65, 82, 128, 89, 65, 210, + 89, 65, 81, 128, 89, 65, 80, 128, 89, 65, 78, 83, 65, 89, 65, 128, 89, + 65, 78, 71, 128, 89, 65, 78, 199, 89, 65, 78, 128, 89, 65, 77, 79, 75, + 128, 89, 65, 77, 65, 75, 75, 65, 78, 128, 89, 65, 77, 128, 89, 65, 76, + 128, 89, 65, 75, 72, 72, 128, 89, 65, 75, 72, 128, 89, 65, 75, 65, 83, + 72, 128, 89, 65, 75, 128, 89, 65, 74, 85, 82, 86, 69, 68, 73, 195, 89, + 65, 74, 128, 89, 65, 73, 128, 89, 65, 72, 72, 128, 89, 65, 72, 128, 89, + 65, 71, 78, 128, 89, 65, 71, 72, 72, 128, 89, 65, 71, 72, 128, 89, 65, + 71, 128, 89, 65, 70, 213, 89, 65, 70, 128, 89, 65, 69, 77, 77, 65, 69, + 128, 89, 65, 68, 72, 128, 89, 65, 68, 68, 72, 128, 89, 65, 68, 68, 128, + 89, 65, 68, 128, 89, 65, 67, 72, 128, 89, 65, 66, 72, 128, 89, 65, 66, + 128, 89, 65, 65, 82, 85, 128, 89, 65, 65, 73, 128, 89, 65, 65, 68, 79, + 128, 89, 65, 45, 89, 79, 128, 89, 65, 45, 85, 128, 89, 65, 45, 79, 128, + 89, 65, 45, 53, 128, 89, 65, 45, 52, 128, 89, 65, 45, 51, 128, 89, 65, + 45, 50, 128, 89, 65, 45, 49, 128, 89, 48, 48, 56, 128, 89, 48, 48, 55, + 128, 89, 48, 48, 54, 128, 89, 48, 48, 53, 128, 89, 48, 48, 52, 128, 89, + 48, 48, 51, 128, 89, 48, 48, 50, 128, 89, 48, 48, 49, 65, 128, 89, 48, + 48, 49, 128, 89, 45, 67, 82, 69, 197, 88, 89, 88, 128, 88, 89, 85, 128, + 88, 89, 84, 128, 88, 89, 82, 88, 128, 88, 89, 82, 128, 88, 89, 80, 128, + 88, 89, 79, 79, 74, 128, 88, 89, 79, 79, 128, 88, 89, 79, 128, 88, 89, + 73, 128, 88, 89, 69, 69, 205, 88, 89, 69, 69, 128, 88, 89, 69, 128, 88, + 89, 65, 65, 128, 88, 89, 65, 128, 88, 89, 128, 88, 87, 73, 128, 88, 87, + 69, 69, 128, 88, 87, 69, 128, 88, 87, 65, 65, 128, 88, 87, 65, 128, 88, + 87, 128, 88, 215, 88, 86, 69, 128, 88, 86, 65, 128, 88, 85, 79, 88, 128, + 88, 85, 79, 128, 88, 85, 128, 88, 83, 72, 65, 65, 89, 65, 84, 72, 73, 89, + 65, 128, 88, 79, 88, 128, 88, 79, 84, 128, 88, 79, 82, 128, 88, 79, 80, + 72, 128, 88, 79, 80, 128, 88, 79, 65, 128, 88, 79, 128, 88, 73, 88, 128, + 88, 73, 84, 128, 88, 73, 82, 79, 206, 88, 73, 80, 128, 88, 73, 69, 88, + 128, 88, 73, 69, 84, 128, 88, 73, 69, 80, 128, 88, 73, 69, 128, 88, 73, + 65, 78, 71, 81, 201, 88, 73, 65, 66, 128, 88, 73, 128, 88, 71, 128, 88, + 69, 89, 78, 128, 88, 69, 83, 84, 69, 211, 88, 69, 72, 128, 88, 69, 69, + 128, 88, 69, 128, 88, 65, 85, 83, 128, 88, 65, 85, 128, 88, 65, 80, 72, + 128, 88, 65, 78, 128, 88, 65, 65, 128, 88, 65, 128, 88, 48, 48, 56, 65, + 128, 88, 48, 48, 56, 128, 88, 48, 48, 55, 128, 88, 48, 48, 54, 65, 128, + 88, 48, 48, 54, 128, 88, 48, 48, 53, 128, 88, 48, 48, 52, 66, 128, 88, + 48, 48, 52, 65, 128, 88, 48, 48, 52, 128, 88, 48, 48, 51, 128, 88, 48, + 48, 50, 128, 88, 48, 48, 49, 128, 88, 45, 216, 87, 90, 128, 87, 89, 78, + 78, 128, 87, 89, 78, 206, 87, 86, 73, 128, 87, 86, 69, 128, 87, 86, 65, + 128, 87, 86, 128, 87, 85, 80, 128, 87, 85, 79, 88, 128, 87, 85, 79, 80, + 128, 87, 85, 79, 128, 87, 85, 78, 74, 207, 87, 85, 78, 128, 87, 85, 76, + 85, 128, 87, 85, 76, 213, 87, 85, 73, 128, 87, 85, 69, 128, 87, 85, 65, + 69, 84, 128, 87, 85, 65, 69, 78, 128, 87, 85, 128, 87, 82, 217, 87, 82, + 79, 78, 71, 128, 87, 82, 73, 83, 212, 87, 82, 73, 78, 75, 76, 69, 83, + 128, 87, 82, 73, 78, 75, 76, 69, 211, 87, 82, 73, 78, 75, 76, 69, 68, + 128, 87, 82, 69, 83, 84, 76, 69, 82, 83, 128, 87, 82, 69, 78, 67, 72, + 128, 87, 82, 69, 65, 84, 200, 87, 82, 65, 80, 80, 69, 196, 87, 82, 65, + 80, 128, 87, 79, 88, 128, 87, 79, 87, 128, 87, 79, 82, 83, 72, 73, 80, + 128, 87, 79, 82, 82, 73, 69, 196, 87, 79, 82, 76, 196, 87, 79, 82, 75, + 69, 82, 128, 87, 79, 82, 75, 128, 87, 79, 82, 203, 87, 79, 82, 68, 83, + 80, 65, 67, 69, 128, 87, 79, 82, 196, 87, 79, 80, 128, 87, 79, 79, 78, + 128, 87, 79, 79, 76, 128, 87, 79, 79, 68, 83, 45, 67, 82, 69, 197, 87, + 79, 79, 68, 128, 87, 79, 78, 128, 87, 79, 206, 87, 79, 77, 69, 78, 211, + 87, 79, 77, 69, 206, 87, 79, 77, 65, 78, 211, 87, 79, 77, 65, 78, 128, + 87, 79, 77, 65, 206, 87, 79, 76, 79, 83, 79, 128, 87, 79, 76, 198, 87, + 79, 69, 128, 87, 79, 65, 128, 87, 79, 45, 55, 128, 87, 79, 45, 54, 128, + 87, 79, 45, 53, 128, 87, 79, 45, 52, 128, 87, 79, 45, 51, 128, 87, 79, + 45, 50, 128, 87, 79, 45, 49, 128, 87, 73, 84, 72, 79, 85, 212, 87, 73, + 84, 72, 73, 78, 128, 87, 73, 84, 72, 73, 206, 87, 73, 82, 69, 196, 87, + 73, 78, 84, 69, 82, 128, 87, 73, 78, 75, 73, 78, 199, 87, 73, 78, 75, + 128, 87, 73, 78, 74, 65, 128, 87, 73, 78, 71, 83, 128, 87, 73, 78, 69, + 128, 87, 73, 78, 197, 87, 73, 78, 68, 85, 128, 87, 73, 78, 68, 79, 87, + 128, 87, 73, 78, 68, 128, 87, 73, 78, 196, 87, 73, 78, 128, 87, 73, 76, + 84, 69, 196, 87, 73, 71, 78, 89, 65, 78, 128, 87, 73, 71, 71, 76, 217, + 87, 73, 71, 71, 76, 69, 83, 128, 87, 73, 68, 84, 72, 128, 87, 73, 68, 69, + 78, 73, 78, 199, 87, 73, 68, 69, 45, 72, 69, 65, 68, 69, 196, 87, 73, 68, + 197, 87, 73, 65, 78, 71, 87, 65, 65, 75, 128, 87, 73, 65, 78, 71, 128, + 87, 73, 45, 53, 128, 87, 73, 45, 52, 128, 87, 73, 45, 51, 128, 87, 73, + 45, 50, 128, 87, 73, 45, 49, 128, 87, 72, 79, 76, 197, 87, 72, 73, 84, + 69, 45, 70, 69, 65, 84, 72, 69, 82, 69, 196, 87, 72, 73, 84, 69, 128, 87, + 72, 69, 69, 76, 69, 196, 87, 72, 69, 69, 76, 67, 72, 65, 73, 82, 128, 87, + 72, 69, 69, 76, 67, 72, 65, 73, 210, 87, 72, 69, 69, 76, 128, 87, 72, 69, + 69, 204, 87, 72, 69, 65, 84, 128, 87, 72, 65, 76, 69, 128, 87, 72, 128, + 87, 71, 128, 87, 69, 88, 128, 87, 69, 85, 88, 128, 87, 69, 212, 87, 69, + 83, 84, 69, 82, 206, 87, 69, 83, 84, 45, 67, 82, 69, 197, 87, 69, 83, 84, + 128, 87, 69, 83, 212, 87, 69, 80, 128, 87, 69, 79, 128, 87, 69, 78, 128, + 87, 69, 76, 76, 128, 87, 69, 73, 71, 72, 212, 87, 69, 73, 69, 82, 83, 84, + 82, 65, 83, 211, 87, 69, 73, 128, 87, 69, 69, 78, 128, 87, 69, 68, 71, + 69, 45, 84, 65, 73, 76, 69, 196, 87, 69, 68, 71, 69, 128, 87, 69, 68, 68, + 73, 78, 71, 128, 87, 69, 66, 128, 87, 69, 65, 82, 217, 87, 69, 65, 80, + 79, 78, 128, 87, 69, 45, 52, 128, 87, 69, 45, 51, 128, 87, 69, 45, 50, + 128, 87, 69, 45, 49, 128, 87, 67, 128, 87, 66, 128, 87, 65, 89, 128, 87, + 65, 217, 87, 65, 88, 73, 78, 199, 87, 65, 88, 128, 87, 65, 87, 45, 65, + 89, 73, 78, 45, 82, 69, 83, 72, 128, 87, 65, 87, 128, 87, 65, 215, 87, + 65, 86, 217, 87, 65, 86, 73, 78, 199, 87, 65, 86, 69, 83, 128, 87, 65, + 86, 69, 128, 87, 65, 86, 197, 87, 65, 85, 128, 87, 65, 84, 84, 79, 128, + 87, 65, 84, 69, 82, 77, 69, 76, 79, 78, 128, 87, 65, 84, 69, 82, 128, 87, + 65, 84, 69, 210, 87, 65, 84, 67, 72, 128, 87, 65, 84, 128, 87, 65, 83, + 84, 73, 78, 71, 128, 87, 65, 83, 84, 69, 66, 65, 83, 75, 69, 84, 128, 87, + 65, 83, 83, 65, 76, 76, 65, 77, 128, 87, 65, 83, 76, 65, 128, 87, 65, 83, + 76, 193, 87, 65, 83, 65, 76, 76, 65, 77, 128, 87, 65, 83, 65, 76, 76, 65, + 205, 87, 65, 82, 78, 73, 78, 199, 87, 65, 82, 65, 78, 199, 87, 65, 81, + 70, 65, 128, 87, 65, 80, 128, 87, 65, 78, 73, 78, 199, 87, 65, 78, 71, + 75, 85, 79, 81, 128, 87, 65, 78, 68, 69, 82, 69, 82, 128, 87, 65, 78, 67, + 72, 207, 87, 65, 78, 128, 87, 65, 76, 76, 80, 76, 65, 78, 197, 87, 65, + 76, 76, 128, 87, 65, 76, 204, 87, 65, 76, 75, 128, 87, 65, 76, 203, 87, + 65, 73, 84, 73, 78, 71, 128, 87, 65, 73, 83, 84, 128, 87, 65, 73, 128, + 87, 65, 70, 70, 76, 69, 128, 87, 65, 69, 78, 128, 87, 65, 69, 128, 87, + 65, 68, 68, 65, 128, 87, 65, 65, 86, 85, 128, 87, 65, 45, 53, 128, 87, + 65, 45, 52, 128, 87, 65, 45, 51, 128, 87, 65, 45, 50, 128, 87, 65, 45, + 49, 128, 87, 48, 50, 53, 128, 87, 48, 50, 52, 65, 128, 87, 48, 50, 52, + 128, 87, 48, 50, 51, 128, 87, 48, 50, 50, 128, 87, 48, 50, 49, 128, 87, + 48, 50, 48, 128, 87, 48, 49, 57, 128, 87, 48, 49, 56, 65, 128, 87, 48, + 49, 56, 128, 87, 48, 49, 55, 65, 128, 87, 48, 49, 55, 128, 87, 48, 49, + 54, 128, 87, 48, 49, 53, 128, 87, 48, 49, 52, 65, 128, 87, 48, 49, 52, + 128, 87, 48, 49, 51, 128, 87, 48, 49, 50, 128, 87, 48, 49, 49, 128, 87, + 48, 49, 48, 65, 128, 87, 48, 49, 48, 128, 87, 48, 48, 57, 65, 128, 87, + 48, 48, 57, 128, 87, 48, 48, 56, 128, 87, 48, 48, 55, 128, 87, 48, 48, + 54, 128, 87, 48, 48, 53, 128, 87, 48, 48, 52, 128, 87, 48, 48, 51, 65, + 128, 87, 48, 48, 51, 128, 87, 48, 48, 50, 128, 87, 48, 48, 49, 128, 86, + 90, 77, 69, 84, 128, 86, 89, 88, 128, 86, 89, 84, 128, 86, 89, 82, 88, + 128, 86, 89, 82, 128, 86, 89, 80, 128, 86, 89, 128, 86, 87, 74, 128, 86, + 87, 65, 128, 86, 87, 128, 86, 85, 88, 128, 86, 85, 85, 128, 86, 85, 84, + 128, 86, 85, 82, 88, 128, 86, 85, 82, 128, 86, 85, 80, 128, 86, 85, 76, + 71, 65, 210, 86, 85, 76, 67, 65, 78, 85, 83, 128, 86, 85, 69, 81, 128, + 86, 84, 83, 128, 86, 84, 128, 86, 83, 57, 57, 128, 86, 83, 57, 56, 128, + 86, 83, 57, 55, 128, 86, 83, 57, 54, 128, 86, 83, 57, 53, 128, 86, 83, + 57, 52, 128, 86, 83, 57, 51, 128, 86, 83, 57, 50, 128, 86, 83, 57, 49, + 128, 86, 83, 57, 48, 128, 86, 83, 57, 128, 86, 83, 56, 57, 128, 86, 83, + 56, 56, 128, 86, 83, 56, 55, 128, 86, 83, 56, 54, 128, 86, 83, 56, 53, + 128, 86, 83, 56, 52, 128, 86, 83, 56, 51, 128, 86, 83, 56, 50, 128, 86, + 83, 56, 49, 128, 86, 83, 56, 48, 128, 86, 83, 56, 128, 86, 83, 55, 57, + 128, 86, 83, 55, 56, 128, 86, 83, 55, 55, 128, 86, 83, 55, 54, 128, 86, + 83, 55, 53, 128, 86, 83, 55, 52, 128, 86, 83, 55, 51, 128, 86, 83, 55, + 50, 128, 86, 83, 55, 49, 128, 86, 83, 55, 48, 128, 86, 83, 55, 128, 86, + 83, 54, 57, 128, 86, 83, 54, 56, 128, 86, 83, 54, 55, 128, 86, 83, 54, + 54, 128, 86, 83, 54, 53, 128, 86, 83, 54, 52, 128, 86, 83, 54, 51, 128, + 86, 83, 54, 50, 128, 86, 83, 54, 49, 128, 86, 83, 54, 48, 128, 86, 83, + 54, 128, 86, 83, 53, 57, 128, 86, 83, 53, 56, 128, 86, 83, 53, 55, 128, + 86, 83, 53, 54, 128, 86, 83, 53, 53, 128, 86, 83, 53, 52, 128, 86, 83, + 53, 51, 128, 86, 83, 53, 50, 128, 86, 83, 53, 49, 128, 86, 83, 53, 48, + 128, 86, 83, 53, 128, 86, 83, 52, 57, 128, 86, 83, 52, 56, 128, 86, 83, + 52, 55, 128, 86, 83, 52, 54, 128, 86, 83, 52, 53, 128, 86, 83, 52, 52, + 128, 86, 83, 52, 51, 128, 86, 83, 52, 50, 128, 86, 83, 52, 49, 128, 86, + 83, 52, 48, 128, 86, 83, 52, 128, 86, 83, 51, 57, 128, 86, 83, 51, 56, + 128, 86, 83, 51, 55, 128, 86, 83, 51, 54, 128, 86, 83, 51, 53, 128, 86, + 83, 51, 52, 128, 86, 83, 51, 51, 128, 86, 83, 51, 50, 128, 86, 83, 51, + 49, 128, 86, 83, 51, 48, 128, 86, 83, 51, 128, 86, 83, 50, 57, 128, 86, + 83, 50, 56, 128, 86, 83, 50, 55, 128, 86, 83, 50, 54, 128, 86, 83, 50, + 53, 54, 128, 86, 83, 50, 53, 53, 128, 86, 83, 50, 53, 52, 128, 86, 83, + 50, 53, 51, 128, 86, 83, 50, 53, 50, 128, 86, 83, 50, 53, 49, 128, 86, + 83, 50, 53, 48, 128, 86, 83, 50, 53, 128, 86, 83, 50, 52, 57, 128, 86, + 83, 50, 52, 56, 128, 86, 83, 50, 52, 55, 128, 86, 83, 50, 52, 54, 128, + 86, 83, 50, 52, 53, 128, 86, 83, 50, 52, 52, 128, 86, 83, 50, 52, 51, + 128, 86, 83, 50, 52, 50, 128, 86, 83, 50, 52, 49, 128, 86, 83, 50, 52, + 48, 128, 86, 83, 50, 52, 128, 86, 83, 50, 51, 57, 128, 86, 83, 50, 51, + 56, 128, 86, 83, 50, 51, 55, 128, 86, 83, 50, 51, 54, 128, 86, 83, 50, + 51, 53, 128, 86, 83, 50, 51, 52, 128, 86, 83, 50, 51, 51, 128, 86, 83, + 50, 51, 50, 128, 86, 83, 50, 51, 49, 128, 86, 83, 50, 51, 48, 128, 86, + 83, 50, 51, 128, 86, 83, 50, 50, 57, 128, 86, 83, 50, 50, 56, 128, 86, + 83, 50, 50, 55, 128, 86, 83, 50, 50, 54, 128, 86, 83, 50, 50, 53, 128, + 86, 83, 50, 50, 52, 128, 86, 83, 50, 50, 51, 128, 86, 83, 50, 50, 50, + 128, 86, 83, 50, 50, 49, 128, 86, 83, 50, 50, 48, 128, 86, 83, 50, 50, + 128, 86, 83, 50, 49, 57, 128, 86, 83, 50, 49, 56, 128, 86, 83, 50, 49, + 55, 128, 86, 83, 50, 49, 54, 128, 86, 83, 50, 49, 53, 128, 86, 83, 50, + 49, 52, 128, 86, 83, 50, 49, 51, 128, 86, 83, 50, 49, 50, 128, 86, 83, + 50, 49, 49, 128, 86, 83, 50, 49, 48, 128, 86, 83, 50, 49, 128, 86, 83, + 50, 48, 57, 128, 86, 83, 50, 48, 56, 128, 86, 83, 50, 48, 55, 128, 86, + 83, 50, 48, 54, 128, 86, 83, 50, 48, 53, 128, 86, 83, 50, 48, 52, 128, + 86, 83, 50, 48, 51, 128, 86, 83, 50, 48, 50, 128, 86, 83, 50, 48, 49, + 128, 86, 83, 50, 48, 48, 128, 86, 83, 50, 48, 128, 86, 83, 50, 128, 86, + 83, 49, 57, 57, 128, 86, 83, 49, 57, 56, 128, 86, 83, 49, 57, 55, 128, + 86, 83, 49, 57, 54, 128, 86, 83, 49, 57, 53, 128, 86, 83, 49, 57, 52, + 128, 86, 83, 49, 57, 51, 128, 86, 83, 49, 57, 50, 128, 86, 83, 49, 57, + 49, 128, 86, 83, 49, 57, 48, 128, 86, 83, 49, 57, 128, 86, 83, 49, 56, + 57, 128, 86, 83, 49, 56, 56, 128, 86, 83, 49, 56, 55, 128, 86, 83, 49, + 56, 54, 128, 86, 83, 49, 56, 53, 128, 86, 83, 49, 56, 52, 128, 86, 83, + 49, 56, 51, 128, 86, 83, 49, 56, 50, 128, 86, 83, 49, 56, 49, 128, 86, + 83, 49, 56, 48, 128, 86, 83, 49, 56, 128, 86, 83, 49, 55, 57, 128, 86, + 83, 49, 55, 56, 128, 86, 83, 49, 55, 55, 128, 86, 83, 49, 55, 54, 128, + 86, 83, 49, 55, 53, 128, 86, 83, 49, 55, 52, 128, 86, 83, 49, 55, 51, + 128, 86, 83, 49, 55, 50, 128, 86, 83, 49, 55, 49, 128, 86, 83, 49, 55, + 48, 128, 86, 83, 49, 55, 128, 86, 83, 49, 54, 57, 128, 86, 83, 49, 54, + 56, 128, 86, 83, 49, 54, 55, 128, 86, 83, 49, 54, 54, 128, 86, 83, 49, + 54, 53, 128, 86, 83, 49, 54, 52, 128, 86, 83, 49, 54, 51, 128, 86, 83, + 49, 54, 50, 128, 86, 83, 49, 54, 49, 128, 86, 83, 49, 54, 48, 128, 86, + 83, 49, 54, 128, 86, 83, 49, 53, 57, 128, 86, 83, 49, 53, 56, 128, 86, + 83, 49, 53, 55, 128, 86, 83, 49, 53, 54, 128, 86, 83, 49, 53, 53, 128, + 86, 83, 49, 53, 52, 128, 86, 83, 49, 53, 51, 128, 86, 83, 49, 53, 50, + 128, 86, 83, 49, 53, 49, 128, 86, 83, 49, 53, 48, 128, 86, 83, 49, 53, + 128, 86, 83, 49, 52, 57, 128, 86, 83, 49, 52, 56, 128, 86, 83, 49, 52, + 55, 128, 86, 83, 49, 52, 54, 128, 86, 83, 49, 52, 53, 128, 86, 83, 49, + 52, 52, 128, 86, 83, 49, 52, 51, 128, 86, 83, 49, 52, 50, 128, 86, 83, + 49, 52, 49, 128, 86, 83, 49, 52, 48, 128, 86, 83, 49, 52, 128, 86, 83, + 49, 51, 57, 128, 86, 83, 49, 51, 56, 128, 86, 83, 49, 51, 55, 128, 86, + 83, 49, 51, 54, 128, 86, 83, 49, 51, 53, 128, 86, 83, 49, 51, 52, 128, + 86, 83, 49, 51, 51, 128, 86, 83, 49, 51, 50, 128, 86, 83, 49, 51, 49, + 128, 86, 83, 49, 51, 48, 128, 86, 83, 49, 51, 128, 86, 83, 49, 50, 57, + 128, 86, 83, 49, 50, 56, 128, 86, 83, 49, 50, 55, 128, 86, 83, 49, 50, + 54, 128, 86, 83, 49, 50, 53, 128, 86, 83, 49, 50, 52, 128, 86, 83, 49, + 50, 51, 128, 86, 83, 49, 50, 50, 128, 86, 83, 49, 50, 49, 128, 86, 83, + 49, 50, 48, 128, 86, 83, 49, 50, 128, 86, 83, 49, 49, 57, 128, 86, 83, + 49, 49, 56, 128, 86, 83, 49, 49, 55, 128, 86, 83, 49, 49, 54, 128, 86, + 83, 49, 49, 53, 128, 86, 83, 49, 49, 52, 128, 86, 83, 49, 49, 51, 128, + 86, 83, 49, 49, 50, 128, 86, 83, 49, 49, 49, 128, 86, 83, 49, 49, 48, + 128, 86, 83, 49, 49, 128, 86, 83, 49, 48, 57, 128, 86, 83, 49, 48, 56, + 128, 86, 83, 49, 48, 55, 128, 86, 83, 49, 48, 54, 128, 86, 83, 49, 48, + 53, 128, 86, 83, 49, 48, 52, 128, 86, 83, 49, 48, 51, 128, 86, 83, 49, + 48, 50, 128, 86, 83, 49, 48, 49, 128, 86, 83, 49, 48, 48, 128, 86, 83, + 49, 48, 128, 86, 83, 49, 128, 86, 83, 128, 86, 82, 65, 67, 72, 89, 128, + 86, 79, 88, 128, 86, 79, 87, 69, 76, 45, 67, 65, 82, 82, 73, 69, 210, 86, + 79, 87, 128, 86, 79, 85, 128, 86, 79, 84, 128, 86, 79, 211, 86, 79, 80, + 128, 86, 79, 79, 73, 128, 86, 79, 79, 128, 86, 79, 77, 73, 84, 73, 78, + 71, 128, 86, 79, 77, 128, 86, 79, 76, 85, 77, 197, 86, 79, 76, 84, 65, + 71, 197, 86, 79, 76, 76, 69, 89, 66, 65, 76, 76, 128, 86, 79, 76, 67, 65, + 78, 79, 128, 86, 79, 76, 65, 80, 85, 203, 86, 79, 73, 196, 86, 79, 73, + 67, 73, 78, 71, 128, 86, 79, 73, 67, 69, 76, 69, 83, 211, 86, 79, 73, 67, + 69, 196, 86, 79, 68, 128, 86, 79, 67, 65, 76, 73, 90, 65, 84, 73, 79, + 206, 86, 79, 67, 65, 204, 86, 79, 128, 86, 73, 89, 79, 128, 86, 73, 88, + 128, 86, 73, 84, 82, 73, 79, 76, 45, 50, 128, 86, 73, 84, 82, 73, 79, 76, + 128, 86, 73, 84, 65, 69, 45, 50, 128, 86, 73, 84, 65, 69, 128, 86, 73, + 84, 128, 86, 73, 83, 73, 71, 79, 84, 72, 73, 195, 86, 73, 83, 65, 82, 71, + 65, 89, 65, 128, 86, 73, 83, 65, 82, 71, 65, 128, 86, 73, 83, 65, 82, 71, + 193, 86, 73, 82, 73, 65, 77, 128, 86, 73, 82, 71, 79, 128, 86, 73, 82, + 71, 65, 128, 86, 73, 82, 65, 77, 65, 128, 86, 73, 80, 128, 86, 73, 79, + 76, 73, 78, 128, 86, 73, 78, 69, 71, 65, 82, 45, 51, 128, 86, 73, 78, 69, + 71, 65, 82, 45, 50, 128, 86, 73, 78, 69, 71, 65, 82, 128, 86, 73, 78, 69, + 71, 65, 210, 86, 73, 78, 69, 128, 86, 73, 78, 197, 86, 73, 78, 128, 86, + 73, 76, 76, 65, 71, 69, 128, 86, 73, 73, 128, 86, 73, 71, 73, 78, 84, 73, + 76, 69, 128, 86, 73, 69, 88, 128, 86, 73, 69, 87, 73, 78, 199, 86, 73, + 69, 87, 68, 65, 84, 193, 86, 73, 69, 84, 128, 86, 73, 69, 212, 86, 73, + 69, 80, 128, 86, 73, 69, 128, 86, 73, 68, 74, 45, 50, 128, 86, 73, 68, + 74, 128, 86, 73, 68, 69, 79, 67, 65, 83, 83, 69, 84, 84, 69, 128, 86, 73, + 68, 69, 207, 86, 73, 68, 65, 128, 86, 73, 67, 84, 79, 82, 217, 86, 73, + 66, 82, 65, 84, 73, 79, 206, 86, 72, 65, 128, 86, 70, 65, 128, 86, 69, + 89, 90, 128, 86, 69, 88, 128, 86, 69, 87, 128, 86, 69, 215, 86, 69, 85, + 88, 128, 86, 69, 85, 77, 128, 86, 69, 85, 65, 69, 80, 69, 78, 128, 86, + 69, 85, 65, 69, 128, 86, 69, 83, 84, 65, 128, 86, 69, 83, 84, 128, 86, 69, 83, 83, 69, 204, 86, 69, 82, 217, 86, 69, 82, 84, 73, 67, 65, 76, 76, 89, 128, 86, 69, 82, 84, 73, 67, 65, 76, 76, 217, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, @@ -450,62 +453,64 @@ static unsigned char lexicon[] = { 65, 76, 45, 48, 48, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 128, 86, 69, 82, 83, 73, 67, 76, 69, 128, 86, 69, 82, 83, 197, 86, 69, 82, 71, 69, 128, 86, 69, 82, 68, 73, 71, 82, 73, 83, 128, 86, 69, 82, 128, 86, - 69, 80, 128, 86, 69, 78, 68, 128, 86, 69, 73, 76, 128, 86, 69, 72, 73, - 67, 76, 69, 128, 86, 69, 72, 128, 86, 69, 200, 86, 69, 69, 128, 86, 69, - 197, 86, 69, 68, 69, 128, 86, 69, 67, 84, 79, 210, 86, 65, 89, 65, 78, - 78, 65, 128, 86, 65, 88, 128, 86, 65, 86, 128, 86, 65, 214, 86, 65, 85, - 128, 86, 65, 84, 72, 89, 128, 86, 65, 84, 128, 86, 65, 83, 84, 78, 69, - 83, 211, 86, 65, 83, 73, 83, 128, 86, 65, 82, 89, 211, 86, 65, 82, 73, - 75, 65, 128, 86, 65, 82, 73, 65, 78, 84, 128, 86, 65, 82, 73, 65, 78, - 212, 86, 65, 82, 73, 65, 128, 86, 65, 82, 73, 193, 86, 65, 82, 69, 73, - 65, 201, 86, 65, 82, 69, 73, 193, 86, 65, 80, 79, 85, 82, 83, 128, 86, - 65, 80, 128, 86, 65, 78, 69, 128, 86, 65, 77, 80, 73, 82, 69, 128, 86, - 65, 77, 65, 71, 79, 77, 85, 75, 72, 65, 128, 86, 65, 77, 65, 71, 79, 77, - 85, 75, 72, 193, 86, 65, 76, 76, 69, 89, 128, 86, 65, 74, 128, 86, 65, - 73, 128, 86, 65, 72, 128, 86, 65, 200, 86, 65, 65, 86, 85, 128, 86, 65, - 65, 128, 86, 48, 52, 48, 65, 128, 86, 48, 52, 48, 128, 86, 48, 51, 57, - 128, 86, 48, 51, 56, 128, 86, 48, 51, 55, 65, 128, 86, 48, 51, 55, 128, - 86, 48, 51, 54, 128, 86, 48, 51, 53, 128, 86, 48, 51, 52, 128, 86, 48, - 51, 51, 65, 128, 86, 48, 51, 51, 128, 86, 48, 51, 50, 128, 86, 48, 51, - 49, 65, 128, 86, 48, 51, 49, 128, 86, 48, 51, 48, 65, 128, 86, 48, 51, - 48, 128, 86, 48, 50, 57, 65, 128, 86, 48, 50, 57, 128, 86, 48, 50, 56, - 65, 128, 86, 48, 50, 56, 128, 86, 48, 50, 55, 128, 86, 48, 50, 54, 128, - 86, 48, 50, 53, 128, 86, 48, 50, 52, 128, 86, 48, 50, 51, 65, 128, 86, - 48, 50, 51, 128, 86, 48, 50, 50, 128, 86, 48, 50, 49, 128, 86, 48, 50, - 48, 76, 128, 86, 48, 50, 48, 75, 128, 86, 48, 50, 48, 74, 128, 86, 48, - 50, 48, 73, 128, 86, 48, 50, 48, 72, 128, 86, 48, 50, 48, 71, 128, 86, - 48, 50, 48, 70, 128, 86, 48, 50, 48, 69, 128, 86, 48, 50, 48, 68, 128, - 86, 48, 50, 48, 67, 128, 86, 48, 50, 48, 66, 128, 86, 48, 50, 48, 65, - 128, 86, 48, 50, 48, 128, 86, 48, 49, 57, 128, 86, 48, 49, 56, 128, 86, - 48, 49, 55, 128, 86, 48, 49, 54, 128, 86, 48, 49, 53, 128, 86, 48, 49, - 52, 128, 86, 48, 49, 51, 128, 86, 48, 49, 50, 66, 128, 86, 48, 49, 50, - 65, 128, 86, 48, 49, 50, 128, 86, 48, 49, 49, 67, 128, 86, 48, 49, 49, - 66, 128, 86, 48, 49, 49, 65, 128, 86, 48, 49, 49, 128, 86, 48, 49, 48, - 128, 86, 48, 48, 57, 128, 86, 48, 48, 56, 128, 86, 48, 48, 55, 66, 128, - 86, 48, 48, 55, 65, 128, 86, 48, 48, 55, 128, 86, 48, 48, 54, 128, 86, - 48, 48, 53, 128, 86, 48, 48, 52, 128, 86, 48, 48, 51, 128, 86, 48, 48, - 50, 65, 128, 86, 48, 48, 50, 128, 86, 48, 48, 49, 73, 128, 86, 48, 48, - 49, 72, 128, 86, 48, 48, 49, 71, 128, 86, 48, 48, 49, 70, 128, 86, 48, - 48, 49, 69, 128, 86, 48, 48, 49, 68, 128, 86, 48, 48, 49, 67, 128, 86, - 48, 48, 49, 66, 128, 86, 48, 48, 49, 65, 128, 86, 48, 48, 49, 128, 85, - 90, 85, 128, 85, 90, 51, 128, 85, 90, 179, 85, 89, 65, 78, 78, 65, 128, - 85, 89, 128, 85, 87, 85, 128, 85, 85, 89, 65, 78, 78, 65, 128, 85, 85, - 85, 85, 128, 85, 85, 85, 51, 128, 85, 85, 85, 50, 128, 85, 85, 69, 128, - 85, 84, 85, 75, 73, 128, 85, 83, 83, 85, 51, 128, 85, 83, 83, 85, 128, - 85, 83, 72, 88, 128, 85, 83, 72, 85, 77, 88, 128, 85, 83, 72, 69, 78, 78, - 65, 128, 85, 83, 72, 50, 128, 85, 83, 72, 128, 85, 83, 200, 85, 83, 69, - 196, 85, 83, 69, 45, 50, 128, 85, 83, 69, 45, 49, 128, 85, 83, 69, 128, - 85, 83, 197, 85, 82, 85, 218, 85, 82, 85, 83, 128, 85, 82, 85, 68, 65, - 128, 85, 82, 85, 68, 193, 85, 82, 85, 128, 85, 82, 213, 85, 82, 78, 128, - 85, 82, 73, 78, 69, 128, 85, 82, 73, 51, 128, 85, 82, 73, 128, 85, 82, - 65, 78, 85, 83, 128, 85, 82, 65, 128, 85, 82, 52, 128, 85, 82, 50, 128, - 85, 82, 178, 85, 80, 87, 65, 82, 68, 83, 128, 85, 80, 87, 65, 82, 68, - 211, 85, 80, 87, 65, 82, 68, 128, 85, 80, 87, 65, 82, 196, 85, 80, 84, - 85, 82, 78, 128, 85, 80, 83, 73, 76, 79, 78, 128, 85, 80, 83, 73, 76, 79, - 206, 85, 80, 83, 73, 68, 69, 45, 68, 79, 87, 206, 85, 80, 82, 73, 71, 72, - 212, 85, 80, 80, 69, 82, 128, 85, 80, 80, 69, 210, 85, 80, 65, 68, 72, - 77, 65, 78, 73, 89, 65, 128, 85, 80, 45, 80, 79, 73, 78, 84, 73, 78, 199, - 85, 79, 78, 128, 85, 78, 78, 128, 85, 78, 77, 65, 82, 82, 73, 69, 196, + 69, 80, 128, 86, 69, 78, 68, 128, 86, 69, 76, 73, 128, 86, 69, 73, 76, + 128, 86, 69, 72, 73, 67, 76, 69, 128, 86, 69, 72, 128, 86, 69, 200, 86, + 69, 69, 128, 86, 69, 197, 86, 69, 68, 69, 128, 86, 69, 67, 84, 79, 210, + 86, 65, 89, 65, 78, 78, 65, 128, 86, 65, 88, 128, 86, 65, 86, 128, 86, + 65, 214, 86, 65, 85, 128, 86, 65, 84, 72, 89, 128, 86, 65, 84, 128, 86, + 65, 83, 84, 78, 69, 83, 211, 86, 65, 83, 73, 83, 128, 86, 65, 82, 89, + 211, 86, 65, 82, 73, 75, 65, 128, 86, 65, 82, 73, 65, 78, 84, 128, 86, + 65, 82, 73, 65, 78, 212, 86, 65, 82, 73, 65, 128, 86, 65, 82, 73, 193, + 86, 65, 82, 69, 73, 65, 201, 86, 65, 82, 69, 73, 193, 86, 65, 82, 65, 65, + 75, 65, 78, 128, 86, 65, 80, 79, 85, 82, 83, 128, 86, 65, 80, 128, 86, + 65, 78, 69, 128, 86, 65, 77, 80, 73, 82, 69, 128, 86, 65, 77, 65, 71, 79, + 77, 85, 75, 72, 65, 128, 86, 65, 77, 65, 71, 79, 77, 85, 75, 72, 193, 86, + 65, 76, 76, 69, 89, 128, 86, 65, 75, 65, 73, 89, 65, 82, 65, 65, 128, 86, + 65, 74, 128, 86, 65, 73, 128, 86, 65, 72, 128, 86, 65, 200, 86, 65, 65, + 86, 85, 128, 86, 65, 65, 128, 86, 48, 52, 48, 65, 128, 86, 48, 52, 48, + 128, 86, 48, 51, 57, 128, 86, 48, 51, 56, 128, 86, 48, 51, 55, 65, 128, + 86, 48, 51, 55, 128, 86, 48, 51, 54, 128, 86, 48, 51, 53, 128, 86, 48, + 51, 52, 128, 86, 48, 51, 51, 65, 128, 86, 48, 51, 51, 128, 86, 48, 51, + 50, 128, 86, 48, 51, 49, 65, 128, 86, 48, 51, 49, 128, 86, 48, 51, 48, + 65, 128, 86, 48, 51, 48, 128, 86, 48, 50, 57, 65, 128, 86, 48, 50, 57, + 128, 86, 48, 50, 56, 65, 128, 86, 48, 50, 56, 128, 86, 48, 50, 55, 128, + 86, 48, 50, 54, 128, 86, 48, 50, 53, 128, 86, 48, 50, 52, 128, 86, 48, + 50, 51, 65, 128, 86, 48, 50, 51, 128, 86, 48, 50, 50, 128, 86, 48, 50, + 49, 128, 86, 48, 50, 48, 76, 128, 86, 48, 50, 48, 75, 128, 86, 48, 50, + 48, 74, 128, 86, 48, 50, 48, 73, 128, 86, 48, 50, 48, 72, 128, 86, 48, + 50, 48, 71, 128, 86, 48, 50, 48, 70, 128, 86, 48, 50, 48, 69, 128, 86, + 48, 50, 48, 68, 128, 86, 48, 50, 48, 67, 128, 86, 48, 50, 48, 66, 128, + 86, 48, 50, 48, 65, 128, 86, 48, 50, 48, 128, 86, 48, 49, 57, 128, 86, + 48, 49, 56, 128, 86, 48, 49, 55, 128, 86, 48, 49, 54, 128, 86, 48, 49, + 53, 128, 86, 48, 49, 52, 128, 86, 48, 49, 51, 128, 86, 48, 49, 50, 66, + 128, 86, 48, 49, 50, 65, 128, 86, 48, 49, 50, 128, 86, 48, 49, 49, 67, + 128, 86, 48, 49, 49, 66, 128, 86, 48, 49, 49, 65, 128, 86, 48, 49, 49, + 128, 86, 48, 49, 48, 128, 86, 48, 48, 57, 128, 86, 48, 48, 56, 128, 86, + 48, 48, 55, 66, 128, 86, 48, 48, 55, 65, 128, 86, 48, 48, 55, 128, 86, + 48, 48, 54, 128, 86, 48, 48, 53, 128, 86, 48, 48, 52, 128, 86, 48, 48, + 51, 128, 86, 48, 48, 50, 65, 128, 86, 48, 48, 50, 128, 86, 48, 48, 49, + 73, 128, 86, 48, 48, 49, 72, 128, 86, 48, 48, 49, 71, 128, 86, 48, 48, + 49, 70, 128, 86, 48, 48, 49, 69, 128, 86, 48, 48, 49, 68, 128, 86, 48, + 48, 49, 67, 128, 86, 48, 48, 49, 66, 128, 86, 48, 48, 49, 65, 128, 86, + 48, 48, 49, 128, 85, 90, 85, 128, 85, 90, 72, 65, 75, 75, 85, 128, 85, + 90, 51, 128, 85, 90, 179, 85, 89, 65, 78, 78, 65, 128, 85, 89, 128, 85, + 87, 85, 128, 85, 85, 89, 65, 78, 78, 65, 128, 85, 85, 85, 85, 128, 85, + 85, 85, 51, 128, 85, 85, 85, 50, 128, 85, 85, 69, 128, 85, 84, 85, 75, + 73, 128, 85, 83, 83, 85, 51, 128, 85, 83, 83, 85, 128, 85, 83, 72, 88, + 128, 85, 83, 72, 85, 77, 88, 128, 85, 83, 72, 69, 78, 78, 65, 128, 85, + 83, 72, 50, 128, 85, 83, 72, 128, 85, 83, 200, 85, 83, 69, 196, 85, 83, + 69, 45, 50, 128, 85, 83, 69, 45, 49, 128, 85, 83, 69, 128, 85, 83, 197, + 85, 82, 85, 218, 85, 82, 85, 83, 128, 85, 82, 85, 68, 65, 128, 85, 82, + 85, 68, 193, 85, 82, 85, 128, 85, 82, 213, 85, 82, 78, 128, 85, 82, 73, + 78, 69, 128, 85, 82, 73, 51, 128, 85, 82, 73, 128, 85, 82, 65, 78, 85, + 83, 128, 85, 82, 65, 128, 85, 82, 52, 128, 85, 82, 50, 128, 85, 82, 178, + 85, 80, 87, 65, 82, 68, 83, 128, 85, 80, 87, 65, 82, 68, 211, 85, 80, 87, + 65, 82, 68, 128, 85, 80, 87, 65, 82, 196, 85, 80, 84, 85, 82, 78, 128, + 85, 80, 83, 73, 76, 79, 78, 128, 85, 80, 83, 73, 76, 79, 206, 85, 80, 83, + 73, 68, 69, 45, 68, 79, 87, 206, 85, 80, 82, 73, 71, 72, 212, 85, 80, 80, + 69, 82, 128, 85, 80, 80, 69, 210, 85, 80, 65, 68, 72, 77, 65, 78, 73, 89, + 65, 128, 85, 80, 45, 80, 79, 73, 78, 84, 73, 78, 199, 85, 79, 78, 128, + 85, 79, 71, 128, 85, 78, 78, 128, 85, 78, 77, 65, 82, 82, 73, 69, 196, 85, 78, 75, 78, 79, 87, 78, 128, 85, 78, 75, 128, 85, 78, 73, 86, 69, 82, 83, 65, 204, 85, 78, 73, 84, 89, 128, 85, 78, 73, 84, 69, 196, 85, 78, 73, 84, 128, 85, 78, 73, 212, 85, 78, 73, 79, 78, 128, 85, 78, 73, 79, @@ -522,50 +527,51 @@ static unsigned char lexicon[] = { 82, 65, 73, 78, 73, 65, 206, 85, 75, 65, 82, 65, 128, 85, 75, 65, 82, 193, 85, 75, 128, 85, 73, 76, 76, 69, 65, 78, 78, 128, 85, 73, 71, 72, 85, 210, 85, 72, 68, 128, 85, 71, 65, 82, 73, 84, 73, 195, 85, 69, 89, - 128, 85, 69, 73, 128, 85, 69, 69, 128, 85, 69, 65, 128, 85, 68, 85, 71, - 128, 85, 68, 65, 84, 84, 65, 128, 85, 68, 65, 84, 84, 193, 85, 68, 65, - 65, 84, 128, 85, 68, 128, 85, 196, 85, 67, 128, 85, 66, 85, 70, 73, 76, - 73, 128, 85, 66, 72, 65, 89, 65, 84, 207, 85, 66, 65, 68, 65, 77, 65, - 128, 85, 66, 128, 85, 65, 84, 72, 128, 85, 65, 78, 71, 128, 85, 65, 128, - 85, 178, 85, 48, 52, 50, 128, 85, 48, 52, 49, 128, 85, 48, 52, 48, 128, - 85, 48, 51, 57, 128, 85, 48, 51, 56, 128, 85, 48, 51, 55, 128, 85, 48, - 51, 54, 128, 85, 48, 51, 53, 128, 85, 48, 51, 52, 128, 85, 48, 51, 51, - 128, 85, 48, 51, 50, 65, 128, 85, 48, 51, 50, 128, 85, 48, 51, 49, 128, - 85, 48, 51, 48, 128, 85, 48, 50, 57, 65, 128, 85, 48, 50, 57, 128, 85, - 48, 50, 56, 128, 85, 48, 50, 55, 128, 85, 48, 50, 54, 128, 85, 48, 50, - 53, 128, 85, 48, 50, 52, 128, 85, 48, 50, 51, 65, 128, 85, 48, 50, 51, - 128, 85, 48, 50, 50, 128, 85, 48, 50, 49, 128, 85, 48, 50, 48, 128, 85, - 48, 49, 57, 128, 85, 48, 49, 56, 128, 85, 48, 49, 55, 128, 85, 48, 49, - 54, 128, 85, 48, 49, 53, 128, 85, 48, 49, 52, 128, 85, 48, 49, 51, 128, - 85, 48, 49, 50, 128, 85, 48, 49, 49, 128, 85, 48, 49, 48, 128, 85, 48, - 48, 57, 128, 85, 48, 48, 56, 128, 85, 48, 48, 55, 128, 85, 48, 48, 54, - 66, 128, 85, 48, 48, 54, 65, 128, 85, 48, 48, 54, 128, 85, 48, 48, 53, - 128, 85, 48, 48, 52, 128, 85, 48, 48, 51, 128, 85, 48, 48, 50, 128, 85, - 48, 48, 49, 128, 85, 45, 83, 72, 65, 80, 69, 196, 85, 45, 73, 45, 73, - 128, 85, 45, 69, 79, 45, 69, 85, 128, 85, 45, 66, 82, 74, 71, 85, 128, - 85, 45, 53, 128, 84, 90, 85, 128, 84, 90, 79, 65, 128, 84, 90, 79, 128, - 84, 90, 73, 210, 84, 90, 73, 128, 84, 90, 69, 69, 128, 84, 90, 69, 128, - 84, 90, 65, 65, 128, 84, 90, 65, 128, 84, 90, 128, 84, 89, 210, 84, 89, - 80, 69, 45, 183, 84, 89, 80, 69, 45, 54, 128, 84, 89, 80, 69, 45, 182, - 84, 89, 80, 69, 45, 53, 128, 84, 89, 80, 69, 45, 181, 84, 89, 80, 69, 45, - 52, 128, 84, 89, 80, 69, 45, 180, 84, 89, 80, 69, 45, 51, 128, 84, 89, - 80, 69, 45, 179, 84, 89, 80, 69, 45, 178, 84, 89, 80, 69, 45, 49, 45, 50, - 128, 84, 89, 80, 69, 45, 177, 84, 89, 80, 197, 84, 89, 79, 128, 84, 89, - 73, 128, 84, 89, 69, 128, 84, 89, 65, 89, 128, 84, 89, 65, 128, 84, 88, - 87, 86, 128, 84, 88, 87, 214, 84, 88, 72, 69, 69, 202, 84, 87, 79, 79, - 128, 84, 87, 79, 45, 87, 65, 217, 84, 87, 79, 45, 84, 72, 73, 82, 84, 89, - 128, 84, 87, 79, 45, 76, 73, 78, 197, 84, 87, 79, 45, 72, 69, 65, 68, 69, - 196, 84, 87, 79, 45, 69, 205, 84, 87, 79, 45, 67, 73, 82, 67, 76, 197, - 84, 87, 73, 83, 84, 73, 78, 71, 128, 84, 87, 73, 83, 84, 69, 196, 84, 87, - 73, 73, 128, 84, 87, 73, 128, 84, 87, 69, 78, 84, 89, 45, 84, 87, 79, - 128, 84, 87, 69, 78, 84, 89, 45, 84, 87, 207, 84, 87, 69, 78, 84, 89, 45, - 84, 72, 82, 69, 69, 128, 84, 87, 69, 78, 84, 89, 45, 83, 73, 88, 128, 84, - 87, 69, 78, 84, 89, 45, 83, 69, 86, 69, 78, 128, 84, 87, 69, 78, 84, 89, - 45, 79, 78, 69, 128, 84, 87, 69, 78, 84, 89, 45, 78, 73, 78, 69, 128, 84, - 87, 69, 78, 84, 89, 45, 70, 79, 85, 82, 128, 84, 87, 69, 78, 84, 89, 45, - 70, 73, 86, 69, 128, 84, 87, 69, 78, 84, 89, 45, 69, 73, 71, 72, 84, 200, - 84, 87, 69, 78, 84, 89, 45, 69, 73, 71, 72, 84, 128, 84, 87, 69, 78, 84, - 89, 128, 84, 87, 69, 78, 84, 217, 84, 87, 69, 78, 84, 73, 69, 84, 72, 83, + 128, 85, 69, 78, 128, 85, 69, 73, 128, 85, 69, 69, 128, 85, 69, 65, 128, + 85, 68, 85, 71, 128, 85, 68, 65, 84, 84, 65, 128, 85, 68, 65, 84, 84, + 193, 85, 68, 65, 65, 84, 128, 85, 68, 128, 85, 196, 85, 67, 128, 85, 66, + 85, 70, 73, 76, 73, 128, 85, 66, 72, 65, 89, 65, 84, 207, 85, 66, 65, 68, + 65, 77, 65, 128, 85, 66, 128, 85, 65, 84, 72, 128, 85, 65, 78, 71, 128, + 85, 65, 128, 85, 178, 85, 48, 52, 50, 128, 85, 48, 52, 49, 128, 85, 48, + 52, 48, 128, 85, 48, 51, 57, 128, 85, 48, 51, 56, 128, 85, 48, 51, 55, + 128, 85, 48, 51, 54, 128, 85, 48, 51, 53, 128, 85, 48, 51, 52, 128, 85, + 48, 51, 51, 128, 85, 48, 51, 50, 65, 128, 85, 48, 51, 50, 128, 85, 48, + 51, 49, 128, 85, 48, 51, 48, 128, 85, 48, 50, 57, 65, 128, 85, 48, 50, + 57, 128, 85, 48, 50, 56, 128, 85, 48, 50, 55, 128, 85, 48, 50, 54, 128, + 85, 48, 50, 53, 128, 85, 48, 50, 52, 128, 85, 48, 50, 51, 65, 128, 85, + 48, 50, 51, 128, 85, 48, 50, 50, 128, 85, 48, 50, 49, 128, 85, 48, 50, + 48, 128, 85, 48, 49, 57, 128, 85, 48, 49, 56, 128, 85, 48, 49, 55, 128, + 85, 48, 49, 54, 128, 85, 48, 49, 53, 128, 85, 48, 49, 52, 128, 85, 48, + 49, 51, 128, 85, 48, 49, 50, 128, 85, 48, 49, 49, 128, 85, 48, 49, 48, + 128, 85, 48, 48, 57, 128, 85, 48, 48, 56, 128, 85, 48, 48, 55, 128, 85, + 48, 48, 54, 66, 128, 85, 48, 48, 54, 65, 128, 85, 48, 48, 54, 128, 85, + 48, 48, 53, 128, 85, 48, 48, 52, 128, 85, 48, 48, 51, 128, 85, 48, 48, + 50, 128, 85, 48, 48, 49, 128, 85, 45, 83, 72, 65, 80, 69, 196, 85, 45, + 73, 45, 73, 128, 85, 45, 69, 79, 45, 69, 85, 128, 85, 45, 66, 82, 74, 71, + 85, 128, 85, 45, 53, 128, 84, 90, 85, 128, 84, 90, 79, 65, 128, 84, 90, + 79, 128, 84, 90, 73, 210, 84, 90, 73, 128, 84, 90, 69, 69, 128, 84, 90, + 69, 128, 84, 90, 65, 65, 128, 84, 90, 65, 128, 84, 90, 128, 84, 89, 210, + 84, 89, 80, 69, 45, 183, 84, 89, 80, 69, 45, 54, 128, 84, 89, 80, 69, 45, + 182, 84, 89, 80, 69, 45, 53, 128, 84, 89, 80, 69, 45, 181, 84, 89, 80, + 69, 45, 52, 128, 84, 89, 80, 69, 45, 180, 84, 89, 80, 69, 45, 51, 128, + 84, 89, 80, 69, 45, 179, 84, 89, 80, 69, 45, 178, 84, 89, 80, 69, 45, 49, + 45, 50, 128, 84, 89, 80, 69, 45, 177, 84, 89, 80, 197, 84, 89, 79, 128, + 84, 89, 73, 128, 84, 89, 69, 128, 84, 89, 65, 89, 128, 84, 89, 65, 128, + 84, 88, 87, 86, 128, 84, 88, 87, 214, 84, 88, 72, 69, 69, 202, 84, 88, + 65, 128, 84, 87, 79, 79, 128, 84, 87, 79, 45, 87, 65, 217, 84, 87, 79, + 45, 84, 72, 73, 82, 84, 89, 128, 84, 87, 79, 45, 76, 73, 78, 197, 84, 87, + 79, 45, 72, 69, 65, 68, 69, 196, 84, 87, 79, 45, 69, 205, 84, 87, 79, 45, + 67, 73, 82, 67, 76, 197, 84, 87, 73, 83, 84, 73, 78, 71, 128, 84, 87, 73, + 83, 84, 69, 196, 84, 87, 73, 73, 128, 84, 87, 73, 128, 84, 87, 69, 78, + 84, 89, 45, 84, 87, 79, 128, 84, 87, 69, 78, 84, 89, 45, 84, 87, 207, 84, + 87, 69, 78, 84, 89, 45, 84, 72, 82, 69, 69, 128, 84, 87, 69, 78, 84, 89, + 45, 83, 73, 88, 128, 84, 87, 69, 78, 84, 89, 45, 83, 69, 86, 69, 78, 128, + 84, 87, 69, 78, 84, 89, 45, 79, 78, 69, 128, 84, 87, 69, 78, 84, 89, 45, + 78, 73, 78, 69, 128, 84, 87, 69, 78, 84, 89, 45, 70, 79, 85, 82, 128, 84, + 87, 69, 78, 84, 89, 45, 70, 73, 86, 69, 128, 84, 87, 69, 78, 84, 89, 45, + 70, 73, 86, 197, 84, 87, 69, 78, 84, 89, 45, 69, 73, 71, 72, 84, 200, 84, + 87, 69, 78, 84, 89, 45, 69, 73, 71, 72, 84, 128, 84, 87, 69, 78, 84, 89, + 128, 84, 87, 69, 78, 84, 217, 84, 87, 69, 78, 84, 73, 69, 84, 72, 83, 128, 84, 87, 69, 78, 84, 73, 69, 84, 72, 128, 84, 87, 69, 76, 86, 69, 45, 84, 72, 73, 82, 84, 89, 128, 84, 87, 69, 76, 86, 69, 128, 84, 87, 69, 76, 86, 197, 84, 87, 69, 76, 70, 84, 72, 83, 128, 84, 87, 69, 76, 70, 84, 72, @@ -575,66 +581,66 @@ static unsigned char lexicon[] = { 84, 84, 89, 128, 84, 85, 84, 69, 89, 65, 83, 65, 84, 128, 84, 85, 84, 128, 84, 85, 82, 88, 128, 84, 85, 82, 85, 128, 84, 85, 82, 84, 76, 69, 128, 84, 85, 82, 79, 50, 128, 84, 85, 82, 78, 83, 84, 73, 76, 69, 128, - 84, 85, 82, 78, 69, 196, 84, 85, 82, 206, 84, 85, 82, 75, 73, 83, 200, - 84, 85, 82, 75, 73, 195, 84, 85, 82, 75, 69, 89, 128, 84, 85, 82, 66, 65, - 78, 128, 84, 85, 82, 128, 84, 85, 80, 128, 84, 85, 79, 88, 128, 84, 85, - 79, 84, 128, 84, 85, 79, 80, 128, 84, 85, 79, 128, 84, 85, 78, 78, 89, - 128, 84, 85, 77, 69, 84, 69, 83, 128, 84, 85, 77, 66, 76, 69, 210, 84, - 85, 77, 65, 69, 128, 84, 85, 77, 128, 84, 85, 205, 84, 85, 76, 73, 80, - 128, 84, 85, 75, 87, 69, 78, 84, 73, 83, 128, 84, 85, 75, 128, 84, 85, - 71, 82, 73, 203, 84, 85, 71, 50, 128, 84, 85, 71, 178, 84, 85, 66, 69, - 128, 84, 85, 66, 128, 84, 85, 65, 82, 69, 199, 84, 85, 65, 69, 80, 128, - 84, 85, 65, 69, 128, 84, 85, 45, 84, 79, 128, 84, 85, 45, 52, 128, 84, - 85, 45, 51, 128, 84, 85, 45, 50, 128, 84, 85, 45, 49, 128, 84, 213, 84, - 84, 85, 85, 128, 84, 84, 85, 68, 68, 65, 71, 128, 84, 84, 85, 68, 68, 65, - 65, 71, 128, 84, 84, 85, 128, 84, 84, 84, 72, 65, 128, 84, 84, 84, 65, - 128, 84, 84, 83, 85, 128, 84, 84, 83, 79, 128, 84, 84, 83, 73, 128, 84, - 84, 83, 69, 69, 128, 84, 84, 83, 69, 128, 84, 84, 83, 65, 128, 84, 84, - 79, 79, 128, 84, 84, 73, 73, 128, 84, 84, 73, 128, 84, 84, 72, 87, 69, - 128, 84, 84, 72, 85, 128, 84, 84, 72, 79, 79, 128, 84, 84, 72, 79, 128, - 84, 84, 72, 73, 128, 84, 84, 72, 69, 69, 128, 84, 84, 72, 69, 128, 84, - 84, 72, 65, 65, 128, 84, 84, 72, 128, 84, 84, 69, 72, 69, 72, 128, 84, - 84, 69, 72, 69, 200, 84, 84, 69, 72, 128, 84, 84, 69, 200, 84, 84, 69, - 69, 128, 84, 84, 65, 89, 65, 78, 78, 65, 128, 84, 84, 65, 85, 128, 84, - 84, 65, 73, 128, 84, 84, 65, 65, 128, 84, 84, 50, 128, 84, 83, 87, 69, - 128, 84, 83, 87, 66, 128, 84, 83, 87, 65, 128, 84, 83, 86, 128, 84, 83, - 83, 69, 128, 84, 83, 83, 65, 128, 84, 83, 79, 214, 84, 83, 73, 85, 128, - 84, 83, 72, 85, 71, 83, 128, 84, 83, 72, 79, 79, 75, 128, 84, 83, 72, 79, - 79, 203, 84, 83, 72, 79, 79, 74, 128, 84, 83, 72, 69, 83, 128, 84, 83, - 72, 69, 71, 128, 84, 83, 72, 69, 199, 84, 83, 72, 69, 69, 74, 128, 84, - 83, 72, 69, 128, 84, 83, 72, 65, 194, 84, 83, 72, 65, 128, 84, 83, 69, - 82, 69, 128, 84, 83, 69, 69, 66, 128, 84, 83, 65, 68, 73, 128, 84, 83, - 65, 68, 201, 84, 83, 65, 66, 128, 84, 83, 65, 65, 68, 73, 89, 128, 84, - 83, 65, 65, 128, 84, 83, 193, 84, 211, 84, 82, 89, 66, 76, 73, 79, 206, - 84, 82, 85, 84, 72, 128, 84, 82, 85, 78, 75, 128, 84, 82, 85, 78, 67, 65, - 84, 69, 196, 84, 82, 85, 77, 80, 69, 84, 128, 84, 82, 85, 77, 80, 45, 57, - 128, 84, 82, 85, 77, 80, 45, 56, 128, 84, 82, 85, 77, 80, 45, 55, 128, - 84, 82, 85, 77, 80, 45, 54, 128, 84, 82, 85, 77, 80, 45, 53, 128, 84, 82, - 85, 77, 80, 45, 52, 128, 84, 82, 85, 77, 80, 45, 51, 128, 84, 82, 85, 77, - 80, 45, 50, 49, 128, 84, 82, 85, 77, 80, 45, 50, 48, 128, 84, 82, 85, 77, - 80, 45, 50, 128, 84, 82, 85, 77, 80, 45, 49, 57, 128, 84, 82, 85, 77, 80, - 45, 49, 56, 128, 84, 82, 85, 77, 80, 45, 49, 55, 128, 84, 82, 85, 77, 80, - 45, 49, 54, 128, 84, 82, 85, 77, 80, 45, 49, 53, 128, 84, 82, 85, 77, 80, - 45, 49, 52, 128, 84, 82, 85, 77, 80, 45, 49, 51, 128, 84, 82, 85, 77, 80, - 45, 49, 50, 128, 84, 82, 85, 77, 80, 45, 49, 49, 128, 84, 82, 85, 77, 80, - 45, 49, 48, 128, 84, 82, 85, 77, 80, 45, 49, 128, 84, 82, 85, 69, 128, - 84, 82, 85, 197, 84, 82, 85, 67, 75, 128, 84, 82, 79, 80, 73, 67, 65, - 204, 84, 82, 79, 80, 72, 89, 128, 84, 82, 79, 77, 73, 75, 79, 83, 89, 78, - 65, 71, 77, 65, 128, 84, 82, 79, 77, 73, 75, 79, 80, 83, 73, 70, 73, 83, - 84, 79, 78, 128, 84, 82, 79, 77, 73, 75, 79, 80, 65, 82, 65, 75, 65, 76, - 69, 83, 77, 65, 128, 84, 82, 79, 77, 73, 75, 79, 78, 128, 84, 82, 79, 77, - 73, 75, 79, 206, 84, 82, 79, 77, 73, 75, 79, 76, 89, 71, 73, 83, 77, 65, - 128, 84, 82, 79, 76, 76, 69, 89, 66, 85, 83, 128, 84, 82, 79, 76, 76, 69, - 89, 128, 84, 82, 79, 75, 85, 84, 65, 83, 84, 201, 84, 82, 79, 69, 90, 69, - 78, 73, 65, 206, 84, 82, 73, 85, 77, 80, 72, 128, 84, 82, 73, 84, 79, - 211, 84, 82, 73, 84, 73, 77, 79, 82, 73, 79, 78, 128, 84, 82, 73, 83, 73, - 77, 79, 85, 128, 84, 82, 73, 83, 69, 77, 69, 128, 84, 82, 73, 80, 79, 68, - 128, 84, 82, 73, 80, 76, 73, 128, 84, 82, 73, 80, 76, 69, 128, 84, 82, - 73, 80, 76, 197, 84, 82, 73, 79, 206, 84, 82, 73, 76, 76, 73, 79, 78, 83, - 128, 84, 82, 73, 73, 83, 65, 80, 128, 84, 82, 73, 71, 82, 65, 77, 77, 79, - 211, 84, 82, 73, 71, 82, 65, 205, 84, 82, 73, 71, 79, 82, 71, 79, 78, - 128, 84, 82, 73, 70, 79, 78, 73, 65, 83, 128, 84, 82, 73, 70, 79, 76, 73, - 65, 84, 197, 84, 82, 73, 68, 69, 78, 84, 128, 84, 82, 73, 68, 69, 78, + 84, 85, 82, 206, 84, 85, 82, 75, 73, 83, 200, 84, 85, 82, 75, 73, 195, + 84, 85, 82, 75, 69, 89, 128, 84, 85, 82, 66, 65, 78, 128, 84, 85, 82, + 128, 84, 85, 80, 78, 73, 128, 84, 85, 80, 128, 84, 85, 79, 88, 128, 84, + 85, 79, 84, 128, 84, 85, 79, 80, 128, 84, 85, 79, 128, 84, 85, 78, 78, + 89, 128, 84, 85, 77, 69, 84, 69, 83, 128, 84, 85, 77, 66, 76, 69, 210, + 84, 85, 77, 65, 69, 128, 84, 85, 77, 128, 84, 85, 205, 84, 85, 76, 73, + 80, 128, 84, 85, 75, 87, 69, 78, 84, 73, 83, 128, 84, 85, 75, 128, 84, + 85, 71, 82, 73, 203, 84, 85, 71, 50, 128, 84, 85, 71, 178, 84, 85, 66, + 69, 128, 84, 85, 66, 128, 84, 85, 65, 82, 69, 199, 84, 85, 65, 69, 80, + 128, 84, 85, 65, 69, 128, 84, 85, 45, 84, 79, 128, 84, 85, 45, 52, 128, + 84, 85, 45, 51, 128, 84, 85, 45, 50, 128, 84, 85, 45, 49, 128, 84, 213, + 84, 84, 85, 85, 128, 84, 84, 85, 68, 68, 65, 71, 128, 84, 84, 85, 68, 68, + 65, 65, 71, 128, 84, 84, 85, 128, 84, 84, 84, 72, 65, 128, 84, 84, 84, + 65, 128, 84, 84, 83, 85, 128, 84, 84, 83, 79, 128, 84, 84, 83, 73, 128, + 84, 84, 83, 69, 69, 128, 84, 84, 83, 69, 128, 84, 84, 83, 65, 128, 84, + 84, 79, 79, 128, 84, 84, 73, 73, 128, 84, 84, 73, 128, 84, 84, 72, 87, + 69, 128, 84, 84, 72, 85, 128, 84, 84, 72, 79, 79, 128, 84, 84, 72, 79, + 128, 84, 84, 72, 73, 128, 84, 84, 72, 69, 69, 128, 84, 84, 72, 69, 128, + 84, 84, 72, 65, 65, 128, 84, 84, 72, 128, 84, 84, 69, 72, 69, 72, 128, + 84, 84, 69, 72, 69, 200, 84, 84, 69, 72, 128, 84, 84, 69, 200, 84, 84, + 69, 69, 128, 84, 84, 65, 89, 65, 78, 78, 65, 128, 84, 84, 65, 85, 128, + 84, 84, 65, 73, 128, 84, 84, 65, 65, 128, 84, 84, 50, 128, 84, 83, 87, + 69, 128, 84, 83, 87, 66, 128, 84, 83, 87, 65, 128, 84, 83, 86, 128, 84, + 83, 83, 69, 128, 84, 83, 83, 65, 128, 84, 83, 79, 214, 84, 83, 73, 85, + 128, 84, 83, 72, 85, 71, 83, 128, 84, 83, 72, 79, 79, 75, 128, 84, 83, + 72, 79, 79, 203, 84, 83, 72, 79, 79, 74, 128, 84, 83, 72, 69, 83, 128, + 84, 83, 72, 69, 71, 128, 84, 83, 72, 69, 199, 84, 83, 72, 69, 69, 74, + 128, 84, 83, 72, 69, 128, 84, 83, 72, 65, 194, 84, 83, 72, 65, 128, 84, + 83, 69, 82, 69, 128, 84, 83, 69, 69, 66, 128, 84, 83, 65, 68, 73, 128, + 84, 83, 65, 68, 201, 84, 83, 65, 66, 128, 84, 83, 65, 65, 68, 73, 89, + 128, 84, 83, 65, 65, 128, 84, 83, 193, 84, 211, 84, 82, 89, 66, 76, 73, + 79, 206, 84, 82, 85, 84, 72, 128, 84, 82, 85, 78, 75, 128, 84, 82, 85, + 78, 67, 65, 84, 69, 196, 84, 82, 85, 77, 80, 69, 84, 128, 84, 82, 85, 77, + 80, 45, 57, 128, 84, 82, 85, 77, 80, 45, 56, 128, 84, 82, 85, 77, 80, 45, + 55, 128, 84, 82, 85, 77, 80, 45, 54, 128, 84, 82, 85, 77, 80, 45, 53, + 128, 84, 82, 85, 77, 80, 45, 52, 128, 84, 82, 85, 77, 80, 45, 51, 128, + 84, 82, 85, 77, 80, 45, 50, 49, 128, 84, 82, 85, 77, 80, 45, 50, 48, 128, + 84, 82, 85, 77, 80, 45, 50, 128, 84, 82, 85, 77, 80, 45, 49, 57, 128, 84, + 82, 85, 77, 80, 45, 49, 56, 128, 84, 82, 85, 77, 80, 45, 49, 55, 128, 84, + 82, 85, 77, 80, 45, 49, 54, 128, 84, 82, 85, 77, 80, 45, 49, 53, 128, 84, + 82, 85, 77, 80, 45, 49, 52, 128, 84, 82, 85, 77, 80, 45, 49, 51, 128, 84, + 82, 85, 77, 80, 45, 49, 50, 128, 84, 82, 85, 77, 80, 45, 49, 49, 128, 84, + 82, 85, 77, 80, 45, 49, 48, 128, 84, 82, 85, 77, 80, 45, 49, 128, 84, 82, + 85, 69, 128, 84, 82, 85, 197, 84, 82, 85, 67, 75, 128, 84, 82, 79, 80, + 73, 67, 65, 204, 84, 82, 79, 80, 72, 89, 128, 84, 82, 79, 77, 73, 75, 79, + 83, 89, 78, 65, 71, 77, 65, 128, 84, 82, 79, 77, 73, 75, 79, 80, 83, 73, + 70, 73, 83, 84, 79, 78, 128, 84, 82, 79, 77, 73, 75, 79, 80, 65, 82, 65, + 75, 65, 76, 69, 83, 77, 65, 128, 84, 82, 79, 77, 73, 75, 79, 78, 128, 84, + 82, 79, 77, 73, 75, 79, 206, 84, 82, 79, 77, 73, 75, 79, 76, 89, 71, 73, + 83, 77, 65, 128, 84, 82, 79, 76, 76, 69, 89, 66, 85, 83, 128, 84, 82, 79, + 76, 76, 69, 89, 128, 84, 82, 79, 75, 85, 84, 65, 83, 84, 201, 84, 82, 79, + 69, 90, 69, 78, 73, 65, 206, 84, 82, 73, 85, 77, 80, 72, 128, 84, 82, 73, + 84, 79, 211, 84, 82, 73, 84, 73, 77, 79, 82, 73, 79, 78, 128, 84, 82, 73, + 83, 73, 77, 79, 85, 128, 84, 82, 73, 83, 69, 77, 69, 128, 84, 82, 73, 80, + 79, 68, 128, 84, 82, 73, 80, 76, 73, 128, 84, 82, 73, 80, 76, 69, 128, + 84, 82, 73, 80, 76, 197, 84, 82, 73, 79, 206, 84, 82, 73, 76, 76, 73, 79, + 78, 83, 128, 84, 82, 73, 73, 83, 65, 80, 128, 84, 82, 73, 71, 82, 65, 77, + 77, 79, 211, 84, 82, 73, 71, 82, 65, 205, 84, 82, 73, 71, 79, 82, 71, 79, + 78, 128, 84, 82, 73, 70, 79, 78, 73, 65, 83, 128, 84, 82, 73, 70, 79, 76, + 73, 65, 84, 197, 84, 82, 73, 68, 69, 78, 84, 128, 84, 82, 73, 68, 69, 78, 212, 84, 82, 73, 67, 79, 76, 79, 78, 128, 84, 82, 73, 65, 78, 71, 85, 76, 65, 210, 84, 82, 73, 65, 78, 71, 76, 69, 45, 82, 79, 85, 78, 196, 84, 82, 73, 65, 78, 71, 76, 69, 45, 72, 69, 65, 68, 69, 196, 84, 82, 73, 65, 78, @@ -653,148 +659,155 @@ static unsigned char lexicon[] = { 73, 79, 206, 84, 82, 65, 77, 87, 65, 89, 128, 84, 82, 65, 77, 128, 84, 82, 65, 205, 84, 82, 65, 73, 78, 128, 84, 82, 65, 73, 206, 84, 82, 65, 73, 76, 73, 78, 199, 84, 82, 65, 70, 70, 73, 67, 128, 84, 82, 65, 70, 70, - 73, 195, 84, 82, 65, 68, 197, 84, 82, 65, 67, 84, 79, 82, 128, 84, 82, - 65, 67, 75, 66, 65, 76, 76, 128, 84, 82, 65, 67, 75, 128, 84, 82, 65, - 128, 84, 82, 128, 84, 79, 88, 128, 84, 79, 87, 69, 82, 128, 84, 79, 87, - 65, 82, 68, 211, 84, 79, 86, 128, 84, 79, 85, 82, 78, 79, 73, 211, 84, - 79, 85, 67, 72, 84, 79, 78, 197, 84, 79, 85, 67, 72, 73, 78, 199, 84, 79, - 85, 67, 72, 69, 211, 84, 79, 85, 67, 200, 84, 79, 84, 65, 204, 84, 79, - 84, 128, 84, 79, 83, 128, 84, 79, 82, 84, 79, 73, 83, 197, 84, 79, 82, - 83, 79, 45, 87, 65, 76, 76, 80, 76, 65, 78, 197, 84, 79, 82, 83, 79, 45, - 70, 76, 79, 79, 82, 80, 76, 65, 78, 197, 84, 79, 82, 83, 79, 128, 84, 79, - 82, 78, 65, 68, 79, 128, 84, 79, 82, 67, 85, 76, 85, 83, 128, 84, 79, 82, - 67, 85, 76, 85, 211, 84, 79, 82, 67, 72, 128, 84, 79, 81, 128, 84, 79, - 80, 66, 65, 82, 128, 84, 79, 80, 45, 76, 73, 71, 72, 84, 69, 196, 84, 79, - 80, 128, 84, 79, 208, 84, 79, 79, 84, 72, 128, 84, 79, 79, 78, 128, 84, - 79, 79, 76, 66, 79, 88, 128, 84, 79, 78, 79, 83, 128, 84, 79, 78, 71, 85, - 69, 128, 84, 79, 78, 71, 85, 197, 84, 79, 78, 71, 128, 84, 79, 78, 69, - 45, 56, 128, 84, 79, 78, 69, 45, 55, 128, 84, 79, 78, 69, 45, 54, 128, - 84, 79, 78, 69, 45, 53, 128, 84, 79, 78, 69, 45, 52, 128, 84, 79, 78, 69, - 45, 51, 128, 84, 79, 78, 69, 45, 50, 128, 84, 79, 78, 69, 45, 49, 128, - 84, 79, 78, 69, 128, 84, 79, 78, 65, 204, 84, 79, 77, 80, 73, 128, 84, - 79, 77, 65, 84, 79, 128, 84, 79, 76, 79, 78, 71, 128, 84, 79, 75, 89, - 207, 84, 79, 73, 76, 69, 84, 128, 84, 79, 71, 69, 84, 72, 69, 82, 128, - 84, 79, 68, 207, 84, 79, 65, 78, 68, 65, 75, 72, 73, 65, 84, 128, 84, 79, - 65, 128, 84, 79, 45, 82, 65, 128, 84, 79, 45, 54, 128, 84, 79, 45, 53, - 128, 84, 79, 45, 52, 128, 84, 79, 45, 51, 128, 84, 79, 45, 50, 128, 84, - 79, 45, 49, 128, 84, 78, 128, 84, 76, 86, 128, 84, 76, 85, 128, 84, 76, - 79, 128, 84, 76, 73, 128, 84, 76, 72, 89, 65, 128, 84, 76, 72, 87, 69, - 128, 84, 76, 72, 85, 128, 84, 76, 72, 79, 79, 128, 84, 76, 72, 79, 128, - 84, 76, 72, 73, 128, 84, 76, 72, 69, 69, 128, 84, 76, 72, 69, 128, 84, - 76, 72, 65, 128, 84, 76, 69, 69, 128, 84, 76, 65, 128, 84, 74, 69, 128, - 84, 73, 88, 128, 84, 73, 87, 82, 128, 84, 73, 87, 78, 128, 84, 73, 87, - 65, 218, 84, 73, 84, 85, 65, 69, 80, 128, 84, 73, 84, 76, 79, 128, 84, - 73, 84, 76, 207, 84, 73, 84, 193, 84, 73, 84, 128, 84, 73, 82, 89, 65, - 75, 128, 84, 73, 82, 84, 193, 84, 73, 82, 79, 78, 73, 65, 206, 84, 73, - 82, 72, 85, 84, 193, 84, 73, 82, 69, 196, 84, 73, 82, 128, 84, 73, 210, - 84, 73, 80, 80, 73, 128, 84, 73, 80, 69, 72, 65, 128, 84, 73, 80, 128, - 84, 73, 208, 84, 73, 78, 89, 128, 84, 73, 78, 217, 84, 73, 78, 78, 69, - 128, 84, 73, 78, 67, 84, 85, 82, 69, 128, 84, 73, 78, 65, 71, 77, 65, - 128, 84, 73, 77, 69, 83, 128, 84, 73, 77, 69, 210, 84, 73, 77, 69, 128, - 84, 73, 76, 84, 73, 78, 71, 128, 84, 73, 76, 84, 73, 78, 199, 84, 73, 76, - 84, 128, 84, 73, 76, 69, 83, 128, 84, 73, 76, 68, 69, 128, 84, 73, 76, - 68, 197, 84, 73, 76, 128, 84, 73, 204, 84, 73, 75, 69, 85, 84, 45, 84, - 72, 73, 69, 85, 84, 72, 128, 84, 73, 75, 69, 85, 84, 45, 83, 73, 79, 83, - 45, 75, 73, 89, 69, 79, 75, 128, 84, 73, 75, 69, 85, 84, 45, 83, 73, 79, - 83, 128, 84, 73, 75, 69, 85, 84, 45, 82, 73, 69, 85, 76, 128, 84, 73, 75, - 69, 85, 84, 45, 80, 73, 69, 85, 80, 128, 84, 73, 75, 69, 85, 84, 45, 77, - 73, 69, 85, 77, 128, 84, 73, 75, 69, 85, 84, 45, 75, 73, 89, 69, 79, 75, - 128, 84, 73, 75, 69, 85, 84, 45, 67, 73, 69, 85, 67, 128, 84, 73, 75, 69, - 85, 84, 45, 67, 72, 73, 69, 85, 67, 72, 128, 84, 73, 75, 69, 85, 84, 128, - 84, 73, 75, 69, 85, 212, 84, 73, 71, 72, 84, 76, 89, 45, 67, 76, 79, 83, - 69, 196, 84, 73, 71, 72, 212, 84, 73, 71, 69, 82, 128, 84, 73, 71, 69, - 210, 84, 73, 70, 73, 78, 65, 71, 200, 84, 73, 69, 88, 128, 84, 73, 69, - 80, 128, 84, 73, 197, 84, 73, 67, 75, 69, 84, 83, 128, 84, 73, 67, 75, - 69, 84, 128, 84, 73, 67, 75, 128, 84, 73, 67, 203, 84, 73, 65, 82, 65, - 128, 84, 73, 50, 128, 84, 73, 45, 55, 128, 84, 73, 45, 54, 128, 84, 73, - 45, 53, 128, 84, 73, 45, 52, 128, 84, 73, 45, 51, 128, 84, 73, 45, 50, - 128, 84, 73, 45, 49, 128, 84, 72, 90, 128, 84, 72, 89, 79, 79, 205, 84, - 72, 87, 79, 79, 128, 84, 72, 87, 79, 128, 84, 72, 87, 73, 73, 128, 84, - 72, 87, 73, 128, 84, 72, 87, 69, 69, 128, 84, 72, 87, 65, 65, 128, 84, - 72, 87, 65, 128, 84, 72, 85, 82, 211, 84, 72, 85, 82, 73, 83, 65, 218, - 84, 72, 85, 78, 71, 128, 84, 72, 85, 78, 68, 69, 82, 83, 84, 79, 82, 77, - 128, 84, 72, 85, 78, 68, 69, 82, 128, 84, 72, 85, 78, 68, 69, 210, 84, - 72, 85, 77, 66, 211, 84, 72, 85, 77, 66, 128, 84, 72, 82, 79, 87, 73, 78, - 199, 84, 72, 82, 79, 85, 71, 72, 128, 84, 72, 82, 79, 85, 71, 200, 84, - 72, 82, 69, 69, 45, 84, 72, 73, 82, 84, 89, 128, 84, 72, 82, 69, 69, 45, - 81, 85, 65, 82, 84, 69, 210, 84, 72, 82, 69, 69, 45, 80, 69, 82, 45, 69, - 205, 84, 72, 82, 69, 69, 45, 76, 73, 78, 197, 84, 72, 82, 69, 69, 45, 76, - 69, 71, 71, 69, 196, 84, 72, 82, 69, 69, 45, 69, 205, 84, 72, 82, 69, 69, - 45, 68, 79, 212, 84, 72, 82, 69, 69, 45, 196, 84, 72, 82, 69, 69, 45, 67, - 73, 82, 67, 76, 197, 84, 72, 82, 69, 65, 68, 128, 84, 72, 79, 85, 83, 65, - 78, 68, 83, 128, 84, 72, 79, 85, 83, 65, 78, 68, 211, 84, 72, 79, 85, 83, - 65, 78, 68, 128, 84, 72, 79, 85, 83, 65, 78, 196, 84, 72, 79, 85, 71, 72, - 212, 84, 72, 79, 85, 128, 84, 72, 79, 82, 78, 128, 84, 72, 79, 82, 206, - 84, 72, 79, 78, 71, 128, 84, 72, 79, 77, 128, 84, 72, 79, 74, 128, 84, - 72, 79, 65, 128, 84, 72, 207, 84, 72, 73, 85, 84, 72, 128, 84, 72, 73, - 84, 65, 128, 84, 72, 73, 82, 84, 89, 45, 83, 69, 67, 79, 78, 196, 84, 72, - 73, 82, 84, 89, 45, 79, 78, 69, 128, 84, 72, 73, 82, 84, 217, 84, 72, 73, - 82, 84, 69, 69, 78, 128, 84, 72, 73, 82, 84, 69, 69, 206, 84, 72, 73, 82, - 68, 83, 128, 84, 72, 73, 82, 68, 211, 84, 72, 73, 82, 68, 45, 83, 84, 65, - 71, 197, 84, 72, 73, 82, 68, 128, 84, 72, 73, 82, 196, 84, 72, 73, 78, - 75, 73, 78, 199, 84, 72, 73, 73, 128, 84, 72, 73, 71, 72, 128, 84, 72, - 73, 69, 85, 84, 200, 84, 72, 73, 67, 203, 84, 72, 73, 65, 66, 128, 84, - 72, 69, 89, 128, 84, 72, 69, 84, 72, 69, 128, 84, 72, 69, 84, 72, 128, - 84, 72, 69, 84, 65, 128, 84, 72, 69, 84, 193, 84, 72, 69, 83, 80, 73, 65, - 206, 84, 72, 69, 83, 69, 79, 83, 128, 84, 72, 69, 83, 69, 79, 211, 84, - 72, 69, 211, 84, 72, 69, 82, 77, 79, 77, 69, 84, 69, 82, 128, 84, 72, 69, - 82, 77, 79, 68, 89, 78, 65, 77, 73, 67, 128, 84, 72, 69, 82, 69, 70, 79, - 82, 69, 128, 84, 72, 69, 82, 197, 84, 72, 69, 206, 84, 72, 69, 77, 65, - 84, 73, 83, 77, 79, 211, 84, 72, 69, 77, 65, 128, 84, 72, 69, 77, 193, - 84, 72, 69, 72, 128, 84, 72, 69, 200, 84, 72, 69, 65, 128, 84, 72, 197, - 84, 72, 65, 87, 128, 84, 72, 65, 78, 84, 72, 65, 75, 72, 65, 84, 128, 84, - 72, 65, 78, 78, 65, 128, 84, 72, 65, 78, 128, 84, 72, 65, 206, 84, 72, - 65, 77, 69, 68, 72, 128, 84, 72, 65, 76, 128, 84, 72, 65, 204, 84, 72, - 65, 74, 128, 84, 72, 65, 201, 84, 72, 65, 72, 65, 78, 128, 84, 72, 65, - 65, 78, 193, 84, 72, 65, 65, 76, 85, 128, 84, 72, 45, 67, 82, 69, 197, - 84, 69, 88, 84, 128, 84, 69, 88, 212, 84, 69, 88, 128, 84, 69, 86, 73, - 82, 128, 84, 69, 85, 84, 69, 85, 88, 128, 84, 69, 85, 84, 69, 85, 87, 69, - 78, 128, 84, 69, 85, 84, 128, 84, 69, 85, 78, 128, 84, 69, 85, 65, 69, - 81, 128, 84, 69, 85, 65, 69, 78, 128, 84, 69, 85, 128, 84, 69, 84, 82, - 65, 83, 73, 77, 79, 85, 128, 84, 69, 84, 82, 65, 83, 69, 77, 69, 128, 84, - 69, 84, 82, 65, 80, 76, 73, 128, 84, 69, 84, 82, 65, 71, 82, 65, 205, 84, - 69, 84, 82, 65, 70, 79, 78, 73, 65, 83, 128, 84, 69, 84, 72, 128, 84, 69, - 84, 200, 84, 69, 84, 65, 82, 84, 79, 211, 84, 69, 84, 65, 82, 84, 73, 77, - 79, 82, 73, 79, 78, 128, 84, 69, 84, 128, 84, 69, 212, 84, 69, 83, 212, - 84, 69, 83, 83, 69, 82, 65, 128, 84, 69, 83, 83, 69, 82, 193, 84, 69, 83, - 83, 65, 82, 79, 206, 84, 69, 83, 200, 84, 69, 82, 77, 73, 78, 65, 84, 79, - 82, 128, 84, 69, 82, 77, 73, 78, 65, 204, 84, 69, 80, 128, 84, 69, 78, - 85, 84, 79, 128, 84, 69, 78, 85, 128, 84, 69, 78, 213, 84, 69, 78, 84, - 72, 128, 84, 69, 78, 84, 128, 84, 69, 78, 83, 69, 128, 84, 69, 78, 83, - 197, 84, 69, 78, 83, 128, 84, 69, 78, 211, 84, 69, 78, 78, 73, 211, 84, - 69, 78, 71, 197, 84, 69, 78, 45, 84, 72, 73, 82, 84, 89, 128, 84, 69, 78, - 128, 84, 69, 206, 84, 69, 77, 80, 85, 211, 84, 69, 76, 85, 128, 84, 69, - 76, 79, 85, 211, 84, 69, 76, 76, 69, 210, 84, 69, 76, 73, 83, 72, 193, - 84, 69, 76, 69, 86, 73, 83, 73, 79, 78, 128, 84, 69, 76, 69, 83, 67, 79, - 80, 69, 128, 84, 69, 76, 69, 80, 72, 79, 78, 69, 128, 84, 69, 76, 69, 80, - 72, 79, 78, 197, 84, 69, 76, 69, 73, 65, 128, 84, 69, 76, 69, 71, 82, 65, - 80, 200, 84, 69, 75, 128, 84, 69, 73, 87, 83, 128, 84, 69, 71, 69, 72, - 128, 84, 69, 69, 84, 72, 128, 84, 69, 69, 84, 200, 84, 69, 69, 78, 83, - 128, 84, 69, 69, 69, 69, 128, 84, 69, 197, 84, 69, 68, 85, 78, 71, 128, - 84, 69, 68, 68, 217, 84, 69, 65, 82, 211, 84, 69, 65, 82, 68, 82, 79, 80, - 45, 83, 80, 79, 75, 69, 196, 84, 69, 65, 82, 68, 82, 79, 80, 45, 83, 72, - 65, 78, 75, 69, 196, 84, 69, 65, 82, 68, 82, 79, 80, 45, 66, 65, 82, 66, - 69, 196, 84, 69, 65, 82, 45, 79, 70, 198, 84, 69, 65, 67, 85, 208, 84, - 69, 45, 85, 128, 84, 69, 45, 57, 128, 84, 69, 45, 56, 128, 84, 69, 45, - 55, 128, 84, 69, 45, 54, 128, 84, 69, 45, 53, 128, 84, 69, 45, 52, 128, - 84, 69, 45, 51, 128, 84, 69, 45, 50, 128, 84, 69, 45, 49, 128, 84, 67, - 72, 69, 72, 69, 72, 128, 84, 67, 72, 69, 72, 69, 200, 84, 67, 72, 69, 72, - 128, 84, 67, 72, 69, 200, 84, 67, 72, 69, 128, 84, 195, 84, 65, 89, 128, - 84, 65, 88, 73, 128, 84, 65, 88, 128, 84, 65, 87, 69, 76, 76, 69, 77, 69, - 212, 84, 65, 87, 65, 128, 84, 65, 87, 128, 84, 65, 215, 84, 65, 86, 73, - 89, 65, 78, 73, 128, 84, 65, 86, 128, 84, 65, 214, 84, 65, 85, 82, 85, - 83, 128, 84, 65, 85, 77, 128, 84, 65, 213, 84, 65, 84, 87, 69, 69, 76, - 128, 84, 65, 84, 87, 69, 69, 204, 84, 65, 84, 84, 79, 79, 69, 196, 84, - 65, 84, 128, 84, 65, 83, 83, 73, 128, 84, 65, 83, 128, 84, 65, 82, 85, - 78, 71, 128, 84, 65, 82, 84, 65, 82, 45, 50, 128, 84, 65, 82, 84, 65, 82, - 128, 84, 65, 82, 71, 69, 84, 128, 84, 65, 81, 128, 84, 65, 80, 69, 82, - 128, 84, 65, 80, 197, 84, 65, 80, 128, 84, 65, 79, 128, 84, 65, 78, 78, - 69, 196, 84, 65, 78, 71, 69, 82, 73, 78, 69, 128, 84, 65, 78, 71, 69, 78, - 84, 128, 84, 65, 78, 71, 69, 78, 212, 84, 65, 78, 199, 84, 65, 78, 65, - 66, 65, 84, 193, 84, 65, 78, 65, 128, 84, 65, 78, 128, 84, 65, 77, 73, - 78, 71, 128, 84, 65, 77, 65, 206, 84, 65, 77, 128, 84, 65, 76, 76, 217, - 84, 65, 76, 76, 128, 84, 65, 76, 204, 84, 65, 76, 73, 78, 71, 128, 84, - 65, 76, 73, 78, 199, 84, 65, 76, 69, 78, 84, 83, 128, 84, 65, 76, 69, 78, + 73, 195, 84, 82, 65, 68, 73, 84, 73, 79, 78, 65, 204, 84, 82, 65, 68, + 197, 84, 82, 65, 67, 84, 79, 82, 128, 84, 82, 65, 67, 75, 66, 65, 76, 76, + 128, 84, 82, 65, 67, 75, 128, 84, 82, 65, 128, 84, 82, 128, 84, 79, 88, + 128, 84, 79, 87, 69, 82, 128, 84, 79, 87, 65, 82, 68, 211, 84, 79, 86, + 128, 84, 79, 85, 82, 78, 79, 73, 211, 84, 79, 85, 67, 72, 84, 79, 78, + 197, 84, 79, 85, 67, 72, 73, 78, 199, 84, 79, 85, 67, 72, 69, 211, 84, + 79, 85, 67, 200, 84, 79, 84, 65, 204, 84, 79, 84, 128, 84, 79, 83, 128, + 84, 79, 82, 84, 79, 73, 83, 197, 84, 79, 82, 83, 79, 45, 87, 65, 76, 76, + 80, 76, 65, 78, 197, 84, 79, 82, 83, 79, 45, 70, 76, 79, 79, 82, 80, 76, + 65, 78, 197, 84, 79, 82, 83, 79, 128, 84, 79, 82, 78, 65, 68, 79, 128, + 84, 79, 82, 67, 85, 76, 85, 83, 128, 84, 79, 82, 67, 85, 76, 85, 211, 84, + 79, 82, 67, 72, 128, 84, 79, 81, 128, 84, 79, 80, 66, 65, 82, 128, 84, + 79, 80, 45, 76, 73, 71, 72, 84, 69, 196, 84, 79, 80, 128, 84, 79, 208, + 84, 79, 79, 84, 72, 128, 84, 79, 79, 78, 128, 84, 79, 79, 76, 66, 79, 88, + 128, 84, 79, 78, 79, 83, 128, 84, 79, 78, 71, 85, 69, 128, 84, 79, 78, + 71, 85, 197, 84, 79, 78, 71, 128, 84, 79, 78, 69, 45, 86, 128, 84, 79, + 78, 69, 45, 83, 128, 84, 79, 78, 69, 45, 77, 128, 84, 79, 78, 69, 45, 74, + 128, 84, 79, 78, 69, 45, 71, 128, 84, 79, 78, 69, 45, 68, 128, 84, 79, + 78, 69, 45, 66, 128, 84, 79, 78, 69, 45, 56, 128, 84, 79, 78, 69, 45, 55, + 128, 84, 79, 78, 69, 45, 54, 128, 84, 79, 78, 69, 45, 53, 128, 84, 79, + 78, 69, 45, 52, 128, 84, 79, 78, 69, 45, 51, 128, 84, 79, 78, 69, 45, 50, + 128, 84, 79, 78, 69, 45, 49, 128, 84, 79, 78, 69, 128, 84, 79, 78, 65, + 204, 84, 79, 77, 80, 73, 128, 84, 79, 77, 65, 84, 79, 128, 84, 79, 76, + 79, 78, 71, 128, 84, 79, 75, 89, 207, 84, 79, 73, 76, 69, 84, 128, 84, + 79, 71, 69, 84, 72, 69, 82, 128, 84, 79, 68, 207, 84, 79, 65, 78, 68, 65, + 75, 72, 73, 65, 84, 128, 84, 79, 65, 128, 84, 79, 45, 82, 65, 128, 84, + 79, 45, 54, 128, 84, 79, 45, 53, 128, 84, 79, 45, 52, 128, 84, 79, 45, + 51, 128, 84, 79, 45, 50, 128, 84, 79, 45, 49, 128, 84, 78, 128, 84, 76, + 86, 128, 84, 76, 85, 128, 84, 76, 79, 128, 84, 76, 73, 128, 84, 76, 72, + 89, 65, 128, 84, 76, 72, 87, 69, 128, 84, 76, 72, 85, 128, 84, 76, 72, + 79, 79, 128, 84, 76, 72, 79, 128, 84, 76, 72, 73, 128, 84, 76, 72, 69, + 69, 128, 84, 76, 72, 69, 128, 84, 76, 72, 65, 128, 84, 76, 69, 69, 128, + 84, 76, 65, 128, 84, 74, 69, 128, 84, 73, 88, 128, 84, 73, 87, 82, 128, + 84, 73, 87, 78, 128, 84, 73, 87, 65, 218, 84, 73, 84, 85, 65, 69, 80, + 128, 84, 73, 84, 76, 79, 128, 84, 73, 84, 76, 207, 84, 73, 84, 193, 84, + 73, 84, 128, 84, 73, 82, 89, 65, 75, 128, 84, 73, 82, 84, 193, 84, 73, + 82, 79, 78, 73, 65, 206, 84, 73, 82, 72, 85, 84, 193, 84, 73, 82, 69, + 196, 84, 73, 82, 128, 84, 73, 210, 84, 73, 80, 80, 73, 128, 84, 73, 80, + 69, 72, 65, 128, 84, 73, 80, 128, 84, 73, 208, 84, 73, 78, 89, 128, 84, + 73, 78, 217, 84, 73, 78, 78, 69, 128, 84, 73, 78, 67, 84, 85, 82, 69, + 128, 84, 73, 78, 65, 71, 77, 65, 128, 84, 73, 77, 69, 83, 128, 84, 73, + 77, 69, 210, 84, 73, 77, 69, 128, 84, 73, 76, 84, 73, 78, 71, 128, 84, + 73, 76, 84, 73, 78, 199, 84, 73, 76, 84, 128, 84, 73, 76, 69, 83, 128, + 84, 73, 76, 68, 69, 128, 84, 73, 76, 68, 197, 84, 73, 76, 128, 84, 73, + 204, 84, 73, 75, 69, 85, 84, 45, 84, 72, 73, 69, 85, 84, 72, 128, 84, 73, + 75, 69, 85, 84, 45, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, 84, + 73, 75, 69, 85, 84, 45, 83, 73, 79, 83, 128, 84, 73, 75, 69, 85, 84, 45, + 82, 73, 69, 85, 76, 128, 84, 73, 75, 69, 85, 84, 45, 80, 73, 69, 85, 80, + 128, 84, 73, 75, 69, 85, 84, 45, 77, 73, 69, 85, 77, 128, 84, 73, 75, 69, + 85, 84, 45, 75, 73, 89, 69, 79, 75, 128, 84, 73, 75, 69, 85, 84, 45, 67, + 73, 69, 85, 67, 128, 84, 73, 75, 69, 85, 84, 45, 67, 72, 73, 69, 85, 67, + 72, 128, 84, 73, 75, 69, 85, 84, 128, 84, 73, 75, 69, 85, 212, 84, 73, + 71, 72, 84, 76, 89, 45, 67, 76, 79, 83, 69, 196, 84, 73, 71, 72, 212, 84, + 73, 71, 69, 82, 128, 84, 73, 71, 69, 210, 84, 73, 70, 73, 78, 65, 71, + 200, 84, 73, 69, 88, 128, 84, 73, 69, 80, 128, 84, 73, 197, 84, 73, 67, + 75, 69, 84, 83, 128, 84, 73, 67, 75, 69, 84, 128, 84, 73, 67, 75, 128, + 84, 73, 67, 203, 84, 73, 65, 82, 65, 128, 84, 73, 50, 128, 84, 73, 45, + 55, 128, 84, 73, 45, 54, 128, 84, 73, 45, 53, 128, 84, 73, 45, 52, 128, + 84, 73, 45, 51, 128, 84, 73, 45, 50, 128, 84, 73, 45, 49, 128, 84, 72, + 90, 128, 84, 72, 89, 79, 79, 205, 84, 72, 87, 79, 79, 128, 84, 72, 87, + 79, 128, 84, 72, 87, 73, 73, 128, 84, 72, 87, 73, 128, 84, 72, 87, 69, + 69, 128, 84, 72, 87, 65, 65, 128, 84, 72, 87, 65, 128, 84, 72, 85, 82, + 211, 84, 72, 85, 82, 73, 83, 65, 218, 84, 72, 85, 78, 71, 128, 84, 72, + 85, 78, 68, 69, 82, 83, 84, 79, 82, 77, 128, 84, 72, 85, 78, 68, 69, 82, + 128, 84, 72, 85, 78, 68, 69, 210, 84, 72, 85, 77, 66, 211, 84, 72, 85, + 77, 66, 128, 84, 72, 82, 79, 87, 73, 78, 199, 84, 72, 82, 79, 85, 71, 72, + 128, 84, 72, 82, 79, 85, 71, 200, 84, 72, 82, 69, 69, 45, 84, 72, 73, 82, + 84, 89, 128, 84, 72, 82, 69, 69, 45, 81, 85, 65, 82, 84, 69, 210, 84, 72, + 82, 69, 69, 45, 80, 69, 82, 45, 69, 205, 84, 72, 82, 69, 69, 45, 76, 73, + 78, 197, 84, 72, 82, 69, 69, 45, 76, 69, 71, 71, 69, 196, 84, 72, 82, 69, + 69, 45, 72, 85, 78, 68, 82, 69, 68, 45, 65, 78, 68, 45, 84, 87, 69, 78, + 84, 73, 69, 84, 72, 128, 84, 72, 82, 69, 69, 45, 69, 205, 84, 72, 82, 69, + 69, 45, 68, 79, 212, 84, 72, 82, 69, 69, 45, 196, 84, 72, 82, 69, 69, 45, + 67, 73, 82, 67, 76, 197, 84, 72, 82, 69, 65, 68, 128, 84, 72, 79, 85, 83, + 65, 78, 68, 83, 128, 84, 72, 79, 85, 83, 65, 78, 68, 211, 84, 72, 79, 85, + 83, 65, 78, 196, 84, 72, 79, 85, 71, 72, 212, 84, 72, 79, 85, 128, 84, + 72, 79, 82, 78, 128, 84, 72, 79, 82, 206, 84, 72, 79, 78, 71, 128, 84, + 72, 79, 77, 128, 84, 72, 79, 74, 128, 84, 72, 79, 65, 128, 84, 72, 207, + 84, 72, 73, 85, 84, 72, 128, 84, 72, 73, 84, 65, 128, 84, 72, 73, 82, 84, + 89, 45, 83, 69, 67, 79, 78, 68, 128, 84, 72, 73, 82, 84, 89, 45, 83, 69, + 67, 79, 78, 196, 84, 72, 73, 82, 84, 89, 45, 79, 78, 69, 128, 84, 72, 73, + 82, 84, 89, 45, 70, 73, 86, 197, 84, 72, 73, 82, 84, 217, 84, 72, 73, 82, + 84, 69, 69, 78, 128, 84, 72, 73, 82, 84, 69, 69, 206, 84, 72, 73, 82, 68, + 83, 128, 84, 72, 73, 82, 68, 211, 84, 72, 73, 82, 68, 45, 83, 84, 65, 71, + 197, 84, 72, 73, 82, 68, 128, 84, 72, 73, 82, 196, 84, 72, 73, 78, 75, + 73, 78, 199, 84, 72, 73, 78, 71, 128, 84, 72, 73, 73, 128, 84, 72, 73, + 71, 72, 128, 84, 72, 73, 69, 85, 84, 200, 84, 72, 73, 67, 203, 84, 72, + 73, 65, 66, 128, 84, 72, 69, 89, 128, 84, 72, 69, 84, 72, 69, 128, 84, + 72, 69, 84, 72, 128, 84, 72, 69, 84, 65, 128, 84, 72, 69, 84, 193, 84, + 72, 69, 83, 80, 73, 65, 206, 84, 72, 69, 83, 69, 79, 83, 128, 84, 72, 69, + 83, 69, 79, 211, 84, 72, 69, 211, 84, 72, 69, 82, 77, 79, 77, 69, 84, 69, + 82, 128, 84, 72, 69, 82, 77, 79, 68, 89, 78, 65, 77, 73, 67, 128, 84, 72, + 69, 82, 69, 70, 79, 82, 69, 128, 84, 72, 69, 82, 197, 84, 72, 69, 206, + 84, 72, 69, 77, 65, 84, 73, 83, 77, 79, 211, 84, 72, 69, 77, 65, 128, 84, + 72, 69, 77, 193, 84, 72, 69, 72, 128, 84, 72, 69, 200, 84, 72, 69, 65, + 128, 84, 72, 197, 84, 72, 65, 87, 128, 84, 72, 65, 78, 84, 72, 65, 75, + 72, 65, 84, 128, 84, 72, 65, 78, 78, 65, 128, 84, 72, 65, 78, 128, 84, + 72, 65, 206, 84, 72, 65, 77, 69, 68, 72, 128, 84, 72, 65, 76, 128, 84, + 72, 65, 204, 84, 72, 65, 74, 128, 84, 72, 65, 201, 84, 72, 65, 72, 65, + 78, 128, 84, 72, 65, 65, 78, 193, 84, 72, 65, 65, 76, 85, 128, 84, 72, + 45, 67, 82, 69, 197, 84, 69, 88, 84, 128, 84, 69, 88, 212, 84, 69, 88, + 128, 84, 69, 86, 73, 82, 128, 84, 69, 85, 84, 69, 85, 88, 128, 84, 69, + 85, 84, 69, 85, 87, 69, 78, 128, 84, 69, 85, 84, 128, 84, 69, 85, 78, + 128, 84, 69, 85, 65, 69, 81, 128, 84, 69, 85, 65, 69, 78, 128, 84, 69, + 85, 128, 84, 69, 84, 82, 65, 83, 73, 77, 79, 85, 128, 84, 69, 84, 82, 65, + 83, 69, 77, 69, 128, 84, 69, 84, 82, 65, 80, 76, 73, 128, 84, 69, 84, 82, + 65, 71, 82, 65, 205, 84, 69, 84, 82, 65, 70, 79, 78, 73, 65, 83, 128, 84, + 69, 84, 72, 128, 84, 69, 84, 200, 84, 69, 84, 65, 82, 84, 79, 211, 84, + 69, 84, 65, 82, 84, 73, 77, 79, 82, 73, 79, 78, 128, 84, 69, 84, 128, 84, + 69, 212, 84, 69, 83, 212, 84, 69, 83, 83, 69, 82, 65, 128, 84, 69, 83, + 83, 69, 82, 193, 84, 69, 83, 83, 65, 82, 79, 206, 84, 69, 83, 200, 84, + 69, 82, 77, 73, 78, 65, 84, 79, 82, 128, 84, 69, 82, 77, 73, 78, 65, 204, + 84, 69, 80, 128, 84, 69, 78, 85, 84, 79, 128, 84, 69, 78, 85, 128, 84, + 69, 78, 213, 84, 69, 78, 84, 72, 128, 84, 69, 78, 84, 128, 84, 69, 78, + 83, 69, 128, 84, 69, 78, 83, 197, 84, 69, 78, 83, 128, 84, 69, 78, 211, + 84, 69, 78, 78, 73, 211, 84, 69, 78, 71, 197, 84, 69, 78, 45, 84, 72, 73, + 82, 84, 89, 128, 84, 69, 78, 128, 84, 69, 206, 84, 69, 77, 80, 85, 211, + 84, 69, 77, 80, 76, 69, 128, 84, 69, 76, 85, 128, 84, 69, 76, 79, 85, + 211, 84, 69, 76, 76, 69, 210, 84, 69, 76, 73, 83, 72, 193, 84, 69, 76, + 69, 86, 73, 83, 73, 79, 78, 128, 84, 69, 76, 69, 83, 67, 79, 80, 69, 128, + 84, 69, 76, 69, 80, 72, 79, 78, 69, 128, 84, 69, 76, 69, 80, 72, 79, 78, + 197, 84, 69, 76, 69, 73, 65, 128, 84, 69, 76, 69, 71, 82, 65, 80, 200, + 84, 69, 75, 128, 84, 69, 73, 87, 83, 128, 84, 69, 71, 69, 72, 128, 84, + 69, 69, 84, 72, 128, 84, 69, 69, 84, 200, 84, 69, 69, 78, 83, 128, 84, + 69, 69, 69, 69, 128, 84, 69, 197, 84, 69, 68, 85, 78, 71, 128, 84, 69, + 68, 68, 217, 84, 69, 65, 82, 211, 84, 69, 65, 82, 68, 82, 79, 80, 45, 83, + 80, 79, 75, 69, 196, 84, 69, 65, 82, 68, 82, 79, 80, 45, 83, 72, 65, 78, + 75, 69, 196, 84, 69, 65, 82, 68, 82, 79, 80, 45, 66, 65, 82, 66, 69, 196, + 84, 69, 65, 82, 45, 79, 70, 198, 84, 69, 65, 67, 85, 208, 84, 69, 45, 85, + 128, 84, 69, 45, 57, 128, 84, 69, 45, 56, 128, 84, 69, 45, 55, 128, 84, + 69, 45, 54, 128, 84, 69, 45, 53, 128, 84, 69, 45, 52, 128, 84, 69, 45, + 51, 128, 84, 69, 45, 50, 128, 84, 69, 45, 49, 128, 84, 67, 72, 69, 72, + 69, 72, 128, 84, 67, 72, 69, 72, 69, 200, 84, 67, 72, 69, 72, 128, 84, + 67, 72, 69, 200, 84, 67, 72, 69, 128, 84, 195, 84, 65, 89, 128, 84, 65, + 88, 73, 128, 84, 65, 88, 128, 84, 65, 87, 69, 76, 76, 69, 77, 69, 212, + 84, 65, 87, 65, 128, 84, 65, 87, 128, 84, 65, 215, 84, 65, 86, 73, 89, + 65, 78, 73, 128, 84, 65, 86, 128, 84, 65, 214, 84, 65, 85, 82, 85, 83, + 128, 84, 65, 85, 77, 128, 84, 65, 213, 84, 65, 84, 87, 69, 69, 76, 128, + 84, 65, 84, 87, 69, 69, 204, 84, 65, 84, 84, 79, 79, 69, 196, 84, 65, 84, + 128, 84, 65, 83, 83, 73, 128, 84, 65, 83, 128, 84, 65, 82, 85, 78, 71, + 128, 84, 65, 82, 84, 65, 82, 45, 50, 128, 84, 65, 82, 84, 65, 82, 128, + 84, 65, 82, 71, 69, 84, 128, 84, 65, 81, 128, 84, 65, 80, 69, 82, 128, + 84, 65, 80, 197, 84, 65, 80, 128, 84, 65, 79, 128, 84, 65, 78, 78, 69, + 196, 84, 65, 78, 71, 69, 82, 73, 78, 69, 128, 84, 65, 78, 71, 69, 78, 84, + 128, 84, 65, 78, 71, 69, 78, 212, 84, 65, 78, 199, 84, 65, 78, 65, 66, + 65, 84, 193, 84, 65, 78, 65, 128, 84, 65, 78, 128, 84, 65, 77, 73, 78, + 71, 128, 84, 65, 77, 65, 206, 84, 65, 77, 128, 84, 65, 76, 76, 217, 84, + 65, 76, 76, 128, 84, 65, 76, 204, 84, 65, 76, 73, 78, 71, 128, 84, 65, + 76, 73, 78, 199, 84, 65, 76, 69, 78, 84, 83, 128, 84, 65, 76, 69, 78, 212, 84, 65, 75, 82, 201, 84, 65, 75, 72, 65, 76, 76, 85, 83, 128, 84, 65, 75, 69, 79, 85, 212, 84, 65, 75, 69, 128, 84, 65, 75, 52, 128, 84, 65, 75, 180, 84, 65, 75, 128, 84, 65, 73, 83, 89, 79, 85, 128, 84, 65, @@ -859,94 +872,96 @@ static unsigned char lexicon[] = { 66, 79, 76, 45, 49, 52, 128, 83, 89, 77, 66, 79, 76, 45, 49, 51, 128, 83, 89, 77, 66, 79, 76, 45, 49, 50, 128, 83, 89, 77, 66, 79, 76, 45, 49, 49, 128, 83, 89, 77, 66, 79, 76, 45, 49, 48, 128, 83, 89, 77, 66, 79, 76, 45, - 49, 128, 83, 89, 76, 79, 84, 201, 83, 89, 128, 83, 87, 90, 128, 83, 87, - 85, 78, 199, 83, 87, 79, 82, 68, 83, 128, 83, 87, 79, 82, 68, 128, 83, - 87, 79, 79, 128, 83, 87, 79, 128, 83, 87, 73, 82, 204, 83, 87, 73, 77, - 77, 73, 78, 71, 128, 83, 87, 73, 77, 77, 69, 82, 128, 83, 87, 73, 73, - 128, 83, 87, 73, 128, 83, 87, 71, 128, 83, 87, 69, 69, 84, 128, 83, 87, - 69, 69, 212, 83, 87, 69, 65, 84, 128, 83, 87, 69, 65, 212, 83, 87, 65, - 83, 200, 83, 87, 65, 80, 80, 73, 78, 71, 128, 83, 87, 65, 78, 128, 83, - 87, 65, 65, 128, 83, 87, 128, 83, 86, 65, 83, 84, 201, 83, 86, 65, 82, - 73, 84, 65, 128, 83, 86, 65, 82, 73, 84, 193, 83, 85, 88, 128, 83, 85, - 85, 128, 83, 85, 84, 82, 193, 83, 85, 84, 128, 83, 85, 83, 80, 69, 78, - 83, 73, 79, 206, 83, 85, 83, 72, 73, 128, 83, 85, 82, 89, 65, 128, 83, - 85, 82, 88, 128, 83, 85, 82, 82, 79, 85, 78, 68, 128, 83, 85, 82, 82, 79, - 85, 78, 196, 83, 85, 82, 70, 69, 82, 128, 83, 85, 82, 70, 65, 67, 197, - 83, 85, 82, 69, 128, 83, 85, 82, 65, 78, 71, 128, 83, 85, 82, 57, 128, - 83, 85, 82, 128, 83, 85, 210, 83, 85, 80, 82, 65, 76, 73, 78, 69, 65, - 210, 83, 85, 80, 69, 82, 86, 73, 83, 69, 128, 83, 85, 80, 69, 82, 86, 73, - 76, 76, 65, 73, 78, 128, 83, 85, 80, 69, 82, 83, 69, 84, 128, 83, 85, 80, - 69, 82, 83, 69, 212, 83, 85, 80, 69, 82, 83, 67, 82, 73, 80, 212, 83, 85, - 80, 69, 82, 73, 77, 80, 79, 83, 69, 196, 83, 85, 80, 69, 82, 72, 69, 82, - 79, 128, 83, 85, 80, 69, 82, 70, 73, 88, 69, 196, 83, 85, 80, 69, 210, - 83, 85, 80, 128, 83, 85, 79, 88, 128, 83, 85, 79, 80, 128, 83, 85, 79, - 128, 83, 85, 78, 83, 69, 212, 83, 85, 78, 82, 73, 83, 69, 128, 83, 85, - 78, 82, 73, 83, 197, 83, 85, 78, 71, 76, 65, 83, 83, 69, 83, 128, 83, 85, - 78, 71, 128, 83, 85, 78, 70, 76, 79, 87, 69, 82, 128, 83, 85, 78, 68, 65, - 78, 69, 83, 197, 83, 85, 78, 128, 83, 85, 206, 83, 85, 77, 77, 69, 82, - 128, 83, 85, 77, 77, 65, 84, 73, 79, 78, 128, 83, 85, 77, 77, 65, 84, 73, - 79, 206, 83, 85, 77, 65, 83, 72, 128, 83, 85, 77, 128, 83, 85, 76, 70, - 85, 82, 128, 83, 85, 75, 85, 78, 128, 83, 85, 75, 85, 206, 83, 85, 75, - 85, 128, 83, 85, 75, 213, 83, 85, 73, 84, 65, 66, 76, 69, 128, 83, 85, - 73, 84, 128, 83, 85, 73, 212, 83, 85, 72, 85, 82, 128, 83, 85, 69, 128, - 83, 85, 68, 50, 128, 83, 85, 68, 128, 83, 85, 67, 75, 73, 78, 199, 83, - 85, 67, 75, 69, 68, 128, 83, 85, 67, 203, 83, 85, 67, 67, 69, 69, 68, 83, - 128, 83, 85, 67, 67, 69, 69, 68, 211, 83, 85, 67, 67, 69, 69, 68, 128, - 83, 85, 67, 67, 69, 69, 196, 83, 85, 66, 85, 78, 73, 84, 128, 83, 85, 66, - 83, 84, 73, 84, 85, 84, 73, 79, 206, 83, 85, 66, 83, 84, 73, 84, 85, 84, - 69, 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 197, 83, 85, 66, 83, 69, 84, - 128, 83, 85, 66, 83, 69, 212, 83, 85, 66, 83, 67, 82, 73, 80, 212, 83, - 85, 66, 80, 85, 78, 67, 84, 73, 83, 128, 83, 85, 66, 76, 73, 78, 69, 65, - 210, 83, 85, 66, 76, 73, 77, 65, 84, 73, 79, 78, 128, 83, 85, 66, 76, 73, - 77, 65, 84, 69, 45, 51, 128, 83, 85, 66, 76, 73, 77, 65, 84, 69, 45, 50, - 128, 83, 85, 66, 76, 73, 77, 65, 84, 69, 128, 83, 85, 66, 76, 73, 77, 65, - 84, 197, 83, 85, 66, 74, 79, 73, 78, 69, 82, 128, 83, 85, 66, 74, 79, 73, - 78, 69, 196, 83, 85, 66, 74, 69, 67, 84, 128, 83, 85, 66, 73, 84, 79, - 128, 83, 85, 66, 71, 82, 79, 85, 80, 128, 83, 85, 66, 71, 82, 79, 85, - 208, 83, 85, 66, 128, 83, 85, 65, 77, 128, 83, 85, 65, 69, 84, 128, 83, - 85, 65, 69, 78, 128, 83, 85, 65, 69, 128, 83, 85, 65, 66, 128, 83, 85, - 65, 128, 83, 85, 45, 56, 128, 83, 85, 45, 55, 128, 83, 85, 45, 54, 128, - 83, 85, 45, 53, 128, 83, 85, 45, 52, 128, 83, 85, 45, 51, 128, 83, 85, - 45, 50, 128, 83, 85, 45, 49, 128, 83, 213, 83, 84, 88, 128, 83, 84, 87, - 65, 128, 83, 84, 85, 80, 65, 128, 83, 84, 85, 70, 70, 69, 196, 83, 84, - 85, 68, 89, 128, 83, 84, 85, 68, 73, 207, 83, 84, 85, 67, 75, 45, 79, 85, - 212, 83, 84, 83, 128, 83, 84, 82, 79, 78, 199, 83, 84, 82, 79, 75, 69, - 83, 128, 83, 84, 82, 79, 75, 69, 211, 83, 84, 82, 79, 75, 69, 45, 57, - 128, 83, 84, 82, 79, 75, 69, 45, 56, 128, 83, 84, 82, 79, 75, 69, 45, 55, - 128, 83, 84, 82, 79, 75, 69, 45, 54, 128, 83, 84, 82, 79, 75, 69, 45, 53, - 128, 83, 84, 82, 79, 75, 69, 45, 52, 128, 83, 84, 82, 79, 75, 69, 45, 51, - 128, 83, 84, 82, 79, 75, 69, 45, 50, 128, 83, 84, 82, 79, 75, 69, 45, 49, - 49, 128, 83, 84, 82, 79, 75, 69, 45, 49, 48, 128, 83, 84, 82, 79, 75, 69, - 45, 49, 128, 83, 84, 82, 79, 75, 197, 83, 84, 82, 73, 80, 69, 128, 83, - 84, 82, 73, 78, 71, 128, 83, 84, 82, 73, 78, 199, 83, 84, 82, 73, 75, 69, - 84, 72, 82, 79, 85, 71, 72, 128, 83, 84, 82, 73, 75, 197, 83, 84, 82, 73, - 68, 69, 128, 83, 84, 82, 73, 67, 84, 76, 217, 83, 84, 82, 69, 84, 67, 72, - 69, 196, 83, 84, 82, 69, 84, 67, 72, 128, 83, 84, 82, 69, 83, 211, 83, - 84, 82, 69, 78, 71, 84, 72, 128, 83, 84, 82, 69, 65, 77, 69, 82, 128, 83, - 84, 82, 65, 87, 66, 69, 82, 82, 89, 128, 83, 84, 82, 65, 87, 128, 83, 84, - 82, 65, 84, 85, 77, 45, 50, 128, 83, 84, 82, 65, 84, 85, 77, 128, 83, 84, - 82, 65, 84, 85, 205, 83, 84, 82, 65, 84, 73, 65, 206, 83, 84, 82, 65, 73, - 78, 69, 82, 128, 83, 84, 82, 65, 73, 71, 72, 84, 78, 69, 83, 83, 128, 83, - 84, 82, 65, 73, 71, 72, 84, 128, 83, 84, 82, 65, 73, 71, 72, 212, 83, 84, - 82, 65, 73, 70, 128, 83, 84, 82, 65, 71, 71, 73, 83, 77, 65, 84, 65, 128, - 83, 84, 79, 86, 69, 128, 83, 84, 79, 82, 69, 128, 83, 84, 79, 80, 87, 65, - 84, 67, 72, 128, 83, 84, 79, 80, 80, 73, 78, 71, 128, 83, 84, 79, 80, 80, - 65, 71, 69, 128, 83, 84, 79, 80, 128, 83, 84, 79, 208, 83, 84, 79, 78, - 69, 128, 83, 84, 79, 67, 75, 128, 83, 84, 79, 67, 203, 83, 84, 73, 82, - 82, 85, 208, 83, 84, 73, 77, 77, 69, 128, 83, 84, 73, 76, 204, 83, 84, - 73, 76, 197, 83, 84, 73, 71, 77, 65, 128, 83, 84, 73, 67, 75, 73, 78, - 199, 83, 84, 73, 67, 203, 83, 84, 69, 82, 69, 79, 128, 83, 84, 69, 80, - 128, 83, 84, 69, 78, 79, 71, 82, 65, 80, 72, 73, 195, 83, 84, 69, 77, - 128, 83, 84, 69, 65, 77, 217, 83, 84, 69, 65, 77, 73, 78, 199, 83, 84, - 69, 65, 77, 128, 83, 84, 69, 65, 205, 83, 84, 65, 86, 82, 79, 85, 128, - 83, 84, 65, 86, 82, 79, 83, 128, 83, 84, 65, 86, 82, 79, 211, 83, 84, 65, - 85, 82, 79, 83, 128, 83, 84, 65, 84, 85, 197, 83, 84, 65, 84, 73, 79, 78, - 128, 83, 84, 65, 84, 69, 82, 83, 128, 83, 84, 65, 84, 69, 128, 83, 84, - 65, 82, 212, 83, 84, 65, 82, 83, 128, 83, 84, 65, 82, 82, 69, 196, 83, - 84, 65, 82, 75, 128, 83, 84, 65, 82, 128, 83, 84, 65, 210, 83, 84, 65, - 78, 68, 83, 84, 73, 76, 76, 128, 83, 84, 65, 78, 68, 65, 82, 196, 83, 84, - 65, 78, 68, 128, 83, 84, 65, 78, 128, 83, 84, 65, 77, 80, 69, 196, 83, - 84, 65, 76, 76, 73, 79, 78, 128, 83, 84, 65, 70, 70, 128, 83, 84, 65, 70, + 49, 128, 83, 89, 76, 79, 84, 201, 83, 89, 73, 128, 83, 89, 128, 83, 87, + 90, 128, 83, 87, 85, 78, 199, 83, 87, 79, 82, 68, 83, 128, 83, 87, 79, + 82, 68, 128, 83, 87, 79, 79, 128, 83, 87, 79, 128, 83, 87, 73, 82, 204, + 83, 87, 73, 77, 83, 85, 73, 84, 128, 83, 87, 73, 77, 77, 73, 78, 71, 128, + 83, 87, 73, 77, 77, 69, 82, 128, 83, 87, 73, 73, 128, 83, 87, 73, 128, + 83, 87, 71, 128, 83, 87, 69, 69, 84, 128, 83, 87, 69, 69, 212, 83, 87, + 69, 65, 84, 128, 83, 87, 69, 65, 212, 83, 87, 65, 83, 200, 83, 87, 65, + 80, 80, 73, 78, 71, 128, 83, 87, 65, 78, 128, 83, 87, 65, 65, 128, 83, + 87, 128, 83, 86, 65, 83, 84, 201, 83, 86, 65, 82, 73, 84, 65, 128, 83, + 86, 65, 82, 73, 84, 193, 83, 85, 88, 128, 83, 85, 85, 128, 83, 85, 84, + 82, 193, 83, 85, 84, 128, 83, 85, 83, 80, 69, 78, 83, 73, 79, 206, 83, + 85, 83, 72, 73, 128, 83, 85, 82, 89, 65, 128, 83, 85, 82, 88, 128, 83, + 85, 82, 82, 79, 85, 78, 68, 128, 83, 85, 82, 82, 79, 85, 78, 196, 83, 85, + 82, 70, 69, 82, 128, 83, 85, 82, 70, 65, 67, 197, 83, 85, 82, 69, 128, + 83, 85, 82, 65, 78, 71, 128, 83, 85, 82, 57, 128, 83, 85, 82, 128, 83, + 85, 210, 83, 85, 80, 82, 65, 76, 73, 78, 69, 65, 210, 83, 85, 80, 69, 82, + 86, 73, 83, 69, 128, 83, 85, 80, 69, 82, 86, 73, 76, 76, 65, 73, 78, 128, + 83, 85, 80, 69, 82, 83, 69, 84, 128, 83, 85, 80, 69, 82, 83, 69, 212, 83, + 85, 80, 69, 82, 83, 67, 82, 73, 80, 212, 83, 85, 80, 69, 82, 73, 77, 80, + 79, 83, 69, 196, 83, 85, 80, 69, 82, 72, 69, 82, 79, 128, 83, 85, 80, 69, + 82, 70, 73, 88, 69, 196, 83, 85, 80, 69, 210, 83, 85, 80, 128, 83, 85, + 79, 88, 128, 83, 85, 79, 80, 128, 83, 85, 79, 128, 83, 85, 78, 83, 69, + 212, 83, 85, 78, 82, 73, 83, 69, 128, 83, 85, 78, 82, 73, 83, 197, 83, + 85, 78, 71, 76, 65, 83, 83, 69, 83, 128, 83, 85, 78, 71, 128, 83, 85, 78, + 70, 76, 79, 87, 69, 82, 128, 83, 85, 78, 68, 65, 78, 69, 83, 197, 83, 85, + 78, 128, 83, 85, 206, 83, 85, 77, 77, 69, 82, 128, 83, 85, 77, 77, 65, + 84, 73, 79, 78, 128, 83, 85, 77, 77, 65, 84, 73, 79, 206, 83, 85, 77, 65, + 83, 72, 128, 83, 85, 77, 128, 83, 85, 76, 70, 85, 82, 128, 83, 85, 75, + 85, 78, 128, 83, 85, 75, 85, 206, 83, 85, 75, 85, 128, 83, 85, 75, 213, + 83, 85, 73, 84, 65, 66, 76, 69, 128, 83, 85, 73, 212, 83, 85, 72, 85, 82, + 128, 83, 85, 69, 128, 83, 85, 68, 50, 128, 83, 85, 68, 128, 83, 85, 67, + 75, 73, 78, 199, 83, 85, 67, 75, 69, 68, 128, 83, 85, 67, 203, 83, 85, + 67, 67, 69, 69, 68, 83, 128, 83, 85, 67, 67, 69, 69, 68, 211, 83, 85, 67, + 67, 69, 69, 68, 128, 83, 85, 67, 67, 69, 69, 196, 83, 85, 66, 85, 78, 73, + 84, 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 73, 79, 206, 83, 85, 66, 83, + 84, 73, 84, 85, 84, 69, 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 197, 83, + 85, 66, 83, 69, 84, 128, 83, 85, 66, 83, 69, 212, 83, 85, 66, 83, 67, 82, + 73, 80, 212, 83, 85, 66, 80, 85, 78, 67, 84, 73, 83, 128, 83, 85, 66, 76, + 73, 78, 69, 65, 210, 83, 85, 66, 76, 73, 77, 65, 84, 73, 79, 78, 128, 83, + 85, 66, 76, 73, 77, 65, 84, 69, 45, 51, 128, 83, 85, 66, 76, 73, 77, 65, + 84, 69, 45, 50, 128, 83, 85, 66, 76, 73, 77, 65, 84, 69, 128, 83, 85, 66, + 76, 73, 77, 65, 84, 197, 83, 85, 66, 74, 79, 73, 78, 69, 82, 128, 83, 85, + 66, 74, 79, 73, 78, 69, 196, 83, 85, 66, 74, 69, 67, 84, 128, 83, 85, 66, + 73, 84, 79, 128, 83, 85, 66, 71, 82, 79, 85, 80, 128, 83, 85, 66, 71, 82, + 79, 85, 208, 83, 85, 66, 128, 83, 85, 65, 77, 128, 83, 85, 65, 69, 84, + 128, 83, 85, 65, 69, 78, 128, 83, 85, 65, 69, 128, 83, 85, 65, 66, 128, + 83, 85, 65, 128, 83, 85, 45, 56, 128, 83, 85, 45, 55, 128, 83, 85, 45, + 54, 128, 83, 85, 45, 53, 128, 83, 85, 45, 52, 128, 83, 85, 45, 51, 128, + 83, 85, 45, 50, 128, 83, 85, 45, 49, 128, 83, 213, 83, 84, 88, 128, 83, + 84, 87, 65, 128, 83, 84, 85, 80, 65, 128, 83, 84, 85, 70, 70, 69, 196, + 83, 84, 85, 68, 89, 128, 83, 84, 85, 68, 73, 207, 83, 84, 85, 67, 75, 45, + 79, 85, 212, 83, 84, 83, 128, 83, 84, 82, 79, 78, 199, 83, 84, 82, 79, + 75, 69, 83, 128, 83, 84, 82, 79, 75, 69, 211, 83, 84, 82, 79, 75, 69, 45, + 57, 128, 83, 84, 82, 79, 75, 69, 45, 56, 128, 83, 84, 82, 79, 75, 69, 45, + 55, 128, 83, 84, 82, 79, 75, 69, 45, 54, 128, 83, 84, 82, 79, 75, 69, 45, + 53, 128, 83, 84, 82, 79, 75, 69, 45, 52, 128, 83, 84, 82, 79, 75, 69, 45, + 51, 128, 83, 84, 82, 79, 75, 69, 45, 50, 128, 83, 84, 82, 79, 75, 69, 45, + 49, 49, 128, 83, 84, 82, 79, 75, 69, 45, 49, 48, 128, 83, 84, 82, 79, 75, + 69, 45, 49, 128, 83, 84, 82, 79, 75, 197, 83, 84, 82, 73, 80, 69, 128, + 83, 84, 82, 73, 78, 71, 128, 83, 84, 82, 73, 78, 199, 83, 84, 82, 73, 75, + 69, 84, 72, 82, 79, 85, 71, 72, 128, 83, 84, 82, 73, 75, 197, 83, 84, 82, + 73, 68, 69, 128, 83, 84, 82, 73, 67, 84, 76, 217, 83, 84, 82, 69, 84, 67, + 72, 69, 196, 83, 84, 82, 69, 84, 67, 72, 128, 83, 84, 82, 69, 83, 211, + 83, 84, 82, 69, 78, 71, 84, 72, 128, 83, 84, 82, 69, 65, 77, 69, 82, 128, + 83, 84, 82, 65, 87, 66, 69, 82, 82, 89, 128, 83, 84, 82, 65, 87, 128, 83, + 84, 82, 65, 84, 85, 77, 45, 50, 128, 83, 84, 82, 65, 84, 85, 77, 128, 83, + 84, 82, 65, 84, 85, 205, 83, 84, 82, 65, 84, 73, 65, 206, 83, 84, 82, 65, + 73, 78, 69, 82, 128, 83, 84, 82, 65, 73, 71, 72, 84, 78, 69, 83, 83, 128, + 83, 84, 82, 65, 73, 71, 72, 84, 128, 83, 84, 82, 65, 73, 71, 72, 212, 83, + 84, 82, 65, 73, 70, 128, 83, 84, 82, 65, 71, 71, 73, 83, 77, 65, 84, 65, + 128, 83, 84, 79, 86, 69, 128, 83, 84, 79, 82, 69, 128, 83, 84, 79, 80, + 87, 65, 84, 67, 72, 128, 83, 84, 79, 80, 80, 73, 78, 71, 128, 83, 84, 79, + 80, 80, 65, 71, 69, 128, 83, 84, 79, 80, 128, 83, 84, 79, 208, 83, 84, + 79, 78, 69, 128, 83, 84, 79, 67, 75, 128, 83, 84, 79, 67, 203, 83, 84, + 73, 82, 82, 85, 208, 83, 84, 73, 77, 77, 69, 128, 83, 84, 73, 76, 204, + 83, 84, 73, 76, 197, 83, 84, 73, 71, 77, 65, 128, 83, 84, 73, 67, 75, 73, + 78, 199, 83, 84, 73, 67, 203, 83, 84, 69, 84, 72, 79, 83, 67, 79, 80, 69, + 128, 83, 84, 69, 82, 69, 79, 128, 83, 84, 69, 80, 128, 83, 84, 69, 78, + 79, 71, 82, 65, 80, 72, 73, 195, 83, 84, 69, 77, 128, 83, 84, 69, 65, 77, + 217, 83, 84, 69, 65, 77, 73, 78, 199, 83, 84, 69, 65, 77, 128, 83, 84, + 69, 65, 205, 83, 84, 65, 86, 82, 79, 85, 128, 83, 84, 65, 86, 82, 79, 83, + 128, 83, 84, 65, 86, 82, 79, 211, 83, 84, 65, 85, 82, 79, 83, 128, 83, + 84, 65, 84, 85, 197, 83, 84, 65, 84, 73, 79, 78, 128, 83, 84, 65, 84, 69, + 82, 83, 128, 83, 84, 65, 84, 69, 128, 83, 84, 65, 82, 84, 73, 78, 199, + 83, 84, 65, 82, 84, 128, 83, 84, 65, 82, 212, 83, 84, 65, 82, 83, 128, + 83, 84, 65, 82, 82, 69, 196, 83, 84, 65, 82, 75, 128, 83, 84, 65, 82, + 128, 83, 84, 65, 210, 83, 84, 65, 78, 68, 83, 84, 73, 76, 76, 128, 83, + 84, 65, 78, 68, 73, 78, 199, 83, 84, 65, 78, 68, 65, 82, 196, 83, 84, 65, + 78, 68, 128, 83, 84, 65, 78, 128, 83, 84, 65, 77, 80, 69, 196, 83, 84, + 65, 76, 76, 73, 79, 78, 128, 83, 84, 65, 70, 70, 128, 83, 84, 65, 70, 198, 83, 84, 65, 68, 73, 85, 77, 128, 83, 84, 65, 67, 75, 69, 196, 83, 84, 65, 67, 67, 65, 84, 79, 128, 83, 84, 65, 67, 67, 65, 84, 73, 83, 83, 73, 77, 79, 128, 83, 84, 50, 128, 83, 83, 89, 88, 128, 83, 83, 89, 84, @@ -991,386 +1006,389 @@ static unsigned char lexicon[] = { 73, 82, 65, 76, 128, 83, 80, 73, 82, 65, 204, 83, 80, 73, 78, 69, 128, 83, 80, 73, 68, 69, 82, 217, 83, 80, 73, 68, 69, 82, 128, 83, 80, 73, 68, 69, 210, 83, 80, 73, 67, 69, 128, 83, 80, 72, 69, 82, 73, 67, 65, 204, - 83, 80, 69, 83, 77, 73, 76, 207, 83, 80, 69, 69, 68, 66, 79, 65, 84, 128, - 83, 80, 69, 69, 67, 72, 128, 83, 80, 69, 69, 67, 200, 83, 80, 69, 67, 73, - 65, 76, 128, 83, 80, 69, 65, 82, 128, 83, 80, 69, 65, 75, 73, 78, 199, - 83, 80, 69, 65, 75, 69, 82, 128, 83, 80, 69, 65, 75, 69, 210, 83, 80, 69, - 65, 75, 45, 78, 79, 45, 69, 86, 73, 204, 83, 80, 65, 84, 72, 73, 128, 83, - 80, 65, 82, 75, 76, 73, 78, 199, 83, 80, 65, 82, 75, 76, 69, 83, 128, 83, - 80, 65, 82, 75, 76, 69, 82, 128, 83, 80, 65, 82, 75, 76, 69, 128, 83, 80, - 65, 71, 72, 69, 84, 84, 73, 128, 83, 80, 65, 68, 69, 83, 128, 83, 80, 65, - 68, 197, 83, 80, 65, 67, 73, 78, 199, 83, 80, 65, 67, 197, 83, 80, 65, - 128, 83, 79, 89, 79, 77, 66, 207, 83, 79, 89, 128, 83, 79, 87, 73, 76, - 207, 83, 79, 87, 128, 83, 79, 85, 84, 72, 69, 82, 206, 83, 79, 85, 84, - 72, 45, 83, 76, 65, 86, 69, 217, 83, 79, 85, 84, 200, 83, 79, 85, 82, 67, - 69, 128, 83, 79, 85, 78, 68, 128, 83, 79, 85, 78, 196, 83, 79, 85, 78, - 65, 80, 128, 83, 79, 85, 128, 83, 79, 83, 128, 83, 79, 82, 193, 83, 79, - 81, 128, 83, 79, 79, 206, 83, 79, 78, 74, 65, 77, 128, 83, 79, 78, 71, - 128, 83, 79, 78, 128, 83, 79, 77, 80, 69, 78, 199, 83, 79, 77, 128, 83, - 79, 76, 73, 68, 85, 83, 128, 83, 79, 76, 73, 68, 85, 211, 83, 79, 76, 73, - 196, 83, 79, 76, 68, 73, 69, 82, 128, 83, 79, 72, 128, 83, 79, 71, 68, - 73, 65, 206, 83, 79, 70, 84, 87, 65, 82, 69, 45, 70, 85, 78, 67, 84, 73, - 79, 206, 83, 79, 70, 84, 78, 69, 83, 83, 128, 83, 79, 70, 84, 66, 65, 76, - 76, 128, 83, 79, 70, 212, 83, 79, 198, 83, 79, 67, 75, 83, 128, 83, 79, - 67, 73, 69, 84, 89, 128, 83, 79, 67, 67, 69, 210, 83, 79, 65, 80, 128, - 83, 79, 65, 128, 83, 79, 45, 55, 128, 83, 79, 45, 54, 128, 83, 79, 45, - 53, 128, 83, 79, 45, 52, 128, 83, 79, 45, 51, 128, 83, 79, 45, 50, 128, - 83, 79, 45, 49, 128, 83, 207, 83, 78, 79, 87, 77, 65, 78, 128, 83, 78, - 79, 87, 77, 65, 206, 83, 78, 79, 87, 70, 76, 65, 75, 69, 128, 83, 78, 79, - 87, 66, 79, 65, 82, 68, 69, 82, 128, 83, 78, 79, 87, 128, 83, 78, 79, - 215, 83, 78, 79, 85, 84, 128, 83, 78, 79, 85, 212, 83, 78, 69, 69, 90, - 73, 78, 199, 83, 78, 65, 208, 83, 78, 65, 75, 69, 128, 83, 78, 65, 75, - 197, 83, 78, 65, 73, 76, 128, 83, 78, 193, 83, 77, 79, 75, 73, 78, 199, - 83, 77, 73, 82, 75, 73, 78, 199, 83, 77, 73, 76, 73, 78, 199, 83, 77, 73, - 76, 69, 128, 83, 77, 73, 76, 197, 83, 77, 69, 65, 82, 128, 83, 77, 65, - 83, 200, 83, 77, 65, 76, 76, 69, 210, 83, 77, 65, 76, 76, 128, 83, 76, - 85, 82, 128, 83, 76, 79, 87, 76, 89, 128, 83, 76, 79, 87, 128, 83, 76, - 79, 215, 83, 76, 79, 86, 79, 128, 83, 76, 79, 212, 83, 76, 79, 80, 73, - 78, 199, 83, 76, 79, 80, 69, 128, 83, 76, 79, 65, 206, 83, 76, 73, 78, - 71, 128, 83, 76, 73, 71, 72, 84, 76, 217, 83, 76, 73, 68, 73, 78, 71, - 128, 83, 76, 73, 68, 69, 82, 128, 83, 76, 73, 67, 69, 128, 83, 76, 73, - 67, 197, 83, 76, 69, 85, 84, 200, 83, 76, 69, 69, 80, 217, 83, 76, 69, - 69, 80, 73, 78, 199, 83, 76, 69, 69, 208, 83, 76, 69, 68, 128, 83, 76, - 65, 86, 79, 78, 73, 195, 83, 76, 65, 86, 69, 128, 83, 76, 65, 83, 72, - 128, 83, 76, 65, 83, 200, 83, 76, 65, 78, 84, 69, 196, 83, 75, 87, 65, - 128, 83, 75, 87, 128, 83, 75, 85, 76, 76, 128, 83, 75, 85, 76, 204, 83, - 75, 76, 73, 82, 79, 206, 83, 75, 73, 78, 128, 83, 75, 73, 69, 82, 128, - 83, 75, 201, 83, 75, 69, 87, 69, 196, 83, 75, 65, 84, 69, 66, 79, 65, 82, - 68, 128, 83, 75, 65, 84, 69, 128, 83, 75, 128, 83, 74, 69, 128, 83, 73, - 90, 197, 83, 73, 89, 65, 209, 83, 73, 88, 84, 89, 45, 70, 79, 85, 82, 84, - 200, 83, 73, 88, 84, 89, 128, 83, 73, 88, 84, 217, 83, 73, 88, 84, 72, - 83, 128, 83, 73, 88, 84, 72, 211, 83, 73, 88, 84, 72, 128, 83, 73, 88, - 84, 69, 69, 78, 84, 72, 83, 128, 83, 73, 88, 84, 69, 69, 78, 84, 72, 128, - 83, 73, 88, 84, 69, 69, 78, 84, 200, 83, 73, 88, 84, 69, 69, 78, 128, 83, - 73, 88, 84, 69, 69, 206, 83, 73, 88, 45, 84, 72, 73, 82, 84, 89, 128, 83, - 73, 88, 45, 83, 84, 82, 73, 78, 199, 83, 73, 88, 45, 80, 69, 82, 45, 69, - 205, 83, 73, 88, 45, 76, 73, 78, 197, 83, 73, 216, 83, 73, 84, 69, 128, - 83, 73, 83, 65, 128, 83, 73, 82, 73, 78, 71, 85, 128, 83, 73, 79, 83, 45, - 84, 72, 73, 69, 85, 84, 72, 128, 83, 73, 79, 83, 45, 83, 83, 65, 78, 71, - 83, 73, 79, 83, 128, 83, 73, 79, 83, 45, 82, 73, 69, 85, 76, 128, 83, 73, - 79, 83, 45, 80, 73, 69, 85, 80, 45, 75, 73, 89, 69, 79, 75, 128, 83, 73, - 79, 83, 45, 80, 72, 73, 69, 85, 80, 72, 128, 83, 73, 79, 83, 45, 80, 65, - 78, 83, 73, 79, 83, 128, 83, 73, 79, 83, 45, 78, 73, 69, 85, 78, 128, 83, - 73, 79, 83, 45, 77, 73, 69, 85, 77, 128, 83, 73, 79, 83, 45, 75, 72, 73, - 69, 85, 75, 72, 128, 83, 73, 79, 83, 45, 75, 65, 80, 89, 69, 79, 85, 78, - 80, 73, 69, 85, 80, 128, 83, 73, 79, 83, 45, 73, 69, 85, 78, 71, 128, 83, - 73, 79, 83, 45, 72, 73, 69, 85, 72, 128, 83, 73, 79, 83, 45, 67, 73, 69, - 85, 67, 128, 83, 73, 79, 83, 45, 67, 72, 73, 69, 85, 67, 72, 128, 83, 73, - 79, 211, 83, 73, 78, 85, 83, 79, 73, 196, 83, 73, 78, 79, 76, 79, 71, 73, - 67, 65, 204, 83, 73, 78, 78, 89, 73, 73, 89, 72, 69, 128, 83, 73, 78, 75, - 73, 78, 71, 128, 83, 73, 78, 71, 76, 69, 45, 83, 72, 73, 70, 84, 45, 51, - 128, 83, 73, 78, 71, 76, 69, 45, 83, 72, 73, 70, 84, 45, 50, 128, 83, 73, - 78, 71, 76, 69, 45, 76, 73, 78, 197, 83, 73, 78, 71, 76, 69, 128, 83, 73, - 78, 71, 76, 197, 83, 73, 78, 71, 65, 65, 84, 128, 83, 73, 78, 197, 83, - 73, 78, 68, 72, 201, 83, 73, 206, 83, 73, 77, 85, 76, 84, 65, 78, 69, 79, - 85, 83, 128, 83, 73, 77, 85, 76, 84, 65, 78, 69, 79, 85, 211, 83, 73, 77, - 80, 76, 73, 70, 73, 69, 196, 83, 73, 77, 73, 76, 65, 82, 128, 83, 73, 77, - 73, 76, 65, 210, 83, 73, 77, 65, 78, 83, 73, 211, 83, 73, 77, 65, 76, 85, - 78, 71, 85, 206, 83, 73, 77, 65, 128, 83, 73, 76, 86, 69, 82, 128, 83, - 73, 76, 75, 128, 83, 73, 76, 73, 81, 85, 193, 83, 73, 76, 72, 79, 85, 69, - 84, 84, 69, 128, 83, 73, 76, 72, 79, 85, 69, 84, 84, 197, 83, 73, 76, 65, - 51, 128, 83, 73, 75, 73, 128, 83, 73, 75, 50, 128, 83, 73, 75, 178, 83, - 73, 71, 78, 83, 128, 83, 73, 71, 77, 65, 128, 83, 73, 71, 77, 193, 83, - 73, 71, 69, 204, 83, 73, 71, 52, 128, 83, 73, 71, 180, 83, 73, 71, 128, - 83, 73, 69, 69, 128, 83, 73, 68, 69, 87, 65, 89, 211, 83, 73, 68, 69, - 128, 83, 73, 68, 197, 83, 73, 68, 68, 72, 73, 128, 83, 73, 68, 68, 72, - 65, 77, 128, 83, 73, 68, 68, 72, 65, 205, 83, 73, 67, 75, 78, 69, 83, 83, - 128, 83, 73, 67, 75, 76, 69, 128, 83, 73, 66, 197, 83, 73, 65, 128, 83, - 73, 45, 54, 128, 83, 73, 45, 53, 128, 83, 73, 45, 52, 128, 83, 73, 45, - 51, 128, 83, 73, 45, 50, 128, 83, 73, 45, 49, 128, 83, 201, 83, 72, 89, - 88, 128, 83, 72, 89, 84, 128, 83, 72, 89, 82, 88, 128, 83, 72, 89, 82, - 128, 83, 72, 89, 80, 128, 83, 72, 89, 69, 128, 83, 72, 89, 65, 128, 83, - 72, 89, 128, 83, 72, 87, 79, 89, 128, 83, 72, 87, 79, 79, 128, 83, 72, - 87, 79, 128, 83, 72, 87, 73, 73, 128, 83, 72, 87, 73, 128, 83, 72, 87, - 69, 128, 83, 72, 87, 197, 83, 72, 87, 65, 65, 128, 83, 72, 87, 65, 128, - 83, 72, 86, 128, 83, 72, 85, 88, 128, 83, 72, 85, 85, 128, 83, 72, 85, - 84, 84, 76, 69, 67, 79, 67, 75, 128, 83, 72, 85, 84, 128, 83, 72, 85, 82, - 88, 128, 83, 72, 85, 82, 128, 83, 72, 85, 80, 128, 83, 72, 85, 79, 88, - 128, 83, 72, 85, 79, 80, 128, 83, 72, 85, 79, 128, 83, 72, 85, 77, 128, - 83, 72, 85, 76, 128, 83, 72, 85, 70, 70, 76, 197, 83, 72, 85, 69, 81, - 128, 83, 72, 85, 69, 78, 83, 72, 85, 69, 84, 128, 83, 72, 85, 66, 85, 82, - 128, 83, 72, 85, 65, 78, 71, 88, 73, 128, 83, 72, 85, 50, 128, 83, 72, - 85, 178, 83, 72, 85, 128, 83, 72, 84, 65, 80, 73, 67, 128, 83, 72, 84, - 65, 128, 83, 72, 82, 85, 71, 128, 83, 72, 82, 73, 78, 69, 128, 83, 72, - 82, 73, 77, 80, 128, 83, 72, 82, 73, 73, 128, 83, 72, 82, 73, 128, 83, - 72, 79, 89, 128, 83, 72, 79, 88, 128, 83, 72, 79, 87, 69, 82, 128, 83, - 72, 79, 85, 76, 68, 69, 82, 69, 196, 83, 72, 79, 85, 76, 68, 69, 210, 83, - 72, 79, 85, 128, 83, 72, 79, 84, 128, 83, 72, 79, 82, 84, 83, 128, 83, - 72, 79, 82, 84, 211, 83, 72, 79, 82, 84, 72, 65, 78, 196, 83, 72, 79, 82, - 84, 69, 78, 69, 82, 128, 83, 72, 79, 82, 84, 67, 65, 75, 69, 128, 83, 72, - 79, 82, 84, 45, 84, 87, 73, 71, 45, 89, 82, 128, 83, 72, 79, 82, 84, 45, - 84, 87, 73, 71, 45, 84, 89, 210, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, - 45, 83, 79, 204, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 79, 83, 211, - 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 78, 65, 85, 196, 83, 72, 79, - 82, 84, 45, 84, 87, 73, 71, 45, 77, 65, 68, 210, 83, 72, 79, 82, 84, 45, - 84, 87, 73, 71, 45, 72, 65, 71, 65, 76, 204, 83, 72, 79, 82, 84, 45, 84, - 87, 73, 71, 45, 66, 74, 65, 82, 75, 65, 206, 83, 72, 79, 82, 84, 45, 84, - 87, 73, 71, 45, 65, 210, 83, 72, 79, 82, 84, 128, 83, 72, 79, 82, 212, - 83, 72, 79, 81, 128, 83, 72, 79, 209, 83, 72, 79, 80, 80, 73, 78, 199, - 83, 72, 79, 80, 128, 83, 72, 79, 79, 84, 73, 78, 199, 83, 72, 79, 79, 84, - 128, 83, 72, 79, 79, 73, 128, 83, 72, 79, 79, 128, 83, 72, 79, 71, 201, - 83, 72, 79, 199, 83, 72, 79, 69, 128, 83, 72, 79, 197, 83, 72, 79, 67, - 75, 69, 196, 83, 72, 79, 65, 128, 83, 72, 79, 128, 83, 72, 73, 89, 89, - 65, 65, 76, 65, 65, 128, 83, 72, 73, 84, 65, 128, 83, 72, 73, 84, 193, - 83, 72, 73, 82, 212, 83, 72, 73, 82, 65, 69, 128, 83, 72, 73, 82, 128, - 83, 72, 73, 210, 83, 72, 73, 81, 128, 83, 72, 73, 78, 84, 207, 83, 72, - 73, 78, 73, 71, 128, 83, 72, 73, 78, 68, 193, 83, 72, 73, 206, 83, 72, - 73, 77, 65, 128, 83, 72, 73, 77, 193, 83, 72, 73, 77, 128, 83, 72, 73, - 205, 83, 72, 73, 73, 78, 128, 83, 72, 73, 73, 128, 83, 72, 73, 70, 212, - 83, 72, 73, 69, 76, 68, 128, 83, 72, 73, 68, 128, 83, 72, 73, 196, 83, - 72, 72, 65, 128, 83, 72, 72, 193, 83, 72, 69, 88, 128, 83, 72, 69, 86, - 65, 128, 83, 72, 69, 85, 88, 128, 83, 72, 69, 85, 79, 81, 128, 83, 72, - 69, 85, 65, 69, 81, 84, 85, 128, 83, 72, 69, 85, 65, 69, 81, 128, 83, 72, - 69, 85, 65, 69, 128, 83, 72, 69, 84, 128, 83, 72, 69, 212, 83, 72, 69, - 83, 72, 76, 65, 77, 128, 83, 72, 69, 83, 72, 73, 71, 128, 83, 72, 69, 83, - 72, 73, 199, 83, 72, 69, 83, 72, 50, 128, 83, 72, 69, 83, 72, 128, 83, - 72, 69, 83, 200, 83, 72, 69, 81, 69, 204, 83, 72, 69, 80, 128, 83, 72, - 69, 78, 128, 83, 72, 69, 76, 76, 128, 83, 72, 69, 76, 204, 83, 72, 69, - 76, 70, 128, 83, 72, 69, 73, 128, 83, 72, 69, 71, 57, 128, 83, 72, 69, - 69, 80, 128, 83, 72, 69, 69, 78, 85, 128, 83, 72, 69, 69, 78, 128, 83, - 72, 69, 69, 206, 83, 72, 69, 69, 128, 83, 72, 69, 45, 71, 79, 65, 84, - 128, 83, 72, 197, 83, 72, 67, 72, 79, 79, 73, 128, 83, 72, 67, 72, 65, - 128, 83, 72, 65, 89, 128, 83, 72, 65, 88, 128, 83, 72, 65, 86, 73, 89, - 65, 78, 73, 128, 83, 72, 65, 86, 73, 65, 206, 83, 72, 65, 86, 69, 196, - 83, 72, 65, 85, 128, 83, 72, 65, 84, 128, 83, 72, 65, 82, 85, 128, 83, - 72, 65, 82, 213, 83, 72, 65, 82, 80, 128, 83, 72, 65, 82, 208, 83, 72, - 65, 82, 75, 128, 83, 72, 65, 82, 65, 68, 193, 83, 72, 65, 82, 65, 128, - 83, 72, 65, 82, 50, 128, 83, 72, 65, 82, 178, 83, 72, 65, 80, 73, 78, 71, - 128, 83, 72, 65, 80, 69, 83, 128, 83, 72, 65, 80, 197, 83, 72, 65, 80, - 128, 83, 72, 65, 78, 71, 128, 83, 72, 65, 78, 128, 83, 72, 65, 206, 83, - 72, 65, 77, 82, 79, 67, 75, 128, 83, 72, 65, 76, 83, 72, 69, 76, 69, 84, - 128, 83, 72, 65, 76, 76, 79, 215, 83, 72, 65, 75, 84, 73, 128, 83, 72, - 65, 75, 73, 78, 71, 128, 83, 72, 65, 75, 73, 78, 199, 83, 72, 65, 75, 69, - 82, 128, 83, 72, 65, 75, 128, 83, 72, 65, 73, 128, 83, 72, 65, 70, 84, - 128, 83, 72, 65, 70, 212, 83, 72, 65, 68, 79, 87, 69, 196, 83, 72, 65, - 68, 69, 196, 83, 72, 65, 68, 69, 128, 83, 72, 65, 68, 68, 65, 128, 83, - 72, 65, 68, 68, 193, 83, 72, 65, 68, 128, 83, 72, 65, 196, 83, 72, 65, - 66, 54, 128, 83, 72, 65, 65, 128, 83, 72, 65, 54, 128, 83, 72, 65, 182, - 83, 72, 65, 51, 128, 83, 72, 65, 179, 83, 71, 82, 193, 83, 71, 79, 210, - 83, 71, 67, 128, 83, 71, 65, 215, 83, 71, 65, 194, 83, 71, 128, 83, 69, - 89, 75, 128, 83, 69, 88, 84, 85, 76, 193, 83, 69, 88, 84, 73, 76, 69, - 128, 83, 69, 88, 84, 65, 78, 211, 83, 69, 86, 69, 82, 65, 78, 67, 69, - 128, 83, 69, 86, 69, 78, 84, 89, 128, 83, 69, 86, 69, 78, 84, 217, 83, - 69, 86, 69, 78, 84, 72, 128, 83, 69, 86, 69, 78, 84, 69, 69, 78, 128, 83, - 69, 86, 69, 78, 84, 69, 69, 206, 83, 69, 86, 69, 78, 45, 84, 72, 73, 82, - 84, 89, 128, 83, 69, 86, 69, 206, 83, 69, 85, 88, 128, 83, 69, 85, 78, - 89, 65, 77, 128, 83, 69, 85, 65, 69, 81, 128, 83, 69, 84, 70, 79, 78, - 128, 83, 69, 83, 84, 69, 82, 84, 73, 85, 211, 83, 69, 83, 81, 85, 73, 81, - 85, 65, 68, 82, 65, 84, 69, 128, 83, 69, 83, 65, 77, 197, 83, 69, 82, 86, - 73, 67, 197, 83, 69, 82, 73, 79, 85, 211, 83, 69, 82, 73, 70, 83, 128, - 83, 69, 82, 73, 70, 211, 83, 69, 82, 73, 70, 128, 83, 69, 81, 85, 69, 78, - 84, 73, 65, 76, 128, 83, 69, 81, 85, 69, 78, 67, 197, 83, 69, 80, 84, 85, - 80, 76, 197, 83, 69, 80, 84, 69, 77, 66, 69, 82, 128, 83, 69, 80, 65, 82, - 65, 84, 79, 82, 128, 83, 69, 80, 65, 82, 65, 84, 79, 210, 83, 69, 80, 65, - 82, 65, 84, 69, 196, 83, 69, 78, 84, 79, 128, 83, 69, 78, 84, 73, 128, - 83, 69, 78, 84, 65, 71, 79, 78, 128, 83, 69, 77, 85, 78, 67, 73, 193, 83, - 69, 77, 75, 65, 84, 72, 128, 83, 69, 77, 75, 128, 83, 69, 77, 73, 86, 79, - 87, 69, 204, 83, 69, 77, 73, 83, 79, 70, 212, 83, 69, 77, 73, 83, 69, 88, - 84, 73, 76, 69, 128, 83, 69, 77, 73, 77, 73, 78, 73, 77, 193, 83, 69, 77, - 73, 68, 73, 82, 69, 67, 212, 83, 69, 77, 73, 67, 79, 76, 79, 78, 128, 83, - 69, 77, 73, 67, 79, 76, 79, 206, 83, 69, 77, 73, 67, 73, 82, 67, 85, 76, - 65, 210, 83, 69, 77, 73, 67, 73, 82, 67, 76, 197, 83, 69, 77, 73, 66, 82, - 69, 86, 73, 211, 83, 69, 77, 73, 45, 86, 79, 73, 67, 69, 196, 83, 69, 76, - 70, 73, 69, 128, 83, 69, 76, 70, 128, 83, 69, 76, 69, 78, 65, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 57, 57, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 57, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 55, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 57, 54, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 57, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 52, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 57, 51, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 57, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 49, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 57, 48, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 57, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 56, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 56, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 54, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 56, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 56, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 51, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 56, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 56, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 48, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 55, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 56, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 55, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 55, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 53, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 55, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 55, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 50, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 55, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 55, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 54, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, - 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 55, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 54, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, - 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 52, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 54, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, - 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 49, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 54, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 57, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 53, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 55, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 54, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 53, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 52, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 51, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 53, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 49, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 48, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 57, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 56, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 52, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 54, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 53, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 52, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 51, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 50, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 52, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 48, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 51, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 56, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 51, 55, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 51, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 53, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 51, 52, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 51, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 50, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 51, 49, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 51, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 50, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 50, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 55, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 50, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 50, 53, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 53, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 52, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 50, 53, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, - 53, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 49, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 50, 53, 48, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 50, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 57, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 56, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 50, 52, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, - 52, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 53, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 50, 52, 52, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 50, 52, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 50, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 49, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 50, 52, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 50, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 57, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 50, 51, 56, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 50, 51, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 54, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 53, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 50, 51, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 50, 51, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 50, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 49, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 50, 51, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 57, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 50, 50, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 50, 50, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 54, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 53, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 50, 50, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, - 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 50, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 50, 50, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 50, 50, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 57, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 50, 49, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, - 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 54, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 50, 49, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 50, 49, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 51, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 50, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 50, 49, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, - 49, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 50, 48, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 50, 48, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 55, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 54, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 50, 48, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, - 48, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 51, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 50, 48, 50, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 50, 48, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 48, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 57, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 56, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 49, 57, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 49, 57, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 53, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 52, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 49, 57, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, - 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 49, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 49, 57, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 57, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 56, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 49, 56, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, - 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 53, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 49, 56, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 56, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 50, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 49, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 49, 56, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, - 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 57, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 49, 55, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 55, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 54, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 53, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 49, 55, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, - 55, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 50, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 49, 55, 49, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 49, 55, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 57, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 49, 54, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, - 54, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 54, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 49, 54, 53, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 49, 54, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 51, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 50, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 49, 54, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 49, 54, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 49, 53, 57, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 49, 53, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 55, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 54, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 49, 53, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 49, 53, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 51, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 50, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 49, 53, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, - 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 49, 52, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 49, 52, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 55, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 54, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 49, 52, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, - 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 51, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 49, 52, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 52, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 48, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 49, 51, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, - 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 55, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 49, 51, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 51, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 52, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 51, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 49, 51, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, - 51, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 48, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 49, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 50, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 56, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 55, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 49, 50, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, - 50, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 52, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 49, 50, 51, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 49, 50, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 49, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 48, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 49, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, - 49, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 56, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 49, 49, 55, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 49, 49, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 53, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 52, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 49, 49, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 49, 49, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 49, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 48, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 49, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 57, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 56, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 49, 48, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 49, 48, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 53, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 52, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 49, 48, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, - 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 49, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 49, 48, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 128, 83, 69, 76, 69, 67, 84, 79, 210, 83, 69, 76, 69, - 67, 84, 69, 196, 83, 69, 73, 83, 77, 65, 128, 83, 69, 73, 83, 77, 193, - 83, 69, 72, 128, 83, 69, 71, 79, 76, 128, 83, 69, 71, 78, 79, 128, 83, - 69, 71, 77, 69, 78, 84, 128, 83, 69, 69, 86, 128, 83, 69, 69, 78, 85, - 128, 83, 69, 69, 78, 128, 83, 69, 69, 206, 83, 69, 69, 68, 76, 73, 78, - 71, 128, 83, 69, 69, 45, 78, 79, 45, 69, 86, 73, 204, 83, 69, 68, 78, 65, - 128, 83, 69, 67, 84, 79, 82, 128, 83, 69, 67, 84, 73, 79, 78, 128, 83, - 69, 67, 84, 73, 79, 206, 83, 69, 67, 82, 69, 84, 128, 83, 69, 67, 79, 78, - 68, 128, 83, 69, 67, 65, 78, 84, 128, 83, 69, 66, 65, 84, 66, 69, 73, - 212, 83, 69, 65, 84, 128, 83, 69, 65, 76, 128, 83, 69, 65, 71, 85, 76, - 204, 83, 69, 45, 53, 128, 83, 69, 45, 52, 128, 83, 69, 45, 51, 128, 83, - 68, 79, 78, 199, 83, 68, 128, 83, 67, 87, 65, 128, 83, 67, 82, 85, 80, - 76, 69, 128, 83, 67, 82, 79, 76, 76, 128, 83, 67, 82, 73, 80, 84, 128, - 83, 67, 82, 69, 69, 78, 128, 83, 67, 82, 69, 69, 206, 83, 67, 82, 69, 65, - 77, 73, 78, 199, 83, 67, 79, 82, 80, 73, 85, 83, 128, 83, 67, 79, 82, 80, - 73, 79, 78, 128, 83, 67, 79, 82, 69, 128, 83, 67, 79, 79, 84, 69, 82, - 128, 83, 67, 73, 83, 83, 79, 82, 83, 128, 83, 67, 73, 128, 83, 67, 72, - 87, 65, 128, 83, 67, 72, 87, 193, 83, 67, 72, 82, 79, 69, 68, 69, 82, - 128, 83, 67, 72, 79, 79, 76, 128, 83, 67, 72, 79, 79, 204, 83, 67, 72, - 79, 76, 65, 82, 128, 83, 67, 72, 69, 77, 193, 83, 67, 69, 80, 84, 69, + 83, 80, 69, 83, 77, 73, 76, 207, 83, 80, 69, 78, 212, 83, 80, 69, 69, 68, + 66, 79, 65, 84, 128, 83, 80, 69, 69, 67, 72, 128, 83, 80, 69, 69, 67, + 200, 83, 80, 69, 67, 73, 65, 76, 128, 83, 80, 69, 65, 82, 128, 83, 80, + 69, 65, 75, 73, 78, 199, 83, 80, 69, 65, 75, 69, 82, 128, 83, 80, 69, 65, + 75, 69, 210, 83, 80, 69, 65, 75, 45, 78, 79, 45, 69, 86, 73, 204, 83, 80, + 65, 84, 72, 73, 128, 83, 80, 65, 82, 75, 76, 73, 78, 199, 83, 80, 65, 82, + 75, 76, 69, 83, 128, 83, 80, 65, 82, 75, 76, 69, 82, 128, 83, 80, 65, 82, + 75, 76, 69, 128, 83, 80, 65, 71, 72, 69, 84, 84, 73, 128, 83, 80, 65, 68, + 69, 83, 128, 83, 80, 65, 68, 197, 83, 80, 65, 67, 73, 78, 199, 83, 80, + 65, 67, 197, 83, 80, 65, 128, 83, 79, 89, 79, 77, 66, 207, 83, 79, 89, + 128, 83, 79, 87, 73, 76, 207, 83, 79, 87, 128, 83, 79, 85, 84, 72, 69, + 82, 206, 83, 79, 85, 84, 72, 45, 83, 76, 65, 86, 69, 217, 83, 79, 85, 84, + 200, 83, 79, 85, 82, 67, 69, 128, 83, 79, 85, 78, 68, 128, 83, 79, 85, + 78, 196, 83, 79, 85, 78, 65, 80, 128, 83, 79, 85, 128, 83, 79, 83, 128, + 83, 79, 82, 193, 83, 79, 81, 128, 83, 79, 79, 206, 83, 79, 78, 74, 65, + 77, 128, 83, 79, 78, 71, 128, 83, 79, 78, 128, 83, 79, 77, 80, 69, 78, + 199, 83, 79, 77, 128, 83, 79, 76, 73, 68, 85, 83, 128, 83, 79, 76, 73, + 68, 85, 211, 83, 79, 76, 73, 196, 83, 79, 76, 68, 73, 69, 82, 128, 83, + 79, 72, 128, 83, 79, 71, 68, 73, 65, 206, 83, 79, 70, 84, 87, 65, 82, 69, + 45, 70, 85, 78, 67, 84, 73, 79, 206, 83, 79, 70, 84, 78, 69, 83, 83, 128, + 83, 79, 70, 84, 66, 65, 76, 76, 128, 83, 79, 70, 212, 83, 79, 198, 83, + 79, 67, 75, 83, 128, 83, 79, 67, 73, 69, 84, 89, 128, 83, 79, 67, 67, 69, + 210, 83, 79, 65, 80, 128, 83, 79, 65, 128, 83, 79, 45, 55, 128, 83, 79, + 45, 54, 128, 83, 79, 45, 53, 128, 83, 79, 45, 52, 128, 83, 79, 45, 51, + 128, 83, 79, 45, 50, 128, 83, 79, 45, 49, 128, 83, 207, 83, 78, 79, 87, + 77, 65, 78, 128, 83, 78, 79, 87, 77, 65, 206, 83, 78, 79, 87, 70, 76, 65, + 75, 69, 128, 83, 78, 79, 87, 66, 79, 65, 82, 68, 69, 82, 128, 83, 78, 79, + 87, 128, 83, 78, 79, 215, 83, 78, 79, 85, 84, 128, 83, 78, 79, 85, 212, + 83, 78, 69, 69, 90, 73, 78, 199, 83, 78, 65, 208, 83, 78, 65, 75, 69, + 128, 83, 78, 65, 75, 197, 83, 78, 65, 73, 76, 128, 83, 78, 193, 83, 77, + 79, 75, 73, 78, 199, 83, 77, 73, 82, 75, 73, 78, 199, 83, 77, 73, 76, 73, + 78, 199, 83, 77, 73, 76, 69, 128, 83, 77, 73, 76, 197, 83, 77, 69, 65, + 82, 128, 83, 77, 65, 83, 200, 83, 77, 65, 76, 76, 69, 210, 83, 77, 65, + 76, 76, 128, 83, 76, 85, 82, 128, 83, 76, 79, 87, 76, 89, 128, 83, 76, + 79, 87, 128, 83, 76, 79, 215, 83, 76, 79, 86, 79, 128, 83, 76, 79, 84, + 72, 128, 83, 76, 79, 212, 83, 76, 79, 80, 73, 78, 199, 83, 76, 79, 80, + 69, 128, 83, 76, 79, 65, 206, 83, 76, 73, 78, 71, 128, 83, 76, 73, 71, + 72, 84, 76, 217, 83, 76, 73, 68, 73, 78, 71, 128, 83, 76, 73, 68, 69, 82, + 128, 83, 76, 73, 67, 69, 128, 83, 76, 73, 67, 197, 83, 76, 69, 85, 84, + 200, 83, 76, 69, 69, 80, 217, 83, 76, 69, 69, 80, 73, 78, 199, 83, 76, + 69, 69, 208, 83, 76, 69, 68, 128, 83, 76, 65, 86, 79, 78, 73, 195, 83, + 76, 65, 86, 69, 128, 83, 76, 65, 83, 72, 128, 83, 76, 65, 83, 200, 83, + 76, 65, 78, 84, 69, 196, 83, 75, 87, 65, 128, 83, 75, 87, 128, 83, 75, + 85, 78, 75, 128, 83, 75, 85, 76, 76, 128, 83, 75, 85, 76, 204, 83, 75, + 76, 73, 82, 79, 206, 83, 75, 73, 78, 128, 83, 75, 73, 69, 82, 128, 83, + 75, 201, 83, 75, 69, 87, 69, 196, 83, 75, 65, 84, 69, 66, 79, 65, 82, 68, + 128, 83, 75, 65, 84, 69, 128, 83, 75, 128, 83, 74, 69, 128, 83, 73, 90, + 197, 83, 73, 88, 84, 89, 45, 70, 79, 85, 82, 84, 72, 83, 128, 83, 73, 88, + 84, 89, 45, 70, 79, 85, 82, 84, 72, 128, 83, 73, 88, 84, 89, 45, 70, 79, + 85, 82, 84, 200, 83, 73, 88, 84, 89, 128, 83, 73, 88, 84, 217, 83, 73, + 88, 84, 72, 83, 128, 83, 73, 88, 84, 72, 211, 83, 73, 88, 84, 72, 128, + 83, 73, 88, 84, 69, 69, 78, 84, 72, 83, 128, 83, 73, 88, 84, 69, 69, 78, + 84, 72, 45, 50, 128, 83, 73, 88, 84, 69, 69, 78, 84, 72, 45, 49, 128, 83, + 73, 88, 84, 69, 69, 78, 84, 72, 128, 83, 73, 88, 84, 69, 69, 78, 84, 200, + 83, 73, 88, 84, 69, 69, 78, 128, 83, 73, 88, 84, 69, 69, 206, 83, 73, 88, + 45, 84, 72, 73, 82, 84, 89, 128, 83, 73, 88, 45, 83, 84, 82, 73, 78, 199, + 83, 73, 88, 45, 80, 69, 82, 45, 69, 205, 83, 73, 88, 45, 76, 73, 78, 197, + 83, 73, 216, 83, 73, 84, 69, 128, 83, 73, 83, 65, 128, 83, 73, 82, 73, + 78, 71, 85, 128, 83, 73, 79, 83, 45, 84, 72, 73, 69, 85, 84, 72, 128, 83, + 73, 79, 83, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 83, 73, 79, 83, + 45, 82, 73, 69, 85, 76, 128, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, 45, + 75, 73, 89, 69, 79, 75, 128, 83, 73, 79, 83, 45, 80, 72, 73, 69, 85, 80, + 72, 128, 83, 73, 79, 83, 45, 80, 65, 78, 83, 73, 79, 83, 128, 83, 73, 79, + 83, 45, 78, 73, 69, 85, 78, 128, 83, 73, 79, 83, 45, 77, 73, 69, 85, 77, + 128, 83, 73, 79, 83, 45, 75, 72, 73, 69, 85, 75, 72, 128, 83, 73, 79, 83, + 45, 75, 65, 80, 89, 69, 79, 85, 78, 80, 73, 69, 85, 80, 128, 83, 73, 79, + 83, 45, 73, 69, 85, 78, 71, 128, 83, 73, 79, 83, 45, 72, 73, 69, 85, 72, + 128, 83, 73, 79, 83, 45, 67, 73, 69, 85, 67, 128, 83, 73, 79, 83, 45, 67, + 72, 73, 69, 85, 67, 72, 128, 83, 73, 79, 211, 83, 73, 78, 85, 83, 79, 73, + 196, 83, 73, 78, 79, 76, 79, 71, 73, 67, 65, 204, 83, 73, 78, 78, 89, 73, + 73, 89, 72, 69, 128, 83, 73, 78, 75, 73, 78, 71, 128, 83, 73, 78, 71, 76, + 69, 45, 83, 72, 73, 70, 84, 45, 51, 128, 83, 73, 78, 71, 76, 69, 45, 83, + 72, 73, 70, 84, 45, 50, 128, 83, 73, 78, 71, 76, 69, 45, 76, 73, 78, 197, + 83, 73, 78, 71, 76, 69, 128, 83, 73, 78, 71, 76, 197, 83, 73, 78, 71, 65, + 65, 84, 128, 83, 73, 78, 197, 83, 73, 78, 68, 72, 201, 83, 73, 206, 83, + 73, 77, 85, 76, 84, 65, 78, 69, 79, 85, 83, 128, 83, 73, 77, 85, 76, 84, + 65, 78, 69, 79, 85, 211, 83, 73, 77, 80, 76, 73, 70, 73, 69, 196, 83, 73, + 77, 73, 76, 65, 82, 128, 83, 73, 77, 73, 76, 65, 210, 83, 73, 77, 65, 78, + 83, 73, 211, 83, 73, 77, 65, 76, 85, 78, 71, 85, 206, 83, 73, 77, 65, + 128, 83, 73, 76, 86, 69, 82, 128, 83, 73, 76, 75, 128, 83, 73, 76, 73, + 81, 85, 193, 83, 73, 76, 72, 79, 85, 69, 84, 84, 69, 128, 83, 73, 76, 72, + 79, 85, 69, 84, 84, 197, 83, 73, 76, 65, 51, 128, 83, 73, 75, 73, 128, + 83, 73, 75, 50, 128, 83, 73, 75, 178, 83, 73, 71, 78, 83, 128, 83, 73, + 71, 77, 65, 128, 83, 73, 71, 77, 193, 83, 73, 71, 69, 204, 83, 73, 71, + 52, 128, 83, 73, 71, 180, 83, 73, 71, 128, 83, 73, 69, 69, 128, 83, 73, + 68, 69, 87, 65, 89, 211, 83, 73, 68, 69, 128, 83, 73, 68, 197, 83, 73, + 68, 68, 72, 73, 128, 83, 73, 68, 68, 72, 65, 77, 128, 83, 73, 68, 68, 72, + 65, 205, 83, 73, 67, 75, 78, 69, 83, 83, 128, 83, 73, 67, 75, 76, 69, + 128, 83, 73, 66, 197, 83, 73, 65, 128, 83, 73, 45, 54, 128, 83, 73, 45, + 53, 128, 83, 73, 45, 52, 128, 83, 73, 45, 51, 128, 83, 73, 45, 50, 128, + 83, 73, 45, 49, 128, 83, 201, 83, 72, 89, 88, 128, 83, 72, 89, 84, 128, + 83, 72, 89, 82, 88, 128, 83, 72, 89, 82, 128, 83, 72, 89, 80, 128, 83, + 72, 89, 69, 128, 83, 72, 89, 65, 128, 83, 72, 89, 128, 83, 72, 87, 79, + 89, 128, 83, 72, 87, 79, 79, 128, 83, 72, 87, 79, 128, 83, 72, 87, 73, + 73, 128, 83, 72, 87, 73, 128, 83, 72, 87, 69, 128, 83, 72, 87, 197, 83, + 72, 87, 65, 65, 128, 83, 72, 87, 65, 128, 83, 72, 86, 128, 83, 72, 85, + 88, 128, 83, 72, 85, 85, 128, 83, 72, 85, 84, 84, 76, 69, 67, 79, 67, 75, + 128, 83, 72, 85, 84, 128, 83, 72, 85, 82, 88, 128, 83, 72, 85, 82, 128, + 83, 72, 85, 80, 128, 83, 72, 85, 79, 88, 128, 83, 72, 85, 79, 80, 128, + 83, 72, 85, 79, 128, 83, 72, 85, 77, 128, 83, 72, 85, 76, 128, 83, 72, + 85, 70, 70, 76, 197, 83, 72, 85, 69, 81, 128, 83, 72, 85, 69, 78, 83, 72, + 85, 69, 84, 128, 83, 72, 85, 66, 85, 82, 128, 83, 72, 85, 65, 78, 71, 88, + 73, 128, 83, 72, 85, 50, 128, 83, 72, 85, 178, 83, 72, 85, 128, 83, 72, + 84, 65, 80, 73, 67, 128, 83, 72, 84, 65, 128, 83, 72, 82, 85, 71, 128, + 83, 72, 82, 73, 78, 69, 128, 83, 72, 82, 73, 77, 80, 128, 83, 72, 82, 73, + 73, 128, 83, 72, 82, 73, 128, 83, 72, 79, 89, 128, 83, 72, 79, 88, 128, + 83, 72, 79, 87, 69, 82, 128, 83, 72, 79, 85, 76, 68, 69, 82, 69, 196, 83, + 72, 79, 85, 76, 68, 69, 210, 83, 72, 79, 85, 128, 83, 72, 79, 84, 128, + 83, 72, 79, 82, 84, 83, 128, 83, 72, 79, 82, 84, 211, 83, 72, 79, 82, 84, + 72, 65, 78, 196, 83, 72, 79, 82, 84, 69, 78, 69, 82, 128, 83, 72, 79, 82, + 84, 67, 65, 75, 69, 128, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 89, + 82, 128, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 84, 89, 210, 83, 72, + 79, 82, 84, 45, 84, 87, 73, 71, 45, 83, 79, 204, 83, 72, 79, 82, 84, 45, + 84, 87, 73, 71, 45, 79, 83, 211, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, + 45, 78, 65, 85, 196, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 77, 65, + 68, 210, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 72, 65, 71, 65, 76, + 204, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 66, 74, 65, 82, 75, 65, + 206, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 65, 210, 83, 72, 79, 82, + 84, 128, 83, 72, 79, 82, 212, 83, 72, 79, 81, 128, 83, 72, 79, 209, 83, + 72, 79, 80, 80, 73, 78, 199, 83, 72, 79, 80, 128, 83, 72, 79, 79, 84, 73, + 78, 199, 83, 72, 79, 79, 84, 128, 83, 72, 79, 79, 73, 128, 83, 72, 79, + 79, 128, 83, 72, 79, 71, 201, 83, 72, 79, 199, 83, 72, 79, 69, 83, 128, + 83, 72, 79, 69, 128, 83, 72, 79, 197, 83, 72, 79, 67, 75, 69, 196, 83, + 72, 79, 65, 128, 83, 72, 79, 128, 83, 72, 73, 89, 89, 65, 65, 76, 65, 65, + 128, 83, 72, 73, 84, 65, 128, 83, 72, 73, 84, 193, 83, 72, 73, 82, 212, + 83, 72, 73, 82, 65, 69, 128, 83, 72, 73, 82, 128, 83, 72, 73, 210, 83, + 72, 73, 81, 128, 83, 72, 73, 78, 84, 207, 83, 72, 73, 78, 73, 71, 128, + 83, 72, 73, 78, 68, 193, 83, 72, 73, 206, 83, 72, 73, 77, 65, 128, 83, + 72, 73, 77, 193, 83, 72, 73, 77, 128, 83, 72, 73, 205, 83, 72, 73, 73, + 78, 128, 83, 72, 73, 73, 128, 83, 72, 73, 70, 212, 83, 72, 73, 69, 76, + 68, 128, 83, 72, 73, 68, 128, 83, 72, 73, 196, 83, 72, 72, 65, 128, 83, + 72, 72, 193, 83, 72, 69, 88, 128, 83, 72, 69, 86, 65, 128, 83, 72, 69, + 85, 88, 128, 83, 72, 69, 85, 79, 81, 128, 83, 72, 69, 85, 65, 69, 81, 84, + 85, 128, 83, 72, 69, 85, 65, 69, 81, 128, 83, 72, 69, 85, 65, 69, 128, + 83, 72, 69, 84, 128, 83, 72, 69, 212, 83, 72, 69, 83, 72, 76, 65, 77, + 128, 83, 72, 69, 83, 72, 73, 71, 128, 83, 72, 69, 83, 72, 73, 199, 83, + 72, 69, 83, 72, 50, 128, 83, 72, 69, 83, 72, 128, 83, 72, 69, 83, 200, + 83, 72, 69, 81, 69, 204, 83, 72, 69, 80, 128, 83, 72, 69, 78, 128, 83, + 72, 69, 76, 76, 128, 83, 72, 69, 76, 204, 83, 72, 69, 76, 70, 128, 83, + 72, 69, 73, 128, 83, 72, 69, 71, 57, 128, 83, 72, 69, 69, 80, 128, 83, + 72, 69, 69, 78, 85, 128, 83, 72, 69, 69, 78, 128, 83, 72, 69, 69, 206, + 83, 72, 69, 69, 128, 83, 72, 69, 45, 71, 79, 65, 84, 128, 83, 72, 197, + 83, 72, 67, 72, 79, 79, 73, 128, 83, 72, 67, 72, 65, 128, 83, 72, 65, 89, + 128, 83, 72, 65, 88, 128, 83, 72, 65, 86, 73, 89, 65, 78, 73, 128, 83, + 72, 65, 86, 73, 65, 206, 83, 72, 65, 86, 69, 196, 83, 72, 65, 85, 128, + 83, 72, 65, 84, 128, 83, 72, 65, 82, 85, 128, 83, 72, 65, 82, 213, 83, + 72, 65, 82, 80, 128, 83, 72, 65, 82, 208, 83, 72, 65, 82, 75, 128, 83, + 72, 65, 82, 65, 68, 193, 83, 72, 65, 82, 65, 128, 83, 72, 65, 82, 50, + 128, 83, 72, 65, 82, 178, 83, 72, 65, 80, 73, 78, 71, 128, 83, 72, 65, + 80, 69, 83, 128, 83, 72, 65, 80, 197, 83, 72, 65, 80, 128, 83, 72, 65, + 78, 71, 128, 83, 72, 65, 78, 128, 83, 72, 65, 206, 83, 72, 65, 77, 82, + 79, 67, 75, 128, 83, 72, 65, 76, 83, 72, 69, 76, 69, 84, 128, 83, 72, 65, + 76, 76, 79, 215, 83, 72, 65, 75, 84, 73, 128, 83, 72, 65, 75, 73, 78, 71, + 128, 83, 72, 65, 75, 73, 78, 199, 83, 72, 65, 75, 69, 82, 128, 83, 72, + 65, 75, 128, 83, 72, 65, 73, 128, 83, 72, 65, 70, 84, 128, 83, 72, 65, + 70, 212, 83, 72, 65, 68, 79, 87, 69, 196, 83, 72, 65, 68, 69, 196, 83, + 72, 65, 68, 69, 128, 83, 72, 65, 68, 68, 65, 128, 83, 72, 65, 68, 68, + 193, 83, 72, 65, 68, 128, 83, 72, 65, 196, 83, 72, 65, 66, 54, 128, 83, + 72, 65, 65, 128, 83, 72, 65, 54, 128, 83, 72, 65, 182, 83, 72, 65, 51, + 128, 83, 72, 65, 179, 83, 71, 82, 193, 83, 71, 79, 210, 83, 71, 67, 128, + 83, 71, 65, 215, 83, 71, 65, 194, 83, 71, 128, 83, 69, 89, 75, 128, 83, + 69, 88, 84, 85, 76, 193, 83, 69, 88, 84, 73, 76, 69, 128, 83, 69, 88, 84, + 65, 78, 211, 83, 69, 86, 69, 82, 65, 78, 67, 69, 128, 83, 69, 86, 69, 78, + 84, 89, 128, 83, 69, 86, 69, 78, 84, 217, 83, 69, 86, 69, 78, 84, 72, + 128, 83, 69, 86, 69, 78, 84, 69, 69, 78, 128, 83, 69, 86, 69, 78, 84, 69, + 69, 206, 83, 69, 86, 69, 78, 45, 84, 72, 73, 82, 84, 89, 128, 83, 69, 86, + 69, 206, 83, 69, 85, 88, 128, 83, 69, 85, 78, 89, 65, 77, 128, 83, 69, + 85, 65, 69, 81, 128, 83, 69, 84, 70, 79, 78, 128, 83, 69, 83, 84, 69, 82, + 84, 73, 85, 211, 83, 69, 83, 81, 85, 73, 81, 85, 65, 68, 82, 65, 84, 69, + 128, 83, 69, 83, 65, 77, 197, 83, 69, 82, 86, 73, 67, 197, 83, 69, 82, + 73, 79, 85, 211, 83, 69, 82, 73, 70, 83, 128, 83, 69, 82, 73, 70, 211, + 83, 69, 82, 73, 70, 128, 83, 69, 81, 85, 69, 78, 84, 73, 65, 76, 128, 83, + 69, 81, 85, 69, 78, 67, 197, 83, 69, 80, 84, 85, 80, 76, 197, 83, 69, 80, + 84, 69, 77, 66, 69, 82, 128, 83, 69, 80, 65, 82, 65, 84, 79, 82, 128, 83, + 69, 80, 65, 82, 65, 84, 79, 210, 83, 69, 80, 65, 82, 65, 84, 69, 196, 83, + 69, 78, 84, 79, 128, 83, 69, 78, 84, 73, 128, 83, 69, 78, 84, 65, 71, 79, + 78, 128, 83, 69, 77, 85, 78, 67, 73, 193, 83, 69, 77, 75, 65, 84, 72, + 128, 83, 69, 77, 75, 128, 83, 69, 77, 73, 86, 79, 87, 69, 204, 83, 69, + 77, 73, 83, 79, 70, 212, 83, 69, 77, 73, 83, 69, 88, 84, 73, 76, 69, 128, + 83, 69, 77, 73, 77, 73, 78, 73, 77, 193, 83, 69, 77, 73, 68, 73, 82, 69, + 67, 212, 83, 69, 77, 73, 67, 79, 76, 79, 78, 128, 83, 69, 77, 73, 67, 79, + 76, 79, 206, 83, 69, 77, 73, 67, 73, 82, 67, 85, 76, 65, 210, 83, 69, 77, + 73, 67, 73, 82, 67, 76, 197, 83, 69, 77, 73, 66, 82, 69, 86, 73, 211, 83, + 69, 77, 73, 45, 86, 79, 73, 67, 69, 196, 83, 69, 76, 70, 73, 69, 128, 83, + 69, 76, 70, 128, 83, 69, 76, 69, 78, 65, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 57, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 56, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 57, 55, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 57, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 53, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 57, 52, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 57, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 50, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 57, 49, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 57, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 56, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 56, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 55, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 56, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 56, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 52, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 56, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 56, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 49, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 56, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 57, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 55, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 55, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 54, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 55, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 55, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 51, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 55, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 55, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 48, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, + 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 56, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 54, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, + 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 53, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 54, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, + 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 50, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 54, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, + 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 53, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 56, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 55, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 53, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 53, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 52, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 53, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 50, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 49, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 53, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 57, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 52, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 55, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 54, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 52, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 52, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 51, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 52, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 49, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 48, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 57, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 51, 56, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 51, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 54, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 51, 53, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 51, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 51, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 51, 50, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 51, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 48, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 50, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 56, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 50, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 50, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 54, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 53, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 50, 53, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, + 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 50, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 50, 53, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 50, 53, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 57, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 50, 52, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, + 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 54, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 50, 52, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 50, 52, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 51, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 50, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 50, 52, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, + 52, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 50, 51, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 50, 51, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 55, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 54, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 50, 51, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, + 51, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 51, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 50, 51, 50, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 50, 51, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 48, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 50, 50, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, + 50, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 55, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 50, 50, 54, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 50, 50, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 52, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 51, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 50, 50, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 50, 50, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 48, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 50, 49, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 56, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 55, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 50, 49, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 50, 49, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 52, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 51, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 50, 49, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, + 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 48, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 50, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 50, 48, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 56, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 55, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 50, 48, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, + 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 52, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 50, 48, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 50, 48, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 49, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 48, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 50, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 57, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 49, 57, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, + 57, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 54, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 49, 57, 53, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 49, 57, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 51, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 50, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 49, 57, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 49, 57, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 49, 56, 57, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 49, 56, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 55, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 54, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 49, 56, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 49, 56, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 51, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 50, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 49, 56, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, + 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 49, 55, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 49, 55, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 55, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 54, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 49, 55, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, + 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 51, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 49, 55, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 49, 55, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 48, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 49, 54, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, + 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 55, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 49, 54, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 49, 54, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 52, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 51, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 49, 54, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, + 54, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 48, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 49, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 49, 53, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 56, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 55, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 49, 53, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, + 53, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 52, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 49, 53, 51, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 49, 53, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 49, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 48, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 49, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, + 52, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 56, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 49, 52, 55, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 49, 52, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 53, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 52, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 49, 52, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 49, 52, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 49, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 48, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 49, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 57, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 56, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 49, 51, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 49, 51, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 53, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 52, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 49, 51, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, + 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 49, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 49, 51, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 49, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 57, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 56, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 49, 50, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, + 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 53, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 49, 50, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 49, 50, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 50, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 49, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 49, 50, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, + 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 57, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 49, 49, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 49, 49, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 54, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 53, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 49, 49, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, + 49, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 50, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 49, 49, 49, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 49, 49, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 57, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 49, 48, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, + 48, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 54, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 49, 48, 53, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 49, 48, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 51, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 50, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 49, 48, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 49, 48, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 128, + 83, 69, 76, 69, 67, 84, 79, 210, 83, 69, 76, 69, 67, 84, 69, 196, 83, 69, + 73, 83, 77, 65, 128, 83, 69, 73, 83, 77, 193, 83, 69, 72, 128, 83, 69, + 71, 79, 76, 128, 83, 69, 71, 78, 79, 128, 83, 69, 71, 77, 69, 78, 84, + 128, 83, 69, 69, 86, 128, 83, 69, 69, 78, 85, 128, 83, 69, 69, 78, 128, + 83, 69, 69, 206, 83, 69, 69, 68, 76, 73, 78, 71, 128, 83, 69, 69, 45, 78, + 79, 45, 69, 86, 73, 204, 83, 69, 68, 78, 65, 128, 83, 69, 67, 84, 79, 82, + 128, 83, 69, 67, 84, 73, 79, 78, 128, 83, 69, 67, 84, 73, 79, 206, 83, + 69, 67, 82, 69, 84, 128, 83, 69, 67, 65, 78, 84, 128, 83, 69, 66, 65, 84, + 66, 69, 73, 212, 83, 69, 65, 84, 128, 83, 69, 65, 76, 128, 83, 69, 65, + 71, 85, 76, 204, 83, 69, 45, 53, 128, 83, 69, 45, 52, 128, 83, 69, 45, + 51, 128, 83, 68, 79, 78, 199, 83, 68, 128, 83, 67, 87, 65, 128, 83, 67, + 82, 85, 80, 76, 69, 128, 83, 67, 82, 79, 76, 76, 128, 83, 67, 82, 73, 80, + 84, 128, 83, 67, 82, 69, 69, 78, 128, 83, 67, 82, 69, 69, 206, 83, 67, + 82, 69, 65, 77, 73, 78, 199, 83, 67, 79, 82, 80, 73, 85, 83, 128, 83, 67, + 79, 82, 80, 73, 79, 78, 128, 83, 67, 79, 82, 69, 128, 83, 67, 79, 79, 84, + 69, 82, 128, 83, 67, 73, 83, 83, 79, 82, 83, 128, 83, 67, 73, 128, 83, + 67, 72, 87, 65, 128, 83, 67, 72, 87, 193, 83, 67, 72, 82, 79, 69, 68, 69, + 82, 128, 83, 67, 72, 79, 79, 76, 128, 83, 67, 72, 79, 79, 204, 83, 67, + 72, 79, 76, 65, 82, 128, 83, 67, 72, 69, 77, 193, 83, 67, 69, 80, 84, 69, 210, 83, 67, 65, 82, 70, 128, 83, 67, 65, 78, 68, 73, 67, 85, 83, 128, 83, 67, 65, 78, 68, 73, 67, 85, 211, 83, 67, 65, 206, 83, 67, 65, 76, 69, 83, 128, 83, 66, 85, 194, 83, 66, 82, 85, 204, 83, 65, 89, 73, 83, 201, @@ -1385,144 +1403,146 @@ static unsigned char lexicon[] = { 128, 83, 65, 83, 72, 128, 83, 65, 83, 65, 75, 128, 83, 65, 82, 73, 128, 83, 65, 82, 193, 83, 65, 82, 128, 83, 65, 81, 128, 83, 65, 80, 65, 128, 83, 65, 78, 89, 79, 79, 71, 193, 83, 65, 78, 89, 65, 75, 193, 83, 65, 78, - 84, 73, 73, 77, 85, 128, 83, 65, 78, 78, 89, 65, 128, 83, 65, 78, 71, 65, - 50, 128, 83, 65, 78, 68, 87, 73, 67, 72, 128, 83, 65, 78, 68, 72, 201, - 83, 65, 78, 68, 65, 76, 128, 83, 65, 78, 65, 72, 128, 83, 65, 78, 128, - 83, 65, 77, 89, 79, 203, 83, 65, 77, 86, 65, 84, 128, 83, 65, 77, 80, 73, - 128, 83, 65, 77, 80, 72, 65, 79, 128, 83, 65, 77, 75, 65, 128, 83, 65, - 77, 69, 75, 72, 128, 83, 65, 77, 69, 75, 200, 83, 65, 77, 66, 65, 128, - 83, 65, 77, 65, 82, 73, 84, 65, 206, 83, 65, 77, 128, 83, 65, 76, 84, 73, - 82, 69, 128, 83, 65, 76, 84, 73, 76, 76, 79, 128, 83, 65, 76, 84, 45, 50, - 128, 83, 65, 76, 84, 128, 83, 65, 76, 212, 83, 65, 76, 76, 65, 76, 76, - 65, 72, 79, 213, 83, 65, 76, 76, 193, 83, 65, 76, 65, 205, 83, 65, 76, - 65, 68, 128, 83, 65, 76, 65, 128, 83, 65, 76, 45, 65, 77, 77, 79, 78, 73, - 65, 67, 128, 83, 65, 76, 128, 83, 65, 75, 84, 65, 128, 83, 65, 75, 79, - 84, 128, 83, 65, 75, 73, 78, 128, 83, 65, 75, 72, 193, 83, 65, 75, 69, - 85, 65, 69, 128, 83, 65, 75, 197, 83, 65, 74, 68, 65, 72, 128, 83, 65, - 73, 76, 66, 79, 65, 84, 128, 83, 65, 73, 76, 128, 83, 65, 73, 75, 85, 82, - 85, 128, 83, 65, 72, 128, 83, 65, 71, 73, 84, 84, 65, 82, 73, 85, 83, - 128, 83, 65, 71, 65, 128, 83, 65, 71, 128, 83, 65, 199, 83, 65, 70, 72, - 65, 128, 83, 65, 70, 69, 84, 217, 83, 65, 68, 72, 69, 128, 83, 65, 68, - 72, 197, 83, 65, 68, 69, 128, 83, 65, 68, 128, 83, 65, 196, 83, 65, 67, - 82, 73, 70, 73, 67, 73, 65, 204, 83, 65, 65, 73, 128, 83, 65, 65, 68, 72, - 85, 128, 83, 65, 45, 73, 128, 83, 65, 45, 56, 128, 83, 65, 45, 55, 128, - 83, 65, 45, 54, 128, 83, 65, 45, 53, 128, 83, 65, 45, 52, 128, 83, 65, - 45, 51, 128, 83, 65, 45, 50, 128, 83, 65, 45, 49, 128, 83, 48, 52, 54, - 128, 83, 48, 52, 53, 128, 83, 48, 52, 52, 128, 83, 48, 52, 51, 128, 83, - 48, 52, 50, 128, 83, 48, 52, 49, 128, 83, 48, 52, 48, 128, 83, 48, 51, - 57, 128, 83, 48, 51, 56, 128, 83, 48, 51, 55, 128, 83, 48, 51, 54, 128, - 83, 48, 51, 53, 65, 128, 83, 48, 51, 53, 128, 83, 48, 51, 52, 128, 83, - 48, 51, 51, 128, 83, 48, 51, 50, 128, 83, 48, 51, 49, 128, 83, 48, 51, - 48, 128, 83, 48, 50, 57, 128, 83, 48, 50, 56, 128, 83, 48, 50, 55, 128, - 83, 48, 50, 54, 66, 128, 83, 48, 50, 54, 65, 128, 83, 48, 50, 54, 128, - 83, 48, 50, 53, 128, 83, 48, 50, 52, 128, 83, 48, 50, 51, 128, 83, 48, - 50, 50, 128, 83, 48, 50, 49, 128, 83, 48, 50, 48, 128, 83, 48, 49, 57, - 128, 83, 48, 49, 56, 128, 83, 48, 49, 55, 65, 128, 83, 48, 49, 55, 128, - 83, 48, 49, 54, 128, 83, 48, 49, 53, 128, 83, 48, 49, 52, 66, 128, 83, - 48, 49, 52, 65, 128, 83, 48, 49, 52, 128, 83, 48, 49, 51, 128, 83, 48, - 49, 50, 128, 83, 48, 49, 49, 128, 83, 48, 49, 48, 128, 83, 48, 48, 57, - 128, 83, 48, 48, 56, 128, 83, 48, 48, 55, 128, 83, 48, 48, 54, 65, 128, - 83, 48, 48, 54, 128, 83, 48, 48, 53, 128, 83, 48, 48, 52, 128, 83, 48, - 48, 51, 128, 83, 48, 48, 50, 65, 128, 83, 48, 48, 50, 128, 83, 48, 48, - 49, 128, 83, 45, 87, 128, 83, 45, 83, 72, 65, 80, 69, 196, 82, 89, 89, - 128, 82, 89, 88, 128, 82, 89, 84, 128, 82, 89, 82, 88, 128, 82, 89, 82, - 128, 82, 89, 80, 128, 82, 87, 79, 79, 128, 82, 87, 79, 128, 82, 87, 73, - 73, 128, 82, 87, 73, 128, 82, 87, 69, 69, 128, 82, 87, 69, 128, 82, 87, - 65, 72, 65, 128, 82, 87, 65, 65, 128, 82, 87, 65, 128, 82, 85, 88, 128, - 82, 85, 85, 66, 85, 82, 85, 128, 82, 85, 85, 128, 82, 85, 84, 128, 82, - 85, 83, 83, 73, 65, 206, 82, 85, 83, 73, 128, 82, 85, 82, 88, 128, 82, - 85, 82, 128, 82, 85, 80, 73, 73, 128, 82, 85, 80, 69, 197, 82, 85, 80, - 128, 82, 85, 79, 88, 128, 82, 85, 79, 80, 128, 82, 85, 79, 128, 82, 85, - 78, 79, 85, 84, 128, 82, 85, 78, 78, 73, 78, 199, 82, 85, 78, 78, 69, 82, - 128, 82, 85, 78, 73, 195, 82, 85, 78, 128, 82, 85, 77, 201, 82, 85, 77, - 65, 201, 82, 85, 77, 128, 82, 85, 205, 82, 85, 76, 69, 82, 128, 82, 85, - 76, 69, 45, 68, 69, 76, 65, 89, 69, 68, 128, 82, 85, 76, 69, 128, 82, 85, - 76, 65, 73, 128, 82, 85, 75, 75, 65, 75, 72, 65, 128, 82, 85, 73, 83, - 128, 82, 85, 71, 66, 217, 82, 85, 68, 73, 77, 69, 78, 84, 193, 82, 85, - 66, 76, 197, 82, 85, 194, 82, 85, 65, 128, 82, 85, 45, 54, 128, 82, 85, - 45, 53, 128, 82, 85, 45, 52, 128, 82, 85, 45, 51, 128, 82, 85, 45, 50, - 128, 82, 85, 45, 49, 128, 82, 84, 72, 65, 78, 199, 82, 84, 65, 71, 83, - 128, 82, 84, 65, 71, 211, 82, 82, 89, 88, 128, 82, 82, 89, 84, 128, 82, - 82, 89, 82, 88, 128, 82, 82, 89, 82, 128, 82, 82, 89, 80, 128, 82, 82, - 85, 88, 128, 82, 82, 85, 85, 128, 82, 82, 85, 84, 128, 82, 82, 85, 82, - 88, 128, 82, 82, 85, 82, 128, 82, 82, 85, 80, 128, 82, 82, 85, 79, 88, - 128, 82, 82, 85, 79, 128, 82, 82, 85, 128, 82, 82, 82, 65, 128, 82, 82, - 79, 88, 128, 82, 82, 79, 84, 128, 82, 82, 79, 80, 128, 82, 82, 79, 79, - 128, 82, 82, 79, 128, 82, 82, 73, 73, 128, 82, 82, 73, 128, 82, 82, 69, - 88, 128, 82, 82, 69, 84, 128, 82, 82, 69, 80, 128, 82, 82, 69, 72, 128, - 82, 82, 69, 200, 82, 82, 69, 69, 128, 82, 82, 69, 128, 82, 82, 65, 88, - 128, 82, 82, 65, 85, 128, 82, 82, 65, 73, 128, 82, 82, 65, 65, 128, 82, - 79, 87, 66, 79, 65, 84, 128, 82, 79, 85, 78, 68, 69, 196, 82, 79, 85, 78, - 68, 45, 84, 73, 80, 80, 69, 196, 82, 79, 84, 85, 78, 68, 65, 128, 82, 79, - 84, 65, 84, 73, 79, 78, 83, 128, 82, 79, 84, 65, 84, 73, 79, 78, 45, 87, - 65, 76, 76, 80, 76, 65, 78, 197, 82, 79, 84, 65, 84, 73, 79, 78, 45, 70, - 76, 79, 79, 82, 80, 76, 65, 78, 197, 82, 79, 84, 65, 84, 73, 79, 78, 128, - 82, 79, 84, 65, 84, 73, 79, 206, 82, 79, 84, 65, 84, 69, 196, 82, 79, 83, - 72, 128, 82, 79, 83, 69, 84, 84, 69, 128, 82, 79, 83, 69, 128, 82, 79, - 79, 84, 128, 82, 79, 79, 83, 84, 69, 82, 128, 82, 79, 79, 77, 128, 82, - 79, 79, 75, 128, 82, 79, 79, 70, 128, 82, 79, 77, 65, 78, 73, 65, 206, - 82, 79, 77, 65, 206, 82, 79, 77, 128, 82, 79, 76, 76, 73, 78, 199, 82, - 79, 76, 76, 69, 210, 82, 79, 76, 76, 69, 68, 45, 85, 208, 82, 79, 76, - 204, 82, 79, 72, 73, 78, 71, 89, 193, 82, 79, 71, 128, 82, 79, 196, 82, - 79, 67, 75, 69, 84, 128, 82, 79, 67, 203, 82, 79, 67, 128, 82, 79, 66, - 79, 212, 82, 79, 66, 65, 84, 128, 82, 79, 65, 83, 84, 69, 196, 82, 79, - 65, 82, 128, 82, 79, 65, 128, 82, 79, 45, 54, 128, 82, 79, 45, 53, 128, - 82, 79, 45, 52, 128, 82, 79, 45, 51, 128, 82, 79, 45, 50, 128, 82, 79, - 45, 49, 128, 82, 78, 89, 73, 78, 199, 82, 78, 79, 79, 78, 128, 82, 78, - 79, 79, 206, 82, 78, 65, 205, 82, 77, 84, 128, 82, 76, 79, 128, 82, 76, - 77, 128, 82, 76, 73, 128, 82, 76, 69, 128, 82, 74, 69, 211, 82, 74, 69, - 128, 82, 74, 197, 82, 73, 86, 69, 82, 128, 82, 73, 84, 85, 65, 76, 128, - 82, 73, 84, 84, 79, 82, 85, 128, 82, 73, 84, 83, 73, 128, 82, 73, 83, 73, - 78, 199, 82, 73, 83, 72, 128, 82, 73, 82, 65, 128, 82, 73, 80, 80, 76, - 197, 82, 73, 80, 128, 82, 73, 78, 71, 211, 82, 73, 78, 71, 73, 78, 199, - 82, 73, 78, 70, 79, 82, 90, 65, 78, 68, 79, 128, 82, 73, 206, 82, 73, 77, - 71, 66, 65, 128, 82, 73, 77, 128, 82, 73, 75, 82, 73, 75, 128, 82, 73, - 71, 86, 69, 68, 73, 195, 82, 73, 71, 72, 84, 87, 65, 82, 68, 83, 128, 82, - 73, 71, 72, 84, 72, 65, 78, 196, 82, 73, 71, 72, 84, 45, 84, 79, 45, 76, - 69, 70, 212, 82, 73, 71, 72, 84, 45, 83, 73, 68, 197, 82, 73, 71, 72, 84, - 45, 83, 72, 65, 68, 79, 87, 69, 196, 82, 73, 71, 72, 84, 45, 83, 72, 65, - 68, 69, 196, 82, 73, 71, 72, 84, 45, 80, 79, 73, 78, 84, 73, 78, 199, 82, - 73, 71, 72, 84, 45, 76, 73, 71, 72, 84, 69, 196, 82, 73, 71, 72, 84, 45, - 72, 65, 78, 68, 69, 196, 82, 73, 71, 72, 84, 45, 72, 65, 78, 196, 82, 73, - 71, 72, 84, 45, 70, 65, 67, 73, 78, 199, 82, 73, 71, 72, 84, 128, 82, 73, - 70, 76, 69, 128, 82, 73, 69, 85, 76, 45, 89, 69, 83, 73, 69, 85, 78, 71, - 128, 82, 73, 69, 85, 76, 45, 89, 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, - 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 89, 69, 79, 82, 73, - 78, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 84, 73, 75, 69, 85, - 84, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 84, 73, 75, 69, - 85, 84, 128, 82, 73, 69, 85, 76, 45, 84, 72, 73, 69, 85, 84, 72, 128, 82, - 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, 84, 73, 75, 69, 85, 84, 128, 82, - 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 82, 73, 69, - 85, 76, 45, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 82, 73, 69, 85, - 76, 45, 83, 83, 65, 78, 71, 75, 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, - 76, 45, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, - 45, 84, 73, 75, 69, 85, 84, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, - 80, 45, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, - 45, 80, 72, 73, 69, 85, 80, 72, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, - 85, 80, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, - 85, 80, 128, 82, 73, 69, 85, 76, 45, 80, 72, 73, 69, 85, 80, 72, 128, 82, - 73, 69, 85, 76, 45, 80, 65, 78, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, - 45, 78, 73, 69, 85, 78, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, - 45, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, - 75, 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, - 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, - 128, 82, 73, 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, 45, 83, 73, 79, 83, - 128, 82, 73, 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, 45, 72, 73, 69, 85, - 72, 128, 82, 73, 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, 128, 82, 73, 69, - 85, 76, 45, 75, 65, 80, 89, 69, 79, 85, 78, 80, 73, 69, 85, 80, 128, 82, - 73, 69, 85, 76, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 67, - 73, 69, 85, 67, 128, 82, 73, 69, 85, 204, 82, 73, 69, 76, 128, 82, 73, - 69, 69, 128, 82, 73, 67, 69, 77, 128, 82, 73, 67, 69, 128, 82, 73, 67, - 197, 82, 73, 66, 66, 79, 78, 128, 82, 73, 66, 66, 79, 206, 82, 73, 65, - 204, 82, 73, 45, 55, 128, 82, 73, 45, 54, 128, 82, 73, 45, 53, 128, 82, - 73, 45, 52, 128, 82, 73, 45, 51, 128, 82, 73, 45, 50, 128, 82, 73, 45, - 49, 128, 82, 72, 79, 84, 73, 195, 82, 72, 79, 128, 82, 72, 207, 82, 72, - 73, 78, 79, 67, 69, 82, 79, 83, 128, 82, 72, 65, 128, 82, 72, 128, 82, - 71, 89, 73, 78, 71, 83, 128, 82, 71, 89, 65, 78, 128, 82, 71, 89, 193, - 82, 69, 86, 79, 76, 86, 73, 78, 199, 82, 69, 86, 79, 76, 85, 84, 73, 79, - 78, 128, 82, 69, 86, 77, 65, 128, 82, 69, 86, 73, 65, 128, 82, 69, 86, - 69, 82, 83, 69, 68, 45, 83, 67, 72, 87, 65, 128, 82, 69, 86, 69, 82, 83, - 69, 68, 128, 82, 69, 86, 69, 82, 83, 69, 196, 82, 69, 86, 69, 82, 83, + 84, 73, 73, 77, 85, 128, 83, 65, 78, 83, 75, 82, 73, 212, 83, 65, 78, 78, + 89, 65, 128, 83, 65, 78, 71, 65, 50, 128, 83, 65, 78, 68, 87, 73, 67, 72, + 128, 83, 65, 78, 68, 72, 201, 83, 65, 78, 68, 65, 76, 128, 83, 65, 78, + 65, 72, 128, 83, 65, 78, 128, 83, 65, 77, 89, 79, 203, 83, 65, 77, 86, + 65, 84, 128, 83, 65, 77, 80, 73, 128, 83, 65, 77, 80, 72, 65, 79, 128, + 83, 65, 77, 75, 65, 128, 83, 65, 77, 69, 75, 72, 128, 83, 65, 77, 69, 75, + 200, 83, 65, 77, 66, 65, 128, 83, 65, 77, 65, 82, 73, 84, 65, 206, 83, + 65, 77, 128, 83, 65, 76, 84, 73, 82, 69, 128, 83, 65, 76, 84, 73, 76, 76, + 79, 128, 83, 65, 76, 84, 45, 50, 128, 83, 65, 76, 84, 128, 83, 65, 76, + 212, 83, 65, 76, 76, 65, 76, 76, 65, 72, 79, 213, 83, 65, 76, 76, 193, + 83, 65, 76, 65, 205, 83, 65, 76, 65, 68, 128, 83, 65, 76, 65, 128, 83, + 65, 76, 45, 65, 77, 77, 79, 78, 73, 65, 67, 128, 83, 65, 76, 128, 83, 65, + 75, 84, 65, 128, 83, 65, 75, 79, 84, 128, 83, 65, 75, 73, 78, 128, 83, + 65, 75, 72, 193, 83, 65, 75, 69, 85, 65, 69, 128, 83, 65, 75, 197, 83, + 65, 74, 68, 65, 72, 128, 83, 65, 73, 76, 66, 79, 65, 84, 128, 83, 65, 73, + 76, 128, 83, 65, 73, 75, 85, 82, 85, 128, 83, 65, 72, 128, 83, 65, 71, + 73, 84, 84, 65, 82, 73, 85, 83, 128, 83, 65, 71, 65, 128, 83, 65, 71, + 128, 83, 65, 199, 83, 65, 70, 72, 65, 128, 83, 65, 70, 69, 84, 217, 83, + 65, 68, 72, 69, 128, 83, 65, 68, 72, 197, 83, 65, 68, 69, 128, 83, 65, + 68, 128, 83, 65, 196, 83, 65, 67, 82, 73, 70, 73, 67, 73, 65, 204, 83, + 65, 65, 73, 128, 83, 65, 65, 68, 72, 85, 128, 83, 65, 45, 73, 128, 83, + 65, 45, 56, 128, 83, 65, 45, 55, 128, 83, 65, 45, 54, 128, 83, 65, 45, + 53, 128, 83, 65, 45, 52, 128, 83, 65, 45, 51, 128, 83, 65, 45, 50, 128, + 83, 65, 45, 49, 128, 83, 48, 52, 54, 128, 83, 48, 52, 53, 128, 83, 48, + 52, 52, 128, 83, 48, 52, 51, 128, 83, 48, 52, 50, 128, 83, 48, 52, 49, + 128, 83, 48, 52, 48, 128, 83, 48, 51, 57, 128, 83, 48, 51, 56, 128, 83, + 48, 51, 55, 128, 83, 48, 51, 54, 128, 83, 48, 51, 53, 65, 128, 83, 48, + 51, 53, 128, 83, 48, 51, 52, 128, 83, 48, 51, 51, 128, 83, 48, 51, 50, + 128, 83, 48, 51, 49, 128, 83, 48, 51, 48, 128, 83, 48, 50, 57, 128, 83, + 48, 50, 56, 128, 83, 48, 50, 55, 128, 83, 48, 50, 54, 66, 128, 83, 48, + 50, 54, 65, 128, 83, 48, 50, 54, 128, 83, 48, 50, 53, 128, 83, 48, 50, + 52, 128, 83, 48, 50, 51, 128, 83, 48, 50, 50, 128, 83, 48, 50, 49, 128, + 83, 48, 50, 48, 128, 83, 48, 49, 57, 128, 83, 48, 49, 56, 128, 83, 48, + 49, 55, 65, 128, 83, 48, 49, 55, 128, 83, 48, 49, 54, 128, 83, 48, 49, + 53, 128, 83, 48, 49, 52, 66, 128, 83, 48, 49, 52, 65, 128, 83, 48, 49, + 52, 128, 83, 48, 49, 51, 128, 83, 48, 49, 50, 128, 83, 48, 49, 49, 128, + 83, 48, 49, 48, 128, 83, 48, 48, 57, 128, 83, 48, 48, 56, 128, 83, 48, + 48, 55, 128, 83, 48, 48, 54, 65, 128, 83, 48, 48, 54, 128, 83, 48, 48, + 53, 128, 83, 48, 48, 52, 128, 83, 48, 48, 51, 128, 83, 48, 48, 50, 65, + 128, 83, 48, 48, 50, 128, 83, 48, 48, 49, 128, 83, 45, 87, 128, 83, 45, + 83, 72, 65, 80, 69, 196, 82, 89, 89, 128, 82, 89, 88, 128, 82, 89, 84, + 128, 82, 89, 82, 88, 128, 82, 89, 82, 128, 82, 89, 80, 128, 82, 87, 79, + 79, 128, 82, 87, 79, 128, 82, 87, 73, 73, 128, 82, 87, 73, 128, 82, 87, + 69, 69, 128, 82, 87, 69, 128, 82, 87, 65, 72, 65, 128, 82, 87, 65, 65, + 128, 82, 87, 65, 128, 82, 85, 88, 128, 82, 85, 85, 66, 85, 82, 85, 128, + 82, 85, 85, 128, 82, 85, 84, 128, 82, 85, 83, 83, 73, 65, 206, 82, 85, + 83, 73, 128, 82, 85, 82, 88, 128, 82, 85, 82, 128, 82, 85, 80, 73, 73, + 128, 82, 85, 80, 69, 197, 82, 85, 80, 128, 82, 85, 79, 88, 128, 82, 85, + 79, 80, 128, 82, 85, 79, 128, 82, 85, 78, 79, 85, 84, 128, 82, 85, 78, + 78, 73, 78, 199, 82, 85, 78, 78, 69, 82, 128, 82, 85, 78, 73, 195, 82, + 85, 78, 128, 82, 85, 77, 201, 82, 85, 77, 65, 201, 82, 85, 77, 128, 82, + 85, 205, 82, 85, 76, 69, 82, 128, 82, 85, 76, 69, 45, 68, 69, 76, 65, 89, + 69, 68, 128, 82, 85, 76, 69, 128, 82, 85, 76, 65, 73, 128, 82, 85, 75, + 75, 65, 75, 72, 65, 128, 82, 85, 73, 83, 128, 82, 85, 71, 66, 217, 82, + 85, 68, 73, 77, 69, 78, 84, 193, 82, 85, 66, 76, 197, 82, 85, 194, 82, + 85, 65, 128, 82, 85, 45, 54, 128, 82, 85, 45, 53, 128, 82, 85, 45, 52, + 128, 82, 85, 45, 51, 128, 82, 85, 45, 50, 128, 82, 85, 45, 49, 128, 82, + 84, 72, 65, 78, 199, 82, 84, 69, 128, 82, 84, 65, 71, 83, 128, 82, 84, + 65, 71, 211, 82, 82, 89, 88, 128, 82, 82, 89, 84, 128, 82, 82, 89, 82, + 88, 128, 82, 82, 89, 82, 128, 82, 82, 89, 80, 128, 82, 82, 85, 88, 128, + 82, 82, 85, 85, 128, 82, 82, 85, 84, 128, 82, 82, 85, 82, 88, 128, 82, + 82, 85, 82, 128, 82, 82, 85, 80, 128, 82, 82, 85, 79, 88, 128, 82, 82, + 85, 79, 128, 82, 82, 85, 128, 82, 82, 82, 65, 128, 82, 82, 79, 88, 128, + 82, 82, 79, 84, 128, 82, 82, 79, 80, 128, 82, 82, 79, 79, 128, 82, 82, + 79, 128, 82, 82, 73, 73, 128, 82, 82, 73, 128, 82, 82, 69, 88, 128, 82, + 82, 69, 84, 128, 82, 82, 69, 80, 128, 82, 82, 69, 72, 128, 82, 82, 69, + 200, 82, 82, 69, 69, 128, 82, 82, 69, 128, 82, 82, 65, 88, 128, 82, 82, + 65, 85, 128, 82, 82, 65, 73, 128, 82, 82, 65, 65, 128, 82, 79, 87, 66, + 79, 65, 84, 128, 82, 79, 85, 78, 68, 69, 196, 82, 79, 85, 78, 68, 45, 84, + 73, 80, 80, 69, 196, 82, 79, 84, 85, 78, 68, 65, 128, 82, 79, 84, 65, 84, + 73, 79, 78, 83, 128, 82, 79, 84, 65, 84, 73, 79, 78, 45, 87, 65, 76, 76, + 80, 76, 65, 78, 197, 82, 79, 84, 65, 84, 73, 79, 78, 45, 70, 76, 79, 79, + 82, 80, 76, 65, 78, 197, 82, 79, 84, 65, 84, 73, 79, 78, 128, 82, 79, 84, + 65, 84, 73, 79, 206, 82, 79, 84, 65, 84, 69, 196, 82, 79, 83, 72, 128, + 82, 79, 83, 69, 84, 84, 69, 128, 82, 79, 83, 69, 128, 82, 79, 79, 84, + 128, 82, 79, 79, 83, 84, 69, 82, 128, 82, 79, 79, 77, 128, 82, 79, 79, + 75, 128, 82, 79, 79, 203, 82, 79, 79, 70, 128, 82, 79, 77, 65, 78, 73, + 65, 206, 82, 79, 77, 65, 206, 82, 79, 77, 128, 82, 79, 76, 76, 73, 78, + 199, 82, 79, 76, 76, 69, 210, 82, 79, 76, 76, 69, 68, 45, 85, 208, 82, + 79, 76, 204, 82, 79, 72, 73, 78, 71, 89, 193, 82, 79, 71, 128, 82, 79, + 196, 82, 79, 67, 75, 69, 84, 128, 82, 79, 67, 203, 82, 79, 67, 128, 82, + 79, 66, 79, 212, 82, 79, 66, 65, 84, 128, 82, 79, 65, 83, 84, 69, 196, + 82, 79, 65, 82, 128, 82, 79, 65, 128, 82, 79, 45, 54, 128, 82, 79, 45, + 53, 128, 82, 79, 45, 52, 128, 82, 79, 45, 51, 128, 82, 79, 45, 50, 128, + 82, 79, 45, 49, 128, 82, 78, 89, 73, 78, 199, 82, 78, 79, 79, 78, 128, + 82, 78, 79, 79, 206, 82, 78, 65, 205, 82, 77, 84, 128, 82, 76, 79, 128, + 82, 76, 77, 128, 82, 76, 73, 128, 82, 76, 69, 128, 82, 74, 69, 211, 82, + 74, 69, 128, 82, 74, 197, 82, 73, 86, 69, 82, 128, 82, 73, 84, 85, 65, + 76, 128, 82, 73, 84, 84, 79, 82, 85, 128, 82, 73, 84, 83, 73, 128, 82, + 73, 83, 73, 78, 199, 82, 73, 83, 72, 128, 82, 73, 82, 65, 128, 82, 73, + 80, 80, 76, 197, 82, 73, 80, 128, 82, 73, 78, 71, 211, 82, 73, 78, 71, + 73, 78, 199, 82, 73, 78, 71, 69, 196, 82, 73, 78, 70, 79, 82, 90, 65, 78, + 68, 79, 128, 82, 73, 206, 82, 73, 77, 71, 66, 65, 128, 82, 73, 77, 128, + 82, 73, 75, 82, 73, 75, 128, 82, 73, 71, 86, 69, 68, 73, 195, 82, 73, 71, + 72, 84, 87, 65, 82, 68, 83, 128, 82, 73, 71, 72, 84, 72, 65, 78, 196, 82, + 73, 71, 72, 84, 45, 84, 79, 45, 76, 69, 70, 212, 82, 73, 71, 72, 84, 45, + 83, 73, 68, 197, 82, 73, 71, 72, 84, 45, 83, 72, 65, 68, 79, 87, 69, 196, + 82, 73, 71, 72, 84, 45, 83, 72, 65, 68, 69, 196, 82, 73, 71, 72, 84, 45, + 80, 79, 73, 78, 84, 73, 78, 199, 82, 73, 71, 72, 84, 45, 76, 73, 71, 72, + 84, 69, 196, 82, 73, 71, 72, 84, 45, 72, 65, 78, 68, 69, 196, 82, 73, 71, + 72, 84, 45, 72, 65, 78, 196, 82, 73, 71, 72, 84, 45, 70, 65, 67, 73, 78, + 199, 82, 73, 71, 72, 84, 128, 82, 73, 70, 76, 69, 128, 82, 73, 69, 85, + 76, 45, 89, 69, 83, 73, 69, 85, 78, 71, 128, 82, 73, 69, 85, 76, 45, 89, + 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 45, 72, 73, 69, 85, 72, 128, 82, + 73, 69, 85, 76, 45, 89, 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 128, 82, + 73, 69, 85, 76, 45, 84, 73, 75, 69, 85, 84, 45, 72, 73, 69, 85, 72, 128, + 82, 73, 69, 85, 76, 45, 84, 73, 75, 69, 85, 84, 128, 82, 73, 69, 85, 76, + 45, 84, 72, 73, 69, 85, 84, 72, 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, + 78, 71, 84, 73, 75, 69, 85, 84, 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, + 78, 71, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, + 80, 73, 69, 85, 80, 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, 75, + 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, 76, 45, 83, 73, 79, 83, 128, 82, + 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, 84, 73, 75, 69, 85, 84, 128, + 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, 128, 82, + 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, 80, 72, 73, 69, 85, 80, 72, + 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, 72, 73, 69, 85, 72, + 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 128, 82, 73, 69, 85, 76, + 45, 80, 72, 73, 69, 85, 80, 72, 128, 82, 73, 69, 85, 76, 45, 80, 65, 78, + 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 78, 73, 69, 85, 78, 128, 82, + 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, 83, 73, 79, 83, 128, 82, 73, + 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, 75, 73, 89, 69, 79, 75, 128, 82, + 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, 72, 73, 69, 85, 72, 128, 82, + 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 128, 82, 73, 69, 85, 76, 45, 75, + 73, 89, 69, 79, 75, 45, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 75, + 73, 89, 69, 79, 75, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, + 75, 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, 76, 45, 75, 65, 80, 89, 69, + 79, 85, 78, 80, 73, 69, 85, 80, 128, 82, 73, 69, 85, 76, 45, 72, 73, 69, + 85, 72, 128, 82, 73, 69, 85, 76, 45, 67, 73, 69, 85, 67, 128, 82, 73, 69, + 85, 204, 82, 73, 69, 76, 128, 82, 73, 69, 69, 128, 82, 73, 67, 75, 83, + 72, 65, 87, 128, 82, 73, 67, 69, 77, 128, 82, 73, 67, 69, 128, 82, 73, + 67, 197, 82, 73, 66, 66, 79, 78, 128, 82, 73, 66, 66, 79, 206, 82, 73, + 65, 204, 82, 73, 45, 55, 128, 82, 73, 45, 54, 128, 82, 73, 45, 53, 128, + 82, 73, 45, 52, 128, 82, 73, 45, 51, 128, 82, 73, 45, 50, 128, 82, 73, + 45, 49, 128, 82, 72, 79, 84, 73, 195, 82, 72, 79, 128, 82, 72, 207, 82, + 72, 73, 78, 79, 67, 69, 82, 79, 83, 128, 82, 72, 65, 128, 82, 72, 128, + 82, 71, 89, 73, 78, 71, 83, 128, 82, 71, 89, 65, 78, 128, 82, 71, 89, + 193, 82, 69, 86, 79, 76, 86, 73, 78, 199, 82, 69, 86, 79, 76, 85, 84, 73, + 79, 78, 128, 82, 69, 86, 77, 65, 128, 82, 69, 86, 73, 65, 128, 82, 69, + 86, 69, 82, 83, 69, 68, 45, 83, 67, 72, 87, 65, 128, 82, 69, 86, 69, 82, + 83, 69, 68, 128, 82, 69, 86, 69, 82, 83, 69, 196, 82, 69, 86, 69, 82, 83, 197, 82, 69, 85, 88, 128, 82, 69, 85, 128, 82, 69, 84, 85, 82, 78, 128, 82, 69, 84, 85, 82, 206, 82, 69, 84, 82, 79, 70, 76, 69, 216, 82, 69, 84, 82, 69, 65, 84, 128, 82, 69, 84, 79, 82, 84, 128, 82, 69, 83, 85, 80, 73, @@ -1561,244 +1581,248 @@ static unsigned char lexicon[] = { 82, 69, 65, 76, 71, 65, 82, 45, 50, 128, 82, 69, 65, 76, 71, 65, 82, 128, 82, 69, 65, 72, 77, 85, 75, 128, 82, 69, 65, 67, 72, 128, 82, 69, 45, 52, 128, 82, 69, 45, 51, 128, 82, 69, 45, 50, 128, 82, 69, 45, 49, 128, 82, - 68, 207, 82, 68, 69, 204, 82, 66, 65, 83, 193, 82, 65, 89, 83, 128, 82, - 65, 89, 211, 82, 65, 89, 65, 78, 78, 65, 128, 82, 65, 84, 73, 79, 128, - 82, 65, 84, 72, 65, 128, 82, 65, 84, 72, 193, 82, 65, 84, 65, 128, 82, - 65, 84, 128, 82, 65, 83, 87, 65, 68, 73, 128, 82, 65, 83, 79, 85, 204, - 82, 65, 83, 72, 65, 128, 82, 65, 81, 128, 82, 65, 80, 73, 83, 77, 65, - 128, 82, 65, 78, 71, 197, 82, 65, 78, 65, 128, 82, 65, 78, 128, 82, 65, - 77, 211, 82, 65, 77, 66, 65, 84, 128, 82, 65, 75, 72, 65, 78, 71, 128, - 82, 65, 75, 65, 65, 82, 65, 65, 78, 83, 65, 89, 65, 128, 82, 65, 73, 83, - 73, 78, 199, 82, 65, 73, 83, 69, 68, 128, 82, 65, 73, 83, 69, 196, 82, - 65, 73, 78, 66, 79, 87, 128, 82, 65, 73, 76, 87, 65, 89, 128, 82, 65, 73, - 76, 87, 65, 217, 82, 65, 73, 76, 128, 82, 65, 73, 68, 207, 82, 65, 73, - 68, 65, 128, 82, 65, 72, 77, 65, 84, 85, 76, 76, 65, 200, 82, 65, 72, - 128, 82, 65, 70, 69, 128, 82, 65, 69, 77, 128, 82, 65, 68, 73, 79, 65, - 67, 84, 73, 86, 197, 82, 65, 68, 73, 79, 128, 82, 65, 68, 73, 207, 82, - 65, 68, 201, 82, 65, 68, 128, 82, 65, 196, 82, 65, 67, 81, 85, 69, 212, - 82, 65, 67, 73, 78, 71, 128, 82, 65, 67, 73, 78, 199, 82, 65, 67, 67, 79, - 79, 78, 128, 82, 65, 66, 66, 73, 84, 128, 82, 65, 66, 66, 73, 212, 82, - 65, 66, 128, 82, 65, 65, 73, 128, 82, 65, 51, 128, 82, 65, 50, 128, 82, - 65, 45, 75, 65, 82, 65, 128, 82, 65, 45, 52, 128, 82, 65, 45, 51, 128, - 82, 65, 45, 50, 128, 82, 65, 45, 49, 128, 82, 48, 50, 57, 128, 82, 48, - 50, 56, 128, 82, 48, 50, 55, 128, 82, 48, 50, 54, 128, 82, 48, 50, 53, - 128, 82, 48, 50, 52, 128, 82, 48, 50, 51, 128, 82, 48, 50, 50, 128, 82, - 48, 50, 49, 128, 82, 48, 50, 48, 128, 82, 48, 49, 57, 128, 82, 48, 49, - 56, 128, 82, 48, 49, 55, 128, 82, 48, 49, 54, 65, 128, 82, 48, 49, 54, - 128, 82, 48, 49, 53, 128, 82, 48, 49, 52, 128, 82, 48, 49, 51, 128, 82, - 48, 49, 50, 128, 82, 48, 49, 49, 128, 82, 48, 49, 48, 65, 128, 82, 48, - 49, 48, 128, 82, 48, 48, 57, 128, 82, 48, 48, 56, 128, 82, 48, 48, 55, - 128, 82, 48, 48, 54, 128, 82, 48, 48, 53, 128, 82, 48, 48, 52, 128, 82, - 48, 48, 51, 66, 128, 82, 48, 48, 51, 65, 128, 82, 48, 48, 51, 128, 82, - 48, 48, 50, 65, 128, 82, 48, 48, 50, 128, 82, 48, 48, 49, 128, 82, 45, - 67, 82, 69, 197, 81, 89, 88, 128, 81, 89, 85, 128, 81, 89, 84, 128, 81, - 89, 82, 88, 128, 81, 89, 82, 128, 81, 89, 80, 128, 81, 89, 79, 128, 81, - 89, 73, 128, 81, 89, 69, 69, 128, 81, 89, 69, 128, 81, 89, 65, 65, 128, - 81, 89, 65, 128, 81, 89, 128, 81, 87, 73, 128, 81, 87, 69, 69, 128, 81, - 87, 69, 128, 81, 87, 65, 65, 128, 81, 87, 65, 128, 81, 85, 88, 128, 81, - 85, 86, 128, 81, 85, 85, 86, 128, 81, 85, 85, 128, 81, 85, 84, 128, 81, - 85, 83, 72, 83, 72, 65, 89, 65, 128, 81, 85, 82, 88, 128, 81, 85, 82, - 128, 81, 85, 80, 128, 81, 85, 79, 88, 128, 81, 85, 79, 84, 197, 81, 85, - 79, 84, 65, 84, 73, 79, 206, 81, 85, 79, 84, 128, 81, 85, 79, 80, 128, - 81, 85, 79, 128, 81, 85, 75, 128, 81, 85, 73, 78, 84, 73, 76, 69, 128, - 81, 85, 73, 78, 84, 69, 83, 83, 69, 78, 67, 69, 128, 81, 85, 73, 78, 68, - 73, 67, 69, 83, 73, 77, 193, 81, 85, 73, 78, 67, 85, 78, 88, 128, 81, 85, - 73, 78, 65, 82, 73, 85, 211, 81, 85, 73, 76, 212, 81, 85, 73, 76, 76, - 128, 81, 85, 73, 67, 203, 81, 85, 73, 128, 81, 85, 70, 128, 81, 85, 69, - 83, 84, 73, 79, 78, 69, 196, 81, 85, 69, 83, 84, 73, 79, 78, 128, 81, 85, - 69, 83, 84, 73, 79, 206, 81, 85, 69, 69, 78, 128, 81, 85, 69, 69, 206, - 81, 85, 69, 128, 81, 85, 66, 85, 84, 83, 128, 81, 85, 65, 84, 69, 82, 78, - 73, 79, 206, 81, 85, 65, 82, 84, 69, 82, 83, 128, 81, 85, 65, 82, 84, 69, - 82, 211, 81, 85, 65, 82, 84, 69, 82, 128, 81, 85, 65, 78, 84, 73, 84, - 217, 81, 85, 65, 68, 82, 85, 80, 76, 197, 81, 85, 65, 68, 82, 65, 78, 84, - 128, 81, 85, 65, 68, 82, 65, 78, 212, 81, 85, 65, 68, 67, 79, 76, 79, 78, - 128, 81, 85, 65, 68, 128, 81, 85, 65, 196, 81, 85, 65, 128, 81, 85, 128, - 81, 208, 81, 79, 88, 128, 81, 79, 84, 128, 81, 79, 80, 72, 128, 81, 79, - 80, 65, 128, 81, 79, 80, 128, 81, 79, 79, 128, 81, 79, 207, 81, 79, 70, - 128, 81, 79, 198, 81, 79, 65, 128, 81, 79, 128, 81, 78, 128, 81, 73, 88, - 128, 81, 73, 84, 83, 65, 128, 81, 73, 84, 128, 81, 73, 80, 128, 81, 73, - 73, 128, 81, 73, 70, 128, 81, 73, 69, 88, 128, 81, 73, 69, 84, 128, 81, - 73, 69, 80, 128, 81, 73, 69, 128, 81, 73, 128, 81, 72, 87, 73, 128, 81, - 72, 87, 69, 69, 128, 81, 72, 87, 69, 128, 81, 72, 87, 65, 65, 128, 81, - 72, 87, 65, 128, 81, 72, 85, 128, 81, 72, 79, 80, 72, 128, 81, 72, 79, - 128, 81, 72, 73, 128, 81, 72, 69, 69, 128, 81, 72, 69, 128, 81, 72, 65, - 85, 128, 81, 72, 65, 65, 128, 81, 72, 65, 128, 81, 71, 65, 128, 81, 69, - 84, 65, 78, 65, 128, 81, 69, 69, 128, 81, 69, 128, 81, 65, 89, 128, 81, - 65, 85, 128, 81, 65, 84, 65, 78, 128, 81, 65, 82, 78, 69, 217, 81, 65, - 82, 128, 81, 65, 81, 128, 81, 65, 80, 72, 128, 81, 65, 77, 65, 84, 83, - 128, 81, 65, 77, 65, 84, 211, 81, 65, 76, 193, 81, 65, 73, 82, 84, 72, - 82, 65, 128, 81, 65, 73, 128, 81, 65, 70, 128, 81, 65, 198, 81, 65, 68, - 77, 65, 128, 81, 65, 65, 73, 128, 81, 65, 65, 70, 85, 128, 81, 65, 65, - 70, 128, 81, 48, 48, 55, 128, 81, 48, 48, 54, 128, 81, 48, 48, 53, 128, - 81, 48, 48, 52, 128, 81, 48, 48, 51, 128, 81, 48, 48, 50, 128, 81, 48, - 48, 49, 128, 80, 90, 128, 80, 89, 88, 128, 80, 89, 84, 128, 80, 89, 82, - 88, 128, 80, 89, 82, 128, 80, 89, 80, 128, 80, 87, 79, 89, 128, 80, 87, - 79, 79, 128, 80, 87, 79, 128, 80, 87, 207, 80, 87, 73, 73, 128, 80, 87, - 73, 128, 80, 87, 69, 69, 128, 80, 87, 69, 128, 80, 87, 65, 65, 128, 80, - 87, 128, 80, 86, 128, 80, 85, 90, 90, 76, 197, 80, 85, 88, 128, 80, 85, - 85, 84, 128, 80, 85, 85, 128, 80, 85, 84, 82, 69, 70, 65, 67, 84, 73, 79, - 78, 128, 80, 85, 84, 128, 80, 85, 212, 80, 85, 83, 72, 80, 73, 78, 128, - 80, 85, 83, 72, 80, 73, 75, 65, 128, 80, 85, 83, 72, 73, 78, 199, 80, 85, - 82, 88, 128, 80, 85, 82, 83, 69, 128, 80, 85, 82, 80, 76, 197, 80, 85, - 82, 78, 65, 77, 65, 128, 80, 85, 82, 73, 84, 89, 128, 80, 85, 82, 73, 70, - 89, 128, 80, 85, 82, 128, 80, 85, 81, 128, 80, 85, 80, 128, 80, 85, 79, - 88, 128, 80, 85, 79, 80, 128, 80, 85, 79, 128, 80, 85, 78, 71, 65, 65, - 77, 128, 80, 85, 78, 71, 128, 80, 85, 78, 67, 84, 85, 211, 80, 85, 78, - 67, 84, 85, 65, 84, 73, 79, 78, 128, 80, 85, 78, 67, 84, 85, 65, 84, 73, - 79, 206, 80, 85, 77, 80, 128, 80, 85, 77, 128, 80, 85, 70, 70, 69, 68, - 128, 80, 85, 69, 128, 80, 85, 67, 75, 128, 80, 85, 66, 76, 73, 195, 80, - 85, 194, 80, 85, 65, 81, 128, 80, 85, 65, 69, 128, 80, 85, 50, 128, 80, - 85, 49, 128, 80, 85, 128, 80, 84, 72, 65, 72, 193, 80, 84, 69, 128, 80, - 83, 73, 76, 201, 80, 83, 73, 70, 73, 83, 84, 79, 83, 89, 78, 65, 71, 77, - 65, 128, 80, 83, 73, 70, 73, 83, 84, 79, 80, 65, 82, 65, 75, 65, 76, 69, - 83, 77, 65, 128, 80, 83, 73, 70, 73, 83, 84, 79, 206, 80, 83, 73, 70, 73, - 83, 84, 79, 76, 89, 71, 73, 83, 77, 65, 128, 80, 83, 73, 128, 80, 83, 65, - 76, 84, 69, 210, 80, 83, 128, 80, 82, 79, 86, 69, 128, 80, 82, 79, 84, - 79, 86, 65, 82, 89, 211, 80, 82, 79, 84, 79, 211, 80, 82, 79, 84, 69, 67, - 84, 69, 196, 80, 82, 79, 83, 71, 69, 71, 82, 65, 77, 77, 69, 78, 73, 128, - 80, 82, 79, 83, 69, 82, 80, 73, 78, 65, 128, 80, 82, 79, 80, 79, 82, 84, - 73, 79, 78, 65, 204, 80, 82, 79, 80, 79, 82, 84, 73, 79, 78, 128, 80, 82, - 79, 80, 69, 82, 84, 217, 80, 82, 79, 80, 69, 76, 76, 69, 210, 80, 82, 79, - 79, 70, 128, 80, 82, 79, 76, 79, 78, 71, 69, 196, 80, 82, 79, 76, 65, 84, - 73, 79, 78, 197, 80, 82, 79, 74, 69, 67, 84, 79, 82, 128, 80, 82, 79, 74, - 69, 67, 84, 73, 86, 69, 128, 80, 82, 79, 74, 69, 67, 84, 73, 79, 78, 128, - 80, 82, 79, 72, 73, 66, 73, 84, 69, 196, 80, 82, 79, 71, 82, 69, 83, 83, - 128, 80, 82, 79, 71, 82, 65, 205, 80, 82, 79, 70, 79, 85, 78, 68, 128, - 80, 82, 79, 68, 85, 67, 84, 128, 80, 82, 79, 68, 85, 67, 212, 80, 82, 73, - 86, 65, 84, 69, 128, 80, 82, 73, 86, 65, 84, 197, 80, 82, 73, 86, 65, 67, - 217, 80, 82, 73, 83, 72, 84, 72, 65, 77, 65, 84, 82, 193, 80, 82, 73, 78, - 84, 83, 128, 80, 82, 73, 78, 84, 69, 82, 128, 80, 82, 73, 78, 84, 69, - 210, 80, 82, 73, 78, 84, 128, 80, 82, 73, 78, 212, 80, 82, 73, 78, 67, - 69, 83, 83, 128, 80, 82, 73, 78, 67, 69, 128, 80, 82, 73, 77, 69, 128, - 80, 82, 73, 77, 197, 80, 82, 69, 86, 73, 79, 85, 211, 80, 82, 69, 84, 90, - 69, 76, 128, 80, 82, 69, 83, 83, 69, 196, 80, 82, 69, 83, 69, 84, 128, - 80, 82, 69, 83, 69, 78, 84, 65, 84, 73, 79, 206, 80, 82, 69, 83, 67, 82, - 73, 80, 84, 73, 79, 206, 80, 82, 69, 80, 79, 78, 68, 69, 82, 65, 78, 67, - 69, 128, 80, 82, 69, 78, 75, 72, 65, 128, 80, 82, 69, 71, 78, 65, 78, - 212, 80, 82, 69, 70, 73, 88, 69, 196, 80, 82, 69, 70, 65, 67, 197, 80, - 82, 69, 67, 73, 80, 73, 84, 65, 84, 69, 128, 80, 82, 69, 67, 69, 68, 73, - 78, 199, 80, 82, 69, 67, 69, 68, 69, 83, 128, 80, 82, 69, 67, 69, 68, 69, - 211, 80, 82, 69, 67, 69, 68, 69, 196, 80, 82, 69, 67, 69, 68, 69, 128, - 80, 82, 69, 67, 69, 68, 197, 80, 82, 65, 89, 69, 210, 80, 82, 65, 77, 45, - 80, 73, 73, 128, 80, 82, 65, 77, 45, 80, 73, 201, 80, 82, 65, 77, 45, 77, - 85, 79, 89, 128, 80, 82, 65, 77, 45, 77, 85, 79, 217, 80, 82, 65, 77, 45, - 66, 85, 79, 78, 128, 80, 82, 65, 77, 45, 66, 85, 79, 206, 80, 82, 65, 77, - 45, 66, 69, 73, 128, 80, 82, 65, 77, 45, 66, 69, 201, 80, 82, 65, 77, - 128, 80, 82, 65, 205, 80, 82, 128, 80, 80, 86, 128, 80, 80, 77, 128, 80, - 80, 65, 128, 80, 79, 89, 128, 80, 79, 88, 128, 80, 79, 87, 69, 82, 211, - 80, 79, 87, 69, 82, 128, 80, 79, 87, 69, 210, 80, 79, 87, 68, 69, 82, 69, - 196, 80, 79, 87, 68, 69, 82, 128, 80, 79, 85, 78, 196, 80, 79, 85, 76, - 84, 82, 217, 80, 79, 85, 67, 72, 128, 80, 79, 84, 65, 84, 79, 128, 80, - 79, 84, 65, 66, 76, 197, 80, 79, 212, 80, 79, 83, 84, 80, 79, 83, 73, 84, - 73, 79, 206, 80, 79, 83, 84, 66, 79, 88, 128, 80, 79, 83, 84, 65, 204, - 80, 79, 83, 84, 128, 80, 79, 83, 212, 80, 79, 83, 83, 69, 83, 83, 73, 79, - 78, 128, 80, 79, 83, 73, 84, 73, 79, 78, 83, 128, 80, 79, 83, 73, 84, 73, - 79, 78, 128, 80, 79, 83, 69, 73, 68, 79, 78, 128, 80, 79, 82, 84, 65, 66, - 76, 197, 80, 79, 82, 82, 69, 67, 84, 85, 83, 128, 80, 79, 82, 82, 69, 67, - 84, 85, 211, 80, 79, 80, 80, 73, 78, 199, 80, 79, 80, 80, 69, 82, 128, - 80, 79, 80, 67, 79, 82, 78, 128, 80, 79, 80, 128, 80, 79, 208, 80, 79, - 79, 68, 76, 69, 128, 80, 79, 79, 128, 80, 79, 78, 68, 79, 128, 80, 79, - 206, 80, 79, 77, 77, 69, 69, 128, 80, 79, 77, 77, 69, 197, 80, 79, 76, - 79, 128, 80, 79, 76, 73, 83, 72, 128, 80, 79, 76, 73, 67, 197, 80, 79, - 76, 201, 80, 79, 76, 69, 128, 80, 79, 76, 197, 80, 79, 75, 82, 89, 84, - 73, 69, 128, 80, 79, 75, 79, 74, 73, 128, 80, 79, 73, 78, 84, 211, 80, - 79, 73, 78, 84, 79, 128, 80, 79, 73, 78, 84, 69, 82, 128, 80, 79, 73, 78, - 84, 69, 196, 80, 79, 73, 78, 84, 128, 80, 79, 73, 78, 212, 80, 79, 69, - 84, 82, 217, 80, 79, 69, 84, 73, 195, 80, 79, 68, 65, 84, 85, 83, 128, - 80, 79, 67, 75, 69, 212, 80, 79, 65, 128, 80, 79, 128, 80, 207, 80, 78, - 69, 85, 77, 65, 84, 65, 128, 80, 76, 85, 84, 207, 80, 76, 85, 84, 65, - 128, 80, 76, 85, 83, 45, 77, 73, 78, 85, 211, 80, 76, 85, 83, 128, 80, - 76, 85, 82, 65, 76, 128, 80, 76, 85, 77, 69, 196, 80, 76, 85, 77, 128, - 80, 76, 85, 75, 128, 80, 76, 85, 71, 128, 80, 76, 85, 128, 80, 76, 79, - 87, 128, 80, 76, 79, 80, 72, 85, 128, 80, 76, 72, 65, 85, 128, 80, 76, - 69, 84, 72, 82, 79, 78, 128, 80, 76, 69, 65, 68, 73, 78, 199, 80, 76, 68, - 128, 80, 76, 65, 89, 73, 78, 199, 80, 76, 65, 84, 69, 128, 80, 76, 65, - 83, 84, 73, 67, 83, 128, 80, 76, 65, 78, 69, 128, 80, 76, 65, 78, 67, - 203, 80, 76, 65, 75, 128, 80, 76, 65, 71, 73, 79, 211, 80, 76, 65, 67, - 69, 72, 79, 76, 68, 69, 82, 128, 80, 76, 65, 67, 69, 72, 79, 76, 68, 69, - 210, 80, 76, 65, 67, 197, 80, 76, 65, 128, 80, 73, 90, 90, 73, 67, 65, - 84, 79, 128, 80, 73, 90, 90, 65, 128, 80, 73, 88, 128, 80, 73, 87, 82, - 128, 80, 73, 84, 67, 72, 70, 79, 82, 75, 128, 80, 73, 84, 67, 72, 70, 79, - 82, 203, 80, 73, 84, 128, 80, 73, 83, 84, 79, 76, 128, 80, 73, 83, 69, - 76, 69, 72, 128, 80, 73, 83, 67, 69, 83, 128, 80, 73, 82, 73, 71, 128, - 80, 73, 82, 73, 199, 80, 73, 82, 73, 69, 69, 78, 128, 80, 73, 82, 65, 67, - 89, 128, 80, 73, 82, 50, 128, 80, 73, 80, 73, 78, 71, 128, 80, 73, 80, - 65, 69, 77, 71, 66, 73, 69, 69, 128, 80, 73, 80, 65, 69, 77, 66, 65, 128, - 80, 73, 80, 128, 80, 73, 78, 87, 72, 69, 69, 204, 80, 73, 78, 69, 65, 80, - 80, 76, 69, 128, 80, 73, 78, 197, 80, 73, 78, 65, 82, 66, 79, 82, 65, 83, - 128, 80, 73, 76, 76, 128, 80, 73, 76, 197, 80, 73, 76, 67, 82, 79, 215, - 80, 73, 75, 85, 82, 85, 128, 80, 73, 75, 79, 128, 80, 73, 71, 128, 80, - 73, 199, 80, 73, 69, 88, 128, 80, 73, 69, 85, 80, 45, 84, 72, 73, 69, 85, - 84, 72, 128, 80, 73, 69, 85, 80, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, - 128, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, 45, 84, 73, 75, 69, 85, 84, - 128, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, 45, 84, 72, 73, 69, 85, 84, - 72, 128, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, - 128, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, - 128, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, 45, 67, 73, 69, 85, 67, 128, - 80, 73, 69, 85, 80, 45, 82, 73, 69, 85, 76, 45, 80, 72, 73, 69, 85, 80, - 72, 128, 80, 73, 69, 85, 80, 45, 82, 73, 69, 85, 76, 128, 80, 73, 69, 85, - 80, 45, 78, 73, 69, 85, 78, 128, 80, 73, 69, 85, 80, 45, 77, 73, 69, 85, - 77, 128, 80, 73, 69, 85, 80, 45, 75, 72, 73, 69, 85, 75, 72, 128, 80, 73, - 69, 85, 80, 45, 67, 73, 69, 85, 67, 128, 80, 73, 69, 85, 80, 45, 67, 72, - 73, 69, 85, 67, 72, 128, 80, 73, 69, 85, 208, 80, 73, 69, 84, 128, 80, - 73, 69, 80, 128, 80, 73, 69, 69, 84, 128, 80, 73, 69, 69, 81, 128, 80, - 73, 69, 67, 69, 128, 80, 73, 69, 128, 80, 73, 67, 84, 85, 82, 69, 128, - 80, 73, 67, 75, 69, 84, 128, 80, 73, 67, 75, 128, 80, 73, 65, 83, 85, 84, - 79, 82, 85, 128, 80, 73, 65, 83, 77, 193, 80, 73, 65, 78, 79, 128, 80, - 201, 80, 72, 87, 65, 128, 80, 72, 85, 84, 72, 65, 79, 128, 80, 72, 85, - 210, 80, 72, 85, 78, 71, 128, 80, 72, 82, 65, 83, 69, 128, 80, 72, 79, - 78, 69, 83, 128, 80, 72, 79, 76, 85, 83, 128, 80, 72, 79, 69, 78, 73, 67, - 73, 65, 206, 80, 72, 79, 65, 128, 80, 72, 79, 128, 80, 72, 207, 80, 72, - 78, 65, 69, 203, 80, 72, 73, 78, 84, 72, 85, 128, 80, 72, 73, 76, 79, 83, - 79, 80, 72, 69, 82, 211, 80, 72, 73, 76, 73, 80, 80, 73, 78, 197, 80, 72, - 73, 69, 85, 80, 72, 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 72, 73, 69, - 85, 80, 72, 45, 83, 73, 79, 83, 128, 80, 72, 73, 69, 85, 80, 72, 45, 80, - 73, 69, 85, 80, 128, 80, 72, 73, 69, 85, 80, 72, 45, 72, 73, 69, 85, 72, - 128, 80, 72, 73, 69, 85, 80, 200, 80, 72, 73, 128, 80, 72, 201, 80, 72, - 69, 69, 128, 80, 72, 69, 128, 80, 72, 65, 83, 69, 45, 198, 80, 72, 65, - 83, 69, 45, 194, 80, 72, 65, 83, 69, 45, 193, 80, 72, 65, 82, 89, 78, 71, - 69, 65, 204, 80, 72, 65, 82, 128, 80, 72, 65, 78, 128, 80, 72, 65, 77, - 128, 80, 72, 65, 73, 83, 84, 79, 211, 80, 72, 65, 71, 83, 45, 80, 193, - 80, 72, 65, 66, 128, 80, 72, 65, 65, 82, 75, 65, 65, 128, 80, 72, 65, 65, - 128, 80, 71, 128, 80, 70, 128, 80, 69, 85, 88, 128, 80, 69, 85, 84, 65, - 69, 128, 80, 69, 85, 84, 128, 80, 69, 84, 82, 201, 80, 69, 84, 65, 83, - 84, 79, 75, 79, 85, 70, 73, 83, 77, 65, 128, 80, 69, 84, 65, 83, 84, 73, - 128, 80, 69, 84, 65, 83, 77, 65, 128, 80, 69, 84, 65, 76, 76, 69, 196, - 80, 69, 83, 79, 128, 80, 69, 83, 207, 80, 69, 83, 72, 50, 128, 80, 69, - 83, 72, 178, 80, 69, 83, 69, 84, 193, 80, 69, 211, 80, 69, 82, 84, 72, - 207, 80, 69, 82, 83, 80, 69, 67, 84, 73, 86, 69, 128, 80, 69, 82, 83, 79, - 78, 65, 204, 80, 69, 82, 83, 79, 78, 128, 80, 69, 82, 83, 79, 206, 80, - 69, 82, 83, 73, 65, 206, 80, 69, 82, 83, 69, 86, 69, 82, 73, 78, 199, 80, - 69, 82, 80, 69, 78, 68, 73, 67, 85, 76, 65, 82, 128, 80, 69, 82, 80, 69, - 78, 68, 73, 67, 85, 76, 65, 210, 80, 69, 82, 78, 73, 206, 80, 69, 82, 77, - 73, 84, 84, 69, 196, 80, 69, 82, 77, 73, 195, 80, 69, 82, 77, 65, 78, 69, - 78, 212, 80, 69, 82, 73, 83, 80, 79, 77, 69, 78, 73, 128, 80, 69, 82, 73, - 83, 80, 79, 77, 69, 78, 201, 80, 69, 82, 70, 79, 82, 77, 73, 78, 199, 80, - 69, 82, 70, 69, 67, 84, 85, 205, 80, 69, 82, 70, 69, 67, 84, 65, 128, 80, - 69, 82, 70, 69, 67, 84, 193, 80, 69, 82, 67, 85, 83, 83, 73, 86, 69, 128, - 80, 69, 82, 67, 69, 78, 212, 80, 69, 80, 80, 69, 82, 128, 80, 69, 80, 69, - 84, 128, 80, 69, 80, 69, 212, 80, 69, 79, 82, 84, 200, 80, 69, 79, 80, - 76, 69, 128, 80, 69, 78, 84, 65, 84, 72, 76, 79, 78, 128, 80, 69, 78, 84, - 65, 83, 69, 77, 69, 128, 80, 69, 78, 84, 65, 71, 82, 65, 77, 128, 80, 69, - 78, 84, 65, 71, 79, 78, 128, 80, 69, 78, 83, 85, 128, 80, 69, 78, 83, 73, - 86, 197, 80, 69, 78, 78, 217, 80, 69, 78, 78, 65, 78, 84, 128, 80, 69, - 78, 73, 72, 73, 128, 80, 69, 78, 71, 85, 73, 78, 128, 80, 69, 78, 71, 75, - 65, 76, 128, 80, 69, 78, 69, 84, 82, 65, 84, 73, 79, 78, 128, 80, 69, 78, - 67, 73, 76, 128, 80, 69, 76, 65, 83, 84, 79, 78, 128, 80, 69, 76, 65, 83, - 84, 79, 206, 80, 69, 73, 84, 72, 128, 80, 69, 72, 69, 72, 128, 80, 69, - 72, 69, 200, 80, 69, 72, 128, 80, 69, 200, 80, 69, 69, 90, 73, 128, 80, - 69, 69, 83, 72, 73, 128, 80, 69, 69, 80, 128, 80, 69, 69, 77, 128, 80, - 69, 69, 73, 128, 80, 69, 69, 128, 80, 69, 68, 69, 83, 84, 82, 73, 65, 78, - 83, 128, 80, 69, 68, 69, 83, 84, 82, 73, 65, 78, 128, 80, 69, 68, 69, 83, - 84, 65, 76, 128, 80, 69, 68, 69, 83, 84, 65, 204, 80, 69, 68, 65, 204, - 80, 69, 65, 78, 85, 84, 83, 128, 80, 69, 65, 75, 211, 80, 69, 65, 67, 79, - 67, 75, 128, 80, 69, 65, 67, 72, 128, 80, 69, 65, 67, 69, 128, 80, 69, - 65, 67, 197, 80, 68, 73, 128, 80, 68, 70, 128, 80, 68, 128, 80, 67, 128, - 80, 65, 90, 69, 82, 128, 80, 65, 89, 69, 82, 79, 75, 128, 80, 65, 89, 65, - 78, 78, 65, 128, 80, 65, 89, 128, 80, 65, 88, 128, 80, 65, 87, 78, 128, - 80, 65, 215, 80, 65, 86, 73, 89, 65, 78, 73, 128, 80, 65, 85, 128, 80, - 65, 213, 80, 65, 84, 84, 69, 82, 78, 128, 80, 65, 84, 72, 65, 77, 65, 83, - 65, 84, 128, 80, 65, 84, 200, 80, 65, 84, 65, 75, 128, 80, 65, 84, 65, + 68, 207, 82, 68, 69, 204, 82, 66, 65, 83, 193, 82, 65, 90, 79, 82, 128, + 82, 65, 89, 83, 128, 82, 65, 89, 211, 82, 65, 89, 65, 78, 78, 65, 128, + 82, 65, 84, 73, 79, 128, 82, 65, 84, 72, 65, 128, 82, 65, 84, 72, 193, + 82, 65, 84, 65, 128, 82, 65, 84, 128, 82, 65, 83, 87, 65, 68, 73, 128, + 82, 65, 83, 79, 85, 204, 82, 65, 83, 72, 65, 128, 82, 65, 81, 128, 82, + 65, 80, 73, 83, 77, 65, 128, 82, 65, 78, 71, 197, 82, 65, 78, 65, 128, + 82, 65, 78, 128, 82, 65, 77, 211, 82, 65, 77, 66, 65, 84, 128, 82, 65, + 75, 72, 65, 78, 71, 128, 82, 65, 75, 65, 65, 82, 65, 65, 78, 83, 65, 89, + 65, 128, 82, 65, 73, 83, 73, 78, 199, 82, 65, 73, 83, 69, 68, 128, 82, + 65, 73, 83, 69, 196, 82, 65, 73, 78, 66, 79, 87, 128, 82, 65, 73, 76, 87, + 65, 89, 128, 82, 65, 73, 76, 87, 65, 217, 82, 65, 73, 76, 128, 82, 65, + 73, 68, 207, 82, 65, 73, 68, 65, 128, 82, 65, 72, 77, 65, 84, 85, 76, 76, + 65, 200, 82, 65, 72, 128, 82, 65, 70, 69, 128, 82, 65, 69, 77, 128, 82, + 65, 68, 73, 79, 65, 67, 84, 73, 86, 197, 82, 65, 68, 73, 79, 128, 82, 65, + 68, 73, 207, 82, 65, 68, 201, 82, 65, 68, 128, 82, 65, 196, 82, 65, 67, + 81, 85, 69, 212, 82, 65, 67, 73, 78, 71, 128, 82, 65, 67, 73, 78, 199, + 82, 65, 67, 67, 79, 79, 78, 128, 82, 65, 66, 66, 73, 84, 128, 82, 65, 66, + 66, 73, 212, 82, 65, 66, 128, 82, 65, 65, 73, 128, 82, 65, 51, 128, 82, + 65, 50, 128, 82, 65, 45, 75, 65, 82, 65, 128, 82, 65, 45, 52, 128, 82, + 65, 45, 51, 128, 82, 65, 45, 50, 128, 82, 65, 45, 49, 128, 82, 48, 50, + 57, 128, 82, 48, 50, 56, 128, 82, 48, 50, 55, 128, 82, 48, 50, 54, 128, + 82, 48, 50, 53, 128, 82, 48, 50, 52, 128, 82, 48, 50, 51, 128, 82, 48, + 50, 50, 128, 82, 48, 50, 49, 128, 82, 48, 50, 48, 128, 82, 48, 49, 57, + 128, 82, 48, 49, 56, 128, 82, 48, 49, 55, 128, 82, 48, 49, 54, 65, 128, + 82, 48, 49, 54, 128, 82, 48, 49, 53, 128, 82, 48, 49, 52, 128, 82, 48, + 49, 51, 128, 82, 48, 49, 50, 128, 82, 48, 49, 49, 128, 82, 48, 49, 48, + 65, 128, 82, 48, 49, 48, 128, 82, 48, 48, 57, 128, 82, 48, 48, 56, 128, + 82, 48, 48, 55, 128, 82, 48, 48, 54, 128, 82, 48, 48, 53, 128, 82, 48, + 48, 52, 128, 82, 48, 48, 51, 66, 128, 82, 48, 48, 51, 65, 128, 82, 48, + 48, 51, 128, 82, 48, 48, 50, 65, 128, 82, 48, 48, 50, 128, 82, 48, 48, + 49, 128, 82, 45, 67, 82, 69, 197, 81, 89, 88, 128, 81, 89, 85, 128, 81, + 89, 84, 128, 81, 89, 82, 88, 128, 81, 89, 82, 128, 81, 89, 80, 128, 81, + 89, 79, 128, 81, 89, 73, 128, 81, 89, 69, 69, 128, 81, 89, 69, 128, 81, + 89, 65, 65, 128, 81, 89, 65, 128, 81, 89, 128, 81, 87, 73, 128, 81, 87, + 69, 69, 128, 81, 87, 69, 128, 81, 87, 65, 65, 128, 81, 87, 65, 128, 81, + 85, 88, 128, 81, 85, 86, 128, 81, 85, 85, 86, 128, 81, 85, 85, 128, 81, + 85, 84, 128, 81, 85, 83, 72, 83, 72, 65, 89, 65, 128, 81, 85, 82, 88, + 128, 81, 85, 82, 128, 81, 85, 80, 128, 81, 85, 79, 88, 128, 81, 85, 79, + 84, 197, 81, 85, 79, 84, 65, 84, 73, 79, 206, 81, 85, 79, 84, 128, 81, + 85, 79, 80, 128, 81, 85, 79, 128, 81, 85, 75, 128, 81, 85, 73, 78, 84, + 73, 76, 69, 128, 81, 85, 73, 78, 84, 69, 83, 83, 69, 78, 67, 69, 128, 81, + 85, 73, 78, 68, 73, 67, 69, 83, 73, 77, 193, 81, 85, 73, 78, 67, 85, 78, + 88, 128, 81, 85, 73, 78, 65, 82, 73, 85, 211, 81, 85, 73, 76, 212, 81, + 85, 73, 76, 76, 128, 81, 85, 73, 67, 203, 81, 85, 73, 128, 81, 85, 70, + 128, 81, 85, 69, 83, 84, 73, 79, 78, 69, 196, 81, 85, 69, 83, 84, 73, 79, + 78, 128, 81, 85, 69, 83, 84, 73, 79, 206, 81, 85, 69, 69, 78, 128, 81, + 85, 69, 69, 206, 81, 85, 69, 128, 81, 85, 66, 85, 84, 83, 128, 81, 85, + 65, 84, 69, 82, 78, 73, 79, 206, 81, 85, 65, 82, 84, 69, 82, 83, 128, 81, + 85, 65, 82, 84, 69, 82, 211, 81, 85, 65, 82, 84, 69, 82, 128, 81, 85, 65, + 78, 84, 73, 84, 217, 81, 85, 65, 68, 82, 85, 80, 76, 197, 81, 85, 65, 68, + 82, 65, 78, 84, 128, 81, 85, 65, 68, 82, 65, 78, 212, 81, 85, 65, 68, 67, + 79, 76, 79, 78, 128, 81, 85, 65, 68, 128, 81, 85, 65, 196, 81, 85, 65, + 128, 81, 85, 128, 81, 208, 81, 79, 88, 128, 81, 79, 84, 128, 81, 79, 80, + 72, 128, 81, 79, 80, 65, 128, 81, 79, 80, 128, 81, 79, 79, 128, 81, 79, + 207, 81, 79, 70, 128, 81, 79, 198, 81, 79, 65, 128, 81, 79, 128, 81, 78, + 128, 81, 73, 88, 128, 81, 73, 84, 83, 65, 128, 81, 73, 84, 128, 81, 73, + 80, 128, 81, 73, 73, 128, 81, 73, 70, 128, 81, 73, 69, 88, 128, 81, 73, + 69, 84, 128, 81, 73, 69, 80, 128, 81, 73, 69, 128, 81, 73, 128, 81, 72, + 87, 73, 128, 81, 72, 87, 69, 69, 128, 81, 72, 87, 69, 128, 81, 72, 87, + 65, 65, 128, 81, 72, 87, 65, 128, 81, 72, 85, 128, 81, 72, 79, 80, 72, + 128, 81, 72, 79, 128, 81, 72, 73, 128, 81, 72, 69, 69, 128, 81, 72, 69, + 128, 81, 72, 65, 85, 128, 81, 72, 65, 65, 128, 81, 72, 65, 128, 81, 71, + 65, 128, 81, 69, 84, 65, 78, 65, 128, 81, 69, 69, 128, 81, 69, 128, 81, + 65, 89, 128, 81, 65, 85, 128, 81, 65, 84, 65, 78, 128, 81, 65, 82, 78, + 69, 217, 81, 65, 82, 128, 81, 65, 81, 128, 81, 65, 80, 72, 128, 81, 65, + 77, 65, 84, 83, 128, 81, 65, 77, 65, 84, 211, 81, 65, 76, 193, 81, 65, + 73, 82, 84, 72, 82, 65, 128, 81, 65, 73, 128, 81, 65, 70, 128, 81, 65, + 198, 81, 65, 68, 77, 65, 128, 81, 65, 65, 73, 128, 81, 65, 65, 70, 85, + 128, 81, 65, 65, 70, 128, 81, 48, 48, 55, 128, 81, 48, 48, 54, 128, 81, + 48, 48, 53, 128, 81, 48, 48, 52, 128, 81, 48, 48, 51, 128, 81, 48, 48, + 50, 128, 81, 48, 48, 49, 128, 80, 90, 128, 80, 89, 88, 128, 80, 89, 84, + 128, 80, 89, 82, 88, 128, 80, 89, 82, 128, 80, 89, 80, 128, 80, 87, 79, + 89, 128, 80, 87, 79, 79, 128, 80, 87, 79, 128, 80, 87, 207, 80, 87, 73, + 73, 128, 80, 87, 73, 128, 80, 87, 69, 69, 128, 80, 87, 69, 128, 80, 87, + 65, 65, 128, 80, 87, 128, 80, 86, 128, 80, 85, 90, 90, 76, 197, 80, 85, + 88, 128, 80, 85, 85, 84, 128, 80, 85, 85, 128, 80, 85, 84, 82, 69, 70, + 65, 67, 84, 73, 79, 78, 128, 80, 85, 84, 128, 80, 85, 212, 80, 85, 83, + 72, 80, 73, 78, 128, 80, 85, 83, 72, 80, 73, 75, 65, 128, 80, 85, 83, 72, + 73, 78, 199, 80, 85, 82, 88, 128, 80, 85, 82, 83, 69, 128, 80, 85, 82, + 80, 76, 197, 80, 85, 82, 78, 65, 77, 65, 128, 80, 85, 82, 73, 84, 89, + 128, 80, 85, 82, 73, 70, 89, 128, 80, 85, 82, 128, 80, 85, 81, 128, 80, + 85, 80, 128, 80, 85, 79, 88, 128, 80, 85, 79, 80, 128, 80, 85, 79, 128, + 80, 85, 78, 71, 65, 65, 77, 128, 80, 85, 78, 71, 128, 80, 85, 78, 67, 84, + 85, 211, 80, 85, 78, 67, 84, 85, 65, 84, 73, 79, 78, 128, 80, 85, 78, 67, + 84, 85, 65, 84, 73, 79, 206, 80, 85, 77, 80, 128, 80, 85, 77, 128, 80, + 85, 70, 70, 69, 68, 128, 80, 85, 69, 128, 80, 85, 67, 75, 128, 80, 85, + 66, 76, 73, 195, 80, 85, 194, 80, 85, 65, 81, 128, 80, 85, 65, 69, 128, + 80, 85, 65, 67, 72, 85, 197, 80, 85, 50, 128, 80, 85, 49, 128, 80, 85, + 128, 80, 84, 72, 65, 72, 193, 80, 84, 69, 128, 80, 83, 73, 76, 201, 80, + 83, 73, 70, 73, 83, 84, 79, 83, 89, 78, 65, 71, 77, 65, 128, 80, 83, 73, + 70, 73, 83, 84, 79, 80, 65, 82, 65, 75, 65, 76, 69, 83, 77, 65, 128, 80, + 83, 73, 70, 73, 83, 84, 79, 206, 80, 83, 73, 70, 73, 83, 84, 79, 76, 89, + 71, 73, 83, 77, 65, 128, 80, 83, 73, 128, 80, 83, 65, 76, 84, 69, 210, + 80, 83, 128, 80, 82, 79, 86, 69, 128, 80, 82, 79, 84, 79, 86, 65, 82, 89, + 211, 80, 82, 79, 84, 79, 211, 80, 82, 79, 84, 69, 67, 84, 69, 196, 80, + 82, 79, 83, 71, 69, 71, 82, 65, 77, 77, 69, 78, 73, 128, 80, 82, 79, 83, + 69, 82, 80, 73, 78, 65, 128, 80, 82, 79, 80, 79, 82, 84, 73, 79, 78, 65, + 204, 80, 82, 79, 80, 79, 82, 84, 73, 79, 78, 128, 80, 82, 79, 80, 69, 82, + 84, 217, 80, 82, 79, 80, 69, 76, 76, 69, 210, 80, 82, 79, 79, 70, 128, + 80, 82, 79, 76, 79, 78, 71, 69, 196, 80, 82, 79, 76, 65, 84, 73, 79, 78, + 197, 80, 82, 79, 74, 69, 67, 84, 79, 82, 128, 80, 82, 79, 74, 69, 67, 84, + 73, 86, 69, 128, 80, 82, 79, 74, 69, 67, 84, 73, 79, 78, 128, 80, 82, 79, + 72, 73, 66, 73, 84, 69, 196, 80, 82, 79, 71, 82, 69, 83, 83, 128, 80, 82, + 79, 71, 82, 65, 205, 80, 82, 79, 70, 79, 85, 78, 68, 128, 80, 82, 79, 68, + 85, 67, 84, 128, 80, 82, 79, 68, 85, 67, 212, 80, 82, 79, 66, 73, 78, + 199, 80, 82, 73, 86, 65, 84, 69, 128, 80, 82, 73, 86, 65, 84, 197, 80, + 82, 73, 86, 65, 67, 217, 80, 82, 73, 83, 72, 84, 72, 65, 77, 65, 84, 82, + 193, 80, 82, 73, 78, 84, 83, 128, 80, 82, 73, 78, 84, 69, 82, 128, 80, + 82, 73, 78, 84, 69, 210, 80, 82, 73, 78, 84, 128, 80, 82, 73, 78, 212, + 80, 82, 73, 78, 67, 69, 83, 83, 128, 80, 82, 73, 78, 67, 69, 128, 80, 82, + 73, 77, 69, 128, 80, 82, 73, 77, 197, 80, 82, 69, 86, 73, 79, 85, 211, + 80, 82, 69, 84, 90, 69, 76, 128, 80, 82, 69, 83, 83, 69, 196, 80, 82, 69, + 83, 69, 84, 128, 80, 82, 69, 83, 69, 78, 84, 65, 84, 73, 79, 206, 80, 82, + 69, 83, 67, 82, 73, 80, 84, 73, 79, 206, 80, 82, 69, 80, 79, 78, 68, 69, + 82, 65, 78, 67, 69, 128, 80, 82, 69, 78, 75, 72, 65, 128, 80, 82, 69, 71, + 78, 65, 78, 212, 80, 82, 69, 70, 73, 88, 69, 196, 80, 82, 69, 70, 65, 67, + 197, 80, 82, 69, 67, 73, 80, 73, 84, 65, 84, 69, 128, 80, 82, 69, 67, 69, + 68, 73, 78, 199, 80, 82, 69, 67, 69, 68, 69, 83, 128, 80, 82, 69, 67, 69, + 68, 69, 211, 80, 82, 69, 67, 69, 68, 69, 196, 80, 82, 69, 67, 69, 68, 69, + 128, 80, 82, 69, 67, 69, 68, 197, 80, 82, 65, 89, 69, 210, 80, 82, 65, + 77, 45, 80, 73, 73, 128, 80, 82, 65, 77, 45, 80, 73, 201, 80, 82, 65, 77, + 45, 77, 85, 79, 89, 128, 80, 82, 65, 77, 45, 77, 85, 79, 217, 80, 82, 65, + 77, 45, 66, 85, 79, 78, 128, 80, 82, 65, 77, 45, 66, 85, 79, 206, 80, 82, + 65, 77, 45, 66, 69, 73, 128, 80, 82, 65, 77, 45, 66, 69, 201, 80, 82, 65, + 77, 128, 80, 82, 65, 205, 80, 82, 128, 80, 80, 86, 128, 80, 80, 77, 128, + 80, 80, 65, 128, 80, 79, 89, 128, 80, 79, 88, 128, 80, 79, 87, 69, 82, + 211, 80, 79, 87, 69, 82, 128, 80, 79, 87, 69, 210, 80, 79, 87, 68, 69, + 82, 69, 196, 80, 79, 87, 68, 69, 82, 128, 80, 79, 85, 78, 196, 80, 79, + 85, 76, 84, 82, 217, 80, 79, 85, 67, 72, 128, 80, 79, 84, 65, 84, 79, + 128, 80, 79, 84, 65, 66, 76, 197, 80, 79, 212, 80, 79, 83, 84, 80, 79, + 83, 73, 84, 73, 79, 206, 80, 79, 83, 84, 66, 79, 88, 128, 80, 79, 83, 84, + 65, 204, 80, 79, 83, 84, 128, 80, 79, 83, 212, 80, 79, 83, 83, 69, 83, + 83, 73, 79, 78, 128, 80, 79, 83, 83, 69, 83, 83, 73, 79, 206, 80, 79, 83, + 73, 84, 73, 79, 78, 83, 128, 80, 79, 83, 73, 84, 73, 79, 78, 128, 80, 79, + 83, 69, 73, 68, 79, 78, 128, 80, 79, 82, 84, 65, 66, 76, 197, 80, 79, 82, + 82, 69, 67, 84, 85, 83, 128, 80, 79, 82, 82, 69, 67, 84, 85, 211, 80, 79, + 80, 80, 73, 78, 199, 80, 79, 80, 80, 69, 82, 128, 80, 79, 80, 67, 79, 82, + 78, 128, 80, 79, 80, 128, 80, 79, 208, 80, 79, 79, 68, 76, 69, 128, 80, + 79, 79, 128, 80, 79, 78, 68, 79, 128, 80, 79, 206, 80, 79, 77, 77, 69, + 69, 128, 80, 79, 77, 77, 69, 197, 80, 79, 76, 79, 128, 80, 79, 76, 73, + 83, 72, 128, 80, 79, 76, 73, 67, 197, 80, 79, 76, 201, 80, 79, 76, 69, + 128, 80, 79, 76, 197, 80, 79, 75, 82, 89, 84, 73, 69, 128, 80, 79, 75, + 79, 74, 73, 128, 80, 79, 73, 78, 84, 211, 80, 79, 73, 78, 84, 79, 128, + 80, 79, 73, 78, 84, 69, 82, 128, 80, 79, 73, 78, 84, 69, 196, 80, 79, 73, + 78, 84, 128, 80, 79, 73, 78, 212, 80, 79, 69, 84, 82, 217, 80, 79, 69, + 84, 73, 195, 80, 79, 68, 65, 84, 85, 83, 128, 80, 79, 67, 75, 69, 212, + 80, 79, 65, 128, 80, 79, 128, 80, 207, 80, 78, 69, 85, 77, 65, 84, 65, + 128, 80, 76, 85, 84, 207, 80, 76, 85, 84, 65, 128, 80, 76, 85, 83, 45, + 77, 73, 78, 85, 211, 80, 76, 85, 83, 128, 80, 76, 85, 82, 65, 76, 128, + 80, 76, 85, 77, 69, 196, 80, 76, 85, 77, 128, 80, 76, 85, 75, 128, 80, + 76, 85, 71, 128, 80, 76, 85, 128, 80, 76, 79, 87, 128, 80, 76, 79, 80, + 72, 85, 128, 80, 76, 72, 65, 85, 128, 80, 76, 69, 84, 72, 82, 79, 78, + 128, 80, 76, 69, 65, 68, 73, 78, 199, 80, 76, 68, 128, 80, 76, 65, 89, + 73, 78, 199, 80, 76, 65, 84, 69, 128, 80, 76, 65, 83, 84, 73, 67, 83, + 128, 80, 76, 65, 78, 69, 84, 128, 80, 76, 65, 78, 69, 128, 80, 76, 65, + 78, 67, 203, 80, 76, 65, 75, 128, 80, 76, 65, 71, 73, 79, 211, 80, 76, + 65, 67, 69, 72, 79, 76, 68, 69, 82, 128, 80, 76, 65, 67, 69, 72, 79, 76, + 68, 69, 210, 80, 76, 65, 67, 197, 80, 76, 65, 128, 80, 73, 90, 90, 73, + 67, 65, 84, 79, 128, 80, 73, 90, 90, 65, 128, 80, 73, 88, 128, 80, 73, + 87, 82, 128, 80, 73, 84, 67, 72, 70, 79, 82, 75, 128, 80, 73, 84, 67, 72, + 70, 79, 82, 203, 80, 73, 84, 128, 80, 73, 83, 84, 79, 76, 128, 80, 73, + 83, 69, 76, 69, 72, 128, 80, 73, 83, 67, 69, 83, 128, 80, 73, 82, 73, 71, + 128, 80, 73, 82, 73, 199, 80, 73, 82, 73, 69, 69, 78, 128, 80, 73, 82, + 65, 67, 89, 128, 80, 73, 82, 50, 128, 80, 73, 80, 73, 78, 71, 128, 80, + 73, 80, 65, 69, 77, 71, 66, 73, 69, 69, 128, 80, 73, 80, 65, 69, 77, 66, + 65, 128, 80, 73, 80, 128, 80, 73, 78, 87, 72, 69, 69, 204, 80, 73, 78, + 69, 65, 80, 80, 76, 69, 128, 80, 73, 78, 197, 80, 73, 78, 67, 72, 73, 78, + 199, 80, 73, 78, 65, 82, 66, 79, 82, 65, 83, 128, 80, 73, 76, 76, 128, + 80, 73, 76, 197, 80, 73, 76, 67, 82, 79, 215, 80, 73, 75, 85, 82, 85, + 128, 80, 73, 75, 79, 128, 80, 73, 71, 128, 80, 73, 199, 80, 73, 69, 88, + 128, 80, 73, 69, 85, 80, 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 73, 69, + 85, 80, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 80, 73, 69, 85, 80, + 45, 83, 73, 79, 83, 45, 84, 73, 75, 69, 85, 84, 128, 80, 73, 69, 85, 80, + 45, 83, 73, 79, 83, 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 73, 69, 85, + 80, 45, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, 128, 80, 73, 69, 85, 80, + 45, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, 80, 73, 69, 85, 80, + 45, 83, 73, 79, 83, 45, 67, 73, 69, 85, 67, 128, 80, 73, 69, 85, 80, 45, + 82, 73, 69, 85, 76, 45, 80, 72, 73, 69, 85, 80, 72, 128, 80, 73, 69, 85, + 80, 45, 82, 73, 69, 85, 76, 128, 80, 73, 69, 85, 80, 45, 78, 73, 69, 85, + 78, 128, 80, 73, 69, 85, 80, 45, 77, 73, 69, 85, 77, 128, 80, 73, 69, 85, + 80, 45, 75, 72, 73, 69, 85, 75, 72, 128, 80, 73, 69, 85, 80, 45, 67, 73, + 69, 85, 67, 128, 80, 73, 69, 85, 80, 45, 67, 72, 73, 69, 85, 67, 72, 128, + 80, 73, 69, 85, 208, 80, 73, 69, 84, 128, 80, 73, 69, 80, 128, 80, 73, + 69, 69, 84, 128, 80, 73, 69, 69, 81, 128, 80, 73, 69, 67, 69, 128, 80, + 73, 69, 128, 80, 73, 67, 84, 85, 82, 69, 128, 80, 73, 67, 75, 69, 84, + 128, 80, 73, 67, 75, 128, 80, 73, 65, 83, 85, 84, 79, 82, 85, 128, 80, + 73, 65, 83, 77, 193, 80, 73, 65, 78, 79, 128, 80, 201, 80, 72, 87, 65, + 128, 80, 72, 85, 84, 72, 65, 79, 128, 80, 72, 85, 210, 80, 72, 85, 78, + 71, 128, 80, 72, 82, 65, 83, 69, 128, 80, 72, 79, 78, 69, 83, 128, 80, + 72, 79, 76, 85, 83, 128, 80, 72, 79, 69, 78, 73, 67, 73, 65, 206, 80, 72, + 79, 65, 128, 80, 72, 79, 128, 80, 72, 207, 80, 72, 78, 65, 69, 203, 80, + 72, 73, 78, 84, 72, 85, 128, 80, 72, 73, 76, 79, 83, 79, 80, 72, 69, 82, + 211, 80, 72, 73, 76, 73, 80, 80, 73, 78, 197, 80, 72, 73, 69, 85, 80, 72, + 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 72, 73, 69, 85, 80, 72, 45, 83, + 73, 79, 83, 128, 80, 72, 73, 69, 85, 80, 72, 45, 80, 73, 69, 85, 80, 128, + 80, 72, 73, 69, 85, 80, 72, 45, 72, 73, 69, 85, 72, 128, 80, 72, 73, 69, + 85, 80, 200, 80, 72, 73, 128, 80, 72, 201, 80, 72, 69, 69, 128, 80, 72, + 69, 128, 80, 72, 65, 83, 69, 45, 198, 80, 72, 65, 83, 69, 45, 194, 80, + 72, 65, 83, 69, 45, 193, 80, 72, 65, 82, 89, 78, 71, 69, 65, 204, 80, 72, + 65, 82, 128, 80, 72, 65, 78, 128, 80, 72, 65, 77, 128, 80, 72, 65, 73, + 83, 84, 79, 211, 80, 72, 65, 71, 83, 45, 80, 193, 80, 72, 65, 66, 128, + 80, 72, 65, 65, 82, 75, 65, 65, 128, 80, 72, 65, 65, 128, 80, 71, 128, + 80, 70, 128, 80, 69, 85, 88, 128, 80, 69, 85, 84, 65, 69, 128, 80, 69, + 85, 84, 128, 80, 69, 84, 82, 201, 80, 69, 84, 65, 83, 84, 79, 75, 79, 85, + 70, 73, 83, 77, 65, 128, 80, 69, 84, 65, 83, 84, 73, 128, 80, 69, 84, 65, + 83, 77, 65, 128, 80, 69, 84, 65, 76, 76, 69, 196, 80, 69, 83, 79, 128, + 80, 69, 83, 207, 80, 69, 83, 72, 50, 128, 80, 69, 83, 72, 178, 80, 69, + 83, 69, 84, 193, 80, 69, 211, 80, 69, 82, 84, 72, 207, 80, 69, 82, 83, + 80, 69, 67, 84, 73, 86, 69, 128, 80, 69, 82, 83, 79, 78, 65, 204, 80, 69, + 82, 83, 79, 78, 128, 80, 69, 82, 83, 79, 206, 80, 69, 82, 83, 73, 65, + 206, 80, 69, 82, 83, 69, 86, 69, 82, 73, 78, 199, 80, 69, 82, 80, 69, 78, + 68, 73, 67, 85, 76, 65, 82, 128, 80, 69, 82, 80, 69, 78, 68, 73, 67, 85, + 76, 65, 210, 80, 69, 82, 78, 73, 206, 80, 69, 82, 77, 73, 84, 84, 69, + 196, 80, 69, 82, 77, 73, 195, 80, 69, 82, 77, 65, 78, 69, 78, 212, 80, + 69, 82, 73, 83, 80, 79, 77, 69, 78, 73, 128, 80, 69, 82, 73, 83, 80, 79, + 77, 69, 78, 201, 80, 69, 82, 70, 79, 82, 77, 73, 78, 199, 80, 69, 82, 70, + 69, 67, 84, 85, 205, 80, 69, 82, 70, 69, 67, 84, 65, 128, 80, 69, 82, 70, + 69, 67, 84, 193, 80, 69, 82, 67, 85, 83, 83, 73, 86, 69, 128, 80, 69, 82, + 67, 69, 78, 212, 80, 69, 80, 80, 69, 82, 128, 80, 69, 80, 69, 84, 128, + 80, 69, 80, 69, 212, 80, 69, 79, 82, 84, 200, 80, 69, 79, 80, 76, 69, + 128, 80, 69, 78, 84, 65, 84, 72, 76, 79, 78, 128, 80, 69, 78, 84, 65, 83, + 69, 77, 69, 128, 80, 69, 78, 84, 65, 71, 82, 65, 77, 128, 80, 69, 78, 84, + 65, 71, 79, 78, 128, 80, 69, 78, 83, 85, 128, 80, 69, 78, 83, 73, 86, + 197, 80, 69, 78, 78, 217, 80, 69, 78, 78, 65, 78, 84, 128, 80, 69, 78, + 73, 72, 73, 128, 80, 69, 78, 71, 85, 73, 78, 128, 80, 69, 78, 71, 75, 65, + 76, 128, 80, 69, 78, 69, 84, 82, 65, 84, 73, 79, 78, 128, 80, 69, 78, 67, + 73, 76, 128, 80, 69, 76, 65, 83, 84, 79, 78, 128, 80, 69, 76, 65, 83, 84, + 79, 206, 80, 69, 73, 84, 72, 128, 80, 69, 72, 69, 72, 128, 80, 69, 72, + 69, 200, 80, 69, 72, 128, 80, 69, 200, 80, 69, 69, 90, 73, 128, 80, 69, + 69, 83, 72, 73, 128, 80, 69, 69, 80, 128, 80, 69, 69, 77, 128, 80, 69, + 69, 73, 128, 80, 69, 69, 128, 80, 69, 68, 69, 83, 84, 82, 73, 65, 78, 83, + 128, 80, 69, 68, 69, 83, 84, 82, 73, 65, 78, 128, 80, 69, 68, 69, 83, 84, + 65, 76, 128, 80, 69, 68, 69, 83, 84, 65, 204, 80, 69, 68, 65, 204, 80, + 69, 65, 78, 85, 84, 83, 128, 80, 69, 65, 75, 211, 80, 69, 65, 67, 79, 67, + 75, 128, 80, 69, 65, 67, 72, 128, 80, 69, 65, 67, 69, 128, 80, 69, 65, + 67, 197, 80, 68, 73, 128, 80, 68, 70, 128, 80, 68, 128, 80, 67, 128, 80, + 65, 90, 69, 82, 128, 80, 65, 89, 69, 82, 79, 75, 128, 80, 65, 89, 65, 78, + 78, 65, 128, 80, 65, 89, 128, 80, 65, 88, 128, 80, 65, 87, 78, 128, 80, + 65, 87, 206, 80, 65, 215, 80, 65, 86, 73, 89, 65, 78, 73, 128, 80, 65, + 85, 83, 197, 80, 65, 85, 128, 80, 65, 213, 80, 65, 84, 84, 69, 82, 78, + 128, 80, 65, 84, 72, 65, 77, 65, 83, 65, 84, 128, 80, 65, 84, 72, 65, 75, + 75, 85, 128, 80, 65, 84, 200, 80, 65, 84, 65, 75, 128, 80, 65, 84, 65, 72, 128, 80, 65, 84, 128, 80, 65, 83, 85, 81, 128, 80, 65, 83, 83, 80, 79, 82, 212, 80, 65, 83, 83, 73, 86, 69, 45, 80, 85, 76, 76, 45, 85, 80, 45, 79, 85, 84, 80, 85, 212, 80, 65, 83, 83, 73, 86, 69, 45, 80, 85, 76, @@ -1820,65 +1844,69 @@ static unsigned char lexicon[] = { 80, 65, 82, 65, 75, 65, 76, 69, 83, 77, 193, 80, 65, 82, 65, 71, 82, 65, 80, 72, 85, 211, 80, 65, 82, 65, 71, 82, 65, 80, 72, 79, 83, 128, 80, 65, 82, 65, 71, 82, 65, 80, 72, 128, 80, 65, 82, 65, 71, 82, 65, 80, 200, 80, - 65, 82, 65, 128, 80, 65, 82, 128, 80, 65, 80, 89, 82, 85, 83, 128, 80, - 65, 80, 69, 82, 67, 76, 73, 80, 83, 128, 80, 65, 80, 69, 82, 67, 76, 73, - 80, 128, 80, 65, 80, 69, 82, 128, 80, 65, 80, 69, 210, 80, 65, 80, 128, - 80, 65, 208, 80, 65, 207, 80, 65, 78, 89, 85, 75, 85, 128, 80, 65, 78, - 89, 73, 75, 85, 128, 80, 65, 78, 89, 69, 67, 69, 75, 128, 80, 65, 78, 89, - 65, 78, 71, 71, 65, 128, 80, 65, 78, 89, 65, 75, 82, 65, 128, 80, 65, 78, - 84, 73, 128, 80, 65, 78, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, 128, 80, - 65, 78, 83, 73, 79, 83, 45, 75, 65, 80, 89, 69, 79, 85, 78, 80, 73, 69, - 85, 80, 128, 80, 65, 78, 79, 78, 71, 79, 78, 65, 78, 128, 80, 65, 78, 79, - 76, 79, 78, 71, 128, 80, 65, 78, 71, 87, 73, 83, 65, 68, 128, 80, 65, 78, - 71, 82, 65, 78, 71, 75, 69, 80, 128, 80, 65, 78, 71, 79, 76, 65, 84, 128, - 80, 65, 78, 71, 76, 79, 78, 71, 128, 80, 65, 78, 71, 76, 65, 89, 65, 82, - 128, 80, 65, 78, 71, 75, 79, 78, 128, 80, 65, 78, 71, 75, 65, 84, 128, - 80, 65, 78, 71, 72, 85, 76, 85, 128, 80, 65, 78, 71, 128, 80, 65, 78, 69, - 85, 76, 69, 85, 78, 71, 128, 80, 65, 78, 68, 193, 80, 65, 78, 67, 65, 75, - 69, 83, 128, 80, 65, 78, 65, 69, 76, 65, 69, 78, 71, 128, 80, 65, 78, - 128, 80, 65, 206, 80, 65, 77, 85, 78, 71, 75, 65, 72, 128, 80, 65, 77, - 85, 68, 80, 79, 68, 128, 80, 65, 77, 83, 72, 65, 69, 128, 80, 65, 77, 80, - 72, 89, 76, 73, 65, 206, 80, 65, 77, 73, 78, 71, 75, 65, 76, 128, 80, 65, - 77, 69, 80, 69, 84, 128, 80, 65, 77, 69, 78, 69, 78, 71, 128, 80, 65, 77, - 65, 68, 65, 128, 80, 65, 77, 65, 65, 69, 72, 128, 80, 65, 76, 85, 84, 65, - 128, 80, 65, 76, 79, 67, 72, 75, 65, 128, 80, 65, 76, 77, 89, 82, 69, 78, - 197, 80, 65, 76, 77, 211, 80, 65, 76, 77, 128, 80, 65, 76, 205, 80, 65, - 76, 76, 65, 87, 65, 128, 80, 65, 76, 76, 65, 83, 128, 80, 65, 76, 69, 84, - 84, 69, 128, 80, 65, 76, 65, 85, 78, 199, 80, 65, 76, 65, 84, 65, 76, 73, - 90, 69, 196, 80, 65, 76, 65, 84, 65, 76, 73, 90, 65, 84, 73, 79, 78, 128, - 80, 65, 76, 65, 84, 65, 204, 80, 65, 75, 80, 65, 203, 80, 65, 73, 89, 65, - 78, 78, 79, 73, 128, 80, 65, 73, 82, 84, 72, 82, 65, 128, 80, 65, 73, 82, - 69, 196, 80, 65, 73, 78, 84, 66, 82, 85, 83, 72, 128, 80, 65, 73, 128, - 80, 65, 72, 76, 65, 86, 201, 80, 65, 72, 128, 80, 65, 71, 79, 68, 65, - 128, 80, 65, 71, 69, 83, 128, 80, 65, 71, 69, 82, 128, 80, 65, 71, 197, - 80, 65, 68, 77, 193, 80, 65, 68, 68, 76, 197, 80, 65, 68, 68, 73, 78, - 199, 80, 65, 68, 193, 80, 65, 68, 128, 80, 65, 67, 75, 73, 78, 71, 128, - 80, 65, 67, 75, 65, 71, 69, 128, 80, 65, 65, 84, 85, 128, 80, 65, 65, 83, - 69, 78, 84, 79, 128, 80, 65, 65, 82, 65, 69, 128, 80, 65, 65, 77, 128, - 80, 65, 65, 73, 128, 80, 65, 65, 45, 80, 73, 76, 76, 65, 128, 80, 65, 65, - 128, 80, 50, 128, 80, 48, 49, 49, 128, 80, 48, 49, 48, 128, 80, 48, 48, - 57, 128, 80, 48, 48, 56, 128, 80, 48, 48, 55, 128, 80, 48, 48, 54, 128, - 80, 48, 48, 53, 128, 80, 48, 48, 52, 128, 80, 48, 48, 51, 65, 128, 80, - 48, 48, 51, 128, 80, 48, 48, 50, 128, 80, 48, 48, 49, 65, 128, 80, 48, - 48, 49, 128, 79, 89, 82, 65, 78, 73, 83, 77, 193, 79, 89, 65, 78, 78, 65, - 128, 79, 88, 73, 65, 128, 79, 88, 73, 193, 79, 88, 69, 73, 65, 201, 79, - 88, 69, 73, 193, 79, 87, 76, 128, 79, 86, 69, 82, 82, 73, 68, 69, 128, - 79, 86, 69, 82, 76, 79, 78, 199, 79, 86, 69, 82, 76, 73, 78, 69, 128, 79, - 86, 69, 82, 76, 65, 89, 128, 79, 86, 69, 82, 76, 65, 80, 80, 73, 78, 199, - 79, 86, 69, 82, 76, 65, 80, 128, 79, 86, 69, 82, 76, 65, 73, 68, 128, 79, - 86, 69, 82, 72, 69, 65, 84, 69, 196, 79, 86, 69, 82, 66, 65, 82, 128, 79, - 86, 65, 76, 128, 79, 86, 65, 204, 79, 85, 84, 76, 73, 78, 69, 196, 79, - 85, 84, 76, 73, 78, 69, 128, 79, 85, 84, 69, 210, 79, 85, 84, 66, 79, - 216, 79, 85, 78, 75, 73, 193, 79, 85, 78, 67, 69, 128, 79, 85, 78, 67, - 197, 79, 84, 85, 128, 79, 84, 84, 65, 86, 193, 79, 84, 84, 128, 79, 84, - 72, 69, 82, 211, 79, 84, 72, 69, 210, 79, 84, 72, 65, 76, 65, 206, 79, - 84, 72, 65, 76, 128, 79, 83, 77, 65, 78, 89, 193, 79, 83, 67, 128, 79, - 83, 65, 71, 197, 79, 82, 84, 72, 79, 71, 79, 78, 65, 204, 79, 82, 84, 72, - 79, 68, 79, 216, 79, 82, 78, 65, 84, 197, 79, 82, 78, 65, 77, 69, 78, 84, - 83, 128, 79, 82, 78, 65, 77, 69, 78, 84, 128, 79, 82, 78, 65, 77, 69, 78, - 212, 79, 82, 75, 72, 79, 206, 79, 82, 73, 89, 193, 79, 82, 73, 71, 73, - 78, 65, 204, 79, 82, 73, 71, 73, 78, 128, 79, 82, 69, 45, 50, 128, 79, - 82, 68, 73, 78, 65, 204, 79, 82, 68, 69, 210, 79, 82, 67, 72, 73, 68, + 65, 82, 65, 67, 72, 85, 84, 69, 128, 80, 65, 82, 65, 128, 80, 65, 82, + 128, 80, 65, 80, 89, 82, 85, 83, 128, 80, 65, 80, 69, 82, 67, 76, 73, 80, + 83, 128, 80, 65, 80, 69, 82, 67, 76, 73, 80, 128, 80, 65, 80, 69, 82, + 128, 80, 65, 80, 69, 210, 80, 65, 80, 128, 80, 65, 208, 80, 65, 207, 80, + 65, 78, 89, 85, 75, 85, 128, 80, 65, 78, 89, 73, 75, 85, 128, 80, 65, 78, + 89, 69, 67, 69, 75, 128, 80, 65, 78, 89, 65, 78, 71, 71, 65, 128, 80, 65, + 78, 89, 65, 75, 82, 65, 128, 80, 65, 78, 84, 73, 128, 80, 65, 78, 83, 73, + 79, 83, 45, 80, 73, 69, 85, 80, 128, 80, 65, 78, 83, 73, 79, 83, 45, 75, + 65, 80, 89, 69, 79, 85, 78, 80, 73, 69, 85, 80, 128, 80, 65, 78, 79, 78, + 71, 79, 78, 65, 78, 128, 80, 65, 78, 79, 76, 79, 78, 71, 128, 80, 65, 78, + 71, 87, 73, 83, 65, 68, 128, 80, 65, 78, 71, 82, 65, 78, 71, 75, 69, 80, + 128, 80, 65, 78, 71, 79, 76, 65, 84, 128, 80, 65, 78, 71, 76, 79, 78, 71, + 128, 80, 65, 78, 71, 76, 65, 89, 65, 82, 128, 80, 65, 78, 71, 75, 79, 78, + 128, 80, 65, 78, 71, 75, 65, 84, 128, 80, 65, 78, 71, 72, 85, 76, 85, + 128, 80, 65, 78, 71, 128, 80, 65, 78, 69, 85, 76, 69, 85, 78, 71, 128, + 80, 65, 78, 68, 193, 80, 65, 78, 67, 65, 75, 69, 83, 128, 80, 65, 78, 65, + 77, 128, 80, 65, 78, 65, 69, 76, 65, 69, 78, 71, 128, 80, 65, 78, 128, + 80, 65, 206, 80, 65, 77, 85, 78, 71, 75, 65, 72, 128, 80, 65, 77, 85, 68, + 80, 79, 68, 128, 80, 65, 77, 83, 72, 65, 69, 128, 80, 65, 77, 80, 72, 89, + 76, 73, 65, 206, 80, 65, 77, 73, 78, 71, 75, 65, 76, 128, 80, 65, 77, 69, + 80, 69, 84, 128, 80, 65, 77, 69, 78, 69, 78, 71, 128, 80, 65, 77, 65, 68, + 65, 128, 80, 65, 77, 65, 65, 69, 72, 128, 80, 65, 76, 85, 84, 65, 128, + 80, 65, 76, 79, 67, 72, 75, 65, 128, 80, 65, 76, 77, 89, 82, 69, 78, 197, + 80, 65, 76, 77, 211, 80, 65, 76, 77, 128, 80, 65, 76, 205, 80, 65, 76, + 76, 65, 87, 65, 128, 80, 65, 76, 76, 65, 83, 128, 80, 65, 76, 201, 80, + 65, 76, 69, 84, 84, 69, 128, 80, 65, 76, 65, 85, 78, 199, 80, 65, 76, 65, + 84, 65, 76, 73, 90, 69, 196, 80, 65, 76, 65, 84, 65, 76, 73, 90, 65, 84, + 73, 79, 78, 128, 80, 65, 76, 65, 84, 65, 204, 80, 65, 75, 80, 65, 203, + 80, 65, 73, 89, 65, 78, 78, 79, 73, 128, 80, 65, 73, 82, 84, 72, 82, 65, + 128, 80, 65, 73, 82, 69, 196, 80, 65, 73, 78, 84, 66, 82, 85, 83, 72, + 128, 80, 65, 73, 128, 80, 65, 72, 76, 65, 86, 201, 80, 65, 72, 128, 80, + 65, 71, 79, 68, 65, 128, 80, 65, 71, 69, 83, 128, 80, 65, 71, 69, 82, + 128, 80, 65, 71, 197, 80, 65, 68, 77, 193, 80, 65, 68, 68, 76, 197, 80, + 65, 68, 68, 73, 78, 199, 80, 65, 68, 193, 80, 65, 68, 128, 80, 65, 67, + 75, 73, 78, 71, 128, 80, 65, 67, 75, 65, 71, 69, 128, 80, 65, 65, 84, 85, + 128, 80, 65, 65, 83, 69, 78, 84, 79, 128, 80, 65, 65, 82, 65, 77, 128, + 80, 65, 65, 82, 65, 69, 128, 80, 65, 65, 77, 128, 80, 65, 65, 73, 128, + 80, 65, 65, 45, 80, 73, 76, 76, 65, 128, 80, 65, 65, 128, 80, 50, 128, + 80, 48, 49, 49, 128, 80, 48, 49, 48, 128, 80, 48, 48, 57, 128, 80, 48, + 48, 56, 128, 80, 48, 48, 55, 128, 80, 48, 48, 54, 128, 80, 48, 48, 53, + 128, 80, 48, 48, 52, 128, 80, 48, 48, 51, 65, 128, 80, 48, 48, 51, 128, + 80, 48, 48, 50, 128, 80, 48, 48, 49, 65, 128, 80, 48, 48, 49, 128, 79, + 89, 83, 84, 69, 82, 128, 79, 89, 82, 65, 78, 73, 83, 77, 193, 79, 89, 65, + 78, 78, 65, 128, 79, 88, 73, 65, 128, 79, 88, 73, 193, 79, 88, 69, 73, + 65, 201, 79, 88, 69, 73, 193, 79, 87, 76, 128, 79, 86, 69, 82, 82, 73, + 68, 69, 128, 79, 86, 69, 82, 76, 79, 78, 199, 79, 86, 69, 82, 76, 73, 78, + 69, 128, 79, 86, 69, 82, 76, 65, 89, 128, 79, 86, 69, 82, 76, 65, 217, + 79, 86, 69, 82, 76, 65, 80, 80, 73, 78, 199, 79, 86, 69, 82, 76, 65, 80, + 128, 79, 86, 69, 82, 76, 65, 73, 68, 128, 79, 86, 69, 82, 72, 69, 65, 84, + 69, 196, 79, 86, 69, 82, 66, 65, 82, 128, 79, 86, 65, 76, 128, 79, 86, + 65, 204, 79, 85, 84, 76, 73, 78, 69, 196, 79, 85, 84, 76, 73, 78, 69, + 128, 79, 85, 84, 69, 210, 79, 85, 84, 66, 79, 216, 79, 85, 78, 75, 73, + 193, 79, 85, 78, 67, 69, 128, 79, 85, 78, 67, 197, 79, 84, 85, 128, 79, + 84, 84, 79, 77, 65, 206, 79, 84, 84, 69, 82, 128, 79, 84, 84, 65, 86, + 193, 79, 84, 84, 128, 79, 84, 72, 69, 82, 211, 79, 84, 72, 69, 210, 79, + 84, 72, 65, 76, 65, 206, 79, 84, 72, 65, 76, 128, 79, 83, 77, 65, 78, 89, + 193, 79, 83, 67, 128, 79, 83, 65, 71, 197, 79, 82, 84, 72, 79, 71, 79, + 78, 65, 204, 79, 82, 84, 72, 79, 68, 79, 216, 79, 82, 78, 65, 84, 197, + 79, 82, 78, 65, 77, 69, 78, 84, 83, 128, 79, 82, 78, 65, 77, 69, 78, 84, + 128, 79, 82, 78, 65, 77, 69, 78, 212, 79, 82, 75, 72, 79, 206, 79, 82, + 73, 89, 193, 79, 82, 73, 71, 73, 78, 65, 204, 79, 82, 73, 71, 73, 78, + 128, 79, 82, 69, 45, 50, 128, 79, 82, 68, 73, 78, 65, 204, 79, 82, 68, + 69, 210, 79, 82, 67, 72, 73, 68, 128, 79, 82, 65, 78, 71, 85, 84, 65, 78, 128, 79, 82, 65, 78, 71, 197, 79, 80, 84, 73, 79, 206, 79, 80, 84, 73, 67, 65, 204, 79, 80, 80, 82, 69, 83, 83, 73, 79, 78, 128, 79, 80, 80, 79, 83, 73, 84, 73, 79, 78, 128, 79, 80, 80, 79, 83, 73, 78, 199, 79, 80, 80, @@ -1892,417 +1920,424 @@ static unsigned char lexicon[] = { 78, 78, 65, 128, 79, 79, 85, 128, 79, 79, 77, 85, 128, 79, 79, 72, 128, 79, 79, 69, 128, 79, 79, 66, 79, 79, 70, 73, 76, 73, 128, 79, 78, 85, 128, 79, 78, 83, 85, 128, 79, 78, 78, 128, 79, 78, 75, 65, 82, 128, 79, - 78, 69, 83, 69, 76, 70, 128, 79, 78, 69, 45, 87, 65, 217, 79, 78, 69, 45, - 84, 72, 73, 82, 84, 89, 128, 79, 78, 69, 45, 76, 73, 78, 197, 79, 78, 69, - 45, 72, 85, 78, 68, 82, 69, 68, 45, 65, 78, 68, 45, 83, 73, 88, 84, 73, - 69, 84, 72, 128, 79, 78, 67, 79, 77, 73, 78, 199, 79, 78, 65, 80, 128, - 79, 78, 45, 79, 70, 198, 79, 77, 73, 83, 83, 73, 79, 206, 79, 77, 73, 67, - 82, 79, 78, 128, 79, 77, 73, 67, 82, 79, 206, 79, 77, 69, 71, 65, 128, - 79, 77, 69, 71, 193, 79, 77, 65, 76, 79, 78, 128, 79, 76, 73, 86, 69, - 128, 79, 76, 73, 71, 79, 206, 79, 76, 68, 128, 79, 75, 84, 207, 79, 75, - 65, 82, 65, 128, 79, 75, 65, 82, 193, 79, 74, 73, 66, 87, 65, 217, 79, - 74, 69, 79, 78, 128, 79, 73, 78, 128, 79, 73, 76, 128, 79, 73, 204, 79, - 72, 77, 128, 79, 72, 205, 79, 71, 82, 69, 128, 79, 71, 79, 78, 69, 75, - 128, 79, 71, 79, 78, 69, 203, 79, 71, 72, 65, 205, 79, 70, 70, 73, 67, - 69, 82, 128, 79, 70, 70, 73, 67, 69, 128, 79, 70, 70, 73, 67, 197, 79, - 70, 70, 128, 79, 69, 89, 128, 79, 69, 75, 128, 79, 69, 69, 128, 79, 68, - 69, 78, 128, 79, 68, 68, 128, 79, 68, 196, 79, 67, 84, 79, 80, 85, 83, - 128, 79, 67, 84, 79, 66, 69, 82, 128, 79, 67, 84, 69, 212, 79, 67, 84, - 65, 71, 79, 78, 65, 204, 79, 67, 84, 65, 71, 79, 78, 128, 79, 67, 210, - 79, 67, 76, 79, 67, 75, 128, 79, 67, 67, 76, 85, 83, 73, 79, 78, 128, 79, - 66, 83, 84, 82, 85, 67, 84, 73, 79, 78, 128, 79, 66, 83, 69, 82, 86, 69, - 210, 79, 66, 79, 76, 211, 79, 66, 79, 204, 79, 66, 79, 70, 73, 76, 73, - 128, 79, 66, 76, 73, 81, 85, 197, 79, 66, 74, 69, 67, 212, 79, 66, 69, - 76, 85, 83, 128, 79, 66, 69, 76, 79, 83, 128, 79, 66, 128, 79, 65, 89, - 128, 79, 65, 75, 128, 79, 65, 66, 79, 65, 70, 73, 76, 73, 128, 79, 193, - 79, 48, 53, 49, 128, 79, 48, 53, 48, 66, 128, 79, 48, 53, 48, 65, 128, - 79, 48, 53, 48, 128, 79, 48, 52, 57, 128, 79, 48, 52, 56, 128, 79, 48, - 52, 55, 128, 79, 48, 52, 54, 128, 79, 48, 52, 53, 128, 79, 48, 52, 52, - 128, 79, 48, 52, 51, 128, 79, 48, 52, 50, 128, 79, 48, 52, 49, 128, 79, - 48, 52, 48, 128, 79, 48, 51, 57, 128, 79, 48, 51, 56, 128, 79, 48, 51, - 55, 128, 79, 48, 51, 54, 68, 128, 79, 48, 51, 54, 67, 128, 79, 48, 51, - 54, 66, 128, 79, 48, 51, 54, 65, 128, 79, 48, 51, 54, 128, 79, 48, 51, - 53, 128, 79, 48, 51, 52, 128, 79, 48, 51, 51, 65, 128, 79, 48, 51, 51, - 128, 79, 48, 51, 50, 128, 79, 48, 51, 49, 128, 79, 48, 51, 48, 65, 128, - 79, 48, 51, 48, 128, 79, 48, 50, 57, 65, 128, 79, 48, 50, 57, 128, 79, - 48, 50, 56, 128, 79, 48, 50, 55, 128, 79, 48, 50, 54, 128, 79, 48, 50, - 53, 65, 128, 79, 48, 50, 53, 128, 79, 48, 50, 52, 65, 128, 79, 48, 50, - 52, 128, 79, 48, 50, 51, 128, 79, 48, 50, 50, 128, 79, 48, 50, 49, 128, - 79, 48, 50, 48, 65, 128, 79, 48, 50, 48, 128, 79, 48, 49, 57, 65, 128, - 79, 48, 49, 57, 128, 79, 48, 49, 56, 128, 79, 48, 49, 55, 128, 79, 48, - 49, 54, 128, 79, 48, 49, 53, 128, 79, 48, 49, 52, 128, 79, 48, 49, 51, - 128, 79, 48, 49, 50, 128, 79, 48, 49, 49, 128, 79, 48, 49, 48, 67, 128, - 79, 48, 49, 48, 66, 128, 79, 48, 49, 48, 65, 128, 79, 48, 49, 48, 128, - 79, 48, 48, 57, 128, 79, 48, 48, 56, 128, 79, 48, 48, 55, 128, 79, 48, - 48, 54, 70, 128, 79, 48, 48, 54, 69, 128, 79, 48, 48, 54, 68, 128, 79, - 48, 48, 54, 67, 128, 79, 48, 48, 54, 66, 128, 79, 48, 48, 54, 65, 128, - 79, 48, 48, 54, 128, 79, 48, 48, 53, 65, 128, 79, 48, 48, 53, 128, 79, - 48, 48, 52, 128, 79, 48, 48, 51, 128, 79, 48, 48, 50, 128, 79, 48, 48, - 49, 65, 128, 79, 48, 48, 49, 128, 79, 45, 89, 69, 128, 79, 45, 79, 45, - 73, 128, 79, 45, 69, 128, 78, 90, 89, 88, 128, 78, 90, 89, 84, 128, 78, - 90, 89, 82, 88, 128, 78, 90, 89, 82, 128, 78, 90, 89, 80, 128, 78, 90, - 89, 128, 78, 90, 85, 88, 128, 78, 90, 85, 82, 88, 128, 78, 90, 85, 82, - 128, 78, 90, 85, 81, 128, 78, 90, 85, 80, 128, 78, 90, 85, 79, 88, 128, - 78, 90, 85, 79, 128, 78, 90, 85, 206, 78, 90, 85, 128, 78, 90, 79, 88, - 128, 78, 90, 79, 80, 128, 78, 90, 73, 88, 128, 78, 90, 73, 84, 128, 78, - 90, 73, 80, 128, 78, 90, 73, 69, 88, 128, 78, 90, 73, 69, 80, 128, 78, - 90, 73, 69, 128, 78, 90, 73, 128, 78, 90, 69, 88, 128, 78, 90, 69, 85, - 77, 128, 78, 90, 69, 128, 78, 90, 65, 88, 128, 78, 90, 65, 84, 128, 78, - 90, 65, 81, 128, 78, 90, 65, 80, 128, 78, 90, 65, 128, 78, 90, 193, 78, - 89, 87, 65, 128, 78, 89, 85, 88, 128, 78, 89, 85, 85, 128, 78, 89, 85, - 84, 128, 78, 89, 85, 80, 128, 78, 89, 85, 79, 88, 128, 78, 89, 85, 79, - 80, 128, 78, 89, 85, 79, 128, 78, 89, 85, 78, 128, 78, 89, 85, 69, 128, - 78, 89, 85, 128, 78, 89, 79, 88, 128, 78, 89, 79, 84, 128, 78, 89, 79, - 80, 128, 78, 89, 79, 79, 128, 78, 89, 79, 78, 128, 78, 89, 79, 65, 128, - 78, 89, 79, 128, 78, 89, 74, 65, 128, 78, 89, 73, 88, 128, 78, 89, 73, - 84, 128, 78, 89, 73, 212, 78, 89, 73, 211, 78, 89, 73, 210, 78, 89, 73, - 80, 128, 78, 89, 73, 78, 45, 68, 79, 128, 78, 89, 73, 78, 128, 78, 89, - 73, 73, 128, 78, 89, 73, 69, 88, 128, 78, 89, 73, 69, 84, 128, 78, 89, - 73, 69, 80, 128, 78, 89, 73, 69, 128, 78, 89, 73, 128, 78, 89, 201, 78, - 89, 72, 65, 128, 78, 89, 69, 84, 128, 78, 89, 69, 212, 78, 89, 69, 78, - 128, 78, 89, 69, 72, 128, 78, 89, 69, 200, 78, 89, 69, 69, 128, 78, 89, - 69, 128, 78, 89, 196, 78, 89, 67, 65, 128, 78, 89, 65, 85, 128, 78, 89, - 65, 73, 128, 78, 89, 65, 72, 128, 78, 89, 65, 69, 77, 65, 69, 128, 78, - 89, 65, 65, 128, 78, 87, 79, 79, 128, 78, 87, 79, 128, 78, 87, 73, 73, - 128, 78, 87, 73, 128, 78, 87, 69, 128, 78, 87, 65, 65, 128, 78, 87, 65, - 128, 78, 87, 128, 78, 86, 128, 78, 85, 88, 128, 78, 85, 85, 78, 128, 78, - 85, 85, 128, 78, 85, 84, 73, 76, 76, 85, 128, 78, 85, 84, 128, 78, 85, - 212, 78, 85, 82, 88, 128, 78, 85, 82, 128, 78, 85, 80, 128, 78, 85, 79, - 88, 128, 78, 85, 79, 80, 128, 78, 85, 79, 128, 78, 85, 78, 85, 90, 128, - 78, 85, 78, 85, 218, 78, 85, 78, 71, 128, 78, 85, 78, 65, 86, 85, 212, - 78, 85, 78, 65, 86, 73, 203, 78, 85, 78, 128, 78, 85, 206, 78, 85, 77, - 69, 82, 207, 78, 85, 77, 69, 82, 65, 84, 79, 210, 78, 85, 77, 69, 82, 65, - 204, 78, 85, 77, 66, 69, 82, 83, 128, 78, 85, 77, 66, 69, 82, 128, 78, - 85, 77, 128, 78, 85, 76, 76, 128, 78, 85, 76, 204, 78, 85, 76, 128, 78, - 85, 75, 84, 65, 128, 78, 85, 75, 84, 193, 78, 85, 69, 78, 71, 128, 78, - 85, 69, 128, 78, 85, 66, 73, 65, 206, 78, 85, 65, 69, 128, 78, 85, 49, - 49, 128, 78, 85, 49, 177, 78, 85, 48, 50, 50, 65, 128, 78, 85, 48, 50, - 50, 128, 78, 85, 48, 50, 49, 128, 78, 85, 48, 50, 48, 128, 78, 85, 48, - 49, 57, 128, 78, 85, 48, 49, 56, 65, 128, 78, 85, 48, 49, 56, 128, 78, - 85, 48, 49, 55, 128, 78, 85, 48, 49, 54, 128, 78, 85, 48, 49, 53, 128, - 78, 85, 48, 49, 52, 128, 78, 85, 48, 49, 51, 128, 78, 85, 48, 49, 50, - 128, 78, 85, 48, 49, 49, 65, 128, 78, 85, 48, 49, 49, 128, 78, 85, 48, - 49, 48, 65, 128, 78, 85, 48, 49, 48, 128, 78, 85, 48, 48, 57, 128, 78, - 85, 48, 48, 56, 128, 78, 85, 48, 48, 55, 128, 78, 85, 48, 48, 54, 128, - 78, 85, 48, 48, 53, 128, 78, 85, 48, 48, 52, 128, 78, 85, 48, 48, 51, - 128, 78, 85, 48, 48, 50, 128, 78, 85, 48, 48, 49, 128, 78, 85, 45, 51, - 128, 78, 85, 45, 50, 128, 78, 85, 45, 49, 128, 78, 84, 88, 73, 86, 128, - 78, 84, 85, 85, 128, 78, 84, 85, 77, 128, 78, 84, 85, 74, 128, 78, 84, - 213, 78, 84, 83, 65, 85, 128, 78, 84, 79, 81, 80, 69, 78, 128, 78, 84, - 79, 71, 128, 78, 84, 79, 199, 78, 84, 73, 69, 197, 78, 84, 72, 65, 85, - 128, 78, 84, 69, 85, 78, 71, 66, 65, 128, 78, 84, 69, 85, 77, 128, 78, - 84, 69, 78, 128, 78, 84, 69, 69, 128, 78, 84, 65, 80, 128, 78, 84, 65, - 208, 78, 84, 65, 65, 128, 78, 83, 85, 79, 212, 78, 83, 85, 78, 128, 78, - 83, 85, 77, 128, 78, 83, 79, 77, 128, 78, 83, 73, 69, 69, 84, 128, 78, - 83, 73, 69, 69, 80, 128, 78, 83, 73, 69, 69, 128, 78, 83, 72, 85, 84, - 128, 78, 83, 72, 85, 212, 78, 83, 72, 85, 79, 80, 128, 78, 83, 72, 85, - 69, 128, 78, 83, 72, 73, 69, 69, 128, 78, 83, 72, 69, 69, 128, 78, 83, - 72, 65, 81, 128, 78, 83, 72, 65, 128, 78, 83, 69, 85, 65, 69, 78, 128, - 78, 83, 69, 78, 128, 78, 83, 65, 128, 78, 82, 89, 88, 128, 78, 82, 89, - 84, 128, 78, 82, 89, 82, 88, 128, 78, 82, 89, 82, 128, 78, 82, 89, 80, - 128, 78, 82, 89, 128, 78, 82, 85, 88, 128, 78, 82, 85, 84, 128, 78, 82, - 85, 82, 88, 128, 78, 82, 85, 82, 128, 78, 82, 85, 80, 128, 78, 82, 85, - 65, 128, 78, 82, 85, 128, 78, 82, 79, 88, 128, 78, 82, 79, 80, 128, 78, - 82, 79, 128, 78, 82, 69, 88, 128, 78, 82, 69, 84, 128, 78, 82, 69, 211, - 78, 82, 69, 80, 128, 78, 82, 69, 128, 78, 82, 65, 88, 128, 78, 82, 65, - 84, 128, 78, 82, 65, 80, 128, 78, 82, 65, 128, 78, 81, 73, 71, 128, 78, - 79, 89, 128, 78, 79, 88, 128, 78, 79, 87, 67, 128, 78, 79, 86, 73, 76, - 69, 128, 78, 79, 86, 69, 77, 66, 69, 82, 128, 78, 79, 84, 84, 79, 128, - 78, 79, 84, 69, 83, 128, 78, 79, 84, 69, 72, 69, 65, 68, 128, 78, 79, 84, - 69, 72, 69, 65, 196, 78, 79, 84, 69, 66, 79, 79, 75, 128, 78, 79, 84, 69, - 66, 79, 79, 203, 78, 79, 84, 69, 128, 78, 79, 84, 197, 78, 79, 84, 67, - 72, 69, 196, 78, 79, 84, 67, 72, 128, 78, 79, 84, 65, 84, 73, 79, 206, - 78, 79, 84, 128, 78, 79, 212, 78, 79, 83, 69, 128, 78, 79, 83, 197, 78, - 79, 82, 84, 72, 87, 69, 83, 212, 78, 79, 82, 84, 72, 69, 82, 206, 78, 79, - 82, 84, 72, 69, 65, 83, 84, 45, 80, 79, 73, 78, 84, 73, 78, 199, 78, 79, - 82, 77, 65, 204, 78, 79, 82, 68, 73, 195, 78, 79, 210, 78, 79, 80, 128, - 78, 79, 79, 78, 85, 128, 78, 79, 79, 128, 78, 79, 78, 70, 79, 82, 75, 73, - 78, 71, 128, 78, 79, 78, 45, 80, 79, 84, 65, 66, 76, 197, 78, 79, 78, 45, - 74, 79, 73, 78, 69, 82, 128, 78, 79, 78, 45, 66, 82, 69, 65, 75, 73, 78, - 199, 78, 79, 78, 128, 78, 79, 77, 73, 83, 77, 193, 78, 79, 77, 73, 78, - 65, 204, 78, 79, 75, 72, 85, 75, 128, 78, 79, 68, 69, 128, 78, 79, 65, - 128, 78, 79, 45, 66, 82, 69, 65, 203, 78, 79, 45, 53, 128, 78, 79, 45, - 52, 128, 78, 79, 45, 51, 128, 78, 79, 45, 50, 128, 78, 79, 45, 49, 128, - 78, 78, 85, 85, 128, 78, 78, 85, 128, 78, 78, 79, 79, 128, 78, 78, 79, - 128, 78, 78, 78, 85, 85, 128, 78, 78, 78, 85, 128, 78, 78, 78, 79, 79, - 128, 78, 78, 78, 79, 128, 78, 78, 78, 73, 73, 128, 78, 78, 78, 73, 128, - 78, 78, 78, 69, 69, 128, 78, 78, 78, 69, 128, 78, 78, 78, 65, 85, 128, - 78, 78, 78, 65, 73, 128, 78, 78, 78, 65, 65, 128, 78, 78, 78, 65, 128, - 78, 78, 78, 128, 78, 78, 72, 65, 128, 78, 78, 71, 79, 79, 128, 78, 78, - 71, 79, 128, 78, 78, 71, 73, 73, 128, 78, 78, 71, 73, 128, 78, 78, 71, - 65, 65, 128, 78, 78, 71, 65, 128, 78, 78, 71, 128, 78, 78, 66, 83, 80, - 128, 78, 77, 128, 78, 76, 65, 85, 128, 78, 76, 48, 50, 48, 128, 78, 76, - 48, 49, 57, 128, 78, 76, 48, 49, 56, 128, 78, 76, 48, 49, 55, 65, 128, - 78, 76, 48, 49, 55, 128, 78, 76, 48, 49, 54, 128, 78, 76, 48, 49, 53, - 128, 78, 76, 48, 49, 52, 128, 78, 76, 48, 49, 51, 128, 78, 76, 48, 49, - 50, 128, 78, 76, 48, 49, 49, 128, 78, 76, 48, 49, 48, 128, 78, 76, 48, - 48, 57, 128, 78, 76, 48, 48, 56, 128, 78, 76, 48, 48, 55, 128, 78, 76, - 48, 48, 54, 128, 78, 76, 48, 48, 53, 65, 128, 78, 76, 48, 48, 53, 128, - 78, 76, 48, 48, 52, 128, 78, 76, 48, 48, 51, 128, 78, 76, 48, 48, 50, - 128, 78, 76, 48, 48, 49, 128, 78, 76, 128, 78, 75, 79, 77, 128, 78, 75, - 207, 78, 75, 73, 78, 68, 73, 128, 78, 75, 65, 85, 128, 78, 75, 65, 65, - 82, 65, 69, 128, 78, 74, 89, 88, 128, 78, 74, 89, 84, 128, 78, 74, 89, - 82, 88, 128, 78, 74, 89, 82, 128, 78, 74, 89, 80, 128, 78, 74, 89, 128, - 78, 74, 85, 88, 128, 78, 74, 85, 82, 88, 128, 78, 74, 85, 82, 128, 78, - 74, 85, 81, 65, 128, 78, 74, 85, 80, 128, 78, 74, 85, 79, 88, 128, 78, - 74, 85, 79, 128, 78, 74, 85, 69, 81, 128, 78, 74, 85, 65, 69, 128, 78, - 74, 85, 128, 78, 74, 79, 88, 128, 78, 74, 79, 84, 128, 78, 74, 79, 80, - 128, 78, 74, 79, 79, 128, 78, 74, 79, 128, 78, 74, 73, 88, 128, 78, 74, - 73, 84, 128, 78, 74, 73, 80, 128, 78, 74, 73, 69, 88, 128, 78, 74, 73, - 69, 84, 128, 78, 74, 73, 69, 80, 128, 78, 74, 73, 69, 69, 128, 78, 74, - 73, 69, 128, 78, 74, 73, 128, 78, 74, 201, 78, 74, 69, 85, 88, 128, 78, - 74, 69, 85, 84, 128, 78, 74, 69, 85, 65, 69, 78, 65, 128, 78, 74, 69, 85, - 65, 69, 77, 128, 78, 74, 69, 69, 69, 69, 128, 78, 74, 69, 69, 128, 78, - 74, 69, 197, 78, 74, 69, 128, 78, 74, 65, 81, 128, 78, 74, 65, 80, 128, - 78, 74, 65, 69, 77, 76, 73, 128, 78, 74, 65, 69, 77, 128, 78, 74, 65, 65, - 128, 78, 73, 88, 128, 78, 73, 84, 82, 69, 128, 78, 73, 83, 65, 71, 128, - 78, 73, 82, 85, 71, 85, 128, 78, 73, 80, 128, 78, 73, 78, 84, 72, 128, - 78, 73, 78, 69, 84, 89, 128, 78, 73, 78, 69, 84, 217, 78, 73, 78, 69, 84, - 69, 69, 78, 128, 78, 73, 78, 69, 84, 69, 69, 206, 78, 73, 78, 69, 45, 84, - 72, 73, 82, 84, 89, 128, 78, 73, 78, 197, 78, 73, 78, 68, 65, 50, 128, - 78, 73, 78, 68, 65, 178, 78, 73, 78, 57, 128, 78, 73, 78, 128, 78, 73, - 77, 128, 78, 73, 205, 78, 73, 75, 79, 76, 83, 66, 85, 82, 199, 78, 73, - 75, 72, 65, 72, 73, 84, 128, 78, 73, 75, 65, 72, 73, 84, 128, 78, 73, 75, - 65, 128, 78, 73, 72, 83, 72, 86, 65, 83, 65, 128, 78, 73, 71, 73, 68, 65, - 77, 73, 78, 128, 78, 73, 71, 73, 68, 65, 69, 83, 72, 128, 78, 73, 71, 72, - 84, 128, 78, 73, 71, 72, 212, 78, 73, 71, 71, 65, 72, 73, 84, 65, 128, - 78, 73, 69, 88, 128, 78, 73, 69, 85, 78, 45, 84, 73, 75, 69, 85, 84, 128, - 78, 73, 69, 85, 78, 45, 84, 72, 73, 69, 85, 84, 72, 128, 78, 73, 69, 85, - 78, 45, 83, 73, 79, 83, 128, 78, 73, 69, 85, 78, 45, 82, 73, 69, 85, 76, - 128, 78, 73, 69, 85, 78, 45, 80, 73, 69, 85, 80, 128, 78, 73, 69, 85, 78, - 45, 80, 65, 78, 83, 73, 79, 83, 128, 78, 73, 69, 85, 78, 45, 75, 73, 89, - 69, 79, 75, 128, 78, 73, 69, 85, 78, 45, 72, 73, 69, 85, 72, 128, 78, 73, - 69, 85, 78, 45, 67, 73, 69, 85, 67, 128, 78, 73, 69, 85, 78, 45, 67, 72, - 73, 69, 85, 67, 72, 128, 78, 73, 69, 85, 206, 78, 73, 69, 80, 128, 78, - 73, 69, 128, 78, 73, 66, 128, 78, 73, 65, 128, 78, 73, 50, 128, 78, 73, - 45, 84, 69, 128, 78, 73, 45, 55, 128, 78, 73, 45, 54, 128, 78, 73, 45, - 53, 128, 78, 73, 45, 52, 128, 78, 73, 45, 51, 128, 78, 73, 45, 50, 128, - 78, 73, 45, 49, 128, 78, 72, 85, 69, 128, 78, 72, 74, 65, 128, 78, 72, - 128, 78, 71, 89, 69, 128, 78, 71, 86, 69, 128, 78, 71, 85, 85, 128, 78, - 71, 85, 79, 88, 128, 78, 71, 85, 79, 84, 128, 78, 71, 85, 79, 128, 78, - 71, 85, 65, 78, 128, 78, 71, 85, 65, 69, 84, 128, 78, 71, 85, 65, 69, - 128, 78, 71, 79, 88, 128, 78, 71, 79, 85, 128, 78, 71, 79, 213, 78, 71, - 79, 84, 128, 78, 71, 79, 81, 128, 78, 71, 79, 80, 128, 78, 71, 79, 78, - 128, 78, 71, 79, 77, 128, 78, 71, 79, 69, 72, 128, 78, 71, 79, 69, 200, - 78, 71, 207, 78, 71, 75, 89, 69, 69, 128, 78, 71, 75, 87, 65, 69, 78, - 128, 78, 71, 75, 85, 80, 128, 78, 71, 75, 85, 78, 128, 78, 71, 75, 85, - 77, 128, 78, 71, 75, 85, 69, 78, 90, 69, 85, 77, 128, 78, 71, 75, 85, - 197, 78, 71, 75, 73, 78, 68, 201, 78, 71, 75, 73, 69, 69, 128, 78, 71, - 75, 69, 85, 88, 128, 78, 71, 75, 69, 85, 82, 73, 128, 78, 71, 75, 69, 85, - 65, 69, 81, 128, 78, 71, 75, 69, 85, 65, 69, 77, 128, 78, 71, 75, 65, 81, - 128, 78, 71, 75, 65, 80, 128, 78, 71, 75, 65, 65, 77, 73, 128, 78, 71, - 75, 65, 128, 78, 71, 73, 69, 88, 128, 78, 71, 73, 69, 80, 128, 78, 71, - 73, 69, 128, 78, 71, 72, 65, 128, 78, 71, 71, 87, 65, 69, 78, 128, 78, - 71, 71, 85, 82, 65, 69, 128, 78, 71, 71, 85, 80, 128, 78, 71, 71, 85, 79, - 81, 128, 78, 71, 71, 85, 79, 209, 78, 71, 71, 85, 79, 78, 128, 78, 71, - 71, 85, 79, 77, 128, 78, 71, 71, 85, 77, 128, 78, 71, 71, 85, 69, 69, 84, - 128, 78, 71, 71, 85, 65, 69, 83, 72, 65, 197, 78, 71, 71, 85, 65, 69, - 206, 78, 71, 71, 85, 65, 128, 78, 71, 71, 85, 128, 78, 71, 71, 79, 79, - 128, 78, 71, 71, 79, 128, 78, 71, 71, 73, 128, 78, 71, 71, 69, 85, 88, - 128, 78, 71, 71, 69, 85, 65, 69, 84, 128, 78, 71, 71, 69, 85, 65, 69, - 128, 78, 71, 71, 69, 213, 78, 71, 71, 69, 78, 128, 78, 71, 71, 69, 69, - 84, 128, 78, 71, 71, 69, 69, 69, 69, 128, 78, 71, 71, 69, 69, 128, 78, - 71, 71, 69, 128, 78, 71, 71, 65, 80, 128, 78, 71, 71, 65, 65, 77, 65, 69, - 128, 78, 71, 71, 65, 65, 77, 128, 78, 71, 71, 65, 65, 128, 78, 71, 71, - 128, 78, 71, 69, 88, 128, 78, 71, 69, 85, 82, 69, 85, 84, 128, 78, 71, - 69, 80, 128, 78, 71, 69, 78, 128, 78, 71, 69, 69, 128, 78, 71, 69, 65, - 68, 65, 76, 128, 78, 71, 65, 88, 128, 78, 71, 65, 85, 128, 78, 71, 65, - 84, 128, 78, 71, 65, 211, 78, 71, 65, 81, 128, 78, 71, 65, 80, 128, 78, - 71, 65, 78, 71, 85, 128, 78, 71, 65, 78, 128, 78, 71, 65, 73, 128, 78, - 71, 65, 72, 128, 78, 71, 65, 65, 73, 128, 78, 71, 193, 78, 70, 128, 78, - 69, 88, 212, 78, 69, 88, 128, 78, 69, 87, 83, 80, 65, 80, 69, 82, 128, - 78, 69, 87, 76, 73, 78, 69, 128, 78, 69, 87, 76, 73, 78, 197, 78, 69, 87, - 193, 78, 69, 87, 128, 78, 69, 215, 78, 69, 85, 84, 82, 65, 76, 128, 78, - 69, 85, 84, 82, 65, 204, 78, 69, 85, 84, 69, 82, 128, 78, 69, 84, 87, 79, - 82, 75, 69, 196, 78, 69, 84, 128, 78, 69, 212, 78, 69, 83, 84, 69, 196, - 78, 69, 83, 83, 85, 83, 128, 78, 69, 82, 196, 78, 69, 81, 85, 68, 65, 65, - 128, 78, 69, 80, 84, 85, 78, 69, 128, 78, 69, 80, 128, 78, 69, 79, 128, - 78, 69, 207, 78, 69, 78, 79, 69, 128, 78, 69, 78, 65, 78, 79, 128, 78, - 69, 78, 128, 78, 69, 76, 128, 78, 69, 73, 84, 72, 69, 210, 78, 69, 71, - 65, 84, 73, 86, 197, 78, 69, 71, 65, 84, 73, 79, 206, 78, 69, 71, 65, 84, - 69, 196, 78, 69, 67, 75, 84, 73, 69, 128, 78, 69, 67, 75, 128, 78, 69, - 66, 69, 78, 83, 84, 73, 77, 77, 69, 128, 78, 69, 45, 75, 79, 128, 78, 68, - 85, 88, 128, 78, 68, 85, 84, 128, 78, 68, 85, 82, 88, 128, 78, 68, 85, - 82, 128, 78, 68, 85, 80, 128, 78, 68, 85, 78, 128, 78, 68, 213, 78, 68, - 79, 88, 128, 78, 68, 79, 84, 128, 78, 68, 79, 80, 128, 78, 68, 79, 79, - 128, 78, 68, 79, 78, 128, 78, 68, 79, 77, 66, 85, 128, 78, 68, 79, 76, - 197, 78, 68, 73, 88, 128, 78, 68, 73, 84, 128, 78, 68, 73, 81, 128, 78, - 68, 73, 80, 128, 78, 68, 73, 69, 88, 128, 78, 68, 73, 69, 128, 78, 68, - 73, 68, 65, 128, 78, 68, 73, 65, 81, 128, 78, 68, 69, 88, 128, 78, 68, - 69, 85, 88, 128, 78, 68, 69, 85, 84, 128, 78, 68, 69, 85, 65, 69, 82, 69, - 69, 128, 78, 68, 69, 80, 128, 78, 68, 69, 69, 128, 78, 68, 69, 128, 78, - 68, 65, 88, 128, 78, 68, 65, 84, 128, 78, 68, 65, 80, 128, 78, 68, 65, - 77, 128, 78, 68, 65, 65, 78, 71, 71, 69, 85, 65, 69, 84, 128, 78, 68, 65, - 65, 128, 78, 68, 65, 193, 78, 67, 72, 65, 85, 128, 78, 66, 89, 88, 128, - 78, 66, 89, 84, 128, 78, 66, 89, 82, 88, 128, 78, 66, 89, 82, 128, 78, - 66, 89, 80, 128, 78, 66, 89, 128, 78, 66, 85, 88, 128, 78, 66, 85, 84, - 128, 78, 66, 85, 82, 88, 128, 78, 66, 85, 82, 128, 78, 66, 85, 80, 128, - 78, 66, 85, 128, 78, 66, 79, 88, 128, 78, 66, 79, 84, 128, 78, 66, 79, - 80, 128, 78, 66, 79, 128, 78, 66, 73, 88, 128, 78, 66, 73, 84, 128, 78, - 66, 73, 80, 128, 78, 66, 73, 69, 88, 128, 78, 66, 73, 69, 80, 128, 78, - 66, 73, 69, 128, 78, 66, 73, 128, 78, 66, 72, 128, 78, 66, 65, 88, 128, - 78, 66, 65, 84, 128, 78, 66, 65, 80, 128, 78, 66, 65, 128, 78, 65, 90, - 65, 210, 78, 65, 89, 65, 78, 78, 65, 128, 78, 65, 89, 128, 78, 65, 88, - 73, 65, 206, 78, 65, 88, 128, 78, 65, 85, 84, 72, 83, 128, 78, 65, 85, - 83, 69, 65, 84, 69, 196, 78, 65, 85, 68, 73, 218, 78, 65, 84, 85, 82, 65, - 204, 78, 65, 84, 73, 79, 78, 65, 204, 78, 65, 83, 75, 65, 80, 201, 78, - 65, 83, 72, 73, 128, 78, 65, 83, 65, 76, 73, 90, 65, 84, 73, 79, 78, 128, - 78, 65, 83, 65, 76, 73, 90, 65, 84, 73, 79, 206, 78, 65, 83, 65, 204, 78, - 65, 82, 82, 79, 215, 78, 65, 82, 128, 78, 65, 81, 128, 78, 65, 79, 211, - 78, 65, 78, 83, 65, 78, 65, 81, 128, 78, 65, 78, 71, 77, 79, 78, 84, 72, - 79, 128, 78, 65, 78, 68, 128, 78, 65, 78, 65, 128, 78, 65, 77, 69, 128, - 78, 65, 77, 197, 78, 65, 77, 50, 128, 78, 65, 77, 128, 78, 65, 75, 128, - 78, 65, 73, 82, 193, 78, 65, 73, 204, 78, 65, 71, 82, 201, 78, 65, 71, - 65, 82, 128, 78, 65, 71, 65, 128, 78, 65, 71, 193, 78, 65, 71, 128, 78, - 65, 199, 78, 65, 69, 128, 78, 65, 66, 76, 65, 128, 78, 65, 66, 65, 84, - 65, 69, 65, 206, 78, 65, 65, 83, 73, 75, 89, 65, 89, 65, 128, 78, 65, 65, - 75, 83, 73, 75, 89, 65, 89, 65, 128, 78, 65, 65, 73, 128, 78, 65, 193, - 78, 65, 52, 128, 78, 65, 50, 128, 78, 65, 45, 57, 128, 78, 65, 45, 56, - 128, 78, 65, 45, 55, 128, 78, 65, 45, 54, 128, 78, 65, 45, 53, 128, 78, - 65, 45, 52, 128, 78, 65, 45, 51, 128, 78, 65, 45, 50, 128, 78, 65, 45, - 49, 128, 78, 48, 52, 50, 128, 78, 48, 52, 49, 128, 78, 48, 52, 48, 128, - 78, 48, 51, 57, 128, 78, 48, 51, 56, 128, 78, 48, 51, 55, 65, 128, 78, - 48, 51, 55, 128, 78, 48, 51, 54, 128, 78, 48, 51, 53, 65, 128, 78, 48, - 51, 53, 128, 78, 48, 51, 52, 65, 128, 78, 48, 51, 52, 128, 78, 48, 51, - 51, 65, 128, 78, 48, 51, 51, 128, 78, 48, 51, 50, 128, 78, 48, 51, 49, - 128, 78, 48, 51, 48, 128, 78, 48, 50, 57, 128, 78, 48, 50, 56, 128, 78, - 48, 50, 55, 128, 78, 48, 50, 54, 128, 78, 48, 50, 53, 65, 128, 78, 48, - 50, 53, 128, 78, 48, 50, 52, 128, 78, 48, 50, 51, 128, 78, 48, 50, 50, - 128, 78, 48, 50, 49, 128, 78, 48, 50, 48, 128, 78, 48, 49, 57, 128, 78, - 48, 49, 56, 66, 128, 78, 48, 49, 56, 65, 128, 78, 48, 49, 56, 128, 78, - 48, 49, 55, 128, 78, 48, 49, 54, 128, 78, 48, 49, 53, 128, 78, 48, 49, - 52, 128, 78, 48, 49, 51, 128, 78, 48, 49, 50, 128, 78, 48, 49, 49, 128, - 78, 48, 49, 48, 128, 78, 48, 48, 57, 128, 78, 48, 48, 56, 128, 78, 48, - 48, 55, 128, 78, 48, 48, 54, 128, 78, 48, 48, 53, 128, 78, 48, 48, 52, - 128, 78, 48, 48, 51, 128, 78, 48, 48, 50, 128, 78, 48, 48, 49, 128, 78, - 45, 77, 85, 45, 77, 79, 45, 50, 128, 78, 45, 77, 85, 45, 77, 79, 45, 49, - 128, 78, 45, 67, 82, 69, 197, 78, 45, 65, 82, 217, 77, 89, 88, 128, 77, - 89, 84, 128, 77, 89, 83, 76, 73, 84, 69, 128, 77, 89, 80, 128, 77, 89, - 65, 128, 77, 89, 193, 77, 89, 128, 77, 87, 79, 79, 128, 77, 87, 79, 128, - 77, 87, 73, 73, 128, 77, 87, 73, 128, 77, 87, 69, 69, 128, 77, 87, 69, - 128, 77, 87, 65, 65, 128, 77, 87, 65, 128, 77, 87, 128, 77, 215, 77, 86, - 83, 128, 77, 86, 79, 80, 128, 77, 86, 73, 128, 77, 86, 69, 85, 65, 69, - 78, 71, 65, 77, 128, 77, 86, 128, 77, 214, 77, 85, 88, 128, 77, 85, 85, - 83, 73, 75, 65, 84, 79, 65, 78, 128, 77, 85, 85, 82, 68, 72, 65, 74, 193, - 77, 85, 85, 128, 77, 85, 84, 128, 77, 85, 83, 73, 67, 128, 77, 85, 83, - 73, 195, 77, 85, 83, 72, 82, 79, 79, 77, 128, 77, 85, 83, 72, 51, 128, - 77, 85, 83, 72, 179, 77, 85, 83, 72, 128, 77, 85, 83, 200, 77, 85, 83, - 128, 77, 85, 82, 88, 128, 77, 85, 82, 71, 85, 50, 128, 77, 85, 82, 69, - 128, 77, 85, 82, 68, 65, 128, 77, 85, 82, 68, 193, 77, 85, 82, 128, 77, - 85, 81, 68, 65, 77, 128, 77, 85, 80, 128, 77, 85, 79, 88, 128, 77, 85, - 79, 84, 128, 77, 85, 79, 80, 128, 77, 85, 79, 77, 65, 69, 128, 77, 85, - 79, 128, 77, 85, 78, 83, 85, 66, 128, 77, 85, 78, 65, 72, 128, 77, 85, - 78, 128, 77, 85, 76, 84, 73, 83, 69, 84, 128, 77, 85, 76, 84, 73, 83, 69, - 212, 77, 85, 76, 84, 73, 80, 76, 73, 67, 65, 84, 73, 79, 78, 128, 77, 85, - 76, 84, 73, 80, 76, 73, 67, 65, 84, 73, 79, 206, 77, 85, 76, 84, 73, 80, - 76, 69, 128, 77, 85, 76, 84, 73, 80, 76, 197, 77, 85, 76, 84, 73, 79, 67, - 85, 76, 65, 210, 77, 85, 76, 84, 73, 77, 65, 80, 128, 77, 85, 76, 84, - 201, 77, 85, 76, 84, 65, 78, 201, 77, 85, 75, 80, 72, 82, 69, 78, 71, - 128, 77, 85, 73, 78, 128, 77, 85, 71, 83, 128, 77, 85, 71, 128, 77, 85, - 199, 77, 85, 69, 78, 128, 77, 85, 69, 128, 77, 85, 67, 72, 128, 77, 85, - 67, 200, 77, 85, 67, 65, 65, 68, 128, 77, 85, 65, 83, 128, 77, 85, 65, - 78, 128, 77, 85, 65, 69, 128, 77, 85, 45, 71, 65, 65, 72, 76, 65, 193, - 77, 85, 45, 52, 128, 77, 85, 45, 51, 128, 77, 85, 45, 50, 128, 77, 85, - 45, 49, 128, 77, 213, 77, 84, 65, 86, 82, 85, 76, 201, 77, 83, 128, 77, - 82, 207, 77, 80, 65, 128, 77, 79, 89, 65, 73, 128, 77, 79, 88, 128, 77, - 79, 86, 73, 197, 77, 79, 86, 69, 211, 77, 79, 86, 69, 77, 69, 78, 84, 45, - 87, 65, 76, 76, 80, 76, 65, 78, 197, 77, 79, 86, 69, 77, 69, 78, 84, 45, - 72, 73, 78, 71, 197, 77, 79, 86, 69, 77, 69, 78, 84, 45, 70, 76, 79, 79, - 82, 80, 76, 65, 78, 197, 77, 79, 86, 69, 77, 69, 78, 84, 45, 68, 73, 65, - 71, 79, 78, 65, 204, 77, 79, 86, 69, 77, 69, 78, 84, 128, 77, 79, 86, 69, - 77, 69, 78, 212, 77, 79, 86, 69, 196, 77, 79, 86, 69, 128, 77, 79, 85, - 84, 72, 128, 77, 79, 85, 83, 69, 128, 77, 79, 85, 83, 197, 77, 79, 85, - 78, 84, 65, 73, 78, 83, 128, 77, 79, 85, 78, 84, 65, 73, 78, 128, 77, 79, - 85, 78, 84, 65, 73, 206, 77, 79, 85, 78, 212, 77, 79, 85, 78, 68, 128, - 77, 79, 85, 78, 196, 77, 79, 84, 79, 82, 87, 65, 89, 128, 77, 79, 84, 79, - 82, 67, 89, 67, 76, 69, 128, 77, 79, 84, 79, 210, 77, 79, 84, 72, 69, 82, - 128, 77, 79, 84, 72, 69, 210, 77, 79, 84, 128, 77, 79, 83, 81, 85, 73, - 84, 79, 128, 77, 79, 83, 81, 85, 69, 128, 77, 79, 82, 84, 85, 85, 77, - 128, 77, 79, 82, 84, 65, 82, 128, 77, 79, 82, 80, 72, 79, 76, 79, 71, 73, - 67, 65, 204, 77, 79, 82, 78, 73, 78, 71, 128, 77, 79, 80, 128, 77, 79, - 79, 83, 69, 45, 67, 82, 69, 197, 77, 79, 79, 78, 128, 77, 79, 79, 206, - 77, 79, 79, 77, 80, 85, 81, 128, 77, 79, 79, 77, 69, 85, 84, 128, 77, 79, - 79, 68, 128, 77, 79, 79, 196, 77, 79, 79, 128, 77, 79, 78, 84, 73, 69, - 69, 78, 128, 77, 79, 78, 84, 72, 128, 77, 79, 78, 84, 200, 77, 79, 78, - 83, 84, 69, 82, 128, 77, 79, 78, 79, 83, 84, 65, 66, 76, 197, 77, 79, 78, - 79, 83, 80, 65, 67, 197, 77, 79, 78, 79, 82, 65, 73, 76, 128, 77, 79, 78, - 79, 71, 82, 65, 80, 200, 77, 79, 78, 79, 71, 82, 65, 77, 77, 79, 211, 77, - 79, 78, 79, 71, 82, 65, 205, 77, 79, 78, 79, 70, 79, 78, 73, 65, 83, 128, - 77, 79, 78, 79, 67, 85, 76, 65, 210, 77, 79, 78, 79, 67, 76, 69, 128, 77, - 79, 78, 75, 69, 89, 128, 77, 79, 78, 75, 69, 217, 77, 79, 78, 73, 128, - 77, 79, 78, 71, 75, 69, 85, 65, 69, 81, 128, 77, 79, 78, 69, 89, 45, 77, - 79, 85, 84, 200, 77, 79, 78, 69, 217, 77, 79, 78, 128, 77, 79, 206, 77, - 79, 76, 128, 77, 79, 72, 65, 77, 77, 65, 196, 77, 79, 68, 85, 76, 207, - 77, 79, 68, 73, 70, 73, 69, 82, 45, 57, 128, 77, 79, 68, 73, 70, 73, 69, - 82, 45, 56, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 55, 128, 77, 79, 68, - 73, 70, 73, 69, 82, 45, 54, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 53, - 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 52, 128, 77, 79, 68, 73, 70, 73, - 69, 82, 45, 51, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 50, 128, 77, 79, - 68, 73, 70, 73, 69, 82, 45, 49, 54, 128, 77, 79, 68, 73, 70, 73, 69, 82, - 45, 49, 53, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 49, 52, 128, 77, 79, - 68, 73, 70, 73, 69, 82, 45, 49, 51, 128, 77, 79, 68, 73, 70, 73, 69, 82, - 45, 49, 50, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 49, 49, 128, 77, 79, - 68, 73, 70, 73, 69, 82, 45, 49, 48, 128, 77, 79, 68, 73, 70, 73, 69, 82, - 128, 77, 79, 68, 201, 77, 79, 68, 69, 83, 84, 89, 128, 77, 79, 68, 69, - 82, 206, 77, 79, 68, 69, 77, 128, 77, 79, 68, 69, 76, 83, 128, 77, 79, - 68, 69, 76, 128, 77, 79, 68, 69, 128, 77, 79, 66, 73, 76, 197, 77, 79, - 65, 128, 77, 79, 45, 54, 128, 77, 79, 45, 53, 128, 77, 79, 45, 52, 128, - 77, 79, 45, 51, 128, 77, 207, 77, 78, 89, 65, 205, 77, 78, 65, 83, 128, - 77, 77, 83, 80, 128, 77, 77, 128, 77, 205, 77, 76, 65, 128, 77, 76, 128, - 77, 75, 80, 65, 82, 65, 209, 77, 73, 88, 128, 77, 73, 84, 128, 77, 73, - 83, 82, 65, 128, 77, 73, 82, 73, 66, 65, 65, 82, 85, 128, 77, 73, 82, 73, - 128, 77, 73, 82, 69, 68, 128, 77, 73, 80, 128, 77, 73, 78, 89, 128, 77, - 73, 78, 85, 83, 45, 79, 82, 45, 80, 76, 85, 211, 77, 73, 78, 85, 83, 128, - 77, 73, 78, 73, 83, 84, 69, 82, 128, 77, 73, 78, 73, 77, 73, 90, 69, 128, - 77, 73, 78, 73, 77, 65, 128, 77, 73, 78, 73, 68, 73, 83, 67, 128, 77, 73, - 78, 73, 66, 85, 83, 128, 77, 73, 77, 69, 128, 77, 73, 77, 128, 77, 73, - 76, 76, 73, 79, 78, 83, 128, 77, 73, 76, 76, 73, 79, 78, 211, 77, 73, 76, - 76, 69, 84, 128, 77, 73, 76, 76, 197, 77, 73, 76, 204, 77, 73, 76, 75, - 217, 77, 73, 76, 75, 128, 77, 73, 76, 73, 84, 65, 82, 217, 77, 73, 76, - 128, 77, 73, 75, 85, 82, 79, 78, 128, 77, 73, 75, 82, 79, 206, 77, 73, - 75, 82, 73, 128, 77, 73, 73, 78, 128, 77, 73, 73, 77, 128, 77, 73, 73, - 128, 77, 73, 199, 77, 73, 69, 88, 128, 77, 73, 69, 85, 77, 45, 84, 73, - 75, 69, 85, 84, 128, 77, 73, 69, 85, 77, 45, 83, 83, 65, 78, 71, 83, 73, - 79, 83, 128, 77, 73, 69, 85, 77, 45, 83, 83, 65, 78, 71, 78, 73, 69, 85, - 78, 128, 77, 73, 69, 85, 77, 45, 82, 73, 69, 85, 76, 128, 77, 73, 69, 85, - 77, 45, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, 128, 77, 73, 69, 85, 77, - 45, 80, 73, 69, 85, 80, 128, 77, 73, 69, 85, 77, 45, 80, 65, 78, 83, 73, - 79, 83, 128, 77, 73, 69, 85, 77, 45, 78, 73, 69, 85, 78, 128, 77, 73, 69, - 85, 77, 45, 67, 73, 69, 85, 67, 128, 77, 73, 69, 85, 77, 45, 67, 72, 73, - 69, 85, 67, 72, 128, 77, 73, 69, 85, 205, 77, 73, 69, 80, 128, 77, 73, - 69, 69, 128, 77, 73, 69, 128, 77, 73, 68, 76, 73, 78, 197, 77, 73, 68, - 68, 76, 69, 45, 87, 69, 76, 83, 200, 77, 73, 68, 68, 76, 69, 128, 77, 73, - 68, 45, 76, 69, 86, 69, 204, 77, 73, 196, 77, 73, 67, 82, 79, 83, 67, 79, - 80, 69, 128, 77, 73, 67, 82, 79, 80, 72, 79, 78, 69, 128, 77, 73, 67, 82, - 79, 66, 69, 128, 77, 73, 67, 82, 207, 77, 73, 67, 210, 77, 73, 45, 55, - 128, 77, 73, 45, 54, 128, 77, 73, 45, 53, 128, 77, 73, 45, 52, 128, 77, - 73, 45, 51, 128, 77, 73, 45, 50, 128, 77, 73, 45, 49, 128, 77, 72, 90, - 128, 77, 72, 65, 128, 77, 72, 128, 77, 71, 85, 88, 128, 77, 71, 85, 84, - 128, 77, 71, 85, 82, 88, 128, 77, 71, 85, 82, 128, 77, 71, 85, 80, 128, - 77, 71, 85, 79, 88, 128, 77, 71, 85, 79, 80, 128, 77, 71, 85, 79, 128, - 77, 71, 85, 128, 77, 71, 79, 88, 128, 77, 71, 79, 84, 128, 77, 71, 79, - 80, 128, 77, 71, 79, 128, 77, 71, 207, 77, 71, 73, 69, 88, 128, 77, 71, - 73, 69, 128, 77, 71, 69, 88, 128, 77, 71, 69, 80, 128, 77, 71, 69, 128, - 77, 71, 66, 85, 128, 77, 71, 66, 79, 79, 128, 77, 71, 66, 79, 70, 85, 77, - 128, 77, 71, 66, 79, 128, 77, 71, 66, 73, 128, 77, 71, 66, 69, 85, 78, - 128, 77, 71, 66, 69, 78, 128, 77, 71, 66, 69, 69, 128, 77, 71, 66, 69, - 128, 77, 71, 66, 65, 83, 65, 81, 128, 77, 71, 66, 65, 83, 65, 128, 77, - 71, 65, 88, 128, 77, 71, 65, 84, 128, 77, 71, 65, 80, 128, 77, 71, 65, - 128, 77, 71, 128, 77, 70, 79, 78, 128, 77, 70, 79, 206, 77, 70, 79, 128, - 77, 70, 73, 89, 65, 81, 128, 77, 70, 73, 69, 69, 128, 77, 70, 69, 85, 84, - 128, 77, 70, 69, 85, 81, 128, 77, 70, 69, 85, 65, 69, 128, 77, 70, 65, - 65, 128, 77, 69, 90, 90, 79, 128, 77, 69, 88, 128, 77, 69, 85, 212, 77, - 69, 85, 81, 128, 77, 69, 85, 78, 74, 79, 77, 78, 68, 69, 85, 81, 128, 77, - 69, 85, 78, 128, 77, 69, 84, 82, 79, 128, 77, 69, 84, 82, 73, 67, 65, - 204, 77, 69, 84, 82, 73, 65, 128, 77, 69, 84, 82, 69, 84, 69, 211, 77, - 69, 84, 79, 66, 69, 76, 85, 83, 128, 77, 69, 84, 69, 75, 128, 77, 69, 84, - 69, 71, 128, 77, 69, 84, 65, 76, 128, 77, 69, 84, 193, 77, 69, 83, 83, - 69, 78, 73, 65, 206, 77, 69, 83, 83, 65, 71, 69, 128, 77, 69, 83, 83, 65, - 71, 197, 77, 69, 83, 79, 128, 77, 69, 83, 73, 128, 77, 69, 83, 72, 128, - 77, 69, 82, 80, 69, 82, 83, 79, 78, 128, 77, 69, 82, 75, 72, 65, 128, 77, - 69, 82, 75, 72, 193, 77, 69, 82, 73, 68, 73, 65, 78, 83, 128, 77, 69, 82, - 73, 128, 77, 69, 82, 71, 69, 128, 77, 69, 82, 67, 85, 82, 89, 128, 77, - 69, 82, 67, 85, 82, 217, 77, 69, 78, 79, 82, 65, 200, 77, 69, 78, 79, 69, + 78, 73, 79, 78, 128, 79, 78, 69, 83, 69, 76, 70, 128, 79, 78, 69, 45, 87, + 65, 217, 79, 78, 69, 45, 84, 72, 73, 82, 84, 89, 128, 79, 78, 69, 45, 80, + 73, 69, 67, 197, 79, 78, 69, 45, 76, 73, 78, 197, 79, 78, 69, 45, 72, 85, + 78, 68, 82, 69, 68, 45, 65, 78, 68, 45, 83, 73, 88, 84, 73, 69, 84, 72, + 128, 79, 78, 67, 79, 77, 73, 78, 199, 79, 78, 65, 80, 128, 79, 78, 45, + 79, 70, 198, 79, 77, 73, 83, 83, 73, 79, 206, 79, 77, 73, 67, 82, 79, 78, + 128, 79, 77, 73, 67, 82, 79, 206, 79, 77, 69, 71, 65, 128, 79, 77, 69, + 71, 193, 79, 77, 65, 76, 79, 78, 128, 79, 76, 73, 86, 69, 128, 79, 76, + 73, 71, 79, 206, 79, 76, 68, 128, 79, 75, 84, 207, 79, 75, 65, 82, 65, + 128, 79, 75, 65, 82, 193, 79, 74, 73, 66, 87, 65, 217, 79, 74, 69, 79, + 78, 128, 79, 73, 78, 128, 79, 73, 76, 128, 79, 73, 204, 79, 72, 77, 128, + 79, 72, 205, 79, 71, 82, 69, 128, 79, 71, 79, 78, 69, 75, 128, 79, 71, + 79, 78, 69, 203, 79, 71, 72, 65, 205, 79, 70, 70, 73, 67, 69, 82, 128, + 79, 70, 70, 73, 67, 69, 128, 79, 70, 70, 73, 67, 197, 79, 70, 70, 128, + 79, 69, 89, 128, 79, 69, 82, 128, 79, 69, 75, 128, 79, 69, 69, 128, 79, + 68, 69, 78, 128, 79, 68, 68, 128, 79, 68, 196, 79, 67, 84, 79, 80, 85, + 83, 128, 79, 67, 84, 79, 66, 69, 82, 128, 79, 67, 84, 69, 212, 79, 67, + 84, 65, 71, 79, 78, 65, 204, 79, 67, 84, 65, 71, 79, 78, 128, 79, 67, + 210, 79, 67, 76, 79, 67, 75, 128, 79, 67, 67, 76, 85, 83, 73, 79, 78, + 128, 79, 66, 83, 84, 82, 85, 67, 84, 73, 79, 78, 128, 79, 66, 83, 69, 82, + 86, 69, 210, 79, 66, 79, 76, 211, 79, 66, 79, 204, 79, 66, 79, 70, 73, + 76, 73, 128, 79, 66, 76, 73, 81, 85, 197, 79, 66, 74, 69, 67, 212, 79, + 66, 69, 76, 85, 83, 128, 79, 66, 69, 76, 79, 83, 128, 79, 66, 128, 79, + 65, 89, 128, 79, 65, 75, 128, 79, 65, 66, 79, 65, 70, 73, 76, 73, 128, + 79, 193, 79, 48, 53, 49, 128, 79, 48, 53, 48, 66, 128, 79, 48, 53, 48, + 65, 128, 79, 48, 53, 48, 128, 79, 48, 52, 57, 128, 79, 48, 52, 56, 128, + 79, 48, 52, 55, 128, 79, 48, 52, 54, 128, 79, 48, 52, 53, 128, 79, 48, + 52, 52, 128, 79, 48, 52, 51, 128, 79, 48, 52, 50, 128, 79, 48, 52, 49, + 128, 79, 48, 52, 48, 128, 79, 48, 51, 57, 128, 79, 48, 51, 56, 128, 79, + 48, 51, 55, 128, 79, 48, 51, 54, 68, 128, 79, 48, 51, 54, 67, 128, 79, + 48, 51, 54, 66, 128, 79, 48, 51, 54, 65, 128, 79, 48, 51, 54, 128, 79, + 48, 51, 53, 128, 79, 48, 51, 52, 128, 79, 48, 51, 51, 65, 128, 79, 48, + 51, 51, 128, 79, 48, 51, 50, 128, 79, 48, 51, 49, 128, 79, 48, 51, 48, + 65, 128, 79, 48, 51, 48, 128, 79, 48, 50, 57, 65, 128, 79, 48, 50, 57, + 128, 79, 48, 50, 56, 128, 79, 48, 50, 55, 128, 79, 48, 50, 54, 128, 79, + 48, 50, 53, 65, 128, 79, 48, 50, 53, 128, 79, 48, 50, 52, 65, 128, 79, + 48, 50, 52, 128, 79, 48, 50, 51, 128, 79, 48, 50, 50, 128, 79, 48, 50, + 49, 128, 79, 48, 50, 48, 65, 128, 79, 48, 50, 48, 128, 79, 48, 49, 57, + 65, 128, 79, 48, 49, 57, 128, 79, 48, 49, 56, 128, 79, 48, 49, 55, 128, + 79, 48, 49, 54, 128, 79, 48, 49, 53, 128, 79, 48, 49, 52, 128, 79, 48, + 49, 51, 128, 79, 48, 49, 50, 128, 79, 48, 49, 49, 128, 79, 48, 49, 48, + 67, 128, 79, 48, 49, 48, 66, 128, 79, 48, 49, 48, 65, 128, 79, 48, 49, + 48, 128, 79, 48, 48, 57, 128, 79, 48, 48, 56, 128, 79, 48, 48, 55, 128, + 79, 48, 48, 54, 70, 128, 79, 48, 48, 54, 69, 128, 79, 48, 48, 54, 68, + 128, 79, 48, 48, 54, 67, 128, 79, 48, 48, 54, 66, 128, 79, 48, 48, 54, + 65, 128, 79, 48, 48, 54, 128, 79, 48, 48, 53, 65, 128, 79, 48, 48, 53, + 128, 79, 48, 48, 52, 128, 79, 48, 48, 51, 128, 79, 48, 48, 50, 128, 79, + 48, 48, 49, 65, 128, 79, 48, 48, 49, 128, 79, 45, 89, 69, 128, 79, 45, + 79, 45, 73, 128, 79, 45, 69, 128, 78, 90, 89, 88, 128, 78, 90, 89, 84, + 128, 78, 90, 89, 82, 88, 128, 78, 90, 89, 82, 128, 78, 90, 89, 80, 128, + 78, 90, 89, 128, 78, 90, 85, 88, 128, 78, 90, 85, 82, 88, 128, 78, 90, + 85, 82, 128, 78, 90, 85, 81, 128, 78, 90, 85, 80, 128, 78, 90, 85, 79, + 88, 128, 78, 90, 85, 79, 128, 78, 90, 85, 206, 78, 90, 85, 128, 78, 90, + 79, 88, 128, 78, 90, 79, 80, 128, 78, 90, 73, 88, 128, 78, 90, 73, 84, + 128, 78, 90, 73, 80, 128, 78, 90, 73, 69, 88, 128, 78, 90, 73, 69, 80, + 128, 78, 90, 73, 69, 128, 78, 90, 73, 128, 78, 90, 69, 88, 128, 78, 90, + 69, 85, 77, 128, 78, 90, 69, 128, 78, 90, 65, 88, 128, 78, 90, 65, 84, + 128, 78, 90, 65, 81, 128, 78, 90, 65, 80, 128, 78, 90, 65, 128, 78, 90, + 193, 78, 89, 87, 65, 128, 78, 89, 85, 88, 128, 78, 89, 85, 85, 128, 78, + 89, 85, 84, 128, 78, 89, 85, 80, 128, 78, 89, 85, 79, 88, 128, 78, 89, + 85, 79, 80, 128, 78, 89, 85, 79, 128, 78, 89, 85, 78, 128, 78, 89, 85, + 69, 128, 78, 89, 85, 128, 78, 89, 79, 88, 128, 78, 89, 79, 84, 128, 78, + 89, 79, 80, 128, 78, 89, 79, 79, 128, 78, 89, 79, 78, 128, 78, 89, 79, + 65, 128, 78, 89, 79, 128, 78, 89, 74, 65, 128, 78, 89, 73, 88, 128, 78, + 89, 73, 84, 128, 78, 89, 73, 212, 78, 89, 73, 211, 78, 89, 73, 210, 78, + 89, 73, 80, 128, 78, 89, 73, 78, 45, 68, 79, 128, 78, 89, 73, 78, 128, + 78, 89, 73, 73, 128, 78, 89, 73, 69, 88, 128, 78, 89, 73, 69, 84, 128, + 78, 89, 73, 69, 80, 128, 78, 89, 73, 69, 128, 78, 89, 73, 65, 75, 69, 78, + 199, 78, 89, 73, 128, 78, 89, 201, 78, 89, 72, 65, 128, 78, 89, 69, 84, + 128, 78, 89, 69, 212, 78, 89, 69, 78, 128, 78, 89, 69, 72, 128, 78, 89, + 69, 200, 78, 89, 69, 69, 128, 78, 89, 69, 128, 78, 89, 196, 78, 89, 67, + 65, 128, 78, 89, 65, 85, 128, 78, 89, 65, 74, 128, 78, 89, 65, 73, 128, + 78, 89, 65, 72, 128, 78, 89, 65, 69, 77, 65, 69, 128, 78, 89, 65, 65, + 128, 78, 87, 79, 79, 128, 78, 87, 79, 128, 78, 87, 73, 73, 128, 78, 87, + 73, 128, 78, 87, 69, 128, 78, 87, 65, 65, 128, 78, 87, 65, 128, 78, 87, + 128, 78, 86, 128, 78, 85, 88, 128, 78, 85, 85, 78, 128, 78, 85, 85, 128, + 78, 85, 84, 73, 76, 76, 85, 128, 78, 85, 84, 128, 78, 85, 212, 78, 85, + 82, 88, 128, 78, 85, 82, 128, 78, 85, 80, 128, 78, 85, 79, 88, 128, 78, + 85, 79, 80, 128, 78, 85, 79, 128, 78, 85, 78, 85, 90, 128, 78, 85, 78, + 85, 218, 78, 85, 78, 71, 128, 78, 85, 78, 65, 86, 85, 212, 78, 85, 78, + 65, 86, 73, 203, 78, 85, 78, 128, 78, 85, 206, 78, 85, 77, 69, 82, 207, + 78, 85, 77, 69, 82, 65, 84, 79, 210, 78, 85, 77, 69, 82, 65, 204, 78, 85, + 77, 66, 69, 82, 83, 128, 78, 85, 77, 66, 69, 82, 128, 78, 85, 77, 128, + 78, 85, 76, 76, 128, 78, 85, 76, 204, 78, 85, 76, 128, 78, 85, 75, 84, + 65, 128, 78, 85, 75, 84, 193, 78, 85, 69, 78, 71, 128, 78, 85, 69, 128, + 78, 85, 66, 73, 65, 206, 78, 85, 65, 69, 128, 78, 85, 49, 49, 128, 78, + 85, 49, 177, 78, 85, 48, 50, 50, 65, 128, 78, 85, 48, 50, 50, 128, 78, + 85, 48, 50, 49, 128, 78, 85, 48, 50, 48, 128, 78, 85, 48, 49, 57, 128, + 78, 85, 48, 49, 56, 65, 128, 78, 85, 48, 49, 56, 128, 78, 85, 48, 49, 55, + 128, 78, 85, 48, 49, 54, 128, 78, 85, 48, 49, 53, 128, 78, 85, 48, 49, + 52, 128, 78, 85, 48, 49, 51, 128, 78, 85, 48, 49, 50, 128, 78, 85, 48, + 49, 49, 65, 128, 78, 85, 48, 49, 49, 128, 78, 85, 48, 49, 48, 65, 128, + 78, 85, 48, 49, 48, 128, 78, 85, 48, 48, 57, 128, 78, 85, 48, 48, 56, + 128, 78, 85, 48, 48, 55, 128, 78, 85, 48, 48, 54, 128, 78, 85, 48, 48, + 53, 128, 78, 85, 48, 48, 52, 128, 78, 85, 48, 48, 51, 128, 78, 85, 48, + 48, 50, 128, 78, 85, 48, 48, 49, 128, 78, 85, 45, 51, 128, 78, 85, 45, + 50, 128, 78, 85, 45, 49, 128, 78, 84, 88, 73, 86, 128, 78, 84, 88, 65, + 128, 78, 84, 85, 85, 128, 78, 84, 85, 77, 128, 78, 84, 85, 74, 128, 78, + 84, 213, 78, 84, 83, 65, 85, 128, 78, 84, 83, 65, 128, 78, 84, 79, 81, + 80, 69, 78, 128, 78, 84, 79, 71, 128, 78, 84, 79, 199, 78, 84, 73, 69, + 197, 78, 84, 72, 65, 85, 128, 78, 84, 69, 85, 78, 71, 66, 65, 128, 78, + 84, 69, 85, 77, 128, 78, 84, 69, 78, 128, 78, 84, 69, 69, 128, 78, 84, + 65, 80, 128, 78, 84, 65, 208, 78, 84, 65, 65, 128, 78, 84, 65, 128, 78, + 83, 85, 79, 212, 78, 83, 85, 78, 128, 78, 83, 85, 77, 128, 78, 83, 79, + 77, 128, 78, 83, 73, 69, 69, 84, 128, 78, 83, 73, 69, 69, 80, 128, 78, + 83, 73, 69, 69, 128, 78, 83, 72, 85, 84, 128, 78, 83, 72, 85, 212, 78, + 83, 72, 85, 79, 80, 128, 78, 83, 72, 85, 69, 128, 78, 83, 72, 73, 69, 69, + 128, 78, 83, 72, 69, 69, 128, 78, 83, 72, 65, 81, 128, 78, 83, 72, 65, + 128, 78, 83, 69, 85, 65, 69, 78, 128, 78, 83, 69, 78, 128, 78, 83, 65, + 128, 78, 82, 89, 88, 128, 78, 82, 89, 84, 128, 78, 82, 89, 82, 88, 128, + 78, 82, 89, 82, 128, 78, 82, 89, 80, 128, 78, 82, 89, 128, 78, 82, 85, + 88, 128, 78, 82, 85, 84, 128, 78, 82, 85, 82, 88, 128, 78, 82, 85, 82, + 128, 78, 82, 85, 80, 128, 78, 82, 85, 65, 128, 78, 82, 85, 128, 78, 82, + 79, 88, 128, 78, 82, 79, 80, 128, 78, 82, 79, 128, 78, 82, 69, 88, 128, + 78, 82, 69, 84, 128, 78, 82, 69, 211, 78, 82, 69, 80, 128, 78, 82, 69, + 128, 78, 82, 65, 88, 128, 78, 82, 65, 84, 128, 78, 82, 65, 80, 128, 78, + 82, 65, 128, 78, 81, 73, 71, 128, 78, 81, 65, 128, 78, 80, 76, 65, 128, + 78, 80, 65, 128, 78, 79, 89, 128, 78, 79, 88, 128, 78, 79, 87, 67, 128, + 78, 79, 86, 73, 76, 69, 128, 78, 79, 86, 69, 77, 66, 69, 82, 128, 78, 79, + 84, 84, 79, 128, 78, 79, 84, 69, 83, 128, 78, 79, 84, 69, 72, 69, 65, 68, + 128, 78, 79, 84, 69, 72, 69, 65, 196, 78, 79, 84, 69, 66, 79, 79, 75, + 128, 78, 79, 84, 69, 66, 79, 79, 203, 78, 79, 84, 69, 128, 78, 79, 84, + 197, 78, 79, 84, 67, 72, 69, 196, 78, 79, 84, 67, 72, 128, 78, 79, 84, + 65, 84, 73, 79, 206, 78, 79, 84, 128, 78, 79, 212, 78, 79, 83, 69, 128, + 78, 79, 83, 197, 78, 79, 82, 84, 72, 87, 69, 83, 212, 78, 79, 82, 84, 72, + 69, 82, 206, 78, 79, 82, 84, 72, 69, 65, 83, 84, 45, 80, 79, 73, 78, 84, + 73, 78, 199, 78, 79, 82, 77, 65, 204, 78, 79, 82, 68, 73, 195, 78, 79, + 210, 78, 79, 80, 128, 78, 79, 79, 78, 85, 128, 78, 79, 79, 128, 78, 79, + 78, 70, 79, 82, 75, 73, 78, 71, 128, 78, 79, 78, 45, 80, 79, 84, 65, 66, + 76, 197, 78, 79, 78, 45, 74, 79, 73, 78, 69, 82, 128, 78, 79, 78, 45, 66, + 82, 69, 65, 75, 73, 78, 199, 78, 79, 78, 128, 78, 79, 77, 73, 83, 77, + 193, 78, 79, 77, 73, 78, 65, 204, 78, 79, 75, 72, 85, 75, 128, 78, 79, + 68, 69, 128, 78, 79, 65, 128, 78, 79, 45, 66, 82, 69, 65, 203, 78, 79, + 45, 53, 128, 78, 79, 45, 52, 128, 78, 79, 45, 51, 128, 78, 79, 45, 50, + 128, 78, 79, 45, 49, 128, 78, 78, 85, 85, 128, 78, 78, 85, 128, 78, 78, + 79, 79, 128, 78, 78, 79, 128, 78, 78, 78, 85, 85, 128, 78, 78, 78, 85, + 128, 78, 78, 78, 79, 79, 128, 78, 78, 78, 79, 128, 78, 78, 78, 73, 73, + 128, 78, 78, 78, 73, 128, 78, 78, 78, 69, 69, 128, 78, 78, 78, 69, 128, + 78, 78, 78, 65, 85, 128, 78, 78, 78, 65, 73, 128, 78, 78, 78, 65, 65, + 128, 78, 78, 78, 65, 128, 78, 78, 78, 128, 78, 78, 72, 65, 128, 78, 78, + 71, 79, 79, 128, 78, 78, 71, 79, 128, 78, 78, 71, 73, 73, 128, 78, 78, + 71, 73, 128, 78, 78, 71, 65, 65, 128, 78, 78, 71, 65, 128, 78, 78, 71, + 128, 78, 78, 66, 83, 80, 128, 78, 77, 128, 78, 76, 65, 85, 128, 78, 76, + 48, 50, 48, 128, 78, 76, 48, 49, 57, 128, 78, 76, 48, 49, 56, 128, 78, + 76, 48, 49, 55, 65, 128, 78, 76, 48, 49, 55, 128, 78, 76, 48, 49, 54, + 128, 78, 76, 48, 49, 53, 128, 78, 76, 48, 49, 52, 128, 78, 76, 48, 49, + 51, 128, 78, 76, 48, 49, 50, 128, 78, 76, 48, 49, 49, 128, 78, 76, 48, + 49, 48, 128, 78, 76, 48, 48, 57, 128, 78, 76, 48, 48, 56, 128, 78, 76, + 48, 48, 55, 128, 78, 76, 48, 48, 54, 128, 78, 76, 48, 48, 53, 65, 128, + 78, 76, 48, 48, 53, 128, 78, 76, 48, 48, 52, 128, 78, 76, 48, 48, 51, + 128, 78, 76, 48, 48, 50, 128, 78, 76, 48, 48, 49, 128, 78, 76, 128, 78, + 75, 79, 77, 128, 78, 75, 207, 78, 75, 73, 78, 68, 73, 128, 78, 75, 65, + 85, 128, 78, 75, 65, 65, 82, 65, 69, 128, 78, 75, 65, 128, 78, 74, 89, + 88, 128, 78, 74, 89, 84, 128, 78, 74, 89, 82, 88, 128, 78, 74, 89, 82, + 128, 78, 74, 89, 80, 128, 78, 74, 89, 128, 78, 74, 85, 88, 128, 78, 74, + 85, 82, 88, 128, 78, 74, 85, 82, 128, 78, 74, 85, 81, 65, 128, 78, 74, + 85, 80, 128, 78, 74, 85, 79, 88, 128, 78, 74, 85, 79, 128, 78, 74, 85, + 69, 81, 128, 78, 74, 85, 65, 69, 128, 78, 74, 85, 128, 78, 74, 79, 88, + 128, 78, 74, 79, 84, 128, 78, 74, 79, 80, 128, 78, 74, 79, 79, 128, 78, + 74, 79, 128, 78, 74, 73, 88, 128, 78, 74, 73, 84, 128, 78, 74, 73, 80, + 128, 78, 74, 73, 69, 88, 128, 78, 74, 73, 69, 84, 128, 78, 74, 73, 69, + 80, 128, 78, 74, 73, 69, 69, 128, 78, 74, 73, 69, 128, 78, 74, 73, 128, + 78, 74, 201, 78, 74, 69, 85, 88, 128, 78, 74, 69, 85, 84, 128, 78, 74, + 69, 85, 65, 69, 78, 65, 128, 78, 74, 69, 85, 65, 69, 77, 128, 78, 74, 69, + 69, 69, 69, 128, 78, 74, 69, 69, 128, 78, 74, 69, 197, 78, 74, 69, 128, + 78, 74, 65, 81, 128, 78, 74, 65, 80, 128, 78, 74, 65, 69, 77, 76, 73, + 128, 78, 74, 65, 69, 77, 128, 78, 74, 65, 65, 128, 78, 73, 88, 128, 78, + 73, 84, 82, 69, 128, 78, 73, 83, 65, 71, 128, 78, 73, 82, 85, 71, 85, + 128, 78, 73, 80, 128, 78, 73, 78, 84, 72, 128, 78, 73, 78, 69, 84, 89, + 128, 78, 73, 78, 69, 84, 217, 78, 73, 78, 69, 84, 69, 69, 78, 128, 78, + 73, 78, 69, 84, 69, 69, 206, 78, 73, 78, 69, 45, 84, 72, 73, 82, 84, 89, + 128, 78, 73, 78, 197, 78, 73, 78, 68, 65, 50, 128, 78, 73, 78, 68, 65, + 178, 78, 73, 78, 57, 128, 78, 73, 78, 128, 78, 73, 77, 128, 78, 73, 205, + 78, 73, 75, 79, 76, 83, 66, 85, 82, 199, 78, 73, 75, 72, 65, 72, 73, 84, + 128, 78, 73, 75, 65, 72, 73, 84, 128, 78, 73, 75, 65, 128, 78, 73, 72, + 83, 72, 86, 65, 83, 65, 128, 78, 73, 71, 73, 68, 65, 77, 73, 78, 128, 78, + 73, 71, 73, 68, 65, 69, 83, 72, 128, 78, 73, 71, 72, 84, 128, 78, 73, 71, + 72, 212, 78, 73, 71, 71, 65, 72, 73, 84, 65, 128, 78, 73, 69, 88, 128, + 78, 73, 69, 85, 78, 45, 84, 73, 75, 69, 85, 84, 128, 78, 73, 69, 85, 78, + 45, 84, 72, 73, 69, 85, 84, 72, 128, 78, 73, 69, 85, 78, 45, 83, 73, 79, + 83, 128, 78, 73, 69, 85, 78, 45, 82, 73, 69, 85, 76, 128, 78, 73, 69, 85, + 78, 45, 80, 73, 69, 85, 80, 128, 78, 73, 69, 85, 78, 45, 80, 65, 78, 83, + 73, 79, 83, 128, 78, 73, 69, 85, 78, 45, 75, 73, 89, 69, 79, 75, 128, 78, + 73, 69, 85, 78, 45, 72, 73, 69, 85, 72, 128, 78, 73, 69, 85, 78, 45, 67, + 73, 69, 85, 67, 128, 78, 73, 69, 85, 78, 45, 67, 72, 73, 69, 85, 67, 72, + 128, 78, 73, 69, 85, 206, 78, 73, 69, 80, 128, 78, 73, 69, 128, 78, 73, + 66, 128, 78, 73, 65, 128, 78, 73, 50, 128, 78, 73, 45, 84, 69, 128, 78, + 73, 45, 55, 128, 78, 73, 45, 54, 128, 78, 73, 45, 53, 128, 78, 73, 45, + 52, 128, 78, 73, 45, 51, 128, 78, 73, 45, 50, 128, 78, 73, 45, 49, 128, + 78, 72, 85, 69, 128, 78, 72, 74, 65, 128, 78, 72, 128, 78, 71, 89, 69, + 128, 78, 71, 86, 69, 128, 78, 71, 85, 85, 128, 78, 71, 85, 79, 88, 128, + 78, 71, 85, 79, 84, 128, 78, 71, 85, 79, 128, 78, 71, 85, 65, 78, 128, + 78, 71, 85, 65, 69, 84, 128, 78, 71, 85, 65, 69, 128, 78, 71, 79, 88, + 128, 78, 71, 79, 85, 128, 78, 71, 79, 213, 78, 71, 79, 84, 128, 78, 71, + 79, 81, 128, 78, 71, 79, 80, 128, 78, 71, 79, 78, 128, 78, 71, 79, 77, + 128, 78, 71, 79, 69, 72, 128, 78, 71, 79, 69, 200, 78, 71, 207, 78, 71, + 75, 89, 69, 69, 128, 78, 71, 75, 87, 65, 69, 78, 128, 78, 71, 75, 85, 80, + 128, 78, 71, 75, 85, 78, 128, 78, 71, 75, 85, 77, 128, 78, 71, 75, 85, + 69, 78, 90, 69, 85, 77, 128, 78, 71, 75, 85, 197, 78, 71, 75, 73, 78, 68, + 201, 78, 71, 75, 73, 69, 69, 128, 78, 71, 75, 69, 85, 88, 128, 78, 71, + 75, 69, 85, 82, 73, 128, 78, 71, 75, 69, 85, 65, 69, 81, 128, 78, 71, 75, + 69, 85, 65, 69, 77, 128, 78, 71, 75, 65, 81, 128, 78, 71, 75, 65, 80, + 128, 78, 71, 75, 65, 65, 77, 73, 128, 78, 71, 75, 65, 128, 78, 71, 73, + 69, 88, 128, 78, 71, 73, 69, 80, 128, 78, 71, 73, 69, 128, 78, 71, 72, + 65, 128, 78, 71, 71, 87, 65, 69, 78, 128, 78, 71, 71, 85, 82, 65, 69, + 128, 78, 71, 71, 85, 80, 128, 78, 71, 71, 85, 79, 81, 128, 78, 71, 71, + 85, 79, 209, 78, 71, 71, 85, 79, 78, 128, 78, 71, 71, 85, 79, 77, 128, + 78, 71, 71, 85, 77, 128, 78, 71, 71, 85, 69, 69, 84, 128, 78, 71, 71, 85, + 65, 69, 83, 72, 65, 197, 78, 71, 71, 85, 65, 69, 206, 78, 71, 71, 85, 65, + 128, 78, 71, 71, 85, 128, 78, 71, 71, 79, 79, 128, 78, 71, 71, 79, 128, + 78, 71, 71, 73, 128, 78, 71, 71, 69, 85, 88, 128, 78, 71, 71, 69, 85, 65, + 69, 84, 128, 78, 71, 71, 69, 85, 65, 69, 128, 78, 71, 71, 69, 213, 78, + 71, 71, 69, 78, 128, 78, 71, 71, 69, 69, 84, 128, 78, 71, 71, 69, 69, 69, + 69, 128, 78, 71, 71, 69, 69, 128, 78, 71, 71, 69, 128, 78, 71, 71, 65, + 80, 128, 78, 71, 71, 65, 65, 77, 65, 69, 128, 78, 71, 71, 65, 65, 77, + 128, 78, 71, 71, 65, 65, 128, 78, 71, 71, 128, 78, 71, 69, 88, 128, 78, + 71, 69, 85, 82, 69, 85, 84, 128, 78, 71, 69, 80, 128, 78, 71, 69, 78, + 128, 78, 71, 69, 69, 128, 78, 71, 69, 65, 68, 65, 76, 128, 78, 71, 65, + 88, 128, 78, 71, 65, 85, 128, 78, 71, 65, 84, 128, 78, 71, 65, 211, 78, + 71, 65, 81, 128, 78, 71, 65, 80, 128, 78, 71, 65, 78, 71, 85, 128, 78, + 71, 65, 78, 128, 78, 71, 65, 73, 128, 78, 71, 65, 72, 128, 78, 71, 65, + 65, 73, 128, 78, 71, 193, 78, 70, 128, 78, 69, 88, 212, 78, 69, 88, 128, + 78, 69, 87, 83, 80, 65, 80, 69, 82, 128, 78, 69, 87, 76, 73, 78, 69, 128, + 78, 69, 87, 76, 73, 78, 197, 78, 69, 87, 193, 78, 69, 87, 128, 78, 69, + 215, 78, 69, 85, 84, 82, 65, 76, 128, 78, 69, 85, 84, 82, 65, 204, 78, + 69, 85, 84, 69, 82, 128, 78, 69, 84, 87, 79, 82, 75, 69, 196, 78, 69, + 212, 78, 69, 83, 84, 69, 196, 78, 69, 83, 83, 85, 83, 128, 78, 69, 82, + 196, 78, 69, 81, 85, 68, 65, 65, 128, 78, 69, 80, 84, 85, 78, 69, 128, + 78, 69, 80, 84, 85, 78, 197, 78, 69, 80, 128, 78, 69, 79, 128, 78, 69, + 207, 78, 69, 78, 79, 69, 128, 78, 69, 78, 65, 78, 79, 128, 78, 69, 78, + 128, 78, 69, 76, 128, 78, 69, 73, 84, 72, 69, 210, 78, 69, 71, 65, 84, + 73, 86, 197, 78, 69, 71, 65, 84, 73, 79, 206, 78, 69, 71, 65, 84, 69, + 196, 78, 69, 67, 75, 84, 73, 69, 128, 78, 69, 67, 75, 128, 78, 69, 66, + 69, 78, 83, 84, 73, 77, 77, 69, 128, 78, 69, 45, 75, 79, 128, 78, 68, 85, + 88, 128, 78, 68, 85, 84, 128, 78, 68, 85, 82, 88, 128, 78, 68, 85, 82, + 128, 78, 68, 85, 80, 128, 78, 68, 85, 78, 128, 78, 68, 213, 78, 68, 79, + 88, 128, 78, 68, 79, 84, 128, 78, 68, 79, 80, 128, 78, 68, 79, 79, 128, + 78, 68, 79, 78, 128, 78, 68, 79, 77, 66, 85, 128, 78, 68, 79, 76, 197, + 78, 68, 73, 88, 128, 78, 68, 73, 84, 128, 78, 68, 73, 81, 128, 78, 68, + 73, 80, 128, 78, 68, 73, 69, 88, 128, 78, 68, 73, 69, 128, 78, 68, 73, + 68, 65, 128, 78, 68, 73, 65, 81, 128, 78, 68, 69, 88, 128, 78, 68, 69, + 85, 88, 128, 78, 68, 69, 85, 84, 128, 78, 68, 69, 85, 65, 69, 82, 69, 69, + 128, 78, 68, 69, 80, 128, 78, 68, 69, 69, 128, 78, 68, 69, 128, 78, 68, + 65, 88, 128, 78, 68, 65, 84, 128, 78, 68, 65, 80, 128, 78, 68, 65, 77, + 128, 78, 68, 65, 65, 78, 71, 71, 69, 85, 65, 69, 84, 128, 78, 68, 65, 65, + 128, 78, 68, 65, 193, 78, 67, 72, 65, 85, 128, 78, 67, 65, 128, 78, 66, + 89, 88, 128, 78, 66, 89, 84, 128, 78, 66, 89, 82, 88, 128, 78, 66, 89, + 82, 128, 78, 66, 89, 80, 128, 78, 66, 89, 128, 78, 66, 85, 88, 128, 78, + 66, 85, 84, 128, 78, 66, 85, 82, 88, 128, 78, 66, 85, 82, 128, 78, 66, + 85, 80, 128, 78, 66, 85, 128, 78, 66, 79, 88, 128, 78, 66, 79, 84, 128, + 78, 66, 79, 80, 128, 78, 66, 79, 128, 78, 66, 73, 88, 128, 78, 66, 73, + 84, 128, 78, 66, 73, 80, 128, 78, 66, 73, 69, 88, 128, 78, 66, 73, 69, + 80, 128, 78, 66, 73, 69, 128, 78, 66, 73, 128, 78, 66, 72, 128, 78, 66, + 65, 88, 128, 78, 66, 65, 84, 128, 78, 66, 65, 80, 128, 78, 66, 65, 128, + 78, 65, 90, 65, 210, 78, 65, 89, 65, 78, 78, 65, 128, 78, 65, 89, 128, + 78, 65, 88, 73, 65, 206, 78, 65, 88, 128, 78, 65, 85, 84, 72, 83, 128, + 78, 65, 85, 83, 69, 65, 84, 69, 196, 78, 65, 85, 68, 73, 218, 78, 65, 84, + 85, 82, 65, 204, 78, 65, 84, 73, 79, 78, 65, 204, 78, 65, 83, 75, 65, 80, + 201, 78, 65, 83, 72, 73, 128, 78, 65, 83, 65, 76, 73, 90, 65, 84, 73, 79, + 78, 128, 78, 65, 83, 65, 76, 73, 90, 65, 84, 73, 79, 206, 78, 65, 83, 65, + 204, 78, 65, 82, 82, 79, 215, 78, 65, 82, 128, 78, 65, 81, 128, 78, 65, + 79, 211, 78, 65, 78, 83, 65, 78, 65, 81, 128, 78, 65, 78, 71, 77, 79, 78, + 84, 72, 79, 128, 78, 65, 78, 68, 73, 78, 65, 71, 65, 82, 201, 78, 65, 78, + 68, 128, 78, 65, 78, 65, 128, 78, 65, 77, 69, 128, 78, 65, 77, 197, 78, + 65, 77, 50, 128, 78, 65, 75, 128, 78, 65, 73, 82, 193, 78, 65, 73, 204, + 78, 65, 71, 82, 201, 78, 65, 71, 65, 82, 128, 78, 65, 71, 65, 128, 78, + 65, 71, 193, 78, 65, 71, 128, 78, 65, 199, 78, 65, 69, 128, 78, 65, 66, + 76, 65, 128, 78, 65, 66, 65, 84, 65, 69, 65, 206, 78, 65, 65, 83, 73, 75, + 89, 65, 89, 65, 128, 78, 65, 65, 75, 83, 73, 75, 89, 65, 89, 65, 128, 78, + 65, 65, 73, 128, 78, 65, 193, 78, 65, 52, 128, 78, 65, 50, 128, 78, 65, + 45, 57, 128, 78, 65, 45, 56, 128, 78, 65, 45, 55, 128, 78, 65, 45, 54, + 128, 78, 65, 45, 53, 128, 78, 65, 45, 52, 128, 78, 65, 45, 51, 128, 78, + 65, 45, 50, 128, 78, 65, 45, 49, 128, 78, 48, 52, 50, 128, 78, 48, 52, + 49, 128, 78, 48, 52, 48, 128, 78, 48, 51, 57, 128, 78, 48, 51, 56, 128, + 78, 48, 51, 55, 65, 128, 78, 48, 51, 55, 128, 78, 48, 51, 54, 128, 78, + 48, 51, 53, 65, 128, 78, 48, 51, 53, 128, 78, 48, 51, 52, 65, 128, 78, + 48, 51, 52, 128, 78, 48, 51, 51, 65, 128, 78, 48, 51, 51, 128, 78, 48, + 51, 50, 128, 78, 48, 51, 49, 128, 78, 48, 51, 48, 128, 78, 48, 50, 57, + 128, 78, 48, 50, 56, 128, 78, 48, 50, 55, 128, 78, 48, 50, 54, 128, 78, + 48, 50, 53, 65, 128, 78, 48, 50, 53, 128, 78, 48, 50, 52, 128, 78, 48, + 50, 51, 128, 78, 48, 50, 50, 128, 78, 48, 50, 49, 128, 78, 48, 50, 48, + 128, 78, 48, 49, 57, 128, 78, 48, 49, 56, 66, 128, 78, 48, 49, 56, 65, + 128, 78, 48, 49, 56, 128, 78, 48, 49, 55, 128, 78, 48, 49, 54, 128, 78, + 48, 49, 53, 128, 78, 48, 49, 52, 128, 78, 48, 49, 51, 128, 78, 48, 49, + 50, 128, 78, 48, 49, 49, 128, 78, 48, 49, 48, 128, 78, 48, 48, 57, 128, + 78, 48, 48, 56, 128, 78, 48, 48, 55, 128, 78, 48, 48, 54, 128, 78, 48, + 48, 53, 128, 78, 48, 48, 52, 128, 78, 48, 48, 51, 128, 78, 48, 48, 50, + 128, 78, 48, 48, 49, 128, 78, 45, 77, 85, 45, 77, 79, 45, 50, 128, 78, + 45, 77, 85, 45, 77, 79, 45, 49, 128, 78, 45, 67, 82, 69, 197, 78, 45, 65, + 82, 217, 77, 89, 88, 128, 77, 89, 84, 128, 77, 89, 83, 76, 73, 84, 69, + 128, 77, 89, 80, 128, 77, 89, 65, 128, 77, 89, 193, 77, 89, 128, 77, 87, + 79, 79, 128, 77, 87, 79, 128, 77, 87, 73, 73, 128, 77, 87, 73, 128, 77, + 87, 69, 69, 128, 77, 87, 69, 128, 77, 87, 65, 65, 128, 77, 87, 65, 128, + 77, 87, 128, 77, 215, 77, 86, 83, 128, 77, 86, 79, 80, 128, 77, 86, 73, + 128, 77, 86, 69, 85, 65, 69, 78, 71, 65, 77, 128, 77, 86, 128, 77, 214, + 77, 85, 88, 128, 77, 85, 85, 86, 85, 90, 72, 65, 75, 75, 85, 128, 77, 85, + 85, 83, 73, 75, 65, 84, 79, 65, 78, 128, 77, 85, 85, 82, 68, 72, 65, 74, + 193, 77, 85, 85, 128, 77, 85, 84, 72, 65, 76, 73, 89, 65, 128, 77, 85, + 84, 128, 77, 85, 83, 73, 67, 128, 77, 85, 83, 73, 195, 77, 85, 83, 72, + 82, 79, 79, 77, 128, 77, 85, 83, 72, 51, 128, 77, 85, 83, 72, 179, 77, + 85, 83, 72, 128, 77, 85, 83, 200, 77, 85, 83, 128, 77, 85, 82, 88, 128, + 77, 85, 82, 71, 85, 50, 128, 77, 85, 82, 69, 128, 77, 85, 82, 68, 65, + 128, 77, 85, 82, 68, 193, 77, 85, 82, 128, 77, 85, 81, 68, 65, 77, 128, + 77, 85, 80, 128, 77, 85, 79, 88, 128, 77, 85, 79, 84, 128, 77, 85, 79, + 80, 128, 77, 85, 79, 77, 65, 69, 128, 77, 85, 79, 128, 77, 85, 78, 83, + 85, 66, 128, 77, 85, 78, 65, 72, 128, 77, 85, 78, 128, 77, 85, 76, 84, + 73, 83, 69, 84, 128, 77, 85, 76, 84, 73, 83, 69, 212, 77, 85, 76, 84, 73, + 80, 76, 73, 67, 65, 84, 73, 79, 78, 128, 77, 85, 76, 84, 73, 80, 76, 73, + 67, 65, 84, 73, 79, 206, 77, 85, 76, 84, 73, 80, 76, 69, 128, 77, 85, 76, + 84, 73, 80, 76, 197, 77, 85, 76, 84, 73, 79, 67, 85, 76, 65, 210, 77, 85, + 76, 84, 73, 77, 65, 80, 128, 77, 85, 76, 84, 201, 77, 85, 76, 84, 65, 78, + 201, 77, 85, 75, 80, 72, 82, 69, 78, 71, 128, 77, 85, 75, 75, 85, 82, 85, + 78, 73, 128, 77, 85, 73, 78, 128, 77, 85, 71, 83, 128, 77, 85, 71, 128, + 77, 85, 199, 77, 85, 69, 78, 128, 77, 85, 69, 128, 77, 85, 67, 72, 128, + 77, 85, 67, 200, 77, 85, 67, 65, 65, 68, 128, 77, 85, 65, 83, 128, 77, + 85, 65, 78, 128, 77, 85, 65, 69, 128, 77, 85, 45, 71, 65, 65, 72, 76, 65, + 193, 77, 85, 45, 52, 128, 77, 85, 45, 51, 128, 77, 85, 45, 50, 128, 77, + 85, 45, 49, 128, 77, 213, 77, 84, 65, 86, 82, 85, 76, 201, 77, 83, 128, + 77, 82, 207, 77, 210, 77, 80, 65, 128, 77, 79, 89, 65, 73, 128, 77, 79, + 88, 128, 77, 79, 86, 73, 197, 77, 79, 86, 69, 211, 77, 79, 86, 69, 77, + 69, 78, 84, 45, 87, 65, 76, 76, 80, 76, 65, 78, 197, 77, 79, 86, 69, 77, + 69, 78, 84, 45, 72, 73, 78, 71, 197, 77, 79, 86, 69, 77, 69, 78, 84, 45, + 70, 76, 79, 79, 82, 80, 76, 65, 78, 197, 77, 79, 86, 69, 77, 69, 78, 84, + 45, 68, 73, 65, 71, 79, 78, 65, 204, 77, 79, 86, 69, 77, 69, 78, 84, 128, + 77, 79, 86, 69, 77, 69, 78, 212, 77, 79, 86, 69, 196, 77, 79, 86, 69, + 128, 77, 79, 85, 84, 72, 128, 77, 79, 85, 83, 69, 128, 77, 79, 85, 83, + 197, 77, 79, 85, 78, 84, 65, 73, 78, 83, 128, 77, 79, 85, 78, 84, 65, 73, + 78, 128, 77, 79, 85, 78, 84, 65, 73, 206, 77, 79, 85, 78, 212, 77, 79, + 85, 78, 68, 128, 77, 79, 85, 78, 196, 77, 79, 84, 79, 82, 87, 65, 89, + 128, 77, 79, 84, 79, 82, 73, 90, 69, 196, 77, 79, 84, 79, 82, 67, 89, 67, + 76, 69, 128, 77, 79, 84, 79, 210, 77, 79, 84, 72, 69, 82, 128, 77, 79, + 84, 72, 69, 210, 77, 79, 84, 128, 77, 79, 83, 81, 85, 73, 84, 79, 128, + 77, 79, 83, 81, 85, 69, 128, 77, 79, 82, 84, 85, 85, 77, 128, 77, 79, 82, + 84, 65, 82, 128, 77, 79, 82, 80, 72, 79, 76, 79, 71, 73, 67, 65, 204, 77, + 79, 82, 78, 73, 78, 71, 128, 77, 79, 80, 128, 77, 79, 79, 83, 69, 45, 67, + 82, 69, 197, 77, 79, 79, 78, 128, 77, 79, 79, 206, 77, 79, 79, 77, 80, + 85, 81, 128, 77, 79, 79, 77, 69, 85, 84, 128, 77, 79, 79, 68, 128, 77, + 79, 79, 196, 77, 79, 79, 128, 77, 79, 78, 84, 73, 69, 69, 78, 128, 77, + 79, 78, 84, 72, 128, 77, 79, 78, 84, 200, 77, 79, 78, 83, 84, 69, 82, + 128, 77, 79, 78, 79, 83, 84, 65, 66, 76, 197, 77, 79, 78, 79, 83, 80, 65, + 67, 197, 77, 79, 78, 79, 82, 65, 73, 76, 128, 77, 79, 78, 79, 71, 82, 65, + 80, 200, 77, 79, 78, 79, 71, 82, 65, 77, 77, 79, 211, 77, 79, 78, 79, 71, + 82, 65, 205, 77, 79, 78, 79, 70, 79, 78, 73, 65, 83, 128, 77, 79, 78, 79, + 67, 85, 76, 65, 210, 77, 79, 78, 79, 67, 76, 69, 128, 77, 79, 78, 75, 69, + 89, 128, 77, 79, 78, 75, 69, 217, 77, 79, 78, 73, 128, 77, 79, 78, 71, + 75, 69, 85, 65, 69, 81, 128, 77, 79, 78, 69, 89, 45, 77, 79, 85, 84, 200, + 77, 79, 78, 69, 217, 77, 79, 78, 128, 77, 79, 206, 77, 79, 76, 128, 77, + 79, 72, 65, 77, 77, 65, 196, 77, 79, 68, 85, 76, 207, 77, 79, 68, 73, 70, + 73, 69, 82, 45, 57, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 56, 128, 77, + 79, 68, 73, 70, 73, 69, 82, 45, 55, 128, 77, 79, 68, 73, 70, 73, 69, 82, + 45, 54, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 53, 128, 77, 79, 68, 73, + 70, 73, 69, 82, 45, 52, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 51, 128, + 77, 79, 68, 73, 70, 73, 69, 82, 45, 50, 128, 77, 79, 68, 73, 70, 73, 69, + 82, 45, 49, 54, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 49, 53, 128, 77, + 79, 68, 73, 70, 73, 69, 82, 45, 49, 52, 128, 77, 79, 68, 73, 70, 73, 69, + 82, 45, 49, 51, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 49, 50, 128, 77, + 79, 68, 73, 70, 73, 69, 82, 45, 49, 49, 128, 77, 79, 68, 73, 70, 73, 69, + 82, 45, 49, 48, 128, 77, 79, 68, 73, 70, 73, 69, 82, 128, 77, 79, 68, + 201, 77, 79, 68, 69, 83, 84, 89, 128, 77, 79, 68, 69, 82, 206, 77, 79, + 68, 69, 77, 128, 77, 79, 68, 69, 76, 83, 128, 77, 79, 68, 69, 76, 128, + 77, 79, 68, 69, 128, 77, 79, 66, 73, 76, 197, 77, 79, 65, 128, 77, 79, + 45, 54, 128, 77, 79, 45, 53, 128, 77, 79, 45, 52, 128, 77, 79, 45, 51, + 128, 77, 207, 77, 78, 89, 65, 205, 77, 78, 65, 83, 128, 77, 77, 83, 80, + 128, 77, 77, 128, 77, 205, 77, 76, 65, 128, 77, 76, 128, 77, 75, 80, 65, + 82, 65, 209, 77, 73, 88, 128, 77, 73, 84, 128, 77, 73, 83, 82, 65, 128, + 77, 73, 82, 73, 66, 65, 65, 82, 85, 128, 77, 73, 82, 73, 128, 77, 73, 82, + 69, 68, 128, 77, 73, 80, 128, 77, 73, 78, 89, 128, 77, 73, 78, 85, 83, + 45, 79, 82, 45, 80, 76, 85, 211, 77, 73, 78, 85, 83, 128, 77, 73, 78, 73, + 83, 84, 69, 82, 128, 77, 73, 78, 73, 77, 73, 90, 69, 128, 77, 73, 78, 73, + 77, 65, 128, 77, 73, 78, 73, 68, 73, 83, 67, 128, 77, 73, 78, 73, 66, 85, + 83, 128, 77, 73, 77, 69, 128, 77, 73, 77, 128, 77, 73, 76, 76, 73, 79, + 78, 83, 128, 77, 73, 76, 76, 73, 79, 78, 211, 77, 73, 76, 76, 69, 84, + 128, 77, 73, 76, 76, 197, 77, 73, 76, 204, 77, 73, 76, 75, 217, 77, 73, + 76, 75, 128, 77, 73, 76, 73, 84, 65, 82, 217, 77, 73, 76, 128, 77, 73, + 75, 85, 82, 79, 78, 128, 77, 73, 75, 82, 79, 206, 77, 73, 75, 82, 73, + 128, 77, 73, 73, 78, 128, 77, 73, 73, 77, 128, 77, 73, 73, 128, 77, 73, + 199, 77, 73, 69, 88, 128, 77, 73, 69, 85, 77, 45, 84, 73, 75, 69, 85, 84, + 128, 77, 73, 69, 85, 77, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 77, + 73, 69, 85, 77, 45, 83, 83, 65, 78, 71, 78, 73, 69, 85, 78, 128, 77, 73, + 69, 85, 77, 45, 82, 73, 69, 85, 76, 128, 77, 73, 69, 85, 77, 45, 80, 73, + 69, 85, 80, 45, 83, 73, 79, 83, 128, 77, 73, 69, 85, 77, 45, 80, 73, 69, + 85, 80, 128, 77, 73, 69, 85, 77, 45, 80, 65, 78, 83, 73, 79, 83, 128, 77, + 73, 69, 85, 77, 45, 78, 73, 69, 85, 78, 128, 77, 73, 69, 85, 77, 45, 67, + 73, 69, 85, 67, 128, 77, 73, 69, 85, 77, 45, 67, 72, 73, 69, 85, 67, 72, + 128, 77, 73, 69, 85, 205, 77, 73, 69, 80, 128, 77, 73, 69, 69, 128, 77, + 73, 69, 128, 77, 73, 68, 76, 73, 78, 197, 77, 73, 68, 68, 76, 69, 45, 87, + 69, 76, 83, 200, 77, 73, 68, 68, 76, 69, 128, 77, 73, 68, 45, 76, 69, 86, + 69, 204, 77, 73, 196, 77, 73, 67, 82, 79, 83, 67, 79, 80, 69, 128, 77, + 73, 67, 82, 79, 80, 72, 79, 78, 69, 128, 77, 73, 67, 82, 79, 66, 69, 128, + 77, 73, 67, 82, 207, 77, 73, 67, 210, 77, 73, 45, 55, 128, 77, 73, 45, + 54, 128, 77, 73, 45, 53, 128, 77, 73, 45, 52, 128, 77, 73, 45, 51, 128, + 77, 73, 45, 50, 128, 77, 73, 45, 49, 128, 77, 72, 90, 128, 77, 72, 65, + 128, 77, 72, 128, 77, 71, 85, 88, 128, 77, 71, 85, 84, 128, 77, 71, 85, + 82, 88, 128, 77, 71, 85, 82, 128, 77, 71, 85, 80, 128, 77, 71, 85, 79, + 88, 128, 77, 71, 85, 79, 80, 128, 77, 71, 85, 79, 128, 77, 71, 85, 128, + 77, 71, 79, 88, 128, 77, 71, 79, 84, 128, 77, 71, 79, 80, 128, 77, 71, + 79, 128, 77, 71, 207, 77, 71, 73, 69, 88, 128, 77, 71, 73, 69, 128, 77, + 71, 69, 88, 128, 77, 71, 69, 80, 128, 77, 71, 69, 128, 77, 71, 66, 85, + 128, 77, 71, 66, 79, 79, 128, 77, 71, 66, 79, 70, 85, 77, 128, 77, 71, + 66, 79, 128, 77, 71, 66, 73, 128, 77, 71, 66, 69, 85, 78, 128, 77, 71, + 66, 69, 78, 128, 77, 71, 66, 69, 69, 128, 77, 71, 66, 69, 128, 77, 71, + 66, 65, 83, 65, 81, 128, 77, 71, 66, 65, 83, 65, 128, 77, 71, 65, 88, + 128, 77, 71, 65, 84, 128, 77, 71, 65, 80, 128, 77, 71, 65, 128, 77, 71, + 128, 77, 70, 79, 78, 128, 77, 70, 79, 206, 77, 70, 79, 128, 77, 70, 73, + 89, 65, 81, 128, 77, 70, 73, 69, 69, 128, 77, 70, 69, 85, 84, 128, 77, + 70, 69, 85, 81, 128, 77, 70, 69, 85, 65, 69, 128, 77, 70, 65, 65, 128, + 77, 69, 90, 90, 79, 128, 77, 69, 88, 128, 77, 69, 85, 212, 77, 69, 85, + 81, 128, 77, 69, 85, 78, 74, 79, 77, 78, 68, 69, 85, 81, 128, 77, 69, 85, + 78, 128, 77, 69, 84, 82, 79, 128, 77, 69, 84, 82, 73, 67, 65, 204, 77, + 69, 84, 82, 73, 65, 128, 77, 69, 84, 82, 69, 84, 69, 211, 77, 69, 84, 79, + 66, 69, 76, 85, 83, 128, 77, 69, 84, 69, 75, 128, 77, 69, 84, 69, 71, + 128, 77, 69, 84, 65, 76, 128, 77, 69, 84, 193, 77, 69, 83, 83, 69, 78, + 73, 65, 206, 77, 69, 83, 83, 65, 71, 69, 128, 77, 69, 83, 83, 65, 71, + 197, 77, 69, 83, 79, 128, 77, 69, 83, 73, 128, 77, 69, 83, 72, 128, 77, + 69, 82, 80, 69, 82, 83, 79, 78, 128, 77, 69, 82, 75, 72, 65, 128, 77, 69, + 82, 75, 72, 193, 77, 69, 82, 73, 68, 73, 65, 78, 83, 128, 77, 69, 82, 73, + 128, 77, 69, 82, 71, 69, 128, 77, 69, 82, 67, 85, 82, 89, 128, 77, 69, + 82, 67, 85, 82, 217, 77, 69, 78, 79, 82, 65, 200, 77, 69, 78, 79, 69, 128, 77, 69, 78, 68, 85, 84, 128, 77, 69, 78, 128, 77, 69, 77, 79, 128, 77, 69, 77, 66, 69, 82, 83, 72, 73, 80, 128, 77, 69, 77, 66, 69, 82, 128, 77, 69, 77, 66, 69, 210, 77, 69, 77, 45, 81, 79, 80, 72, 128, 77, 69, 77, @@ -2313,15 +2348,16 @@ static unsigned char lexicon[] = { 77, 85, 128, 77, 69, 69, 77, 128, 77, 69, 69, 202, 77, 69, 69, 69, 69, 128, 77, 69, 68, 73, 85, 77, 128, 77, 69, 68, 73, 85, 205, 77, 69, 68, 73, 69, 86, 65, 204, 77, 69, 68, 73, 67, 73, 78, 69, 128, 77, 69, 68, 73, - 67, 65, 204, 77, 69, 68, 69, 70, 65, 73, 68, 82, 73, 206, 77, 69, 68, 65, - 76, 128, 77, 69, 65, 84, 128, 77, 69, 65, 212, 77, 69, 65, 83, 85, 82, - 69, 196, 77, 69, 65, 83, 85, 82, 69, 128, 77, 69, 65, 83, 85, 82, 197, - 77, 69, 45, 77, 65, 128, 77, 69, 45, 50, 128, 77, 69, 45, 49, 128, 77, - 68, 85, 206, 77, 196, 77, 67, 72, 213, 77, 67, 72, 65, 206, 77, 195, 77, - 66, 85, 85, 128, 77, 66, 85, 79, 81, 128, 77, 66, 85, 79, 128, 77, 66, - 85, 69, 128, 77, 66, 85, 65, 69, 77, 128, 77, 66, 85, 65, 69, 128, 77, - 66, 79, 79, 128, 77, 66, 79, 128, 77, 66, 73, 84, 128, 77, 66, 73, 212, - 77, 66, 73, 82, 73, 69, 69, 78, 128, 77, 66, 73, 128, 77, 66, 69, 85, 88, + 67, 65, 204, 77, 69, 68, 73, 65, 204, 77, 69, 68, 69, 70, 65, 73, 68, 82, + 73, 206, 77, 69, 68, 65, 76, 128, 77, 69, 67, 72, 65, 78, 73, 67, 65, + 204, 77, 69, 65, 84, 128, 77, 69, 65, 212, 77, 69, 65, 83, 85, 82, 69, + 196, 77, 69, 65, 83, 85, 82, 69, 128, 77, 69, 65, 83, 85, 82, 197, 77, + 69, 45, 77, 65, 128, 77, 69, 45, 50, 128, 77, 69, 45, 49, 128, 77, 68, + 85, 206, 77, 196, 77, 67, 72, 213, 77, 67, 72, 65, 206, 77, 195, 77, 66, + 85, 85, 128, 77, 66, 85, 79, 81, 128, 77, 66, 85, 79, 128, 77, 66, 85, + 69, 128, 77, 66, 85, 65, 69, 77, 128, 77, 66, 85, 65, 69, 128, 77, 66, + 79, 79, 128, 77, 66, 79, 128, 77, 66, 73, 84, 128, 77, 66, 73, 212, 77, + 66, 73, 82, 73, 69, 69, 78, 128, 77, 66, 73, 128, 77, 66, 69, 85, 88, 128, 77, 66, 69, 85, 82, 73, 128, 77, 66, 69, 85, 77, 128, 77, 66, 69, 82, 65, 69, 128, 77, 66, 69, 78, 128, 77, 66, 69, 69, 75, 69, 69, 84, 128, 77, 66, 69, 69, 128, 77, 66, 69, 128, 77, 66, 65, 81, 128, 77, 66, @@ -2338,217 +2374,219 @@ static unsigned char lexicon[] = { 78, 197, 77, 65, 83, 65, 82, 65, 205, 77, 65, 82, 89, 128, 77, 65, 82, 87, 65, 82, 201, 77, 65, 82, 85, 75, 85, 128, 77, 65, 82, 84, 89, 82, 73, 193, 77, 65, 82, 84, 73, 65, 204, 77, 65, 82, 82, 89, 73, 78, 199, 77, - 65, 82, 82, 73, 65, 71, 197, 77, 65, 82, 75, 211, 77, 65, 82, 75, 69, 82, - 128, 77, 65, 82, 75, 45, 52, 128, 77, 65, 82, 75, 45, 51, 128, 77, 65, - 82, 75, 45, 50, 128, 77, 65, 82, 75, 45, 49, 128, 77, 65, 82, 69, 128, - 77, 65, 82, 67, 72, 69, 206, 77, 65, 82, 67, 72, 128, 77, 65, 82, 67, 65, - 84, 79, 45, 83, 84, 65, 67, 67, 65, 84, 79, 128, 77, 65, 82, 67, 65, 84, - 79, 128, 77, 65, 82, 67, 65, 83, 73, 84, 69, 128, 77, 65, 82, 66, 85, 84, - 65, 128, 77, 65, 82, 66, 85, 84, 193, 77, 65, 82, 128, 77, 65, 81, 65, - 70, 128, 77, 65, 81, 128, 77, 65, 80, 76, 197, 77, 65, 80, 73, 81, 128, - 77, 65, 208, 77, 65, 79, 128, 77, 65, 78, 84, 69, 76, 80, 73, 69, 67, - 197, 77, 65, 78, 83, 89, 79, 78, 128, 77, 65, 78, 83, 85, 65, 69, 128, - 77, 65, 78, 78, 65, 218, 77, 65, 78, 78, 65, 128, 77, 65, 78, 73, 67, 72, - 65, 69, 65, 206, 77, 65, 78, 71, 79, 128, 77, 65, 78, 71, 65, 76, 65, 77, - 128, 77, 65, 78, 68, 65, 82, 73, 78, 128, 77, 65, 78, 68, 65, 73, 76, 73, - 78, 199, 77, 65, 78, 68, 65, 73, 195, 77, 65, 78, 67, 72, 213, 77, 65, - 78, 65, 212, 77, 65, 78, 65, 67, 76, 69, 83, 128, 77, 65, 76, 84, 69, 83, - 197, 77, 65, 76, 69, 69, 82, 73, 128, 77, 65, 76, 69, 128, 77, 65, 76, - 197, 77, 65, 76, 65, 75, 79, 206, 77, 65, 75, 83, 85, 82, 65, 128, 77, - 65, 75, 83, 85, 82, 193, 77, 65, 75, 65, 83, 65, 210, 77, 65, 73, 90, 69, - 128, 77, 65, 73, 89, 65, 77, 79, 75, 128, 77, 65, 73, 84, 65, 73, 75, 72, - 85, 128, 77, 65, 73, 82, 85, 128, 77, 65, 73, 77, 85, 65, 78, 128, 77, - 65, 73, 77, 65, 76, 65, 73, 128, 77, 65, 73, 76, 66, 79, 216, 77, 65, 73, - 75, 85, 82, 79, 128, 77, 65, 73, 68, 69, 78, 128, 77, 65, 73, 128, 77, - 65, 72, 74, 79, 78, 199, 77, 65, 72, 72, 65, 128, 77, 65, 72, 65, 80, 82, - 65, 78, 65, 128, 77, 65, 72, 65, 80, 65, 75, 72, 128, 77, 65, 72, 65, 74, - 65, 78, 201, 77, 65, 72, 65, 65, 80, 82, 65, 65, 78, 193, 77, 65, 72, - 128, 77, 65, 71, 78, 73, 70, 89, 73, 78, 199, 77, 65, 71, 78, 69, 84, - 128, 77, 65, 71, 69, 128, 77, 65, 69, 83, 73, 128, 77, 65, 69, 78, 89, - 73, 128, 77, 65, 69, 78, 74, 69, 84, 128, 77, 65, 69, 77, 86, 69, 85, 88, - 128, 77, 65, 69, 77, 75, 80, 69, 78, 128, 77, 65, 69, 77, 71, 66, 73, 69, - 69, 128, 77, 65, 69, 77, 66, 71, 66, 73, 69, 69, 128, 77, 65, 69, 77, 66, - 65, 128, 77, 65, 69, 77, 128, 77, 65, 69, 76, 69, 69, 128, 77, 65, 69, - 75, 69, 85, 80, 128, 77, 65, 68, 89, 65, 128, 77, 65, 68, 85, 128, 77, - 65, 68, 68, 65, 72, 128, 77, 65, 68, 68, 65, 200, 77, 65, 68, 68, 65, - 128, 77, 65, 68, 68, 193, 77, 65, 67, 82, 79, 78, 45, 71, 82, 65, 86, 69, - 128, 77, 65, 67, 82, 79, 78, 45, 66, 82, 69, 86, 69, 128, 77, 65, 67, 82, - 79, 78, 45, 65, 67, 85, 84, 69, 128, 77, 65, 67, 82, 79, 78, 128, 77, 65, - 67, 82, 79, 206, 77, 65, 67, 72, 73, 78, 69, 128, 77, 65, 65, 89, 89, 65, - 65, 128, 77, 65, 65, 73, 128, 77, 65, 65, 128, 77, 65, 50, 128, 77, 65, - 45, 55, 128, 77, 65, 45, 54, 128, 77, 65, 45, 53, 128, 77, 65, 45, 52, - 128, 77, 65, 45, 51, 128, 77, 65, 45, 50, 128, 77, 65, 45, 49, 128, 77, - 49, 57, 183, 77, 49, 57, 182, 77, 49, 57, 181, 77, 49, 57, 180, 77, 49, - 57, 179, 77, 49, 57, 178, 77, 49, 57, 177, 77, 49, 57, 176, 77, 49, 56, - 185, 77, 49, 56, 184, 77, 49, 56, 183, 77, 49, 56, 182, 77, 49, 56, 181, - 77, 49, 56, 180, 77, 49, 56, 179, 77, 49, 56, 178, 77, 49, 56, 177, 77, - 49, 56, 176, 77, 49, 55, 185, 77, 49, 55, 184, 77, 49, 55, 183, 77, 49, - 55, 182, 77, 49, 55, 181, 77, 49, 55, 180, 77, 49, 55, 179, 77, 49, 55, - 178, 77, 49, 55, 177, 77, 49, 55, 176, 77, 49, 54, 185, 77, 49, 54, 184, - 77, 49, 54, 183, 77, 49, 54, 182, 77, 49, 54, 181, 77, 49, 54, 180, 77, - 49, 54, 179, 77, 49, 54, 178, 77, 49, 54, 177, 77, 49, 54, 176, 77, 49, - 53, 185, 77, 49, 53, 184, 77, 49, 53, 183, 77, 49, 53, 182, 77, 49, 53, - 181, 77, 49, 53, 180, 77, 49, 53, 179, 77, 49, 53, 178, 77, 49, 53, 177, - 77, 49, 53, 176, 77, 49, 52, 185, 77, 49, 52, 184, 77, 49, 52, 183, 77, - 49, 52, 182, 77, 49, 52, 181, 77, 49, 52, 180, 77, 49, 52, 179, 77, 49, - 52, 178, 77, 49, 52, 177, 77, 49, 52, 176, 77, 49, 51, 185, 77, 49, 51, - 184, 77, 49, 51, 183, 77, 49, 51, 182, 77, 49, 51, 181, 77, 49, 51, 180, - 77, 49, 51, 179, 77, 49, 51, 178, 77, 49, 51, 177, 77, 49, 51, 176, 77, - 49, 50, 185, 77, 49, 50, 184, 77, 49, 50, 183, 77, 49, 50, 182, 77, 49, - 50, 181, 77, 49, 50, 180, 77, 49, 50, 179, 77, 49, 50, 178, 77, 49, 50, - 177, 77, 49, 50, 176, 77, 49, 49, 185, 77, 49, 49, 184, 77, 49, 49, 183, - 77, 49, 49, 182, 77, 49, 49, 181, 77, 49, 49, 180, 77, 49, 49, 179, 77, - 49, 49, 178, 77, 49, 49, 177, 77, 49, 49, 176, 77, 49, 48, 185, 77, 49, - 48, 184, 77, 49, 48, 183, 77, 49, 48, 182, 77, 49, 48, 181, 77, 49, 48, - 180, 77, 49, 48, 179, 77, 49, 48, 178, 77, 49, 48, 177, 77, 49, 48, 176, - 77, 48, 57, 185, 77, 48, 57, 184, 77, 48, 57, 183, 77, 48, 57, 182, 77, - 48, 57, 181, 77, 48, 57, 180, 77, 48, 57, 179, 77, 48, 57, 178, 77, 48, - 57, 177, 77, 48, 57, 176, 77, 48, 56, 185, 77, 48, 56, 184, 77, 48, 56, - 183, 77, 48, 56, 182, 77, 48, 56, 181, 77, 48, 56, 180, 77, 48, 56, 179, - 77, 48, 56, 178, 77, 48, 56, 177, 77, 48, 56, 176, 77, 48, 55, 185, 77, - 48, 55, 184, 77, 48, 55, 183, 77, 48, 55, 182, 77, 48, 55, 181, 77, 48, - 55, 180, 77, 48, 55, 179, 77, 48, 55, 178, 77, 48, 55, 177, 77, 48, 55, - 176, 77, 48, 54, 185, 77, 48, 54, 184, 77, 48, 54, 183, 77, 48, 54, 182, - 77, 48, 54, 181, 77, 48, 54, 180, 77, 48, 54, 179, 77, 48, 54, 178, 77, - 48, 54, 177, 77, 48, 54, 176, 77, 48, 53, 185, 77, 48, 53, 184, 77, 48, - 53, 183, 77, 48, 53, 182, 77, 48, 53, 181, 77, 48, 53, 180, 77, 48, 53, - 179, 77, 48, 53, 178, 77, 48, 53, 177, 77, 48, 53, 176, 77, 48, 52, 185, - 77, 48, 52, 184, 77, 48, 52, 183, 77, 48, 52, 182, 77, 48, 52, 181, 77, - 48, 52, 52, 128, 77, 48, 52, 180, 77, 48, 52, 51, 128, 77, 48, 52, 179, - 77, 48, 52, 50, 128, 77, 48, 52, 178, 77, 48, 52, 49, 128, 77, 48, 52, - 177, 77, 48, 52, 48, 65, 128, 77, 48, 52, 48, 128, 77, 48, 52, 176, 77, - 48, 51, 57, 128, 77, 48, 51, 185, 77, 48, 51, 56, 128, 77, 48, 51, 184, - 77, 48, 51, 55, 128, 77, 48, 51, 183, 77, 48, 51, 54, 128, 77, 48, 51, - 182, 77, 48, 51, 53, 128, 77, 48, 51, 181, 77, 48, 51, 52, 128, 77, 48, - 51, 180, 77, 48, 51, 51, 66, 128, 77, 48, 51, 51, 65, 128, 77, 48, 51, - 51, 128, 77, 48, 51, 179, 77, 48, 51, 50, 128, 77, 48, 51, 178, 77, 48, - 51, 49, 65, 128, 77, 48, 51, 49, 128, 77, 48, 51, 177, 77, 48, 51, 48, - 128, 77, 48, 51, 176, 77, 48, 50, 57, 128, 77, 48, 50, 185, 77, 48, 50, - 56, 65, 128, 77, 48, 50, 56, 128, 77, 48, 50, 184, 77, 48, 50, 55, 128, - 77, 48, 50, 183, 77, 48, 50, 54, 128, 77, 48, 50, 182, 77, 48, 50, 53, - 128, 77, 48, 50, 181, 77, 48, 50, 52, 65, 128, 77, 48, 50, 52, 128, 77, - 48, 50, 180, 77, 48, 50, 51, 128, 77, 48, 50, 179, 77, 48, 50, 50, 65, - 128, 77, 48, 50, 50, 128, 77, 48, 50, 178, 77, 48, 50, 49, 128, 77, 48, - 50, 177, 77, 48, 50, 48, 128, 77, 48, 50, 176, 77, 48, 49, 57, 128, 77, - 48, 49, 185, 77, 48, 49, 56, 128, 77, 48, 49, 184, 77, 48, 49, 55, 65, - 128, 77, 48, 49, 55, 128, 77, 48, 49, 183, 77, 48, 49, 54, 65, 128, 77, - 48, 49, 54, 128, 77, 48, 49, 182, 77, 48, 49, 53, 65, 128, 77, 48, 49, - 53, 128, 77, 48, 49, 181, 77, 48, 49, 52, 128, 77, 48, 49, 180, 77, 48, - 49, 51, 128, 77, 48, 49, 179, 77, 48, 49, 50, 72, 128, 77, 48, 49, 50, - 71, 128, 77, 48, 49, 50, 70, 128, 77, 48, 49, 50, 69, 128, 77, 48, 49, - 50, 68, 128, 77, 48, 49, 50, 67, 128, 77, 48, 49, 50, 66, 128, 77, 48, - 49, 50, 65, 128, 77, 48, 49, 50, 128, 77, 48, 49, 178, 77, 48, 49, 49, - 128, 77, 48, 49, 177, 77, 48, 49, 48, 65, 128, 77, 48, 49, 48, 128, 77, - 48, 49, 176, 77, 48, 48, 57, 128, 77, 48, 48, 185, 77, 48, 48, 56, 128, - 77, 48, 48, 184, 77, 48, 48, 55, 128, 77, 48, 48, 183, 77, 48, 48, 54, - 128, 77, 48, 48, 182, 77, 48, 48, 53, 128, 77, 48, 48, 181, 77, 48, 48, - 52, 128, 77, 48, 48, 180, 77, 48, 48, 51, 65, 128, 77, 48, 48, 51, 128, - 77, 48, 48, 179, 77, 48, 48, 50, 128, 77, 48, 48, 178, 77, 48, 48, 49, - 66, 128, 77, 48, 48, 49, 65, 128, 77, 48, 48, 49, 128, 77, 48, 48, 177, - 76, 218, 76, 89, 89, 128, 76, 89, 88, 128, 76, 89, 84, 128, 76, 89, 82, - 88, 128, 76, 89, 82, 128, 76, 89, 80, 128, 76, 89, 73, 84, 128, 76, 89, - 73, 78, 199, 76, 89, 68, 73, 65, 206, 76, 89, 67, 73, 65, 206, 76, 88, - 128, 76, 87, 79, 79, 128, 76, 87, 79, 128, 76, 87, 73, 73, 128, 76, 87, - 73, 128, 76, 87, 69, 128, 76, 87, 65, 65, 128, 76, 87, 65, 128, 76, 85, - 88, 128, 76, 85, 85, 128, 76, 85, 84, 128, 76, 85, 82, 88, 128, 76, 85, - 80, 128, 76, 85, 79, 88, 128, 76, 85, 79, 84, 128, 76, 85, 79, 80, 128, - 76, 85, 79, 128, 76, 85, 78, 71, 83, 73, 128, 76, 85, 78, 65, 84, 197, - 76, 85, 205, 76, 85, 76, 128, 76, 85, 73, 83, 128, 76, 85, 72, 85, 82, - 128, 76, 85, 72, 128, 76, 85, 200, 76, 85, 71, 71, 65, 71, 69, 128, 76, - 85, 71, 65, 76, 128, 76, 85, 71, 65, 204, 76, 85, 69, 128, 76, 85, 197, - 76, 85, 66, 128, 76, 85, 65, 69, 80, 128, 76, 85, 51, 128, 76, 85, 50, - 128, 76, 85, 178, 76, 82, 79, 128, 76, 82, 77, 128, 76, 82, 73, 128, 76, - 82, 69, 128, 76, 79, 90, 69, 78, 71, 69, 128, 76, 79, 90, 69, 78, 71, - 197, 76, 79, 88, 128, 76, 79, 87, 69, 82, 69, 196, 76, 79, 87, 69, 210, - 76, 79, 87, 45, 82, 69, 86, 69, 82, 83, 69, 68, 45, 185, 76, 79, 87, 45, - 77, 73, 196, 76, 79, 87, 45, 70, 65, 76, 76, 73, 78, 199, 76, 79, 87, 45, - 185, 76, 79, 86, 197, 76, 79, 85, 82, 69, 128, 76, 79, 85, 68, 83, 80, - 69, 65, 75, 69, 82, 128, 76, 79, 85, 68, 76, 217, 76, 79, 84, 85, 83, - 128, 76, 79, 84, 85, 211, 76, 79, 84, 73, 79, 206, 76, 79, 84, 128, 76, - 79, 83, 83, 76, 69, 83, 83, 128, 76, 79, 82, 82, 89, 128, 76, 79, 82, 82, - 65, 73, 78, 69, 128, 76, 79, 81, 128, 76, 79, 80, 128, 76, 79, 79, 84, - 128, 76, 79, 79, 80, 69, 196, 76, 79, 79, 80, 128, 76, 79, 79, 208, 76, - 79, 79, 78, 128, 76, 79, 79, 203, 76, 79, 79, 128, 76, 79, 78, 83, 85, - 77, 128, 76, 79, 78, 71, 65, 128, 76, 79, 78, 71, 193, 76, 79, 78, 71, - 45, 76, 69, 71, 71, 69, 196, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, - 45, 89, 82, 128, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 83, 79, - 204, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 79, 83, 211, 76, 79, - 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 77, 65, 68, 210, 76, 79, 78, 71, - 45, 66, 82, 65, 78, 67, 72, 45, 72, 65, 71, 65, 76, 204, 76, 79, 78, 71, - 45, 66, 82, 65, 78, 67, 72, 45, 65, 210, 76, 79, 77, 77, 65, 69, 128, 76, - 79, 77, 128, 76, 79, 205, 76, 79, 76, 76, 73, 80, 79, 80, 128, 76, 79, - 76, 76, 128, 76, 79, 71, 210, 76, 79, 71, 79, 84, 89, 80, 197, 76, 79, - 71, 79, 71, 82, 65, 205, 76, 79, 71, 128, 76, 79, 68, 69, 83, 84, 79, 78, - 69, 128, 76, 79, 67, 79, 77, 79, 84, 73, 86, 69, 128, 76, 79, 67, 75, 73, - 78, 71, 45, 83, 72, 73, 70, 212, 76, 79, 67, 203, 76, 79, 67, 65, 84, 73, - 86, 69, 128, 76, 79, 67, 65, 84, 73, 79, 78, 45, 87, 65, 76, 76, 80, 76, - 65, 78, 197, 76, 79, 67, 65, 84, 73, 79, 78, 45, 70, 76, 79, 79, 82, 80, - 76, 65, 78, 197, 76, 79, 67, 65, 84, 73, 79, 206, 76, 79, 66, 83, 84, 69, - 82, 128, 76, 79, 65, 128, 76, 78, 128, 76, 76, 85, 85, 128, 76, 76, 79, - 79, 128, 76, 76, 76, 85, 85, 128, 76, 76, 76, 85, 128, 76, 76, 76, 79, - 79, 128, 76, 76, 76, 79, 128, 76, 76, 76, 73, 73, 128, 76, 76, 76, 73, - 128, 76, 76, 76, 69, 69, 128, 76, 76, 76, 69, 128, 76, 76, 76, 65, 85, - 128, 76, 76, 76, 65, 73, 128, 76, 76, 76, 65, 65, 128, 76, 76, 76, 65, - 128, 76, 76, 76, 128, 76, 76, 65, 77, 65, 128, 76, 74, 85, 68, 73, 74, - 69, 128, 76, 74, 69, 128, 76, 74, 128, 76, 73, 90, 65, 82, 68, 128, 76, - 73, 88, 128, 76, 73, 87, 78, 128, 76, 73, 86, 82, 197, 76, 73, 84, 84, - 76, 69, 128, 76, 73, 84, 84, 76, 197, 76, 73, 84, 84, 69, 210, 76, 73, - 84, 82, 193, 76, 73, 84, 200, 76, 73, 83, 213, 76, 73, 83, 128, 76, 73, - 82, 193, 76, 73, 81, 85, 73, 196, 76, 73, 81, 128, 76, 73, 80, 83, 84, - 73, 67, 75, 128, 76, 73, 80, 211, 76, 73, 208, 76, 73, 78, 75, 73, 78, - 199, 76, 73, 78, 75, 69, 196, 76, 73, 78, 203, 76, 73, 78, 71, 83, 65, - 128, 76, 73, 78, 69, 83, 128, 76, 73, 78, 69, 211, 76, 73, 78, 69, 45, - 57, 128, 76, 73, 78, 69, 45, 55, 128, 76, 73, 78, 69, 45, 51, 128, 76, - 73, 78, 69, 45, 49, 128, 76, 73, 77, 77, 85, 52, 128, 76, 73, 77, 77, 85, - 50, 128, 76, 73, 77, 77, 85, 128, 76, 73, 77, 77, 213, 76, 73, 77, 73, - 84, 69, 196, 76, 73, 77, 73, 84, 65, 84, 73, 79, 78, 128, 76, 73, 77, 73, - 84, 128, 76, 73, 77, 69, 128, 76, 73, 77, 66, 213, 76, 73, 77, 66, 211, - 76, 73, 77, 194, 76, 73, 76, 89, 128, 76, 73, 76, 73, 84, 72, 128, 76, - 73, 76, 128, 76, 73, 71, 72, 84, 78, 73, 78, 71, 128, 76, 73, 71, 72, 84, - 78, 73, 78, 199, 76, 73, 71, 72, 84, 72, 79, 85, 83, 69, 128, 76, 73, 71, - 72, 84, 128, 76, 73, 71, 65, 84, 73, 78, 199, 76, 73, 70, 84, 69, 82, - 128, 76, 73, 70, 69, 128, 76, 73, 69, 88, 128, 76, 73, 69, 84, 128, 76, - 73, 69, 80, 128, 76, 73, 69, 69, 128, 76, 73, 69, 128, 76, 73, 68, 128, - 76, 73, 67, 75, 73, 78, 199, 76, 73, 66, 82, 65, 128, 76, 73, 66, 69, 82, - 84, 89, 128, 76, 73, 65, 66, 73, 76, 73, 84, 217, 76, 72, 73, 73, 128, - 76, 72, 65, 86, 73, 89, 65, 78, 73, 128, 76, 72, 65, 199, 76, 72, 65, 65, - 128, 76, 72, 128, 76, 69, 90, 72, 128, 76, 69, 88, 128, 76, 69, 86, 73, - 84, 65, 84, 73, 78, 71, 128, 76, 69, 85, 77, 128, 76, 69, 85, 65, 69, 80, - 128, 76, 69, 85, 65, 69, 77, 128, 76, 69, 85, 128, 76, 69, 213, 76, 69, - 84, 84, 69, 82, 83, 128, 76, 69, 84, 84, 69, 82, 128, 76, 69, 212, 76, - 69, 83, 83, 69, 210, 76, 69, 83, 83, 45, 84, 72, 65, 78, 128, 76, 69, 83, - 83, 45, 84, 72, 65, 206, 76, 69, 83, 72, 128, 76, 69, 80, 67, 72, 193, - 76, 69, 80, 128, 76, 69, 79, 80, 65, 82, 68, 128, 76, 69, 79, 128, 76, - 69, 78, 84, 73, 67, 85, 76, 65, 210, 76, 69, 78, 73, 83, 128, 76, 69, 78, - 73, 211, 76, 69, 78, 71, 84, 72, 69, 78, 69, 82, 128, 76, 69, 78, 71, 84, - 72, 45, 55, 128, 76, 69, 78, 71, 84, 72, 45, 54, 128, 76, 69, 78, 71, 84, - 72, 45, 53, 128, 76, 69, 78, 71, 84, 72, 45, 52, 128, 76, 69, 78, 71, 84, - 72, 45, 51, 128, 76, 69, 78, 71, 84, 72, 45, 50, 128, 76, 69, 78, 71, 84, - 72, 45, 49, 128, 76, 69, 78, 71, 84, 200, 76, 69, 78, 71, 65, 128, 76, - 69, 78, 71, 193, 76, 69, 77, 79, 78, 128, 76, 69, 77, 79, 73, 128, 76, - 69, 76, 69, 84, 128, 76, 69, 76, 69, 212, 76, 69, 203, 76, 69, 73, 77, - 77, 65, 128, 76, 69, 73, 77, 77, 193, 76, 69, 73, 128, 76, 69, 71, 83, - 128, 76, 69, 71, 73, 79, 78, 128, 76, 69, 71, 69, 84, 79, 211, 76, 69, - 71, 128, 76, 69, 199, 76, 69, 70, 84, 87, 65, 82, 68, 83, 128, 76, 69, - 70, 84, 45, 84, 79, 45, 82, 73, 71, 72, 212, 76, 69, 70, 84, 45, 83, 84, - 69, 205, 76, 69, 70, 84, 45, 83, 73, 68, 197, 76, 69, 70, 84, 45, 83, 72, - 65, 68, 69, 196, 76, 69, 70, 84, 45, 80, 79, 73, 78, 84, 73, 78, 199, 76, - 69, 70, 84, 45, 76, 73, 71, 72, 84, 69, 196, 76, 69, 70, 84, 45, 72, 65, - 78, 68, 69, 196, 76, 69, 70, 84, 45, 72, 65, 78, 196, 76, 69, 70, 84, 45, - 70, 65, 67, 73, 78, 199, 76, 69, 70, 84, 128, 76, 69, 69, 82, 65, 69, 87, - 65, 128, 76, 69, 69, 75, 128, 76, 69, 69, 69, 69, 128, 76, 69, 68, 71, - 69, 82, 128, 76, 69, 65, 84, 72, 69, 82, 128, 76, 69, 65, 70, 217, 76, - 69, 65, 70, 128, 76, 69, 65, 198, 76, 69, 65, 68, 69, 82, 128, 76, 69, - 65, 196, 76, 68, 65, 78, 128, 76, 68, 50, 128, 76, 67, 201, 76, 67, 197, - 76, 65, 90, 217, 76, 65, 89, 65, 78, 78, 65, 128, 76, 65, 88, 128, 76, - 65, 87, 128, 76, 65, 215, 76, 65, 85, 76, 65, 128, 76, 65, 85, 75, 65, - 218, 76, 65, 85, 74, 128, 76, 65, 85, 71, 72, 73, 78, 71, 128, 76, 65, - 84, 73, 78, 65, 84, 197, 76, 65, 84, 73, 75, 128, 76, 65, 84, 69, 82, 65, - 204, 76, 65, 84, 197, 76, 65, 83, 212, 76, 65, 82, 89, 78, 71, 69, 65, - 204, 76, 65, 82, 201, 76, 65, 82, 71, 69, 83, 84, 128, 76, 65, 82, 71, - 69, 210, 76, 65, 82, 71, 69, 128, 76, 65, 82, 71, 197, 76, 65, 81, 128, - 76, 65, 80, 65, 81, 128, 76, 65, 207, 76, 65, 78, 84, 69, 82, 78, 128, - 76, 65, 78, 71, 85, 65, 71, 197, 76, 65, 78, 69, 83, 128, 76, 65, 78, + 65, 82, 82, 73, 65, 71, 197, 77, 65, 82, 82, 65, 84, 65, 78, 128, 77, 65, + 82, 75, 211, 77, 65, 82, 75, 69, 82, 128, 77, 65, 82, 75, 45, 52, 128, + 77, 65, 82, 75, 45, 51, 128, 77, 65, 82, 75, 45, 50, 128, 77, 65, 82, 75, + 45, 49, 128, 77, 65, 82, 69, 128, 77, 65, 82, 67, 72, 69, 206, 77, 65, + 82, 67, 72, 128, 77, 65, 82, 67, 65, 84, 79, 45, 83, 84, 65, 67, 67, 65, + 84, 79, 128, 77, 65, 82, 67, 65, 84, 79, 128, 77, 65, 82, 67, 65, 83, 73, + 84, 69, 128, 77, 65, 82, 66, 85, 84, 65, 128, 77, 65, 82, 66, 85, 84, + 193, 77, 65, 82, 128, 77, 65, 81, 65, 70, 128, 77, 65, 81, 128, 77, 65, + 80, 76, 197, 77, 65, 80, 73, 81, 128, 77, 65, 208, 77, 65, 79, 128, 77, + 65, 78, 85, 65, 204, 77, 65, 78, 84, 69, 76, 80, 73, 69, 67, 197, 77, 65, + 78, 83, 89, 79, 78, 128, 77, 65, 78, 83, 85, 65, 69, 128, 77, 65, 78, 78, + 65, 218, 77, 65, 78, 78, 65, 128, 77, 65, 78, 73, 67, 72, 65, 69, 65, + 206, 77, 65, 78, 71, 79, 128, 77, 65, 78, 71, 65, 76, 65, 77, 128, 77, + 65, 78, 68, 65, 82, 73, 78, 128, 77, 65, 78, 68, 65, 73, 76, 73, 78, 199, + 77, 65, 78, 68, 65, 73, 195, 77, 65, 78, 67, 72, 213, 77, 65, 78, 65, + 212, 77, 65, 78, 65, 67, 76, 69, 83, 128, 77, 65, 76, 84, 69, 83, 197, + 77, 65, 76, 69, 69, 82, 73, 128, 77, 65, 76, 69, 128, 77, 65, 76, 197, + 77, 65, 76, 65, 75, 79, 206, 77, 65, 75, 83, 85, 82, 65, 128, 77, 65, 75, + 83, 85, 82, 193, 77, 65, 75, 65, 83, 65, 210, 77, 65, 73, 90, 69, 128, + 77, 65, 73, 89, 65, 77, 79, 75, 128, 77, 65, 73, 84, 65, 73, 75, 72, 85, + 128, 77, 65, 73, 82, 85, 128, 77, 65, 73, 77, 85, 65, 78, 128, 77, 65, + 73, 77, 65, 76, 65, 73, 128, 77, 65, 73, 76, 66, 79, 216, 77, 65, 73, 75, + 85, 82, 79, 128, 77, 65, 73, 68, 69, 78, 128, 77, 65, 73, 128, 77, 65, + 72, 74, 79, 78, 199, 77, 65, 72, 72, 65, 128, 77, 65, 72, 65, 80, 82, 65, + 78, 65, 128, 77, 65, 72, 65, 80, 65, 75, 72, 128, 77, 65, 72, 65, 74, 65, + 78, 201, 77, 65, 72, 65, 65, 80, 82, 65, 65, 78, 193, 77, 65, 72, 128, + 77, 65, 71, 78, 73, 70, 89, 73, 78, 199, 77, 65, 71, 78, 69, 84, 128, 77, + 65, 71, 69, 128, 77, 65, 69, 83, 73, 128, 77, 65, 69, 78, 89, 73, 128, + 77, 65, 69, 78, 74, 69, 84, 128, 77, 65, 69, 77, 86, 69, 85, 88, 128, 77, + 65, 69, 77, 75, 80, 69, 78, 128, 77, 65, 69, 77, 71, 66, 73, 69, 69, 128, + 77, 65, 69, 77, 66, 71, 66, 73, 69, 69, 128, 77, 65, 69, 77, 66, 65, 128, + 77, 65, 69, 77, 128, 77, 65, 69, 76, 69, 69, 128, 77, 65, 69, 75, 69, 85, + 80, 128, 77, 65, 68, 89, 65, 128, 77, 65, 68, 85, 128, 77, 65, 68, 68, + 65, 72, 128, 77, 65, 68, 68, 65, 200, 77, 65, 68, 68, 65, 128, 77, 65, + 68, 68, 193, 77, 65, 67, 82, 79, 78, 45, 71, 82, 65, 86, 69, 128, 77, 65, + 67, 82, 79, 78, 45, 66, 82, 69, 86, 69, 128, 77, 65, 67, 82, 79, 78, 45, + 65, 67, 85, 84, 69, 128, 77, 65, 67, 82, 79, 78, 128, 77, 65, 67, 82, 79, + 206, 77, 65, 67, 72, 73, 78, 69, 128, 77, 65, 65, 89, 89, 65, 65, 128, + 77, 65, 65, 73, 128, 77, 65, 65, 128, 77, 65, 50, 128, 77, 65, 45, 55, + 128, 77, 65, 45, 54, 128, 77, 65, 45, 53, 128, 77, 65, 45, 52, 128, 77, + 65, 45, 51, 128, 77, 65, 45, 50, 128, 77, 65, 45, 49, 128, 77, 49, 57, + 183, 77, 49, 57, 182, 77, 49, 57, 181, 77, 49, 57, 180, 77, 49, 57, 179, + 77, 49, 57, 178, 77, 49, 57, 177, 77, 49, 57, 176, 77, 49, 56, 185, 77, + 49, 56, 184, 77, 49, 56, 183, 77, 49, 56, 182, 77, 49, 56, 181, 77, 49, + 56, 180, 77, 49, 56, 179, 77, 49, 56, 178, 77, 49, 56, 177, 77, 49, 56, + 176, 77, 49, 55, 185, 77, 49, 55, 184, 77, 49, 55, 183, 77, 49, 55, 182, + 77, 49, 55, 181, 77, 49, 55, 180, 77, 49, 55, 179, 77, 49, 55, 178, 77, + 49, 55, 177, 77, 49, 55, 176, 77, 49, 54, 185, 77, 49, 54, 184, 77, 49, + 54, 183, 77, 49, 54, 182, 77, 49, 54, 181, 77, 49, 54, 180, 77, 49, 54, + 179, 77, 49, 54, 178, 77, 49, 54, 177, 77, 49, 54, 176, 77, 49, 53, 185, + 77, 49, 53, 184, 77, 49, 53, 183, 77, 49, 53, 182, 77, 49, 53, 181, 77, + 49, 53, 180, 77, 49, 53, 179, 77, 49, 53, 178, 77, 49, 53, 177, 77, 49, + 53, 176, 77, 49, 52, 185, 77, 49, 52, 184, 77, 49, 52, 183, 77, 49, 52, + 182, 77, 49, 52, 181, 77, 49, 52, 180, 77, 49, 52, 179, 77, 49, 52, 178, + 77, 49, 52, 177, 77, 49, 52, 176, 77, 49, 51, 185, 77, 49, 51, 184, 77, + 49, 51, 183, 77, 49, 51, 182, 77, 49, 51, 181, 77, 49, 51, 180, 77, 49, + 51, 179, 77, 49, 51, 178, 77, 49, 51, 177, 77, 49, 51, 176, 77, 49, 50, + 185, 77, 49, 50, 184, 77, 49, 50, 183, 77, 49, 50, 182, 77, 49, 50, 181, + 77, 49, 50, 180, 77, 49, 50, 179, 77, 49, 50, 178, 77, 49, 50, 177, 77, + 49, 50, 176, 77, 49, 49, 185, 77, 49, 49, 184, 77, 49, 49, 183, 77, 49, + 49, 182, 77, 49, 49, 181, 77, 49, 49, 180, 77, 49, 49, 179, 77, 49, 49, + 178, 77, 49, 49, 177, 77, 49, 49, 176, 77, 49, 48, 185, 77, 49, 48, 184, + 77, 49, 48, 183, 77, 49, 48, 182, 77, 49, 48, 181, 77, 49, 48, 180, 77, + 49, 48, 179, 77, 49, 48, 178, 77, 49, 48, 177, 77, 49, 48, 176, 77, 48, + 57, 185, 77, 48, 57, 184, 77, 48, 57, 183, 77, 48, 57, 182, 77, 48, 57, + 181, 77, 48, 57, 180, 77, 48, 57, 179, 77, 48, 57, 178, 77, 48, 57, 177, + 77, 48, 57, 176, 77, 48, 56, 185, 77, 48, 56, 184, 77, 48, 56, 183, 77, + 48, 56, 182, 77, 48, 56, 181, 77, 48, 56, 180, 77, 48, 56, 179, 77, 48, + 56, 178, 77, 48, 56, 177, 77, 48, 56, 176, 77, 48, 55, 185, 77, 48, 55, + 184, 77, 48, 55, 183, 77, 48, 55, 182, 77, 48, 55, 181, 77, 48, 55, 180, + 77, 48, 55, 179, 77, 48, 55, 178, 77, 48, 55, 177, 77, 48, 55, 176, 77, + 48, 54, 185, 77, 48, 54, 184, 77, 48, 54, 183, 77, 48, 54, 182, 77, 48, + 54, 181, 77, 48, 54, 180, 77, 48, 54, 179, 77, 48, 54, 178, 77, 48, 54, + 177, 77, 48, 54, 176, 77, 48, 53, 185, 77, 48, 53, 184, 77, 48, 53, 183, + 77, 48, 53, 182, 77, 48, 53, 181, 77, 48, 53, 180, 77, 48, 53, 179, 77, + 48, 53, 178, 77, 48, 53, 177, 77, 48, 53, 176, 77, 48, 52, 185, 77, 48, + 52, 184, 77, 48, 52, 183, 77, 48, 52, 182, 77, 48, 52, 181, 77, 48, 52, + 52, 128, 77, 48, 52, 180, 77, 48, 52, 51, 128, 77, 48, 52, 179, 77, 48, + 52, 50, 128, 77, 48, 52, 178, 77, 48, 52, 49, 128, 77, 48, 52, 177, 77, + 48, 52, 48, 65, 128, 77, 48, 52, 48, 128, 77, 48, 52, 176, 77, 48, 51, + 57, 128, 77, 48, 51, 185, 77, 48, 51, 56, 128, 77, 48, 51, 184, 77, 48, + 51, 55, 128, 77, 48, 51, 183, 77, 48, 51, 54, 128, 77, 48, 51, 182, 77, + 48, 51, 53, 128, 77, 48, 51, 181, 77, 48, 51, 52, 128, 77, 48, 51, 180, + 77, 48, 51, 51, 66, 128, 77, 48, 51, 51, 65, 128, 77, 48, 51, 51, 128, + 77, 48, 51, 179, 77, 48, 51, 50, 128, 77, 48, 51, 178, 77, 48, 51, 49, + 65, 128, 77, 48, 51, 49, 128, 77, 48, 51, 177, 77, 48, 51, 48, 128, 77, + 48, 51, 176, 77, 48, 50, 57, 128, 77, 48, 50, 185, 77, 48, 50, 56, 65, + 128, 77, 48, 50, 56, 128, 77, 48, 50, 184, 77, 48, 50, 55, 128, 77, 48, + 50, 183, 77, 48, 50, 54, 128, 77, 48, 50, 182, 77, 48, 50, 53, 128, 77, + 48, 50, 181, 77, 48, 50, 52, 65, 128, 77, 48, 50, 52, 128, 77, 48, 50, + 180, 77, 48, 50, 51, 128, 77, 48, 50, 179, 77, 48, 50, 50, 65, 128, 77, + 48, 50, 50, 128, 77, 48, 50, 178, 77, 48, 50, 49, 128, 77, 48, 50, 177, + 77, 48, 50, 48, 128, 77, 48, 50, 176, 77, 48, 49, 57, 128, 77, 48, 49, + 185, 77, 48, 49, 56, 128, 77, 48, 49, 184, 77, 48, 49, 55, 65, 128, 77, + 48, 49, 55, 128, 77, 48, 49, 183, 77, 48, 49, 54, 65, 128, 77, 48, 49, + 54, 128, 77, 48, 49, 182, 77, 48, 49, 53, 65, 128, 77, 48, 49, 53, 128, + 77, 48, 49, 181, 77, 48, 49, 52, 128, 77, 48, 49, 180, 77, 48, 49, 51, + 128, 77, 48, 49, 179, 77, 48, 49, 50, 72, 128, 77, 48, 49, 50, 71, 128, + 77, 48, 49, 50, 70, 128, 77, 48, 49, 50, 69, 128, 77, 48, 49, 50, 68, + 128, 77, 48, 49, 50, 67, 128, 77, 48, 49, 50, 66, 128, 77, 48, 49, 50, + 65, 128, 77, 48, 49, 50, 128, 77, 48, 49, 178, 77, 48, 49, 49, 128, 77, + 48, 49, 177, 77, 48, 49, 48, 65, 128, 77, 48, 49, 48, 128, 77, 48, 49, + 176, 77, 48, 48, 57, 128, 77, 48, 48, 185, 77, 48, 48, 56, 128, 77, 48, + 48, 184, 77, 48, 48, 55, 128, 77, 48, 48, 183, 77, 48, 48, 54, 128, 77, + 48, 48, 182, 77, 48, 48, 53, 128, 77, 48, 48, 181, 77, 48, 48, 52, 128, + 77, 48, 48, 180, 77, 48, 48, 51, 65, 128, 77, 48, 48, 51, 128, 77, 48, + 48, 179, 77, 48, 48, 50, 128, 77, 48, 48, 178, 77, 48, 48, 49, 66, 128, + 77, 48, 48, 49, 65, 128, 77, 48, 48, 49, 128, 77, 48, 48, 177, 76, 218, + 76, 89, 89, 128, 76, 89, 88, 128, 76, 89, 84, 128, 76, 89, 82, 88, 128, + 76, 89, 82, 128, 76, 89, 80, 128, 76, 89, 73, 84, 128, 76, 89, 73, 78, + 199, 76, 89, 68, 73, 65, 206, 76, 89, 67, 73, 65, 206, 76, 88, 128, 76, + 87, 79, 79, 128, 76, 87, 79, 128, 76, 87, 73, 73, 128, 76, 87, 73, 128, + 76, 87, 69, 128, 76, 87, 65, 65, 128, 76, 87, 65, 128, 76, 85, 88, 128, + 76, 85, 85, 128, 76, 85, 84, 128, 76, 85, 82, 88, 128, 76, 85, 80, 128, + 76, 85, 79, 88, 128, 76, 85, 79, 84, 128, 76, 85, 79, 80, 128, 76, 85, + 79, 128, 76, 85, 78, 71, 83, 73, 128, 76, 85, 78, 65, 84, 197, 76, 85, + 205, 76, 85, 76, 128, 76, 85, 73, 83, 128, 76, 85, 72, 85, 82, 128, 76, + 85, 72, 128, 76, 85, 200, 76, 85, 71, 71, 65, 71, 69, 128, 76, 85, 71, + 65, 76, 128, 76, 85, 71, 65, 204, 76, 85, 69, 128, 76, 85, 197, 76, 85, + 66, 128, 76, 85, 65, 69, 80, 128, 76, 85, 51, 128, 76, 85, 50, 128, 76, + 85, 178, 76, 82, 79, 128, 76, 82, 77, 128, 76, 82, 73, 128, 76, 82, 69, + 128, 76, 79, 90, 69, 78, 71, 69, 128, 76, 79, 90, 69, 78, 71, 197, 76, + 79, 88, 128, 76, 79, 87, 69, 82, 69, 196, 76, 79, 87, 69, 210, 76, 79, + 87, 45, 82, 69, 86, 69, 82, 83, 69, 68, 45, 185, 76, 79, 87, 45, 77, 73, + 196, 76, 79, 87, 45, 70, 65, 76, 76, 73, 78, 199, 76, 79, 87, 45, 185, + 76, 79, 86, 197, 76, 79, 85, 82, 69, 128, 76, 79, 85, 68, 83, 80, 69, 65, + 75, 69, 82, 128, 76, 79, 85, 68, 76, 217, 76, 79, 84, 85, 83, 128, 76, + 79, 84, 85, 211, 76, 79, 84, 73, 79, 206, 76, 79, 84, 128, 76, 79, 83, + 83, 76, 69, 83, 83, 128, 76, 79, 82, 82, 89, 128, 76, 79, 82, 82, 65, 73, + 78, 69, 128, 76, 79, 81, 128, 76, 79, 80, 128, 76, 79, 79, 84, 128, 76, + 79, 79, 80, 69, 196, 76, 79, 79, 80, 128, 76, 79, 79, 208, 76, 79, 79, + 78, 128, 76, 79, 79, 203, 76, 79, 79, 128, 76, 79, 78, 83, 85, 77, 128, + 76, 79, 78, 71, 65, 128, 76, 79, 78, 71, 193, 76, 79, 78, 71, 45, 76, 69, + 71, 71, 69, 196, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 89, 82, + 128, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 83, 79, 204, 76, 79, + 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 79, 83, 211, 76, 79, 78, 71, 45, + 66, 82, 65, 78, 67, 72, 45, 77, 65, 68, 210, 76, 79, 78, 71, 45, 66, 82, + 65, 78, 67, 72, 45, 72, 65, 71, 65, 76, 204, 76, 79, 78, 71, 45, 66, 82, + 65, 78, 67, 72, 45, 65, 210, 76, 79, 77, 77, 65, 69, 128, 76, 79, 77, + 128, 76, 79, 205, 76, 79, 76, 76, 73, 80, 79, 80, 128, 76, 79, 76, 76, + 128, 76, 79, 71, 210, 76, 79, 71, 79, 84, 89, 80, 197, 76, 79, 71, 79, + 71, 82, 65, 205, 76, 79, 71, 128, 76, 79, 68, 69, 83, 84, 79, 78, 69, + 128, 76, 79, 67, 79, 77, 79, 84, 73, 86, 69, 128, 76, 79, 67, 75, 73, 78, + 71, 45, 83, 72, 73, 70, 212, 76, 79, 67, 203, 76, 79, 67, 65, 84, 73, 86, + 69, 128, 76, 79, 67, 65, 84, 73, 79, 78, 45, 87, 65, 76, 76, 80, 76, 65, + 78, 197, 76, 79, 67, 65, 84, 73, 79, 78, 45, 70, 76, 79, 79, 82, 80, 76, + 65, 78, 197, 76, 79, 67, 65, 84, 73, 79, 78, 128, 76, 79, 67, 65, 84, 73, + 79, 206, 76, 79, 66, 83, 84, 69, 82, 128, 76, 79, 65, 128, 76, 78, 128, + 76, 76, 85, 85, 128, 76, 76, 79, 79, 128, 76, 76, 76, 85, 85, 128, 76, + 76, 76, 85, 128, 76, 76, 76, 79, 79, 128, 76, 76, 76, 79, 128, 76, 76, + 76, 73, 73, 128, 76, 76, 76, 73, 128, 76, 76, 76, 69, 69, 128, 76, 76, + 76, 69, 128, 76, 76, 76, 65, 85, 128, 76, 76, 76, 65, 73, 128, 76, 76, + 76, 65, 65, 128, 76, 76, 76, 65, 128, 76, 76, 76, 128, 76, 76, 72, 65, + 128, 76, 76, 65, 77, 65, 128, 76, 74, 85, 68, 73, 74, 69, 128, 76, 74, + 69, 128, 76, 74, 128, 76, 73, 90, 65, 82, 68, 128, 76, 73, 88, 128, 76, + 73, 87, 78, 128, 76, 73, 86, 82, 197, 76, 73, 84, 84, 76, 69, 128, 76, + 73, 84, 84, 76, 197, 76, 73, 84, 84, 69, 210, 76, 73, 84, 82, 193, 76, + 73, 84, 200, 76, 73, 83, 213, 76, 73, 83, 128, 76, 73, 82, 193, 76, 73, + 81, 85, 73, 196, 76, 73, 81, 128, 76, 73, 80, 83, 84, 73, 67, 75, 128, + 76, 73, 80, 211, 76, 73, 208, 76, 73, 78, 75, 73, 78, 199, 76, 73, 78, + 75, 69, 196, 76, 73, 78, 203, 76, 73, 78, 71, 83, 65, 128, 76, 73, 78, + 69, 83, 128, 76, 73, 78, 69, 211, 76, 73, 78, 69, 45, 57, 128, 76, 73, + 78, 69, 45, 55, 128, 76, 73, 78, 69, 45, 51, 128, 76, 73, 78, 69, 45, 49, + 128, 76, 73, 77, 77, 85, 52, 128, 76, 73, 77, 77, 85, 50, 128, 76, 73, + 77, 77, 85, 128, 76, 73, 77, 77, 213, 76, 73, 77, 73, 84, 69, 196, 76, + 73, 77, 73, 84, 65, 84, 73, 79, 78, 128, 76, 73, 77, 73, 84, 128, 76, 73, + 77, 69, 128, 76, 73, 77, 66, 213, 76, 73, 77, 66, 211, 76, 73, 77, 194, + 76, 73, 76, 89, 128, 76, 73, 76, 73, 84, 72, 128, 76, 73, 76, 128, 76, + 73, 71, 72, 84, 78, 73, 78, 71, 128, 76, 73, 71, 72, 84, 78, 73, 78, 199, + 76, 73, 71, 72, 84, 72, 79, 85, 83, 69, 128, 76, 73, 71, 72, 84, 128, 76, + 73, 71, 65, 84, 73, 78, 199, 76, 73, 70, 84, 69, 82, 128, 76, 73, 70, 69, + 128, 76, 73, 69, 88, 128, 76, 73, 69, 84, 128, 76, 73, 69, 80, 128, 76, + 73, 69, 69, 128, 76, 73, 69, 128, 76, 73, 68, 128, 76, 73, 67, 75, 73, + 78, 199, 76, 73, 66, 82, 65, 128, 76, 73, 66, 69, 82, 84, 89, 128, 76, + 73, 65, 66, 73, 76, 73, 84, 217, 76, 72, 73, 73, 128, 76, 72, 65, 86, 73, + 89, 65, 78, 73, 128, 76, 72, 65, 199, 76, 72, 65, 65, 128, 76, 72, 128, + 76, 69, 90, 72, 128, 76, 69, 88, 128, 76, 69, 86, 73, 84, 65, 84, 73, 78, + 71, 128, 76, 69, 85, 77, 128, 76, 69, 85, 65, 69, 80, 128, 76, 69, 85, + 65, 69, 77, 128, 76, 69, 85, 128, 76, 69, 213, 76, 69, 84, 84, 69, 82, + 83, 128, 76, 69, 84, 84, 69, 82, 128, 76, 69, 212, 76, 69, 83, 83, 69, + 210, 76, 69, 83, 83, 45, 84, 72, 65, 78, 128, 76, 69, 83, 83, 45, 84, 72, + 65, 206, 76, 69, 83, 72, 128, 76, 69, 80, 67, 72, 193, 76, 69, 80, 128, + 76, 69, 79, 80, 65, 82, 68, 128, 76, 69, 79, 128, 76, 69, 78, 84, 73, 67, + 85, 76, 65, 210, 76, 69, 78, 73, 83, 128, 76, 69, 78, 73, 211, 76, 69, + 78, 71, 84, 72, 69, 78, 69, 82, 128, 76, 69, 78, 71, 84, 72, 45, 55, 128, + 76, 69, 78, 71, 84, 72, 45, 54, 128, 76, 69, 78, 71, 84, 72, 45, 53, 128, + 76, 69, 78, 71, 84, 72, 45, 52, 128, 76, 69, 78, 71, 84, 72, 45, 51, 128, + 76, 69, 78, 71, 84, 72, 45, 50, 128, 76, 69, 78, 71, 84, 72, 45, 49, 128, + 76, 69, 78, 71, 84, 200, 76, 69, 78, 71, 65, 128, 76, 69, 78, 71, 193, + 76, 69, 77, 79, 78, 128, 76, 69, 77, 79, 73, 128, 76, 69, 76, 69, 84, + 128, 76, 69, 76, 69, 212, 76, 69, 203, 76, 69, 73, 77, 77, 65, 128, 76, + 69, 73, 77, 77, 193, 76, 69, 73, 128, 76, 69, 71, 83, 128, 76, 69, 71, + 73, 79, 78, 128, 76, 69, 71, 69, 84, 79, 211, 76, 69, 71, 128, 76, 69, + 199, 76, 69, 70, 84, 87, 65, 82, 68, 83, 128, 76, 69, 70, 84, 45, 84, 79, + 45, 82, 73, 71, 72, 212, 76, 69, 70, 84, 45, 83, 84, 69, 205, 76, 69, 70, + 84, 45, 83, 73, 68, 197, 76, 69, 70, 84, 45, 83, 72, 65, 68, 69, 196, 76, + 69, 70, 84, 45, 80, 79, 73, 78, 84, 73, 78, 199, 76, 69, 70, 84, 45, 76, + 73, 71, 72, 84, 69, 196, 76, 69, 70, 84, 45, 72, 65, 78, 68, 69, 196, 76, + 69, 70, 84, 45, 72, 65, 78, 196, 76, 69, 70, 84, 45, 70, 65, 67, 73, 78, + 199, 76, 69, 70, 84, 128, 76, 69, 69, 82, 65, 69, 87, 65, 128, 76, 69, + 69, 75, 128, 76, 69, 69, 69, 69, 128, 76, 69, 68, 71, 69, 82, 128, 76, + 69, 65, 84, 72, 69, 82, 128, 76, 69, 65, 70, 217, 76, 69, 65, 70, 128, + 76, 69, 65, 198, 76, 69, 65, 68, 69, 82, 128, 76, 69, 65, 196, 76, 68, + 65, 78, 128, 76, 68, 50, 128, 76, 67, 201, 76, 67, 197, 76, 65, 90, 217, + 76, 65, 89, 65, 78, 78, 65, 128, 76, 65, 88, 128, 76, 65, 87, 128, 76, + 65, 215, 76, 65, 85, 76, 65, 128, 76, 65, 85, 75, 65, 218, 76, 65, 85, + 74, 128, 76, 65, 85, 71, 72, 73, 78, 71, 128, 76, 65, 84, 73, 78, 65, 84, + 197, 76, 65, 84, 73, 75, 128, 76, 65, 84, 69, 82, 65, 204, 76, 65, 84, + 197, 76, 65, 83, 212, 76, 65, 82, 89, 78, 71, 69, 65, 204, 76, 65, 82, + 201, 76, 65, 82, 71, 69, 83, 84, 128, 76, 65, 82, 71, 69, 210, 76, 65, + 82, 71, 69, 128, 76, 65, 82, 71, 197, 76, 65, 81, 128, 76, 65, 80, 65, + 81, 128, 76, 65, 207, 76, 65, 78, 84, 69, 82, 78, 128, 76, 65, 78, 71, + 85, 65, 71, 197, 76, 65, 78, 69, 83, 128, 76, 65, 78, 196, 76, 65, 78, 128, 76, 65, 77, 80, 128, 76, 65, 77, 69, 68, 72, 128, 76, 65, 77, 69, 68, 128, 76, 65, 77, 69, 196, 76, 65, 77, 69, 128, 76, 65, 77, 197, 76, 65, 77, 68, 65, 128, 76, 65, 77, 68, 128, 76, 65, 77, 66, 68, 193, 76, @@ -2599,1429 +2637,1436 @@ static unsigned char lexicon[] = { 75, 87, 79, 128, 75, 87, 77, 128, 75, 87, 73, 73, 128, 75, 87, 73, 128, 75, 87, 69, 69, 128, 75, 87, 69, 128, 75, 87, 66, 128, 75, 87, 65, 89, 128, 75, 87, 65, 69, 84, 128, 75, 87, 65, 65, 128, 75, 86, 65, 128, 75, - 86, 128, 75, 85, 88, 128, 75, 85, 86, 128, 75, 85, 85, 72, 128, 75, 85, - 84, 128, 75, 85, 83, 77, 65, 128, 75, 85, 83, 72, 85, 50, 128, 75, 85, - 83, 72, 85, 178, 75, 85, 82, 88, 128, 75, 85, 82, 85, 90, 69, 73, 82, 79, - 128, 75, 85, 82, 84, 128, 75, 85, 82, 79, 79, 78, 69, 128, 75, 85, 82, - 128, 75, 85, 210, 75, 85, 81, 128, 75, 85, 79, 88, 128, 75, 85, 79, 80, - 128, 75, 85, 79, 208, 75, 85, 79, 77, 128, 75, 85, 79, 128, 75, 85, 78, - 71, 128, 75, 85, 78, 68, 68, 65, 76, 73, 89, 65, 128, 75, 85, 76, 128, - 75, 85, 204, 75, 85, 71, 128, 75, 85, 69, 84, 128, 75, 85, 66, 128, 75, - 85, 65, 86, 128, 75, 85, 65, 66, 128, 75, 85, 65, 128, 75, 85, 55, 128, - 75, 85, 52, 128, 75, 85, 180, 75, 85, 51, 128, 75, 85, 179, 75, 85, 45, - 55, 128, 75, 85, 45, 54, 128, 75, 85, 45, 53, 128, 75, 85, 45, 52, 128, - 75, 85, 45, 51, 128, 75, 85, 45, 50, 128, 75, 85, 45, 49, 128, 75, 84, - 128, 75, 83, 83, 85, 85, 128, 75, 83, 83, 85, 128, 75, 83, 83, 79, 79, - 128, 75, 83, 83, 79, 128, 75, 83, 83, 73, 73, 128, 75, 83, 83, 73, 128, - 75, 83, 83, 69, 69, 128, 75, 83, 83, 69, 128, 75, 83, 83, 65, 85, 128, - 75, 83, 83, 65, 73, 128, 75, 83, 83, 65, 65, 128, 75, 83, 83, 65, 128, - 75, 83, 83, 128, 75, 83, 73, 128, 75, 82, 79, 78, 79, 83, 128, 75, 82, - 69, 77, 65, 83, 84, 73, 128, 75, 82, 65, 84, 73, 77, 79, 89, 80, 79, 82, - 82, 79, 79, 78, 128, 75, 82, 65, 84, 73, 77, 79, 75, 79, 85, 70, 73, 83, - 77, 65, 128, 75, 82, 65, 84, 73, 77, 65, 84, 65, 128, 75, 82, 65, 84, 73, - 77, 193, 75, 80, 85, 128, 75, 80, 79, 81, 128, 75, 80, 79, 79, 128, 75, - 80, 79, 128, 75, 80, 73, 128, 75, 80, 69, 85, 88, 128, 75, 80, 69, 69, - 128, 75, 80, 69, 128, 75, 80, 65, 82, 65, 81, 128, 75, 80, 65, 78, 128, - 75, 80, 65, 72, 128, 75, 80, 65, 128, 75, 80, 128, 75, 79, 88, 128, 75, - 79, 86, 85, 85, 128, 75, 79, 86, 128, 75, 79, 84, 79, 128, 75, 79, 82, - 85, 78, 65, 128, 75, 79, 82, 79, 78, 73, 83, 128, 75, 79, 82, 69, 65, - 206, 75, 79, 82, 65, 78, 73, 195, 75, 79, 81, 78, 68, 79, 78, 128, 75, - 79, 80, 80, 65, 128, 75, 79, 80, 128, 75, 79, 79, 86, 128, 75, 79, 79, - 80, 79, 128, 75, 79, 79, 77, 85, 85, 84, 128, 75, 79, 79, 66, 128, 75, - 79, 79, 128, 75, 79, 78, 84, 69, 86, 77, 65, 128, 75, 79, 78, 84, 69, 86, - 77, 193, 75, 79, 77, 201, 75, 79, 77, 66, 85, 86, 65, 128, 75, 79, 77, - 66, 85, 86, 193, 75, 79, 77, 66, 213, 75, 79, 75, 79, 128, 75, 79, 75, - 69, 128, 75, 79, 75, 128, 75, 79, 203, 75, 79, 73, 128, 75, 79, 201, 75, - 79, 72, 128, 75, 79, 71, 72, 79, 77, 128, 75, 79, 69, 84, 128, 75, 79, - 66, 128, 75, 79, 65, 76, 65, 128, 75, 79, 65, 128, 75, 79, 45, 75, 73, - 128, 75, 79, 45, 51, 128, 75, 79, 45, 50, 128, 75, 79, 45, 49, 128, 75, - 78, 85, 67, 75, 76, 69, 83, 128, 75, 78, 85, 67, 75, 76, 69, 128, 75, 78, - 79, 66, 83, 128, 75, 78, 73, 71, 72, 84, 128, 75, 78, 73, 71, 72, 212, - 75, 78, 73, 70, 69, 128, 75, 78, 73, 70, 197, 75, 77, 128, 75, 205, 75, - 76, 73, 84, 79, 78, 128, 75, 76, 65, 83, 77, 65, 128, 75, 76, 65, 83, 77, - 193, 75, 76, 65, 128, 75, 76, 128, 75, 75, 85, 128, 75, 75, 79, 128, 75, - 75, 73, 128, 75, 75, 69, 69, 128, 75, 75, 69, 128, 75, 75, 65, 128, 75, - 75, 128, 75, 74, 69, 128, 75, 73, 89, 69, 79, 75, 45, 84, 73, 75, 69, 85, - 84, 128, 75, 73, 89, 69, 79, 75, 45, 83, 73, 79, 83, 45, 75, 73, 89, 69, - 79, 75, 128, 75, 73, 89, 69, 79, 75, 45, 82, 73, 69, 85, 76, 128, 75, 73, - 89, 69, 79, 75, 45, 80, 73, 69, 85, 80, 128, 75, 73, 89, 69, 79, 75, 45, - 78, 73, 69, 85, 78, 128, 75, 73, 89, 69, 79, 75, 45, 75, 72, 73, 69, 85, - 75, 72, 128, 75, 73, 89, 69, 79, 75, 45, 67, 72, 73, 69, 85, 67, 72, 128, - 75, 73, 89, 69, 79, 203, 75, 73, 88, 128, 75, 73, 87, 73, 70, 82, 85, 73, - 84, 128, 75, 73, 87, 128, 75, 73, 86, 128, 75, 73, 84, 128, 75, 73, 83, - 83, 73, 78, 199, 75, 73, 83, 83, 128, 75, 73, 83, 211, 75, 73, 83, 73, - 77, 53, 128, 75, 73, 83, 73, 77, 181, 75, 73, 83, 72, 128, 75, 73, 83, - 65, 76, 128, 75, 73, 82, 79, 87, 65, 84, 84, 79, 128, 75, 73, 82, 79, 77, - 69, 69, 84, 79, 82, 85, 128, 75, 73, 82, 79, 71, 85, 82, 65, 77, 85, 128, - 75, 73, 82, 79, 128, 75, 73, 82, 71, 72, 73, 218, 75, 73, 81, 128, 75, - 73, 80, 128, 75, 73, 208, 75, 73, 78, 83, 72, 73, 80, 128, 75, 73, 78, - 78, 193, 75, 73, 78, 68, 69, 82, 71, 65, 82, 84, 69, 78, 128, 75, 73, 77, - 79, 78, 79, 128, 75, 73, 76, 76, 69, 82, 128, 75, 73, 73, 128, 75, 73, - 72, 128, 75, 73, 69, 88, 128, 75, 73, 69, 86, 65, 206, 75, 73, 69, 80, - 128, 75, 73, 69, 69, 77, 128, 75, 73, 69, 128, 75, 73, 68, 128, 75, 73, - 196, 75, 73, 67, 75, 128, 75, 73, 66, 128, 75, 73, 65, 86, 128, 75, 73, - 65, 66, 128, 75, 73, 45, 56, 128, 75, 73, 45, 55, 128, 75, 73, 45, 54, - 128, 75, 73, 45, 53, 128, 75, 73, 45, 52, 128, 75, 73, 45, 51, 128, 75, - 73, 45, 50, 128, 75, 73, 45, 49, 128, 75, 72, 90, 128, 75, 72, 87, 65, - 73, 128, 75, 72, 85, 69, 78, 45, 76, 85, 197, 75, 72, 85, 69, 206, 75, - 72, 85, 68, 65, 87, 65, 68, 201, 75, 72, 85, 68, 65, 77, 128, 75, 72, 85, - 65, 84, 128, 75, 72, 79, 85, 128, 75, 72, 79, 212, 75, 72, 79, 78, 78, - 65, 128, 75, 72, 79, 78, 128, 75, 72, 79, 77, 85, 84, 128, 75, 72, 79, - 74, 75, 201, 75, 72, 79, 128, 75, 72, 207, 75, 72, 77, 213, 75, 72, 73, - 84, 128, 75, 72, 73, 78, 89, 65, 128, 75, 72, 73, 69, 85, 75, 200, 75, - 72, 73, 128, 75, 72, 201, 75, 72, 72, 79, 128, 75, 72, 72, 65, 128, 75, - 72, 69, 84, 72, 128, 75, 72, 69, 73, 128, 75, 72, 69, 69, 128, 75, 72, - 69, 128, 75, 72, 65, 86, 128, 75, 72, 65, 82, 79, 83, 72, 84, 72, 201, - 75, 72, 65, 82, 128, 75, 72, 65, 80, 72, 128, 75, 72, 65, 78, 199, 75, - 72, 65, 78, 68, 193, 75, 72, 65, 77, 84, 201, 75, 72, 65, 75, 65, 83, 83, - 73, 65, 206, 75, 72, 65, 73, 128, 75, 72, 65, 72, 128, 75, 72, 65, 200, - 75, 72, 65, 66, 128, 75, 72, 65, 65, 128, 75, 71, 128, 75, 69, 89, 67, - 65, 80, 128, 75, 69, 89, 67, 65, 208, 75, 69, 89, 66, 79, 65, 82, 68, - 128, 75, 69, 89, 66, 79, 65, 82, 196, 75, 69, 88, 128, 75, 69, 86, 128, - 75, 69, 85, 89, 69, 85, 88, 128, 75, 69, 85, 83, 72, 69, 85, 65, 69, 80, - 128, 75, 69, 85, 83, 69, 85, 88, 128, 75, 69, 85, 80, 85, 81, 128, 75, - 69, 85, 79, 212, 75, 69, 85, 77, 128, 75, 69, 85, 75, 69, 85, 84, 78, 68, - 65, 128, 75, 69, 85, 75, 65, 81, 128, 75, 69, 85, 65, 69, 84, 77, 69, 85, - 78, 128, 75, 69, 85, 65, 69, 82, 73, 128, 75, 69, 84, 84, 201, 75, 69, - 83, 72, 50, 128, 75, 69, 82, 69, 84, 128, 75, 69, 79, 87, 128, 75, 69, - 78, 84, 73, 77, 65, 84, 65, 128, 75, 69, 78, 84, 73, 77, 65, 84, 193, 75, - 69, 78, 84, 73, 77, 193, 75, 69, 78, 65, 84, 128, 75, 69, 78, 128, 75, - 69, 206, 75, 69, 77, 80, 85, 76, 128, 75, 69, 77, 80, 85, 204, 75, 69, - 77, 80, 76, 73, 128, 75, 69, 77, 80, 76, 201, 75, 69, 77, 80, 72, 82, 69, - 78, 71, 128, 75, 69, 77, 66, 65, 78, 71, 128, 75, 69, 76, 86, 73, 206, - 75, 69, 72, 69, 72, 128, 75, 69, 72, 69, 200, 75, 69, 72, 128, 75, 69, - 70, 85, 76, 65, 128, 75, 69, 69, 86, 128, 75, 69, 69, 83, 85, 128, 75, - 69, 69, 80, 73, 78, 199, 75, 69, 69, 78, 71, 128, 75, 69, 69, 66, 128, - 75, 69, 66, 128, 75, 69, 65, 65, 69, 128, 75, 67, 65, 76, 128, 75, 66, - 128, 75, 65, 90, 65, 75, 200, 75, 65, 89, 65, 78, 78, 65, 128, 75, 65, - 89, 65, 200, 75, 65, 88, 128, 75, 65, 87, 86, 128, 75, 65, 87, 73, 128, - 75, 65, 87, 66, 128, 75, 65, 86, 89, 75, 65, 128, 75, 65, 86, 89, 75, - 193, 75, 65, 86, 128, 75, 65, 85, 86, 128, 75, 65, 85, 78, 65, 128, 75, - 65, 85, 206, 75, 65, 85, 66, 128, 75, 65, 84, 79, 128, 75, 65, 84, 72, - 73, 83, 84, 73, 128, 75, 65, 84, 72, 65, 75, 193, 75, 65, 84, 65, 86, 65, - 83, 77, 65, 128, 75, 65, 84, 65, 86, 193, 75, 65, 84, 65, 75, 65, 78, 65, - 45, 72, 73, 82, 65, 71, 65, 78, 193, 75, 65, 83, 82, 65, 84, 65, 78, 128, - 75, 65, 83, 82, 65, 84, 65, 206, 75, 65, 83, 82, 65, 128, 75, 65, 83, 82, - 193, 75, 65, 83, 75, 65, 76, 128, 75, 65, 83, 75, 65, 204, 75, 65, 83, - 72, 77, 73, 82, 201, 75, 65, 82, 83, 72, 65, 78, 65, 128, 75, 65, 82, 79, - 82, 73, 73, 128, 75, 65, 82, 79, 82, 65, 78, 128, 75, 65, 82, 79, 82, - 128, 75, 65, 82, 207, 75, 65, 82, 69, 206, 75, 65, 82, 65, 84, 84, 79, - 128, 75, 65, 82, 65, 78, 128, 75, 65, 80, 89, 69, 79, 85, 78, 83, 83, 65, - 78, 71, 80, 73, 69, 85, 80, 128, 75, 65, 80, 89, 69, 79, 85, 78, 82, 73, - 69, 85, 76, 128, 75, 65, 80, 89, 69, 79, 85, 78, 80, 72, 73, 69, 85, 80, - 72, 128, 75, 65, 80, 89, 69, 79, 85, 78, 77, 73, 69, 85, 77, 128, 75, 65, - 80, 80, 65, 128, 75, 65, 80, 80, 193, 75, 65, 80, 79, 128, 75, 65, 80, - 72, 128, 75, 65, 80, 65, 76, 128, 75, 65, 80, 65, 128, 75, 65, 208, 75, - 65, 78, 84, 65, 74, 193, 75, 65, 78, 78, 65, 68, 193, 75, 65, 78, 71, 65, - 82, 79, 79, 128, 75, 65, 78, 71, 128, 75, 65, 78, 199, 75, 65, 78, 65, - 75, 79, 128, 75, 65, 77, 52, 128, 75, 65, 77, 50, 128, 75, 65, 77, 128, - 75, 65, 75, 79, 128, 75, 65, 75, 65, 66, 65, 84, 128, 75, 65, 75, 128, - 75, 65, 203, 75, 65, 73, 86, 128, 75, 65, 73, 84, 72, 201, 75, 65, 73, - 82, 73, 128, 75, 65, 73, 66, 128, 75, 65, 73, 128, 75, 65, 201, 75, 65, - 70, 65, 128, 75, 65, 70, 128, 75, 65, 198, 75, 65, 68, 53, 128, 75, 65, - 68, 181, 75, 65, 68, 52, 128, 75, 65, 68, 51, 128, 75, 65, 68, 179, 75, - 65, 68, 50, 128, 75, 65, 68, 128, 75, 65, 66, 193, 75, 65, 66, 128, 75, - 65, 65, 86, 128, 75, 65, 65, 73, 128, 75, 65, 65, 70, 85, 128, 75, 65, - 65, 70, 128, 75, 65, 65, 66, 65, 128, 75, 65, 65, 66, 128, 75, 65, 50, - 128, 75, 65, 178, 75, 65, 45, 75, 69, 128, 75, 65, 45, 57, 128, 75, 65, - 45, 56, 128, 75, 65, 45, 55, 128, 75, 65, 45, 54, 128, 75, 65, 45, 53, - 128, 75, 65, 45, 52, 128, 75, 65, 45, 51, 128, 75, 65, 45, 50, 128, 75, - 65, 45, 49, 49, 128, 75, 65, 45, 49, 48, 128, 75, 65, 45, 49, 128, 75, - 48, 48, 56, 128, 75, 48, 48, 55, 128, 75, 48, 48, 54, 128, 75, 48, 48, - 53, 128, 75, 48, 48, 52, 128, 75, 48, 48, 51, 128, 75, 48, 48, 50, 128, - 75, 48, 48, 49, 128, 74, 87, 65, 128, 74, 85, 85, 128, 74, 85, 84, 128, - 74, 85, 83, 84, 73, 70, 73, 67, 65, 84, 73, 79, 78, 128, 74, 85, 80, 73, - 84, 69, 82, 128, 74, 85, 79, 84, 128, 74, 85, 79, 80, 128, 74, 85, 78, - 79, 128, 74, 85, 78, 71, 83, 69, 79, 78, 199, 74, 85, 78, 69, 128, 74, - 85, 76, 89, 128, 74, 85, 71, 71, 76, 73, 78, 71, 128, 74, 85, 69, 85, 73, - 128, 74, 85, 68, 85, 76, 128, 74, 85, 68, 71, 69, 128, 74, 85, 68, 69, - 79, 45, 83, 80, 65, 78, 73, 83, 200, 74, 79, 89, 83, 84, 73, 67, 75, 128, - 74, 79, 89, 79, 85, 211, 74, 79, 89, 128, 74, 79, 86, 69, 128, 74, 79, - 212, 74, 79, 78, 71, 128, 74, 79, 78, 193, 74, 79, 75, 69, 82, 128, 74, - 79, 73, 78, 84, 83, 128, 74, 79, 73, 78, 69, 68, 128, 74, 79, 73, 78, - 128, 74, 79, 65, 128, 74, 78, 89, 65, 128, 74, 74, 89, 88, 128, 74, 74, - 89, 84, 128, 74, 74, 89, 80, 128, 74, 74, 89, 128, 74, 74, 85, 88, 128, - 74, 74, 85, 84, 128, 74, 74, 85, 82, 88, 128, 74, 74, 85, 82, 128, 74, - 74, 85, 80, 128, 74, 74, 85, 79, 88, 128, 74, 74, 85, 79, 80, 128, 74, - 74, 85, 79, 128, 74, 74, 85, 128, 74, 74, 79, 88, 128, 74, 74, 79, 84, - 128, 74, 74, 79, 80, 128, 74, 74, 79, 128, 74, 74, 73, 88, 128, 74, 74, - 73, 84, 128, 74, 74, 73, 80, 128, 74, 74, 73, 69, 88, 128, 74, 74, 73, - 69, 84, 128, 74, 74, 73, 69, 80, 128, 74, 74, 73, 69, 128, 74, 74, 73, - 128, 74, 74, 69, 69, 128, 74, 74, 69, 128, 74, 74, 65, 128, 74, 73, 76, - 128, 74, 73, 73, 77, 128, 74, 73, 73, 128, 74, 73, 72, 86, 65, 77, 85, - 76, 73, 89, 65, 128, 74, 73, 71, 83, 65, 215, 74, 73, 65, 128, 74, 72, - 79, 88, 128, 74, 72, 79, 128, 74, 72, 69, 72, 128, 74, 72, 65, 89, 73, - 78, 128, 74, 72, 65, 78, 128, 74, 72, 65, 77, 128, 74, 72, 65, 65, 128, - 74, 72, 65, 128, 74, 69, 85, 128, 74, 69, 82, 85, 83, 65, 76, 69, 77, - 128, 74, 69, 82, 65, 206, 74, 69, 82, 65, 128, 74, 69, 82, 128, 74, 69, - 72, 128, 74, 69, 200, 74, 69, 71, 79, 71, 65, 78, 128, 74, 69, 69, 77, - 128, 74, 69, 69, 205, 74, 69, 65, 78, 83, 128, 74, 65, 89, 78, 128, 74, - 65, 89, 73, 78, 128, 74, 65, 89, 65, 78, 78, 65, 128, 74, 65, 87, 128, - 74, 65, 86, 73, 89, 65, 78, 73, 128, 74, 65, 86, 65, 78, 69, 83, 197, 74, - 65, 85, 128, 74, 65, 82, 128, 74, 65, 80, 65, 78, 69, 83, 197, 74, 65, - 80, 65, 78, 128, 74, 65, 78, 85, 65, 82, 89, 128, 74, 65, 76, 76, 65, 74, - 65, 76, 65, 76, 79, 85, 72, 79, 85, 128, 74, 65, 73, 206, 74, 65, 73, - 128, 74, 65, 72, 128, 74, 65, 68, 69, 128, 74, 65, 67, 75, 83, 128, 74, - 65, 67, 75, 45, 79, 45, 76, 65, 78, 84, 69, 82, 78, 128, 74, 65, 67, 203, - 74, 45, 83, 73, 77, 80, 76, 73, 70, 73, 69, 196, 73, 90, 72, 73, 84, 83, - 65, 128, 73, 90, 72, 73, 84, 83, 193, 73, 90, 72, 69, 128, 73, 90, 65, - 75, 65, 89, 193, 73, 89, 69, 75, 128, 73, 89, 65, 78, 78, 65, 128, 73, - 85, 74, 65, 128, 73, 84, 211, 73, 84, 69, 82, 65, 84, 73, 79, 206, 73, - 84, 69, 77, 128, 73, 83, 83, 72, 65, 82, 128, 73, 83, 79, 83, 67, 69, 76, - 69, 211, 73, 83, 79, 78, 128, 73, 83, 79, 206, 73, 83, 79, 76, 65, 84, - 69, 128, 73, 83, 76, 65, 78, 68, 128, 73, 83, 69, 78, 45, 73, 83, 69, 78, - 128, 73, 83, 65, 75, 73, 193, 73, 83, 45, 80, 73, 76, 76, 65, 128, 73, - 82, 85, 89, 65, 78, 78, 65, 128, 73, 82, 85, 85, 89, 65, 78, 78, 65, 128, - 73, 82, 79, 78, 45, 67, 79, 80, 80, 69, 210, 73, 82, 79, 78, 128, 73, 82, - 66, 128, 73, 79, 84, 73, 70, 73, 69, 196, 73, 79, 84, 65, 84, 69, 196, - 73, 79, 84, 65, 128, 73, 79, 84, 193, 73, 79, 82, 128, 73, 79, 68, 72, - 65, 68, 72, 128, 73, 78, 86, 73, 83, 73, 66, 76, 197, 73, 78, 86, 69, 82, - 84, 69, 68, 128, 73, 78, 86, 69, 82, 84, 69, 196, 73, 78, 86, 69, 82, 83, - 197, 73, 78, 84, 82, 79, 68, 85, 67, 69, 82, 128, 73, 78, 84, 73, 128, - 73, 78, 84, 69, 82, 83, 89, 76, 76, 65, 66, 73, 195, 73, 78, 84, 69, 82, - 83, 69, 67, 84, 73, 79, 78, 128, 73, 78, 84, 69, 82, 83, 69, 67, 84, 73, - 79, 206, 73, 78, 84, 69, 82, 83, 69, 67, 84, 73, 78, 199, 73, 78, 84, 69, - 82, 82, 79, 66, 65, 78, 71, 128, 73, 78, 84, 69, 82, 82, 79, 66, 65, 78, - 199, 73, 78, 84, 69, 82, 80, 79, 76, 65, 84, 73, 79, 206, 73, 78, 84, 69, - 82, 76, 79, 67, 75, 69, 196, 73, 78, 84, 69, 82, 76, 73, 78, 69, 65, 210, - 73, 78, 84, 69, 82, 76, 65, 67, 69, 196, 73, 78, 84, 69, 82, 73, 79, 210, - 73, 78, 84, 69, 82, 69, 83, 212, 73, 78, 84, 69, 82, 67, 65, 76, 65, 84, - 69, 128, 73, 78, 84, 69, 71, 82, 65, 84, 73, 79, 78, 128, 73, 78, 84, 69, - 71, 82, 65, 84, 73, 79, 206, 73, 78, 84, 69, 71, 82, 65, 76, 128, 73, 78, - 84, 69, 71, 82, 65, 204, 73, 78, 83, 85, 76, 65, 210, 73, 78, 83, 84, 82, - 85, 77, 69, 78, 84, 65, 204, 73, 78, 83, 73, 68, 69, 128, 73, 78, 83, 73, - 68, 197, 73, 78, 83, 69, 82, 84, 73, 79, 206, 73, 78, 83, 69, 67, 84, - 128, 73, 78, 83, 67, 82, 73, 80, 84, 73, 79, 78, 65, 204, 73, 78, 80, 85, - 212, 73, 78, 78, 79, 67, 69, 78, 67, 69, 128, 73, 78, 78, 78, 128, 73, - 78, 78, 69, 82, 128, 73, 78, 78, 69, 210, 73, 78, 78, 128, 73, 78, 73, - 78, 71, 85, 128, 73, 78, 73, 128, 73, 78, 72, 73, 66, 73, 212, 73, 78, - 72, 69, 82, 69, 78, 212, 73, 78, 72, 65, 76, 69, 128, 73, 78, 71, 87, 65, - 90, 128, 73, 78, 70, 79, 82, 77, 65, 84, 73, 79, 206, 73, 78, 70, 76, 85, - 69, 78, 67, 69, 128, 73, 78, 70, 73, 78, 73, 84, 89, 128, 73, 78, 70, 73, - 78, 73, 84, 217, 73, 78, 68, 85, 83, 84, 82, 73, 65, 204, 73, 78, 68, 73, - 82, 69, 67, 212, 73, 78, 68, 73, 67, 84, 73, 79, 206, 73, 78, 68, 73, 67, - 65, 84, 79, 82, 128, 73, 78, 68, 73, 67, 65, 84, 79, 210, 73, 78, 68, 73, - 195, 73, 78, 68, 73, 65, 206, 73, 78, 68, 69, 88, 128, 73, 78, 68, 69, - 80, 69, 78, 68, 69, 78, 212, 73, 78, 67, 82, 69, 77, 69, 78, 84, 128, 73, - 78, 67, 82, 69, 65, 83, 69, 211, 73, 78, 67, 82, 69, 65, 83, 69, 128, 73, - 78, 67, 82, 69, 65, 83, 197, 73, 78, 67, 79, 77, 80, 76, 69, 84, 197, 73, - 78, 67, 79, 77, 73, 78, 199, 73, 78, 67, 76, 85, 68, 73, 78, 199, 73, 78, - 67, 72, 128, 73, 78, 66, 79, 216, 73, 78, 65, 80, 128, 73, 78, 45, 65, - 76, 65, 70, 128, 73, 77, 80, 69, 82, 73, 65, 204, 73, 77, 80, 69, 82, 70, - 69, 67, 84, 85, 205, 73, 77, 80, 69, 82, 70, 69, 67, 84, 65, 128, 73, 77, - 80, 69, 82, 70, 69, 67, 84, 193, 73, 77, 78, 128, 73, 77, 73, 83, 69, 79, - 211, 73, 77, 73, 78, 51, 128, 73, 77, 73, 78, 128, 73, 77, 73, 206, 73, - 77, 73, 70, 84, 72, 79, 82, 79, 78, 128, 73, 77, 73, 70, 84, 72, 79, 82, - 65, 128, 73, 77, 73, 70, 79, 78, 79, 78, 128, 73, 77, 73, 68, 73, 65, 82, - 71, 79, 78, 128, 73, 77, 65, 71, 197, 73, 76, 85, 89, 65, 78, 78, 65, - 128, 73, 76, 85, 89, 128, 73, 76, 85, 85, 89, 65, 78, 78, 65, 128, 73, - 76, 85, 84, 128, 73, 76, 73, 77, 77, 85, 52, 128, 73, 76, 73, 77, 77, 85, - 51, 128, 73, 76, 73, 77, 77, 85, 128, 73, 76, 73, 77, 77, 213, 73, 76, - 50, 128, 73, 75, 65, 82, 65, 128, 73, 75, 65, 82, 193, 73, 74, 128, 73, - 73, 89, 65, 78, 78, 65, 128, 73, 71, 73, 128, 73, 71, 201, 73, 71, 71, - 87, 83, 128, 73, 70, 73, 78, 128, 73, 69, 85, 78, 71, 45, 84, 73, 75, 69, - 85, 84, 128, 73, 69, 85, 78, 71, 45, 84, 72, 73, 69, 85, 84, 72, 128, 73, - 69, 85, 78, 71, 45, 82, 73, 69, 85, 76, 128, 73, 69, 85, 78, 71, 45, 80, - 73, 69, 85, 80, 128, 73, 69, 85, 78, 71, 45, 80, 72, 73, 69, 85, 80, 72, - 128, 73, 69, 85, 78, 71, 45, 67, 73, 69, 85, 67, 128, 73, 69, 85, 78, 71, - 45, 67, 72, 73, 69, 85, 67, 72, 128, 73, 69, 85, 78, 199, 73, 68, 76, 69, - 128, 73, 68, 73, 77, 128, 73, 68, 73, 205, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 68, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 68, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, - 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 54, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 53, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 68, 52, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 68, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, - 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 70, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 67, 69, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, - 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 65, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 57, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 67, 56, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 67, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 67, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, - 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 52, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 51, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 67, 50, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 67, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, - 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 69, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 68, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 66, 67, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 66, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, - 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 56, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 55, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 66, 54, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 66, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 66, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, - 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 50, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 49, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 65, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, - 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 66, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 65, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 65, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, - 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 54, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 53, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 65, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 65, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, - 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 70, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 57, 69, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 57, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, - 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 65, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 57, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 57, 56, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 57, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, - 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 52, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 51, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 57, 50, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 57, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 57, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, - 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 69, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 68, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 56, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, - 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 56, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 55, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 56, 54, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 56, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, - 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 50, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 49, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 55, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 55, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, - 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 66, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 55, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, - 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 54, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 53, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 55, 52, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, - 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 68, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 54, 67, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, - 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 56, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 55, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 54, 54, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 54, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, - 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 50, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 49, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 54, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, - 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 66, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 53, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, - 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 54, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 53, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 53, 52, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 53, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, - 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 70, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 52, 69, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, - 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 65, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 57, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 52, 56, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, - 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 52, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 51, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 52, 50, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 52, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, - 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 69, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 68, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 51, 67, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, - 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 56, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 55, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 51, 54, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, - 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 50, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 49, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 51, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 50, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 50, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, - 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 66, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 50, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, - 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 54, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 53, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 50, 52, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 50, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, - 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 70, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 49, 69, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, - 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 65, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 57, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, - 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 52, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 51, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, - 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 69, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 68, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, - 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 56, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 55, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, - 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 50, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 49, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 70, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 70, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, - 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 66, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 70, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 70, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 70, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, - 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 54, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 53, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 70, 52, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 70, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, - 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 70, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 69, 69, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 69, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 69, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, - 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 65, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 57, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 69, 56, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 69, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 69, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, - 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 52, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 51, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 69, 50, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 69, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 69, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, - 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 69, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 68, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 68, 67, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 68, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 68, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, - 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 56, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 55, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 68, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, - 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 50, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 49, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 68, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 67, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, - 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 66, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 67, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, - 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 54, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 53, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 67, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, - 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 70, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 66, 69, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 66, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, - 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 65, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 57, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 66, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, - 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 52, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 51, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, - 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 69, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 68, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 65, 67, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 65, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, - 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 56, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 55, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, - 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 50, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 49, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 57, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, - 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 66, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 57, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 57, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, - 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 54, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 53, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 57, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, - 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 70, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, - 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 65, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 57, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 56, 56, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 56, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, - 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 52, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 51, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, - 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 69, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 68, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, - 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 56, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 55, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 55, 54, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 55, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, - 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 50, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 49, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 54, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 54, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, - 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 66, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 54, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, - 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 54, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 53, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 54, 52, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 54, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, - 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 70, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 53, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, - 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 65, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 57, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 53, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, - 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 52, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 51, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 53, 50, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 53, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, - 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 69, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 68, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, - 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 56, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 55, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 52, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, - 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 50, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 49, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 52, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 51, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, - 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 66, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 51, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, - 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 54, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 53, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 51, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, - 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 70, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 50, 69, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, - 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 65, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 57, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 50, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, - 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 52, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 51, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 50, 50, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, - 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 69, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 68, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, - 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 56, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 55, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, - 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 50, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 49, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 48, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, - 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 66, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, - 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 54, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 53, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 48, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, - 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 57, 49, 52, 68, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 57, 48, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 56, 68, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 56, 67, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 56, 57, 69, - 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 68, 52, 50, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 65, 55, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 55, 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 55, 54, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 55, 53, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 53, 49, - 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 49, 50, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 48, 66, 57, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 54, 70, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 54, 69, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 54, 55, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 55, 48, - 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 55, 48, 56, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 54, 50, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 54, 53, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 54, 53, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 54, 53, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 51, 53, - 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 51, 48, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 50, 57, 53, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 54, 50, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 54, 50, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 53, 70, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 68, 69, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 66, 56, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 66, 53, 55, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 53, 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 53, 57, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 53, 56, 70, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 53, 66, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 52, 51, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 52, 48, 56, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 53, 51, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 53, 51, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 53, 50, 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 55, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 52, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 49, 68, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 53, 49, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 52, 69, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 52, 69, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 50, - 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 48, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 48, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 68, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 65, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 65, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 65, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 65, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 55, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 54, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 53, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 65, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 65, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 65, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 65, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, - 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 69, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 68, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 67, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 66, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 65, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 65, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 65, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 65, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 53, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 52, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 51, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 50, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 65, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 65, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 70, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 70, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, - 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 67, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 66, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 57, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 70, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 70, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 70, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 70, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, - 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 51, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 50, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 49, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 69, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 69, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 69, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 69, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, - 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 65, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 57, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 56, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 55, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 69, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 69, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 69, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 69, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 49, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 48, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 70, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 69, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 68, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 68, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 68, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, - 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 56, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 55, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 53, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 68, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 68, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 70, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 69, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 68, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 67, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 67, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, - 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 53, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 51, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 67, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 67, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, - 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 68, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 67, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 66, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 65, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 66, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, - 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 52, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 51, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 50, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 49, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 65, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 66, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 65, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 57, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 56, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, - 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 50, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 49, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 70, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 57, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 57, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, - 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 57, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 56, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 55, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 54, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 57, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, - 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 48, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 70, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 69, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 68, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 56, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 55, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 54, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 53, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, - 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 69, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 68, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 67, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 66, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 55, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 53, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 52, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 51, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 50, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 54, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 54, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, - 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 67, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 66, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 57, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 54, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 54, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, - 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 51, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 50, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 49, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 53, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, - 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 65, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 57, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 56, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 55, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 53, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 53, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 49, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 48, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 70, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 69, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, - 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 56, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 55, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 53, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 52, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 52, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 70, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 69, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 68, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 67, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 51, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, - 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 53, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 51, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 51, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 51, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 50, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, - 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 68, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 67, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 66, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 65, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 50, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, - 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 52, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 51, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 50, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 49, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 49, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 66, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 65, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 57, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 56, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, - 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 50, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 49, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 70, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 48, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, - 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 57, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 56, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 55, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 54, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 48, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, - 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 48, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 70, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 69, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 68, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 70, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 70, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 70, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 70, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 55, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 54, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 53, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 70, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 70, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 70, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, - 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 69, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 68, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 67, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 66, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 69, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 69, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 69, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 69, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 53, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 52, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 51, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 50, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 69, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 69, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 68, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 68, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, - 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 67, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 66, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 57, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 68, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, - 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 51, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 50, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 49, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 67, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, - 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 65, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 57, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 56, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 55, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 67, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 49, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 48, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 70, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 69, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 66, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 66, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, - 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 56, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 55, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 53, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 66, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 70, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 69, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 68, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 67, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 65, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 65, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, - 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 53, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 51, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 65, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, - 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 68, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 67, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 66, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 65, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 57, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 57, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, - 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 52, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 51, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 50, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 49, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 57, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 66, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 65, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 57, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 56, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 56, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 56, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, - 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 50, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 49, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 70, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 55, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, - 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 57, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 56, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 55, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 54, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 55, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, - 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 48, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 70, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 69, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 68, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 54, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 55, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 54, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 53, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 54, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 54, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, - 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 69, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 68, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 67, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 66, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 53, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 53, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 52, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 51, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 50, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 53, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 52, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, - 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 67, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 66, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 57, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 52, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, - 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 51, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 50, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 49, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 51, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 51, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, - 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 65, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 57, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 56, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 55, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 51, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 49, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 48, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 70, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 69, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 50, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, - 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 56, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 55, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 53, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 50, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 50, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 70, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 69, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 68, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 67, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, - 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 53, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 51, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, - 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 68, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 67, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 66, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 65, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, - 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 52, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 51, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 50, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 49, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 200, 73, 68, 69, 78, 84, 73, 70, 73, 67, 65, 84, 73, 79, 78, 128, 73, 68, - 69, 78, 84, 73, 67, 65, 204, 73, 67, 79, 78, 128, 73, 67, 72, 79, 85, - 128, 73, 67, 72, 79, 83, 128, 73, 67, 72, 73, 77, 65, 84, 79, 83, 128, - 73, 67, 72, 65, 68, 73, 78, 128, 73, 67, 69, 76, 65, 78, 68, 73, 67, 45, - 89, 82, 128, 73, 66, 73, 70, 73, 76, 73, 128, 73, 65, 85, 68, 65, 128, - 73, 48, 49, 53, 128, 73, 48, 49, 52, 128, 73, 48, 49, 51, 128, 73, 48, - 49, 50, 128, 73, 48, 49, 49, 65, 128, 73, 48, 49, 49, 128, 73, 48, 49, - 48, 65, 128, 73, 48, 49, 48, 128, 73, 48, 48, 57, 65, 128, 73, 48, 48, - 57, 128, 73, 48, 48, 56, 128, 73, 48, 48, 55, 128, 73, 48, 48, 54, 128, - 73, 48, 48, 53, 65, 128, 73, 48, 48, 53, 128, 73, 48, 48, 52, 128, 73, - 48, 48, 51, 128, 73, 48, 48, 50, 128, 73, 48, 48, 49, 128, 73, 45, 89, - 85, 128, 73, 45, 89, 79, 128, 73, 45, 89, 69, 79, 128, 73, 45, 89, 69, - 128, 73, 45, 89, 65, 69, 128, 73, 45, 89, 65, 45, 79, 128, 73, 45, 89, - 65, 128, 73, 45, 79, 45, 73, 128, 73, 45, 79, 128, 73, 45, 69, 85, 128, - 73, 45, 66, 69, 65, 77, 128, 73, 45, 65, 82, 65, 69, 65, 128, 73, 45, 65, - 128, 72, 90, 90, 90, 71, 128, 72, 90, 90, 90, 128, 72, 90, 90, 80, 128, - 72, 90, 90, 128, 72, 90, 87, 71, 128, 72, 90, 87, 128, 72, 90, 84, 128, - 72, 90, 71, 128, 72, 89, 83, 84, 69, 82, 69, 83, 73, 211, 72, 89, 80, 79, - 68, 73, 65, 83, 84, 79, 76, 69, 128, 72, 89, 80, 72, 69, 78, 65, 84, 73, - 79, 206, 72, 89, 80, 72, 69, 78, 45, 77, 73, 78, 85, 83, 128, 72, 89, 80, - 72, 69, 78, 128, 72, 89, 80, 72, 69, 206, 72, 89, 71, 73, 69, 73, 65, - 128, 72, 89, 71, 73, 69, 65, 128, 72, 88, 87, 71, 128, 72, 88, 85, 79, - 88, 128, 72, 88, 85, 79, 84, 128, 72, 88, 85, 79, 80, 128, 72, 88, 85, - 79, 128, 72, 88, 79, 88, 128, 72, 88, 79, 84, 128, 72, 88, 79, 80, 128, - 72, 88, 79, 128, 72, 88, 73, 88, 128, 72, 88, 73, 84, 128, 72, 88, 73, - 80, 128, 72, 88, 73, 69, 88, 128, 72, 88, 73, 69, 84, 128, 72, 88, 73, - 69, 80, 128, 72, 88, 73, 69, 128, 72, 88, 73, 128, 72, 88, 69, 88, 128, - 72, 88, 69, 80, 128, 72, 88, 69, 128, 72, 88, 65, 88, 128, 72, 88, 65, - 84, 128, 72, 88, 65, 80, 128, 72, 88, 65, 128, 72, 87, 85, 128, 72, 87, - 65, 73, 82, 128, 72, 87, 65, 72, 128, 72, 85, 86, 65, 128, 72, 85, 83, - 72, 69, 196, 72, 85, 83, 72, 128, 72, 85, 82, 65, 78, 128, 72, 85, 79, - 84, 128, 72, 85, 78, 68, 82, 69, 68, 83, 128, 72, 85, 78, 68, 82, 69, 68, - 211, 72, 85, 78, 68, 82, 69, 68, 128, 72, 85, 78, 68, 82, 69, 196, 72, - 85, 78, 128, 72, 85, 77, 208, 72, 85, 77, 65, 78, 128, 72, 85, 77, 65, - 206, 72, 85, 76, 50, 128, 72, 85, 73, 73, 84, 79, 128, 72, 85, 71, 71, - 73, 78, 199, 72, 85, 66, 50, 128, 72, 85, 66, 178, 72, 85, 66, 128, 72, - 85, 65, 82, 65, 68, 68, 79, 128, 72, 85, 65, 78, 128, 72, 85, 45, 51, - 128, 72, 85, 45, 50, 128, 72, 85, 45, 49, 128, 72, 84, 83, 128, 72, 84, - 74, 128, 72, 82, 89, 86, 78, 73, 193, 72, 80, 87, 71, 128, 72, 80, 65, - 128, 72, 80, 128, 72, 79, 85, 83, 197, 72, 79, 85, 82, 71, 76, 65, 83, - 83, 128, 72, 79, 85, 82, 71, 76, 65, 83, 211, 72, 79, 85, 82, 128, 72, - 79, 85, 210, 72, 79, 84, 69, 76, 128, 72, 79, 84, 65, 128, 72, 79, 83, - 80, 73, 84, 65, 76, 128, 72, 79, 82, 83, 69, 128, 72, 79, 82, 83, 197, - 72, 79, 82, 82, 128, 72, 79, 82, 78, 83, 128, 72, 79, 82, 73, 90, 79, 78, - 84, 65, 76, 76, 217, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, - 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, - 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, - 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 51, - 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 50, 128, - 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 49, 128, 72, - 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 48, 128, 72, 79, - 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 54, 128, 72, 79, 82, - 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 53, 128, 72, 79, 82, 73, - 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 52, 128, 72, 79, 82, 73, 90, - 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, - 78, 84, 65, 76, 45, 48, 53, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, - 84, 65, 76, 45, 48, 53, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, - 65, 76, 45, 48, 53, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, - 76, 45, 48, 52, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, - 45, 48, 52, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, - 48, 52, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, - 52, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, - 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, 45, - 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, 45, 48, - 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 54, - 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 53, 128, - 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 52, 128, 72, - 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 51, 128, 72, 79, - 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 50, 128, 72, 79, 82, - 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 49, 128, 72, 79, 82, 73, - 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 48, 128, 72, 79, 82, 73, 90, - 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, - 78, 84, 65, 76, 45, 48, 50, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, - 84, 65, 76, 45, 48, 50, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, - 65, 76, 45, 48, 50, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, - 76, 45, 48, 50, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, - 45, 48, 50, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, - 48, 50, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, - 49, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, - 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, - 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, - 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 50, - 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 49, 128, - 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 48, 128, 72, - 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 54, 128, 72, 79, - 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 53, 128, 72, 79, 82, - 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 52, 128, 72, 79, 82, 73, - 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 51, 128, 72, 79, 82, 73, 90, - 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, - 78, 84, 65, 76, 45, 48, 48, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, - 84, 65, 76, 45, 48, 48, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, - 65, 76, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 204, 72, 79, 82, 73, - 128, 72, 79, 82, 193, 72, 79, 79, 85, 128, 72, 79, 79, 82, 85, 128, 72, - 79, 79, 80, 128, 72, 79, 79, 78, 128, 72, 79, 79, 75, 69, 68, 128, 72, - 79, 79, 75, 69, 196, 72, 79, 78, 69, 89, 66, 69, 69, 128, 72, 79, 78, 69, - 217, 72, 79, 77, 79, 84, 72, 69, 84, 73, 67, 128, 72, 79, 77, 79, 84, 72, - 69, 84, 73, 195, 72, 79, 76, 79, 128, 72, 79, 76, 76, 79, 215, 72, 79, - 76, 69, 128, 72, 79, 76, 68, 73, 78, 199, 72, 79, 76, 65, 77, 128, 72, - 79, 76, 65, 205, 72, 79, 75, 65, 128, 72, 79, 67, 75, 69, 217, 72, 79, - 67, 72, 79, 128, 72, 79, 45, 56, 128, 72, 79, 45, 55, 128, 72, 79, 45, - 54, 128, 72, 79, 45, 53, 128, 72, 79, 45, 52, 128, 72, 79, 45, 51, 128, - 72, 79, 45, 50, 128, 72, 79, 45, 49, 128, 72, 78, 85, 84, 128, 72, 78, - 85, 79, 88, 128, 72, 78, 85, 79, 128, 72, 78, 85, 66, 128, 72, 78, 79, - 88, 128, 72, 78, 79, 84, 128, 72, 78, 79, 80, 128, 72, 78, 73, 88, 128, - 72, 78, 73, 84, 128, 72, 78, 73, 80, 128, 72, 78, 73, 69, 88, 128, 72, - 78, 73, 69, 84, 128, 72, 78, 73, 69, 80, 128, 72, 78, 73, 69, 128, 72, - 78, 73, 128, 72, 78, 69, 88, 128, 72, 78, 69, 80, 128, 72, 78, 69, 128, - 72, 78, 65, 88, 128, 72, 78, 65, 85, 128, 72, 78, 65, 84, 128, 72, 78, - 65, 80, 128, 72, 78, 65, 128, 72, 77, 89, 88, 128, 72, 77, 89, 82, 88, - 128, 72, 77, 89, 82, 128, 72, 77, 89, 80, 128, 72, 77, 89, 128, 72, 77, - 85, 88, 128, 72, 77, 85, 84, 128, 72, 77, 85, 82, 88, 128, 72, 77, 85, - 82, 128, 72, 77, 85, 80, 128, 72, 77, 85, 79, 88, 128, 72, 77, 85, 79, - 80, 128, 72, 77, 85, 79, 128, 72, 77, 85, 128, 72, 77, 79, 88, 128, 72, - 77, 79, 84, 128, 72, 77, 79, 80, 128, 72, 77, 79, 128, 72, 77, 73, 88, - 128, 72, 77, 73, 84, 128, 72, 77, 73, 80, 128, 72, 77, 73, 69, 88, 128, - 72, 77, 73, 69, 80, 128, 72, 77, 73, 69, 128, 72, 77, 73, 128, 72, 77, - 69, 128, 72, 77, 65, 88, 128, 72, 77, 65, 84, 128, 72, 77, 65, 80, 128, - 72, 77, 65, 128, 72, 76, 89, 88, 128, 72, 76, 89, 84, 128, 72, 76, 89, - 82, 88, 128, 72, 76, 89, 82, 128, 72, 76, 89, 80, 128, 72, 76, 89, 128, - 72, 76, 85, 88, 128, 72, 76, 85, 84, 128, 72, 76, 85, 82, 88, 128, 72, - 76, 85, 82, 128, 72, 76, 85, 80, 128, 72, 76, 85, 79, 88, 128, 72, 76, - 85, 79, 80, 128, 72, 76, 85, 79, 128, 72, 76, 85, 128, 72, 76, 79, 88, - 128, 72, 76, 79, 80, 128, 72, 76, 79, 128, 72, 76, 73, 88, 128, 72, 76, - 73, 84, 128, 72, 76, 73, 80, 128, 72, 76, 73, 69, 88, 128, 72, 76, 73, - 69, 80, 128, 72, 76, 73, 69, 128, 72, 76, 73, 128, 72, 76, 69, 88, 128, - 72, 76, 69, 80, 128, 72, 76, 69, 128, 72, 76, 65, 88, 128, 72, 76, 65, - 85, 128, 72, 76, 65, 84, 128, 72, 76, 65, 80, 128, 72, 76, 65, 128, 72, - 76, 128, 72, 75, 128, 72, 73, 90, 66, 128, 72, 73, 89, 79, 128, 72, 73, - 84, 84, 73, 78, 199, 72, 73, 83, 84, 79, 82, 73, 195, 72, 73, 82, 73, 81, - 128, 72, 73, 80, 80, 79, 80, 79, 84, 65, 77, 85, 83, 128, 72, 73, 78, 71, - 69, 68, 128, 72, 73, 78, 71, 69, 196, 72, 73, 78, 71, 69, 128, 72, 73, - 75, 73, 78, 199, 72, 73, 71, 72, 45, 83, 80, 69, 69, 196, 72, 73, 71, 72, - 45, 82, 69, 86, 69, 82, 83, 69, 68, 45, 185, 72, 73, 71, 72, 45, 76, 79, - 215, 72, 73, 71, 72, 45, 72, 69, 69, 76, 69, 196, 72, 73, 69, 88, 128, - 72, 73, 69, 85, 72, 45, 83, 73, 79, 83, 128, 72, 73, 69, 85, 72, 45, 82, - 73, 69, 85, 76, 128, 72, 73, 69, 85, 72, 45, 80, 73, 69, 85, 80, 128, 72, - 73, 69, 85, 72, 45, 78, 73, 69, 85, 78, 128, 72, 73, 69, 85, 72, 45, 77, - 73, 69, 85, 77, 128, 72, 73, 69, 85, 200, 72, 73, 69, 82, 79, 71, 76, 89, - 80, 72, 73, 195, 72, 73, 69, 128, 72, 73, 68, 73, 78, 199, 72, 73, 68, - 69, 84, 128, 72, 73, 68, 69, 128, 72, 73, 66, 73, 83, 67, 85, 83, 128, - 72, 73, 45, 82, 69, 83, 128, 72, 73, 45, 55, 128, 72, 73, 45, 54, 128, - 72, 73, 45, 53, 128, 72, 73, 45, 52, 128, 72, 73, 45, 51, 128, 72, 73, - 45, 50, 128, 72, 73, 45, 49, 128, 72, 72, 87, 65, 128, 72, 72, 85, 128, - 72, 72, 73, 128, 72, 72, 69, 69, 128, 72, 72, 69, 128, 72, 72, 65, 65, - 128, 72, 71, 128, 72, 69, 89, 84, 128, 72, 69, 88, 73, 70, 79, 82, 205, - 72, 69, 88, 65, 71, 82, 65, 205, 72, 69, 88, 65, 71, 79, 78, 128, 72, 69, - 82, 85, 84, 85, 128, 72, 69, 82, 85, 128, 72, 69, 82, 77, 73, 84, 73, 65, - 206, 72, 69, 82, 77, 73, 79, 78, 73, 65, 206, 72, 69, 82, 77, 69, 83, - 128, 72, 69, 82, 69, 128, 72, 69, 82, 66, 128, 72, 69, 82, 65, 69, 85, - 205, 72, 69, 78, 71, 128, 72, 69, 78, 199, 72, 69, 77, 80, 128, 72, 69, - 76, 77, 69, 84, 128, 72, 69, 76, 77, 69, 212, 72, 69, 76, 205, 72, 69, - 76, 73, 88, 128, 72, 69, 76, 73, 67, 79, 80, 84, 69, 82, 128, 72, 69, 75, - 85, 84, 65, 65, 82, 85, 128, 72, 69, 73, 83, 69, 73, 128, 72, 69, 73, 71, - 72, 84, 128, 72, 69, 69, 73, 128, 72, 69, 68, 71, 69, 72, 79, 71, 128, - 72, 69, 65, 86, 89, 128, 72, 69, 65, 86, 69, 78, 76, 217, 72, 69, 65, 86, - 69, 78, 128, 72, 69, 65, 86, 69, 206, 72, 69, 65, 82, 84, 83, 128, 72, - 69, 65, 82, 84, 45, 83, 72, 65, 80, 69, 196, 72, 69, 65, 82, 84, 128, 72, - 69, 65, 82, 212, 72, 69, 65, 82, 45, 78, 79, 45, 69, 86, 73, 204, 72, 69, - 65, 68, 83, 84, 82, 79, 75, 69, 128, 72, 69, 65, 68, 83, 84, 79, 78, 197, - 72, 69, 65, 68, 83, 67, 65, 82, 70, 128, 72, 69, 65, 68, 80, 72, 79, 78, - 69, 128, 72, 69, 65, 68, 73, 78, 71, 128, 72, 69, 65, 68, 45, 66, 65, 78, - 68, 65, 71, 69, 128, 72, 69, 45, 55, 128, 72, 69, 45, 54, 128, 72, 69, - 45, 53, 128, 72, 69, 45, 52, 128, 72, 69, 45, 51, 128, 72, 69, 45, 50, - 128, 72, 69, 45, 49, 128, 72, 68, 82, 128, 72, 67, 128, 72, 66, 65, 83, - 65, 45, 69, 83, 65, 83, 193, 72, 66, 65, 83, 193, 72, 65, 89, 65, 78, 78, - 65, 128, 72, 65, 87, 74, 128, 72, 65, 86, 69, 128, 72, 65, 85, 80, 84, - 83, 84, 73, 77, 77, 69, 128, 72, 65, 213, 72, 65, 84, 82, 65, 206, 72, - 65, 84, 72, 73, 128, 72, 65, 84, 69, 128, 72, 65, 84, 67, 72, 73, 78, - 199, 72, 65, 84, 65, 198, 72, 65, 83, 69, 210, 72, 65, 83, 65, 78, 84, - 65, 128, 72, 65, 82, 80, 79, 79, 78, 128, 72, 65, 82, 80, 79, 79, 206, - 72, 65, 82, 77, 79, 78, 73, 67, 128, 72, 65, 82, 75, 76, 69, 65, 206, 72, - 65, 82, 68, 78, 69, 83, 83, 128, 72, 65, 82, 196, 72, 65, 82, 66, 65, 72, - 65, 89, 128, 72, 65, 80, 80, 217, 72, 65, 78, 85, 78, 79, 207, 72, 65, - 78, 73, 70, 201, 72, 65, 78, 71, 90, 72, 79, 213, 72, 65, 78, 68, 83, 72, - 65, 75, 69, 128, 72, 65, 78, 68, 83, 128, 72, 65, 78, 68, 211, 72, 65, - 78, 68, 76, 69, 83, 128, 72, 65, 78, 68, 76, 69, 128, 72, 65, 78, 68, 66, - 65, 76, 76, 128, 72, 65, 78, 68, 66, 65, 71, 128, 72, 65, 78, 68, 45, 79, - 86, 65, 76, 128, 72, 65, 78, 68, 45, 79, 86, 65, 204, 72, 65, 78, 68, 45, - 72, 79, 79, 75, 128, 72, 65, 78, 68, 45, 72, 79, 79, 203, 72, 65, 78, 68, - 45, 72, 73, 78, 71, 69, 128, 72, 65, 78, 68, 45, 72, 73, 78, 71, 197, 72, - 65, 78, 68, 45, 70, 76, 65, 84, 128, 72, 65, 78, 68, 45, 70, 76, 65, 212, - 72, 65, 78, 68, 45, 70, 73, 83, 84, 128, 72, 65, 78, 68, 45, 67, 85, 82, - 76, 73, 67, 85, 69, 128, 72, 65, 78, 68, 45, 67, 85, 82, 76, 73, 67, 85, - 197, 72, 65, 78, 68, 45, 67, 85, 80, 128, 72, 65, 78, 68, 45, 67, 85, - 208, 72, 65, 78, 68, 45, 67, 76, 65, 87, 128, 72, 65, 78, 68, 45, 67, 76, - 65, 215, 72, 65, 78, 68, 45, 67, 73, 82, 67, 76, 69, 128, 72, 65, 78, 68, - 45, 67, 73, 82, 67, 76, 197, 72, 65, 78, 68, 45, 65, 78, 71, 76, 69, 128, - 72, 65, 78, 68, 45, 65, 78, 71, 76, 197, 72, 65, 78, 68, 128, 72, 65, 78, - 45, 65, 75, 65, 84, 128, 72, 65, 77, 90, 65, 128, 72, 65, 77, 90, 193, - 72, 65, 77, 83, 84, 69, 210, 72, 65, 77, 77, 69, 82, 128, 72, 65, 77, 77, - 69, 210, 72, 65, 77, 66, 85, 82, 71, 69, 82, 128, 72, 65, 76, 81, 65, - 128, 72, 65, 76, 79, 128, 72, 65, 76, 70, 45, 67, 73, 82, 67, 76, 197, - 72, 65, 76, 70, 128, 72, 65, 76, 66, 69, 82, 68, 128, 72, 65, 76, 65, 78, - 84, 65, 128, 72, 65, 73, 84, 85, 128, 72, 65, 73, 211, 72, 65, 73, 82, - 67, 85, 84, 128, 72, 65, 73, 82, 128, 72, 65, 71, 76, 65, 218, 72, 65, - 71, 76, 128, 72, 65, 70, 85, 75, 72, 65, 128, 72, 65, 70, 85, 75, 72, - 128, 72, 65, 69, 71, 204, 72, 65, 68, 69, 83, 128, 72, 65, 65, 82, 85, - 128, 72, 65, 65, 77, 128, 72, 65, 193, 72, 65, 45, 72, 65, 128, 72, 65, - 45, 57, 128, 72, 65, 45, 56, 128, 72, 65, 45, 55, 128, 72, 65, 45, 54, - 128, 72, 65, 45, 53, 128, 72, 65, 45, 52, 128, 72, 65, 45, 51, 128, 72, - 65, 45, 50, 128, 72, 65, 45, 49, 49, 128, 72, 65, 45, 49, 48, 128, 72, - 65, 45, 49, 128, 72, 48, 48, 56, 128, 72, 48, 48, 55, 128, 72, 48, 48, - 54, 65, 128, 72, 48, 48, 54, 128, 72, 48, 48, 53, 128, 72, 48, 48, 52, - 128, 72, 48, 48, 51, 128, 72, 48, 48, 50, 128, 72, 48, 48, 49, 128, 72, - 45, 84, 89, 80, 197, 71, 89, 85, 128, 71, 89, 79, 78, 128, 71, 89, 79, - 128, 71, 89, 73, 128, 71, 89, 70, 213, 71, 89, 69, 69, 128, 71, 89, 65, - 83, 128, 71, 89, 65, 65, 128, 71, 89, 65, 128, 71, 89, 128, 71, 87, 85, - 128, 71, 87, 73, 128, 71, 87, 69, 69, 128, 71, 87, 69, 128, 71, 87, 65, - 65, 128, 71, 87, 65, 128, 71, 86, 65, 78, 71, 128, 71, 86, 128, 71, 85, - 82, 85, 83, 72, 128, 71, 85, 82, 85, 78, 128, 71, 85, 82, 77, 85, 75, 72, - 201, 71, 85, 82, 65, 77, 85, 84, 79, 78, 128, 71, 85, 82, 55, 128, 71, - 85, 78, 85, 128, 71, 85, 78, 213, 71, 85, 78, 74, 65, 76, 193, 71, 85, - 205, 71, 85, 76, 128, 71, 85, 74, 65, 82, 65, 84, 201, 71, 85, 73, 84, - 65, 82, 128, 71, 85, 199, 71, 85, 69, 73, 128, 71, 85, 69, 72, 128, 71, - 85, 69, 200, 71, 85, 68, 128, 71, 85, 196, 71, 85, 65, 82, 68, 83, 77, - 65, 78, 128, 71, 85, 65, 82, 68, 69, 68, 78, 69, 83, 83, 128, 71, 85, 65, - 82, 68, 69, 196, 71, 85, 65, 82, 68, 128, 71, 85, 65, 82, 65, 78, 201, - 71, 85, 193, 71, 85, 178, 71, 84, 69, 210, 71, 83, 85, 77, 128, 71, 83, - 85, 205, 71, 82, 213, 71, 82, 79, 87, 73, 78, 199, 71, 82, 79, 85, 78, - 68, 128, 71, 82, 79, 78, 84, 72, 73, 83, 77, 65, 84, 65, 128, 71, 82, 73, - 78, 78, 73, 78, 199, 71, 82, 73, 77, 65, 67, 73, 78, 199, 71, 82, 69, 71, - 79, 82, 73, 65, 206, 71, 82, 69, 69, 78, 128, 71, 82, 69, 69, 206, 71, - 82, 69, 65, 84, 78, 69, 83, 83, 128, 71, 82, 69, 65, 84, 69, 82, 45, 84, - 72, 65, 78, 128, 71, 82, 69, 65, 84, 69, 82, 45, 84, 72, 65, 206, 71, 82, - 69, 65, 84, 69, 210, 71, 82, 69, 65, 212, 71, 82, 65, 86, 69, 89, 65, 82, - 196, 71, 82, 65, 86, 69, 45, 77, 65, 67, 82, 79, 78, 128, 71, 82, 65, 86, - 69, 45, 65, 67, 85, 84, 69, 45, 71, 82, 65, 86, 69, 128, 71, 82, 65, 86, - 197, 71, 82, 65, 84, 69, 82, 128, 71, 82, 65, 83, 83, 128, 71, 82, 65, - 83, 211, 71, 82, 65, 83, 208, 71, 82, 65, 80, 72, 69, 77, 197, 71, 82, - 65, 80, 69, 83, 128, 71, 82, 65, 78, 84, 72, 193, 71, 82, 65, 77, 77, - 193, 71, 82, 65, 73, 78, 128, 71, 82, 65, 68, 85, 65, 84, 73, 79, 206, - 71, 82, 65, 68, 85, 65, 76, 128, 71, 82, 65, 67, 69, 128, 71, 82, 65, 67, - 197, 71, 80, 65, 128, 71, 79, 82, 84, 72, 77, 73, 75, 79, 206, 71, 79, - 82, 84, 128, 71, 79, 82, 73, 76, 76, 65, 128, 71, 79, 82, 71, 79, 84, 69, - 82, 73, 128, 71, 79, 82, 71, 79, 83, 89, 78, 84, 72, 69, 84, 79, 78, 128, - 71, 79, 82, 71, 79, 206, 71, 79, 82, 71, 73, 128, 71, 79, 82, 65, 128, - 71, 79, 79, 196, 71, 79, 78, 71, 128, 71, 79, 76, 70, 69, 82, 128, 71, - 79, 76, 68, 128, 71, 79, 75, 128, 71, 79, 73, 78, 199, 71, 79, 71, 71, - 76, 69, 83, 128, 71, 79, 66, 76, 73, 78, 128, 71, 79, 65, 76, 128, 71, - 79, 65, 204, 71, 79, 65, 128, 71, 78, 89, 73, 83, 128, 71, 78, 65, 86, - 73, 89, 65, 78, 73, 128, 71, 76, 79, 87, 73, 78, 199, 71, 76, 79, 86, 69, - 83, 128, 71, 76, 79, 86, 69, 128, 71, 76, 79, 84, 84, 65, 204, 71, 76, - 79, 66, 197, 71, 76, 73, 83, 83, 65, 78, 68, 207, 71, 76, 69, 73, 67, - 200, 71, 76, 65, 71, 79, 76, 73, 128, 71, 76, 65, 128, 71, 74, 69, 128, - 71, 73, 88, 128, 71, 73, 84, 128, 71, 73, 83, 72, 128, 71, 73, 83, 200, - 71, 73, 83, 65, 76, 128, 71, 73, 82, 85, 68, 65, 65, 128, 71, 73, 82, 76, - 211, 71, 73, 82, 76, 128, 71, 73, 82, 65, 70, 70, 197, 71, 73, 82, 51, - 128, 71, 73, 82, 179, 71, 73, 82, 50, 128, 71, 73, 82, 178, 71, 73, 80, - 128, 71, 73, 78, 73, 73, 128, 71, 73, 77, 69, 76, 128, 71, 73, 77, 69, - 204, 71, 73, 77, 128, 71, 73, 71, 65, 128, 71, 73, 71, 128, 71, 73, 70, - 212, 71, 73, 69, 84, 128, 71, 73, 68, 73, 77, 128, 71, 73, 66, 66, 79, - 85, 211, 71, 73, 66, 65, 128, 71, 73, 52, 128, 71, 73, 180, 71, 72, 90, - 128, 71, 72, 87, 65, 128, 71, 72, 85, 78, 78, 65, 128, 71, 72, 85, 78, - 78, 193, 71, 72, 85, 128, 71, 72, 79, 85, 128, 71, 72, 79, 83, 84, 128, - 71, 72, 79, 128, 71, 72, 73, 77, 69, 76, 128, 71, 72, 73, 128, 71, 72, - 72, 65, 128, 71, 72, 69, 89, 83, 128, 71, 72, 69, 85, 88, 128, 71, 72, - 69, 85, 78, 128, 71, 72, 69, 85, 71, 72, 69, 85, 65, 69, 77, 128, 71, 72, - 69, 85, 71, 72, 69, 78, 128, 71, 72, 69, 85, 65, 69, 82, 65, 69, 128, 71, - 72, 69, 85, 65, 69, 71, 72, 69, 85, 65, 69, 128, 71, 72, 69, 84, 128, 71, - 72, 69, 69, 128, 71, 72, 69, 128, 71, 72, 197, 71, 72, 65, 89, 78, 128, - 71, 72, 65, 82, 65, 69, 128, 71, 72, 65, 80, 128, 71, 72, 65, 78, 128, - 71, 72, 65, 77, 77, 65, 128, 71, 72, 65, 77, 65, 76, 128, 71, 72, 65, 73, - 78, 85, 128, 71, 72, 65, 73, 78, 128, 71, 72, 65, 73, 206, 71, 72, 65, - 68, 128, 71, 72, 65, 65, 77, 65, 69, 128, 71, 72, 65, 65, 128, 71, 71, - 87, 73, 128, 71, 71, 87, 69, 69, 128, 71, 71, 87, 69, 128, 71, 71, 87, - 65, 65, 128, 71, 71, 87, 65, 128, 71, 71, 85, 88, 128, 71, 71, 85, 84, - 128, 71, 71, 85, 82, 88, 128, 71, 71, 85, 82, 128, 71, 71, 85, 79, 88, - 128, 71, 71, 85, 79, 84, 128, 71, 71, 85, 79, 80, 128, 71, 71, 85, 79, - 128, 71, 71, 79, 88, 128, 71, 71, 79, 84, 128, 71, 71, 79, 80, 128, 71, - 71, 73, 88, 128, 71, 71, 73, 84, 128, 71, 71, 73, 69, 88, 128, 71, 71, - 73, 69, 80, 128, 71, 71, 73, 69, 128, 71, 71, 69, 88, 128, 71, 71, 69, - 84, 128, 71, 71, 69, 80, 128, 71, 71, 65, 88, 128, 71, 71, 65, 84, 128, - 71, 69, 84, 193, 71, 69, 83, 84, 85, 82, 69, 128, 71, 69, 83, 72, 85, - 128, 71, 69, 83, 72, 84, 73, 78, 128, 71, 69, 83, 72, 84, 73, 206, 71, - 69, 83, 72, 50, 128, 71, 69, 82, 83, 72, 65, 89, 73, 77, 128, 71, 69, 82, - 77, 65, 206, 71, 69, 82, 69, 83, 72, 128, 71, 69, 82, 69, 83, 200, 71, - 69, 79, 77, 69, 84, 82, 73, 67, 65, 76, 76, 217, 71, 69, 79, 77, 69, 84, - 82, 73, 195, 71, 69, 78, 84, 76, 197, 71, 69, 78, 73, 84, 73, 86, 69, - 128, 71, 69, 78, 73, 75, 201, 71, 69, 78, 73, 69, 128, 71, 69, 78, 69, - 82, 73, 195, 71, 69, 78, 69, 82, 65, 76, 128, 71, 69, 77, 73, 78, 73, + 86, 128, 75, 85, 90, 72, 73, 128, 75, 85, 88, 128, 75, 85, 86, 128, 75, + 85, 85, 72, 128, 75, 85, 84, 128, 75, 85, 83, 77, 65, 128, 75, 85, 83, + 72, 85, 50, 128, 75, 85, 83, 72, 85, 178, 75, 85, 82, 88, 128, 75, 85, + 82, 85, 90, 69, 73, 82, 79, 128, 75, 85, 82, 84, 128, 75, 85, 82, 79, 79, + 78, 69, 128, 75, 85, 82, 128, 75, 85, 210, 75, 85, 81, 128, 75, 85, 79, + 88, 128, 75, 85, 79, 80, 128, 75, 85, 79, 208, 75, 85, 79, 77, 128, 75, + 85, 79, 128, 75, 85, 78, 71, 128, 75, 85, 78, 68, 68, 65, 76, 73, 89, 65, + 128, 75, 85, 76, 128, 75, 85, 204, 75, 85, 71, 128, 75, 85, 69, 84, 128, + 75, 85, 66, 128, 75, 85, 65, 86, 128, 75, 85, 65, 66, 128, 75, 85, 65, + 128, 75, 85, 55, 128, 75, 85, 52, 128, 75, 85, 180, 75, 85, 51, 128, 75, + 85, 179, 75, 85, 45, 55, 128, 75, 85, 45, 54, 128, 75, 85, 45, 53, 128, + 75, 85, 45, 52, 128, 75, 85, 45, 51, 128, 75, 85, 45, 50, 128, 75, 85, + 45, 49, 128, 75, 84, 128, 75, 83, 83, 85, 85, 128, 75, 83, 83, 85, 128, + 75, 83, 83, 79, 79, 128, 75, 83, 83, 79, 128, 75, 83, 83, 73, 73, 128, + 75, 83, 83, 73, 128, 75, 83, 83, 69, 69, 128, 75, 83, 83, 69, 128, 75, + 83, 83, 65, 85, 128, 75, 83, 83, 65, 73, 128, 75, 83, 83, 65, 65, 128, + 75, 83, 83, 65, 128, 75, 83, 83, 128, 75, 83, 73, 128, 75, 82, 79, 78, + 79, 83, 128, 75, 82, 69, 77, 65, 83, 84, 73, 128, 75, 82, 65, 84, 73, 77, + 79, 89, 80, 79, 82, 82, 79, 79, 78, 128, 75, 82, 65, 84, 73, 77, 79, 75, + 79, 85, 70, 73, 83, 77, 65, 128, 75, 82, 65, 84, 73, 77, 65, 84, 65, 128, + 75, 82, 65, 84, 73, 77, 193, 75, 80, 85, 128, 75, 80, 79, 81, 128, 75, + 80, 79, 79, 128, 75, 80, 79, 128, 75, 80, 73, 128, 75, 80, 69, 85, 88, + 128, 75, 80, 69, 69, 128, 75, 80, 69, 128, 75, 80, 65, 82, 65, 81, 128, + 75, 80, 65, 78, 128, 75, 80, 65, 72, 128, 75, 80, 65, 128, 75, 80, 128, + 75, 79, 88, 128, 75, 79, 86, 85, 85, 128, 75, 79, 86, 128, 75, 79, 84, + 79, 128, 75, 79, 82, 85, 78, 65, 128, 75, 79, 82, 79, 78, 73, 83, 128, + 75, 79, 82, 69, 65, 206, 75, 79, 82, 65, 78, 73, 195, 75, 79, 81, 78, 68, + 79, 78, 128, 75, 79, 80, 80, 65, 128, 75, 79, 80, 128, 75, 79, 79, 86, + 128, 75, 79, 79, 80, 79, 128, 75, 79, 79, 77, 85, 85, 84, 128, 75, 79, + 79, 66, 128, 75, 79, 79, 128, 75, 79, 78, 84, 69, 86, 77, 65, 128, 75, + 79, 78, 84, 69, 86, 77, 193, 75, 79, 77, 201, 75, 79, 77, 66, 85, 86, 65, + 128, 75, 79, 77, 66, 85, 86, 193, 75, 79, 77, 66, 213, 75, 79, 75, 79, + 128, 75, 79, 75, 69, 128, 75, 79, 75, 128, 75, 79, 203, 75, 79, 73, 78, + 73, 128, 75, 79, 73, 128, 75, 79, 201, 75, 79, 72, 128, 75, 79, 71, 72, + 79, 77, 128, 75, 79, 69, 84, 128, 75, 79, 66, 128, 75, 79, 65, 76, 65, + 128, 75, 79, 65, 128, 75, 79, 45, 75, 73, 128, 75, 79, 45, 51, 128, 75, + 79, 45, 50, 128, 75, 79, 45, 49, 128, 75, 78, 85, 67, 75, 76, 69, 83, + 128, 75, 78, 85, 67, 75, 76, 69, 128, 75, 78, 79, 66, 83, 128, 75, 78, + 73, 71, 72, 84, 45, 82, 79, 79, 75, 128, 75, 78, 73, 71, 72, 84, 45, 81, + 85, 69, 69, 78, 128, 75, 78, 73, 71, 72, 84, 45, 66, 73, 83, 72, 79, 80, + 128, 75, 78, 73, 71, 72, 84, 128, 75, 78, 73, 71, 72, 212, 75, 78, 73, + 70, 69, 128, 75, 78, 73, 70, 197, 75, 78, 69, 69, 76, 73, 78, 199, 75, + 77, 128, 75, 205, 75, 76, 73, 84, 79, 78, 128, 75, 76, 65, 83, 77, 65, + 128, 75, 76, 65, 83, 77, 193, 75, 76, 65, 128, 75, 76, 128, 75, 75, 79, + 128, 75, 75, 73, 128, 75, 75, 69, 69, 128, 75, 75, 69, 128, 75, 75, 65, + 128, 75, 75, 128, 75, 74, 69, 128, 75, 73, 89, 69, 79, 75, 45, 84, 73, + 75, 69, 85, 84, 128, 75, 73, 89, 69, 79, 75, 45, 83, 73, 79, 83, 45, 75, + 73, 89, 69, 79, 75, 128, 75, 73, 89, 69, 79, 75, 45, 82, 73, 69, 85, 76, + 128, 75, 73, 89, 69, 79, 75, 45, 80, 73, 69, 85, 80, 128, 75, 73, 89, 69, + 79, 75, 45, 78, 73, 69, 85, 78, 128, 75, 73, 89, 69, 79, 75, 45, 75, 72, + 73, 69, 85, 75, 72, 128, 75, 73, 89, 69, 79, 75, 45, 67, 72, 73, 69, 85, + 67, 72, 128, 75, 73, 89, 69, 79, 203, 75, 73, 88, 128, 75, 73, 87, 73, + 70, 82, 85, 73, 84, 128, 75, 73, 87, 128, 75, 73, 86, 128, 75, 73, 84, + 69, 128, 75, 73, 84, 128, 75, 73, 83, 83, 73, 78, 199, 75, 73, 83, 83, + 128, 75, 73, 83, 211, 75, 73, 83, 73, 77, 53, 128, 75, 73, 83, 73, 77, + 181, 75, 73, 83, 72, 128, 75, 73, 83, 65, 76, 128, 75, 73, 82, 79, 87, + 65, 84, 84, 79, 128, 75, 73, 82, 79, 77, 69, 69, 84, 79, 82, 85, 128, 75, + 73, 82, 79, 71, 85, 82, 65, 77, 85, 128, 75, 73, 82, 79, 128, 75, 73, 82, + 71, 72, 73, 218, 75, 73, 81, 128, 75, 73, 80, 128, 75, 73, 208, 75, 73, + 78, 83, 72, 73, 80, 128, 75, 73, 78, 78, 193, 75, 73, 78, 68, 69, 82, 71, + 65, 82, 84, 69, 78, 128, 75, 73, 77, 79, 78, 79, 128, 75, 73, 76, 76, 69, + 82, 128, 75, 73, 73, 90, 72, 128, 75, 73, 73, 128, 75, 73, 72, 128, 75, + 73, 69, 88, 128, 75, 73, 69, 86, 65, 206, 75, 73, 69, 80, 128, 75, 73, + 69, 69, 77, 128, 75, 73, 69, 128, 75, 73, 68, 128, 75, 73, 196, 75, 73, + 67, 75, 128, 75, 73, 66, 128, 75, 73, 65, 86, 128, 75, 73, 65, 66, 128, + 75, 73, 45, 56, 128, 75, 73, 45, 55, 128, 75, 73, 45, 54, 128, 75, 73, + 45, 53, 128, 75, 73, 45, 52, 128, 75, 73, 45, 51, 128, 75, 73, 45, 50, + 128, 75, 73, 45, 49, 128, 75, 72, 90, 128, 75, 72, 87, 65, 73, 128, 75, + 72, 85, 69, 78, 45, 76, 85, 197, 75, 72, 85, 69, 206, 75, 72, 85, 68, 65, + 87, 65, 68, 201, 75, 72, 85, 68, 65, 77, 128, 75, 72, 85, 65, 84, 128, + 75, 72, 79, 85, 128, 75, 72, 79, 212, 75, 72, 79, 78, 78, 65, 128, 75, + 72, 79, 78, 128, 75, 72, 79, 77, 85, 84, 128, 75, 72, 79, 74, 75, 201, + 75, 72, 79, 128, 75, 72, 207, 75, 72, 77, 213, 75, 72, 73, 84, 128, 75, + 72, 73, 78, 89, 65, 128, 75, 72, 73, 69, 85, 75, 200, 75, 72, 73, 128, + 75, 72, 201, 75, 72, 72, 79, 128, 75, 72, 72, 65, 128, 75, 72, 69, 84, + 72, 128, 75, 72, 69, 73, 128, 75, 72, 69, 69, 128, 75, 72, 69, 128, 75, + 72, 65, 86, 128, 75, 72, 65, 82, 79, 83, 72, 84, 72, 201, 75, 72, 65, 82, + 128, 75, 72, 65, 80, 72, 128, 75, 72, 65, 78, 199, 75, 72, 65, 78, 68, + 193, 75, 72, 65, 77, 84, 201, 75, 72, 65, 75, 65, 83, 83, 73, 65, 206, + 75, 72, 65, 73, 128, 75, 72, 65, 72, 128, 75, 72, 65, 200, 75, 72, 65, + 66, 128, 75, 72, 65, 65, 128, 75, 71, 128, 75, 69, 89, 67, 65, 80, 128, + 75, 69, 89, 67, 65, 208, 75, 69, 89, 66, 79, 65, 82, 68, 128, 75, 69, 89, + 66, 79, 65, 82, 196, 75, 69, 88, 128, 75, 69, 86, 128, 75, 69, 85, 89, + 69, 85, 88, 128, 75, 69, 85, 83, 72, 69, 85, 65, 69, 80, 128, 75, 69, 85, + 83, 69, 85, 88, 128, 75, 69, 85, 80, 85, 81, 128, 75, 69, 85, 79, 212, + 75, 69, 85, 77, 128, 75, 69, 85, 75, 69, 85, 84, 78, 68, 65, 128, 75, 69, + 85, 75, 65, 81, 128, 75, 69, 85, 65, 69, 84, 77, 69, 85, 78, 128, 75, 69, + 85, 65, 69, 82, 73, 128, 75, 69, 84, 84, 201, 75, 69, 83, 72, 50, 128, + 75, 69, 82, 69, 84, 128, 75, 69, 79, 87, 128, 75, 69, 78, 84, 73, 77, 65, + 84, 65, 128, 75, 69, 78, 84, 73, 77, 65, 84, 193, 75, 69, 78, 84, 73, 77, + 193, 75, 69, 78, 65, 84, 128, 75, 69, 78, 128, 75, 69, 206, 75, 69, 77, + 80, 85, 76, 128, 75, 69, 77, 80, 85, 204, 75, 69, 77, 80, 76, 73, 128, + 75, 69, 77, 80, 76, 201, 75, 69, 77, 80, 72, 82, 69, 78, 71, 128, 75, 69, + 77, 66, 65, 78, 71, 128, 75, 69, 76, 86, 73, 206, 75, 69, 72, 69, 72, + 128, 75, 69, 72, 69, 200, 75, 69, 72, 128, 75, 69, 70, 85, 76, 65, 128, + 75, 69, 69, 86, 128, 75, 69, 69, 83, 85, 128, 75, 69, 69, 80, 73, 78, + 199, 75, 69, 69, 78, 71, 128, 75, 69, 69, 66, 128, 75, 69, 66, 128, 75, + 69, 65, 65, 69, 128, 75, 67, 65, 76, 128, 75, 66, 128, 75, 65, 90, 65, + 75, 200, 75, 65, 89, 65, 78, 78, 65, 128, 75, 65, 89, 65, 200, 75, 65, + 88, 128, 75, 65, 87, 86, 128, 75, 65, 87, 73, 128, 75, 65, 87, 66, 128, + 75, 65, 86, 89, 75, 65, 128, 75, 65, 86, 89, 75, 193, 75, 65, 86, 128, + 75, 65, 85, 86, 128, 75, 65, 85, 78, 65, 128, 75, 65, 85, 206, 75, 65, + 85, 66, 128, 75, 65, 84, 79, 128, 75, 65, 84, 72, 73, 83, 84, 73, 128, + 75, 65, 84, 72, 65, 75, 193, 75, 65, 84, 65, 86, 65, 83, 77, 65, 128, 75, + 65, 84, 65, 86, 193, 75, 65, 84, 65, 75, 65, 78, 65, 45, 72, 73, 82, 65, + 71, 65, 78, 193, 75, 65, 83, 82, 65, 84, 65, 78, 128, 75, 65, 83, 82, 65, + 84, 65, 206, 75, 65, 83, 82, 65, 128, 75, 65, 83, 82, 193, 75, 65, 83, + 75, 65, 76, 128, 75, 65, 83, 75, 65, 204, 75, 65, 83, 72, 77, 73, 82, + 201, 75, 65, 82, 83, 72, 65, 78, 65, 128, 75, 65, 82, 79, 82, 73, 73, + 128, 75, 65, 82, 79, 82, 65, 78, 128, 75, 65, 82, 79, 82, 128, 75, 65, + 82, 207, 75, 65, 82, 69, 206, 75, 65, 82, 65, 84, 84, 79, 128, 75, 65, + 82, 65, 78, 128, 75, 65, 80, 89, 69, 79, 85, 78, 83, 83, 65, 78, 71, 80, + 73, 69, 85, 80, 128, 75, 65, 80, 89, 69, 79, 85, 78, 82, 73, 69, 85, 76, + 128, 75, 65, 80, 89, 69, 79, 85, 78, 80, 72, 73, 69, 85, 80, 72, 128, 75, + 65, 80, 89, 69, 79, 85, 78, 77, 73, 69, 85, 77, 128, 75, 65, 80, 80, 65, + 128, 75, 65, 80, 80, 193, 75, 65, 80, 79, 128, 75, 65, 80, 72, 128, 75, + 65, 80, 65, 76, 128, 75, 65, 80, 65, 128, 75, 65, 208, 75, 65, 78, 84, + 65, 74, 193, 75, 65, 78, 78, 65, 68, 193, 75, 65, 78, 71, 65, 82, 79, 79, + 128, 75, 65, 78, 71, 128, 75, 65, 78, 199, 75, 65, 78, 65, 75, 79, 128, + 75, 65, 77, 52, 128, 75, 65, 77, 50, 128, 75, 65, 77, 128, 75, 65, 75, + 79, 128, 75, 65, 75, 65, 66, 65, 84, 128, 75, 65, 75, 128, 75, 65, 203, + 75, 65, 73, 86, 128, 75, 65, 73, 84, 72, 201, 75, 65, 73, 82, 73, 128, + 75, 65, 73, 66, 128, 75, 65, 73, 128, 75, 65, 201, 75, 65, 70, 65, 128, + 75, 65, 70, 128, 75, 65, 198, 75, 65, 68, 53, 128, 75, 65, 68, 181, 75, + 65, 68, 52, 128, 75, 65, 68, 51, 128, 75, 65, 68, 179, 75, 65, 68, 50, + 128, 75, 65, 68, 128, 75, 65, 66, 193, 75, 65, 66, 128, 75, 65, 65, 86, + 128, 75, 65, 65, 73, 128, 75, 65, 65, 70, 85, 128, 75, 65, 65, 70, 128, + 75, 65, 65, 67, 85, 128, 75, 65, 65, 66, 65, 128, 75, 65, 65, 66, 128, + 75, 65, 50, 128, 75, 65, 178, 75, 65, 45, 75, 69, 128, 75, 65, 45, 57, + 128, 75, 65, 45, 56, 128, 75, 65, 45, 55, 128, 75, 65, 45, 54, 128, 75, + 65, 45, 53, 128, 75, 65, 45, 52, 128, 75, 65, 45, 51, 128, 75, 65, 45, + 50, 128, 75, 65, 45, 49, 49, 128, 75, 65, 45, 49, 48, 128, 75, 65, 45, + 49, 128, 75, 48, 48, 56, 128, 75, 48, 48, 55, 128, 75, 48, 48, 54, 128, + 75, 48, 48, 53, 128, 75, 48, 48, 52, 128, 75, 48, 48, 51, 128, 75, 48, + 48, 50, 128, 75, 48, 48, 49, 128, 74, 87, 65, 128, 74, 85, 85, 128, 74, + 85, 84, 128, 74, 85, 83, 84, 73, 70, 73, 67, 65, 84, 73, 79, 78, 128, 74, + 85, 80, 73, 84, 69, 82, 128, 74, 85, 79, 84, 128, 74, 85, 79, 80, 128, + 74, 85, 78, 79, 128, 74, 85, 78, 71, 83, 69, 79, 78, 199, 74, 85, 78, 69, + 128, 74, 85, 76, 89, 128, 74, 85, 71, 71, 76, 73, 78, 71, 128, 74, 85, + 69, 85, 73, 128, 74, 85, 68, 85, 76, 128, 74, 85, 68, 71, 69, 128, 74, + 85, 68, 69, 79, 45, 83, 80, 65, 78, 73, 83, 200, 74, 79, 89, 83, 84, 73, + 67, 75, 128, 74, 79, 89, 79, 85, 211, 74, 79, 89, 128, 74, 79, 86, 69, + 128, 74, 79, 212, 74, 79, 78, 71, 128, 74, 79, 78, 193, 74, 79, 75, 69, + 82, 128, 74, 79, 73, 78, 84, 83, 128, 74, 79, 73, 78, 69, 68, 128, 74, + 79, 73, 78, 128, 74, 79, 65, 128, 74, 78, 89, 65, 128, 74, 74, 89, 88, + 128, 74, 74, 89, 84, 128, 74, 74, 89, 80, 128, 74, 74, 89, 128, 74, 74, + 85, 88, 128, 74, 74, 85, 84, 128, 74, 74, 85, 82, 88, 128, 74, 74, 85, + 82, 128, 74, 74, 85, 80, 128, 74, 74, 85, 79, 88, 128, 74, 74, 85, 79, + 80, 128, 74, 74, 85, 79, 128, 74, 74, 85, 128, 74, 74, 79, 88, 128, 74, + 74, 79, 84, 128, 74, 74, 79, 80, 128, 74, 74, 79, 128, 74, 74, 73, 88, + 128, 74, 74, 73, 84, 128, 74, 74, 73, 80, 128, 74, 74, 73, 69, 88, 128, + 74, 74, 73, 69, 84, 128, 74, 74, 73, 69, 80, 128, 74, 74, 73, 69, 128, + 74, 74, 73, 128, 74, 74, 69, 69, 128, 74, 74, 69, 128, 74, 74, 65, 128, + 74, 73, 76, 128, 74, 73, 73, 77, 128, 74, 73, 73, 128, 74, 73, 72, 86, + 65, 77, 85, 76, 73, 89, 65, 128, 74, 73, 71, 83, 65, 215, 74, 73, 65, + 128, 74, 72, 79, 88, 128, 74, 72, 79, 128, 74, 72, 69, 72, 128, 74, 72, + 65, 89, 73, 78, 128, 74, 72, 65, 78, 128, 74, 72, 65, 77, 128, 74, 72, + 65, 65, 128, 74, 72, 65, 128, 74, 69, 85, 128, 74, 69, 82, 85, 83, 65, + 76, 69, 77, 128, 74, 69, 82, 65, 206, 74, 69, 82, 65, 128, 74, 69, 82, + 128, 74, 69, 72, 128, 74, 69, 200, 74, 69, 71, 79, 71, 65, 78, 128, 74, + 69, 69, 77, 128, 74, 69, 69, 205, 74, 69, 65, 78, 83, 128, 74, 65, 89, + 78, 128, 74, 65, 89, 73, 78, 128, 74, 65, 89, 65, 78, 78, 65, 128, 74, + 65, 87, 128, 74, 65, 86, 73, 89, 65, 78, 73, 128, 74, 65, 86, 65, 78, 69, + 83, 197, 74, 65, 85, 128, 74, 65, 82, 128, 74, 65, 80, 65, 78, 69, 83, + 197, 74, 65, 80, 65, 78, 128, 74, 65, 78, 85, 65, 82, 89, 128, 74, 65, + 76, 76, 65, 74, 65, 76, 65, 76, 79, 85, 72, 79, 85, 128, 74, 65, 73, 206, + 74, 65, 73, 128, 74, 65, 72, 128, 74, 65, 68, 69, 128, 74, 65, 67, 75, + 83, 128, 74, 65, 67, 75, 45, 79, 45, 76, 65, 78, 84, 69, 82, 78, 128, 74, + 65, 67, 203, 74, 45, 83, 73, 77, 80, 76, 73, 70, 73, 69, 196, 73, 90, 72, + 73, 84, 83, 65, 128, 73, 90, 72, 73, 84, 83, 193, 73, 90, 72, 69, 128, + 73, 90, 65, 75, 65, 89, 193, 73, 89, 69, 75, 128, 73, 89, 65, 78, 78, 65, + 128, 73, 85, 74, 65, 128, 73, 84, 211, 73, 84, 69, 82, 65, 84, 73, 79, + 206, 73, 84, 69, 77, 128, 73, 83, 83, 72, 65, 82, 128, 73, 83, 79, 83, + 67, 69, 76, 69, 211, 73, 83, 79, 78, 128, 73, 83, 79, 206, 73, 83, 79, + 76, 65, 84, 69, 128, 73, 83, 76, 65, 78, 68, 128, 73, 83, 69, 78, 45, 73, + 83, 69, 78, 128, 73, 83, 65, 75, 73, 193, 73, 83, 45, 80, 73, 76, 76, 65, + 128, 73, 82, 85, 89, 65, 78, 78, 65, 128, 73, 82, 85, 85, 89, 65, 78, 78, + 65, 128, 73, 82, 79, 78, 45, 67, 79, 80, 80, 69, 210, 73, 82, 79, 78, + 128, 73, 82, 66, 128, 73, 79, 84, 73, 70, 73, 69, 196, 73, 79, 84, 65, + 84, 69, 196, 73, 79, 84, 65, 128, 73, 79, 84, 193, 73, 79, 82, 128, 73, + 79, 78, 71, 128, 73, 79, 68, 72, 65, 68, 72, 128, 73, 78, 86, 73, 83, 73, + 66, 76, 197, 73, 78, 86, 69, 82, 84, 69, 68, 128, 73, 78, 86, 69, 82, 84, + 69, 196, 73, 78, 86, 69, 82, 84, 69, 66, 82, 65, 84, 69, 128, 73, 78, 86, + 69, 82, 83, 197, 73, 78, 84, 82, 79, 68, 85, 67, 69, 82, 128, 73, 78, 84, + 73, 128, 73, 78, 84, 69, 82, 83, 89, 76, 76, 65, 66, 73, 195, 73, 78, 84, + 69, 82, 83, 69, 67, 84, 73, 79, 78, 128, 73, 78, 84, 69, 82, 83, 69, 67, + 84, 73, 79, 206, 73, 78, 84, 69, 82, 83, 69, 67, 84, 73, 78, 199, 73, 78, + 84, 69, 82, 82, 79, 66, 65, 78, 71, 128, 73, 78, 84, 69, 82, 82, 79, 66, + 65, 78, 199, 73, 78, 84, 69, 82, 80, 79, 76, 65, 84, 73, 79, 206, 73, 78, + 84, 69, 82, 76, 79, 67, 75, 69, 196, 73, 78, 84, 69, 82, 76, 73, 78, 69, + 65, 210, 73, 78, 84, 69, 82, 76, 65, 67, 69, 196, 73, 78, 84, 69, 82, 73, + 79, 210, 73, 78, 84, 69, 82, 69, 83, 212, 73, 78, 84, 69, 82, 67, 65, 76, + 65, 84, 69, 128, 73, 78, 84, 69, 71, 82, 65, 84, 73, 79, 78, 128, 73, 78, + 84, 69, 71, 82, 65, 84, 73, 79, 206, 73, 78, 84, 69, 71, 82, 65, 76, 128, + 73, 78, 84, 69, 71, 82, 65, 204, 73, 78, 83, 85, 76, 65, 210, 73, 78, 83, + 84, 82, 85, 77, 69, 78, 84, 65, 204, 73, 78, 83, 73, 68, 69, 128, 73, 78, + 83, 73, 68, 197, 73, 78, 83, 69, 82, 84, 73, 79, 206, 73, 78, 83, 69, 82, + 212, 73, 78, 83, 69, 67, 84, 128, 73, 78, 83, 67, 82, 73, 80, 84, 73, 79, + 78, 65, 204, 73, 78, 80, 85, 212, 73, 78, 78, 79, 67, 69, 78, 67, 69, + 128, 73, 78, 78, 78, 128, 73, 78, 78, 69, 82, 128, 73, 78, 78, 69, 210, + 73, 78, 78, 128, 73, 78, 73, 78, 71, 85, 128, 73, 78, 72, 73, 66, 73, + 212, 73, 78, 72, 69, 82, 69, 78, 212, 73, 78, 72, 65, 76, 69, 128, 73, + 78, 71, 87, 65, 90, 128, 73, 78, 70, 79, 82, 77, 65, 84, 73, 79, 206, 73, + 78, 70, 76, 85, 69, 78, 67, 69, 128, 73, 78, 70, 73, 78, 73, 84, 89, 128, + 73, 78, 70, 73, 78, 73, 84, 217, 73, 78, 68, 85, 83, 84, 82, 73, 65, 204, + 73, 78, 68, 73, 82, 69, 67, 212, 73, 78, 68, 73, 67, 84, 73, 79, 206, 73, + 78, 68, 73, 67, 65, 84, 79, 82, 128, 73, 78, 68, 73, 67, 65, 84, 79, 210, + 73, 78, 68, 73, 195, 73, 78, 68, 73, 65, 206, 73, 78, 68, 69, 88, 128, + 73, 78, 68, 69, 80, 69, 78, 68, 69, 78, 212, 73, 78, 67, 82, 69, 77, 69, + 78, 84, 128, 73, 78, 67, 82, 69, 65, 83, 69, 211, 73, 78, 67, 82, 69, 65, + 83, 69, 128, 73, 78, 67, 82, 69, 65, 83, 197, 73, 78, 67, 79, 77, 80, 76, + 69, 84, 197, 73, 78, 67, 79, 77, 73, 78, 199, 73, 78, 67, 76, 85, 68, 73, + 78, 199, 73, 78, 67, 72, 128, 73, 78, 66, 79, 216, 73, 78, 65, 80, 128, + 73, 78, 45, 65, 76, 65, 70, 128, 73, 77, 80, 69, 82, 73, 65, 204, 73, 77, + 80, 69, 82, 70, 69, 67, 84, 85, 205, 73, 77, 80, 69, 82, 70, 69, 67, 84, + 65, 128, 73, 77, 80, 69, 82, 70, 69, 67, 84, 193, 73, 77, 78, 128, 73, + 77, 73, 83, 69, 79, 211, 73, 77, 73, 78, 51, 128, 73, 77, 73, 78, 128, + 73, 77, 73, 206, 73, 77, 73, 70, 84, 72, 79, 82, 79, 78, 128, 73, 77, 73, + 70, 84, 72, 79, 82, 65, 128, 73, 77, 73, 70, 79, 78, 79, 78, 128, 73, 77, + 73, 68, 73, 65, 82, 71, 79, 78, 128, 73, 77, 65, 71, 197, 73, 76, 85, 89, + 65, 78, 78, 65, 128, 73, 76, 85, 89, 128, 73, 76, 85, 85, 89, 65, 78, 78, + 65, 128, 73, 76, 85, 84, 128, 73, 76, 73, 77, 77, 85, 52, 128, 73, 76, + 73, 77, 77, 85, 51, 128, 73, 76, 73, 77, 77, 85, 128, 73, 76, 73, 77, 77, + 213, 73, 76, 50, 128, 73, 75, 65, 82, 65, 128, 73, 75, 65, 82, 193, 73, + 74, 128, 73, 73, 89, 65, 78, 78, 65, 128, 73, 71, 73, 128, 73, 71, 201, + 73, 71, 71, 87, 83, 128, 73, 70, 73, 78, 128, 73, 69, 85, 78, 71, 45, 84, + 73, 75, 69, 85, 84, 128, 73, 69, 85, 78, 71, 45, 84, 72, 73, 69, 85, 84, + 72, 128, 73, 69, 85, 78, 71, 45, 82, 73, 69, 85, 76, 128, 73, 69, 85, 78, + 71, 45, 80, 73, 69, 85, 80, 128, 73, 69, 85, 78, 71, 45, 80, 72, 73, 69, + 85, 80, 72, 128, 73, 69, 85, 78, 71, 45, 67, 73, 69, 85, 67, 128, 73, 69, + 85, 78, 71, 45, 67, 72, 73, 69, 85, 67, 72, 128, 73, 69, 85, 78, 199, 73, + 68, 76, 69, 128, 73, 68, 73, 77, 128, 73, 68, 73, 205, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 68, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 68, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 68, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 69, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, + 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 56, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 67, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 67, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, + 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 50, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 67, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, + 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 67, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 66, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 54, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 66, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 66, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 65, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 65, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 65, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 65, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 69, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 57, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, + 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 56, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 57, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, + 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 50, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 57, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 57, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, + 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 67, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 56, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 54, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 56, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 55, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 55, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 55, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 67, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 54, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 54, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 53, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 69, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, + 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 56, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, + 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 50, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 52, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, + 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 67, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 54, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 50, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 50, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 50, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 69, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, + 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 56, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, + 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 50, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, + 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 67, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 54, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 70, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 70, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 70, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 70, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 70, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 70, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 70, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 70, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 69, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 69, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 69, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 69, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, + 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 56, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 69, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 69, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 69, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, + 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 50, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 69, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 69, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 68, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, + 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 67, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 68, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 68, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 68, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 54, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 68, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 67, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 67, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 67, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 67, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 69, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 66, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, + 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 56, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 66, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 66, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, + 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 50, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, + 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 67, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 65, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 54, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 65, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 57, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 57, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 57, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 57, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 69, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, + 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 56, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 56, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, + 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 50, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 55, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, + 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 67, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 54, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 55, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 54, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 54, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 54, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 54, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 54, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 69, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 53, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 53, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, + 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 56, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 53, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, + 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 50, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 53, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, + 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 67, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 52, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 54, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 52, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 51, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 51, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 51, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 51, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 69, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, + 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 56, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 50, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 50, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, + 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 50, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, + 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 67, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 54, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 48, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 48, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 57, 49, 52, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 57, 48, 52, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 56, 68, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 56, 67, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 56, 57, 69, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 68, 52, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 65, 55, 65, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 57, 56, 49, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 55, 54, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 55, 53, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 55, 53, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 49, 50, + 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 48, 66, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 70, 49, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 54, 69, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 54, 55, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 54, 55, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 55, 48, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 54, 50, 48, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 53, 66, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 54, 53, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 54, 53, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 54, 51, 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 51, 48, + 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 50, 57, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 50, 53, 51, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 54, 50, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 53, 70, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 53, 68, 69, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 66, 56, + 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 66, 53, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 57, 50, 57, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 53, 57, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 53, 56, 70, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 53, 53, 66, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 52, 51, + 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 52, 48, 56, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 51, 70, 51, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 53, 51, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 53, 50, 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 53, 50, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 52, + 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 49, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 49, 56, 68, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 52, 69, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 52, 69, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 52, 69, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 48, + 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 48, 48, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 67, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 65, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 65, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 65, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 65, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, + 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 54, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 52, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 51, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 65, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 65, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 65, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 65, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, + 48, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 68, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 67, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 65, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 65, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 65, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 65, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 65, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, + 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 52, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 50, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 49, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 65, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 70, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 70, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 70, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 70, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 66, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 65, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 56, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 70, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 70, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 70, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 70, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 50, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 48, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 70, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 69, 69, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 69, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 69, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 69, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 69, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 57, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 56, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 54, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 69, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 69, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 69, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 69, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 69, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 48, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 69, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 68, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 68, 67, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 68, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 68, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 68, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 68, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 55, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 54, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 52, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 68, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 68, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 69, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 67, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 66, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 67, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 67, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 67, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 53, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 52, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 50, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 67, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 66, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 67, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 65, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 57, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 66, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 66, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 66, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 51, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 50, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 48, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 65, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 65, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 65, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 56, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 55, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 65, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 65, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 49, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 48, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 69, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 57, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 57, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 56, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 54, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 53, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 57, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 57, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 57, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 70, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 69, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 67, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 56, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 56, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 54, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 52, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 51, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 55, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 55, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 68, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 67, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 65, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 55, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 55, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 52, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 50, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 49, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 54, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 54, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 54, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 54, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 66, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 65, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 56, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 54, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 54, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 50, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 48, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 70, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 53, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 53, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 53, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 57, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 56, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 54, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 53, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 53, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 48, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 69, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 68, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 52, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 52, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 55, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 54, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 52, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 52, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 52, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 69, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 67, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 66, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 51, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 51, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 51, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 53, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 52, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 50, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 51, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 50, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 50, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 67, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 65, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 57, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 50, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 50, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 50, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 51, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 50, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 48, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 49, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 65, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 56, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 55, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 49, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 48, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 69, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 56, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 54, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 53, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 48, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 70, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 69, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 67, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 70, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 70, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 70, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 70, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 70, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 54, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 52, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 51, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 70, 50, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 70, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 70, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 69, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 69, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 68, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 67, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 65, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 69, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 69, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 69, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 69, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 69, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 52, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 50, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 49, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 69, 48, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 68, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 68, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 68, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 66, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 65, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 56, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 68, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 50, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 48, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 70, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 67, 69, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 57, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 56, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 54, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 67, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 48, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 69, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 68, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 66, 67, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 66, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 55, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 54, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 52, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 69, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 67, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 66, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 65, 65, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 65, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 53, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 52, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 50, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 57, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 67, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 65, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 57, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 57, 56, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 57, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 51, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 50, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 48, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 65, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 56, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 55, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 56, 54, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 56, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 49, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 48, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 69, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 56, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 54, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 53, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 55, 52, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 70, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 69, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 67, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 54, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 54, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 52, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 51, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 54, 50, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 54, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 68, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 67, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 65, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 53, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 52, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 50, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 49, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 53, 48, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 52, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 66, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 65, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 56, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 52, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 50, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 48, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 70, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 51, 69, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 51, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 57, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 56, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 54, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 51, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 48, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 69, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 68, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 50, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 55, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 54, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 52, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 50, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 69, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 67, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 66, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 53, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 52, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 50, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 48, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 67, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 65, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 57, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 51, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 50, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 48, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 200, 73, 68, 69, 78, 84, 73, 70, 73, 67, 65, 84, 73, 79, 78, + 128, 73, 68, 69, 78, 84, 73, 67, 65, 204, 73, 67, 79, 78, 128, 73, 67, + 72, 79, 85, 128, 73, 67, 72, 79, 83, 128, 73, 67, 72, 73, 77, 65, 84, 79, + 83, 128, 73, 67, 72, 65, 68, 73, 78, 128, 73, 67, 69, 76, 65, 78, 68, 73, + 67, 45, 89, 82, 128, 73, 66, 73, 70, 73, 76, 73, 128, 73, 65, 85, 68, 65, + 128, 73, 48, 49, 53, 128, 73, 48, 49, 52, 128, 73, 48, 49, 51, 128, 73, + 48, 49, 50, 128, 73, 48, 49, 49, 65, 128, 73, 48, 49, 49, 128, 73, 48, + 49, 48, 65, 128, 73, 48, 49, 48, 128, 73, 48, 48, 57, 65, 128, 73, 48, + 48, 57, 128, 73, 48, 48, 56, 128, 73, 48, 48, 55, 128, 73, 48, 48, 54, + 128, 73, 48, 48, 53, 65, 128, 73, 48, 48, 53, 128, 73, 48, 48, 52, 128, + 73, 48, 48, 51, 128, 73, 48, 48, 50, 128, 73, 48, 48, 49, 128, 73, 45, + 89, 85, 128, 73, 45, 89, 79, 128, 73, 45, 89, 69, 79, 128, 73, 45, 89, + 69, 128, 73, 45, 89, 65, 69, 128, 73, 45, 89, 65, 45, 79, 128, 73, 45, + 89, 65, 128, 73, 45, 79, 45, 73, 128, 73, 45, 79, 128, 73, 45, 69, 85, + 128, 73, 45, 66, 69, 65, 77, 128, 73, 45, 65, 82, 65, 69, 65, 128, 73, + 45, 65, 128, 72, 90, 90, 90, 71, 128, 72, 90, 90, 90, 128, 72, 90, 90, + 80, 128, 72, 90, 90, 128, 72, 90, 87, 71, 128, 72, 90, 87, 128, 72, 90, + 84, 128, 72, 90, 71, 128, 72, 89, 83, 84, 69, 82, 69, 83, 73, 211, 72, + 89, 80, 79, 68, 73, 65, 83, 84, 79, 76, 69, 128, 72, 89, 80, 72, 69, 78, + 65, 84, 73, 79, 206, 72, 89, 80, 72, 69, 78, 45, 77, 73, 78, 85, 83, 128, + 72, 89, 80, 72, 69, 78, 128, 72, 89, 80, 72, 69, 206, 72, 89, 71, 73, 69, + 73, 65, 128, 72, 89, 71, 73, 69, 65, 128, 72, 88, 87, 71, 128, 72, 88, + 85, 79, 88, 128, 72, 88, 85, 79, 84, 128, 72, 88, 85, 79, 80, 128, 72, + 88, 85, 79, 128, 72, 88, 79, 88, 128, 72, 88, 79, 84, 128, 72, 88, 79, + 80, 128, 72, 88, 79, 128, 72, 88, 73, 88, 128, 72, 88, 73, 84, 128, 72, + 88, 73, 80, 128, 72, 88, 73, 69, 88, 128, 72, 88, 73, 69, 84, 128, 72, + 88, 73, 69, 80, 128, 72, 88, 73, 69, 128, 72, 88, 73, 128, 72, 88, 69, + 88, 128, 72, 88, 69, 80, 128, 72, 88, 69, 128, 72, 88, 65, 88, 128, 72, + 88, 65, 84, 128, 72, 88, 65, 80, 128, 72, 88, 65, 128, 72, 87, 85, 128, + 72, 87, 65, 73, 82, 128, 72, 87, 65, 72, 128, 72, 85, 86, 65, 128, 72, + 85, 83, 72, 69, 196, 72, 85, 83, 72, 128, 72, 85, 82, 65, 78, 128, 72, + 85, 79, 84, 128, 72, 85, 78, 68, 82, 69, 68, 83, 128, 72, 85, 78, 68, 82, + 69, 68, 211, 72, 85, 78, 68, 82, 69, 68, 128, 72, 85, 78, 68, 82, 69, + 196, 72, 85, 78, 128, 72, 85, 77, 208, 72, 85, 77, 65, 78, 128, 72, 85, + 77, 65, 206, 72, 85, 76, 50, 128, 72, 85, 73, 73, 84, 79, 128, 72, 85, + 71, 71, 73, 78, 199, 72, 85, 66, 50, 128, 72, 85, 66, 178, 72, 85, 66, + 128, 72, 85, 65, 82, 65, 68, 68, 79, 128, 72, 85, 65, 78, 128, 72, 85, + 45, 51, 128, 72, 85, 45, 50, 128, 72, 85, 45, 49, 128, 72, 84, 83, 128, + 72, 84, 74, 128, 72, 82, 89, 86, 78, 73, 193, 72, 80, 87, 71, 128, 72, + 80, 65, 128, 72, 80, 128, 72, 79, 85, 83, 197, 72, 79, 85, 82, 71, 76, + 65, 83, 83, 128, 72, 79, 85, 82, 71, 76, 65, 83, 211, 72, 79, 85, 82, + 128, 72, 79, 85, 210, 72, 79, 84, 69, 76, 128, 72, 79, 84, 65, 128, 72, + 79, 83, 80, 73, 84, 65, 76, 128, 72, 79, 82, 83, 69, 128, 72, 79, 82, 83, + 197, 72, 79, 82, 82, 128, 72, 79, 82, 78, 83, 128, 72, 79, 82, 73, 90, + 79, 78, 84, 65, 76, 76, 217, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, + 48, 54, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, + 54, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, + 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, + 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, + 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 49, + 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 48, 128, + 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 54, 128, 72, + 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 53, 128, 72, 79, + 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 52, 128, 72, 79, 82, + 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 51, 128, 72, 79, 82, 73, + 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 50, 128, 72, 79, 82, 73, 90, + 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, + 78, 84, 65, 76, 45, 48, 53, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, + 84, 65, 76, 45, 48, 52, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, + 65, 76, 45, 48, 52, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, + 76, 45, 48, 52, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, + 45, 48, 52, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, + 48, 52, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, + 52, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, + 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, + 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, + 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 52, + 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 51, 128, + 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 50, 128, 72, + 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 49, 128, 72, 79, + 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 48, 128, 72, 79, 82, + 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 54, 128, 72, 79, 82, 73, + 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 53, 128, 72, 79, 82, 73, 90, + 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, + 78, 84, 65, 76, 45, 48, 50, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, + 84, 65, 76, 45, 48, 50, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, + 65, 76, 45, 48, 50, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, + 76, 45, 48, 50, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, + 45, 48, 49, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, + 48, 49, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, + 49, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, + 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, + 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, + 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 48, + 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 54, 128, + 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 53, 128, 72, + 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 52, 128, 72, 79, + 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 51, 128, 72, 79, 82, + 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 50, 128, 72, 79, 82, 73, + 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 49, 128, 72, 79, 82, 73, 90, + 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, + 78, 84, 65, 76, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 204, 72, 79, 82, + 73, 128, 72, 79, 82, 193, 72, 79, 79, 85, 128, 72, 79, 79, 82, 85, 128, + 72, 79, 79, 80, 128, 72, 79, 79, 78, 128, 72, 79, 79, 75, 69, 68, 128, + 72, 79, 79, 75, 69, 196, 72, 79, 78, 69, 89, 66, 69, 69, 128, 72, 79, 78, + 69, 217, 72, 79, 77, 79, 84, 72, 69, 84, 73, 67, 128, 72, 79, 77, 79, 84, + 72, 69, 84, 73, 195, 72, 79, 76, 79, 128, 72, 79, 76, 76, 79, 215, 72, + 79, 76, 69, 128, 72, 79, 76, 68, 73, 78, 199, 72, 79, 76, 65, 77, 128, + 72, 79, 76, 65, 205, 72, 79, 75, 65, 128, 72, 79, 67, 75, 69, 217, 72, + 79, 67, 72, 79, 128, 72, 79, 45, 56, 128, 72, 79, 45, 55, 128, 72, 79, + 45, 54, 128, 72, 79, 45, 53, 128, 72, 79, 45, 52, 128, 72, 79, 45, 51, + 128, 72, 79, 45, 50, 128, 72, 79, 45, 49, 128, 72, 78, 85, 84, 128, 72, + 78, 85, 79, 88, 128, 72, 78, 85, 79, 128, 72, 78, 85, 66, 128, 72, 78, + 79, 88, 128, 72, 78, 79, 84, 128, 72, 78, 79, 80, 128, 72, 78, 73, 88, + 128, 72, 78, 73, 84, 128, 72, 78, 73, 80, 128, 72, 78, 73, 69, 88, 128, + 72, 78, 73, 69, 84, 128, 72, 78, 73, 69, 80, 128, 72, 78, 73, 69, 128, + 72, 78, 73, 128, 72, 78, 69, 88, 128, 72, 78, 69, 80, 128, 72, 78, 69, + 128, 72, 78, 65, 88, 128, 72, 78, 65, 85, 128, 72, 78, 65, 84, 128, 72, + 78, 65, 80, 128, 72, 78, 65, 128, 72, 77, 89, 88, 128, 72, 77, 89, 82, + 88, 128, 72, 77, 89, 82, 128, 72, 77, 89, 80, 128, 72, 77, 89, 128, 72, + 77, 85, 88, 128, 72, 77, 85, 84, 128, 72, 77, 85, 82, 88, 128, 72, 77, + 85, 82, 128, 72, 77, 85, 80, 128, 72, 77, 85, 79, 88, 128, 72, 77, 85, + 79, 80, 128, 72, 77, 85, 79, 128, 72, 77, 85, 128, 72, 77, 79, 88, 128, + 72, 77, 79, 84, 128, 72, 77, 79, 80, 128, 72, 77, 79, 128, 72, 77, 73, + 88, 128, 72, 77, 73, 84, 128, 72, 77, 73, 80, 128, 72, 77, 73, 69, 88, + 128, 72, 77, 73, 69, 80, 128, 72, 77, 73, 69, 128, 72, 77, 73, 128, 72, + 77, 69, 128, 72, 77, 65, 88, 128, 72, 77, 65, 84, 128, 72, 77, 65, 80, + 128, 72, 77, 65, 128, 72, 76, 89, 88, 128, 72, 76, 89, 84, 128, 72, 76, + 89, 82, 88, 128, 72, 76, 89, 82, 128, 72, 76, 89, 80, 128, 72, 76, 89, + 128, 72, 76, 85, 88, 128, 72, 76, 85, 84, 128, 72, 76, 85, 82, 88, 128, + 72, 76, 85, 82, 128, 72, 76, 85, 80, 128, 72, 76, 85, 79, 88, 128, 72, + 76, 85, 79, 80, 128, 72, 76, 85, 79, 128, 72, 76, 85, 128, 72, 76, 79, + 88, 128, 72, 76, 79, 80, 128, 72, 76, 79, 128, 72, 76, 73, 88, 128, 72, + 76, 73, 84, 128, 72, 76, 73, 80, 128, 72, 76, 73, 69, 88, 128, 72, 76, + 73, 69, 80, 128, 72, 76, 73, 69, 128, 72, 76, 73, 128, 72, 76, 69, 88, + 128, 72, 76, 69, 80, 128, 72, 76, 69, 128, 72, 76, 65, 88, 128, 72, 76, + 65, 85, 128, 72, 76, 65, 84, 128, 72, 76, 65, 80, 128, 72, 76, 65, 128, + 72, 76, 128, 72, 75, 128, 72, 73, 90, 66, 128, 72, 73, 89, 79, 128, 72, + 73, 84, 84, 73, 78, 199, 72, 73, 83, 84, 79, 82, 73, 195, 72, 73, 82, 73, + 81, 128, 72, 73, 80, 80, 79, 80, 79, 84, 65, 77, 85, 83, 128, 72, 73, 78, + 71, 69, 68, 128, 72, 73, 78, 71, 69, 196, 72, 73, 78, 71, 69, 128, 72, + 73, 78, 68, 213, 72, 73, 75, 73, 78, 199, 72, 73, 71, 72, 45, 83, 80, 69, + 69, 196, 72, 73, 71, 72, 45, 82, 69, 86, 69, 82, 83, 69, 68, 45, 185, 72, + 73, 71, 72, 45, 76, 79, 215, 72, 73, 71, 72, 45, 72, 69, 69, 76, 69, 196, + 72, 73, 69, 88, 128, 72, 73, 69, 85, 72, 45, 83, 73, 79, 83, 128, 72, 73, + 69, 85, 72, 45, 82, 73, 69, 85, 76, 128, 72, 73, 69, 85, 72, 45, 80, 73, + 69, 85, 80, 128, 72, 73, 69, 85, 72, 45, 78, 73, 69, 85, 78, 128, 72, 73, + 69, 85, 72, 45, 77, 73, 69, 85, 77, 128, 72, 73, 69, 85, 200, 72, 73, 69, + 82, 79, 71, 76, 89, 80, 72, 73, 195, 72, 73, 69, 128, 72, 73, 68, 73, 78, + 199, 72, 73, 68, 69, 84, 128, 72, 73, 68, 69, 128, 72, 73, 66, 73, 83, + 67, 85, 83, 128, 72, 73, 45, 82, 69, 83, 128, 72, 73, 45, 55, 128, 72, + 73, 45, 54, 128, 72, 73, 45, 53, 128, 72, 73, 45, 52, 128, 72, 73, 45, + 51, 128, 72, 73, 45, 50, 128, 72, 73, 45, 49, 128, 72, 72, 87, 65, 128, + 72, 72, 85, 128, 72, 72, 73, 128, 72, 72, 69, 69, 128, 72, 72, 69, 128, + 72, 72, 65, 65, 128, 72, 71, 128, 72, 69, 89, 84, 128, 72, 69, 88, 73, + 70, 79, 82, 205, 72, 69, 88, 65, 71, 82, 65, 205, 72, 69, 88, 65, 71, 79, + 78, 128, 72, 69, 82, 85, 84, 85, 128, 72, 69, 82, 85, 128, 72, 69, 82, + 77, 73, 84, 73, 65, 206, 72, 69, 82, 77, 73, 79, 78, 73, 65, 206, 72, 69, + 82, 77, 69, 83, 128, 72, 69, 82, 69, 128, 72, 69, 82, 66, 128, 72, 69, + 82, 65, 69, 85, 205, 72, 69, 78, 71, 128, 72, 69, 78, 199, 72, 69, 77, + 80, 128, 72, 69, 76, 77, 69, 84, 128, 72, 69, 76, 77, 69, 212, 72, 69, + 76, 205, 72, 69, 76, 76, 83, 67, 72, 82, 69, 73, 66, 69, 210, 72, 69, 76, + 73, 88, 128, 72, 69, 76, 73, 67, 79, 80, 84, 69, 82, 128, 72, 69, 75, 85, + 84, 65, 65, 82, 85, 128, 72, 69, 73, 83, 69, 73, 128, 72, 69, 73, 71, 72, + 84, 128, 72, 69, 69, 73, 128, 72, 69, 68, 71, 69, 72, 79, 71, 128, 72, + 69, 65, 86, 89, 128, 72, 69, 65, 86, 69, 78, 76, 217, 72, 69, 65, 86, 69, + 78, 128, 72, 69, 65, 86, 69, 206, 72, 69, 65, 82, 84, 83, 128, 72, 69, + 65, 82, 84, 45, 83, 72, 65, 80, 69, 196, 72, 69, 65, 82, 84, 128, 72, 69, + 65, 82, 212, 72, 69, 65, 82, 73, 78, 199, 72, 69, 65, 82, 45, 78, 79, 45, + 69, 86, 73, 204, 72, 69, 65, 68, 83, 84, 82, 79, 75, 69, 128, 72, 69, 65, + 68, 83, 84, 79, 78, 197, 72, 69, 65, 68, 83, 67, 65, 82, 70, 128, 72, 69, + 65, 68, 80, 72, 79, 78, 69, 128, 72, 69, 65, 68, 73, 78, 71, 128, 72, 69, + 65, 68, 45, 66, 65, 78, 68, 65, 71, 69, 128, 72, 69, 45, 55, 128, 72, 69, + 45, 54, 128, 72, 69, 45, 53, 128, 72, 69, 45, 52, 128, 72, 69, 45, 51, + 128, 72, 69, 45, 50, 128, 72, 69, 45, 49, 128, 72, 68, 82, 128, 72, 67, + 128, 72, 66, 65, 83, 65, 45, 69, 83, 65, 83, 193, 72, 66, 65, 83, 193, + 72, 65, 89, 65, 78, 78, 65, 128, 72, 65, 87, 74, 128, 72, 65, 86, 69, + 128, 72, 65, 85, 80, 84, 83, 84, 73, 77, 77, 69, 128, 72, 65, 213, 72, + 65, 84, 82, 65, 206, 72, 65, 84, 72, 73, 128, 72, 65, 84, 69, 128, 72, + 65, 84, 67, 72, 73, 78, 199, 72, 65, 84, 65, 198, 72, 65, 83, 69, 210, + 72, 65, 83, 65, 78, 84, 65, 128, 72, 65, 82, 80, 79, 79, 78, 128, 72, 65, + 82, 80, 79, 79, 206, 72, 65, 82, 77, 79, 78, 73, 67, 128, 72, 65, 82, 75, + 76, 69, 65, 206, 72, 65, 82, 68, 78, 69, 83, 83, 128, 72, 65, 82, 196, + 72, 65, 82, 66, 65, 72, 65, 89, 128, 72, 65, 80, 80, 217, 72, 65, 78, 85, + 78, 79, 207, 72, 65, 78, 73, 70, 201, 72, 65, 78, 71, 90, 72, 79, 213, + 72, 65, 78, 68, 83, 72, 65, 75, 69, 128, 72, 65, 78, 68, 83, 128, 72, 65, + 78, 68, 211, 72, 65, 78, 68, 76, 69, 83, 128, 72, 65, 78, 68, 76, 69, + 128, 72, 65, 78, 68, 66, 65, 76, 76, 128, 72, 65, 78, 68, 66, 65, 71, + 128, 72, 65, 78, 68, 45, 79, 86, 65, 76, 128, 72, 65, 78, 68, 45, 79, 86, + 65, 204, 72, 65, 78, 68, 45, 72, 79, 79, 75, 128, 72, 65, 78, 68, 45, 72, + 79, 79, 203, 72, 65, 78, 68, 45, 72, 73, 78, 71, 69, 128, 72, 65, 78, 68, + 45, 72, 73, 78, 71, 197, 72, 65, 78, 68, 45, 70, 76, 65, 84, 128, 72, 65, + 78, 68, 45, 70, 76, 65, 212, 72, 65, 78, 68, 45, 70, 73, 83, 84, 128, 72, + 65, 78, 68, 45, 67, 85, 82, 76, 73, 67, 85, 69, 128, 72, 65, 78, 68, 45, + 67, 85, 82, 76, 73, 67, 85, 197, 72, 65, 78, 68, 45, 67, 85, 80, 128, 72, + 65, 78, 68, 45, 67, 85, 208, 72, 65, 78, 68, 45, 67, 76, 65, 87, 128, 72, + 65, 78, 68, 45, 67, 76, 65, 215, 72, 65, 78, 68, 45, 67, 73, 82, 67, 76, + 69, 128, 72, 65, 78, 68, 45, 67, 73, 82, 67, 76, 197, 72, 65, 78, 68, 45, + 65, 78, 71, 76, 69, 128, 72, 65, 78, 68, 45, 65, 78, 71, 76, 197, 72, 65, + 78, 68, 128, 72, 65, 78, 45, 65, 75, 65, 84, 128, 72, 65, 77, 90, 65, + 128, 72, 65, 77, 90, 193, 72, 65, 77, 83, 84, 69, 210, 72, 65, 77, 77, + 69, 82, 128, 72, 65, 77, 77, 69, 210, 72, 65, 77, 66, 85, 82, 71, 69, 82, + 128, 72, 65, 76, 81, 65, 128, 72, 65, 76, 79, 128, 72, 65, 76, 70, 45, + 67, 73, 82, 67, 76, 197, 72, 65, 76, 70, 45, 50, 128, 72, 65, 76, 70, 45, + 49, 128, 72, 65, 76, 70, 128, 72, 65, 76, 66, 69, 82, 68, 128, 72, 65, + 76, 65, 78, 84, 65, 128, 72, 65, 73, 84, 85, 128, 72, 65, 73, 211, 72, + 65, 73, 82, 67, 85, 84, 128, 72, 65, 71, 76, 65, 218, 72, 65, 71, 76, + 128, 72, 65, 70, 85, 75, 72, 65, 128, 72, 65, 70, 85, 75, 72, 128, 72, + 65, 69, 71, 204, 72, 65, 68, 69, 83, 128, 72, 65, 65, 82, 85, 128, 72, + 65, 65, 77, 128, 72, 65, 193, 72, 65, 45, 72, 65, 128, 72, 65, 45, 57, + 128, 72, 65, 45, 56, 128, 72, 65, 45, 55, 128, 72, 65, 45, 54, 128, 72, + 65, 45, 53, 128, 72, 65, 45, 52, 128, 72, 65, 45, 51, 128, 72, 65, 45, + 50, 128, 72, 65, 45, 49, 49, 128, 72, 65, 45, 49, 48, 128, 72, 65, 45, + 49, 128, 72, 48, 48, 56, 128, 72, 48, 48, 55, 128, 72, 48, 48, 54, 65, + 128, 72, 48, 48, 54, 128, 72, 48, 48, 53, 128, 72, 48, 48, 52, 128, 72, + 48, 48, 51, 128, 72, 48, 48, 50, 128, 72, 48, 48, 49, 128, 72, 45, 84, + 89, 80, 197, 71, 89, 85, 128, 71, 89, 79, 78, 128, 71, 89, 79, 128, 71, + 89, 73, 128, 71, 89, 70, 213, 71, 89, 69, 69, 128, 71, 89, 65, 83, 128, + 71, 89, 65, 65, 128, 71, 89, 65, 128, 71, 89, 128, 71, 87, 85, 128, 71, + 87, 73, 128, 71, 87, 69, 69, 128, 71, 87, 69, 128, 71, 87, 65, 65, 128, + 71, 87, 65, 128, 71, 86, 65, 78, 71, 128, 71, 86, 128, 71, 85, 82, 85, + 83, 72, 128, 71, 85, 82, 85, 78, 128, 71, 85, 82, 77, 85, 75, 72, 201, + 71, 85, 82, 65, 77, 85, 84, 79, 78, 128, 71, 85, 82, 55, 128, 71, 85, 78, + 85, 128, 71, 85, 78, 213, 71, 85, 78, 74, 65, 76, 193, 71, 85, 205, 71, + 85, 76, 128, 71, 85, 74, 65, 82, 65, 84, 201, 71, 85, 73, 84, 65, 82, + 128, 71, 85, 73, 68, 197, 71, 85, 199, 71, 85, 69, 73, 128, 71, 85, 69, + 72, 128, 71, 85, 69, 200, 71, 85, 68, 128, 71, 85, 196, 71, 85, 65, 82, + 68, 83, 77, 65, 78, 128, 71, 85, 65, 82, 68, 69, 68, 78, 69, 83, 83, 128, + 71, 85, 65, 82, 68, 69, 196, 71, 85, 65, 82, 68, 128, 71, 85, 65, 82, 65, + 78, 201, 71, 85, 193, 71, 85, 178, 71, 84, 69, 210, 71, 83, 85, 77, 128, + 71, 83, 85, 205, 71, 82, 213, 71, 82, 79, 87, 73, 78, 199, 71, 82, 79, + 85, 78, 68, 128, 71, 82, 79, 78, 84, 72, 73, 83, 77, 65, 84, 65, 128, 71, + 82, 73, 78, 78, 73, 78, 199, 71, 82, 73, 77, 65, 67, 73, 78, 199, 71, 82, + 69, 71, 79, 82, 73, 65, 206, 71, 82, 69, 69, 78, 128, 71, 82, 69, 69, + 206, 71, 82, 69, 65, 84, 78, 69, 83, 83, 128, 71, 82, 69, 65, 84, 69, 82, + 45, 84, 72, 65, 78, 128, 71, 82, 69, 65, 84, 69, 82, 45, 84, 72, 65, 206, + 71, 82, 69, 65, 84, 69, 210, 71, 82, 69, 65, 212, 71, 82, 65, 86, 69, 89, + 65, 82, 196, 71, 82, 65, 86, 69, 45, 77, 65, 67, 82, 79, 78, 128, 71, 82, + 65, 86, 69, 45, 65, 67, 85, 84, 69, 45, 71, 82, 65, 86, 69, 128, 71, 82, + 65, 86, 197, 71, 82, 65, 84, 69, 82, 128, 71, 82, 65, 83, 83, 128, 71, + 82, 65, 83, 211, 71, 82, 65, 83, 208, 71, 82, 65, 80, 72, 69, 77, 197, + 71, 82, 65, 80, 69, 83, 128, 71, 82, 65, 78, 84, 72, 193, 71, 82, 65, 77, + 77, 193, 71, 82, 65, 73, 78, 128, 71, 82, 65, 68, 85, 65, 84, 73, 79, + 206, 71, 82, 65, 68, 85, 65, 76, 128, 71, 82, 65, 67, 69, 128, 71, 82, + 65, 67, 197, 71, 80, 65, 128, 71, 79, 82, 84, 72, 77, 73, 75, 79, 206, + 71, 79, 82, 84, 128, 71, 79, 82, 73, 76, 76, 65, 128, 71, 79, 82, 71, 79, + 84, 69, 82, 73, 128, 71, 79, 82, 71, 79, 83, 89, 78, 84, 72, 69, 84, 79, + 78, 128, 71, 79, 82, 71, 79, 206, 71, 79, 82, 71, 73, 128, 71, 79, 82, + 65, 128, 71, 79, 79, 196, 71, 79, 78, 71, 128, 71, 79, 76, 70, 69, 82, + 128, 71, 79, 76, 68, 128, 71, 79, 75, 128, 71, 79, 73, 78, 199, 71, 79, + 71, 71, 76, 69, 83, 128, 71, 79, 66, 76, 73, 78, 128, 71, 79, 65, 76, + 128, 71, 79, 65, 204, 71, 79, 65, 128, 71, 78, 89, 73, 83, 128, 71, 78, + 65, 86, 73, 89, 65, 78, 73, 128, 71, 76, 79, 87, 73, 78, 199, 71, 76, 79, + 86, 69, 83, 128, 71, 76, 79, 86, 69, 128, 71, 76, 79, 84, 84, 65, 204, + 71, 76, 79, 66, 197, 71, 76, 73, 83, 83, 65, 78, 68, 207, 71, 76, 69, 73, + 67, 200, 71, 76, 65, 71, 79, 76, 73, 128, 71, 76, 65, 128, 71, 74, 69, + 128, 71, 73, 88, 128, 71, 73, 84, 128, 71, 73, 83, 72, 128, 71, 73, 83, + 200, 71, 73, 83, 65, 76, 128, 71, 73, 82, 85, 68, 65, 65, 128, 71, 73, + 82, 76, 211, 71, 73, 82, 76, 128, 71, 73, 82, 65, 70, 70, 197, 71, 73, + 82, 51, 128, 71, 73, 82, 179, 71, 73, 82, 50, 128, 71, 73, 82, 178, 71, + 73, 80, 128, 71, 73, 78, 73, 73, 128, 71, 73, 77, 69, 76, 128, 71, 73, + 77, 69, 204, 71, 73, 77, 128, 71, 73, 71, 65, 128, 71, 73, 71, 128, 71, + 73, 70, 212, 71, 73, 69, 84, 128, 71, 73, 68, 73, 77, 128, 71, 73, 66, + 66, 79, 85, 211, 71, 73, 66, 65, 128, 71, 73, 52, 128, 71, 73, 180, 71, + 72, 90, 128, 71, 72, 87, 65, 128, 71, 72, 85, 78, 78, 65, 128, 71, 72, + 85, 78, 78, 193, 71, 72, 85, 128, 71, 72, 79, 85, 128, 71, 72, 79, 83, + 84, 128, 71, 72, 79, 128, 71, 72, 73, 77, 69, 76, 128, 71, 72, 73, 128, + 71, 72, 72, 65, 128, 71, 72, 69, 89, 83, 128, 71, 72, 69, 85, 88, 128, + 71, 72, 69, 85, 78, 128, 71, 72, 69, 85, 71, 72, 69, 85, 65, 69, 77, 128, + 71, 72, 69, 85, 71, 72, 69, 78, 128, 71, 72, 69, 85, 65, 69, 82, 65, 69, + 128, 71, 72, 69, 85, 65, 69, 71, 72, 69, 85, 65, 69, 128, 71, 72, 69, 84, + 128, 71, 72, 69, 69, 128, 71, 72, 69, 128, 71, 72, 197, 71, 72, 65, 89, + 78, 128, 71, 72, 65, 82, 65, 69, 128, 71, 72, 65, 80, 128, 71, 72, 65, + 78, 128, 71, 72, 65, 77, 77, 65, 128, 71, 72, 65, 77, 65, 76, 128, 71, + 72, 65, 73, 78, 85, 128, 71, 72, 65, 73, 78, 128, 71, 72, 65, 73, 206, + 71, 72, 65, 68, 128, 71, 72, 65, 65, 77, 65, 69, 128, 71, 72, 65, 65, + 128, 71, 71, 87, 73, 128, 71, 71, 87, 69, 69, 128, 71, 71, 87, 69, 128, + 71, 71, 87, 65, 65, 128, 71, 71, 87, 65, 128, 71, 71, 85, 88, 128, 71, + 71, 85, 84, 128, 71, 71, 85, 82, 88, 128, 71, 71, 85, 82, 128, 71, 71, + 85, 79, 88, 128, 71, 71, 85, 79, 84, 128, 71, 71, 85, 79, 80, 128, 71, + 71, 85, 79, 128, 71, 71, 79, 88, 128, 71, 71, 79, 84, 128, 71, 71, 79, + 80, 128, 71, 71, 73, 88, 128, 71, 71, 73, 84, 128, 71, 71, 73, 69, 88, + 128, 71, 71, 73, 69, 80, 128, 71, 71, 73, 69, 128, 71, 71, 69, 88, 128, + 71, 71, 69, 84, 128, 71, 71, 69, 80, 128, 71, 71, 65, 88, 128, 71, 71, + 65, 84, 128, 71, 69, 84, 193, 71, 69, 83, 84, 85, 82, 69, 128, 71, 69, + 83, 72, 85, 128, 71, 69, 83, 72, 84, 73, 78, 128, 71, 69, 83, 72, 84, 73, + 206, 71, 69, 83, 72, 50, 128, 71, 69, 82, 83, 72, 65, 89, 73, 77, 128, + 71, 69, 82, 77, 65, 206, 71, 69, 82, 69, 83, 72, 128, 71, 69, 82, 69, 83, + 200, 71, 69, 79, 77, 69, 84, 82, 73, 67, 65, 76, 76, 217, 71, 69, 79, 77, + 69, 84, 82, 73, 195, 71, 69, 78, 84, 76, 197, 71, 69, 78, 73, 84, 73, 86, + 69, 128, 71, 69, 78, 73, 75, 201, 71, 69, 78, 73, 69, 128, 71, 69, 78, + 69, 82, 73, 195, 71, 69, 78, 69, 82, 65, 76, 128, 71, 69, 77, 73, 78, 73, 128, 71, 69, 77, 73, 78, 65, 84, 73, 79, 206, 71, 69, 77, 73, 78, 65, 84, 197, 71, 69, 205, 71, 69, 69, 77, 128, 71, 69, 68, 79, 76, 65, 128, 71, 69, 68, 69, 128, 71, 69, 66, 207, 71, 69, 66, 193, 71, 69, 65, 82, 128, @@ -4033,230 +4078,234 @@ static unsigned char lexicon[] = { 128, 71, 65, 85, 78, 84, 76, 69, 84, 128, 71, 65, 84, 72, 69, 82, 73, 78, 71, 128, 71, 65, 84, 72, 69, 82, 73, 78, 199, 71, 65, 84, 69, 128, 71, 65, 83, 72, 65, 78, 128, 71, 65, 82, 83, 72, 85, 78, 73, 128, 71, 65, 82, - 79, 78, 128, 71, 65, 82, 77, 69, 78, 84, 128, 71, 65, 82, 68, 69, 78, - 128, 71, 65, 82, 51, 128, 71, 65, 80, 80, 69, 196, 71, 65, 208, 71, 65, - 78, 77, 65, 128, 71, 65, 78, 71, 73, 65, 128, 71, 65, 78, 68, 193, 71, - 65, 78, 50, 128, 71, 65, 78, 178, 71, 65, 77, 77, 65, 128, 71, 65, 77, - 76, 65, 128, 71, 65, 77, 76, 128, 71, 65, 77, 69, 128, 71, 65, 77, 197, - 71, 65, 77, 65, 78, 128, 71, 65, 77, 65, 76, 128, 71, 65, 77, 65, 204, - 71, 65, 71, 128, 71, 65, 70, 128, 71, 65, 198, 71, 65, 69, 84, 84, 65, - 45, 80, 73, 76, 76, 65, 128, 71, 65, 68, 79, 76, 128, 71, 65, 68, 128, - 71, 65, 196, 71, 65, 66, 65, 128, 71, 65, 66, 193, 71, 65, 65, 70, 85, - 128, 71, 65, 178, 71, 48, 53, 52, 128, 71, 48, 53, 51, 128, 71, 48, 53, - 50, 128, 71, 48, 53, 49, 128, 71, 48, 53, 48, 128, 71, 48, 52, 57, 128, - 71, 48, 52, 56, 128, 71, 48, 52, 55, 128, 71, 48, 52, 54, 128, 71, 48, - 52, 53, 65, 128, 71, 48, 52, 53, 128, 71, 48, 52, 52, 128, 71, 48, 52, - 51, 65, 128, 71, 48, 52, 51, 128, 71, 48, 52, 50, 128, 71, 48, 52, 49, - 128, 71, 48, 52, 48, 128, 71, 48, 51, 57, 128, 71, 48, 51, 56, 128, 71, - 48, 51, 55, 65, 128, 71, 48, 51, 55, 128, 71, 48, 51, 54, 65, 128, 71, - 48, 51, 54, 128, 71, 48, 51, 53, 128, 71, 48, 51, 52, 128, 71, 48, 51, - 51, 128, 71, 48, 51, 50, 128, 71, 48, 51, 49, 128, 71, 48, 51, 48, 128, - 71, 48, 50, 57, 128, 71, 48, 50, 56, 128, 71, 48, 50, 55, 128, 71, 48, - 50, 54, 65, 128, 71, 48, 50, 54, 128, 71, 48, 50, 53, 128, 71, 48, 50, - 52, 128, 71, 48, 50, 51, 128, 71, 48, 50, 50, 128, 71, 48, 50, 49, 128, - 71, 48, 50, 48, 65, 128, 71, 48, 50, 48, 128, 71, 48, 49, 57, 128, 71, - 48, 49, 56, 128, 71, 48, 49, 55, 128, 71, 48, 49, 54, 128, 71, 48, 49, - 53, 128, 71, 48, 49, 52, 128, 71, 48, 49, 51, 128, 71, 48, 49, 50, 128, - 71, 48, 49, 49, 65, 128, 71, 48, 49, 49, 128, 71, 48, 49, 48, 128, 71, - 48, 48, 57, 128, 71, 48, 48, 56, 128, 71, 48, 48, 55, 66, 128, 71, 48, - 48, 55, 65, 128, 71, 48, 48, 55, 128, 71, 48, 48, 54, 65, 128, 71, 48, - 48, 54, 128, 71, 48, 48, 53, 128, 71, 48, 48, 52, 128, 71, 48, 48, 51, - 128, 71, 48, 48, 50, 128, 71, 48, 48, 49, 128, 70, 89, 88, 128, 70, 89, - 84, 128, 70, 89, 80, 128, 70, 89, 65, 128, 70, 87, 73, 128, 70, 87, 69, - 69, 128, 70, 87, 69, 128, 70, 87, 65, 65, 128, 70, 87, 65, 128, 70, 86, - 83, 51, 128, 70, 86, 83, 50, 128, 70, 86, 83, 49, 128, 70, 85, 88, 128, - 70, 85, 84, 128, 70, 85, 83, 69, 128, 70, 85, 83, 193, 70, 85, 82, 88, - 128, 70, 85, 80, 128, 70, 85, 78, 69, 82, 65, 204, 70, 85, 78, 67, 84, - 73, 79, 78, 65, 204, 70, 85, 78, 67, 84, 73, 79, 78, 128, 70, 85, 76, 76, - 78, 69, 83, 83, 128, 70, 85, 76, 204, 70, 85, 74, 73, 128, 70, 85, 69, - 84, 128, 70, 85, 69, 204, 70, 85, 69, 128, 70, 85, 65, 128, 70, 84, 72, - 79, 82, 193, 70, 83, 73, 128, 70, 82, 79, 87, 78, 73, 78, 71, 128, 70, - 82, 79, 87, 78, 73, 78, 199, 70, 82, 79, 87, 78, 128, 70, 82, 79, 87, - 206, 70, 82, 79, 78, 84, 45, 84, 73, 76, 84, 69, 196, 70, 82, 79, 78, 84, - 45, 70, 65, 67, 73, 78, 199, 70, 82, 79, 78, 212, 70, 82, 79, 205, 70, - 82, 79, 71, 128, 70, 82, 79, 199, 70, 82, 73, 84, 85, 128, 70, 82, 73, - 69, 83, 128, 70, 82, 73, 69, 196, 70, 82, 73, 67, 65, 84, 73, 86, 69, - 128, 70, 82, 69, 84, 66, 79, 65, 82, 68, 128, 70, 82, 69, 78, 67, 200, - 70, 82, 69, 69, 90, 73, 78, 199, 70, 82, 69, 69, 128, 70, 82, 69, 197, - 70, 82, 65, 78, 75, 211, 70, 82, 65, 78, 195, 70, 82, 65, 77, 69, 83, - 128, 70, 82, 65, 77, 69, 128, 70, 82, 65, 77, 197, 70, 82, 65, 71, 82, - 65, 78, 84, 128, 70, 82, 65, 71, 77, 69, 78, 84, 128, 70, 82, 65, 67, 84, - 73, 79, 206, 70, 79, 88, 128, 70, 79, 216, 70, 79, 85, 82, 84, 69, 69, - 78, 128, 70, 79, 85, 82, 84, 69, 69, 206, 70, 79, 85, 82, 45, 84, 72, 73, - 82, 84, 89, 128, 70, 79, 85, 82, 45, 83, 84, 82, 73, 78, 199, 70, 79, 85, - 82, 45, 80, 69, 82, 45, 69, 205, 70, 79, 85, 82, 45, 76, 73, 78, 197, 70, - 79, 85, 210, 70, 79, 85, 78, 84, 65, 73, 78, 128, 70, 79, 85, 78, 84, 65, - 73, 206, 70, 79, 83, 84, 69, 82, 73, 78, 71, 128, 70, 79, 82, 87, 65, 82, - 68, 128, 70, 79, 82, 87, 65, 82, 196, 70, 79, 82, 84, 89, 128, 70, 79, - 82, 84, 217, 70, 79, 82, 84, 85, 78, 197, 70, 79, 82, 84, 73, 69, 84, 72, - 128, 70, 79, 82, 84, 69, 128, 70, 79, 82, 77, 211, 70, 79, 82, 77, 69, - 69, 128, 70, 79, 82, 77, 69, 197, 70, 79, 82, 77, 65, 84, 84, 73, 78, 71, - 128, 70, 79, 82, 77, 65, 212, 70, 79, 82, 75, 69, 196, 70, 79, 82, 69, - 72, 69, 65, 196, 70, 79, 82, 67, 69, 83, 128, 70, 79, 82, 67, 69, 128, - 70, 79, 80, 128, 70, 79, 79, 84, 83, 84, 79, 79, 76, 128, 70, 79, 79, 84, - 80, 82, 73, 78, 84, 83, 128, 70, 79, 79, 84, 78, 79, 84, 197, 70, 79, 79, - 84, 66, 65, 76, 76, 128, 70, 79, 79, 84, 128, 70, 79, 79, 76, 128, 70, - 79, 79, 68, 128, 70, 79, 79, 128, 70, 79, 78, 212, 70, 79, 78, 71, 77, - 65, 78, 128, 70, 79, 77, 128, 70, 79, 76, 76, 89, 128, 70, 79, 76, 76, - 79, 87, 73, 78, 71, 128, 70, 79, 76, 68, 69, 82, 128, 70, 79, 76, 68, 69, - 196, 70, 79, 71, 71, 89, 128, 70, 79, 71, 128, 70, 207, 70, 77, 128, 70, - 76, 89, 73, 78, 199, 70, 76, 89, 128, 70, 76, 85, 84, 84, 69, 82, 73, 78, - 71, 128, 70, 76, 85, 84, 84, 69, 82, 73, 78, 199, 70, 76, 85, 84, 69, - 128, 70, 76, 85, 83, 72, 69, 196, 70, 76, 79, 87, 73, 78, 199, 70, 76, - 79, 87, 69, 82, 83, 128, 70, 76, 79, 87, 69, 210, 70, 76, 79, 85, 82, 73, - 83, 72, 128, 70, 76, 79, 82, 69, 84, 84, 69, 128, 70, 76, 79, 82, 65, - 204, 70, 76, 79, 80, 80, 217, 70, 76, 79, 79, 82, 128, 70, 76, 79, 79, - 210, 70, 76, 73, 80, 128, 70, 76, 73, 71, 72, 84, 128, 70, 76, 73, 67, - 203, 70, 76, 69, 88, 85, 83, 128, 70, 76, 69, 88, 69, 196, 70, 76, 69, - 88, 128, 70, 76, 69, 85, 82, 79, 78, 128, 70, 76, 69, 85, 82, 45, 68, 69, - 45, 76, 73, 83, 128, 70, 76, 65, 84, 84, 69, 78, 69, 196, 70, 76, 65, 84, - 78, 69, 83, 83, 128, 70, 76, 65, 84, 66, 82, 69, 65, 68, 128, 70, 76, 65, - 83, 72, 128, 70, 76, 65, 77, 69, 128, 70, 76, 65, 71, 83, 128, 70, 76, - 65, 71, 45, 53, 128, 70, 76, 65, 71, 45, 52, 128, 70, 76, 65, 71, 45, 51, - 128, 70, 76, 65, 71, 45, 50, 128, 70, 76, 65, 71, 45, 49, 128, 70, 76, - 65, 71, 128, 70, 76, 65, 199, 70, 76, 65, 128, 70, 76, 128, 70, 73, 88, - 69, 68, 45, 70, 79, 82, 205, 70, 73, 88, 128, 70, 73, 86, 69, 45, 84, 72, - 73, 82, 84, 89, 128, 70, 73, 86, 69, 45, 76, 73, 78, 197, 70, 73, 86, - 197, 70, 73, 84, 90, 80, 65, 84, 82, 73, 67, 203, 70, 73, 84, 65, 128, - 70, 73, 84, 128, 70, 73, 83, 84, 69, 196, 70, 73, 83, 72, 73, 78, 199, - 70, 73, 83, 72, 72, 79, 79, 75, 128, 70, 73, 83, 72, 72, 79, 79, 203, 70, - 73, 83, 72, 69, 89, 69, 128, 70, 73, 83, 72, 128, 70, 73, 83, 200, 70, - 73, 82, 83, 212, 70, 73, 82, 73, 128, 70, 73, 82, 69, 87, 79, 82, 75, 83, - 128, 70, 73, 82, 69, 87, 79, 82, 203, 70, 73, 82, 69, 67, 82, 65, 67, 75, - 69, 82, 128, 70, 73, 82, 69, 128, 70, 73, 82, 197, 70, 73, 80, 128, 70, - 73, 78, 73, 84, 197, 70, 73, 78, 71, 69, 82, 83, 128, 70, 73, 78, 71, 69, - 82, 211, 70, 73, 78, 71, 69, 82, 78, 65, 73, 76, 83, 128, 70, 73, 78, 71, - 69, 82, 69, 196, 70, 73, 78, 71, 69, 82, 45, 80, 79, 83, 212, 70, 73, 78, - 71, 69, 82, 128, 70, 73, 78, 71, 69, 210, 70, 73, 78, 65, 78, 67, 73, 65, - 76, 128, 70, 73, 78, 65, 76, 128, 70, 73, 76, 205, 70, 73, 76, 76, 69, - 82, 45, 50, 128, 70, 73, 76, 76, 69, 82, 45, 49, 128, 70, 73, 76, 76, 69, - 82, 128, 70, 73, 76, 76, 69, 196, 70, 73, 76, 76, 128, 70, 73, 76, 204, - 70, 73, 76, 197, 70, 73, 73, 128, 70, 73, 71, 85, 82, 69, 45, 51, 128, - 70, 73, 71, 85, 82, 69, 45, 50, 128, 70, 73, 71, 85, 82, 69, 45, 49, 128, - 70, 73, 71, 85, 82, 197, 70, 73, 71, 72, 84, 128, 70, 73, 70, 84, 89, - 128, 70, 73, 70, 84, 217, 70, 73, 70, 84, 72, 83, 128, 70, 73, 70, 84, - 72, 128, 70, 73, 70, 84, 69, 69, 78, 128, 70, 73, 70, 84, 69, 69, 206, - 70, 73, 69, 76, 68, 128, 70, 73, 69, 76, 196, 70, 72, 84, 79, 82, 193, - 70, 70, 76, 128, 70, 70, 73, 128, 70, 69, 85, 88, 128, 70, 69, 85, 70, - 69, 85, 65, 69, 84, 128, 70, 69, 84, 72, 128, 70, 69, 83, 84, 73, 86, 65, - 76, 128, 70, 69, 82, 82, 89, 128, 70, 69, 82, 82, 73, 211, 70, 69, 82, - 77, 65, 84, 65, 128, 70, 69, 82, 77, 65, 84, 193, 70, 69, 79, 200, 70, - 69, 78, 199, 70, 69, 78, 67, 69, 82, 128, 70, 69, 78, 67, 69, 128, 70, - 69, 77, 73, 78, 73, 78, 197, 70, 69, 77, 65, 76, 69, 128, 70, 69, 77, 65, - 76, 197, 70, 69, 76, 76, 79, 87, 83, 72, 73, 80, 128, 70, 69, 73, 128, - 70, 69, 72, 213, 70, 69, 72, 128, 70, 69, 200, 70, 69, 69, 78, 71, 128, - 70, 69, 69, 77, 128, 70, 69, 69, 68, 128, 70, 69, 69, 196, 70, 69, 69, - 128, 70, 69, 66, 82, 85, 65, 82, 89, 128, 70, 69, 65, 84, 72, 69, 82, - 128, 70, 69, 65, 84, 72, 69, 210, 70, 69, 65, 82, 78, 128, 70, 69, 65, - 82, 70, 85, 204, 70, 69, 65, 82, 128, 70, 65, 89, 65, 78, 78, 65, 128, - 70, 65, 89, 128, 70, 65, 88, 128, 70, 65, 216, 70, 65, 84, 73, 71, 85, - 69, 128, 70, 65, 84, 72, 69, 82, 128, 70, 65, 84, 72, 69, 210, 70, 65, - 84, 72, 65, 84, 65, 78, 128, 70, 65, 84, 72, 65, 84, 65, 206, 70, 65, 84, - 72, 65, 128, 70, 65, 84, 72, 193, 70, 65, 84, 128, 70, 65, 83, 84, 128, - 70, 65, 82, 83, 201, 70, 65, 82, 128, 70, 65, 81, 128, 70, 65, 80, 128, - 70, 65, 78, 71, 128, 70, 65, 78, 69, 82, 79, 83, 73, 211, 70, 65, 78, - 128, 70, 65, 77, 73, 76, 89, 128, 70, 65, 77, 128, 70, 65, 76, 76, 69, - 206, 70, 65, 74, 128, 70, 65, 73, 82, 89, 128, 70, 65, 73, 76, 85, 82, - 69, 128, 70, 65, 73, 72, 85, 128, 70, 65, 73, 66, 128, 70, 65, 72, 82, - 69, 78, 72, 69, 73, 84, 128, 70, 65, 67, 84, 79, 82, 89, 128, 70, 65, 67, - 84, 79, 210, 70, 65, 67, 83, 73, 77, 73, 76, 197, 70, 65, 67, 73, 78, 71, - 83, 128, 70, 65, 67, 69, 45, 54, 128, 70, 65, 67, 69, 45, 53, 128, 70, - 65, 67, 69, 45, 52, 128, 70, 65, 67, 69, 45, 51, 128, 70, 65, 67, 69, 45, - 50, 128, 70, 65, 67, 69, 45, 49, 128, 70, 65, 65, 77, 65, 69, 128, 70, - 65, 65, 73, 128, 70, 65, 65, 70, 85, 128, 70, 48, 53, 51, 128, 70, 48, - 53, 50, 128, 70, 48, 53, 49, 67, 128, 70, 48, 53, 49, 66, 128, 70, 48, - 53, 49, 65, 128, 70, 48, 53, 49, 128, 70, 48, 53, 48, 128, 70, 48, 52, - 57, 128, 70, 48, 52, 56, 128, 70, 48, 52, 55, 65, 128, 70, 48, 52, 55, - 128, 70, 48, 52, 54, 65, 128, 70, 48, 52, 54, 128, 70, 48, 52, 53, 65, - 128, 70, 48, 52, 53, 128, 70, 48, 52, 52, 128, 70, 48, 52, 51, 128, 70, - 48, 52, 50, 128, 70, 48, 52, 49, 128, 70, 48, 52, 48, 128, 70, 48, 51, - 57, 128, 70, 48, 51, 56, 65, 128, 70, 48, 51, 56, 128, 70, 48, 51, 55, - 65, 128, 70, 48, 51, 55, 128, 70, 48, 51, 54, 128, 70, 48, 51, 53, 128, - 70, 48, 51, 52, 128, 70, 48, 51, 51, 128, 70, 48, 51, 50, 128, 70, 48, - 51, 49, 65, 128, 70, 48, 51, 49, 128, 70, 48, 51, 48, 128, 70, 48, 50, - 57, 128, 70, 48, 50, 56, 128, 70, 48, 50, 55, 128, 70, 48, 50, 54, 128, - 70, 48, 50, 53, 128, 70, 48, 50, 52, 128, 70, 48, 50, 51, 128, 70, 48, - 50, 50, 128, 70, 48, 50, 49, 65, 128, 70, 48, 50, 49, 128, 70, 48, 50, - 48, 128, 70, 48, 49, 57, 128, 70, 48, 49, 56, 128, 70, 48, 49, 55, 128, - 70, 48, 49, 54, 128, 70, 48, 49, 53, 128, 70, 48, 49, 52, 128, 70, 48, - 49, 51, 65, 128, 70, 48, 49, 51, 128, 70, 48, 49, 50, 128, 70, 48, 49, - 49, 128, 70, 48, 49, 48, 128, 70, 48, 48, 57, 128, 70, 48, 48, 56, 128, - 70, 48, 48, 55, 128, 70, 48, 48, 54, 128, 70, 48, 48, 53, 128, 70, 48, - 48, 52, 128, 70, 48, 48, 51, 128, 70, 48, 48, 50, 128, 70, 48, 48, 49, - 65, 128, 70, 48, 48, 49, 128, 69, 90, 83, 128, 69, 90, 200, 69, 90, 69, - 78, 128, 69, 90, 69, 206, 69, 90, 128, 69, 89, 89, 89, 128, 69, 89, 69, - 83, 128, 69, 89, 69, 211, 69, 89, 69, 76, 65, 83, 72, 69, 211, 69, 89, - 69, 71, 76, 65, 83, 83, 69, 83, 128, 69, 89, 69, 71, 65, 90, 69, 45, 87, - 65, 76, 76, 80, 76, 65, 78, 197, 69, 89, 69, 71, 65, 90, 69, 45, 70, 76, - 79, 79, 82, 80, 76, 65, 78, 197, 69, 89, 69, 66, 82, 79, 87, 211, 69, 89, - 69, 66, 82, 79, 215, 69, 89, 197, 69, 89, 66, 69, 89, 70, 73, 76, 73, - 128, 69, 89, 65, 78, 78, 65, 128, 69, 88, 84, 82, 69, 77, 69, 76, 217, - 69, 88, 84, 82, 65, 84, 69, 82, 82, 69, 83, 84, 82, 73, 65, 204, 69, 88, - 84, 82, 65, 45, 76, 79, 215, 69, 88, 84, 82, 65, 45, 72, 73, 71, 200, 69, - 88, 84, 82, 193, 69, 88, 84, 73, 78, 71, 85, 73, 83, 72, 69, 82, 128, 69, - 88, 84, 69, 78, 83, 73, 79, 78, 128, 69, 88, 84, 69, 78, 68, 69, 68, 128, - 69, 88, 84, 69, 78, 68, 69, 196, 69, 88, 80, 82, 69, 83, 83, 73, 79, 78, - 76, 69, 83, 211, 69, 88, 80, 79, 78, 69, 78, 212, 69, 88, 80, 76, 79, 68, - 73, 78, 199, 69, 88, 79, 128, 69, 88, 207, 69, 88, 73, 83, 84, 83, 128, - 69, 88, 73, 83, 84, 128, 69, 88, 72, 65, 85, 83, 84, 73, 79, 78, 128, 69, - 88, 72, 65, 76, 69, 128, 69, 88, 67, 76, 65, 77, 65, 84, 73, 79, 78, 128, - 69, 88, 67, 76, 65, 77, 65, 84, 73, 79, 206, 69, 88, 67, 73, 84, 69, 77, - 69, 78, 84, 128, 69, 88, 67, 72, 65, 78, 71, 69, 128, 69, 88, 67, 69, 83, - 83, 128, 69, 88, 67, 69, 76, 76, 69, 78, 84, 128, 69, 87, 69, 128, 69, - 86, 69, 82, 217, 69, 86, 69, 82, 71, 82, 69, 69, 206, 69, 86, 69, 78, 73, - 78, 71, 128, 69, 85, 82, 79, 80, 69, 65, 206, 69, 85, 82, 79, 80, 69, 45, - 65, 70, 82, 73, 67, 65, 128, 69, 85, 82, 79, 45, 67, 85, 82, 82, 69, 78, - 67, 217, 69, 85, 82, 207, 69, 85, 76, 69, 210, 69, 85, 45, 85, 128, 69, - 85, 45, 79, 128, 69, 85, 45, 69, 85, 128, 69, 85, 45, 69, 79, 128, 69, - 85, 45, 69, 128, 69, 85, 45, 65, 128, 69, 84, 88, 128, 69, 84, 78, 65, - 72, 84, 65, 128, 69, 84, 72, 69, 204, 69, 84, 69, 82, 79, 206, 69, 84, - 69, 82, 78, 73, 84, 89, 128, 69, 84, 69, 82, 78, 73, 84, 217, 69, 84, 66, - 128, 69, 83, 90, 128, 69, 83, 85, 75, 85, 85, 68, 79, 128, 69, 83, 84, - 73, 77, 65, 84, 69, 83, 128, 69, 83, 84, 73, 77, 65, 84, 69, 196, 69, 83, - 72, 69, 51, 128, 69, 83, 72, 50, 49, 128, 69, 83, 72, 49, 54, 128, 69, - 83, 67, 65, 80, 69, 128, 69, 83, 67, 128, 69, 83, 65, 128, 69, 83, 45, - 84, 69, 128, 69, 83, 45, 51, 128, 69, 83, 45, 50, 128, 69, 83, 45, 49, - 128, 69, 82, 82, 79, 82, 45, 66, 65, 82, 82, 69, 196, 69, 82, 82, 128, - 69, 82, 73, 211, 69, 82, 73, 78, 50, 128, 69, 82, 73, 78, 178, 69, 82, - 71, 128, 69, 82, 65, 83, 197, 69, 81, 85, 73, 86, 65, 76, 69, 78, 212, - 69, 81, 85, 73, 76, 65, 84, 69, 82, 65, 204, 69, 81, 85, 73, 68, 128, 69, - 81, 85, 73, 65, 78, 71, 85, 76, 65, 210, 69, 81, 85, 65, 76, 83, 128, 69, - 81, 85, 65, 76, 211, 69, 81, 85, 65, 76, 128, 69, 80, 83, 73, 76, 79, 78, - 128, 69, 80, 83, 73, 76, 79, 206, 69, 80, 79, 67, 72, 128, 69, 80, 73, - 71, 82, 65, 80, 72, 73, 195, 69, 80, 73, 68, 65, 85, 82, 69, 65, 206, 69, - 80, 69, 78, 84, 72, 69, 84, 73, 195, 69, 80, 69, 71, 69, 82, 77, 65, 128, - 69, 80, 65, 67, 212, 69, 79, 84, 128, 69, 79, 77, 128, 69, 79, 76, 72, - 88, 128, 69, 79, 76, 128, 69, 79, 72, 128, 69, 78, 89, 128, 69, 78, 86, - 69, 76, 79, 80, 69, 128, 69, 78, 86, 69, 76, 79, 80, 197, 69, 78, 85, 77, - 69, 82, 65, 84, 73, 79, 206, 69, 78, 84, 82, 89, 45, 50, 128, 69, 78, 84, - 82, 89, 45, 49, 128, 69, 78, 84, 82, 89, 128, 69, 78, 84, 82, 217, 69, - 78, 84, 72, 85, 83, 73, 65, 83, 77, 128, 69, 78, 84, 69, 82, 80, 82, 73, - 83, 69, 128, 69, 78, 84, 69, 82, 73, 78, 199, 69, 78, 84, 69, 82, 128, - 69, 78, 84, 69, 210, 69, 78, 84, 45, 83, 72, 65, 80, 69, 196, 69, 78, 81, - 85, 73, 82, 89, 128, 69, 78, 81, 128, 69, 78, 79, 211, 69, 78, 78, 73, - 128, 69, 78, 78, 128, 69, 78, 76, 65, 82, 71, 69, 77, 69, 78, 84, 128, - 69, 78, 71, 73, 78, 69, 128, 69, 78, 68, 79, 70, 79, 78, 79, 78, 128, 69, - 78, 68, 73, 78, 199, 69, 78, 68, 69, 80, 128, 69, 78, 68, 69, 65, 86, 79, - 85, 82, 128, 69, 78, 67, 79, 85, 78, 84, 69, 82, 83, 128, 69, 78, 67, 76, - 79, 83, 85, 82, 69, 83, 128, 69, 78, 67, 76, 79, 83, 85, 82, 69, 128, 69, - 78, 67, 76, 79, 83, 73, 78, 199, 69, 78, 67, 128, 69, 78, 65, 82, 88, 73, - 211, 69, 78, 65, 82, 77, 79, 78, 73, 79, 211, 69, 77, 80, 84, 217, 69, - 77, 80, 72, 65, 84, 73, 195, 69, 77, 80, 72, 65, 83, 73, 211, 69, 77, 79, - 74, 201, 69, 77, 66, 82, 79, 73, 68, 69, 82, 89, 128, 69, 77, 66, 76, 69, - 77, 128, 69, 77, 66, 69, 76, 76, 73, 83, 72, 77, 69, 78, 84, 128, 69, 77, - 66, 69, 68, 68, 73, 78, 71, 128, 69, 76, 89, 128, 69, 76, 84, 128, 69, - 76, 76, 73, 80, 84, 73, 195, 69, 76, 76, 73, 80, 83, 73, 83, 128, 69, 76, - 76, 73, 80, 83, 69, 128, 69, 76, 73, 70, 73, 128, 69, 76, 69, 86, 69, 78, - 45, 84, 72, 73, 82, 84, 89, 128, 69, 76, 69, 86, 69, 78, 128, 69, 76, 69, - 86, 69, 206, 69, 76, 69, 86, 65, 84, 85, 211, 69, 76, 69, 80, 72, 65, 78, - 84, 128, 69, 76, 69, 77, 69, 78, 212, 69, 76, 69, 67, 84, 82, 73, 67, 65, - 204, 69, 76, 69, 67, 84, 82, 73, 195, 69, 76, 66, 65, 83, 65, 206, 69, - 76, 65, 77, 73, 84, 69, 128, 69, 76, 65, 77, 73, 84, 197, 69, 76, 65, 70, - 82, 79, 78, 128, 69, 75, 83, 84, 82, 69, 80, 84, 79, 78, 128, 69, 75, 83, - 128, 69, 75, 70, 79, 78, 73, 84, 73, 75, 79, 78, 128, 69, 75, 65, 82, 65, - 128, 69, 75, 65, 77, 128, 69, 74, 69, 67, 212, 69, 73, 83, 128, 69, 73, - 71, 72, 84, 89, 128, 69, 73, 71, 72, 84, 217, 69, 73, 71, 72, 84, 73, 69, - 84, 72, 83, 128, 69, 73, 71, 72, 84, 72, 83, 128, 69, 73, 71, 72, 84, 72, + 79, 78, 128, 71, 65, 82, 77, 69, 78, 84, 128, 71, 65, 82, 76, 73, 67, + 128, 71, 65, 82, 68, 69, 78, 128, 71, 65, 82, 51, 128, 71, 65, 80, 80, + 69, 196, 71, 65, 208, 71, 65, 78, 77, 65, 128, 71, 65, 78, 71, 73, 65, + 128, 71, 65, 78, 68, 193, 71, 65, 78, 50, 128, 71, 65, 78, 178, 71, 65, + 77, 77, 65, 128, 71, 65, 77, 76, 65, 128, 71, 65, 77, 76, 128, 71, 65, + 77, 69, 128, 71, 65, 77, 197, 71, 65, 77, 65, 78, 128, 71, 65, 77, 65, + 76, 128, 71, 65, 77, 65, 204, 71, 65, 76, 201, 71, 65, 71, 128, 71, 65, + 70, 128, 71, 65, 198, 71, 65, 69, 84, 84, 65, 45, 80, 73, 76, 76, 65, + 128, 71, 65, 68, 79, 76, 128, 71, 65, 68, 128, 71, 65, 196, 71, 65, 66, + 65, 128, 71, 65, 66, 193, 71, 65, 65, 70, 85, 128, 71, 65, 178, 71, 48, + 53, 52, 128, 71, 48, 53, 51, 128, 71, 48, 53, 50, 128, 71, 48, 53, 49, + 128, 71, 48, 53, 48, 128, 71, 48, 52, 57, 128, 71, 48, 52, 56, 128, 71, + 48, 52, 55, 128, 71, 48, 52, 54, 128, 71, 48, 52, 53, 65, 128, 71, 48, + 52, 53, 128, 71, 48, 52, 52, 128, 71, 48, 52, 51, 65, 128, 71, 48, 52, + 51, 128, 71, 48, 52, 50, 128, 71, 48, 52, 49, 128, 71, 48, 52, 48, 128, + 71, 48, 51, 57, 128, 71, 48, 51, 56, 128, 71, 48, 51, 55, 65, 128, 71, + 48, 51, 55, 128, 71, 48, 51, 54, 65, 128, 71, 48, 51, 54, 128, 71, 48, + 51, 53, 128, 71, 48, 51, 52, 128, 71, 48, 51, 51, 128, 71, 48, 51, 50, + 128, 71, 48, 51, 49, 128, 71, 48, 51, 48, 128, 71, 48, 50, 57, 128, 71, + 48, 50, 56, 128, 71, 48, 50, 55, 128, 71, 48, 50, 54, 65, 128, 71, 48, + 50, 54, 128, 71, 48, 50, 53, 128, 71, 48, 50, 52, 128, 71, 48, 50, 51, + 128, 71, 48, 50, 50, 128, 71, 48, 50, 49, 128, 71, 48, 50, 48, 65, 128, + 71, 48, 50, 48, 128, 71, 48, 49, 57, 128, 71, 48, 49, 56, 128, 71, 48, + 49, 55, 128, 71, 48, 49, 54, 128, 71, 48, 49, 53, 128, 71, 48, 49, 52, + 128, 71, 48, 49, 51, 128, 71, 48, 49, 50, 128, 71, 48, 49, 49, 65, 128, + 71, 48, 49, 49, 128, 71, 48, 49, 48, 128, 71, 48, 48, 57, 128, 71, 48, + 48, 56, 128, 71, 48, 48, 55, 66, 128, 71, 48, 48, 55, 65, 128, 71, 48, + 48, 55, 128, 71, 48, 48, 54, 65, 128, 71, 48, 48, 54, 128, 71, 48, 48, + 53, 128, 71, 48, 48, 52, 128, 71, 48, 48, 51, 128, 71, 48, 48, 50, 128, + 71, 48, 48, 49, 128, 70, 89, 88, 128, 70, 89, 84, 128, 70, 89, 80, 128, + 70, 89, 65, 128, 70, 87, 73, 128, 70, 87, 69, 69, 128, 70, 87, 69, 128, + 70, 87, 65, 65, 128, 70, 87, 65, 128, 70, 86, 83, 51, 128, 70, 86, 83, + 50, 128, 70, 86, 83, 49, 128, 70, 85, 88, 128, 70, 85, 84, 128, 70, 85, + 83, 69, 128, 70, 85, 83, 193, 70, 85, 82, 88, 128, 70, 85, 80, 128, 70, + 85, 78, 69, 82, 65, 204, 70, 85, 78, 67, 84, 73, 79, 78, 65, 204, 70, 85, + 78, 67, 84, 73, 79, 78, 128, 70, 85, 76, 76, 78, 69, 83, 83, 128, 70, 85, + 76, 204, 70, 85, 74, 73, 128, 70, 85, 69, 84, 128, 70, 85, 69, 204, 70, + 85, 69, 128, 70, 85, 65, 128, 70, 84, 72, 79, 82, 193, 70, 83, 73, 128, + 70, 82, 79, 87, 78, 73, 78, 71, 128, 70, 82, 79, 87, 78, 73, 78, 199, 70, + 82, 79, 87, 78, 128, 70, 82, 79, 87, 206, 70, 82, 79, 78, 84, 45, 84, 73, + 76, 84, 69, 196, 70, 82, 79, 78, 84, 45, 70, 65, 67, 73, 78, 199, 70, 82, + 79, 78, 212, 70, 82, 79, 205, 70, 82, 79, 71, 128, 70, 82, 79, 199, 70, + 82, 73, 84, 85, 128, 70, 82, 73, 69, 83, 128, 70, 82, 73, 69, 196, 70, + 82, 73, 67, 65, 84, 73, 86, 69, 128, 70, 82, 69, 84, 66, 79, 65, 82, 68, + 128, 70, 82, 69, 78, 67, 200, 70, 82, 69, 69, 90, 73, 78, 199, 70, 82, + 69, 69, 128, 70, 82, 69, 197, 70, 82, 65, 78, 75, 211, 70, 82, 65, 78, + 195, 70, 82, 65, 77, 69, 83, 128, 70, 82, 65, 77, 69, 128, 70, 82, 65, + 77, 197, 70, 82, 65, 71, 82, 65, 78, 84, 128, 70, 82, 65, 71, 77, 69, 78, + 84, 128, 70, 79, 88, 128, 70, 79, 216, 70, 79, 85, 82, 84, 69, 69, 78, + 128, 70, 79, 85, 82, 84, 69, 69, 206, 70, 79, 85, 82, 45, 84, 72, 73, 82, + 84, 89, 128, 70, 79, 85, 82, 45, 83, 84, 82, 73, 78, 199, 70, 79, 85, 82, + 45, 80, 69, 82, 45, 69, 205, 70, 79, 85, 82, 45, 76, 73, 78, 197, 70, 79, + 85, 210, 70, 79, 85, 78, 84, 65, 73, 78, 128, 70, 79, 85, 78, 84, 65, 73, + 206, 70, 79, 83, 84, 69, 82, 73, 78, 71, 128, 70, 79, 82, 87, 65, 82, 68, + 128, 70, 79, 82, 87, 65, 82, 196, 70, 79, 82, 84, 89, 45, 70, 73, 86, + 197, 70, 79, 82, 84, 89, 128, 70, 79, 82, 84, 217, 70, 79, 82, 84, 85, + 78, 197, 70, 79, 82, 84, 73, 69, 84, 72, 128, 70, 79, 82, 84, 69, 128, + 70, 79, 82, 77, 211, 70, 79, 82, 77, 69, 69, 128, 70, 79, 82, 77, 69, + 197, 70, 79, 82, 77, 65, 84, 84, 73, 78, 71, 128, 70, 79, 82, 77, 65, + 212, 70, 79, 82, 75, 69, 196, 70, 79, 82, 69, 72, 69, 65, 196, 70, 79, + 82, 67, 69, 83, 128, 70, 79, 82, 67, 69, 128, 70, 79, 80, 128, 70, 79, + 79, 84, 83, 84, 79, 79, 76, 128, 70, 79, 79, 84, 80, 82, 73, 78, 84, 83, + 128, 70, 79, 79, 84, 78, 79, 84, 197, 70, 79, 79, 84, 66, 65, 76, 76, + 128, 70, 79, 79, 84, 128, 70, 79, 79, 76, 128, 70, 79, 79, 68, 128, 70, + 79, 79, 128, 70, 79, 78, 212, 70, 79, 78, 71, 77, 65, 78, 128, 70, 79, + 77, 128, 70, 79, 76, 76, 89, 128, 70, 79, 76, 76, 79, 87, 73, 78, 71, + 128, 70, 79, 76, 68, 69, 82, 128, 70, 79, 76, 68, 69, 196, 70, 79, 71, + 71, 89, 128, 70, 79, 71, 128, 70, 207, 70, 77, 128, 70, 76, 89, 73, 78, + 199, 70, 76, 89, 128, 70, 76, 85, 84, 84, 69, 82, 73, 78, 71, 128, 70, + 76, 85, 84, 84, 69, 82, 73, 78, 199, 70, 76, 85, 84, 69, 128, 70, 76, 85, + 83, 72, 69, 196, 70, 76, 79, 87, 73, 78, 199, 70, 76, 79, 87, 69, 82, 83, + 128, 70, 76, 79, 87, 69, 210, 70, 76, 79, 85, 82, 73, 83, 72, 128, 70, + 76, 79, 82, 69, 84, 84, 69, 128, 70, 76, 79, 82, 65, 204, 70, 76, 79, 80, + 80, 217, 70, 76, 79, 79, 82, 128, 70, 76, 79, 79, 210, 70, 76, 73, 80, + 128, 70, 76, 73, 71, 72, 84, 128, 70, 76, 73, 67, 203, 70, 76, 69, 88, + 85, 83, 128, 70, 76, 69, 88, 69, 196, 70, 76, 69, 88, 128, 70, 76, 69, + 85, 82, 79, 78, 128, 70, 76, 69, 85, 82, 45, 68, 69, 45, 76, 73, 83, 128, + 70, 76, 65, 84, 84, 69, 78, 69, 196, 70, 76, 65, 84, 78, 69, 83, 83, 128, + 70, 76, 65, 84, 66, 82, 69, 65, 68, 128, 70, 76, 65, 83, 72, 128, 70, 76, + 65, 77, 73, 78, 71, 79, 128, 70, 76, 65, 77, 69, 128, 70, 76, 65, 71, 83, + 128, 70, 76, 65, 71, 45, 53, 128, 70, 76, 65, 71, 45, 52, 128, 70, 76, + 65, 71, 45, 51, 128, 70, 76, 65, 71, 45, 50, 128, 70, 76, 65, 71, 45, 49, + 128, 70, 76, 65, 71, 128, 70, 76, 65, 199, 70, 76, 65, 128, 70, 76, 128, + 70, 73, 88, 69, 68, 45, 70, 79, 82, 205, 70, 73, 88, 128, 70, 73, 86, 69, + 45, 84, 72, 73, 82, 84, 89, 128, 70, 73, 86, 69, 45, 76, 73, 78, 197, 70, + 73, 84, 90, 80, 65, 84, 82, 73, 67, 203, 70, 73, 84, 65, 128, 70, 73, 84, + 128, 70, 73, 83, 84, 69, 196, 70, 73, 83, 72, 73, 78, 199, 70, 73, 83, + 72, 72, 79, 79, 75, 128, 70, 73, 83, 72, 72, 79, 79, 203, 70, 73, 83, 72, + 69, 89, 69, 128, 70, 73, 83, 72, 128, 70, 73, 83, 200, 70, 73, 82, 83, + 212, 70, 73, 82, 73, 128, 70, 73, 82, 69, 87, 79, 82, 75, 83, 128, 70, + 73, 82, 69, 87, 79, 82, 203, 70, 73, 82, 69, 67, 82, 65, 67, 75, 69, 82, + 128, 70, 73, 82, 69, 128, 70, 73, 82, 197, 70, 73, 80, 128, 70, 73, 78, + 73, 84, 197, 70, 73, 78, 71, 69, 82, 83, 128, 70, 73, 78, 71, 69, 82, + 211, 70, 73, 78, 71, 69, 82, 78, 65, 73, 76, 83, 128, 70, 73, 78, 71, 69, + 82, 69, 196, 70, 73, 78, 71, 69, 82, 45, 80, 79, 83, 212, 70, 73, 78, 71, + 69, 82, 128, 70, 73, 78, 71, 69, 210, 70, 73, 78, 65, 78, 67, 73, 65, 76, + 128, 70, 73, 78, 65, 76, 128, 70, 73, 76, 205, 70, 73, 76, 76, 69, 82, + 45, 50, 128, 70, 73, 76, 76, 69, 82, 45, 49, 128, 70, 73, 76, 76, 69, 82, + 128, 70, 73, 76, 76, 69, 196, 70, 73, 76, 76, 128, 70, 73, 76, 204, 70, + 73, 76, 197, 70, 73, 73, 128, 70, 73, 71, 85, 82, 69, 45, 51, 128, 70, + 73, 71, 85, 82, 69, 45, 50, 128, 70, 73, 71, 85, 82, 69, 45, 49, 128, 70, + 73, 71, 85, 82, 197, 70, 73, 71, 72, 84, 128, 70, 73, 70, 84, 89, 128, + 70, 73, 70, 84, 217, 70, 73, 70, 84, 72, 83, 128, 70, 73, 70, 84, 72, + 128, 70, 73, 70, 84, 69, 69, 78, 128, 70, 73, 70, 84, 69, 69, 206, 70, + 73, 69, 76, 68, 128, 70, 73, 69, 76, 196, 70, 72, 84, 79, 82, 193, 70, + 70, 76, 128, 70, 70, 73, 128, 70, 69, 85, 88, 128, 70, 69, 85, 70, 69, + 85, 65, 69, 84, 128, 70, 69, 84, 72, 128, 70, 69, 83, 84, 73, 86, 65, 76, + 128, 70, 69, 82, 82, 89, 128, 70, 69, 82, 82, 73, 211, 70, 69, 82, 77, + 65, 84, 65, 128, 70, 69, 82, 77, 65, 84, 193, 70, 69, 79, 200, 70, 69, + 78, 199, 70, 69, 78, 67, 69, 82, 128, 70, 69, 78, 67, 69, 128, 70, 69, + 77, 73, 78, 73, 78, 197, 70, 69, 77, 65, 76, 69, 128, 70, 69, 77, 65, 76, + 197, 70, 69, 76, 76, 79, 87, 83, 72, 73, 80, 128, 70, 69, 73, 128, 70, + 69, 72, 213, 70, 69, 72, 128, 70, 69, 200, 70, 69, 69, 78, 71, 128, 70, + 69, 69, 77, 128, 70, 69, 69, 68, 128, 70, 69, 69, 196, 70, 69, 69, 128, + 70, 69, 66, 82, 85, 65, 82, 89, 128, 70, 69, 65, 84, 72, 69, 82, 128, 70, + 69, 65, 84, 72, 69, 210, 70, 69, 65, 82, 78, 128, 70, 69, 65, 82, 70, 85, + 204, 70, 69, 65, 82, 128, 70, 65, 89, 65, 78, 78, 65, 128, 70, 65, 89, + 128, 70, 65, 88, 128, 70, 65, 216, 70, 65, 84, 73, 71, 85, 69, 128, 70, + 65, 84, 72, 69, 82, 128, 70, 65, 84, 72, 69, 210, 70, 65, 84, 72, 65, 84, + 65, 78, 128, 70, 65, 84, 72, 65, 84, 65, 206, 70, 65, 84, 72, 65, 128, + 70, 65, 84, 72, 193, 70, 65, 84, 128, 70, 65, 83, 84, 128, 70, 65, 82, + 83, 201, 70, 65, 82, 128, 70, 65, 81, 128, 70, 65, 80, 128, 70, 65, 78, + 71, 128, 70, 65, 78, 69, 82, 79, 83, 73, 211, 70, 65, 78, 128, 70, 65, + 77, 73, 76, 89, 128, 70, 65, 77, 128, 70, 65, 76, 76, 69, 206, 70, 65, + 76, 65, 70, 69, 76, 128, 70, 65, 74, 128, 70, 65, 73, 82, 89, 128, 70, + 65, 73, 76, 85, 82, 69, 128, 70, 65, 73, 72, 85, 128, 70, 65, 73, 66, + 128, 70, 65, 72, 82, 69, 78, 72, 69, 73, 84, 128, 70, 65, 67, 84, 79, 82, + 89, 128, 70, 65, 67, 84, 79, 210, 70, 65, 67, 83, 73, 77, 73, 76, 197, + 70, 65, 67, 73, 78, 71, 83, 128, 70, 65, 67, 69, 45, 54, 128, 70, 65, 67, + 69, 45, 53, 128, 70, 65, 67, 69, 45, 52, 128, 70, 65, 67, 69, 45, 51, + 128, 70, 65, 67, 69, 45, 50, 128, 70, 65, 67, 69, 45, 49, 128, 70, 65, + 65, 77, 65, 69, 128, 70, 65, 65, 73, 128, 70, 65, 65, 70, 85, 128, 70, + 48, 53, 51, 128, 70, 48, 53, 50, 128, 70, 48, 53, 49, 67, 128, 70, 48, + 53, 49, 66, 128, 70, 48, 53, 49, 65, 128, 70, 48, 53, 49, 128, 70, 48, + 53, 48, 128, 70, 48, 52, 57, 128, 70, 48, 52, 56, 128, 70, 48, 52, 55, + 65, 128, 70, 48, 52, 55, 128, 70, 48, 52, 54, 65, 128, 70, 48, 52, 54, + 128, 70, 48, 52, 53, 65, 128, 70, 48, 52, 53, 128, 70, 48, 52, 52, 128, + 70, 48, 52, 51, 128, 70, 48, 52, 50, 128, 70, 48, 52, 49, 128, 70, 48, + 52, 48, 128, 70, 48, 51, 57, 128, 70, 48, 51, 56, 65, 128, 70, 48, 51, + 56, 128, 70, 48, 51, 55, 65, 128, 70, 48, 51, 55, 128, 70, 48, 51, 54, + 128, 70, 48, 51, 53, 128, 70, 48, 51, 52, 128, 70, 48, 51, 51, 128, 70, + 48, 51, 50, 128, 70, 48, 51, 49, 65, 128, 70, 48, 51, 49, 128, 70, 48, + 51, 48, 128, 70, 48, 50, 57, 128, 70, 48, 50, 56, 128, 70, 48, 50, 55, + 128, 70, 48, 50, 54, 128, 70, 48, 50, 53, 128, 70, 48, 50, 52, 128, 70, + 48, 50, 51, 128, 70, 48, 50, 50, 128, 70, 48, 50, 49, 65, 128, 70, 48, + 50, 49, 128, 70, 48, 50, 48, 128, 70, 48, 49, 57, 128, 70, 48, 49, 56, + 128, 70, 48, 49, 55, 128, 70, 48, 49, 54, 128, 70, 48, 49, 53, 128, 70, + 48, 49, 52, 128, 70, 48, 49, 51, 65, 128, 70, 48, 49, 51, 128, 70, 48, + 49, 50, 128, 70, 48, 49, 49, 128, 70, 48, 49, 48, 128, 70, 48, 48, 57, + 128, 70, 48, 48, 56, 128, 70, 48, 48, 55, 128, 70, 48, 48, 54, 128, 70, + 48, 48, 53, 128, 70, 48, 48, 52, 128, 70, 48, 48, 51, 128, 70, 48, 48, + 50, 128, 70, 48, 48, 49, 65, 128, 70, 48, 48, 49, 128, 69, 90, 83, 128, + 69, 90, 200, 69, 90, 69, 78, 128, 69, 90, 69, 206, 69, 90, 128, 69, 89, + 89, 89, 128, 69, 89, 69, 83, 128, 69, 89, 69, 211, 69, 89, 69, 76, 65, + 83, 72, 69, 211, 69, 89, 69, 71, 76, 65, 83, 83, 69, 83, 128, 69, 89, 69, + 71, 65, 90, 69, 45, 87, 65, 76, 76, 80, 76, 65, 78, 197, 69, 89, 69, 71, + 65, 90, 69, 45, 70, 76, 79, 79, 82, 80, 76, 65, 78, 197, 69, 89, 69, 66, + 82, 79, 87, 211, 69, 89, 69, 66, 82, 79, 215, 69, 89, 197, 69, 89, 66, + 69, 89, 70, 73, 76, 73, 128, 69, 89, 65, 78, 78, 65, 128, 69, 88, 84, 82, + 69, 77, 69, 76, 217, 69, 88, 84, 82, 65, 84, 69, 82, 82, 69, 83, 84, 82, + 73, 65, 204, 69, 88, 84, 82, 65, 45, 76, 79, 215, 69, 88, 84, 82, 65, 45, + 72, 73, 71, 200, 69, 88, 84, 82, 193, 69, 88, 84, 73, 78, 71, 85, 73, 83, + 72, 69, 82, 128, 69, 88, 84, 69, 78, 83, 73, 79, 78, 128, 69, 88, 84, 69, + 78, 68, 69, 68, 128, 69, 88, 84, 69, 78, 68, 69, 196, 69, 88, 80, 82, 69, + 83, 83, 73, 79, 78, 76, 69, 83, 211, 69, 88, 80, 79, 78, 69, 78, 212, 69, + 88, 80, 76, 79, 68, 73, 78, 199, 69, 88, 79, 128, 69, 88, 207, 69, 88, + 73, 83, 84, 83, 128, 69, 88, 73, 83, 84, 128, 69, 88, 72, 65, 85, 83, 84, + 73, 79, 78, 128, 69, 88, 72, 65, 76, 69, 128, 69, 88, 67, 76, 65, 77, 65, + 84, 73, 79, 78, 128, 69, 88, 67, 76, 65, 77, 65, 84, 73, 79, 206, 69, 88, + 67, 73, 84, 69, 77, 69, 78, 84, 128, 69, 88, 67, 72, 65, 78, 71, 69, 128, + 69, 88, 67, 69, 83, 83, 128, 69, 88, 67, 69, 76, 76, 69, 78, 84, 128, 69, + 87, 69, 128, 69, 86, 69, 82, 217, 69, 86, 69, 82, 71, 82, 69, 69, 206, + 69, 86, 69, 78, 73, 78, 71, 128, 69, 85, 82, 79, 80, 69, 65, 206, 69, 85, + 82, 79, 80, 69, 45, 65, 70, 82, 73, 67, 65, 128, 69, 85, 82, 79, 45, 67, + 85, 82, 82, 69, 78, 67, 217, 69, 85, 82, 207, 69, 85, 76, 69, 210, 69, + 85, 45, 85, 128, 69, 85, 45, 79, 128, 69, 85, 45, 69, 85, 128, 69, 85, + 45, 69, 79, 128, 69, 85, 45, 69, 128, 69, 85, 45, 65, 128, 69, 84, 88, + 128, 69, 84, 78, 65, 72, 84, 65, 128, 69, 84, 72, 69, 204, 69, 84, 69, + 82, 79, 206, 69, 84, 69, 82, 78, 73, 84, 89, 128, 69, 84, 69, 82, 78, 73, + 84, 217, 69, 84, 66, 128, 69, 83, 90, 128, 69, 83, 85, 75, 85, 85, 68, + 79, 128, 69, 83, 84, 73, 77, 65, 84, 69, 83, 128, 69, 83, 84, 73, 77, 65, + 84, 69, 196, 69, 83, 72, 69, 51, 128, 69, 83, 72, 50, 49, 128, 69, 83, + 72, 49, 54, 128, 69, 83, 67, 65, 80, 69, 128, 69, 83, 67, 128, 69, 83, + 65, 128, 69, 83, 45, 84, 69, 128, 69, 83, 45, 51, 128, 69, 83, 45, 50, + 128, 69, 83, 45, 49, 128, 69, 82, 82, 79, 82, 45, 66, 65, 82, 82, 69, + 196, 69, 82, 82, 128, 69, 82, 73, 211, 69, 82, 73, 78, 50, 128, 69, 82, + 73, 78, 178, 69, 82, 71, 128, 69, 82, 65, 83, 197, 69, 81, 85, 73, 86, + 65, 76, 69, 78, 212, 69, 81, 85, 73, 76, 65, 84, 69, 82, 65, 204, 69, 81, + 85, 73, 72, 79, 80, 80, 69, 82, 128, 69, 81, 85, 73, 72, 79, 80, 80, 69, + 210, 69, 81, 85, 73, 68, 128, 69, 81, 85, 73, 65, 78, 71, 85, 76, 65, + 210, 69, 81, 85, 65, 76, 83, 128, 69, 81, 85, 65, 76, 211, 69, 81, 85, + 65, 76, 128, 69, 80, 83, 73, 76, 79, 78, 128, 69, 80, 83, 73, 76, 79, + 206, 69, 80, 79, 67, 72, 128, 69, 80, 73, 71, 82, 65, 80, 72, 73, 195, + 69, 80, 73, 68, 65, 85, 82, 69, 65, 206, 69, 80, 69, 78, 84, 72, 69, 84, + 73, 195, 69, 80, 69, 71, 69, 82, 77, 65, 128, 69, 80, 65, 67, 212, 69, + 79, 84, 128, 69, 79, 77, 128, 69, 79, 76, 72, 88, 128, 69, 79, 76, 128, + 69, 79, 72, 128, 69, 78, 89, 128, 69, 78, 86, 69, 76, 79, 80, 69, 128, + 69, 78, 86, 69, 76, 79, 80, 197, 69, 78, 85, 77, 69, 82, 65, 84, 73, 79, + 206, 69, 78, 84, 82, 89, 45, 50, 128, 69, 78, 84, 82, 89, 45, 49, 128, + 69, 78, 84, 82, 89, 128, 69, 78, 84, 82, 217, 69, 78, 84, 72, 85, 83, 73, + 65, 83, 77, 128, 69, 78, 84, 69, 82, 80, 82, 73, 83, 69, 128, 69, 78, 84, + 69, 82, 73, 78, 199, 69, 78, 84, 69, 82, 128, 69, 78, 84, 69, 210, 69, + 78, 84, 45, 83, 72, 65, 80, 69, 196, 69, 78, 81, 85, 73, 82, 89, 128, 69, + 78, 81, 128, 69, 78, 79, 211, 69, 78, 78, 73, 128, 69, 78, 78, 128, 69, + 78, 76, 65, 82, 71, 69, 77, 69, 78, 84, 128, 69, 78, 71, 73, 78, 69, 128, + 69, 78, 68, 79, 70, 79, 78, 79, 78, 128, 69, 78, 68, 73, 78, 199, 69, 78, + 68, 69, 80, 128, 69, 78, 68, 69, 65, 86, 79, 85, 82, 128, 69, 78, 67, 79, + 85, 78, 84, 69, 82, 83, 128, 69, 78, 67, 76, 79, 83, 85, 82, 69, 83, 128, + 69, 78, 67, 76, 79, 83, 85, 82, 69, 128, 69, 78, 67, 76, 79, 83, 73, 78, + 199, 69, 78, 67, 128, 69, 78, 65, 82, 88, 73, 211, 69, 78, 65, 82, 77, + 79, 78, 73, 79, 211, 69, 77, 80, 84, 217, 69, 77, 80, 72, 65, 84, 73, + 195, 69, 77, 80, 72, 65, 83, 73, 211, 69, 77, 79, 74, 201, 69, 77, 66, + 82, 79, 73, 68, 69, 82, 89, 128, 69, 77, 66, 76, 69, 77, 128, 69, 77, 66, + 69, 76, 76, 73, 83, 72, 77, 69, 78, 84, 128, 69, 77, 66, 69, 68, 68, 73, + 78, 71, 128, 69, 76, 89, 77, 65, 73, 195, 69, 76, 89, 128, 69, 76, 84, + 128, 69, 76, 76, 73, 80, 84, 73, 195, 69, 76, 76, 73, 80, 83, 73, 83, + 128, 69, 76, 76, 73, 80, 83, 69, 128, 69, 76, 73, 70, 73, 128, 69, 76, + 69, 86, 69, 78, 45, 84, 72, 73, 82, 84, 89, 128, 69, 76, 69, 86, 69, 78, + 128, 69, 76, 69, 86, 69, 206, 69, 76, 69, 86, 65, 84, 85, 211, 69, 76, + 69, 80, 72, 65, 78, 84, 128, 69, 76, 69, 77, 69, 78, 212, 69, 76, 69, 67, + 84, 82, 73, 67, 65, 204, 69, 76, 69, 67, 84, 82, 73, 195, 69, 76, 66, 65, + 83, 65, 206, 69, 76, 65, 77, 73, 84, 69, 128, 69, 76, 65, 77, 73, 84, + 197, 69, 76, 65, 70, 82, 79, 78, 128, 69, 75, 83, 84, 82, 69, 80, 84, 79, + 78, 128, 69, 75, 83, 128, 69, 75, 70, 79, 78, 73, 84, 73, 75, 79, 78, + 128, 69, 75, 65, 82, 65, 128, 69, 75, 65, 77, 128, 69, 74, 69, 67, 212, + 69, 73, 83, 128, 69, 73, 71, 72, 84, 89, 128, 69, 73, 71, 72, 84, 217, + 69, 73, 71, 72, 84, 73, 69, 84, 72, 83, 128, 69, 73, 71, 72, 84, 73, 69, + 84, 72, 128, 69, 73, 71, 72, 84, 72, 83, 128, 69, 73, 71, 72, 84, 72, 211, 69, 73, 71, 72, 84, 72, 128, 69, 73, 71, 72, 84, 69, 69, 78, 128, 69, 73, 71, 72, 84, 69, 69, 206, 69, 73, 71, 72, 84, 45, 84, 72, 73, 82, 84, 89, 128, 69, 73, 69, 128, 69, 72, 87, 65, 218, 69, 72, 84, 83, 65, @@ -4285,1060 +4334,1063 @@ static unsigned char lexicon[] = { 128, 69, 48, 48, 55, 128, 69, 48, 48, 54, 128, 69, 48, 48, 53, 128, 69, 48, 48, 52, 128, 69, 48, 48, 51, 128, 69, 48, 48, 50, 128, 69, 48, 48, 49, 128, 69, 45, 77, 65, 73, 204, 68, 90, 90, 72, 69, 128, 68, 90, 90, - 69, 128, 68, 90, 90, 65, 128, 68, 90, 89, 65, 89, 128, 68, 90, 87, 69, - 128, 68, 90, 85, 128, 68, 90, 79, 128, 68, 90, 74, 69, 128, 68, 90, 73, - 84, 65, 128, 68, 90, 73, 128, 68, 90, 72, 79, 73, 128, 68, 90, 72, 69, - 128, 68, 90, 72, 65, 128, 68, 90, 69, 76, 79, 128, 68, 90, 69, 69, 128, - 68, 90, 69, 128, 68, 90, 65, 89, 128, 68, 90, 65, 65, 128, 68, 90, 65, - 128, 68, 90, 128, 68, 218, 68, 89, 79, 128, 68, 89, 207, 68, 89, 78, 65, - 77, 73, 195, 68, 89, 69, 72, 128, 68, 89, 69, 200, 68, 89, 65, 78, 128, - 68, 87, 79, 128, 68, 87, 69, 128, 68, 87, 65, 128, 68, 86, 73, 83, 86, - 65, 82, 65, 128, 68, 86, 68, 128, 68, 86, 128, 68, 85, 84, 73, 69, 83, - 128, 68, 85, 83, 75, 128, 68, 85, 83, 72, 69, 78, 78, 65, 128, 68, 85, - 82, 65, 84, 73, 79, 78, 128, 68, 85, 82, 50, 128, 68, 85, 80, 79, 78, 68, - 73, 85, 211, 68, 85, 79, 88, 128, 68, 85, 79, 128, 68, 85, 78, 52, 128, - 68, 85, 78, 51, 128, 68, 85, 78, 179, 68, 85, 77, 80, 76, 73, 78, 71, - 128, 68, 85, 77, 128, 68, 85, 204, 68, 85, 72, 128, 68, 85, 71, 85, 68, - 128, 68, 85, 199, 68, 85, 67, 75, 128, 68, 85, 66, 50, 128, 68, 85, 66, - 128, 68, 85, 194, 68, 82, 89, 128, 68, 82, 217, 68, 82, 85, 77, 83, 84, - 73, 67, 75, 83, 128, 68, 82, 85, 77, 128, 68, 82, 85, 205, 68, 82, 79, - 80, 83, 128, 68, 82, 79, 80, 76, 69, 84, 128, 68, 82, 79, 80, 45, 83, 72, - 65, 68, 79, 87, 69, 196, 68, 82, 79, 79, 76, 73, 78, 199, 68, 82, 79, 77, - 69, 68, 65, 82, 217, 68, 82, 73, 86, 69, 128, 68, 82, 73, 86, 197, 68, - 82, 73, 78, 75, 128, 68, 82, 73, 204, 68, 82, 69, 83, 83, 128, 68, 82, - 69, 65, 77, 217, 68, 82, 65, 85, 71, 72, 84, 211, 68, 82, 65, 77, 128, - 68, 82, 65, 205, 68, 82, 65, 71, 79, 78, 128, 68, 82, 65, 71, 79, 206, - 68, 82, 65, 70, 84, 73, 78, 199, 68, 82, 65, 67, 72, 77, 65, 83, 128, 68, - 82, 65, 67, 72, 77, 65, 128, 68, 82, 65, 67, 72, 77, 193, 68, 79, 87, 78, - 87, 65, 82, 68, 83, 128, 68, 79, 87, 78, 87, 65, 82, 68, 211, 68, 79, 87, - 78, 87, 65, 82, 196, 68, 79, 87, 78, 45, 80, 79, 73, 78, 84, 73, 78, 199, - 68, 79, 87, 78, 128, 68, 79, 86, 69, 128, 68, 79, 86, 197, 68, 79, 85, - 71, 72, 78, 85, 84, 128, 68, 79, 85, 66, 84, 128, 68, 79, 85, 66, 76, 69, - 196, 68, 79, 85, 66, 76, 69, 45, 76, 73, 78, 69, 196, 68, 79, 85, 66, 76, - 69, 45, 76, 73, 78, 197, 68, 79, 85, 66, 76, 69, 45, 69, 78, 68, 69, 196, - 68, 79, 85, 66, 76, 69, 128, 68, 79, 84, 84, 69, 68, 45, 80, 128, 68, 79, - 84, 84, 69, 68, 45, 78, 128, 68, 79, 84, 84, 69, 68, 45, 76, 128, 68, 79, - 84, 84, 69, 68, 128, 68, 79, 84, 84, 69, 196, 68, 79, 84, 83, 45, 56, - 128, 68, 79, 84, 83, 45, 55, 56, 128, 68, 79, 84, 83, 45, 55, 128, 68, - 79, 84, 83, 45, 54, 56, 128, 68, 79, 84, 83, 45, 54, 55, 56, 128, 68, 79, - 84, 83, 45, 54, 55, 128, 68, 79, 84, 83, 45, 54, 128, 68, 79, 84, 83, 45, - 53, 56, 128, 68, 79, 84, 83, 45, 53, 55, 56, 128, 68, 79, 84, 83, 45, 53, - 55, 128, 68, 79, 84, 83, 45, 53, 54, 56, 128, 68, 79, 84, 83, 45, 53, 54, - 55, 56, 128, 68, 79, 84, 83, 45, 53, 54, 55, 128, 68, 79, 84, 83, 45, 53, - 54, 128, 68, 79, 84, 83, 45, 53, 128, 68, 79, 84, 83, 45, 52, 56, 128, - 68, 79, 84, 83, 45, 52, 55, 56, 128, 68, 79, 84, 83, 45, 52, 55, 128, 68, - 79, 84, 83, 45, 52, 54, 56, 128, 68, 79, 84, 83, 45, 52, 54, 55, 56, 128, - 68, 79, 84, 83, 45, 52, 54, 55, 128, 68, 79, 84, 83, 45, 52, 54, 128, 68, - 79, 84, 83, 45, 52, 53, 56, 128, 68, 79, 84, 83, 45, 52, 53, 55, 56, 128, - 68, 79, 84, 83, 45, 52, 53, 55, 128, 68, 79, 84, 83, 45, 52, 53, 54, 56, - 128, 68, 79, 84, 83, 45, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 52, - 53, 54, 55, 128, 68, 79, 84, 83, 45, 52, 53, 54, 128, 68, 79, 84, 83, 45, - 52, 53, 128, 68, 79, 84, 83, 45, 52, 128, 68, 79, 84, 83, 45, 51, 56, - 128, 68, 79, 84, 83, 45, 51, 55, 56, 128, 68, 79, 84, 83, 45, 51, 55, - 128, 68, 79, 84, 83, 45, 51, 54, 56, 128, 68, 79, 84, 83, 45, 51, 54, 55, - 56, 128, 68, 79, 84, 83, 45, 51, 54, 55, 128, 68, 79, 84, 83, 45, 51, 54, - 128, 68, 79, 84, 83, 45, 51, 53, 56, 128, 68, 79, 84, 83, 45, 51, 53, 55, - 56, 128, 68, 79, 84, 83, 45, 51, 53, 55, 128, 68, 79, 84, 83, 45, 51, 53, - 54, 56, 128, 68, 79, 84, 83, 45, 51, 53, 54, 55, 56, 128, 68, 79, 84, 83, - 45, 51, 53, 54, 55, 128, 68, 79, 84, 83, 45, 51, 53, 54, 128, 68, 79, 84, - 83, 45, 51, 53, 128, 68, 79, 84, 83, 45, 51, 52, 56, 128, 68, 79, 84, 83, - 45, 51, 52, 55, 56, 128, 68, 79, 84, 83, 45, 51, 52, 55, 128, 68, 79, 84, - 83, 45, 51, 52, 54, 56, 128, 68, 79, 84, 83, 45, 51, 52, 54, 55, 56, 128, - 68, 79, 84, 83, 45, 51, 52, 54, 55, 128, 68, 79, 84, 83, 45, 51, 52, 54, - 128, 68, 79, 84, 83, 45, 51, 52, 53, 56, 128, 68, 79, 84, 83, 45, 51, 52, - 53, 55, 56, 128, 68, 79, 84, 83, 45, 51, 52, 53, 55, 128, 68, 79, 84, 83, - 45, 51, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 51, 52, 53, 54, 55, 56, - 128, 68, 79, 84, 83, 45, 51, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 51, - 52, 53, 54, 128, 68, 79, 84, 83, 45, 51, 52, 53, 128, 68, 79, 84, 83, 45, - 51, 52, 128, 68, 79, 84, 83, 45, 51, 128, 68, 79, 84, 83, 45, 50, 56, - 128, 68, 79, 84, 83, 45, 50, 55, 56, 128, 68, 79, 84, 83, 45, 50, 55, - 128, 68, 79, 84, 83, 45, 50, 54, 56, 128, 68, 79, 84, 83, 45, 50, 54, 55, - 56, 128, 68, 79, 84, 83, 45, 50, 54, 55, 128, 68, 79, 84, 83, 45, 50, 54, - 128, 68, 79, 84, 83, 45, 50, 53, 56, 128, 68, 79, 84, 83, 45, 50, 53, 55, - 56, 128, 68, 79, 84, 83, 45, 50, 53, 55, 128, 68, 79, 84, 83, 45, 50, 53, - 54, 56, 128, 68, 79, 84, 83, 45, 50, 53, 54, 55, 56, 128, 68, 79, 84, 83, - 45, 50, 53, 54, 55, 128, 68, 79, 84, 83, 45, 50, 53, 54, 128, 68, 79, 84, - 83, 45, 50, 53, 128, 68, 79, 84, 83, 45, 50, 52, 56, 128, 68, 79, 84, 83, - 45, 50, 52, 55, 56, 128, 68, 79, 84, 83, 45, 50, 52, 55, 128, 68, 79, 84, - 83, 45, 50, 52, 54, 56, 128, 68, 79, 84, 83, 45, 50, 52, 54, 55, 56, 128, - 68, 79, 84, 83, 45, 50, 52, 54, 55, 128, 68, 79, 84, 83, 45, 50, 52, 54, - 128, 68, 79, 84, 83, 45, 50, 52, 53, 56, 128, 68, 79, 84, 83, 45, 50, 52, - 53, 55, 56, 128, 68, 79, 84, 83, 45, 50, 52, 53, 55, 128, 68, 79, 84, 83, - 45, 50, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 50, 52, 53, 54, 55, 56, - 128, 68, 79, 84, 83, 45, 50, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 50, - 52, 53, 54, 128, 68, 79, 84, 83, 45, 50, 52, 53, 128, 68, 79, 84, 83, 45, - 50, 52, 128, 68, 79, 84, 83, 45, 50, 51, 56, 128, 68, 79, 84, 83, 45, 50, - 51, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 55, 128, 68, 79, 84, 83, 45, - 50, 51, 54, 56, 128, 68, 79, 84, 83, 45, 50, 51, 54, 55, 56, 128, 68, 79, - 84, 83, 45, 50, 51, 54, 55, 128, 68, 79, 84, 83, 45, 50, 51, 54, 128, 68, - 79, 84, 83, 45, 50, 51, 53, 56, 128, 68, 79, 84, 83, 45, 50, 51, 53, 55, - 56, 128, 68, 79, 84, 83, 45, 50, 51, 53, 55, 128, 68, 79, 84, 83, 45, 50, - 51, 53, 54, 56, 128, 68, 79, 84, 83, 45, 50, 51, 53, 54, 55, 56, 128, 68, - 79, 84, 83, 45, 50, 51, 53, 54, 55, 128, 68, 79, 84, 83, 45, 50, 51, 53, - 54, 128, 68, 79, 84, 83, 45, 50, 51, 53, 128, 68, 79, 84, 83, 45, 50, 51, - 52, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 55, 56, 128, 68, 79, 84, 83, - 45, 50, 51, 52, 55, 128, 68, 79, 84, 83, 45, 50, 51, 52, 54, 56, 128, 68, - 79, 84, 83, 45, 50, 51, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, - 52, 54, 55, 128, 68, 79, 84, 83, 45, 50, 51, 52, 54, 128, 68, 79, 84, 83, - 45, 50, 51, 52, 53, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 55, 56, - 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 55, 128, 68, 79, 84, 83, 45, 50, - 51, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 54, 55, 56, - 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, - 50, 51, 52, 53, 54, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 128, 68, 79, - 84, 83, 45, 50, 51, 52, 128, 68, 79, 84, 83, 45, 50, 51, 128, 68, 79, 84, - 83, 45, 50, 128, 68, 79, 84, 83, 45, 49, 56, 128, 68, 79, 84, 83, 45, 49, - 55, 56, 128, 68, 79, 84, 83, 45, 49, 55, 128, 68, 79, 84, 83, 45, 49, 54, - 56, 128, 68, 79, 84, 83, 45, 49, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, - 54, 55, 128, 68, 79, 84, 83, 45, 49, 54, 128, 68, 79, 84, 83, 45, 49, 53, - 56, 128, 68, 79, 84, 83, 45, 49, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, - 53, 55, 128, 68, 79, 84, 83, 45, 49, 53, 54, 56, 128, 68, 79, 84, 83, 45, - 49, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 53, 54, 55, 128, 68, 79, - 84, 83, 45, 49, 53, 54, 128, 68, 79, 84, 83, 45, 49, 53, 128, 68, 79, 84, - 83, 45, 49, 52, 56, 128, 68, 79, 84, 83, 45, 49, 52, 55, 56, 128, 68, 79, - 84, 83, 45, 49, 52, 55, 128, 68, 79, 84, 83, 45, 49, 52, 54, 56, 128, 68, - 79, 84, 83, 45, 49, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 52, 54, - 55, 128, 68, 79, 84, 83, 45, 49, 52, 54, 128, 68, 79, 84, 83, 45, 49, 52, - 53, 56, 128, 68, 79, 84, 83, 45, 49, 52, 53, 55, 56, 128, 68, 79, 84, 83, - 45, 49, 52, 53, 55, 128, 68, 79, 84, 83, 45, 49, 52, 53, 54, 56, 128, 68, - 79, 84, 83, 45, 49, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 52, - 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 52, 53, 54, 128, 68, 79, 84, 83, - 45, 49, 52, 53, 128, 68, 79, 84, 83, 45, 49, 52, 128, 68, 79, 84, 83, 45, - 49, 51, 56, 128, 68, 79, 84, 83, 45, 49, 51, 55, 56, 128, 68, 79, 84, 83, - 45, 49, 51, 55, 128, 68, 79, 84, 83, 45, 49, 51, 54, 56, 128, 68, 79, 84, - 83, 45, 49, 51, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 54, 55, 128, - 68, 79, 84, 83, 45, 49, 51, 54, 128, 68, 79, 84, 83, 45, 49, 51, 53, 56, - 128, 68, 79, 84, 83, 45, 49, 51, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, - 51, 53, 55, 128, 68, 79, 84, 83, 45, 49, 51, 53, 54, 56, 128, 68, 79, 84, - 83, 45, 49, 51, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 53, 54, - 55, 128, 68, 79, 84, 83, 45, 49, 51, 53, 54, 128, 68, 79, 84, 83, 45, 49, - 51, 53, 128, 68, 79, 84, 83, 45, 49, 51, 52, 56, 128, 68, 79, 84, 83, 45, - 49, 51, 52, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 55, 128, 68, 79, - 84, 83, 45, 49, 51, 52, 54, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 54, - 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 54, 55, 128, 68, 79, 84, 83, - 45, 49, 51, 52, 54, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 56, 128, 68, - 79, 84, 83, 45, 49, 51, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, - 52, 53, 55, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 54, 56, 128, 68, 79, - 84, 83, 45, 49, 51, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, - 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 54, 128, 68, 79, - 84, 83, 45, 49, 51, 52, 53, 128, 68, 79, 84, 83, 45, 49, 51, 52, 128, 68, - 79, 84, 83, 45, 49, 51, 128, 68, 79, 84, 83, 45, 49, 50, 56, 128, 68, 79, - 84, 83, 45, 49, 50, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 55, 128, 68, - 79, 84, 83, 45, 49, 50, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 54, 55, - 56, 128, 68, 79, 84, 83, 45, 49, 50, 54, 55, 128, 68, 79, 84, 83, 45, 49, - 50, 54, 128, 68, 79, 84, 83, 45, 49, 50, 53, 56, 128, 68, 79, 84, 83, 45, - 49, 50, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 53, 55, 128, 68, 79, - 84, 83, 45, 49, 50, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 53, 54, - 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 53, 54, 55, 128, 68, 79, 84, 83, - 45, 49, 50, 53, 54, 128, 68, 79, 84, 83, 45, 49, 50, 53, 128, 68, 79, 84, - 83, 45, 49, 50, 52, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 55, 56, 128, - 68, 79, 84, 83, 45, 49, 50, 52, 55, 128, 68, 79, 84, 83, 45, 49, 50, 52, - 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 54, 55, 56, 128, 68, 79, 84, - 83, 45, 49, 50, 52, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 52, 54, 128, - 68, 79, 84, 83, 45, 49, 50, 52, 53, 56, 128, 68, 79, 84, 83, 45, 49, 50, - 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 55, 128, 68, 79, - 84, 83, 45, 49, 50, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, - 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 54, 55, 128, 68, - 79, 84, 83, 45, 49, 50, 52, 53, 54, 128, 68, 79, 84, 83, 45, 49, 50, 52, - 53, 128, 68, 79, 84, 83, 45, 49, 50, 52, 128, 68, 79, 84, 83, 45, 49, 50, - 51, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 55, 56, 128, 68, 79, 84, 83, - 45, 49, 50, 51, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 54, 56, 128, 68, - 79, 84, 83, 45, 49, 50, 51, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, - 51, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 54, 128, 68, 79, 84, 83, - 45, 49, 50, 51, 53, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 55, 56, - 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 55, 128, 68, 79, 84, 83, 45, 49, - 50, 51, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 54, 55, 56, - 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 54, 55, 128, 68, 79, 84, 83, 45, - 49, 50, 51, 53, 54, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 128, 68, 79, - 84, 83, 45, 49, 50, 51, 52, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, - 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 55, 128, 68, 79, 84, 83, - 45, 49, 50, 51, 52, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 54, - 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 54, 55, 128, 68, 79, 84, - 83, 45, 49, 50, 51, 52, 54, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, - 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 55, 56, 128, 68, 79, 84, - 83, 45, 49, 50, 51, 52, 53, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, - 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 54, 55, 56, 128, - 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, - 49, 50, 51, 52, 53, 54, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 128, - 68, 79, 84, 83, 45, 49, 50, 51, 52, 128, 68, 79, 84, 83, 45, 49, 50, 51, - 128, 68, 79, 84, 83, 45, 49, 50, 128, 68, 79, 84, 83, 45, 49, 128, 68, - 79, 84, 83, 128, 68, 79, 84, 211, 68, 79, 84, 76, 69, 83, 211, 68, 79, - 82, 85, 128, 68, 79, 82, 79, 77, 197, 68, 79, 79, 82, 128, 68, 79, 79, - 78, 71, 128, 68, 79, 78, 71, 128, 68, 79, 77, 65, 73, 206, 68, 79, 76, - 80, 72, 73, 78, 128, 68, 79, 76, 76, 83, 128, 68, 79, 76, 76, 65, 210, - 68, 79, 76, 73, 85, 77, 128, 68, 79, 75, 77, 65, 73, 128, 68, 79, 73, 84, - 128, 68, 79, 73, 78, 199, 68, 79, 73, 128, 68, 79, 71, 82, 193, 68, 79, - 71, 128, 68, 79, 199, 68, 79, 69, 211, 68, 79, 68, 69, 75, 65, 84, 65, - 128, 68, 79, 67, 85, 77, 69, 78, 84, 128, 68, 79, 67, 85, 77, 69, 78, - 212, 68, 79, 66, 82, 79, 128, 68, 79, 65, 67, 72, 65, 83, 72, 77, 69, 69, - 128, 68, 79, 65, 67, 72, 65, 83, 72, 77, 69, 197, 68, 79, 65, 128, 68, - 79, 45, 79, 128, 68, 78, 193, 68, 77, 128, 68, 205, 68, 76, 85, 128, 68, - 76, 79, 128, 68, 76, 73, 128, 68, 76, 72, 89, 65, 128, 68, 76, 72, 65, - 128, 68, 76, 69, 69, 128, 68, 76, 65, 128, 68, 76, 128, 68, 75, 65, 82, - 128, 68, 75, 65, 210, 68, 74, 69, 82, 86, 73, 128, 68, 74, 69, 82, 86, - 128, 68, 74, 69, 128, 68, 74, 65, 128, 68, 73, 90, 90, 217, 68, 73, 86, - 79, 82, 67, 197, 68, 73, 86, 73, 83, 73, 79, 78, 128, 68, 73, 86, 73, 83, - 73, 79, 206, 68, 73, 86, 73, 78, 65, 84, 73, 79, 78, 128, 68, 73, 86, 73, - 68, 69, 83, 128, 68, 73, 86, 73, 68, 69, 82, 83, 128, 68, 73, 86, 73, 68, - 69, 82, 128, 68, 73, 86, 73, 68, 69, 196, 68, 73, 86, 73, 68, 69, 128, - 68, 73, 86, 73, 68, 197, 68, 73, 86, 69, 82, 71, 69, 78, 67, 69, 128, 68, - 73, 84, 84, 207, 68, 73, 83, 84, 79, 82, 84, 73, 79, 78, 128, 68, 73, 83, - 84, 73, 78, 71, 85, 73, 83, 72, 128, 68, 73, 83, 84, 73, 76, 76, 128, 68, - 73, 83, 83, 79, 76, 86, 69, 45, 50, 128, 68, 73, 83, 83, 79, 76, 86, 69, - 128, 68, 73, 83, 80, 85, 84, 69, 196, 68, 73, 83, 80, 69, 82, 83, 73, 79, - 78, 128, 68, 73, 83, 75, 128, 68, 73, 83, 73, 77, 79, 85, 128, 68, 73, - 83, 72, 128, 68, 73, 83, 67, 79, 78, 84, 73, 78, 85, 79, 85, 211, 68, 73, - 83, 195, 68, 73, 83, 65, 80, 80, 79, 73, 78, 84, 69, 196, 68, 73, 83, 65, - 66, 76, 69, 196, 68, 73, 82, 71, 193, 68, 73, 82, 69, 67, 84, 76, 217, - 68, 73, 82, 69, 67, 84, 73, 79, 78, 65, 204, 68, 73, 82, 69, 67, 84, 73, - 79, 206, 68, 73, 80, 84, 69, 128, 68, 73, 80, 80, 69, 82, 128, 68, 73, - 80, 76, 79, 85, 78, 128, 68, 73, 80, 76, 73, 128, 68, 73, 80, 76, 201, - 68, 73, 78, 71, 66, 65, 212, 68, 73, 206, 68, 73, 77, 77, 73, 78, 71, - 128, 68, 73, 77, 73, 78, 85, 84, 73, 79, 78, 45, 51, 128, 68, 73, 77, 73, - 78, 85, 84, 73, 79, 78, 45, 50, 128, 68, 73, 77, 73, 78, 85, 84, 73, 79, - 78, 45, 49, 128, 68, 73, 77, 73, 78, 73, 83, 72, 77, 69, 78, 84, 128, 68, - 73, 77, 73, 68, 73, 193, 68, 73, 77, 69, 78, 83, 73, 79, 78, 65, 204, 68, - 73, 77, 69, 78, 83, 73, 79, 206, 68, 73, 77, 50, 128, 68, 73, 77, 178, - 68, 73, 76, 128, 68, 73, 71, 82, 65, 80, 72, 128, 68, 73, 71, 82, 65, 80, - 200, 68, 73, 71, 82, 65, 77, 77, 79, 211, 68, 73, 71, 82, 65, 77, 77, - 193, 68, 73, 71, 82, 65, 205, 68, 73, 71, 79, 82, 71, 79, 78, 128, 68, - 73, 71, 79, 82, 71, 79, 206, 68, 73, 71, 73, 84, 83, 128, 68, 73, 71, 65, - 77, 77, 65, 128, 68, 73, 71, 193, 68, 73, 70, 84, 79, 71, 71, 79, 211, - 68, 73, 70, 79, 78, 73, 65, 83, 128, 68, 73, 70, 70, 73, 67, 85, 76, 84, - 217, 68, 73, 70, 70, 73, 67, 85, 76, 84, 73, 69, 83, 128, 68, 73, 70, 70, - 69, 82, 69, 78, 84, 73, 65, 76, 128, 68, 73, 70, 70, 69, 82, 69, 78, 67, - 197, 68, 73, 70, 65, 84, 128, 68, 73, 69, 83, 73, 83, 128, 68, 73, 69, - 83, 73, 211, 68, 73, 69, 83, 69, 204, 68, 73, 69, 80, 128, 68, 73, 197, - 68, 73, 66, 128, 68, 73, 65, 84, 79, 78, 79, 206, 68, 73, 65, 84, 79, 78, - 73, 75, 201, 68, 73, 65, 83, 84, 79, 76, 201, 68, 73, 65, 77, 79, 78, 68, - 83, 128, 68, 73, 65, 77, 79, 78, 68, 128, 68, 73, 65, 77, 79, 78, 196, - 68, 73, 65, 77, 69, 84, 69, 210, 68, 73, 65, 76, 89, 84, 73, 75, 65, 128, - 68, 73, 65, 76, 89, 84, 73, 75, 193, 68, 73, 65, 76, 69, 67, 84, 45, 208, - 68, 73, 65, 71, 79, 78, 65, 76, 128, 68, 73, 65, 69, 82, 69, 83, 73, 90, - 69, 196, 68, 73, 65, 69, 82, 69, 83, 73, 83, 45, 82, 73, 78, 71, 128, 68, - 73, 65, 69, 82, 69, 83, 73, 83, 128, 68, 73, 65, 69, 82, 69, 83, 73, 211, - 68, 72, 79, 85, 128, 68, 72, 79, 79, 128, 68, 72, 79, 128, 68, 72, 73, - 73, 128, 68, 72, 72, 85, 128, 68, 72, 72, 79, 79, 128, 68, 72, 72, 79, - 128, 68, 72, 72, 73, 128, 68, 72, 72, 69, 69, 128, 68, 72, 72, 69, 128, - 68, 72, 72, 65, 128, 68, 72, 69, 69, 128, 68, 72, 65, 82, 77, 65, 128, - 68, 72, 65, 77, 69, 68, 72, 128, 68, 72, 65, 76, 69, 84, 72, 128, 68, 72, - 65, 76, 65, 84, 72, 128, 68, 72, 65, 76, 128, 68, 72, 65, 68, 72, 69, - 128, 68, 72, 65, 65, 76, 85, 128, 68, 72, 65, 65, 128, 68, 72, 65, 128, - 68, 69, 90, 200, 68, 69, 89, 84, 69, 82, 79, 213, 68, 69, 89, 84, 69, 82, - 79, 211, 68, 69, 88, 73, 65, 128, 68, 69, 86, 73, 67, 197, 68, 69, 86, - 69, 76, 79, 80, 77, 69, 78, 84, 128, 68, 69, 85, 78, 71, 128, 68, 69, 83, - 75, 84, 79, 208, 68, 69, 83, 203, 68, 69, 83, 73, 71, 78, 128, 68, 69, - 83, 73, 128, 68, 69, 83, 69, 82, 84, 128, 68, 69, 83, 69, 82, 212, 68, - 69, 83, 69, 82, 69, 212, 68, 69, 83, 67, 82, 73, 80, 84, 73, 79, 206, 68, - 69, 83, 67, 69, 78, 68, 73, 78, 199, 68, 69, 83, 67, 69, 78, 68, 69, 82, - 128, 68, 69, 82, 69, 84, 45, 72, 73, 68, 69, 84, 128, 68, 69, 82, 69, 84, - 128, 68, 69, 82, 69, 76, 73, 67, 212, 68, 69, 80, 84, 72, 128, 68, 69, - 80, 65, 82, 84, 85, 82, 69, 128, 68, 69, 80, 65, 82, 84, 77, 69, 78, 212, - 68, 69, 80, 65, 82, 84, 73, 78, 199, 68, 69, 78, 84, 73, 83, 84, 82, 217, - 68, 69, 78, 84, 65, 204, 68, 69, 78, 79, 77, 73, 78, 65, 84, 79, 82, 128, - 68, 69, 78, 79, 77, 73, 78, 65, 84, 79, 210, 68, 69, 78, 78, 69, 78, 128, - 68, 69, 78, 71, 128, 68, 69, 78, 197, 68, 69, 78, 65, 82, 73, 85, 211, - 68, 69, 76, 84, 65, 128, 68, 69, 76, 84, 193, 68, 69, 76, 84, 128, 68, - 69, 76, 80, 72, 73, 195, 68, 69, 76, 73, 86, 69, 82, 217, 68, 69, 76, 73, - 86, 69, 82, 65, 78, 67, 69, 128, 68, 69, 76, 73, 77, 73, 84, 69, 82, 128, - 68, 69, 76, 73, 77, 73, 84, 69, 210, 68, 69, 76, 73, 67, 73, 79, 85, 211, - 68, 69, 76, 69, 84, 73, 79, 206, 68, 69, 76, 69, 84, 69, 128, 68, 69, 76, - 69, 84, 197, 68, 69, 75, 65, 128, 68, 69, 75, 128, 68, 69, 73, 128, 68, - 69, 72, 73, 128, 68, 69, 71, 82, 69, 69, 83, 128, 68, 69, 71, 82, 69, - 197, 68, 69, 70, 73, 78, 73, 84, 73, 79, 78, 128, 68, 69, 70, 69, 67, 84, - 73, 86, 69, 78, 69, 83, 211, 68, 69, 69, 82, 128, 68, 69, 69, 80, 76, 89, - 128, 68, 69, 69, 76, 128, 68, 69, 67, 82, 69, 83, 67, 69, 78, 68, 79, - 128, 68, 69, 67, 82, 69, 65, 83, 69, 128, 68, 69, 67, 82, 69, 65, 83, - 197, 68, 69, 67, 79, 82, 65, 84, 73, 86, 197, 68, 69, 67, 79, 82, 65, 84, - 73, 79, 78, 128, 68, 69, 67, 73, 83, 73, 86, 69, 78, 69, 83, 83, 128, 68, - 69, 67, 73, 77, 65, 204, 68, 69, 67, 73, 68, 85, 79, 85, 211, 68, 69, 67, - 69, 77, 66, 69, 82, 128, 68, 69, 67, 65, 89, 69, 68, 128, 68, 69, 66, 73, - 212, 68, 69, 65, 84, 72, 128, 68, 69, 65, 68, 128, 68, 68, 87, 65, 128, - 68, 68, 85, 88, 128, 68, 68, 85, 84, 128, 68, 68, 85, 82, 88, 128, 68, - 68, 85, 82, 128, 68, 68, 85, 80, 128, 68, 68, 85, 79, 88, 128, 68, 68, - 85, 79, 80, 128, 68, 68, 85, 79, 128, 68, 68, 85, 128, 68, 68, 79, 88, - 128, 68, 68, 79, 84, 128, 68, 68, 79, 80, 128, 68, 68, 79, 65, 128, 68, - 68, 73, 88, 128, 68, 68, 73, 84, 128, 68, 68, 73, 80, 128, 68, 68, 73, - 69, 88, 128, 68, 68, 73, 69, 80, 128, 68, 68, 73, 69, 128, 68, 68, 73, - 128, 68, 68, 72, 85, 128, 68, 68, 72, 79, 128, 68, 68, 72, 69, 69, 128, - 68, 68, 72, 69, 128, 68, 68, 72, 65, 65, 128, 68, 68, 72, 65, 128, 68, - 68, 69, 88, 128, 68, 68, 69, 80, 128, 68, 68, 69, 69, 128, 68, 68, 69, - 128, 68, 68, 68, 72, 65, 128, 68, 68, 68, 65, 128, 68, 68, 65, 89, 65, - 78, 78, 65, 128, 68, 68, 65, 88, 128, 68, 68, 65, 84, 128, 68, 68, 65, - 80, 128, 68, 68, 65, 76, 128, 68, 68, 65, 204, 68, 68, 65, 72, 65, 76, - 128, 68, 68, 65, 72, 65, 204, 68, 68, 65, 65, 128, 68, 67, 83, 128, 68, - 67, 72, 69, 128, 68, 67, 52, 128, 68, 67, 51, 128, 68, 67, 50, 128, 68, - 67, 49, 128, 68, 194, 68, 65, 89, 45, 78, 73, 71, 72, 84, 128, 68, 65, - 217, 68, 65, 87, 66, 128, 68, 65, 86, 73, 89, 65, 78, 73, 128, 68, 65, - 86, 73, 68, 128, 68, 65, 84, 197, 68, 65, 83, 73, 65, 128, 68, 65, 83, - 73, 193, 68, 65, 83, 72, 69, 196, 68, 65, 83, 72, 128, 68, 65, 83, 200, - 68, 65, 83, 69, 73, 65, 128, 68, 65, 82, 84, 128, 68, 65, 82, 75, 69, 78, - 73, 78, 71, 128, 68, 65, 82, 75, 69, 78, 73, 78, 199, 68, 65, 82, 203, - 68, 65, 82, 71, 65, 128, 68, 65, 82, 65, 52, 128, 68, 65, 82, 65, 51, - 128, 68, 65, 82, 128, 68, 65, 80, 45, 80, 82, 65, 205, 68, 65, 80, 45, - 80, 73, 201, 68, 65, 80, 45, 77, 85, 79, 217, 68, 65, 80, 45, 66, 85, 79, - 206, 68, 65, 80, 45, 66, 69, 201, 68, 65, 208, 68, 65, 78, 84, 65, 89, - 65, 76, 65, 78, 128, 68, 65, 78, 84, 65, 74, 193, 68, 65, 78, 71, 79, - 128, 68, 65, 78, 71, 128, 68, 65, 78, 199, 68, 65, 78, 68, 65, 128, 68, - 65, 78, 67, 73, 78, 71, 128, 68, 65, 78, 67, 69, 82, 128, 68, 65, 77, 80, - 128, 68, 65, 77, 208, 68, 65, 77, 77, 65, 84, 65, 78, 128, 68, 65, 77, - 77, 65, 84, 65, 206, 68, 65, 77, 77, 65, 128, 68, 65, 77, 77, 193, 68, - 65, 77, 65, 82, 85, 128, 68, 65, 76, 69, 84, 72, 45, 82, 69, 83, 72, 128, - 68, 65, 76, 69, 84, 128, 68, 65, 76, 69, 212, 68, 65, 76, 68, 65, 128, - 68, 65, 76, 65, 84, 72, 128, 68, 65, 76, 65, 84, 200, 68, 65, 76, 65, 84, - 128, 68, 65, 73, 82, 128, 68, 65, 73, 78, 71, 128, 68, 65, 73, 128, 68, - 65, 72, 89, 65, 65, 85, 83, 72, 45, 50, 128, 68, 65, 72, 89, 65, 65, 85, - 83, 72, 128, 68, 65, 71, 83, 128, 68, 65, 71, 71, 69, 82, 128, 68, 65, - 71, 71, 69, 210, 68, 65, 71, 69, 83, 72, 128, 68, 65, 71, 69, 83, 200, - 68, 65, 71, 66, 65, 83, 73, 78, 78, 65, 128, 68, 65, 71, 65, 218, 68, 65, - 71, 65, 76, 71, 65, 128, 68, 65, 71, 51, 128, 68, 65, 199, 68, 65, 69, - 78, 71, 128, 68, 65, 69, 199, 68, 65, 68, 128, 68, 65, 196, 68, 65, 65, - 83, 85, 128, 68, 65, 65, 76, 73, 128, 68, 65, 65, 68, 72, 85, 128, 68, - 48, 54, 55, 72, 128, 68, 48, 54, 55, 71, 128, 68, 48, 54, 55, 70, 128, - 68, 48, 54, 55, 69, 128, 68, 48, 54, 55, 68, 128, 68, 48, 54, 55, 67, - 128, 68, 48, 54, 55, 66, 128, 68, 48, 54, 55, 65, 128, 68, 48, 54, 55, - 128, 68, 48, 54, 54, 128, 68, 48, 54, 53, 128, 68, 48, 54, 52, 128, 68, - 48, 54, 51, 128, 68, 48, 54, 50, 128, 68, 48, 54, 49, 128, 68, 48, 54, - 48, 128, 68, 48, 53, 57, 128, 68, 48, 53, 56, 128, 68, 48, 53, 55, 128, - 68, 48, 53, 54, 128, 68, 48, 53, 53, 128, 68, 48, 53, 52, 65, 128, 68, - 48, 53, 52, 128, 68, 48, 53, 51, 128, 68, 48, 53, 50, 65, 128, 68, 48, - 53, 50, 128, 68, 48, 53, 49, 128, 68, 48, 53, 48, 73, 128, 68, 48, 53, - 48, 72, 128, 68, 48, 53, 48, 71, 128, 68, 48, 53, 48, 70, 128, 68, 48, - 53, 48, 69, 128, 68, 48, 53, 48, 68, 128, 68, 48, 53, 48, 67, 128, 68, - 48, 53, 48, 66, 128, 68, 48, 53, 48, 65, 128, 68, 48, 53, 48, 128, 68, - 48, 52, 57, 128, 68, 48, 52, 56, 65, 128, 68, 48, 52, 56, 128, 68, 48, - 52, 55, 128, 68, 48, 52, 54, 65, 128, 68, 48, 52, 54, 128, 68, 48, 52, - 53, 128, 68, 48, 52, 52, 128, 68, 48, 52, 51, 128, 68, 48, 52, 50, 128, - 68, 48, 52, 49, 128, 68, 48, 52, 48, 128, 68, 48, 51, 57, 128, 68, 48, - 51, 56, 128, 68, 48, 51, 55, 128, 68, 48, 51, 54, 128, 68, 48, 51, 53, - 128, 68, 48, 51, 52, 65, 128, 68, 48, 51, 52, 128, 68, 48, 51, 51, 128, - 68, 48, 51, 50, 128, 68, 48, 51, 49, 65, 128, 68, 48, 51, 49, 128, 68, - 48, 51, 48, 128, 68, 48, 50, 57, 128, 68, 48, 50, 56, 128, 68, 48, 50, - 55, 65, 128, 68, 48, 50, 55, 128, 68, 48, 50, 54, 128, 68, 48, 50, 53, - 128, 68, 48, 50, 52, 128, 68, 48, 50, 51, 128, 68, 48, 50, 50, 128, 68, - 48, 50, 49, 128, 68, 48, 50, 48, 128, 68, 48, 49, 57, 128, 68, 48, 49, - 56, 128, 68, 48, 49, 55, 128, 68, 48, 49, 54, 128, 68, 48, 49, 53, 128, - 68, 48, 49, 52, 128, 68, 48, 49, 51, 128, 68, 48, 49, 50, 128, 68, 48, - 49, 49, 128, 68, 48, 49, 48, 128, 68, 48, 48, 57, 128, 68, 48, 48, 56, - 65, 128, 68, 48, 48, 56, 128, 68, 48, 48, 55, 128, 68, 48, 48, 54, 128, - 68, 48, 48, 53, 128, 68, 48, 48, 52, 128, 68, 48, 48, 51, 128, 68, 48, - 48, 50, 128, 68, 48, 48, 49, 128, 67, 89, 88, 128, 67, 89, 84, 128, 67, - 89, 82, 88, 128, 67, 89, 82, 69, 78, 65, 73, 195, 67, 89, 82, 128, 67, - 89, 80, 82, 73, 79, 212, 67, 89, 80, 69, 82, 85, 83, 128, 67, 89, 80, - 128, 67, 89, 76, 73, 78, 68, 82, 73, 67, 73, 84, 89, 128, 67, 89, 67, 76, - 79, 78, 69, 128, 67, 89, 65, 89, 128, 67, 89, 65, 87, 128, 67, 89, 65, - 128, 67, 87, 79, 79, 128, 67, 87, 79, 128, 67, 87, 73, 73, 128, 67, 87, - 73, 128, 67, 87, 69, 79, 82, 84, 72, 128, 67, 87, 69, 128, 67, 87, 65, - 65, 128, 67, 85, 88, 128, 67, 85, 85, 128, 67, 85, 212, 67, 85, 83, 84, - 79, 77, 83, 128, 67, 85, 83, 84, 79, 77, 69, 210, 67, 85, 83, 84, 65, 82, - 68, 128, 67, 85, 83, 80, 128, 67, 85, 82, 88, 128, 67, 85, 82, 86, 73, - 78, 199, 67, 85, 82, 86, 69, 68, 128, 67, 85, 82, 86, 69, 196, 67, 85, - 82, 86, 69, 128, 67, 85, 82, 86, 197, 67, 85, 82, 83, 73, 86, 197, 67, - 85, 82, 82, 217, 67, 85, 82, 82, 69, 78, 84, 128, 67, 85, 82, 82, 69, 78, - 212, 67, 85, 82, 76, 217, 67, 85, 82, 76, 73, 78, 199, 67, 85, 82, 76, - 128, 67, 85, 82, 128, 67, 85, 80, 80, 69, 68, 128, 67, 85, 80, 80, 69, - 196, 67, 85, 80, 73, 68, 79, 128, 67, 85, 80, 67, 65, 75, 69, 128, 67, - 85, 79, 88, 128, 67, 85, 79, 80, 128, 67, 85, 79, 128, 67, 85, 205, 67, - 85, 67, 85, 77, 66, 69, 82, 128, 67, 85, 66, 69, 68, 128, 67, 85, 66, - 197, 67, 85, 65, 84, 82, 73, 76, 76, 79, 128, 67, 85, 65, 84, 82, 73, 76, - 76, 207, 67, 85, 65, 205, 67, 85, 128, 67, 83, 73, 128, 67, 82, 89, 83, - 84, 65, 204, 67, 82, 89, 80, 84, 79, 71, 82, 65, 77, 77, 73, 195, 67, 82, - 89, 73, 78, 199, 67, 82, 85, 90, 69, 73, 82, 207, 67, 82, 85, 67, 73, 70, - 79, 82, 205, 67, 82, 85, 67, 73, 66, 76, 69, 45, 53, 128, 67, 82, 85, 67, - 73, 66, 76, 69, 45, 52, 128, 67, 82, 85, 67, 73, 66, 76, 69, 45, 51, 128, - 67, 82, 85, 67, 73, 66, 76, 69, 45, 50, 128, 67, 82, 85, 67, 73, 66, 76, - 69, 128, 67, 82, 79, 87, 78, 128, 67, 82, 79, 83, 83, 73, 78, 71, 128, - 67, 82, 79, 83, 83, 73, 78, 199, 67, 82, 79, 83, 83, 72, 65, 84, 67, 200, - 67, 82, 79, 83, 83, 69, 68, 45, 84, 65, 73, 76, 128, 67, 82, 79, 83, 83, - 69, 68, 128, 67, 82, 79, 83, 83, 69, 196, 67, 82, 79, 83, 83, 66, 79, 78, - 69, 83, 128, 67, 82, 79, 83, 83, 128, 67, 82, 79, 83, 211, 67, 82, 79, - 80, 128, 67, 82, 79, 73, 88, 128, 67, 82, 79, 73, 83, 83, 65, 78, 84, - 128, 67, 82, 79, 67, 85, 211, 67, 82, 79, 67, 79, 68, 73, 76, 69, 128, - 67, 82, 73, 67, 75, 69, 84, 128, 67, 82, 73, 67, 75, 69, 212, 67, 82, 69, - 83, 67, 69, 78, 84, 83, 128, 67, 82, 69, 83, 67, 69, 78, 84, 128, 67, 82, - 69, 83, 67, 69, 78, 212, 67, 82, 69, 68, 73, 212, 67, 82, 69, 65, 84, 73, - 86, 197, 67, 82, 69, 65, 77, 128, 67, 82, 65, 89, 79, 78, 128, 67, 82, - 65, 66, 128, 67, 82, 128, 67, 79, 88, 128, 67, 79, 87, 66, 79, 217, 67, - 79, 87, 128, 67, 79, 215, 67, 79, 86, 69, 82, 73, 78, 199, 67, 79, 86, - 69, 82, 128, 67, 79, 85, 80, 76, 197, 67, 79, 85, 78, 84, 73, 78, 199, - 67, 79, 85, 78, 84, 69, 82, 83, 73, 78, 75, 128, 67, 79, 85, 78, 84, 69, - 82, 66, 79, 82, 69, 128, 67, 79, 85, 78, 67, 73, 204, 67, 79, 85, 67, + 69, 128, 68, 90, 90, 65, 128, 68, 90, 89, 73, 128, 68, 90, 89, 65, 89, + 128, 68, 90, 87, 69, 128, 68, 90, 85, 128, 68, 90, 79, 128, 68, 90, 74, + 69, 128, 68, 90, 73, 84, 65, 128, 68, 90, 73, 128, 68, 90, 72, 79, 73, + 128, 68, 90, 72, 69, 128, 68, 90, 72, 65, 128, 68, 90, 69, 76, 79, 128, + 68, 90, 69, 69, 128, 68, 90, 69, 128, 68, 90, 65, 89, 128, 68, 90, 65, + 65, 128, 68, 90, 65, 128, 68, 90, 128, 68, 218, 68, 89, 79, 128, 68, 89, + 207, 68, 89, 78, 65, 77, 73, 195, 68, 89, 69, 72, 128, 68, 89, 69, 200, + 68, 89, 65, 78, 128, 68, 87, 79, 128, 68, 87, 69, 128, 68, 87, 65, 128, + 68, 86, 73, 83, 86, 65, 82, 65, 128, 68, 86, 68, 128, 68, 86, 128, 68, + 85, 84, 73, 69, 83, 128, 68, 85, 83, 75, 128, 68, 85, 83, 72, 69, 78, 78, + 65, 128, 68, 85, 82, 65, 84, 73, 79, 78, 128, 68, 85, 82, 50, 128, 68, + 85, 80, 79, 78, 68, 73, 85, 211, 68, 85, 79, 88, 128, 68, 85, 79, 128, + 68, 85, 78, 52, 128, 68, 85, 78, 51, 128, 68, 85, 78, 179, 68, 85, 77, + 80, 76, 73, 78, 71, 128, 68, 85, 77, 128, 68, 85, 204, 68, 85, 72, 128, + 68, 85, 71, 85, 68, 128, 68, 85, 199, 68, 85, 67, 75, 128, 68, 85, 66, + 50, 128, 68, 85, 66, 128, 68, 85, 194, 68, 82, 89, 128, 68, 82, 217, 68, + 82, 85, 77, 83, 84, 73, 67, 75, 83, 128, 68, 82, 85, 77, 128, 68, 82, 85, + 205, 68, 82, 79, 80, 83, 128, 68, 82, 79, 80, 76, 69, 84, 128, 68, 82, + 79, 80, 45, 83, 72, 65, 68, 79, 87, 69, 196, 68, 82, 79, 208, 68, 82, 79, + 79, 76, 73, 78, 199, 68, 82, 79, 77, 69, 68, 65, 82, 217, 68, 82, 73, 86, + 69, 128, 68, 82, 73, 86, 197, 68, 82, 73, 78, 75, 128, 68, 82, 73, 204, + 68, 82, 69, 83, 83, 128, 68, 82, 69, 65, 77, 217, 68, 82, 65, 85, 71, 72, + 84, 211, 68, 82, 65, 77, 128, 68, 82, 65, 205, 68, 82, 65, 71, 79, 78, + 128, 68, 82, 65, 71, 79, 206, 68, 82, 65, 70, 84, 73, 78, 199, 68, 82, + 65, 67, 72, 77, 65, 83, 128, 68, 82, 65, 67, 72, 77, 65, 128, 68, 82, 65, + 67, 72, 77, 193, 68, 79, 87, 78, 87, 65, 82, 68, 83, 128, 68, 79, 87, 78, + 87, 65, 82, 68, 211, 68, 79, 87, 78, 87, 65, 82, 196, 68, 79, 87, 78, 83, + 67, 65, 76, 73, 78, 199, 68, 79, 87, 78, 45, 80, 79, 73, 78, 84, 73, 78, + 199, 68, 79, 87, 78, 128, 68, 79, 86, 69, 128, 68, 79, 86, 197, 68, 79, + 85, 71, 72, 78, 85, 84, 128, 68, 79, 85, 66, 84, 128, 68, 79, 85, 66, 76, + 69, 196, 68, 79, 85, 66, 76, 69, 45, 83, 84, 82, 85, 67, 203, 68, 79, 85, + 66, 76, 69, 45, 76, 73, 78, 69, 196, 68, 79, 85, 66, 76, 69, 45, 76, 73, + 78, 197, 68, 79, 85, 66, 76, 69, 45, 69, 78, 68, 69, 196, 68, 79, 85, 66, + 76, 69, 128, 68, 79, 84, 84, 69, 68, 45, 80, 128, 68, 79, 84, 84, 69, 68, + 45, 78, 128, 68, 79, 84, 84, 69, 68, 45, 76, 128, 68, 79, 84, 84, 69, 68, + 128, 68, 79, 84, 84, 69, 196, 68, 79, 84, 83, 45, 56, 128, 68, 79, 84, + 83, 45, 55, 56, 128, 68, 79, 84, 83, 45, 55, 128, 68, 79, 84, 83, 45, 54, + 56, 128, 68, 79, 84, 83, 45, 54, 55, 56, 128, 68, 79, 84, 83, 45, 54, 55, + 128, 68, 79, 84, 83, 45, 54, 128, 68, 79, 84, 83, 45, 53, 56, 128, 68, + 79, 84, 83, 45, 53, 55, 56, 128, 68, 79, 84, 83, 45, 53, 55, 128, 68, 79, + 84, 83, 45, 53, 54, 56, 128, 68, 79, 84, 83, 45, 53, 54, 55, 56, 128, 68, + 79, 84, 83, 45, 53, 54, 55, 128, 68, 79, 84, 83, 45, 53, 54, 128, 68, 79, + 84, 83, 45, 53, 128, 68, 79, 84, 83, 45, 52, 56, 128, 68, 79, 84, 83, 45, + 52, 55, 56, 128, 68, 79, 84, 83, 45, 52, 55, 128, 68, 79, 84, 83, 45, 52, + 54, 56, 128, 68, 79, 84, 83, 45, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, + 52, 54, 55, 128, 68, 79, 84, 83, 45, 52, 54, 128, 68, 79, 84, 83, 45, 52, + 53, 56, 128, 68, 79, 84, 83, 45, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, + 52, 53, 55, 128, 68, 79, 84, 83, 45, 52, 53, 54, 56, 128, 68, 79, 84, 83, + 45, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 52, 53, 54, 55, 128, 68, + 79, 84, 83, 45, 52, 53, 54, 128, 68, 79, 84, 83, 45, 52, 53, 128, 68, 79, + 84, 83, 45, 52, 128, 68, 79, 84, 83, 45, 51, 56, 128, 68, 79, 84, 83, 45, + 51, 55, 56, 128, 68, 79, 84, 83, 45, 51, 55, 128, 68, 79, 84, 83, 45, 51, + 54, 56, 128, 68, 79, 84, 83, 45, 51, 54, 55, 56, 128, 68, 79, 84, 83, 45, + 51, 54, 55, 128, 68, 79, 84, 83, 45, 51, 54, 128, 68, 79, 84, 83, 45, 51, + 53, 56, 128, 68, 79, 84, 83, 45, 51, 53, 55, 56, 128, 68, 79, 84, 83, 45, + 51, 53, 55, 128, 68, 79, 84, 83, 45, 51, 53, 54, 56, 128, 68, 79, 84, 83, + 45, 51, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 51, 53, 54, 55, 128, 68, + 79, 84, 83, 45, 51, 53, 54, 128, 68, 79, 84, 83, 45, 51, 53, 128, 68, 79, + 84, 83, 45, 51, 52, 56, 128, 68, 79, 84, 83, 45, 51, 52, 55, 56, 128, 68, + 79, 84, 83, 45, 51, 52, 55, 128, 68, 79, 84, 83, 45, 51, 52, 54, 56, 128, + 68, 79, 84, 83, 45, 51, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 51, 52, + 54, 55, 128, 68, 79, 84, 83, 45, 51, 52, 54, 128, 68, 79, 84, 83, 45, 51, + 52, 53, 56, 128, 68, 79, 84, 83, 45, 51, 52, 53, 55, 56, 128, 68, 79, 84, + 83, 45, 51, 52, 53, 55, 128, 68, 79, 84, 83, 45, 51, 52, 53, 54, 56, 128, + 68, 79, 84, 83, 45, 51, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 51, + 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 51, 52, 53, 54, 128, 68, 79, 84, + 83, 45, 51, 52, 53, 128, 68, 79, 84, 83, 45, 51, 52, 128, 68, 79, 84, 83, + 45, 51, 128, 68, 79, 84, 83, 45, 50, 56, 128, 68, 79, 84, 83, 45, 50, 55, + 56, 128, 68, 79, 84, 83, 45, 50, 55, 128, 68, 79, 84, 83, 45, 50, 54, 56, + 128, 68, 79, 84, 83, 45, 50, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 54, + 55, 128, 68, 79, 84, 83, 45, 50, 54, 128, 68, 79, 84, 83, 45, 50, 53, 56, + 128, 68, 79, 84, 83, 45, 50, 53, 55, 56, 128, 68, 79, 84, 83, 45, 50, 53, + 55, 128, 68, 79, 84, 83, 45, 50, 53, 54, 56, 128, 68, 79, 84, 83, 45, 50, + 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 53, 54, 55, 128, 68, 79, 84, + 83, 45, 50, 53, 54, 128, 68, 79, 84, 83, 45, 50, 53, 128, 68, 79, 84, 83, + 45, 50, 52, 56, 128, 68, 79, 84, 83, 45, 50, 52, 55, 56, 128, 68, 79, 84, + 83, 45, 50, 52, 55, 128, 68, 79, 84, 83, 45, 50, 52, 54, 56, 128, 68, 79, + 84, 83, 45, 50, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 52, 54, 55, + 128, 68, 79, 84, 83, 45, 50, 52, 54, 128, 68, 79, 84, 83, 45, 50, 52, 53, + 56, 128, 68, 79, 84, 83, 45, 50, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, + 50, 52, 53, 55, 128, 68, 79, 84, 83, 45, 50, 52, 53, 54, 56, 128, 68, 79, + 84, 83, 45, 50, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 52, 53, + 54, 55, 128, 68, 79, 84, 83, 45, 50, 52, 53, 54, 128, 68, 79, 84, 83, 45, + 50, 52, 53, 128, 68, 79, 84, 83, 45, 50, 52, 128, 68, 79, 84, 83, 45, 50, + 51, 56, 128, 68, 79, 84, 83, 45, 50, 51, 55, 56, 128, 68, 79, 84, 83, 45, + 50, 51, 55, 128, 68, 79, 84, 83, 45, 50, 51, 54, 56, 128, 68, 79, 84, 83, + 45, 50, 51, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 54, 55, 128, 68, + 79, 84, 83, 45, 50, 51, 54, 128, 68, 79, 84, 83, 45, 50, 51, 53, 56, 128, + 68, 79, 84, 83, 45, 50, 51, 53, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, + 53, 55, 128, 68, 79, 84, 83, 45, 50, 51, 53, 54, 56, 128, 68, 79, 84, 83, + 45, 50, 51, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 53, 54, 55, + 128, 68, 79, 84, 83, 45, 50, 51, 53, 54, 128, 68, 79, 84, 83, 45, 50, 51, + 53, 128, 68, 79, 84, 83, 45, 50, 51, 52, 56, 128, 68, 79, 84, 83, 45, 50, + 51, 52, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 55, 128, 68, 79, 84, + 83, 45, 50, 51, 52, 54, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 54, 55, + 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 54, 55, 128, 68, 79, 84, 83, 45, + 50, 51, 52, 54, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 56, 128, 68, 79, + 84, 83, 45, 50, 51, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, + 53, 55, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 54, 56, 128, 68, 79, 84, + 83, 45, 50, 51, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, + 53, 54, 55, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 54, 128, 68, 79, 84, + 83, 45, 50, 51, 52, 53, 128, 68, 79, 84, 83, 45, 50, 51, 52, 128, 68, 79, + 84, 83, 45, 50, 51, 128, 68, 79, 84, 83, 45, 50, 128, 68, 79, 84, 83, 45, + 49, 56, 128, 68, 79, 84, 83, 45, 49, 55, 56, 128, 68, 79, 84, 83, 45, 49, + 55, 128, 68, 79, 84, 83, 45, 49, 54, 56, 128, 68, 79, 84, 83, 45, 49, 54, + 55, 56, 128, 68, 79, 84, 83, 45, 49, 54, 55, 128, 68, 79, 84, 83, 45, 49, + 54, 128, 68, 79, 84, 83, 45, 49, 53, 56, 128, 68, 79, 84, 83, 45, 49, 53, + 55, 56, 128, 68, 79, 84, 83, 45, 49, 53, 55, 128, 68, 79, 84, 83, 45, 49, + 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 53, 54, 55, 56, 128, 68, 79, 84, + 83, 45, 49, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 53, 54, 128, 68, 79, + 84, 83, 45, 49, 53, 128, 68, 79, 84, 83, 45, 49, 52, 56, 128, 68, 79, 84, + 83, 45, 49, 52, 55, 56, 128, 68, 79, 84, 83, 45, 49, 52, 55, 128, 68, 79, + 84, 83, 45, 49, 52, 54, 56, 128, 68, 79, 84, 83, 45, 49, 52, 54, 55, 56, + 128, 68, 79, 84, 83, 45, 49, 52, 54, 55, 128, 68, 79, 84, 83, 45, 49, 52, + 54, 128, 68, 79, 84, 83, 45, 49, 52, 53, 56, 128, 68, 79, 84, 83, 45, 49, + 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 52, 53, 55, 128, 68, 79, 84, + 83, 45, 49, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 52, 53, 54, 55, + 56, 128, 68, 79, 84, 83, 45, 49, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, + 49, 52, 53, 54, 128, 68, 79, 84, 83, 45, 49, 52, 53, 128, 68, 79, 84, 83, + 45, 49, 52, 128, 68, 79, 84, 83, 45, 49, 51, 56, 128, 68, 79, 84, 83, 45, + 49, 51, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 55, 128, 68, 79, 84, 83, + 45, 49, 51, 54, 56, 128, 68, 79, 84, 83, 45, 49, 51, 54, 55, 56, 128, 68, + 79, 84, 83, 45, 49, 51, 54, 55, 128, 68, 79, 84, 83, 45, 49, 51, 54, 128, + 68, 79, 84, 83, 45, 49, 51, 53, 56, 128, 68, 79, 84, 83, 45, 49, 51, 53, + 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 53, 55, 128, 68, 79, 84, 83, 45, + 49, 51, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 51, 53, 54, 55, 56, 128, + 68, 79, 84, 83, 45, 49, 51, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 51, + 53, 54, 128, 68, 79, 84, 83, 45, 49, 51, 53, 128, 68, 79, 84, 83, 45, 49, + 51, 52, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 55, 56, 128, 68, 79, 84, + 83, 45, 49, 51, 52, 55, 128, 68, 79, 84, 83, 45, 49, 51, 52, 54, 56, 128, + 68, 79, 84, 83, 45, 49, 51, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, + 51, 52, 54, 55, 128, 68, 79, 84, 83, 45, 49, 51, 52, 54, 128, 68, 79, 84, + 83, 45, 49, 51, 52, 53, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 55, + 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 55, 128, 68, 79, 84, 83, 45, + 49, 51, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 54, 55, + 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 54, 55, 128, 68, 79, 84, 83, + 45, 49, 51, 52, 53, 54, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 128, 68, + 79, 84, 83, 45, 49, 51, 52, 128, 68, 79, 84, 83, 45, 49, 51, 128, 68, 79, + 84, 83, 45, 49, 50, 56, 128, 68, 79, 84, 83, 45, 49, 50, 55, 56, 128, 68, + 79, 84, 83, 45, 49, 50, 55, 128, 68, 79, 84, 83, 45, 49, 50, 54, 56, 128, + 68, 79, 84, 83, 45, 49, 50, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, + 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 54, 128, 68, 79, 84, 83, 45, 49, + 50, 53, 56, 128, 68, 79, 84, 83, 45, 49, 50, 53, 55, 56, 128, 68, 79, 84, + 83, 45, 49, 50, 53, 55, 128, 68, 79, 84, 83, 45, 49, 50, 53, 54, 56, 128, + 68, 79, 84, 83, 45, 49, 50, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, + 50, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 53, 54, 128, 68, 79, 84, + 83, 45, 49, 50, 53, 128, 68, 79, 84, 83, 45, 49, 50, 52, 56, 128, 68, 79, + 84, 83, 45, 49, 50, 52, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 55, + 128, 68, 79, 84, 83, 45, 49, 50, 52, 54, 56, 128, 68, 79, 84, 83, 45, 49, + 50, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 54, 55, 128, 68, + 79, 84, 83, 45, 49, 50, 52, 54, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, + 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 55, 56, 128, 68, 79, 84, 83, + 45, 49, 50, 52, 53, 55, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 54, 56, + 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, + 45, 49, 50, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 54, + 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 128, 68, 79, 84, 83, 45, 49, 50, + 52, 128, 68, 79, 84, 83, 45, 49, 50, 51, 56, 128, 68, 79, 84, 83, 45, 49, + 50, 51, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 55, 128, 68, 79, 84, + 83, 45, 49, 50, 51, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 54, 55, + 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 54, 55, 128, 68, 79, 84, 83, 45, + 49, 50, 51, 54, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 56, 128, 68, 79, + 84, 83, 45, 49, 50, 51, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, + 53, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 54, 56, 128, 68, 79, 84, + 83, 45, 49, 50, 51, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, + 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 54, 128, 68, 79, 84, + 83, 45, 49, 50, 51, 53, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 56, 128, + 68, 79, 84, 83, 45, 49, 50, 51, 52, 55, 56, 128, 68, 79, 84, 83, 45, 49, + 50, 51, 52, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 54, 56, 128, 68, + 79, 84, 83, 45, 49, 50, 51, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, + 50, 51, 52, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 54, 128, 68, + 79, 84, 83, 45, 49, 50, 51, 52, 53, 56, 128, 68, 79, 84, 83, 45, 49, 50, + 51, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 55, 128, + 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, + 49, 50, 51, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, + 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 54, 128, 68, 79, + 84, 83, 45, 49, 50, 51, 52, 53, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, + 128, 68, 79, 84, 83, 45, 49, 50, 51, 128, 68, 79, 84, 83, 45, 49, 50, + 128, 68, 79, 84, 83, 45, 49, 128, 68, 79, 84, 83, 128, 68, 79, 84, 211, + 68, 79, 84, 76, 69, 83, 211, 68, 79, 82, 85, 128, 68, 79, 82, 79, 77, + 197, 68, 79, 79, 82, 128, 68, 79, 79, 78, 71, 128, 68, 79, 78, 71, 128, + 68, 79, 77, 65, 73, 206, 68, 79, 76, 80, 72, 73, 78, 128, 68, 79, 76, 76, + 83, 128, 68, 79, 76, 76, 65, 210, 68, 79, 76, 73, 85, 77, 128, 68, 79, + 75, 77, 65, 73, 128, 68, 79, 73, 84, 128, 68, 79, 73, 78, 199, 68, 79, + 73, 128, 68, 79, 71, 82, 193, 68, 79, 71, 128, 68, 79, 199, 68, 79, 69, + 211, 68, 79, 68, 69, 75, 65, 84, 65, 128, 68, 79, 67, 85, 77, 69, 78, 84, + 128, 68, 79, 67, 85, 77, 69, 78, 212, 68, 79, 66, 82, 79, 128, 68, 79, + 65, 67, 72, 65, 83, 72, 77, 69, 69, 128, 68, 79, 65, 67, 72, 65, 83, 72, + 77, 69, 197, 68, 79, 65, 128, 68, 79, 45, 79, 128, 68, 78, 193, 68, 77, + 128, 68, 205, 68, 76, 85, 128, 68, 76, 79, 128, 68, 76, 73, 128, 68, 76, + 72, 89, 65, 128, 68, 76, 72, 65, 128, 68, 76, 69, 69, 128, 68, 76, 65, + 128, 68, 76, 128, 68, 75, 65, 82, 128, 68, 75, 65, 210, 68, 74, 69, 82, + 86, 73, 128, 68, 74, 69, 82, 86, 128, 68, 74, 69, 128, 68, 74, 65, 128, + 68, 73, 90, 90, 217, 68, 73, 89, 193, 68, 73, 86, 79, 82, 67, 197, 68, + 73, 86, 73, 83, 73, 79, 78, 128, 68, 73, 86, 73, 83, 73, 79, 206, 68, 73, + 86, 73, 78, 199, 68, 73, 86, 73, 78, 65, 84, 73, 79, 78, 128, 68, 73, 86, + 73, 68, 69, 83, 128, 68, 73, 86, 73, 68, 69, 82, 83, 128, 68, 73, 86, 73, + 68, 69, 82, 128, 68, 73, 86, 73, 68, 69, 196, 68, 73, 86, 73, 68, 69, + 128, 68, 73, 86, 73, 68, 197, 68, 73, 86, 69, 82, 71, 69, 78, 67, 69, + 128, 68, 73, 84, 84, 207, 68, 73, 83, 84, 79, 82, 84, 73, 79, 78, 128, + 68, 73, 83, 84, 73, 78, 71, 85, 73, 83, 72, 128, 68, 73, 83, 84, 73, 76, + 76, 128, 68, 73, 83, 83, 79, 76, 86, 69, 45, 50, 128, 68, 73, 83, 83, 79, + 76, 86, 69, 128, 68, 73, 83, 80, 85, 84, 69, 196, 68, 73, 83, 80, 69, 82, + 83, 73, 79, 78, 128, 68, 73, 83, 75, 128, 68, 73, 83, 73, 77, 79, 85, + 128, 68, 73, 83, 72, 128, 68, 73, 83, 67, 79, 78, 84, 73, 78, 85, 79, 85, + 211, 68, 73, 83, 195, 68, 73, 83, 65, 80, 80, 79, 73, 78, 84, 69, 196, + 68, 73, 83, 65, 66, 76, 69, 196, 68, 73, 82, 71, 193, 68, 73, 82, 69, 67, + 84, 76, 217, 68, 73, 82, 69, 67, 84, 73, 79, 78, 65, 204, 68, 73, 82, 69, + 67, 84, 73, 79, 206, 68, 73, 80, 84, 69, 128, 68, 73, 80, 80, 69, 82, + 128, 68, 73, 80, 76, 79, 85, 78, 128, 68, 73, 80, 76, 73, 128, 68, 73, + 80, 76, 201, 68, 73, 78, 71, 66, 65, 212, 68, 73, 206, 68, 73, 77, 77, + 73, 78, 71, 128, 68, 73, 77, 73, 78, 85, 84, 73, 79, 78, 45, 51, 128, 68, + 73, 77, 73, 78, 85, 84, 73, 79, 78, 45, 50, 128, 68, 73, 77, 73, 78, 85, + 84, 73, 79, 78, 45, 49, 128, 68, 73, 77, 73, 78, 73, 83, 72, 77, 69, 78, + 84, 128, 68, 73, 77, 73, 68, 73, 193, 68, 73, 77, 69, 78, 83, 73, 79, 78, + 65, 204, 68, 73, 77, 69, 78, 83, 73, 79, 206, 68, 73, 77, 50, 128, 68, + 73, 77, 178, 68, 73, 76, 128, 68, 73, 71, 82, 65, 80, 72, 128, 68, 73, + 71, 82, 65, 80, 200, 68, 73, 71, 82, 65, 77, 77, 79, 211, 68, 73, 71, 82, + 65, 77, 77, 193, 68, 73, 71, 82, 65, 205, 68, 73, 71, 79, 82, 71, 79, 78, + 128, 68, 73, 71, 79, 82, 71, 79, 206, 68, 73, 71, 73, 84, 83, 128, 68, + 73, 71, 65, 77, 77, 65, 128, 68, 73, 71, 193, 68, 73, 70, 84, 79, 71, 71, + 79, 211, 68, 73, 70, 79, 78, 73, 65, 83, 128, 68, 73, 70, 70, 73, 67, 85, + 76, 84, 217, 68, 73, 70, 70, 73, 67, 85, 76, 84, 73, 69, 83, 128, 68, 73, + 70, 70, 69, 82, 69, 78, 84, 73, 65, 76, 128, 68, 73, 70, 70, 69, 82, 69, + 78, 67, 197, 68, 73, 70, 65, 84, 128, 68, 73, 69, 83, 73, 83, 128, 68, + 73, 69, 83, 73, 211, 68, 73, 69, 83, 69, 204, 68, 73, 69, 80, 128, 68, + 73, 197, 68, 73, 66, 128, 68, 73, 65, 84, 79, 78, 79, 206, 68, 73, 65, + 84, 79, 78, 73, 75, 201, 68, 73, 65, 83, 84, 79, 76, 201, 68, 73, 65, 77, + 79, 78, 68, 83, 128, 68, 73, 65, 77, 79, 78, 68, 128, 68, 73, 65, 77, 79, + 78, 196, 68, 73, 65, 77, 69, 84, 69, 210, 68, 73, 65, 76, 89, 84, 73, 75, + 65, 128, 68, 73, 65, 76, 89, 84, 73, 75, 193, 68, 73, 65, 76, 69, 67, 84, + 45, 208, 68, 73, 65, 71, 79, 78, 65, 76, 128, 68, 73, 65, 69, 82, 69, 83, + 73, 90, 69, 196, 68, 73, 65, 69, 82, 69, 83, 73, 83, 45, 82, 73, 78, 71, + 128, 68, 73, 65, 69, 82, 69, 83, 73, 83, 128, 68, 73, 65, 69, 82, 69, 83, + 73, 211, 68, 72, 79, 85, 128, 68, 72, 79, 79, 128, 68, 72, 79, 128, 68, + 72, 73, 73, 128, 68, 72, 72, 85, 128, 68, 72, 72, 79, 79, 128, 68, 72, + 72, 79, 128, 68, 72, 72, 73, 128, 68, 72, 72, 69, 69, 128, 68, 72, 72, + 69, 128, 68, 72, 72, 65, 128, 68, 72, 69, 69, 128, 68, 72, 65, 82, 77, + 65, 128, 68, 72, 65, 77, 69, 68, 72, 128, 68, 72, 65, 76, 69, 84, 72, + 128, 68, 72, 65, 76, 65, 84, 72, 128, 68, 72, 65, 76, 128, 68, 72, 65, + 68, 72, 69, 128, 68, 72, 65, 65, 76, 85, 128, 68, 72, 65, 65, 128, 68, + 72, 65, 128, 68, 69, 90, 200, 68, 69, 89, 84, 69, 82, 79, 213, 68, 69, + 89, 84, 69, 82, 79, 211, 68, 69, 88, 73, 65, 128, 68, 69, 86, 73, 67, + 197, 68, 69, 86, 69, 76, 79, 80, 77, 69, 78, 84, 128, 68, 69, 85, 78, 71, + 128, 68, 69, 83, 75, 84, 79, 208, 68, 69, 83, 203, 68, 69, 83, 73, 71, + 78, 128, 68, 69, 83, 73, 128, 68, 69, 83, 69, 82, 84, 128, 68, 69, 83, + 69, 82, 212, 68, 69, 83, 69, 82, 69, 212, 68, 69, 83, 67, 82, 73, 80, 84, + 73, 79, 206, 68, 69, 83, 67, 69, 78, 68, 73, 78, 199, 68, 69, 83, 67, 69, + 78, 68, 69, 82, 128, 68, 69, 82, 69, 84, 45, 72, 73, 68, 69, 84, 128, 68, + 69, 82, 69, 84, 128, 68, 69, 82, 69, 76, 73, 67, 212, 68, 69, 80, 84, 72, + 128, 68, 69, 80, 65, 82, 84, 85, 82, 69, 128, 68, 69, 80, 65, 82, 84, 77, + 69, 78, 212, 68, 69, 80, 65, 82, 84, 73, 78, 199, 68, 69, 78, 84, 73, 83, + 84, 82, 217, 68, 69, 78, 84, 65, 204, 68, 69, 78, 79, 77, 73, 78, 65, 84, + 79, 82, 128, 68, 69, 78, 79, 77, 73, 78, 65, 84, 79, 210, 68, 69, 78, 78, + 69, 78, 128, 68, 69, 78, 71, 128, 68, 69, 78, 197, 68, 69, 78, 65, 82, + 73, 85, 211, 68, 69, 76, 84, 65, 128, 68, 69, 76, 84, 193, 68, 69, 76, + 84, 128, 68, 69, 76, 80, 72, 73, 195, 68, 69, 76, 73, 86, 69, 82, 217, + 68, 69, 76, 73, 86, 69, 82, 65, 78, 67, 69, 128, 68, 69, 76, 73, 77, 73, + 84, 69, 82, 128, 68, 69, 76, 73, 77, 73, 84, 69, 210, 68, 69, 76, 73, 67, + 73, 79, 85, 211, 68, 69, 76, 69, 84, 73, 79, 206, 68, 69, 76, 69, 84, 69, + 128, 68, 69, 76, 69, 84, 197, 68, 69, 75, 65, 128, 68, 69, 75, 128, 68, + 69, 73, 128, 68, 69, 72, 73, 128, 68, 69, 71, 82, 69, 69, 83, 128, 68, + 69, 71, 82, 69, 197, 68, 69, 70, 73, 78, 73, 84, 73, 79, 78, 128, 68, 69, + 70, 69, 67, 84, 73, 86, 69, 78, 69, 83, 211, 68, 69, 69, 82, 128, 68, 69, + 69, 80, 76, 89, 128, 68, 69, 69, 76, 128, 68, 69, 67, 82, 69, 83, 67, 69, + 78, 68, 79, 128, 68, 69, 67, 82, 69, 65, 83, 69, 128, 68, 69, 67, 82, 69, + 65, 83, 197, 68, 69, 67, 79, 82, 65, 84, 73, 86, 197, 68, 69, 67, 79, 82, + 65, 84, 73, 79, 78, 128, 68, 69, 67, 73, 83, 73, 86, 69, 78, 69, 83, 83, + 128, 68, 69, 67, 73, 77, 65, 204, 68, 69, 67, 73, 68, 85, 79, 85, 211, + 68, 69, 67, 69, 77, 66, 69, 82, 128, 68, 69, 67, 65, 89, 69, 68, 128, 68, + 69, 66, 73, 212, 68, 69, 65, 84, 72, 128, 68, 69, 65, 198, 68, 69, 65, + 68, 128, 68, 68, 87, 65, 128, 68, 68, 85, 88, 128, 68, 68, 85, 84, 128, + 68, 68, 85, 82, 88, 128, 68, 68, 85, 82, 128, 68, 68, 85, 80, 128, 68, + 68, 85, 79, 88, 128, 68, 68, 85, 79, 80, 128, 68, 68, 85, 79, 128, 68, + 68, 85, 128, 68, 68, 79, 88, 128, 68, 68, 79, 84, 128, 68, 68, 79, 80, + 128, 68, 68, 79, 65, 128, 68, 68, 73, 88, 128, 68, 68, 73, 84, 128, 68, + 68, 73, 80, 128, 68, 68, 73, 69, 88, 128, 68, 68, 73, 69, 80, 128, 68, + 68, 73, 69, 128, 68, 68, 73, 128, 68, 68, 72, 85, 128, 68, 68, 72, 79, + 128, 68, 68, 72, 69, 69, 128, 68, 68, 72, 69, 128, 68, 68, 72, 65, 65, + 128, 68, 68, 72, 65, 128, 68, 68, 69, 88, 128, 68, 68, 69, 80, 128, 68, + 68, 69, 69, 128, 68, 68, 69, 128, 68, 68, 68, 72, 65, 128, 68, 68, 68, + 65, 128, 68, 68, 65, 89, 65, 78, 78, 65, 128, 68, 68, 65, 88, 128, 68, + 68, 65, 84, 128, 68, 68, 65, 80, 128, 68, 68, 65, 76, 128, 68, 68, 65, + 204, 68, 68, 65, 72, 65, 76, 128, 68, 68, 65, 72, 65, 204, 68, 68, 65, + 65, 128, 68, 67, 83, 128, 68, 67, 72, 69, 128, 68, 67, 52, 128, 68, 67, + 51, 128, 68, 67, 50, 128, 68, 67, 49, 128, 68, 194, 68, 65, 89, 45, 78, + 73, 71, 72, 84, 128, 68, 65, 217, 68, 65, 87, 66, 128, 68, 65, 86, 73, + 89, 65, 78, 73, 128, 68, 65, 86, 73, 68, 128, 68, 65, 84, 197, 68, 65, + 83, 73, 65, 128, 68, 65, 83, 73, 193, 68, 65, 83, 72, 69, 196, 68, 65, + 83, 72, 128, 68, 65, 83, 200, 68, 65, 83, 69, 73, 65, 128, 68, 65, 82, + 84, 128, 68, 65, 82, 75, 69, 78, 73, 78, 71, 128, 68, 65, 82, 75, 69, 78, + 73, 78, 199, 68, 65, 82, 203, 68, 65, 82, 71, 65, 128, 68, 65, 82, 65, + 52, 128, 68, 65, 82, 65, 51, 128, 68, 65, 82, 128, 68, 65, 80, 45, 80, + 82, 65, 205, 68, 65, 80, 45, 80, 73, 201, 68, 65, 80, 45, 77, 85, 79, + 217, 68, 65, 80, 45, 66, 85, 79, 206, 68, 65, 80, 45, 66, 69, 201, 68, + 65, 208, 68, 65, 78, 84, 65, 89, 65, 76, 65, 78, 128, 68, 65, 78, 84, 65, + 74, 193, 68, 65, 78, 71, 79, 128, 68, 65, 78, 71, 128, 68, 65, 78, 199, + 68, 65, 78, 68, 65, 128, 68, 65, 78, 67, 73, 78, 71, 128, 68, 65, 78, 67, + 69, 82, 128, 68, 65, 77, 80, 128, 68, 65, 77, 208, 68, 65, 77, 77, 65, + 84, 65, 78, 128, 68, 65, 77, 77, 65, 84, 65, 206, 68, 65, 77, 77, 65, + 128, 68, 65, 77, 77, 193, 68, 65, 77, 65, 82, 85, 128, 68, 65, 76, 69, + 84, 72, 45, 82, 69, 83, 72, 128, 68, 65, 76, 69, 84, 128, 68, 65, 76, 69, + 212, 68, 65, 76, 68, 65, 128, 68, 65, 76, 65, 84, 72, 128, 68, 65, 76, + 65, 84, 200, 68, 65, 76, 65, 84, 128, 68, 65, 73, 82, 128, 68, 65, 73, + 78, 71, 128, 68, 65, 73, 128, 68, 65, 72, 89, 65, 65, 85, 83, 72, 45, 50, + 128, 68, 65, 72, 89, 65, 65, 85, 83, 72, 128, 68, 65, 71, 83, 128, 68, + 65, 71, 71, 69, 82, 128, 68, 65, 71, 71, 69, 210, 68, 65, 71, 69, 83, 72, + 128, 68, 65, 71, 69, 83, 200, 68, 65, 71, 66, 65, 83, 73, 78, 78, 65, + 128, 68, 65, 71, 65, 218, 68, 65, 71, 65, 76, 71, 65, 128, 68, 65, 71, + 51, 128, 68, 65, 199, 68, 65, 69, 78, 71, 128, 68, 65, 69, 199, 68, 65, + 68, 128, 68, 65, 196, 68, 65, 65, 83, 85, 128, 68, 65, 65, 76, 73, 128, + 68, 65, 65, 68, 72, 85, 128, 68, 48, 54, 55, 72, 128, 68, 48, 54, 55, 71, + 128, 68, 48, 54, 55, 70, 128, 68, 48, 54, 55, 69, 128, 68, 48, 54, 55, + 68, 128, 68, 48, 54, 55, 67, 128, 68, 48, 54, 55, 66, 128, 68, 48, 54, + 55, 65, 128, 68, 48, 54, 55, 128, 68, 48, 54, 54, 128, 68, 48, 54, 53, + 128, 68, 48, 54, 52, 128, 68, 48, 54, 51, 128, 68, 48, 54, 50, 128, 68, + 48, 54, 49, 128, 68, 48, 54, 48, 128, 68, 48, 53, 57, 128, 68, 48, 53, + 56, 128, 68, 48, 53, 55, 128, 68, 48, 53, 54, 128, 68, 48, 53, 53, 128, + 68, 48, 53, 52, 65, 128, 68, 48, 53, 52, 128, 68, 48, 53, 51, 128, 68, + 48, 53, 50, 65, 128, 68, 48, 53, 50, 128, 68, 48, 53, 49, 128, 68, 48, + 53, 48, 73, 128, 68, 48, 53, 48, 72, 128, 68, 48, 53, 48, 71, 128, 68, + 48, 53, 48, 70, 128, 68, 48, 53, 48, 69, 128, 68, 48, 53, 48, 68, 128, + 68, 48, 53, 48, 67, 128, 68, 48, 53, 48, 66, 128, 68, 48, 53, 48, 65, + 128, 68, 48, 53, 48, 128, 68, 48, 52, 57, 128, 68, 48, 52, 56, 65, 128, + 68, 48, 52, 56, 128, 68, 48, 52, 55, 128, 68, 48, 52, 54, 65, 128, 68, + 48, 52, 54, 128, 68, 48, 52, 53, 128, 68, 48, 52, 52, 128, 68, 48, 52, + 51, 128, 68, 48, 52, 50, 128, 68, 48, 52, 49, 128, 68, 48, 52, 48, 128, + 68, 48, 51, 57, 128, 68, 48, 51, 56, 128, 68, 48, 51, 55, 128, 68, 48, + 51, 54, 128, 68, 48, 51, 53, 128, 68, 48, 51, 52, 65, 128, 68, 48, 51, + 52, 128, 68, 48, 51, 51, 128, 68, 48, 51, 50, 128, 68, 48, 51, 49, 65, + 128, 68, 48, 51, 49, 128, 68, 48, 51, 48, 128, 68, 48, 50, 57, 128, 68, + 48, 50, 56, 128, 68, 48, 50, 55, 65, 128, 68, 48, 50, 55, 128, 68, 48, + 50, 54, 128, 68, 48, 50, 53, 128, 68, 48, 50, 52, 128, 68, 48, 50, 51, + 128, 68, 48, 50, 50, 128, 68, 48, 50, 49, 128, 68, 48, 50, 48, 128, 68, + 48, 49, 57, 128, 68, 48, 49, 56, 128, 68, 48, 49, 55, 128, 68, 48, 49, + 54, 128, 68, 48, 49, 53, 128, 68, 48, 49, 52, 128, 68, 48, 49, 51, 128, + 68, 48, 49, 50, 128, 68, 48, 49, 49, 128, 68, 48, 49, 48, 128, 68, 48, + 48, 57, 128, 68, 48, 48, 56, 65, 128, 68, 48, 48, 56, 128, 68, 48, 48, + 55, 128, 68, 48, 48, 54, 128, 68, 48, 48, 53, 128, 68, 48, 48, 52, 128, + 68, 48, 48, 51, 128, 68, 48, 48, 50, 128, 68, 48, 48, 49, 128, 67, 89, + 88, 128, 67, 89, 84, 128, 67, 89, 82, 88, 128, 67, 89, 82, 69, 78, 65, + 73, 195, 67, 89, 82, 128, 67, 89, 80, 82, 73, 79, 212, 67, 89, 80, 69, + 82, 85, 83, 128, 67, 89, 80, 128, 67, 89, 76, 73, 78, 68, 82, 73, 67, 73, + 84, 89, 128, 67, 89, 67, 76, 79, 78, 69, 128, 67, 89, 65, 89, 128, 67, + 89, 65, 87, 128, 67, 89, 65, 128, 67, 87, 79, 79, 128, 67, 87, 79, 128, + 67, 87, 73, 73, 128, 67, 87, 73, 128, 67, 87, 69, 79, 82, 84, 72, 128, + 67, 87, 69, 128, 67, 87, 65, 65, 128, 67, 85, 88, 128, 67, 85, 85, 128, + 67, 85, 212, 67, 85, 83, 84, 79, 77, 83, 128, 67, 85, 83, 84, 79, 77, 69, + 210, 67, 85, 83, 84, 65, 82, 68, 128, 67, 85, 83, 80, 128, 67, 85, 82, + 88, 128, 67, 85, 82, 86, 73, 78, 199, 67, 85, 82, 86, 69, 68, 128, 67, + 85, 82, 86, 69, 196, 67, 85, 82, 86, 69, 128, 67, 85, 82, 86, 197, 67, + 85, 82, 83, 73, 86, 197, 67, 85, 82, 82, 217, 67, 85, 82, 82, 69, 78, 84, + 128, 67, 85, 82, 82, 69, 78, 212, 67, 85, 82, 76, 217, 67, 85, 82, 76, + 73, 78, 199, 67, 85, 82, 76, 128, 67, 85, 82, 128, 67, 85, 80, 80, 69, + 68, 128, 67, 85, 80, 80, 69, 196, 67, 85, 80, 73, 68, 79, 128, 67, 85, + 80, 67, 65, 75, 69, 128, 67, 85, 79, 88, 128, 67, 85, 79, 80, 128, 67, + 85, 79, 128, 67, 85, 205, 67, 85, 76, 84, 73, 86, 65, 84, 73, 79, 206, + 67, 85, 67, 85, 77, 66, 69, 82, 128, 67, 85, 66, 69, 68, 128, 67, 85, 66, + 69, 128, 67, 85, 66, 197, 67, 85, 65, 84, 82, 73, 76, 76, 79, 128, 67, + 85, 65, 84, 82, 73, 76, 76, 207, 67, 85, 65, 205, 67, 83, 73, 128, 67, + 82, 89, 83, 84, 65, 204, 67, 82, 89, 80, 84, 79, 71, 82, 65, 77, 77, 73, + 195, 67, 82, 89, 73, 78, 199, 67, 82, 85, 90, 69, 73, 82, 207, 67, 82, + 85, 67, 73, 70, 79, 82, 205, 67, 82, 85, 67, 73, 66, 76, 69, 45, 53, 128, + 67, 82, 85, 67, 73, 66, 76, 69, 45, 52, 128, 67, 82, 85, 67, 73, 66, 76, + 69, 45, 51, 128, 67, 82, 85, 67, 73, 66, 76, 69, 45, 50, 128, 67, 82, 85, + 67, 73, 66, 76, 69, 128, 67, 82, 79, 87, 78, 128, 67, 82, 79, 83, 83, 73, + 78, 71, 128, 67, 82, 79, 83, 83, 73, 78, 199, 67, 82, 79, 83, 83, 72, 65, + 84, 67, 200, 67, 82, 79, 83, 83, 69, 68, 45, 84, 65, 73, 76, 128, 67, 82, + 79, 83, 83, 69, 68, 128, 67, 82, 79, 83, 83, 69, 196, 67, 82, 79, 83, 83, + 66, 79, 78, 69, 83, 128, 67, 82, 79, 83, 83, 128, 67, 82, 79, 83, 211, + 67, 82, 79, 80, 128, 67, 82, 79, 73, 88, 128, 67, 82, 79, 73, 83, 83, 65, + 78, 84, 128, 67, 82, 79, 67, 85, 211, 67, 82, 79, 67, 79, 68, 73, 76, 69, + 128, 67, 82, 73, 67, 75, 69, 84, 128, 67, 82, 73, 67, 75, 69, 212, 67, + 82, 69, 83, 67, 69, 78, 84, 83, 128, 67, 82, 69, 83, 67, 69, 78, 84, 128, + 67, 82, 69, 83, 67, 69, 78, 212, 67, 82, 69, 68, 73, 212, 67, 82, 69, 65, + 84, 73, 86, 197, 67, 82, 69, 65, 77, 128, 67, 82, 65, 89, 79, 78, 128, + 67, 82, 65, 66, 128, 67, 82, 128, 67, 79, 88, 128, 67, 79, 87, 66, 79, + 217, 67, 79, 87, 128, 67, 79, 215, 67, 79, 86, 69, 82, 73, 78, 199, 67, + 79, 86, 69, 82, 128, 67, 79, 85, 80, 76, 197, 67, 79, 85, 78, 84, 73, 78, + 199, 67, 79, 85, 78, 84, 69, 82, 83, 73, 78, 75, 128, 67, 79, 85, 78, 84, + 69, 82, 66, 79, 82, 69, 128, 67, 79, 85, 78, 67, 73, 204, 67, 79, 85, 67, 200, 67, 79, 84, 128, 67, 79, 82, 82, 69, 83, 80, 79, 78, 68, 211, 67, 79, 82, 82, 69, 67, 84, 128, 67, 79, 82, 80, 83, 69, 128, 67, 79, 82, 80, 79, 82, 65, 84, 73, 79, 78, 128, 67, 79, 82, 79, 78, 73, 83, 128, 67, 79, - 82, 78, 69, 82, 83, 128, 67, 79, 82, 78, 69, 82, 128, 67, 79, 82, 78, 69, - 210, 67, 79, 82, 75, 128, 67, 79, 80, 89, 82, 73, 71, 72, 84, 128, 67, - 79, 80, 89, 82, 73, 71, 72, 212, 67, 79, 80, 89, 76, 69, 70, 212, 67, 79, - 80, 89, 128, 67, 79, 80, 82, 79, 68, 85, 67, 84, 128, 67, 79, 80, 80, 69, - 82, 45, 50, 128, 67, 79, 80, 80, 69, 82, 128, 67, 79, 80, 128, 67, 79, - 79, 76, 128, 67, 79, 79, 75, 73, 78, 71, 128, 67, 79, 79, 75, 73, 69, - 128, 67, 79, 79, 75, 69, 196, 67, 79, 79, 128, 67, 79, 78, 86, 69, 82, - 71, 73, 78, 199, 67, 79, 78, 86, 69, 78, 73, 69, 78, 67, 197, 67, 79, 78, - 84, 82, 79, 76, 128, 67, 79, 78, 84, 82, 79, 204, 67, 79, 78, 84, 82, 65, - 82, 73, 69, 84, 89, 128, 67, 79, 78, 84, 82, 65, 67, 84, 73, 79, 78, 128, - 67, 79, 78, 84, 79, 85, 82, 69, 196, 67, 79, 78, 84, 79, 85, 210, 67, 79, - 78, 84, 73, 78, 85, 73, 78, 199, 67, 79, 78, 84, 73, 78, 85, 65, 84, 73, - 79, 206, 67, 79, 78, 84, 69, 78, 84, 73, 79, 78, 128, 67, 79, 78, 84, 69, - 77, 80, 76, 65, 84, 73, 79, 78, 128, 67, 79, 78, 84, 65, 73, 78, 211, 67, - 79, 78, 84, 65, 73, 78, 73, 78, 199, 67, 79, 78, 84, 65, 73, 206, 67, 79, - 78, 84, 65, 67, 84, 128, 67, 79, 78, 83, 84, 82, 85, 67, 84, 73, 79, 78, - 128, 67, 79, 78, 83, 84, 82, 85, 67, 84, 73, 79, 206, 67, 79, 78, 83, 84, - 65, 78, 84, 128, 67, 79, 78, 83, 84, 65, 78, 212, 67, 79, 78, 83, 84, 65, - 78, 67, 89, 128, 67, 79, 78, 83, 69, 67, 85, 84, 73, 86, 197, 67, 79, 78, - 74, 85, 78, 67, 84, 73, 79, 78, 128, 67, 79, 78, 74, 85, 71, 65, 84, 197, - 67, 79, 78, 74, 79, 73, 78, 73, 78, 199, 67, 79, 78, 74, 79, 73, 78, 69, - 68, 128, 67, 79, 78, 74, 79, 73, 78, 69, 196, 67, 79, 78, 73, 67, 65, - 204, 67, 79, 78, 71, 82, 85, 69, 78, 212, 67, 79, 78, 71, 82, 65, 84, 85, - 76, 65, 84, 73, 79, 78, 128, 67, 79, 78, 70, 85, 83, 69, 196, 67, 79, 78, - 70, 79, 85, 78, 68, 69, 196, 67, 79, 78, 70, 76, 73, 67, 84, 128, 67, 79, - 78, 70, 69, 84, 84, 201, 67, 79, 78, 67, 65, 86, 69, 45, 83, 73, 68, 69, - 196, 67, 79, 78, 67, 65, 86, 69, 45, 80, 79, 73, 78, 84, 69, 196, 67, 79, - 77, 80, 85, 84, 69, 82, 83, 128, 67, 79, 77, 80, 85, 84, 69, 82, 128, 67, - 79, 77, 80, 82, 69, 83, 83, 73, 79, 78, 128, 67, 79, 77, 80, 82, 69, 83, - 83, 69, 196, 67, 79, 77, 80, 79, 83, 73, 84, 73, 79, 78, 128, 67, 79, 77, - 80, 79, 83, 73, 84, 73, 79, 206, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 55, 53, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 53, 52, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 53, 51, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 55, 53, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 55, 53, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 53, - 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, 57, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, 56, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 55, 52, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 55, 52, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, 53, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, 52, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 55, 52, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 55, 52, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, - 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, 48, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, 57, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 55, 51, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 55, 51, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, 54, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, 53, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 55, 51, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 55, 51, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, - 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, 49, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, 48, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 55, 50, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 55, 50, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 55, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 54, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 55, 50, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 55, 50, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, - 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 50, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 49, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 55, 50, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 55, 49, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, 56, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, 55, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 55, 49, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 55, 49, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, - 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, 51, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, 50, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 55, 49, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 55, 49, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, 57, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, 56, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 55, 48, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 55, 48, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, - 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, 52, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, 51, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 55, 48, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 55, 48, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, 48, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, 57, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 57, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 57, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, - 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, 53, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, 52, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 57, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 57, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, 49, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, 48, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 56, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 56, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, - 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 54, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 53, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 56, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 56, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 50, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 49, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 56, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 55, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, - 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 55, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 54, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 55, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 55, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 51, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 50, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 55, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 55, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, - 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, 56, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, 55, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 54, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 54, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, 52, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, 51, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 54, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 54, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, - 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, 57, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, 56, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 53, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 53, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, 53, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, 52, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 53, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 53, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, - 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, 48, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, 57, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 52, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 52, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, 54, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, 53, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 52, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 52, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, - 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, 49, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, 48, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 51, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 51, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 55, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 54, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 51, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 51, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, - 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 50, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 49, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 51, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 50, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, 56, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, 55, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 50, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 50, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, - 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, 51, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, 50, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 50, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 50, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, 57, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, 56, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 49, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 49, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, - 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, 52, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, 51, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 49, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 49, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, 48, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, 57, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 48, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 48, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, - 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, 53, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, 52, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 48, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 48, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, 49, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, 48, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 57, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 57, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, - 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 54, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 53, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 57, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 57, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 50, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 49, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 57, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 56, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, - 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 55, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 54, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 56, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 56, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 51, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 50, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 56, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 56, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, - 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, 56, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, 55, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 55, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 55, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, 52, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, 51, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 55, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 55, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, - 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, 57, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, 56, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 54, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 54, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, 53, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, 52, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 54, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 54, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, - 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, 48, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, 57, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 53, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 53, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, 54, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, 53, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 53, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 53, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, - 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, 49, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, 48, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 52, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 52, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 55, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 54, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 52, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 52, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, - 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 50, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 49, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 52, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 51, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, 56, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, 55, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 51, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 51, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, - 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, 51, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, 50, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 51, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 51, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, 57, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, 56, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 50, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 50, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, - 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, 52, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, 51, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 50, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 50, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, 48, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, 57, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 49, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 49, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, - 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, 53, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, 52, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 49, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 49, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, 49, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, 48, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 48, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 48, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, - 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 54, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 53, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 48, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 48, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 50, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 49, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 48, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 57, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, - 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 55, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 54, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 57, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 57, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 51, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 50, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 57, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 57, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, - 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, 56, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, 55, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 56, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 56, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, 52, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, 51, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 56, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 56, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, - 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, 57, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, 56, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 55, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 55, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, 53, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, 52, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 55, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 55, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, - 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, 48, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, 57, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 54, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 54, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, 54, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, 53, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 54, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 54, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, - 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, 49, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, 48, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 53, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 53, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 55, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 54, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 53, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 53, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, - 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 50, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 49, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 53, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 52, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, 56, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, 55, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 52, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 52, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, - 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, 51, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, 50, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 52, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 52, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, 57, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, 56, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 51, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 51, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, - 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, 52, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, 51, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 51, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 51, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, 48, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, 57, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 50, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 50, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, - 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, 53, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, 52, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 50, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 50, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, 49, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, 48, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 49, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 49, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, - 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 54, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 53, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 49, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 49, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 50, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 49, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 49, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 48, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, - 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 55, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 54, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 48, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 48, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 51, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 50, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 48, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 48, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, - 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, 56, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, 55, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 57, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 57, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, 52, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, 51, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 57, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 57, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, - 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, 57, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, 56, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 56, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 56, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, 53, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, 52, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 56, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 56, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, - 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, 48, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, 57, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 55, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 55, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, 54, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, 53, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 55, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 55, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, - 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, 49, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, 48, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 54, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 54, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 55, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 54, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 54, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 54, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, - 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 50, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 49, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 54, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 53, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, 56, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, 55, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 53, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 53, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, - 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, 51, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, 50, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 53, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 53, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, 57, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, 56, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 52, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 52, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, - 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, 52, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, 51, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 52, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 52, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, 48, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, 57, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 51, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 51, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, - 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, 53, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, 52, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 51, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 51, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, 49, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, 48, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 50, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 50, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, - 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 54, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 53, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 50, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 50, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 50, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 49, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 50, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 49, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, - 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 55, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 54, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 49, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 49, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 51, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 50, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 49, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 49, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, - 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, 56, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, 55, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 48, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 48, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, 52, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, 51, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 48, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 48, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, - 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, 57, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, 56, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 57, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 57, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, 53, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, 52, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 57, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 57, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, - 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, 48, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, 57, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 56, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 56, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, 54, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, 53, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 56, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 56, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, - 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, 49, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, 48, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 55, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 55, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 55, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 54, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 55, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 55, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, - 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 50, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 49, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 55, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 54, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, 56, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, 55, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 54, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 54, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, - 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, 51, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, 50, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 54, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 54, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, 57, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, 56, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 53, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 53, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, - 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, 52, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, 51, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 53, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 53, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, 48, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, 57, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 52, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 52, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, - 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, 53, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, 52, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 52, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 52, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, 49, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, 48, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 51, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 51, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, - 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 54, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 53, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 51, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 51, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 50, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 49, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 51, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 50, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, - 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 55, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 54, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 50, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 50, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 51, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 50, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 50, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 50, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, - 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, 56, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, 55, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 49, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 49, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, 52, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, 51, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 49, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 49, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, - 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, 57, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, 56, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 48, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 48, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, 53, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, 52, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 48, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 48, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, - 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, 48, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, 57, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 57, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 57, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, 54, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, 53, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 57, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 57, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, - 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, 49, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, 48, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 56, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 56, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 55, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 54, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 56, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 56, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, - 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 50, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 49, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 56, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 55, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, 56, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, 55, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 55, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 55, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, - 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, 51, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, 50, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 55, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 55, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, 57, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, 56, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 54, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 54, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, - 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, 52, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, 51, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 54, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 54, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, 48, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, 57, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 53, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 53, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, - 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, 53, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, 52, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 53, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 53, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, 49, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, 48, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 52, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 52, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, - 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 54, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 53, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 52, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 52, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 50, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 49, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 52, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 51, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, - 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 55, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 54, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 51, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 51, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 51, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 50, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 51, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 51, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, - 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, 56, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, 55, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 50, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 50, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, 52, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, 51, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 50, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 50, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, - 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, 57, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, 56, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 49, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 49, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, 53, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, 52, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 49, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 49, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, - 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, 48, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, 57, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 48, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 48, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, 54, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, 53, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 48, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 48, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, - 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, 49, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, 48, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 57, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 57, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 55, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 54, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 57, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 57, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, - 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 50, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 49, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 57, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 56, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, 56, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, 55, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 56, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 56, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, - 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, 51, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, 50, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 56, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 56, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, 57, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, 56, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 55, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 55, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, - 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, 52, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, 51, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 55, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 55, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, 48, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, 57, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 54, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 54, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, - 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, 53, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, 52, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 54, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 54, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, 49, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, 48, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 53, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 53, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, - 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 54, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 53, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 53, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 53, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 50, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 49, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 53, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 52, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, - 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 55, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 54, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 52, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 52, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 51, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 50, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 52, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 52, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, - 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, 56, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, 55, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 51, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 51, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, 52, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, 51, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 51, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 51, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, - 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, 57, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, 56, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 50, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 50, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, 53, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, 52, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 50, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 50, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, - 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, 48, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, 57, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 49, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 49, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, 54, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, 53, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 49, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 49, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, - 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, 49, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, 48, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 48, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 48, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, 55, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, 54, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 48, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 48, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, - 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, 50, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, 49, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 212, 67, 79, 77, 80, 76, 73, 65, 78, 67, 69, 128, 67, 79, 77, 80, - 76, 69, 84, 73, 79, 78, 128, 67, 79, 77, 80, 76, 69, 84, 69, 68, 128, 67, - 79, 77, 80, 76, 69, 77, 69, 78, 84, 128, 67, 79, 77, 80, 65, 83, 83, 128, - 67, 79, 77, 80, 65, 82, 69, 128, 67, 79, 77, 77, 79, 206, 67, 79, 77, 77, - 69, 82, 67, 73, 65, 204, 67, 79, 77, 77, 65, 78, 68, 128, 67, 79, 77, 77, - 65, 128, 67, 79, 77, 77, 193, 67, 79, 77, 69, 84, 128, 67, 79, 77, 66, - 73, 78, 69, 68, 128, 67, 79, 77, 66, 73, 78, 65, 84, 73, 79, 78, 128, 67, - 79, 77, 66, 128, 67, 79, 76, 85, 77, 78, 128, 67, 79, 76, 79, 82, 128, - 67, 79, 76, 76, 73, 83, 73, 79, 206, 67, 79, 76, 76, 128, 67, 79, 76, - 196, 67, 79, 70, 70, 73, 78, 128, 67, 79, 69, 78, 71, 128, 67, 79, 69, - 78, 199, 67, 79, 68, 65, 128, 67, 79, 67, 79, 78, 85, 84, 128, 67, 79, - 67, 75, 84, 65, 73, 204, 67, 79, 65, 84, 128, 67, 79, 65, 83, 84, 69, 82, - 128, 67, 79, 65, 128, 67, 77, 128, 67, 205, 67, 76, 85, 83, 84, 69, 82, - 45, 73, 78, 73, 84, 73, 65, 204, 67, 76, 85, 83, 84, 69, 82, 45, 70, 73, - 78, 65, 204, 67, 76, 85, 83, 84, 69, 210, 67, 76, 85, 66, 83, 128, 67, - 76, 85, 66, 45, 83, 80, 79, 75, 69, 196, 67, 76, 85, 66, 128, 67, 76, 85, - 194, 67, 76, 79, 87, 206, 67, 76, 79, 86, 69, 82, 128, 67, 76, 79, 85, - 68, 128, 67, 76, 79, 85, 196, 67, 76, 79, 84, 72, 69, 83, 128, 67, 76, - 79, 84, 72, 128, 67, 76, 79, 83, 69, 84, 128, 67, 76, 79, 83, 69, 78, 69, - 83, 83, 128, 67, 76, 79, 83, 69, 68, 128, 67, 76, 79, 83, 197, 67, 76, - 79, 67, 75, 87, 73, 83, 197, 67, 76, 79, 67, 203, 67, 76, 73, 86, 73, 83, - 128, 67, 76, 73, 80, 66, 79, 65, 82, 68, 128, 67, 76, 73, 78, 75, 73, 78, - 199, 67, 76, 73, 78, 71, 73, 78, 199, 67, 76, 73, 77, 66, 73, 78, 71, - 128, 67, 76, 73, 77, 65, 67, 85, 83, 128, 67, 76, 73, 70, 70, 128, 67, - 76, 73, 67, 75, 128, 67, 76, 69, 70, 45, 50, 128, 67, 76, 69, 70, 45, 49, - 128, 67, 76, 69, 70, 128, 67, 76, 69, 198, 67, 76, 69, 65, 86, 69, 82, - 128, 67, 76, 69, 65, 210, 67, 76, 65, 83, 83, 73, 67, 65, 204, 67, 76, - 65, 80, 80, 73, 78, 199, 67, 76, 65, 80, 80, 69, 210, 67, 76, 65, 78, - 128, 67, 76, 65, 206, 67, 76, 65, 77, 83, 72, 69, 76, 204, 67, 76, 65, - 73, 77, 128, 67, 76, 128, 67, 73, 88, 128, 67, 73, 86, 73, 76, 73, 65, - 78, 128, 67, 73, 84, 89, 83, 67, 65, 80, 69, 128, 67, 73, 84, 89, 83, 67, - 65, 80, 197, 67, 73, 84, 201, 67, 73, 84, 65, 84, 73, 79, 206, 67, 73, - 84, 128, 67, 73, 82, 67, 85, 211, 67, 73, 82, 67, 85, 77, 70, 76, 69, 88, - 128, 67, 73, 82, 67, 85, 77, 70, 76, 69, 216, 67, 73, 82, 67, 85, 76, 65, - 84, 73, 79, 206, 67, 73, 82, 67, 76, 73, 78, 71, 128, 67, 73, 82, 67, 76, - 73, 78, 199, 67, 73, 82, 67, 76, 69, 83, 128, 67, 73, 82, 67, 76, 69, - 211, 67, 73, 82, 67, 76, 69, 68, 128, 67, 73, 80, 128, 67, 73, 78, 78, - 65, 66, 65, 82, 128, 67, 73, 78, 69, 77, 65, 128, 67, 73, 206, 67, 73, - 205, 67, 73, 73, 128, 67, 73, 69, 88, 128, 67, 73, 69, 85, 67, 45, 83, - 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 67, 73, 69, 85, 67, 45, 80, 73, - 69, 85, 80, 128, 67, 73, 69, 85, 67, 45, 73, 69, 85, 78, 71, 128, 67, 73, - 69, 85, 195, 67, 73, 69, 84, 128, 67, 73, 69, 80, 128, 67, 73, 69, 128, - 67, 72, 89, 88, 128, 67, 72, 89, 84, 128, 67, 72, 89, 82, 88, 128, 67, - 72, 89, 82, 128, 67, 72, 89, 80, 128, 67, 72, 87, 86, 128, 67, 72, 85, - 88, 128, 67, 72, 85, 82, 88, 128, 67, 72, 85, 82, 67, 72, 128, 67, 72, - 85, 82, 128, 67, 72, 85, 80, 128, 67, 72, 85, 79, 88, 128, 67, 72, 85, - 79, 84, 128, 67, 72, 85, 79, 80, 128, 67, 72, 85, 79, 128, 67, 72, 85, - 76, 65, 128, 67, 72, 85, 128, 67, 72, 82, 89, 83, 65, 78, 84, 72, 69, 77, - 85, 77, 128, 67, 72, 82, 79, 78, 79, 85, 128, 67, 72, 82, 79, 78, 79, 78, - 128, 67, 72, 82, 79, 77, 193, 67, 72, 82, 79, 193, 67, 72, 82, 73, 86, - 73, 128, 67, 72, 82, 73, 83, 84, 77, 65, 83, 128, 67, 72, 82, 73, 83, 84, - 77, 65, 211, 67, 72, 79, 89, 128, 67, 72, 79, 88, 128, 67, 72, 79, 84, - 128, 67, 72, 79, 82, 69, 86, 77, 193, 67, 72, 79, 80, 83, 84, 73, 67, 75, - 83, 128, 67, 72, 79, 80, 128, 67, 72, 79, 75, 69, 128, 67, 72, 79, 69, - 128, 67, 72, 79, 67, 79, 76, 65, 84, 197, 67, 72, 79, 65, 128, 67, 72, - 207, 67, 72, 73, 84, 85, 69, 85, 77, 83, 83, 65, 78, 71, 83, 73, 79, 83, + 82, 78, 73, 83, 200, 67, 79, 82, 78, 69, 82, 83, 128, 67, 79, 82, 78, 69, + 82, 128, 67, 79, 82, 78, 69, 210, 67, 79, 82, 75, 128, 67, 79, 80, 89, + 82, 73, 71, 72, 84, 128, 67, 79, 80, 89, 82, 73, 71, 72, 212, 67, 79, 80, + 89, 76, 69, 70, 212, 67, 79, 80, 89, 128, 67, 79, 80, 82, 79, 68, 85, 67, + 84, 128, 67, 79, 80, 80, 69, 82, 45, 50, 128, 67, 79, 80, 80, 69, 82, + 128, 67, 79, 80, 128, 67, 79, 79, 76, 128, 67, 79, 79, 75, 73, 78, 71, + 128, 67, 79, 79, 75, 73, 69, 128, 67, 79, 79, 75, 69, 196, 67, 79, 79, + 128, 67, 79, 78, 86, 69, 82, 71, 73, 78, 199, 67, 79, 78, 86, 69, 78, 73, + 69, 78, 67, 197, 67, 79, 78, 84, 82, 79, 76, 128, 67, 79, 78, 84, 82, 79, + 204, 67, 79, 78, 84, 82, 65, 82, 73, 69, 84, 89, 128, 67, 79, 78, 84, 82, + 65, 67, 84, 73, 79, 78, 128, 67, 79, 78, 84, 79, 85, 82, 69, 196, 67, 79, + 78, 84, 79, 85, 210, 67, 79, 78, 84, 73, 78, 85, 73, 78, 199, 67, 79, 78, + 84, 73, 78, 85, 65, 84, 73, 79, 206, 67, 79, 78, 84, 69, 78, 84, 73, 79, + 78, 128, 67, 79, 78, 84, 69, 77, 80, 76, 65, 84, 73, 79, 78, 128, 67, 79, + 78, 84, 65, 73, 78, 211, 67, 79, 78, 84, 65, 73, 78, 73, 78, 199, 67, 79, + 78, 84, 65, 73, 206, 67, 79, 78, 84, 65, 67, 84, 128, 67, 79, 78, 83, 84, + 82, 85, 67, 84, 73, 79, 78, 128, 67, 79, 78, 83, 84, 82, 85, 67, 84, 73, + 79, 206, 67, 79, 78, 83, 84, 65, 78, 84, 128, 67, 79, 78, 83, 84, 65, 78, + 212, 67, 79, 78, 83, 84, 65, 78, 67, 89, 128, 67, 79, 78, 83, 69, 67, 85, + 84, 73, 86, 197, 67, 79, 78, 74, 85, 78, 67, 84, 73, 79, 78, 128, 67, 79, + 78, 74, 85, 71, 65, 84, 197, 67, 79, 78, 74, 79, 73, 78, 73, 78, 199, 67, + 79, 78, 74, 79, 73, 78, 69, 68, 128, 67, 79, 78, 74, 79, 73, 78, 69, 196, + 67, 79, 78, 73, 67, 65, 204, 67, 79, 78, 71, 82, 85, 69, 78, 212, 67, 79, + 78, 71, 82, 65, 84, 85, 76, 65, 84, 73, 79, 78, 128, 67, 79, 78, 70, 85, + 83, 69, 196, 67, 79, 78, 70, 79, 85, 78, 68, 69, 196, 67, 79, 78, 70, 76, + 73, 67, 84, 128, 67, 79, 78, 70, 69, 84, 84, 201, 67, 79, 78, 67, 65, 86, + 69, 45, 83, 73, 68, 69, 196, 67, 79, 78, 67, 65, 86, 69, 45, 80, 79, 73, + 78, 84, 69, 196, 67, 79, 77, 80, 85, 84, 69, 82, 83, 128, 67, 79, 77, 80, + 85, 84, 69, 82, 128, 67, 79, 77, 80, 82, 69, 83, 83, 73, 79, 78, 128, 67, + 79, 77, 80, 82, 69, 83, 83, 69, 196, 67, 79, 77, 80, 79, 83, 73, 84, 73, + 79, 78, 128, 67, 79, 77, 80, 79, 83, 73, 84, 73, 79, 206, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 55, 53, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 55, 53, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 53, + 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 53, 50, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 55, 53, 49, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 55, 53, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 55, 52, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, 56, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, 55, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 55, 52, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 55, 52, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, + 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, 51, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, 50, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 55, 52, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 55, 52, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, 57, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, 56, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 55, 51, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 55, 51, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, + 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, 52, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, 51, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 55, 51, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 55, 51, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, 48, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 57, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 55, 50, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 55, 50, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, + 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 53, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 52, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 55, 50, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 55, 50, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 49, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 48, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 55, 49, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 55, 49, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, + 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, 54, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, 53, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 55, 49, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 55, 49, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, 50, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, 49, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 55, 49, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 55, 48, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, + 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, 55, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, 54, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 55, 48, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 55, 48, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, 51, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, 50, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 55, 48, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 55, 48, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, + 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, 56, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, 55, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 57, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 57, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, 52, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, 51, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 57, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 57, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, + 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 57, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 56, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 56, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 56, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 53, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 52, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 56, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 56, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, + 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 48, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 57, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 55, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 55, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 54, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 53, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 55, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 55, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, + 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 49, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 48, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 54, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 54, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, 55, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, 54, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 54, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 54, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, + 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, 50, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, 49, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 54, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 53, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, 56, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, 55, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 53, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 53, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, + 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, 51, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, 50, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 53, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 53, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, 57, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, 56, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 52, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 52, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, + 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, 52, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, 51, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 52, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 52, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, 48, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 57, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 51, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 51, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, + 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 53, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 52, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 51, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 51, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 49, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 48, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 50, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 50, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, + 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, 54, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, 53, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 50, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 50, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, 50, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, 49, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 50, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 49, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, + 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, 55, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, 54, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 49, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 49, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, 51, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, 50, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 49, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 49, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, + 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, 56, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, 55, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 48, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 48, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, 52, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, 51, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 48, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 48, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, + 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 57, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 56, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 57, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 57, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 53, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 52, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 57, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 57, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, + 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 48, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 57, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 56, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 56, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 54, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 53, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 56, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 56, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, + 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 49, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 48, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 55, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 55, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, 55, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, 54, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 55, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 55, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, + 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, 50, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, 49, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 55, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 54, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, 56, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, 55, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 54, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 54, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, + 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, 51, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, 50, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 54, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 54, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, 57, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, 56, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 53, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 53, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, + 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, 52, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, 51, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 53, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 53, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, 48, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 57, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 52, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 52, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, + 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 53, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 52, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 52, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 52, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 49, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 48, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 51, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 51, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, + 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, 54, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, 53, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 51, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 51, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, 50, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, 49, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 51, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 50, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, + 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, 55, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, 54, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 50, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 50, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, 51, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, 50, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 50, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 50, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, + 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, 56, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, 55, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 49, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 49, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, 52, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, 51, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 49, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 49, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, + 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 57, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 56, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 48, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 48, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 53, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 52, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 48, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 48, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, + 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 48, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 57, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 57, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 57, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 54, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 53, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 57, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 57, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, + 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 49, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 48, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 56, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 56, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, 55, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, 54, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 56, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 56, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, + 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, 50, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, 49, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 56, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 55, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, 56, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, 55, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 55, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 55, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, + 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, 51, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, 50, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 55, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 55, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, 57, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, 56, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 54, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 54, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, + 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, 52, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, 51, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 54, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 54, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, 48, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 57, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 53, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 53, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, + 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 53, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 52, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 53, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 53, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 49, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 48, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 52, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 52, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, + 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, 54, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, 53, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 52, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 52, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, 50, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, 49, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 52, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 51, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, + 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, 55, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, 54, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 51, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 51, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, 51, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, 50, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 51, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 51, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, + 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, 56, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, 55, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 50, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 50, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, 52, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, 51, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 50, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 50, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, + 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 57, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 56, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 49, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 49, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 53, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 52, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 49, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 49, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, + 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 48, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 57, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 48, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 48, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 54, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 53, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 48, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 48, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, + 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 49, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 48, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 57, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 57, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, 55, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, 54, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 57, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 57, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, + 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, 50, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, 49, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 57, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 56, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, 56, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, 55, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 56, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 56, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, + 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, 51, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, 50, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 56, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 56, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, 57, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, 56, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 55, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 55, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, + 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, 52, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, 51, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 55, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 55, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, 48, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 57, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 54, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 54, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, + 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 53, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 52, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 54, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 54, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 49, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 48, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 53, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 53, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, + 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, 54, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, 53, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 53, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 53, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, 50, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, 49, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 53, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 52, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, + 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, 55, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, 54, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 52, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 52, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, 51, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, 50, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 52, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 52, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, + 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, 56, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, 55, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 51, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 51, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, 52, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, 51, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 51, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 51, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, + 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 57, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 56, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 50, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 50, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 53, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 52, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 50, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 50, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, + 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 48, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 57, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 49, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 49, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 54, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 53, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 49, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 49, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, + 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 49, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 48, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 48, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 48, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, 55, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, 54, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 48, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 48, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, + 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, 50, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, 49, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 48, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 57, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, 56, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, 55, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 57, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 57, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, + 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, 51, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, 50, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 57, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 57, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, 57, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, 56, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 56, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 56, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, + 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, 52, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, 51, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 56, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 56, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, 48, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 57, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 55, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 55, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, + 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 53, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 52, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 55, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 55, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 49, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 48, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 54, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 54, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, + 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, 54, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, 53, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 54, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 54, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, 50, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, 49, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 54, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 53, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, + 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, 55, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, 54, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 53, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 53, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, 51, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, 50, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 53, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 53, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, + 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, 56, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, 55, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 52, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 52, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, 52, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, 51, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 52, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 52, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, + 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 57, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 56, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 51, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 51, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 53, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 52, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 51, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 51, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, + 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 48, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 57, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 50, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 50, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 54, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 53, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 50, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 50, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, + 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 49, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 48, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 49, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 49, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, 55, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, 54, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 49, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 49, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, + 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, 50, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, 49, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 49, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 48, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, 56, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, 55, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 48, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 48, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, + 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, 51, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, 50, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 48, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 48, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, 57, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, 56, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 57, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 57, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, + 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, 52, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, 51, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 57, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 57, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, 48, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 57, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 56, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 56, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, + 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 53, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 52, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 56, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 56, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 49, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 48, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 55, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 55, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, + 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, 54, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, 53, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 55, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 55, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, 50, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, 49, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 55, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 54, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, + 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, 55, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, 54, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 54, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 54, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, 51, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, 50, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 54, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 54, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, + 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, 56, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, 55, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 53, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 53, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, 52, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, 51, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 53, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 53, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, + 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 57, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 56, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 52, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 52, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 53, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 52, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 52, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 52, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, + 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 48, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 57, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 51, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 51, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 54, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 53, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 51, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 51, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, + 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 49, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 48, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 50, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 50, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, 55, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, 54, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 50, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 50, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, + 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, 50, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, 49, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 50, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 49, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, 56, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, 55, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 49, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 49, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, + 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, 51, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, 50, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 49, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 49, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, 57, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, 56, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 48, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 48, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, + 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, 52, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, 51, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 48, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 48, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, 48, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 57, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 57, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 57, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, + 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 53, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 52, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 57, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 57, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 49, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 48, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 56, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 56, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, + 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, 54, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, 53, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 56, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 56, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, 50, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, 49, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 56, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 55, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, + 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, 55, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, 54, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 55, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 55, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, 51, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, 50, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 55, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 55, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, + 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, 56, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, 55, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 54, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 54, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, 52, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, 51, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 54, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 54, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, + 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 57, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 56, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 53, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 53, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 53, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 52, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 53, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 53, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, + 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 48, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 57, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 52, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 52, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 54, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 53, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 52, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 52, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, + 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 49, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 48, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 51, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 51, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, 55, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, 54, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 51, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 51, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, + 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, 50, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, 49, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 51, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 50, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, 56, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, 55, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 50, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 50, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, + 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, 51, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, 50, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 50, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 50, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, 57, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, 56, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 49, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 49, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, + 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, 52, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, 51, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 49, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 49, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, 48, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, 57, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 48, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 48, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, + 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, 53, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, 52, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 48, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 48, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, 49, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 212, 67, 79, 77, 80, 76, 73, 65, 78, 67, + 69, 128, 67, 79, 77, 80, 76, 69, 84, 73, 79, 78, 128, 67, 79, 77, 80, 76, + 69, 84, 69, 68, 128, 67, 79, 77, 80, 76, 69, 77, 69, 78, 84, 128, 67, 79, + 77, 80, 65, 83, 83, 128, 67, 79, 77, 80, 65, 82, 69, 128, 67, 79, 77, 77, + 79, 206, 67, 79, 77, 77, 69, 82, 67, 73, 65, 204, 67, 79, 77, 77, 65, 78, + 68, 128, 67, 79, 77, 77, 65, 128, 67, 79, 77, 77, 193, 67, 79, 77, 69, + 84, 128, 67, 79, 77, 66, 73, 78, 69, 68, 128, 67, 79, 77, 66, 73, 78, 65, + 84, 73, 79, 78, 128, 67, 79, 77, 66, 128, 67, 79, 76, 85, 77, 78, 128, + 67, 79, 76, 79, 82, 128, 67, 79, 76, 76, 73, 83, 73, 79, 206, 67, 79, 76, + 76, 128, 67, 79, 76, 196, 67, 79, 70, 70, 73, 78, 128, 67, 79, 69, 78, + 71, 128, 67, 79, 69, 78, 199, 67, 79, 68, 65, 128, 67, 79, 67, 79, 78, + 85, 84, 128, 67, 79, 67, 75, 84, 65, 73, 204, 67, 79, 65, 84, 128, 67, + 79, 65, 83, 84, 69, 82, 128, 67, 79, 65, 128, 67, 77, 128, 67, 205, 67, + 76, 85, 83, 84, 69, 82, 45, 73, 78, 73, 84, 73, 65, 204, 67, 76, 85, 83, + 84, 69, 82, 45, 70, 73, 78, 65, 204, 67, 76, 85, 83, 84, 69, 210, 67, 76, + 85, 66, 83, 128, 67, 76, 85, 66, 45, 83, 80, 79, 75, 69, 196, 67, 76, 85, + 66, 128, 67, 76, 85, 194, 67, 76, 79, 87, 206, 67, 76, 79, 86, 69, 82, + 128, 67, 76, 79, 85, 68, 128, 67, 76, 79, 85, 196, 67, 76, 79, 84, 72, + 69, 83, 128, 67, 76, 79, 84, 72, 128, 67, 76, 79, 83, 69, 84, 128, 67, + 76, 79, 83, 69, 78, 69, 83, 83, 128, 67, 76, 79, 83, 69, 68, 128, 67, 76, + 79, 83, 197, 67, 76, 79, 67, 75, 87, 73, 83, 197, 67, 76, 79, 67, 203, + 67, 76, 73, 86, 73, 83, 128, 67, 76, 73, 80, 66, 79, 65, 82, 68, 128, 67, + 76, 73, 78, 75, 73, 78, 199, 67, 76, 73, 78, 71, 73, 78, 199, 67, 76, 73, + 77, 66, 73, 78, 71, 128, 67, 76, 73, 77, 65, 67, 85, 83, 128, 67, 76, 73, + 70, 70, 128, 67, 76, 73, 67, 75, 128, 67, 76, 69, 70, 45, 50, 128, 67, + 76, 69, 70, 45, 49, 128, 67, 76, 69, 70, 128, 67, 76, 69, 198, 67, 76, + 69, 65, 86, 69, 82, 128, 67, 76, 69, 65, 210, 67, 76, 65, 83, 83, 73, 67, + 65, 204, 67, 76, 65, 80, 80, 73, 78, 199, 67, 76, 65, 80, 80, 69, 210, + 67, 76, 65, 78, 128, 67, 76, 65, 206, 67, 76, 65, 77, 83, 72, 69, 76, + 204, 67, 76, 65, 73, 77, 128, 67, 76, 128, 67, 73, 88, 128, 67, 73, 86, + 73, 76, 73, 65, 78, 128, 67, 73, 84, 89, 83, 67, 65, 80, 69, 128, 67, 73, + 84, 89, 83, 67, 65, 80, 197, 67, 73, 84, 201, 67, 73, 84, 65, 84, 73, 79, + 206, 67, 73, 84, 128, 67, 73, 82, 67, 85, 211, 67, 73, 82, 67, 85, 77, + 70, 76, 69, 88, 128, 67, 73, 82, 67, 85, 77, 70, 76, 69, 216, 67, 73, 82, + 67, 85, 76, 65, 84, 73, 79, 206, 67, 73, 82, 67, 76, 73, 78, 71, 128, 67, + 73, 82, 67, 76, 73, 78, 199, 67, 73, 82, 67, 76, 69, 83, 128, 67, 73, 82, + 67, 76, 69, 211, 67, 73, 82, 67, 76, 69, 68, 128, 67, 73, 80, 128, 67, + 73, 78, 78, 65, 66, 65, 82, 128, 67, 73, 78, 69, 77, 65, 128, 67, 73, + 206, 67, 73, 205, 67, 73, 73, 128, 67, 73, 69, 88, 128, 67, 73, 69, 85, + 67, 45, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 67, 73, 69, 85, 67, + 45, 80, 73, 69, 85, 80, 128, 67, 73, 69, 85, 67, 45, 73, 69, 85, 78, 71, + 128, 67, 73, 69, 85, 195, 67, 73, 69, 84, 128, 67, 73, 69, 80, 128, 67, + 73, 69, 128, 67, 72, 89, 88, 128, 67, 72, 89, 84, 128, 67, 72, 89, 82, + 88, 128, 67, 72, 89, 82, 128, 67, 72, 89, 80, 128, 67, 72, 87, 86, 128, + 67, 72, 85, 88, 128, 67, 72, 85, 82, 88, 128, 67, 72, 85, 82, 67, 72, + 128, 67, 72, 85, 82, 128, 67, 72, 85, 80, 128, 67, 72, 85, 79, 88, 128, + 67, 72, 85, 79, 84, 128, 67, 72, 85, 79, 80, 128, 67, 72, 85, 79, 128, + 67, 72, 85, 76, 65, 128, 67, 72, 85, 128, 67, 72, 82, 89, 83, 65, 78, 84, + 72, 69, 77, 85, 77, 128, 67, 72, 82, 79, 78, 79, 85, 128, 67, 72, 82, 79, + 78, 79, 78, 128, 67, 72, 82, 79, 77, 193, 67, 72, 82, 79, 193, 67, 72, + 82, 73, 86, 73, 128, 67, 72, 82, 73, 83, 84, 77, 65, 83, 128, 67, 72, 82, + 73, 83, 84, 77, 65, 211, 67, 72, 79, 89, 128, 67, 72, 79, 88, 128, 67, + 72, 79, 84, 128, 67, 72, 79, 82, 69, 86, 77, 193, 67, 72, 79, 80, 83, 84, + 73, 67, 75, 83, 128, 67, 72, 79, 80, 128, 67, 72, 79, 75, 69, 128, 67, + 72, 79, 69, 128, 67, 72, 79, 67, 79, 76, 65, 84, 197, 67, 72, 79, 65, + 128, 67, 72, 73, 84, 85, 69, 85, 77, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 67, 72, 73, 84, 85, 69, 85, 77, 83, 83, 65, 78, 71, 67, 73, 69, 85, 67, 128, 67, 72, 73, 84, 85, 69, 85, 77, 83, 73, 79, 83, 128, 67, 72, 73, 84, 85, 69, 85, 77, 67, 73, 69, 85, 67, 128, 67, 72, 73, 84, 85, 69, 85, @@ -5720,291 +5772,296 @@ static unsigned char lexicon[] = { 67, 72, 65, 80, 128, 67, 72, 65, 78, 71, 128, 67, 72, 65, 78, 128, 67, 72, 65, 77, 75, 79, 128, 67, 72, 65, 77, 73, 76, 79, 78, 128, 67, 72, 65, 77, 73, 76, 73, 128, 67, 72, 65, 205, 67, 72, 65, 75, 77, 193, 67, 72, - 65, 73, 82, 128, 67, 72, 65, 73, 78, 83, 128, 67, 72, 65, 68, 65, 128, - 67, 72, 65, 196, 67, 72, 65, 65, 128, 67, 71, 74, 128, 67, 69, 88, 128, - 67, 69, 82, 69, 83, 128, 67, 69, 82, 69, 77, 79, 78, 89, 128, 67, 69, 82, - 69, 75, 128, 67, 69, 82, 45, 87, 65, 128, 67, 69, 80, 128, 67, 69, 79, - 78, 71, 67, 72, 73, 69, 85, 77, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, - 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 83, 83, 65, 78, 71, 67, 73, - 69, 85, 67, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 83, 73, 79, - 83, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 67, 73, 69, 85, 67, - 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 67, 72, 73, 69, 85, 67, - 72, 128, 67, 69, 78, 84, 85, 82, 73, 65, 204, 67, 69, 78, 84, 82, 69, 76, - 73, 78, 197, 67, 69, 78, 84, 82, 69, 68, 128, 67, 69, 78, 84, 82, 69, - 196, 67, 69, 78, 84, 82, 69, 128, 67, 69, 78, 84, 82, 197, 67, 69, 78, - 84, 82, 65, 76, 73, 90, 65, 84, 73, 79, 206, 67, 69, 78, 128, 67, 69, 76, - 84, 73, 195, 67, 69, 76, 83, 73, 85, 83, 128, 67, 69, 76, 69, 66, 82, 65, - 84, 73, 79, 78, 128, 67, 69, 73, 82, 84, 128, 67, 69, 73, 76, 73, 78, 71, - 128, 67, 69, 73, 76, 73, 78, 199, 67, 69, 69, 86, 128, 67, 69, 69, 66, - 128, 67, 69, 69, 128, 67, 69, 68, 73, 76, 76, 65, 128, 67, 69, 68, 73, - 76, 76, 193, 67, 69, 68, 201, 67, 69, 67, 69, 75, 128, 67, 69, 67, 65, - 75, 128, 67, 69, 67, 65, 203, 67, 69, 65, 76, 67, 128, 67, 67, 85, 128, - 67, 67, 79, 128, 67, 67, 73, 128, 67, 67, 72, 85, 128, 67, 67, 72, 79, - 128, 67, 67, 72, 73, 128, 67, 67, 72, 72, 85, 128, 67, 67, 72, 72, 79, - 128, 67, 67, 72, 72, 73, 128, 67, 67, 72, 72, 69, 69, 128, 67, 67, 72, - 72, 69, 128, 67, 67, 72, 72, 65, 65, 128, 67, 67, 72, 72, 65, 128, 67, - 67, 72, 69, 69, 128, 67, 67, 72, 69, 128, 67, 67, 72, 65, 65, 128, 67, - 67, 72, 65, 128, 67, 67, 72, 128, 67, 67, 69, 69, 128, 67, 67, 69, 128, - 67, 67, 65, 65, 128, 67, 67, 65, 128, 67, 65, 89, 78, 128, 67, 65, 89, - 65, 78, 78, 65, 128, 67, 65, 88, 128, 67, 65, 86, 69, 128, 67, 65, 85, - 84, 73, 79, 206, 67, 65, 85, 76, 68, 82, 79, 78, 128, 67, 65, 85, 68, 65, - 128, 67, 65, 85, 67, 65, 83, 73, 65, 206, 67, 65, 85, 128, 67, 65, 84, - 65, 87, 65, 128, 67, 65, 84, 128, 67, 65, 212, 67, 65, 83, 84, 76, 69, - 128, 67, 65, 83, 75, 69, 212, 67, 65, 82, 89, 83, 84, 73, 65, 206, 67, - 65, 82, 84, 87, 72, 69, 69, 76, 128, 67, 65, 82, 84, 82, 73, 68, 71, 69, - 128, 67, 65, 82, 84, 128, 67, 65, 82, 211, 67, 65, 82, 82, 79, 84, 128, - 67, 65, 82, 82, 73, 65, 71, 197, 67, 65, 82, 80, 69, 78, 84, 82, 217, 67, - 65, 82, 208, 67, 65, 82, 79, 85, 83, 69, 204, 67, 65, 82, 79, 78, 128, - 67, 65, 82, 79, 206, 67, 65, 82, 73, 203, 67, 65, 82, 73, 65, 206, 67, - 65, 82, 69, 84, 128, 67, 65, 82, 69, 212, 67, 65, 82, 197, 67, 65, 82, - 68, 83, 128, 67, 65, 82, 68, 128, 67, 65, 82, 196, 67, 65, 82, 128, 67, - 65, 210, 67, 65, 80, 85, 212, 67, 65, 80, 84, 73, 86, 69, 128, 67, 65, - 80, 82, 73, 67, 79, 82, 78, 128, 67, 65, 80, 80, 69, 196, 67, 65, 80, 79, - 128, 67, 65, 80, 73, 84, 85, 76, 85, 77, 128, 67, 65, 80, 73, 84, 65, 76, - 128, 67, 65, 78, 84, 73, 76, 76, 65, 84, 73, 79, 206, 67, 65, 78, 79, 69, - 128, 67, 65, 78, 78, 79, 78, 128, 67, 65, 78, 78, 69, 196, 67, 65, 78, - 199, 67, 65, 78, 68, 89, 128, 67, 65, 78, 68, 82, 65, 66, 73, 78, 68, 85, - 128, 67, 65, 78, 68, 82, 65, 66, 73, 78, 68, 213, 67, 65, 78, 68, 82, 65, - 128, 67, 65, 78, 68, 82, 193, 67, 65, 78, 68, 76, 69, 128, 67, 65, 78, - 67, 69, 82, 128, 67, 65, 78, 67, 69, 76, 76, 65, 84, 73, 79, 206, 67, 65, - 78, 67, 69, 76, 128, 67, 65, 78, 67, 69, 204, 67, 65, 78, 128, 67, 65, - 77, 80, 73, 78, 71, 128, 67, 65, 77, 78, 85, 195, 67, 65, 77, 69, 82, 65, - 128, 67, 65, 77, 69, 82, 193, 67, 65, 77, 69, 76, 128, 67, 65, 76, 89, - 65, 128, 67, 65, 76, 89, 193, 67, 65, 76, 88, 128, 67, 65, 76, 76, 128, - 67, 65, 76, 204, 67, 65, 76, 69, 78, 68, 65, 82, 128, 67, 65, 76, 69, 78, - 68, 65, 210, 67, 65, 76, 67, 85, 76, 65, 84, 79, 82, 128, 67, 65, 76, 67, - 128, 67, 65, 75, 82, 65, 128, 67, 65, 75, 197, 67, 65, 73, 128, 67, 65, - 72, 128, 67, 65, 69, 83, 85, 82, 65, 128, 67, 65, 68, 85, 67, 69, 85, 83, - 128, 67, 65, 68, 193, 67, 65, 67, 84, 85, 83, 128, 67, 65, 66, 76, 69, - 87, 65, 89, 128, 67, 65, 66, 73, 78, 69, 84, 128, 67, 65, 66, 66, 65, 71, - 69, 45, 84, 82, 69, 69, 128, 67, 65, 65, 78, 71, 128, 67, 65, 65, 73, - 128, 67, 193, 67, 48, 50, 52, 128, 67, 48, 50, 51, 128, 67, 48, 50, 50, - 128, 67, 48, 50, 49, 128, 67, 48, 50, 48, 128, 67, 48, 49, 57, 128, 67, - 48, 49, 56, 128, 67, 48, 49, 55, 128, 67, 48, 49, 54, 128, 67, 48, 49, - 53, 128, 67, 48, 49, 52, 128, 67, 48, 49, 51, 128, 67, 48, 49, 50, 128, - 67, 48, 49, 49, 128, 67, 48, 49, 48, 65, 128, 67, 48, 49, 48, 128, 67, - 48, 48, 57, 128, 67, 48, 48, 56, 128, 67, 48, 48, 55, 128, 67, 48, 48, - 54, 128, 67, 48, 48, 53, 128, 67, 48, 48, 52, 128, 67, 48, 48, 51, 128, - 67, 48, 48, 50, 67, 128, 67, 48, 48, 50, 66, 128, 67, 48, 48, 50, 65, - 128, 67, 48, 48, 50, 128, 67, 48, 48, 49, 128, 67, 45, 83, 73, 77, 80, - 76, 73, 70, 73, 69, 196, 67, 45, 51, 57, 128, 67, 45, 49, 56, 128, 66, - 90, 85, 78, 199, 66, 90, 72, 201, 66, 89, 84, 197, 66, 89, 69, 76, 79, - 82, 85, 83, 83, 73, 65, 78, 45, 85, 75, 82, 65, 73, 78, 73, 65, 206, 66, - 88, 71, 128, 66, 87, 73, 128, 66, 87, 69, 69, 128, 66, 87, 69, 128, 66, - 87, 65, 128, 66, 85, 85, 77, 73, 83, 72, 128, 66, 85, 84, 84, 79, 78, - 128, 66, 85, 84, 84, 79, 206, 66, 85, 84, 84, 69, 82, 70, 76, 89, 128, - 66, 85, 212, 66, 85, 83, 84, 211, 66, 85, 83, 212, 66, 85, 83, 83, 89, - 69, 82, 85, 128, 66, 85, 83, 73, 78, 69, 83, 211, 66, 85, 211, 66, 85, - 82, 213, 66, 85, 82, 82, 73, 84, 79, 128, 66, 85, 82, 50, 128, 66, 85, - 210, 66, 85, 79, 88, 128, 66, 85, 79, 80, 128, 66, 85, 78, 78, 217, 66, - 85, 78, 71, 128, 66, 85, 77, 80, 217, 66, 85, 76, 85, 71, 128, 66, 85, - 76, 85, 199, 66, 85, 76, 76, 83, 69, 89, 69, 128, 66, 85, 76, 76, 211, - 66, 85, 76, 76, 72, 79, 82, 78, 128, 66, 85, 76, 76, 72, 79, 82, 206, 66, - 85, 76, 76, 69, 84, 128, 66, 85, 76, 76, 69, 212, 66, 85, 76, 76, 128, - 66, 85, 76, 66, 128, 66, 85, 75, 89, 128, 66, 85, 73, 76, 68, 73, 78, 71, - 83, 128, 66, 85, 73, 76, 68, 73, 78, 71, 128, 66, 85, 73, 76, 68, 73, 78, + 65, 73, 78, 83, 128, 67, 72, 65, 68, 65, 128, 67, 72, 65, 196, 67, 72, + 65, 65, 128, 67, 71, 74, 128, 67, 69, 88, 128, 67, 69, 86, 73, 84, 85, + 128, 67, 69, 82, 69, 83, 128, 67, 69, 82, 69, 77, 79, 78, 89, 128, 67, + 69, 82, 69, 75, 128, 67, 69, 82, 45, 87, 65, 128, 67, 69, 80, 128, 67, + 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 83, 83, 65, 78, 71, 83, 73, 79, + 83, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 83, 83, 65, 78, 71, + 67, 73, 69, 85, 67, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 83, + 73, 79, 83, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 67, 73, 69, + 85, 67, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 67, 72, 73, 69, + 85, 67, 72, 128, 67, 69, 78, 84, 85, 82, 73, 65, 204, 67, 69, 78, 84, 82, + 69, 76, 73, 78, 197, 67, 69, 78, 84, 82, 69, 68, 128, 67, 69, 78, 84, 82, + 69, 196, 67, 69, 78, 84, 82, 69, 128, 67, 69, 78, 84, 82, 197, 67, 69, + 78, 84, 82, 65, 76, 73, 90, 65, 84, 73, 79, 206, 67, 69, 78, 128, 67, 69, + 76, 84, 73, 195, 67, 69, 76, 83, 73, 85, 83, 128, 67, 69, 76, 69, 66, 82, + 65, 84, 73, 79, 78, 128, 67, 69, 73, 82, 84, 128, 67, 69, 73, 76, 73, 78, + 71, 128, 67, 69, 73, 76, 73, 78, 199, 67, 69, 69, 86, 128, 67, 69, 69, + 66, 128, 67, 69, 69, 128, 67, 69, 68, 73, 76, 76, 65, 128, 67, 69, 68, + 73, 76, 76, 193, 67, 69, 68, 201, 67, 69, 67, 69, 75, 128, 67, 69, 67, + 65, 75, 128, 67, 69, 67, 65, 203, 67, 69, 65, 76, 67, 128, 67, 67, 85, + 128, 67, 67, 79, 128, 67, 67, 73, 128, 67, 67, 72, 85, 128, 67, 67, 72, + 79, 128, 67, 67, 72, 73, 128, 67, 67, 72, 72, 85, 128, 67, 67, 72, 72, + 79, 128, 67, 67, 72, 72, 73, 128, 67, 67, 72, 72, 69, 69, 128, 67, 67, + 72, 72, 69, 128, 67, 67, 72, 72, 65, 65, 128, 67, 67, 72, 72, 65, 128, + 67, 67, 72, 69, 69, 128, 67, 67, 72, 69, 128, 67, 67, 72, 65, 65, 128, + 67, 67, 72, 65, 128, 67, 67, 72, 128, 67, 67, 69, 69, 128, 67, 67, 69, + 128, 67, 67, 65, 65, 128, 67, 67, 65, 128, 67, 65, 89, 78, 128, 67, 65, + 89, 65, 78, 78, 65, 128, 67, 65, 88, 128, 67, 65, 86, 69, 128, 67, 65, + 85, 84, 73, 79, 206, 67, 65, 85, 76, 68, 82, 79, 78, 128, 67, 65, 85, 68, + 65, 128, 67, 65, 85, 67, 65, 83, 73, 65, 206, 67, 65, 85, 128, 67, 65, + 84, 65, 87, 65, 128, 67, 65, 84, 128, 67, 65, 212, 67, 65, 83, 84, 76, + 69, 128, 67, 65, 83, 75, 69, 212, 67, 65, 82, 89, 83, 84, 73, 65, 206, + 67, 65, 82, 84, 87, 72, 69, 69, 76, 128, 67, 65, 82, 84, 82, 73, 68, 71, + 69, 128, 67, 65, 82, 84, 128, 67, 65, 82, 211, 67, 65, 82, 82, 79, 84, + 128, 67, 65, 82, 82, 73, 65, 71, 197, 67, 65, 82, 80, 69, 78, 84, 82, + 217, 67, 65, 82, 208, 67, 65, 82, 79, 85, 83, 69, 204, 67, 65, 82, 79, + 78, 128, 67, 65, 82, 79, 206, 67, 65, 82, 73, 203, 67, 65, 82, 73, 65, + 206, 67, 65, 82, 69, 84, 128, 67, 65, 82, 69, 212, 67, 65, 82, 197, 67, + 65, 82, 68, 83, 128, 67, 65, 82, 68, 128, 67, 65, 82, 196, 67, 65, 82, + 128, 67, 65, 210, 67, 65, 80, 85, 212, 67, 65, 80, 84, 73, 86, 69, 128, + 67, 65, 80, 82, 73, 67, 79, 82, 78, 128, 67, 65, 80, 80, 69, 196, 67, 65, + 80, 79, 128, 67, 65, 80, 73, 84, 85, 76, 85, 77, 128, 67, 65, 80, 73, 84, + 65, 76, 128, 67, 65, 78, 84, 73, 76, 76, 65, 84, 73, 79, 206, 67, 65, 78, + 79, 69, 128, 67, 65, 78, 78, 79, 78, 128, 67, 65, 78, 78, 69, 196, 67, + 65, 78, 199, 67, 65, 78, 69, 128, 67, 65, 78, 68, 89, 128, 67, 65, 78, + 68, 82, 65, 66, 73, 78, 68, 85, 128, 67, 65, 78, 68, 82, 65, 66, 73, 78, + 68, 213, 67, 65, 78, 68, 82, 65, 128, 67, 65, 78, 68, 82, 193, 67, 65, + 78, 68, 76, 69, 128, 67, 65, 78, 67, 69, 82, 128, 67, 65, 78, 67, 69, 76, + 76, 65, 84, 73, 79, 206, 67, 65, 78, 67, 69, 76, 128, 67, 65, 78, 67, 69, + 204, 67, 65, 78, 128, 67, 65, 77, 80, 73, 78, 71, 128, 67, 65, 77, 78, + 85, 195, 67, 65, 77, 69, 82, 65, 128, 67, 65, 77, 69, 82, 193, 67, 65, + 77, 69, 76, 128, 67, 65, 76, 89, 65, 128, 67, 65, 76, 89, 193, 67, 65, + 76, 88, 128, 67, 65, 76, 76, 128, 67, 65, 76, 204, 67, 65, 76, 69, 78, + 68, 65, 82, 128, 67, 65, 76, 69, 78, 68, 65, 210, 67, 65, 76, 67, 85, 76, + 65, 84, 79, 82, 128, 67, 65, 76, 67, 128, 67, 65, 75, 82, 65, 128, 67, + 65, 75, 197, 67, 65, 73, 128, 67, 65, 72, 128, 67, 65, 69, 83, 85, 82, + 65, 128, 67, 65, 68, 85, 67, 69, 85, 83, 128, 67, 65, 68, 193, 67, 65, + 67, 84, 85, 83, 128, 67, 65, 66, 76, 69, 87, 65, 89, 128, 67, 65, 66, 73, + 78, 69, 84, 128, 67, 65, 66, 66, 65, 71, 69, 45, 84, 82, 69, 69, 128, 67, + 65, 65, 78, 71, 128, 67, 65, 65, 73, 128, 67, 193, 67, 48, 50, 52, 128, + 67, 48, 50, 51, 128, 67, 48, 50, 50, 128, 67, 48, 50, 49, 128, 67, 48, + 50, 48, 128, 67, 48, 49, 57, 128, 67, 48, 49, 56, 128, 67, 48, 49, 55, + 128, 67, 48, 49, 54, 128, 67, 48, 49, 53, 128, 67, 48, 49, 52, 128, 67, + 48, 49, 51, 128, 67, 48, 49, 50, 128, 67, 48, 49, 49, 128, 67, 48, 49, + 48, 65, 128, 67, 48, 49, 48, 128, 67, 48, 48, 57, 128, 67, 48, 48, 56, + 128, 67, 48, 48, 55, 128, 67, 48, 48, 54, 128, 67, 48, 48, 53, 128, 67, + 48, 48, 52, 128, 67, 48, 48, 51, 128, 67, 48, 48, 50, 67, 128, 67, 48, + 48, 50, 66, 128, 67, 48, 48, 50, 65, 128, 67, 48, 48, 50, 128, 67, 48, + 48, 49, 128, 67, 45, 83, 73, 77, 80, 76, 73, 70, 73, 69, 196, 67, 45, 51, + 57, 128, 67, 45, 49, 56, 128, 66, 90, 85, 78, 199, 66, 90, 72, 201, 66, + 89, 84, 197, 66, 89, 69, 76, 79, 82, 85, 83, 83, 73, 65, 78, 45, 85, 75, + 82, 65, 73, 78, 73, 65, 206, 66, 88, 71, 128, 66, 87, 73, 128, 66, 87, + 69, 69, 128, 66, 87, 69, 128, 66, 87, 65, 128, 66, 85, 85, 77, 73, 83, + 72, 128, 66, 85, 84, 84, 79, 78, 128, 66, 85, 84, 84, 79, 206, 66, 85, + 84, 84, 69, 82, 70, 76, 89, 128, 66, 85, 84, 84, 69, 82, 128, 66, 85, + 212, 66, 85, 83, 84, 211, 66, 85, 83, 212, 66, 85, 83, 83, 89, 69, 82, + 85, 128, 66, 85, 83, 73, 78, 69, 83, 211, 66, 85, 211, 66, 85, 82, 213, + 66, 85, 82, 82, 73, 84, 79, 128, 66, 85, 82, 50, 128, 66, 85, 210, 66, + 85, 79, 88, 128, 66, 85, 79, 80, 128, 66, 85, 78, 78, 217, 66, 85, 78, + 71, 128, 66, 85, 77, 80, 217, 66, 85, 76, 85, 71, 128, 66, 85, 76, 85, + 199, 66, 85, 76, 76, 83, 69, 89, 69, 128, 66, 85, 76, 76, 211, 66, 85, + 76, 76, 72, 79, 82, 78, 128, 66, 85, 76, 76, 72, 79, 82, 206, 66, 85, 76, + 76, 69, 84, 128, 66, 85, 76, 76, 69, 212, 66, 85, 76, 76, 128, 66, 85, + 76, 66, 128, 66, 85, 75, 89, 128, 66, 85, 73, 76, 68, 73, 78, 71, 83, + 128, 66, 85, 73, 76, 68, 73, 78, 71, 128, 66, 85, 73, 76, 68, 73, 78, 199, 66, 85, 72, 73, 196, 66, 85, 71, 73, 78, 69, 83, 197, 66, 85, 71, 128, 66, 85, 70, 70, 65, 76, 79, 128, 66, 85, 68, 128, 66, 85, 67, 75, 76, 69, 128, 66, 85, 66, 66, 76, 69, 83, 128, 66, 85, 66, 66, 76, 69, 128, 66, 83, 84, 65, 82, 128, 66, 83, 75, 85, 210, 66, 83, 75, 65, 173, - 66, 83, 68, 85, 211, 66, 82, 85, 83, 200, 66, 82, 79, 79, 77, 128, 66, - 82, 79, 78, 90, 69, 128, 66, 82, 79, 75, 69, 206, 66, 82, 79, 67, 67, 79, - 76, 73, 128, 66, 82, 79, 65, 196, 66, 82, 73, 83, 84, 76, 69, 128, 66, - 82, 73, 71, 72, 84, 78, 69, 83, 211, 66, 82, 73, 69, 70, 67, 65, 83, 69, - 128, 66, 82, 73, 68, 71, 197, 66, 82, 73, 68, 197, 66, 82, 73, 67, 75, - 128, 66, 82, 69, 86, 73, 83, 128, 66, 82, 69, 86, 69, 45, 77, 65, 67, 82, - 79, 78, 128, 66, 82, 69, 86, 197, 66, 82, 69, 65, 84, 200, 66, 82, 69, - 65, 83, 84, 45, 70, 69, 69, 68, 73, 78, 71, 128, 66, 82, 69, 65, 75, 84, - 72, 82, 79, 85, 71, 72, 128, 66, 82, 68, 193, 66, 82, 65, 78, 67, 72, 73, - 78, 199, 66, 82, 65, 78, 67, 72, 69, 83, 128, 66, 82, 65, 78, 67, 72, - 128, 66, 82, 65, 78, 67, 200, 66, 82, 65, 75, 67, 69, 84, 128, 66, 82, - 65, 73, 78, 128, 66, 82, 65, 67, 75, 69, 84, 69, 196, 66, 82, 65, 67, 75, - 69, 212, 66, 82, 65, 67, 69, 128, 66, 81, 128, 66, 80, 72, 128, 66, 79, - 89, 211, 66, 79, 89, 128, 66, 79, 88, 73, 78, 199, 66, 79, 87, 84, 73, - 69, 128, 66, 79, 87, 84, 73, 197, 66, 79, 87, 76, 73, 78, 71, 128, 66, - 79, 87, 76, 128, 66, 79, 87, 204, 66, 79, 87, 73, 78, 199, 66, 79, 215, - 66, 79, 85, 81, 85, 69, 84, 128, 66, 79, 85, 81, 85, 69, 212, 66, 79, 85, - 78, 68, 65, 82, 217, 66, 79, 84, 84, 79, 77, 45, 83, 72, 65, 68, 69, 196, - 66, 79, 84, 84, 79, 77, 45, 76, 73, 71, 72, 84, 69, 196, 66, 79, 84, 84, - 79, 77, 128, 66, 79, 84, 84, 79, 205, 66, 79, 84, 84, 76, 69, 128, 66, - 79, 84, 84, 76, 197, 66, 79, 84, 200, 66, 79, 82, 85, 84, 79, 128, 66, - 79, 82, 65, 88, 45, 51, 128, 66, 79, 82, 65, 88, 45, 50, 128, 66, 79, 82, - 65, 88, 128, 66, 79, 80, 79, 77, 79, 70, 207, 66, 79, 79, 84, 83, 128, - 66, 79, 79, 84, 128, 66, 79, 79, 77, 69, 82, 65, 78, 71, 128, 66, 79, 79, - 75, 83, 128, 66, 79, 79, 75, 77, 65, 82, 75, 128, 66, 79, 79, 75, 77, 65, - 82, 203, 66, 79, 78, 69, 128, 66, 79, 77, 66, 128, 66, 79, 77, 128, 66, - 79, 76, 84, 128, 66, 79, 76, 212, 66, 79, 72, 65, 73, 82, 73, 195, 66, - 79, 68, 89, 128, 66, 79, 68, 217, 66, 79, 65, 82, 128, 66, 79, 65, 128, - 66, 76, 85, 69, 128, 66, 76, 85, 197, 66, 76, 79, 87, 73, 78, 199, 66, - 76, 79, 87, 70, 73, 83, 72, 128, 66, 76, 79, 215, 66, 76, 79, 83, 83, 79, - 77, 128, 66, 76, 79, 79, 68, 128, 66, 76, 79, 78, 196, 66, 76, 79, 67, - 75, 128, 66, 76, 73, 78, 203, 66, 76, 65, 78, 75, 128, 66, 76, 65, 78, - 203, 66, 76, 65, 68, 197, 66, 76, 65, 67, 75, 76, 69, 84, 84, 69, 210, - 66, 76, 65, 67, 75, 70, 79, 79, 212, 66, 76, 65, 67, 75, 45, 76, 69, 84, - 84, 69, 210, 66, 76, 65, 67, 75, 45, 70, 69, 65, 84, 72, 69, 82, 69, 196, - 66, 76, 65, 67, 75, 128, 66, 75, 65, 173, 66, 73, 84, 84, 69, 82, 128, - 66, 73, 84, 73, 78, 199, 66, 73, 84, 197, 66, 73, 84, 67, 79, 73, 206, - 66, 73, 83, 77, 85, 84, 200, 66, 73, 83, 77, 73, 76, 76, 65, 200, 66, 73, - 83, 72, 79, 80, 128, 66, 73, 83, 69, 67, 84, 73, 78, 199, 66, 73, 83, 65, - 72, 128, 66, 73, 82, 85, 128, 66, 73, 82, 84, 72, 68, 65, 217, 66, 73, - 82, 71, 65, 128, 66, 73, 82, 71, 193, 66, 73, 82, 68, 128, 66, 73, 79, - 72, 65, 90, 65, 82, 196, 66, 73, 78, 79, 86, 73, 76, 69, 128, 66, 73, 78, - 79, 67, 85, 76, 65, 210, 66, 73, 78, 68, 73, 78, 199, 66, 73, 78, 68, 73, - 128, 66, 73, 78, 65, 82, 217, 66, 73, 76, 76, 73, 79, 78, 83, 128, 66, - 73, 76, 76, 73, 65, 82, 68, 83, 128, 66, 73, 76, 76, 69, 196, 66, 73, 76, - 65, 66, 73, 65, 204, 66, 73, 75, 73, 78, 73, 128, 66, 73, 71, 128, 66, - 73, 199, 66, 73, 69, 84, 128, 66, 73, 68, 69, 78, 84, 65, 204, 66, 73, - 68, 65, 75, 85, 79, 206, 66, 73, 67, 89, 67, 76, 73, 83, 84, 128, 66, 73, - 67, 89, 67, 76, 69, 83, 128, 66, 73, 67, 89, 67, 76, 69, 128, 66, 73, 67, - 69, 80, 83, 128, 66, 73, 66, 76, 69, 45, 67, 82, 69, 197, 66, 73, 66, - 128, 66, 201, 66, 72, 85, 128, 66, 72, 79, 79, 128, 66, 72, 79, 128, 66, - 72, 73, 128, 66, 72, 69, 84, 72, 128, 66, 72, 69, 69, 128, 66, 72, 69, - 128, 66, 72, 65, 84, 84, 73, 80, 82, 79, 76, 213, 66, 72, 65, 77, 128, - 66, 72, 65, 65, 128, 66, 72, 65, 128, 66, 69, 89, 89, 65, 76, 128, 66, - 69, 88, 128, 66, 69, 86, 69, 82, 65, 71, 69, 128, 66, 69, 84, 87, 69, 69, - 78, 128, 66, 69, 84, 87, 69, 69, 206, 66, 69, 84, 72, 128, 66, 69, 84, - 65, 128, 66, 69, 84, 193, 66, 69, 212, 66, 69, 83, 73, 68, 197, 66, 69, - 82, 75, 65, 78, 65, 206, 66, 69, 82, 66, 69, 210, 66, 69, 80, 128, 66, - 69, 79, 82, 195, 66, 69, 78, 90, 69, 78, 197, 66, 69, 78, 84, 207, 66, - 69, 78, 84, 128, 66, 69, 78, 212, 66, 69, 78, 68, 69, 128, 66, 69, 78, - 68, 128, 66, 69, 78, 196, 66, 69, 206, 66, 69, 76, 84, 128, 66, 69, 76, - 212, 66, 69, 76, 79, 215, 66, 69, 76, 76, 72, 79, 208, 66, 69, 76, 76, - 128, 66, 69, 76, 204, 66, 69, 76, 71, 84, 72, 79, 210, 66, 69, 73, 84, - 72, 128, 66, 69, 72, 73, 78, 196, 66, 69, 72, 69, 72, 128, 66, 69, 72, - 69, 200, 66, 69, 72, 128, 66, 69, 200, 66, 69, 71, 73, 78, 78, 73, 78, - 71, 128, 66, 69, 71, 73, 78, 78, 69, 82, 128, 66, 69, 71, 73, 206, 66, - 69, 70, 79, 82, 197, 66, 69, 69, 84, 76, 69, 128, 66, 69, 69, 84, 65, - 128, 66, 69, 69, 210, 66, 69, 69, 72, 73, 86, 69, 128, 66, 69, 69, 72, - 128, 66, 69, 69, 200, 66, 69, 67, 65, 85, 83, 69, 128, 66, 69, 65, 86, - 69, 210, 66, 69, 65, 84, 73, 78, 199, 66, 69, 65, 84, 128, 66, 69, 65, - 82, 68, 69, 196, 66, 69, 65, 82, 128, 66, 69, 65, 210, 66, 69, 65, 78, - 128, 66, 69, 65, 77, 69, 196, 66, 69, 65, 68, 83, 128, 66, 69, 65, 67, - 200, 66, 67, 65, 68, 128, 66, 67, 65, 196, 66, 66, 89, 88, 128, 66, 66, - 89, 84, 128, 66, 66, 89, 80, 128, 66, 66, 89, 128, 66, 66, 85, 88, 128, - 66, 66, 85, 84, 128, 66, 66, 85, 82, 88, 128, 66, 66, 85, 82, 128, 66, - 66, 85, 80, 128, 66, 66, 85, 79, 88, 128, 66, 66, 85, 79, 80, 128, 66, - 66, 85, 79, 128, 66, 66, 85, 128, 66, 66, 79, 88, 128, 66, 66, 79, 84, - 128, 66, 66, 79, 80, 128, 66, 66, 79, 128, 66, 66, 73, 88, 128, 66, 66, - 73, 80, 128, 66, 66, 73, 69, 88, 128, 66, 66, 73, 69, 84, 128, 66, 66, - 73, 69, 80, 128, 66, 66, 73, 69, 128, 66, 66, 73, 128, 66, 66, 69, 88, - 128, 66, 66, 69, 80, 128, 66, 66, 69, 69, 128, 66, 66, 69, 128, 66, 66, - 65, 88, 128, 66, 66, 65, 84, 128, 66, 66, 65, 80, 128, 66, 66, 65, 65, - 128, 66, 66, 65, 128, 66, 65, 89, 65, 78, 78, 65, 128, 66, 65, 85, 128, - 66, 65, 84, 84, 69, 82, 89, 128, 66, 65, 84, 72, 84, 85, 66, 128, 66, 65, - 84, 72, 65, 77, 65, 83, 65, 84, 128, 66, 65, 84, 72, 128, 66, 65, 84, - 200, 66, 65, 84, 65, 203, 66, 65, 83, 83, 65, 128, 66, 65, 83, 83, 193, - 66, 65, 83, 75, 69, 84, 66, 65, 76, 204, 66, 65, 83, 72, 75, 73, 210, 66, - 65, 83, 72, 128, 66, 65, 83, 69, 76, 73, 78, 197, 66, 65, 83, 69, 66, 65, - 76, 76, 128, 66, 65, 83, 69, 128, 66, 65, 83, 197, 66, 65, 82, 83, 128, - 66, 65, 82, 211, 66, 65, 82, 82, 73, 69, 82, 128, 66, 65, 82, 82, 69, 75, - 72, 128, 66, 65, 82, 82, 69, 69, 128, 66, 65, 82, 82, 69, 197, 66, 65, - 82, 76, 73, 78, 69, 128, 66, 65, 82, 76, 69, 89, 128, 66, 65, 82, 73, 89, - 79, 79, 83, 65, 78, 128, 66, 65, 82, 66, 69, 210, 66, 65, 82, 65, 50, - 128, 66, 65, 210, 66, 65, 78, 84, 79, 67, 128, 66, 65, 78, 75, 78, 79, - 84, 197, 66, 65, 78, 75, 128, 66, 65, 78, 203, 66, 65, 78, 68, 128, 66, - 65, 78, 65, 78, 65, 128, 66, 65, 78, 50, 128, 66, 65, 78, 178, 66, 65, - 77, 66, 79, 79, 83, 128, 66, 65, 77, 66, 79, 79, 128, 66, 65, 76, 85, 68, - 65, 128, 66, 65, 76, 76, 80, 79, 73, 78, 212, 66, 65, 76, 76, 79, 84, - 128, 66, 65, 76, 76, 79, 212, 66, 65, 76, 76, 79, 79, 78, 45, 83, 80, 79, - 75, 69, 196, 66, 65, 76, 76, 79, 79, 78, 128, 66, 65, 76, 68, 128, 66, - 65, 76, 65, 71, 128, 66, 65, 76, 128, 66, 65, 204, 66, 65, 73, 82, 75, - 65, 78, 128, 66, 65, 73, 77, 65, 73, 128, 66, 65, 72, 84, 128, 66, 65, - 72, 73, 82, 71, 79, 77, 85, 75, 72, 65, 128, 66, 65, 72, 65, 82, 50, 128, - 66, 65, 72, 65, 82, 178, 66, 65, 72, 128, 66, 65, 71, 85, 69, 84, 84, - 197, 66, 65, 71, 83, 128, 66, 65, 71, 71, 65, 71, 197, 66, 65, 71, 69, - 76, 128, 66, 65, 71, 65, 128, 66, 65, 71, 51, 128, 66, 65, 199, 66, 65, - 68, 77, 73, 78, 84, 79, 206, 66, 65, 68, 71, 69, 82, 128, 66, 65, 68, 71, - 69, 128, 66, 65, 68, 128, 66, 65, 196, 66, 65, 67, 84, 82, 73, 65, 206, - 66, 65, 67, 79, 78, 128, 66, 65, 67, 75, 87, 65, 82, 68, 128, 66, 65, 67, - 75, 83, 80, 65, 67, 69, 128, 66, 65, 67, 75, 83, 76, 65, 83, 72, 128, 66, - 65, 67, 75, 83, 76, 65, 83, 200, 66, 65, 67, 75, 83, 76, 65, 78, 84, 69, - 196, 66, 65, 67, 75, 72, 65, 78, 196, 66, 65, 67, 75, 45, 84, 73, 76, 84, - 69, 196, 66, 65, 67, 75, 128, 66, 65, 67, 203, 66, 65, 66, 89, 128, 66, - 65, 66, 217, 66, 65, 65, 82, 69, 82, 85, 128, 66, 65, 45, 50, 128, 66, - 51, 48, 53, 128, 66, 50, 53, 180, 66, 50, 52, 183, 66, 50, 52, 179, 66, - 50, 52, 178, 66, 50, 52, 177, 66, 50, 52, 176, 66, 50, 51, 179, 66, 50, - 51, 177, 66, 50, 51, 176, 66, 50, 50, 181, 66, 50, 50, 176, 66, 49, 57, - 177, 66, 49, 55, 182, 66, 49, 55, 179, 66, 49, 54, 57, 128, 66, 49, 54, - 56, 128, 66, 49, 54, 55, 128, 66, 49, 54, 54, 128, 66, 49, 54, 53, 128, - 66, 49, 54, 52, 128, 66, 49, 54, 179, 66, 49, 54, 178, 66, 49, 54, 49, - 128, 66, 49, 54, 48, 128, 66, 49, 53, 185, 66, 49, 53, 56, 128, 66, 49, - 53, 55, 128, 66, 49, 53, 182, 66, 49, 53, 53, 128, 66, 49, 53, 52, 128, - 66, 49, 53, 51, 128, 66, 49, 53, 50, 128, 66, 49, 53, 177, 66, 49, 53, - 48, 128, 66, 49, 52, 54, 128, 66, 49, 52, 181, 66, 49, 52, 50, 128, 66, - 49, 52, 177, 66, 49, 52, 176, 66, 49, 51, 181, 66, 49, 51, 179, 66, 49, - 51, 50, 128, 66, 49, 51, 177, 66, 49, 51, 176, 66, 49, 50, 184, 66, 49, - 50, 183, 66, 49, 50, 181, 66, 49, 50, 179, 66, 49, 50, 178, 66, 49, 50, - 177, 66, 49, 50, 176, 66, 49, 48, 57, 205, 66, 49, 48, 57, 198, 66, 49, - 48, 56, 205, 66, 49, 48, 56, 198, 66, 49, 48, 55, 205, 66, 49, 48, 55, - 198, 66, 49, 48, 54, 205, 66, 49, 48, 54, 198, 66, 49, 48, 53, 205, 66, - 49, 48, 53, 198, 66, 49, 48, 181, 66, 49, 48, 180, 66, 49, 48, 178, 66, - 49, 48, 176, 66, 48, 57, 177, 66, 48, 57, 176, 66, 48, 56, 57, 128, 66, - 48, 56, 183, 66, 48, 56, 54, 128, 66, 48, 56, 181, 66, 48, 56, 51, 128, - 66, 48, 56, 50, 128, 66, 48, 56, 177, 66, 48, 56, 176, 66, 48, 55, 57, - 128, 66, 48, 55, 184, 66, 48, 55, 183, 66, 48, 55, 182, 66, 48, 55, 181, - 66, 48, 55, 180, 66, 48, 55, 179, 66, 48, 55, 178, 66, 48, 55, 177, 66, - 48, 55, 176, 66, 48, 54, 185, 66, 48, 54, 184, 66, 48, 54, 183, 66, 48, - 54, 182, 66, 48, 54, 181, 66, 48, 54, 52, 128, 66, 48, 54, 51, 128, 66, - 48, 54, 178, 66, 48, 54, 177, 66, 48, 54, 176, 66, 48, 53, 185, 66, 48, - 53, 184, 66, 48, 53, 183, 66, 48, 53, 54, 128, 66, 48, 53, 181, 66, 48, - 53, 180, 66, 48, 53, 179, 66, 48, 53, 178, 66, 48, 53, 177, 66, 48, 53, - 176, 66, 48, 52, 57, 128, 66, 48, 52, 184, 66, 48, 52, 55, 128, 66, 48, - 52, 182, 66, 48, 52, 181, 66, 48, 52, 180, 66, 48, 52, 179, 66, 48, 52, - 178, 66, 48, 52, 177, 66, 48, 52, 176, 66, 48, 51, 185, 66, 48, 51, 184, - 66, 48, 51, 183, 66, 48, 51, 182, 66, 48, 51, 52, 128, 66, 48, 51, 179, - 66, 48, 51, 178, 66, 48, 51, 177, 66, 48, 51, 176, 66, 48, 50, 185, 66, - 48, 50, 184, 66, 48, 50, 183, 66, 48, 50, 182, 66, 48, 50, 181, 66, 48, - 50, 180, 66, 48, 50, 179, 66, 48, 50, 50, 128, 66, 48, 50, 177, 66, 48, - 50, 176, 66, 48, 49, 57, 128, 66, 48, 49, 56, 128, 66, 48, 49, 183, 66, - 48, 49, 182, 66, 48, 49, 181, 66, 48, 49, 180, 66, 48, 49, 179, 66, 48, - 49, 178, 66, 48, 49, 177, 66, 48, 49, 176, 66, 48, 48, 57, 128, 66, 48, - 48, 185, 66, 48, 48, 56, 128, 66, 48, 48, 184, 66, 48, 48, 55, 128, 66, - 48, 48, 183, 66, 48, 48, 54, 128, 66, 48, 48, 182, 66, 48, 48, 53, 65, - 128, 66, 48, 48, 53, 128, 66, 48, 48, 181, 66, 48, 48, 52, 128, 66, 48, - 48, 180, 66, 48, 48, 51, 128, 66, 48, 48, 179, 66, 48, 48, 50, 128, 66, - 48, 48, 178, 66, 48, 48, 49, 128, 66, 48, 48, 177, 65, 90, 85, 128, 65, - 89, 66, 128, 65, 89, 65, 72, 128, 65, 88, 69, 128, 65, 87, 69, 128, 65, - 87, 65, 217, 65, 86, 79, 67, 65, 68, 79, 128, 65, 86, 69, 83, 84, 65, - 206, 65, 86, 69, 82, 65, 71, 197, 65, 86, 65, 75, 82, 65, 72, 65, 83, 65, - 78, 89, 65, 128, 65, 86, 65, 71, 82, 65, 72, 65, 128, 65, 85, 89, 65, 78, - 78, 65, 128, 65, 85, 84, 85, 77, 78, 128, 65, 85, 84, 79, 77, 79, 66, 73, - 76, 69, 128, 65, 85, 84, 79, 77, 65, 84, 69, 196, 65, 85, 83, 84, 82, 65, - 204, 65, 85, 82, 73, 80, 73, 71, 77, 69, 78, 84, 128, 65, 85, 82, 65, 77, - 65, 90, 68, 65, 65, 72, 65, 128, 65, 85, 82, 65, 77, 65, 90, 68, 65, 65, - 45, 50, 128, 65, 85, 82, 65, 77, 65, 90, 68, 65, 65, 128, 65, 85, 78, 78, - 128, 65, 85, 71, 85, 83, 84, 128, 65, 85, 71, 77, 69, 78, 84, 65, 84, 73, - 79, 206, 65, 85, 69, 128, 65, 85, 66, 69, 82, 71, 73, 78, 69, 128, 65, - 84, 84, 73, 195, 65, 84, 84, 72, 65, 67, 65, 78, 128, 65, 84, 84, 69, 78, - 84, 73, 79, 78, 128, 65, 84, 84, 65, 203, 65, 84, 84, 65, 67, 72, 69, - 196, 65, 84, 79, 205, 65, 84, 78, 65, 200, 65, 84, 77, 65, 65, 85, 128, - 65, 84, 73, 89, 65, 128, 65, 84, 73, 85, 128, 65, 84, 73, 75, 82, 65, 77, - 65, 128, 65, 84, 72, 76, 69, 84, 73, 195, 65, 84, 72, 65, 82, 86, 65, 86, - 69, 68, 73, 195, 65, 84, 72, 65, 80, 65, 83, 67, 65, 206, 65, 84, 72, 45, - 84, 72, 65, 76, 65, 84, 72, 65, 128, 65, 83, 90, 128, 65, 83, 89, 85, 82, - 193, 65, 83, 89, 77, 80, 84, 79, 84, 73, 67, 65, 76, 76, 217, 65, 83, 84, - 82, 79, 78, 79, 77, 73, 67, 65, 204, 65, 83, 84, 82, 79, 76, 79, 71, 73, - 67, 65, 204, 65, 83, 84, 82, 65, 69, 65, 128, 65, 83, 84, 79, 78, 73, 83, - 72, 69, 196, 65, 83, 84, 69, 82, 73, 83, 77, 128, 65, 83, 84, 69, 82, 73, - 83, 75, 211, 65, 83, 84, 69, 82, 73, 83, 75, 128, 65, 83, 84, 69, 82, 73, - 83, 203, 65, 83, 84, 69, 82, 73, 83, 67, 85, 83, 128, 65, 83, 83, 89, 82, - 73, 65, 206, 65, 83, 83, 69, 82, 84, 73, 79, 78, 128, 65, 83, 80, 73, 82, - 65, 84, 73, 79, 78, 128, 65, 83, 80, 73, 82, 65, 84, 69, 196, 65, 83, 80, - 69, 82, 128, 65, 83, 73, 65, 45, 65, 85, 83, 84, 82, 65, 76, 73, 65, 128, - 65, 83, 72, 71, 65, 66, 128, 65, 83, 72, 69, 83, 128, 65, 83, 72, 57, - 128, 65, 83, 72, 51, 128, 65, 83, 72, 178, 65, 83, 67, 69, 78, 84, 128, - 65, 83, 67, 69, 78, 68, 73, 78, 199, 65, 83, 65, 76, 50, 128, 65, 83, 45, - 83, 65, 74, 68, 65, 128, 65, 82, 85, 72, 85, 65, 128, 65, 82, 84, 211, - 65, 82, 84, 73, 83, 212, 65, 82, 84, 73, 67, 85, 76, 65, 84, 69, 196, 65, - 82, 84, 65, 66, 197, 65, 82, 84, 65, 128, 65, 82, 83, 69, 79, 83, 128, - 65, 82, 83, 69, 79, 211, 65, 82, 83, 69, 78, 73, 67, 128, 65, 82, 82, 79, - 87, 83, 128, 65, 82, 82, 79, 87, 211, 65, 82, 82, 79, 87, 72, 69, 65, 68, - 83, 128, 65, 82, 82, 79, 87, 72, 69, 65, 68, 128, 65, 82, 82, 79, 87, 72, - 69, 65, 196, 65, 82, 82, 79, 87, 45, 84, 65, 73, 76, 128, 65, 82, 82, 73, - 86, 73, 78, 71, 128, 65, 82, 82, 73, 86, 69, 128, 65, 82, 82, 65, 89, - 128, 65, 82, 80, 69, 71, 71, 73, 65, 84, 207, 65, 82, 79, 85, 83, 73, 78, - 199, 65, 82, 79, 85, 82, 193, 65, 82, 79, 85, 78, 68, 45, 80, 82, 79, 70, - 73, 76, 69, 128, 65, 82, 79, 85, 78, 196, 65, 82, 77, 89, 128, 65, 82, - 77, 79, 85, 82, 128, 65, 82, 205, 65, 82, 76, 65, 85, 199, 65, 82, 75, + 66, 83, 68, 85, 211, 66, 82, 85, 83, 200, 66, 82, 79, 87, 206, 66, 82, + 79, 79, 77, 128, 66, 82, 79, 78, 90, 69, 128, 66, 82, 79, 75, 69, 206, + 66, 82, 79, 67, 67, 79, 76, 73, 128, 66, 82, 79, 65, 196, 66, 82, 73, 83, + 84, 76, 69, 128, 66, 82, 73, 71, 72, 84, 78, 69, 83, 211, 66, 82, 73, 69, + 70, 83, 128, 66, 82, 73, 69, 70, 67, 65, 83, 69, 128, 66, 82, 73, 68, 71, + 197, 66, 82, 73, 68, 197, 66, 82, 73, 67, 75, 128, 66, 82, 73, 128, 66, + 82, 69, 86, 73, 83, 128, 66, 82, 69, 86, 69, 45, 77, 65, 67, 82, 79, 78, + 128, 66, 82, 69, 86, 197, 66, 82, 69, 65, 84, 200, 66, 82, 69, 65, 83, + 84, 45, 70, 69, 69, 68, 73, 78, 71, 128, 66, 82, 69, 65, 75, 84, 72, 82, + 79, 85, 71, 72, 128, 66, 82, 68, 193, 66, 82, 65, 78, 67, 72, 73, 78, + 199, 66, 82, 65, 78, 67, 72, 69, 83, 128, 66, 82, 65, 78, 67, 72, 128, + 66, 82, 65, 78, 67, 200, 66, 82, 65, 75, 67, 69, 84, 128, 66, 82, 65, 73, + 78, 128, 66, 82, 65, 67, 75, 69, 84, 69, 196, 66, 82, 65, 67, 75, 69, + 212, 66, 82, 65, 67, 69, 128, 66, 81, 128, 66, 80, 72, 128, 66, 79, 89, + 211, 66, 79, 89, 128, 66, 79, 88, 73, 78, 199, 66, 79, 87, 84, 73, 69, + 128, 66, 79, 87, 84, 73, 197, 66, 79, 87, 76, 73, 78, 71, 128, 66, 79, + 87, 76, 128, 66, 79, 87, 204, 66, 79, 87, 73, 78, 199, 66, 79, 215, 66, + 79, 85, 81, 85, 69, 84, 128, 66, 79, 85, 81, 85, 69, 212, 66, 79, 85, 78, + 68, 65, 82, 217, 66, 79, 84, 84, 79, 77, 45, 83, 72, 65, 68, 69, 196, 66, + 79, 84, 84, 79, 77, 45, 76, 73, 71, 72, 84, 69, 196, 66, 79, 84, 84, 79, + 77, 128, 66, 79, 84, 84, 79, 205, 66, 79, 84, 84, 76, 69, 128, 66, 79, + 84, 84, 76, 197, 66, 79, 84, 200, 66, 79, 82, 85, 84, 79, 128, 66, 79, + 82, 65, 88, 45, 51, 128, 66, 79, 82, 65, 88, 45, 50, 128, 66, 79, 82, 65, + 88, 128, 66, 79, 80, 79, 77, 79, 70, 207, 66, 79, 79, 84, 83, 128, 66, + 79, 79, 84, 128, 66, 79, 79, 77, 69, 82, 65, 78, 71, 128, 66, 79, 79, 75, + 83, 128, 66, 79, 79, 75, 77, 65, 82, 75, 128, 66, 79, 79, 75, 77, 65, 82, + 203, 66, 79, 78, 69, 128, 66, 79, 77, 66, 128, 66, 79, 77, 128, 66, 79, + 76, 84, 128, 66, 79, 76, 212, 66, 79, 72, 65, 73, 82, 73, 195, 66, 79, + 68, 89, 128, 66, 79, 68, 217, 66, 79, 65, 82, 128, 66, 79, 65, 128, 66, + 76, 85, 69, 128, 66, 76, 85, 197, 66, 76, 79, 87, 73, 78, 199, 66, 76, + 79, 87, 70, 73, 83, 72, 128, 66, 76, 79, 215, 66, 76, 79, 83, 83, 79, 77, + 128, 66, 76, 79, 79, 68, 128, 66, 76, 79, 78, 196, 66, 76, 79, 67, 75, + 128, 66, 76, 73, 78, 203, 66, 76, 65, 78, 75, 128, 66, 76, 65, 78, 203, + 66, 76, 65, 68, 197, 66, 76, 65, 67, 75, 76, 69, 84, 84, 69, 210, 66, 76, + 65, 67, 75, 70, 79, 79, 212, 66, 76, 65, 67, 75, 45, 76, 69, 84, 84, 69, + 210, 66, 76, 65, 67, 75, 45, 70, 69, 65, 84, 72, 69, 82, 69, 196, 66, 76, + 65, 67, 75, 128, 66, 75, 65, 173, 66, 73, 84, 84, 69, 82, 128, 66, 73, + 84, 73, 78, 199, 66, 73, 84, 197, 66, 73, 84, 67, 79, 73, 206, 66, 73, + 83, 77, 85, 84, 200, 66, 73, 83, 77, 73, 76, 76, 65, 200, 66, 73, 83, 72, + 79, 208, 66, 73, 83, 69, 67, 84, 73, 78, 199, 66, 73, 83, 65, 72, 128, + 66, 73, 82, 85, 128, 66, 73, 82, 84, 72, 68, 65, 217, 66, 73, 82, 71, 65, + 128, 66, 73, 82, 71, 193, 66, 73, 82, 68, 128, 66, 73, 79, 72, 65, 90, + 65, 82, 196, 66, 73, 78, 79, 86, 73, 76, 69, 128, 66, 73, 78, 79, 67, 85, + 76, 65, 210, 66, 73, 78, 68, 73, 78, 199, 66, 73, 78, 68, 73, 128, 66, + 73, 78, 65, 82, 217, 66, 73, 76, 76, 73, 79, 78, 83, 128, 66, 73, 76, 76, + 73, 65, 82, 68, 83, 128, 66, 73, 76, 76, 69, 196, 66, 73, 76, 65, 66, 73, + 65, 204, 66, 73, 75, 73, 78, 73, 128, 66, 73, 71, 128, 66, 73, 199, 66, + 73, 69, 84, 128, 66, 73, 68, 69, 78, 84, 65, 204, 66, 73, 68, 65, 75, 85, + 79, 206, 66, 73, 67, 89, 67, 76, 73, 83, 84, 128, 66, 73, 67, 89, 67, 76, + 69, 83, 128, 66, 73, 67, 89, 67, 76, 69, 128, 66, 73, 67, 69, 80, 83, + 128, 66, 73, 66, 76, 69, 45, 67, 82, 69, 197, 66, 73, 66, 128, 66, 201, + 66, 72, 85, 128, 66, 72, 79, 79, 128, 66, 72, 79, 128, 66, 72, 73, 128, + 66, 72, 69, 84, 72, 128, 66, 72, 69, 69, 128, 66, 72, 69, 128, 66, 72, + 65, 84, 84, 73, 80, 82, 79, 76, 213, 66, 72, 65, 77, 128, 66, 72, 65, 73, + 75, 83, 85, 75, 201, 66, 72, 65, 65, 128, 66, 72, 65, 128, 66, 69, 89, + 89, 65, 76, 128, 66, 69, 88, 128, 66, 69, 86, 69, 82, 65, 71, 69, 128, + 66, 69, 86, 69, 82, 65, 71, 197, 66, 69, 84, 87, 69, 69, 78, 128, 66, 69, + 84, 87, 69, 69, 206, 66, 69, 84, 72, 128, 66, 69, 84, 65, 128, 66, 69, + 84, 193, 66, 69, 212, 66, 69, 83, 73, 68, 197, 66, 69, 82, 75, 65, 78, + 65, 206, 66, 69, 82, 66, 69, 210, 66, 69, 80, 128, 66, 69, 79, 82, 195, + 66, 69, 78, 90, 69, 78, 197, 66, 69, 78, 84, 207, 66, 69, 78, 84, 128, + 66, 69, 78, 212, 66, 69, 78, 71, 65, 76, 201, 66, 69, 78, 68, 69, 128, + 66, 69, 78, 68, 128, 66, 69, 78, 196, 66, 69, 206, 66, 69, 76, 84, 128, + 66, 69, 76, 212, 66, 69, 76, 79, 215, 66, 69, 76, 76, 72, 79, 208, 66, + 69, 76, 76, 128, 66, 69, 76, 204, 66, 69, 76, 71, 84, 72, 79, 210, 66, + 69, 73, 84, 72, 128, 66, 69, 72, 73, 78, 196, 66, 69, 72, 69, 72, 128, + 66, 69, 72, 69, 200, 66, 69, 72, 128, 66, 69, 200, 66, 69, 71, 73, 78, + 78, 73, 78, 71, 128, 66, 69, 71, 73, 78, 78, 69, 82, 128, 66, 69, 71, 73, + 206, 66, 69, 70, 79, 82, 197, 66, 69, 69, 84, 76, 69, 128, 66, 69, 69, + 84, 65, 128, 66, 69, 69, 210, 66, 69, 69, 72, 73, 86, 69, 128, 66, 69, + 69, 72, 128, 66, 69, 69, 200, 66, 69, 67, 65, 85, 83, 69, 128, 66, 69, + 65, 86, 69, 210, 66, 69, 65, 84, 73, 78, 199, 66, 69, 65, 84, 128, 66, + 69, 65, 82, 68, 69, 196, 66, 69, 65, 82, 128, 66, 69, 65, 210, 66, 69, + 65, 78, 128, 66, 69, 65, 77, 69, 196, 66, 69, 65, 68, 83, 128, 66, 69, + 65, 67, 200, 66, 67, 65, 68, 128, 66, 67, 65, 196, 66, 66, 89, 88, 128, + 66, 66, 89, 84, 128, 66, 66, 89, 80, 128, 66, 66, 89, 128, 66, 66, 85, + 88, 128, 66, 66, 85, 84, 128, 66, 66, 85, 82, 88, 128, 66, 66, 85, 82, + 128, 66, 66, 85, 80, 128, 66, 66, 85, 79, 88, 128, 66, 66, 85, 79, 80, + 128, 66, 66, 85, 79, 128, 66, 66, 85, 128, 66, 66, 79, 88, 128, 66, 66, + 79, 84, 128, 66, 66, 79, 80, 128, 66, 66, 79, 128, 66, 66, 73, 88, 128, + 66, 66, 73, 80, 128, 66, 66, 73, 69, 88, 128, 66, 66, 73, 69, 84, 128, + 66, 66, 73, 69, 80, 128, 66, 66, 73, 69, 128, 66, 66, 73, 128, 66, 66, + 69, 88, 128, 66, 66, 69, 80, 128, 66, 66, 69, 69, 128, 66, 66, 69, 128, + 66, 66, 65, 88, 128, 66, 66, 65, 84, 128, 66, 66, 65, 80, 128, 66, 66, + 65, 65, 128, 66, 66, 65, 128, 66, 65, 89, 65, 78, 78, 65, 128, 66, 65, + 85, 128, 66, 65, 84, 84, 69, 82, 89, 128, 66, 65, 84, 72, 84, 85, 66, + 128, 66, 65, 84, 72, 65, 77, 65, 83, 65, 84, 128, 66, 65, 84, 72, 128, + 66, 65, 84, 200, 66, 65, 84, 65, 203, 66, 65, 83, 83, 65, 128, 66, 65, + 83, 83, 193, 66, 65, 83, 75, 69, 84, 66, 65, 76, 204, 66, 65, 83, 72, 75, + 73, 210, 66, 65, 83, 72, 128, 66, 65, 83, 69, 76, 73, 78, 197, 66, 65, + 83, 69, 66, 65, 76, 76, 128, 66, 65, 83, 69, 128, 66, 65, 83, 197, 66, + 65, 82, 83, 128, 66, 65, 82, 211, 66, 65, 82, 82, 73, 69, 82, 128, 66, + 65, 82, 82, 69, 75, 72, 128, 66, 65, 82, 82, 69, 69, 128, 66, 65, 82, 82, + 69, 197, 66, 65, 82, 76, 73, 78, 69, 128, 66, 65, 82, 76, 69, 89, 128, + 66, 65, 82, 73, 89, 79, 79, 83, 65, 78, 128, 66, 65, 82, 66, 69, 210, 66, + 65, 82, 65, 50, 128, 66, 65, 210, 66, 65, 78, 84, 79, 67, 128, 66, 65, + 78, 75, 78, 79, 84, 197, 66, 65, 78, 75, 128, 66, 65, 78, 203, 66, 65, + 78, 74, 79, 128, 66, 65, 78, 68, 128, 66, 65, 78, 65, 78, 65, 128, 66, + 65, 78, 50, 128, 66, 65, 78, 178, 66, 65, 77, 66, 79, 79, 83, 128, 66, + 65, 77, 66, 79, 79, 128, 66, 65, 76, 85, 68, 65, 128, 66, 65, 76, 76, 80, + 79, 73, 78, 212, 66, 65, 76, 76, 79, 84, 128, 66, 65, 76, 76, 79, 212, + 66, 65, 76, 76, 79, 79, 78, 45, 83, 80, 79, 75, 69, 196, 66, 65, 76, 76, + 79, 79, 78, 128, 66, 65, 76, 76, 69, 212, 66, 65, 76, 68, 128, 66, 65, + 76, 65, 71, 128, 66, 65, 76, 128, 66, 65, 204, 66, 65, 73, 82, 75, 65, + 78, 128, 66, 65, 73, 77, 65, 73, 128, 66, 65, 72, 84, 128, 66, 65, 72, + 73, 82, 71, 79, 77, 85, 75, 72, 65, 128, 66, 65, 72, 65, 82, 50, 128, 66, + 65, 72, 65, 82, 178, 66, 65, 72, 128, 66, 65, 71, 85, 69, 84, 84, 197, + 66, 65, 71, 83, 128, 66, 65, 71, 71, 65, 71, 197, 66, 65, 71, 69, 76, + 128, 66, 65, 71, 65, 128, 66, 65, 71, 51, 128, 66, 65, 199, 66, 65, 68, + 77, 73, 78, 84, 79, 206, 66, 65, 68, 71, 69, 82, 128, 66, 65, 68, 71, 69, + 128, 66, 65, 68, 128, 66, 65, 196, 66, 65, 67, 84, 82, 73, 65, 206, 66, + 65, 67, 79, 78, 128, 66, 65, 67, 75, 87, 65, 82, 68, 128, 66, 65, 67, 75, + 83, 80, 65, 67, 69, 128, 66, 65, 67, 75, 83, 76, 65, 83, 72, 128, 66, 65, + 67, 75, 83, 76, 65, 83, 200, 66, 65, 67, 75, 83, 76, 65, 78, 84, 69, 196, + 66, 65, 67, 75, 72, 65, 78, 196, 66, 65, 67, 75, 45, 84, 73, 76, 84, 69, + 196, 66, 65, 67, 75, 128, 66, 65, 67, 203, 66, 65, 66, 89, 128, 66, 65, + 66, 217, 66, 65, 65, 82, 69, 82, 85, 128, 66, 65, 45, 50, 128, 66, 51, + 48, 53, 128, 66, 50, 53, 180, 66, 50, 52, 183, 66, 50, 52, 179, 66, 50, + 52, 178, 66, 50, 52, 177, 66, 50, 52, 176, 66, 50, 51, 179, 66, 50, 51, + 177, 66, 50, 51, 176, 66, 50, 50, 181, 66, 50, 50, 176, 66, 49, 57, 177, + 66, 49, 55, 182, 66, 49, 55, 179, 66, 49, 54, 57, 128, 66, 49, 54, 56, + 128, 66, 49, 54, 55, 128, 66, 49, 54, 54, 128, 66, 49, 54, 53, 128, 66, + 49, 54, 52, 128, 66, 49, 54, 179, 66, 49, 54, 178, 66, 49, 54, 49, 128, + 66, 49, 54, 48, 128, 66, 49, 53, 185, 66, 49, 53, 56, 128, 66, 49, 53, + 55, 128, 66, 49, 53, 182, 66, 49, 53, 53, 128, 66, 49, 53, 52, 128, 66, + 49, 53, 51, 128, 66, 49, 53, 50, 128, 66, 49, 53, 177, 66, 49, 53, 48, + 128, 66, 49, 52, 54, 128, 66, 49, 52, 181, 66, 49, 52, 50, 128, 66, 49, + 52, 177, 66, 49, 52, 176, 66, 49, 51, 181, 66, 49, 51, 179, 66, 49, 51, + 50, 128, 66, 49, 51, 177, 66, 49, 51, 176, 66, 49, 50, 184, 66, 49, 50, + 183, 66, 49, 50, 181, 66, 49, 50, 179, 66, 49, 50, 178, 66, 49, 50, 177, + 66, 49, 50, 176, 66, 49, 48, 57, 205, 66, 49, 48, 57, 198, 66, 49, 48, + 56, 205, 66, 49, 48, 56, 198, 66, 49, 48, 55, 205, 66, 49, 48, 55, 198, + 66, 49, 48, 54, 205, 66, 49, 48, 54, 198, 66, 49, 48, 53, 205, 66, 49, + 48, 53, 198, 66, 49, 48, 181, 66, 49, 48, 180, 66, 49, 48, 178, 66, 49, + 48, 176, 66, 48, 57, 177, 66, 48, 57, 176, 66, 48, 56, 57, 128, 66, 48, + 56, 183, 66, 48, 56, 54, 128, 66, 48, 56, 181, 66, 48, 56, 51, 128, 66, + 48, 56, 50, 128, 66, 48, 56, 177, 66, 48, 56, 176, 66, 48, 55, 57, 128, + 66, 48, 55, 184, 66, 48, 55, 183, 66, 48, 55, 182, 66, 48, 55, 181, 66, + 48, 55, 180, 66, 48, 55, 179, 66, 48, 55, 178, 66, 48, 55, 177, 66, 48, + 55, 176, 66, 48, 54, 185, 66, 48, 54, 184, 66, 48, 54, 183, 66, 48, 54, + 182, 66, 48, 54, 181, 66, 48, 54, 52, 128, 66, 48, 54, 51, 128, 66, 48, + 54, 178, 66, 48, 54, 177, 66, 48, 54, 176, 66, 48, 53, 185, 66, 48, 53, + 184, 66, 48, 53, 183, 66, 48, 53, 54, 128, 66, 48, 53, 181, 66, 48, 53, + 180, 66, 48, 53, 179, 66, 48, 53, 178, 66, 48, 53, 177, 66, 48, 53, 176, + 66, 48, 52, 57, 128, 66, 48, 52, 184, 66, 48, 52, 55, 128, 66, 48, 52, + 182, 66, 48, 52, 181, 66, 48, 52, 180, 66, 48, 52, 179, 66, 48, 52, 178, + 66, 48, 52, 177, 66, 48, 52, 176, 66, 48, 51, 185, 66, 48, 51, 184, 66, + 48, 51, 183, 66, 48, 51, 182, 66, 48, 51, 52, 128, 66, 48, 51, 179, 66, + 48, 51, 178, 66, 48, 51, 177, 66, 48, 51, 176, 66, 48, 50, 185, 66, 48, + 50, 184, 66, 48, 50, 183, 66, 48, 50, 182, 66, 48, 50, 181, 66, 48, 50, + 180, 66, 48, 50, 179, 66, 48, 50, 50, 128, 66, 48, 50, 177, 66, 48, 50, + 176, 66, 48, 49, 57, 128, 66, 48, 49, 56, 128, 66, 48, 49, 183, 66, 48, + 49, 182, 66, 48, 49, 181, 66, 48, 49, 180, 66, 48, 49, 179, 66, 48, 49, + 178, 66, 48, 49, 177, 66, 48, 49, 176, 66, 48, 48, 57, 128, 66, 48, 48, + 185, 66, 48, 48, 56, 128, 66, 48, 48, 184, 66, 48, 48, 55, 128, 66, 48, + 48, 183, 66, 48, 48, 54, 128, 66, 48, 48, 182, 66, 48, 48, 53, 65, 128, + 66, 48, 48, 53, 128, 66, 48, 48, 181, 66, 48, 48, 52, 128, 66, 48, 48, + 180, 66, 48, 48, 51, 128, 66, 48, 48, 179, 66, 48, 48, 50, 128, 66, 48, + 48, 178, 66, 48, 48, 49, 128, 66, 48, 48, 177, 65, 90, 85, 128, 65, 89, + 66, 128, 65, 89, 65, 72, 128, 65, 88, 69, 128, 65, 87, 69, 128, 65, 87, + 65, 217, 65, 86, 79, 67, 65, 68, 79, 128, 65, 86, 69, 83, 84, 65, 206, + 65, 86, 69, 82, 65, 71, 197, 65, 86, 65, 75, 82, 65, 72, 65, 83, 65, 78, + 89, 65, 128, 65, 86, 65, 71, 82, 65, 72, 65, 128, 65, 85, 89, 65, 78, 78, + 65, 128, 65, 85, 84, 85, 77, 78, 128, 65, 85, 84, 79, 77, 79, 66, 73, 76, + 69, 128, 65, 85, 84, 79, 77, 65, 84, 69, 196, 65, 85, 84, 207, 65, 85, + 83, 84, 82, 65, 204, 65, 85, 82, 73, 80, 73, 71, 77, 69, 78, 84, 128, 65, + 85, 82, 65, 77, 65, 90, 68, 65, 65, 72, 65, 128, 65, 85, 82, 65, 77, 65, + 90, 68, 65, 65, 45, 50, 128, 65, 85, 82, 65, 77, 65, 90, 68, 65, 65, 128, + 65, 85, 78, 78, 128, 65, 85, 71, 85, 83, 84, 128, 65, 85, 71, 77, 69, 78, + 84, 65, 84, 73, 79, 206, 65, 85, 69, 128, 65, 85, 66, 69, 82, 71, 73, 78, + 69, 128, 65, 84, 84, 73, 195, 65, 84, 84, 72, 65, 67, 65, 78, 128, 65, + 84, 84, 69, 78, 84, 73, 79, 78, 128, 65, 84, 84, 65, 203, 65, 84, 84, 65, + 67, 72, 69, 196, 65, 84, 79, 205, 65, 84, 78, 65, 200, 65, 84, 77, 65, + 65, 85, 128, 65, 84, 73, 89, 65, 128, 65, 84, 73, 85, 128, 65, 84, 73, + 75, 82, 65, 77, 65, 128, 65, 84, 72, 76, 69, 84, 73, 195, 65, 84, 72, 65, + 82, 86, 65, 86, 69, 68, 73, 195, 65, 84, 72, 65, 80, 65, 83, 67, 65, 206, + 65, 84, 72, 45, 84, 72, 65, 76, 65, 84, 72, 65, 128, 65, 83, 90, 128, 65, + 83, 89, 85, 82, 193, 65, 83, 89, 77, 80, 84, 79, 84, 73, 67, 65, 76, 76, + 217, 65, 83, 84, 82, 79, 78, 79, 77, 73, 67, 65, 204, 65, 83, 84, 82, 79, + 76, 79, 71, 73, 67, 65, 204, 65, 83, 84, 82, 65, 69, 65, 128, 65, 83, 84, + 79, 78, 73, 83, 72, 69, 196, 65, 83, 84, 69, 82, 73, 83, 77, 128, 65, 83, + 84, 69, 82, 73, 83, 75, 211, 65, 83, 84, 69, 82, 73, 83, 75, 128, 65, 83, + 84, 69, 82, 73, 83, 203, 65, 83, 84, 69, 82, 73, 83, 67, 85, 83, 128, 65, + 83, 83, 89, 82, 73, 65, 206, 65, 83, 83, 69, 82, 84, 73, 79, 78, 128, 65, + 83, 80, 73, 82, 65, 84, 73, 79, 78, 128, 65, 83, 80, 73, 82, 65, 84, 69, + 196, 65, 83, 80, 69, 82, 128, 65, 83, 73, 65, 45, 65, 85, 83, 84, 82, 65, + 76, 73, 65, 128, 65, 83, 72, 71, 65, 66, 128, 65, 83, 72, 69, 83, 128, + 65, 83, 72, 57, 128, 65, 83, 72, 51, 128, 65, 83, 72, 178, 65, 83, 67, + 69, 78, 84, 128, 65, 83, 67, 69, 78, 68, 73, 78, 199, 65, 83, 65, 76, 50, + 128, 65, 83, 45, 83, 65, 74, 68, 65, 128, 65, 82, 85, 72, 85, 65, 128, + 65, 82, 84, 211, 65, 82, 84, 73, 83, 212, 65, 82, 84, 73, 67, 85, 76, 65, + 84, 69, 196, 65, 82, 84, 65, 66, 197, 65, 82, 84, 65, 128, 65, 82, 83, + 69, 79, 83, 128, 65, 82, 83, 69, 79, 211, 65, 82, 83, 69, 78, 73, 67, + 128, 65, 82, 82, 79, 87, 83, 128, 65, 82, 82, 79, 87, 211, 65, 82, 82, + 79, 87, 72, 69, 65, 68, 83, 128, 65, 82, 82, 79, 87, 72, 69, 65, 68, 128, + 65, 82, 82, 79, 87, 72, 69, 65, 196, 65, 82, 82, 79, 87, 45, 84, 65, 73, + 76, 128, 65, 82, 82, 73, 86, 73, 78, 71, 128, 65, 82, 82, 73, 86, 69, + 128, 65, 82, 82, 65, 89, 128, 65, 82, 80, 69, 71, 71, 73, 65, 84, 207, + 65, 82, 79, 85, 83, 73, 78, 199, 65, 82, 79, 85, 82, 193, 65, 82, 79, 85, + 78, 68, 45, 80, 82, 79, 70, 73, 76, 69, 128, 65, 82, 79, 85, 78, 196, 65, + 82, 77, 89, 128, 65, 82, 77, 79, 85, 82, 128, 65, 82, 77, 69, 78, 73, 65, + 206, 65, 82, 77, 128, 65, 82, 205, 65, 82, 76, 65, 85, 199, 65, 82, 75, 84, 73, 75, 207, 65, 82, 75, 65, 66, 128, 65, 82, 75, 65, 65, 78, 85, 128, 65, 82, 73, 83, 84, 69, 82, 65, 128, 65, 82, 73, 83, 84, 69, 82, 193, 65, 82, 73, 69, 83, 128, 65, 82, 71, 79, 84, 69, 82, 73, 128, 65, @@ -6047,6830 +6104,6900 @@ static unsigned char lexicon[] = { 71, 79, 77, 85, 75, 72, 65, 128, 65, 78, 83, 85, 218, 65, 78, 83, 72, 69, 128, 65, 78, 80, 69, 65, 128, 65, 78, 207, 65, 78, 78, 85, 73, 84, 217, 65, 78, 78, 79, 84, 65, 84, 73, 79, 206, 65, 78, 78, 65, 65, 85, 128, 65, - 78, 75, 72, 128, 65, 78, 74, 73, 128, 65, 78, 72, 85, 128, 65, 78, 71, - 85, 76, 65, 82, 128, 65, 78, 71, 85, 73, 83, 72, 69, 196, 65, 78, 71, 83, - 84, 82, 79, 205, 65, 78, 71, 82, 217, 65, 78, 71, 76, 69, 68, 128, 65, - 78, 71, 76, 69, 196, 65, 78, 71, 75, 72, 65, 78, 75, 72, 85, 128, 65, 78, - 71, 75, 65, 128, 65, 78, 71, 69, 210, 65, 78, 71, 69, 76, 128, 65, 78, - 71, 69, 68, 128, 65, 78, 68, 65, 80, 128, 65, 78, 67, 79, 82, 65, 128, - 65, 78, 67, 72, 79, 82, 128, 65, 78, 65, 84, 82, 73, 67, 72, 73, 83, 77, - 65, 128, 65, 78, 65, 80, 128, 65, 78, 45, 78, 73, 83, 70, 128, 65, 77, - 85, 76, 69, 84, 128, 65, 77, 80, 83, 128, 65, 77, 80, 72, 79, 82, 65, - 128, 65, 77, 80, 69, 82, 83, 65, 78, 68, 128, 65, 77, 80, 69, 82, 83, 65, - 78, 196, 65, 77, 79, 85, 78, 212, 65, 77, 69, 82, 73, 67, 65, 83, 128, - 65, 77, 69, 82, 73, 67, 65, 206, 65, 77, 66, 85, 76, 65, 78, 67, 69, 128, - 65, 77, 66, 193, 65, 77, 66, 128, 65, 77, 65, 82, 128, 65, 77, 65, 210, - 65, 77, 65, 76, 71, 65, 77, 65, 84, 73, 79, 206, 65, 77, 65, 76, 71, 65, - 77, 128, 65, 76, 86, 69, 79, 76, 65, 210, 65, 76, 85, 77, 128, 65, 76, - 84, 69, 82, 78, 65, 84, 73, 86, 197, 65, 76, 84, 69, 82, 78, 65, 84, 73, - 79, 206, 65, 76, 84, 69, 82, 78, 65, 84, 73, 78, 71, 128, 65, 76, 84, 69, - 82, 78, 65, 84, 73, 78, 199, 65, 76, 84, 69, 82, 78, 65, 84, 69, 128, 65, - 76, 84, 69, 82, 78, 65, 84, 197, 65, 76, 84, 65, 128, 65, 76, 80, 72, 65, - 128, 65, 76, 80, 72, 193, 65, 76, 80, 65, 80, 82, 65, 78, 65, 128, 65, - 76, 80, 65, 80, 82, 65, 65, 78, 193, 65, 76, 80, 65, 128, 65, 76, 77, 79, - 83, 212, 65, 76, 76, 79, 128, 65, 76, 76, 73, 65, 78, 67, 69, 128, 65, - 76, 76, 201, 65, 76, 76, 65, 200, 65, 76, 75, 65, 76, 73, 45, 50, 128, - 65, 76, 75, 65, 76, 73, 128, 65, 76, 73, 71, 78, 69, 196, 65, 76, 73, 70, - 85, 128, 65, 76, 73, 70, 128, 65, 76, 73, 198, 65, 76, 73, 69, 78, 128, - 65, 76, 73, 69, 206, 65, 76, 71, 73, 218, 65, 76, 70, 65, 128, 65, 76, - 69, 85, 212, 65, 76, 69, 82, 84, 128, 65, 76, 69, 80, 72, 128, 65, 76, - 69, 77, 66, 73, 67, 128, 65, 76, 69, 70, 128, 65, 76, 66, 65, 78, 73, 65, - 206, 65, 76, 65, 89, 72, 69, 128, 65, 76, 65, 89, 72, 197, 65, 76, 65, - 82, 205, 65, 76, 65, 80, 72, 128, 65, 76, 45, 76, 65, 75, 85, 78, 65, - 128, 65, 75, 84, 73, 69, 83, 69, 76, 83, 75, 65, 66, 128, 65, 75, 83, 65, - 128, 65, 75, 72, 77, 73, 77, 73, 195, 65, 75, 66, 65, 210, 65, 75, 65, - 82, 65, 128, 65, 75, 65, 82, 193, 65, 73, 89, 65, 78, 78, 65, 128, 65, - 73, 86, 73, 76, 73, 203, 65, 73, 86, 65, 128, 65, 73, 84, 79, 206, 65, - 73, 82, 80, 76, 65, 78, 69, 128, 65, 73, 82, 80, 76, 65, 78, 197, 65, 73, - 78, 213, 65, 73, 78, 78, 128, 65, 73, 76, 77, 128, 65, 73, 75, 65, 82, - 65, 128, 65, 73, 72, 86, 85, 83, 128, 65, 72, 83, 68, 65, 128, 65, 72, - 83, 65, 128, 65, 72, 79, 205, 65, 72, 65, 78, 199, 65, 72, 65, 71, 71, - 65, 210, 65, 72, 65, 68, 128, 65, 71, 85, 78, 71, 128, 65, 71, 79, 71, - 201, 65, 71, 71, 82, 65, 86, 65, 84, 73, 79, 78, 128, 65, 71, 71, 82, 65, - 86, 65, 84, 69, 196, 65, 71, 65, 73, 78, 83, 212, 65, 71, 65, 73, 78, - 128, 65, 70, 84, 69, 210, 65, 70, 83, 65, 65, 81, 128, 65, 70, 82, 73, - 67, 65, 206, 65, 70, 79, 82, 69, 77, 69, 78, 84, 73, 79, 78, 69, 68, 128, - 65, 70, 71, 72, 65, 78, 201, 65, 70, 70, 82, 73, 67, 65, 84, 73, 79, 206, - 65, 70, 70, 73, 216, 65, 69, 89, 65, 78, 78, 65, 128, 65, 69, 89, 128, - 65, 69, 83, 67, 85, 76, 65, 80, 73, 85, 83, 128, 65, 69, 83, 67, 128, 65, - 69, 83, 128, 65, 69, 82, 73, 65, 204, 65, 69, 82, 128, 65, 69, 76, 65, - 45, 80, 73, 76, 76, 65, 128, 65, 69, 76, 128, 65, 69, 75, 128, 65, 69, - 71, 69, 65, 206, 65, 69, 71, 128, 65, 69, 69, 89, 65, 78, 78, 65, 128, - 65, 69, 69, 128, 65, 69, 68, 65, 45, 80, 73, 76, 76, 65, 128, 65, 69, 68, - 128, 65, 69, 66, 128, 65, 68, 86, 65, 78, 84, 65, 71, 69, 128, 65, 68, - 86, 65, 78, 67, 69, 128, 65, 68, 85, 76, 84, 128, 65, 68, 77, 73, 83, 83, - 73, 79, 206, 65, 68, 77, 69, 84, 79, 83, 128, 65, 68, 76, 65, 205, 65, - 68, 69, 71, 128, 65, 68, 69, 199, 65, 68, 68, 82, 69, 83, 83, 69, 196, - 65, 68, 68, 82, 69, 83, 211, 65, 68, 68, 65, 75, 128, 65, 68, 65, 203, - 65, 67, 85, 84, 69, 45, 77, 65, 67, 82, 79, 78, 128, 65, 67, 85, 84, 69, - 45, 71, 82, 65, 86, 69, 45, 65, 67, 85, 84, 69, 128, 65, 67, 85, 84, 197, - 65, 67, 84, 85, 65, 76, 76, 217, 65, 67, 84, 73, 86, 65, 84, 197, 65, 67, - 82, 79, 80, 72, 79, 78, 73, 195, 65, 67, 75, 78, 79, 87, 76, 69, 68, 71, - 69, 128, 65, 67, 67, 85, 77, 85, 76, 65, 84, 73, 79, 78, 128, 65, 67, 67, - 79, 85, 78, 212, 65, 67, 67, 79, 77, 77, 79, 68, 65, 84, 73, 79, 78, 128, - 65, 67, 67, 69, 80, 84, 128, 65, 67, 67, 69, 78, 84, 45, 83, 84, 65, 67, - 67, 65, 84, 79, 128, 65, 67, 67, 69, 78, 84, 128, 65, 67, 67, 69, 78, - 212, 65, 67, 65, 68, 69, 77, 217, 65, 66, 89, 83, 77, 65, 204, 65, 66, - 85, 78, 68, 65, 78, 67, 69, 128, 65, 66, 75, 72, 65, 83, 73, 65, 206, 65, - 66, 66, 82, 69, 86, 73, 65, 84, 73, 79, 206, 65, 66, 65, 70, 73, 76, 73, - 128, 65, 66, 65, 67, 85, 83, 128, 65, 66, 178, 65, 66, 49, 57, 49, 128, - 65, 66, 49, 56, 56, 128, 65, 66, 49, 56, 48, 128, 65, 66, 49, 55, 49, - 128, 65, 66, 49, 54, 52, 128, 65, 66, 49, 51, 49, 66, 128, 65, 66, 49, - 51, 49, 65, 128, 65, 66, 49, 50, 51, 128, 65, 66, 49, 50, 50, 128, 65, - 66, 49, 50, 48, 128, 65, 66, 49, 49, 56, 128, 65, 66, 48, 56, 55, 128, - 65, 66, 48, 56, 54, 128, 65, 66, 48, 56, 53, 128, 65, 66, 48, 56, 50, - 128, 65, 66, 48, 56, 49, 128, 65, 66, 48, 56, 48, 128, 65, 66, 48, 55, - 57, 128, 65, 66, 48, 55, 56, 128, 65, 66, 48, 55, 55, 128, 65, 66, 48, - 55, 54, 128, 65, 66, 48, 55, 52, 128, 65, 66, 48, 55, 51, 128, 65, 66, - 48, 55, 48, 128, 65, 66, 48, 54, 57, 128, 65, 66, 48, 54, 55, 128, 65, - 66, 48, 54, 54, 128, 65, 66, 48, 54, 53, 128, 65, 66, 48, 54, 49, 128, - 65, 66, 48, 54, 48, 128, 65, 66, 48, 53, 57, 128, 65, 66, 48, 53, 56, - 128, 65, 66, 48, 53, 55, 128, 65, 66, 48, 53, 54, 128, 65, 66, 48, 53, - 53, 128, 65, 66, 48, 53, 52, 128, 65, 66, 48, 53, 51, 128, 65, 66, 48, - 53, 49, 128, 65, 66, 48, 53, 48, 128, 65, 66, 48, 52, 57, 128, 65, 66, - 48, 52, 56, 128, 65, 66, 48, 52, 55, 128, 65, 66, 48, 52, 54, 128, 65, - 66, 48, 52, 53, 128, 65, 66, 48, 52, 52, 128, 65, 66, 48, 52, 49, 128, - 65, 66, 48, 52, 48, 128, 65, 66, 48, 51, 57, 128, 65, 66, 48, 51, 56, - 128, 65, 66, 48, 51, 55, 128, 65, 66, 48, 51, 52, 128, 65, 66, 48, 51, - 49, 128, 65, 66, 48, 51, 48, 128, 65, 66, 48, 50, 57, 128, 65, 66, 48, - 50, 56, 128, 65, 66, 48, 50, 55, 128, 65, 66, 48, 50, 54, 128, 65, 66, - 48, 50, 52, 128, 65, 66, 48, 50, 51, 77, 128, 65, 66, 48, 50, 51, 128, - 65, 66, 48, 50, 50, 77, 128, 65, 66, 48, 50, 50, 70, 128, 65, 66, 48, 50, - 50, 128, 65, 66, 48, 50, 49, 77, 128, 65, 66, 48, 50, 49, 70, 128, 65, - 66, 48, 50, 49, 128, 65, 66, 48, 50, 48, 128, 65, 66, 48, 49, 55, 128, - 65, 66, 48, 49, 54, 128, 65, 66, 48, 49, 51, 128, 65, 66, 48, 49, 49, - 128, 65, 66, 48, 49, 48, 128, 65, 66, 48, 48, 57, 128, 65, 66, 48, 48, - 56, 128, 65, 66, 48, 48, 55, 128, 65, 66, 48, 48, 54, 128, 65, 66, 48, - 48, 53, 128, 65, 66, 48, 48, 52, 128, 65, 66, 48, 48, 51, 128, 65, 66, - 48, 48, 50, 128, 65, 66, 48, 48, 49, 128, 65, 65, 89, 73, 78, 128, 65, - 65, 89, 65, 78, 78, 65, 128, 65, 65, 89, 128, 65, 65, 87, 128, 65, 65, - 79, 128, 65, 65, 74, 128, 65, 65, 66, 65, 65, 70, 73, 76, 73, 128, 65, - 65, 48, 51, 50, 128, 65, 65, 48, 51, 49, 128, 65, 65, 48, 51, 48, 128, - 65, 65, 48, 50, 57, 128, 65, 65, 48, 50, 56, 128, 65, 65, 48, 50, 55, - 128, 65, 65, 48, 50, 54, 128, 65, 65, 48, 50, 53, 128, 65, 65, 48, 50, - 52, 128, 65, 65, 48, 50, 51, 128, 65, 65, 48, 50, 50, 128, 65, 65, 48, - 50, 49, 128, 65, 65, 48, 50, 48, 128, 65, 65, 48, 49, 57, 128, 65, 65, - 48, 49, 56, 128, 65, 65, 48, 49, 55, 128, 65, 65, 48, 49, 54, 128, 65, - 65, 48, 49, 53, 128, 65, 65, 48, 49, 52, 128, 65, 65, 48, 49, 51, 128, - 65, 65, 48, 49, 50, 128, 65, 65, 48, 49, 49, 128, 65, 65, 48, 49, 48, - 128, 65, 65, 48, 48, 57, 128, 65, 65, 48, 48, 56, 128, 65, 65, 48, 48, - 55, 66, 128, 65, 65, 48, 48, 55, 65, 128, 65, 65, 48, 48, 55, 128, 65, - 65, 48, 48, 54, 128, 65, 65, 48, 48, 53, 128, 65, 65, 48, 48, 52, 128, - 65, 65, 48, 48, 51, 128, 65, 65, 48, 48, 50, 128, 65, 65, 48, 48, 49, - 128, 65, 56, 48, 55, 128, 65, 56, 48, 54, 128, 65, 56, 48, 53, 128, 65, - 56, 48, 52, 128, 65, 56, 48, 51, 128, 65, 56, 48, 50, 128, 65, 56, 48, - 49, 128, 65, 56, 48, 48, 128, 65, 55, 51, 178, 65, 55, 50, 182, 65, 55, - 49, 183, 65, 55, 49, 181, 65, 55, 49, 180, 65, 55, 49, 179, 65, 55, 49, - 178, 65, 55, 49, 177, 65, 55, 49, 176, 65, 55, 48, 57, 45, 182, 65, 55, - 48, 57, 45, 180, 65, 55, 48, 57, 45, 179, 65, 55, 48, 57, 45, 178, 65, - 55, 48, 185, 65, 55, 48, 184, 65, 55, 48, 183, 65, 55, 48, 182, 65, 55, - 48, 181, 65, 55, 48, 180, 65, 55, 48, 179, 65, 55, 48, 178, 65, 55, 48, - 177, 65, 54, 54, 52, 128, 65, 54, 54, 51, 128, 65, 54, 54, 50, 128, 65, - 54, 54, 49, 128, 65, 54, 54, 48, 128, 65, 54, 53, 57, 128, 65, 54, 53, - 56, 128, 65, 54, 53, 55, 128, 65, 54, 53, 54, 128, 65, 54, 53, 53, 128, - 65, 54, 53, 52, 128, 65, 54, 53, 51, 128, 65, 54, 53, 50, 128, 65, 54, - 53, 49, 128, 65, 54, 52, 57, 128, 65, 54, 52, 56, 128, 65, 54, 52, 54, - 128, 65, 54, 52, 53, 128, 65, 54, 52, 52, 128, 65, 54, 52, 51, 128, 65, - 54, 52, 50, 128, 65, 54, 52, 48, 128, 65, 54, 51, 56, 128, 65, 54, 51, - 55, 128, 65, 54, 51, 52, 128, 65, 54, 50, 57, 128, 65, 54, 50, 56, 128, - 65, 54, 50, 55, 128, 65, 54, 50, 54, 128, 65, 54, 50, 52, 128, 65, 54, - 50, 51, 128, 65, 54, 50, 50, 128, 65, 54, 50, 49, 128, 65, 54, 50, 48, - 128, 65, 54, 49, 57, 128, 65, 54, 49, 56, 128, 65, 54, 49, 55, 128, 65, - 54, 49, 54, 128, 65, 54, 49, 53, 128, 65, 54, 49, 52, 128, 65, 54, 49, - 51, 128, 65, 54, 49, 50, 128, 65, 54, 49, 49, 128, 65, 54, 49, 48, 128, - 65, 54, 48, 57, 128, 65, 54, 48, 56, 128, 65, 54, 48, 54, 128, 65, 54, - 48, 52, 128, 65, 54, 48, 51, 128, 65, 54, 48, 50, 128, 65, 54, 48, 49, - 128, 65, 54, 48, 48, 128, 65, 53, 57, 56, 128, 65, 53, 57, 54, 128, 65, - 53, 57, 53, 128, 65, 53, 57, 52, 128, 65, 53, 57, 50, 128, 65, 53, 57, - 49, 128, 65, 53, 56, 57, 128, 65, 53, 56, 56, 128, 65, 53, 56, 55, 128, - 65, 53, 56, 54, 128, 65, 53, 56, 53, 128, 65, 53, 56, 52, 128, 65, 53, - 56, 51, 128, 65, 53, 56, 50, 128, 65, 53, 56, 49, 128, 65, 53, 56, 48, - 128, 65, 53, 55, 57, 128, 65, 53, 55, 56, 128, 65, 53, 55, 55, 128, 65, - 53, 55, 54, 128, 65, 53, 55, 53, 128, 65, 53, 55, 52, 128, 65, 53, 55, - 51, 128, 65, 53, 55, 50, 128, 65, 53, 55, 49, 128, 65, 53, 55, 48, 128, - 65, 53, 54, 57, 128, 65, 53, 54, 56, 128, 65, 53, 54, 54, 128, 65, 53, - 54, 53, 128, 65, 53, 54, 52, 128, 65, 53, 54, 51, 128, 65, 53, 53, 57, - 128, 65, 53, 53, 55, 128, 65, 53, 53, 54, 128, 65, 53, 53, 53, 128, 65, - 53, 53, 52, 128, 65, 53, 53, 51, 128, 65, 53, 53, 50, 128, 65, 53, 53, - 49, 128, 65, 53, 53, 48, 128, 65, 53, 52, 57, 128, 65, 53, 52, 56, 128, - 65, 53, 52, 55, 128, 65, 53, 52, 53, 128, 65, 53, 52, 50, 128, 65, 53, - 52, 49, 128, 65, 53, 52, 48, 128, 65, 53, 51, 57, 128, 65, 53, 51, 56, - 128, 65, 53, 51, 55, 128, 65, 53, 51, 54, 128, 65, 53, 51, 53, 128, 65, - 53, 51, 52, 128, 65, 53, 51, 50, 128, 65, 53, 51, 49, 128, 65, 53, 51, - 48, 128, 65, 53, 50, 57, 128, 65, 53, 50, 56, 128, 65, 53, 50, 55, 128, - 65, 53, 50, 54, 128, 65, 53, 50, 53, 128, 65, 53, 50, 52, 128, 65, 53, - 50, 51, 128, 65, 53, 50, 50, 128, 65, 53, 50, 49, 128, 65, 53, 50, 48, - 128, 65, 53, 49, 57, 128, 65, 53, 49, 56, 128, 65, 53, 49, 55, 128, 65, - 53, 49, 54, 128, 65, 53, 49, 53, 128, 65, 53, 49, 52, 128, 65, 53, 49, - 51, 128, 65, 53, 49, 50, 128, 65, 53, 49, 49, 128, 65, 53, 49, 48, 128, - 65, 53, 48, 57, 128, 65, 53, 48, 56, 128, 65, 53, 48, 55, 128, 65, 53, - 48, 54, 128, 65, 53, 48, 53, 128, 65, 53, 48, 52, 128, 65, 53, 48, 51, - 128, 65, 53, 48, 50, 128, 65, 53, 48, 49, 128, 65, 52, 57, 55, 128, 65, - 52, 57, 54, 128, 65, 52, 57, 53, 128, 65, 52, 57, 52, 128, 65, 52, 57, - 51, 128, 65, 52, 57, 50, 128, 65, 52, 57, 49, 128, 65, 52, 57, 48, 128, - 65, 52, 56, 57, 128, 65, 52, 56, 56, 128, 65, 52, 56, 55, 128, 65, 52, - 56, 54, 128, 65, 52, 56, 53, 128, 65, 52, 56, 52, 128, 65, 52, 56, 51, - 128, 65, 52, 56, 50, 128, 65, 52, 56, 49, 128, 65, 52, 56, 48, 128, 65, - 52, 55, 57, 128, 65, 52, 55, 56, 128, 65, 52, 55, 55, 128, 65, 52, 55, - 54, 128, 65, 52, 55, 53, 128, 65, 52, 55, 52, 128, 65, 52, 55, 51, 128, - 65, 52, 55, 50, 128, 65, 52, 55, 49, 128, 65, 52, 55, 48, 128, 65, 52, - 54, 57, 128, 65, 52, 54, 56, 128, 65, 52, 54, 55, 128, 65, 52, 54, 54, - 128, 65, 52, 54, 53, 128, 65, 52, 54, 52, 128, 65, 52, 54, 51, 128, 65, - 52, 54, 50, 128, 65, 52, 54, 49, 128, 65, 52, 54, 48, 128, 65, 52, 53, - 57, 128, 65, 52, 53, 56, 128, 65, 52, 53, 55, 65, 128, 65, 52, 53, 55, - 128, 65, 52, 53, 54, 128, 65, 52, 53, 53, 128, 65, 52, 53, 52, 128, 65, - 52, 53, 51, 128, 65, 52, 53, 50, 128, 65, 52, 53, 49, 128, 65, 52, 53, - 48, 65, 128, 65, 52, 53, 48, 128, 65, 52, 52, 57, 128, 65, 52, 52, 56, - 128, 65, 52, 52, 55, 128, 65, 52, 52, 54, 128, 65, 52, 52, 53, 128, 65, - 52, 52, 52, 128, 65, 52, 52, 51, 128, 65, 52, 52, 50, 128, 65, 52, 52, - 49, 128, 65, 52, 52, 48, 128, 65, 52, 51, 57, 128, 65, 52, 51, 56, 128, - 65, 52, 51, 55, 128, 65, 52, 51, 54, 128, 65, 52, 51, 53, 128, 65, 52, - 51, 52, 128, 65, 52, 51, 51, 128, 65, 52, 51, 50, 128, 65, 52, 51, 49, - 128, 65, 52, 51, 48, 128, 65, 52, 50, 57, 128, 65, 52, 50, 56, 128, 65, - 52, 50, 55, 128, 65, 52, 50, 54, 128, 65, 52, 50, 53, 128, 65, 52, 50, - 52, 128, 65, 52, 50, 51, 128, 65, 52, 50, 50, 128, 65, 52, 50, 49, 128, - 65, 52, 50, 48, 128, 65, 52, 49, 57, 128, 65, 52, 49, 56, 45, 86, 65, 83, - 128, 65, 52, 49, 56, 128, 65, 52, 49, 55, 45, 86, 65, 83, 128, 65, 52, - 49, 55, 128, 65, 52, 49, 54, 45, 86, 65, 83, 128, 65, 52, 49, 54, 128, - 65, 52, 49, 53, 45, 86, 65, 83, 128, 65, 52, 49, 53, 128, 65, 52, 49, 52, - 45, 86, 65, 83, 128, 65, 52, 49, 52, 128, 65, 52, 49, 51, 45, 86, 65, 83, - 128, 65, 52, 49, 51, 128, 65, 52, 49, 50, 45, 86, 65, 83, 128, 65, 52, - 49, 50, 128, 65, 52, 49, 49, 45, 86, 65, 83, 128, 65, 52, 49, 49, 128, - 65, 52, 49, 48, 193, 65, 52, 49, 48, 45, 86, 65, 83, 128, 65, 52, 49, - 176, 65, 52, 48, 57, 45, 86, 65, 83, 128, 65, 52, 48, 57, 128, 65, 52, - 48, 56, 45, 86, 65, 83, 128, 65, 52, 48, 56, 128, 65, 52, 48, 55, 45, 86, - 65, 83, 128, 65, 52, 48, 55, 128, 65, 52, 48, 54, 45, 86, 65, 83, 128, - 65, 52, 48, 54, 128, 65, 52, 48, 53, 45, 86, 65, 83, 128, 65, 52, 48, 53, - 128, 65, 52, 48, 52, 45, 86, 65, 83, 128, 65, 52, 48, 52, 128, 65, 52, - 48, 51, 45, 86, 65, 83, 128, 65, 52, 48, 51, 128, 65, 52, 48, 50, 45, 86, - 65, 83, 128, 65, 52, 48, 50, 128, 65, 52, 48, 49, 45, 86, 65, 83, 128, - 65, 52, 48, 49, 128, 65, 52, 48, 48, 45, 86, 65, 83, 128, 65, 52, 48, 48, - 128, 65, 51, 57, 57, 128, 65, 51, 57, 56, 128, 65, 51, 57, 55, 128, 65, - 51, 57, 54, 128, 65, 51, 57, 53, 128, 65, 51, 57, 52, 128, 65, 51, 57, - 179, 65, 51, 57, 50, 128, 65, 51, 57, 49, 128, 65, 51, 57, 48, 128, 65, - 51, 56, 57, 128, 65, 51, 56, 56, 128, 65, 51, 56, 55, 128, 65, 51, 56, - 54, 65, 128, 65, 51, 56, 54, 128, 65, 51, 56, 53, 128, 65, 51, 56, 52, - 128, 65, 51, 56, 51, 65, 128, 65, 51, 56, 179, 65, 51, 56, 50, 128, 65, - 51, 56, 49, 65, 128, 65, 51, 56, 49, 128, 65, 51, 56, 48, 128, 65, 51, - 55, 57, 128, 65, 51, 55, 56, 128, 65, 51, 55, 55, 128, 65, 51, 55, 54, - 128, 65, 51, 55, 53, 128, 65, 51, 55, 52, 128, 65, 51, 55, 51, 128, 65, - 51, 55, 50, 128, 65, 51, 55, 49, 65, 128, 65, 51, 55, 49, 128, 65, 51, - 55, 48, 128, 65, 51, 54, 57, 128, 65, 51, 54, 56, 65, 128, 65, 51, 54, - 56, 128, 65, 51, 54, 55, 128, 65, 51, 54, 54, 128, 65, 51, 54, 53, 128, - 65, 51, 54, 52, 65, 128, 65, 51, 54, 52, 128, 65, 51, 54, 51, 128, 65, - 51, 54, 50, 128, 65, 51, 54, 49, 128, 65, 51, 54, 48, 128, 65, 51, 53, - 57, 65, 128, 65, 51, 53, 57, 128, 65, 51, 53, 56, 128, 65, 51, 53, 55, - 128, 65, 51, 53, 54, 128, 65, 51, 53, 53, 128, 65, 51, 53, 52, 128, 65, - 51, 53, 51, 128, 65, 51, 53, 50, 128, 65, 51, 53, 49, 128, 65, 51, 53, - 48, 128, 65, 51, 52, 57, 128, 65, 51, 52, 56, 128, 65, 51, 52, 55, 128, - 65, 51, 52, 54, 128, 65, 51, 52, 53, 128, 65, 51, 52, 52, 128, 65, 51, - 52, 51, 128, 65, 51, 52, 50, 128, 65, 51, 52, 49, 128, 65, 51, 52, 48, - 128, 65, 51, 51, 57, 128, 65, 51, 51, 56, 128, 65, 51, 51, 55, 128, 65, - 51, 51, 54, 67, 128, 65, 51, 51, 54, 66, 128, 65, 51, 51, 54, 65, 128, - 65, 51, 51, 54, 128, 65, 51, 51, 53, 128, 65, 51, 51, 52, 128, 65, 51, - 51, 51, 128, 65, 51, 51, 50, 67, 128, 65, 51, 51, 50, 66, 128, 65, 51, - 51, 50, 65, 128, 65, 51, 51, 50, 128, 65, 51, 51, 49, 128, 65, 51, 51, - 48, 128, 65, 51, 50, 57, 65, 128, 65, 51, 50, 57, 128, 65, 51, 50, 56, - 128, 65, 51, 50, 55, 128, 65, 51, 50, 54, 128, 65, 51, 50, 53, 128, 65, - 51, 50, 52, 128, 65, 51, 50, 51, 128, 65, 51, 50, 50, 128, 65, 51, 50, - 49, 128, 65, 51, 50, 48, 128, 65, 51, 49, 57, 128, 65, 51, 49, 56, 128, - 65, 51, 49, 55, 128, 65, 51, 49, 54, 128, 65, 51, 49, 53, 128, 65, 51, - 49, 52, 128, 65, 51, 49, 51, 67, 128, 65, 51, 49, 51, 66, 128, 65, 51, - 49, 51, 65, 128, 65, 51, 49, 51, 128, 65, 51, 49, 50, 128, 65, 51, 49, - 49, 128, 65, 51, 49, 48, 128, 65, 51, 48, 57, 67, 128, 65, 51, 48, 57, - 66, 128, 65, 51, 48, 57, 65, 128, 65, 51, 48, 57, 128, 65, 51, 48, 56, - 128, 65, 51, 48, 55, 128, 65, 51, 48, 54, 128, 65, 51, 48, 53, 128, 65, - 51, 48, 52, 128, 65, 51, 48, 51, 128, 65, 51, 48, 50, 128, 65, 51, 48, - 49, 128, 65, 51, 48, 48, 128, 65, 50, 57, 57, 65, 128, 65, 50, 57, 57, - 128, 65, 50, 57, 56, 128, 65, 50, 57, 55, 128, 65, 50, 57, 54, 128, 65, - 50, 57, 53, 128, 65, 50, 57, 52, 65, 128, 65, 50, 57, 52, 128, 65, 50, - 57, 51, 128, 65, 50, 57, 50, 128, 65, 50, 57, 49, 128, 65, 50, 57, 48, - 128, 65, 50, 56, 57, 65, 128, 65, 50, 56, 57, 128, 65, 50, 56, 56, 128, - 65, 50, 56, 55, 128, 65, 50, 56, 54, 128, 65, 50, 56, 53, 128, 65, 50, - 56, 52, 128, 65, 50, 56, 51, 128, 65, 50, 56, 50, 128, 65, 50, 56, 49, - 128, 65, 50, 56, 48, 128, 65, 50, 55, 57, 128, 65, 50, 55, 56, 128, 65, - 50, 55, 55, 128, 65, 50, 55, 54, 128, 65, 50, 55, 53, 128, 65, 50, 55, - 52, 128, 65, 50, 55, 51, 128, 65, 50, 55, 50, 128, 65, 50, 55, 49, 128, - 65, 50, 55, 48, 128, 65, 50, 54, 57, 128, 65, 50, 54, 56, 128, 65, 50, - 54, 55, 65, 128, 65, 50, 54, 55, 128, 65, 50, 54, 54, 128, 65, 50, 54, - 53, 128, 65, 50, 54, 52, 128, 65, 50, 54, 51, 128, 65, 50, 54, 50, 128, - 65, 50, 54, 49, 128, 65, 50, 54, 48, 128, 65, 50, 53, 57, 128, 65, 50, - 53, 56, 128, 65, 50, 53, 55, 128, 65, 50, 53, 54, 128, 65, 50, 53, 53, - 128, 65, 50, 53, 52, 128, 65, 50, 53, 51, 128, 65, 50, 53, 50, 128, 65, - 50, 53, 49, 128, 65, 50, 53, 48, 128, 65, 50, 52, 57, 128, 65, 50, 52, - 56, 128, 65, 50, 52, 55, 128, 65, 50, 52, 54, 128, 65, 50, 52, 53, 128, - 65, 50, 52, 52, 128, 65, 50, 52, 51, 128, 65, 50, 52, 50, 128, 65, 50, - 52, 49, 128, 65, 50, 52, 48, 128, 65, 50, 51, 57, 128, 65, 50, 51, 56, - 128, 65, 50, 51, 55, 128, 65, 50, 51, 54, 128, 65, 50, 51, 53, 128, 65, - 50, 51, 52, 128, 65, 50, 51, 51, 128, 65, 50, 51, 50, 128, 65, 50, 51, - 49, 128, 65, 50, 51, 48, 128, 65, 50, 50, 57, 128, 65, 50, 50, 56, 128, - 65, 50, 50, 55, 65, 128, 65, 50, 50, 55, 128, 65, 50, 50, 54, 128, 65, - 50, 50, 53, 128, 65, 50, 50, 52, 128, 65, 50, 50, 51, 128, 65, 50, 50, - 50, 128, 65, 50, 50, 49, 128, 65, 50, 50, 48, 128, 65, 50, 49, 57, 128, - 65, 50, 49, 56, 128, 65, 50, 49, 55, 128, 65, 50, 49, 54, 65, 128, 65, - 50, 49, 54, 128, 65, 50, 49, 53, 65, 128, 65, 50, 49, 53, 128, 65, 50, - 49, 52, 128, 65, 50, 49, 51, 128, 65, 50, 49, 50, 128, 65, 50, 49, 49, - 128, 65, 50, 49, 48, 128, 65, 50, 48, 57, 65, 128, 65, 50, 48, 57, 128, - 65, 50, 48, 56, 128, 65, 50, 48, 55, 65, 128, 65, 50, 48, 55, 128, 65, - 50, 48, 54, 128, 65, 50, 48, 53, 128, 65, 50, 48, 52, 128, 65, 50, 48, - 51, 128, 65, 50, 48, 50, 66, 128, 65, 50, 48, 50, 65, 128, 65, 50, 48, - 50, 128, 65, 50, 48, 49, 128, 65, 50, 48, 48, 128, 65, 49, 57, 57, 128, - 65, 49, 57, 56, 128, 65, 49, 57, 55, 128, 65, 49, 57, 54, 128, 65, 49, - 57, 53, 128, 65, 49, 57, 52, 128, 65, 49, 57, 51, 128, 65, 49, 57, 50, - 128, 65, 49, 57, 49, 128, 65, 49, 57, 48, 128, 65, 49, 56, 57, 128, 65, - 49, 56, 56, 128, 65, 49, 56, 55, 128, 65, 49, 56, 54, 128, 65, 49, 56, - 53, 128, 65, 49, 56, 52, 128, 65, 49, 56, 51, 128, 65, 49, 56, 50, 128, - 65, 49, 56, 49, 128, 65, 49, 56, 48, 128, 65, 49, 55, 57, 128, 65, 49, - 55, 56, 128, 65, 49, 55, 55, 128, 65, 49, 55, 54, 128, 65, 49, 55, 53, - 128, 65, 49, 55, 52, 128, 65, 49, 55, 51, 128, 65, 49, 55, 50, 128, 65, - 49, 55, 49, 128, 65, 49, 55, 48, 128, 65, 49, 54, 57, 128, 65, 49, 54, - 56, 128, 65, 49, 54, 55, 128, 65, 49, 54, 54, 128, 65, 49, 54, 53, 128, - 65, 49, 54, 52, 128, 65, 49, 54, 51, 128, 65, 49, 54, 50, 128, 65, 49, - 54, 49, 128, 65, 49, 54, 48, 128, 65, 49, 53, 57, 128, 65, 49, 53, 56, - 128, 65, 49, 53, 55, 128, 65, 49, 53, 54, 128, 65, 49, 53, 53, 128, 65, - 49, 53, 52, 128, 65, 49, 53, 51, 128, 65, 49, 53, 50, 128, 65, 49, 53, - 49, 128, 65, 49, 53, 48, 128, 65, 49, 52, 57, 128, 65, 49, 52, 56, 128, - 65, 49, 52, 55, 128, 65, 49, 52, 54, 128, 65, 49, 52, 53, 128, 65, 49, - 52, 52, 128, 65, 49, 52, 51, 128, 65, 49, 52, 50, 128, 65, 49, 52, 49, - 128, 65, 49, 52, 48, 128, 65, 49, 51, 57, 128, 65, 49, 51, 56, 128, 65, - 49, 51, 55, 128, 65, 49, 51, 54, 128, 65, 49, 51, 53, 65, 128, 65, 49, - 51, 53, 128, 65, 49, 51, 52, 128, 65, 49, 51, 51, 128, 65, 49, 51, 50, - 128, 65, 49, 51, 49, 67, 128, 65, 49, 51, 49, 128, 65, 49, 51, 48, 128, - 65, 49, 50, 57, 128, 65, 49, 50, 56, 128, 65, 49, 50, 55, 128, 65, 49, - 50, 54, 128, 65, 49, 50, 53, 65, 128, 65, 49, 50, 53, 128, 65, 49, 50, - 52, 128, 65, 49, 50, 51, 128, 65, 49, 50, 50, 128, 65, 49, 50, 49, 128, - 65, 49, 50, 48, 66, 128, 65, 49, 50, 48, 128, 65, 49, 49, 57, 128, 65, - 49, 49, 56, 128, 65, 49, 49, 55, 128, 65, 49, 49, 54, 128, 65, 49, 49, - 53, 65, 128, 65, 49, 49, 53, 128, 65, 49, 49, 52, 128, 65, 49, 49, 51, - 128, 65, 49, 49, 50, 128, 65, 49, 49, 49, 128, 65, 49, 49, 48, 66, 128, - 65, 49, 49, 48, 65, 128, 65, 49, 49, 48, 128, 65, 49, 48, 57, 128, 65, - 49, 48, 56, 128, 65, 49, 48, 55, 67, 128, 65, 49, 48, 55, 66, 128, 65, - 49, 48, 55, 65, 128, 65, 49, 48, 55, 128, 65, 49, 48, 54, 128, 65, 49, - 48, 53, 66, 128, 65, 49, 48, 53, 65, 128, 65, 49, 48, 53, 128, 65, 49, - 48, 52, 67, 128, 65, 49, 48, 52, 66, 128, 65, 49, 48, 52, 65, 128, 65, - 49, 48, 52, 128, 65, 49, 48, 51, 128, 65, 49, 48, 50, 65, 128, 65, 49, - 48, 50, 128, 65, 49, 48, 49, 65, 128, 65, 49, 48, 49, 128, 65, 49, 48, - 48, 65, 128, 65, 49, 48, 48, 45, 49, 48, 50, 128, 65, 49, 48, 48, 128, - 65, 48, 57, 57, 128, 65, 48, 57, 56, 65, 128, 65, 48, 57, 56, 128, 65, - 48, 57, 55, 65, 128, 65, 48, 57, 55, 128, 65, 48, 57, 54, 128, 65, 48, - 57, 53, 128, 65, 48, 57, 52, 128, 65, 48, 57, 51, 128, 65, 48, 57, 50, - 128, 65, 48, 57, 49, 128, 65, 48, 57, 48, 128, 65, 48, 56, 57, 128, 65, - 48, 56, 56, 128, 65, 48, 56, 55, 128, 65, 48, 56, 54, 128, 65, 48, 56, - 53, 128, 65, 48, 56, 52, 128, 65, 48, 56, 51, 128, 65, 48, 56, 50, 128, - 65, 48, 56, 49, 128, 65, 48, 56, 48, 128, 65, 48, 55, 57, 128, 65, 48, - 55, 56, 128, 65, 48, 55, 55, 128, 65, 48, 55, 54, 128, 65, 48, 55, 53, - 128, 65, 48, 55, 52, 128, 65, 48, 55, 51, 128, 65, 48, 55, 50, 128, 65, - 48, 55, 49, 128, 65, 48, 55, 48, 128, 65, 48, 54, 57, 128, 65, 48, 54, - 56, 128, 65, 48, 54, 55, 128, 65, 48, 54, 54, 67, 128, 65, 48, 54, 54, - 66, 128, 65, 48, 54, 54, 65, 128, 65, 48, 54, 54, 128, 65, 48, 54, 53, - 128, 65, 48, 54, 52, 128, 65, 48, 54, 51, 128, 65, 48, 54, 50, 128, 65, - 48, 54, 49, 128, 65, 48, 54, 48, 128, 65, 48, 53, 57, 128, 65, 48, 53, - 56, 128, 65, 48, 53, 55, 128, 65, 48, 53, 54, 128, 65, 48, 53, 53, 128, - 65, 48, 53, 52, 128, 65, 48, 53, 51, 128, 65, 48, 53, 50, 128, 65, 48, - 53, 49, 128, 65, 48, 53, 48, 128, 65, 48, 52, 57, 128, 65, 48, 52, 56, - 128, 65, 48, 52, 55, 128, 65, 48, 52, 54, 66, 128, 65, 48, 52, 54, 65, - 128, 65, 48, 52, 54, 128, 65, 48, 52, 53, 65, 128, 65, 48, 52, 53, 128, - 65, 48, 52, 52, 128, 65, 48, 52, 51, 65, 128, 65, 48, 52, 51, 128, 65, - 48, 52, 50, 65, 128, 65, 48, 52, 50, 128, 65, 48, 52, 49, 65, 128, 65, - 48, 52, 49, 128, 65, 48, 52, 48, 65, 128, 65, 48, 52, 48, 128, 65, 48, - 51, 57, 65, 128, 65, 48, 51, 57, 128, 65, 48, 51, 56, 128, 65, 48, 51, - 55, 128, 65, 48, 51, 54, 128, 65, 48, 51, 53, 128, 65, 48, 51, 52, 128, - 65, 48, 51, 51, 128, 65, 48, 51, 50, 65, 128, 65, 48, 50, 56, 66, 128, - 65, 48, 50, 54, 65, 128, 65, 48, 49, 55, 65, 128, 65, 48, 49, 52, 65, - 128, 65, 48, 49, 48, 65, 128, 65, 48, 48, 54, 66, 128, 65, 48, 48, 54, - 65, 128, 65, 48, 48, 53, 65, 128, 65, 45, 87, 79, 128, 65, 45, 69, 85, - 128, 45, 85, 205, 45, 80, 72, 82, 85, 128, 45, 75, 72, 89, 85, 196, 45, - 75, 72, 89, 73, 76, 128, 45, 68, 90, 85, 196, 45, 67, 72, 65, 210, 45, - 67, 72, 65, 76, 128, + 78, 75, 72, 128, 65, 78, 74, 73, 128, 65, 78, 73, 77, 65, 76, 128, 65, + 78, 72, 85, 128, 65, 78, 71, 85, 76, 65, 82, 128, 65, 78, 71, 85, 73, 83, + 72, 69, 196, 65, 78, 71, 83, 84, 82, 79, 205, 65, 78, 71, 82, 217, 65, + 78, 71, 76, 73, 67, 65, 78, 193, 65, 78, 71, 76, 69, 68, 128, 65, 78, 71, + 76, 69, 196, 65, 78, 71, 75, 72, 65, 78, 75, 72, 85, 128, 65, 78, 71, 75, + 65, 128, 65, 78, 71, 69, 210, 65, 78, 71, 69, 76, 128, 65, 78, 71, 69, + 68, 128, 65, 78, 68, 65, 80, 128, 65, 78, 67, 79, 82, 65, 128, 65, 78, + 67, 72, 79, 82, 128, 65, 78, 65, 84, 82, 73, 67, 72, 73, 83, 77, 65, 128, + 65, 78, 65, 80, 128, 65, 78, 45, 78, 73, 83, 70, 128, 65, 77, 85, 76, 69, + 84, 128, 65, 77, 80, 83, 128, 65, 77, 80, 72, 79, 82, 65, 128, 65, 77, + 80, 69, 82, 83, 65, 78, 68, 128, 65, 77, 80, 69, 82, 83, 65, 78, 196, 65, + 77, 79, 85, 78, 212, 65, 77, 69, 82, 73, 67, 65, 83, 128, 65, 77, 69, 82, + 73, 67, 65, 206, 65, 77, 66, 85, 76, 65, 78, 67, 69, 128, 65, 77, 66, + 193, 65, 77, 66, 128, 65, 77, 65, 82, 128, 65, 77, 65, 210, 65, 77, 65, + 76, 71, 65, 77, 65, 84, 73, 79, 206, 65, 77, 65, 76, 71, 65, 77, 128, 65, + 76, 86, 69, 79, 76, 65, 210, 65, 76, 85, 77, 128, 65, 76, 84, 69, 82, 78, + 65, 84, 73, 86, 197, 65, 76, 84, 69, 82, 78, 65, 84, 73, 79, 206, 65, 76, + 84, 69, 82, 78, 65, 84, 73, 78, 71, 128, 65, 76, 84, 69, 82, 78, 65, 84, + 73, 78, 199, 65, 76, 84, 69, 82, 78, 65, 84, 69, 128, 65, 76, 84, 69, 82, + 78, 65, 84, 197, 65, 76, 84, 65, 128, 65, 76, 80, 72, 65, 128, 65, 76, + 80, 72, 193, 65, 76, 80, 65, 80, 82, 65, 78, 65, 128, 65, 76, 80, 65, 80, + 82, 65, 65, 78, 193, 65, 76, 80, 65, 128, 65, 76, 77, 79, 83, 212, 65, + 76, 76, 79, 128, 65, 76, 76, 73, 65, 78, 67, 69, 128, 65, 76, 76, 201, + 65, 76, 76, 65, 200, 65, 76, 75, 65, 76, 73, 45, 50, 128, 65, 76, 75, 65, + 76, 73, 128, 65, 76, 73, 71, 78, 69, 196, 65, 76, 73, 70, 85, 128, 65, + 76, 73, 70, 128, 65, 76, 73, 198, 65, 76, 73, 69, 78, 128, 65, 76, 73, + 69, 206, 65, 76, 71, 73, 218, 65, 76, 70, 65, 128, 65, 76, 69, 85, 212, + 65, 76, 69, 82, 84, 128, 65, 76, 69, 80, 72, 128, 65, 76, 69, 77, 66, 73, + 67, 128, 65, 76, 69, 70, 128, 65, 76, 66, 65, 78, 73, 65, 206, 65, 76, + 65, 89, 72, 69, 128, 65, 76, 65, 89, 72, 197, 65, 76, 65, 82, 205, 65, + 76, 65, 80, 72, 128, 65, 76, 45, 76, 65, 75, 85, 78, 65, 128, 65, 75, 84, + 73, 69, 83, 69, 76, 83, 75, 65, 66, 128, 65, 75, 83, 65, 128, 65, 75, 72, + 77, 73, 77, 73, 195, 65, 75, 66, 65, 210, 65, 75, 65, 82, 65, 128, 65, + 75, 65, 82, 193, 65, 73, 89, 65, 78, 78, 65, 128, 65, 73, 86, 73, 76, 73, + 203, 65, 73, 86, 65, 128, 65, 73, 84, 79, 206, 65, 73, 82, 80, 76, 65, + 78, 69, 128, 65, 73, 82, 80, 76, 65, 78, 197, 65, 73, 78, 213, 65, 73, + 78, 78, 128, 65, 73, 76, 77, 128, 65, 73, 75, 65, 82, 65, 128, 65, 73, + 72, 86, 85, 83, 128, 65, 72, 83, 68, 65, 128, 65, 72, 83, 65, 128, 65, + 72, 79, 205, 65, 72, 65, 78, 199, 65, 72, 65, 71, 71, 65, 210, 65, 72, + 65, 68, 128, 65, 71, 85, 78, 71, 128, 65, 71, 79, 71, 201, 65, 71, 71, + 82, 65, 86, 65, 84, 73, 79, 78, 128, 65, 71, 71, 82, 65, 86, 65, 84, 69, + 196, 65, 71, 65, 73, 78, 83, 212, 65, 71, 65, 73, 78, 128, 65, 70, 84, + 69, 210, 65, 70, 83, 65, 65, 81, 128, 65, 70, 82, 73, 67, 65, 206, 65, + 70, 79, 82, 69, 77, 69, 78, 84, 73, 79, 78, 69, 68, 128, 65, 70, 71, 72, + 65, 78, 201, 65, 70, 70, 82, 73, 67, 65, 84, 73, 79, 206, 65, 70, 70, 73, + 216, 65, 69, 89, 65, 78, 78, 65, 128, 65, 69, 89, 128, 65, 69, 83, 67, + 85, 76, 65, 80, 73, 85, 83, 128, 65, 69, 83, 67, 128, 65, 69, 83, 128, + 65, 69, 82, 73, 65, 204, 65, 69, 82, 128, 65, 69, 76, 65, 45, 80, 73, 76, + 76, 65, 128, 65, 69, 76, 128, 65, 69, 75, 128, 65, 69, 71, 69, 65, 206, + 65, 69, 71, 128, 65, 69, 69, 89, 65, 78, 78, 65, 128, 65, 69, 69, 128, + 65, 69, 68, 65, 45, 80, 73, 76, 76, 65, 128, 65, 69, 68, 128, 65, 69, 66, + 128, 65, 68, 86, 65, 78, 84, 65, 71, 69, 128, 65, 68, 86, 65, 78, 67, 69, + 128, 65, 68, 85, 76, 84, 128, 65, 68, 77, 73, 83, 83, 73, 79, 206, 65, + 68, 77, 69, 84, 79, 83, 128, 65, 68, 76, 65, 205, 65, 68, 72, 69, 83, 73, + 86, 197, 65, 68, 69, 71, 128, 65, 68, 69, 199, 65, 68, 68, 82, 69, 83, + 83, 69, 196, 65, 68, 68, 82, 69, 83, 211, 65, 68, 68, 65, 75, 128, 65, + 68, 65, 203, 65, 67, 85, 84, 69, 45, 77, 65, 67, 82, 79, 78, 128, 65, 67, + 85, 84, 69, 45, 71, 82, 65, 86, 69, 45, 65, 67, 85, 84, 69, 128, 65, 67, + 85, 84, 197, 65, 67, 84, 85, 65, 76, 76, 217, 65, 67, 84, 73, 86, 65, 84, + 197, 65, 67, 82, 79, 80, 72, 79, 78, 73, 195, 65, 67, 75, 78, 79, 87, 76, + 69, 68, 71, 69, 128, 65, 67, 67, 85, 77, 85, 76, 65, 84, 73, 79, 78, 128, + 65, 67, 67, 79, 85, 78, 212, 65, 67, 67, 79, 77, 77, 79, 68, 65, 84, 73, + 79, 78, 128, 65, 67, 67, 69, 80, 84, 128, 65, 67, 67, 69, 78, 84, 45, 83, + 84, 65, 67, 67, 65, 84, 79, 128, 65, 67, 67, 69, 78, 84, 128, 65, 67, 67, + 69, 78, 212, 65, 67, 65, 68, 69, 77, 217, 65, 66, 89, 83, 77, 65, 204, + 65, 66, 85, 78, 68, 65, 78, 67, 69, 128, 65, 66, 75, 72, 65, 83, 73, 65, + 206, 65, 66, 66, 82, 69, 86, 73, 65, 84, 73, 79, 206, 65, 66, 65, 70, 73, + 76, 73, 128, 65, 66, 65, 67, 85, 83, 128, 65, 66, 178, 65, 66, 49, 57, + 49, 128, 65, 66, 49, 56, 56, 128, 65, 66, 49, 56, 48, 128, 65, 66, 49, + 55, 49, 128, 65, 66, 49, 54, 52, 128, 65, 66, 49, 51, 49, 66, 128, 65, + 66, 49, 51, 49, 65, 128, 65, 66, 49, 50, 51, 128, 65, 66, 49, 50, 50, + 128, 65, 66, 49, 50, 48, 128, 65, 66, 49, 49, 56, 128, 65, 66, 48, 56, + 55, 128, 65, 66, 48, 56, 54, 128, 65, 66, 48, 56, 53, 128, 65, 66, 48, + 56, 50, 128, 65, 66, 48, 56, 49, 128, 65, 66, 48, 56, 48, 128, 65, 66, + 48, 55, 57, 128, 65, 66, 48, 55, 56, 128, 65, 66, 48, 55, 55, 128, 65, + 66, 48, 55, 54, 128, 65, 66, 48, 55, 52, 128, 65, 66, 48, 55, 51, 128, + 65, 66, 48, 55, 48, 128, 65, 66, 48, 54, 57, 128, 65, 66, 48, 54, 55, + 128, 65, 66, 48, 54, 54, 128, 65, 66, 48, 54, 53, 128, 65, 66, 48, 54, + 49, 128, 65, 66, 48, 54, 48, 128, 65, 66, 48, 53, 57, 128, 65, 66, 48, + 53, 56, 128, 65, 66, 48, 53, 55, 128, 65, 66, 48, 53, 54, 128, 65, 66, + 48, 53, 53, 128, 65, 66, 48, 53, 52, 128, 65, 66, 48, 53, 51, 128, 65, + 66, 48, 53, 49, 128, 65, 66, 48, 53, 48, 128, 65, 66, 48, 52, 57, 128, + 65, 66, 48, 52, 56, 128, 65, 66, 48, 52, 55, 128, 65, 66, 48, 52, 54, + 128, 65, 66, 48, 52, 53, 128, 65, 66, 48, 52, 52, 128, 65, 66, 48, 52, + 49, 128, 65, 66, 48, 52, 48, 128, 65, 66, 48, 51, 57, 128, 65, 66, 48, + 51, 56, 128, 65, 66, 48, 51, 55, 128, 65, 66, 48, 51, 52, 128, 65, 66, + 48, 51, 49, 128, 65, 66, 48, 51, 48, 128, 65, 66, 48, 50, 57, 128, 65, + 66, 48, 50, 56, 128, 65, 66, 48, 50, 55, 128, 65, 66, 48, 50, 54, 128, + 65, 66, 48, 50, 52, 128, 65, 66, 48, 50, 51, 77, 128, 65, 66, 48, 50, 51, + 128, 65, 66, 48, 50, 50, 77, 128, 65, 66, 48, 50, 50, 70, 128, 65, 66, + 48, 50, 50, 128, 65, 66, 48, 50, 49, 77, 128, 65, 66, 48, 50, 49, 70, + 128, 65, 66, 48, 50, 49, 128, 65, 66, 48, 50, 48, 128, 65, 66, 48, 49, + 55, 128, 65, 66, 48, 49, 54, 128, 65, 66, 48, 49, 51, 128, 65, 66, 48, + 49, 49, 128, 65, 66, 48, 49, 48, 128, 65, 66, 48, 48, 57, 128, 65, 66, + 48, 48, 56, 128, 65, 66, 48, 48, 55, 128, 65, 66, 48, 48, 54, 128, 65, + 66, 48, 48, 53, 128, 65, 66, 48, 48, 52, 128, 65, 66, 48, 48, 51, 128, + 65, 66, 48, 48, 50, 128, 65, 66, 48, 48, 49, 128, 65, 65, 90, 72, 65, 65, + 75, 75, 85, 128, 65, 65, 89, 73, 78, 128, 65, 65, 89, 65, 78, 78, 65, + 128, 65, 65, 89, 128, 65, 65, 87, 128, 65, 65, 79, 128, 65, 65, 74, 128, + 65, 65, 66, 65, 65, 70, 73, 76, 73, 128, 65, 65, 48, 51, 50, 128, 65, 65, + 48, 51, 49, 128, 65, 65, 48, 51, 48, 128, 65, 65, 48, 50, 57, 128, 65, + 65, 48, 50, 56, 128, 65, 65, 48, 50, 55, 128, 65, 65, 48, 50, 54, 128, + 65, 65, 48, 50, 53, 128, 65, 65, 48, 50, 52, 128, 65, 65, 48, 50, 51, + 128, 65, 65, 48, 50, 50, 128, 65, 65, 48, 50, 49, 128, 65, 65, 48, 50, + 48, 128, 65, 65, 48, 49, 57, 128, 65, 65, 48, 49, 56, 128, 65, 65, 48, + 49, 55, 128, 65, 65, 48, 49, 54, 128, 65, 65, 48, 49, 53, 128, 65, 65, + 48, 49, 52, 128, 65, 65, 48, 49, 51, 128, 65, 65, 48, 49, 50, 128, 65, + 65, 48, 49, 49, 128, 65, 65, 48, 49, 48, 128, 65, 65, 48, 48, 57, 128, + 65, 65, 48, 48, 56, 128, 65, 65, 48, 48, 55, 66, 128, 65, 65, 48, 48, 55, + 65, 128, 65, 65, 48, 48, 55, 128, 65, 65, 48, 48, 54, 128, 65, 65, 48, + 48, 53, 128, 65, 65, 48, 48, 52, 128, 65, 65, 48, 48, 51, 128, 65, 65, + 48, 48, 50, 128, 65, 65, 48, 48, 49, 128, 65, 56, 48, 55, 128, 65, 56, + 48, 54, 128, 65, 56, 48, 53, 128, 65, 56, 48, 52, 128, 65, 56, 48, 51, + 128, 65, 56, 48, 50, 128, 65, 56, 48, 49, 128, 65, 56, 48, 48, 128, 65, + 55, 51, 178, 65, 55, 50, 182, 65, 55, 49, 183, 65, 55, 49, 181, 65, 55, + 49, 180, 65, 55, 49, 179, 65, 55, 49, 178, 65, 55, 49, 177, 65, 55, 49, + 176, 65, 55, 48, 57, 45, 182, 65, 55, 48, 57, 45, 180, 65, 55, 48, 57, + 45, 179, 65, 55, 48, 57, 45, 178, 65, 55, 48, 185, 65, 55, 48, 184, 65, + 55, 48, 183, 65, 55, 48, 182, 65, 55, 48, 181, 65, 55, 48, 180, 65, 55, + 48, 179, 65, 55, 48, 178, 65, 55, 48, 177, 65, 54, 54, 52, 128, 65, 54, + 54, 51, 128, 65, 54, 54, 50, 128, 65, 54, 54, 49, 128, 65, 54, 54, 48, + 128, 65, 54, 53, 57, 128, 65, 54, 53, 56, 128, 65, 54, 53, 55, 128, 65, + 54, 53, 54, 128, 65, 54, 53, 53, 128, 65, 54, 53, 52, 128, 65, 54, 53, + 51, 128, 65, 54, 53, 50, 128, 65, 54, 53, 49, 128, 65, 54, 52, 57, 128, + 65, 54, 52, 56, 128, 65, 54, 52, 54, 128, 65, 54, 52, 53, 128, 65, 54, + 52, 52, 128, 65, 54, 52, 51, 128, 65, 54, 52, 50, 128, 65, 54, 52, 48, + 128, 65, 54, 51, 56, 128, 65, 54, 51, 55, 128, 65, 54, 51, 52, 128, 65, + 54, 50, 57, 128, 65, 54, 50, 56, 128, 65, 54, 50, 55, 128, 65, 54, 50, + 54, 128, 65, 54, 50, 52, 128, 65, 54, 50, 51, 128, 65, 54, 50, 50, 128, + 65, 54, 50, 49, 128, 65, 54, 50, 48, 128, 65, 54, 49, 57, 128, 65, 54, + 49, 56, 128, 65, 54, 49, 55, 128, 65, 54, 49, 54, 128, 65, 54, 49, 53, + 128, 65, 54, 49, 52, 128, 65, 54, 49, 51, 128, 65, 54, 49, 50, 128, 65, + 54, 49, 49, 128, 65, 54, 49, 48, 128, 65, 54, 48, 57, 128, 65, 54, 48, + 56, 128, 65, 54, 48, 54, 128, 65, 54, 48, 52, 128, 65, 54, 48, 51, 128, + 65, 54, 48, 50, 128, 65, 54, 48, 49, 128, 65, 54, 48, 48, 128, 65, 53, + 57, 56, 128, 65, 53, 57, 54, 128, 65, 53, 57, 53, 128, 65, 53, 57, 52, + 128, 65, 53, 57, 50, 128, 65, 53, 57, 49, 128, 65, 53, 56, 57, 128, 65, + 53, 56, 56, 128, 65, 53, 56, 55, 128, 65, 53, 56, 54, 128, 65, 53, 56, + 53, 128, 65, 53, 56, 52, 128, 65, 53, 56, 51, 128, 65, 53, 56, 50, 128, + 65, 53, 56, 49, 128, 65, 53, 56, 48, 128, 65, 53, 55, 57, 128, 65, 53, + 55, 56, 128, 65, 53, 55, 55, 128, 65, 53, 55, 54, 128, 65, 53, 55, 53, + 128, 65, 53, 55, 52, 128, 65, 53, 55, 51, 128, 65, 53, 55, 50, 128, 65, + 53, 55, 49, 128, 65, 53, 55, 48, 128, 65, 53, 54, 57, 128, 65, 53, 54, + 56, 128, 65, 53, 54, 54, 128, 65, 53, 54, 53, 128, 65, 53, 54, 52, 128, + 65, 53, 54, 51, 128, 65, 53, 53, 57, 128, 65, 53, 53, 55, 128, 65, 53, + 53, 54, 128, 65, 53, 53, 53, 128, 65, 53, 53, 52, 128, 65, 53, 53, 51, + 128, 65, 53, 53, 50, 128, 65, 53, 53, 49, 128, 65, 53, 53, 48, 128, 65, + 53, 52, 57, 128, 65, 53, 52, 56, 128, 65, 53, 52, 55, 128, 65, 53, 52, + 53, 128, 65, 53, 52, 50, 128, 65, 53, 52, 49, 128, 65, 53, 52, 48, 128, + 65, 53, 51, 57, 128, 65, 53, 51, 56, 128, 65, 53, 51, 55, 128, 65, 53, + 51, 54, 128, 65, 53, 51, 53, 128, 65, 53, 51, 52, 128, 65, 53, 51, 50, + 128, 65, 53, 51, 49, 128, 65, 53, 51, 48, 128, 65, 53, 50, 57, 128, 65, + 53, 50, 56, 128, 65, 53, 50, 55, 128, 65, 53, 50, 54, 128, 65, 53, 50, + 53, 128, 65, 53, 50, 52, 128, 65, 53, 50, 51, 128, 65, 53, 50, 50, 128, + 65, 53, 50, 49, 128, 65, 53, 50, 48, 128, 65, 53, 49, 57, 128, 65, 53, + 49, 56, 128, 65, 53, 49, 55, 128, 65, 53, 49, 54, 128, 65, 53, 49, 53, + 128, 65, 53, 49, 52, 128, 65, 53, 49, 51, 128, 65, 53, 49, 50, 128, 65, + 53, 49, 49, 128, 65, 53, 49, 48, 128, 65, 53, 48, 57, 128, 65, 53, 48, + 56, 128, 65, 53, 48, 55, 128, 65, 53, 48, 54, 128, 65, 53, 48, 53, 128, + 65, 53, 48, 52, 128, 65, 53, 48, 51, 128, 65, 53, 48, 50, 128, 65, 53, + 48, 49, 128, 65, 52, 57, 55, 128, 65, 52, 57, 54, 128, 65, 52, 57, 53, + 128, 65, 52, 57, 52, 128, 65, 52, 57, 51, 128, 65, 52, 57, 50, 128, 65, + 52, 57, 49, 128, 65, 52, 57, 48, 128, 65, 52, 56, 57, 128, 65, 52, 56, + 56, 128, 65, 52, 56, 55, 128, 65, 52, 56, 54, 128, 65, 52, 56, 53, 128, + 65, 52, 56, 52, 128, 65, 52, 56, 51, 128, 65, 52, 56, 50, 128, 65, 52, + 56, 49, 128, 65, 52, 56, 48, 128, 65, 52, 55, 57, 128, 65, 52, 55, 56, + 128, 65, 52, 55, 55, 128, 65, 52, 55, 54, 128, 65, 52, 55, 53, 128, 65, + 52, 55, 52, 128, 65, 52, 55, 51, 128, 65, 52, 55, 50, 128, 65, 52, 55, + 49, 128, 65, 52, 55, 48, 128, 65, 52, 54, 57, 128, 65, 52, 54, 56, 128, + 65, 52, 54, 55, 128, 65, 52, 54, 54, 128, 65, 52, 54, 53, 128, 65, 52, + 54, 52, 128, 65, 52, 54, 51, 128, 65, 52, 54, 50, 128, 65, 52, 54, 49, + 128, 65, 52, 54, 48, 128, 65, 52, 53, 57, 128, 65, 52, 53, 56, 128, 65, + 52, 53, 55, 65, 128, 65, 52, 53, 55, 128, 65, 52, 53, 54, 128, 65, 52, + 53, 53, 128, 65, 52, 53, 52, 128, 65, 52, 53, 51, 128, 65, 52, 53, 50, + 128, 65, 52, 53, 49, 128, 65, 52, 53, 48, 65, 128, 65, 52, 53, 48, 128, + 65, 52, 52, 57, 128, 65, 52, 52, 56, 128, 65, 52, 52, 55, 128, 65, 52, + 52, 54, 128, 65, 52, 52, 53, 128, 65, 52, 52, 52, 128, 65, 52, 52, 51, + 128, 65, 52, 52, 50, 128, 65, 52, 52, 49, 128, 65, 52, 52, 48, 128, 65, + 52, 51, 57, 128, 65, 52, 51, 56, 128, 65, 52, 51, 55, 128, 65, 52, 51, + 54, 128, 65, 52, 51, 53, 128, 65, 52, 51, 52, 128, 65, 52, 51, 51, 128, + 65, 52, 51, 50, 128, 65, 52, 51, 49, 128, 65, 52, 51, 48, 128, 65, 52, + 50, 57, 128, 65, 52, 50, 56, 128, 65, 52, 50, 55, 128, 65, 52, 50, 54, + 128, 65, 52, 50, 53, 128, 65, 52, 50, 52, 128, 65, 52, 50, 51, 128, 65, + 52, 50, 50, 128, 65, 52, 50, 49, 128, 65, 52, 50, 48, 128, 65, 52, 49, + 57, 128, 65, 52, 49, 56, 45, 86, 65, 83, 128, 65, 52, 49, 56, 128, 65, + 52, 49, 55, 45, 86, 65, 83, 128, 65, 52, 49, 55, 128, 65, 52, 49, 54, 45, + 86, 65, 83, 128, 65, 52, 49, 54, 128, 65, 52, 49, 53, 45, 86, 65, 83, + 128, 65, 52, 49, 53, 128, 65, 52, 49, 52, 45, 86, 65, 83, 128, 65, 52, + 49, 52, 128, 65, 52, 49, 51, 45, 86, 65, 83, 128, 65, 52, 49, 51, 128, + 65, 52, 49, 50, 45, 86, 65, 83, 128, 65, 52, 49, 50, 128, 65, 52, 49, 49, + 45, 86, 65, 83, 128, 65, 52, 49, 49, 128, 65, 52, 49, 48, 193, 65, 52, + 49, 48, 45, 86, 65, 83, 128, 65, 52, 49, 176, 65, 52, 48, 57, 45, 86, 65, + 83, 128, 65, 52, 48, 57, 128, 65, 52, 48, 56, 45, 86, 65, 83, 128, 65, + 52, 48, 56, 128, 65, 52, 48, 55, 45, 86, 65, 83, 128, 65, 52, 48, 55, + 128, 65, 52, 48, 54, 45, 86, 65, 83, 128, 65, 52, 48, 54, 128, 65, 52, + 48, 53, 45, 86, 65, 83, 128, 65, 52, 48, 53, 128, 65, 52, 48, 52, 45, 86, + 65, 83, 128, 65, 52, 48, 52, 128, 65, 52, 48, 51, 45, 86, 65, 83, 128, + 65, 52, 48, 51, 128, 65, 52, 48, 50, 45, 86, 65, 83, 128, 65, 52, 48, 50, + 128, 65, 52, 48, 49, 45, 86, 65, 83, 128, 65, 52, 48, 49, 128, 65, 52, + 48, 48, 45, 86, 65, 83, 128, 65, 52, 48, 48, 128, 65, 51, 57, 57, 128, + 65, 51, 57, 56, 128, 65, 51, 57, 55, 128, 65, 51, 57, 54, 128, 65, 51, + 57, 53, 128, 65, 51, 57, 52, 128, 65, 51, 57, 179, 65, 51, 57, 50, 128, + 65, 51, 57, 49, 128, 65, 51, 57, 48, 128, 65, 51, 56, 57, 128, 65, 51, + 56, 56, 128, 65, 51, 56, 55, 128, 65, 51, 56, 54, 65, 128, 65, 51, 56, + 54, 128, 65, 51, 56, 53, 128, 65, 51, 56, 52, 128, 65, 51, 56, 51, 65, + 128, 65, 51, 56, 179, 65, 51, 56, 50, 128, 65, 51, 56, 49, 65, 128, 65, + 51, 56, 49, 128, 65, 51, 56, 48, 128, 65, 51, 55, 57, 128, 65, 51, 55, + 56, 128, 65, 51, 55, 55, 128, 65, 51, 55, 54, 128, 65, 51, 55, 53, 128, + 65, 51, 55, 52, 128, 65, 51, 55, 51, 128, 65, 51, 55, 50, 128, 65, 51, + 55, 49, 65, 128, 65, 51, 55, 49, 128, 65, 51, 55, 48, 128, 65, 51, 54, + 57, 128, 65, 51, 54, 56, 65, 128, 65, 51, 54, 56, 128, 65, 51, 54, 55, + 128, 65, 51, 54, 54, 128, 65, 51, 54, 53, 128, 65, 51, 54, 52, 65, 128, + 65, 51, 54, 52, 128, 65, 51, 54, 51, 128, 65, 51, 54, 50, 128, 65, 51, + 54, 49, 128, 65, 51, 54, 48, 128, 65, 51, 53, 57, 65, 128, 65, 51, 53, + 57, 128, 65, 51, 53, 56, 128, 65, 51, 53, 55, 128, 65, 51, 53, 54, 128, + 65, 51, 53, 53, 128, 65, 51, 53, 52, 128, 65, 51, 53, 51, 128, 65, 51, + 53, 50, 128, 65, 51, 53, 49, 128, 65, 51, 53, 48, 128, 65, 51, 52, 57, + 128, 65, 51, 52, 56, 128, 65, 51, 52, 55, 128, 65, 51, 52, 54, 128, 65, + 51, 52, 53, 128, 65, 51, 52, 52, 128, 65, 51, 52, 51, 128, 65, 51, 52, + 50, 128, 65, 51, 52, 49, 128, 65, 51, 52, 48, 128, 65, 51, 51, 57, 128, + 65, 51, 51, 56, 128, 65, 51, 51, 55, 128, 65, 51, 51, 54, 67, 128, 65, + 51, 51, 54, 66, 128, 65, 51, 51, 54, 65, 128, 65, 51, 51, 54, 128, 65, + 51, 51, 53, 128, 65, 51, 51, 52, 128, 65, 51, 51, 51, 128, 65, 51, 51, + 50, 67, 128, 65, 51, 51, 50, 66, 128, 65, 51, 51, 50, 65, 128, 65, 51, + 51, 50, 128, 65, 51, 51, 49, 128, 65, 51, 51, 48, 128, 65, 51, 50, 57, + 65, 128, 65, 51, 50, 57, 128, 65, 51, 50, 56, 128, 65, 51, 50, 55, 128, + 65, 51, 50, 54, 128, 65, 51, 50, 53, 128, 65, 51, 50, 52, 128, 65, 51, + 50, 51, 128, 65, 51, 50, 50, 128, 65, 51, 50, 49, 128, 65, 51, 50, 48, + 128, 65, 51, 49, 57, 128, 65, 51, 49, 56, 128, 65, 51, 49, 55, 128, 65, + 51, 49, 54, 128, 65, 51, 49, 53, 128, 65, 51, 49, 52, 128, 65, 51, 49, + 51, 67, 128, 65, 51, 49, 51, 66, 128, 65, 51, 49, 51, 65, 128, 65, 51, + 49, 51, 128, 65, 51, 49, 50, 128, 65, 51, 49, 49, 128, 65, 51, 49, 48, + 128, 65, 51, 48, 57, 67, 128, 65, 51, 48, 57, 66, 128, 65, 51, 48, 57, + 65, 128, 65, 51, 48, 57, 128, 65, 51, 48, 56, 128, 65, 51, 48, 55, 128, + 65, 51, 48, 54, 128, 65, 51, 48, 53, 128, 65, 51, 48, 52, 128, 65, 51, + 48, 51, 128, 65, 51, 48, 50, 128, 65, 51, 48, 49, 128, 65, 51, 48, 48, + 128, 65, 50, 57, 57, 65, 128, 65, 50, 57, 57, 128, 65, 50, 57, 56, 128, + 65, 50, 57, 55, 128, 65, 50, 57, 54, 128, 65, 50, 57, 53, 128, 65, 50, + 57, 52, 65, 128, 65, 50, 57, 52, 128, 65, 50, 57, 51, 128, 65, 50, 57, + 50, 128, 65, 50, 57, 49, 128, 65, 50, 57, 48, 128, 65, 50, 56, 57, 65, + 128, 65, 50, 56, 57, 128, 65, 50, 56, 56, 128, 65, 50, 56, 55, 128, 65, + 50, 56, 54, 128, 65, 50, 56, 53, 128, 65, 50, 56, 52, 128, 65, 50, 56, + 51, 128, 65, 50, 56, 50, 128, 65, 50, 56, 49, 128, 65, 50, 56, 48, 128, + 65, 50, 55, 57, 128, 65, 50, 55, 56, 128, 65, 50, 55, 55, 128, 65, 50, + 55, 54, 128, 65, 50, 55, 53, 128, 65, 50, 55, 52, 128, 65, 50, 55, 51, + 128, 65, 50, 55, 50, 128, 65, 50, 55, 49, 128, 65, 50, 55, 48, 128, 65, + 50, 54, 57, 128, 65, 50, 54, 56, 128, 65, 50, 54, 55, 65, 128, 65, 50, + 54, 55, 128, 65, 50, 54, 54, 128, 65, 50, 54, 53, 128, 65, 50, 54, 52, + 128, 65, 50, 54, 51, 128, 65, 50, 54, 50, 128, 65, 50, 54, 49, 128, 65, + 50, 54, 48, 128, 65, 50, 53, 57, 128, 65, 50, 53, 56, 128, 65, 50, 53, + 55, 128, 65, 50, 53, 54, 128, 65, 50, 53, 53, 128, 65, 50, 53, 52, 128, + 65, 50, 53, 51, 128, 65, 50, 53, 50, 128, 65, 50, 53, 49, 128, 65, 50, + 53, 48, 128, 65, 50, 52, 57, 128, 65, 50, 52, 56, 128, 65, 50, 52, 55, + 128, 65, 50, 52, 54, 128, 65, 50, 52, 53, 128, 65, 50, 52, 52, 128, 65, + 50, 52, 51, 128, 65, 50, 52, 50, 128, 65, 50, 52, 49, 128, 65, 50, 52, + 48, 128, 65, 50, 51, 57, 128, 65, 50, 51, 56, 128, 65, 50, 51, 55, 128, + 65, 50, 51, 54, 128, 65, 50, 51, 53, 128, 65, 50, 51, 52, 128, 65, 50, + 51, 51, 128, 65, 50, 51, 50, 128, 65, 50, 51, 49, 128, 65, 50, 51, 48, + 128, 65, 50, 50, 57, 128, 65, 50, 50, 56, 128, 65, 50, 50, 55, 65, 128, + 65, 50, 50, 55, 128, 65, 50, 50, 54, 128, 65, 50, 50, 53, 128, 65, 50, + 50, 52, 128, 65, 50, 50, 51, 128, 65, 50, 50, 50, 128, 65, 50, 50, 49, + 128, 65, 50, 50, 48, 128, 65, 50, 49, 57, 128, 65, 50, 49, 56, 128, 65, + 50, 49, 55, 128, 65, 50, 49, 54, 65, 128, 65, 50, 49, 54, 128, 65, 50, + 49, 53, 65, 128, 65, 50, 49, 53, 128, 65, 50, 49, 52, 128, 65, 50, 49, + 51, 128, 65, 50, 49, 50, 128, 65, 50, 49, 49, 128, 65, 50, 49, 48, 128, + 65, 50, 48, 57, 65, 128, 65, 50, 48, 57, 128, 65, 50, 48, 56, 128, 65, + 50, 48, 55, 65, 128, 65, 50, 48, 55, 128, 65, 50, 48, 54, 128, 65, 50, + 48, 53, 128, 65, 50, 48, 52, 128, 65, 50, 48, 51, 128, 65, 50, 48, 50, + 66, 128, 65, 50, 48, 50, 65, 128, 65, 50, 48, 50, 128, 65, 50, 48, 49, + 128, 65, 50, 48, 48, 128, 65, 49, 57, 57, 128, 65, 49, 57, 56, 128, 65, + 49, 57, 55, 128, 65, 49, 57, 54, 128, 65, 49, 57, 53, 128, 65, 49, 57, + 52, 128, 65, 49, 57, 51, 128, 65, 49, 57, 50, 128, 65, 49, 57, 49, 128, + 65, 49, 57, 48, 128, 65, 49, 56, 57, 128, 65, 49, 56, 56, 128, 65, 49, + 56, 55, 128, 65, 49, 56, 54, 128, 65, 49, 56, 53, 128, 65, 49, 56, 52, + 128, 65, 49, 56, 51, 128, 65, 49, 56, 50, 128, 65, 49, 56, 49, 128, 65, + 49, 56, 48, 128, 65, 49, 55, 57, 128, 65, 49, 55, 56, 128, 65, 49, 55, + 55, 128, 65, 49, 55, 54, 128, 65, 49, 55, 53, 128, 65, 49, 55, 52, 128, + 65, 49, 55, 51, 128, 65, 49, 55, 50, 128, 65, 49, 55, 49, 128, 65, 49, + 55, 48, 128, 65, 49, 54, 57, 128, 65, 49, 54, 56, 128, 65, 49, 54, 55, + 128, 65, 49, 54, 54, 128, 65, 49, 54, 53, 128, 65, 49, 54, 52, 128, 65, + 49, 54, 51, 128, 65, 49, 54, 50, 128, 65, 49, 54, 49, 128, 65, 49, 54, + 48, 128, 65, 49, 53, 57, 128, 65, 49, 53, 56, 128, 65, 49, 53, 55, 128, + 65, 49, 53, 54, 128, 65, 49, 53, 53, 128, 65, 49, 53, 52, 128, 65, 49, + 53, 51, 128, 65, 49, 53, 50, 128, 65, 49, 53, 49, 128, 65, 49, 53, 48, + 128, 65, 49, 52, 57, 128, 65, 49, 52, 56, 128, 65, 49, 52, 55, 128, 65, + 49, 52, 54, 128, 65, 49, 52, 53, 128, 65, 49, 52, 52, 128, 65, 49, 52, + 51, 128, 65, 49, 52, 50, 128, 65, 49, 52, 49, 128, 65, 49, 52, 48, 128, + 65, 49, 51, 57, 128, 65, 49, 51, 56, 128, 65, 49, 51, 55, 128, 65, 49, + 51, 54, 128, 65, 49, 51, 53, 65, 128, 65, 49, 51, 53, 128, 65, 49, 51, + 52, 128, 65, 49, 51, 51, 128, 65, 49, 51, 50, 128, 65, 49, 51, 49, 67, + 128, 65, 49, 51, 49, 128, 65, 49, 51, 48, 128, 65, 49, 50, 57, 128, 65, + 49, 50, 56, 128, 65, 49, 50, 55, 128, 65, 49, 50, 54, 128, 65, 49, 50, + 53, 65, 128, 65, 49, 50, 53, 128, 65, 49, 50, 52, 128, 65, 49, 50, 51, + 128, 65, 49, 50, 50, 128, 65, 49, 50, 49, 128, 65, 49, 50, 48, 66, 128, + 65, 49, 50, 48, 128, 65, 49, 49, 57, 128, 65, 49, 49, 56, 128, 65, 49, + 49, 55, 128, 65, 49, 49, 54, 128, 65, 49, 49, 53, 65, 128, 65, 49, 49, + 53, 128, 65, 49, 49, 52, 128, 65, 49, 49, 51, 128, 65, 49, 49, 50, 128, + 65, 49, 49, 49, 128, 65, 49, 49, 48, 66, 128, 65, 49, 49, 48, 65, 128, + 65, 49, 49, 48, 128, 65, 49, 48, 57, 128, 65, 49, 48, 56, 128, 65, 49, + 48, 55, 67, 128, 65, 49, 48, 55, 66, 128, 65, 49, 48, 55, 65, 128, 65, + 49, 48, 55, 128, 65, 49, 48, 54, 128, 65, 49, 48, 53, 66, 128, 65, 49, + 48, 53, 65, 128, 65, 49, 48, 53, 128, 65, 49, 48, 52, 67, 128, 65, 49, + 48, 52, 66, 128, 65, 49, 48, 52, 65, 128, 65, 49, 48, 52, 128, 65, 49, + 48, 51, 128, 65, 49, 48, 50, 65, 128, 65, 49, 48, 50, 128, 65, 49, 48, + 49, 65, 128, 65, 49, 48, 49, 128, 65, 49, 48, 48, 65, 128, 65, 49, 48, + 48, 45, 49, 48, 50, 128, 65, 49, 48, 48, 128, 65, 48, 57, 57, 128, 65, + 48, 57, 56, 65, 128, 65, 48, 57, 56, 128, 65, 48, 57, 55, 65, 128, 65, + 48, 57, 55, 128, 65, 48, 57, 54, 128, 65, 48, 57, 53, 128, 65, 48, 57, + 52, 128, 65, 48, 57, 51, 128, 65, 48, 57, 50, 128, 65, 48, 57, 49, 128, + 65, 48, 57, 48, 128, 65, 48, 56, 57, 128, 65, 48, 56, 56, 128, 65, 48, + 56, 55, 128, 65, 48, 56, 54, 128, 65, 48, 56, 53, 128, 65, 48, 56, 52, + 128, 65, 48, 56, 51, 128, 65, 48, 56, 50, 128, 65, 48, 56, 49, 128, 65, + 48, 56, 48, 128, 65, 48, 55, 57, 128, 65, 48, 55, 56, 128, 65, 48, 55, + 55, 128, 65, 48, 55, 54, 128, 65, 48, 55, 53, 128, 65, 48, 55, 52, 128, + 65, 48, 55, 51, 128, 65, 48, 55, 50, 128, 65, 48, 55, 49, 128, 65, 48, + 55, 48, 128, 65, 48, 54, 57, 128, 65, 48, 54, 56, 128, 65, 48, 54, 55, + 128, 65, 48, 54, 54, 67, 128, 65, 48, 54, 54, 66, 128, 65, 48, 54, 54, + 65, 128, 65, 48, 54, 54, 128, 65, 48, 54, 53, 128, 65, 48, 54, 52, 128, + 65, 48, 54, 51, 128, 65, 48, 54, 50, 128, 65, 48, 54, 49, 128, 65, 48, + 54, 48, 128, 65, 48, 53, 57, 128, 65, 48, 53, 56, 128, 65, 48, 53, 55, + 128, 65, 48, 53, 54, 128, 65, 48, 53, 53, 128, 65, 48, 53, 52, 128, 65, + 48, 53, 51, 128, 65, 48, 53, 50, 128, 65, 48, 53, 49, 128, 65, 48, 53, + 48, 128, 65, 48, 52, 57, 128, 65, 48, 52, 56, 128, 65, 48, 52, 55, 128, + 65, 48, 52, 54, 66, 128, 65, 48, 52, 54, 65, 128, 65, 48, 52, 54, 128, + 65, 48, 52, 53, 65, 128, 65, 48, 52, 53, 128, 65, 48, 52, 52, 128, 65, + 48, 52, 51, 65, 128, 65, 48, 52, 51, 128, 65, 48, 52, 50, 65, 128, 65, + 48, 52, 50, 128, 65, 48, 52, 49, 65, 128, 65, 48, 52, 49, 128, 65, 48, + 52, 48, 65, 128, 65, 48, 52, 48, 128, 65, 48, 51, 57, 65, 128, 65, 48, + 51, 57, 128, 65, 48, 51, 56, 128, 65, 48, 51, 55, 128, 65, 48, 51, 54, + 128, 65, 48, 51, 53, 128, 65, 48, 51, 52, 128, 65, 48, 51, 51, 128, 65, + 48, 51, 50, 65, 128, 65, 48, 50, 56, 66, 128, 65, 48, 50, 54, 65, 128, + 65, 48, 49, 55, 65, 128, 65, 48, 49, 52, 65, 128, 65, 48, 49, 48, 65, + 128, 65, 48, 48, 54, 66, 128, 65, 48, 48, 54, 65, 128, 65, 48, 48, 53, + 65, 128, 65, 45, 87, 79, 128, 65, 45, 69, 85, 128, 45, 85, 205, 45, 80, + 72, 82, 85, 128, 45, 75, 72, 89, 85, 196, 45, 75, 72, 89, 73, 76, 128, + 45, 68, 90, 85, 196, 45, 67, 72, 65, 210, 45, 67, 72, 65, 76, 128, }; static unsigned int lexicon_offset[] = { 0, 0, 6, 10, 14, 19, 27, 34, 44, 49, 55, 64, 66, 69, 81, 89, 102, 108, 113, 118, 124, 129, 137, 146, 157, 162, 167, 170, 174, 183, 189, 195, - 200, 208, 215, 223, 171, 229, 238, 241, 242, 250, 256, 261, 268, 278, - 285, 291, 296, 301, 304, 308, 314, 319, 322, 328, 338, 343, 349, 355, - 360, 369, 376, 383, 385, 390, 399, 401, 406, 408, 347, 416, 424, 425, - 433, 435, 442, 445, 447, 452, 458, 465, 470, 477, 485, 492, 497, 501, - 507, 512, 517, 527, 534, 537, 545, 553, 562, 566, 576, 580, 587, 594, - 601, 608, 612, 621, 630, 633, 636, 642, 646, 654, 661, 670, 674, 260, - 677, 690, 694, 699, 705, 707, 711, 716, 726, 731, 734, 738, 746, 750, - 759, 764, 769, 775, 779, 787, 793, 798, 807, 816, 824, 832, 843, 796, - 846, 852, 860, 867, 870, 880, 884, 889, 896, 903, 907, 911, 915, 921, - 606, 924, 933, 938, 942, 945, 948, 953, 956, 965, 970, 676, 973, 981, - 986, 990, 993, 997, 1000, 1003, 1009, 1015, 1018, 1024, 1031, 1037, 1046, - 1051, 1055, 1062, 1065, 1072, 1081, 1094, 1100, 1108, 1116, 1122, 1127, - 1132, 1138, 1143, 1148, 1153, 1157, 1162, 1168, 1173, 1178, 1182, 1188, - 1193, 1198, 1203, 1207, 1212, 1217, 1222, 1228, 1234, 1240, 1245, 1249, - 1254, 1259, 1264, 1268, 1273, 1278, 1283, 1288, 1123, 1128, 1133, 1139, - 1144, 1292, 1154, 1298, 1303, 1308, 1315, 1319, 1322, 1331, 1158, 1335, - 1163, 1169, 1174, 1339, 1344, 1349, 1353, 1357, 1363, 1367, 1179, 1370, - 1372, 1189, 1377, 1381, 1194, 1387, 1199, 1391, 1395, 1402, 1204, 1406, - 1411, 1415, 1418, 1422, 1208, 1213, 1427, 1433, 1218, 1445, 1451, 1457, - 1463, 1223, 1235, 1241, 1467, 1471, 1475, 1478, 1246, 1482, 1484, 1489, - 1494, 1500, 1505, 1510, 1514, 1519, 1524, 1529, 1534, 1540, 1545, 1550, - 1556, 1562, 1567, 1571, 1576, 1581, 1586, 1591, 1596, 1600, 1608, 1613, - 1617, 1622, 1627, 1632, 1637, 1641, 1644, 1651, 1656, 1661, 1666, 1671, - 1677, 1682, 1686, 1250, 1689, 1694, 1699, 1704, 1255, 1708, 1712, 1719, - 1260, 1726, 1731, 1265, 1735, 1737, 1742, 1748, 1269, 1753, 1762, 1274, - 1767, 1773, 1778, 1279, 1783, 1792, 1797, 1801, 1804, 1809, 1813, 1817, - 1821, 1824, 1828, 1284, 1833, 1289, 1837, 1839, 1845, 1851, 1857, 1863, - 1869, 1875, 1881, 1887, 1892, 1898, 1904, 1910, 1916, 1922, 1928, 1934, - 1940, 1946, 1951, 1956, 1961, 1966, 1971, 1976, 1981, 1986, 1991, 1996, - 2002, 2007, 2013, 2018, 2024, 2030, 2035, 2041, 2047, 2053, 2059, 2064, - 2069, 2071, 2072, 2076, 2080, 2085, 2089, 2093, 2097, 2102, 2106, 2109, - 2114, 2118, 2123, 2127, 2131, 2136, 2140, 2143, 2147, 2153, 2167, 2171, - 2175, 2179, 2182, 2187, 2191, 2195, 2198, 2202, 2207, 2212, 2217, 2222, - 2226, 2230, 2234, 2238, 2243, 2247, 2252, 2256, 2261, 2267, 2274, 2280, - 2285, 2290, 2295, 2301, 2306, 2312, 2317, 2322, 2327, 2332, 2337, 2340, - 2342, 1140, 2346, 2353, 2361, 2371, 2380, 2394, 2398, 2402, 2407, 2420, - 2428, 2431, 2435, 2440, 2444, 2447, 2451, 2455, 2460, 2465, 2470, 2474, - 2477, 2481, 2488, 2495, 2501, 2506, 2511, 2517, 2523, 2528, 2533, 2538, - 2543, 2548, 2553, 2558, 2561, 1739, 2563, 2569, 2573, 2578, 2582, 2586, - 1647, 1750, 2591, 2595, 2598, 2603, 2608, 2613, 2618, 2622, 2629, 2634, - 2637, 2641, 2648, 2654, 2658, 2662, 2666, 2671, 2678, 2683, 2688, 2695, - 2701, 2707, 2713, 2734, 2748, 2765, 2780, 2796, 2813, 2828, 2837, 2842, - 2846, 2851, 2856, 2860, 2872, 2879, 2885, 2270, 2891, 2898, 2904, 2908, - 2911, 2918, 2924, 2929, 2933, 2938, 2942, 2946, 2094, 2950, 2955, 2960, - 2964, 2969, 2977, 2981, 2986, 2990, 2994, 2998, 3003, 3008, 3013, 3017, - 3022, 3027, 3031, 3036, 3041, 3045, 3048, 3052, 3056, 3064, 3069, 3073, - 3077, 3083, 3092, 3096, 3100, 3106, 3111, 3118, 3122, 3132, 3136, 3140, - 3145, 3149, 3154, 3160, 3165, 3169, 3173, 3177, 2491, 3185, 3190, 3196, - 3201, 3205, 3210, 3215, 3219, 3225, 3230, 2098, 3236, 3242, 3247, 3252, - 3257, 3262, 3267, 3272, 3277, 3282, 3287, 3292, 3297, 3302, 3307, 3312, - 3318, 3323, 1155, 101, 3329, 3333, 3337, 3341, 3346, 3350, 3354, 3360, - 3365, 3369, 3373, 3378, 3383, 3387, 3392, 3396, 3399, 3403, 3408, 3412, - 3417, 3421, 3424, 3428, 3432, 3437, 3441, 3444, 3457, 3461, 3465, 3469, - 3474, 3478, 3482, 3485, 3489, 3493, 3498, 3502, 3507, 3512, 3517, 3521, - 3528, 3533, 3536, 3539, 3544, 3550, 3554, 3558, 3561, 3566, 3570, 3575, - 3579, 3583, 3586, 3592, 3597, 3602, 3608, 3613, 3618, 3624, 3630, 3635, - 3640, 3645, 3650, 995, 635, 3653, 3656, 3661, 3665, 3669, 3673, 3677, - 3680, 3684, 3689, 3694, 3698, 3703, 3707, 3712, 3716, 3720, 3724, 3730, - 3736, 3739, 3742, 150, 3748, 3753, 3762, 3770, 3779, 3789, 3796, 3802, - 3809, 3814, 3818, 3822, 3830, 3837, 3842, 3849, 3854, 3858, 3868, 3872, - 3876, 3881, 3886, 3896, 2110, 3901, 3905, 3908, 3914, 3919, 3925, 3931, - 3936, 3943, 3947, 3951, 3955, 3960, 3965, 3970, 3975, 3980, 3985, 609, - 675, 1316, 3990, 3997, 4004, 4010, 4015, 4022, 4029, 4034, 4040, 4046, - 4051, 4055, 4061, 4068, 4073, 4077, 4081, 2119, 4087, 4095, 4101, 4109, - 802, 4115, 4123, 4134, 4138, 4148, 4154, 4159, 4164, 4169, 4174, 2124, - 4179, 4184, 4199, 4205, 4212, 4222, 4228, 4233, 4239, 4245, 4248, 4251, - 4255, 4260, 4267, 4276, 4281, 4285, 4289, 4293, 4297, 4302, 4308, 4319, - 4323, 3404, 4328, 4340, 4346, 4354, 4358, 4363, 4370, 4375, 4380, 4385, - 1516, 4390, 4393, 4396, 4400, 4403, 4409, 4413, 4427, 4431, 4434, 4438, - 4444, 4450, 4455, 4459, 4463, 4469, 4480, 4486, 4491, 4497, 4501, 4509, - 4521, 4531, 4537, 4542, 4551, 4559, 4566, 4572, 4578, 4582, 4588, 4597, - 4606, 4610, 4619, 4624, 4628, 4633, 4637, 4645, 4651, 4655, 4660, 4664, - 4670, 2132, 4676, 4681, 4686, 4691, 4696, 1332, 4701, 4706, 4712, 4717, - 4722, 4727, 4732, 4737, 4742, 4748, 4753, 4759, 4764, 4769, 4774, 4780, - 4785, 4790, 4795, 4800, 4806, 4811, 4817, 4822, 4827, 4832, 4837, 4842, - 4847, 4853, 4858, 4863, 312, 359, 4868, 4874, 4878, 4882, 4887, 4891, - 4895, 4898, 4902, 4906, 4910, 4914, 4918, 4923, 4927, 4931, 4937, 4946, - 4673, 4951, 4955, 4958, 4963, 4968, 4973, 4978, 4983, 4988, 4993, 4998, - 5003, 5008, 5012, 5017, 5022, 5027, 5032, 5037, 5042, 5047, 5052, 5057, - 5062, 5066, 5071, 5076, 5081, 5086, 5091, 5096, 5101, 5106, 5111, 5116, - 5120, 5125, 5130, 5135, 5140, 5145, 5150, 5155, 5160, 5165, 5170, 5174, - 5179, 5184, 5189, 5194, 5199, 5204, 5209, 5214, 5219, 5224, 5228, 5233, - 5238, 5243, 5248, 5253, 5258, 5263, 5268, 5273, 5278, 5282, 5287, 5292, - 5297, 5302, 5307, 5312, 5317, 5322, 5327, 5332, 5336, 5341, 5346, 5351, - 5356, 5362, 5368, 5374, 5380, 5386, 5392, 5398, 5403, 5409, 5415, 5421, - 5427, 5433, 5439, 5445, 5451, 5457, 5463, 5468, 5474, 5480, 5486, 5492, - 5498, 5504, 5510, 5516, 5522, 5528, 5533, 5539, 5545, 5551, 5557, 5563, - 5569, 5575, 5581, 5587, 5593, 5598, 5604, 5610, 5616, 5622, 5628, 5634, - 5640, 5646, 5652, 5658, 5663, 5669, 5675, 5681, 5687, 5693, 5699, 5705, - 5711, 5717, 5723, 5728, 5732, 5738, 5744, 5750, 5756, 5762, 5768, 5774, - 5780, 5786, 5792, 5797, 5803, 5809, 5815, 5821, 5827, 5833, 5839, 5845, - 5851, 5857, 5862, 5868, 5874, 5880, 5886, 5892, 5898, 5904, 5910, 5916, - 5922, 5927, 5933, 5939, 5945, 5951, 5957, 5963, 5969, 5975, 5981, 5987, - 5992, 5998, 6004, 6010, 6016, 6022, 6028, 6034, 6040, 6046, 6052, 6057, - 6063, 6069, 6075, 6081, 6087, 6093, 6099, 6105, 6111, 6117, 6122, 6128, - 6134, 6140, 6146, 6152, 6158, 6164, 6170, 6176, 6182, 6187, 6193, 6199, - 6205, 6211, 6217, 6223, 6229, 6235, 6241, 6247, 6252, 6258, 6264, 6270, - 6276, 6282, 6288, 6294, 6300, 6306, 6312, 6317, 6323, 6329, 6335, 6341, - 6347, 6353, 6359, 6365, 6371, 6377, 6382, 6386, 6389, 6396, 6400, 6413, - 6417, 6421, 6425, 6428, 6432, 6437, 6441, 6450, 6454, 6460, 6467, 6478, - 6486, 6493, 6497, 6505, 6514, 6520, 6524, 6536, 6541, 6544, 6549, 6553, - 6563, 6571, 6579, 6585, 6589, 6599, 6609, 6617, 6624, 6631, 6637, 6643, - 6650, 6654, 6661, 6671, 6681, 6689, 6696, 6701, 6705, 6709, 6717, 6721, - 6731, 6736, 6743, 6751, 6756, 6760, 6765, 6769, 6776, 6781, 6795, 6800, - 6805, 6812, 3666, 6821, 6825, 6829, 6834, 6838, 6842, 6845, 6850, 6855, - 6864, 6870, 6876, 6882, 6886, 6897, 6907, 6922, 6937, 6952, 6967, 6982, - 6997, 7012, 7027, 7042, 7057, 7072, 7087, 7102, 7117, 7132, 7147, 7162, - 7177, 7192, 7207, 7222, 7237, 7252, 7267, 7282, 7297, 7312, 7327, 7342, - 7357, 7372, 7387, 7402, 7417, 7432, 7447, 7462, 7477, 7492, 7507, 7522, - 7537, 7552, 7567, 7582, 7597, 7612, 7627, 7642, 7651, 7660, 7665, 7671, - 7681, 7685, 7689, 7694, 7699, 7707, 7711, 7714, 7718, 3127, 7721, 7726, - 346, 515, 7732, 7740, 7744, 7748, 7751, 7755, 7761, 7765, 7773, 7779, - 7784, 7791, 7799, 7806, 7812, 7817, 7824, 7830, 7838, 7842, 7847, 7855, - 7867, 7878, 7885, 7889, 7893, 7897, 7900, 7906, 3429, 7910, 7916, 7921, - 7926, 7931, 7937, 7942, 7947, 7952, 7957, 7963, 7968, 7973, 7979, 7984, - 7990, 7995, 8001, 8006, 8012, 8017, 8022, 8027, 8032, 8037, 8043, 8048, - 8053, 8058, 8064, 8070, 8076, 8082, 8088, 8094, 8100, 8106, 8112, 8118, - 8124, 8130, 8135, 8140, 8145, 8150, 8155, 8160, 8165, 8170, 8176, 8182, - 8187, 8193, 8199, 8205, 8210, 8215, 8220, 8225, 8231, 8237, 8242, 8247, - 8252, 8257, 8262, 8268, 8273, 8279, 8285, 8291, 8297, 8303, 8309, 8315, - 8321, 8327, 2141, 7750, 8332, 8336, 8340, 8343, 8350, 8353, 8357, 8365, - 8370, 8375, 8366, 8380, 2168, 8384, 8390, 8396, 8401, 8406, 8413, 8421, - 8426, 8430, 8433, 8437, 8443, 8449, 8453, 1691, 564, 8456, 8460, 8465, - 8471, 8476, 8480, 8483, 8487, 8493, 8498, 8502, 8509, 8513, 8517, 8521, - 795, 1029, 8524, 8532, 8539, 8546, 8552, 8559, 8567, 8574, 8585, 8592, - 8598, 8603, 8615, 1175, 1340, 1345, 8626, 1350, 8630, 8634, 8643, 8651, - 8655, 8664, 8670, 8676, 8681, 8685, 8691, 8696, 8704, 8711, 2833, 8718, - 8724, 8728, 8737, 8746, 8755, 8764, 8770, 8775, 8780, 8791, 8800, 8812, - 8817, 8825, 2227, 8829, 8831, 8836, 8840, 8849, 8857, 1354, 165, 3708, - 3713, 8863, 8867, 8876, 8882, 8887, 8890, 8899, 3717, 8905, 2825, 8909, - 8917, 8921, 8925, 8929, 2244, 8933, 8938, 8945, 8951, 8957, 8960, 8962, - 8965, 8973, 8981, 8989, 8992, 8997, 2257, 9002, 8377, 9005, 9007, 9012, - 9017, 9022, 9027, 9032, 9037, 9042, 9047, 9052, 9057, 9063, 9068, 9073, - 9078, 9084, 9089, 9094, 9099, 9104, 9109, 9114, 9120, 9125, 9130, 9135, - 9140, 9145, 9150, 9155, 9160, 9165, 9170, 9175, 9180, 9185, 9190, 9195, - 9200, 9205, 9211, 9217, 9222, 9227, 9232, 9237, 9242, 2268, 2275, 2281, - 9247, 9255, 9261, 9269, 2307, 2313, 9277, 2318, 2323, 2328, 2333, 9281, - 9285, 9290, 9294, 9298, 9302, 9307, 9311, 9316, 9320, 9323, 9326, 9332, - 9339, 9345, 9352, 9358, 9365, 9371, 9378, 9384, 9390, 9399, 9405, 9409, - 9413, 9417, 9421, 9426, 9430, 9435, 9439, 9445, 9450, 9457, 9468, 9476, - 9486, 9492, 9502, 9511, 9518, 9523, 9527, 9538, 9548, 9561, 9572, 9585, - 9596, 9608, 9620, 9632, 9645, 9658, 9665, 9671, 9682, 9692, 9706, 9713, - 9719, 9728, 9736, 9740, 9745, 9749, 9756, 9764, 9771, 9775, 9781, 9785, - 9791, 9801, 9805, 9810, 9815, 9822, 9828, 9838, 8554, 9844, 9848, 9855, - 9861, 9868, 9875, 1028, 9879, 9883, 9888, 9893, 9898, 9902, 9908, 9916, - 9923, 9929, 9933, 9936, 9942, 9952, 9956, 9962, 9967, 9971, 9976, 9980, - 9986, 9992, 9997, 10003, 10008, 10013, 10018, 2164, 10023, 10025, 10030, - 10038, 10047, 10051, 10057, 10062, 10067, 10072, 10077, 10083, 10088, - 10093, 4465, 10098, 10103, 10107, 10113, 10118, 10124, 10129, 10134, - 10140, 10145, 10052, 10151, 10155, 10162, 10168, 10173, 10177, 6791, - 10182, 10191, 10196, 10201, 8941, 8948, 10206, 3000, 10210, 10215, 10220, - 10225, 10063, 10229, 10234, 10239, 10068, 10243, 10073, 10248, 10255, - 10262, 10268, 10275, 10281, 10287, 10292, 10299, 10304, 10309, 10314, - 10320, 10078, 10084, 10326, 10332, 10337, 10342, 10350, 10089, 10355, - 10358, 10360, 10368, 10374, 10380, 10389, 10397, 10405, 10413, 10421, - 10429, 10437, 10445, 10453, 10462, 10471, 10479, 10488, 10497, 10506, - 10515, 10524, 10533, 10542, 10551, 10560, 10569, 10577, 10582, 10586, - 10592, 10600, 10607, 10622, 10639, 10658, 10667, 10675, 10690, 10701, - 10709, 10719, 10729, 10737, 10743, 10755, 10764, 10772, 10779, 10786, - 10793, 10799, 10804, 10814, 10822, 10832, 10839, 10849, 10859, 10869, - 10877, 10884, 10893, 10903, 10917, 10932, 10941, 10949, 10954, 10958, - 10967, 10973, 10978, 10988, 10998, 11008, 11013, 11017, 11027, 11036, - 11041, 11057, 11074, 11084, 11095, 11108, 11119, 11127, 11140, 11152, - 11160, 11165, 11169, 11175, 11180, 11188, 11196, 11203, 11208, 11216, - 11226, 11232, 11236, 11239, 11243, 11249, 11256, 11260, 11268, 11277, - 11285, 11292, 11297, 11302, 11306, 11310, 11318, 11333, 11349, 11355, - 11363, 11372, 11380, 11386, 11390, 11397, 11408, 11412, 11415, 11421, - 11426, 10094, 11434, 11440, 11447, 11453, 11458, 11465, 11472, 11479, - 11486, 11493, 11500, 11507, 11514, 11519, 10635, 11524, 11530, 11537, - 11544, 11549, 11556, 11565, 11569, 11581, 11585, 11591, 11596, 11601, - 11606, 11611, 11616, 8979, 11621, 11624, 11628, 11632, 11636, 11640, - 11646, 11652, 11657, 11663, 11668, 11673, 11679, 11684, 11689, 9818, - 11694, 11698, 11702, 11706, 11711, 11716, 11721, 11729, 11735, 11740, - 11744, 11748, 11755, 11760, 11768, 11775, 11780, 11784, 11787, 11793, - 11800, 11804, 11807, 11812, 11816, 4504, 11822, 11831, 46, 11839, 11845, - 11850, 11855, 11863, 11870, 11875, 6726, 11881, 11887, 11892, 11896, - 11899, 11914, 11933, 11945, 11958, 11971, 11984, 11998, 12011, 12026, - 12033, 10099, 12039, 12053, 12058, 12064, 12069, 12077, 12082, 8733, - 12087, 12090, 12098, 12105, 12110, 12114, 12120, 12124, 12129, 12134, - 12139, 12144, 12149, 12154, 3005, 10717, 12159, 12163, 12169, 12175, - 12180, 12186, 12191, 10108, 12197, 12203, 12208, 12213, 12221, 12227, - 12240, 12248, 12255, 12261, 10114, 12267, 12275, 12283, 12290, 12303, - 12316, 12328, 12338, 12350, 12358, 12367, 12374, 12386, 12393, 12403, - 12412, 12421, 12429, 12436, 12441, 12447, 10119, 12452, 12458, 12463, - 12468, 10125, 12473, 12476, 12483, 12489, 12502, 9461, 12513, 12519, - 12528, 12536, 12543, 12549, 12560, 12566, 12571, 4006, 12579, 12584, - 11906, 12590, 12597, 12602, 10130, 12608, 12613, 12620, 12626, 12632, - 12637, 12645, 12653, 12660, 12664, 12676, 12690, 12700, 12705, 12709, - 12720, 12726, 12731, 12736, 10135, 12740, 10141, 12745, 12748, 12753, - 12765, 12772, 12777, 12781, 12789, 12794, 12798, 12803, 12807, 12814, - 12820, 10146, 10053, 12827, 3010, 12, 12834, 12839, 12843, 12847, 12853, - 12861, 12871, 12876, 12881, 12888, 12895, 12899, 12910, 12920, 12929, - 12938, 12950, 12955, 12959, 12967, 12981, 12985, 12988, 12992, 13000, - 13007, 13015, 13019, 13030, 13038, 13042, 13049, 13054, 13058, 13064, - 13069, 13075, 13080, 13085, 13089, 13095, 13100, 13111, 13115, 13118, - 13124, 13129, 13135, 13141, 13148, 13159, 13169, 13179, 13188, 13195, - 13204, 13208, 10156, 10163, 10169, 10174, 13214, 13220, 13226, 13231, - 13237, 10178, 13243, 13246, 13253, 13258, 13263, 13278, 13294, 13309, - 13317, 13323, 13328, 13333, 13338, 13343, 13348, 13353, 13358, 13363, - 13368, 1021, 404, 13373, 13381, 13388, 13394, 13399, 13404, 10183, 13406, - 13410, 13415, 13419, 13429, 13434, 13438, 13441, 13450, 13454, 13457, - 13464, 10192, 13469, 13472, 13480, 13487, 13495, 13499, 13505, 13509, - 13516, 13525, 13532, 13528, 13539, 13543, 13549, 13553, 13557, 13561, - 13567, 13577, 13585, 13592, 13596, 13604, 13609, 13613, 13620, 13625, - 13629, 13634, 13639, 13643, 13650, 13656, 13664, 13670, 13675, 13685, - 13692, 13697, 13702, 13706, 13710, 13718, 4334, 13726, 13731, 10197, - 13735, 13742, 13746, 13749, 13757, 13764, 13768, 6581, 13772, 13777, - 13782, 13786, 13797, 13807, 13812, 13818, 13823, 13827, 13830, 13838, - 13843, 13848, 13855, 13860, 10202, 13865, 13869, 13876, 13881, 13886, - 13891, 1696, 6749, 13896, 13901, 13906, 13911, 13917, 13922, 13928, - 13933, 13938, 13943, 13948, 13953, 13958, 13963, 13968, 13973, 13978, - 13983, 13988, 13993, 13998, 14003, 14008, 14014, 14019, 14024, 14029, - 14034, 14039, 14045, 14050, 14055, 14061, 14066, 14072, 14077, 14083, - 14088, 14093, 14098, 14103, 14109, 14114, 14119, 14124, 14132, 979, 112, - 14138, 14142, 14147, 14152, 14156, 14160, 14164, 14169, 14173, 14178, - 14182, 14185, 14189, 14193, 14199, 14204, 14214, 14220, 14228, 14234, - 14238, 14242, 14249, 14257, 14266, 14277, 14287, 14294, 14301, 14305, - 14314, 14323, 14331, 14338, 14347, 14356, 14365, 14374, 14384, 14394, - 14404, 14414, 14424, 14433, 14443, 14453, 14463, 14473, 14483, 14493, - 14503, 14512, 14522, 14532, 14542, 14552, 14562, 14572, 14581, 14591, - 14601, 14611, 14621, 14631, 14641, 14651, 14661, 14671, 14680, 14690, - 14700, 14710, 14720, 14730, 14740, 14750, 14760, 14770, 14780, 14789, - 1184, 14795, 14798, 14802, 14807, 14814, 14820, 14825, 14829, 14834, - 14843, 14851, 14856, 14860, 14864, 14870, 14875, 14881, 10211, 14886, - 14891, 14900, 14905, 10221, 14910, 14913, 14919, 14927, 10226, 14934, - 14938, 14942, 14947, 14951, 14961, 14967, 14973, 14978, 14987, 14995, - 15002, 15009, 15014, 15021, 15026, 15030, 15033, 15044, 15054, 15067, - 15076, 15084, 15095, 15107, 15117, 15127, 15132, 15136, 15141, 15146, - 15150, 15156, 15164, 15171, 15182, 15187, 15197, 15206, 15210, 15213, - 15220, 15230, 15239, 15246, 15250, 15257, 15263, 15268, 15273, 15277, - 15286, 15291, 15295, 15301, 15305, 15310, 15314, 15321, 15328, 15332, - 15341, 15349, 15357, 15364, 15372, 15384, 15395, 15405, 15412, 15418, - 15427, 15438, 15447, 15459, 15471, 15483, 15493, 15502, 15512, 15521, - 15529, 15536, 15545, 15553, 15557, 15562, 15568, 15574, 15579, 15584, - 15588, 15593, 15598, 15603, 15608, 15613, 15618, 15623, 8398, 15628, - 15630, 15634, 15639, 15645, 15652, 15658, 15664, 15673, 15677, 15683, - 15691, 15698, 15707, 15716, 15725, 15734, 15743, 15752, 15761, 15770, - 15780, 15790, 15799, 15805, 15812, 15819, 15825, 15839, 15845, 15852, - 15860, 15869, 15877, 15883, 15892, 15901, 15912, 15918, 15928, 15936, - 15943, 15951, 15960, 15973, 15982, 15990, 15997, 16010, 16016, 16022, - 16032, 16041, 16050, 16055, 16059, 16065, 16071, 16076, 16083, 16090, - 9832, 16095, 16100, 16107, 16115, 16120, 16127, 16132, 16144, 14195, - 16149, 16155, 16163, 16169, 16174, 16182, 16190, 16197, 16205, 16211, - 16219, 16227, 16233, 16238, 16244, 16251, 16257, 16262, 16266, 16277, - 16285, 16291, 16296, 16303, 16312, 16318, 16323, 16331, 16338, 16347, - 16361, 4278, 16365, 16370, 16375, 16381, 16386, 16391, 16395, 16400, - 16405, 16410, 8397, 16415, 16420, 16425, 16430, 16435, 16439, 16444, - 16449, 16454, 16459, 16465, 16471, 13501, 16476, 16482, 16487, 16492, - 16497, 10230, 16502, 16507, 16512, 16517, 16522, 16536, 16553, 16571, - 16583, 16596, 16613, 16629, 16646, 16656, 16675, 16686, 16697, 16708, - 2722, 16719, 16730, 16741, 16758, 16769, 16780, 16785, 10235, 16790, - 16794, 2417, 16798, 16801, 16807, 16815, 16823, 16829, 16838, 16845, - 16850, 16858, 16866, 16873, 16877, 16882, 16888, 16895, 16903, 16910, - 16922, 16929, 16935, 16943, 16948, 16954, 16960, 16965, 13272, 16972, - 16981, 16987, 16992, 17000, 17009, 17017, 17024, 17030, 17038, 17045, - 17051, 17057, 17064, 17071, 17077, 17083, 17092, 17100, 17110, 17117, - 17123, 17131, 17137, 17145, 17153, 17160, 17173, 17180, 17189, 17198, - 17207, 17215, 17225, 17232, 17237, 3862, 17244, 17249, 1300, 17253, - 17260, 16416, 17264, 17270, 17274, 17282, 17294, 17299, 17306, 17312, - 17317, 17324, 16421, 17328, 17332, 17336, 16426, 17340, 16431, 17344, - 17351, 17356, 17360, 17367, 17371, 17379, 17386, 17391, 17399, 17403, - 17410, 17427, 17436, 17445, 17449, 17452, 17458, 17466, 17472, 17477, - 17481, 17486, 17491, 17496, 17501, 17506, 17511, 3940, 17516, 17518, - 17526, 17533, 17543, 17555, 17560, 17564, 17570, 17575, 17583, 17587, - 17593, 17598, 17604, 17607, 17614, 17622, 17629, 17635, 17640, 17646, - 17651, 17658, 17664, 17669, 17676, 17681, 17685, 17691, 17695, 17702, - 17708, 17713, 17719, 17727, 17735, 17742, 17748, 17753, 17759, 17765, - 17773, 17778, 17783, 17791, 17797, 17803, 17808, 17815, 17820, 17824, - 17830, 17835, 17842, 17847, 17853, 17856, 17862, 17873, 17879, 17882, - 17886, 17890, 17895, 17907, 17913, 17918, 17925, 17931, 17937, 17948, - 17958, 17967, 17975, 17982, 17993, 18003, 18013, 18021, 18024, 16445, - 18029, 18034, 16450, 16601, 18042, 18055, 18070, 18081, 16618, 18099, - 18112, 18125, 18136, 11921, 18147, 18160, 18179, 18190, 18201, 18212, - 2743, 18225, 18229, 18237, 18248, 18259, 18267, 18282, 18297, 18308, - 18315, 18321, 18329, 18333, 18339, 18342, 18355, 18367, 18377, 18385, - 18392, 18400, 18410, 18415, 18422, 18427, 18434, 18445, 18455, 18461, - 18466, 18471, 16455, 18475, 18481, 18487, 18492, 18497, 18502, 18506, - 16460, 16466, 18510, 16472, 18515, 18523, 18528, 18532, 18539, 18547, - 18554, 18563, 18570, 18574, 18578, 18583, 18588, 18593, 18598, 18603, - 10074, 18608, 18610, 18615, 18620, 18626, 18631, 18636, 18641, 18646, - 18650, 18656, 18662, 18667, 18673, 18678, 18683, 18687, 18693, 18698, - 18702, 18707, 18712, 18724, 18729, 18735, 18740, 18745, 18751, 18757, - 18762, 18767, 18772, 18779, 18785, 18796, 18803, 18812, 18817, 18821, - 258, 18825, 18833, 18838, 18844, 18851, 18858, 18864, 18869, 18874, - 18879, 18886, 18896, 18904, 18909, 18914, 18921, 18927, 18936, 18946, - 18956, 18970, 18984, 18998, 19012, 19027, 19042, 19059, 19077, 19090, - 19096, 19101, 19106, 19110, 19118, 19123, 19131, 19137, 19143, 19148, - 19153, 19157, 19162, 19166, 19173, 19178, 19182, 19193, 19199, 19204, - 19209, 19216, 19221, 19225, 3825, 19230, 19236, 19243, 16477, 19249, - 19253, 19259, 19264, 19269, 19273, 19279, 19284, 19289, 19296, 19301, - 14963, 19305, 19310, 19314, 19319, 19325, 19331, 19338, 19348, 19356, - 19363, 19368, 19372, 19381, 19389, 19396, 19403, 19409, 19414, 19420, - 19425, 19430, 19436, 19441, 19447, 19452, 19458, 19464, 19471, 19477, - 19482, 19487, 10300, 19496, 19499, 19507, 19513, 19518, 19523, 19533, - 19540, 19546, 19551, 19556, 19562, 19567, 19573, 19578, 19584, 19591, - 19597, 19603, 19608, 19616, 19623, 19628, 19633, 19639, 19644, 19648, - 19657, 19668, 19675, 19682, 19690, 19697, 19704, 19709, 19714, 19720, - 19725, 19733, 19739, 19745, 19752, 19758, 19763, 19767, 19773, 19778, - 19783, 19787, 19792, 1373, 8422, 3024, 19796, 19800, 19804, 19808, 19812, - 19816, 19819, 19824, 19831, 19839, 16488, 19846, 19856, 19864, 19871, - 19879, 19889, 19898, 19911, 19916, 19921, 19929, 19936, 15072, 15081, - 19943, 19953, 19968, 19974, 19981, 19988, 19995, 20001, 20007, 20018, - 20026, 20034, 20044, 20054, 20063, 16493, 20072, 20078, 20084, 20093, - 20101, 20109, 20114, 20123, 20131, 20143, 20153, 20163, 20173, 20182, - 20194, 20204, 20214, 20225, 20232, 20237, 20244, 20256, 20268, 20280, - 20292, 20304, 20316, 20328, 20340, 20352, 20364, 20375, 20387, 20399, - 20411, 20423, 20435, 20447, 20459, 20471, 20483, 20495, 20506, 20518, - 20530, 20542, 20554, 20566, 20578, 20590, 20602, 20614, 20626, 20637, - 20649, 20661, 20673, 20685, 20697, 20709, 20721, 20733, 20745, 20757, - 20768, 20780, 20792, 20804, 20816, 20828, 20840, 20852, 20864, 20876, - 20888, 20899, 20911, 20923, 20935, 20947, 20959, 20971, 20983, 20995, - 21007, 21019, 21030, 21042, 21054, 21066, 21078, 21090, 21102, 21114, - 21126, 21138, 21150, 21161, 21173, 21185, 21197, 21209, 21222, 21235, - 21248, 21261, 21274, 21287, 21300, 21312, 21325, 21338, 21351, 21364, - 21377, 21390, 21403, 21416, 21429, 21442, 21454, 21467, 21480, 21493, - 21506, 21519, 21532, 21545, 21558, 21571, 21584, 21596, 21609, 21622, - 21635, 21648, 21661, 21674, 21687, 21700, 21713, 21726, 21738, 21751, - 21764, 21777, 21790, 21803, 21816, 21829, 21842, 21855, 21868, 21880, - 21893, 21906, 21919, 21932, 21945, 21958, 21971, 21984, 21997, 22010, - 22022, 22033, 22046, 22059, 22072, 22085, 22098, 22111, 22124, 22137, - 22150, 22163, 22175, 22188, 22201, 22214, 22227, 22240, 22253, 22266, - 22279, 22292, 22305, 22317, 22330, 22343, 22356, 22369, 22382, 22395, - 22408, 22421, 22434, 22447, 22459, 22472, 22485, 22498, 22511, 22524, - 22537, 22550, 22563, 22576, 22589, 22601, 22614, 22627, 22640, 22653, - 22666, 22679, 22692, 22705, 22718, 22731, 22743, 22756, 22769, 22782, - 22795, 22808, 22821, 22834, 22847, 22860, 22873, 22885, 22898, 22911, - 22924, 22937, 22950, 22963, 22976, 22989, 23002, 23015, 23027, 23040, - 23053, 23066, 23079, 23092, 23105, 23118, 23131, 23144, 23157, 23169, - 23182, 23195, 23208, 23221, 23234, 23247, 23260, 23273, 23286, 23299, - 23311, 23324, 23337, 23350, 23363, 23376, 23389, 23402, 23415, 23428, - 23441, 23453, 23464, 23473, 23481, 23489, 23496, 23502, 23506, 23512, - 23518, 23526, 23531, 23537, 23542, 23546, 23555, 10079, 23566, 23572, - 23579, 23587, 23594, 23601, 12496, 23608, 23615, 23624, 23629, 23634, - 23641, 23646, 23651, 8438, 8444, 8450, 23656, 23661, 23664, 23669, 23677, - 23684, 23691, 23698, 23704, 23713, 23722, 23731, 23737, 23745, 23754, - 23758, 23764, 23769, 23779, 23786, 23792, 23800, 23806, 23813, 23819, - 23829, 23838, 23842, 23849, 23853, 23858, 23864, 23872, 23876, 23886, - 16503, 23895, 23901, 23905, 23914, 23923, 23933, 23939, 16508, 23946, - 23953, 23964, 23972, 23982, 23991, 23999, 9797, 24007, 24012, 24018, - 24023, 24027, 24031, 24035, 10818, 24040, 24048, 24055, 24064, 24071, - 24078, 24087, 24093, 12416, 24100, 24106, 24110, 24116, 24123, 24129, - 24137, 24143, 24150, 24156, 24162, 24171, 24175, 24183, 24192, 24199, - 24204, 24208, 24219, 24224, 24229, 24235, 24240, 24253, 8661, 24257, - 24263, 24269, 24275, 24280, 24288, 24292, 24299, 24308, 24313, 16781, - 24321, 24325, 24337, 24342, 24346, 24349, 24355, 24361, 24367, 24372, - 24377, 24381, 24384, 24395, 24400, 10351, 24407, 24412, 24417, 24422, - 24427, 24432, 24437, 24442, 24447, 10356, 24452, 24457, 24462, 24467, - 24472, 24477, 24482, 24487, 24492, 24497, 24502, 24507, 24513, 24518, - 24523, 24528, 24533, 24538, 24543, 24548, 24553, 24558, 24564, 24570, - 24575, 24580, 24585, 24590, 24595, 24600, 24605, 24610, 24615, 24621, - 24626, 24631, 24636, 24642, 24648, 24653, 24658, 24663, 24668, 24673, - 24678, 24683, 24688, 24694, 24699, 24704, 24709, 24714, 24720, 24725, - 24730, 24734, 1296, 145, 24742, 24746, 24750, 24754, 24759, 24763, 14969, - 2343, 24767, 24772, 24776, 24781, 24785, 24790, 24794, 24800, 24805, - 24809, 24813, 24821, 24825, 24829, 24836, 24841, 24846, 24850, 24856, - 24861, 24865, 24870, 24875, 24879, 24886, 24893, 24900, 24905, 24909, - 24913, 24918, 24922, 24925, 24931, 24944, 24949, 24955, 24964, 24969, - 10578, 24974, 24983, 24988, 24991, 24995, 25000, 25005, 25010, 25015, - 25020, 2839, 2844, 25025, 25031, 25037, 3786, 25042, 25047, 25052, 25058, - 25063, 15908, 25068, 25073, 25078, 25083, 25089, 25094, 25099, 25105, - 25110, 25114, 25119, 25124, 25129, 25134, 25139, 25143, 25148, 25152, - 25157, 25162, 25167, 25172, 25176, 25181, 25185, 25190, 25195, 25200, - 25115, 3033, 25120, 25205, 25213, 25220, 10912, 25232, 25240, 25250, - 25268, 25287, 25296, 25304, 25125, 25311, 25316, 25324, 25130, 25329, - 25334, 25342, 25347, 25352, 25135, 25357, 25365, 25370, 25374, 25381, - 25387, 25396, 25400, 25408, 25412, 25415, 25422, 25426, 25430, 25435, - 25441, 25448, 25453, 9824, 25457, 25462, 25467, 25472, 25477, 25482, - 1701, 1706, 25487, 25493, 25499, 25504, 25508, 25512, 25516, 25520, - 25524, 25528, 25532, 25536, 25539, 25545, 25552, 25560, 25566, 25572, - 25577, 25582, 25588, 25592, 25597, 15814, 15821, 25604, 25616, 25619, - 25626, 25630, 18860, 25637, 25645, 25656, 25665, 25678, 25688, 25702, - 25714, 25728, 25741, 25753, 25763, 25775, 25781, 25787, 25802, 25826, - 25844, 25863, 25876, 25890, 25908, 25924, 25941, 25959, 25970, 25989, - 26006, 26026, 26044, 26056, 26070, 26084, 26096, 26113, 26132, 26150, - 26162, 26180, 26199, 16661, 26212, 26232, 26244, 11952, 26256, 26261, - 26266, 26271, 26277, 26282, 26286, 26293, 26299, 26303, 26308, 26313, - 26318, 26323, 26328, 26333, 2437, 26338, 26344, 26348, 26351, 26362, - 26366, 26369, 26377, 26383, 14134, 26387, 26396, 26407, 26413, 26419, - 26434, 26443, 26451, 26458, 26463, 26467, 26474, 26480, 26489, 26497, - 26504, 26514, 26523, 26533, 26538, 26547, 26556, 26567, 26578, 26588, - 26605, 4422, 26615, 26619, 26629, 26637, 26647, 26658, 26664, 26669, - 26679, 26687, 26694, 26700, 26707, 26712, 25163, 26716, 26725, 26729, - 26732, 26737, 26745, 26752, 26761, 26769, 26777, 26785, 26795, 26804, - 26810, 26816, 26820, 25168, 25173, 26824, 26834, 26844, 26854, 26862, - 26869, 26879, 26887, 26895, 26901, 26909, 789, 26918, 16862, 584, 26932, - 26941, 26949, 26960, 26971, 26981, 26990, 27002, 27011, 27020, 27027, - 27033, 27043, 27052, 27061, 27069, 27077, 27087, 27095, 27103, 27109, - 27114, 27119, 27124, 7852, 27129, 27132, 27136, 27141, 27146, 27150, - 11037, 25186, 25191, 27158, 27164, 27170, 27175, 27180, 27184, 27192, - 27198, 27204, 27208, 3810, 27216, 27221, 27226, 27230, 27234, 11161, - 27241, 27249, 27263, 27270, 27277, 27283, 11170, 11176, 27291, 27299, - 27306, 27311, 27316, 25196, 27322, 27333, 27337, 27342, 2674, 27347, - 27358, 27364, 27369, 27373, 27377, 27380, 27387, 27394, 27400, 27408, - 27415, 27421, 27425, 25201, 27430, 27434, 27438, 27446, 27451, 27456, - 27461, 1729, 27466, 27471, 27476, 27481, 27486, 27491, 27496, 27501, - 27506, 27511, 27516, 27521, 27526, 27531, 27537, 27542, 27547, 27552, - 27557, 27562, 27567, 27573, 27578, 27583, 27588, 27593, 27598, 27603, - 27608, 27614, 27620, 27625, 27631, 27636, 27641, 5, 27647, 27651, 27655, - 27659, 27664, 27668, 27672, 27676, 27680, 27685, 27689, 27694, 27698, - 27701, 27705, 27710, 27714, 27719, 27723, 27727, 27731, 27736, 27740, - 27744, 27754, 27759, 27763, 27767, 27772, 27777, 27786, 27791, 27796, - 27800, 27804, 27813, 27826, 27838, 27847, 27856, 27861, 27867, 27872, - 27876, 27880, 27890, 27899, 27907, 27913, 27918, 27922, 27929, 27939, - 27948, 27956, 12309, 27964, 27972, 27981, 27990, 27998, 28008, 28013, - 28017, 28021, 28024, 28026, 28030, 28034, 28039, 28044, 28048, 28052, - 28055, 28059, 28062, 28066, 28069, 28072, 28076, 28082, 28086, 28090, - 28094, 28098, 28103, 28108, 28113, 28117, 28120, 28125, 28131, 28136, - 28142, 28147, 28151, 28157, 28161, 28165, 28170, 28174, 28179, 28184, - 28188, 28192, 28199, 28203, 28206, 28210, 28214, 28220, 28226, 28230, - 28234, 28239, 28246, 28252, 28256, 28265, 28269, 28273, 28276, 28282, - 28287, 28293, 1429, 1770, 28298, 28303, 28308, 28313, 28318, 28323, - 28328, 2151, 2197, 28333, 28336, 28340, 28344, 28349, 28353, 16874, - 28357, 28362, 28367, 28371, 28374, 28379, 28383, 28388, 28392, 16878, - 28397, 28400, 28403, 28409, 28413, 28418, 28422, 28435, 28439, 28442, - 28450, 28459, 28466, 28471, 28477, 28483, 28491, 28498, 28505, 28509, - 28513, 28517, 28522, 28527, 28531, 28539, 28544, 28551, 28563, 28574, - 28579, 28583, 28590, 28594, 28599, 28605, 28608, 28613, 28618, 28622, - 28626, 28629, 28635, 8560, 2347, 28639, 28644, 28660, 10629, 28680, - 28689, 28705, 28709, 28716, 28719, 28725, 28735, 28741, 28750, 28765, - 28776, 28788, 28799, 28807, 28816, 28822, 28831, 28841, 28851, 28862, - 28873, 28883, 28892, 28899, 28908, 28916, 28923, 28931, 28938, 28945, - 28958, 28965, 28973, 28980, 28986, 28991, 29000, 29007, 29013, 29018, - 29026, 29034, 29041, 29048, 26639, 29060, 29072, 29086, 29094, 29102, - 29110, 29117, 29129, 29138, 29147, 29155, 29163, 29171, 29178, 29184, - 29193, 29201, 29211, 29220, 29230, 29239, 29248, 29256, 29261, 29265, - 29268, 29272, 29276, 29280, 29284, 29288, 29294, 29300, 29305, 29313, - 16936, 29320, 29325, 29332, 29338, 29345, 16944, 29352, 29355, 29367, - 29375, 29381, 29386, 29390, 29401, 29411, 11100, 29420, 29429, 29437, - 29447, 29456, 29463, 29470, 29478, 29482, 16955, 29485, 29492, 29496, - 29502, 29505, 29512, 29518, 29523, 29530, 29536, 29540, 29545, 29549, - 29558, 29565, 29571, 8618, 29578, 29586, 29593, 29599, 29604, 29610, - 29616, 29624, 29630, 29634, 29637, 29639, 29273, 11113, 29648, 29653, - 29659, 29669, 29674, 29681, 29687, 29692, 29697, 29702, 29706, 29711, - 29718, 29724, 29733, 29741, 29745, 29752, 29758, 29767, 4614, 29773, - 29779, 29784, 29791, 29803, 29814, 29819, 29823, 29833, 29839, 29843, - 29848, 29858, 29867, 29871, 29878, 29886, 29893, 29899, 29904, 29912, - 29919, 29924, 29931, 29943, 29952, 29956, 14895, 29964, 29974, 29978, - 28446, 29989, 29994, 29998, 30005, 30012, 24852, 29198, 30017, 30021, - 30024, 25976, 30029, 30043, 30059, 30077, 30096, 30113, 30131, 25995, - 30148, 30168, 26012, 30180, 30192, 18086, 30204, 26032, 30218, 30230, - 11965, 30244, 30249, 30254, 30259, 30265, 30271, 30277, 30281, 30289, - 30296, 30301, 30311, 30317, 11527, 30323, 30325, 30330, 30338, 30342, - 29714, 30348, 30355, 13173, 13183, 30362, 30369, 30379, 30384, 30388, - 30391, 30397, 30405, 30417, 30427, 30443, 30456, 30470, 18104, 30484, - 30491, 30495, 30498, 30503, 30507, 30514, 30521, 30528, 30538, 30543, - 30548, 30553, 30561, 30569, 30574, 30583, 26660, 3471, 30588, 30591, - 30594, 30599, 30606, 30611, 30616, 30632, 30640, 30648, 10393, 30656, - 30661, 30665, 30671, 30676, 30682, 30685, 30691, 30703, 30711, 30718, - 30724, 30731, 30742, 30756, 30769, 30775, 30784, 30790, 30799, 30811, - 30822, 30832, 30841, 30850, 30858, 30869, 8600, 30876, 30883, 30889, - 30894, 30900, 30907, 30918, 30928, 30938, 30947, 30953, 30960, 30965, - 30973, 30980, 30988, 30996, 31008, 6860, 1052, 31015, 31024, 31032, - 31038, 31044, 31049, 31053, 31056, 31062, 31069, 31074, 31079, 31084, - 31088, 31100, 31111, 31120, 31128, 17132, 31133, 31141, 31146, 31154, - 31160, 31166, 13166, 9407, 31171, 31175, 31179, 31182, 31185, 31191, - 31199, 31207, 31211, 31215, 31220, 31223, 31232, 31236, 31239, 31247, - 31258, 31262, 31268, 31274, 31278, 31284, 31292, 31314, 31338, 31349, - 31358, 31364, 31371, 31378, 31384, 31392, 31398, 31403, 31414, 31432, - 31439, 31447, 31451, 31458, 31463, 31472, 31485, 31493, 31505, 31516, - 31527, 31537, 31551, 31560, 31568, 31580, 10646, 31591, 31602, 31613, - 31625, 31635, 31644, 31649, 31653, 31661, 31672, 31682, 31688, 31693, - 31697, 31700, 31703, 31711, 31719, 31728, 31738, 31747, 31753, 31767, - 2757, 31789, 31800, 31809, 31819, 31831, 31840, 31849, 31859, 31867, - 31875, 31884, 31889, 31900, 31905, 31914, 31925, 31929, 31932, 31942, - 31951, 31959, 31969, 31979, 31987, 31996, 32003, 32011, 32018, 32027, - 32036, 32041, 32046, 32050, 32058, 32065, 32073, 32080, 32091, 32106, - 32113, 32119, 32129, 32138, 32144, 32155, 32159, 32166, 32170, 32177, - 32183, 16045, 32189, 32193, 32198, 32204, 32211, 32215, 32219, 32227, - 32235, 32241, 32250, 32257, 32262, 32267, 32277, 26714, 32281, 32284, - 32289, 32294, 32299, 32304, 32309, 32314, 32319, 32324, 32330, 32335, - 32340, 32346, 1146, 706, 32351, 32360, 2395, 32367, 32372, 32376, 32382, - 1195, 634, 32387, 311, 32391, 32400, 32408, 32417, 32425, 32436, 32444, - 32453, 32463, 32471, 32476, 11257, 32480, 32488, 32496, 32501, 16891, - 3994, 32507, 32513, 32519, 6418, 32524, 32528, 32534, 32538, 32544, - 32549, 32556, 1388, 32562, 32569, 32573, 1295, 6426, 32578, 32588, 32596, - 32602, 32612, 32621, 32629, 32635, 32640, 32648, 32655, 12696, 32661, - 32668, 32673, 32680, 1448, 239, 2150, 32686, 32692, 32699, 32710, 32721, - 32729, 32736, 32746, 32755, 32763, 32772, 32779, 32786, 32799, 32806, - 32812, 32823, 32842, 1200, 32847, 32852, 32860, 3877, 32864, 32869, - 32873, 32877, 1392, 28053, 32887, 32891, 32896, 32900, 3744, 32906, - 32914, 32921, 32932, 32940, 32965, 32973, 32978, 3878, 367, 32984, 32992, - 33000, 33007, 33013, 33018, 2219, 12167, 33025, 33031, 29541, 29809, - 33037, 605, 106, 33041, 33045, 33051, 728, 10266, 33056, 33063, 33069, - 33073, 33077, 1593, 33080, 33084, 17400, 33087, 33092, 33099, 33105, - 33110, 33118, 33125, 33131, 25354, 33135, 33139, 33143, 3948, 19164, - 33147, 33152, 33156, 33159, 33167, 33175, 33180, 33189, 33197, 33200, - 33207, 33217, 33229, 33237, 33242, 33246, 33254, 33261, 33267, 33274, - 33281, 33284, 33288, 33292, 1403, 33302, 33304, 33309, 33315, 33321, - 33326, 33331, 33336, 33341, 33346, 33351, 33356, 33361, 33366, 33371, - 33376, 33381, 33386, 33391, 33397, 33403, 33409, 33415, 33420, 33425, - 33430, 33436, 33441, 33446, 33451, 33457, 33462, 33468, 33473, 33478, - 33483, 33488, 33494, 33499, 33505, 33510, 33515, 33520, 33525, 33531, - 33536, 33542, 33547, 33552, 33557, 33562, 33567, 33572, 33577, 33582, - 33587, 33593, 33599, 33605, 33610, 33615, 33620, 33625, 33631, 33637, - 33643, 33649, 33655, 33661, 33666, 33672, 33677, 33682, 33687, 33692, - 33698, 2482, 33703, 2489, 2496, 2881, 33708, 2502, 2512, 33714, 2544, - 2549, 2554, 33718, 33723, 33728, 33734, 33739, 33744, 33748, 33753, - 33759, 33764, 33769, 33774, 33780, 33785, 33789, 33793, 33798, 33803, - 33808, 33813, 33818, 33824, 33830, 33835, 33839, 33844, 33850, 33854, - 33859, 33864, 33869, 33874, 33878, 33881, 33886, 33891, 33896, 33901, - 33906, 33912, 33918, 33923, 33928, 33933, 33937, 33942, 33947, 33952, - 33957, 33962, 33967, 33971, 33976, 33981, 33986, 33990, 33994, 33998, - 34003, 34011, 34016, 34021, 34027, 34033, 34039, 34044, 34048, 34051, - 34056, 34061, 34065, 34070, 34075, 34079, 34084, 34088, 34091, 34096, - 4090, 19924, 34101, 34106, 34111, 34119, 24067, 32566, 9905, 34124, - 34129, 34133, 34138, 34142, 34146, 34151, 34155, 34158, 34161, 34165, - 34170, 34174, 34182, 34186, 34189, 34194, 34198, 34202, 34207, 34212, - 34216, 34222, 34227, 34232, 34239, 34246, 34250, 34253, 34259, 34268, - 34275, 34283, 34290, 34294, 34299, 34303, 34307, 34313, 34318, 34324, - 34328, 34334, 34339, 34344, 34348, 34355, 34361, 34367, 34373, 34379, - 34386, 34392, 34398, 34404, 34410, 34416, 34422, 34428, 34435, 34441, - 34448, 34454, 34460, 34466, 34472, 34478, 34484, 34490, 34496, 34502, - 34508, 34513, 34518, 13051, 34523, 34529, 34534, 34539, 34544, 34547, - 34553, 34561, 34566, 34570, 34575, 34581, 34590, 34596, 34601, 34606, - 34611, 34615, 34620, 34625, 34630, 34635, 34640, 34647, 34654, 34660, - 34666, 34671, 18789, 34678, 34684, 34691, 34697, 34703, 34708, 34716, - 34721, 10811, 34725, 34730, 34735, 34741, 34746, 34751, 34755, 34760, - 34765, 34771, 34776, 34781, 34786, 34790, 34795, 34800, 34804, 34809, - 34814, 34818, 34823, 34827, 34832, 34837, 34842, 34846, 34851, 34855, - 34859, 17556, 34864, 34871, 34880, 34886, 34892, 34901, 34909, 34918, - 34926, 34931, 34935, 34942, 34948, 34956, 34960, 34963, 34968, 34972, - 34981, 34989, 35007, 35013, 1447, 35019, 35022, 35026, 25494, 25500, - 35032, 35036, 35047, 35058, 35069, 35081, 35085, 35092, 35099, 35106, - 35111, 35115, 35123, 35128, 35133, 35138, 35143, 6483, 1007, 24066, - 35148, 35153, 35157, 35162, 35166, 35172, 35177, 35183, 35188, 35194, - 35199, 35205, 35210, 35216, 35222, 35228, 35233, 35189, 35195, 35237, - 35242, 35248, 35253, 35259, 35264, 35270, 35275, 35200, 11818, 35279, - 35211, 35217, 35223, 2973, 3658, 35285, 35288, 35293, 35299, 35305, - 35311, 35318, 35324, 35330, 35336, 35342, 35348, 35354, 35360, 35366, - 35372, 35378, 35384, 35390, 35397, 35403, 35409, 35415, 35421, 35427, - 35430, 35435, 35438, 35445, 35450, 35458, 35463, 35468, 35474, 35479, - 35484, 35488, 35493, 35499, 35504, 35510, 35515, 35521, 35526, 35532, - 35538, 35542, 35547, 35552, 35557, 35562, 35566, 35571, 35576, 35581, - 35587, 35593, 35599, 35605, 35610, 35614, 35617, 35623, 35629, 35638, - 35646, 35653, 35658, 35662, 35666, 35671, 17346, 35676, 35684, 35690, - 4036, 1305, 35695, 35699, 8677, 35705, 35711, 35718, 8686, 35722, 35728, - 35735, 35741, 35750, 35758, 35770, 35774, 35781, 35787, 35792, 35796, - 35800, 35803, 35813, 35822, 35830, 35190, 35835, 35845, 35855, 35865, - 35871, 35876, 35886, 35891, 35904, 35918, 35929, 35941, 35953, 35967, - 35980, 35992, 36004, 16702, 36018, 36023, 36028, 36032, 36036, 36040, - 36044, 36050, 36055, 36060, 36065, 36070, 36075, 36080, 1759, 30820, - 36085, 36090, 35238, 36095, 36098, 36103, 36108, 36113, 36119, 36125, - 11442, 36130, 36136, 36143, 18038, 36149, 36154, 36159, 36163, 36168, - 36173, 35243, 36178, 36183, 36188, 36194, 35249, 36199, 36202, 36209, - 36217, 36223, 36229, 36235, 36246, 36251, 36258, 36265, 36272, 36280, - 36289, 36298, 36304, 36310, 36318, 35254, 36323, 36329, 36335, 35260, - 36340, 36345, 36353, 36361, 36367, 36374, 36380, 36387, 36394, 36400, - 36408, 36418, 36425, 36431, 36436, 36442, 36447, 36452, 36459, 36468, - 36476, 36481, 36487, 36494, 36502, 36508, 36513, 36519, 36528, 36535, - 31733, 36541, 36545, 36550, 36559, 36564, 36569, 36574, 14224, 36582, - 36587, 36592, 36597, 36601, 36606, 36611, 36618, 36623, 36628, 36633, - 35265, 24003, 36639, 2588, 155, 36642, 36645, 36649, 36653, 36663, 36671, - 36678, 36682, 36686, 36689, 36697, 36704, 36711, 36720, 36724, 36727, - 36733, 36740, 36744, 36752, 36760, 36764, 36768, 36771, 36777, 36784, - 36788, 36792, 36799, 36807, 36815, 35201, 36822, 36830, 36835, 36847, - 11474, 11481, 11488, 11495, 11502, 11509, 577, 397, 36853, 36858, 36863, - 36869, 36874, 36879, 4057, 36884, 36887, 36892, 36897, 36902, 36907, - 36912, 36919, 25612, 36924, 36929, 36934, 36939, 36944, 36950, 36955, - 36961, 35441, 36967, 36972, 36978, 36984, 36994, 36999, 37004, 37008, - 37013, 37018, 37023, 37028, 37041, 37046, 25236, 19246, 4070, 37050, - 37056, 37061, 37066, 37072, 37077, 37082, 37086, 37091, 37096, 37102, - 37107, 37112, 1310, 37116, 37121, 37126, 37131, 37135, 37140, 37145, - 37150, 37156, 37162, 37167, 37171, 37175, 37180, 37185, 37190, 37194, - 37199, 37207, 37211, 37217, 37221, 37228, 37237, 19023, 35212, 37243, - 37250, 37258, 37265, 37271, 37284, 37296, 37301, 37307, 37311, 2900, - 37315, 37319, 36779, 37328, 37339, 37344, 31796, 37349, 37354, 37358, - 37363, 25505, 37367, 37371, 37376, 35218, 24102, 37380, 37385, 37391, - 37396, 37400, 37404, 37407, 37411, 37417, 37426, 37437, 37449, 35224, - 37454, 37457, 37461, 37465, 37470, 37475, 37480, 37485, 37490, 37495, - 37500, 37505, 336, 37510, 37515, 37520, 37525, 37530, 37535, 37541, - 37546, 37551, 37557, 37562, 37568, 37573, 37579, 37584, 37589, 37594, - 37599, 37604, 37609, 37614, 37619, 37625, 37630, 37635, 37640, 37645, - 37650, 37655, 37660, 37666, 37672, 37677, 37682, 37687, 37692, 37697, - 37702, 37707, 37712, 37717, 37722, 37727, 37732, 37737, 37742, 37747, - 37752, 37757, 37762, 37772, 37782, 37788, 341, 9, 37793, 37797, 37801, - 37809, 37813, 37817, 37820, 16153, 37823, 37828, 37832, 37837, 37841, - 37846, 37850, 37855, 37859, 37862, 37864, 37868, 37873, 37877, 37888, - 37891, 37893, 37897, 37909, 37918, 37922, 37926, 37932, 37937, 37946, - 37952, 37957, 37962, 37966, 37970, 37975, 37982, 37987, 37993, 37998, - 38002, 38009, 29206, 29216, 38013, 38018, 38023, 38028, 38035, 38039, - 38046, 38052, 8832, 38056, 38065, 38073, 38088, 38102, 38111, 38119, - 38130, 38139, 38144, 38151, 7861, 38161, 38166, 38171, 38175, 38178, - 38183, 38187, 38192, 38196, 38203, 38208, 38213, 38218, 38228, 38233, - 38238, 38243, 9778, 38248, 38250, 38258, 38261, 38264, 38268, 38274, - 38278, 38283, 38288, 38306, 38320, 38339, 38356, 38365, 38373, 38378, - 38383, 1440, 38389, 38395, 38400, 38410, 38419, 38427, 38432, 38438, - 38443, 38452, 38463, 38468, 38475, 38481, 38485, 38494, 38501, 38509, - 38516, 38529, 38537, 38541, 38551, 38556, 38560, 38568, 38576, 38581, - 38585, 38589, 38598, 38604, 38609, 38617, 38627, 38636, 38645, 38654, - 38665, 38673, 38684, 38693, 38701, 38708, 38714, 38719, 38730, 38741, - 38746, 38750, 38753, 38757, 38765, 38771, 38782, 38793, 38804, 38815, - 38826, 38837, 38848, 38859, 38871, 38883, 38895, 38907, 38919, 38931, - 38943, 38952, 38956, 38964, 38970, 38976, 38983, 38989, 38994, 39000, - 39004, 39009, 39014, 39019, 37767, 37777, 2457, 39024, 39026, 39031, - 39036, 39041, 39044, 39046, 39050, 39053, 39060, 39064, 11124, 39068, - 39074, 39084, 39089, 39095, 39099, 39104, 39117, 29664, 39123, 39132, - 39141, 20147, 39148, 39157, 35851, 39165, 39170, 39174, 39183, 39191, - 39198, 39203, 39207, 39212, 39217, 39225, 39229, 39237, 39243, 39249, - 39254, 39259, 39263, 39266, 39271, 39284, 39300, 26102, 39317, 39329, - 39346, 39358, 39372, 26119, 26138, 39384, 39396, 2774, 39410, 39415, - 39420, 39425, 39429, 39436, 39448, 39455, 39464, 39467, 39478, 39489, - 39497, 39502, 39506, 39511, 39516, 39521, 39526, 39531, 39536, 36315, - 919, 39541, 39545, 39549, 39552, 39557, 39562, 39568, 39573, 39578, - 39584, 39590, 39595, 39599, 39604, 39609, 39614, 39618, 39621, 39627, - 39632, 39637, 39642, 39646, 39651, 39657, 39665, 29936, 39670, 39675, - 39682, 39688, 39694, 39699, 39707, 25621, 39714, 39719, 39724, 39729, - 39733, 39736, 39741, 39745, 39749, 39756, 39762, 39768, 39774, 39781, - 39786, 39792, 38571, 39796, 39800, 39805, 39818, 39823, 39829, 39837, - 39844, 39852, 39862, 39868, 39874, 39880, 39884, 39893, 39901, 39908, - 39913, 39918, 11841, 39923, 39933, 39940, 39946, 39956, 39961, 39967, - 39975, 3910, 39982, 39989, 39995, 40002, 3916, 40006, 40011, 40022, - 40029, 40035, 40044, 40048, 4474, 40051, 40058, 40064, 40070, 40078, - 40088, 33008, 40095, 40103, 40109, 40114, 40120, 40125, 40129, 29508, - 40135, 40142, 40148, 40156, 40165, 40172, 40183, 26906, 40189, 40194, - 40198, 40206, 40214, 40221, 40227, 40232, 10769, 6458, 40237, 40241, - 40243, 40247, 40252, 40254, 40259, 40265, 40270, 40275, 40282, 36915, - 40288, 40293, 40297, 40302, 40306, 40315, 40319, 40325, 40332, 40338, - 40345, 40350, 40359, 40364, 40368, 40373, 40380, 40388, 40396, 40401, - 24158, 40405, 40408, 40412, 40416, 12264, 936, 40420, 40425, 40433, - 40438, 40442, 40451, 40458, 40462, 40466, 40474, 40481, 40491, 40495, - 40499, 40507, 40515, 40521, 40526, 40535, 15241, 40541, 40550, 40557, - 40562, 40569, 40576, 40584, 40591, 40599, 40607, 40612, 40619, 40626, - 40633, 40640, 40647, 40652, 40659, 40665, 40682, 40690, 40700, 40708, - 40715, 439, 40719, 40725, 40729, 40734, 38135, 40740, 40743, 40747, - 40758, 40766, 3921, 40774, 40780, 40786, 40796, 40802, 40811, 40820, - 40830, 40837, 40843, 40848, 3927, 3933, 40857, 40864, 40872, 40877, - 40881, 40888, 40896, 40903, 40910, 40916, 40925, 40935, 40941, 40949, - 40958, 40965, 40973, 40980, 24915, 40984, 40991, 40997, 41007, 41016, - 41024, 41035, 41039, 41049, 41056, 41061, 41067, 41074, 41082, 41091, - 41100, 41110, 41121, 41128, 41133, 41140, 3181, 41148, 41154, 41159, - 41166, 41172, 41178, 41183, 41196, 41209, 41222, 41229, 41235, 41243, - 41251, 41256, 41260, 41264, 41269, 41274, 41279, 41284, 41289, 41294, - 1409, 41299, 41303, 41307, 41311, 41315, 41319, 41323, 41327, 41331, - 41335, 41339, 41343, 41347, 41351, 41355, 41359, 41363, 41367, 41371, - 41375, 41379, 41383, 41387, 41391, 41395, 41399, 41403, 41407, 41411, - 41415, 41419, 41423, 41427, 41431, 41435, 41439, 41443, 41447, 41451, - 41455, 41459, 41463, 41467, 41471, 41475, 41479, 41483, 41487, 41491, - 41495, 41499, 41503, 41507, 41511, 41515, 41519, 41523, 41527, 41531, - 41535, 41539, 41543, 41547, 41551, 41555, 41559, 41563, 41567, 41571, - 41575, 41579, 41583, 41587, 41591, 41595, 41599, 41603, 41607, 41611, - 41615, 41619, 41623, 41627, 41631, 41635, 41639, 41643, 41647, 41651, - 41655, 41659, 41663, 41667, 41671, 41675, 41679, 41683, 41687, 41691, - 41695, 41699, 41703, 41707, 41711, 41715, 41719, 41723, 41727, 41731, - 41735, 41739, 41743, 41747, 41751, 41755, 41759, 41763, 41767, 41771, - 41775, 41779, 41783, 41787, 41791, 41795, 41799, 41803, 41807, 41811, - 41815, 41819, 41823, 41827, 41831, 41835, 41839, 41843, 41847, 41851, - 41855, 41859, 41863, 41867, 41871, 41875, 41879, 41883, 41887, 41891, - 41895, 41899, 41903, 41907, 41911, 41916, 41920, 41925, 41929, 41934, - 41938, 41943, 41947, 41953, 41958, 41962, 41967, 41971, 41976, 41980, - 41985, 41989, 41994, 41998, 42003, 42007, 42012, 42016, 42022, 42028, - 42033, 42037, 42042, 42046, 42052, 42057, 42061, 42066, 42070, 42075, - 42079, 42085, 42090, 42094, 42099, 42103, 42108, 42112, 42117, 42121, - 42127, 42132, 42136, 42141, 42145, 42151, 42156, 42160, 42165, 42169, - 42174, 42178, 42183, 42187, 42192, 42196, 42202, 42207, 42211, 42217, - 42222, 42226, 42232, 42237, 42241, 42246, 42250, 42255, 42259, 42265, - 42271, 42277, 42283, 42289, 42295, 42301, 42307, 42312, 42316, 42321, - 42325, 42331, 42336, 42340, 42345, 42349, 42354, 42358, 42363, 42367, - 42372, 42376, 42381, 42385, 42390, 42394, 42400, 42405, 42409, 42414, - 42418, 42424, 42430, 42435, 127, 63, 42439, 42441, 42445, 42449, 42453, - 42458, 42462, 42466, 42471, 10682, 42476, 42482, 1715, 6894, 42488, - 42491, 42496, 42500, 42505, 42509, 42513, 42518, 11625, 42522, 42526, - 42530, 563, 42534, 17665, 42539, 42543, 42548, 42553, 42558, 42562, - 42569, 29688, 42575, 42578, 42582, 42587, 42593, 42597, 42600, 42608, - 42614, 42619, 42623, 42626, 42630, 42636, 42640, 42644, 3709, 3714, - 14336, 42647, 42651, 42655, 42659, 42663, 42671, 42678, 42682, 15191, - 42689, 42694, 42708, 42715, 42726, 351, 42731, 42735, 42741, 42753, - 42759, 42765, 42770, 42776, 42780, 33277, 42789, 42795, 42804, 42808, - 42812, 42817, 42823, 42828, 42832, 42837, 42841, 42845, 42852, 42858, - 42863, 42874, 42889, 42904, 42919, 42935, 42953, 11539, 42967, 42974, - 42978, 42981, 42990, 42995, 42999, 43007, 18241, 43015, 43019, 43029, - 43040, 33202, 43053, 43057, 43066, 43084, 43103, 43111, 43119, 10964, - 11738, 43123, 25517, 43126, 34178, 43131, 10963, 43136, 43142, 43147, - 43153, 43158, 43164, 43169, 43175, 43180, 43186, 43192, 43198, 43203, - 43159, 43165, 43170, 43176, 43181, 43207, 43187, 43193, 8845, 4299, - 43213, 43221, 43225, 43228, 43235, 43239, 43244, 43249, 43256, 43262, - 43268, 43273, 16983, 43277, 29525, 43281, 43285, 43289, 43295, 43299, - 31667, 43308, 9938, 43312, 10364, 43315, 43322, 43328, 43332, 13645, - 43339, 43345, 43350, 43357, 43364, 43371, 32412, 8742, 43378, 43385, - 43392, 43398, 43403, 43410, 43421, 43427, 43432, 43437, 43442, 43446, - 43451, 43458, 43160, 43462, 43472, 43481, 43492, 43498, 43506, 43513, - 43518, 43523, 43528, 43533, 43538, 43542, 43546, 43553, 43559, 43567, - 2350, 1070, 11641, 11653, 11658, 11664, 43576, 11669, 11674, 11680, - 43581, 43591, 43595, 11685, 43600, 19444, 43603, 43608, 43612, 39459, - 43623, 43628, 43635, 43642, 43646, 43649, 43657, 11552, 43664, 43667, - 43673, 43683, 6510, 43692, 43697, 43703, 43707, 43715, 43719, 43729, - 43735, 43740, 43751, 43760, 43769, 43778, 43787, 43796, 43805, 43814, - 43820, 43826, 43831, 43837, 43843, 43849, 43854, 43857, 43864, 43870, - 43874, 43879, 43886, 43893, 43897, 43900, 43910, 43923, 43932, 43941, - 43952, 43965, 43977, 43988, 43997, 44008, 44013, 44022, 44027, 11690, - 44033, 44040, 44048, 44053, 44058, 29734, 44062, 44069, 4242, 25, 44073, - 44078, 19293, 44082, 44085, 44088, 31853, 44092, 32421, 44100, 44104, - 44108, 44111, 44117, 44123, 44128, 35289, 44137, 44145, 44151, 44158, - 31836, 44162, 32061, 44166, 44175, 44179, 44187, 44193, 44199, 44204, - 44208, 32440, 44214, 44217, 44225, 44233, 4615, 44239, 44243, 44248, - 44255, 44261, 44266, 44271, 44275, 44281, 44286, 44292, 4527, 756, 44299, - 44303, 44306, 44318, 44325, 44330, 17538, 44334, 44342, 44350, 44358, - 44366, 44373, 44381, 44389, 44396, 44404, 44412, 44420, 44428, 44436, - 44444, 44452, 44460, 44468, 44476, 44484, 44491, 44499, 44507, 44515, - 44523, 44531, 44539, 44547, 44555, 44563, 44571, 44579, 44587, 44595, - 44603, 44611, 44619, 44627, 44635, 44643, 44650, 44658, 44665, 44673, - 44681, 44689, 44697, 44705, 44713, 44721, 44729, 44740, 24951, 44745, - 44748, 44755, 44759, 44765, 44769, 44775, 44780, 44786, 44791, 44796, - 44800, 44804, 44812, 44817, 44822, 44832, 44838, 44851, 44857, 44863, - 44869, 44872, 44879, 44884, 44890, 44895, 19189, 894, 44900, 44903, - 44906, 44909, 35373, 35379, 44912, 35385, 35398, 35404, 35410, 44918, - 35416, 35422, 44924, 44930, 18, 44938, 44945, 44949, 44953, 44961, 36204, - 44965, 44969, 44976, 44981, 44985, 44990, 44996, 45001, 45007, 45012, - 45016, 45020, 45024, 45029, 45033, 45038, 45042, 45046, 45053, 45058, - 45062, 45066, 45071, 45075, 45080, 45084, 45088, 45093, 45099, 17816, - 17821, 45104, 45108, 45111, 45115, 45119, 23960, 45124, 45128, 45134, - 45141, 45147, 45152, 45162, 45167, 45175, 45179, 45182, 36219, 45186, - 4592, 45191, 45196, 45200, 45205, 45209, 45214, 15259, 45225, 45229, - 45232, 45236, 45241, 45245, 45250, 45255, 45259, 45263, 45267, 45270, - 45274, 45277, 45282, 45287, 45292, 45297, 45302, 45307, 8864, 15275, - 45312, 45315, 45321, 45326, 45332, 45337, 45343, 45348, 45354, 45359, - 45365, 45371, 45377, 45382, 45386, 45390, 45397, 45406, 45422, 45438, - 45448, 31743, 45455, 45459, 45464, 45469, 45473, 45477, 41095, 45483, - 45488, 45492, 45499, 45504, 45509, 45513, 45516, 45520, 45526, 30623, - 45530, 24265, 45535, 45542, 45550, 45556, 45563, 45571, 45577, 45581, - 45586, 45592, 45600, 45605, 45609, 45618, 10663, 45626, 45630, 45638, - 45645, 45650, 45655, 45660, 45664, 45667, 45671, 45674, 45678, 45685, - 45690, 45694, 45700, 45704, 45710, 45715, 45720, 30014, 35436, 45725, - 45734, 45742, 45748, 45755, 45761, 45767, 45772, 45775, 45777, 45784, - 45791, 45797, 45801, 45804, 45808, 45812, 45816, 45821, 45825, 45829, - 45832, 45836, 45850, 26168, 45869, 45882, 45895, 45908, 26186, 45923, - 2727, 45938, 45944, 45948, 45958, 45962, 45966, 45970, 45977, 45982, - 45986, 45993, 45999, 46004, 46010, 46020, 46032, 46043, 46048, 46055, - 46059, 46063, 46066, 46074, 18262, 4025, 46079, 17843, 46092, 46099, - 46106, 46110, 46114, 46119, 46125, 46130, 46136, 46140, 46144, 46147, - 46152, 46156, 46161, 46166, 46171, 46176, 46181, 46186, 46191, 46196, - 46201, 8387, 1079, 46206, 46210, 46216, 46225, 46230, 46239, 46246, - 40931, 46252, 46257, 46261, 46268, 46273, 46280, 46286, 46290, 46293, - 46297, 46302, 2805, 46309, 46316, 46320, 46323, 46328, 46333, 46339, - 46344, 46349, 46353, 46358, 46368, 46373, 46379, 46384, 44320, 46390, - 46396, 46406, 46411, 46416, 46420, 46425, 7863, 7875, 46430, 46433, - 46440, 46446, 46455, 9864, 38711, 46463, 46467, 46471, 36267, 46479, - 46490, 46498, 41143, 46505, 46510, 46515, 46526, 46533, 46544, 36291, - 24282, 46552, 977, 46557, 15687, 46563, 31827, 46569, 46574, 46584, - 46593, 46600, 46606, 46610, 46613, 46620, 46626, 46633, 46639, 46649, - 46657, 46663, 46669, 46674, 46678, 46685, 46690, 46696, 46703, 46709, - 45817, 46714, 46718, 15729, 15738, 15747, 15756, 15765, 15794, 598, - 15803, 46724, 46729, 46732, 46738, 46746, 1327, 46751, 46755, 46760, - 46765, 46770, 46777, 46783, 46787, 46792, 46798, 46802, 35446, 46807, - 46812, 46821, 46828, 46838, 46844, 31871, 46861, 46870, 46878, 46884, - 46889, 46896, 46902, 46910, 46919, 46927, 46935, 46941, 46945, 46950, - 46958, 32902, 36300, 46964, 46983, 18165, 46997, 47013, 47027, 47033, - 47038, 47043, 47048, 47054, 36306, 47059, 47062, 47069, 47076, 47085, - 47090, 47094, 429, 3088, 47101, 47106, 47111, 30992, 46899, 47115, 47120, - 47128, 47132, 47135, 47140, 47146, 47152, 47157, 47161, 31938, 47164, - 47169, 47173, 47176, 47181, 47185, 47190, 47195, 47199, 47204, 47208, - 47212, 47216, 23956, 23967, 47221, 47226, 47232, 47237, 47243, 30579, - 47248, 47252, 47255, 47261, 47266, 47271, 47276, 47281, 47286, 47291, - 47296, 47301, 47307, 47313, 24053, 18468, 47318, 47323, 47328, 47333, - 47338, 47343, 47348, 47353, 450, 68, 35459, 35464, 35469, 35475, 35480, - 35485, 47358, 35489, 47362, 47366, 47370, 35494, 35500, 47384, 35511, - 35516, 47392, 47397, 35522, 47402, 47407, 47416, 47421, 47426, 47435, - 47441, 47447, 47453, 35539, 47466, 47475, 47481, 35543, 47485, 35548, - 47490, 35553, 35558, 47493, 47498, 47502, 47508, 15505, 47515, 15515, - 47522, 47527, 35563, 47531, 47536, 47541, 47546, 47551, 47555, 47560, - 47565, 47571, 47576, 47581, 47587, 47593, 47598, 47602, 47607, 47612, - 47617, 47621, 47626, 47631, 47636, 47642, 47648, 47654, 47659, 47663, - 47668, 47672, 35567, 35572, 35577, 47676, 47680, 47685, 47689, 47701, - 35582, 35588, 35594, 35606, 47707, 29562, 47711, 47716, 47720, 47725, - 47732, 47737, 47742, 47747, 47751, 47755, 47765, 47770, 47775, 47779, - 47783, 47786, 47794, 47799, 35654, 47803, 1419, 47809, 47814, 47820, - 47828, 47832, 47841, 47849, 47853, 47857, 47865, 47871, 47879, 47895, - 47899, 47903, 47907, 47912, 47918, 47933, 35691, 1723, 13853, 47937, - 1306, 1321, 47949, 47957, 47964, 47969, 47976, 47981, 10347, 994, 2574, - 11717, 47988, 10245, 47993, 47996, 48005, 1214, 48010, 45983, 48017, - 48026, 48031, 48035, 48043, 25573, 2626, 48050, 12217, 48060, 48066, - 2368, 2378, 48075, 48084, 48094, 48105, 3494, 39085, 48110, 11781, 4220, - 19227, 1219, 48114, 48122, 48129, 48134, 48138, 48142, 27161, 46304, - 11808, 48150, 48159, 48168, 48176, 48183, 48194, 48199, 48212, 48225, - 48237, 48249, 48261, 48272, 48285, 48296, 48307, 48317, 48325, 48333, - 48345, 48357, 48368, 48377, 48385, 48392, 48404, 48411, 48417, 48426, - 48433, 48446, 48451, 48461, 48466, 48472, 48477, 43329, 48481, 48488, - 48492, 48499, 48507, 48514, 2587, 48521, 48532, 48542, 48551, 48559, - 48569, 48577, 48586, 48596, 48605, 48610, 48616, 48622, 4069, 48633, - 48643, 48652, 48661, 48669, 48679, 48687, 48696, 48701, 48706, 48711, - 1648, 47, 48719, 48727, 48738, 48749, 18854, 48759, 48763, 48770, 48776, - 48781, 48785, 48796, 48806, 48815, 48826, 19266, 19271, 48831, 48840, - 48845, 48855, 48860, 48868, 48876, 48883, 48889, 1610, 294, 48893, 48899, - 48904, 48907, 2120, 46111, 48915, 48919, 48922, 1464, 48928, 15994, 1224, - 48933, 48946, 2716, 2737, 48960, 48972, 48984, 2751, 2768, 2783, 2799, - 2816, 48998, 49010, 2831, 49024, 1230, 1236, 1242, 12088, 49029, 49034, - 49039, 49043, 49058, 49073, 49088, 49103, 49118, 49133, 49148, 49163, - 49178, 49193, 49208, 49223, 49238, 49253, 49268, 49283, 49298, 49313, - 49328, 49343, 49358, 49373, 49388, 49403, 49418, 49433, 49448, 49463, - 49478, 49493, 49508, 49523, 49538, 49553, 49568, 49583, 49598, 49613, - 49628, 49643, 49658, 49673, 49688, 49703, 49718, 49733, 49748, 49763, - 49778, 49793, 49808, 49823, 49838, 49853, 49868, 49883, 49898, 49913, - 49928, 49943, 49958, 49973, 49988, 50003, 50018, 50033, 50048, 50063, - 50078, 50093, 50108, 50123, 50138, 50153, 50168, 50183, 50198, 50213, - 50228, 50243, 50258, 50273, 50288, 50303, 50318, 50333, 50348, 50363, - 50378, 50393, 50408, 50423, 50438, 50453, 50468, 50483, 50498, 50513, - 50528, 50543, 50558, 50573, 50588, 50603, 50618, 50633, 50648, 50663, - 50678, 50693, 50708, 50723, 50738, 50753, 50768, 50783, 50798, 50813, - 50828, 50843, 50858, 50873, 50888, 50903, 50918, 50933, 50948, 50963, - 50978, 50993, 51008, 51023, 51038, 51053, 51068, 51083, 51098, 51113, - 51128, 51143, 51158, 51173, 51188, 51203, 51218, 51233, 51248, 51263, - 51278, 51293, 51308, 51323, 51338, 51353, 51368, 51383, 51398, 51413, - 51428, 51443, 51458, 51473, 51488, 51503, 51518, 51533, 51548, 51563, - 51578, 51593, 51608, 51623, 51638, 51653, 51668, 51683, 51698, 51713, - 51728, 51743, 51758, 51773, 51788, 51803, 51818, 51833, 51848, 51863, - 51878, 51893, 51908, 51923, 51938, 51953, 51968, 51983, 51998, 52013, - 52028, 52043, 52058, 52073, 52088, 52103, 52118, 52133, 52148, 52163, - 52178, 52193, 52208, 52223, 52238, 52253, 52268, 52283, 52298, 52313, - 52328, 52343, 52358, 52373, 52388, 52403, 52418, 52433, 52448, 52463, - 52478, 52493, 52508, 52523, 52538, 52553, 52568, 52583, 52598, 52613, - 52628, 52643, 52658, 52673, 52688, 52703, 52718, 52733, 52748, 52763, - 52778, 52793, 52808, 52823, 52838, 52853, 52868, 52883, 52898, 52913, - 52928, 52943, 52958, 52973, 52988, 53003, 53018, 53033, 53048, 53063, - 53078, 53093, 53108, 53123, 53138, 53153, 53168, 53183, 53198, 53213, - 53228, 53243, 53258, 53273, 53288, 53303, 53318, 53333, 53348, 53363, - 53378, 53393, 53408, 53423, 53438, 53453, 53468, 53483, 53498, 53513, - 53528, 53543, 53558, 53573, 53588, 53603, 53618, 53633, 53648, 53663, - 53678, 53693, 53708, 53723, 53738, 53753, 53768, 53783, 53798, 53813, - 53828, 53843, 53858, 53873, 53888, 53903, 53918, 53933, 53948, 53963, - 53978, 53993, 54008, 54023, 54038, 54053, 54068, 54083, 54098, 54113, - 54128, 54143, 54158, 54173, 54188, 54203, 54218, 54233, 54248, 54263, - 54278, 54293, 54308, 54323, 54338, 54353, 54368, 54383, 54398, 54413, - 54428, 54443, 54458, 54473, 54488, 54503, 54518, 54533, 54548, 54563, - 54578, 54593, 54608, 54623, 54638, 54653, 54668, 54683, 54698, 54713, - 54728, 54743, 54758, 54773, 54788, 54803, 54818, 54833, 54848, 54863, - 54878, 54893, 54908, 54923, 54938, 54953, 54968, 54983, 54998, 55013, - 55028, 55043, 55058, 55073, 55088, 55103, 55118, 55133, 55148, 55163, - 55178, 55193, 55208, 55223, 55238, 55253, 55268, 55283, 55298, 55313, - 55328, 55343, 55358, 55373, 55388, 55403, 55418, 55433, 55448, 55463, - 55478, 55493, 55508, 55523, 55538, 55553, 55568, 55583, 55598, 55613, - 55628, 55643, 55658, 55673, 55688, 55703, 55718, 55733, 55748, 55763, - 55778, 55793, 55808, 55823, 55838, 55853, 55868, 55883, 55898, 55913, - 55928, 55943, 55958, 55973, 55988, 56003, 56018, 56033, 56048, 56063, - 56078, 56093, 56108, 56123, 56138, 56153, 56168, 56183, 56198, 56213, - 56228, 56243, 56258, 56273, 56288, 56303, 56318, 56333, 56348, 56363, - 56378, 56393, 56408, 56423, 56438, 56453, 56468, 56483, 56498, 56513, - 56528, 56543, 56558, 56573, 56588, 56603, 56618, 56633, 56648, 56663, - 56678, 56693, 56708, 56723, 56738, 56753, 56768, 56783, 56798, 56813, - 56828, 56843, 56858, 56874, 56890, 56906, 56922, 56938, 56954, 56970, - 56986, 57002, 57018, 57034, 57050, 57066, 57082, 57098, 57114, 57130, - 57146, 57162, 57178, 57194, 57210, 57226, 57242, 57258, 57274, 57290, - 57306, 57322, 57338, 57354, 57370, 57386, 57402, 57418, 57434, 57450, - 57466, 57482, 57498, 57514, 57530, 57546, 57562, 57578, 57594, 57610, - 57626, 57642, 57658, 57674, 57690, 57706, 57722, 57738, 57754, 57770, - 57786, 57802, 57818, 57834, 57850, 57866, 57882, 57898, 57914, 57930, - 57946, 57962, 57978, 57994, 58010, 58026, 58042, 58058, 58074, 58090, - 58106, 58122, 58138, 58154, 58170, 58186, 58202, 58218, 58234, 58250, - 58266, 58282, 58298, 58314, 58330, 58346, 58362, 58378, 58394, 58410, - 58426, 58442, 58458, 58474, 58490, 58506, 58522, 58538, 58554, 58570, - 58586, 58602, 58618, 58634, 58650, 58666, 58682, 58698, 58714, 58730, - 58746, 58762, 58778, 58794, 58810, 58826, 58842, 58858, 58874, 58890, - 58906, 58922, 58938, 58954, 58970, 58986, 59002, 59018, 59034, 59050, - 59066, 59082, 59098, 59114, 59130, 59146, 59162, 59178, 59194, 59210, - 59226, 59242, 59258, 59274, 59290, 59306, 59322, 59338, 59354, 59370, - 59386, 59402, 59418, 59434, 59450, 59466, 59482, 59498, 59514, 59530, - 59546, 59562, 59578, 59594, 59610, 59626, 59642, 59658, 59674, 59690, - 59706, 59722, 59738, 59754, 59770, 59786, 59802, 59818, 59834, 59850, - 59866, 59882, 59898, 59914, 59930, 59946, 59962, 59978, 59994, 60010, - 60026, 60042, 60058, 60074, 60090, 60106, 60122, 60138, 60154, 60170, - 60186, 60202, 60218, 60234, 60250, 60266, 60282, 60298, 60314, 60330, - 60346, 60362, 60378, 60394, 60410, 60426, 60442, 60458, 60474, 60490, - 60506, 60522, 60538, 60554, 60570, 60586, 60602, 60618, 60634, 60650, - 60666, 60682, 60698, 60714, 60730, 60746, 60762, 60778, 60794, 60810, - 60826, 60842, 60858, 60874, 60890, 60906, 60922, 60938, 60954, 60970, - 60986, 61002, 61018, 61034, 61050, 61066, 61082, 61098, 61114, 61130, - 61146, 61162, 61178, 61194, 61210, 61226, 61242, 61258, 61274, 61290, - 61306, 61322, 61338, 61354, 61370, 61386, 61402, 61418, 61434, 61450, - 61466, 61482, 61498, 61514, 61530, 61546, 61562, 61578, 61594, 61610, - 61626, 61642, 61658, 61674, 61690, 61706, 61722, 61738, 61754, 61770, - 61786, 61802, 61818, 61834, 61850, 61866, 61882, 61898, 61914, 61930, - 61946, 61962, 61978, 61994, 62010, 62026, 62042, 62058, 62074, 62090, - 62106, 62122, 62138, 62154, 62170, 62186, 62202, 62218, 62234, 62250, - 62266, 62282, 62298, 62314, 62330, 62346, 62362, 62378, 62394, 62410, - 62426, 62442, 62458, 62474, 62490, 62506, 62522, 62538, 62554, 62570, - 62586, 62602, 62618, 62634, 62650, 62666, 62682, 62698, 62714, 62730, - 62746, 62762, 62778, 62794, 62810, 62826, 62842, 62858, 62874, 62890, - 62906, 62922, 62938, 62954, 62970, 62986, 63002, 63018, 63034, 63050, - 63066, 63082, 63098, 63114, 63130, 63146, 63162, 63178, 63194, 63210, - 63226, 63242, 63258, 63274, 63290, 63306, 63322, 63338, 63354, 63370, - 63386, 63402, 63418, 63434, 63450, 63466, 63482, 63498, 63514, 63530, - 63546, 63562, 63578, 63594, 63610, 63626, 63642, 63658, 63674, 63690, - 63706, 63722, 63738, 63754, 63770, 63786, 63802, 63818, 63834, 63850, - 63866, 63882, 63898, 63914, 63930, 63946, 63962, 63978, 63994, 64010, - 64026, 64042, 64058, 64074, 64090, 64106, 64122, 64138, 64154, 64170, - 64186, 64202, 64218, 64234, 64250, 64266, 64282, 64298, 64314, 64330, - 64346, 64362, 64378, 64394, 64410, 64426, 64442, 64458, 64474, 64490, - 64506, 64522, 64538, 64554, 64570, 64586, 64602, 64618, 64634, 64650, - 64666, 64682, 64698, 64714, 64730, 64746, 64762, 64778, 64794, 64810, - 64826, 64842, 64858, 64874, 64890, 64906, 64922, 64938, 64954, 64970, - 64986, 65002, 65018, 65034, 65050, 65066, 65082, 65098, 65114, 65130, - 65146, 65162, 65178, 65194, 65210, 65226, 65242, 65258, 65274, 65290, - 65306, 65322, 65338, 65354, 65370, 65386, 65402, 65418, 65434, 65450, - 65466, 65482, 65498, 65514, 65530, 65539, 65554, 16826, 65563, 65568, - 65574, 65580, 65590, 65598, 17079, 17750, 11193, 65611, 1472, 1476, - 65619, 4149, 31107, 7809, 65625, 65630, 65635, 65640, 65645, 65651, - 65656, 65662, 65667, 65673, 65678, 65683, 65688, 65693, 65699, 65704, - 65709, 65714, 65719, 65724, 65729, 65734, 65740, 65745, 65751, 65758, - 2630, 65763, 65769, 9257, 65773, 65778, 65785, 65793, 4160, 4165, 4170, - 4175, 65, 65797, 65803, 65808, 65813, 65817, 65822, 65826, 65830, 12160, - 65834, 65844, 65857, 65868, 65881, 65888, 65894, 65902, 11642, 65909, - 65914, 65920, 65926, 65932, 65937, 65942, 65947, 65952, 65956, 65961, - 65966, 65971, 65977, 65983, 65989, 65994, 65998, 66003, 66008, 66012, - 66017, 66022, 66027, 66031, 12176, 12187, 12192, 1515, 66035, 66041, - 1520, 18699, 66046, 18708, 66051, 66057, 66062, 1551, 66068, 1557, 1563, - 12222, 66073, 66082, 66090, 66098, 66105, 66109, 66113, 66119, 66124, - 35102, 66129, 66136, 66143, 66148, 66152, 66156, 66165, 66170, 66175, - 66180, 1568, 259, 66185, 66189, 18834, 1012, 66193, 66200, 66205, 66209, - 18870, 1572, 43486, 66212, 66217, 66227, 66236, 66241, 66245, 66251, - 1577, 46258, 66256, 66265, 66271, 66276, 66281, 12442, 12448, 66287, - 66299, 66316, 66333, 66350, 66367, 66384, 66401, 66418, 66435, 66452, - 66469, 66486, 66503, 66520, 66537, 66554, 66571, 66588, 66605, 66622, - 66639, 66656, 66673, 66690, 66707, 66724, 66741, 66758, 66775, 66792, - 66809, 66826, 66843, 66860, 66877, 66894, 66911, 66928, 66945, 66962, - 66979, 66996, 67013, 67030, 67047, 67064, 67081, 67098, 67115, 67132, - 67143, 67153, 67158, 1582, 67162, 67167, 67173, 67178, 67183, 67190, - 10264, 1587, 67196, 67205, 31468, 67210, 67221, 12459, 67231, 67236, - 67242, 67247, 67254, 67260, 67265, 1592, 19158, 67270, 67276, 12469, - 67282, 67287, 67292, 67297, 67302, 67307, 67312, 67317, 1597, 12474, - 67322, 67327, 67333, 67338, 67343, 67348, 67353, 67358, 67363, 67368, - 67373, 67379, 67385, 67391, 67396, 67400, 67405, 67410, 67414, 67419, - 67424, 67429, 67434, 67438, 67443, 67449, 67454, 67459, 67463, 67468, - 67473, 67479, 67484, 67489, 67495, 67501, 67506, 67510, 67515, 67520, - 67525, 67529, 67534, 67539, 67544, 67550, 67556, 67561, 67565, 67569, - 67574, 67579, 67584, 33081, 67588, 67593, 67598, 67604, 67609, 67614, - 67618, 67623, 67628, 67634, 67639, 67644, 67650, 67656, 67661, 67665, - 67670, 67675, 67679, 67684, 67689, 67694, 67700, 67706, 67711, 67715, - 67720, 67725, 67729, 67734, 67739, 67744, 67749, 67753, 67756, 67759, - 67764, 67769, 35818, 67776, 67784, 67790, 3826, 31411, 67803, 67810, - 67816, 4000, 67822, 12580, 67828, 67838, 67853, 67861, 12585, 67872, - 67877, 67888, 67900, 67912, 67924, 2822, 67936, 67941, 67953, 67957, - 67963, 67969, 67974, 67983, 67990, 67995, 68000, 68005, 68010, 68015, - 68020, 1614, 18337, 68025, 68030, 46324, 68034, 68038, 68043, 68047, - 19306, 68052, 68055, 68060, 68068, 68076, 1618, 12621, 12627, 1623, - 68084, 68091, 68096, 68105, 68115, 68122, 68127, 68132, 1628, 68139, - 68144, 19426, 68148, 68153, 68160, 68166, 68170, 68176, 68187, 68197, - 68204, 19448, 10158, 10165, 4223, 4229, 68211, 1633, 68216, 68225, 68231, - 68239, 68246, 68252, 68259, 68271, 68277, 68282, 68294, 68305, 68314, - 68324, 68334, 4128, 68342, 34896, 34905, 19488, 68355, 68360, 68365, - 68370, 68375, 68380, 68385, 1638, 1642, 68390, 68394, 68397, 68408, - 68413, 1652, 68421, 68426, 68431, 19547, 68443, 68446, 68452, 68458, - 68463, 68471, 1657, 68476, 68481, 68489, 68497, 68504, 68513, 68521, - 68530, 68534, 1662, 68543, 1667, 24133, 68548, 68555, 68561, 19634, - 68569, 68579, 68585, 68590, 68598, 68605, 68614, 68622, 68632, 68641, - 68651, 68660, 68671, 68681, 68691, 68700, 68710, 68724, 68737, 68746, - 68754, 68764, 68773, 68785, 68796, 68807, 68817, 18932, 68822, 12773, - 68831, 68837, 68842, 68849, 68856, 68862, 18543, 68872, 68878, 68883, - 68894, 68899, 68907, 12790, 12795, 68915, 68921, 68925, 68933, 4218, - 19710, 46412, 68938, 68944, 68949, 68957, 68964, 13834, 68969, 68975, - 68981, 1678, 68986, 68989, 68995, 69000, 69005, 69010, 69015, 69020, - 69025, 69030, 69035, 69041, 69047, 1385, 69052, 69057, 69062, 69068, - 69073, 69078, 69083, 69088, 69093, 69098, 1687, 13, 69104, 69108, 69113, - 69117, 69121, 69125, 36099, 69130, 26378, 69135, 69140, 69144, 69147, - 69151, 69155, 69160, 69164, 69169, 69173, 69179, 39553, 39558, 39563, - 69182, 69189, 69195, 69203, 46036, 69213, 39569, 36363, 36114, 36120, - 39585, 36126, 69218, 69223, 69227, 36396, 69234, 69237, 69241, 69249, - 69256, 69259, 69264, 69269, 69273, 69277, 69280, 69290, 69302, 69309, - 69315, 36131, 69322, 37978, 69325, 9274, 1098, 69328, 69332, 69337, 4043, - 69341, 69344, 15548, 69351, 69358, 69371, 69379, 69388, 69397, 69403, - 69408, 69418, 69431, 69443, 69450, 69455, 69464, 69477, 41190, 69495, - 69500, 69507, 69513, 69518, 836, 69523, 69531, 69538, 69545, 30933, 856, - 69551, 69557, 69567, 69575, 69581, 69586, 36150, 6593, 36164, 69590, - 69600, 69605, 69613, 69623, 69638, 69644, 69650, 36174, 69655, 35244, - 69659, 69664, 69671, 69676, 69680, 69685, 69693, 19491, 69700, 69705, - 69709, 6634, 36200, 69713, 69719, 340, 69729, 69736, 69743, 69749, 69756, - 69761, 69770, 15174, 66221, 66231, 69776, 69784, 69788, 69792, 69796, - 69800, 69805, 69809, 69815, 69823, 69828, 69833, 69840, 69845, 69849, - 69854, 69858, 69862, 69868, 69874, 69879, 69883, 69888, 69892, 36324, - 69896, 36330, 36336, 69901, 69907, 69914, 69919, 69923, 35261, 19151, - 69926, 69930, 69935, 69942, 69948, 69952, 69957, 45680, 69963, 69967, - 69974, 69978, 69983, 69989, 69995, 70001, 70013, 70022, 70032, 70038, - 70045, 70050, 70055, 70059, 70062, 70068, 70075, 70080, 70085, 70092, - 70099, 70106, 70112, 70117, 70122, 70130, 36341, 2462, 70135, 70140, - 70146, 70151, 70157, 70162, 70167, 70172, 70178, 36362, 70183, 70189, - 70195, 70201, 36432, 70206, 70211, 70216, 36443, 70221, 70226, 70231, - 70237, 70243, 36448, 70248, 70253, 70258, 36503, 36509, 70263, 70268, - 36514, 36536, 31734, 36542, 36546, 70273, 13535, 70277, 70285, 70291, - 70299, 70306, 70312, 70322, 70328, 70335, 12060, 36560, 70341, 70354, - 70363, 70369, 70378, 70384, 70390, 70397, 26721, 70405, 70412, 70422, - 70430, 70433, 36504, 70438, 70445, 70450, 70454, 70458, 70463, 70467, - 4343, 70472, 70477, 70482, 39647, 39652, 70486, 39666, 70491, 39671, - 70496, 70502, 39683, 39689, 39695, 70507, 70513, 25622, 70524, 70527, - 70539, 70547, 36583, 70551, 70560, 70570, 70579, 36593, 70584, 70591, - 70600, 70606, 70614, 70621, 6685, 4934, 70626, 36515, 70632, 70635, - 70641, 70648, 70653, 70658, 26625, 70662, 70668, 70674, 70679, 70684, - 70688, 70694, 70700, 37884, 1068, 40805, 42610, 42616, 36624, 36629, - 70705, 70709, 70713, 70716, 70729, 70735, 70739, 70742, 70747, 38221, - 70751, 35266, 24074, 70757, 6614, 6622, 9964, 70760, 70765, 70770, 70775, - 70780, 70785, 70790, 70795, 70800, 70805, 70811, 70816, 70821, 70827, - 70832, 70837, 70842, 70847, 70852, 70857, 70863, 70868, 70874, 70879, - 70884, 70889, 70894, 70899, 70904, 70909, 70914, 70919, 70924, 70930, - 70935, 70940, 70945, 70950, 70955, 70960, 70966, 70971, 70976, 70981, - 70986, 70991, 70996, 71001, 71006, 71011, 71017, 71022, 71027, 71032, - 71037, 71043, 71049, 71054, 71060, 71065, 71070, 71075, 71080, 71085, - 1465, 156, 71090, 71094, 71098, 71102, 28502, 71106, 71110, 71115, 71119, - 71124, 71128, 71133, 71138, 71143, 71147, 71151, 71156, 71160, 15253, - 71165, 71169, 71176, 71186, 17419, 71195, 71204, 71208, 71213, 71218, - 71222, 71226, 28290, 3171, 71230, 71236, 19992, 71240, 71249, 71257, - 71263, 71268, 71280, 71292, 71297, 71301, 71306, 71310, 71316, 71322, - 71327, 71337, 71347, 71353, 71361, 71366, 71370, 71376, 71381, 71388, - 71394, 71399, 71408, 71417, 71425, 71429, 17901, 71432, 71441, 71449, - 71461, 71472, 71483, 71492, 71496, 71505, 71513, 71523, 71531, 71538, - 71544, 71549, 71556, 71565, 71571, 71576, 71583, 71589, 71600, 60, 35039, - 71606, 29853, 29863, 71612, 71620, 71627, 71633, 71637, 71647, 71658, - 71666, 71675, 71680, 71685, 71690, 71694, 71698, 19939, 71706, 71710, - 71716, 71726, 71733, 71739, 71745, 39746, 71749, 71751, 71754, 71760, - 71764, 71775, 71785, 71791, 71798, 71805, 15190, 71813, 71819, 71828, - 71837, 71843, 11064, 71849, 71855, 71860, 71865, 71872, 71877, 71884, - 71890, 71895, 71903, 71916, 71925, 71934, 68686, 68696, 71944, 71950, - 71956, 71962, 71969, 71976, 71983, 71990, 71997, 72002, 72006, 72010, - 72013, 72023, 72027, 72039, 72048, 72052, 72063, 72068, 72072, 68705, - 72078, 72085, 72094, 72102, 72110, 72115, 72119, 72124, 72129, 72139, - 72147, 72159, 72164, 72168, 72172, 72178, 72186, 72193, 72205, 72213, - 72224, 72231, 72237, 72247, 72253, 72257, 72266, 72275, 72282, 72288, - 72293, 72297, 72301, 72305, 72314, 72323, 72332, 72338, 72344, 72350, - 72355, 72362, 72368, 72376, 72383, 72389, 14298, 72394, 72400, 72404, - 16315, 72408, 72413, 72423, 72428, 72437, 72443, 72449, 72457, 72464, - 72468, 72472, 72479, 72485, 72493, 72500, 72506, 72517, 72521, 72525, - 72529, 72532, 72538, 72543, 72548, 72552, 72556, 72565, 72573, 72580, - 72586, 72593, 27339, 45770, 72598, 72606, 72610, 72614, 72617, 72625, - 72632, 72638, 72647, 72655, 72661, 72666, 72670, 72675, 72680, 72684, - 72688, 72692, 72697, 72706, 72710, 72717, 42719, 72721, 72727, 72731, - 72737, 72745, 72751, 72756, 72767, 72775, 72781, 72790, 25769, 72798, - 72805, 72812, 72819, 72826, 72833, 49218, 15005, 72840, 72847, 72852, - 39782, 4575, 72858, 72863, 72868, 72874, 72880, 72886, 72891, 72896, - 72901, 72906, 72912, 72917, 72923, 72928, 72934, 72939, 72944, 72949, - 72954, 72959, 72964, 72969, 72975, 72980, 72986, 72991, 72996, 73001, - 73006, 73011, 73016, 73022, 73027, 73032, 73037, 73042, 73047, 73052, - 73057, 73062, 73067, 73072, 73078, 73083, 73088, 73093, 73098, 73103, - 73108, 73113, 73118, 73124, 73129, 73134, 73139, 73144, 73149, 73154, - 73159, 73164, 73169, 73174, 73179, 73184, 73190, 1831, 277, 73195, 43604, - 73199, 73202, 73207, 73211, 73214, 3540, 73219, 73224, 73228, 73237, - 73248, 73265, 73283, 73291, 72106, 73298, 73301, 73311, 73318, 73327, - 73343, 73352, 73362, 73367, 73380, 73390, 73399, 73407, 73421, 73429, - 73438, 73442, 73445, 73452, 73458, 73469, 73476, 73488, 73499, 73510, - 73519, 73526, 1225, 767, 73536, 2663, 73540, 73545, 73554, 1032, 8720, - 23528, 73562, 73570, 73584, 73597, 73601, 73606, 73611, 73616, 73622, - 73628, 73633, 9266, 17462, 73638, 73642, 73650, 9688, 73655, 73661, - 73670, 73678, 1695, 12634, 978, 6758, 73682, 73686, 73695, 73705, 2416, - 30657, 73714, 73720, 19398, 30672, 73726, 4423, 13016, 73732, 73739, - 68403, 73743, 73747, 73753, 73758, 73763, 3759, 160, 3785, 73768, 73780, - 73784, 73788, 73794, 73799, 31488, 73803, 13004, 2857, 4, 73808, 73818, - 73829, 73835, 73846, 73853, 73859, 73865, 73873, 73880, 73886, 73896, - 73906, 73916, 73925, 26708, 1237, 73930, 73934, 73938, 73944, 73948, - 2880, 2886, 9263, 2271, 73952, 73956, 73965, 73973, 73984, 73992, 74000, - 74006, 74011, 74022, 74033, 74041, 74047, 74052, 10873, 74062, 74070, - 74074, 74078, 74083, 74087, 74099, 31921, 17364, 74106, 74116, 74122, - 74128, 10975, 74138, 74149, 74160, 74170, 74179, 74183, 74190, 1034, - 1053, 74200, 74205, 74213, 68149, 74221, 74226, 74237, 74244, 74258, - 16146, 499, 74268, 74272, 74276, 74284, 74293, 74301, 19443, 74307, - 74321, 74328, 74334, 74342, 74351, 74358, 74368, 74376, 74383, 74391, - 74398, 4225, 116, 74406, 74417, 74421, 74433, 74439, 13205, 198, 74444, - 10296, 74449, 2925, 74453, 74460, 74466, 74477, 74485, 74492, 9639, - 74499, 74508, 74516, 4303, 74529, 4320, 74533, 74538, 74544, 74549, - 74554, 74559, 2930, 535, 74565, 74578, 74582, 74587, 2935, 1830, 882, - 74591, 4324, 74599, 74605, 74609, 790, 74619, 74628, 74633, 3776, 74637, - 17113, 17120, 52580, 74641, 4355, 4235, 14883, 74649, 74656, 74661, - 26772, 74665, 74672, 74678, 74683, 74688, 17133, 192, 74693, 74705, - 74711, 74719, 2947, 1732, 74727, 74729, 74734, 74739, 74744, 74750, - 74755, 74760, 74765, 74770, 74775, 74780, 74786, 74791, 74796, 74801, - 74806, 74811, 74816, 74821, 74826, 74832, 74837, 74842, 74847, 74853, - 74858, 74864, 74869, 74874, 74879, 74884, 74889, 74894, 74899, 74905, - 74910, 74916, 74921, 74926, 74931, 74936, 74941, 74946, 74951, 74956, - 9335, 9348, 4371, 4376, 4381, 4386, 26, 74962, 74968, 74973, 74978, - 74984, 74989, 74993, 74997, 75002, 75008, 75012, 75018, 75023, 75028, - 75034, 75039, 75043, 75048, 75053, 75057, 75060, 75062, 75066, 75069, - 75076, 75081, 75085, 75090, 75094, 75098, 75102, 75111, 75115, 36854, - 75118, 36859, 75125, 75130, 36864, 75139, 75148, 36870, 75153, 36875, - 75162, 75167, 13248, 75171, 75176, 75181, 36880, 75185, 75194, 47443, - 75198, 75201, 75205, 8934, 75211, 75214, 75219, 75224, 75228, 4058, - 36885, 75231, 75235, 75238, 75249, 75254, 75258, 75264, 75272, 75285, - 75293, 75302, 75308, 75313, 75319, 75323, 75329, 75335, 75343, 75348, - 75352, 75359, 75365, 75373, 75382, 75390, 36888, 75397, 75407, 75416, - 75424, 75437, 75442, 75447, 75451, 75460, 75466, 75473, 75485, 75496, - 75508, 75515, 75524, 75533, 75542, 75549, 75555, 75562, 75570, 75577, - 75585, 75594, 75602, 75609, 75617, 75626, 75634, 75643, 75653, 75662, - 75670, 75677, 75685, 75694, 75702, 75711, 75721, 75730, 75738, 75747, - 75757, 75766, 75776, 75787, 75797, 75806, 75814, 75821, 75829, 75838, - 75846, 75855, 75865, 75874, 75882, 75891, 75901, 75910, 75920, 75931, - 75941, 75950, 75958, 75967, 75977, 75986, 75996, 76007, 76017, 76026, - 76036, 76047, 76057, 76068, 76080, 76091, 76101, 76110, 76118, 76125, - 76133, 76142, 76150, 76159, 76169, 76178, 76186, 76195, 76205, 76214, - 76224, 76235, 76245, 76254, 76262, 76271, 76281, 76290, 76300, 76311, - 76321, 76330, 76340, 76351, 76361, 76372, 76384, 76395, 76405, 76414, - 76422, 76431, 76441, 76450, 76460, 76471, 76481, 76490, 76500, 76511, - 76521, 76532, 76544, 76555, 76565, 76574, 76584, 76595, 76605, 76616, - 76628, 76639, 76649, 76660, 76672, 76683, 76695, 76708, 76720, 76731, - 76741, 76750, 76758, 76765, 76773, 76782, 76790, 76799, 76809, 76818, - 76826, 76835, 76845, 76854, 76864, 76875, 76885, 76894, 76902, 76911, - 76921, 76930, 76940, 76951, 76961, 76970, 76980, 76991, 77001, 77012, - 77024, 77035, 77045, 77054, 77062, 77071, 77081, 77090, 77100, 77111, - 77121, 77130, 77140, 77151, 77161, 77172, 77184, 77195, 77205, 77214, - 77224, 77235, 77245, 77256, 77268, 77279, 77289, 77300, 77312, 77323, - 77335, 77348, 77360, 77371, 77381, 77390, 77398, 77407, 77417, 77426, - 77436, 77447, 77457, 77466, 77476, 77487, 77497, 77508, 77520, 77531, - 77541, 77550, 77560, 77571, 77581, 77592, 77604, 77615, 77625, 77636, - 77648, 77659, 77671, 77684, 77696, 77707, 77717, 77726, 77736, 77747, - 77757, 77768, 77780, 77791, 77801, 77812, 77824, 77835, 77847, 77860, - 77872, 77883, 77893, 77904, 77916, 77927, 77939, 77952, 77964, 77975, - 77987, 78000, 78012, 78025, 78039, 78052, 78064, 78075, 78085, 78094, - 78102, 78109, 78114, 78118, 8751, 78125, 78130, 36898, 78136, 78141, - 36903, 78147, 23657, 29425, 78152, 78158, 78166, 78172, 78178, 78185, - 78192, 78197, 78202, 78206, 78211, 78215, 78218, 78222, 78231, 78240, - 78248, 78254, 78266, 78277, 78281, 3233, 8726, 78286, 78289, 78292, - 78294, 78298, 78302, 78306, 78312, 78317, 29488, 78322, 78326, 78329, - 78334, 78338, 78345, 78351, 78355, 6778, 78359, 36925, 78364, 78371, - 78380, 78388, 78399, 78407, 78416, 78424, 78431, 78438, 78444, 78455, - 36930, 78460, 78471, 78483, 78491, 78502, 78511, 78519, 78530, 78535, - 78543, 2625, 78548, 39152, 78561, 78565, 78577, 78585, 78590, 78598, - 78609, 20157, 78618, 78624, 78631, 78639, 78645, 36940, 78650, 4349, - 65594, 78657, 78660, 78668, 78681, 78694, 78707, 78720, 78727, 78738, - 78747, 78752, 49035, 49040, 78756, 78760, 78768, 78775, 78784, 78792, - 78798, 78807, 78815, 78822, 78830, 78834, 78843, 78852, 78862, 78875, - 78888, 78898, 36945, 78904, 78911, 78917, 78923, 36951, 78928, 78931, - 78935, 78943, 78952, 48818, 78960, 78969, 78977, 78984, 78992, 79002, - 79011, 79020, 38348, 79029, 79040, 79055, 79065, 10329, 24403, 79074, - 79079, 79084, 79088, 18535, 79093, 79098, 79104, 79109, 79114, 79120, - 79125, 79130, 24363, 79135, 79142, 79150, 79158, 79166, 79171, 79178, - 79185, 79190, 2249, 79194, 79198, 79206, 79214, 36968, 79220, 79226, - 79238, 79244, 79251, 79255, 79262, 79267, 79274, 79280, 79287, 79298, - 79308, 79318, 79330, 79336, 79344, 79350, 79360, 79370, 36995, 79379, - 79388, 79394, 79406, 79417, 79424, 79429, 79433, 79441, 79447, 79452, - 79457, 79464, 79472, 79484, 79494, 79503, 79512, 79520, 79527, 38985, - 27133, 79533, 79538, 79542, 79546, 79551, 79559, 79565, 79576, 79589, - 79594, 79601, 37000, 79606, 79618, 79627, 79635, 79645, 79656, 79669, - 79676, 79685, 79694, 79702, 79707, 79713, 1454, 79718, 79723, 79728, - 79733, 79739, 79744, 79749, 79755, 79761, 79766, 79770, 79775, 79780, - 79785, 66161, 79790, 79795, 79800, 79805, 79811, 79817, 79822, 79826, - 79831, 18534, 79836, 79842, 79847, 79853, 79858, 79863, 79868, 79873, - 79877, 79883, 79888, 79897, 79902, 79907, 79912, 79917, 79921, 79928, - 79934, 4666, 19755, 3198, 79939, 79943, 79948, 79952, 79956, 79960, - 52835, 79964, 79889, 79966, 79976, 37009, 79979, 79984, 79993, 79999, - 6747, 37014, 80003, 80009, 80014, 80020, 80025, 80029, 80036, 80041, - 80051, 80060, 80064, 80070, 80076, 80082, 80086, 80094, 80101, 80109, - 80117, 37019, 80124, 80127, 80138, 80145, 80151, 80156, 80160, 80166, - 80174, 80181, 80186, 80190, 80199, 80207, 80213, 80218, 37024, 80225, - 26598, 80237, 80243, 80248, 80254, 80261, 80267, 24096, 31130, 80273, - 80278, 80284, 80288, 80300, 79922, 79929, 24295, 80310, 80315, 80322, - 80328, 80335, 80341, 80352, 80357, 80365, 10034, 80370, 80373, 80379, - 80383, 80387, 80390, 80396, 80402, 36748, 4667, 1469, 15307, 80409, - 80415, 80421, 80427, 80433, 80439, 80445, 80451, 80457, 80462, 80467, - 80472, 80477, 80482, 80487, 80492, 80497, 80502, 80507, 80512, 80517, - 80522, 80528, 80533, 80538, 80544, 80549, 80554, 80560, 80566, 80572, - 80578, 80584, 80590, 80596, 80602, 80608, 80613, 80618, 80624, 80629, - 80634, 80640, 80645, 80650, 80655, 80660, 80665, 80670, 80675, 80680, - 80685, 80690, 80695, 80700, 80706, 80711, 80716, 80721, 80727, 80732, - 80737, 80742, 80747, 80753, 80758, 80763, 80768, 80773, 80778, 80783, - 80788, 80793, 80798, 80803, 80808, 80813, 80818, 80823, 80828, 80833, - 80838, 80843, 80848, 80854, 80859, 80864, 80869, 80874, 80879, 80884, - 80889, 1867, 169, 80894, 80898, 80902, 80907, 80915, 80919, 80926, 80934, - 80938, 80951, 80959, 80964, 80969, 29916, 80973, 80978, 80982, 80987, - 80991, 80999, 81003, 23665, 81008, 81012, 68929, 81016, 81019, 81027, - 81035, 81043, 81048, 81053, 81060, 81067, 81073, 81079, 81084, 81091, - 81096, 81104, 73589, 81111, 81116, 68715, 81123, 81128, 81132, 81139, - 81145, 81152, 68742, 13320, 81160, 81165, 81170, 81174, 81177, 81186, - 81192, 81196, 81206, 81215, 81219, 81222, 81226, 81233, 81246, 81252, - 81260, 81269, 81280, 81291, 81302, 81313, 81322, 81328, 81337, 81345, - 81355, 81368, 81376, 81383, 81394, 81400, 81405, 81410, 81416, 81426, - 81432, 81442, 81450, 81457, 81467, 81476, 79608, 81484, 81490, 81498, - 81504, 72151, 81511, 81516, 81519, 81523, 81529, 81533, 81536, 81544, - 81550, 81556, 81564, 81576, 81588, 81595, 81600, 81604, 81615, 81623, - 81630, 81642, 81650, 81658, 81665, 81671, 81676, 81686, 81695, 81703, - 81708, 81718, 81727, 48099, 81734, 81738, 81743, 81751, 81758, 81764, - 81768, 81778, 81789, 81797, 81804, 81816, 81828, 81837, 78551, 81844, - 81854, 81866, 81877, 81891, 81899, 81909, 81916, 81924, 81937, 81949, - 81958, 81966, 81976, 81987, 81999, 82008, 82018, 82028, 82037, 82044, - 82053, 82068, 82076, 82086, 82095, 82103, 82116, 65564, 82131, 82141, - 82150, 82162, 82172, 82184, 82195, 82209, 82223, 82237, 82251, 82265, - 82279, 82293, 82307, 82321, 82335, 82349, 82363, 82377, 82391, 82405, - 82419, 82433, 82447, 82461, 82475, 82489, 82503, 82517, 82531, 82545, - 82559, 82573, 82587, 82601, 82615, 82629, 82643, 82657, 82671, 82685, - 82699, 82713, 82727, 82741, 82755, 82769, 82783, 82797, 82811, 82825, - 82839, 82853, 82867, 82881, 82895, 82909, 82923, 82937, 82951, 82965, - 82979, 82993, 83007, 83021, 83035, 83049, 83063, 83077, 83091, 83105, - 83119, 83133, 83147, 83161, 83175, 83189, 83203, 83217, 83231, 83245, - 83259, 83273, 83287, 83301, 83315, 83329, 83343, 83357, 83371, 83385, - 83399, 83413, 83427, 83441, 83455, 83469, 83483, 83497, 83511, 83525, - 83539, 83553, 83567, 83581, 83595, 83609, 83623, 83637, 83651, 83665, - 83679, 83693, 83707, 83721, 83735, 83749, 83763, 83777, 83791, 83805, - 83819, 83833, 83847, 83861, 83875, 83889, 83903, 83917, 83931, 83945, - 83959, 83973, 83987, 84001, 84015, 84029, 84043, 84057, 84071, 84085, - 84099, 84113, 84127, 84141, 84155, 84169, 84183, 84197, 84211, 84225, - 84239, 84253, 84267, 84281, 84295, 84309, 84323, 84337, 84351, 84365, - 84379, 84393, 84407, 84421, 84435, 84449, 84463, 84477, 84491, 84505, - 84519, 84533, 84547, 84561, 84575, 84589, 84603, 84617, 84631, 84645, - 84659, 84673, 84687, 84701, 84715, 84729, 84743, 84757, 84771, 84785, - 84799, 84813, 84827, 84841, 84855, 84869, 84883, 84897, 84911, 84925, - 84939, 84953, 84967, 84981, 84995, 85009, 85023, 85037, 85051, 85065, - 85079, 85093, 85107, 85121, 85135, 85149, 85163, 85177, 85191, 85205, - 85219, 85233, 85247, 85261, 85275, 85289, 85303, 85317, 85331, 85345, - 85359, 85373, 85387, 85401, 85415, 85429, 85443, 85457, 85471, 85485, - 85499, 85513, 85527, 85541, 85555, 85569, 85583, 85597, 85611, 85625, - 85639, 85653, 85667, 85681, 85695, 85709, 85723, 85737, 85751, 85765, - 85779, 85793, 85807, 85821, 85835, 85849, 85863, 85877, 85891, 85905, - 85919, 85933, 85947, 85961, 85975, 85989, 86003, 86017, 86031, 86045, - 86059, 86073, 86087, 86101, 86115, 86129, 86143, 86157, 86171, 86185, - 86199, 86213, 86227, 86241, 86255, 86269, 86283, 86297, 86311, 86325, - 86339, 86353, 86367, 86381, 86395, 86409, 86423, 86437, 86451, 86465, - 86479, 86493, 86507, 86521, 86535, 86549, 86563, 86577, 86591, 86605, - 86619, 86633, 86647, 86661, 86675, 86689, 86703, 86717, 86731, 86745, - 86759, 86773, 86787, 86801, 86815, 86829, 86843, 86857, 86871, 86885, - 86899, 86913, 86927, 86941, 86955, 86969, 86983, 86997, 87011, 87025, - 87039, 87053, 87067, 87081, 87095, 87109, 87123, 87137, 87151, 87165, - 87179, 87193, 87207, 87221, 87235, 87249, 87263, 87277, 87291, 87305, - 87319, 87333, 87347, 87361, 87375, 87389, 87403, 87417, 87431, 87445, - 87459, 87473, 87487, 87501, 87515, 87529, 87543, 87557, 87571, 87585, - 87599, 87613, 87627, 87641, 87655, 87669, 87683, 87697, 87711, 87725, - 87739, 87753, 87767, 87781, 87795, 87809, 87823, 87837, 87851, 87865, - 87879, 87893, 87907, 87921, 87935, 87949, 87963, 87977, 87991, 88005, - 88019, 88033, 88047, 88061, 88075, 88089, 88103, 88117, 88131, 88145, - 88159, 88173, 88187, 88201, 88215, 88229, 88243, 88257, 88271, 88285, - 88299, 88313, 88327, 88341, 88355, 88369, 88383, 88397, 88411, 88425, - 88439, 88453, 88467, 88481, 88495, 88509, 88523, 88537, 88551, 88565, - 88579, 88593, 88607, 88621, 88635, 88649, 88663, 88677, 88691, 88705, - 88719, 88733, 88747, 88761, 88775, 88789, 88803, 88817, 88831, 88845, - 88859, 88873, 88887, 88901, 88915, 88929, 88943, 88957, 88971, 88985, - 88999, 89013, 89027, 89041, 89055, 89069, 89083, 89097, 89111, 89125, - 89139, 89153, 89167, 89181, 89195, 89209, 89223, 89237, 89251, 89265, - 89279, 89293, 89307, 89321, 89335, 89349, 89363, 89377, 89391, 89405, - 89419, 89433, 89447, 89461, 89475, 89489, 89503, 89517, 89531, 89545, - 89559, 89573, 89587, 89601, 89615, 89629, 89643, 89657, 89671, 89685, - 89699, 89713, 89727, 89741, 89755, 89769, 89783, 89797, 89811, 89825, - 89839, 89853, 89867, 89881, 89895, 89909, 89923, 89937, 89951, 89965, - 89979, 89993, 90007, 90021, 90035, 90049, 90063, 90077, 90091, 90105, - 90119, 90133, 90147, 90161, 90175, 90189, 90203, 90217, 90231, 90245, - 90259, 90273, 90287, 90301, 90315, 90329, 90343, 90357, 90371, 90385, - 90399, 90413, 90427, 90441, 90455, 90469, 90483, 90497, 90511, 90525, - 90539, 90553, 90567, 90581, 90595, 90609, 90623, 90637, 90651, 90665, - 90679, 90693, 90707, 90721, 90735, 90749, 90763, 90777, 90791, 90805, - 90819, 90833, 90847, 90861, 90875, 90889, 90903, 90917, 90931, 90945, - 90959, 90973, 90987, 91001, 91015, 91029, 91043, 91057, 91071, 91085, - 91099, 91113, 91127, 91141, 91155, 91169, 91183, 91197, 91211, 91225, - 91239, 91253, 91267, 91281, 91295, 91309, 91323, 91337, 91351, 91365, - 91379, 91393, 91407, 91421, 91435, 91449, 91463, 91477, 91491, 91505, - 91519, 91533, 91547, 91561, 91575, 91589, 91603, 91617, 91631, 91645, - 91659, 91673, 91687, 91701, 91715, 91729, 91743, 91757, 91771, 91785, - 91799, 91813, 91827, 91841, 91855, 91869, 91883, 91897, 91911, 91925, - 91939, 91953, 91967, 91981, 91995, 92009, 92023, 92037, 92051, 92065, - 92079, 92093, 92107, 92121, 92135, 92149, 92163, 92177, 92191, 92205, - 92219, 92233, 92247, 92261, 92275, 92289, 92303, 92317, 92331, 92345, - 92359, 92373, 92387, 92401, 92415, 92429, 92443, 92457, 92471, 92485, - 92499, 92513, 92527, 92541, 92555, 92569, 92583, 92597, 92611, 92625, - 92639, 92653, 92667, 92681, 92695, 92709, 92723, 92737, 92751, 92765, - 92774, 92785, 92796, 92806, 92817, 92825, 92833, 92839, 92849, 92857, - 92863, 32967, 92868, 92874, 92883, 92895, 92900, 92907, 10887, 20177, - 92913, 92922, 92927, 92931, 92938, 92944, 92949, 92954, 92962, 92970, - 92975, 92983, 13774, 92987, 92990, 92992, 93007, 93020, 93027, 93033, - 93044, 93049, 93053, 93058, 93065, 93071, 93076, 93084, 74162, 74172, - 93090, 93097, 93107, 12047, 93114, 93119, 33201, 93128, 93133, 93140, - 93150, 93158, 93166, 93175, 93184, 93190, 93196, 93203, 93210, 93215, - 93219, 93227, 68759, 93232, 93241, 93249, 93256, 93261, 93265, 93274, - 93280, 93283, 93287, 93296, 93306, 80946, 93315, 93319, 93327, 93331, - 93337, 93348, 93358, 20186, 93369, 93378, 93386, 93394, 93401, 68778, - 9496, 93409, 93413, 93422, 93429, 93432, 31011, 93435, 93439, 93444, - 93461, 93473, 12005, 93485, 93490, 93495, 93500, 23755, 93504, 93509, - 93514, 93520, 93525, 6392, 93530, 23759, 93535, 93540, 93546, 93553, - 93558, 93563, 93569, 93575, 93581, 93586, 93592, 93596, 93610, 93618, - 93626, 93632, 93637, 93644, 93654, 93663, 93668, 93673, 93678, 93686, - 93697, 93702, 93708, 93713, 93722, 67278, 93727, 93730, 93748, 93767, - 93780, 93794, 93810, 93817, 93824, 93833, 93840, 93846, 93853, 93858, - 93864, 93870, 93878, 93884, 93889, 93894, 93910, 12018, 93924, 93931, - 93939, 93945, 93949, 93952, 93957, 93962, 93969, 93974, 93983, 93989, - 93994, 94000, 94006, 94015, 94024, 40655, 94029, 94037, 94046, 13389, - 94055, 94061, 94069, 94075, 94081, 94087, 94092, 94099, 94105, 13400, - 94110, 94113, 94118, 37051, 94128, 94137, 94142, 94148, 94153, 94161, - 94168, 94179, 94195, 94211, 94227, 94243, 94259, 94275, 94291, 94307, - 94323, 94339, 94355, 94371, 94387, 94403, 94419, 94435, 94451, 94467, - 94483, 94499, 94515, 94531, 94547, 94563, 94579, 94595, 94611, 94627, - 94643, 94659, 94675, 94691, 94707, 94723, 94739, 94755, 94771, 94787, - 94803, 94819, 94835, 94851, 94867, 94883, 94899, 94915, 94931, 94947, - 94963, 94979, 94995, 95011, 95027, 95043, 95059, 95075, 95091, 95107, - 95123, 95139, 95155, 95171, 95187, 95203, 95219, 95235, 95251, 95267, - 95283, 95299, 95315, 95331, 95347, 95363, 95379, 95395, 95411, 95427, - 95443, 95459, 95475, 95491, 95507, 95523, 95539, 95555, 95571, 95587, - 95603, 95619, 95635, 95651, 95667, 95683, 95699, 95715, 95731, 95747, - 95763, 95779, 95795, 95811, 95827, 95843, 95859, 95875, 95891, 95907, - 95923, 95939, 95955, 95971, 95987, 96003, 96019, 96035, 96051, 96067, - 96083, 96099, 96115, 96131, 96147, 96163, 96179, 96195, 96211, 96227, - 96243, 96259, 96275, 96291, 96307, 96323, 96339, 96355, 96371, 96387, - 96403, 96419, 96435, 96451, 96467, 96483, 96499, 96515, 96531, 96547, - 96563, 96579, 96595, 96611, 96627, 96643, 96659, 96675, 96691, 96707, - 96723, 96739, 96755, 96771, 96787, 96803, 96819, 96835, 96851, 96867, - 96883, 96899, 96915, 96931, 96947, 96963, 96979, 96995, 97011, 97027, - 97043, 97059, 97075, 97091, 97107, 97123, 97139, 97155, 97171, 97187, - 97203, 97219, 97235, 97251, 97267, 97283, 97299, 97315, 97331, 97347, - 97363, 97379, 97395, 97411, 97427, 97443, 97459, 97475, 97491, 97507, - 97523, 97539, 97555, 97571, 97587, 97603, 97619, 97635, 97651, 97667, - 97683, 97699, 97715, 97731, 97747, 97763, 97779, 97795, 97811, 97827, - 97843, 97859, 97875, 97891, 97907, 97923, 97939, 97955, 97971, 97987, - 98003, 98019, 98035, 98051, 98067, 98083, 98099, 98115, 98131, 98147, - 98163, 98179, 98195, 98211, 98227, 98243, 98259, 98275, 98291, 98307, - 98323, 98339, 98355, 98371, 98387, 98403, 98419, 98435, 98451, 98467, - 98483, 98499, 98515, 98531, 98547, 98563, 98579, 98595, 98611, 98627, - 98643, 98659, 98675, 98691, 98707, 98723, 98739, 98755, 98771, 98787, - 98803, 98819, 98835, 98851, 98867, 98883, 98899, 98915, 98931, 98947, - 98963, 98979, 98995, 99011, 99027, 99043, 99059, 99075, 99091, 99107, - 99123, 99139, 99155, 99171, 99187, 99203, 99219, 99235, 99251, 99267, - 99283, 99299, 99315, 99331, 99347, 99363, 99379, 99395, 99411, 99427, - 99443, 99459, 99475, 99491, 99507, 99523, 99539, 99555, 99571, 99587, - 99603, 99619, 99635, 99651, 99667, 99683, 99699, 99715, 99731, 99747, - 99763, 99779, 99795, 99811, 99827, 99843, 99859, 99875, 99891, 99907, - 99923, 99939, 99955, 99971, 99987, 100003, 100019, 100035, 100051, - 100067, 100083, 100099, 100115, 100131, 100147, 100163, 100179, 100195, - 100211, 100227, 100243, 100259, 100275, 100291, 100307, 100323, 100339, - 100355, 100371, 100387, 100403, 100419, 100435, 100451, 100467, 100483, - 100499, 100515, 100525, 100530, 100538, 73512, 100543, 100549, 100554, - 100561, 100570, 100578, 100582, 100588, 100594, 100601, 100607, 100611, - 19509, 43700, 3207, 100616, 100620, 100624, 100630, 100639, 100645, - 100652, 100656, 100677, 100699, 100715, 100732, 100751, 100760, 100770, - 100778, 100785, 100792, 100798, 30872, 100812, 100816, 100822, 100830, - 100842, 100848, 100856, 100863, 100868, 100873, 100877, 100885, 100892, - 100896, 100902, 100908, 100913, 3865, 49235, 100919, 100923, 100927, - 100931, 100936, 100941, 100946, 100952, 100958, 100964, 100971, 100977, - 100984, 100990, 100996, 101001, 101007, 101012, 101016, 101021, 101025, - 101030, 49250, 101034, 101039, 101047, 101051, 101056, 101063, 101072, - 101078, 101087, 101091, 101098, 101102, 101105, 101112, 101118, 101127, - 101137, 101147, 101152, 101156, 101163, 101171, 101180, 101184, 101192, - 101198, 101203, 101208, 101214, 101220, 101225, 101229, 101235, 101240, - 101244, 101248, 101251, 101256, 101264, 101274, 101280, 101285, 101295, - 46436, 101303, 101315, 101321, 101328, 101334, 101338, 101344, 101356, - 101367, 101374, 101380, 101387, 101394, 101406, 101413, 101419, 23839, - 101423, 101431, 101437, 101444, 101450, 101456, 101462, 101467, 101472, - 101477, 101481, 101490, 101498, 101509, 7647, 101514, 18951, 101520, - 101524, 101528, 101532, 101540, 101549, 101553, 101560, 101569, 101577, - 101590, 101596, 101026, 34093, 101601, 101603, 101608, 101613, 101618, - 101623, 101628, 101633, 101638, 101643, 101648, 101653, 101658, 101663, - 101668, 101673, 101679, 101684, 101689, 101694, 101699, 101704, 101709, - 101714, 101719, 101725, 101731, 101737, 101742, 101747, 101759, 101764, - 1873, 54, 101769, 101774, 37057, 101778, 37062, 37067, 37073, 37078, - 101782, 37083, 24972, 101804, 101808, 101812, 101817, 101821, 37087, - 101825, 101833, 101840, 101846, 37092, 101856, 101859, 101864, 101868, - 101877, 10697, 101885, 37097, 24816, 101888, 101892, 101900, 1359, - 101905, 37108, 101908, 101913, 29225, 29235, 40266, 101918, 101923, - 101928, 101933, 101939, 101944, 101953, 101958, 101967, 101975, 101982, - 101988, 101993, 101998, 102003, 102013, 102022, 102030, 102035, 102043, - 102047, 102055, 102059, 102066, 102074, 36916, 43435, 102081, 102087, - 102092, 102097, 13809, 32149, 102102, 102107, 102113, 102120, 102126, - 102135, 102140, 102148, 102158, 102168, 102174, 102179, 102185, 20208, - 102192, 41203, 102205, 102210, 102216, 102231, 35118, 71938, 102244, - 102248, 102257, 102266, 102273, 102279, 102287, 102293, 102302, 102309, - 43555, 102315, 102318, 102322, 102326, 102330, 11430, 102336, 102343, - 102349, 102357, 102362, 102366, 27287, 102372, 102375, 102383, 102390, - 102398, 102411, 102425, 102432, 102438, 102445, 102451, 37122, 102455, - 102462, 102470, 102478, 102484, 37127, 102492, 102498, 102503, 102513, - 102519, 102528, 34913, 39653, 102536, 102541, 102546, 102550, 102555, - 102559, 102567, 102572, 17105, 17867, 102576, 102581, 37132, 17258, - 102585, 102590, 102594, 102601, 102610, 102614, 102622, 102628, 102633, - 102639, 8793, 102644, 102650, 102655, 102660, 102671, 102680, 102692, - 102707, 37413, 102713, 19070, 37136, 102717, 102724, 102730, 102734, - 27411, 102741, 102748, 102757, 102764, 102773, 102779, 102784, 102792, - 102798, 102803, 37146, 102808, 102817, 102826, 101362, 102835, 102842, - 102848, 102854, 102863, 102873, 102879, 102887, 102894, 102898, 37151, - 102901, 37157, 1398, 102906, 102914, 102922, 102932, 102941, 102949, - 102956, 102966, 37168, 102970, 102972, 102976, 102981, 102985, 102989, - 102995, 103000, 103004, 103015, 103020, 103025, 3212, 103029, 103036, - 103040, 103049, 103057, 103064, 103069, 103074, 70503, 103078, 103081, - 103087, 103095, 103101, 103105, 103110, 103117, 103122, 103127, 103131, - 103137, 103142, 39684, 103146, 103149, 103154, 103158, 103163, 103170, - 103175, 103179, 44859, 103187, 29244, 29253, 103193, 103199, 103205, - 103210, 103214, 103217, 103227, 103236, 103241, 103247, 103254, 103260, - 103264, 103272, 103277, 39690, 81188, 103281, 103289, 103295, 103302, - 103307, 103314, 103319, 103323, 103328, 65780, 103334, 103340, 9973, - 103345, 103350, 103354, 103359, 103364, 103369, 103373, 103378, 103383, - 103389, 103394, 103399, 103405, 103411, 103416, 103420, 103425, 103430, - 103435, 103439, 27410, 103444, 103449, 103455, 103461, 103467, 103472, - 103476, 103481, 103486, 103491, 103495, 103500, 103505, 103510, 103515, - 49505, 103519, 37176, 103527, 103531, 103539, 103547, 103558, 103563, - 103567, 25437, 78654, 103572, 103578, 103583, 4514, 103593, 103600, - 103605, 103613, 103622, 103627, 103631, 103636, 103640, 103648, 103656, - 103663, 73774, 103669, 103677, 103684, 103695, 103701, 103707, 37186, - 103710, 103717, 103725, 103730, 31344, 103734, 103739, 103746, 103751, - 9871, 103755, 103763, 103770, 103777, 103786, 103793, 103799, 103813, - 6473, 103589, 103821, 103826, 103832, 103836, 103839, 103847, 103854, - 103859, 103872, 103879, 103885, 103889, 103897, 103902, 103909, 103915, - 103920, 68618, 103925, 103928, 103937, 103944, 103950, 103954, 103957, - 103965, 103971, 103980, 103990, 104000, 104009, 104020, 104028, 104039, - 104044, 104048, 104053, 104057, 40397, 104065, 24159, 40406, 104070, - 96782, 96798, 96814, 96830, 96846, 104075, 96878, 96894, 96910, 96926, - 97038, 97054, 104079, 97086, 97102, 104083, 104087, 104091, 104095, - 97342, 97374, 104099, 97406, 104103, 104107, 97550, 97566, 97582, 97598, - 104111, 97662, 97678, 104115, 97806, 97822, 97838, 97854, 97870, 97886, - 97902, 97918, 97934, 97950, 98062, 98078, 98094, 98110, 98126, 98142, - 98158, 98174, 98190, 98206, 104119, 99998, 100110, 100174, 100190, - 100206, 100222, 100238, 100254, 100366, 100382, 100398, 104123, 100446, - 104127, 100478, 100494, 100510, 104131, 104136, 104141, 104146, 104151, - 104156, 104161, 104165, 104169, 104174, 104179, 104183, 104188, 104193, - 104197, 104202, 104207, 104212, 104217, 104221, 104226, 104231, 104235, - 104240, 104244, 104248, 104252, 104256, 104261, 104265, 104269, 104273, - 104277, 104281, 104285, 104289, 104293, 104297, 104302, 104307, 104312, - 104317, 104322, 104327, 104332, 104337, 104342, 104347, 104351, 104355, - 104359, 104363, 104367, 104371, 104376, 104380, 104385, 104389, 104394, - 104399, 104403, 104407, 104412, 104416, 104420, 104424, 104428, 104432, - 104436, 104440, 104444, 104448, 104452, 104456, 104460, 104464, 104468, - 104473, 104478, 104482, 104486, 104490, 104494, 104498, 104502, 104507, - 104511, 104515, 104519, 104523, 104527, 104531, 104536, 104540, 104545, - 104549, 104553, 104557, 104561, 104565, 104569, 104573, 104577, 104581, - 104585, 104589, 104594, 104598, 104602, 104606, 104610, 104614, 104618, - 104622, 104626, 104630, 104634, 104638, 104643, 104647, 104651, 104656, - 104661, 104665, 104669, 104673, 104677, 104681, 104685, 104689, 104693, - 104698, 104702, 104707, 104711, 104716, 104720, 104725, 104729, 104735, - 104740, 104744, 104749, 104753, 104758, 104762, 104767, 104771, 104776, - 1473, 104780, 2961, 1738, 26593, 1646, 29180, 104784, 2970, 104788, 1328, - 104793, 1270, 104797, 104801, 2987, 104805, 104813, 104820, 104827, - 104841, 2991, 7749, 104850, 104858, 104865, 104876, 104885, 104892, - 104904, 104917, 104930, 104941, 104946, 104953, 104965, 104969, 2995, - 13470, 104979, 104984, 104993, 105003, 105008, 2999, 105016, 105020, - 105025, 105032, 105038, 105043, 105052, 105060, 105072, 105082, 1275, - 14884, 105095, 105099, 105105, 105119, 105131, 105143, 105151, 105161, - 105170, 105179, 105188, 105196, 105207, 105215, 4522, 105225, 105236, - 105245, 105251, 105266, 105273, 105279, 105284, 40536, 105289, 3023, - 14888, 105293, 105300, 9796, 105309, 105315, 3028, 36599, 105324, 68254, - 105331, 105335, 105341, 105352, 105358, 105363, 105370, 105376, 105384, - 105391, 105397, 105408, 105418, 105427, 105438, 105447, 105454, 105460, - 105470, 105478, 105484, 105499, 105505, 105510, 105517, 105520, 105526, - 105533, 105539, 105547, 105556, 105564, 105570, 105579, 48820, 105593, - 105598, 105604, 16869, 105609, 105622, 105634, 105643, 105651, 105658, - 105662, 105666, 105669, 105676, 105683, 105691, 105699, 105708, 105716, - 16774, 105724, 105729, 105733, 105745, 105752, 105759, 105768, 904, - 105778, 105787, 105798, 3049, 105802, 105806, 105812, 105825, 105837, - 105847, 105856, 105868, 29968, 105879, 105887, 105896, 105907, 105918, - 105928, 105938, 105946, 105955, 105963, 12924, 105970, 105974, 105977, - 105982, 105987, 105991, 105997, 1280, 106004, 106008, 13558, 106012, - 106023, 106032, 106040, 106049, 106057, 106073, 106084, 106093, 106101, - 106113, 106124, 106140, 106150, 106171, 106185, 106198, 106206, 106213, - 7795, 106226, 106231, 106237, 6482, 106243, 106246, 106253, 106263, 8895, - 106270, 106275, 106280, 106285, 106293, 106302, 106310, 106315, 106322, - 10935, 10944, 106328, 106339, 106345, 106350, 106356, 3065, 3070, 106362, - 12417, 106368, 106375, 106382, 106395, 106400, 2258, 87, 106408, 106415, - 106420, 106428, 106438, 106447, 106453, 106462, 106470, 106480, 106484, - 106488, 106493, 106497, 106509, 3093, 106517, 106525, 106530, 106541, - 106552, 106564, 106575, 106585, 106594, 24200, 106599, 106605, 106610, - 106620, 106630, 106635, 32042, 106641, 106646, 106655, 24212, 106659, - 4620, 16, 106664, 106673, 106680, 106687, 106693, 106698, 106702, 106708, - 1069, 106713, 106718, 68895, 106723, 106728, 106734, 106740, 106748, - 106753, 106761, 106768, 106774, 106779, 44735, 48714, 106785, 1798, 32, - 106795, 106808, 106813, 106821, 106826, 106832, 3119, 32117, 106837, - 106845, 106852, 106857, 106862, 106871, 66037, 4219, 70101, 106879, - 106883, 1673, 1810, 106888, 106893, 106900, 1814, 302, 106907, 106913, - 106918, 3141, 106922, 106927, 106934, 1818, 106939, 106945, 106950, - 106962, 6713, 106972, 106979, 1825, 106985, 106990, 106997, 107004, - 107019, 107026, 107037, 107042, 107050, 2691, 107054, 107066, 107071, - 107075, 107081, 31920, 2263, 107085, 107096, 107100, 107104, 107110, - 107114, 107123, 107127, 107138, 107142, 2309, 36416, 107146, 107156, - 107164, 3232, 107170, 107179, 107187, 10334, 107192, 107197, 107201, - 107210, 107217, 107223, 3202, 16933, 107227, 107240, 107258, 107263, - 107271, 107279, 107289, 11228, 15006, 107301, 107314, 107321, 107335, - 107342, 107358, 107365, 107371, 24250, 14232, 107378, 107385, 107395, - 107404, 49504, 107416, 107424, 49639, 107431, 107434, 107440, 107446, - 107452, 107458, 107464, 107471, 107478, 107484, 107490, 107496, 107502, - 107508, 107514, 107520, 107526, 107532, 107538, 107544, 107550, 107556, - 107562, 107568, 107574, 107580, 107586, 107592, 107598, 107604, 107610, - 107616, 107622, 107628, 107634, 107640, 107646, 107652, 107658, 107664, - 107670, 107676, 107682, 107688, 107694, 107700, 107706, 107712, 107718, - 107724, 107730, 107736, 107742, 107748, 107754, 107760, 107766, 107772, - 107778, 107784, 107791, 107797, 107804, 107811, 107817, 107824, 107831, - 107837, 107843, 107849, 107855, 107861, 107867, 107873, 107879, 107885, - 107891, 107897, 107903, 107909, 107915, 107921, 3216, 10307, 107927, - 107933, 107941, 107945, 105028, 3220, 107949, 23968, 13844, 4144, 107953, - 3226, 107957, 107967, 107973, 107979, 107985, 107991, 107997, 108003, - 108009, 108015, 108021, 108027, 108033, 108039, 108045, 108051, 108057, - 108063, 108069, 108075, 108081, 108087, 108093, 108099, 108105, 108111, - 108117, 108124, 108131, 108137, 108143, 108149, 108155, 108161, 108167, - 1285, 108173, 108178, 108183, 108188, 108193, 108198, 108203, 108208, - 108213, 108217, 108221, 108225, 108229, 108233, 108237, 108241, 108245, - 108249, 108255, 108261, 108267, 108273, 108277, 108281, 108285, 108289, - 108293, 108297, 108301, 108305, 108309, 108314, 108319, 108324, 108329, - 108334, 108339, 108344, 108349, 108354, 108359, 108364, 108369, 108374, - 108379, 108384, 108389, 108394, 108399, 108404, 108409, 108414, 108419, - 108424, 108429, 108434, 108439, 108444, 108449, 108454, 108459, 108464, - 108469, 108474, 108479, 108484, 108489, 108494, 108499, 108504, 108509, - 108514, 108519, 108524, 108529, 108534, 108539, 108544, 108549, 108554, - 108559, 108564, 108569, 108574, 108579, 108584, 108589, 108594, 108599, - 108604, 108609, 108614, 108619, 108624, 108629, 108634, 108639, 108644, - 108649, 108654, 108659, 108664, 108669, 108674, 108679, 108684, 108689, - 108694, 108699, 108704, 108709, 108714, 108719, 108724, 108729, 108734, - 108739, 108744, 108749, 108754, 108759, 108764, 108769, 108774, 108779, - 108784, 108789, 108794, 108799, 108804, 108809, 108814, 108819, 108824, - 108829, 108834, 108839, 108844, 108849, 108854, 108859, 108864, 108869, - 108874, 108879, 108884, 108889, 108894, 108899, 108904, 108909, 108914, - 108919, 108924, 108929, 108934, 108939, 108944, 108949, 108954, 108959, - 108964, 108969, 108974, 108979, 108984, 108989, 108994, 108999, 109004, - 109009, 109014, 109019, 109024, 109029, 109034, 109039, 109044, 109049, - 109054, 109059, 109064, 109069, 109074, 109079, 109084, 109089, 109094, - 109099, 109104, 109109, 109114, 109119, 109124, 109129, 109134, 109139, - 109144, 109149, 109154, 109159, 109164, 109169, 109174, 109179, 109184, - 109189, 109194, 109199, 109205, 109210, 109215, 109220, 109225, 109230, - 109235, 109240, 109246, 109251, 109256, 109261, 109266, 109271, 109276, - 109281, 109286, 109291, 109296, 109301, 109306, 109311, 109316, 109321, - 109326, 109331, 109336, 109341, 109346, 109351, 109356, 109361, 109366, - 109371, 109376, 109381, 109386, 109391, 109396, 109401, 109406, 109415, - 109420, 109429, 109434, 109443, 109448, 109457, 109462, 109471, 109476, - 109485, 109490, 109499, 109504, 109513, 109518, 109523, 109532, 109536, - 109545, 109550, 109559, 109564, 109573, 109578, 109587, 109592, 109601, - 109606, 109615, 109620, 109629, 109634, 109643, 109648, 109657, 109662, - 109671, 109676, 109681, 109686, 109691, 109696, 109701, 109706, 109710, - 109715, 109720, 109725, 109730, 109735, 109740, 109746, 109751, 109756, - 109761, 109767, 109771, 109776, 109782, 109787, 109792, 109797, 109802, - 109807, 109812, 109817, 109822, 109827, 109832, 109838, 109843, 109848, - 109853, 109859, 109864, 109869, 109874, 109879, 109885, 109890, 109895, - 109900, 109905, 109910, 109916, 109921, 109926, 109931, 109936, 109941, - 109946, 109951, 109956, 109961, 109966, 109971, 109976, 109981, 109986, - 109991, 109996, 110001, 110006, 110011, 110016, 110021, 110026, 110031, - 110037, 110043, 110049, 110054, 110059, 110064, 110069, 110075, 110081, - 110087, 110092, 110097, 110102, 110108, 110113, 110118, 110123, 110128, - 110133, 110138, 110143, 110148, 110153, 110158, 110163, 110168, 110173, - 110178, 110183, 110188, 110194, 110200, 110206, 110211, 110216, 110221, - 110226, 110232, 110238, 110244, 110249, 110254, 110259, 110264, 110269, - 110274, 110279, 110284, 110289, 18458, 110294, 110300, 110305, 110310, - 110315, 110320, 110325, 110331, 110336, 110341, 110346, 110351, 110356, - 110362, 110367, 110372, 110377, 110382, 110387, 110392, 110397, 110402, - 110407, 110412, 110417, 110422, 110427, 110432, 110437, 110442, 110447, - 110452, 110457, 110462, 110467, 110472, 110478, 110483, 110488, 110493, - 110498, 110503, 110508, 110513, 110518, 110523, 110528, 110533, 110538, - 110543, 110548, 110553, 110558, 110563, 110568, 110573, 110578, 110583, - 110588, 110593, 110598, 110603, 110608, 110613, 110618, 110623, 110628, - 110633, 110638, 110643, 110648, 110653, 110658, 110663, 110668, 110673, - 110678, 110684, 110689, 110694, 110699, 110704, 110709, 110714, 110719, - 110724, 110729, 110734, 110739, 110745, 110750, 110756, 110761, 110766, - 110771, 110776, 110781, 110786, 110792, 110797, 110802, 110808, 110813, - 110818, 110823, 110828, 110833, 110839, 110845, 110850, 110855, 13866, - 110860, 110865, 110870, 110875, 110880, 110885, 110890, 110895, 110900, - 110905, 110910, 110915, 110920, 110925, 110930, 110935, 110940, 110945, - 110950, 110955, 110960, 110965, 110970, 110975, 110980, 110985, 110990, - 110995, 111000, 111005, 111010, 111015, 111020, 111025, 111030, 111035, - 111040, 111045, 111050, 111055, 111060, 111065, 111070, 111075, 111080, - 111085, 111090, 111095, 111100, 111105, 111110, 111115, 111120, 111125, - 111130, 111135, 111140, 111145, 111150, 111155, 111160, 111165, 111170, - 111175, 111180, 111186, 111191, 111196, 111201, 111206, 111212, 111217, - 111222, 111227, 111232, 111237, 111242, 111248, 111253, 111258, 111263, - 111268, 111273, 111279, 111284, 111289, 111294, 111299, 111304, 111310, - 111315, 111320, 111325, 111330, 111335, 111341, 111347, 111352, 111357, - 111362, 111368, 111374, 111380, 111385, 111390, 111396, 111402, 111407, - 111413, 111419, 111425, 111430, 111435, 111441, 111446, 111452, 111457, - 111463, 111472, 111477, 111482, 111488, 111493, 111499, 111504, 111509, - 111514, 111519, 111524, 111529, 111534, 111539, 111544, 111549, 111554, - 111559, 111564, 111569, 111574, 111579, 111584, 111589, 111594, 111599, - 111604, 111609, 111614, 111619, 111624, 111629, 111634, 111639, 111644, - 111649, 111654, 111660, 111666, 111672, 111677, 111682, 111687, 111692, - 111697, 111702, 111707, 111712, 111717, 111722, 111727, 111732, 111737, - 111742, 111747, 111752, 111757, 111762, 111767, 111772, 111778, 111784, - 111789, 111795, 111800, 111805, 111811, 111816, 111822, 111827, 111833, - 111838, 111844, 111849, 111855, 111860, 111865, 111870, 111875, 111880, - 111885, 111890, 107968, 107974, 107980, 107986, 111896, 107992, 107998, - 111902, 108004, 108010, 108016, 108022, 108028, 108034, 108040, 108046, - 108052, 111908, 108058, 108064, 108070, 111914, 108076, 108082, 108088, - 108094, 111920, 108100, 108106, 108112, 108132, 111926, 111932, 108138, - 111938, 108144, 108150, 108156, 108162, 108168, 111944, 3243, 3248, - 111949, 3263, 3268, 3273, 111954, 111957, 111963, 111969, 111976, 111981, - 111986, 2314, + 201, 206, 214, 221, 229, 171, 232, 241, 242, 250, 256, 261, 266, 273, + 283, 290, 296, 301, 304, 308, 314, 320, 325, 328, 333, 343, 349, 354, + 359, 365, 370, 379, 381, 388, 395, 397, 406, 347, 408, 416, 424, 426, + 434, 435, 442, 445, 447, 452, 458, 465, 470, 477, 485, 492, 497, 502, + 506, 512, 517, 522, 532, 539, 542, 550, 558, 567, 570, 574, 577, 581, + 591, 595, 602, 609, 616, 623, 632, 641, 645, 652, 655, 661, 665, 673, + 678, 687, 265, 691, 704, 708, 713, 718, 724, 726, 736, 739, 743, 748, + 756, 760, 769, 774, 780, 786, 790, 795, 803, 812, 821, 829, 837, 840, + 793, 851, 857, 862, 870, 877, 880, 890, 894, 898, 905, 909, 912, 919, + 923, 614, 929, 938, 941, 946, 952, 955, 959, 962, 966, 969, 972, 981, + 987, 990, 995, 1004, 1009, 576, 1012, 1018, 1026, 1031, 1035, 1040, 1043, + 1046, 1052, 1058, 1065, 1073, 1076, 1085, 1093, 1097, 1104, 1110, 1115, + 1120, 1126, 1131, 1136, 1141, 1145, 1150, 1156, 1161, 1166, 1170, 1176, + 1181, 1186, 1191, 1195, 1200, 1205, 1210, 1216, 1222, 1228, 1233, 1237, + 1242, 1247, 1252, 1256, 1261, 1266, 1271, 1276, 1111, 1116, 1121, 1127, + 1132, 1280, 1142, 1286, 1291, 1296, 1303, 1307, 1310, 1319, 1146, 1323, + 1151, 1157, 1162, 1327, 1332, 1337, 1341, 1345, 1351, 1355, 1167, 1358, + 1360, 1177, 1365, 1369, 1182, 1375, 1187, 1379, 1383, 1390, 1192, 1394, + 1399, 1403, 1406, 1410, 1196, 1201, 1415, 1421, 1206, 1433, 1439, 1445, + 1451, 1211, 1223, 1229, 1455, 1459, 1463, 1466, 1234, 1470, 1472, 1477, + 1482, 1488, 1493, 1498, 1502, 1507, 1512, 1517, 1522, 1528, 1533, 1538, + 1544, 1550, 1555, 1559, 1564, 1569, 1574, 1579, 1584, 1588, 1596, 1601, + 1605, 1610, 1615, 1620, 1625, 1629, 1632, 1639, 1644, 1649, 1654, 1659, + 1665, 1670, 1674, 1238, 1677, 1682, 1687, 1692, 1243, 1696, 1700, 1707, + 1248, 1714, 1719, 1253, 1723, 1725, 1730, 1741, 1747, 1257, 1752, 1761, + 1262, 1766, 1772, 1777, 1267, 1782, 1791, 1796, 1800, 1803, 1808, 1812, + 1816, 1820, 1823, 1827, 1272, 1832, 1277, 1836, 1838, 1844, 1850, 1856, + 1862, 1868, 1874, 1880, 1886, 1891, 1897, 1903, 1909, 1915, 1921, 1927, + 1933, 1939, 1945, 1950, 1955, 1960, 1965, 1970, 1975, 1980, 1985, 1990, + 1995, 2001, 2006, 2012, 2017, 2023, 2029, 2034, 2040, 2046, 2052, 2058, + 2063, 2068, 2070, 2071, 2075, 2079, 2084, 2088, 2092, 2096, 2101, 2105, + 2108, 2113, 2117, 2122, 2126, 2130, 2135, 2139, 2142, 2146, 2152, 2166, + 2170, 2174, 2178, 2181, 2186, 2190, 2194, 2197, 2201, 2206, 2211, 2216, + 2221, 2225, 2229, 2233, 2237, 2241, 2246, 2250, 2255, 2259, 2264, 2270, + 2277, 2283, 2288, 2293, 2298, 2304, 2309, 2315, 2320, 2325, 2330, 2335, + 2340, 2343, 2345, 1128, 2349, 2356, 2364, 2374, 2383, 2397, 2401, 2405, + 2410, 2423, 2431, 2434, 2438, 2443, 2447, 2450, 2454, 2458, 2463, 1736, + 2468, 2472, 2475, 2479, 2485, 2492, 2499, 2505, 2510, 2515, 2521, 2527, + 2532, 2537, 2542, 2547, 2552, 2557, 2482, 2562, 1727, 2564, 2570, 2574, + 2579, 2583, 2587, 1635, 1749, 2592, 2596, 2600, 2603, 2608, 2613, 2618, + 2623, 2627, 2634, 2639, 2642, 2646, 2653, 2659, 2663, 2667, 2671, 2676, + 2683, 2688, 2693, 2700, 2706, 2712, 2718, 2739, 2753, 2770, 2785, 2801, + 2818, 2833, 2842, 2847, 2851, 2856, 2861, 2865, 2877, 2884, 2890, 2273, + 2896, 2903, 2909, 2913, 2916, 2923, 2929, 2934, 2938, 2943, 2947, 2951, + 2093, 2955, 2960, 2965, 2969, 2974, 2982, 2986, 2993, 2998, 3002, 3006, + 3010, 3015, 3020, 3025, 3029, 3034, 3039, 3043, 3048, 3053, 3057, 3060, + 3064, 3068, 3076, 3081, 3085, 3089, 3095, 3104, 3108, 3112, 3118, 3123, + 3130, 3134, 3144, 3148, 3152, 3157, 3161, 3166, 3172, 3177, 3181, 3185, + 3189, 2495, 3197, 3202, 3208, 3213, 3217, 3222, 3227, 3231, 3237, 3242, + 2097, 3248, 3254, 3259, 3264, 3269, 3274, 3279, 3284, 3289, 3294, 3299, + 3304, 3309, 3314, 3319, 3324, 3330, 3335, 1143, 101, 3341, 3345, 3349, + 3353, 3358, 3362, 3366, 3372, 3377, 3381, 3385, 3390, 3395, 3399, 3404, + 3408, 3411, 3415, 3420, 3424, 3429, 3433, 3436, 3438, 3442, 3446, 3451, + 3455, 3458, 3471, 3475, 3479, 3483, 3488, 3492, 3496, 3499, 3503, 3507, + 3512, 3516, 3521, 3526, 3531, 3535, 3542, 3547, 3550, 3553, 3558, 3564, + 3568, 3572, 3575, 3580, 3584, 3589, 3593, 3597, 3600, 3606, 3611, 3616, + 3622, 3627, 3632, 3638, 3644, 3649, 3654, 3659, 3664, 964, 654, 3667, + 3670, 3675, 3679, 3683, 3687, 3691, 3694, 3698, 3703, 3708, 3712, 3717, + 3721, 3726, 3730, 3734, 3738, 3744, 3750, 3753, 3756, 150, 3762, 3767, + 3776, 3784, 3793, 3803, 3810, 3816, 3823, 3828, 3832, 3836, 3844, 3851, + 3856, 3863, 3868, 3872, 3882, 3886, 3890, 3895, 3900, 3910, 2109, 3915, + 3919, 3922, 3928, 3933, 3939, 3945, 3950, 3957, 3961, 3965, 3969, 3974, + 3979, 3984, 3989, 3994, 3999, 592, 575, 1304, 4004, 4011, 4018, 4024, + 4029, 4036, 4043, 4048, 4054, 4060, 4065, 4069, 4075, 4082, 4087, 4091, + 4095, 2118, 4101, 4109, 4115, 4123, 807, 4129, 4137, 4148, 4152, 4162, + 4168, 4173, 4178, 4183, 4188, 2123, 4193, 4198, 4213, 4219, 4226, 4237, + 4247, 4253, 4258, 4264, 4270, 4273, 4276, 4280, 4285, 4288, 4295, 4304, + 4309, 4313, 4317, 4321, 4325, 4330, 4336, 4347, 4351, 3416, 4356, 4368, + 4374, 4382, 4386, 4391, 4398, 4403, 4408, 4413, 1504, 4418, 4421, 4424, + 4428, 4431, 4437, 4441, 4455, 4459, 4462, 4466, 4472, 4478, 4483, 4487, + 4491, 4497, 4508, 4514, 4519, 4525, 4529, 4537, 4549, 4559, 4565, 4570, + 4579, 4587, 4594, 4600, 4606, 4610, 4616, 4625, 4634, 4640, 4644, 4653, + 4658, 4662, 4667, 4671, 4679, 4685, 4689, 4696, 4701, 4705, 4711, 2131, + 4717, 4722, 4727, 4732, 4737, 1320, 4742, 4747, 4753, 4758, 4763, 4768, + 4773, 4778, 4783, 4789, 4794, 4800, 4805, 4810, 4815, 4821, 4826, 4831, + 4836, 4841, 4847, 4852, 4858, 4863, 4868, 4873, 4878, 4883, 4888, 4894, + 4899, 4904, 312, 369, 4909, 4915, 4919, 4923, 4928, 4932, 4936, 4939, + 4943, 4947, 4950, 4954, 4958, 4962, 4967, 4971, 4975, 4981, 4990, 4714, + 4995, 4999, 5002, 5007, 5012, 5017, 5022, 5027, 5032, 5037, 5042, 5047, + 5052, 5056, 5061, 5066, 5071, 5076, 5081, 5086, 5091, 5096, 5101, 5106, + 5110, 5115, 5120, 5125, 5130, 5135, 5140, 5145, 5150, 5155, 5160, 5164, + 5169, 5174, 5179, 5184, 5189, 5194, 5199, 5204, 5209, 5214, 5218, 5223, + 5228, 5233, 5238, 5243, 5248, 5253, 5258, 5263, 5268, 5272, 5277, 5282, + 5287, 5292, 5297, 5302, 5307, 5312, 5317, 5322, 5326, 5331, 5336, 5341, + 5346, 5351, 5356, 5361, 5366, 5371, 5376, 5380, 5385, 5390, 5395, 5400, + 5406, 5412, 5418, 5424, 5430, 5436, 5442, 5447, 5453, 5459, 5465, 5471, + 5477, 5483, 5489, 5495, 5501, 5507, 5512, 5518, 5524, 5530, 5536, 5542, + 5548, 5554, 5560, 5566, 5572, 5577, 5583, 5589, 5595, 5601, 5607, 5613, + 5619, 5625, 5631, 5637, 5642, 5648, 5654, 5660, 5666, 5672, 5678, 5684, + 5690, 5696, 5702, 5707, 5713, 5719, 5725, 5731, 5737, 5743, 5749, 5755, + 5761, 5767, 5772, 5776, 5782, 5788, 5794, 5800, 5806, 5812, 5818, 5824, + 5830, 5836, 5841, 5847, 5853, 5859, 5865, 5871, 5877, 5883, 5889, 5895, + 5901, 5906, 5912, 5918, 5924, 5930, 5936, 5942, 5948, 5954, 5960, 5966, + 5971, 5977, 5983, 5989, 5995, 6001, 6007, 6013, 6019, 6025, 6031, 6036, + 6042, 6048, 6054, 6060, 6066, 6072, 6078, 6084, 6090, 6096, 6101, 6107, + 6113, 6119, 6125, 6131, 6137, 6143, 6149, 6155, 6161, 6166, 6172, 6178, + 6184, 6190, 6196, 6202, 6208, 6214, 6220, 6226, 6231, 6237, 6243, 6249, + 6255, 6261, 6267, 6273, 6279, 6285, 6291, 6296, 6302, 6308, 6314, 6320, + 6326, 6332, 6338, 6344, 6350, 6356, 6361, 6367, 6373, 6379, 6385, 6391, + 6397, 6403, 6409, 6415, 6421, 6426, 6430, 6433, 6440, 6444, 6457, 6461, + 6465, 6469, 6472, 6476, 6481, 6485, 6494, 6498, 6504, 6511, 6522, 6530, + 6537, 6541, 6549, 6558, 6564, 6568, 6580, 6585, 6588, 6593, 6597, 6607, + 6615, 6623, 6629, 6633, 6643, 6653, 6661, 6668, 6675, 6681, 6687, 6694, + 6698, 6705, 6715, 6725, 6733, 6740, 6745, 6749, 6753, 6761, 6765, 6775, + 6780, 6787, 6795, 6800, 6804, 6809, 6813, 6820, 6825, 6839, 6844, 6849, + 6856, 3680, 6865, 6869, 6873, 6878, 6882, 6886, 6889, 6894, 6899, 6908, + 6914, 6920, 6925, 6931, 6935, 6946, 6956, 6971, 6986, 7001, 7016, 7031, + 7046, 7061, 7076, 7091, 7106, 7121, 7136, 7151, 7166, 7181, 7196, 7211, + 7226, 7241, 7256, 7271, 7286, 7301, 7316, 7331, 7346, 7361, 7376, 7391, + 7406, 7421, 7436, 7451, 7466, 7481, 7496, 7511, 7526, 7541, 7556, 7571, + 7586, 7601, 7616, 7631, 7646, 7661, 7676, 7691, 7700, 7709, 7714, 7720, + 7730, 7734, 7738, 7743, 7748, 7753, 7761, 7765, 7768, 7772, 3139, 7775, + 7780, 346, 520, 7786, 7794, 7798, 7802, 7805, 7809, 7815, 7819, 7827, + 7833, 7838, 7845, 7853, 7860, 7866, 7871, 7878, 7884, 7893, 7901, 7905, + 7910, 7918, 7930, 7941, 7948, 7959, 7963, 7967, 7971, 7974, 7980, 3443, + 7984, 7990, 7995, 8000, 8005, 8011, 8016, 8021, 8026, 8031, 8037, 8042, + 8047, 8053, 8058, 8064, 8069, 8075, 8080, 8086, 8091, 8096, 8101, 8106, + 8111, 8117, 8122, 8127, 8132, 8138, 8144, 8150, 8156, 8162, 8168, 8174, + 8180, 8186, 8192, 8198, 8204, 8209, 8214, 8219, 8224, 8229, 8234, 8239, + 8244, 8250, 8256, 8261, 8267, 8273, 8279, 8284, 8289, 8294, 8299, 8305, + 8311, 8316, 8321, 8326, 8331, 8336, 8342, 8347, 8353, 8359, 8365, 8371, + 8377, 8383, 8389, 8395, 8401, 2140, 7804, 8406, 8410, 8418, 8422, 8425, + 8432, 8435, 8439, 8447, 8452, 8457, 8448, 8462, 2167, 8466, 8472, 8478, + 8483, 8488, 8495, 8503, 8508, 8512, 8515, 8519, 8525, 8531, 8535, 1679, + 572, 8538, 8542, 8547, 8553, 8558, 8562, 8565, 8569, 8575, 8580, 8584, + 8591, 8595, 8599, 8603, 792, 1063, 8606, 8614, 8621, 8628, 8634, 8641, + 8649, 8656, 8667, 8674, 8680, 8685, 8697, 1163, 1328, 1333, 8708, 8712, + 1338, 8716, 8720, 8729, 8737, 8741, 8750, 8756, 8762, 8767, 8771, 8777, + 8782, 8790, 8797, 2838, 8804, 8810, 8814, 8823, 8832, 8841, 8850, 8856, + 8861, 8866, 8877, 8886, 8898, 8903, 8911, 2226, 8915, 8917, 8922, 8926, + 8935, 8943, 1342, 165, 3722, 3727, 8949, 8953, 8962, 8968, 8973, 8976, + 8985, 2238, 8991, 2830, 8995, 9003, 9007, 9011, 9015, 9019, 2247, 9023, + 9028, 9035, 9041, 9047, 9050, 9052, 9055, 9063, 9071, 9079, 9082, 9087, + 2260, 9092, 8459, 9095, 9097, 9102, 9107, 9112, 9117, 9122, 9127, 9132, + 9137, 9142, 9147, 9153, 9158, 9163, 9168, 9174, 9179, 9184, 9189, 9194, + 9199, 9204, 9210, 9215, 9220, 9225, 9230, 9235, 9240, 9245, 9250, 9255, + 9260, 9265, 9270, 9275, 9280, 9285, 9290, 9295, 9301, 9307, 9312, 9317, + 9322, 9327, 9332, 2271, 2278, 2284, 9337, 9345, 9351, 9359, 2310, 2316, + 9367, 2321, 2326, 2331, 2336, 9371, 9375, 9380, 9384, 9388, 9392, 9397, + 9401, 9406, 9410, 9413, 9416, 9422, 9429, 9435, 9442, 9448, 9455, 9461, + 9468, 9474, 9480, 9489, 9495, 9499, 9503, 9507, 9511, 9516, 9520, 9525, + 9529, 9535, 9539, 9544, 9551, 9562, 9570, 9580, 9586, 9596, 9605, 9612, + 9617, 9621, 9632, 9642, 9655, 9666, 9679, 9690, 9702, 9714, 9726, 9737, + 9750, 9763, 9770, 9776, 9787, 9797, 9811, 9818, 9824, 9833, 9841, 9845, + 9850, 9854, 9861, 9869, 9876, 9880, 9886, 9890, 9896, 9906, 9910, 9915, + 9920, 9927, 9933, 8636, 9943, 9947, 9954, 9960, 9967, 9974, 1062, 9978, + 9984, 9988, 9993, 9998, 10003, 10007, 10013, 10021, 10028, 10034, 10038, + 10041, 10047, 10057, 10061, 10067, 10072, 10076, 10081, 10085, 10091, + 10097, 10102, 10108, 10113, 10118, 10123, 2163, 10128, 10130, 10135, + 10143, 10152, 10156, 10162, 10167, 10172, 10177, 10182, 10188, 10193, + 10198, 4493, 10203, 10208, 10212, 10218, 10223, 10229, 10234, 10239, + 10245, 10250, 10157, 10256, 10260, 10267, 10273, 10278, 10282, 6835, + 10287, 10296, 10301, 10306, 9031, 9038, 10311, 3012, 10315, 10320, 10325, + 10330, 10168, 10334, 10339, 10344, 10173, 10348, 10178, 10353, 10360, + 10367, 10373, 10380, 10386, 10392, 10397, 10404, 10409, 10414, 10419, + 10425, 10183, 10189, 10431, 10437, 10442, 10447, 10455, 10194, 10460, + 10463, 10465, 10473, 10479, 10485, 10494, 10502, 10510, 10518, 10526, + 10534, 10542, 10550, 10558, 10567, 10576, 10584, 10593, 10602, 10611, + 10620, 10629, 10638, 10647, 10656, 10665, 10674, 10682, 10687, 10691, + 10697, 10705, 10712, 10727, 10744, 10763, 10772, 10780, 10795, 10806, + 10814, 10824, 10834, 10842, 10848, 10860, 10869, 10877, 10884, 10891, + 10898, 10904, 10909, 10919, 10927, 10937, 10944, 10954, 10964, 10974, + 10982, 10989, 10998, 11008, 11022, 11037, 11046, 11054, 11059, 11063, + 11072, 11078, 11083, 11093, 11103, 11113, 11118, 11122, 11132, 11141, + 11146, 11162, 11179, 11189, 11200, 11213, 11224, 11232, 11245, 11257, + 11265, 11270, 11274, 11280, 11285, 11293, 11301, 11308, 11319, 11324, + 11332, 11342, 11348, 11352, 11355, 11359, 11365, 11372, 11376, 11384, + 11393, 11401, 11408, 11413, 11418, 11422, 11426, 11434, 11449, 11465, + 11471, 11479, 11488, 11496, 11502, 11506, 11513, 11524, 11528, 11531, + 11537, 11542, 10199, 11550, 11556, 11563, 11569, 11574, 11581, 11588, + 11595, 11602, 11609, 11616, 11623, 11630, 11637, 11644, 11651, 11658, + 11665, 11672, 11679, 11684, 10740, 11689, 11695, 11702, 11709, 11714, + 11721, 11730, 11734, 11746, 11750, 11756, 11761, 11766, 11771, 11776, + 11781, 9069, 11786, 11789, 11793, 11797, 11801, 11805, 11811, 11817, + 11822, 11828, 11833, 11838, 11844, 11849, 11854, 9923, 11859, 11863, + 11867, 11871, 11876, 11881, 11886, 11894, 11900, 11905, 11909, 11913, + 11920, 11925, 11933, 11940, 11945, 11949, 11952, 11958, 11965, 11969, + 11972, 11977, 11981, 4532, 11987, 11996, 46, 12004, 12010, 12015, 12020, + 12028, 12035, 12040, 6770, 12046, 12052, 12057, 12061, 12064, 12079, + 12098, 12110, 12123, 12136, 12149, 12163, 12176, 12191, 12198, 10204, + 12204, 12218, 12223, 12229, 12234, 12242, 12247, 8819, 12252, 12255, + 12263, 12270, 12275, 12279, 12285, 12289, 12294, 12299, 12304, 12309, + 12314, 12319, 3017, 10822, 12324, 12328, 12334, 12340, 12345, 12351, + 12356, 10213, 12362, 12368, 12373, 12378, 12386, 12392, 12405, 12413, + 12420, 12426, 10219, 12432, 12440, 12448, 12455, 12468, 12481, 12493, + 12503, 12515, 12543, 12551, 12560, 12567, 12579, 12586, 12596, 12605, + 12613, 12620, 12625, 12631, 10224, 12636, 12642, 12647, 12652, 10230, + 12657, 12660, 12667, 12673, 12687, 12700, 12711, 9555, 12722, 12728, + 12737, 12745, 12752, 12758, 12769, 12775, 12780, 12788, 4020, 12794, + 12799, 12071, 12805, 12812, 12817, 10235, 12823, 12828, 12835, 12841, + 12847, 12852, 12860, 12868, 12875, 12879, 12891, 12905, 12915, 12920, + 12924, 12935, 12941, 12946, 12951, 10240, 12955, 10246, 12960, 12963, + 12968, 12980, 12987, 12992, 12996, 13004, 13009, 13013, 13018, 13022, + 13029, 13035, 10251, 10158, 13042, 3022, 12, 13049, 13054, 13058, 13062, + 13068, 13076, 13086, 13091, 13096, 13103, 13110, 13114, 13125, 13135, + 13144, 13153, 13165, 13170, 13174, 13182, 13196, 13200, 13203, 13207, + 13215, 13222, 13230, 13234, 13245, 13253, 13257, 13264, 13269, 13273, + 13279, 13284, 13290, 13295, 13300, 13304, 13310, 13315, 13326, 13330, + 13333, 13339, 13346, 13351, 13357, 13363, 13370, 13381, 13391, 13401, + 13410, 13417, 13426, 13430, 10261, 10268, 10274, 10279, 13436, 13442, + 13448, 13453, 13459, 10283, 13465, 13468, 13475, 13480, 13485, 13500, + 13516, 13531, 13539, 13545, 13550, 13555, 13560, 13565, 13570, 13575, + 13580, 13585, 13590, 1055, 357, 13595, 13603, 13610, 13616, 13621, 13626, + 10288, 13628, 13632, 13637, 13641, 13651, 13656, 13660, 13663, 13672, + 13676, 13679, 13686, 10297, 13691, 13694, 13702, 13709, 13717, 13721, + 13727, 13731, 13738, 13747, 13754, 13750, 13761, 13765, 13771, 13775, + 13779, 13783, 13789, 13799, 13807, 13814, 13818, 13826, 13831, 13835, + 13842, 13847, 13851, 13856, 13861, 13865, 13872, 13878, 13886, 13892, + 13897, 13907, 13914, 13919, 13924, 13928, 13932, 13940, 4362, 13948, + 13953, 10302, 13957, 13964, 13968, 13971, 13979, 13986, 13990, 6625, + 13994, 13999, 14004, 14008, 14019, 14029, 14034, 14040, 14045, 14049, + 14052, 14060, 14065, 14070, 14077, 14082, 10307, 14087, 14091, 14098, + 14103, 14108, 14113, 6793, 14118, 14123, 14128, 14133, 14139, 14144, + 14150, 14155, 14160, 14165, 14170, 14175, 14180, 14185, 14190, 14195, + 14200, 14205, 14210, 14215, 14220, 14225, 14230, 14236, 14241, 14246, + 14251, 14256, 14261, 14267, 14272, 14277, 14283, 14288, 14294, 14299, + 14305, 14310, 14315, 14320, 14325, 14331, 14336, 14341, 14346, 14354, + 985, 112, 14360, 14364, 14369, 14374, 14378, 14382, 14386, 14391, 14395, + 14400, 14404, 14407, 14411, 14415, 14421, 14426, 14436, 14442, 14450, + 14456, 14460, 14464, 14471, 14479, 14488, 14499, 14509, 14516, 14523, + 14527, 14536, 14545, 14553, 14560, 14569, 14578, 14587, 14596, 14606, + 14616, 14626, 14636, 14646, 14655, 14665, 14675, 14685, 14695, 14705, + 14715, 14725, 14734, 14744, 14754, 14764, 14774, 14784, 14794, 14803, + 14813, 14823, 14833, 14843, 14853, 14863, 14873, 14883, 14893, 14902, + 14912, 14922, 14932, 14942, 14952, 14962, 14972, 14982, 14992, 15002, + 15011, 15017, 1172, 15021, 15024, 15028, 15033, 15040, 15046, 15051, + 15055, 15060, 15069, 15078, 15086, 15091, 15095, 15099, 15105, 15110, + 15116, 10316, 15121, 15126, 15135, 15140, 10326, 15145, 15148, 15154, + 15162, 10331, 15169, 15173, 15177, 15182, 15186, 15196, 15202, 15208, + 15213, 15222, 15230, 15237, 15244, 15249, 15256, 15261, 15265, 15268, + 15279, 15289, 15302, 15311, 15319, 15330, 15342, 15352, 15362, 15367, + 15371, 15376, 15381, 15385, 15391, 15399, 15406, 15417, 15422, 15432, + 15441, 15445, 15448, 15455, 15465, 15474, 15481, 15485, 15492, 15498, + 15503, 15508, 15512, 15064, 15521, 15525, 15531, 15535, 15540, 15544, + 15551, 15558, 15562, 15571, 15579, 15587, 15594, 15602, 15614, 15625, + 15635, 15642, 15648, 15657, 15668, 15677, 15689, 15701, 15713, 15723, + 15732, 15742, 15751, 15759, 15766, 15775, 15783, 15787, 15792, 15798, + 15804, 15809, 15814, 15818, 15823, 15828, 15833, 15838, 15843, 15848, + 15853, 8480, 15858, 15860, 15864, 15869, 15875, 15882, 15888, 15894, + 15903, 15907, 15913, 15921, 15928, 15937, 15946, 15955, 15964, 15973, + 15982, 15991, 16000, 16010, 16020, 16029, 16035, 16042, 16049, 16055, + 16069, 16075, 16082, 16090, 16099, 16107, 16113, 16122, 16131, 16142, + 16148, 16158, 16166, 16173, 16181, 16190, 16203, 16212, 16220, 16227, + 16240, 16246, 16252, 16262, 16271, 16280, 16285, 16289, 16295, 16301, + 16306, 16313, 16320, 9937, 16325, 16330, 16337, 16345, 16350, 16362, + 16369, 16374, 16386, 14417, 16391, 16397, 16405, 16411, 16416, 16424, + 16432, 16439, 16447, 16453, 16461, 16469, 16475, 16483, 16489, 16494, + 16500, 16507, 16513, 16518, 16522, 16533, 16541, 16549, 16555, 16560, + 16567, 16576, 16582, 16587, 16595, 16602, 16611, 16625, 4306, 16629, + 16634, 16639, 16645, 16650, 16655, 16659, 16664, 16669, 16674, 8479, + 16679, 16684, 16689, 16694, 16699, 16703, 16708, 16713, 16718, 16723, + 16729, 16735, 13723, 16740, 16746, 16751, 16756, 16761, 10335, 16766, + 16771, 16776, 16781, 16786, 16800, 16817, 16835, 16847, 16860, 16877, + 16893, 16910, 16920, 16939, 16950, 16961, 16972, 2727, 16983, 16994, + 17005, 17022, 17033, 17044, 17049, 10340, 17054, 17058, 2420, 17062, + 17065, 17071, 17079, 17087, 17093, 17102, 17109, 17114, 17122, 17130, + 17137, 17141, 17146, 17152, 17159, 17167, 17174, 17186, 17193, 17199, + 17207, 17212, 17218, 17224, 17229, 13494, 17236, 17245, 17251, 17256, + 17264, 17273, 17281, 17288, 17294, 17302, 17309, 17315, 17321, 17328, + 17335, 17341, 17347, 17356, 17364, 17369, 17379, 17386, 17392, 17400, + 17406, 17414, 17422, 17429, 17442, 17449, 17458, 17467, 17476, 17484, + 17494, 17501, 17506, 3876, 17513, 17518, 1288, 17522, 17529, 16680, + 17533, 17539, 17543, 17551, 17563, 17568, 17575, 17581, 17586, 17593, + 16685, 17597, 17601, 17605, 16690, 17609, 16695, 17613, 17620, 17625, + 17629, 17636, 17640, 17648, 17655, 17660, 17668, 17672, 17679, 17696, + 17705, 17714, 17718, 17721, 17727, 17735, 17741, 17746, 17750, 17755, + 17760, 17765, 17770, 17775, 17780, 3954, 17785, 17787, 17795, 17802, + 17812, 17824, 17829, 17833, 17839, 17844, 17852, 17856, 17862, 17867, + 17873, 17876, 17883, 17891, 17898, 17904, 17909, 17915, 17920, 17927, + 17933, 17938, 17945, 17950, 17954, 17960, 17966, 17970, 17977, 17983, + 17988, 17994, 18002, 18010, 18017, 18023, 18028, 18034, 18040, 18048, + 18053, 18058, 18066, 18072, 18078, 18083, 18090, 18095, 18099, 18105, + 18111, 18116, 18123, 18128, 18134, 18137, 18143, 18154, 18160, 18163, + 18167, 18171, 18185, 18198, 18210, 18216, 18221, 18228, 18234, 18240, + 18251, 18263, 18275, 18285, 18294, 18302, 18309, 18320, 18330, 18340, + 18348, 18351, 16709, 18356, 18361, 16714, 16865, 18369, 18382, 18397, + 18408, 16882, 18426, 18439, 18452, 18463, 12086, 18474, 18487, 18506, + 18517, 18528, 18539, 2748, 18552, 18556, 18564, 18575, 18586, 18594, + 18609, 18624, 18635, 18642, 18648, 18656, 18660, 18666, 18669, 18682, + 18694, 18704, 18712, 18719, 18727, 18737, 18742, 18749, 18754, 18761, + 18772, 18782, 18788, 18793, 18798, 16719, 18802, 18808, 18814, 18819, + 18824, 18829, 18833, 16724, 16730, 18837, 16736, 18842, 18850, 18855, + 18859, 18866, 18874, 18881, 18890, 18897, 18901, 18905, 18910, 18915, + 18920, 18925, 18930, 10179, 18935, 18937, 18942, 18947, 18953, 18958, + 18963, 18968, 18973, 18977, 18983, 18989, 18994, 19000, 19005, 19010, + 19014, 19020, 19025, 19029, 19034, 19039, 19051, 19056, 19062, 19067, + 19072, 19078, 19084, 19089, 19094, 19099, 19106, 19112, 19123, 19130, + 19139, 19144, 19148, 263, 19152, 19160, 19165, 19171, 19178, 19185, + 19191, 19196, 19201, 19206, 19213, 19223, 19231, 19236, 19241, 19248, + 19254, 19263, 19273, 19283, 19297, 19311, 19325, 19339, 19354, 19369, + 19386, 19404, 19417, 19423, 19428, 19433, 19437, 19445, 19450, 19458, + 19464, 19470, 19475, 19480, 19484, 19490, 19495, 19499, 19506, 19511, + 19515, 19526, 19532, 19537, 19542, 19549, 19554, 19558, 3839, 19563, + 19569, 19576, 16741, 19582, 19586, 19592, 19597, 19602, 19606, 19612, + 19617, 19622, 19629, 19634, 15198, 19638, 19643, 19647, 19652, 19658, + 19664, 19671, 19681, 19689, 19696, 19701, 19705, 19714, 19722, 19729, + 19736, 19742, 19747, 19753, 19758, 19763, 19769, 19774, 19780, 19785, + 19791, 19797, 19804, 19810, 19815, 19820, 10405, 19829, 19832, 19840, + 19846, 19851, 19856, 19866, 19873, 19879, 19884, 19889, 19895, 19900, + 19906, 19911, 19917, 19924, 19930, 19936, 19941, 19949, 19956, 19961, + 19966, 19972, 19977, 19981, 19990, 20001, 20008, 20015, 20023, 20030, + 20037, 20042, 20047, 20053, 20058, 20066, 20072, 20078, 20085, 20091, + 20096, 20100, 20106, 20111, 20116, 20120, 20125, 1361, 8504, 3036, 20129, + 20133, 20137, 20141, 20145, 20149, 20152, 20157, 20164, 20172, 16752, + 20179, 20189, 20197, 20204, 20212, 20222, 20231, 20244, 20249, 20254, + 20262, 20269, 15307, 15316, 20276, 20286, 20301, 20307, 20314, 20321, + 20328, 20334, 20340, 20351, 20359, 20367, 20377, 20387, 20396, 16757, + 20405, 20411, 20417, 20426, 20434, 20442, 20447, 20456, 20464, 20476, + 20486, 20496, 20506, 20515, 20527, 20537, 20547, 20558, 20565, 20570, + 20577, 20589, 20601, 20613, 20625, 20637, 20649, 20661, 20673, 20685, + 20697, 20708, 20720, 20732, 20744, 20756, 20768, 20780, 20792, 20804, + 20816, 20828, 20839, 20851, 20863, 20875, 20887, 20899, 20911, 20923, + 20935, 20947, 20959, 20970, 20982, 20994, 21006, 21018, 21030, 21042, + 21054, 21066, 21078, 21090, 21101, 21113, 21125, 21137, 21149, 21161, + 21173, 21185, 21197, 21209, 21221, 21232, 21244, 21256, 21268, 21280, + 21292, 21304, 21316, 21328, 21340, 21352, 21363, 21375, 21387, 21399, + 21411, 21423, 21435, 21447, 21459, 21471, 21483, 21494, 21506, 21518, + 21530, 21542, 21555, 21568, 21581, 21594, 21607, 21620, 21633, 21645, + 21658, 21671, 21684, 21697, 21710, 21723, 21736, 21749, 21762, 21775, + 21787, 21800, 21813, 21826, 21839, 21852, 21865, 21878, 21891, 21904, + 21917, 21929, 21942, 21955, 21968, 21981, 21994, 22007, 22020, 22033, + 22046, 22059, 22071, 22084, 22097, 22110, 22123, 22136, 22149, 22162, + 22175, 22188, 22201, 22213, 22226, 22239, 22252, 22265, 22278, 22291, + 22304, 22317, 22330, 22343, 22355, 22366, 22379, 22392, 22405, 22418, + 22431, 22444, 22457, 22470, 22483, 22496, 22508, 22521, 22534, 22547, + 22560, 22573, 22586, 22599, 22612, 22625, 22638, 22650, 22663, 22676, + 22689, 22702, 22715, 22728, 22741, 22754, 22767, 22780, 22792, 22805, + 22818, 22831, 22844, 22857, 22870, 22883, 22896, 22909, 22922, 22934, + 22947, 22960, 22973, 22986, 22999, 23012, 23025, 23038, 23051, 23064, + 23076, 23089, 23102, 23115, 23128, 23141, 23154, 23167, 23180, 23193, + 23206, 23218, 23231, 23244, 23257, 23270, 23283, 23296, 23309, 23322, + 23335, 23348, 23360, 23373, 23386, 23399, 23412, 23425, 23438, 23451, + 23464, 23477, 23490, 23502, 23515, 23528, 23541, 23554, 23567, 23580, + 23593, 23606, 23619, 23632, 23644, 23657, 23670, 23683, 23696, 23709, + 23722, 23735, 23748, 23761, 23774, 23786, 23797, 23806, 23814, 23822, + 23829, 23835, 23839, 23845, 23851, 23859, 23864, 23870, 23875, 23879, + 23888, 10184, 23899, 23905, 23912, 23920, 23927, 12680, 12694, 23934, + 23941, 23950, 23955, 23960, 23967, 23972, 23977, 8520, 8526, 8532, 23982, + 23987, 23990, 23995, 24003, 24010, 24017, 24024, 24030, 24039, 24048, + 24057, 24063, 24071, 24080, 24084, 24090, 24095, 24105, 24112, 24118, + 24126, 24132, 24139, 24145, 24155, 24164, 24168, 24175, 24179, 24184, + 24190, 24198, 24202, 24212, 16767, 24221, 24227, 24231, 24240, 24249, + 24259, 24265, 16772, 24272, 24279, 24290, 24298, 24308, 24317, 24325, + 9902, 24333, 24338, 24344, 24349, 24353, 24357, 24361, 10923, 24366, + 24374, 24381, 24390, 24398, 24405, 24412, 24421, 24427, 976, 24434, + 24440, 24444, 24450, 24457, 24463, 24471, 24477, 24484, 24490, 24496, + 24505, 24509, 24517, 24526, 24533, 24538, 24542, 24553, 24558, 24563, + 24569, 24574, 24587, 8747, 24591, 24597, 24603, 24609, 24614, 24622, + 24626, 24633, 24642, 24647, 17045, 24655, 24659, 24671, 24676, 24680, + 24683, 24689, 24695, 24701, 24706, 24711, 24715, 24718, 24729, 24734, + 10456, 24741, 24746, 24751, 24756, 24761, 24766, 24771, 24776, 24781, + 10461, 24786, 24791, 24796, 24801, 24806, 24811, 24816, 24821, 24826, + 24831, 24836, 24841, 24847, 24852, 24857, 24862, 24867, 24872, 24877, + 24882, 24887, 24892, 24898, 24904, 24909, 24914, 24919, 24924, 24929, + 24934, 24939, 24944, 24949, 24955, 24960, 24965, 24970, 24976, 24982, + 24987, 24992, 24997, 25002, 25007, 25012, 25017, 25022, 25028, 25033, + 25038, 25043, 25048, 25054, 25059, 25064, 25068, 1284, 145, 25076, 25080, + 25084, 25088, 25093, 25097, 15204, 2346, 25101, 25106, 25110, 25115, + 25119, 25124, 25128, 25134, 25139, 25143, 25147, 25155, 25159, 25163, + 25170, 25175, 25180, 25184, 25190, 25195, 25199, 25204, 25209, 25213, + 25220, 25227, 25234, 25239, 25243, 25247, 25252, 25256, 25259, 25265, + 25278, 25283, 25289, 25298, 25303, 10683, 25308, 25317, 25322, 25325, + 25329, 25334, 25339, 25344, 25349, 25354, 2844, 2849, 25359, 25365, + 25369, 25375, 3800, 25380, 25385, 25390, 25396, 25401, 16138, 25406, + 25411, 25416, 25421, 25427, 25432, 25437, 25443, 25448, 25452, 25457, + 25462, 25467, 25472, 25477, 25481, 25486, 25490, 25495, 25500, 25505, + 25510, 25514, 25519, 25523, 25528, 25533, 25538, 25453, 3045, 25458, + 25543, 25551, 25558, 11017, 25570, 25578, 25588, 25606, 25625, 25634, + 25642, 25463, 25649, 25654, 25662, 25468, 25667, 25672, 25680, 25685, + 25690, 25694, 25473, 25699, 25707, 25712, 25716, 25723, 25729, 25738, + 25742, 25750, 25754, 25757, 25764, 25768, 25772, 25777, 25783, 25790, + 25795, 9929, 25799, 25804, 25809, 25814, 25819, 25824, 1689, 1694, 25829, + 25835, 25841, 25846, 25850, 25854, 25858, 25862, 25866, 25870, 25874, + 25878, 25881, 25887, 25894, 25902, 25908, 25914, 25919, 25924, 25930, + 25934, 25939, 25946, 16044, 16051, 25952, 25964, 25967, 25974, 25978, + 19187, 25985, 25993, 26004, 26013, 26026, 26036, 26050, 26062, 26076, + 26089, 26101, 26111, 26123, 26129, 26135, 26150, 26174, 26192, 26211, + 26224, 26238, 26256, 26272, 26289, 26307, 26318, 26337, 26354, 26374, + 26392, 26404, 26418, 26432, 26444, 26461, 26480, 26498, 26510, 26528, + 26547, 16925, 26560, 26580, 26592, 12117, 26604, 26609, 26614, 26619, + 26628, 26634, 26639, 26643, 26650, 26656, 26660, 26665, 26670, 26675, + 26680, 26685, 26690, 2440, 26695, 26701, 26705, 26708, 26719, 26723, + 26726, 26734, 26740, 14356, 26744, 26753, 26764, 26770, 26776, 26791, + 26800, 26808, 26815, 26820, 26824, 26831, 26837, 26846, 26854, 26861, + 26871, 26880, 26890, 26895, 26904, 26913, 26924, 26935, 26945, 26962, + 4450, 26972, 26976, 26986, 26994, 27004, 27015, 27021, 27026, 27036, + 27044, 27051, 27057, 27064, 27069, 25501, 27073, 27082, 27086, 27089, + 27094, 27102, 27109, 27118, 27126, 27134, 27142, 27152, 27161, 27167, + 27173, 27177, 25506, 25511, 27181, 27191, 27201, 27211, 27219, 27226, + 27236, 27244, 27252, 27258, 27266, 782, 27275, 17126, 599, 27289, 27298, + 27306, 27317, 27328, 27338, 27347, 27359, 27368, 27377, 27384, 27390, + 27400, 27409, 27418, 27426, 27434, 27444, 27452, 27460, 27466, 27471, + 27476, 27481, 7915, 27486, 27489, 27493, 27498, 27504, 27509, 27513, + 11142, 25524, 25529, 27521, 27527, 27533, 27538, 27543, 27547, 27555, + 27561, 27567, 27571, 3824, 27579, 27584, 27589, 27593, 27597, 11266, + 27604, 27612, 27626, 27633, 27640, 27646, 11275, 11281, 27654, 27662, + 27669, 27674, 27679, 25534, 27685, 27696, 27700, 27705, 2679, 27710, + 27721, 27727, 27732, 27736, 27740, 27743, 27750, 27757, 27763, 27771, + 27778, 27784, 27788, 7955, 27793, 27797, 27801, 27809, 27814, 27819, + 27824, 1717, 27829, 27834, 27839, 27844, 27849, 27854, 27859, 27864, + 27869, 27874, 27879, 27884, 27889, 27894, 27900, 27905, 27910, 27915, + 27920, 27925, 27930, 27936, 27941, 27946, 27951, 27956, 27961, 27966, + 27971, 27977, 27983, 27988, 27994, 27999, 28004, 5, 28010, 28014, 28018, + 28022, 28027, 28031, 28035, 28039, 28043, 28048, 28052, 28057, 28061, + 28064, 28068, 28073, 28077, 28082, 28086, 28090, 28094, 28099, 28103, + 28107, 28117, 28122, 28126, 28130, 28135, 28140, 28149, 28154, 28159, + 28163, 28167, 28176, 28189, 28201, 28210, 28219, 28224, 28230, 28235, + 28239, 28243, 28253, 28262, 28270, 28276, 28281, 28285, 28292, 28302, + 28311, 28319, 12474, 28327, 28335, 28344, 28353, 28361, 28371, 28376, + 28380, 28384, 28387, 28389, 28393, 28397, 28402, 28407, 28411, 28415, + 28418, 28422, 28425, 28429, 28432, 28435, 28439, 28445, 28449, 28453, + 28457, 28461, 28466, 28471, 28476, 28480, 28483, 28488, 28494, 28499, + 28505, 28510, 28514, 28520, 28524, 28528, 28533, 28537, 28542, 28547, + 28551, 28555, 28562, 28566, 28569, 28573, 28577, 28583, 28589, 28593, + 28597, 28602, 28609, 28615, 28619, 28628, 28632, 28636, 28639, 28645, + 28650, 28656, 1417, 1769, 28661, 28666, 28671, 28676, 28681, 28686, + 28691, 2150, 747, 28696, 28699, 28703, 28707, 28712, 28716, 17138, 28720, + 28725, 28730, 28734, 28737, 28742, 28746, 28751, 28755, 17142, 28760, + 28763, 28766, 28772, 28776, 28781, 28785, 28798, 28802, 28805, 28813, + 28822, 28829, 28834, 28840, 28846, 28854, 28861, 28868, 28872, 28876, + 28880, 28885, 28890, 28894, 28902, 28907, 28914, 28926, 28937, 28942, + 28946, 28953, 28957, 28962, 28968, 28971, 28976, 28981, 28988, 28992, + 28996, 28999, 29005, 8642, 2350, 29009, 29014, 29030, 10734, 29050, + 29059, 29075, 29079, 29086, 29089, 29095, 29105, 29111, 29120, 29135, + 29146, 29158, 29169, 29177, 29186, 29192, 29201, 29211, 29221, 29232, + 29243, 29253, 29262, 29269, 29278, 29286, 29293, 29300, 29308, 29315, + 29322, 29335, 29342, 29350, 29357, 29363, 29368, 29377, 29384, 29390, + 29395, 29403, 29411, 29418, 29425, 26996, 29437, 29449, 29463, 29471, + 29479, 29487, 29494, 29506, 29515, 29524, 29532, 29540, 29548, 29555, + 29561, 29570, 29578, 29588, 29597, 29607, 29616, 29625, 29633, 29638, + 29642, 29645, 29649, 29653, 29657, 29661, 29665, 29671, 29677, 29682, + 29690, 17200, 29697, 29702, 29709, 29715, 29722, 17208, 29729, 29732, + 29744, 29752, 29758, 29763, 29767, 29778, 29788, 29798, 11205, 29807, + 29816, 29824, 29834, 29843, 29850, 29857, 29865, 29869, 17219, 29872, + 29879, 29883, 4394, 29889, 29892, 29899, 29905, 29910, 29917, 29923, + 29927, 29932, 29936, 29945, 29952, 29958, 8700, 29965, 29973, 29980, + 29986, 29991, 29997, 30003, 30011, 30017, 30021, 30024, 30026, 29650, + 11218, 30035, 30040, 30046, 30056, 30061, 30068, 30074, 30079, 30084, + 30089, 30093, 30098, 30105, 30111, 30120, 30128, 30132, 30139, 30145, + 30154, 30161, 4648, 30167, 30173, 30178, 30185, 30197, 30208, 30213, + 30217, 30227, 30233, 30237, 30242, 30252, 30261, 30265, 30272, 30280, + 30287, 30293, 30298, 30306, 30313, 30318, 30325, 30337, 30346, 30350, + 15130, 30358, 30368, 30372, 30380, 28809, 30391, 30396, 30400, 30407, + 30414, 25186, 29575, 30419, 30423, 30426, 26324, 30431, 30445, 30461, + 30479, 30498, 30515, 30533, 26343, 30550, 30570, 26360, 30582, 30594, + 18413, 30606, 26380, 30620, 30632, 12130, 30646, 30651, 30656, 30661, + 30667, 30673, 30679, 30683, 30691, 30698, 30703, 30713, 30719, 11692, + 30725, 30727, 30732, 30740, 30744, 30101, 30750, 30757, 13395, 13405, + 30764, 30771, 30781, 30786, 30790, 30793, 30799, 30807, 30819, 30829, + 30845, 30858, 30872, 18431, 30886, 30893, 30897, 30900, 30905, 30909, + 30916, 30923, 30930, 30940, 30945, 30950, 30955, 30963, 30971, 30976, + 30985, 27017, 3485, 30990, 30993, 30996, 31001, 31008, 31013, 31018, + 31034, 31042, 31050, 10498, 31058, 31063, 31067, 31073, 31078, 31084, + 31087, 31093, 31105, 31113, 31120, 31126, 31133, 31144, 31158, 31171, + 31177, 31186, 31192, 31201, 31213, 31224, 31234, 31243, 31252, 31260, + 31271, 8682, 31278, 31285, 31291, 31296, 31302, 31309, 31320, 31330, + 31340, 31349, 31355, 31362, 31367, 31375, 31382, 31390, 31398, 31410, + 6904, 1094, 31417, 31426, 31434, 31440, 31446, 31451, 31455, 31458, + 31464, 31471, 31476, 31481, 31486, 31490, 31502, 31513, 31522, 31530, + 17401, 31535, 31543, 31548, 31556, 31562, 31568, 13388, 9497, 31573, + 31577, 31581, 31584, 31587, 31593, 31601, 31609, 31613, 31617, 31622, + 31626, 31629, 31638, 31643, 31647, 31650, 31658, 31669, 31678, 31682, + 31688, 31694, 31698, 31704, 31712, 31734, 31758, 31769, 31778, 31784, + 31791, 31798, 31804, 31812, 31818, 31823, 31834, 31852, 31859, 31867, + 31871, 31878, 31883, 31892, 31905, 31913, 31925, 31936, 31947, 31957, + 31971, 31980, 31988, 32000, 10751, 32011, 32022, 32033, 32045, 32055, + 32064, 32074, 32079, 32083, 32091, 32102, 32112, 32118, 32123, 32127, + 32130, 32133, 32141, 32149, 32158, 32168, 32177, 32183, 32197, 2762, + 32219, 32230, 32239, 32249, 32261, 32270, 32279, 32289, 32297, 32305, + 32314, 32319, 32330, 32335, 32344, 32350, 32361, 32365, 32368, 32378, + 32387, 32395, 32405, 32415, 32423, 32432, 32439, 32447, 32454, 32463, + 32472, 32477, 32482, 32486, 32494, 32501, 32505, 32513, 32520, 32531, + 32546, 32553, 32559, 32569, 32578, 32584, 32595, 32599, 32606, 32610, + 32617, 32623, 16275, 32629, 32633, 32638, 32644, 32651, 32655, 32659, + 32667, 32675, 32681, 32690, 32697, 32704, 32709, 32714, 32724, 27071, + 32728, 32731, 32736, 32741, 32746, 32751, 32756, 32761, 32766, 32771, + 32777, 32782, 32787, 32793, 1134, 725, 32798, 32805, 32814, 2398, 32821, + 32826, 32830, 32836, 1183, 653, 32841, 311, 32845, 32854, 32862, 32871, + 32879, 32886, 32897, 32905, 32914, 32924, 32932, 32937, 11373, 32941, + 32949, 32957, 32962, 17155, 4008, 32968, 32974, 32980, 6462, 32985, + 32989, 32996, 33002, 33008, 33012, 33018, 33023, 33030, 1376, 33036, + 33043, 33047, 1283, 6470, 33052, 33062, 33070, 33076, 33086, 33095, + 33103, 33109, 33114, 33122, 33129, 12911, 33135, 33142, 33147, 33154, + 33164, 1436, 230, 2149, 33170, 33176, 33183, 33194, 33205, 33213, 33220, + 33230, 33239, 33247, 33256, 33263, 33270, 33283, 33290, 33296, 33307, + 33326, 1188, 33331, 33336, 33344, 3891, 33348, 33353, 33357, 33361, 1380, + 28416, 33371, 33375, 33380, 33384, 33390, 3758, 33396, 33404, 33411, + 33422, 33431, 33439, 33464, 33472, 33477, 3892, 377, 33483, 33491, 33499, + 33506, 33512, 33517, 2218, 12332, 33524, 33530, 29928, 30203, 33536, 613, + 106, 33540, 33544, 33550, 715, 10371, 33555, 33562, 33568, 33572, 33576, + 1581, 33579, 33583, 17669, 33586, 33591, 33598, 33604, 8713, 33609, + 33617, 33624, 33630, 25696, 33634, 33638, 33642, 33646, 3962, 19497, + 33650, 33655, 33659, 33662, 33670, 33678, 33683, 33692, 33700, 33703, + 33710, 33720, 33732, 33740, 33745, 33749, 33757, 33764, 33770, 33777, + 33784, 33787, 33791, 33795, 1391, 33805, 33807, 33812, 33818, 33824, + 33829, 33834, 33839, 33844, 33849, 33854, 33859, 33864, 33869, 33874, + 33879, 33884, 33889, 33894, 33900, 33906, 33912, 33918, 33923, 33928, + 33933, 33939, 33944, 33949, 33954, 33960, 33965, 33971, 33976, 33981, + 33986, 33991, 33997, 34002, 34008, 34013, 34018, 34023, 34028, 34034, + 34039, 34045, 34050, 34055, 34060, 34065, 34070, 34075, 34080, 34085, + 34090, 34096, 34102, 34108, 34113, 34118, 34123, 34128, 34134, 34140, + 34146, 34152, 34158, 34164, 34169, 34175, 34180, 34185, 34190, 34195, + 34201, 2486, 34206, 2493, 2500, 2886, 34211, 2506, 2516, 34217, 2548, + 2553, 2558, 34221, 34226, 34231, 34237, 34242, 34247, 34251, 34256, + 34262, 34267, 34272, 34277, 34283, 34288, 34292, 34296, 34301, 34306, + 34311, 34316, 34321, 34327, 34333, 34338, 34342, 34347, 34353, 34357, + 34362, 34367, 34372, 34377, 34381, 34384, 34389, 34394, 34399, 34404, + 34409, 34415, 34421, 34426, 34431, 34436, 34440, 34445, 34450, 34455, + 34460, 34465, 34470, 34474, 34479, 34484, 34489, 34493, 34497, 34501, + 34506, 34514, 34519, 34524, 34530, 34536, 34542, 34547, 34555, 34559, + 34562, 34567, 34572, 34576, 34581, 34586, 34590, 34595, 34599, 34602, + 34607, 4104, 20257, 34612, 34617, 34622, 34627, 34635, 24401, 33040, + 10010, 34640, 34645, 34649, 34654, 34658, 34662, 34667, 34671, 34674, + 34677, 34681, 34686, 34690, 34698, 34702, 34705, 34710, 34714, 34718, + 34723, 34728, 34732, 34738, 34743, 34748, 34755, 34762, 34766, 34769, + 34775, 34784, 34791, 34799, 34806, 34810, 34815, 34819, 34823, 34829, + 34834, 34840, 34844, 34850, 34855, 34860, 34864, 34871, 34877, 34883, + 34889, 34895, 34902, 34908, 34914, 34920, 34926, 34932, 34938, 34944, + 34951, 34957, 34964, 34970, 34976, 34982, 34988, 34994, 35000, 35006, + 35012, 35018, 35024, 35029, 35034, 13266, 35039, 35045, 35050, 35055, + 35060, 35065, 35068, 35074, 35079, 35087, 35092, 35096, 35101, 35107, + 35116, 35122, 35127, 35132, 35137, 35141, 35146, 35150, 35155, 35160, + 35165, 35170, 35177, 35184, 35190, 35196, 35201, 19116, 35208, 35214, + 35221, 35227, 35233, 35238, 35246, 35251, 10916, 35255, 35260, 35265, + 35271, 35276, 35281, 35285, 35290, 35295, 35301, 35306, 35311, 35316, + 35320, 35325, 35330, 35334, 35339, 35344, 35348, 35353, 35357, 35362, + 35367, 35372, 35376, 35381, 35385, 35390, 35394, 35398, 35402, 17825, + 35407, 35414, 35423, 35429, 35435, 35444, 35452, 35461, 35469, 35474, + 35478, 35485, 35491, 35499, 35503, 35506, 35511, 35515, 35524, 35532, + 35550, 35556, 1435, 35562, 35565, 35569, 25836, 25842, 35575, 35579, + 35590, 35601, 35612, 35624, 35628, 35635, 35642, 35649, 35654, 35658, + 35666, 35671, 35676, 35681, 35686, 6527, 1050, 24400, 35691, 35696, + 35700, 35705, 35709, 35715, 35720, 35726, 35731, 35737, 35742, 35748, + 35753, 35759, 35765, 35771, 35776, 35732, 35738, 35780, 35785, 35791, + 35796, 35802, 35807, 35813, 35818, 35743, 11983, 35822, 35754, 35760, + 35766, 2978, 3672, 35828, 35831, 35836, 35842, 35848, 35854, 35861, + 35867, 35873, 35879, 35885, 35891, 35897, 35903, 35909, 35915, 35921, + 35927, 35933, 35940, 35946, 35952, 35958, 35964, 35970, 35973, 35978, + 35981, 35988, 35993, 36001, 36005, 36010, 36015, 36021, 36026, 36031, + 36035, 36040, 36046, 36051, 36057, 36062, 36068, 36073, 36079, 36085, + 36089, 36094, 36099, 36104, 36109, 36113, 36118, 36123, 36128, 36134, + 36140, 36146, 36152, 36157, 36161, 36164, 36170, 36176, 36185, 36193, + 36200, 36205, 36209, 36213, 36218, 17615, 36223, 36231, 36237, 4050, + 1293, 36242, 36246, 8763, 36252, 36258, 36265, 8772, 36269, 36275, 36282, + 36288, 36297, 36305, 36317, 36321, 36328, 36334, 36339, 36343, 36347, + 36350, 36360, 36369, 36377, 35733, 36382, 36392, 36402, 36412, 36418, + 36423, 36433, 36438, 36451, 36465, 36476, 36488, 36500, 36514, 36527, + 36539, 36551, 16966, 36565, 36570, 36575, 36579, 36583, 36587, 36591, + 36597, 36602, 36607, 36612, 36617, 36622, 36627, 1758, 31222, 36632, + 36637, 35781, 36642, 36645, 36650, 36655, 36660, 36666, 36672, 18733, + 11558, 36677, 36683, 36690, 18365, 36696, 36701, 36706, 36710, 36715, + 36720, 35786, 36725, 36730, 36735, 36741, 35792, 36746, 36749, 36756, + 36764, 36770, 36776, 36782, 36793, 36798, 36805, 36812, 36819, 36827, + 36836, 36845, 36851, 36857, 36865, 35797, 36870, 36876, 36882, 35803, + 36887, 36892, 36900, 36908, 36914, 36921, 36927, 36934, 36941, 36947, + 36955, 36965, 36972, 36978, 36983, 36989, 36994, 36999, 37006, 37015, + 37023, 37028, 37034, 37041, 37049, 37055, 37060, 37066, 37075, 37082, + 32163, 37088, 37092, 37097, 37106, 37111, 37116, 37121, 14446, 37129, + 37134, 37139, 37144, 37148, 37153, 37158, 37165, 37170, 37175, 37180, + 35808, 24329, 37186, 2589, 155, 37189, 37192, 37196, 37200, 37210, 37218, + 37225, 37229, 37233, 37236, 37244, 37251, 37258, 30157, 37267, 37270, + 37276, 37283, 37287, 37295, 37303, 37310, 37314, 37318, 37321, 37327, + 37334, 37338, 37342, 37349, 37357, 37365, 35744, 37372, 37380, 37385, + 37397, 11639, 11646, 11653, 11660, 11667, 11674, 578, 404, 37403, 37408, + 37413, 37419, 37424, 37429, 4071, 37434, 37437, 37442, 37447, 37452, + 37457, 37462, 37469, 25960, 37474, 37479, 37484, 37489, 37494, 37500, + 37505, 37511, 35984, 37517, 37522, 37528, 37534, 37544, 37549, 37554, + 37558, 37563, 37568, 37573, 37578, 37591, 37596, 25574, 19579, 978, + 37600, 37606, 37610, 37615, 37620, 37626, 37631, 37636, 37640, 37645, + 37650, 37656, 37661, 37666, 1298, 37670, 37675, 37680, 37685, 37689, + 37694, 37699, 37704, 37710, 37716, 37721, 37725, 37729, 37734, 37739, + 37744, 37748, 37753, 37761, 37765, 37771, 37775, 37782, 37791, 19350, + 35755, 37797, 37804, 37812, 37819, 37825, 37838, 37850, 37855, 37861, + 37865, 2905, 37869, 37873, 37329, 37882, 37893, 37904, 37909, 32226, + 37914, 37919, 37923, 32346, 25847, 37928, 37932, 37937, 35761, 24436, + 37941, 37946, 37952, 37957, 37961, 37965, 37968, 37972, 37978, 37987, + 37998, 38010, 35767, 38015, 38018, 38022, 38026, 38031, 38036, 38041, + 38046, 38051, 38056, 38061, 38066, 341, 38071, 38076, 38081, 38086, + 38091, 38096, 38102, 38107, 38112, 38118, 38123, 38129, 38134, 38140, + 38145, 38150, 38155, 38160, 38165, 38170, 38175, 38180, 38186, 38191, + 38196, 38201, 38206, 38211, 38216, 38221, 38227, 38233, 38238, 38243, + 38248, 38253, 38258, 38263, 38268, 38273, 38278, 38283, 38288, 38293, + 38298, 38303, 38308, 38313, 38318, 38323, 38333, 38343, 38349, 331, 9, + 38354, 38358, 38362, 38370, 38374, 38378, 38381, 16395, 38384, 38389, + 38393, 38398, 38402, 38407, 38411, 38416, 38420, 38423, 38425, 38429, + 38434, 38438, 38449, 38452, 38454, 38458, 38470, 38482, 38491, 38495, + 38505, 38509, 38515, 38520, 38529, 38535, 38540, 38545, 38549, 38553, + 38558, 38565, 38570, 38576, 38581, 38585, 38592, 29583, 29593, 38596, + 38601, 38606, 38611, 38618, 38622, 38629, 38635, 8918, 38639, 38648, + 38656, 38671, 38685, 38694, 38702, 38713, 38722, 38727, 38734, 38744, + 7924, 38754, 38759, 38764, 38768, 38771, 38776, 38780, 38785, 38789, + 38796, 38801, 38806, 38811, 38821, 38826, 38831, 38836, 9883, 38841, + 38843, 38851, 38854, 38857, 38859, 38863, 38869, 38873, 38878, 38883, + 38901, 38915, 38934, 38951, 38960, 38968, 38973, 38978, 1428, 38984, + 38990, 38995, 39005, 39014, 39022, 39027, 39033, 39038, 39047, 39056, + 39067, 39072, 39079, 39085, 39089, 39098, 39105, 39113, 39120, 39133, + 39141, 39145, 39155, 39160, 39164, 39172, 39180, 39185, 39189, 39193, + 39202, 39208, 39213, 39221, 39231, 39240, 39249, 39258, 39269, 39277, + 39288, 39297, 39305, 39312, 39318, 39323, 39334, 39345, 39350, 39354, + 39357, 39361, 39369, 39375, 39386, 39397, 39408, 39419, 39430, 39441, + 39452, 39463, 39475, 39487, 39499, 39511, 39523, 39535, 39547, 39556, + 39560, 39568, 39574, 39580, 39587, 39593, 39598, 39604, 39608, 39613, + 39618, 39623, 38328, 38338, 2460, 39628, 39630, 39635, 39640, 39645, + 39648, 39650, 39654, 39657, 39664, 39668, 11229, 39672, 39678, 39688, + 39693, 39699, 39703, 39708, 39721, 30051, 39727, 39736, 39745, 20480, + 39752, 39761, 36398, 39769, 39774, 39778, 39787, 39795, 39802, 39807, + 39811, 39816, 39821, 39829, 39833, 39841, 39847, 39853, 39858, 39863, + 39867, 39870, 39875, 39888, 39904, 26450, 39921, 39933, 39950, 39962, + 39976, 26467, 26486, 39988, 40000, 2779, 40014, 40019, 40024, 40029, + 40033, 40040, 40052, 40059, 40068, 40071, 40082, 40093, 40101, 40106, + 40110, 40115, 40120, 40125, 40130, 40135, 40140, 36862, 927, 40145, + 40149, 40153, 40156, 40161, 40166, 40172, 40177, 40182, 40188, 40194, + 40199, 40203, 40208, 40213, 40218, 40222, 40225, 40231, 40236, 40241, + 40246, 40250, 40255, 40261, 40269, 30330, 40274, 40279, 40286, 40292, + 40298, 40303, 40311, 25969, 40318, 40323, 40328, 40333, 40337, 40340, + 40345, 40349, 40353, 40360, 40366, 40372, 40378, 40385, 40390, 40396, + 39175, 40400, 40404, 40409, 40422, 40427, 40433, 40441, 40448, 40456, + 40466, 40472, 40478, 40484, 40488, 40497, 40505, 40512, 40517, 40522, + 12006, 40527, 40537, 40544, 40550, 40560, 40565, 40571, 40579, 3924, + 40586, 40593, 40599, 40606, 3930, 40610, 40615, 40626, 40633, 40639, + 40648, 40652, 4502, 40655, 40662, 40668, 40674, 40682, 40692, 33507, + 40699, 40707, 40713, 40718, 40724, 40729, 40733, 29895, 40739, 40746, + 40752, 40760, 40769, 40776, 40782, 40793, 27263, 40799, 40809, 40814, + 40818, 40826, 40834, 40841, 40847, 40852, 10874, 6502, 40857, 40861, + 40863, 40867, 40872, 40874, 40879, 40885, 40890, 40895, 40902, 37465, + 40908, 40913, 40917, 40922, 40926, 40935, 40939, 40945, 40952, 40958, + 40965, 40970, 40979, 40984, 40988, 40993, 41000, 41008, 41016, 41021, + 24492, 41025, 41028, 41032, 41036, 12429, 944, 41040, 41045, 41053, + 41058, 41062, 41071, 41078, 41082, 41086, 41094, 41101, 15728, 41111, + 41115, 41119, 41127, 41135, 41141, 41146, 41155, 15476, 41161, 41170, + 41177, 41182, 41189, 41196, 41204, 41211, 41219, 41227, 41236, 41241, + 41248, 41255, 41262, 41269, 41276, 41281, 41288, 41294, 41311, 41319, + 41329, 41337, 41344, 439, 41348, 41354, 41358, 41363, 38718, 41369, + 41372, 41376, 41382, 41393, 41401, 3935, 41409, 41415, 41421, 41431, + 41437, 41446, 41455, 41465, 41472, 41478, 41483, 3941, 3947, 41492, + 41499, 41507, 41512, 41516, 41523, 41531, 41538, 41545, 41551, 41560, + 41570, 41576, 41584, 41593, 41600, 41608, 41615, 25249, 41619, 41626, + 41632, 41642, 41651, 41659, 41670, 41674, 41684, 41691, 41696, 41702, + 41709, 41717, 41726, 41735, 41745, 41756, 41763, 41768, 41775, 3193, + 41783, 41789, 41794, 41801, 41807, 41813, 41818, 41831, 41844, 41857, + 41864, 41870, 41878, 41886, 41891, 41895, 41899, 41904, 41909, 41914, + 41919, 41924, 41929, 1397, 41934, 41938, 41942, 41946, 41950, 41954, + 41958, 41962, 41966, 41970, 41974, 41978, 41982, 41986, 41990, 41994, + 41998, 42002, 42006, 42010, 42014, 42018, 42022, 42026, 42030, 42034, + 42038, 42042, 42046, 42050, 42054, 42058, 42062, 42066, 42070, 42074, + 42078, 42082, 42086, 42090, 42094, 42098, 42102, 42106, 42110, 42114, + 42118, 42122, 42126, 42130, 42134, 42138, 42142, 42146, 42150, 42154, + 42158, 42162, 42166, 42170, 42174, 42178, 42182, 42186, 42190, 42194, + 42198, 42202, 42206, 42210, 42214, 42218, 42222, 42226, 42230, 42234, + 42238, 42242, 42246, 42250, 42254, 42258, 42262, 42266, 42270, 42274, + 42278, 42282, 42286, 42290, 42294, 42298, 42302, 42306, 42310, 42314, + 42318, 42322, 42326, 42330, 42334, 42338, 42342, 42346, 42350, 42354, + 42358, 42362, 42366, 42370, 42374, 42378, 42382, 42386, 42390, 42394, + 42398, 42402, 42406, 42410, 42414, 42418, 42422, 42426, 42430, 42434, + 42438, 42442, 42446, 42450, 42454, 42458, 42462, 42466, 42470, 42474, + 42478, 42482, 42486, 42490, 42494, 42498, 42502, 42506, 42510, 42514, + 42518, 42522, 42526, 42530, 42534, 42538, 42542, 42546, 42551, 42555, + 42560, 42564, 42569, 42573, 42578, 42582, 42588, 42593, 42597, 42602, + 42606, 42611, 42615, 42620, 42624, 42629, 42633, 42638, 42642, 42647, + 42651, 42657, 42663, 42668, 42672, 42677, 42681, 42687, 42692, 42696, + 42701, 42705, 42710, 42714, 42720, 42725, 42729, 42734, 42738, 42743, + 42747, 42752, 42756, 42762, 42767, 42771, 42776, 42780, 42786, 42791, + 42795, 42800, 42804, 42809, 42813, 42818, 42822, 42827, 42831, 42837, + 42842, 42846, 42852, 42857, 42861, 42867, 42872, 42876, 42881, 42885, + 42890, 42894, 42900, 42906, 42912, 42918, 42924, 42930, 42936, 42942, + 42947, 42951, 42956, 42960, 42966, 42971, 42975, 42980, 42984, 42989, + 42993, 42998, 43002, 43007, 43011, 43016, 43020, 43025, 43029, 43035, + 43040, 43044, 43049, 43053, 43059, 43065, 43070, 127, 63, 43074, 43076, + 43080, 43084, 43088, 43093, 43097, 43101, 43106, 10787, 43111, 43117, + 1703, 6943, 43123, 43126, 43131, 43135, 43140, 43144, 43148, 43153, + 11790, 43157, 43161, 43165, 571, 43169, 17934, 43174, 43178, 43183, + 43188, 43193, 43197, 43204, 30075, 43210, 43213, 43217, 43222, 43228, + 43232, 43235, 43243, 43249, 43254, 43258, 43261, 43265, 43271, 43275, + 43279, 3723, 3728, 14558, 43282, 43286, 43290, 43294, 43298, 43306, + 43313, 43317, 15426, 43324, 43329, 43343, 43350, 43361, 361, 43366, + 43370, 43376, 43388, 43394, 43400, 43405, 43411, 43415, 33780, 43424, + 43430, 43439, 43443, 43447, 43452, 43458, 43463, 43467, 43472, 43476, + 43480, 43487, 43493, 43498, 43509, 43524, 43539, 43554, 43570, 43588, + 11704, 43602, 43609, 43613, 43616, 43625, 43630, 43634, 43642, 18568, + 43650, 43654, 43664, 43675, 33705, 43688, 43692, 43701, 43719, 43738, + 43747, 43755, 43763, 11069, 11903, 43767, 25859, 43770, 34694, 43775, + 11068, 43780, 43786, 43791, 43797, 43802, 43808, 43813, 43819, 43824, + 43830, 43836, 43842, 43847, 43803, 43809, 43851, 43814, 43820, 43825, + 43856, 43831, 43837, 8931, 4327, 43862, 43870, 43874, 43877, 43884, + 43888, 43893, 43898, 43905, 43911, 43917, 43922, 17247, 43926, 29912, + 43930, 43934, 43938, 43944, 43948, 32097, 43957, 10043, 43961, 10469, + 43964, 43971, 43977, 43981, 13867, 43988, 43994, 43999, 44006, 44013, + 44020, 32866, 8828, 44027, 44034, 44041, 44047, 44052, 44059, 44070, + 44076, 44081, 44086, 44091, 44095, 44100, 44107, 43804, 44111, 44121, + 44130, 44141, 44147, 44155, 44162, 44167, 44172, 44177, 44182, 44187, + 44191, 44195, 44202, 44208, 44216, 2353, 29012, 11806, 11818, 11823, + 11829, 44225, 11834, 11839, 11845, 44230, 44240, 44244, 11850, 44249, + 19777, 44252, 44257, 44261, 40063, 44272, 44277, 44284, 44291, 44295, + 44298, 44306, 11717, 44313, 44316, 44322, 44332, 6554, 44341, 44346, + 44352, 44356, 44364, 44368, 44378, 44384, 44389, 44400, 44409, 44418, + 44427, 44436, 44445, 44454, 44463, 44469, 44475, 44480, 44486, 44492, + 44498, 44503, 44506, 44513, 44519, 44523, 44528, 44535, 44542, 44546, + 44549, 44559, 44572, 44581, 44590, 44601, 44614, 44626, 44637, 44646, + 44657, 44662, 44671, 44676, 11855, 44682, 44689, 44697, 44702, 44707, + 30121, 44711, 44718, 4267, 25, 44722, 44727, 19626, 44731, 44734, 44737, + 32283, 44741, 32875, 44749, 44753, 44757, 44760, 44766, 44772, 44777, + 35832, 44786, 44794, 44800, 44807, 32266, 44811, 32497, 44815, 44824, + 44828, 44836, 44842, 44848, 44853, 44857, 32901, 44863, 44866, 44874, + 44882, 4649, 44888, 44892, 44896, 44901, 44908, 44914, 44919, 44924, + 44928, 44934, 44939, 44945, 4555, 766, 44952, 44956, 44959, 44971, 44978, + 44983, 17807, 44987, 44995, 45003, 45011, 45019, 45026, 45034, 45042, + 45049, 45057, 45065, 45073, 45081, 45089, 45097, 45105, 45113, 45121, + 45129, 45137, 45144, 45152, 45160, 45168, 45176, 45184, 45192, 45200, + 45208, 45216, 45224, 45232, 45240, 45248, 45256, 45264, 45272, 45280, + 45288, 45296, 45303, 45311, 45318, 45326, 45334, 45342, 45350, 45358, + 45366, 45374, 45382, 45393, 25285, 45398, 45401, 45408, 45412, 45418, + 45422, 45428, 45433, 45439, 45444, 45449, 45453, 45457, 45465, 45470, + 45475, 45485, 45491, 45504, 45510, 45516, 45522, 45525, 45532, 45537, + 45543, 45548, 19522, 903, 45553, 45556, 45559, 45562, 35916, 35922, + 45565, 35928, 35941, 35947, 35953, 45571, 35959, 35965, 45577, 45583, 18, + 45591, 45598, 45602, 45606, 45614, 36751, 45618, 45622, 45629, 45634, + 45638, 45643, 45649, 45654, 45660, 45665, 45669, 45673, 45677, 45682, + 45686, 45691, 45695, 45699, 45706, 45711, 45715, 45719, 45724, 45728, + 45733, 45737, 45741, 45746, 45752, 18091, 18096, 45757, 45761, 45764, + 45770, 45774, 45778, 24286, 45783, 45787, 45793, 45800, 45806, 45811, + 38747, 45821, 45826, 45834, 45838, 45841, 36766, 45845, 4620, 45850, + 45855, 45859, 45864, 45868, 45873, 15494, 45884, 45888, 45891, 45895, + 45900, 45904, 45909, 45914, 45918, 45922, 45926, 45929, 45933, 45936, + 45941, 45946, 45951, 45956, 45961, 45966, 8415, 15510, 45971, 45974, + 45980, 45985, 45991, 45996, 46002, 46007, 46013, 46018, 46024, 46030, + 46036, 46041, 46045, 46049, 46056, 46065, 46081, 46097, 46107, 32173, + 46114, 46118, 46123, 46128, 46132, 46136, 41730, 46142, 46147, 46151, + 46158, 46163, 46168, 46172, 46175, 46179, 46185, 31025, 46189, 24599, + 46194, 46201, 46209, 46215, 46222, 46230, 46236, 46240, 46245, 46251, + 46259, 46264, 46268, 46277, 10768, 46285, 46289, 46297, 46304, 46309, + 46314, 46319, 46323, 46326, 46332, 46336, 46339, 46343, 46350, 46355, + 46359, 46365, 46369, 46375, 46380, 46385, 30416, 35979, 46390, 46399, + 46407, 46413, 46425, 46438, 46452, 46459, 46465, 46471, 46476, 46484, + 46487, 46489, 46496, 46503, 46509, 46513, 8414, 46516, 46520, 46524, + 46529, 46533, 46537, 46540, 46544, 46558, 26516, 46577, 46590, 46603, + 46616, 26534, 46631, 2732, 46646, 46652, 46656, 46666, 46670, 46674, + 46679, 46683, 46690, 46695, 46699, 46706, 46712, 46717, 46723, 46733, + 46745, 46756, 46761, 46768, 46772, 46776, 46779, 46787, 18589, 4039, + 46792, 18124, 46805, 46812, 46819, 46825, 46829, 46833, 46838, 46844, + 46849, 46855, 46859, 46863, 46866, 46871, 46875, 46880, 46885, 46890, + 46895, 46900, 46905, 46910, 46915, 46920, 8469, 18135, 46925, 46929, + 46935, 46944, 46949, 46958, 46965, 41566, 46971, 46976, 46980, 46987, + 46992, 46999, 47005, 47009, 47012, 47016, 47021, 2810, 47028, 47035, + 47039, 47042, 47047, 47052, 47058, 47063, 47068, 47072, 47077, 47087, + 47092, 47098, 47103, 44973, 47109, 47115, 47125, 47130, 47135, 47139, + 47144, 7926, 7938, 47149, 47152, 47159, 47165, 47174, 9963, 39315, 47182, + 47186, 47190, 36814, 47198, 47209, 47217, 41778, 47224, 47229, 47234, + 47245, 47252, 47263, 36838, 24616, 47271, 1022, 47276, 15917, 47282, + 32257, 47288, 47293, 47303, 47312, 47319, 47325, 47329, 47332, 47339, + 47345, 47352, 47358, 47368, 47376, 47382, 47388, 47393, 47397, 47404, + 47409, 47415, 47422, 47428, 46525, 47433, 47437, 15959, 15968, 15977, + 15986, 15995, 16024, 620, 16033, 47443, 47448, 47451, 47457, 47465, 1315, + 47470, 47474, 47479, 47484, 47489, 47496, 47502, 47506, 47511, 47517, + 47521, 35989, 47526, 47531, 47540, 47547, 47557, 47563, 32301, 47580, + 47589, 47597, 47603, 47608, 47615, 47621, 47629, 47638, 47646, 47654, + 47660, 47664, 47669, 47677, 33386, 36847, 47683, 47702, 18492, 47716, + 47732, 47746, 47752, 47757, 47762, 47767, 47773, 36853, 47778, 47781, + 47788, 47795, 47804, 47809, 47813, 420, 3100, 47820, 47825, 47830, 31394, + 47618, 47834, 47839, 47847, 47851, 47854, 47859, 47865, 47871, 47876, + 47880, 32374, 47883, 47888, 47892, 47895, 47900, 47904, 47909, 47914, + 47918, 47923, 47927, 47931, 47935, 24282, 24293, 47940, 47945, 47951, + 47956, 47962, 47968, 30981, 47973, 47977, 47980, 47986, 47991, 47996, + 48001, 48006, 48011, 48016, 48021, 48026, 48032, 48038, 24379, 18795, + 48043, 48048, 48053, 48058, 48063, 48068, 48073, 48078, 450, 68, 36006, + 36011, 36016, 36022, 36027, 36032, 48083, 36036, 48087, 48091, 48095, + 36041, 36047, 48109, 36058, 36063, 48117, 48122, 36069, 48127, 48132, + 48141, 48146, 48151, 48160, 48166, 48172, 48178, 36086, 48191, 48200, + 48206, 36090, 48210, 36095, 48215, 36100, 36105, 48218, 48223, 48227, + 48233, 15735, 48240, 15745, 48247, 48252, 36110, 48256, 48261, 48266, + 48271, 48276, 48280, 48285, 48290, 48296, 48301, 48306, 48312, 48318, + 48323, 48327, 48332, 48337, 48342, 48346, 48351, 48356, 48361, 48367, + 48373, 48379, 48384, 48388, 48393, 48397, 36114, 36119, 36124, 48401, + 48405, 48410, 48414, 48426, 36129, 36135, 36141, 36153, 48432, 29949, + 48436, 48441, 48445, 48450, 48457, 48462, 48467, 48472, 48476, 48480, + 48490, 48495, 48500, 48504, 48508, 48511, 48519, 48524, 36201, 48528, + 1407, 48534, 48539, 48545, 48553, 48557, 48566, 48574, 48578, 48582, + 48590, 48596, 48604, 48620, 48624, 48628, 48632, 48637, 48643, 48658, + 36238, 1711, 14075, 48662, 1294, 1309, 48674, 48682, 48689, 48694, 48701, + 48706, 10452, 963, 2575, 11882, 48713, 10350, 48718, 48721, 48730, 1202, + 48735, 46696, 48742, 48751, 48756, 48760, 48768, 25915, 2631, 48775, + 12382, 48785, 48791, 2371, 2381, 48800, 48809, 48819, 48830, 3508, 39689, + 48835, 4234, 4245, 19560, 1207, 48839, 48847, 48854, 48859, 48863, 48867, + 48872, 27524, 47023, 11973, 48880, 48889, 48898, 48906, 48919, 48926, + 48937, 48942, 48955, 48968, 48980, 48992, 49004, 49015, 49028, 49039, + 49050, 49060, 49068, 49076, 49088, 49100, 49111, 49120, 49128, 49135, + 49147, 49154, 49160, 49169, 49175, 49182, 49195, 49200, 49210, 49215, + 49221, 49226, 43978, 49230, 46328, 49237, 49244, 49252, 49259, 2588, + 49266, 49277, 49287, 49296, 49304, 49314, 49322, 49331, 49341, 49350, + 49355, 49361, 49367, 4083, 49378, 49388, 49397, 49406, 49414, 49424, + 49432, 49441, 49446, 49451, 49456, 1636, 47, 49464, 49472, 49483, 49494, + 19181, 49504, 49508, 49515, 49521, 49526, 49530, 49541, 49551, 49560, + 49571, 19599, 19604, 49576, 49585, 49590, 49600, 49605, 49613, 49621, + 49628, 49634, 1598, 259, 49638, 49644, 49649, 49652, 2119, 2597, 49660, + 49664, 49667, 1452, 49673, 16224, 1212, 49678, 49691, 2721, 2742, 49705, + 49717, 49729, 2756, 2773, 2788, 2804, 2821, 49743, 49755, 2836, 49769, + 1218, 1224, 1230, 12253, 49774, 49779, 49784, 49788, 49803, 49818, 49833, + 49848, 49863, 49878, 49893, 49908, 49923, 49938, 49953, 49968, 49983, + 49998, 50013, 50028, 50043, 50058, 50073, 50088, 50103, 50118, 50133, + 50148, 50163, 50178, 50193, 50208, 50223, 50238, 50253, 50268, 50283, + 50298, 50313, 50328, 50343, 50358, 50373, 50388, 50403, 50418, 50433, + 50448, 50463, 50478, 50493, 50508, 50523, 50538, 50553, 50568, 50583, + 50598, 50613, 50628, 50643, 50658, 50673, 50688, 50703, 50718, 50733, + 50748, 50763, 50778, 50793, 50808, 50823, 50838, 50853, 50868, 50883, + 50898, 50913, 50928, 50943, 50958, 50973, 50988, 51003, 51018, 51033, + 51048, 51063, 51078, 51093, 51108, 51123, 51138, 51153, 51168, 51183, + 51198, 51213, 51228, 51243, 51258, 51273, 51288, 51303, 51318, 51333, + 51348, 51363, 51378, 51393, 51408, 51423, 51438, 51453, 51468, 51483, + 51498, 51513, 51528, 51543, 51558, 51573, 51588, 51603, 51618, 51633, + 51648, 51663, 51678, 51693, 51708, 51723, 51738, 51753, 51768, 51783, + 51798, 51813, 51828, 51843, 51858, 51873, 51888, 51903, 51918, 51933, + 51948, 51963, 51978, 51993, 52008, 52023, 52038, 52053, 52068, 52083, + 52098, 52113, 52128, 52143, 52158, 52173, 52188, 52203, 52218, 52233, + 52248, 52263, 52278, 52293, 52308, 52323, 52338, 52353, 52368, 52383, + 52398, 52413, 52428, 52443, 52458, 52473, 52488, 52503, 52518, 52533, + 52548, 52563, 52578, 52593, 52608, 52623, 52638, 52653, 52668, 52683, + 52698, 52713, 52728, 52743, 52758, 52773, 52788, 52803, 52818, 52833, + 52848, 52863, 52878, 52893, 52908, 52923, 52938, 52953, 52968, 52983, + 52998, 53013, 53028, 53043, 53058, 53073, 53088, 53103, 53118, 53133, + 53148, 53163, 53178, 53193, 53208, 53223, 53238, 53253, 53268, 53283, + 53298, 53313, 53328, 53343, 53358, 53373, 53388, 53403, 53418, 53433, + 53448, 53463, 53478, 53493, 53508, 53523, 53538, 53553, 53568, 53583, + 53598, 53613, 53628, 53643, 53658, 53673, 53688, 53703, 53718, 53733, + 53748, 53763, 53778, 53793, 53808, 53823, 53838, 53853, 53868, 53883, + 53898, 53913, 53928, 53943, 53958, 53973, 53988, 54003, 54018, 54033, + 54048, 54063, 54078, 54093, 54108, 54123, 54138, 54153, 54168, 54183, + 54198, 54213, 54228, 54243, 54258, 54273, 54288, 54303, 54318, 54333, + 54348, 54363, 54378, 54393, 54408, 54423, 54438, 54453, 54468, 54483, + 54498, 54513, 54528, 54543, 54558, 54573, 54588, 54603, 54618, 54633, + 54648, 54663, 54678, 54693, 54708, 54723, 54738, 54753, 54768, 54783, + 54798, 54813, 54828, 54843, 54858, 54873, 54888, 54903, 54918, 54933, + 54948, 54963, 54978, 54993, 55008, 55023, 55038, 55053, 55068, 55083, + 55098, 55113, 55128, 55143, 55158, 55173, 55188, 55203, 55218, 55233, + 55248, 55263, 55278, 55293, 55308, 55323, 55338, 55353, 55368, 55383, + 55398, 55413, 55428, 55443, 55458, 55473, 55488, 55503, 55518, 55533, + 55548, 55563, 55578, 55593, 55608, 55623, 55638, 55653, 55668, 55683, + 55698, 55713, 55728, 55743, 55758, 55773, 55788, 55803, 55818, 55833, + 55848, 55863, 55878, 55893, 55908, 55923, 55938, 55953, 55968, 55983, + 55998, 56013, 56028, 56043, 56058, 56073, 56088, 56103, 56118, 56133, + 56148, 56163, 56178, 56193, 56208, 56223, 56238, 56253, 56268, 56283, + 56298, 56313, 56328, 56343, 56358, 56373, 56388, 56403, 56418, 56433, + 56448, 56463, 56478, 56493, 56508, 56523, 56538, 56553, 56568, 56583, + 56598, 56613, 56628, 56643, 56658, 56673, 56688, 56703, 56718, 56733, + 56748, 56763, 56778, 56793, 56808, 56823, 56838, 56853, 56868, 56883, + 56898, 56913, 56928, 56943, 56958, 56973, 56988, 57003, 57018, 57033, + 57048, 57063, 57078, 57093, 57108, 57123, 57138, 57153, 57168, 57183, + 57198, 57213, 57228, 57243, 57258, 57273, 57288, 57303, 57318, 57333, + 57348, 57363, 57378, 57393, 57408, 57423, 57438, 57453, 57468, 57483, + 57498, 57513, 57528, 57543, 57558, 57573, 57588, 57603, 57619, 57635, + 57651, 57667, 57683, 57699, 57715, 57731, 57747, 57763, 57779, 57795, + 57811, 57827, 57843, 57859, 57875, 57891, 57907, 57923, 57939, 57955, + 57971, 57987, 58003, 58019, 58035, 58051, 58067, 58083, 58099, 58115, + 58131, 58147, 58163, 58179, 58195, 58211, 58227, 58243, 58259, 58275, + 58291, 58307, 58323, 58339, 58355, 58371, 58387, 58403, 58419, 58435, + 58451, 58467, 58483, 58499, 58515, 58531, 58547, 58563, 58579, 58595, + 58611, 58627, 58643, 58659, 58675, 58691, 58707, 58723, 58739, 58755, + 58771, 58787, 58803, 58819, 58835, 58851, 58867, 58883, 58899, 58915, + 58931, 58947, 58963, 58979, 58995, 59011, 59027, 59043, 59059, 59075, + 59091, 59107, 59123, 59139, 59155, 59171, 59187, 59203, 59219, 59235, + 59251, 59267, 59283, 59299, 59315, 59331, 59347, 59363, 59379, 59395, + 59411, 59427, 59443, 59459, 59475, 59491, 59507, 59523, 59539, 59555, + 59571, 59587, 59603, 59619, 59635, 59651, 59667, 59683, 59699, 59715, + 59731, 59747, 59763, 59779, 59795, 59811, 59827, 59843, 59859, 59875, + 59891, 59907, 59923, 59939, 59955, 59971, 59987, 60003, 60019, 60035, + 60051, 60067, 60083, 60099, 60115, 60131, 60147, 60163, 60179, 60195, + 60211, 60227, 60243, 60259, 60275, 60291, 60307, 60323, 60339, 60355, + 60371, 60387, 60403, 60419, 60435, 60451, 60467, 60483, 60499, 60515, + 60531, 60547, 60563, 60579, 60595, 60611, 60627, 60643, 60659, 60675, + 60691, 60707, 60723, 60739, 60755, 60771, 60787, 60803, 60819, 60835, + 60851, 60867, 60883, 60899, 60915, 60931, 60947, 60963, 60979, 60995, + 61011, 61027, 61043, 61059, 61075, 61091, 61107, 61123, 61139, 61155, + 61171, 61187, 61203, 61219, 61235, 61251, 61267, 61283, 61299, 61315, + 61331, 61347, 61363, 61379, 61395, 61411, 61427, 61443, 61459, 61475, + 61491, 61507, 61523, 61539, 61555, 61571, 61587, 61603, 61619, 61635, + 61651, 61667, 61683, 61699, 61715, 61731, 61747, 61763, 61779, 61795, + 61811, 61827, 61843, 61859, 61875, 61891, 61907, 61923, 61939, 61955, + 61971, 61987, 62003, 62019, 62035, 62051, 62067, 62083, 62099, 62115, + 62131, 62147, 62163, 62179, 62195, 62211, 62227, 62243, 62259, 62275, + 62291, 62307, 62323, 62339, 62355, 62371, 62387, 62403, 62419, 62435, + 62451, 62467, 62483, 62499, 62515, 62531, 62547, 62563, 62579, 62595, + 62611, 62627, 62643, 62659, 62675, 62691, 62707, 62723, 62739, 62755, + 62771, 62787, 62803, 62819, 62835, 62851, 62867, 62883, 62899, 62915, + 62931, 62947, 62963, 62979, 62995, 63011, 63027, 63043, 63059, 63075, + 63091, 63107, 63123, 63139, 63155, 63171, 63187, 63203, 63219, 63235, + 63251, 63267, 63283, 63299, 63315, 63331, 63347, 63363, 63379, 63395, + 63411, 63427, 63443, 63459, 63475, 63491, 63507, 63523, 63539, 63555, + 63571, 63587, 63603, 63619, 63635, 63651, 63667, 63683, 63699, 63715, + 63731, 63747, 63763, 63779, 63795, 63811, 63827, 63843, 63859, 63875, + 63891, 63907, 63923, 63939, 63955, 63971, 63987, 64003, 64019, 64035, + 64051, 64067, 64083, 64099, 64115, 64131, 64147, 64163, 64179, 64195, + 64211, 64227, 64243, 64259, 64275, 64291, 64307, 64323, 64339, 64355, + 64371, 64387, 64403, 64419, 64435, 64451, 64467, 64483, 64499, 64515, + 64531, 64547, 64563, 64579, 64595, 64611, 64627, 64643, 64659, 64675, + 64691, 64707, 64723, 64739, 64755, 64771, 64787, 64803, 64819, 64835, + 64851, 64867, 64883, 64899, 64915, 64931, 64947, 64963, 64979, 64995, + 65011, 65027, 65043, 65059, 65075, 65091, 65107, 65123, 65139, 65155, + 65171, 65187, 65203, 65219, 65235, 65251, 65267, 65283, 65299, 65315, + 65331, 65347, 65363, 65379, 65395, 65411, 65427, 65443, 65459, 65475, + 65491, 65507, 65523, 65539, 65555, 65571, 65587, 65603, 65619, 65635, + 65651, 65667, 65683, 65699, 65715, 65731, 65747, 65763, 65779, 65795, + 65811, 65827, 65843, 65859, 65875, 65891, 65907, 65923, 65939, 65955, + 65971, 65987, 66003, 66019, 66035, 66051, 66067, 66083, 66099, 66115, + 66131, 66147, 66163, 66179, 66195, 66211, 66227, 66243, 66259, 66275, + 66284, 66299, 17090, 66308, 66313, 66319, 66325, 66335, 66343, 17343, + 18025, 11298, 66356, 1460, 1464, 66364, 4163, 31509, 7863, 66370, 66375, + 66380, 66385, 66390, 66396, 66401, 66407, 66412, 66418, 66423, 66428, + 66433, 66438, 66444, 66449, 66454, 66459, 66464, 66469, 66474, 66479, + 66485, 66490, 66496, 66503, 2635, 66508, 66514, 9347, 66518, 66523, + 66530, 66538, 4174, 4179, 4184, 4189, 65, 66542, 66548, 66553, 66558, + 66562, 66567, 66571, 66575, 12325, 66579, 66589, 66602, 66613, 66626, + 66633, 66639, 66647, 11807, 66654, 66659, 66665, 66671, 66677, 66682, + 66687, 66692, 66697, 66701, 66706, 66711, 66716, 66722, 66728, 66734, + 66739, 66743, 66748, 66753, 66757, 66762, 66767, 66772, 66776, 12341, + 12352, 12357, 1503, 66780, 66786, 1508, 19026, 66791, 19035, 66796, + 66802, 66807, 1539, 66813, 1545, 1551, 12387, 66818, 66827, 66835, 66843, + 66850, 66854, 66858, 66864, 66869, 35645, 66874, 66881, 66888, 66893, + 66897, 66901, 66910, 66915, 66920, 66925, 1556, 264, 66930, 66934, 19161, + 984, 66938, 66945, 66950, 66954, 19197, 1560, 44135, 66957, 66962, 66972, + 66981, 66986, 66990, 66996, 1565, 46977, 67001, 67010, 67016, 67021, + 67026, 12626, 12632, 67032, 67044, 67061, 67078, 67095, 67112, 67129, + 67146, 67163, 67180, 67197, 67214, 67231, 67248, 67265, 67282, 67299, + 67316, 67333, 67350, 67367, 67384, 67401, 67418, 67435, 67452, 67469, + 67486, 67503, 67520, 67537, 67554, 67571, 67588, 67605, 67622, 67639, + 67656, 67673, 67690, 67707, 67724, 67741, 67758, 67775, 67792, 67809, + 67826, 67843, 67860, 67877, 67888, 67898, 67903, 1570, 67907, 67912, + 67918, 67923, 67928, 67935, 10369, 1575, 67941, 67950, 31888, 67955, + 67966, 12643, 67976, 67981, 67987, 67992, 67999, 68005, 68010, 1580, + 19491, 68015, 68021, 12653, 68027, 68032, 68037, 68042, 68047, 68052, + 68057, 68062, 1585, 4638, 68067, 68072, 68078, 68083, 68088, 68093, + 68098, 68103, 68108, 68113, 68118, 68124, 68130, 68136, 68141, 68145, + 68150, 68155, 68159, 68164, 68169, 68174, 68179, 68183, 68188, 68194, + 68199, 68204, 68208, 68213, 68218, 68224, 68229, 68234, 68240, 68246, + 68251, 68255, 68260, 68265, 68270, 68274, 68279, 68284, 68289, 68295, + 68301, 68306, 68310, 68314, 68319, 68324, 68329, 33580, 68333, 68338, + 68343, 68349, 68354, 68359, 68363, 68368, 68373, 68379, 68384, 68389, + 68395, 68401, 68406, 68410, 68415, 68420, 68424, 68429, 68434, 68439, + 68445, 68451, 68456, 68460, 68465, 68470, 68474, 68479, 68484, 68489, + 68494, 68498, 68501, 68504, 68509, 68514, 36365, 68521, 68529, 68535, + 3840, 31831, 68548, 68555, 68561, 68567, 4014, 68572, 12795, 68578, + 68588, 68603, 68611, 12800, 68622, 68627, 68638, 68650, 68662, 68674, + 2827, 68686, 68691, 68703, 68707, 68713, 68719, 68724, 68733, 68740, + 68745, 68750, 68755, 68760, 68765, 68770, 1602, 18664, 68775, 68780, + 47043, 68784, 68788, 68793, 68797, 19639, 68802, 68805, 68810, 68818, + 68826, 1606, 12836, 12842, 1611, 68834, 68841, 68846, 68855, 68865, + 68872, 68877, 68882, 1616, 68889, 68894, 19759, 68898, 68903, 68910, + 68916, 68920, 68933, 68939, 68950, 68960, 68967, 19781, 10263, 10270, + 4248, 4254, 68974, 1621, 68979, 68988, 68994, 69002, 69009, 69015, 69022, + 69034, 69040, 69045, 69052, 69064, 69075, 69084, 69094, 69104, 4142, + 69112, 35439, 35448, 19821, 69125, 69130, 69135, 69140, 69145, 69150, + 69155, 1626, 1630, 69160, 69164, 69167, 69178, 69183, 1640, 69191, 69196, + 69201, 19880, 69213, 69216, 69222, 69228, 69233, 69241, 1645, 69246, + 69251, 69259, 69267, 69274, 69283, 69291, 69300, 69304, 1650, 69313, + 1655, 24467, 69318, 69325, 69331, 19967, 69339, 69349, 69355, 69360, + 69368, 69375, 69384, 69392, 69402, 69411, 69421, 69430, 69441, 69451, + 69461, 69470, 69480, 69494, 69507, 69516, 69524, 69534, 69543, 69555, + 69566, 69577, 69587, 19259, 69592, 12988, 69601, 69607, 69612, 69619, + 69626, 69632, 18870, 69642, 69648, 69653, 69664, 69671, 69678, 69683, + 69691, 13005, 13010, 69699, 69705, 69709, 4232, 4243, 20043, 47131, + 69717, 69723, 69728, 69736, 69743, 14056, 69748, 69754, 69760, 1666, + 69765, 69768, 69774, 69779, 69784, 69789, 69794, 69799, 69804, 69809, + 69814, 69820, 69826, 1373, 69831, 69836, 69841, 69847, 69852, 69857, + 69862, 69867, 69872, 69877, 1675, 13, 69883, 69887, 69892, 69896, 69900, + 69904, 36646, 69909, 26735, 69914, 69919, 69923, 69926, 69930, 69934, + 69939, 69943, 69948, 69952, 69958, 40157, 40162, 40167, 69961, 69968, + 69974, 69982, 46749, 69992, 40173, 36910, 36661, 36667, 40189, 36673, + 69997, 70002, 70006, 36943, 70013, 70016, 70020, 70028, 70035, 70040, + 70043, 70048, 70053, 70057, 70061, 70064, 70074, 70086, 70093, 70099, + 36678, 70106, 38561, 70109, 9364, 1108, 70112, 70116, 70121, 4057, 70125, + 70128, 15778, 70135, 70142, 70155, 70163, 70172, 70181, 70187, 70192, + 70202, 70215, 70227, 70234, 70239, 70248, 70261, 41825, 70279, 70284, + 70291, 70297, 70302, 844, 70307, 70315, 70322, 70329, 31335, 866, 70335, + 70341, 70351, 70359, 70365, 70370, 36697, 6637, 36711, 70374, 70384, + 70389, 70397, 70407, 70422, 70428, 70434, 36721, 70439, 35787, 70443, + 70448, 70455, 70460, 70464, 70469, 70477, 19824, 70484, 70489, 70493, + 6678, 36747, 70497, 70503, 330, 70513, 70520, 70527, 70533, 70540, 70545, + 70554, 15409, 66966, 66976, 70560, 70568, 70572, 70576, 70580, 70584, + 70589, 70593, 70599, 70607, 70612, 70617, 70624, 70629, 70633, 70638, + 70642, 70646, 70652, 70658, 70663, 70667, 70672, 70676, 36871, 70680, + 36877, 36883, 70685, 70691, 70698, 70703, 70707, 35804, 19478, 70710, + 70714, 70719, 70726, 70732, 70736, 70741, 46345, 70747, 70751, 70758, + 70762, 70767, 70773, 70779, 70785, 70797, 70806, 70816, 70822, 70829, + 70834, 70839, 70843, 70846, 70852, 70859, 70864, 70869, 70876, 70883, + 70890, 70896, 70901, 70906, 70914, 36888, 2465, 70919, 70924, 70930, + 70935, 70941, 70946, 70951, 70956, 70962, 36909, 70967, 70973, 70979, + 70985, 36979, 70990, 70995, 71000, 36990, 71005, 71010, 71015, 71021, + 71027, 36995, 71032, 71037, 71042, 37050, 37056, 71047, 71052, 37061, + 37083, 32164, 37089, 37093, 71057, 13757, 71061, 71069, 71075, 71083, + 71090, 71096, 71106, 71112, 71119, 12225, 37107, 71125, 71138, 71147, + 71153, 71162, 71168, 71174, 71181, 27078, 71189, 71196, 71206, 71214, + 71217, 37051, 71222, 71229, 71234, 71238, 71242, 71247, 71251, 4371, + 71256, 71261, 71266, 40251, 40256, 71270, 40270, 71275, 40275, 71280, + 71286, 40287, 40293, 40299, 71291, 71297, 25970, 71308, 71311, 71323, + 71331, 37130, 71335, 71344, 71354, 71363, 37140, 71368, 71375, 71384, + 71390, 71398, 71405, 71412, 6729, 4978, 71417, 37062, 71423, 71426, + 71432, 71439, 71444, 71449, 26982, 71453, 71459, 71465, 71470, 71475, + 71479, 71485, 71491, 38445, 71496, 41440, 43245, 43251, 37171, 37176, + 71500, 71504, 71508, 71511, 71524, 71530, 71534, 71537, 71542, 38814, + 71546, 35809, 24408, 71552, 6658, 6666, 10069, 71555, 71560, 71565, + 71570, 71575, 71580, 71585, 71590, 71595, 71600, 71606, 71611, 71616, + 71622, 71627, 71632, 71637, 71642, 71647, 71652, 71658, 71663, 71669, + 71674, 71679, 71684, 71689, 71694, 71699, 71704, 71709, 71714, 71719, + 71725, 71730, 71735, 71740, 71745, 71750, 71755, 71761, 71766, 71771, + 71776, 71781, 71786, 71791, 71796, 71801, 71806, 71812, 71817, 71822, + 71827, 71832, 71838, 71844, 71849, 71855, 71860, 71865, 71870, 71875, + 71880, 1453, 156, 71885, 71889, 71893, 71897, 28865, 71901, 71905, 71910, + 71914, 71919, 71923, 71928, 71933, 71938, 71942, 71946, 71951, 71955, + 15488, 71960, 71964, 71971, 71981, 17688, 71990, 71999, 72003, 72008, + 72013, 72017, 72021, 28653, 3183, 72025, 72031, 20325, 72035, 72044, + 72052, 72058, 72063, 72075, 72087, 72092, 72096, 72101, 72105, 72111, + 72117, 72122, 72132, 72142, 72148, 72156, 72161, 72165, 72171, 72176, + 72183, 72189, 72194, 72203, 72212, 72216, 18204, 72219, 72228, 72236, + 72248, 72259, 72270, 72279, 72283, 72292, 72300, 72310, 72318, 72325, + 72335, 72341, 72346, 72353, 72362, 72368, 72373, 72380, 72386, 72397, 60, + 35582, 72403, 30247, 30257, 72409, 72417, 72424, 72430, 72434, 72444, + 72455, 72463, 72472, 72477, 72482, 72487, 72491, 72495, 20272, 72503, + 72507, 72513, 72523, 72530, 72536, 72542, 40350, 72546, 72548, 72551, + 72557, 72561, 72572, 72582, 72588, 72595, 72602, 15425, 72610, 72616, + 72625, 72634, 72640, 11169, 72646, 72652, 72657, 72662, 72669, 72674, + 72681, 72687, 72692, 72700, 72713, 72722, 72731, 69456, 69466, 72741, + 72747, 72756, 72762, 72768, 72775, 72782, 72789, 72796, 72803, 72808, + 72812, 72816, 72819, 72829, 72833, 72845, 9733, 72854, 72865, 72870, + 72874, 69475, 72880, 72887, 72896, 72904, 72912, 72917, 72921, 72926, + 72931, 72941, 72949, 72961, 72966, 72970, 72974, 72980, 72988, 72995, + 73007, 73015, 73026, 73033, 73039, 73049, 73055, 73059, 73068, 73077, + 73084, 73090, 73095, 73099, 73103, 73107, 73116, 73125, 73134, 73140, + 73146, 73152, 73157, 73164, 73170, 73178, 73185, 73191, 14520, 73196, + 73202, 73206, 16579, 73210, 73215, 73225, 73230, 73239, 73245, 73251, + 73259, 73266, 73270, 73274, 73281, 73287, 73295, 73302, 73308, 73319, + 73323, 73327, 73331, 73334, 73340, 73345, 73350, 73354, 73358, 73367, + 73375, 73382, 73388, 73395, 27702, 46474, 73400, 73408, 73412, 73416, + 73419, 73427, 73434, 73440, 73449, 73457, 73463, 73468, 73472, 73477, + 73482, 73486, 73490, 73494, 73499, 73508, 73512, 73519, 43354, 73523, + 73529, 73537, 73541, 73547, 73555, 73561, 73566, 73577, 73585, 73591, + 73600, 26117, 73608, 73615, 73622, 73629, 73636, 73643, 49963, 15240, + 73650, 73657, 73662, 40386, 4603, 73668, 73673, 73678, 73684, 73690, + 73696, 73701, 73706, 73711, 73716, 73722, 73727, 73733, 73738, 73744, + 73749, 73754, 73759, 73764, 73769, 73774, 73779, 73785, 73790, 73796, + 73801, 73806, 73811, 73816, 73821, 73826, 73832, 73837, 73842, 73847, + 73852, 73857, 73862, 73867, 73872, 73877, 73882, 73888, 73893, 73898, + 73903, 73908, 73913, 73918, 73923, 73928, 73934, 73939, 73944, 73949, + 73954, 73959, 73964, 73969, 73974, 73979, 73984, 73989, 73994, 74000, + 1830, 282, 74005, 44253, 74009, 74012, 74017, 74021, 74024, 3554, 74029, + 74034, 74038, 74047, 74058, 74075, 74093, 74101, 72908, 74108, 74111, + 74121, 74128, 74137, 74153, 74162, 74172, 74177, 74190, 74200, 74209, + 74217, 74231, 74239, 74248, 74252, 74255, 74262, 74268, 74279, 74286, + 74298, 74309, 74320, 74329, 74336, 1213, 772, 74346, 2668, 74350, 74355, + 74364, 1013, 8806, 23861, 74372, 74380, 74394, 74407, 74411, 74416, + 74421, 74426, 74432, 74438, 74443, 9356, 17731, 74448, 74452, 74460, + 9793, 74465, 74471, 74480, 74488, 1683, 12849, 1023, 4286, 74492, 74496, + 74505, 74515, 2419, 31059, 74524, 74530, 19731, 31074, 74536, 4451, + 13231, 74542, 74549, 69173, 74553, 74557, 74563, 74568, 74573, 3773, 160, + 3799, 74578, 74590, 74594, 74598, 74604, 74609, 31908, 74613, 13219, + 2862, 4, 74618, 74628, 74639, 74650, 74660, 74666, 74677, 74684, 74690, + 74696, 74704, 74711, 74717, 74727, 74737, 74747, 74756, 27065, 1225, + 74761, 74765, 74769, 74775, 74779, 2885, 2891, 9353, 2274, 74783, 74787, + 74796, 74804, 74815, 74823, 74831, 74837, 74842, 74853, 74864, 74872, + 74878, 74883, 10978, 74893, 74901, 74905, 74909, 74914, 74918, 74930, + 32357, 17633, 74937, 74947, 74953, 74959, 7739, 11080, 74969, 74980, + 74991, 75001, 75010, 75014, 75021, 1015, 1095, 75031, 75036, 75044, + 68899, 75052, 75057, 75068, 75075, 75089, 16388, 504, 75099, 75106, + 75110, 75114, 75122, 75131, 75139, 19776, 75145, 75159, 75166, 75172, + 75180, 75189, 75196, 75206, 75214, 75221, 75229, 75236, 4250, 116, 75244, + 75255, 75259, 75271, 75277, 13427, 204, 75282, 10401, 75287, 2930, 75291, + 75298, 75304, 75315, 75325, 75333, 75340, 9744, 75347, 75356, 75364, + 4331, 75377, 4348, 75381, 75386, 75392, 75397, 75402, 75407, 2935, 540, + 75413, 75426, 75430, 75435, 2940, 1829, 892, 75439, 4352, 75447, 75453, + 75457, 783, 75467, 75476, 75481, 3790, 75485, 17382, 17389, 53325, 75489, + 4383, 4260, 15118, 75497, 75504, 75509, 27129, 75513, 75520, 75526, + 75531, 75536, 17402, 192, 75541, 75553, 75559, 75567, 2952, 1720, 75575, + 75577, 75582, 75587, 75592, 75598, 75603, 75608, 75613, 75618, 75623, + 75628, 75634, 75639, 75644, 75649, 75654, 75659, 75664, 75669, 75674, + 75680, 75685, 75690, 75695, 75701, 75706, 75712, 75717, 75722, 75727, + 75732, 75737, 75742, 75747, 75753, 75758, 75764, 75769, 75774, 75779, + 75784, 75789, 75794, 75799, 75804, 9425, 9438, 4399, 4404, 4409, 4414, + 26, 75810, 75816, 75821, 75826, 75831, 75837, 75842, 75846, 75850, 75855, + 75861, 75865, 75871, 75876, 75881, 75887, 75892, 75896, 75901, 75906, + 75910, 75913, 75915, 75919, 75922, 75929, 75934, 75938, 75943, 75947, + 75951, 75955, 75964, 75968, 37404, 75971, 37409, 75978, 75983, 37414, + 75992, 76001, 37420, 76006, 37425, 76015, 76020, 13470, 76024, 76029, + 76034, 37430, 76038, 76047, 48168, 76051, 76054, 76058, 9024, 76064, + 76067, 76072, 76077, 76081, 4072, 37435, 76084, 76088, 76091, 76102, + 76107, 76111, 76117, 76125, 76138, 76142, 76150, 76159, 76165, 76170, + 76176, 76180, 76186, 76192, 76200, 76205, 76209, 76216, 76222, 76230, + 76239, 76247, 37438, 76254, 76264, 76273, 76281, 76292, 76305, 76310, + 76315, 76319, 76328, 76334, 76341, 76354, 76366, 76377, 76389, 76396, + 76405, 76414, 76423, 76430, 76436, 76443, 76451, 76458, 76466, 76475, + 76483, 76490, 76498, 76507, 76515, 76524, 76534, 76543, 76551, 76558, + 76566, 76575, 76583, 76592, 76602, 76611, 76619, 76628, 76638, 76647, + 76657, 76668, 76678, 76687, 76695, 76702, 76710, 76719, 76727, 76736, + 76746, 76755, 76763, 76772, 76782, 76791, 76801, 76812, 76822, 76831, + 76839, 76848, 76858, 76867, 76877, 76888, 76898, 76907, 76917, 76928, + 76938, 76949, 76961, 76972, 76982, 76991, 76999, 77006, 77014, 77023, + 77031, 77040, 77050, 77059, 77067, 77076, 77086, 77095, 77105, 77116, + 77126, 77135, 77143, 77152, 77162, 77171, 77181, 77192, 77202, 77211, + 77221, 77232, 77242, 77253, 77265, 77276, 77286, 77295, 77303, 77312, + 77322, 77331, 77341, 77352, 77362, 77371, 77381, 77392, 77402, 77413, + 77425, 77436, 77446, 77455, 77465, 77476, 77486, 77497, 77509, 77520, + 77530, 77541, 77553, 77564, 77576, 77589, 77601, 77612, 77622, 77631, + 77639, 77646, 77654, 77663, 77671, 77680, 77690, 77699, 77707, 77716, + 77726, 77735, 77745, 77756, 77766, 77775, 77783, 77792, 77802, 77811, + 77821, 77832, 77842, 77851, 77861, 77872, 77882, 77893, 77905, 77916, + 77926, 77935, 77943, 77952, 77962, 77971, 77981, 77992, 78002, 78011, + 78021, 78032, 78042, 78053, 78065, 78076, 78086, 78095, 78105, 78116, + 78126, 78137, 78149, 78160, 78170, 78181, 78193, 78204, 78216, 78229, + 78241, 78252, 78262, 78271, 78279, 78288, 78298, 78307, 78317, 78328, + 78338, 78347, 78357, 78368, 78378, 78389, 78401, 78412, 78422, 78431, + 78441, 78452, 78462, 78473, 78485, 78496, 78506, 78517, 78529, 78540, + 78552, 78565, 78577, 78588, 78598, 78607, 78617, 78628, 78638, 78649, + 78661, 78672, 78682, 78693, 78705, 78716, 78728, 78741, 78753, 78764, + 78774, 78785, 78797, 78808, 78820, 78833, 78845, 78856, 78868, 78881, + 78893, 78906, 78920, 78933, 78945, 78956, 78966, 78975, 78983, 78990, + 78995, 78999, 8837, 79006, 79011, 37448, 79017, 79022, 37453, 79028, + 23983, 29812, 79033, 79039, 79047, 79053, 79059, 79066, 79073, 79078, + 79083, 79087, 79092, 79096, 79099, 79103, 79112, 79121, 79129, 79135, + 79147, 79158, 79162, 3245, 8812, 79167, 79170, 79173, 79175, 79179, + 79183, 79187, 79193, 79198, 29875, 79203, 79207, 79210, 79215, 79219, + 79226, 79232, 79236, 6822, 79240, 79245, 37475, 79249, 79256, 79265, + 79273, 79279, 79290, 79298, 79307, 79315, 79322, 79329, 79335, 79346, + 37480, 79351, 79362, 79374, 79382, 79393, 79402, 79410, 79421, 79426, + 79434, 2630, 79439, 39756, 79452, 79456, 79468, 79476, 79481, 79489, + 79500, 20490, 79509, 79515, 79522, 79530, 79536, 37490, 79541, 4377, + 66339, 79548, 79551, 79559, 79572, 79585, 79598, 79611, 79618, 79629, + 79638, 79643, 49780, 49785, 79647, 79651, 79659, 79666, 79675, 79683, + 79689, 79698, 79706, 79713, 79721, 79725, 79734, 79743, 79753, 79766, + 79779, 79789, 37495, 79795, 79802, 79808, 79814, 37501, 79819, 79822, + 79826, 79834, 79843, 49563, 79851, 79860, 79868, 79875, 79883, 79893, + 79902, 79911, 38943, 79920, 79931, 79946, 79956, 10434, 24737, 79965, + 79970, 79975, 79979, 18862, 79984, 79989, 79995, 80000, 80005, 80011, + 80016, 80021, 24697, 80026, 80033, 80041, 80049, 80057, 80062, 80069, + 80076, 80081, 1738, 80085, 80089, 80097, 80105, 37518, 80111, 80117, + 80129, 80135, 80142, 80146, 80153, 80158, 80165, 80171, 80178, 80189, + 80199, 80209, 80221, 80227, 80235, 80241, 80251, 80261, 37545, 80270, + 80279, 80285, 80297, 80308, 80315, 80320, 80324, 80332, 80338, 80343, + 80348, 80355, 80363, 80375, 80385, 80394, 80403, 80411, 80418, 39589, + 27490, 80424, 80429, 80433, 80437, 80442, 80450, 80456, 80467, 80480, + 80485, 80492, 37550, 80497, 80509, 80518, 80526, 80536, 80547, 80560, + 80567, 80576, 80585, 80593, 80598, 80604, 80608, 1442, 80613, 80618, + 80623, 80628, 80634, 80639, 80644, 80650, 80656, 80661, 80665, 80670, + 80675, 80680, 66906, 80685, 80690, 80695, 80700, 80706, 80712, 80717, + 80721, 80726, 18861, 80731, 80737, 80742, 80748, 80753, 80758, 80763, + 80768, 80772, 80778, 80783, 80792, 80797, 80802, 80807, 80812, 80816, + 80823, 80829, 4707, 20088, 3210, 80834, 80838, 80843, 80847, 80851, + 80855, 53580, 80859, 80784, 80861, 80871, 37559, 80874, 80879, 80888, + 80894, 6791, 37564, 80898, 80904, 80909, 80915, 80920, 80924, 80931, + 80936, 80946, 80955, 80959, 80965, 80971, 80977, 80981, 80989, 80996, + 81004, 81012, 37569, 81019, 81022, 81033, 81040, 81046, 81051, 81055, + 81061, 81069, 81076, 81081, 81085, 81094, 81102, 81108, 81113, 37574, + 81120, 26955, 81132, 81138, 81143, 81149, 81156, 81162, 24430, 31532, + 81168, 81173, 81179, 81183, 81195, 80817, 80824, 24629, 81205, 81210, + 81217, 81223, 81230, 81236, 81247, 81252, 81260, 10139, 81265, 81268, + 81274, 81278, 81282, 81285, 81291, 81297, 37291, 4708, 1457, 15537, + 81304, 81310, 81316, 81322, 81328, 81334, 81340, 81346, 81352, 81357, + 81362, 81367, 81372, 81377, 81382, 81387, 81392, 81397, 81402, 81407, + 81412, 81417, 81423, 81428, 81433, 81439, 81444, 81449, 81455, 81461, + 81467, 81473, 81479, 81485, 81491, 81497, 81503, 81508, 81513, 81519, + 81524, 81529, 81535, 81540, 81545, 81550, 81555, 81560, 81565, 81570, + 81575, 81580, 81585, 81590, 81595, 81601, 81606, 81611, 81616, 81622, + 81627, 81632, 81637, 81642, 81648, 81653, 81658, 81663, 81668, 81673, + 81678, 81683, 81688, 81693, 81698, 81703, 81708, 81713, 81718, 81723, + 81728, 81733, 81738, 81743, 81749, 81754, 81759, 81764, 81769, 81774, + 81779, 81784, 979, 169, 81789, 81793, 81797, 81802, 81810, 81814, 81821, + 81829, 81833, 81846, 81854, 81859, 81864, 30310, 81868, 81873, 81877, + 81882, 81886, 81894, 81898, 23991, 81903, 81907, 69713, 81911, 81914, + 81922, 81930, 81938, 81943, 81948, 81955, 81962, 81968, 81974, 81979, + 81986, 81991, 81999, 74399, 82006, 82011, 69485, 82018, 82023, 82027, + 82034, 82040, 82047, 69512, 13542, 82055, 82060, 82065, 82069, 82072, + 82083, 82092, 82098, 82103, 82107, 82117, 82126, 47959, 82130, 82134, + 82141, 82154, 82160, 82168, 82177, 82188, 82199, 82210, 82221, 82230, + 82236, 82245, 82253, 82263, 82276, 82284, 82291, 82302, 82308, 82313, + 82318, 82324, 82334, 82340, 82350, 82358, 82365, 82375, 82384, 80499, + 82392, 82398, 82406, 82412, 72953, 82419, 82424, 82427, 82431, 82437, + 82441, 82444, 82452, 82458, 82464, 82472, 82484, 82496, 82503, 82508, + 82512, 82523, 82531, 82538, 82550, 82558, 82565, 82573, 82580, 82586, + 82591, 82601, 82610, 82618, 82623, 82633, 82642, 48824, 82649, 82653, + 82658, 82666, 82673, 82679, 82683, 82693, 82704, 82712, 82719, 82731, + 82743, 82752, 79442, 82759, 82769, 82781, 82792, 82806, 82814, 82824, + 82831, 82839, 82852, 82864, 82873, 82881, 82891, 82902, 82914, 82923, + 82933, 82943, 82952, 82959, 82968, 82983, 82991, 83001, 83010, 83018, + 83031, 66309, 83046, 83056, 83065, 83077, 83087, 83099, 83110, 83124, + 83138, 83152, 83166, 83180, 83194, 83208, 83222, 83236, 83250, 83264, + 83278, 83292, 83306, 83320, 83334, 83348, 83362, 83376, 83390, 83404, + 83418, 83432, 83446, 83460, 83474, 83488, 83502, 83516, 83530, 83544, + 83558, 83572, 83586, 83600, 83614, 83628, 83642, 83656, 83670, 83684, + 83698, 83712, 83726, 83740, 83754, 83768, 83782, 83796, 83810, 83824, + 83838, 83852, 83866, 83880, 83894, 83908, 83922, 83936, 83950, 83964, + 83978, 83992, 84006, 84020, 84034, 84048, 84062, 84076, 84090, 84104, + 84118, 84132, 84146, 84160, 84174, 84188, 84202, 84216, 84230, 84244, + 84258, 84272, 84286, 84300, 84314, 84328, 84342, 84356, 84370, 84384, + 84398, 84412, 84426, 84440, 84454, 84468, 84482, 84496, 84510, 84524, + 84538, 84552, 84566, 84580, 84594, 84608, 84622, 84636, 84650, 84664, + 84678, 84692, 84706, 84720, 84734, 84748, 84762, 84776, 84790, 84804, + 84818, 84832, 84846, 84860, 84874, 84888, 84902, 84916, 84930, 84944, + 84958, 84972, 84986, 85000, 85014, 85028, 85042, 85056, 85070, 85084, + 85098, 85112, 85126, 85140, 85154, 85168, 85182, 85196, 85210, 85224, + 85238, 85252, 85266, 85280, 85294, 85308, 85322, 85336, 85350, 85364, + 85378, 85392, 85406, 85420, 85434, 85448, 85462, 85476, 85490, 85504, + 85518, 85532, 85546, 85560, 85574, 85588, 85602, 85616, 85630, 85644, + 85658, 85672, 85686, 85700, 85714, 85728, 85742, 85756, 85770, 85784, + 85798, 85812, 85826, 85840, 85854, 85868, 85882, 85896, 85910, 85924, + 85938, 85952, 85966, 85980, 85994, 86008, 86022, 86036, 86050, 86064, + 86078, 86092, 86106, 86120, 86134, 86148, 86162, 86176, 86190, 86204, + 86218, 86232, 86246, 86260, 86274, 86288, 86302, 86316, 86330, 86344, + 86358, 86372, 86386, 86400, 86414, 86428, 86442, 86456, 86470, 86484, + 86498, 86512, 86526, 86540, 86554, 86568, 86582, 86596, 86610, 86624, + 86638, 86652, 86666, 86680, 86694, 86708, 86722, 86736, 86750, 86764, + 86778, 86792, 86806, 86820, 86834, 86848, 86862, 86876, 86890, 86904, + 86918, 86932, 86946, 86960, 86974, 86988, 87002, 87016, 87030, 87044, + 87058, 87072, 87086, 87100, 87114, 87128, 87142, 87156, 87170, 87184, + 87198, 87212, 87226, 87240, 87254, 87268, 87282, 87296, 87310, 87324, + 87338, 87352, 87366, 87380, 87394, 87408, 87422, 87436, 87450, 87464, + 87478, 87492, 87506, 87520, 87534, 87548, 87562, 87576, 87590, 87604, + 87618, 87632, 87646, 87660, 87674, 87688, 87702, 87716, 87730, 87744, + 87758, 87772, 87786, 87800, 87814, 87828, 87842, 87856, 87870, 87884, + 87898, 87912, 87926, 87940, 87954, 87968, 87982, 87996, 88010, 88024, + 88038, 88052, 88066, 88080, 88094, 88108, 88122, 88136, 88150, 88164, + 88178, 88192, 88206, 88220, 88234, 88248, 88262, 88276, 88290, 88304, + 88318, 88332, 88346, 88360, 88374, 88388, 88402, 88416, 88430, 88444, + 88458, 88472, 88486, 88500, 88514, 88528, 88542, 88556, 88570, 88584, + 88598, 88612, 88626, 88640, 88654, 88668, 88682, 88696, 88710, 88724, + 88738, 88752, 88766, 88780, 88794, 88808, 88822, 88836, 88850, 88864, + 88878, 88892, 88906, 88920, 88934, 88948, 88962, 88976, 88990, 89004, + 89018, 89032, 89046, 89060, 89074, 89088, 89102, 89116, 89130, 89144, + 89158, 89172, 89186, 89200, 89214, 89228, 89242, 89256, 89270, 89284, + 89298, 89312, 89326, 89340, 89354, 89368, 89382, 89396, 89410, 89424, + 89438, 89452, 89466, 89480, 89494, 89508, 89522, 89536, 89550, 89564, + 89578, 89592, 89606, 89620, 89634, 89648, 89662, 89676, 89690, 89704, + 89718, 89732, 89746, 89760, 89774, 89788, 89802, 89816, 89830, 89844, + 89858, 89872, 89886, 89900, 89914, 89928, 89942, 89956, 89970, 89984, + 89998, 90012, 90026, 90040, 90054, 90068, 90082, 90096, 90110, 90124, + 90138, 90152, 90166, 90180, 90194, 90208, 90222, 90236, 90250, 90264, + 90278, 90292, 90306, 90320, 90334, 90348, 90362, 90376, 90390, 90404, + 90418, 90432, 90446, 90460, 90474, 90488, 90502, 90516, 90530, 90544, + 90558, 90572, 90586, 90600, 90614, 90628, 90642, 90656, 90670, 90684, + 90698, 90712, 90726, 90740, 90754, 90768, 90782, 90796, 90810, 90824, + 90838, 90852, 90866, 90880, 90894, 90908, 90922, 90936, 90950, 90964, + 90978, 90992, 91006, 91020, 91034, 91048, 91062, 91076, 91090, 91104, + 91118, 91132, 91146, 91160, 91174, 91188, 91202, 91216, 91230, 91244, + 91258, 91272, 91286, 91300, 91314, 91328, 91342, 91356, 91370, 91384, + 91398, 91412, 91426, 91440, 91454, 91468, 91482, 91496, 91510, 91524, + 91538, 91552, 91566, 91580, 91594, 91608, 91622, 91636, 91650, 91664, + 91678, 91692, 91706, 91720, 91734, 91748, 91762, 91776, 91790, 91804, + 91818, 91832, 91846, 91860, 91874, 91888, 91902, 91916, 91930, 91944, + 91958, 91972, 91986, 92000, 92014, 92028, 92042, 92056, 92070, 92084, + 92098, 92112, 92126, 92140, 92154, 92168, 92182, 92196, 92210, 92224, + 92238, 92252, 92266, 92280, 92294, 92308, 92322, 92336, 92350, 92364, + 92378, 92392, 92406, 92420, 92434, 92448, 92462, 92476, 92490, 92504, + 92518, 92532, 92546, 92560, 92574, 92588, 92602, 92616, 92630, 92644, + 92658, 92672, 92686, 92700, 92714, 92728, 92742, 92756, 92770, 92784, + 92798, 92812, 92826, 92840, 92854, 92868, 92882, 92896, 92910, 92924, + 92938, 92952, 92966, 92980, 92994, 93008, 93022, 93036, 93050, 93064, + 93078, 93092, 93106, 93120, 93134, 93148, 93162, 93176, 93190, 93204, + 93218, 93232, 93246, 93260, 93274, 93288, 93302, 93316, 93330, 93344, + 93358, 93372, 93386, 93400, 93414, 93428, 93442, 93456, 93470, 93484, + 93498, 93512, 93526, 93540, 93554, 93568, 93582, 93596, 93610, 93624, + 93638, 93652, 93666, 93680, 93689, 93700, 93711, 93721, 93732, 93740, + 93748, 93754, 93764, 93772, 93778, 33466, 93783, 93789, 93798, 93810, + 93815, 93822, 10992, 20510, 93828, 93837, 93842, 93846, 93853, 93859, + 93864, 93869, 93877, 93885, 93890, 93898, 13996, 93902, 93905, 93907, + 93922, 93935, 93942, 93948, 93959, 93964, 93968, 93973, 93980, 93986, + 93991, 93999, 74993, 75003, 94005, 94012, 94022, 12212, 94029, 94034, + 33704, 94043, 94048, 94055, 94065, 94073, 94081, 94090, 94099, 94105, + 94111, 94118, 94125, 94130, 94134, 94142, 69529, 94147, 94156, 94164, + 94171, 94176, 94180, 94189, 94195, 94198, 94202, 94211, 94221, 81841, + 94230, 94234, 94242, 94246, 94252, 94263, 94273, 20519, 94284, 94293, + 94301, 94309, 94316, 69548, 9590, 94324, 94328, 94337, 94344, 94347, + 31413, 94350, 94354, 94359, 94376, 94388, 12170, 94400, 94405, 94410, + 94415, 24081, 94419, 94424, 94429, 94435, 94440, 6436, 94445, 24085, + 94450, 94455, 94461, 94468, 94473, 94478, 94484, 94490, 94496, 94501, + 94507, 94511, 94525, 94533, 94541, 94547, 94552, 94559, 94569, 94578, + 94583, 94588, 94593, 94601, 94612, 94617, 94623, 94628, 94637, 68023, + 4637, 94642, 94660, 94679, 94692, 94706, 94722, 94729, 94736, 94745, + 94752, 94758, 94765, 94770, 94776, 94782, 94790, 94796, 94801, 94806, + 94822, 12183, 94836, 94843, 94851, 94857, 94861, 94864, 94869, 94874, + 94881, 94886, 94895, 94901, 94906, 94912, 94918, 94927, 94936, 41284, + 94941, 94949, 94958, 13611, 94967, 94973, 94981, 94987, 94993, 94999, + 95004, 95011, 95017, 13622, 95022, 95025, 95030, 37601, 95040, 95049, + 95054, 95060, 95065, 95073, 95080, 95091, 95107, 95123, 95139, 95155, + 95171, 95187, 95203, 95219, 95235, 95251, 95267, 95283, 95299, 95315, + 95331, 95347, 95363, 95379, 95395, 95411, 95427, 95443, 95459, 95475, + 95491, 95507, 95523, 95539, 95555, 95571, 95587, 95603, 95619, 95635, + 95651, 95667, 95683, 95699, 95715, 95731, 95747, 95763, 95779, 95795, + 95811, 95827, 95843, 95859, 95875, 95891, 95907, 95923, 95939, 95955, + 95971, 95987, 96003, 96019, 96035, 96051, 96067, 96083, 96099, 96115, + 96131, 96147, 96163, 96179, 96195, 96211, 96227, 96243, 96259, 96275, + 96291, 96307, 96323, 96339, 96355, 96371, 96387, 96403, 96419, 96435, + 96451, 96467, 96483, 96499, 96515, 96531, 96547, 96563, 96579, 96595, + 96611, 96627, 96643, 96659, 96675, 96691, 96707, 96723, 96739, 96755, + 96771, 96787, 96803, 96819, 96835, 96851, 96867, 96883, 96899, 96915, + 96931, 96947, 96963, 96979, 96995, 97011, 97027, 97043, 97059, 97075, + 97091, 97107, 97123, 97139, 97155, 97171, 97187, 97203, 97219, 97235, + 97251, 97267, 97283, 97299, 97315, 97331, 97347, 97363, 97379, 97395, + 97411, 97427, 97443, 97459, 97475, 97491, 97507, 97523, 97539, 97555, + 97571, 97587, 97603, 97619, 97635, 97651, 97667, 97683, 97699, 97715, + 97731, 97747, 97763, 97779, 97795, 97811, 97827, 97843, 97859, 97875, + 97891, 97907, 97923, 97939, 97955, 97971, 97987, 98003, 98019, 98035, + 98051, 98067, 98083, 98099, 98115, 98131, 98147, 98163, 98179, 98195, + 98211, 98227, 98243, 98259, 98275, 98291, 98307, 98323, 98339, 98355, + 98371, 98387, 98403, 98419, 98435, 98451, 98467, 98483, 98499, 98515, + 98531, 98547, 98563, 98579, 98595, 98611, 98627, 98643, 98659, 98675, + 98691, 98707, 98723, 98739, 98755, 98771, 98787, 98803, 98819, 98835, + 98851, 98867, 98883, 98899, 98915, 98931, 98947, 98963, 98979, 98995, + 99011, 99027, 99043, 99059, 99075, 99091, 99107, 99123, 99139, 99155, + 99171, 99187, 99203, 99219, 99235, 99251, 99267, 99283, 99299, 99315, + 99331, 99347, 99363, 99379, 99395, 99411, 99427, 99443, 99459, 99475, + 99491, 99507, 99523, 99539, 99555, 99571, 99587, 99603, 99619, 99635, + 99651, 99667, 99683, 99699, 99715, 99731, 99747, 99763, 99779, 99795, + 99811, 99827, 99843, 99859, 99875, 99891, 99907, 99923, 99939, 99955, + 99971, 99987, 100003, 100019, 100035, 100051, 100067, 100083, 100099, + 100115, 100131, 100147, 100163, 100179, 100195, 100211, 100227, 100243, + 100259, 100275, 100291, 100307, 100323, 100339, 100355, 100371, 100387, + 100403, 100419, 100435, 100451, 100467, 100483, 100499, 100515, 100531, + 100547, 100563, 100579, 100595, 100611, 100627, 100643, 100659, 100675, + 100691, 100707, 100723, 100739, 100755, 100771, 100787, 100803, 100819, + 100835, 100851, 100867, 100883, 100899, 100915, 100931, 100947, 100963, + 100979, 100995, 101011, 101027, 101043, 101059, 101075, 101091, 101107, + 101123, 101139, 101155, 101171, 101187, 101203, 101219, 101235, 101251, + 101267, 101283, 101299, 101315, 101331, 101347, 101363, 101379, 101395, + 101411, 101427, 101437, 101442, 101450, 74322, 101455, 101461, 101466, + 101473, 101482, 101490, 101494, 4231, 101500, 101507, 101513, 101517, + 19842, 44349, 3219, 101522, 101526, 101530, 101537, 101543, 101552, + 101558, 101565, 101569, 101590, 101612, 101628, 101645, 101664, 101673, + 101683, 101691, 101698, 101705, 101711, 31274, 101725, 101729, 101735, + 101743, 101755, 101761, 101769, 101776, 101781, 101786, 101790, 101798, + 101805, 101809, 101815, 101821, 101826, 3879, 49980, 101832, 101836, + 101840, 101844, 101849, 101854, 101859, 101865, 101871, 101877, 101884, + 101890, 101897, 101903, 101909, 101914, 101920, 101925, 101929, 101934, + 101938, 101943, 49995, 101947, 101952, 101960, 101964, 101969, 101976, + 101985, 101991, 102000, 102004, 102011, 102015, 102018, 102025, 102031, + 102040, 102050, 102060, 102065, 102069, 102076, 102084, 102093, 102097, + 102105, 102111, 102116, 102121, 102127, 102133, 102138, 102142, 102148, + 102153, 102157, 102161, 102164, 102169, 102177, 102187, 102193, 102198, + 102208, 47155, 102216, 102228, 102234, 102241, 102247, 102251, 102256, + 102262, 102274, 102285, 102292, 102298, 102305, 102312, 102324, 102331, + 102337, 24165, 102341, 102349, 102355, 102362, 102368, 102374, 102380, + 102385, 102390, 102395, 102399, 102408, 102416, 102427, 7696, 102432, + 19278, 102438, 102442, 102446, 102450, 102458, 102467, 102471, 102478, + 102487, 102495, 102508, 102514, 101939, 34604, 102519, 102521, 102526, + 102531, 102536, 102541, 102546, 102551, 102556, 102561, 102566, 102571, + 102576, 102581, 102586, 102591, 102597, 102602, 102607, 102612, 102617, + 102622, 102627, 102632, 102637, 102643, 102649, 102655, 102660, 102665, + 102677, 102682, 1872, 54, 102687, 102692, 37611, 102696, 37616, 37621, + 37627, 37632, 102700, 37637, 25306, 102722, 102726, 102730, 102735, + 102739, 37641, 102743, 102751, 102758, 102764, 102774, 37646, 102781, + 102784, 102789, 102793, 102802, 10802, 102810, 37651, 25150, 102813, + 102817, 102825, 1347, 102830, 37662, 102833, 102838, 29602, 29612, 40886, + 102843, 102848, 102853, 102858, 102864, 102869, 102878, 102883, 102892, + 102900, 102907, 102913, 102918, 102923, 102928, 102938, 102947, 102955, + 102960, 102968, 102972, 102980, 102984, 102991, 102999, 37466, 44084, + 103006, 103012, 103017, 103022, 14031, 32589, 103027, 103032, 103037, + 103043, 103050, 103056, 103065, 103070, 103078, 103088, 103095, 103105, + 103111, 103116, 103122, 103126, 20541, 103133, 41838, 103146, 103151, + 103157, 103172, 35661, 72735, 103185, 103189, 103198, 103207, 103214, + 103220, 103228, 103234, 103243, 103250, 44204, 103256, 103259, 103263, + 103267, 103271, 11546, 103277, 103284, 103290, 103298, 103303, 103307, + 27650, 103313, 103316, 103324, 103331, 103339, 103352, 103366, 103373, + 103379, 103386, 103392, 37676, 103396, 103403, 103411, 103419, 103425, + 37681, 103433, 103439, 103444, 103454, 103460, 103469, 35456, 40257, + 103477, 103482, 103487, 103491, 103496, 103500, 103508, 103513, 17374, + 18148, 103517, 103522, 37686, 17527, 103526, 103531, 103535, 103542, + 103551, 103555, 103563, 103569, 103574, 103580, 8879, 103585, 103591, + 103596, 103601, 103612, 103621, 103633, 103648, 37974, 103654, 19397, + 37690, 103658, 103665, 103671, 103675, 27774, 103682, 103689, 46445, + 103698, 103704, 103713, 103719, 103724, 103732, 103738, 103743, 37700, + 103748, 103757, 103766, 102280, 103775, 103782, 103788, 103794, 103803, + 103813, 103819, 103827, 103834, 103838, 37705, 103841, 37711, 1386, + 103846, 103854, 103862, 103872, 103881, 103889, 103896, 103906, 37722, + 103910, 103912, 103916, 103921, 103925, 103929, 103935, 103940, 103944, + 103955, 103960, 103969, 103974, 3224, 103978, 103985, 103989, 103998, + 104006, 104014, 104021, 104026, 104031, 71287, 104035, 104038, 104044, + 104052, 104058, 104062, 104067, 104074, 104079, 104084, 104088, 104095, + 104101, 104106, 40288, 104110, 104113, 104118, 104122, 104127, 104134, + 104139, 104143, 45512, 104151, 29621, 29630, 104157, 104163, 104169, + 104174, 104178, 104181, 104191, 104200, 104205, 104211, 104218, 104224, + 104228, 104236, 104241, 40294, 82094, 104245, 104253, 104259, 104266, + 104271, 104278, 104283, 104287, 104292, 66525, 104298, 104304, 10078, + 104309, 104314, 104318, 104323, 104328, 104333, 104337, 104342, 104347, + 104353, 104358, 104363, 104369, 104375, 104380, 104384, 104389, 104394, + 104399, 104403, 27773, 104408, 104413, 104419, 104425, 104431, 104436, + 104440, 104445, 104450, 104455, 104459, 104464, 104469, 104474, 104479, + 50250, 104483, 37730, 104491, 104495, 104503, 104511, 104522, 104527, + 104531, 25779, 79545, 104536, 104542, 104547, 4542, 104557, 104564, + 104569, 104577, 104586, 104591, 104595, 104600, 104604, 104612, 104620, + 104627, 74584, 104633, 104641, 104648, 104659, 104665, 104671, 37740, + 104674, 104681, 104689, 104694, 104698, 31764, 69117, 104704, 104709, + 104716, 104721, 9970, 104725, 104733, 104740, 104747, 104756, 104763, + 104769, 104783, 104791, 6517, 104553, 104797, 104802, 104808, 104812, + 104815, 104823, 104830, 104835, 104848, 104855, 104861, 104865, 104873, + 104878, 104885, 104891, 104896, 69388, 104901, 104904, 104913, 104920, + 104926, 104930, 104933, 104941, 104947, 104956, 104966, 104976, 104985, + 104996, 105004, 105015, 105020, 105024, 105029, 105033, 41017, 105041, + 24493, 41026, 105046, 97694, 97710, 97726, 97742, 97758, 105051, 97790, + 97806, 97822, 97838, 97950, 97966, 105055, 97998, 98014, 105059, 105063, + 105067, 105071, 98254, 98286, 105075, 98318, 105079, 105083, 98462, + 98478, 98494, 98510, 105087, 98574, 98590, 105091, 98718, 98734, 98750, + 98766, 98782, 98798, 98814, 98830, 98846, 98862, 98974, 98990, 99006, + 99022, 99038, 99054, 99070, 99086, 99102, 99118, 105095, 100910, 101022, + 101086, 101102, 101118, 101134, 101150, 101166, 101278, 101294, 101310, + 105099, 101358, 105103, 101390, 101406, 101422, 105107, 105112, 105117, + 105122, 105127, 105132, 105137, 105141, 105145, 105150, 105155, 105159, + 105164, 105169, 105173, 105178, 105183, 105188, 105193, 105197, 105202, + 105207, 105211, 105216, 105220, 105224, 105228, 105232, 105237, 105241, + 105245, 105249, 105253, 105257, 105261, 105265, 105269, 105273, 105278, + 105283, 105288, 105293, 105298, 105303, 105308, 105313, 105318, 105323, + 105327, 105331, 105335, 105339, 105343, 105347, 105352, 105356, 105361, + 105365, 105370, 105375, 105379, 105383, 105388, 105392, 105396, 105400, + 105404, 105408, 105412, 105416, 105420, 105424, 105428, 105432, 105436, + 105440, 105444, 105449, 105454, 105458, 105462, 105466, 105470, 105474, + 105478, 105483, 105487, 105491, 105495, 105499, 105503, 105507, 105512, + 105516, 105521, 105525, 105529, 105533, 105537, 105541, 105545, 105549, + 105553, 105557, 105561, 105565, 105570, 105574, 105578, 105582, 105586, + 105590, 105594, 105598, 105602, 105606, 105610, 105614, 105619, 105623, + 105627, 105632, 105637, 105641, 105645, 105649, 105653, 105657, 105661, + 105665, 105669, 105674, 105678, 105683, 105687, 105692, 105696, 105701, + 105705, 105711, 105716, 105720, 105725, 105729, 105734, 105738, 105743, + 105747, 105752, 1461, 105756, 2966, 1726, 26950, 1634, 29557, 105760, + 2975, 105764, 1316, 105769, 1258, 105773, 105777, 2999, 105781, 105789, + 105796, 105803, 105817, 3003, 7803, 105826, 105834, 105841, 105852, + 105861, 105865, 105872, 105884, 105897, 105910, 105921, 105926, 105933, + 105945, 105949, 3007, 13692, 105959, 105964, 105973, 105983, 105988, + 3011, 105996, 106000, 106005, 106012, 106018, 106023, 106032, 106040, + 106052, 106062, 1263, 15119, 106075, 106079, 106085, 106099, 106111, + 106123, 106131, 106141, 106150, 106159, 106168, 106176, 106187, 106195, + 4550, 106205, 106216, 106225, 106231, 106246, 106253, 106259, 106264, + 41156, 106269, 3035, 15123, 106273, 106280, 9901, 106289, 106295, 3040, + 37146, 106304, 69017, 106311, 106315, 106321, 106332, 106338, 106343, + 106350, 106356, 106364, 106371, 106377, 106388, 106398, 106407, 106418, + 106427, 106434, 106440, 106450, 106458, 106464, 106479, 106485, 106490, + 106497, 106505, 106509, 106512, 106518, 106525, 106531, 106539, 106548, + 106556, 106562, 106571, 49565, 106585, 106590, 106596, 17133, 106601, + 106614, 106626, 106635, 106643, 106650, 106654, 106658, 106661, 106668, + 106675, 106683, 106691, 106700, 106708, 17038, 106716, 106721, 106725, + 106737, 106744, 106751, 106760, 906, 106770, 106779, 106790, 3061, + 106794, 106798, 106804, 106817, 106829, 106839, 106848, 106860, 30362, + 106871, 106879, 106888, 106899, 106910, 106920, 106930, 106938, 106947, + 106955, 13139, 106962, 106966, 106969, 106974, 106979, 106983, 106989, + 1268, 106996, 107000, 13780, 107004, 107015, 107024, 107032, 107041, + 107049, 107065, 107076, 107085, 107093, 107105, 107116, 107132, 107142, + 107163, 107177, 107190, 107198, 107205, 7849, 107218, 107223, 107229, + 6526, 107235, 107238, 107245, 107255, 8981, 107262, 107267, 107272, + 107279, 107284, 107292, 107301, 107309, 107314, 107323, 107330, 11040, + 11049, 107336, 107347, 107353, 107358, 107364, 3077, 3082, 107370, 977, + 107376, 107383, 107390, 107403, 107408, 2261, 87, 107416, 107423, 107428, + 107436, 107446, 107455, 107461, 107470, 107478, 107488, 107492, 107496, + 107501, 107505, 107517, 3105, 107525, 107533, 107538, 107549, 107560, + 107572, 107583, 107593, 107602, 24534, 107607, 107613, 107618, 107628, + 107638, 107643, 32478, 107649, 107654, 107663, 24546, 107667, 4654, 16, + 107672, 107681, 107688, 107695, 107701, 107706, 107710, 107716, 32502, + 107721, 107726, 69679, 107731, 107736, 107742, 107748, 107756, 107761, + 107769, 107776, 107782, 107787, 45388, 49459, 107793, 1797, 32, 107803, + 107816, 107821, 107829, 107834, 107840, 3131, 32557, 107845, 107853, + 107860, 107865, 107870, 107879, 4233, 4244, 70885, 107887, 107891, 1661, + 1809, 107896, 107901, 107908, 32910, 1813, 302, 107915, 107921, 107926, + 3153, 107930, 107935, 107942, 1817, 107947, 107953, 107958, 107970, 6757, + 107980, 107987, 1824, 107993, 107998, 108005, 108012, 108027, 108034, + 108045, 108050, 108058, 2696, 108062, 108074, 108079, 108083, 108089, + 32356, 2266, 108093, 108104, 108108, 108112, 108118, 108122, 108131, + 108135, 108146, 108150, 2312, 36963, 108154, 108164, 108172, 3244, + 108178, 108187, 108195, 10439, 108200, 108208, 108213, 108217, 108226, + 108233, 108239, 3214, 17197, 108243, 108256, 108274, 108279, 108287, + 108295, 108305, 11344, 15241, 108317, 108330, 108337, 108351, 108358, + 108374, 108381, 108387, 24584, 14454, 108394, 108401, 108411, 108420, + 50249, 108432, 108440, 50384, 108447, 108450, 108456, 108462, 108468, + 108474, 108480, 108487, 108494, 108500, 108506, 108512, 108518, 108524, + 108530, 108536, 108542, 108548, 108554, 108560, 108566, 108572, 108578, + 108584, 108590, 108596, 108602, 108608, 108614, 108620, 108626, 108632, + 108638, 108644, 108650, 108656, 108662, 108668, 108674, 108680, 108686, + 108692, 108698, 108704, 108710, 108716, 108722, 108728, 108734, 108740, + 108746, 108752, 108758, 108764, 108770, 108776, 108782, 108788, 108794, + 108800, 108807, 108813, 108820, 108827, 108833, 108840, 108847, 108853, + 108859, 108865, 108871, 108877, 108883, 108889, 108895, 108901, 108907, + 108913, 108919, 108925, 108931, 108937, 3228, 10412, 108943, 108953, + 108959, 108967, 108971, 106008, 3232, 108975, 102509, 24294, 14066, 4158, + 108979, 3238, 108983, 108993, 108999, 109005, 109011, 109017, 109023, + 109029, 109035, 109041, 109047, 109053, 109059, 109065, 109071, 109077, + 109083, 109089, 109095, 109101, 109107, 109113, 109119, 109125, 109131, + 109137, 109143, 109150, 109157, 109163, 109169, 109175, 109181, 109187, + 109193, 1273, 109199, 109204, 109209, 109214, 109219, 109224, 109229, + 109234, 109239, 109243, 109247, 109251, 109255, 109259, 109263, 109267, + 109271, 109275, 109281, 109287, 109293, 109299, 109303, 109307, 109311, + 109315, 109319, 109323, 109327, 109331, 109335, 109340, 109345, 109350, + 109355, 109360, 109365, 109370, 109375, 109380, 109385, 109390, 109395, + 109400, 109405, 109410, 109415, 109420, 109425, 109430, 109435, 109440, + 109445, 109450, 109455, 109460, 109465, 109470, 109475, 109480, 109485, + 109490, 109495, 109500, 109505, 109510, 109515, 109520, 109525, 109530, + 109535, 109540, 109545, 109550, 109555, 109560, 109565, 109570, 109575, + 109580, 109585, 109590, 109595, 109600, 109605, 109610, 109615, 109620, + 109625, 109630, 109635, 109640, 109645, 109650, 109655, 109660, 109665, + 109670, 109675, 109680, 109685, 109690, 109695, 109700, 109705, 109710, + 109715, 109720, 109725, 109730, 109735, 109740, 109745, 109750, 109755, + 109760, 109765, 109770, 109775, 109780, 109785, 109790, 109795, 109800, + 109805, 109810, 109815, 109820, 109825, 109830, 109835, 109840, 109845, + 109850, 109855, 109860, 109865, 109870, 109875, 109880, 109885, 109890, + 109895, 109900, 109905, 109910, 109915, 109920, 109925, 109930, 109935, + 109940, 109945, 109950, 109955, 109960, 109965, 109970, 109975, 109980, + 109985, 109990, 109995, 110000, 110005, 110010, 110015, 110020, 110025, + 110030, 110035, 110040, 110045, 110050, 110055, 110060, 110065, 110070, + 110075, 110080, 110085, 110090, 110095, 110100, 110105, 110110, 110115, + 110120, 110125, 110130, 110135, 110140, 110145, 110150, 110155, 110160, + 110165, 110170, 110175, 110180, 110185, 110190, 110195, 110200, 110205, + 110210, 110215, 110220, 110225, 110231, 110236, 110241, 110246, 110251, + 110256, 110261, 110266, 110272, 110277, 110282, 110287, 110292, 110297, + 110302, 110307, 110312, 110317, 110322, 110327, 110332, 110337, 110342, + 110347, 110352, 110357, 110362, 110367, 110372, 110377, 110382, 110387, + 110392, 110397, 110402, 110407, 110412, 110417, 110422, 110427, 110432, + 110441, 110446, 110455, 110460, 110469, 110474, 110483, 110488, 110497, + 110502, 110511, 110516, 110525, 110530, 110539, 110544, 110549, 110558, + 110562, 110571, 110576, 110585, 110590, 110599, 110604, 110613, 110618, + 110627, 110632, 110641, 110646, 110655, 110660, 110669, 110674, 110683, + 110688, 110697, 110702, 110707, 110712, 110717, 110722, 110727, 110732, + 110736, 110741, 110746, 110751, 110756, 110761, 110766, 110772, 110777, + 110782, 110787, 110793, 110797, 110802, 110808, 110813, 110818, 110823, + 110828, 110833, 110838, 110843, 110848, 110853, 110858, 110864, 110869, + 110874, 110879, 110885, 110890, 110895, 110900, 110905, 110911, 110916, + 110921, 110926, 110931, 110936, 110942, 110947, 110952, 110957, 110962, + 110967, 110972, 110977, 110982, 110987, 110992, 110997, 111002, 111007, + 111012, 111017, 111022, 111027, 111032, 111037, 111042, 111047, 111052, + 111057, 111063, 111069, 111075, 111080, 111085, 111090, 111095, 111101, + 111107, 111113, 111118, 111123, 111128, 111134, 111139, 111144, 111149, + 111154, 111159, 111164, 111169, 111174, 111179, 111184, 111189, 111194, + 111199, 111204, 111209, 111214, 111220, 111226, 111232, 111237, 111242, + 111247, 111252, 111258, 111264, 111270, 111275, 111280, 111285, 111290, + 111295, 111300, 111305, 111310, 111315, 18785, 111320, 111326, 111331, + 111336, 111341, 111346, 111351, 111357, 111362, 111367, 111372, 111377, + 111382, 111388, 111393, 111398, 111403, 111408, 111413, 111418, 111423, + 111428, 111433, 111438, 111443, 111448, 111453, 111458, 111463, 111468, + 111473, 111478, 111483, 111488, 111493, 111498, 111504, 111509, 111514, + 111519, 111524, 111529, 111534, 111539, 111544, 111549, 111554, 111559, + 111564, 111569, 111574, 111579, 111584, 111589, 111594, 111599, 111604, + 111609, 111614, 111619, 111624, 111629, 111634, 111639, 111644, 111649, + 111654, 111659, 111664, 111669, 111674, 111679, 111684, 111689, 111694, + 111699, 111704, 111710, 111715, 111720, 111725, 111730, 111735, 111740, + 111745, 111750, 111755, 111760, 111765, 111771, 111776, 111782, 111787, + 111792, 111797, 111802, 111807, 111812, 111818, 111823, 111828, 111834, + 111839, 111844, 111849, 111854, 111859, 111865, 111871, 111876, 111881, + 14088, 111886, 111891, 111896, 111901, 111906, 111911, 111916, 111921, + 111926, 111931, 111936, 111941, 111946, 111951, 111956, 111961, 111966, + 111971, 111976, 111981, 111986, 111991, 111996, 112001, 112006, 112011, + 112016, 112021, 112026, 112031, 112036, 112041, 112046, 112051, 112056, + 112061, 112066, 112071, 112076, 112081, 112086, 112091, 112096, 112101, + 112106, 112111, 112116, 112121, 112126, 112131, 112136, 112141, 112146, + 112151, 112156, 112161, 112166, 112171, 112176, 112181, 112186, 112191, + 112196, 112201, 112206, 112212, 112217, 112222, 112227, 112232, 112238, + 112243, 112248, 112253, 112258, 112263, 112268, 112274, 112279, 112284, + 112289, 112294, 112299, 112305, 112310, 112315, 112320, 112325, 112330, + 112336, 112341, 112346, 112351, 112356, 112361, 112367, 112373, 112378, + 112383, 112388, 112394, 112400, 112406, 112411, 112416, 112422, 112428, + 112433, 112439, 112445, 112451, 112456, 112461, 112467, 112472, 112478, + 112483, 112489, 112498, 112503, 112508, 112514, 112519, 112525, 112530, + 112535, 112540, 112545, 112550, 112555, 112560, 112565, 112570, 112575, + 112580, 112585, 112590, 112595, 112600, 112605, 112610, 112615, 112620, + 112625, 112630, 112635, 112640, 112645, 112650, 112655, 112660, 112665, + 112670, 112675, 112680, 112686, 112692, 112698, 112703, 112708, 112713, + 112718, 112723, 112728, 112733, 112738, 112743, 112748, 112753, 112758, + 112763, 112768, 112773, 112778, 112783, 112788, 112793, 112798, 112804, + 112810, 112815, 112821, 112826, 112831, 112837, 112842, 112848, 112853, + 112859, 112864, 112870, 112875, 112881, 112886, 112891, 112896, 112901, + 112906, 112911, 112916, 108994, 109000, 109006, 109012, 112922, 109018, + 109024, 112928, 109030, 109036, 109042, 109048, 109054, 109060, 109066, + 109072, 109078, 112934, 109084, 109090, 109096, 112940, 109102, 109108, + 109114, 109120, 112946, 109126, 109132, 109138, 109158, 112952, 112958, + 109164, 112964, 109170, 109176, 109182, 109188, 109194, 112970, 3255, + 3260, 112975, 3275, 3280, 3285, 112980, 112983, 112989, 112995, 113002, + 113007, 113012, 2317, }; /* code->name phrasebook */ -#define phrasebook_shift 8 +#define phrasebook_shift 7 #define phrasebook_short 194 static unsigned char phrasebook[] = { - 0, 205, 110, 235, 225, 78, 211, 11, 78, 35, 56, 238, 136, 56, 212, 244, - 56, 250, 213, 250, 134, 50, 213, 80, 52, 213, 80, 250, 29, 96, 56, 244, - 23, 230, 150, 234, 98, 204, 193, 205, 139, 17, 195, 79, 17, 98, 17, 103, - 17, 135, 17, 136, 17, 150, 17, 174, 17, 182, 17, 178, 17, 184, 244, 32, - 207, 61, 222, 42, 56, 236, 49, 56, 232, 232, 56, 211, 28, 78, 244, 21, - 250, 18, 8, 6, 1, 63, 8, 6, 1, 249, 219, 8, 6, 1, 247, 69, 8, 6, 1, 240, - 98, 8, 6, 1, 70, 8, 6, 1, 235, 184, 8, 6, 1, 234, 71, 8, 6, 1, 232, 154, - 8, 6, 1, 68, 8, 6, 1, 225, 108, 8, 6, 1, 224, 227, 8, 6, 1, 158, 8, 6, 1, - 221, 40, 8, 6, 1, 217, 225, 8, 6, 1, 74, 8, 6, 1, 213, 195, 8, 6, 1, 211, - 116, 8, 6, 1, 143, 8, 6, 1, 209, 35, 8, 6, 1, 203, 185, 8, 6, 1, 66, 8, - 6, 1, 199, 215, 8, 6, 1, 197, 189, 8, 6, 1, 196, 216, 8, 6, 1, 196, 143, - 8, 6, 1, 195, 157, 50, 46, 170, 210, 41, 205, 139, 52, 46, 170, 244, 105, - 251, 122, 125, 221, 233, 232, 239, 251, 122, 8, 4, 1, 63, 8, 4, 1, 249, - 219, 8, 4, 1, 247, 69, 8, 4, 1, 240, 98, 8, 4, 1, 70, 8, 4, 1, 235, 184, - 8, 4, 1, 234, 71, 8, 4, 1, 232, 154, 8, 4, 1, 68, 8, 4, 1, 225, 108, 8, - 4, 1, 224, 227, 8, 4, 1, 158, 8, 4, 1, 221, 40, 8, 4, 1, 217, 225, 8, 4, - 1, 74, 8, 4, 1, 213, 195, 8, 4, 1, 211, 116, 8, 4, 1, 143, 8, 4, 1, 209, - 35, 8, 4, 1, 203, 185, 8, 4, 1, 66, 8, 4, 1, 199, 215, 8, 4, 1, 197, 189, - 8, 4, 1, 196, 216, 8, 4, 1, 196, 143, 8, 4, 1, 195, 157, 50, 240, 141, - 170, 83, 221, 233, 52, 240, 141, 170, 202, 56, 215, 219, 205, 110, 225, - 163, 235, 225, 78, 246, 158, 56, 212, 10, 56, 240, 140, 56, 196, 56, 56, - 247, 149, 153, 208, 89, 56, 239, 18, 240, 225, 56, 235, 50, 213, 255, - 225, 212, 222, 81, 54, 250, 193, 211, 11, 78, 215, 194, 56, 205, 148, - 230, 151, 210, 99, 56, 220, 18, 239, 99, 56, 212, 69, 56, 204, 62, 103, - 204, 62, 135, 251, 110, 251, 122, 218, 234, 56, 212, 122, 56, 108, 238, - 123, 246, 169, 204, 62, 98, 219, 175, 213, 255, 225, 212, 209, 225, 54, - 250, 193, 211, 11, 78, 197, 206, 234, 135, 106, 211, 36, 197, 206, 234, - 135, 106, 232, 108, 197, 206, 234, 135, 122, 211, 34, 225, 163, 211, 28, - 78, 8, 6, 1, 39, 3, 232, 238, 8, 6, 1, 39, 3, 180, 8, 6, 1, 39, 3, 244, - 104, 8, 6, 1, 39, 3, 202, 56, 8, 6, 1, 39, 3, 239, 18, 8, 6, 1, 39, 3, - 209, 211, 57, 8, 6, 1, 251, 90, 8, 6, 1, 247, 70, 3, 246, 169, 8, 6, 1, - 237, 10, 3, 232, 238, 8, 6, 1, 237, 10, 3, 180, 8, 6, 1, 237, 10, 3, 244, - 104, 8, 6, 1, 237, 10, 3, 239, 18, 8, 6, 1, 230, 137, 3, 232, 238, 8, 6, - 1, 230, 137, 3, 180, 8, 6, 1, 230, 137, 3, 244, 104, 8, 6, 1, 230, 137, - 3, 239, 18, 8, 6, 1, 236, 0, 8, 6, 1, 217, 226, 3, 202, 56, 8, 6, 1, 169, - 3, 232, 238, 8, 6, 1, 169, 3, 180, 8, 6, 1, 169, 3, 244, 104, 8, 6, 1, - 169, 3, 202, 56, 8, 6, 1, 169, 3, 239, 18, 218, 30, 56, 8, 6, 1, 169, 3, - 101, 8, 6, 1, 115, 3, 232, 238, 8, 6, 1, 115, 3, 180, 8, 6, 1, 115, 3, - 244, 104, 8, 6, 1, 115, 3, 239, 18, 8, 6, 1, 196, 144, 3, 180, 8, 6, 1, - 202, 134, 8, 4, 1, 206, 225, 209, 35, 8, 4, 1, 39, 3, 232, 238, 8, 4, 1, - 39, 3, 180, 8, 4, 1, 39, 3, 244, 104, 8, 4, 1, 39, 3, 202, 56, 8, 4, 1, - 39, 3, 239, 18, 8, 4, 1, 39, 3, 209, 211, 57, 8, 4, 1, 251, 90, 8, 4, 1, - 247, 70, 3, 246, 169, 8, 4, 1, 237, 10, 3, 232, 238, 8, 4, 1, 237, 10, 3, - 180, 8, 4, 1, 237, 10, 3, 244, 104, 8, 4, 1, 237, 10, 3, 239, 18, 8, 4, - 1, 230, 137, 3, 232, 238, 8, 4, 1, 230, 137, 3, 180, 8, 4, 1, 230, 137, - 3, 244, 104, 8, 4, 1, 230, 137, 3, 239, 18, 8, 4, 1, 236, 0, 8, 4, 1, - 217, 226, 3, 202, 56, 8, 4, 1, 169, 3, 232, 238, 8, 4, 1, 169, 3, 180, 8, - 4, 1, 169, 3, 244, 104, 8, 4, 1, 169, 3, 202, 56, 8, 4, 1, 169, 3, 239, - 18, 238, 179, 56, 8, 4, 1, 169, 3, 101, 8, 4, 1, 115, 3, 232, 238, 8, 4, - 1, 115, 3, 180, 8, 4, 1, 115, 3, 244, 104, 8, 4, 1, 115, 3, 239, 18, 8, - 4, 1, 196, 144, 3, 180, 8, 4, 1, 202, 134, 8, 4, 1, 196, 144, 3, 239, 18, - 8, 6, 1, 39, 3, 220, 18, 8, 4, 1, 39, 3, 220, 18, 8, 6, 1, 39, 3, 247, - 161, 8, 4, 1, 39, 3, 247, 161, 8, 6, 1, 39, 3, 214, 80, 8, 4, 1, 39, 3, - 214, 80, 8, 6, 1, 247, 70, 3, 180, 8, 4, 1, 247, 70, 3, 180, 8, 6, 1, - 247, 70, 3, 244, 104, 8, 4, 1, 247, 70, 3, 244, 104, 8, 6, 1, 247, 70, 3, - 76, 57, 8, 4, 1, 247, 70, 3, 76, 57, 8, 6, 1, 247, 70, 3, 246, 225, 8, 4, - 1, 247, 70, 3, 246, 225, 8, 6, 1, 240, 99, 3, 246, 225, 8, 4, 1, 240, 99, - 3, 246, 225, 8, 6, 1, 240, 99, 3, 101, 8, 4, 1, 240, 99, 3, 101, 8, 6, 1, - 237, 10, 3, 220, 18, 8, 4, 1, 237, 10, 3, 220, 18, 8, 6, 1, 237, 10, 3, - 247, 161, 8, 4, 1, 237, 10, 3, 247, 161, 8, 6, 1, 237, 10, 3, 76, 57, 8, - 4, 1, 237, 10, 3, 76, 57, 8, 6, 1, 237, 10, 3, 214, 80, 8, 4, 1, 237, 10, - 3, 214, 80, 8, 6, 1, 237, 10, 3, 246, 225, 8, 4, 1, 237, 10, 3, 246, 225, - 8, 6, 1, 234, 72, 3, 244, 104, 8, 4, 1, 234, 72, 3, 244, 104, 8, 6, 1, - 234, 72, 3, 247, 161, 8, 4, 1, 234, 72, 3, 247, 161, 8, 6, 1, 234, 72, 3, - 76, 57, 8, 4, 1, 234, 72, 3, 76, 57, 8, 6, 1, 234, 72, 3, 246, 169, 8, 4, - 1, 234, 72, 3, 246, 169, 8, 6, 1, 232, 155, 3, 244, 104, 8, 4, 1, 232, - 155, 3, 244, 104, 8, 6, 1, 232, 155, 3, 101, 8, 4, 1, 232, 155, 3, 101, - 8, 6, 1, 230, 137, 3, 202, 56, 8, 4, 1, 230, 137, 3, 202, 56, 8, 6, 1, - 230, 137, 3, 220, 18, 8, 4, 1, 230, 137, 3, 220, 18, 8, 6, 1, 230, 137, - 3, 247, 161, 8, 4, 1, 230, 137, 3, 247, 161, 8, 6, 1, 230, 137, 3, 214, - 80, 8, 4, 1, 230, 137, 3, 214, 80, 8, 6, 1, 230, 137, 3, 76, 57, 8, 4, 1, - 238, 122, 68, 8, 6, 32, 226, 6, 8, 4, 32, 226, 6, 8, 6, 1, 225, 109, 3, - 244, 104, 8, 4, 1, 225, 109, 3, 244, 104, 8, 6, 1, 224, 228, 3, 246, 169, - 8, 4, 1, 224, 228, 3, 246, 169, 8, 4, 1, 223, 109, 8, 6, 1, 223, 1, 3, - 180, 8, 4, 1, 223, 1, 3, 180, 8, 6, 1, 223, 1, 3, 246, 169, 8, 4, 1, 223, - 1, 3, 246, 169, 8, 6, 1, 223, 1, 3, 246, 225, 8, 4, 1, 223, 1, 3, 246, - 225, 8, 6, 1, 223, 1, 3, 108, 238, 123, 8, 4, 1, 223, 1, 3, 108, 238, - 123, 8, 6, 1, 223, 1, 3, 101, 8, 4, 1, 223, 1, 3, 101, 8, 6, 1, 217, 226, - 3, 180, 8, 4, 1, 217, 226, 3, 180, 8, 6, 1, 217, 226, 3, 246, 169, 8, 4, - 1, 217, 226, 3, 246, 169, 8, 6, 1, 217, 226, 3, 246, 225, 8, 4, 1, 217, - 226, 3, 246, 225, 8, 4, 1, 217, 226, 211, 240, 247, 81, 250, 134, 8, 6, - 1, 236, 92, 8, 4, 1, 236, 92, 8, 6, 1, 169, 3, 220, 18, 8, 4, 1, 169, 3, - 220, 18, 8, 6, 1, 169, 3, 247, 161, 8, 4, 1, 169, 3, 247, 161, 8, 6, 1, - 169, 3, 54, 180, 8, 4, 1, 169, 3, 54, 180, 8, 6, 32, 214, 91, 8, 4, 32, - 214, 91, 8, 6, 1, 210, 237, 3, 180, 8, 4, 1, 210, 237, 3, 180, 8, 6, 1, - 210, 237, 3, 246, 169, 8, 4, 1, 210, 237, 3, 246, 169, 8, 6, 1, 210, 237, - 3, 246, 225, 8, 4, 1, 210, 237, 3, 246, 225, 8, 6, 1, 209, 36, 3, 180, 8, - 4, 1, 209, 36, 3, 180, 8, 6, 1, 209, 36, 3, 244, 104, 8, 4, 1, 209, 36, - 3, 244, 104, 8, 6, 1, 209, 36, 3, 246, 169, 8, 4, 1, 209, 36, 3, 246, - 169, 8, 6, 1, 209, 36, 3, 246, 225, 8, 4, 1, 209, 36, 3, 246, 225, 8, 6, - 1, 203, 186, 3, 246, 169, 8, 4, 1, 203, 186, 3, 246, 169, 8, 6, 1, 203, - 186, 3, 246, 225, 8, 4, 1, 203, 186, 3, 246, 225, 8, 6, 1, 203, 186, 3, - 101, 8, 4, 1, 203, 186, 3, 101, 8, 6, 1, 115, 3, 202, 56, 8, 4, 1, 115, - 3, 202, 56, 8, 6, 1, 115, 3, 220, 18, 8, 4, 1, 115, 3, 220, 18, 8, 6, 1, - 115, 3, 247, 161, 8, 4, 1, 115, 3, 247, 161, 8, 6, 1, 115, 3, 209, 211, - 57, 8, 4, 1, 115, 3, 209, 211, 57, 8, 6, 1, 115, 3, 54, 180, 8, 4, 1, - 115, 3, 54, 180, 8, 6, 1, 115, 3, 214, 80, 8, 4, 1, 115, 3, 214, 80, 8, - 6, 1, 197, 190, 3, 244, 104, 8, 4, 1, 197, 190, 3, 244, 104, 8, 6, 1, - 196, 144, 3, 244, 104, 8, 4, 1, 196, 144, 3, 244, 104, 8, 6, 1, 196, 144, - 3, 239, 18, 8, 6, 1, 195, 158, 3, 180, 8, 4, 1, 195, 158, 3, 180, 8, 6, - 1, 195, 158, 3, 76, 57, 8, 4, 1, 195, 158, 3, 76, 57, 8, 6, 1, 195, 158, - 3, 246, 225, 8, 4, 1, 195, 158, 3, 246, 225, 8, 4, 1, 172, 209, 35, 8, 4, - 1, 72, 3, 101, 8, 6, 1, 72, 3, 124, 8, 6, 1, 72, 3, 201, 219, 8, 4, 1, - 72, 3, 201, 219, 8, 6, 1, 154, 174, 8, 4, 1, 154, 174, 8, 6, 1, 185, 74, - 8, 6, 1, 247, 70, 3, 124, 8, 4, 1, 247, 70, 3, 124, 8, 6, 1, 251, 65, - 240, 98, 8, 6, 1, 240, 99, 3, 124, 8, 6, 1, 240, 99, 3, 201, 219, 8, 4, - 1, 240, 99, 3, 201, 219, 8, 4, 1, 200, 240, 239, 80, 8, 6, 1, 210, 40, - 70, 8, 6, 1, 208, 119, 8, 6, 1, 185, 70, 8, 6, 1, 235, 185, 3, 124, 8, 4, - 1, 235, 185, 3, 124, 8, 6, 1, 234, 72, 3, 124, 8, 6, 1, 233, 231, 8, 4, - 1, 230, 188, 8, 6, 1, 225, 154, 8, 6, 1, 230, 137, 3, 101, 8, 6, 1, 224, - 228, 3, 124, 8, 4, 1, 224, 228, 3, 124, 8, 4, 1, 223, 1, 3, 153, 8, 4, 1, - 222, 148, 3, 101, 8, 6, 1, 200, 240, 221, 40, 8, 6, 1, 217, 226, 3, 50, - 124, 8, 4, 1, 217, 226, 3, 172, 52, 222, 74, 8, 6, 1, 169, 3, 108, 202, - 56, 8, 6, 1, 169, 3, 230, 246, 8, 4, 1, 169, 3, 230, 246, 8, 6, 1, 214, - 75, 8, 4, 1, 214, 75, 8, 6, 1, 213, 196, 3, 124, 8, 4, 1, 213, 196, 3, - 124, 8, 1, 195, 218, 8, 6, 1, 154, 103, 8, 4, 1, 154, 103, 8, 6, 1, 236, - 20, 8, 1, 210, 40, 236, 21, 221, 129, 8, 4, 1, 203, 186, 3, 213, 152, - 124, 8, 6, 1, 203, 186, 3, 124, 8, 4, 1, 203, 186, 3, 124, 8, 6, 1, 203, - 186, 3, 210, 46, 124, 8, 6, 1, 115, 3, 230, 246, 8, 4, 1, 115, 3, 230, - 246, 8, 6, 1, 200, 12, 8, 6, 1, 199, 216, 3, 124, 8, 6, 1, 196, 144, 3, - 124, 8, 4, 1, 196, 144, 3, 124, 8, 6, 1, 195, 158, 3, 101, 8, 4, 1, 195, - 158, 3, 101, 8, 6, 1, 235, 187, 8, 6, 1, 235, 188, 210, 39, 8, 4, 1, 235, - 188, 210, 39, 8, 4, 1, 235, 188, 3, 203, 103, 8, 1, 114, 3, 101, 8, 6, 1, - 154, 150, 8, 4, 1, 154, 150, 8, 1, 225, 163, 233, 34, 204, 194, 3, 101, - 8, 1, 196, 219, 8, 1, 239, 73, 244, 79, 8, 1, 222, 120, 244, 79, 8, 1, - 250, 226, 244, 79, 8, 1, 210, 46, 244, 79, 8, 6, 1, 237, 31, 3, 246, 225, - 8, 6, 1, 240, 99, 3, 4, 1, 195, 158, 3, 246, 225, 8, 4, 1, 237, 31, 3, - 246, 225, 8, 6, 1, 221, 199, 8, 6, 1, 223, 1, 3, 4, 1, 225, 108, 8, 4, 1, - 221, 199, 8, 6, 1, 216, 83, 8, 6, 1, 217, 226, 3, 4, 1, 225, 108, 8, 4, - 1, 216, 83, 8, 6, 1, 39, 3, 246, 225, 8, 4, 1, 39, 3, 246, 225, 8, 6, 1, - 230, 137, 3, 246, 225, 8, 4, 1, 230, 137, 3, 246, 225, 8, 6, 1, 169, 3, - 246, 225, 8, 4, 1, 169, 3, 246, 225, 8, 6, 1, 115, 3, 246, 225, 8, 4, 1, - 115, 3, 246, 225, 8, 6, 1, 115, 3, 239, 19, 26, 220, 18, 8, 4, 1, 115, 3, - 239, 19, 26, 220, 18, 8, 6, 1, 115, 3, 239, 19, 26, 180, 8, 4, 1, 115, 3, - 239, 19, 26, 180, 8, 6, 1, 115, 3, 239, 19, 26, 246, 225, 8, 4, 1, 115, - 3, 239, 19, 26, 246, 225, 8, 6, 1, 115, 3, 239, 19, 26, 232, 238, 8, 4, - 1, 115, 3, 239, 19, 26, 232, 238, 8, 4, 1, 200, 240, 70, 8, 6, 1, 39, 3, - 239, 19, 26, 220, 18, 8, 4, 1, 39, 3, 239, 19, 26, 220, 18, 8, 6, 1, 39, - 3, 76, 89, 26, 220, 18, 8, 4, 1, 39, 3, 76, 89, 26, 220, 18, 8, 6, 1, - 251, 91, 3, 220, 18, 8, 4, 1, 251, 91, 3, 220, 18, 8, 6, 1, 234, 72, 3, - 101, 8, 4, 1, 234, 72, 3, 101, 8, 6, 1, 234, 72, 3, 246, 225, 8, 4, 1, - 234, 72, 3, 246, 225, 8, 6, 1, 224, 228, 3, 246, 225, 8, 4, 1, 224, 228, - 3, 246, 225, 8, 6, 1, 169, 3, 214, 80, 8, 4, 1, 169, 3, 214, 80, 8, 6, 1, - 169, 3, 214, 81, 26, 220, 18, 8, 4, 1, 169, 3, 214, 81, 26, 220, 18, 8, - 6, 1, 235, 188, 3, 246, 225, 8, 4, 1, 235, 188, 3, 246, 225, 8, 4, 1, - 225, 109, 3, 246, 225, 8, 6, 1, 237, 30, 8, 6, 1, 240, 99, 3, 4, 1, 195, - 157, 8, 4, 1, 237, 30, 8, 6, 1, 234, 72, 3, 180, 8, 4, 1, 234, 72, 3, - 180, 8, 6, 1, 230, 185, 8, 6, 1, 196, 219, 8, 6, 1, 217, 226, 3, 232, - 238, 8, 4, 1, 217, 226, 3, 232, 238, 8, 6, 1, 39, 3, 209, 211, 89, 26, - 180, 8, 4, 1, 39, 3, 209, 211, 89, 26, 180, 8, 6, 1, 251, 91, 3, 180, 8, - 4, 1, 251, 91, 3, 180, 8, 6, 1, 169, 3, 204, 163, 26, 180, 8, 4, 1, 169, - 3, 204, 163, 26, 180, 8, 6, 1, 39, 3, 54, 232, 238, 8, 4, 1, 39, 3, 54, - 232, 238, 8, 6, 1, 39, 3, 225, 163, 247, 161, 8, 4, 1, 39, 3, 225, 163, - 247, 161, 8, 6, 1, 237, 10, 3, 54, 232, 238, 8, 4, 1, 237, 10, 3, 54, - 232, 238, 8, 6, 1, 237, 10, 3, 225, 163, 247, 161, 8, 4, 1, 237, 10, 3, - 225, 163, 247, 161, 8, 6, 1, 230, 137, 3, 54, 232, 238, 8, 4, 1, 230, - 137, 3, 54, 232, 238, 8, 6, 1, 230, 137, 3, 225, 163, 247, 161, 8, 4, 1, - 230, 137, 3, 225, 163, 247, 161, 8, 6, 1, 169, 3, 54, 232, 238, 8, 4, 1, - 169, 3, 54, 232, 238, 8, 6, 1, 169, 3, 225, 163, 247, 161, 8, 4, 1, 169, - 3, 225, 163, 247, 161, 8, 6, 1, 210, 237, 3, 54, 232, 238, 8, 4, 1, 210, - 237, 3, 54, 232, 238, 8, 6, 1, 210, 237, 3, 225, 163, 247, 161, 8, 4, 1, - 210, 237, 3, 225, 163, 247, 161, 8, 6, 1, 115, 3, 54, 232, 238, 8, 4, 1, - 115, 3, 54, 232, 238, 8, 6, 1, 115, 3, 225, 163, 247, 161, 8, 4, 1, 115, - 3, 225, 163, 247, 161, 8, 6, 1, 209, 36, 3, 244, 24, 58, 8, 4, 1, 209, - 36, 3, 244, 24, 58, 8, 6, 1, 203, 186, 3, 244, 24, 58, 8, 4, 1, 203, 186, - 3, 244, 24, 58, 8, 6, 1, 195, 237, 8, 4, 1, 195, 237, 8, 6, 1, 232, 155, - 3, 246, 225, 8, 4, 1, 232, 155, 3, 246, 225, 8, 6, 1, 217, 226, 3, 172, - 52, 222, 74, 8, 4, 1, 240, 99, 3, 240, 144, 8, 6, 1, 213, 229, 8, 4, 1, - 213, 229, 8, 6, 1, 195, 158, 3, 124, 8, 4, 1, 195, 158, 3, 124, 8, 6, 1, - 39, 3, 76, 57, 8, 4, 1, 39, 3, 76, 57, 8, 6, 1, 237, 10, 3, 246, 169, 8, - 4, 1, 237, 10, 3, 246, 169, 8, 6, 1, 169, 3, 239, 19, 26, 220, 18, 8, 4, - 1, 169, 3, 239, 19, 26, 220, 18, 8, 6, 1, 169, 3, 202, 57, 26, 220, 18, - 8, 4, 1, 169, 3, 202, 57, 26, 220, 18, 8, 6, 1, 169, 3, 76, 57, 8, 4, 1, - 169, 3, 76, 57, 8, 6, 1, 169, 3, 76, 89, 26, 220, 18, 8, 4, 1, 169, 3, - 76, 89, 26, 220, 18, 8, 6, 1, 196, 144, 3, 220, 18, 8, 4, 1, 196, 144, 3, - 220, 18, 8, 4, 1, 223, 1, 3, 240, 144, 8, 4, 1, 217, 226, 3, 240, 144, 8, - 4, 1, 203, 186, 3, 240, 144, 8, 4, 1, 238, 122, 225, 108, 8, 4, 1, 239, - 174, 238, 234, 8, 4, 1, 211, 47, 238, 234, 8, 6, 1, 39, 3, 101, 8, 6, 1, - 247, 70, 3, 101, 8, 4, 1, 247, 70, 3, 101, 8, 6, 1, 223, 1, 3, 153, 8, 6, - 1, 203, 186, 3, 239, 15, 101, 8, 4, 1, 209, 36, 3, 204, 30, 203, 103, 8, - 4, 1, 195, 158, 3, 204, 30, 203, 103, 8, 6, 1, 233, 34, 204, 193, 8, 4, - 1, 233, 34, 204, 193, 8, 6, 1, 72, 3, 101, 8, 6, 1, 115, 153, 8, 6, 1, - 200, 240, 199, 215, 8, 6, 1, 237, 10, 3, 101, 8, 4, 1, 237, 10, 3, 101, - 8, 6, 1, 225, 109, 3, 101, 8, 4, 1, 225, 109, 3, 101, 8, 6, 1, 4, 211, - 117, 3, 231, 53, 203, 103, 8, 4, 1, 211, 117, 3, 231, 53, 203, 103, 8, 6, - 1, 210, 237, 3, 101, 8, 4, 1, 210, 237, 3, 101, 8, 6, 1, 196, 144, 3, - 101, 8, 4, 1, 196, 144, 3, 101, 8, 4, 1, 200, 240, 63, 8, 4, 1, 250, 236, - 8, 4, 1, 200, 240, 250, 236, 8, 4, 1, 72, 3, 124, 8, 4, 1, 185, 74, 8, 4, - 1, 247, 70, 3, 240, 144, 8, 4, 1, 240, 99, 3, 203, 103, 8, 4, 1, 240, 99, - 3, 124, 8, 4, 1, 210, 40, 70, 8, 4, 1, 208, 119, 8, 4, 1, 208, 120, 3, - 124, 8, 4, 1, 185, 70, 8, 4, 1, 210, 40, 185, 70, 8, 4, 1, 210, 40, 185, - 237, 10, 3, 124, 8, 4, 1, 244, 67, 210, 40, 185, 70, 8, 4, 1, 238, 122, - 225, 109, 3, 101, 8, 4, 1, 234, 72, 3, 124, 8, 4, 1, 144, 234, 71, 8, 1, - 4, 6, 234, 71, 8, 4, 1, 233, 231, 8, 4, 1, 210, 157, 230, 246, 8, 4, 1, - 200, 240, 232, 154, 8, 4, 1, 232, 155, 3, 124, 8, 4, 1, 231, 243, 3, 124, - 8, 4, 1, 230, 137, 3, 101, 8, 4, 1, 225, 154, 8, 1, 4, 6, 68, 8, 4, 1, - 223, 1, 3, 108, 202, 56, 8, 4, 1, 223, 1, 3, 248, 79, 8, 4, 1, 223, 1, 3, - 210, 46, 124, 8, 4, 1, 222, 27, 8, 4, 1, 200, 240, 221, 40, 8, 4, 1, 200, - 240, 221, 41, 3, 172, 222, 74, 8, 4, 1, 221, 41, 3, 124, 8, 4, 1, 217, - 226, 3, 50, 124, 8, 4, 1, 217, 226, 3, 210, 46, 124, 8, 1, 4, 6, 217, - 225, 8, 4, 1, 248, 184, 74, 8, 1, 4, 6, 214, 91, 8, 4, 1, 244, 67, 214, - 53, 8, 4, 1, 212, 189, 8, 4, 1, 200, 240, 143, 8, 4, 1, 200, 240, 210, - 237, 3, 172, 222, 74, 8, 4, 1, 200, 240, 210, 237, 3, 124, 8, 4, 1, 210, - 237, 3, 172, 222, 74, 8, 4, 1, 210, 237, 3, 203, 103, 8, 4, 1, 210, 237, - 3, 234, 244, 8, 4, 1, 210, 40, 210, 237, 3, 234, 244, 8, 1, 4, 6, 143, 8, - 1, 4, 6, 225, 163, 143, 8, 4, 1, 209, 36, 3, 124, 8, 4, 1, 236, 20, 8, 4, - 1, 238, 122, 225, 109, 3, 204, 163, 26, 124, 8, 4, 1, 205, 54, 210, 40, - 236, 20, 8, 4, 1, 236, 21, 3, 240, 144, 8, 4, 1, 200, 240, 203, 185, 8, - 4, 1, 203, 186, 3, 210, 46, 124, 8, 4, 1, 115, 153, 8, 4, 1, 200, 12, 8, - 4, 1, 199, 216, 3, 124, 8, 4, 1, 200, 240, 199, 215, 8, 4, 1, 200, 240, - 197, 189, 8, 4, 1, 200, 240, 196, 143, 8, 1, 4, 6, 196, 143, 8, 4, 1, - 195, 158, 3, 210, 46, 124, 8, 4, 1, 195, 158, 3, 240, 144, 8, 4, 1, 235, - 187, 8, 4, 1, 235, 188, 3, 240, 144, 8, 1, 233, 34, 204, 193, 8, 1, 212, - 196, 198, 233, 234, 122, 8, 1, 225, 163, 233, 34, 204, 193, 8, 1, 204, - 171, 247, 69, 8, 1, 248, 25, 244, 79, 8, 1, 4, 6, 249, 219, 8, 4, 1, 244, - 67, 185, 70, 8, 1, 4, 6, 234, 72, 3, 124, 8, 1, 4, 6, 232, 154, 8, 4, 1, - 225, 109, 3, 240, 178, 8, 4, 1, 200, 240, 224, 227, 8, 1, 4, 6, 158, 8, - 4, 1, 211, 117, 3, 124, 8, 1, 233, 34, 204, 194, 3, 101, 8, 1, 210, 40, - 233, 34, 204, 194, 3, 101, 8, 4, 1, 237, 31, 238, 234, 8, 4, 1, 239, 46, - 238, 234, 8, 4, 1, 237, 31, 238, 235, 3, 240, 144, 8, 4, 1, 201, 95, 238, - 234, 8, 4, 1, 202, 232, 238, 234, 8, 4, 1, 203, 43, 238, 235, 3, 240, - 144, 8, 4, 1, 235, 47, 238, 234, 8, 4, 1, 221, 97, 238, 234, 8, 4, 1, - 221, 42, 238, 234, 8, 1, 248, 25, 212, 243, 8, 1, 248, 33, 212, 243, 8, - 4, 1, 200, 240, 232, 155, 3, 234, 244, 8, 4, 1, 200, 240, 232, 155, 3, - 234, 245, 26, 203, 103, 71, 1, 4, 232, 154, 71, 1, 4, 232, 155, 3, 124, - 71, 1, 4, 225, 108, 71, 1, 4, 143, 71, 1, 4, 200, 240, 143, 71, 1, 4, - 200, 240, 210, 237, 3, 124, 71, 1, 4, 6, 225, 163, 143, 71, 1, 4, 197, - 189, 71, 1, 4, 196, 143, 71, 1, 211, 222, 71, 1, 54, 211, 222, 71, 1, - 200, 240, 244, 23, 71, 1, 250, 134, 71, 1, 210, 40, 244, 23, 71, 1, 52, - 155, 209, 210, 71, 1, 50, 155, 209, 210, 71, 1, 233, 34, 204, 193, 71, 1, - 210, 40, 233, 34, 204, 193, 71, 1, 50, 250, 67, 71, 1, 52, 250, 67, 71, - 1, 120, 250, 67, 71, 1, 133, 250, 67, 71, 1, 244, 105, 251, 122, 246, - 225, 71, 1, 83, 221, 233, 71, 1, 220, 18, 71, 1, 251, 110, 251, 122, 71, - 1, 232, 239, 251, 122, 71, 1, 125, 83, 221, 233, 71, 1, 125, 220, 18, 71, - 1, 125, 232, 239, 251, 122, 71, 1, 125, 251, 110, 251, 122, 71, 1, 201, - 157, 244, 32, 71, 1, 155, 201, 157, 244, 32, 71, 1, 246, 154, 52, 155, - 209, 210, 71, 1, 246, 154, 50, 155, 209, 210, 71, 1, 120, 203, 115, 71, - 1, 133, 203, 115, 71, 1, 96, 56, 71, 1, 218, 181, 56, 247, 161, 76, 57, - 209, 211, 57, 214, 80, 4, 202, 56, 54, 251, 110, 251, 122, 71, 1, 210, - 24, 124, 71, 1, 240, 183, 251, 122, 71, 1, 4, 233, 231, 71, 1, 4, 158, - 71, 1, 4, 209, 35, 71, 1, 4, 196, 216, 71, 1, 4, 210, 40, 233, 34, 204, - 193, 71, 1, 235, 209, 154, 153, 71, 1, 128, 154, 153, 71, 1, 218, 230, - 154, 153, 71, 1, 125, 154, 153, 71, 1, 235, 208, 154, 153, 71, 1, 196, - 10, 239, 70, 154, 78, 71, 1, 196, 91, 239, 70, 154, 78, 71, 1, 198, 231, - 71, 1, 200, 51, 71, 1, 54, 250, 134, 71, 1, 125, 133, 250, 67, 71, 1, - 125, 120, 250, 67, 71, 1, 125, 50, 250, 67, 71, 1, 125, 52, 250, 67, 71, - 1, 125, 209, 210, 71, 1, 108, 232, 239, 251, 122, 71, 1, 108, 54, 232, - 239, 251, 122, 71, 1, 108, 54, 251, 110, 251, 122, 71, 1, 125, 202, 56, - 71, 1, 210, 164, 244, 32, 71, 1, 248, 97, 128, 201, 239, 71, 1, 236, 98, - 128, 201, 239, 71, 1, 248, 97, 125, 201, 239, 71, 1, 236, 98, 125, 201, - 239, 71, 1, 206, 202, 71, 1, 185, 206, 202, 71, 1, 125, 50, 51, 37, 232, - 239, 251, 122, 37, 251, 110, 251, 122, 37, 244, 105, 251, 122, 37, 202, - 56, 37, 220, 18, 37, 213, 210, 37, 247, 161, 37, 76, 57, 37, 239, 18, 37, - 231, 53, 57, 37, 209, 211, 57, 37, 54, 251, 110, 251, 122, 37, 246, 225, - 37, 83, 221, 234, 57, 37, 54, 83, 221, 234, 57, 37, 54, 232, 239, 251, - 122, 37, 246, 251, 37, 225, 163, 247, 161, 37, 200, 240, 244, 24, 57, 37, - 244, 24, 57, 37, 210, 40, 244, 24, 57, 37, 244, 24, 89, 209, 230, 37, - 232, 239, 251, 123, 58, 37, 251, 110, 251, 123, 58, 37, 50, 203, 116, 58, - 37, 52, 203, 116, 58, 37, 50, 250, 193, 57, 37, 230, 246, 37, 50, 155, - 209, 211, 58, 37, 120, 203, 116, 58, 37, 133, 203, 116, 58, 37, 96, 2, - 58, 37, 218, 181, 2, 58, 37, 213, 150, 231, 53, 58, 37, 210, 46, 231, 53, - 58, 37, 76, 58, 37, 239, 19, 58, 37, 209, 211, 58, 37, 244, 24, 58, 37, - 246, 169, 37, 214, 80, 37, 83, 221, 234, 58, 37, 247, 155, 58, 37, 225, - 163, 54, 250, 100, 58, 37, 246, 226, 58, 37, 244, 105, 251, 123, 58, 37, - 247, 162, 58, 37, 225, 163, 247, 162, 58, 37, 202, 57, 58, 37, 220, 19, - 58, 37, 125, 221, 233, 37, 54, 125, 221, 233, 37, 202, 57, 213, 211, 37, - 206, 139, 204, 163, 213, 211, 37, 172, 204, 163, 213, 211, 37, 206, 139, - 205, 140, 213, 211, 37, 172, 205, 140, 213, 211, 37, 52, 155, 209, 211, - 58, 37, 225, 163, 247, 155, 58, 37, 46, 58, 37, 208, 97, 58, 37, 196, - 217, 57, 37, 83, 202, 56, 37, 54, 213, 210, 37, 232, 239, 154, 78, 37, - 251, 110, 154, 78, 37, 31, 212, 237, 37, 31, 223, 131, 37, 31, 239, 12, - 201, 227, 37, 31, 195, 223, 37, 247, 155, 57, 37, 236, 49, 2, 58, 37, 54, - 83, 221, 234, 58, 37, 50, 250, 193, 58, 37, 215, 194, 202, 57, 57, 37, - 231, 59, 57, 37, 250, 241, 171, 202, 2, 57, 37, 50, 52, 59, 58, 37, 200, - 8, 59, 58, 37, 232, 245, 225, 15, 37, 52, 250, 68, 57, 37, 50, 155, 209, - 211, 57, 37, 235, 44, 37, 196, 217, 58, 37, 50, 250, 68, 58, 37, 52, 250, - 68, 58, 37, 52, 250, 68, 26, 120, 250, 68, 58, 37, 52, 155, 209, 211, 57, - 37, 76, 89, 209, 230, 37, 250, 30, 58, 37, 54, 209, 211, 58, 37, 195, 24, - 57, 37, 54, 247, 162, 58, 37, 54, 247, 161, 37, 54, 220, 18, 37, 54, 220, - 19, 58, 37, 54, 202, 56, 37, 54, 225, 163, 247, 161, 37, 54, 90, 59, 58, - 37, 8, 4, 1, 63, 37, 8, 4, 1, 70, 37, 8, 4, 1, 68, 37, 8, 4, 1, 74, 37, - 8, 4, 1, 66, 37, 8, 4, 1, 247, 69, 37, 8, 4, 1, 240, 98, 37, 8, 4, 1, - 232, 154, 37, 8, 4, 1, 221, 40, 37, 8, 4, 1, 143, 37, 8, 4, 1, 203, 185, - 37, 8, 4, 1, 199, 215, 37, 8, 4, 1, 196, 216, 31, 6, 1, 231, 231, 31, 4, - 1, 231, 231, 31, 6, 1, 250, 99, 208, 177, 31, 4, 1, 250, 99, 208, 177, - 31, 215, 67, 56, 31, 221, 107, 215, 67, 56, 31, 6, 1, 213, 134, 238, 242, - 31, 4, 1, 213, 134, 238, 242, 31, 195, 223, 31, 4, 210, 40, 221, 77, 206, - 44, 102, 31, 4, 237, 120, 221, 77, 206, 44, 102, 31, 4, 210, 40, 237, - 120, 221, 77, 206, 44, 102, 31, 211, 28, 78, 31, 6, 1, 195, 230, 31, 201, - 227, 31, 239, 12, 201, 227, 31, 6, 1, 250, 237, 3, 201, 227, 31, 250, - 178, 203, 3, 31, 6, 1, 236, 52, 3, 201, 227, 31, 6, 1, 236, 6, 3, 201, - 227, 31, 6, 1, 225, 155, 3, 201, 227, 31, 6, 1, 214, 52, 3, 201, 227, 31, - 6, 1, 200, 13, 3, 201, 227, 31, 6, 1, 214, 54, 3, 201, 227, 31, 4, 1, - 225, 155, 3, 239, 12, 26, 201, 227, 31, 6, 1, 250, 236, 31, 6, 1, 248, - 61, 31, 6, 1, 233, 231, 31, 6, 1, 239, 80, 31, 6, 1, 236, 51, 31, 6, 1, - 195, 78, 31, 6, 1, 236, 5, 31, 6, 1, 202, 168, 31, 6, 1, 225, 154, 31, 6, - 1, 224, 150, 31, 6, 1, 222, 146, 31, 6, 1, 218, 56, 31, 6, 1, 215, 111, - 31, 6, 1, 196, 190, 31, 6, 1, 214, 51, 31, 6, 1, 212, 163, 31, 6, 1, 210, - 25, 31, 6, 1, 206, 43, 31, 6, 1, 203, 57, 31, 6, 1, 200, 12, 31, 6, 1, - 212, 189, 31, 6, 1, 244, 195, 31, 6, 1, 211, 186, 31, 6, 1, 214, 53, 31, - 6, 1, 225, 155, 3, 239, 11, 31, 6, 1, 200, 13, 3, 239, 11, 31, 4, 1, 250, - 237, 3, 201, 227, 31, 4, 1, 236, 52, 3, 201, 227, 31, 4, 1, 236, 6, 3, - 201, 227, 31, 4, 1, 225, 155, 3, 201, 227, 31, 4, 1, 200, 13, 3, 239, 12, - 26, 201, 227, 31, 4, 1, 250, 236, 31, 4, 1, 248, 61, 31, 4, 1, 233, 231, - 31, 4, 1, 239, 80, 31, 4, 1, 236, 51, 31, 4, 1, 195, 78, 31, 4, 1, 236, - 5, 31, 4, 1, 202, 168, 31, 4, 1, 225, 154, 31, 4, 1, 224, 150, 31, 4, 1, - 222, 146, 31, 4, 1, 218, 56, 31, 4, 1, 215, 111, 31, 4, 1, 196, 190, 31, - 4, 1, 214, 51, 31, 4, 1, 212, 163, 31, 4, 1, 210, 25, 31, 4, 1, 48, 206, - 43, 31, 4, 1, 206, 43, 31, 4, 1, 203, 57, 31, 4, 1, 200, 12, 31, 4, 1, - 212, 189, 31, 4, 1, 244, 195, 31, 4, 1, 211, 186, 31, 4, 1, 214, 53, 31, - 4, 1, 225, 155, 3, 239, 11, 31, 4, 1, 200, 13, 3, 239, 11, 31, 4, 1, 214, - 52, 3, 201, 227, 31, 4, 1, 200, 13, 3, 201, 227, 31, 4, 1, 214, 54, 3, - 201, 227, 31, 6, 224, 180, 102, 31, 248, 62, 102, 31, 202, 169, 102, 31, - 200, 13, 3, 231, 53, 102, 31, 200, 13, 3, 251, 110, 26, 231, 53, 102, 31, - 200, 13, 3, 239, 19, 26, 231, 53, 102, 31, 212, 190, 102, 31, 212, 164, - 102, 31, 224, 180, 102, 31, 1, 250, 99, 223, 135, 31, 4, 1, 250, 99, 223, - 135, 31, 1, 204, 203, 31, 4, 1, 204, 203, 31, 1, 238, 242, 31, 4, 1, 238, - 242, 31, 1, 223, 135, 31, 4, 1, 223, 135, 31, 1, 208, 177, 31, 4, 1, 208, - 177, 87, 6, 1, 206, 203, 87, 4, 1, 206, 203, 87, 6, 1, 235, 54, 87, 4, 1, - 235, 54, 87, 6, 1, 224, 21, 87, 4, 1, 224, 21, 87, 6, 1, 231, 44, 87, 4, - 1, 231, 44, 87, 6, 1, 233, 226, 87, 4, 1, 233, 226, 87, 6, 1, 206, 169, - 87, 4, 1, 206, 169, 87, 6, 1, 239, 96, 87, 4, 1, 239, 96, 31, 224, 151, - 102, 31, 210, 26, 102, 31, 221, 77, 206, 44, 102, 31, 1, 195, 230, 31, 6, - 202, 169, 102, 31, 221, 77, 236, 52, 102, 31, 210, 40, 221, 77, 236, 52, - 102, 31, 6, 1, 206, 154, 31, 4, 1, 206, 154, 31, 6, 221, 77, 206, 44, - 102, 31, 6, 1, 208, 174, 31, 4, 1, 208, 174, 31, 210, 26, 3, 204, 163, - 102, 31, 6, 210, 40, 221, 77, 206, 44, 102, 31, 6, 237, 120, 221, 77, - 206, 44, 102, 31, 6, 210, 40, 237, 120, 221, 77, 206, 44, 102, 40, 6, 1, - 226, 36, 3, 232, 238, 40, 6, 1, 225, 158, 40, 6, 1, 238, 172, 40, 6, 1, - 233, 43, 40, 6, 1, 200, 67, 226, 35, 40, 6, 1, 237, 26, 40, 6, 1, 247, - 79, 68, 40, 6, 1, 196, 20, 40, 6, 1, 225, 84, 40, 6, 1, 221, 198, 40, 6, - 1, 216, 75, 40, 6, 1, 201, 81, 40, 6, 1, 223, 188, 40, 6, 1, 230, 137, 3, - 232, 238, 40, 6, 1, 206, 139, 66, 40, 6, 1, 237, 22, 40, 6, 1, 63, 40, 6, - 1, 248, 119, 40, 6, 1, 199, 105, 40, 6, 1, 233, 98, 40, 6, 1, 239, 119, - 40, 6, 1, 226, 35, 40, 6, 1, 195, 65, 40, 6, 1, 195, 88, 40, 6, 1, 68, - 40, 6, 1, 206, 139, 68, 40, 6, 1, 157, 40, 6, 1, 236, 138, 40, 6, 1, 236, - 117, 40, 6, 1, 236, 106, 40, 6, 1, 74, 40, 6, 1, 213, 35, 40, 6, 1, 236, - 42, 40, 6, 1, 236, 30, 40, 6, 1, 203, 36, 40, 6, 1, 66, 40, 6, 1, 236, - 177, 40, 6, 1, 142, 40, 6, 1, 201, 87, 40, 6, 1, 244, 223, 40, 6, 1, 207, - 6, 40, 6, 1, 206, 214, 40, 6, 1, 232, 58, 56, 40, 6, 1, 196, 43, 40, 6, - 1, 205, 148, 56, 40, 6, 1, 70, 40, 6, 1, 195, 215, 40, 6, 1, 165, 40, 4, - 1, 63, 40, 4, 1, 248, 119, 40, 4, 1, 199, 105, 40, 4, 1, 233, 98, 40, 4, - 1, 239, 119, 40, 4, 1, 226, 35, 40, 4, 1, 195, 65, 40, 4, 1, 195, 88, 40, - 4, 1, 68, 40, 4, 1, 206, 139, 68, 40, 4, 1, 157, 40, 4, 1, 236, 138, 40, - 4, 1, 236, 117, 40, 4, 1, 236, 106, 40, 4, 1, 74, 40, 4, 1, 213, 35, 40, - 4, 1, 236, 42, 40, 4, 1, 236, 30, 40, 4, 1, 203, 36, 40, 4, 1, 66, 40, 4, - 1, 236, 177, 40, 4, 1, 142, 40, 4, 1, 201, 87, 40, 4, 1, 244, 223, 40, 4, - 1, 207, 6, 40, 4, 1, 206, 214, 40, 4, 1, 232, 58, 56, 40, 4, 1, 196, 43, - 40, 4, 1, 205, 148, 56, 40, 4, 1, 70, 40, 4, 1, 195, 215, 40, 4, 1, 165, - 40, 4, 1, 226, 36, 3, 232, 238, 40, 4, 1, 225, 158, 40, 4, 1, 238, 172, - 40, 4, 1, 233, 43, 40, 4, 1, 200, 67, 226, 35, 40, 4, 1, 237, 26, 40, 4, - 1, 247, 79, 68, 40, 4, 1, 196, 20, 40, 4, 1, 225, 84, 40, 4, 1, 221, 198, - 40, 4, 1, 216, 75, 40, 4, 1, 201, 81, 40, 4, 1, 223, 188, 40, 4, 1, 230, - 137, 3, 232, 238, 40, 4, 1, 206, 139, 66, 40, 4, 1, 237, 22, 40, 6, 1, - 214, 53, 40, 4, 1, 214, 53, 40, 6, 1, 196, 79, 40, 4, 1, 196, 79, 40, 6, - 1, 225, 152, 70, 40, 4, 1, 225, 152, 70, 40, 6, 1, 221, 205, 195, 181, - 40, 4, 1, 221, 205, 195, 181, 40, 6, 1, 225, 152, 221, 205, 195, 181, 40, - 4, 1, 225, 152, 221, 205, 195, 181, 40, 6, 1, 248, 28, 195, 181, 40, 4, - 1, 248, 28, 195, 181, 40, 6, 1, 225, 152, 248, 28, 195, 181, 40, 4, 1, - 225, 152, 248, 28, 195, 181, 40, 6, 1, 223, 102, 40, 4, 1, 223, 102, 40, - 6, 1, 211, 186, 40, 4, 1, 211, 186, 40, 6, 1, 234, 239, 40, 4, 1, 234, - 239, 40, 6, 1, 225, 110, 40, 4, 1, 225, 110, 40, 6, 1, 225, 111, 3, 54, - 232, 239, 251, 122, 40, 4, 1, 225, 111, 3, 54, 232, 239, 251, 122, 40, 6, - 1, 200, 70, 40, 4, 1, 200, 70, 40, 6, 1, 209, 141, 214, 53, 40, 4, 1, - 209, 141, 214, 53, 40, 6, 1, 214, 54, 3, 202, 26, 40, 4, 1, 214, 54, 3, - 202, 26, 40, 6, 1, 213, 237, 40, 4, 1, 213, 237, 40, 6, 1, 223, 135, 40, - 4, 1, 223, 135, 40, 202, 129, 56, 37, 40, 202, 26, 37, 40, 213, 151, 37, - 40, 239, 186, 212, 64, 37, 40, 211, 180, 212, 64, 37, 40, 212, 48, 37, - 40, 230, 202, 202, 129, 56, 37, 40, 218, 192, 56, 40, 6, 1, 206, 139, - 230, 137, 3, 203, 103, 40, 4, 1, 206, 139, 230, 137, 3, 203, 103, 40, 6, - 1, 207, 57, 56, 40, 4, 1, 207, 57, 56, 40, 6, 1, 236, 43, 3, 202, 83, 40, - 4, 1, 236, 43, 3, 202, 83, 40, 6, 1, 233, 99, 3, 200, 11, 40, 4, 1, 233, - 99, 3, 200, 11, 40, 6, 1, 233, 99, 3, 101, 40, 4, 1, 233, 99, 3, 101, 40, - 6, 1, 233, 99, 3, 108, 124, 40, 4, 1, 233, 99, 3, 108, 124, 40, 6, 1, - 195, 66, 3, 239, 63, 40, 4, 1, 195, 66, 3, 239, 63, 40, 6, 1, 195, 89, 3, - 239, 63, 40, 4, 1, 195, 89, 3, 239, 63, 40, 6, 1, 224, 217, 3, 239, 63, - 40, 4, 1, 224, 217, 3, 239, 63, 40, 6, 1, 224, 217, 3, 83, 101, 40, 4, 1, - 224, 217, 3, 83, 101, 40, 6, 1, 224, 217, 3, 101, 40, 4, 1, 224, 217, 3, - 101, 40, 6, 1, 248, 172, 157, 40, 4, 1, 248, 172, 157, 40, 6, 1, 236, - 107, 3, 239, 63, 40, 4, 1, 236, 107, 3, 239, 63, 40, 6, 32, 236, 107, - 233, 98, 40, 4, 32, 236, 107, 233, 98, 40, 6, 1, 213, 36, 3, 108, 124, - 40, 4, 1, 213, 36, 3, 108, 124, 40, 6, 1, 251, 129, 142, 40, 4, 1, 251, - 129, 142, 40, 6, 1, 236, 31, 3, 239, 63, 40, 4, 1, 236, 31, 3, 239, 63, - 40, 6, 1, 203, 37, 3, 239, 63, 40, 4, 1, 203, 37, 3, 239, 63, 40, 6, 1, - 204, 185, 66, 40, 4, 1, 204, 185, 66, 40, 6, 1, 204, 185, 115, 3, 101, - 40, 4, 1, 204, 185, 115, 3, 101, 40, 6, 1, 232, 143, 3, 239, 63, 40, 4, - 1, 232, 143, 3, 239, 63, 40, 6, 32, 203, 37, 201, 87, 40, 4, 32, 203, 37, - 201, 87, 40, 6, 1, 244, 224, 3, 239, 63, 40, 4, 1, 244, 224, 3, 239, 63, - 40, 6, 1, 244, 224, 3, 83, 101, 40, 4, 1, 244, 224, 3, 83, 101, 40, 6, 1, - 206, 180, 40, 4, 1, 206, 180, 40, 6, 1, 251, 129, 244, 223, 40, 4, 1, - 251, 129, 244, 223, 40, 6, 1, 251, 129, 244, 224, 3, 239, 63, 40, 4, 1, - 251, 129, 244, 224, 3, 239, 63, 40, 1, 213, 141, 40, 6, 1, 195, 66, 3, - 247, 161, 40, 4, 1, 195, 66, 3, 247, 161, 40, 6, 1, 224, 217, 3, 124, 40, - 4, 1, 224, 217, 3, 124, 40, 6, 1, 236, 139, 3, 203, 103, 40, 4, 1, 236, - 139, 3, 203, 103, 40, 6, 1, 236, 107, 3, 124, 40, 4, 1, 236, 107, 3, 124, - 40, 6, 1, 236, 107, 3, 203, 103, 40, 4, 1, 236, 107, 3, 203, 103, 40, 6, - 1, 224, 32, 244, 223, 40, 4, 1, 224, 32, 244, 223, 40, 6, 1, 236, 118, 3, - 203, 103, 40, 4, 1, 236, 118, 3, 203, 103, 40, 4, 1, 213, 141, 40, 6, 1, - 39, 3, 247, 161, 40, 4, 1, 39, 3, 247, 161, 40, 6, 1, 39, 3, 239, 18, 40, - 4, 1, 39, 3, 239, 18, 40, 6, 32, 39, 226, 35, 40, 4, 32, 39, 226, 35, 40, - 6, 1, 226, 36, 3, 247, 161, 40, 4, 1, 226, 36, 3, 247, 161, 40, 6, 1, - 208, 119, 40, 4, 1, 208, 119, 40, 6, 1, 208, 120, 3, 239, 18, 40, 4, 1, - 208, 120, 3, 239, 18, 40, 6, 1, 195, 66, 3, 239, 18, 40, 4, 1, 195, 66, - 3, 239, 18, 40, 6, 1, 195, 89, 3, 239, 18, 40, 4, 1, 195, 89, 3, 239, 18, - 40, 6, 1, 251, 129, 237, 26, 40, 4, 1, 251, 129, 237, 26, 40, 6, 1, 230, - 137, 3, 220, 18, 40, 4, 1, 230, 137, 3, 220, 18, 40, 6, 1, 230, 137, 3, - 239, 18, 40, 4, 1, 230, 137, 3, 239, 18, 40, 6, 1, 169, 3, 239, 18, 40, - 4, 1, 169, 3, 239, 18, 40, 6, 1, 248, 184, 74, 40, 4, 1, 248, 184, 74, - 40, 6, 1, 248, 184, 169, 3, 239, 18, 40, 4, 1, 248, 184, 169, 3, 239, 18, - 40, 6, 1, 237, 10, 3, 239, 18, 40, 4, 1, 237, 10, 3, 239, 18, 40, 6, 1, - 115, 3, 220, 18, 40, 4, 1, 115, 3, 220, 18, 40, 6, 1, 115, 3, 239, 18, - 40, 4, 1, 115, 3, 239, 18, 40, 6, 1, 115, 3, 54, 180, 40, 4, 1, 115, 3, - 54, 180, 40, 6, 1, 244, 224, 3, 239, 18, 40, 4, 1, 244, 224, 3, 239, 18, - 40, 6, 1, 233, 99, 3, 239, 63, 40, 4, 1, 233, 99, 3, 239, 63, 40, 6, 1, - 196, 44, 3, 239, 18, 40, 4, 1, 196, 44, 3, 239, 18, 40, 6, 1, 233, 99, 3, - 204, 163, 26, 124, 40, 4, 1, 233, 99, 3, 204, 163, 26, 124, 40, 6, 1, - 232, 143, 3, 124, 40, 4, 1, 232, 143, 3, 124, 40, 6, 1, 232, 143, 3, 101, - 40, 4, 1, 232, 143, 3, 101, 40, 6, 1, 223, 145, 239, 119, 40, 4, 1, 223, - 145, 239, 119, 40, 6, 1, 223, 145, 238, 172, 40, 4, 1, 223, 145, 238, - 172, 40, 6, 1, 223, 145, 195, 15, 40, 4, 1, 223, 145, 195, 15, 40, 6, 1, - 223, 145, 237, 18, 40, 4, 1, 223, 145, 237, 18, 40, 6, 1, 223, 145, 221, - 198, 40, 4, 1, 223, 145, 221, 198, 40, 6, 1, 223, 145, 216, 75, 40, 4, 1, - 223, 145, 216, 75, 40, 6, 1, 223, 145, 205, 224, 40, 4, 1, 223, 145, 205, - 224, 40, 6, 1, 223, 145, 202, 20, 40, 4, 1, 223, 145, 202, 20, 40, 6, 1, - 210, 40, 195, 88, 40, 4, 1, 210, 40, 195, 88, 40, 6, 1, 236, 139, 3, 124, - 40, 4, 1, 236, 139, 3, 124, 40, 6, 1, 222, 24, 40, 4, 1, 222, 24, 40, 6, - 1, 210, 28, 40, 4, 1, 210, 28, 40, 6, 1, 196, 113, 40, 4, 1, 196, 113, - 40, 6, 1, 211, 108, 40, 4, 1, 211, 108, 40, 6, 1, 197, 101, 40, 4, 1, - 197, 101, 40, 6, 1, 251, 6, 157, 40, 4, 1, 251, 6, 157, 40, 6, 1, 236, - 139, 3, 108, 124, 40, 4, 1, 236, 139, 3, 108, 124, 40, 6, 1, 236, 107, 3, - 108, 124, 40, 4, 1, 236, 107, 3, 108, 124, 40, 6, 1, 213, 36, 3, 239, 63, - 40, 4, 1, 213, 36, 3, 239, 63, 40, 6, 1, 206, 181, 3, 239, 63, 40, 4, 1, - 206, 181, 3, 239, 63, 40, 6, 1, 236, 107, 3, 50, 124, 40, 4, 1, 236, 107, - 3, 50, 124, 40, 6, 1, 237, 11, 40, 4, 1, 237, 11, 40, 6, 1, 239, 168, 40, - 4, 1, 239, 168, 40, 6, 1, 236, 139, 3, 239, 63, 40, 4, 1, 236, 139, 3, - 239, 63, 192, 6, 1, 249, 226, 192, 6, 1, 248, 77, 192, 6, 1, 233, 61, - 192, 6, 1, 240, 3, 192, 6, 1, 236, 190, 192, 6, 1, 195, 114, 192, 6, 1, - 236, 170, 192, 6, 1, 236, 7, 192, 6, 1, 147, 192, 6, 1, 195, 65, 192, 6, - 1, 225, 199, 192, 6, 1, 221, 202, 192, 6, 1, 196, 194, 192, 6, 1, 247, - 36, 192, 6, 1, 224, 74, 192, 6, 1, 231, 81, 192, 6, 1, 225, 105, 192, 6, - 1, 233, 109, 192, 6, 1, 244, 213, 192, 6, 1, 219, 73, 192, 6, 1, 196, 20, - 192, 6, 1, 215, 179, 192, 6, 1, 207, 6, 192, 6, 1, 198, 237, 192, 6, 1, - 246, 136, 192, 6, 1, 213, 15, 192, 6, 1, 225, 66, 192, 6, 1, 173, 192, 6, - 1, 208, 75, 192, 6, 1, 199, 28, 192, 6, 1, 202, 23, 192, 6, 1, 210, 92, - 192, 6, 1, 244, 46, 192, 6, 1, 196, 5, 192, 6, 1, 212, 98, 192, 6, 1, - 224, 85, 192, 6, 1, 214, 78, 192, 6, 1, 235, 56, 192, 71, 1, 50, 155, - 209, 210, 192, 250, 134, 192, 236, 110, 78, 192, 235, 225, 78, 192, 244, - 23, 192, 211, 28, 78, 192, 251, 130, 78, 192, 4, 1, 200, 240, 249, 226, - 192, 4, 1, 249, 226, 192, 4, 1, 248, 77, 192, 4, 1, 233, 61, 192, 4, 1, - 240, 3, 192, 4, 1, 236, 190, 192, 4, 1, 195, 114, 192, 4, 1, 236, 170, - 192, 4, 1, 236, 7, 192, 4, 1, 147, 192, 4, 1, 195, 65, 192, 4, 1, 225, - 199, 192, 4, 1, 221, 202, 192, 4, 1, 196, 194, 192, 4, 1, 247, 36, 192, - 4, 1, 224, 74, 192, 4, 1, 231, 81, 192, 4, 1, 225, 105, 192, 4, 1, 233, - 109, 192, 4, 1, 244, 213, 192, 4, 1, 219, 73, 192, 4, 1, 196, 20, 192, 4, - 1, 215, 179, 192, 4, 1, 207, 6, 192, 4, 1, 198, 237, 192, 4, 1, 246, 136, - 192, 4, 1, 213, 15, 192, 4, 1, 225, 66, 192, 4, 1, 173, 192, 4, 1, 208, - 75, 192, 4, 1, 199, 28, 192, 4, 1, 202, 23, 192, 4, 1, 210, 92, 192, 4, - 1, 244, 46, 192, 4, 1, 196, 5, 192, 4, 1, 212, 98, 192, 4, 1, 224, 85, - 192, 4, 1, 214, 78, 192, 4, 1, 235, 56, 192, 4, 32, 236, 191, 196, 5, - 192, 4, 1, 11, 3, 101, 192, 234, 98, 204, 193, 192, 230, 151, 209, 229, - 192, 236, 3, 56, 222, 85, 192, 236, 3, 56, 192, 237, 94, 56, 119, 251, - 123, 235, 254, 119, 251, 123, 208, 76, 119, 251, 123, 206, 239, 119, 251, - 123, 195, 99, 211, 91, 119, 251, 123, 195, 99, 233, 250, 119, 251, 123, - 202, 38, 119, 251, 123, 210, 37, 119, 251, 123, 195, 97, 119, 251, 123, - 213, 64, 119, 251, 123, 196, 33, 119, 251, 123, 202, 209, 119, 251, 123, - 233, 160, 119, 251, 123, 233, 161, 218, 14, 119, 251, 123, 233, 158, 119, - 251, 123, 211, 92, 213, 95, 119, 251, 123, 202, 254, 233, 179, 119, 251, - 123, 213, 41, 119, 251, 123, 250, 9, 232, 123, 119, 251, 123, 218, 24, - 119, 251, 123, 219, 246, 119, 251, 123, 219, 62, 119, 251, 123, 219, 63, - 224, 86, 119, 251, 123, 239, 195, 119, 251, 123, 211, 103, 119, 251, 123, - 202, 254, 211, 86, 119, 251, 123, 196, 46, 248, 78, 195, 236, 119, 251, - 123, 214, 60, 119, 251, 123, 225, 250, 119, 251, 123, 239, 97, 119, 251, - 123, 195, 22, 119, 113, 219, 170, 244, 113, 119, 212, 56, 206, 183, 119, - 212, 56, 232, 49, 208, 76, 119, 212, 56, 232, 49, 213, 55, 119, 212, 56, - 232, 49, 211, 96, 119, 212, 56, 231, 177, 119, 212, 56, 201, 84, 119, - 212, 56, 208, 76, 119, 212, 56, 213, 55, 119, 212, 56, 211, 96, 119, 212, - 56, 231, 65, 119, 212, 56, 231, 66, 232, 51, 38, 199, 109, 119, 212, 56, - 211, 32, 119, 212, 56, 239, 244, 214, 4, 219, 203, 119, 212, 56, 219, 51, - 119, 211, 163, 219, 200, 119, 212, 56, 210, 176, 119, 211, 163, 213, 66, - 119, 212, 56, 206, 168, 238, 123, 119, 212, 56, 206, 23, 238, 123, 119, - 211, 163, 205, 149, 213, 57, 119, 113, 200, 17, 238, 123, 119, 113, 221, - 107, 238, 123, 119, 211, 163, 215, 64, 232, 122, 119, 212, 56, 211, 97, - 211, 91, 119, 1, 251, 10, 119, 1, 248, 63, 119, 1, 233, 59, 119, 1, 239, - 224, 119, 1, 232, 32, 119, 1, 199, 109, 119, 1, 195, 91, 119, 1, 231, - 232, 119, 1, 202, 226, 119, 1, 195, 239, 119, 1, 48, 224, 183, 119, 1, - 224, 183, 119, 1, 222, 142, 119, 1, 48, 219, 80, 119, 1, 219, 80, 119, 1, - 48, 215, 63, 119, 1, 215, 63, 119, 1, 208, 180, 119, 1, 249, 224, 119, 1, - 48, 213, 35, 119, 1, 213, 35, 119, 1, 48, 201, 88, 119, 1, 201, 88, 119, - 1, 211, 55, 119, 1, 210, 60, 119, 1, 206, 167, 119, 1, 203, 53, 119, 195, - 240, 201, 160, 119, 32, 196, 18, 54, 199, 109, 119, 32, 196, 18, 199, - 110, 195, 239, 119, 32, 196, 18, 54, 195, 239, 119, 211, 163, 233, 160, - 119, 211, 163, 233, 158, 9, 35, 56, 9, 2, 208, 173, 9, 234, 172, 219, - 185, 9, 2, 208, 214, 9, 2, 208, 176, 9, 35, 113, 57, 250, 113, 240, 158, - 209, 154, 250, 113, 234, 138, 209, 154, 9, 210, 140, 250, 113, 212, 245, - 218, 194, 56, 250, 113, 212, 245, 202, 249, 202, 131, 56, 251, 67, 56, 9, - 244, 23, 9, 239, 182, 207, 46, 9, 212, 58, 199, 90, 56, 9, 2, 218, 173, - 9, 2, 208, 190, 251, 13, 197, 125, 9, 2, 251, 13, 250, 34, 9, 2, 210, - 174, 251, 12, 9, 2, 210, 182, 250, 246, 250, 185, 9, 2, 203, 94, 9, 4, - 128, 203, 107, 9, 4, 128, 32, 149, 3, 222, 151, 3, 196, 60, 9, 4, 128, - 195, 105, 9, 4, 235, 80, 9, 4, 239, 218, 9, 4, 224, 130, 9, 207, 61, 9, - 1, 78, 9, 201, 145, 76, 211, 163, 78, 9, 211, 28, 78, 9, 1, 224, 134, - 196, 60, 9, 1, 232, 98, 9, 1, 149, 3, 220, 14, 57, 9, 1, 149, 3, 232, 99, - 57, 9, 1, 197, 110, 3, 232, 99, 57, 9, 1, 149, 3, 232, 99, 58, 9, 1, 92, - 3, 232, 99, 57, 9, 1, 251, 10, 9, 1, 248, 93, 9, 1, 203, 10, 219, 196, 9, - 1, 203, 9, 9, 1, 202, 182, 9, 1, 225, 80, 9, 1, 232, 119, 9, 1, 224, 34, - 9, 1, 239, 230, 9, 1, 202, 194, 9, 1, 210, 92, 9, 1, 195, 105, 9, 1, 208, - 81, 9, 1, 206, 207, 9, 1, 208, 219, 9, 1, 239, 253, 9, 1, 203, 107, 9, 1, - 195, 108, 9, 1, 251, 40, 9, 1, 233, 107, 9, 1, 224, 84, 3, 114, 238, 121, - 57, 9, 1, 224, 84, 3, 122, 238, 121, 58, 9, 1, 235, 84, 92, 3, 225, 163, - 199, 215, 9, 1, 235, 84, 92, 3, 114, 238, 121, 57, 9, 1, 235, 84, 92, 3, - 122, 238, 121, 57, 9, 203, 59, 9, 1, 235, 56, 9, 1, 211, 101, 9, 1, 224, - 183, 9, 1, 222, 150, 9, 1, 219, 94, 9, 1, 215, 206, 9, 1, 231, 255, 9, 1, - 197, 109, 9, 1, 149, 219, 229, 9, 1, 196, 60, 9, 235, 78, 9, 239, 216, 9, - 224, 128, 9, 235, 80, 9, 239, 218, 9, 224, 130, 9, 206, 252, 9, 204, 86, - 9, 220, 12, 57, 9, 232, 99, 57, 9, 232, 99, 58, 9, 204, 110, 251, 10, 9, - 225, 163, 239, 218, 9, 113, 215, 207, 233, 78, 9, 194, 241, 9, 18, 2, 4, - 199, 216, 57, 9, 18, 2, 225, 163, 4, 199, 216, 57, 9, 18, 2, 76, 58, 9, - 210, 40, 239, 218, 9, 235, 81, 3, 114, 238, 120, 9, 197, 111, 232, 99, - 58, 250, 113, 17, 195, 79, 250, 113, 17, 98, 250, 113, 17, 103, 250, 113, - 17, 135, 250, 113, 17, 136, 250, 113, 17, 150, 250, 113, 17, 174, 250, - 113, 17, 182, 250, 113, 17, 178, 250, 113, 17, 184, 9, 212, 244, 56, 9, - 239, 112, 207, 46, 9, 202, 129, 207, 46, 9, 234, 237, 212, 54, 204, 227, - 9, 1, 238, 122, 248, 93, 9, 1, 238, 122, 211, 101, 9, 1, 204, 62, 251, - 10, 9, 1, 149, 197, 126, 9, 1, 149, 3, 197, 111, 232, 99, 57, 9, 1, 149, - 3, 197, 111, 232, 99, 58, 9, 1, 128, 232, 98, 9, 1, 128, 232, 99, 251, - 10, 9, 1, 128, 232, 99, 197, 109, 9, 1, 115, 3, 232, 99, 57, 9, 1, 128, - 232, 99, 196, 60, 9, 1, 201, 50, 9, 1, 201, 48, 9, 1, 248, 103, 9, 1, - 203, 10, 3, 209, 210, 9, 1, 203, 10, 3, 122, 238, 121, 89, 237, 102, 9, - 1, 213, 15, 9, 1, 203, 7, 9, 1, 248, 91, 9, 1, 162, 3, 232, 99, 57, 9, 1, - 162, 3, 114, 238, 121, 83, 57, 9, 1, 215, 21, 9, 1, 237, 35, 9, 1, 162, - 3, 122, 238, 121, 57, 9, 1, 203, 40, 9, 1, 203, 38, 9, 1, 239, 159, 9, 1, - 239, 231, 3, 209, 210, 9, 1, 239, 231, 3, 76, 58, 9, 1, 239, 231, 3, 76, - 248, 81, 26, 4, 203, 107, 9, 1, 239, 237, 9, 1, 239, 161, 9, 1, 237, 64, - 9, 1, 239, 231, 3, 122, 238, 121, 89, 237, 102, 9, 1, 239, 231, 3, 234, - 145, 238, 121, 57, 9, 1, 209, 127, 9, 1, 210, 93, 3, 4, 199, 215, 9, 1, - 210, 93, 3, 209, 210, 9, 1, 210, 93, 3, 76, 58, 9, 1, 210, 93, 3, 4, 199, - 216, 58, 9, 1, 210, 93, 3, 76, 248, 81, 26, 76, 57, 9, 1, 210, 93, 3, - 114, 238, 121, 57, 9, 1, 225, 77, 9, 1, 210, 93, 3, 234, 145, 238, 121, - 57, 9, 1, 208, 82, 3, 76, 248, 81, 26, 76, 57, 9, 1, 208, 82, 3, 122, - 238, 121, 58, 9, 1, 208, 82, 3, 122, 238, 121, 248, 81, 26, 122, 238, - 121, 57, 9, 1, 208, 220, 3, 114, 238, 121, 58, 9, 1, 208, 220, 3, 122, - 238, 121, 57, 9, 1, 203, 108, 3, 122, 238, 121, 57, 9, 1, 251, 41, 3, - 122, 238, 121, 57, 9, 1, 238, 122, 235, 56, 9, 1, 235, 57, 3, 76, 218, - 72, 58, 9, 1, 235, 57, 3, 76, 58, 9, 1, 199, 98, 9, 1, 235, 57, 3, 122, - 238, 121, 58, 9, 1, 213, 13, 9, 1, 211, 102, 3, 76, 57, 9, 1, 211, 102, - 3, 122, 238, 121, 57, 9, 1, 224, 83, 9, 1, 204, 30, 224, 183, 9, 1, 224, - 184, 3, 209, 210, 9, 1, 224, 184, 3, 76, 57, 9, 1, 216, 246, 9, 1, 224, - 184, 3, 122, 238, 121, 58, 9, 1, 233, 247, 9, 1, 233, 248, 3, 209, 210, - 9, 1, 216, 167, 9, 1, 233, 248, 3, 114, 238, 121, 58, 9, 1, 232, 201, 9, - 1, 233, 248, 3, 122, 238, 121, 57, 9, 1, 222, 151, 3, 4, 199, 215, 9, 1, - 222, 151, 3, 76, 57, 9, 1, 222, 151, 3, 122, 238, 121, 57, 9, 1, 222, - 151, 3, 122, 238, 121, 58, 9, 1, 215, 207, 3, 76, 58, 9, 1, 215, 207, - 233, 78, 9, 1, 209, 188, 9, 1, 215, 207, 3, 209, 210, 9, 1, 215, 207, 3, - 122, 238, 121, 57, 9, 1, 232, 0, 238, 150, 9, 1, 203, 41, 3, 76, 57, 9, - 1, 232, 0, 3, 92, 57, 9, 1, 232, 0, 233, 23, 9, 1, 232, 0, 233, 24, 3, - 232, 99, 57, 9, 1, 203, 10, 219, 197, 233, 23, 9, 1, 197, 110, 3, 209, - 210, 9, 1, 223, 216, 214, 91, 9, 1, 214, 91, 9, 1, 66, 9, 1, 195, 215, 9, - 1, 223, 216, 195, 215, 9, 1, 197, 110, 3, 114, 238, 121, 57, 9, 1, 199, - 105, 9, 1, 235, 84, 196, 60, 9, 1, 92, 3, 203, 103, 9, 1, 92, 3, 4, 199, - 215, 9, 1, 197, 110, 3, 76, 57, 9, 1, 70, 9, 1, 92, 3, 122, 238, 121, 58, - 9, 1, 92, 248, 182, 9, 1, 92, 248, 183, 3, 232, 99, 57, 9, 234, 98, 204, - 193, 9, 1, 251, 90, 9, 4, 128, 32, 208, 220, 3, 222, 151, 3, 149, 219, - 229, 9, 4, 128, 32, 211, 102, 3, 222, 151, 3, 149, 219, 229, 9, 4, 128, - 86, 84, 20, 9, 4, 128, 222, 151, 251, 10, 9, 4, 128, 225, 80, 9, 4, 128, - 122, 238, 120, 9, 4, 128, 208, 81, 9, 236, 98, 77, 249, 228, 9, 204, 223, - 77, 209, 87, 236, 139, 231, 172, 9, 4, 128, 209, 139, 195, 79, 9, 4, 128, - 200, 15, 210, 112, 195, 79, 9, 4, 128, 238, 122, 232, 23, 77, 224, 34, 9, - 4, 128, 86, 69, 20, 9, 4, 125, 208, 81, 9, 4, 128, 220, 13, 9, 4, 197, - 109, 9, 4, 196, 60, 9, 4, 128, 196, 60, 9, 4, 128, 215, 206, 9, 212, 93, - 77, 208, 204, 9, 236, 108, 246, 156, 125, 204, 193, 9, 236, 108, 246, - 156, 128, 204, 193, 9, 209, 139, 128, 204, 194, 3, 235, 15, 246, 155, 9, - 4, 125, 219, 94, 9, 1, 239, 231, 3, 225, 163, 199, 215, 9, 1, 210, 93, 3, - 225, 163, 199, 215, 235, 214, 250, 113, 17, 195, 79, 235, 214, 250, 113, - 17, 98, 235, 214, 250, 113, 17, 103, 235, 214, 250, 113, 17, 135, 235, - 214, 250, 113, 17, 136, 235, 214, 250, 113, 17, 150, 235, 214, 250, 113, - 17, 174, 235, 214, 250, 113, 17, 182, 235, 214, 250, 113, 17, 178, 235, - 214, 250, 113, 17, 184, 9, 1, 206, 208, 3, 76, 58, 9, 1, 239, 254, 3, 76, - 58, 9, 1, 233, 108, 3, 76, 58, 9, 2, 206, 22, 250, 213, 9, 2, 206, 22, - 212, 17, 219, 73, 9, 1, 232, 0, 3, 225, 163, 199, 215, 203, 205, 236, 98, - 77, 213, 93, 203, 205, 204, 57, 234, 98, 204, 193, 203, 205, 204, 112, - 234, 98, 204, 193, 203, 205, 204, 57, 244, 32, 203, 205, 204, 112, 244, - 32, 203, 205, 231, 43, 244, 32, 203, 205, 244, 33, 205, 220, 222, 86, - 203, 205, 244, 33, 205, 220, 209, 230, 203, 205, 204, 57, 244, 33, 205, - 220, 222, 86, 203, 205, 204, 112, 244, 33, 205, 220, 209, 230, 203, 205, - 240, 243, 203, 205, 232, 56, 214, 111, 203, 205, 232, 56, 219, 49, 203, - 205, 232, 56, 250, 31, 203, 205, 251, 130, 78, 203, 205, 1, 251, 15, 203, - 205, 1, 204, 62, 251, 15, 203, 205, 1, 248, 60, 203, 205, 1, 233, 237, - 203, 205, 1, 233, 238, 233, 215, 203, 205, 1, 239, 227, 203, 205, 1, 238, - 122, 239, 228, 209, 204, 203, 205, 1, 232, 32, 203, 205, 1, 197, 109, - 203, 205, 1, 195, 105, 203, 205, 1, 231, 230, 203, 205, 1, 202, 222, 203, - 205, 1, 202, 223, 233, 215, 203, 205, 1, 195, 198, 203, 205, 1, 195, 199, - 232, 32, 203, 205, 1, 224, 153, 203, 205, 1, 222, 149, 203, 205, 1, 218, - 190, 203, 205, 1, 215, 63, 203, 205, 1, 207, 54, 203, 205, 1, 48, 207, - 54, 203, 205, 1, 70, 203, 205, 1, 213, 35, 203, 205, 1, 210, 40, 213, 35, - 203, 205, 1, 208, 216, 203, 205, 1, 211, 95, 203, 205, 1, 209, 204, 203, - 205, 1, 206, 167, 203, 205, 1, 203, 50, 203, 205, 1, 212, 229, 248, 47, - 203, 205, 1, 212, 229, 233, 105, 203, 205, 1, 212, 229, 239, 39, 203, - 205, 211, 176, 57, 203, 205, 211, 176, 58, 203, 205, 211, 176, 237, 119, - 203, 205, 195, 4, 57, 203, 205, 195, 4, 58, 203, 205, 195, 4, 237, 119, - 203, 205, 210, 136, 57, 203, 205, 210, 136, 58, 203, 205, 237, 120, 195, - 12, 231, 42, 203, 205, 237, 120, 195, 12, 250, 186, 203, 205, 232, 37, - 57, 203, 205, 232, 37, 58, 203, 205, 232, 36, 237, 119, 203, 205, 236, - 24, 57, 203, 205, 236, 24, 58, 203, 205, 209, 51, 203, 205, 235, 50, 238, - 123, 203, 205, 211, 5, 203, 205, 209, 81, 203, 205, 114, 83, 238, 121, - 57, 203, 205, 114, 83, 238, 121, 58, 203, 205, 122, 238, 121, 57, 203, - 205, 122, 238, 121, 58, 203, 205, 214, 109, 221, 234, 57, 203, 205, 214, - 109, 221, 234, 58, 203, 205, 218, 0, 203, 205, 248, 181, 203, 205, 1, - 205, 144, 195, 72, 203, 205, 1, 205, 144, 224, 27, 203, 205, 1, 205, 144, - 235, 69, 9, 1, 248, 94, 3, 122, 238, 121, 230, 248, 58, 9, 1, 248, 94, 3, - 76, 248, 81, 26, 122, 238, 121, 57, 9, 1, 248, 94, 3, 122, 238, 121, 212, - 52, 200, 8, 58, 9, 1, 248, 94, 3, 122, 238, 121, 212, 52, 200, 8, 248, - 81, 26, 114, 238, 121, 57, 9, 1, 248, 94, 3, 114, 238, 121, 248, 81, 26, - 76, 57, 9, 1, 248, 94, 3, 225, 163, 4, 199, 216, 58, 9, 1, 248, 94, 3, 4, - 199, 215, 9, 1, 162, 3, 114, 238, 121, 57, 9, 1, 162, 3, 122, 238, 121, - 212, 52, 200, 8, 58, 9, 1, 239, 231, 3, 114, 238, 121, 199, 38, 248, 81, - 26, 4, 203, 107, 9, 1, 239, 231, 3, 225, 163, 4, 199, 216, 58, 9, 1, 210, - 93, 3, 101, 9, 1, 208, 82, 3, 234, 145, 238, 121, 57, 9, 1, 251, 41, 3, - 114, 238, 121, 57, 9, 1, 251, 41, 3, 122, 238, 121, 212, 52, 237, 103, - 57, 9, 1, 251, 41, 3, 114, 238, 121, 199, 38, 57, 9, 1, 235, 57, 3, 114, - 238, 121, 58, 9, 1, 235, 57, 3, 122, 238, 121, 212, 52, 200, 8, 58, 9, 1, - 224, 84, 3, 76, 57, 9, 1, 224, 84, 3, 122, 238, 121, 57, 9, 1, 224, 84, - 3, 122, 238, 121, 212, 52, 200, 8, 58, 9, 1, 86, 3, 76, 57, 9, 1, 86, 3, - 76, 58, 9, 1, 215, 207, 3, 114, 238, 121, 58, 9, 1, 215, 207, 3, 4, 203, - 107, 9, 1, 215, 207, 3, 4, 199, 215, 9, 1, 222, 151, 3, 153, 9, 1, 210, - 93, 3, 114, 238, 121, 199, 38, 57, 9, 1, 210, 93, 3, 232, 99, 57, 9, 1, - 208, 82, 3, 114, 238, 121, 199, 38, 57, 9, 1, 162, 3, 4, 9, 1, 203, 108, - 58, 9, 1, 162, 3, 4, 9, 1, 203, 108, 26, 114, 238, 120, 9, 1, 208, 82, 3, - 4, 9, 1, 203, 108, 26, 114, 238, 120, 9, 1, 210, 93, 3, 4, 9, 1, 203, - 108, 26, 114, 238, 120, 9, 1, 162, 3, 4, 9, 1, 203, 108, 57, 9, 1, 149, - 3, 235, 214, 250, 113, 17, 114, 57, 9, 1, 149, 3, 235, 214, 250, 113, 17, - 122, 57, 9, 1, 235, 84, 92, 3, 235, 214, 250, 113, 17, 114, 57, 9, 1, - 235, 84, 92, 3, 235, 214, 250, 113, 17, 122, 57, 9, 1, 235, 84, 92, 3, - 235, 214, 250, 113, 17, 234, 145, 58, 9, 1, 197, 110, 3, 235, 214, 250, - 113, 17, 114, 57, 9, 1, 197, 110, 3, 235, 214, 250, 113, 17, 122, 57, 9, - 1, 92, 248, 183, 3, 235, 214, 250, 113, 17, 114, 57, 9, 1, 92, 248, 183, - 3, 235, 214, 250, 113, 17, 122, 57, 9, 1, 162, 3, 235, 214, 250, 113, 17, - 234, 145, 58, 9, 1, 208, 82, 3, 235, 214, 250, 113, 17, 234, 145, 57, 9, - 1, 208, 82, 3, 225, 163, 199, 215, 9, 1, 224, 184, 3, 114, 238, 121, 57, - 202, 199, 1, 232, 129, 202, 199, 1, 206, 217, 202, 199, 1, 215, 205, 202, - 199, 1, 210, 193, 202, 199, 1, 248, 250, 202, 199, 1, 222, 21, 202, 199, - 1, 224, 198, 202, 199, 1, 250, 253, 202, 199, 1, 199, 135, 202, 199, 1, - 219, 93, 202, 199, 1, 235, 116, 202, 199, 1, 239, 42, 202, 199, 1, 202, - 201, 202, 199, 1, 222, 236, 202, 199, 1, 234, 0, 202, 199, 1, 233, 29, - 202, 199, 1, 208, 80, 202, 199, 1, 239, 180, 202, 199, 1, 195, 94, 202, - 199, 1, 203, 52, 202, 199, 1, 196, 124, 202, 199, 1, 213, 48, 202, 199, - 1, 225, 89, 202, 199, 1, 244, 226, 202, 199, 1, 201, 57, 202, 199, 1, - 231, 222, 202, 199, 1, 224, 37, 202, 199, 1, 202, 200, 202, 199, 1, 195, - 112, 202, 199, 1, 206, 206, 202, 199, 1, 208, 223, 202, 199, 1, 240, 1, - 202, 199, 1, 147, 202, 199, 1, 195, 11, 202, 199, 1, 251, 37, 202, 199, - 1, 233, 106, 202, 199, 1, 211, 105, 202, 199, 1, 197, 149, 202, 199, 251, - 132, 202, 199, 251, 231, 202, 199, 230, 92, 202, 199, 236, 183, 202, 199, - 200, 89, 202, 199, 214, 32, 202, 199, 236, 193, 202, 199, 235, 204, 202, - 199, 214, 108, 202, 199, 214, 116, 202, 199, 204, 86, 202, 199, 1, 217, - 158, 216, 33, 17, 195, 79, 216, 33, 17, 98, 216, 33, 17, 103, 216, 33, - 17, 135, 216, 33, 17, 136, 216, 33, 17, 150, 216, 33, 17, 174, 216, 33, - 17, 182, 216, 33, 17, 178, 216, 33, 17, 184, 216, 33, 1, 63, 216, 33, 1, - 236, 184, 216, 33, 1, 68, 216, 33, 1, 70, 216, 33, 1, 66, 216, 33, 1, - 214, 33, 216, 33, 1, 74, 216, 33, 1, 239, 245, 216, 33, 1, 217, 225, 216, - 33, 1, 248, 252, 216, 33, 1, 163, 216, 33, 1, 203, 137, 216, 33, 1, 225, - 105, 216, 33, 1, 246, 136, 216, 33, 1, 240, 3, 216, 33, 1, 173, 216, 33, - 1, 209, 135, 216, 33, 1, 187, 216, 33, 1, 233, 203, 216, 33, 1, 235, 118, - 216, 33, 1, 157, 216, 33, 1, 175, 216, 33, 1, 217, 171, 197, 17, 216, 33, - 1, 168, 216, 33, 1, 215, 34, 216, 33, 1, 179, 216, 33, 1, 142, 216, 33, - 1, 197, 156, 216, 33, 1, 165, 216, 33, 1, 215, 35, 197, 17, 216, 33, 1, - 225, 12, 225, 105, 216, 33, 1, 225, 12, 246, 136, 216, 33, 1, 225, 12, - 173, 216, 33, 37, 206, 139, 128, 201, 239, 216, 33, 37, 206, 139, 125, - 201, 239, 216, 33, 37, 206, 139, 209, 203, 201, 239, 216, 33, 37, 172, - 239, 62, 201, 239, 216, 33, 37, 172, 128, 201, 239, 216, 33, 37, 172, - 125, 201, 239, 216, 33, 37, 172, 209, 203, 201, 239, 216, 33, 37, 217, - 123, 78, 216, 33, 37, 54, 76, 57, 216, 33, 128, 154, 250, 134, 216, 33, - 125, 154, 250, 134, 216, 33, 16, 214, 34, 239, 76, 216, 33, 16, 233, 202, - 216, 33, 244, 23, 216, 33, 235, 225, 78, 216, 33, 222, 209, 216, 33, 239, - 206, 216, 33, 238, 125, 56, 216, 33, 203, 84, 56, 208, 183, 1, 251, 17, - 208, 183, 1, 248, 3, 208, 183, 1, 233, 236, 208, 183, 1, 239, 229, 208, - 183, 1, 225, 116, 208, 183, 1, 248, 250, 208, 183, 1, 195, 82, 208, 183, - 1, 225, 125, 208, 183, 1, 202, 29, 208, 183, 1, 195, 180, 208, 183, 1, - 224, 199, 208, 183, 1, 222, 232, 208, 183, 1, 218, 190, 208, 183, 1, 215, - 63, 208, 183, 1, 206, 20, 208, 183, 1, 225, 230, 208, 183, 1, 235, 33, - 208, 183, 1, 201, 91, 208, 183, 1, 211, 25, 208, 183, 1, 209, 204, 208, - 183, 1, 206, 236, 208, 183, 1, 203, 129, 208, 183, 113, 225, 230, 208, - 183, 113, 225, 229, 208, 183, 113, 214, 103, 208, 183, 113, 239, 243, - 208, 183, 71, 1, 236, 56, 195, 180, 208, 183, 113, 236, 56, 195, 180, - 208, 183, 18, 2, 172, 70, 208, 183, 18, 2, 70, 208, 183, 18, 2, 213, 209, - 252, 10, 208, 183, 18, 2, 172, 252, 10, 208, 183, 18, 2, 252, 10, 208, - 183, 18, 2, 213, 209, 63, 208, 183, 18, 2, 172, 63, 208, 183, 18, 2, 63, - 208, 183, 71, 1, 206, 139, 63, 208, 183, 18, 2, 206, 139, 63, 208, 183, - 18, 2, 172, 66, 208, 183, 18, 2, 66, 208, 183, 71, 1, 68, 208, 183, 18, - 2, 172, 68, 208, 183, 18, 2, 68, 208, 183, 18, 2, 74, 208, 183, 18, 2, - 204, 86, 208, 183, 113, 217, 10, 208, 183, 211, 163, 217, 10, 208, 183, - 211, 163, 251, 64, 208, 183, 211, 163, 250, 198, 208, 183, 211, 163, 248, - 159, 208, 183, 211, 163, 250, 10, 208, 183, 211, 163, 206, 155, 208, 183, - 251, 130, 78, 208, 183, 211, 163, 219, 83, 211, 61, 208, 183, 211, 163, - 195, 19, 208, 183, 211, 163, 211, 61, 208, 183, 211, 163, 195, 111, 208, - 183, 211, 163, 200, 236, 208, 183, 211, 163, 250, 84, 208, 183, 211, 163, - 205, 149, 219, 172, 208, 183, 211, 163, 250, 181, 219, 218, 1, 232, 105, - 219, 218, 1, 251, 217, 219, 218, 1, 251, 62, 219, 218, 1, 251, 106, 219, - 218, 1, 251, 54, 219, 218, 1, 199, 235, 219, 218, 1, 249, 221, 219, 218, - 1, 225, 125, 219, 218, 1, 250, 7, 219, 218, 1, 251, 22, 219, 218, 1, 251, - 27, 219, 218, 1, 251, 19, 219, 218, 1, 250, 225, 219, 218, 1, 250, 208, - 219, 218, 1, 250, 52, 219, 218, 1, 225, 230, 219, 218, 1, 250, 150, 219, - 218, 1, 250, 20, 219, 218, 1, 250, 122, 219, 218, 1, 250, 118, 219, 218, - 1, 250, 45, 219, 218, 1, 250, 18, 219, 218, 1, 237, 48, 219, 218, 1, 224, - 191, 219, 218, 1, 251, 40, 219, 218, 251, 68, 78, 219, 218, 198, 235, 78, - 219, 218, 233, 174, 78, 219, 218, 211, 162, 203, 205, 1, 129, 216, 244, - 203, 205, 1, 129, 225, 105, 203, 205, 1, 129, 215, 34, 203, 205, 1, 129, - 201, 58, 203, 205, 1, 129, 216, 5, 203, 205, 1, 129, 215, 243, 203, 205, - 1, 129, 248, 53, 203, 205, 1, 129, 173, 203, 205, 1, 129, 221, 195, 203, - 205, 1, 129, 221, 185, 203, 205, 1, 129, 205, 43, 9, 1, 248, 94, 3, 4, - 199, 216, 58, 9, 1, 248, 94, 3, 232, 99, 57, 9, 1, 225, 81, 3, 114, 238, - 121, 57, 9, 1, 203, 108, 3, 114, 238, 121, 57, 9, 1, 235, 57, 3, 76, 248, - 81, 26, 122, 238, 121, 57, 9, 1, 211, 102, 3, 76, 58, 9, 1, 222, 151, 3, - 54, 153, 9, 1, 86, 3, 122, 238, 121, 57, 9, 1, 92, 3, 114, 238, 121, 248, - 81, 26, 232, 99, 57, 9, 1, 92, 3, 114, 238, 121, 248, 81, 26, 76, 57, 9, - 1, 210, 93, 3, 221, 129, 9, 1, 197, 110, 3, 76, 197, 32, 9, 1, 209, 167, - 196, 60, 9, 1, 125, 251, 10, 9, 1, 239, 231, 3, 122, 238, 121, 58, 9, 1, - 208, 220, 3, 122, 238, 121, 58, 9, 1, 233, 248, 3, 225, 163, 101, 9, 1, - 204, 185, 197, 109, 9, 1, 195, 106, 3, 225, 163, 199, 216, 57, 9, 1, 251, - 41, 3, 122, 238, 121, 58, 9, 1, 224, 184, 3, 76, 58, 9, 1, 248, 94, 3, 4, - 86, 57, 9, 1, 213, 16, 3, 4, 86, 57, 9, 1, 203, 10, 3, 4, 203, 10, 57, 9, - 1, 210, 93, 3, 4, 215, 207, 57, 9, 1, 92, 3, 114, 238, 121, 248, 81, 26, - 4, 215, 207, 57, 9, 1, 251, 65, 235, 56, 9, 1, 251, 65, 211, 101, 9, 1, - 251, 65, 215, 206, 9, 4, 125, 197, 109, 9, 4, 128, 197, 3, 250, 115, 9, - 4, 128, 208, 219, 9, 4, 128, 251, 40, 9, 4, 128, 211, 101, 9, 4, 128, - 215, 207, 3, 224, 130, 9, 4, 125, 215, 207, 3, 224, 130, 9, 4, 128, 197, - 3, 250, 17, 9, 4, 128, 197, 3, 250, 51, 9, 4, 128, 197, 3, 250, 207, 9, - 4, 128, 197, 3, 208, 198, 9, 4, 128, 197, 3, 211, 65, 9, 4, 128, 197, 3, - 197, 132, 9, 4, 128, 234, 172, 219, 185, 9, 4, 128, 2, 208, 214, 9, 238, - 195, 236, 98, 77, 249, 228, 9, 200, 240, 239, 219, 58, 9, 240, 141, 235, - 80, 9, 240, 141, 239, 218, 9, 240, 141, 224, 130, 9, 240, 141, 235, 78, - 9, 240, 141, 239, 216, 9, 240, 141, 224, 128, 9, 154, 106, 76, 57, 9, - 154, 114, 238, 121, 57, 9, 154, 221, 130, 57, 9, 154, 106, 76, 58, 9, - 154, 114, 238, 121, 58, 9, 154, 221, 130, 58, 9, 185, 235, 78, 9, 185, - 239, 216, 9, 185, 224, 128, 9, 4, 128, 197, 109, 9, 235, 81, 3, 209, 210, - 9, 235, 81, 3, 76, 57, 9, 224, 131, 3, 76, 58, 9, 50, 250, 68, 57, 9, 52, - 250, 68, 57, 9, 50, 250, 68, 58, 9, 52, 250, 68, 58, 9, 54, 52, 250, 68, - 57, 9, 54, 52, 250, 68, 89, 3, 238, 123, 9, 52, 250, 68, 89, 3, 238, 123, - 9, 239, 219, 3, 238, 123, 9, 113, 206, 53, 215, 207, 233, 78, 97, 2, 225, - 163, 246, 251, 97, 2, 246, 251, 97, 2, 250, 155, 97, 2, 198, 247, 97, 1, - 206, 139, 63, 97, 1, 63, 97, 1, 252, 10, 97, 1, 68, 97, 1, 226, 8, 97, 1, - 66, 97, 1, 199, 229, 97, 1, 111, 143, 97, 1, 111, 158, 97, 1, 246, 254, - 70, 97, 1, 206, 139, 70, 97, 1, 70, 97, 1, 251, 45, 97, 1, 246, 254, 74, - 97, 1, 206, 139, 74, 97, 1, 74, 97, 1, 250, 0, 97, 1, 157, 97, 1, 224, - 38, 97, 1, 234, 4, 97, 1, 233, 112, 97, 1, 216, 244, 97, 1, 247, 36, 97, - 1, 246, 136, 97, 1, 225, 105, 97, 1, 225, 71, 97, 1, 215, 34, 97, 1, 201, - 58, 97, 1, 201, 46, 97, 1, 239, 164, 97, 1, 239, 148, 97, 1, 216, 5, 97, - 1, 203, 137, 97, 1, 202, 202, 97, 1, 240, 3, 97, 1, 239, 44, 97, 1, 179, - 97, 1, 215, 243, 97, 1, 163, 97, 1, 212, 205, 97, 1, 248, 252, 97, 1, - 248, 53, 97, 1, 168, 97, 1, 165, 97, 1, 173, 97, 1, 209, 135, 97, 1, 175, - 97, 1, 221, 195, 97, 1, 221, 185, 97, 1, 199, 137, 97, 1, 207, 6, 97, 1, - 205, 43, 97, 1, 187, 97, 1, 142, 97, 18, 2, 214, 91, 97, 18, 2, 214, 31, - 97, 2, 215, 74, 97, 2, 249, 239, 97, 18, 2, 252, 10, 97, 18, 2, 68, 97, - 18, 2, 226, 8, 97, 18, 2, 66, 97, 18, 2, 199, 229, 97, 18, 2, 111, 143, - 97, 18, 2, 111, 209, 136, 97, 18, 2, 246, 254, 70, 97, 18, 2, 206, 139, - 70, 97, 18, 2, 70, 97, 18, 2, 251, 45, 97, 18, 2, 246, 254, 74, 97, 18, - 2, 206, 139, 74, 97, 18, 2, 74, 97, 18, 2, 250, 0, 97, 2, 198, 252, 97, - 18, 2, 211, 214, 70, 97, 18, 2, 249, 234, 97, 214, 56, 97, 204, 173, 2, - 200, 83, 97, 204, 173, 2, 250, 157, 97, 232, 239, 251, 122, 97, 251, 110, - 251, 122, 97, 18, 2, 246, 254, 172, 70, 97, 18, 2, 200, 81, 97, 18, 2, - 199, 228, 97, 1, 211, 108, 97, 1, 224, 19, 97, 1, 233, 87, 97, 1, 195, - 114, 97, 1, 239, 153, 97, 1, 210, 28, 97, 1, 235, 118, 97, 1, 195, 166, - 97, 1, 111, 209, 136, 97, 1, 111, 221, 196, 97, 18, 2, 111, 158, 97, 18, - 2, 111, 221, 196, 97, 239, 211, 97, 54, 239, 211, 97, 17, 195, 79, 97, - 17, 98, 97, 17, 103, 97, 17, 135, 97, 17, 136, 97, 17, 150, 97, 17, 174, - 97, 17, 182, 97, 17, 178, 97, 17, 184, 97, 251, 130, 56, 97, 2, 128, 205, - 109, 238, 123, 97, 1, 246, 254, 63, 97, 1, 214, 91, 97, 1, 214, 31, 97, - 1, 249, 234, 97, 1, 200, 81, 97, 1, 199, 228, 97, 1, 219, 178, 239, 164, - 97, 1, 195, 74, 97, 1, 85, 165, 97, 1, 233, 148, 97, 1, 225, 49, 97, 1, - 233, 34, 204, 193, 97, 1, 239, 154, 97, 1, 248, 155, 188, 250, 184, 188, - 2, 246, 251, 188, 2, 250, 155, 188, 2, 198, 247, 188, 1, 63, 188, 1, 252, - 10, 188, 1, 68, 188, 1, 226, 8, 188, 1, 66, 188, 1, 199, 229, 188, 1, - 111, 143, 188, 1, 111, 158, 188, 1, 70, 188, 1, 251, 45, 188, 1, 74, 188, - 1, 250, 0, 188, 1, 157, 188, 1, 224, 38, 188, 1, 234, 4, 188, 1, 233, - 112, 188, 1, 216, 244, 188, 1, 247, 36, 188, 1, 246, 136, 188, 1, 225, - 105, 188, 1, 225, 71, 188, 1, 215, 34, 188, 1, 201, 58, 188, 1, 201, 46, - 188, 1, 239, 164, 188, 1, 239, 148, 188, 1, 216, 5, 188, 1, 203, 137, - 188, 1, 202, 202, 188, 1, 240, 3, 188, 1, 239, 44, 188, 1, 179, 188, 1, - 163, 188, 1, 212, 205, 188, 1, 248, 252, 188, 1, 248, 53, 188, 1, 168, - 188, 1, 165, 188, 1, 173, 188, 1, 175, 188, 1, 207, 6, 188, 1, 205, 43, - 188, 1, 187, 188, 1, 142, 188, 2, 215, 74, 188, 2, 249, 239, 188, 18, 2, - 252, 10, 188, 18, 2, 68, 188, 18, 2, 226, 8, 188, 18, 2, 66, 188, 18, 2, - 199, 229, 188, 18, 2, 111, 143, 188, 18, 2, 111, 209, 136, 188, 18, 2, - 70, 188, 18, 2, 251, 45, 188, 18, 2, 74, 188, 18, 2, 250, 0, 188, 2, 198, - 252, 188, 1, 224, 29, 203, 137, 188, 250, 1, 222, 60, 78, 188, 1, 209, - 135, 188, 1, 210, 28, 188, 1, 195, 166, 188, 1, 111, 209, 136, 188, 1, - 111, 221, 196, 188, 18, 2, 111, 158, 188, 18, 2, 111, 221, 196, 188, 17, - 195, 79, 188, 17, 98, 188, 17, 103, 188, 17, 135, 188, 17, 136, 188, 17, - 150, 188, 17, 174, 188, 17, 182, 188, 17, 178, 188, 17, 184, 188, 1, 210, - 201, 3, 108, 239, 14, 188, 1, 210, 201, 3, 221, 107, 239, 14, 188, 209, - 63, 78, 188, 209, 63, 56, 188, 240, 140, 215, 66, 98, 188, 240, 140, 215, - 66, 103, 188, 240, 140, 215, 66, 135, 188, 240, 140, 215, 66, 136, 188, - 240, 140, 215, 66, 106, 222, 43, 202, 192, 202, 187, 239, 74, 188, 240, - 140, 239, 75, 205, 236, 188, 225, 126, 188, 233, 227, 78, 188, 1, 199, - 102, 250, 155, 188, 251, 130, 56, 188, 208, 170, 78, 232, 181, 2, 251, - 105, 248, 20, 232, 181, 2, 248, 20, 232, 181, 2, 198, 247, 232, 181, 1, - 63, 232, 181, 1, 252, 10, 232, 181, 1, 68, 232, 181, 1, 226, 8, 232, 181, - 1, 66, 232, 181, 1, 199, 229, 232, 181, 1, 236, 184, 232, 181, 1, 251, - 45, 232, 181, 1, 214, 33, 232, 181, 1, 250, 0, 232, 181, 1, 157, 232, - 181, 1, 224, 38, 232, 181, 1, 234, 4, 232, 181, 1, 233, 112, 232, 181, 1, - 216, 244, 232, 181, 1, 247, 36, 232, 181, 1, 246, 136, 232, 181, 1, 225, - 105, 232, 181, 1, 225, 71, 232, 181, 1, 215, 34, 232, 181, 1, 201, 58, - 232, 181, 1, 201, 46, 232, 181, 1, 239, 164, 232, 181, 1, 239, 148, 232, - 181, 1, 216, 5, 232, 181, 1, 203, 137, 232, 181, 1, 202, 202, 232, 181, - 1, 240, 3, 232, 181, 1, 239, 44, 232, 181, 1, 179, 232, 181, 1, 163, 232, - 181, 1, 212, 205, 232, 181, 1, 248, 252, 232, 181, 1, 248, 53, 232, 181, - 1, 168, 232, 181, 1, 165, 232, 181, 1, 173, 232, 181, 1, 175, 232, 181, - 1, 221, 195, 232, 181, 1, 199, 137, 232, 181, 1, 207, 6, 232, 181, 1, - 187, 232, 181, 1, 142, 232, 181, 2, 215, 74, 232, 181, 18, 2, 252, 10, - 232, 181, 18, 2, 68, 232, 181, 18, 2, 226, 8, 232, 181, 18, 2, 66, 232, - 181, 18, 2, 199, 229, 232, 181, 18, 2, 236, 184, 232, 181, 18, 2, 251, - 45, 232, 181, 18, 2, 214, 33, 232, 181, 18, 2, 250, 0, 232, 181, 2, 198, - 252, 232, 181, 2, 200, 85, 232, 181, 1, 224, 19, 232, 181, 1, 233, 87, - 232, 181, 1, 195, 114, 232, 181, 1, 209, 135, 232, 181, 1, 235, 118, 232, - 181, 17, 195, 79, 232, 181, 17, 98, 232, 181, 17, 103, 232, 181, 17, 135, - 232, 181, 17, 136, 232, 181, 17, 150, 232, 181, 17, 174, 232, 181, 17, - 182, 232, 181, 17, 178, 232, 181, 17, 184, 232, 181, 202, 37, 232, 181, - 251, 104, 232, 181, 225, 146, 232, 181, 200, 1, 232, 181, 236, 146, 214, - 38, 232, 181, 2, 196, 99, 232, 181, 251, 130, 56, 232, 197, 2, 246, 251, - 232, 197, 2, 250, 155, 232, 197, 2, 198, 247, 232, 197, 1, 63, 232, 197, - 1, 252, 10, 232, 197, 1, 68, 232, 197, 1, 226, 8, 232, 197, 1, 66, 232, - 197, 1, 199, 229, 232, 197, 1, 111, 143, 232, 197, 1, 111, 158, 232, 197, - 18, 246, 254, 70, 232, 197, 1, 70, 232, 197, 1, 251, 45, 232, 197, 18, - 246, 254, 74, 232, 197, 1, 74, 232, 197, 1, 250, 0, 232, 197, 1, 157, - 232, 197, 1, 224, 38, 232, 197, 1, 234, 4, 232, 197, 1, 233, 112, 232, - 197, 1, 216, 244, 232, 197, 1, 247, 36, 232, 197, 1, 246, 136, 232, 197, - 1, 225, 105, 232, 197, 1, 225, 71, 232, 197, 1, 215, 34, 232, 197, 1, - 201, 58, 232, 197, 1, 201, 46, 232, 197, 1, 239, 164, 232, 197, 1, 239, - 148, 232, 197, 1, 216, 5, 232, 197, 1, 203, 137, 232, 197, 1, 202, 202, - 232, 197, 1, 240, 3, 232, 197, 1, 239, 44, 232, 197, 1, 179, 232, 197, 1, - 163, 232, 197, 1, 212, 205, 232, 197, 1, 248, 252, 232, 197, 1, 248, 53, - 232, 197, 1, 168, 232, 197, 1, 165, 232, 197, 1, 173, 232, 197, 1, 175, - 232, 197, 1, 221, 195, 232, 197, 1, 199, 137, 232, 197, 1, 207, 6, 232, - 197, 1, 205, 43, 232, 197, 1, 187, 232, 197, 1, 142, 232, 197, 2, 215, - 74, 232, 197, 2, 249, 239, 232, 197, 18, 2, 252, 10, 232, 197, 18, 2, 68, - 232, 197, 18, 2, 226, 8, 232, 197, 18, 2, 66, 232, 197, 18, 2, 199, 229, - 232, 197, 18, 2, 111, 143, 232, 197, 18, 2, 111, 209, 136, 232, 197, 18, - 2, 246, 254, 70, 232, 197, 18, 2, 70, 232, 197, 18, 2, 251, 45, 232, 197, - 18, 2, 246, 254, 74, 232, 197, 18, 2, 74, 232, 197, 18, 2, 250, 0, 232, - 197, 2, 198, 252, 232, 197, 214, 56, 232, 197, 1, 111, 209, 136, 232, - 197, 1, 111, 221, 196, 232, 197, 18, 2, 111, 158, 232, 197, 18, 2, 111, - 221, 196, 232, 197, 17, 195, 79, 232, 197, 17, 98, 232, 197, 17, 103, - 232, 197, 17, 135, 232, 197, 17, 136, 232, 197, 17, 150, 232, 197, 17, - 174, 232, 197, 17, 182, 232, 197, 17, 178, 232, 197, 17, 184, 232, 197, - 251, 130, 56, 232, 197, 209, 63, 56, 232, 197, 1, 195, 74, 232, 197, 2, - 204, 86, 232, 197, 2, 206, 252, 232, 197, 2, 220, 11, 232, 197, 2, 202, - 124, 215, 75, 57, 232, 197, 2, 244, 114, 215, 75, 57, 232, 197, 2, 200, - 198, 215, 75, 57, 213, 250, 2, 246, 251, 213, 250, 2, 250, 155, 213, 250, - 2, 198, 247, 213, 250, 1, 63, 213, 250, 1, 252, 10, 213, 250, 1, 68, 213, - 250, 1, 226, 8, 213, 250, 1, 66, 213, 250, 1, 199, 229, 213, 250, 1, 111, - 143, 213, 250, 1, 111, 158, 213, 250, 1, 70, 213, 250, 1, 251, 45, 213, - 250, 1, 74, 213, 250, 1, 250, 0, 213, 250, 1, 157, 213, 250, 1, 224, 38, - 213, 250, 1, 234, 4, 213, 250, 1, 233, 112, 213, 250, 1, 216, 244, 213, - 250, 1, 247, 36, 213, 250, 1, 246, 136, 213, 250, 1, 225, 105, 213, 250, - 1, 225, 71, 213, 250, 1, 215, 34, 213, 250, 1, 201, 58, 213, 250, 1, 201, - 46, 213, 250, 1, 239, 164, 213, 250, 1, 239, 148, 213, 250, 1, 216, 5, - 213, 250, 1, 203, 137, 213, 250, 1, 202, 202, 213, 250, 1, 240, 3, 213, - 250, 1, 239, 44, 213, 250, 1, 179, 213, 250, 1, 163, 213, 250, 1, 212, - 205, 213, 250, 1, 248, 252, 213, 250, 1, 248, 53, 213, 250, 1, 168, 213, - 250, 1, 165, 213, 250, 1, 173, 213, 250, 1, 175, 213, 250, 1, 221, 195, - 213, 250, 1, 199, 137, 213, 250, 1, 207, 6, 213, 250, 1, 205, 43, 213, - 250, 1, 187, 213, 250, 1, 142, 213, 250, 2, 215, 74, 213, 250, 2, 249, - 239, 213, 250, 18, 2, 252, 10, 213, 250, 18, 2, 68, 213, 250, 18, 2, 226, - 8, 213, 250, 18, 2, 66, 213, 250, 18, 2, 199, 229, 213, 250, 18, 2, 111, - 143, 213, 250, 18, 2, 111, 209, 136, 213, 250, 18, 2, 70, 213, 250, 18, - 2, 251, 45, 213, 250, 18, 2, 74, 213, 250, 18, 2, 250, 0, 213, 250, 2, - 198, 252, 213, 250, 251, 46, 222, 60, 78, 213, 250, 250, 1, 222, 60, 78, - 213, 250, 1, 209, 135, 213, 250, 1, 210, 28, 213, 250, 1, 195, 166, 213, - 250, 1, 111, 209, 136, 213, 250, 1, 111, 221, 196, 213, 250, 18, 2, 111, - 158, 213, 250, 18, 2, 111, 221, 196, 213, 250, 17, 195, 79, 213, 250, 17, - 98, 213, 250, 17, 103, 213, 250, 17, 135, 213, 250, 17, 136, 213, 250, - 17, 150, 213, 250, 17, 174, 213, 250, 17, 182, 213, 250, 17, 178, 213, - 250, 17, 184, 213, 250, 225, 126, 213, 250, 1, 197, 156, 213, 250, 234, - 135, 106, 211, 36, 213, 250, 234, 135, 106, 232, 108, 213, 250, 234, 135, - 122, 211, 34, 213, 250, 234, 135, 106, 205, 234, 213, 250, 234, 135, 106, - 236, 156, 213, 250, 234, 135, 122, 205, 233, 47, 2, 250, 155, 47, 2, 198, - 247, 47, 1, 63, 47, 1, 252, 10, 47, 1, 68, 47, 1, 226, 8, 47, 1, 66, 47, - 1, 199, 229, 47, 1, 70, 47, 1, 236, 184, 47, 1, 251, 45, 47, 1, 74, 47, - 1, 214, 33, 47, 1, 250, 0, 47, 1, 157, 47, 1, 216, 244, 47, 1, 247, 36, - 47, 1, 225, 105, 47, 1, 215, 34, 47, 1, 201, 58, 47, 1, 216, 5, 47, 1, - 203, 137, 47, 1, 179, 47, 1, 215, 243, 47, 1, 163, 47, 1, 168, 47, 1, - 165, 47, 1, 173, 47, 1, 209, 135, 47, 1, 175, 47, 1, 221, 195, 47, 1, - 221, 185, 47, 1, 199, 137, 47, 1, 207, 6, 47, 1, 205, 43, 47, 1, 187, 47, - 1, 142, 47, 18, 2, 252, 10, 47, 18, 2, 68, 47, 18, 2, 226, 8, 47, 18, 2, - 66, 47, 18, 2, 199, 229, 47, 18, 2, 70, 47, 18, 2, 236, 184, 47, 18, 2, - 251, 45, 47, 18, 2, 74, 47, 18, 2, 214, 33, 47, 18, 2, 250, 0, 47, 2, - 198, 252, 47, 214, 56, 47, 250, 1, 222, 60, 78, 47, 17, 195, 79, 47, 17, - 98, 47, 17, 103, 47, 17, 135, 47, 17, 136, 47, 17, 150, 47, 17, 174, 47, - 17, 182, 47, 17, 178, 47, 17, 184, 47, 35, 202, 248, 47, 35, 106, 230, - 201, 47, 35, 106, 202, 130, 47, 239, 177, 56, 47, 218, 107, 56, 47, 196, - 63, 56, 47, 239, 116, 56, 47, 240, 195, 56, 47, 250, 53, 89, 56, 47, 209, - 63, 56, 47, 35, 56, 191, 2, 37, 246, 252, 57, 191, 2, 246, 251, 191, 2, - 250, 155, 191, 2, 198, 247, 191, 2, 37, 250, 156, 57, 191, 1, 63, 191, 1, - 252, 10, 191, 1, 68, 191, 1, 226, 8, 191, 1, 66, 191, 1, 199, 229, 191, - 1, 111, 143, 191, 1, 111, 158, 191, 1, 70, 191, 1, 236, 184, 191, 1, 251, - 45, 191, 1, 74, 191, 1, 214, 33, 191, 1, 250, 0, 191, 1, 157, 191, 1, - 224, 38, 191, 1, 234, 4, 191, 1, 233, 112, 191, 1, 216, 244, 191, 1, 247, - 36, 191, 1, 246, 136, 191, 1, 225, 105, 191, 1, 225, 71, 191, 1, 215, 34, - 191, 1, 201, 58, 191, 1, 201, 46, 191, 1, 239, 164, 191, 1, 239, 148, - 191, 1, 216, 5, 191, 1, 203, 137, 191, 1, 202, 202, 191, 1, 240, 3, 191, - 1, 239, 44, 191, 1, 179, 191, 1, 163, 191, 1, 212, 205, 191, 1, 248, 252, - 191, 1, 248, 53, 191, 1, 168, 191, 1, 165, 191, 1, 173, 191, 1, 209, 135, - 191, 1, 175, 191, 1, 221, 195, 191, 1, 221, 185, 191, 1, 199, 137, 191, - 1, 207, 6, 191, 1, 205, 43, 191, 1, 187, 191, 1, 142, 191, 2, 249, 239, - 191, 18, 2, 252, 10, 191, 18, 2, 68, 191, 18, 2, 226, 8, 191, 18, 2, 66, - 191, 18, 2, 199, 229, 191, 18, 2, 111, 143, 191, 18, 2, 111, 209, 136, - 191, 18, 2, 70, 191, 18, 2, 236, 184, 191, 18, 2, 251, 45, 191, 18, 2, - 74, 191, 18, 2, 214, 33, 191, 18, 2, 250, 0, 191, 2, 198, 252, 191, 222, - 60, 78, 191, 251, 46, 222, 60, 78, 191, 1, 201, 93, 191, 1, 237, 29, 191, - 1, 209, 116, 191, 1, 111, 209, 136, 191, 1, 111, 221, 196, 191, 18, 2, - 111, 158, 191, 18, 2, 111, 221, 196, 191, 17, 195, 79, 191, 17, 98, 191, - 17, 103, 191, 17, 135, 191, 17, 136, 191, 17, 150, 191, 17, 174, 191, 17, - 182, 191, 17, 178, 191, 17, 184, 191, 234, 135, 17, 195, 80, 38, 214, 95, - 212, 4, 77, 136, 191, 234, 135, 17, 106, 38, 214, 95, 212, 4, 77, 136, - 191, 234, 135, 17, 114, 38, 214, 95, 212, 4, 77, 136, 191, 234, 135, 17, - 122, 38, 214, 95, 212, 4, 77, 136, 191, 234, 135, 17, 106, 38, 235, 238, - 212, 4, 77, 136, 191, 234, 135, 17, 114, 38, 235, 238, 212, 4, 77, 136, - 191, 234, 135, 17, 122, 38, 235, 238, 212, 4, 77, 136, 191, 2, 200, 230, - 224, 159, 2, 205, 109, 246, 251, 224, 159, 2, 246, 251, 224, 159, 2, 250, - 155, 224, 159, 2, 198, 247, 224, 159, 2, 206, 57, 224, 159, 1, 63, 224, - 159, 1, 252, 10, 224, 159, 1, 68, 224, 159, 1, 226, 8, 224, 159, 1, 66, - 224, 159, 1, 199, 229, 224, 159, 1, 111, 143, 224, 159, 1, 111, 158, 224, - 159, 1, 70, 224, 159, 1, 236, 184, 224, 159, 1, 251, 45, 224, 159, 1, 74, - 224, 159, 1, 214, 33, 224, 159, 1, 250, 0, 224, 159, 1, 157, 224, 159, 1, - 224, 38, 224, 159, 1, 234, 4, 224, 159, 1, 233, 112, 224, 159, 1, 216, - 244, 224, 159, 1, 247, 36, 224, 159, 1, 246, 136, 224, 159, 1, 225, 105, - 224, 159, 1, 225, 71, 224, 159, 1, 215, 34, 224, 159, 1, 201, 58, 224, - 159, 1, 201, 46, 224, 159, 1, 239, 164, 224, 159, 1, 239, 148, 224, 159, - 1, 216, 5, 224, 159, 1, 203, 137, 224, 159, 1, 202, 202, 224, 159, 1, - 240, 3, 224, 159, 1, 239, 44, 224, 159, 1, 179, 224, 159, 1, 163, 224, - 159, 1, 212, 205, 224, 159, 1, 248, 252, 224, 159, 1, 248, 53, 224, 159, - 1, 168, 224, 159, 1, 165, 224, 159, 1, 173, 224, 159, 1, 209, 135, 224, - 159, 1, 175, 224, 159, 1, 221, 195, 224, 159, 1, 199, 137, 224, 159, 1, - 207, 6, 224, 159, 1, 205, 43, 224, 159, 1, 187, 224, 159, 1, 142, 224, - 159, 2, 215, 74, 224, 159, 2, 249, 239, 224, 159, 18, 2, 252, 10, 224, - 159, 18, 2, 68, 224, 159, 18, 2, 226, 8, 224, 159, 18, 2, 66, 224, 159, - 18, 2, 199, 229, 224, 159, 18, 2, 111, 143, 224, 159, 18, 2, 111, 209, - 136, 224, 159, 18, 2, 70, 224, 159, 18, 2, 236, 184, 224, 159, 18, 2, - 251, 45, 224, 159, 18, 2, 74, 224, 159, 18, 2, 214, 33, 224, 159, 18, 2, - 250, 0, 224, 159, 2, 198, 252, 224, 159, 222, 60, 78, 224, 159, 251, 46, - 222, 60, 78, 224, 159, 1, 235, 118, 224, 159, 1, 111, 209, 136, 224, 159, - 1, 111, 221, 196, 224, 159, 18, 2, 111, 158, 224, 159, 18, 2, 111, 221, - 196, 224, 159, 17, 195, 79, 224, 159, 17, 98, 224, 159, 17, 103, 224, - 159, 17, 135, 224, 159, 17, 136, 224, 159, 17, 150, 224, 159, 17, 174, - 224, 159, 17, 182, 224, 159, 17, 178, 224, 159, 17, 184, 224, 159, 2, - 225, 56, 224, 159, 2, 200, 18, 129, 2, 37, 250, 156, 57, 129, 2, 246, - 251, 129, 2, 250, 155, 129, 2, 198, 247, 129, 1, 63, 129, 1, 252, 10, - 129, 1, 68, 129, 1, 226, 8, 129, 1, 66, 129, 1, 199, 229, 129, 1, 111, - 143, 129, 1, 111, 158, 129, 1, 70, 129, 1, 236, 184, 129, 1, 251, 45, - 129, 1, 74, 129, 1, 214, 33, 129, 1, 250, 0, 129, 1, 157, 129, 1, 224, - 38, 129, 1, 234, 4, 129, 1, 233, 112, 129, 1, 216, 244, 129, 1, 247, 36, - 129, 1, 246, 136, 129, 1, 225, 105, 129, 1, 225, 71, 129, 1, 215, 34, - 129, 1, 201, 58, 129, 1, 201, 46, 129, 1, 239, 164, 129, 1, 239, 148, - 129, 1, 216, 5, 129, 1, 203, 137, 129, 1, 202, 202, 129, 1, 240, 3, 129, - 1, 239, 44, 129, 1, 179, 129, 1, 215, 243, 129, 1, 163, 129, 1, 212, 205, - 129, 1, 248, 252, 129, 1, 248, 53, 129, 1, 168, 129, 1, 165, 129, 1, 173, - 129, 1, 209, 135, 129, 1, 175, 129, 1, 221, 195, 129, 1, 221, 185, 129, - 1, 199, 137, 129, 1, 207, 6, 129, 1, 205, 43, 129, 1, 187, 129, 1, 142, - 129, 1, 201, 27, 129, 2, 83, 248, 190, 198, 252, 129, 2, 244, 107, 198, - 252, 129, 2, 249, 239, 129, 18, 2, 252, 10, 129, 18, 2, 68, 129, 18, 2, - 226, 8, 129, 18, 2, 66, 129, 18, 2, 199, 229, 129, 18, 2, 111, 143, 129, - 18, 2, 111, 209, 136, 129, 18, 2, 70, 129, 18, 2, 236, 184, 129, 18, 2, - 251, 45, 129, 18, 2, 74, 129, 18, 2, 214, 33, 129, 18, 2, 250, 0, 129, 2, - 198, 252, 129, 1, 76, 210, 67, 129, 2, 213, 95, 129, 1, 244, 184, 221, - 40, 129, 1, 244, 184, 196, 143, 129, 1, 244, 184, 221, 186, 129, 250, 1, - 222, 60, 78, 129, 234, 135, 106, 214, 44, 129, 234, 135, 106, 234, 154, - 129, 234, 135, 122, 236, 153, 129, 234, 135, 106, 200, 217, 129, 234, - 135, 106, 202, 239, 129, 234, 135, 122, 200, 216, 129, 234, 135, 106, - 235, 28, 129, 1, 250, 99, 226, 8, 129, 1, 111, 209, 136, 129, 1, 111, - 221, 196, 129, 18, 2, 111, 158, 129, 18, 2, 111, 221, 196, 129, 17, 195, - 79, 129, 17, 98, 129, 17, 103, 129, 17, 135, 129, 17, 136, 129, 17, 150, - 129, 17, 174, 129, 17, 182, 129, 17, 178, 129, 17, 184, 129, 35, 202, - 248, 129, 35, 106, 230, 201, 129, 35, 106, 202, 130, 129, 234, 135, 106, - 211, 36, 129, 234, 135, 106, 232, 108, 129, 234, 135, 122, 211, 34, 129, - 234, 135, 106, 205, 234, 129, 234, 135, 106, 236, 156, 129, 234, 135, - 122, 205, 233, 129, 239, 182, 78, 129, 1, 244, 184, 216, 6, 129, 1, 244, - 184, 217, 225, 129, 1, 244, 184, 209, 136, 129, 1, 244, 184, 158, 129, 1, - 244, 184, 221, 196, 129, 1, 244, 184, 224, 227, 151, 2, 250, 154, 151, 2, - 198, 246, 151, 1, 249, 227, 151, 1, 251, 220, 151, 1, 251, 70, 151, 1, - 251, 85, 151, 1, 225, 115, 151, 1, 226, 7, 151, 1, 199, 220, 151, 1, 199, - 223, 151, 1, 225, 141, 151, 1, 225, 142, 151, 1, 225, 249, 151, 1, 225, - 251, 151, 1, 235, 205, 151, 1, 236, 179, 151, 1, 251, 29, 151, 1, 213, - 198, 151, 1, 214, 26, 151, 1, 249, 242, 151, 1, 250, 239, 224, 106, 151, - 1, 219, 248, 224, 106, 151, 1, 250, 239, 233, 206, 151, 1, 219, 248, 233, - 206, 151, 1, 224, 158, 217, 155, 151, 1, 208, 165, 233, 206, 151, 1, 250, - 239, 246, 202, 151, 1, 219, 248, 246, 202, 151, 1, 250, 239, 225, 87, - 151, 1, 219, 248, 225, 87, 151, 1, 203, 127, 217, 155, 151, 1, 203, 127, - 208, 164, 217, 156, 151, 1, 208, 165, 225, 87, 151, 1, 250, 239, 201, 54, - 151, 1, 219, 248, 201, 54, 151, 1, 250, 239, 239, 155, 151, 1, 219, 248, - 239, 155, 151, 1, 217, 253, 217, 109, 151, 1, 208, 165, 239, 155, 151, 1, - 250, 239, 203, 44, 151, 1, 219, 248, 203, 44, 151, 1, 250, 239, 239, 175, - 151, 1, 219, 248, 239, 175, 151, 1, 239, 207, 217, 109, 151, 1, 208, 165, - 239, 175, 151, 1, 250, 239, 213, 43, 151, 1, 219, 248, 213, 43, 151, 1, - 250, 239, 248, 157, 151, 1, 219, 248, 248, 157, 151, 1, 219, 156, 151, 1, - 250, 219, 248, 157, 151, 1, 196, 70, 151, 1, 210, 139, 151, 1, 239, 207, - 222, 108, 151, 1, 199, 107, 151, 1, 203, 127, 208, 135, 151, 1, 217, 253, - 208, 135, 151, 1, 239, 207, 208, 135, 151, 1, 232, 38, 151, 1, 217, 253, - 222, 108, 151, 1, 235, 71, 151, 2, 251, 18, 151, 18, 2, 251, 80, 151, 18, - 2, 224, 63, 251, 87, 151, 18, 2, 238, 243, 251, 87, 151, 18, 2, 224, 63, - 225, 138, 151, 18, 2, 238, 243, 225, 138, 151, 18, 2, 224, 63, 213, 178, - 151, 18, 2, 238, 243, 213, 178, 151, 18, 2, 233, 249, 151, 18, 2, 223, - 146, 151, 18, 2, 238, 243, 223, 146, 151, 18, 2, 223, 148, 239, 94, 151, - 18, 2, 223, 147, 232, 130, 251, 80, 151, 18, 2, 223, 147, 232, 130, 238, - 243, 251, 80, 151, 18, 2, 223, 147, 232, 130, 233, 205, 151, 18, 2, 233, - 205, 151, 221, 208, 17, 195, 79, 151, 221, 208, 17, 98, 151, 221, 208, - 17, 103, 151, 221, 208, 17, 135, 151, 221, 208, 17, 136, 151, 221, 208, - 17, 150, 151, 221, 208, 17, 174, 151, 221, 208, 17, 182, 151, 221, 208, - 17, 178, 151, 221, 208, 17, 184, 151, 18, 2, 238, 243, 233, 249, 151, 18, - 2, 238, 243, 233, 205, 151, 211, 163, 223, 64, 202, 197, 183, 223, 166, - 224, 179, 202, 197, 183, 224, 10, 224, 33, 202, 197, 183, 224, 10, 224, - 1, 202, 197, 183, 224, 10, 223, 252, 202, 197, 183, 224, 10, 224, 6, 202, - 197, 183, 224, 10, 210, 160, 202, 197, 183, 216, 170, 216, 157, 202, 197, - 183, 244, 170, 246, 125, 202, 197, 183, 244, 170, 244, 180, 202, 197, - 183, 244, 170, 246, 124, 202, 197, 183, 205, 163, 205, 162, 202, 197, - 183, 244, 170, 244, 166, 202, 197, 183, 196, 1, 196, 8, 202, 197, 183, - 238, 155, 246, 133, 202, 197, 183, 202, 2, 213, 54, 202, 197, 183, 202, - 142, 202, 191, 202, 197, 183, 202, 142, 217, 132, 202, 197, 183, 202, - 142, 212, 166, 202, 197, 183, 215, 226, 217, 17, 202, 197, 183, 238, 155, - 239, 95, 202, 197, 183, 202, 2, 203, 74, 202, 197, 183, 202, 142, 202, - 108, 202, 197, 183, 202, 142, 202, 198, 202, 197, 183, 202, 142, 202, - 137, 202, 197, 183, 215, 226, 215, 111, 202, 197, 183, 247, 231, 248, - 217, 202, 197, 183, 212, 63, 212, 94, 202, 197, 183, 212, 178, 212, 168, - 202, 197, 183, 234, 189, 235, 118, 202, 197, 183, 212, 178, 212, 198, - 202, 197, 183, 234, 189, 235, 90, 202, 197, 183, 212, 178, 208, 178, 202, - 197, 183, 218, 161, 168, 202, 197, 183, 196, 1, 196, 100, 202, 197, 183, - 209, 186, 209, 88, 202, 197, 183, 209, 95, 202, 197, 183, 221, 167, 221, - 226, 202, 197, 183, 221, 95, 202, 197, 183, 197, 29, 197, 146, 202, 197, - 183, 205, 163, 208, 194, 202, 197, 183, 205, 163, 209, 59, 202, 197, 183, - 205, 163, 204, 130, 202, 197, 183, 231, 82, 231, 179, 202, 197, 183, 221, - 167, 244, 149, 202, 197, 183, 169, 250, 199, 202, 197, 183, 231, 82, 215, - 216, 202, 197, 183, 213, 154, 202, 197, 183, 208, 159, 63, 202, 197, 183, - 219, 242, 232, 96, 202, 197, 183, 208, 159, 252, 10, 202, 197, 183, 208, - 159, 250, 225, 202, 197, 183, 208, 159, 68, 202, 197, 183, 208, 159, 226, - 8, 202, 197, 183, 208, 159, 200, 81, 202, 197, 183, 208, 159, 200, 79, - 202, 197, 183, 208, 159, 66, 202, 197, 183, 208, 159, 199, 229, 202, 197, - 183, 212, 180, 202, 197, 240, 140, 16, 248, 218, 202, 197, 183, 208, 159, - 70, 202, 197, 183, 208, 159, 251, 90, 202, 197, 183, 208, 159, 74, 202, - 197, 183, 208, 159, 251, 46, 219, 236, 202, 197, 183, 208, 159, 251, 46, - 219, 237, 202, 197, 183, 222, 154, 202, 197, 183, 219, 233, 202, 197, - 183, 219, 234, 202, 197, 183, 219, 242, 236, 145, 202, 197, 183, 219, - 242, 202, 141, 202, 197, 183, 219, 242, 201, 163, 202, 197, 183, 219, - 242, 244, 228, 202, 197, 183, 202, 189, 202, 197, 183, 216, 105, 202, - 197, 183, 196, 94, 202, 197, 183, 234, 179, 202, 197, 17, 195, 79, 202, - 197, 17, 98, 202, 197, 17, 103, 202, 197, 17, 135, 202, 197, 17, 136, - 202, 197, 17, 150, 202, 197, 17, 174, 202, 197, 17, 182, 202, 197, 17, - 178, 202, 197, 17, 184, 202, 197, 183, 250, 194, 202, 197, 183, 224, 7, - 222, 134, 1, 223, 165, 222, 134, 1, 224, 10, 204, 75, 222, 134, 1, 224, - 10, 203, 85, 222, 134, 1, 216, 169, 222, 134, 1, 244, 46, 222, 134, 1, - 205, 163, 203, 85, 222, 134, 1, 215, 0, 222, 134, 1, 238, 154, 222, 134, - 1, 147, 222, 134, 1, 202, 142, 204, 75, 222, 134, 1, 202, 142, 203, 85, - 222, 134, 1, 215, 225, 222, 134, 1, 247, 230, 222, 134, 1, 212, 62, 222, - 134, 1, 212, 178, 204, 75, 222, 134, 1, 234, 189, 203, 85, 222, 134, 1, - 212, 178, 203, 85, 222, 134, 1, 234, 189, 204, 75, 222, 134, 1, 218, 160, - 222, 134, 1, 196, 0, 222, 134, 1, 221, 167, 221, 226, 222, 134, 1, 221, - 167, 221, 127, 222, 134, 1, 197, 28, 222, 134, 1, 205, 163, 204, 75, 222, - 134, 1, 231, 82, 204, 75, 222, 134, 1, 74, 222, 134, 1, 231, 82, 203, 85, - 222, 134, 236, 122, 222, 134, 18, 2, 63, 222, 134, 18, 2, 219, 242, 224, - 165, 222, 134, 18, 2, 252, 10, 222, 134, 18, 2, 250, 225, 222, 134, 18, - 2, 68, 222, 134, 18, 2, 226, 8, 222, 134, 18, 2, 196, 143, 222, 134, 18, - 2, 195, 167, 222, 134, 18, 2, 66, 222, 134, 18, 2, 199, 229, 222, 134, - 18, 2, 219, 242, 223, 144, 222, 134, 207, 56, 2, 221, 166, 222, 134, 207, - 56, 2, 215, 0, 222, 134, 18, 2, 70, 222, 134, 18, 2, 236, 163, 222, 134, - 18, 2, 74, 222, 134, 18, 2, 249, 229, 222, 134, 18, 2, 251, 45, 222, 134, - 223, 166, 175, 222, 134, 154, 219, 242, 236, 145, 222, 134, 154, 219, - 242, 202, 141, 222, 134, 154, 219, 242, 202, 94, 222, 134, 154, 219, 242, - 246, 210, 222, 134, 247, 1, 78, 222, 134, 216, 114, 222, 134, 17, 195, - 79, 222, 134, 17, 98, 222, 134, 17, 103, 222, 134, 17, 135, 222, 134, 17, - 136, 222, 134, 17, 150, 222, 134, 17, 174, 222, 134, 17, 182, 222, 134, - 17, 178, 222, 134, 17, 184, 222, 134, 231, 82, 215, 225, 222, 134, 231, - 82, 218, 160, 222, 134, 1, 224, 11, 233, 26, 222, 134, 1, 224, 11, 215, - 0, 82, 5, 214, 56, 82, 113, 232, 216, 196, 12, 219, 5, 201, 99, 63, 82, - 113, 232, 216, 196, 12, 219, 5, 255, 11, 209, 190, 248, 121, 168, 82, - 113, 232, 216, 196, 12, 219, 5, 255, 11, 232, 216, 201, 79, 168, 82, 113, - 84, 196, 12, 219, 5, 219, 116, 168, 82, 113, 244, 63, 196, 12, 219, 5, - 207, 13, 168, 82, 113, 246, 230, 196, 12, 219, 5, 212, 167, 206, 255, - 168, 82, 113, 196, 12, 219, 5, 201, 79, 206, 255, 168, 82, 113, 208, 133, - 206, 254, 82, 113, 247, 141, 196, 12, 219, 4, 82, 113, 247, 252, 206, - 149, 196, 12, 219, 4, 82, 113, 225, 167, 201, 78, 82, 113, 239, 87, 201, - 79, 247, 140, 82, 113, 206, 254, 82, 113, 215, 5, 206, 254, 82, 113, 201, - 79, 206, 254, 82, 113, 215, 5, 201, 79, 206, 254, 82, 113, 209, 213, 244, - 209, 205, 60, 206, 254, 82, 113, 210, 32, 232, 250, 206, 254, 82, 113, - 246, 230, 255, 15, 209, 99, 219, 115, 172, 247, 4, 82, 113, 232, 216, - 201, 78, 82, 221, 151, 2, 246, 134, 209, 98, 82, 221, 151, 2, 222, 22, - 209, 98, 82, 250, 24, 2, 207, 9, 233, 189, 255, 16, 209, 98, 82, 250, 24, - 2, 255, 13, 163, 82, 250, 24, 2, 208, 104, 201, 73, 82, 2, 210, 135, 238, - 169, 233, 188, 82, 2, 210, 135, 238, 169, 233, 28, 82, 2, 210, 135, 238, - 169, 232, 217, 82, 2, 210, 135, 217, 151, 233, 188, 82, 2, 210, 135, 217, - 151, 233, 28, 82, 2, 210, 135, 238, 169, 210, 135, 217, 150, 82, 17, 195, - 79, 82, 17, 98, 82, 17, 103, 82, 17, 135, 82, 17, 136, 82, 17, 150, 82, - 17, 174, 82, 17, 182, 82, 17, 178, 82, 17, 184, 82, 17, 155, 98, 82, 17, - 155, 103, 82, 17, 155, 135, 82, 17, 155, 136, 82, 17, 155, 150, 82, 17, - 155, 174, 82, 17, 155, 182, 82, 17, 155, 178, 82, 17, 155, 184, 82, 17, - 155, 195, 79, 82, 113, 247, 143, 209, 98, 82, 113, 216, 235, 247, 71, - 215, 16, 195, 13, 82, 113, 246, 230, 255, 15, 209, 99, 247, 72, 218, 206, - 247, 4, 82, 113, 216, 235, 247, 71, 207, 10, 209, 98, 82, 113, 244, 224, - 219, 4, 82, 113, 201, 94, 255, 12, 82, 113, 232, 199, 209, 99, 232, 157, - 82, 113, 232, 199, 209, 99, 232, 163, 82, 113, 250, 200, 224, 28, 232, - 157, 82, 113, 250, 200, 224, 28, 232, 163, 82, 2, 196, 86, 201, 77, 82, - 2, 219, 199, 201, 77, 82, 1, 157, 82, 1, 224, 38, 82, 1, 234, 4, 82, 1, - 233, 112, 82, 1, 216, 244, 82, 1, 247, 36, 82, 1, 246, 136, 82, 1, 225, - 105, 82, 1, 215, 34, 82, 1, 201, 58, 82, 1, 201, 46, 82, 1, 239, 164, 82, - 1, 239, 148, 82, 1, 216, 5, 82, 1, 203, 137, 82, 1, 202, 202, 82, 1, 240, - 3, 82, 1, 239, 44, 82, 1, 179, 82, 1, 163, 82, 1, 212, 205, 82, 1, 248, - 252, 82, 1, 248, 53, 82, 1, 168, 82, 1, 201, 93, 82, 1, 201, 83, 82, 1, - 237, 29, 82, 1, 237, 23, 82, 1, 197, 156, 82, 1, 195, 74, 82, 1, 195, - 114, 82, 1, 255, 18, 82, 1, 165, 82, 1, 173, 82, 1, 175, 82, 1, 207, 6, - 82, 1, 205, 43, 82, 1, 187, 82, 1, 142, 82, 1, 63, 82, 1, 223, 100, 82, - 1, 234, 233, 173, 82, 1, 223, 186, 82, 1, 209, 135, 82, 18, 2, 252, 10, - 82, 18, 2, 68, 82, 18, 2, 226, 8, 82, 18, 2, 66, 82, 18, 2, 199, 229, 82, - 18, 2, 111, 143, 82, 18, 2, 111, 209, 136, 82, 18, 2, 111, 158, 82, 18, - 2, 111, 221, 196, 82, 18, 2, 70, 82, 18, 2, 236, 184, 82, 18, 2, 74, 82, - 18, 2, 214, 33, 82, 2, 209, 196, 204, 140, 216, 245, 209, 185, 82, 2, - 209, 190, 248, 120, 82, 18, 2, 210, 40, 68, 82, 18, 2, 210, 40, 226, 8, - 82, 2, 215, 16, 195, 14, 217, 159, 240, 3, 82, 2, 205, 177, 222, 101, 82, - 113, 232, 110, 82, 113, 213, 140, 82, 2, 222, 104, 209, 98, 82, 2, 196, - 91, 209, 98, 82, 2, 222, 105, 201, 94, 247, 4, 82, 2, 219, 118, 247, 4, - 82, 2, 232, 220, 247, 5, 210, 30, 82, 2, 232, 220, 219, 105, 210, 30, 82, - 2, 225, 163, 219, 118, 247, 4, 82, 204, 119, 2, 222, 105, 201, 94, 247, - 4, 82, 204, 119, 2, 219, 118, 247, 4, 82, 204, 119, 2, 225, 163, 219, - 118, 247, 4, 82, 204, 119, 1, 157, 82, 204, 119, 1, 224, 38, 82, 204, - 119, 1, 234, 4, 82, 204, 119, 1, 233, 112, 82, 204, 119, 1, 216, 244, 82, - 204, 119, 1, 247, 36, 82, 204, 119, 1, 246, 136, 82, 204, 119, 1, 225, - 105, 82, 204, 119, 1, 215, 34, 82, 204, 119, 1, 201, 58, 82, 204, 119, 1, - 201, 46, 82, 204, 119, 1, 239, 164, 82, 204, 119, 1, 239, 148, 82, 204, - 119, 1, 216, 5, 82, 204, 119, 1, 203, 137, 82, 204, 119, 1, 202, 202, 82, - 204, 119, 1, 240, 3, 82, 204, 119, 1, 239, 44, 82, 204, 119, 1, 179, 82, - 204, 119, 1, 163, 82, 204, 119, 1, 212, 205, 82, 204, 119, 1, 248, 252, - 82, 204, 119, 1, 248, 53, 82, 204, 119, 1, 168, 82, 204, 119, 1, 201, 93, - 82, 204, 119, 1, 201, 83, 82, 204, 119, 1, 237, 29, 82, 204, 119, 1, 237, - 23, 82, 204, 119, 1, 197, 156, 82, 204, 119, 1, 195, 74, 82, 204, 119, 1, - 195, 114, 82, 204, 119, 1, 255, 18, 82, 204, 119, 1, 165, 82, 204, 119, - 1, 173, 82, 204, 119, 1, 175, 82, 204, 119, 1, 207, 6, 82, 204, 119, 1, - 205, 43, 82, 204, 119, 1, 187, 82, 204, 119, 1, 142, 82, 204, 119, 1, 63, - 82, 204, 119, 1, 223, 100, 82, 204, 119, 1, 234, 233, 197, 156, 82, 204, - 119, 1, 234, 233, 165, 82, 204, 119, 1, 234, 233, 173, 82, 223, 87, 209, - 96, 224, 38, 82, 223, 87, 209, 96, 224, 39, 247, 72, 218, 206, 247, 4, - 82, 246, 245, 2, 85, 248, 110, 82, 246, 245, 2, 167, 248, 110, 82, 246, - 245, 2, 246, 249, 203, 26, 82, 246, 245, 2, 208, 132, 255, 17, 82, 16, - 237, 89, 247, 138, 82, 16, 210, 134, 209, 197, 82, 16, 213, 166, 233, - 187, 82, 16, 210, 134, 209, 198, 210, 32, 232, 249, 82, 16, 212, 167, - 163, 82, 16, 215, 203, 247, 138, 82, 16, 215, 203, 247, 139, 215, 5, 255, - 14, 82, 16, 215, 203, 247, 139, 232, 218, 255, 14, 82, 16, 215, 203, 247, - 139, 247, 72, 255, 14, 82, 2, 210, 135, 217, 151, 210, 135, 238, 168, 82, - 2, 210, 135, 217, 151, 232, 217, 82, 113, 247, 142, 206, 149, 233, 75, - 219, 5, 210, 31, 82, 113, 218, 162, 196, 12, 233, 75, 219, 5, 210, 31, - 82, 113, 215, 5, 201, 78, 82, 113, 84, 247, 168, 209, 187, 196, 12, 219, - 5, 219, 116, 168, 82, 113, 244, 63, 247, 168, 209, 187, 196, 12, 219, 5, - 207, 13, 168, 209, 229, 204, 36, 56, 222, 85, 204, 36, 56, 209, 229, 204, - 36, 2, 3, 238, 120, 222, 85, 204, 36, 2, 3, 238, 120, 82, 113, 222, 96, - 219, 119, 209, 98, 82, 113, 201, 189, 219, 119, 209, 98, 75, 1, 157, 75, - 1, 224, 38, 75, 1, 234, 4, 75, 1, 233, 112, 75, 1, 216, 244, 75, 1, 247, - 36, 75, 1, 246, 136, 75, 1, 225, 105, 75, 1, 225, 71, 75, 1, 215, 34, 75, - 1, 215, 227, 75, 1, 201, 58, 75, 1, 201, 46, 75, 1, 239, 164, 75, 1, 239, - 148, 75, 1, 216, 5, 75, 1, 203, 137, 75, 1, 202, 202, 75, 1, 240, 3, 75, - 1, 239, 44, 75, 1, 179, 75, 1, 163, 75, 1, 212, 205, 75, 1, 248, 252, 75, - 1, 248, 53, 75, 1, 168, 75, 1, 165, 75, 1, 173, 75, 1, 175, 75, 1, 197, - 156, 75, 1, 187, 75, 1, 142, 75, 1, 221, 195, 75, 1, 63, 75, 1, 206, 237, - 63, 75, 1, 68, 75, 1, 226, 8, 75, 1, 66, 75, 1, 199, 229, 75, 1, 70, 75, - 1, 218, 125, 70, 75, 1, 74, 75, 1, 250, 0, 75, 18, 2, 203, 88, 252, 10, - 75, 18, 2, 252, 10, 75, 18, 2, 68, 75, 18, 2, 226, 8, 75, 18, 2, 66, 75, - 18, 2, 199, 229, 75, 18, 2, 70, 75, 18, 2, 251, 45, 75, 18, 2, 218, 125, - 226, 8, 75, 18, 2, 218, 125, 74, 75, 18, 2, 237, 10, 57, 75, 2, 250, 155, - 75, 2, 76, 58, 75, 2, 198, 247, 75, 2, 198, 252, 75, 2, 250, 49, 75, 105, - 2, 194, 194, 165, 75, 105, 2, 194, 194, 173, 75, 105, 2, 194, 194, 197, - 156, 75, 105, 2, 194, 194, 142, 75, 1, 232, 234, 187, 75, 17, 195, 79, - 75, 17, 98, 75, 17, 103, 75, 17, 135, 75, 17, 136, 75, 17, 150, 75, 17, - 174, 75, 17, 182, 75, 17, 178, 75, 17, 184, 75, 2, 221, 205, 208, 88, 75, - 2, 208, 88, 75, 16, 221, 160, 75, 16, 244, 16, 75, 16, 251, 66, 75, 16, - 233, 167, 75, 1, 207, 6, 75, 1, 205, 43, 75, 1, 111, 143, 75, 1, 111, - 209, 136, 75, 1, 111, 158, 75, 1, 111, 221, 196, 75, 18, 2, 111, 143, 75, - 18, 2, 111, 209, 136, 75, 18, 2, 111, 158, 75, 18, 2, 111, 221, 196, 75, - 1, 218, 125, 216, 244, 75, 1, 218, 125, 225, 71, 75, 1, 218, 125, 248, - 155, 75, 1, 218, 125, 248, 150, 75, 105, 2, 218, 125, 194, 194, 179, 75, - 105, 2, 218, 125, 194, 194, 168, 75, 105, 2, 218, 125, 194, 194, 175, 75, - 1, 207, 12, 224, 140, 207, 6, 75, 18, 2, 207, 12, 224, 140, 235, 251, 75, - 154, 113, 207, 12, 224, 140, 232, 46, 75, 154, 113, 207, 12, 224, 140, - 224, 102, 212, 177, 75, 1, 197, 78, 211, 128, 224, 140, 202, 202, 75, 1, - 197, 78, 211, 128, 224, 140, 211, 134, 75, 18, 2, 197, 78, 211, 128, 224, - 140, 235, 251, 75, 18, 2, 197, 78, 211, 128, 224, 140, 200, 81, 75, 2, - 197, 78, 211, 128, 224, 140, 201, 238, 75, 2, 197, 78, 211, 128, 224, - 140, 201, 237, 75, 2, 197, 78, 211, 128, 224, 140, 201, 236, 75, 2, 197, - 78, 211, 128, 224, 140, 201, 235, 75, 2, 197, 78, 211, 128, 224, 140, - 201, 234, 75, 1, 236, 197, 211, 128, 224, 140, 216, 5, 75, 1, 236, 197, - 211, 128, 224, 140, 195, 174, 75, 1, 236, 197, 211, 128, 224, 140, 233, - 77, 75, 18, 2, 233, 182, 224, 140, 68, 75, 18, 2, 224, 107, 214, 91, 75, - 18, 2, 224, 107, 66, 75, 18, 2, 224, 107, 236, 184, 75, 1, 206, 237, 157, - 75, 1, 206, 237, 224, 38, 75, 1, 206, 237, 234, 4, 75, 1, 206, 237, 247, - 36, 75, 1, 206, 237, 195, 114, 75, 1, 206, 237, 215, 34, 75, 1, 206, 237, - 240, 3, 75, 1, 206, 237, 179, 75, 1, 206, 237, 212, 205, 75, 1, 206, 237, - 235, 118, 75, 1, 206, 237, 248, 252, 75, 1, 206, 237, 202, 202, 75, 1, - 206, 237, 142, 75, 105, 2, 206, 237, 194, 194, 197, 156, 75, 18, 2, 206, - 237, 252, 10, 75, 18, 2, 206, 237, 70, 75, 18, 2, 206, 237, 237, 10, 57, - 75, 18, 2, 206, 237, 48, 196, 143, 75, 2, 206, 237, 201, 237, 75, 2, 206, - 237, 201, 236, 75, 2, 206, 237, 201, 234, 75, 2, 206, 237, 201, 233, 75, - 2, 206, 237, 240, 212, 201, 237, 75, 2, 206, 237, 240, 212, 201, 236, 75, - 2, 206, 237, 240, 212, 236, 109, 201, 239, 75, 1, 209, 74, 213, 149, 235, - 118, 75, 2, 209, 74, 213, 149, 201, 234, 75, 206, 237, 17, 195, 79, 75, - 206, 237, 17, 98, 75, 206, 237, 17, 103, 75, 206, 237, 17, 135, 75, 206, - 237, 17, 136, 75, 206, 237, 17, 150, 75, 206, 237, 17, 174, 75, 206, 237, - 17, 182, 75, 206, 237, 17, 178, 75, 206, 237, 17, 184, 75, 2, 224, 31, - 201, 238, 75, 2, 224, 31, 201, 236, 75, 18, 2, 251, 32, 63, 75, 18, 2, - 251, 32, 251, 45, 75, 16, 206, 237, 98, 75, 16, 206, 237, 235, 224, 93, - 6, 1, 250, 208, 93, 6, 1, 248, 201, 93, 6, 1, 233, 230, 93, 6, 1, 238, - 132, 93, 6, 1, 236, 106, 93, 6, 1, 199, 5, 93, 6, 1, 195, 82, 93, 6, 1, - 203, 82, 93, 6, 1, 225, 230, 93, 6, 1, 224, 165, 93, 6, 1, 222, 124, 93, - 6, 1, 219, 222, 93, 6, 1, 217, 126, 93, 6, 1, 214, 48, 93, 6, 1, 213, 96, - 93, 6, 1, 195, 70, 93, 6, 1, 210, 178, 93, 6, 1, 208, 174, 93, 6, 1, 203, - 69, 93, 6, 1, 200, 55, 93, 6, 1, 212, 197, 93, 6, 1, 224, 26, 93, 6, 1, - 233, 103, 93, 6, 1, 211, 93, 93, 6, 1, 206, 167, 93, 6, 1, 244, 182, 93, - 6, 1, 247, 4, 93, 6, 1, 225, 53, 93, 6, 1, 244, 120, 93, 6, 1, 246, 120, - 93, 6, 1, 196, 200, 93, 6, 1, 225, 68, 93, 6, 1, 232, 125, 93, 6, 1, 232, - 32, 93, 6, 1, 231, 201, 93, 6, 1, 197, 101, 93, 6, 1, 232, 60, 93, 6, 1, - 231, 69, 93, 6, 1, 196, 2, 93, 6, 1, 251, 79, 93, 1, 250, 208, 93, 1, - 248, 201, 93, 1, 233, 230, 93, 1, 238, 132, 93, 1, 236, 106, 93, 1, 199, - 5, 93, 1, 195, 82, 93, 1, 203, 82, 93, 1, 225, 230, 93, 1, 224, 165, 93, - 1, 222, 124, 93, 1, 219, 222, 93, 1, 217, 126, 93, 1, 214, 48, 93, 1, - 213, 96, 93, 1, 195, 70, 93, 1, 210, 178, 93, 1, 208, 174, 93, 1, 203, - 69, 93, 1, 200, 55, 93, 1, 212, 197, 93, 1, 224, 26, 93, 1, 233, 103, 93, - 1, 211, 93, 93, 1, 206, 167, 93, 1, 244, 182, 93, 1, 247, 4, 93, 1, 225, - 53, 93, 1, 244, 120, 93, 1, 246, 120, 93, 1, 196, 200, 93, 1, 225, 68, - 93, 1, 232, 125, 93, 1, 232, 32, 93, 1, 231, 201, 93, 1, 197, 101, 93, 1, - 232, 60, 93, 1, 231, 69, 93, 1, 235, 33, 93, 1, 196, 2, 93, 1, 236, 124, - 93, 1, 200, 240, 233, 230, 93, 1, 251, 40, 93, 213, 94, 207, 46, 71, 1, - 93, 217, 126, 93, 1, 251, 79, 93, 1, 232, 58, 56, 93, 1, 222, 230, 56, - 29, 134, 223, 198, 29, 134, 205, 35, 29, 134, 216, 126, 29, 134, 202, 69, - 29, 134, 205, 24, 29, 134, 210, 6, 29, 134, 218, 221, 29, 134, 212, 149, - 29, 134, 205, 32, 29, 134, 206, 9, 29, 134, 205, 29, 29, 134, 226, 31, - 29, 134, 244, 126, 29, 134, 205, 39, 29, 134, 244, 191, 29, 134, 224, 14, - 29, 134, 202, 160, 29, 134, 212, 187, 29, 134, 231, 198, 29, 134, 216, - 122, 29, 134, 205, 33, 29, 134, 216, 116, 29, 134, 216, 120, 29, 134, - 202, 66, 29, 134, 209, 250, 29, 134, 205, 31, 29, 134, 210, 4, 29, 134, - 224, 146, 29, 134, 218, 214, 29, 134, 224, 149, 29, 134, 212, 144, 29, - 134, 212, 142, 29, 134, 212, 130, 29, 134, 212, 138, 29, 134, 212, 136, - 29, 134, 212, 133, 29, 134, 212, 135, 29, 134, 212, 132, 29, 134, 212, - 137, 29, 134, 212, 147, 29, 134, 212, 148, 29, 134, 212, 131, 29, 134, - 212, 141, 29, 134, 224, 147, 29, 134, 224, 145, 29, 134, 206, 2, 29, 134, - 206, 0, 29, 134, 205, 248, 29, 134, 205, 251, 29, 134, 206, 1, 29, 134, - 205, 253, 29, 134, 205, 252, 29, 134, 205, 250, 29, 134, 206, 5, 29, 134, - 206, 7, 29, 134, 206, 8, 29, 134, 206, 3, 29, 134, 205, 249, 29, 134, - 205, 254, 29, 134, 206, 6, 29, 134, 244, 173, 29, 134, 244, 171, 29, 134, - 246, 148, 29, 134, 246, 146, 29, 134, 213, 113, 29, 134, 226, 26, 29, - 134, 226, 17, 29, 134, 226, 25, 29, 134, 226, 22, 29, 134, 226, 20, 29, - 134, 226, 24, 29, 134, 205, 36, 29, 134, 226, 29, 29, 134, 226, 30, 29, - 134, 226, 18, 29, 134, 226, 23, 29, 134, 196, 42, 29, 134, 244, 125, 29, - 134, 244, 174, 29, 134, 244, 172, 29, 134, 246, 149, 29, 134, 246, 147, - 29, 134, 244, 189, 29, 134, 244, 190, 29, 134, 244, 175, 29, 134, 246, - 150, 29, 134, 212, 185, 29, 134, 224, 148, 29, 134, 205, 37, 29, 134, - 196, 48, 29, 134, 223, 189, 29, 134, 216, 118, 29, 134, 216, 124, 29, - 134, 216, 123, 29, 134, 202, 63, 29, 134, 235, 14, 29, 224, 249, 235, 14, - 29, 224, 249, 63, 29, 224, 249, 251, 90, 29, 224, 249, 165, 29, 224, 249, - 196, 113, 29, 224, 249, 236, 69, 29, 224, 249, 70, 29, 224, 249, 196, 52, - 29, 224, 249, 196, 65, 29, 224, 249, 74, 29, 224, 249, 197, 156, 29, 224, - 249, 197, 147, 29, 224, 249, 214, 91, 29, 224, 249, 196, 0, 29, 224, 249, - 66, 29, 224, 249, 197, 83, 29, 224, 249, 197, 101, 29, 224, 249, 197, 64, - 29, 224, 249, 195, 215, 29, 224, 249, 235, 251, 29, 224, 249, 196, 20, - 29, 224, 249, 68, 29, 224, 249, 255, 6, 29, 224, 249, 255, 5, 29, 224, - 249, 196, 127, 29, 224, 249, 196, 125, 29, 224, 249, 236, 67, 29, 224, - 249, 236, 66, 29, 224, 249, 236, 68, 29, 224, 249, 196, 51, 29, 224, 249, - 196, 50, 29, 224, 249, 214, 201, 29, 224, 249, 214, 202, 29, 224, 249, - 214, 195, 29, 224, 249, 214, 200, 29, 224, 249, 214, 198, 29, 224, 249, - 195, 244, 29, 224, 249, 195, 243, 29, 224, 249, 195, 242, 29, 224, 249, - 195, 245, 29, 224, 249, 195, 246, 29, 224, 249, 200, 154, 29, 224, 249, - 200, 153, 29, 224, 249, 200, 151, 29, 224, 249, 200, 147, 29, 224, 249, - 200, 148, 29, 224, 249, 195, 210, 29, 224, 249, 195, 207, 29, 224, 249, - 195, 208, 29, 224, 249, 195, 202, 29, 224, 249, 195, 203, 29, 224, 249, - 195, 204, 29, 224, 249, 195, 206, 29, 224, 249, 235, 245, 29, 224, 249, - 235, 247, 29, 224, 249, 196, 19, 29, 224, 249, 230, 132, 29, 224, 249, - 230, 124, 29, 224, 249, 230, 127, 29, 224, 249, 230, 125, 29, 224, 249, - 230, 129, 29, 224, 249, 230, 131, 29, 224, 249, 250, 110, 29, 224, 249, - 250, 107, 29, 224, 249, 250, 105, 29, 224, 249, 250, 106, 29, 224, 249, - 205, 40, 29, 224, 249, 255, 7, 29, 224, 249, 196, 126, 29, 224, 249, 196, - 49, 29, 224, 249, 214, 197, 29, 224, 249, 214, 196, 29, 112, 223, 198, - 29, 112, 205, 35, 29, 112, 223, 191, 29, 112, 216, 126, 29, 112, 216, - 124, 29, 112, 216, 123, 29, 112, 202, 69, 29, 112, 210, 6, 29, 112, 210, - 1, 29, 112, 209, 254, 29, 112, 209, 247, 29, 112, 209, 242, 29, 112, 209, - 237, 29, 112, 209, 248, 29, 112, 210, 4, 29, 112, 218, 221, 29, 112, 212, - 149, 29, 112, 212, 138, 29, 112, 206, 9, 29, 112, 205, 29, 29, 112, 226, - 31, 29, 112, 244, 126, 29, 112, 244, 191, 29, 112, 224, 14, 29, 112, 202, - 160, 29, 112, 212, 187, 29, 112, 231, 198, 29, 112, 223, 192, 29, 112, - 223, 190, 29, 112, 216, 122, 29, 112, 216, 116, 29, 112, 216, 118, 29, - 112, 216, 121, 29, 112, 216, 117, 29, 112, 202, 66, 29, 112, 202, 63, 29, - 112, 209, 255, 29, 112, 209, 250, 29, 112, 209, 236, 29, 112, 209, 235, - 29, 112, 205, 31, 29, 112, 209, 252, 29, 112, 209, 251, 29, 112, 209, - 244, 29, 112, 209, 246, 29, 112, 210, 3, 29, 112, 209, 239, 29, 112, 209, - 249, 29, 112, 210, 2, 29, 112, 209, 234, 29, 112, 218, 217, 29, 112, 218, - 212, 29, 112, 218, 214, 29, 112, 218, 211, 29, 112, 218, 209, 29, 112, - 218, 215, 29, 112, 218, 220, 29, 112, 218, 218, 29, 112, 224, 149, 29, - 112, 212, 140, 29, 112, 212, 141, 29, 112, 212, 146, 29, 112, 224, 147, - 29, 112, 206, 2, 29, 112, 205, 248, 29, 112, 205, 251, 29, 112, 205, 253, - 29, 112, 213, 113, 29, 112, 226, 26, 29, 112, 226, 19, 29, 112, 205, 36, - 29, 112, 226, 27, 29, 112, 196, 42, 29, 112, 196, 36, 29, 112, 196, 37, - 29, 112, 212, 185, 29, 112, 224, 148, 29, 112, 231, 196, 29, 112, 231, - 194, 29, 112, 231, 197, 29, 112, 231, 195, 29, 112, 196, 48, 29, 112, - 223, 194, 29, 112, 223, 193, 29, 112, 223, 197, 29, 112, 223, 195, 29, - 112, 223, 196, 29, 112, 205, 33, 34, 5, 142, 34, 5, 230, 219, 34, 5, 231, - 214, 34, 5, 232, 129, 34, 5, 232, 4, 34, 5, 232, 32, 34, 5, 231, 81, 34, - 5, 231, 72, 34, 5, 175, 34, 5, 221, 95, 34, 5, 222, 11, 34, 5, 222, 239, - 34, 5, 222, 90, 34, 5, 222, 99, 34, 5, 221, 166, 34, 5, 221, 63, 34, 5, - 231, 223, 34, 5, 231, 217, 34, 5, 231, 219, 34, 5, 231, 222, 34, 5, 231, - 220, 34, 5, 231, 221, 34, 5, 231, 218, 34, 5, 231, 216, 34, 5, 168, 34, - 5, 218, 56, 34, 5, 218, 243, 34, 5, 220, 23, 34, 5, 219, 97, 34, 5, 219, - 114, 34, 5, 218, 160, 34, 5, 217, 242, 34, 5, 203, 196, 34, 5, 203, 190, - 34, 5, 203, 192, 34, 5, 203, 195, 34, 5, 203, 193, 34, 5, 203, 194, 34, - 5, 203, 191, 34, 5, 203, 189, 34, 5, 173, 34, 5, 209, 95, 34, 5, 210, 23, - 34, 5, 210, 193, 34, 5, 210, 105, 34, 5, 210, 133, 34, 5, 209, 185, 34, - 5, 209, 53, 34, 5, 187, 34, 5, 204, 139, 34, 5, 206, 69, 34, 5, 208, 224, - 34, 5, 208, 85, 34, 5, 208, 103, 34, 5, 205, 162, 34, 5, 204, 34, 34, 5, - 207, 6, 34, 5, 206, 108, 34, 5, 206, 179, 34, 5, 207, 1, 34, 5, 206, 209, - 34, 5, 206, 211, 34, 5, 206, 154, 34, 5, 206, 87, 34, 5, 211, 108, 34, 5, - 211, 46, 34, 5, 211, 70, 34, 5, 211, 107, 34, 5, 211, 87, 34, 5, 211, 88, - 34, 5, 211, 58, 34, 5, 211, 57, 34, 5, 210, 255, 34, 5, 210, 251, 34, 5, - 210, 254, 34, 5, 210, 252, 34, 5, 210, 253, 34, 5, 211, 84, 34, 5, 211, - 76, 34, 5, 211, 79, 34, 5, 211, 83, 34, 5, 211, 80, 34, 5, 211, 81, 34, - 5, 211, 78, 34, 5, 211, 75, 34, 5, 211, 71, 34, 5, 211, 74, 34, 5, 211, - 72, 34, 5, 211, 73, 34, 5, 248, 252, 34, 5, 247, 138, 34, 5, 248, 41, 34, - 5, 248, 250, 34, 5, 248, 105, 34, 5, 248, 119, 34, 5, 247, 230, 34, 5, - 247, 86, 34, 5, 199, 137, 34, 5, 197, 209, 34, 5, 199, 23, 34, 5, 199, - 136, 34, 5, 199, 100, 34, 5, 199, 105, 34, 5, 198, 237, 34, 5, 197, 199, - 34, 5, 203, 137, 34, 5, 201, 20, 34, 5, 202, 94, 34, 5, 203, 130, 34, 5, - 203, 16, 34, 5, 203, 36, 34, 5, 147, 34, 5, 200, 225, 34, 5, 247, 36, 34, - 5, 240, 162, 34, 5, 244, 131, 34, 5, 247, 35, 34, 5, 246, 168, 34, 5, - 246, 176, 34, 5, 244, 46, 34, 5, 240, 121, 34, 5, 196, 202, 34, 5, 196, - 171, 34, 5, 196, 190, 34, 5, 196, 201, 34, 5, 196, 195, 34, 5, 196, 196, - 34, 5, 196, 179, 34, 5, 196, 178, 34, 5, 196, 165, 34, 5, 196, 161, 34, - 5, 196, 164, 34, 5, 196, 162, 34, 5, 196, 163, 34, 5, 179, 34, 5, 215, - 111, 34, 5, 216, 141, 34, 5, 217, 158, 34, 5, 217, 23, 34, 5, 217, 34, - 34, 5, 215, 225, 34, 5, 215, 43, 34, 5, 215, 34, 34, 5, 214, 249, 34, 5, - 215, 15, 34, 5, 215, 33, 34, 5, 215, 23, 34, 5, 215, 24, 34, 5, 215, 0, - 34, 5, 214, 239, 34, 5, 233, 34, 63, 34, 5, 233, 34, 66, 34, 5, 233, 34, - 68, 34, 5, 233, 34, 252, 10, 34, 5, 233, 34, 236, 184, 34, 5, 233, 34, - 70, 34, 5, 233, 34, 74, 34, 5, 233, 34, 197, 156, 34, 5, 157, 34, 5, 223, - 86, 34, 5, 223, 249, 34, 5, 224, 202, 34, 5, 224, 92, 34, 5, 224, 101, - 34, 5, 223, 165, 34, 5, 223, 160, 34, 5, 223, 37, 34, 5, 223, 30, 34, 5, - 223, 36, 34, 5, 223, 31, 34, 5, 223, 32, 34, 5, 223, 23, 34, 5, 223, 17, - 34, 5, 223, 19, 34, 5, 223, 22, 34, 5, 223, 20, 34, 5, 223, 21, 34, 5, - 223, 18, 34, 5, 223, 16, 34, 5, 223, 12, 34, 5, 223, 15, 34, 5, 223, 13, - 34, 5, 223, 14, 34, 5, 197, 156, 34, 5, 196, 237, 34, 5, 197, 64, 34, 5, - 197, 150, 34, 5, 197, 90, 34, 5, 197, 101, 34, 5, 197, 28, 34, 5, 197, - 20, 34, 5, 212, 196, 63, 34, 5, 212, 196, 66, 34, 5, 212, 196, 68, 34, 5, - 212, 196, 252, 10, 34, 5, 212, 196, 236, 184, 34, 5, 212, 196, 70, 34, 5, - 212, 196, 74, 34, 5, 195, 114, 34, 5, 194, 255, 34, 5, 195, 33, 34, 5, - 195, 112, 34, 5, 195, 85, 34, 5, 195, 88, 34, 5, 195, 11, 34, 5, 194, - 242, 34, 5, 195, 74, 34, 5, 195, 51, 34, 5, 195, 60, 34, 5, 195, 73, 34, - 5, 195, 64, 34, 5, 195, 65, 34, 5, 195, 57, 34, 5, 195, 42, 34, 5, 165, - 34, 5, 195, 215, 34, 5, 196, 20, 34, 5, 196, 124, 34, 5, 196, 62, 34, 5, - 196, 65, 34, 5, 196, 0, 34, 5, 195, 241, 34, 5, 240, 3, 34, 5, 237, 74, - 34, 5, 239, 20, 34, 5, 240, 2, 34, 5, 239, 105, 34, 5, 239, 119, 34, 5, - 238, 154, 34, 5, 237, 40, 34, 5, 239, 164, 34, 5, 239, 129, 34, 5, 239, - 141, 34, 5, 239, 163, 34, 5, 239, 151, 34, 5, 239, 152, 34, 5, 239, 134, - 34, 5, 239, 120, 34, 5, 225, 105, 34, 5, 225, 1, 34, 5, 225, 63, 34, 5, - 225, 104, 34, 5, 225, 82, 34, 5, 225, 84, 34, 5, 225, 20, 34, 5, 224, - 235, 34, 5, 234, 4, 34, 5, 232, 214, 34, 5, 233, 74, 34, 5, 234, 1, 34, - 5, 233, 178, 34, 5, 233, 186, 34, 5, 233, 26, 34, 5, 233, 25, 34, 5, 232, - 173, 34, 5, 232, 169, 34, 5, 232, 172, 34, 5, 232, 170, 34, 5, 232, 171, - 34, 5, 233, 148, 34, 5, 233, 128, 34, 5, 233, 138, 34, 5, 233, 147, 34, - 5, 233, 142, 34, 5, 233, 143, 34, 5, 233, 132, 34, 5, 233, 117, 34, 5, - 202, 202, 34, 5, 202, 114, 34, 5, 202, 164, 34, 5, 202, 201, 34, 5, 202, - 184, 34, 5, 202, 186, 34, 5, 202, 141, 34, 5, 202, 105, 34, 5, 246, 136, - 34, 5, 244, 150, 34, 5, 244, 195, 34, 5, 246, 135, 34, 5, 244, 219, 34, - 5, 244, 223, 34, 5, 244, 169, 34, 5, 244, 139, 34, 5, 212, 205, 34, 5, - 212, 169, 34, 5, 212, 189, 34, 5, 212, 204, 34, 5, 212, 191, 34, 5, 212, - 192, 34, 5, 212, 177, 34, 5, 212, 165, 34, 5, 201, 93, 34, 5, 201, 66, - 34, 5, 201, 72, 34, 5, 201, 92, 34, 5, 201, 86, 34, 5, 201, 87, 34, 5, - 201, 70, 34, 5, 201, 64, 34, 5, 200, 168, 34, 5, 200, 160, 34, 5, 200, - 164, 34, 5, 200, 167, 34, 5, 200, 165, 34, 5, 200, 166, 34, 5, 200, 162, - 34, 5, 200, 161, 34, 5, 235, 118, 34, 5, 234, 104, 34, 5, 235, 33, 34, 5, - 235, 117, 34, 5, 235, 62, 34, 5, 235, 69, 34, 5, 234, 188, 34, 5, 234, - 82, 34, 5, 163, 34, 5, 211, 175, 34, 5, 212, 163, 34, 5, 213, 179, 34, 5, - 213, 22, 34, 5, 213, 35, 34, 5, 212, 62, 34, 5, 211, 134, 34, 5, 209, 43, - 34, 5, 217, 231, 34, 5, 234, 76, 34, 37, 233, 174, 26, 18, 222, 60, 78, - 34, 37, 18, 222, 60, 78, 34, 37, 233, 174, 78, 34, 208, 89, 78, 34, 197, - 2, 34, 234, 98, 204, 193, 34, 244, 23, 34, 207, 61, 34, 244, 32, 34, 211, - 235, 244, 32, 34, 211, 28, 78, 34, 213, 94, 207, 46, 34, 17, 98, 34, 17, - 103, 34, 17, 135, 34, 17, 136, 34, 17, 150, 34, 17, 174, 34, 17, 182, 34, - 17, 178, 34, 17, 184, 34, 35, 202, 248, 34, 35, 200, 214, 34, 35, 202, - 147, 34, 35, 234, 151, 34, 35, 235, 25, 34, 35, 205, 228, 34, 35, 207, - 21, 34, 35, 236, 151, 34, 35, 216, 92, 34, 35, 230, 201, 34, 35, 202, - 249, 202, 130, 34, 5, 208, 94, 217, 242, 34, 5, 217, 238, 34, 5, 217, - 239, 34, 5, 217, 240, 34, 5, 208, 94, 247, 86, 34, 5, 247, 83, 34, 5, - 247, 84, 34, 5, 247, 85, 34, 5, 208, 94, 234, 82, 34, 5, 234, 78, 34, 5, - 234, 79, 34, 5, 234, 80, 34, 5, 208, 94, 211, 134, 34, 5, 211, 130, 34, - 5, 211, 131, 34, 5, 211, 132, 34, 201, 240, 113, 196, 3, 34, 201, 240, - 113, 239, 65, 34, 201, 240, 113, 209, 216, 34, 201, 240, 113, 206, 139, - 209, 216, 34, 201, 240, 113, 238, 250, 34, 201, 240, 113, 224, 73, 34, - 201, 240, 113, 244, 177, 34, 201, 240, 113, 231, 203, 34, 201, 240, 113, - 239, 64, 34, 201, 240, 113, 223, 51, 94, 1, 63, 94, 1, 70, 94, 1, 68, 94, - 1, 74, 94, 1, 66, 94, 1, 199, 215, 94, 1, 234, 4, 94, 1, 157, 94, 1, 233, - 186, 94, 1, 233, 74, 94, 1, 233, 26, 94, 1, 232, 214, 94, 1, 232, 175, - 94, 1, 142, 94, 1, 232, 32, 94, 1, 231, 214, 94, 1, 231, 81, 94, 1, 230, - 219, 94, 1, 230, 188, 94, 1, 175, 94, 1, 222, 99, 94, 1, 222, 11, 94, 1, - 221, 166, 94, 1, 221, 95, 94, 1, 221, 64, 94, 1, 168, 94, 1, 219, 114, - 94, 1, 218, 243, 94, 1, 218, 160, 94, 1, 218, 56, 94, 1, 179, 94, 1, 231, - 105, 94, 1, 217, 145, 94, 1, 217, 34, 94, 1, 216, 141, 94, 1, 215, 225, - 94, 1, 215, 111, 94, 1, 215, 45, 94, 1, 211, 45, 94, 1, 211, 31, 94, 1, - 211, 24, 94, 1, 211, 14, 94, 1, 211, 3, 94, 1, 211, 1, 94, 1, 187, 94, 1, - 209, 35, 94, 1, 208, 103, 94, 1, 206, 69, 94, 1, 205, 162, 94, 1, 204, - 139, 94, 1, 204, 39, 94, 1, 240, 3, 94, 1, 203, 137, 94, 1, 239, 119, 94, - 1, 203, 36, 94, 1, 239, 20, 94, 1, 202, 94, 94, 1, 238, 154, 94, 1, 237, - 74, 94, 1, 237, 43, 94, 1, 238, 166, 94, 1, 202, 19, 94, 1, 202, 18, 94, - 1, 202, 7, 94, 1, 202, 6, 94, 1, 202, 5, 94, 1, 202, 4, 94, 1, 201, 93, - 94, 1, 201, 87, 94, 1, 201, 72, 94, 1, 201, 70, 94, 1, 201, 66, 94, 1, - 201, 65, 94, 1, 197, 156, 94, 1, 197, 101, 94, 1, 197, 64, 94, 1, 197, - 28, 94, 1, 196, 237, 94, 1, 196, 224, 94, 1, 165, 94, 1, 196, 65, 94, 1, - 196, 20, 94, 1, 196, 0, 94, 1, 195, 215, 94, 1, 195, 175, 94, 1, 217, - 249, 94, 4, 1, 196, 65, 94, 4, 1, 196, 20, 94, 4, 1, 196, 0, 94, 4, 1, - 195, 215, 94, 4, 1, 195, 175, 94, 4, 1, 217, 249, 21, 22, 230, 151, 21, - 22, 70, 21, 22, 251, 230, 21, 22, 68, 21, 22, 226, 8, 21, 22, 74, 21, 22, - 214, 33, 21, 22, 196, 142, 214, 33, 21, 22, 91, 236, 184, 21, 22, 91, 68, - 21, 22, 63, 21, 22, 252, 10, 21, 22, 197, 101, 21, 22, 197, 79, 197, 101, - 21, 22, 197, 64, 21, 22, 197, 79, 197, 64, 21, 22, 197, 48, 21, 22, 197, - 79, 197, 48, 21, 22, 197, 28, 21, 22, 197, 79, 197, 28, 21, 22, 197, 9, - 21, 22, 197, 79, 197, 9, 21, 22, 217, 120, 197, 9, 21, 22, 197, 156, 21, - 22, 197, 79, 197, 156, 21, 22, 197, 150, 21, 22, 197, 79, 197, 150, 21, - 22, 217, 120, 197, 150, 21, 22, 251, 45, 21, 22, 196, 142, 197, 189, 21, - 22, 233, 34, 204, 193, 21, 22, 48, 180, 21, 22, 48, 232, 238, 21, 22, 48, - 247, 199, 155, 209, 210, 21, 22, 48, 201, 222, 155, 209, 210, 21, 22, 48, - 52, 155, 209, 210, 21, 22, 48, 209, 210, 21, 22, 48, 54, 180, 21, 22, 48, - 54, 206, 139, 83, 204, 150, 21, 22, 48, 108, 238, 123, 21, 22, 48, 206, - 139, 231, 43, 101, 21, 22, 48, 212, 70, 21, 22, 48, 133, 203, 115, 21, - 22, 236, 106, 21, 22, 225, 230, 21, 22, 214, 48, 21, 22, 250, 208, 21, - 22, 213, 35, 21, 22, 213, 177, 21, 22, 212, 163, 21, 22, 212, 125, 21, - 22, 212, 62, 21, 22, 212, 37, 21, 22, 196, 142, 212, 37, 21, 22, 91, 232, - 4, 21, 22, 91, 231, 214, 21, 22, 163, 21, 22, 213, 179, 21, 22, 211, 132, - 21, 22, 197, 79, 211, 132, 21, 22, 211, 130, 21, 22, 197, 79, 211, 130, - 21, 22, 211, 129, 21, 22, 197, 79, 211, 129, 21, 22, 211, 127, 21, 22, - 197, 79, 211, 127, 21, 22, 211, 126, 21, 22, 197, 79, 211, 126, 21, 22, - 211, 134, 21, 22, 197, 79, 211, 134, 21, 22, 211, 133, 21, 22, 197, 79, - 211, 133, 21, 22, 196, 142, 211, 133, 21, 22, 213, 195, 21, 22, 197, 79, - 213, 195, 21, 22, 91, 232, 154, 21, 22, 203, 36, 21, 22, 203, 128, 21, - 22, 202, 94, 21, 22, 202, 71, 21, 22, 147, 21, 22, 201, 226, 21, 22, 196, - 142, 201, 226, 21, 22, 91, 239, 105, 21, 22, 91, 239, 20, 21, 22, 203, - 137, 21, 22, 203, 130, 21, 22, 200, 223, 21, 22, 197, 79, 200, 223, 21, - 22, 200, 202, 21, 22, 197, 79, 200, 202, 21, 22, 200, 201, 21, 22, 197, - 79, 200, 201, 21, 22, 103, 21, 22, 197, 79, 103, 21, 22, 200, 192, 21, - 22, 197, 79, 200, 192, 21, 22, 200, 225, 21, 22, 197, 79, 200, 225, 21, - 22, 200, 224, 21, 22, 197, 79, 200, 224, 21, 22, 217, 120, 200, 224, 21, - 22, 203, 185, 21, 22, 201, 53, 21, 22, 201, 37, 21, 22, 201, 35, 21, 22, - 201, 58, 21, 22, 224, 101, 21, 22, 224, 197, 21, 22, 223, 249, 21, 22, - 223, 228, 21, 22, 223, 165, 21, 22, 223, 141, 21, 22, 196, 142, 223, 141, - 21, 22, 157, 21, 22, 224, 202, 21, 22, 223, 32, 21, 22, 197, 79, 223, 32, - 21, 22, 223, 30, 21, 22, 197, 79, 223, 30, 21, 22, 223, 29, 21, 22, 197, - 79, 223, 29, 21, 22, 223, 27, 21, 22, 197, 79, 223, 27, 21, 22, 223, 26, - 21, 22, 197, 79, 223, 26, 21, 22, 223, 37, 21, 22, 197, 79, 223, 37, 21, - 22, 223, 36, 21, 22, 197, 79, 223, 36, 21, 22, 217, 120, 223, 36, 21, 22, - 224, 227, 21, 22, 223, 38, 21, 22, 205, 120, 224, 85, 21, 22, 205, 120, - 223, 229, 21, 22, 205, 120, 223, 155, 21, 22, 205, 120, 224, 181, 21, 22, - 246, 176, 21, 22, 247, 34, 21, 22, 244, 131, 21, 22, 244, 121, 21, 22, - 244, 46, 21, 22, 240, 237, 21, 22, 196, 142, 240, 237, 21, 22, 247, 36, - 21, 22, 247, 35, 21, 22, 240, 119, 21, 22, 197, 79, 240, 119, 21, 22, - 240, 117, 21, 22, 197, 79, 240, 117, 21, 22, 240, 116, 21, 22, 197, 79, - 240, 116, 21, 22, 240, 115, 21, 22, 197, 79, 240, 115, 21, 22, 240, 114, - 21, 22, 197, 79, 240, 114, 21, 22, 240, 121, 21, 22, 197, 79, 240, 121, - 21, 22, 240, 120, 21, 22, 197, 79, 240, 120, 21, 22, 217, 120, 240, 120, - 21, 22, 247, 69, 21, 22, 208, 134, 202, 204, 21, 22, 219, 114, 21, 22, - 220, 22, 21, 22, 218, 243, 21, 22, 218, 205, 21, 22, 218, 160, 21, 22, - 218, 104, 21, 22, 196, 142, 218, 104, 21, 22, 168, 21, 22, 220, 23, 21, - 22, 217, 240, 21, 22, 197, 79, 217, 240, 21, 22, 217, 238, 21, 22, 197, - 79, 217, 238, 21, 22, 217, 237, 21, 22, 197, 79, 217, 237, 21, 22, 217, - 236, 21, 22, 197, 79, 217, 236, 21, 22, 217, 235, 21, 22, 197, 79, 217, - 235, 21, 22, 217, 242, 21, 22, 197, 79, 217, 242, 21, 22, 217, 241, 21, - 22, 197, 79, 217, 241, 21, 22, 217, 120, 217, 241, 21, 22, 221, 40, 21, - 22, 197, 79, 221, 40, 21, 22, 218, 247, 21, 22, 250, 16, 221, 40, 21, 22, - 208, 134, 221, 40, 21, 22, 217, 34, 21, 22, 217, 157, 21, 22, 216, 141, - 21, 22, 216, 108, 21, 22, 215, 225, 21, 22, 215, 208, 21, 22, 196, 142, - 215, 208, 21, 22, 179, 21, 22, 217, 158, 21, 22, 215, 41, 21, 22, 197, - 79, 215, 41, 21, 22, 215, 43, 21, 22, 197, 79, 215, 43, 21, 22, 215, 42, - 21, 22, 197, 79, 215, 42, 21, 22, 217, 120, 215, 42, 21, 22, 217, 225, - 21, 22, 91, 216, 246, 21, 22, 216, 146, 21, 22, 222, 99, 21, 22, 222, - 238, 21, 22, 222, 11, 21, 22, 221, 249, 21, 22, 221, 166, 21, 22, 221, - 133, 21, 22, 196, 142, 221, 133, 21, 22, 175, 21, 22, 222, 239, 21, 22, - 221, 61, 21, 22, 197, 79, 221, 61, 21, 22, 221, 60, 21, 22, 197, 79, 221, - 60, 21, 22, 221, 59, 21, 22, 197, 79, 221, 59, 21, 22, 221, 58, 21, 22, - 197, 79, 221, 58, 21, 22, 221, 57, 21, 22, 197, 79, 221, 57, 21, 22, 221, - 63, 21, 22, 197, 79, 221, 63, 21, 22, 221, 62, 21, 22, 197, 79, 221, 62, - 21, 22, 158, 21, 22, 197, 79, 158, 21, 22, 194, 194, 158, 21, 22, 208, - 103, 21, 22, 208, 222, 21, 22, 206, 69, 21, 22, 206, 41, 21, 22, 205, - 162, 21, 22, 205, 133, 21, 22, 196, 142, 205, 133, 21, 22, 187, 21, 22, - 208, 224, 21, 22, 204, 29, 21, 22, 197, 79, 204, 29, 21, 22, 204, 23, 21, - 22, 197, 79, 204, 23, 21, 22, 204, 22, 21, 22, 197, 79, 204, 22, 21, 22, - 204, 18, 21, 22, 197, 79, 204, 18, 21, 22, 204, 17, 21, 22, 197, 79, 204, - 17, 21, 22, 204, 34, 21, 22, 197, 79, 204, 34, 21, 22, 204, 33, 21, 22, - 197, 79, 204, 33, 21, 22, 217, 120, 204, 33, 21, 22, 209, 35, 21, 22, - 250, 16, 209, 35, 21, 22, 204, 35, 21, 22, 247, 247, 209, 35, 21, 22, - 218, 97, 205, 223, 21, 22, 217, 120, 205, 213, 21, 22, 217, 120, 209, 33, - 21, 22, 217, 120, 205, 59, 21, 22, 217, 120, 204, 142, 21, 22, 217, 120, - 205, 212, 21, 22, 217, 120, 208, 106, 21, 22, 206, 211, 21, 22, 206, 179, - 21, 22, 206, 174, 21, 22, 206, 154, 21, 22, 206, 147, 21, 22, 207, 6, 21, - 22, 207, 1, 21, 22, 206, 84, 21, 22, 197, 79, 206, 84, 21, 22, 206, 83, - 21, 22, 197, 79, 206, 83, 21, 22, 206, 82, 21, 22, 197, 79, 206, 82, 21, - 22, 206, 81, 21, 22, 197, 79, 206, 81, 21, 22, 206, 80, 21, 22, 197, 79, - 206, 80, 21, 22, 206, 87, 21, 22, 197, 79, 206, 87, 21, 22, 206, 86, 21, - 22, 197, 79, 206, 86, 21, 22, 207, 8, 21, 22, 196, 65, 21, 22, 196, 122, - 21, 22, 196, 20, 21, 22, 196, 11, 21, 22, 196, 0, 21, 22, 195, 235, 21, - 22, 196, 142, 195, 235, 21, 22, 165, 21, 22, 196, 124, 21, 22, 195, 172, - 21, 22, 197, 79, 195, 172, 21, 22, 195, 171, 21, 22, 197, 79, 195, 171, - 21, 22, 195, 170, 21, 22, 197, 79, 195, 170, 21, 22, 195, 169, 21, 22, - 197, 79, 195, 169, 21, 22, 195, 168, 21, 22, 197, 79, 195, 168, 21, 22, - 195, 174, 21, 22, 197, 79, 195, 174, 21, 22, 195, 173, 21, 22, 197, 79, - 195, 173, 21, 22, 217, 120, 195, 173, 21, 22, 196, 143, 21, 22, 248, 39, - 196, 143, 21, 22, 197, 79, 196, 143, 21, 22, 208, 134, 196, 20, 21, 22, - 210, 133, 21, 22, 210, 236, 210, 133, 21, 22, 197, 79, 222, 99, 21, 22, - 210, 192, 21, 22, 210, 23, 21, 22, 209, 217, 21, 22, 209, 185, 21, 22, - 209, 159, 21, 22, 197, 79, 221, 166, 21, 22, 173, 21, 22, 210, 193, 21, - 22, 197, 79, 175, 21, 22, 209, 52, 21, 22, 197, 79, 209, 52, 21, 22, 143, - 21, 22, 197, 79, 143, 21, 22, 194, 194, 143, 21, 22, 235, 69, 21, 22, - 235, 115, 21, 22, 235, 33, 21, 22, 235, 19, 21, 22, 234, 188, 21, 22, - 234, 177, 21, 22, 235, 118, 21, 22, 235, 117, 21, 22, 234, 81, 21, 22, - 197, 79, 234, 81, 21, 22, 235, 184, 21, 22, 202, 186, 21, 22, 217, 223, - 202, 186, 21, 22, 202, 164, 21, 22, 217, 223, 202, 164, 21, 22, 202, 158, - 21, 22, 217, 223, 202, 158, 21, 22, 202, 141, 21, 22, 202, 136, 21, 22, - 202, 202, 21, 22, 202, 201, 21, 22, 202, 104, 21, 22, 197, 79, 202, 104, - 21, 22, 202, 204, 21, 22, 201, 44, 21, 22, 201, 42, 21, 22, 201, 41, 21, - 22, 201, 46, 21, 22, 201, 47, 21, 22, 200, 186, 21, 22, 200, 185, 21, 22, - 200, 184, 21, 22, 200, 188, 21, 22, 215, 62, 232, 32, 21, 22, 215, 62, - 231, 214, 21, 22, 215, 62, 231, 186, 21, 22, 215, 62, 231, 81, 21, 22, - 215, 62, 231, 54, 21, 22, 215, 62, 142, 21, 22, 215, 62, 232, 129, 21, - 22, 215, 62, 232, 154, 21, 22, 215, 61, 232, 154, 21, 22, 231, 171, 21, - 22, 211, 104, 21, 22, 211, 70, 21, 22, 211, 64, 21, 22, 211, 58, 21, 22, - 211, 53, 21, 22, 211, 108, 21, 22, 211, 107, 21, 22, 211, 116, 21, 22, - 202, 15, 21, 22, 202, 13, 21, 22, 202, 12, 21, 22, 202, 16, 21, 22, 197, - 79, 210, 133, 21, 22, 197, 79, 210, 23, 21, 22, 197, 79, 209, 185, 21, - 22, 197, 79, 173, 21, 22, 216, 242, 21, 22, 216, 192, 21, 22, 216, 188, - 21, 22, 216, 169, 21, 22, 216, 164, 21, 22, 216, 244, 21, 22, 216, 243, - 21, 22, 216, 246, 21, 22, 215, 254, 21, 22, 208, 134, 206, 211, 21, 22, - 208, 134, 206, 179, 21, 22, 208, 134, 206, 154, 21, 22, 208, 134, 207, 6, - 21, 22, 197, 7, 202, 186, 21, 22, 197, 7, 202, 164, 21, 22, 197, 7, 202, - 141, 21, 22, 197, 7, 202, 202, 21, 22, 197, 7, 202, 204, 21, 22, 222, 18, - 21, 22, 222, 17, 21, 22, 222, 16, 21, 22, 222, 15, 21, 22, 222, 24, 21, - 22, 222, 23, 21, 22, 222, 25, 21, 22, 202, 203, 202, 186, 21, 22, 202, - 203, 202, 164, 21, 22, 202, 203, 202, 158, 21, 22, 202, 203, 202, 141, - 21, 22, 202, 203, 202, 136, 21, 22, 202, 203, 202, 202, 21, 22, 202, 203, - 202, 201, 21, 22, 202, 203, 202, 204, 21, 22, 251, 30, 249, 219, 21, 22, - 247, 247, 70, 21, 22, 247, 247, 68, 21, 22, 247, 247, 74, 21, 22, 247, - 247, 63, 21, 22, 247, 247, 197, 101, 21, 22, 247, 247, 197, 64, 21, 22, - 247, 247, 197, 28, 21, 22, 247, 247, 197, 156, 21, 22, 247, 247, 217, 34, - 21, 22, 247, 247, 216, 141, 21, 22, 247, 247, 215, 225, 21, 22, 247, 247, - 179, 21, 22, 247, 247, 224, 101, 21, 22, 247, 247, 223, 249, 21, 22, 247, - 247, 223, 165, 21, 22, 247, 247, 157, 21, 22, 208, 134, 232, 32, 21, 22, - 208, 134, 231, 214, 21, 22, 208, 134, 231, 81, 21, 22, 208, 134, 142, 21, - 22, 91, 233, 80, 21, 22, 91, 233, 84, 21, 22, 91, 233, 98, 21, 22, 91, - 233, 97, 21, 22, 91, 233, 86, 21, 22, 91, 233, 112, 21, 22, 91, 209, 95, - 21, 22, 91, 209, 185, 21, 22, 91, 210, 133, 21, 22, 91, 210, 105, 21, 22, - 91, 210, 23, 21, 22, 91, 173, 21, 22, 91, 196, 237, 21, 22, 91, 197, 28, - 21, 22, 91, 197, 101, 21, 22, 91, 197, 90, 21, 22, 91, 197, 64, 21, 22, - 91, 197, 156, 21, 22, 91, 230, 180, 21, 22, 91, 230, 181, 21, 22, 91, - 230, 184, 21, 22, 91, 230, 183, 21, 22, 91, 230, 182, 21, 22, 91, 230, - 187, 21, 22, 91, 202, 114, 21, 22, 91, 202, 141, 21, 22, 91, 202, 186, - 21, 22, 91, 202, 184, 21, 22, 91, 202, 164, 21, 22, 91, 202, 202, 21, 22, - 91, 201, 25, 21, 22, 91, 201, 35, 21, 22, 91, 201, 53, 21, 22, 91, 201, - 52, 21, 22, 91, 201, 37, 21, 22, 91, 201, 58, 21, 22, 91, 211, 175, 21, - 22, 91, 212, 62, 21, 22, 91, 213, 35, 21, 22, 91, 213, 22, 21, 22, 91, - 212, 163, 21, 22, 91, 163, 21, 22, 91, 213, 195, 21, 22, 91, 232, 214, - 21, 22, 91, 233, 26, 21, 22, 91, 233, 186, 21, 22, 91, 233, 178, 21, 22, - 91, 233, 74, 21, 22, 91, 234, 4, 21, 22, 91, 224, 2, 21, 22, 91, 224, 9, - 21, 22, 91, 224, 23, 21, 22, 91, 224, 22, 21, 22, 91, 224, 16, 21, 22, - 91, 224, 38, 21, 22, 91, 223, 181, 21, 22, 91, 223, 182, 21, 22, 91, 223, - 185, 21, 22, 91, 223, 184, 21, 22, 91, 223, 183, 21, 22, 91, 223, 186, - 21, 22, 91, 223, 187, 21, 22, 91, 215, 111, 21, 22, 91, 215, 225, 21, 22, - 91, 217, 34, 21, 22, 91, 217, 23, 21, 22, 91, 216, 141, 21, 22, 91, 179, - 21, 22, 91, 218, 56, 21, 22, 91, 218, 160, 21, 22, 91, 219, 114, 21, 22, - 91, 219, 97, 21, 22, 91, 218, 243, 21, 22, 91, 168, 21, 22, 91, 195, 215, - 21, 22, 91, 196, 0, 21, 22, 91, 196, 65, 21, 22, 91, 196, 62, 21, 22, 91, - 196, 20, 21, 22, 91, 165, 21, 22, 91, 225, 1, 21, 22, 208, 134, 225, 1, - 21, 22, 91, 225, 20, 21, 22, 91, 225, 84, 21, 22, 91, 225, 82, 21, 22, - 91, 225, 63, 21, 22, 208, 134, 225, 63, 21, 22, 91, 225, 105, 21, 22, 91, - 225, 34, 21, 22, 91, 225, 38, 21, 22, 91, 225, 48, 21, 22, 91, 225, 47, - 21, 22, 91, 225, 46, 21, 22, 91, 225, 49, 21, 22, 91, 221, 95, 21, 22, - 91, 221, 166, 21, 22, 91, 222, 99, 21, 22, 91, 222, 90, 21, 22, 91, 222, - 11, 21, 22, 91, 175, 21, 22, 91, 238, 159, 21, 22, 91, 238, 160, 21, 22, - 91, 238, 165, 21, 22, 91, 238, 164, 21, 22, 91, 238, 161, 21, 22, 91, - 238, 166, 21, 22, 91, 222, 14, 21, 22, 91, 222, 16, 21, 22, 91, 222, 20, - 21, 22, 91, 222, 19, 21, 22, 91, 222, 18, 21, 22, 91, 222, 24, 21, 22, - 91, 202, 10, 21, 22, 91, 202, 12, 21, 22, 91, 202, 15, 21, 22, 91, 202, - 14, 21, 22, 91, 202, 13, 21, 22, 91, 202, 16, 21, 22, 91, 202, 5, 21, 22, - 91, 202, 6, 21, 22, 91, 202, 18, 21, 22, 91, 202, 17, 21, 22, 91, 202, 7, - 21, 22, 91, 202, 19, 21, 22, 91, 194, 255, 21, 22, 91, 195, 11, 21, 22, - 91, 195, 88, 21, 22, 91, 195, 85, 21, 22, 91, 195, 33, 21, 22, 91, 195, - 114, 21, 22, 91, 195, 157, 21, 22, 91, 84, 195, 157, 21, 22, 91, 237, 16, - 21, 22, 91, 237, 17, 21, 22, 91, 237, 26, 21, 22, 91, 237, 25, 21, 22, - 91, 237, 20, 21, 22, 91, 237, 29, 21, 22, 91, 204, 139, 21, 22, 91, 205, - 162, 21, 22, 91, 208, 103, 21, 22, 91, 208, 85, 21, 22, 91, 206, 69, 21, - 22, 91, 187, 21, 22, 91, 206, 108, 21, 22, 91, 206, 154, 21, 22, 91, 206, - 211, 21, 22, 91, 206, 209, 21, 22, 91, 206, 179, 21, 22, 91, 207, 6, 21, - 22, 91, 207, 8, 21, 22, 91, 201, 66, 21, 22, 91, 201, 70, 21, 22, 91, - 201, 87, 21, 22, 91, 201, 86, 21, 22, 91, 201, 72, 21, 22, 91, 201, 93, - 21, 22, 91, 244, 150, 21, 22, 91, 244, 169, 21, 22, 91, 244, 223, 21, 22, - 91, 244, 219, 21, 22, 91, 244, 195, 21, 22, 91, 246, 136, 21, 22, 91, - 201, 28, 21, 22, 91, 201, 29, 21, 22, 91, 201, 32, 21, 22, 91, 201, 31, - 21, 22, 91, 201, 30, 21, 22, 91, 201, 33, 21, 22, 244, 196, 56, 21, 22, - 234, 98, 204, 193, 21, 22, 211, 100, 21, 22, 216, 240, 21, 22, 215, 251, - 21, 22, 215, 250, 21, 22, 215, 249, 21, 22, 215, 248, 21, 22, 215, 253, - 21, 22, 215, 252, 21, 22, 197, 7, 202, 102, 21, 22, 197, 7, 202, 101, 21, - 22, 197, 7, 202, 100, 21, 22, 197, 7, 202, 99, 21, 22, 197, 7, 202, 98, - 21, 22, 197, 7, 202, 105, 21, 22, 197, 7, 202, 104, 21, 22, 197, 7, 48, - 202, 204, 21, 22, 247, 247, 197, 189, 214, 82, 205, 111, 78, 214, 82, 1, - 248, 87, 214, 82, 1, 221, 81, 214, 82, 1, 235, 66, 214, 82, 1, 208, 206, - 214, 82, 1, 216, 90, 214, 82, 1, 200, 93, 214, 82, 1, 239, 232, 214, 82, - 1, 202, 43, 214, 82, 1, 244, 35, 214, 82, 1, 246, 163, 214, 82, 1, 218, - 39, 214, 82, 1, 233, 5, 214, 82, 1, 216, 230, 214, 82, 1, 204, 186, 214, - 82, 1, 209, 82, 214, 82, 1, 251, 42, 214, 82, 1, 214, 37, 214, 82, 1, - 200, 5, 214, 82, 1, 236, 210, 214, 82, 1, 225, 157, 214, 82, 1, 236, 211, - 214, 82, 1, 214, 3, 214, 82, 1, 200, 71, 214, 82, 1, 226, 14, 214, 82, 1, - 236, 208, 214, 82, 1, 213, 12, 214, 82, 235, 65, 78, 214, 82, 210, 40, - 235, 65, 78, 209, 71, 1, 235, 55, 235, 46, 235, 70, 235, 184, 209, 71, 1, - 199, 215, 209, 71, 1, 199, 246, 200, 6, 66, 209, 71, 1, 195, 218, 209, - 71, 1, 196, 143, 209, 71, 1, 197, 189, 209, 71, 1, 202, 107, 202, 106, - 202, 134, 209, 71, 1, 236, 0, 209, 71, 1, 250, 174, 63, 209, 71, 1, 213, - 242, 74, 209, 71, 1, 251, 126, 63, 209, 71, 1, 251, 74, 209, 71, 1, 221, - 140, 74, 209, 71, 1, 206, 132, 74, 209, 71, 1, 74, 209, 71, 1, 214, 91, - 209, 71, 1, 214, 48, 209, 71, 1, 210, 171, 210, 184, 210, 90, 143, 209, - 71, 1, 224, 117, 209, 71, 1, 246, 159, 209, 71, 1, 224, 118, 224, 227, - 209, 71, 1, 234, 71, 209, 71, 1, 236, 92, 209, 71, 1, 233, 181, 232, 160, - 234, 71, 209, 71, 1, 233, 220, 209, 71, 1, 196, 229, 196, 220, 197, 189, - 209, 71, 1, 232, 120, 232, 154, 209, 71, 1, 232, 124, 232, 154, 209, 71, - 1, 221, 142, 232, 154, 209, 71, 1, 206, 135, 232, 154, 209, 71, 1, 217, - 115, 215, 25, 217, 116, 217, 225, 209, 71, 1, 206, 133, 217, 225, 209, - 71, 1, 237, 117, 209, 71, 1, 225, 136, 225, 140, 225, 127, 68, 209, 71, - 1, 70, 209, 71, 1, 225, 74, 225, 108, 209, 71, 1, 233, 162, 209, 71, 1, - 221, 143, 251, 90, 209, 71, 1, 206, 137, 63, 209, 71, 1, 225, 119, 236, - 65, 209, 71, 1, 212, 224, 212, 249, 213, 195, 209, 71, 1, 251, 3, 236, - 63, 209, 71, 1, 205, 117, 209, 35, 209, 71, 1, 206, 45, 221, 139, 209, - 35, 209, 71, 1, 206, 131, 209, 35, 209, 71, 1, 247, 69, 209, 71, 1, 195, - 157, 209, 71, 1, 202, 24, 202, 36, 200, 170, 203, 185, 209, 71, 1, 206, - 130, 203, 185, 209, 71, 1, 240, 98, 209, 71, 1, 248, 66, 248, 69, 247, - 253, 249, 219, 209, 71, 1, 206, 136, 249, 219, 209, 71, 1, 237, 116, 209, - 71, 1, 214, 17, 209, 71, 1, 236, 164, 236, 171, 70, 209, 71, 1, 219, 211, - 219, 223, 221, 40, 209, 71, 1, 221, 141, 221, 40, 209, 71, 1, 206, 134, - 221, 40, 209, 71, 1, 222, 114, 222, 216, 221, 150, 158, 209, 71, 1, 237, - 118, 209, 71, 1, 225, 203, 209, 71, 1, 225, 204, 209, 71, 1, 239, 246, - 239, 252, 240, 98, 209, 71, 1, 213, 235, 235, 255, 74, 209, 71, 1, 236, - 206, 209, 71, 1, 225, 156, 209, 71, 1, 240, 118, 209, 71, 1, 247, 19, - 209, 71, 1, 246, 175, 209, 71, 1, 204, 232, 209, 71, 1, 221, 138, 209, - 71, 1, 206, 129, 209, 71, 1, 230, 88, 209, 71, 1, 211, 116, 209, 71, 1, - 196, 216, 209, 71, 206, 19, 211, 162, 209, 71, 218, 32, 211, 162, 209, - 71, 240, 183, 211, 162, 209, 71, 250, 81, 102, 209, 71, 200, 227, 102, - 209, 71, 248, 85, 102, 209, 71, 1, 224, 227, 209, 71, 1, 207, 8, 209, 71, - 1, 214, 33, 209, 71, 1, 234, 128, 246, 214, 213, 241, 209, 71, 1, 234, - 128, 246, 214, 225, 139, 209, 71, 1, 234, 128, 246, 214, 236, 170, 209, - 71, 1, 234, 128, 246, 214, 251, 125, 209, 71, 1, 234, 128, 246, 214, 251, - 74, 203, 110, 1, 63, 203, 110, 1, 68, 203, 110, 1, 66, 203, 110, 1, 157, - 203, 110, 1, 234, 4, 203, 110, 1, 216, 244, 203, 110, 1, 203, 137, 203, - 110, 1, 240, 3, 203, 110, 1, 179, 203, 110, 1, 163, 203, 110, 1, 248, - 252, 203, 110, 1, 168, 203, 110, 1, 165, 203, 110, 1, 175, 203, 110, 1, - 197, 156, 203, 110, 1, 187, 203, 110, 1, 142, 203, 110, 18, 2, 68, 203, - 110, 18, 2, 66, 203, 110, 2, 198, 252, 232, 64, 1, 63, 232, 64, 1, 68, - 232, 64, 1, 66, 232, 64, 1, 157, 232, 64, 1, 234, 4, 232, 64, 1, 216, - 244, 232, 64, 1, 203, 137, 232, 64, 1, 240, 3, 232, 64, 1, 179, 232, 64, - 1, 163, 232, 64, 1, 248, 252, 232, 64, 1, 168, 232, 64, 1, 165, 232, 64, - 1, 173, 232, 64, 1, 175, 232, 64, 1, 197, 156, 232, 64, 1, 187, 232, 64, - 1, 142, 232, 64, 18, 2, 68, 232, 64, 18, 2, 66, 232, 64, 2, 213, 132, - 212, 182, 206, 19, 211, 162, 212, 182, 54, 211, 162, 247, 130, 1, 63, - 247, 130, 1, 68, 247, 130, 1, 66, 247, 130, 1, 157, 247, 130, 1, 234, 4, - 247, 130, 1, 216, 244, 247, 130, 1, 203, 137, 247, 130, 1, 240, 3, 247, - 130, 1, 179, 247, 130, 1, 163, 247, 130, 1, 248, 252, 247, 130, 1, 168, - 247, 130, 1, 165, 247, 130, 1, 173, 247, 130, 1, 175, 247, 130, 1, 197, - 156, 247, 130, 1, 187, 247, 130, 1, 142, 247, 130, 18, 2, 68, 247, 130, - 18, 2, 66, 203, 109, 1, 63, 203, 109, 1, 68, 203, 109, 1, 66, 203, 109, - 1, 157, 203, 109, 1, 234, 4, 203, 109, 1, 216, 244, 203, 109, 1, 203, - 137, 203, 109, 1, 240, 3, 203, 109, 1, 179, 203, 109, 1, 163, 203, 109, - 1, 248, 252, 203, 109, 1, 168, 203, 109, 1, 165, 203, 109, 1, 175, 203, - 109, 1, 197, 156, 203, 109, 1, 187, 203, 109, 18, 2, 68, 203, 109, 18, 2, - 66, 88, 1, 157, 88, 1, 224, 38, 88, 1, 223, 165, 88, 1, 224, 9, 88, 1, - 216, 169, 88, 1, 247, 36, 88, 1, 246, 136, 88, 1, 244, 46, 88, 1, 244, - 169, 88, 1, 215, 0, 88, 1, 240, 3, 88, 1, 201, 46, 88, 1, 238, 154, 88, - 1, 201, 41, 88, 1, 215, 231, 88, 1, 203, 137, 88, 1, 202, 202, 88, 1, - 147, 88, 1, 202, 141, 88, 1, 215, 225, 88, 1, 248, 252, 88, 1, 212, 205, - 88, 1, 212, 62, 88, 1, 212, 177, 88, 1, 218, 160, 88, 1, 196, 0, 88, 1, - 209, 185, 88, 1, 221, 166, 88, 1, 198, 237, 88, 1, 207, 6, 88, 1, 205, 2, - 88, 1, 187, 88, 1, 142, 88, 1, 175, 88, 1, 211, 108, 88, 225, 217, 18, - 211, 94, 88, 225, 217, 18, 211, 107, 88, 225, 217, 18, 211, 70, 88, 225, - 217, 18, 211, 64, 88, 225, 217, 18, 211, 46, 88, 225, 217, 18, 211, 15, - 88, 225, 217, 18, 211, 3, 88, 225, 217, 18, 211, 2, 88, 225, 217, 18, - 209, 44, 88, 225, 217, 18, 209, 37, 88, 225, 217, 18, 221, 55, 88, 225, - 217, 18, 221, 43, 88, 225, 217, 18, 211, 88, 88, 225, 217, 18, 211, 100, - 88, 225, 217, 18, 211, 54, 200, 183, 98, 88, 225, 217, 18, 211, 54, 200, - 183, 103, 88, 225, 217, 18, 211, 90, 88, 18, 225, 201, 250, 122, 88, 18, - 225, 201, 252, 10, 88, 18, 2, 252, 10, 88, 18, 2, 68, 88, 18, 2, 226, 8, - 88, 18, 2, 196, 143, 88, 18, 2, 195, 167, 88, 18, 2, 66, 88, 18, 2, 199, - 229, 88, 18, 2, 200, 96, 88, 18, 2, 214, 91, 88, 18, 2, 165, 88, 18, 2, - 226, 35, 88, 18, 2, 70, 88, 18, 2, 251, 90, 88, 18, 2, 251, 45, 88, 18, - 2, 214, 33, 88, 18, 2, 250, 0, 88, 2, 216, 106, 88, 2, 210, 127, 88, 2, - 195, 178, 88, 2, 217, 252, 88, 2, 201, 148, 88, 2, 248, 192, 88, 2, 209, - 174, 88, 2, 201, 249, 88, 2, 224, 172, 88, 2, 251, 47, 88, 2, 208, 175, - 208, 167, 88, 2, 198, 249, 88, 2, 244, 38, 88, 2, 248, 162, 88, 2, 224, - 30, 88, 2, 248, 187, 88, 2, 247, 7, 212, 126, 223, 43, 88, 2, 222, 67, - 201, 226, 88, 2, 248, 55, 88, 2, 212, 179, 218, 49, 88, 2, 223, 139, 88, - 240, 140, 16, 210, 8, 88, 2, 249, 238, 88, 2, 250, 3, 88, 17, 195, 79, - 88, 17, 98, 88, 17, 103, 88, 17, 135, 88, 17, 136, 88, 17, 150, 88, 17, - 174, 88, 17, 182, 88, 17, 178, 88, 17, 184, 88, 16, 222, 67, 250, 5, 205, - 136, 88, 16, 222, 67, 250, 5, 218, 16, 88, 16, 222, 67, 250, 5, 212, 125, - 88, 16, 222, 67, 250, 5, 248, 88, 88, 16, 222, 67, 250, 5, 247, 110, 88, - 16, 222, 67, 250, 5, 211, 252, 88, 16, 222, 67, 250, 5, 211, 246, 88, 16, - 222, 67, 250, 5, 211, 244, 88, 16, 222, 67, 250, 5, 211, 250, 88, 16, - 222, 67, 250, 5, 211, 248, 95, 248, 11, 95, 236, 122, 95, 244, 23, 95, - 234, 98, 204, 193, 95, 244, 32, 95, 234, 145, 238, 120, 95, 201, 248, - 205, 148, 230, 151, 95, 206, 61, 5, 247, 195, 219, 185, 95, 219, 219, - 244, 23, 95, 219, 219, 234, 98, 204, 193, 95, 216, 88, 95, 234, 127, 60, - 208, 71, 98, 95, 234, 127, 60, 208, 71, 103, 95, 234, 127, 60, 208, 71, - 135, 95, 18, 207, 46, 95, 17, 195, 79, 95, 17, 98, 95, 17, 103, 95, 17, - 135, 95, 17, 136, 95, 17, 150, 95, 17, 174, 95, 17, 182, 95, 17, 178, 95, - 17, 184, 95, 1, 63, 95, 1, 70, 95, 1, 68, 95, 1, 74, 95, 1, 66, 95, 1, - 214, 91, 95, 1, 200, 81, 95, 1, 236, 184, 95, 1, 179, 95, 1, 250, 199, - 95, 1, 248, 252, 95, 1, 163, 95, 1, 211, 108, 95, 1, 234, 4, 95, 1, 168, - 95, 1, 175, 95, 1, 187, 95, 1, 207, 6, 95, 1, 203, 137, 95, 1, 240, 3, - 95, 1, 246, 136, 95, 1, 225, 105, 95, 1, 165, 95, 1, 173, 95, 1, 197, - 156, 95, 1, 235, 118, 95, 1, 157, 95, 1, 224, 38, 95, 1, 201, 93, 95, 1, - 195, 114, 95, 1, 232, 129, 95, 1, 195, 3, 95, 1, 222, 24, 95, 1, 195, 60, - 95, 1, 244, 195, 95, 1, 201, 248, 172, 18, 56, 95, 1, 201, 248, 70, 95, - 1, 201, 248, 68, 95, 1, 201, 248, 74, 95, 1, 201, 248, 66, 95, 1, 201, - 248, 214, 91, 95, 1, 201, 248, 200, 81, 95, 1, 201, 248, 250, 199, 95, 1, - 201, 248, 248, 252, 95, 1, 201, 248, 163, 95, 1, 201, 248, 211, 108, 95, - 1, 201, 248, 234, 4, 95, 1, 201, 248, 168, 95, 1, 201, 248, 203, 137, 95, - 1, 201, 248, 240, 3, 95, 1, 201, 248, 246, 136, 95, 1, 201, 248, 225, - 105, 95, 1, 201, 248, 201, 93, 95, 1, 201, 248, 165, 95, 1, 201, 248, - 197, 156, 95, 1, 201, 248, 157, 95, 1, 201, 248, 234, 1, 95, 1, 201, 248, - 232, 129, 95, 1, 201, 248, 225, 62, 95, 1, 201, 248, 216, 131, 95, 1, - 201, 248, 237, 29, 95, 1, 206, 61, 70, 95, 1, 206, 61, 68, 95, 1, 206, - 61, 225, 116, 95, 1, 206, 61, 200, 81, 95, 1, 206, 61, 66, 95, 1, 206, - 61, 250, 199, 95, 1, 206, 61, 157, 95, 1, 206, 61, 234, 4, 95, 1, 206, - 61, 142, 95, 1, 206, 61, 163, 95, 1, 206, 61, 207, 6, 95, 1, 206, 61, - 203, 137, 95, 1, 206, 61, 240, 3, 95, 1, 206, 61, 225, 105, 95, 1, 206, - 61, 235, 118, 95, 1, 206, 61, 234, 1, 95, 1, 206, 61, 232, 129, 95, 1, - 206, 61, 201, 93, 95, 1, 206, 61, 195, 114, 95, 1, 206, 61, 210, 193, 95, - 1, 206, 61, 246, 136, 95, 1, 206, 61, 195, 74, 95, 1, 219, 219, 68, 95, - 1, 219, 219, 157, 95, 1, 219, 219, 173, 95, 1, 219, 219, 235, 118, 95, 1, - 219, 219, 195, 74, 95, 1, 246, 137, 3, 114, 238, 120, 95, 1, 251, 2, 233, - 240, 250, 156, 98, 95, 1, 251, 2, 233, 240, 198, 248, 98, 95, 1, 251, 2, - 233, 240, 239, 220, 95, 1, 251, 2, 233, 240, 200, 91, 95, 1, 251, 2, 233, - 240, 225, 163, 200, 91, 95, 1, 251, 2, 233, 240, 248, 204, 95, 1, 251, 2, - 233, 240, 122, 248, 204, 95, 1, 251, 2, 233, 240, 63, 95, 1, 251, 2, 233, - 240, 68, 95, 1, 251, 2, 233, 240, 157, 95, 1, 251, 2, 233, 240, 216, 244, - 95, 1, 251, 2, 233, 240, 247, 36, 95, 1, 251, 2, 233, 240, 201, 58, 95, - 1, 251, 2, 233, 240, 201, 46, 95, 1, 251, 2, 233, 240, 239, 164, 95, 1, - 251, 2, 233, 240, 216, 5, 95, 1, 251, 2, 233, 240, 203, 137, 95, 1, 251, - 2, 233, 240, 240, 3, 95, 1, 251, 2, 233, 240, 163, 95, 1, 251, 2, 233, - 240, 212, 205, 95, 1, 251, 2, 233, 240, 205, 43, 95, 1, 251, 2, 233, 240, - 195, 74, 95, 1, 251, 2, 233, 240, 195, 114, 95, 1, 251, 2, 233, 240, 251, - 54, 95, 1, 201, 248, 251, 2, 233, 240, 203, 137, 95, 1, 201, 248, 251, 2, - 233, 240, 195, 74, 95, 1, 219, 219, 251, 2, 233, 240, 233, 112, 95, 1, - 219, 219, 251, 2, 233, 240, 216, 244, 95, 1, 219, 219, 251, 2, 233, 240, - 247, 36, 95, 1, 219, 219, 251, 2, 233, 240, 225, 71, 95, 1, 219, 219, - 251, 2, 233, 240, 201, 58, 95, 1, 219, 219, 251, 2, 233, 240, 239, 148, - 95, 1, 219, 219, 251, 2, 233, 240, 203, 137, 95, 1, 219, 219, 251, 2, - 233, 240, 239, 44, 95, 1, 219, 219, 251, 2, 233, 240, 205, 43, 95, 1, - 219, 219, 251, 2, 233, 240, 240, 112, 95, 1, 219, 219, 251, 2, 233, 240, - 195, 74, 95, 1, 219, 219, 251, 2, 233, 240, 195, 114, 95, 1, 251, 2, 233, - 240, 155, 66, 95, 1, 251, 2, 233, 240, 155, 165, 95, 1, 219, 219, 251, 2, - 233, 240, 248, 53, 95, 1, 251, 2, 233, 240, 239, 247, 95, 1, 219, 219, - 251, 2, 233, 240, 222, 24, 21, 22, 213, 199, 21, 22, 249, 229, 21, 22, - 251, 221, 21, 22, 197, 104, 21, 22, 212, 2, 21, 22, 213, 44, 21, 22, 211, - 125, 21, 22, 203, 45, 21, 22, 224, 108, 21, 22, 223, 34, 21, 22, 219, - 158, 21, 22, 215, 176, 21, 22, 217, 110, 21, 22, 222, 109, 21, 22, 205, - 115, 21, 22, 208, 136, 21, 22, 206, 117, 21, 22, 206, 215, 21, 22, 206, - 79, 21, 22, 195, 224, 21, 22, 196, 71, 21, 22, 210, 140, 21, 22, 215, 40, - 21, 22, 214, 70, 215, 40, 21, 22, 215, 39, 21, 22, 214, 70, 215, 39, 21, - 22, 215, 38, 21, 22, 214, 70, 215, 38, 21, 22, 215, 37, 21, 22, 214, 70, - 215, 37, 21, 22, 209, 49, 21, 22, 209, 48, 21, 22, 209, 47, 21, 22, 209, - 46, 21, 22, 209, 45, 21, 22, 209, 53, 21, 22, 214, 70, 213, 195, 21, 22, - 214, 70, 203, 185, 21, 22, 214, 70, 224, 227, 21, 22, 214, 70, 247, 69, - 21, 22, 214, 70, 221, 40, 21, 22, 214, 70, 217, 225, 21, 22, 214, 70, - 209, 35, 21, 22, 214, 70, 207, 8, 21, 22, 236, 197, 197, 189, 21, 22, - 197, 78, 197, 189, 21, 22, 48, 4, 209, 210, 21, 22, 48, 210, 164, 238, - 123, 21, 22, 210, 236, 209, 50, 21, 22, 197, 79, 221, 133, 21, 22, 197, - 79, 222, 239, 21, 22, 202, 103, 21, 22, 202, 105, 21, 22, 201, 38, 21, - 22, 201, 40, 21, 22, 201, 45, 21, 22, 202, 9, 21, 22, 202, 11, 21, 22, - 208, 134, 206, 84, 21, 22, 208, 134, 206, 147, 21, 22, 208, 134, 231, 54, - 21, 22, 91, 232, 168, 21, 22, 91, 239, 78, 233, 178, 21, 22, 91, 234, 1, - 21, 22, 91, 232, 173, 21, 22, 208, 134, 224, 237, 21, 22, 91, 224, 235, - 21, 22, 248, 108, 239, 78, 158, 21, 22, 248, 108, 239, 78, 143, 21, 22, - 91, 239, 73, 209, 35, 221, 243, 198, 215, 222, 37, 221, 243, 1, 157, 221, - 243, 1, 224, 38, 221, 243, 1, 234, 4, 221, 243, 1, 233, 112, 221, 243, 1, - 216, 244, 221, 243, 1, 247, 36, 221, 243, 1, 246, 136, 221, 243, 1, 225, - 105, 221, 243, 1, 225, 71, 221, 243, 1, 196, 92, 221, 243, 1, 203, 137, - 221, 243, 1, 202, 202, 221, 243, 1, 240, 3, 221, 243, 1, 239, 44, 221, - 243, 1, 179, 221, 243, 1, 163, 221, 243, 1, 212, 205, 221, 243, 1, 248, - 252, 221, 243, 1, 248, 53, 221, 243, 1, 168, 221, 243, 1, 165, 221, 243, - 1, 173, 221, 243, 1, 175, 221, 243, 1, 197, 156, 221, 243, 1, 207, 6, - 221, 243, 1, 205, 43, 221, 243, 1, 187, 221, 243, 1, 142, 221, 243, 1, - 232, 164, 221, 243, 1, 201, 196, 221, 243, 18, 2, 63, 221, 243, 18, 2, - 68, 221, 243, 18, 2, 66, 221, 243, 18, 2, 236, 184, 221, 243, 18, 2, 251, - 45, 221, 243, 18, 2, 214, 33, 221, 243, 18, 2, 250, 0, 221, 243, 18, 2, - 70, 221, 243, 18, 2, 74, 221, 243, 204, 119, 1, 165, 221, 243, 204, 119, - 1, 173, 221, 243, 204, 119, 1, 197, 156, 221, 243, 4, 1, 157, 221, 243, - 4, 1, 216, 244, 221, 243, 4, 1, 250, 155, 221, 243, 4, 1, 203, 137, 221, - 243, 4, 1, 179, 221, 243, 4, 1, 163, 221, 243, 4, 1, 168, 221, 243, 4, 1, - 173, 221, 243, 4, 1, 175, 221, 243, 2, 218, 37, 221, 243, 2, 224, 80, - 221, 243, 2, 208, 225, 221, 243, 2, 221, 133, 221, 243, 235, 225, 78, - 221, 243, 211, 28, 78, 221, 243, 17, 195, 79, 221, 243, 17, 98, 221, 243, - 17, 103, 221, 243, 17, 135, 221, 243, 17, 136, 221, 243, 17, 150, 221, - 243, 17, 174, 221, 243, 17, 182, 221, 243, 17, 178, 221, 243, 17, 184, - 49, 222, 100, 1, 157, 49, 222, 100, 1, 196, 202, 49, 222, 100, 1, 216, - 244, 49, 222, 100, 1, 201, 93, 49, 222, 100, 1, 187, 49, 222, 100, 1, - 165, 49, 222, 100, 1, 203, 137, 49, 222, 100, 1, 202, 202, 49, 222, 100, - 1, 175, 49, 222, 100, 1, 163, 49, 222, 100, 1, 212, 205, 49, 222, 100, 1, - 168, 49, 222, 100, 1, 235, 118, 49, 222, 100, 1, 199, 137, 49, 222, 100, - 1, 142, 49, 222, 100, 1, 211, 108, 49, 222, 100, 1, 224, 38, 49, 222, - 100, 1, 201, 83, 49, 222, 100, 1, 179, 49, 222, 100, 1, 63, 49, 222, 100, - 1, 68, 49, 222, 100, 1, 236, 184, 49, 222, 100, 1, 236, 170, 49, 222, - 100, 1, 66, 49, 222, 100, 1, 214, 33, 49, 222, 100, 1, 74, 49, 222, 100, - 1, 200, 81, 49, 222, 100, 1, 70, 49, 222, 100, 1, 249, 254, 49, 222, 100, - 1, 251, 45, 49, 222, 100, 1, 201, 237, 49, 222, 100, 1, 201, 236, 49, - 222, 100, 1, 201, 235, 49, 222, 100, 1, 201, 234, 49, 222, 100, 1, 201, - 233, 217, 0, 49, 221, 89, 1, 128, 211, 108, 217, 0, 49, 221, 89, 1, 125, - 211, 108, 217, 0, 49, 221, 89, 1, 128, 157, 217, 0, 49, 221, 89, 1, 128, - 196, 202, 217, 0, 49, 221, 89, 1, 128, 216, 244, 217, 0, 49, 221, 89, 1, - 125, 157, 217, 0, 49, 221, 89, 1, 125, 196, 202, 217, 0, 49, 221, 89, 1, - 125, 216, 244, 217, 0, 49, 221, 89, 1, 128, 201, 93, 217, 0, 49, 221, 89, - 1, 128, 187, 217, 0, 49, 221, 89, 1, 128, 165, 217, 0, 49, 221, 89, 1, - 125, 201, 93, 217, 0, 49, 221, 89, 1, 125, 187, 217, 0, 49, 221, 89, 1, - 125, 165, 217, 0, 49, 221, 89, 1, 128, 203, 137, 217, 0, 49, 221, 89, 1, - 128, 202, 202, 217, 0, 49, 221, 89, 1, 128, 179, 217, 0, 49, 221, 89, 1, - 125, 203, 137, 217, 0, 49, 221, 89, 1, 125, 202, 202, 217, 0, 49, 221, - 89, 1, 125, 179, 217, 0, 49, 221, 89, 1, 128, 163, 217, 0, 49, 221, 89, - 1, 128, 212, 205, 217, 0, 49, 221, 89, 1, 128, 168, 217, 0, 49, 221, 89, - 1, 125, 163, 217, 0, 49, 221, 89, 1, 125, 212, 205, 217, 0, 49, 221, 89, - 1, 125, 168, 217, 0, 49, 221, 89, 1, 128, 235, 118, 217, 0, 49, 221, 89, - 1, 128, 199, 137, 217, 0, 49, 221, 89, 1, 128, 175, 217, 0, 49, 221, 89, - 1, 125, 235, 118, 217, 0, 49, 221, 89, 1, 125, 199, 137, 217, 0, 49, 221, - 89, 1, 125, 175, 217, 0, 49, 221, 89, 1, 128, 142, 217, 0, 49, 221, 89, - 1, 128, 240, 3, 217, 0, 49, 221, 89, 1, 128, 248, 252, 217, 0, 49, 221, - 89, 1, 125, 142, 217, 0, 49, 221, 89, 1, 125, 240, 3, 217, 0, 49, 221, - 89, 1, 125, 248, 252, 217, 0, 49, 221, 89, 1, 128, 223, 39, 217, 0, 49, - 221, 89, 1, 128, 196, 168, 217, 0, 49, 221, 89, 1, 125, 223, 39, 217, 0, - 49, 221, 89, 1, 125, 196, 168, 217, 0, 49, 221, 89, 1, 128, 204, 130, - 217, 0, 49, 221, 89, 1, 125, 204, 130, 217, 0, 49, 221, 89, 18, 2, 18, - 206, 127, 217, 0, 49, 221, 89, 18, 2, 252, 10, 217, 0, 49, 221, 89, 18, - 2, 226, 8, 217, 0, 49, 221, 89, 18, 2, 66, 217, 0, 49, 221, 89, 18, 2, - 199, 229, 217, 0, 49, 221, 89, 18, 2, 70, 217, 0, 49, 221, 89, 18, 2, - 251, 90, 217, 0, 49, 221, 89, 18, 2, 74, 217, 0, 49, 221, 89, 18, 2, 214, - 117, 217, 0, 49, 221, 89, 18, 2, 200, 81, 217, 0, 49, 221, 89, 18, 2, - 249, 229, 217, 0, 49, 221, 89, 18, 2, 251, 221, 217, 0, 49, 221, 89, 18, - 2, 199, 221, 217, 0, 49, 221, 89, 18, 2, 213, 199, 217, 0, 49, 221, 89, - 18, 2, 214, 114, 217, 0, 49, 221, 89, 18, 2, 200, 77, 217, 0, 49, 221, - 89, 18, 2, 225, 116, 217, 0, 49, 221, 89, 1, 48, 199, 215, 217, 0, 49, - 221, 89, 1, 48, 216, 246, 217, 0, 49, 221, 89, 1, 48, 217, 225, 217, 0, - 49, 221, 89, 1, 48, 221, 40, 217, 0, 49, 221, 89, 1, 48, 224, 227, 217, - 0, 49, 221, 89, 1, 48, 240, 98, 217, 0, 49, 221, 89, 1, 48, 249, 219, - 217, 0, 49, 221, 89, 154, 219, 189, 217, 0, 49, 221, 89, 154, 219, 188, - 217, 0, 49, 221, 89, 17, 195, 79, 217, 0, 49, 221, 89, 17, 98, 217, 0, - 49, 221, 89, 17, 103, 217, 0, 49, 221, 89, 17, 135, 217, 0, 49, 221, 89, - 17, 136, 217, 0, 49, 221, 89, 17, 150, 217, 0, 49, 221, 89, 17, 174, 217, - 0, 49, 221, 89, 17, 182, 217, 0, 49, 221, 89, 17, 178, 217, 0, 49, 221, - 89, 17, 184, 217, 0, 49, 221, 89, 117, 17, 98, 217, 0, 49, 221, 89, 2, - 222, 222, 217, 0, 49, 221, 89, 2, 222, 221, 88, 16, 213, 52, 88, 16, 218, - 17, 223, 157, 88, 16, 212, 126, 223, 157, 88, 16, 248, 89, 223, 157, 88, - 16, 247, 111, 223, 157, 88, 16, 211, 253, 223, 157, 88, 16, 211, 247, - 223, 157, 88, 16, 211, 245, 223, 157, 88, 16, 211, 251, 223, 157, 88, 16, - 211, 249, 223, 157, 88, 16, 239, 205, 223, 157, 88, 16, 239, 201, 223, - 157, 88, 16, 239, 200, 223, 157, 88, 16, 239, 203, 223, 157, 88, 16, 239, - 202, 223, 157, 88, 16, 239, 199, 223, 157, 88, 16, 200, 233, 88, 16, 218, - 17, 209, 172, 88, 16, 212, 126, 209, 172, 88, 16, 248, 89, 209, 172, 88, - 16, 247, 111, 209, 172, 88, 16, 211, 253, 209, 172, 88, 16, 211, 247, - 209, 172, 88, 16, 211, 245, 209, 172, 88, 16, 211, 251, 209, 172, 88, 16, - 211, 249, 209, 172, 88, 16, 239, 205, 209, 172, 88, 16, 239, 201, 209, - 172, 88, 16, 239, 200, 209, 172, 88, 16, 239, 203, 209, 172, 88, 16, 239, - 202, 209, 172, 88, 16, 239, 199, 209, 172, 247, 131, 1, 157, 247, 131, 1, - 234, 4, 247, 131, 1, 216, 244, 247, 131, 1, 216, 187, 247, 131, 1, 163, - 247, 131, 1, 248, 252, 247, 131, 1, 168, 247, 131, 1, 218, 61, 247, 131, - 1, 203, 137, 247, 131, 1, 240, 3, 247, 131, 1, 179, 247, 131, 1, 215, - 174, 247, 131, 1, 247, 36, 247, 131, 1, 225, 105, 247, 131, 1, 215, 34, - 247, 131, 1, 215, 26, 247, 131, 1, 165, 247, 131, 1, 173, 247, 131, 1, - 175, 247, 131, 1, 199, 137, 247, 131, 1, 187, 247, 131, 1, 63, 247, 131, - 1, 142, 247, 131, 18, 2, 68, 247, 131, 18, 2, 66, 247, 131, 18, 2, 70, - 247, 131, 18, 2, 74, 247, 131, 18, 2, 251, 90, 247, 131, 213, 146, 247, - 131, 236, 98, 77, 208, 88, 49, 117, 1, 128, 157, 49, 117, 1, 128, 224, - 38, 49, 117, 1, 128, 223, 23, 49, 117, 1, 125, 157, 49, 117, 1, 125, 223, - 23, 49, 117, 1, 125, 224, 38, 49, 117, 1, 216, 244, 49, 117, 1, 128, 247, - 36, 49, 117, 1, 128, 246, 136, 49, 117, 1, 125, 247, 36, 49, 117, 1, 125, - 187, 49, 117, 1, 125, 246, 136, 49, 117, 1, 215, 34, 49, 117, 1, 210, - 146, 49, 117, 1, 128, 210, 144, 49, 117, 1, 240, 3, 49, 117, 1, 125, 210, - 144, 49, 117, 1, 210, 155, 49, 117, 1, 128, 203, 137, 49, 117, 1, 128, - 202, 202, 49, 117, 1, 125, 203, 137, 49, 117, 1, 125, 202, 202, 49, 117, - 1, 179, 49, 117, 1, 248, 252, 49, 117, 1, 128, 163, 49, 117, 1, 128, 212, - 205, 49, 117, 1, 128, 235, 118, 49, 117, 1, 125, 163, 49, 117, 1, 125, - 235, 118, 49, 117, 1, 125, 212, 205, 49, 117, 1, 168, 49, 117, 1, 125, - 165, 49, 117, 1, 128, 165, 49, 117, 1, 173, 49, 117, 1, 209, 84, 49, 117, - 1, 175, 49, 117, 1, 221, 88, 49, 117, 1, 197, 156, 49, 117, 1, 128, 207, - 6, 49, 117, 1, 128, 205, 43, 49, 117, 1, 128, 187, 49, 117, 1, 128, 142, - 49, 117, 1, 221, 195, 49, 117, 1, 63, 49, 117, 1, 125, 142, 49, 117, 1, - 68, 49, 117, 1, 226, 8, 49, 117, 1, 66, 49, 117, 1, 199, 229, 49, 117, 1, - 236, 184, 49, 117, 1, 214, 33, 49, 117, 1, 222, 222, 49, 117, 1, 232, - 234, 187, 49, 117, 105, 2, 194, 194, 173, 49, 117, 105, 2, 194, 194, 175, - 49, 117, 105, 2, 222, 240, 203, 79, 222, 211, 49, 117, 2, 219, 242, 224, - 162, 222, 211, 49, 117, 105, 2, 48, 216, 244, 49, 117, 105, 2, 125, 163, - 49, 117, 105, 2, 128, 210, 145, 214, 4, 125, 163, 49, 117, 105, 2, 168, - 49, 117, 105, 2, 248, 252, 49, 117, 105, 2, 187, 49, 117, 2, 208, 199, - 49, 117, 18, 2, 63, 49, 117, 18, 2, 219, 242, 208, 155, 49, 117, 18, 2, - 252, 10, 49, 117, 18, 2, 203, 88, 252, 10, 49, 117, 18, 2, 68, 49, 117, - 18, 2, 226, 8, 49, 117, 18, 2, 200, 81, 49, 117, 18, 2, 199, 228, 49, - 117, 18, 2, 66, 49, 117, 18, 2, 199, 229, 49, 117, 18, 2, 74, 49, 117, - 18, 2, 214, 118, 58, 49, 117, 18, 2, 213, 199, 49, 117, 18, 2, 70, 49, - 117, 18, 2, 251, 90, 49, 117, 18, 2, 214, 33, 49, 117, 18, 2, 251, 45, - 49, 117, 18, 2, 117, 251, 45, 49, 117, 18, 2, 214, 118, 57, 49, 117, 2, - 219, 242, 224, 161, 49, 117, 2, 201, 238, 49, 117, 2, 201, 237, 49, 117, - 2, 223, 254, 201, 236, 49, 117, 2, 223, 254, 201, 235, 49, 117, 2, 223, - 254, 201, 234, 49, 117, 2, 210, 201, 232, 128, 49, 117, 2, 219, 242, 208, - 184, 49, 117, 2, 223, 253, 224, 142, 49, 117, 37, 240, 165, 238, 123, 49, - 117, 231, 45, 17, 195, 79, 49, 117, 231, 45, 17, 98, 49, 117, 231, 45, - 17, 103, 49, 117, 231, 45, 17, 135, 49, 117, 231, 45, 17, 136, 49, 117, - 231, 45, 17, 150, 49, 117, 231, 45, 17, 174, 49, 117, 231, 45, 17, 182, - 49, 117, 231, 45, 17, 178, 49, 117, 231, 45, 17, 184, 49, 117, 117, 17, - 195, 79, 49, 117, 117, 17, 98, 49, 117, 117, 17, 103, 49, 117, 117, 17, - 135, 49, 117, 117, 17, 136, 49, 117, 117, 17, 150, 49, 117, 117, 17, 174, - 49, 117, 117, 17, 182, 49, 117, 117, 17, 178, 49, 117, 117, 17, 184, 49, - 117, 2, 197, 58, 49, 117, 2, 197, 57, 49, 117, 2, 208, 140, 49, 117, 2, - 224, 69, 49, 117, 2, 230, 229, 49, 117, 2, 238, 138, 49, 117, 2, 210, 40, - 209, 148, 210, 155, 49, 117, 2, 219, 242, 196, 93, 49, 117, 2, 224, 196, - 49, 117, 2, 224, 195, 49, 117, 2, 208, 150, 49, 117, 2, 208, 149, 49, - 117, 2, 232, 67, 49, 117, 2, 247, 33, 37, 237, 111, 244, 105, 251, 122, - 37, 239, 17, 37, 225, 207, 37, 237, 103, 51, 37, 201, 145, 238, 123, 37, - 196, 215, 58, 37, 197, 50, 221, 234, 58, 37, 185, 113, 58, 37, 54, 185, - 113, 58, 37, 167, 246, 157, 204, 163, 58, 37, 204, 149, 246, 157, 204, - 163, 58, 37, 213, 82, 57, 37, 54, 213, 82, 57, 37, 213, 82, 58, 37, 213, - 82, 213, 211, 140, 2, 200, 65, 210, 10, 140, 2, 200, 65, 246, 253, 140, - 2, 246, 172, 140, 2, 204, 53, 140, 2, 248, 8, 140, 1, 251, 25, 140, 1, - 251, 26, 203, 18, 140, 1, 226, 4, 140, 1, 226, 5, 203, 18, 140, 1, 200, - 68, 140, 1, 200, 69, 203, 18, 140, 1, 210, 201, 210, 73, 140, 1, 210, - 201, 210, 74, 203, 18, 140, 1, 222, 240, 222, 61, 140, 1, 222, 240, 222, - 62, 203, 18, 140, 1, 236, 143, 140, 1, 251, 43, 140, 1, 214, 66, 140, 1, - 214, 67, 203, 18, 140, 1, 157, 140, 1, 224, 217, 219, 245, 140, 1, 234, - 4, 140, 1, 234, 5, 233, 11, 140, 1, 216, 244, 140, 1, 247, 36, 140, 1, - 247, 37, 222, 226, 140, 1, 225, 105, 140, 1, 225, 106, 225, 75, 140, 1, - 215, 34, 140, 1, 203, 138, 222, 119, 140, 1, 203, 138, 218, 12, 219, 245, - 140, 1, 240, 4, 218, 12, 250, 238, 140, 1, 240, 4, 218, 12, 219, 245, - 140, 1, 217, 171, 210, 158, 140, 1, 203, 137, 140, 1, 203, 138, 203, 49, - 140, 1, 240, 3, 140, 1, 240, 4, 220, 10, 140, 1, 179, 140, 1, 163, 140, - 1, 213, 180, 224, 154, 140, 1, 248, 252, 140, 1, 248, 253, 224, 81, 140, - 1, 168, 140, 1, 165, 140, 1, 173, 140, 1, 175, 140, 1, 197, 156, 140, 1, - 208, 234, 208, 211, 140, 1, 208, 234, 208, 162, 140, 1, 187, 140, 1, 142, - 140, 2, 210, 63, 140, 18, 2, 203, 18, 140, 18, 2, 200, 64, 140, 18, 2, - 200, 65, 208, 158, 140, 18, 2, 204, 88, 140, 18, 2, 204, 89, 225, 252, - 140, 18, 2, 210, 201, 210, 73, 140, 18, 2, 210, 201, 210, 74, 203, 18, - 140, 18, 2, 222, 240, 222, 61, 140, 18, 2, 222, 240, 222, 62, 203, 18, - 140, 18, 2, 203, 89, 140, 18, 2, 203, 90, 210, 73, 140, 18, 2, 203, 90, - 203, 18, 140, 18, 2, 203, 90, 210, 74, 203, 18, 140, 18, 2, 212, 247, - 140, 18, 2, 212, 248, 203, 18, 140, 251, 101, 251, 100, 140, 1, 224, 184, - 208, 157, 140, 1, 224, 4, 208, 157, 140, 1, 200, 163, 208, 157, 140, 1, - 236, 178, 208, 157, 140, 1, 199, 106, 208, 157, 140, 1, 195, 104, 208, - 157, 140, 1, 250, 21, 208, 157, 140, 17, 195, 79, 140, 17, 98, 140, 17, - 103, 140, 17, 135, 140, 17, 136, 140, 17, 150, 140, 17, 174, 140, 17, - 182, 140, 17, 178, 140, 17, 184, 140, 213, 110, 140, 213, 138, 140, 197, - 42, 140, 246, 227, 213, 131, 140, 246, 227, 206, 38, 140, 246, 227, 213, - 79, 140, 213, 137, 140, 33, 16, 238, 130, 140, 33, 16, 239, 77, 140, 33, - 16, 237, 57, 140, 33, 16, 239, 209, 140, 33, 16, 239, 210, 204, 53, 140, - 33, 16, 238, 218, 140, 33, 16, 239, 251, 140, 33, 16, 239, 53, 140, 33, - 16, 239, 233, 140, 33, 16, 239, 210, 233, 180, 140, 33, 16, 37, 203, 11, - 140, 33, 16, 37, 236, 96, 140, 33, 16, 37, 224, 76, 140, 33, 16, 37, 224, - 78, 140, 33, 16, 37, 225, 79, 140, 33, 16, 37, 224, 77, 3, 225, 79, 140, - 33, 16, 37, 224, 79, 3, 225, 79, 140, 33, 16, 37, 248, 74, 140, 33, 16, - 37, 233, 15, 140, 33, 16, 209, 228, 185, 237, 68, 140, 33, 16, 209, 228, - 185, 239, 249, 140, 33, 16, 209, 228, 244, 67, 201, 6, 140, 33, 16, 209, - 228, 244, 67, 203, 99, 140, 33, 16, 222, 84, 185, 213, 124, 140, 33, 16, - 222, 84, 185, 211, 160, 140, 33, 16, 222, 84, 244, 67, 212, 89, 140, 33, - 16, 222, 84, 244, 67, 212, 74, 140, 33, 16, 222, 84, 185, 212, 115, 204, - 77, 2, 213, 107, 204, 77, 2, 213, 120, 204, 77, 2, 213, 116, 204, 77, 1, - 63, 204, 77, 1, 68, 204, 77, 1, 66, 204, 77, 1, 251, 90, 204, 77, 1, 74, - 204, 77, 1, 70, 204, 77, 1, 235, 251, 204, 77, 1, 157, 204, 77, 1, 211, - 108, 204, 77, 1, 234, 4, 204, 77, 1, 216, 244, 204, 77, 1, 247, 36, 204, - 77, 1, 225, 105, 204, 77, 1, 195, 114, 204, 77, 1, 215, 34, 204, 77, 1, - 203, 137, 204, 77, 1, 240, 3, 204, 77, 1, 179, 204, 77, 1, 163, 204, 77, - 1, 235, 118, 204, 77, 1, 199, 137, 204, 77, 1, 248, 252, 204, 77, 1, 168, - 204, 77, 1, 165, 204, 77, 1, 173, 204, 77, 1, 175, 204, 77, 1, 197, 156, - 204, 77, 1, 187, 204, 77, 1, 196, 202, 204, 77, 1, 142, 204, 77, 105, 2, - 213, 135, 204, 77, 105, 2, 213, 109, 204, 77, 105, 2, 213, 106, 204, 77, - 18, 2, 213, 123, 204, 77, 18, 2, 213, 105, 204, 77, 18, 2, 213, 128, 204, - 77, 18, 2, 213, 115, 204, 77, 18, 2, 213, 136, 204, 77, 18, 2, 213, 125, - 204, 77, 2, 213, 139, 204, 77, 2, 198, 252, 204, 77, 105, 2, 213, 67, - 168, 204, 77, 105, 2, 213, 67, 197, 156, 204, 77, 1, 224, 38, 204, 77, 1, - 204, 11, 204, 77, 17, 195, 79, 204, 77, 17, 98, 204, 77, 17, 103, 204, - 77, 17, 135, 204, 77, 17, 136, 204, 77, 17, 150, 204, 77, 17, 174, 204, - 77, 17, 182, 204, 77, 17, 178, 204, 77, 17, 184, 204, 77, 249, 239, 204, - 77, 1, 210, 43, 204, 77, 1, 222, 34, 204, 77, 1, 248, 53, 204, 77, 1, 48, - 224, 227, 204, 77, 1, 48, 221, 40, 248, 165, 1, 63, 248, 165, 1, 206, 30, - 63, 248, 165, 1, 142, 248, 165, 1, 206, 30, 142, 248, 165, 1, 219, 217, - 142, 248, 165, 1, 248, 252, 248, 165, 1, 224, 139, 248, 252, 248, 165, 1, - 163, 248, 165, 1, 206, 30, 163, 248, 165, 1, 179, 248, 165, 1, 219, 217, - 179, 248, 165, 1, 197, 156, 248, 165, 1, 206, 30, 197, 156, 248, 165, 1, - 213, 153, 197, 156, 248, 165, 1, 234, 4, 248, 165, 1, 206, 30, 234, 4, - 248, 165, 1, 225, 105, 248, 165, 1, 240, 3, 248, 165, 1, 173, 248, 165, - 1, 206, 30, 173, 248, 165, 1, 168, 248, 165, 1, 206, 30, 168, 248, 165, - 1, 205, 119, 203, 137, 248, 165, 1, 215, 198, 203, 137, 248, 165, 1, 187, - 248, 165, 1, 206, 30, 187, 248, 165, 1, 219, 217, 187, 248, 165, 1, 165, - 248, 165, 1, 206, 30, 165, 248, 165, 1, 216, 244, 248, 165, 1, 175, 248, - 165, 1, 206, 30, 175, 248, 165, 1, 215, 34, 248, 165, 1, 247, 36, 248, - 165, 1, 217, 75, 248, 165, 1, 219, 148, 248, 165, 1, 68, 248, 165, 1, 66, - 248, 165, 2, 201, 242, 248, 165, 18, 2, 70, 248, 165, 18, 2, 213, 153, - 70, 248, 165, 18, 2, 236, 184, 248, 165, 18, 2, 68, 248, 165, 18, 2, 224, - 139, 68, 248, 165, 18, 2, 74, 248, 165, 18, 2, 224, 139, 74, 248, 165, - 18, 2, 66, 248, 165, 18, 2, 115, 38, 206, 30, 187, 248, 165, 105, 2, 216, - 246, 248, 165, 105, 2, 232, 154, 248, 165, 213, 118, 248, 165, 213, 114, - 248, 165, 16, 248, 18, 217, 171, 219, 50, 248, 165, 16, 248, 18, 212, - 118, 248, 165, 16, 248, 18, 224, 254, 248, 165, 16, 248, 18, 213, 118, - 222, 45, 1, 157, 222, 45, 1, 223, 179, 222, 45, 1, 224, 38, 222, 45, 1, - 234, 4, 222, 45, 1, 233, 42, 222, 45, 1, 216, 244, 222, 45, 1, 247, 36, - 222, 45, 1, 246, 136, 222, 45, 1, 225, 105, 222, 45, 1, 215, 34, 222, 45, - 1, 203, 137, 222, 45, 1, 202, 202, 222, 45, 1, 240, 3, 222, 45, 1, 179, - 222, 45, 1, 163, 222, 45, 1, 212, 94, 222, 45, 1, 212, 205, 222, 45, 1, - 235, 118, 222, 45, 1, 234, 231, 222, 45, 1, 248, 252, 222, 45, 1, 247, - 251, 222, 45, 1, 168, 222, 45, 1, 218, 167, 222, 45, 1, 201, 93, 222, 45, - 1, 201, 83, 222, 45, 1, 237, 29, 222, 45, 1, 165, 222, 45, 1, 173, 222, - 45, 1, 175, 222, 45, 1, 142, 222, 45, 1, 231, 169, 222, 45, 1, 199, 137, - 222, 45, 1, 187, 222, 45, 1, 207, 6, 222, 45, 1, 197, 156, 222, 45, 1, - 63, 222, 45, 204, 119, 1, 165, 222, 45, 204, 119, 1, 173, 222, 45, 18, 2, - 252, 10, 222, 45, 18, 2, 68, 222, 45, 18, 2, 74, 222, 45, 18, 2, 214, 33, - 222, 45, 18, 2, 66, 222, 45, 18, 2, 199, 229, 222, 45, 18, 2, 70, 222, - 45, 105, 2, 224, 227, 222, 45, 105, 2, 221, 40, 222, 45, 105, 2, 158, - 222, 45, 105, 2, 217, 225, 222, 45, 105, 2, 213, 195, 222, 45, 105, 2, - 143, 222, 45, 105, 2, 203, 185, 222, 45, 105, 2, 215, 8, 222, 45, 105, 2, - 224, 161, 222, 45, 2, 210, 156, 222, 45, 2, 215, 74, 222, 45, 211, 163, - 203, 132, 222, 45, 211, 163, 215, 19, 202, 97, 203, 132, 222, 45, 211, - 163, 246, 144, 222, 45, 211, 163, 201, 75, 246, 144, 222, 45, 211, 163, - 201, 74, 222, 45, 17, 195, 79, 222, 45, 17, 98, 222, 45, 17, 103, 222, - 45, 17, 135, 222, 45, 17, 136, 222, 45, 17, 150, 222, 45, 17, 174, 222, - 45, 17, 182, 222, 45, 17, 178, 222, 45, 17, 184, 222, 45, 1, 201, 58, - 222, 45, 1, 201, 46, 222, 45, 1, 239, 164, 214, 64, 244, 188, 17, 195, - 79, 214, 64, 244, 188, 17, 98, 214, 64, 244, 188, 17, 103, 214, 64, 244, - 188, 17, 135, 214, 64, 244, 188, 17, 136, 214, 64, 244, 188, 17, 150, - 214, 64, 244, 188, 17, 174, 214, 64, 244, 188, 17, 182, 214, 64, 244, - 188, 17, 178, 214, 64, 244, 188, 17, 184, 214, 64, 244, 188, 1, 175, 214, - 64, 244, 188, 1, 250, 18, 214, 64, 244, 188, 1, 251, 62, 214, 64, 244, - 188, 1, 250, 199, 214, 64, 244, 188, 1, 251, 19, 214, 64, 244, 188, 1, - 222, 239, 214, 64, 244, 188, 1, 251, 228, 214, 64, 244, 188, 1, 251, 229, - 214, 64, 244, 188, 1, 251, 227, 214, 64, 244, 188, 1, 251, 222, 214, 64, - 244, 188, 1, 222, 11, 214, 64, 244, 188, 1, 225, 139, 214, 64, 244, 188, - 1, 226, 9, 214, 64, 244, 188, 1, 225, 160, 214, 64, 244, 188, 1, 225, - 148, 214, 64, 244, 188, 1, 221, 95, 214, 64, 244, 188, 1, 200, 88, 214, - 64, 244, 188, 1, 200, 86, 214, 64, 244, 188, 1, 200, 25, 214, 64, 244, - 188, 1, 199, 221, 214, 64, 244, 188, 1, 222, 99, 214, 64, 244, 188, 1, - 236, 60, 214, 64, 244, 188, 1, 236, 187, 214, 64, 244, 188, 1, 236, 106, - 214, 64, 244, 188, 1, 236, 34, 214, 64, 244, 188, 1, 221, 166, 214, 64, - 244, 188, 1, 213, 232, 214, 64, 244, 188, 1, 214, 113, 214, 64, 244, 188, - 1, 213, 219, 214, 64, 244, 188, 1, 214, 78, 214, 64, 244, 188, 218, 57, - 201, 23, 214, 64, 244, 188, 233, 255, 201, 24, 214, 64, 244, 188, 218, - 51, 201, 24, 214, 64, 244, 188, 210, 88, 214, 64, 244, 188, 212, 203, - 214, 64, 244, 188, 251, 53, 214, 64, 244, 188, 211, 163, 218, 47, 214, - 64, 244, 188, 211, 163, 54, 218, 47, 40, 4, 1, 209, 139, 199, 105, 40, 4, - 1, 221, 137, 239, 119, 40, 4, 1, 217, 125, 74, 40, 4, 1, 197, 56, 236, - 30, 40, 4, 1, 203, 88, 203, 36, 40, 4, 1, 202, 122, 203, 36, 40, 4, 1, - 203, 88, 232, 58, 56, 40, 4, 1, 203, 88, 196, 79, 40, 4, 1, 200, 50, 200, - 70, 93, 218, 58, 6, 1, 250, 208, 93, 218, 58, 6, 1, 248, 201, 93, 218, - 58, 6, 1, 233, 230, 93, 218, 58, 6, 1, 238, 132, 93, 218, 58, 6, 1, 236, - 106, 93, 218, 58, 6, 1, 199, 5, 93, 218, 58, 6, 1, 195, 82, 93, 218, 58, - 6, 1, 203, 82, 93, 218, 58, 6, 1, 225, 230, 93, 218, 58, 6, 1, 224, 165, - 93, 218, 58, 6, 1, 222, 124, 93, 218, 58, 6, 1, 219, 222, 93, 218, 58, 6, - 1, 217, 126, 93, 218, 58, 6, 1, 214, 48, 93, 218, 58, 6, 1, 213, 96, 93, - 218, 58, 6, 1, 195, 70, 93, 218, 58, 6, 1, 210, 178, 93, 218, 58, 6, 1, - 208, 174, 93, 218, 58, 6, 1, 203, 69, 93, 218, 58, 6, 1, 200, 55, 93, - 218, 58, 6, 1, 212, 197, 93, 218, 58, 6, 1, 224, 26, 93, 218, 58, 6, 1, - 233, 103, 93, 218, 58, 6, 1, 211, 93, 93, 218, 58, 6, 1, 206, 167, 93, - 218, 58, 6, 1, 244, 182, 93, 218, 58, 6, 1, 247, 4, 93, 218, 58, 6, 1, - 225, 53, 93, 218, 58, 6, 1, 244, 120, 93, 218, 58, 6, 1, 246, 120, 93, - 218, 58, 6, 1, 196, 200, 93, 218, 58, 6, 1, 225, 68, 93, 218, 58, 6, 1, - 232, 125, 93, 218, 58, 6, 1, 232, 32, 93, 218, 58, 6, 1, 231, 201, 93, - 218, 58, 6, 1, 197, 101, 93, 218, 58, 6, 1, 232, 60, 93, 218, 58, 6, 1, - 231, 69, 93, 218, 58, 6, 1, 235, 33, 93, 218, 58, 6, 1, 196, 2, 93, 218, - 58, 6, 1, 236, 124, 93, 218, 58, 6, 1, 200, 240, 233, 230, 93, 218, 58, - 6, 1, 251, 40, 93, 218, 58, 6, 1, 251, 79, 93, 218, 58, 6, 1, 232, 58, - 56, 93, 218, 58, 6, 1, 222, 230, 56, 204, 77, 211, 163, 248, 18, 204, 46, - 204, 77, 211, 163, 248, 18, 213, 119, 204, 77, 211, 163, 248, 18, 211, - 150, 204, 77, 211, 163, 248, 18, 247, 21, 204, 77, 211, 163, 248, 18, - 222, 35, 208, 154, 204, 77, 211, 163, 248, 18, 224, 217, 208, 154, 204, - 77, 211, 163, 248, 18, 240, 4, 208, 154, 204, 77, 211, 163, 248, 18, 248, - 253, 208, 154, 199, 102, 154, 224, 135, 199, 102, 154, 206, 228, 199, - 102, 154, 211, 232, 199, 102, 2, 216, 109, 199, 102, 2, 196, 101, 218, - 226, 204, 37, 199, 102, 154, 196, 101, 251, 58, 225, 217, 204, 37, 199, - 102, 154, 196, 101, 225, 217, 204, 37, 199, 102, 154, 196, 101, 224, 123, - 225, 217, 204, 37, 199, 102, 154, 246, 254, 58, 199, 102, 154, 196, 101, - 224, 123, 225, 217, 204, 38, 208, 121, 199, 102, 154, 54, 204, 37, 199, - 102, 154, 201, 145, 204, 37, 199, 102, 154, 224, 123, 250, 157, 199, 102, - 154, 76, 58, 199, 102, 154, 114, 238, 121, 58, 199, 102, 154, 122, 238, - 121, 58, 199, 102, 154, 209, 218, 224, 134, 225, 217, 204, 37, 199, 102, - 154, 250, 15, 225, 217, 204, 37, 199, 102, 2, 198, 248, 204, 37, 199, - 102, 2, 198, 248, 200, 83, 199, 102, 2, 210, 40, 198, 248, 200, 83, 199, - 102, 2, 198, 248, 250, 157, 199, 102, 2, 210, 40, 198, 248, 250, 157, - 199, 102, 2, 198, 248, 200, 84, 3, 203, 103, 199, 102, 2, 198, 248, 250, - 158, 3, 203, 103, 199, 102, 2, 250, 156, 250, 172, 199, 102, 2, 250, 156, - 248, 219, 199, 102, 2, 250, 156, 199, 128, 199, 102, 2, 250, 156, 199, - 129, 3, 203, 103, 199, 102, 2, 202, 30, 199, 102, 2, 231, 226, 172, 250, - 155, 199, 102, 2, 172, 250, 155, 199, 102, 2, 209, 97, 172, 250, 155, - 199, 102, 2, 250, 156, 200, 90, 218, 38, 199, 102, 2, 250, 95, 199, 102, - 2, 209, 148, 250, 95, 199, 102, 154, 246, 254, 57, 199, 102, 2, 225, 56, - 199, 102, 2, 200, 18, 199, 102, 2, 250, 13, 199, 102, 154, 209, 211, 57, - 199, 102, 154, 54, 209, 211, 57, 8, 1, 4, 6, 63, 8, 1, 4, 6, 251, 90, 8, - 4, 1, 200, 240, 251, 90, 8, 1, 4, 6, 248, 184, 249, 219, 8, 1, 4, 6, 247, - 69, 8, 1, 4, 6, 240, 98, 8, 1, 4, 6, 236, 0, 8, 1, 4, 6, 70, 8, 4, 1, - 200, 240, 185, 70, 8, 4, 1, 200, 240, 68, 8, 1, 4, 6, 225, 108, 8, 1, 4, - 6, 224, 227, 8, 1, 4, 6, 223, 1, 3, 101, 8, 1, 4, 6, 221, 40, 8, 1, 4, 6, - 210, 40, 217, 225, 8, 1, 4, 6, 74, 8, 1, 4, 6, 185, 74, 8, 4, 1, 206, 53, - 74, 8, 4, 1, 206, 53, 185, 74, 8, 4, 1, 206, 53, 169, 3, 101, 8, 4, 1, - 200, 240, 214, 91, 8, 1, 4, 6, 213, 229, 8, 4, 1, 201, 222, 155, 74, 8, - 4, 1, 247, 199, 155, 74, 8, 1, 4, 6, 213, 195, 8, 1, 4, 6, 210, 40, 143, - 8, 1, 4, 6, 200, 240, 143, 8, 1, 4, 6, 203, 185, 8, 1, 4, 6, 66, 8, 4, 1, - 206, 53, 66, 8, 4, 1, 206, 53, 239, 16, 66, 8, 4, 1, 206, 53, 200, 240, - 221, 40, 8, 1, 4, 6, 199, 215, 8, 1, 4, 6, 197, 189, 8, 1, 4, 6, 195, - 157, 8, 1, 4, 6, 235, 187, 8, 1, 198, 233, 222, 125, 205, 82, 8, 1, 251, - 40, 31, 1, 4, 6, 233, 231, 31, 1, 4, 6, 222, 146, 31, 1, 4, 6, 212, 163, - 31, 1, 4, 6, 210, 25, 31, 1, 4, 6, 211, 186, 40, 1, 4, 6, 236, 138, 71, - 1, 6, 63, 71, 1, 6, 251, 90, 71, 1, 6, 249, 219, 71, 1, 6, 248, 184, 249, - 219, 71, 1, 6, 240, 98, 71, 1, 6, 70, 71, 1, 6, 210, 40, 70, 71, 1, 6, - 234, 71, 71, 1, 6, 232, 154, 71, 1, 6, 68, 71, 1, 6, 225, 108, 71, 1, 6, - 224, 227, 71, 1, 6, 158, 71, 1, 6, 221, 40, 71, 1, 6, 217, 225, 71, 1, 6, - 210, 40, 217, 225, 71, 1, 6, 74, 71, 1, 6, 213, 229, 71, 1, 6, 213, 195, - 71, 1, 6, 143, 71, 1, 6, 203, 185, 71, 1, 6, 66, 71, 1, 6, 197, 189, 71, - 1, 4, 63, 71, 1, 4, 200, 240, 63, 71, 1, 4, 250, 236, 71, 1, 4, 200, 240, - 251, 90, 71, 1, 4, 249, 219, 71, 1, 4, 240, 98, 71, 1, 4, 70, 71, 1, 4, - 208, 119, 71, 1, 4, 185, 70, 71, 1, 4, 200, 240, 185, 70, 71, 1, 4, 234, - 71, 71, 1, 4, 200, 240, 68, 71, 1, 4, 224, 227, 71, 1, 4, 221, 40, 71, 1, - 4, 236, 92, 71, 1, 4, 74, 71, 1, 4, 185, 74, 71, 1, 4, 201, 222, 155, 74, - 71, 1, 4, 247, 199, 155, 74, 71, 1, 4, 213, 195, 71, 1, 4, 203, 185, 71, - 1, 4, 66, 71, 1, 4, 206, 53, 66, 71, 1, 4, 200, 240, 221, 40, 71, 1, 4, - 199, 215, 71, 1, 4, 251, 40, 71, 1, 4, 248, 61, 71, 1, 4, 31, 233, 231, - 71, 1, 4, 239, 80, 71, 1, 4, 31, 212, 189, 71, 1, 4, 244, 195, 8, 204, - 110, 4, 1, 68, 8, 204, 110, 4, 1, 143, 8, 204, 110, 4, 1, 66, 8, 204, - 110, 4, 1, 199, 215, 31, 204, 110, 4, 1, 248, 61, 31, 204, 110, 4, 1, - 233, 231, 31, 204, 110, 4, 1, 210, 25, 31, 204, 110, 4, 1, 212, 189, 31, - 204, 110, 4, 1, 244, 195, 8, 4, 1, 200, 81, 8, 4, 1, 72, 3, 108, 202, 56, - 8, 4, 1, 240, 99, 3, 108, 202, 56, 8, 4, 1, 235, 185, 3, 108, 202, 56, 8, - 4, 1, 221, 41, 3, 108, 202, 56, 8, 4, 1, 217, 226, 3, 108, 202, 56, 8, 4, - 1, 213, 196, 3, 108, 202, 56, 8, 4, 1, 210, 237, 3, 108, 202, 56, 8, 4, - 1, 210, 237, 3, 234, 245, 26, 108, 202, 56, 8, 4, 1, 209, 36, 3, 108, - 202, 56, 8, 4, 1, 203, 186, 3, 108, 202, 56, 8, 4, 1, 195, 158, 3, 108, - 202, 56, 8, 4, 1, 200, 240, 234, 71, 71, 1, 40, 236, 106, 8, 4, 1, 225, - 184, 234, 71, 8, 4, 1, 202, 205, 3, 204, 167, 8, 4, 6, 1, 230, 137, 3, - 101, 8, 4, 1, 225, 155, 3, 101, 8, 4, 1, 213, 196, 3, 101, 8, 4, 6, 1, - 115, 3, 101, 8, 4, 1, 200, 13, 3, 101, 8, 4, 1, 72, 3, 213, 152, 124, 8, - 4, 1, 240, 99, 3, 213, 152, 124, 8, 4, 1, 235, 185, 3, 213, 152, 124, 8, - 4, 1, 234, 72, 3, 213, 152, 124, 8, 4, 1, 224, 228, 3, 213, 152, 124, 8, - 4, 1, 223, 1, 3, 213, 152, 124, 8, 4, 1, 221, 41, 3, 213, 152, 124, 8, 4, - 1, 217, 226, 3, 213, 152, 124, 8, 4, 1, 213, 196, 3, 213, 152, 124, 8, 4, - 1, 210, 237, 3, 213, 152, 124, 8, 4, 1, 209, 36, 3, 213, 152, 124, 8, 4, - 1, 236, 21, 3, 213, 152, 124, 8, 4, 1, 199, 216, 3, 213, 152, 124, 8, 4, - 1, 196, 217, 3, 213, 152, 124, 8, 4, 1, 195, 158, 3, 213, 152, 124, 8, 4, - 1, 39, 3, 210, 46, 124, 8, 4, 1, 250, 237, 3, 210, 46, 124, 8, 4, 1, 240, - 99, 3, 231, 53, 26, 203, 103, 8, 4, 1, 237, 10, 3, 210, 46, 124, 8, 4, 1, - 185, 237, 10, 3, 210, 46, 124, 8, 4, 1, 210, 40, 185, 237, 10, 3, 210, - 46, 124, 8, 4, 1, 208, 120, 3, 210, 46, 124, 8, 4, 1, 230, 137, 3, 210, - 46, 124, 8, 4, 1, 185, 169, 3, 210, 46, 124, 8, 4, 1, 236, 21, 3, 210, - 46, 124, 8, 4, 1, 115, 3, 210, 46, 124, 8, 4, 1, 235, 188, 3, 210, 46, - 124, 71, 1, 4, 200, 240, 250, 236, 71, 1, 4, 247, 69, 71, 1, 4, 247, 70, - 3, 240, 144, 71, 1, 4, 236, 0, 71, 1, 4, 210, 40, 185, 70, 71, 1, 4, 235, - 184, 71, 1, 4, 238, 122, 225, 109, 3, 101, 71, 1, 4, 144, 234, 71, 71, 1, - 4, 200, 240, 232, 154, 71, 1, 4, 230, 137, 3, 101, 71, 1, 4, 225, 154, - 71, 1, 4, 6, 68, 71, 1, 4, 6, 230, 137, 3, 101, 71, 1, 4, 225, 109, 3, - 240, 178, 71, 1, 4, 223, 1, 3, 210, 46, 124, 71, 1, 4, 223, 1, 3, 213, - 152, 124, 71, 1, 4, 6, 158, 71, 1, 4, 221, 41, 3, 124, 71, 1, 4, 200, - 240, 221, 41, 3, 172, 222, 74, 71, 1, 4, 217, 226, 3, 50, 124, 71, 1, 4, - 217, 226, 3, 210, 46, 124, 71, 1, 4, 6, 217, 225, 71, 1, 4, 248, 184, 74, - 71, 1, 4, 212, 189, 71, 1, 4, 209, 36, 3, 124, 71, 1, 4, 236, 20, 71, 1, - 4, 203, 186, 3, 213, 152, 124, 71, 1, 4, 115, 153, 71, 1, 4, 200, 12, 71, - 1, 4, 6, 66, 71, 1, 4, 199, 216, 3, 124, 71, 1, 4, 200, 240, 199, 215, - 71, 1, 4, 195, 157, 71, 1, 4, 195, 158, 3, 210, 46, 124, 71, 1, 4, 195, - 158, 3, 240, 144, 71, 1, 4, 235, 187, 71, 1, 4, 202, 168, 37, 237, 120, - 232, 239, 251, 122, 37, 237, 120, 251, 110, 251, 122, 37, 205, 175, 58, - 37, 204, 44, 78, 37, 220, 17, 37, 232, 236, 37, 220, 15, 37, 251, 108, - 37, 232, 237, 37, 251, 109, 37, 8, 4, 1, 210, 237, 58, 37, 247, 160, 37, - 220, 16, 37, 54, 244, 105, 57, 37, 214, 81, 57, 37, 195, 24, 58, 37, 225, - 140, 58, 37, 200, 6, 57, 37, 199, 245, 57, 37, 8, 4, 1, 234, 216, 185, - 39, 57, 37, 8, 4, 1, 251, 90, 37, 8, 4, 1, 250, 153, 37, 8, 4, 1, 249, - 240, 37, 8, 4, 1, 247, 70, 246, 169, 37, 8, 4, 1, 225, 184, 240, 98, 37, - 8, 4, 1, 236, 0, 37, 8, 4, 1, 234, 71, 37, 8, 1, 4, 6, 234, 71, 37, 8, 4, - 1, 224, 227, 37, 8, 4, 1, 158, 37, 8, 1, 4, 6, 158, 37, 8, 1, 4, 6, 221, - 40, 37, 8, 4, 1, 217, 225, 37, 8, 1, 4, 6, 217, 225, 37, 8, 1, 4, 6, 143, - 37, 8, 4, 1, 210, 237, 209, 142, 37, 8, 4, 1, 209, 35, 37, 8, 4, 1, 172, - 209, 35, 37, 8, 4, 1, 195, 157, 37, 8, 4, 1, 250, 236, 37, 8, 4, 1, 249, - 219, 37, 8, 4, 1, 248, 61, 37, 8, 4, 1, 208, 119, 37, 8, 4, 1, 235, 184, - 37, 8, 4, 1, 223, 1, 3, 54, 108, 202, 56, 37, 8, 4, 1, 169, 3, 167, 246, - 157, 101, 37, 8, 4, 1, 213, 195, 37, 8, 4, 1, 236, 20, 37, 8, 4, 1, 115, - 3, 167, 246, 157, 101, 37, 8, 4, 1, 197, 189, 37, 8, 4, 1, 39, 3, 239, - 18, 37, 8, 4, 1, 169, 3, 239, 18, 37, 8, 4, 1, 115, 3, 239, 18, 37, 120, - 203, 116, 57, 37, 224, 114, 89, 209, 230, 37, 224, 114, 89, 222, 86, 37, - 76, 89, 222, 86, 37, 197, 56, 225, 163, 247, 155, 58, 37, 239, 89, 78, - 37, 54, 225, 163, 247, 162, 58, 37, 250, 241, 171, 202, 2, 58, 37, 50, - 250, 68, 57, 37, 52, 250, 68, 26, 133, 250, 68, 58, 8, 6, 1, 39, 3, 209, - 211, 58, 8, 4, 1, 39, 3, 209, 211, 58, 8, 6, 1, 72, 3, 76, 57, 8, 4, 1, - 72, 3, 76, 57, 8, 6, 1, 72, 3, 76, 58, 8, 4, 1, 72, 3, 76, 58, 8, 6, 1, - 72, 3, 221, 234, 58, 8, 4, 1, 72, 3, 221, 234, 58, 8, 6, 1, 247, 70, 3, - 246, 170, 26, 180, 8, 4, 1, 247, 70, 3, 246, 170, 26, 180, 8, 6, 1, 240, - 99, 3, 76, 57, 8, 4, 1, 240, 99, 3, 76, 57, 8, 6, 1, 240, 99, 3, 76, 58, - 8, 4, 1, 240, 99, 3, 76, 58, 8, 6, 1, 240, 99, 3, 221, 234, 58, 8, 4, 1, - 240, 99, 3, 221, 234, 58, 8, 6, 1, 240, 99, 3, 246, 169, 8, 4, 1, 240, - 99, 3, 246, 169, 8, 6, 1, 240, 99, 3, 244, 105, 58, 8, 4, 1, 240, 99, 3, - 244, 105, 58, 8, 6, 1, 237, 10, 3, 220, 19, 26, 232, 238, 8, 4, 1, 237, - 10, 3, 220, 19, 26, 232, 238, 8, 6, 1, 237, 10, 3, 220, 19, 26, 180, 8, - 4, 1, 237, 10, 3, 220, 19, 26, 180, 8, 6, 1, 237, 10, 3, 244, 105, 58, 8, - 4, 1, 237, 10, 3, 244, 105, 58, 8, 6, 1, 237, 10, 3, 202, 57, 58, 8, 4, - 1, 237, 10, 3, 202, 57, 58, 8, 6, 1, 237, 10, 3, 246, 170, 26, 247, 161, - 8, 4, 1, 237, 10, 3, 246, 170, 26, 247, 161, 8, 6, 1, 235, 185, 3, 76, - 57, 8, 4, 1, 235, 185, 3, 76, 57, 8, 6, 1, 234, 72, 3, 220, 18, 8, 4, 1, - 234, 72, 3, 220, 18, 8, 6, 1, 232, 155, 3, 76, 57, 8, 4, 1, 232, 155, 3, - 76, 57, 8, 6, 1, 232, 155, 3, 76, 58, 8, 4, 1, 232, 155, 3, 76, 58, 8, 6, - 1, 232, 155, 3, 239, 18, 8, 4, 1, 232, 155, 3, 239, 18, 8, 6, 1, 232, - 155, 3, 246, 169, 8, 4, 1, 232, 155, 3, 246, 169, 8, 6, 1, 232, 155, 3, - 247, 162, 58, 8, 4, 1, 232, 155, 3, 247, 162, 58, 8, 6, 1, 230, 137, 3, - 202, 57, 58, 8, 4, 1, 230, 137, 3, 202, 57, 58, 8, 6, 1, 230, 137, 3, - 239, 19, 26, 180, 8, 4, 1, 230, 137, 3, 239, 19, 26, 180, 8, 6, 1, 224, - 228, 3, 180, 8, 4, 1, 224, 228, 3, 180, 8, 6, 1, 224, 228, 3, 76, 58, 8, - 4, 1, 224, 228, 3, 76, 58, 8, 6, 1, 224, 228, 3, 221, 234, 58, 8, 4, 1, - 224, 228, 3, 221, 234, 58, 8, 6, 1, 223, 1, 3, 76, 58, 8, 4, 1, 223, 1, - 3, 76, 58, 8, 6, 1, 223, 1, 3, 76, 248, 81, 26, 220, 18, 8, 4, 1, 223, 1, - 3, 76, 248, 81, 26, 220, 18, 8, 6, 1, 223, 1, 3, 221, 234, 58, 8, 4, 1, - 223, 1, 3, 221, 234, 58, 8, 6, 1, 223, 1, 3, 244, 105, 58, 8, 4, 1, 223, - 1, 3, 244, 105, 58, 8, 6, 1, 221, 41, 3, 180, 8, 4, 1, 221, 41, 3, 180, - 8, 6, 1, 221, 41, 3, 76, 57, 8, 4, 1, 221, 41, 3, 76, 57, 8, 6, 1, 221, - 41, 3, 76, 58, 8, 4, 1, 221, 41, 3, 76, 58, 8, 6, 1, 217, 226, 3, 76, 57, - 8, 4, 1, 217, 226, 3, 76, 57, 8, 6, 1, 217, 226, 3, 76, 58, 8, 4, 1, 217, - 226, 3, 76, 58, 8, 6, 1, 217, 226, 3, 221, 234, 58, 8, 4, 1, 217, 226, 3, - 221, 234, 58, 8, 6, 1, 217, 226, 3, 244, 105, 58, 8, 4, 1, 217, 226, 3, - 244, 105, 58, 8, 6, 1, 169, 3, 202, 57, 26, 180, 8, 4, 1, 169, 3, 202, - 57, 26, 180, 8, 6, 1, 169, 3, 202, 57, 26, 239, 18, 8, 4, 1, 169, 3, 202, - 57, 26, 239, 18, 8, 6, 1, 169, 3, 220, 19, 26, 232, 238, 8, 4, 1, 169, 3, - 220, 19, 26, 232, 238, 8, 6, 1, 169, 3, 220, 19, 26, 180, 8, 4, 1, 169, - 3, 220, 19, 26, 180, 8, 6, 1, 213, 196, 3, 180, 8, 4, 1, 213, 196, 3, - 180, 8, 6, 1, 213, 196, 3, 76, 57, 8, 4, 1, 213, 196, 3, 76, 57, 8, 6, 1, - 210, 237, 3, 76, 57, 8, 4, 1, 210, 237, 3, 76, 57, 8, 6, 1, 210, 237, 3, - 76, 58, 8, 4, 1, 210, 237, 3, 76, 58, 8, 6, 1, 210, 237, 3, 76, 248, 81, - 26, 220, 18, 8, 4, 1, 210, 237, 3, 76, 248, 81, 26, 220, 18, 8, 6, 1, - 210, 237, 3, 221, 234, 58, 8, 4, 1, 210, 237, 3, 221, 234, 58, 8, 6, 1, - 209, 36, 3, 76, 57, 8, 4, 1, 209, 36, 3, 76, 57, 8, 6, 1, 209, 36, 3, 76, - 58, 8, 4, 1, 209, 36, 3, 76, 58, 8, 6, 1, 209, 36, 3, 251, 110, 26, 76, - 57, 8, 4, 1, 209, 36, 3, 251, 110, 26, 76, 57, 8, 6, 1, 209, 36, 3, 246, - 226, 26, 76, 57, 8, 4, 1, 209, 36, 3, 246, 226, 26, 76, 57, 8, 6, 1, 209, - 36, 3, 76, 248, 81, 26, 76, 57, 8, 4, 1, 209, 36, 3, 76, 248, 81, 26, 76, - 57, 8, 6, 1, 203, 186, 3, 76, 57, 8, 4, 1, 203, 186, 3, 76, 57, 8, 6, 1, - 203, 186, 3, 76, 58, 8, 4, 1, 203, 186, 3, 76, 58, 8, 6, 1, 203, 186, 3, - 221, 234, 58, 8, 4, 1, 203, 186, 3, 221, 234, 58, 8, 6, 1, 203, 186, 3, - 244, 105, 58, 8, 4, 1, 203, 186, 3, 244, 105, 58, 8, 6, 1, 115, 3, 239, - 19, 58, 8, 4, 1, 115, 3, 239, 19, 58, 8, 6, 1, 115, 3, 202, 57, 58, 8, 4, - 1, 115, 3, 202, 57, 58, 8, 6, 1, 115, 3, 244, 105, 58, 8, 4, 1, 115, 3, - 244, 105, 58, 8, 6, 1, 115, 3, 202, 57, 26, 180, 8, 4, 1, 115, 3, 202, - 57, 26, 180, 8, 6, 1, 115, 3, 220, 19, 26, 239, 18, 8, 4, 1, 115, 3, 220, - 19, 26, 239, 18, 8, 6, 1, 199, 216, 3, 202, 56, 8, 4, 1, 199, 216, 3, - 202, 56, 8, 6, 1, 199, 216, 3, 76, 58, 8, 4, 1, 199, 216, 3, 76, 58, 8, - 6, 1, 197, 190, 3, 232, 238, 8, 4, 1, 197, 190, 3, 232, 238, 8, 6, 1, - 197, 190, 3, 180, 8, 4, 1, 197, 190, 3, 180, 8, 6, 1, 197, 190, 3, 239, - 18, 8, 4, 1, 197, 190, 3, 239, 18, 8, 6, 1, 197, 190, 3, 76, 57, 8, 4, 1, - 197, 190, 3, 76, 57, 8, 6, 1, 197, 190, 3, 76, 58, 8, 4, 1, 197, 190, 3, - 76, 58, 8, 6, 1, 196, 217, 3, 76, 57, 8, 4, 1, 196, 217, 3, 76, 57, 8, 6, - 1, 196, 217, 3, 239, 18, 8, 4, 1, 196, 217, 3, 239, 18, 8, 6, 1, 196, - 144, 3, 76, 57, 8, 4, 1, 196, 144, 3, 76, 57, 8, 6, 1, 195, 158, 3, 244, - 104, 8, 4, 1, 195, 158, 3, 244, 104, 8, 6, 1, 195, 158, 3, 76, 58, 8, 4, - 1, 195, 158, 3, 76, 58, 8, 6, 1, 195, 158, 3, 221, 234, 58, 8, 4, 1, 195, - 158, 3, 221, 234, 58, 8, 4, 1, 232, 155, 3, 221, 234, 58, 8, 4, 1, 203, - 186, 3, 239, 18, 8, 4, 1, 197, 190, 3, 209, 211, 57, 8, 4, 1, 196, 144, - 3, 209, 211, 57, 8, 4, 1, 39, 3, 52, 155, 209, 210, 8, 4, 1, 172, 209, - 36, 3, 76, 57, 8, 4, 1, 172, 209, 36, 3, 239, 15, 101, 8, 4, 1, 172, 209, - 36, 3, 128, 101, 8, 6, 1, 206, 225, 209, 35, 8, 4, 1, 239, 80, 8, 6, 1, - 39, 3, 76, 58, 8, 4, 1, 39, 3, 76, 58, 8, 6, 1, 39, 3, 231, 53, 57, 8, 4, - 1, 39, 3, 231, 53, 57, 8, 6, 1, 39, 3, 244, 105, 26, 180, 8, 4, 1, 39, 3, - 244, 105, 26, 180, 8, 6, 1, 39, 3, 244, 105, 26, 232, 238, 8, 4, 1, 39, - 3, 244, 105, 26, 232, 238, 8, 6, 1, 39, 3, 244, 105, 26, 231, 53, 57, 8, - 4, 1, 39, 3, 244, 105, 26, 231, 53, 57, 8, 6, 1, 39, 3, 244, 105, 26, - 202, 56, 8, 4, 1, 39, 3, 244, 105, 26, 202, 56, 8, 6, 1, 39, 3, 244, 105, - 26, 76, 58, 8, 4, 1, 39, 3, 244, 105, 26, 76, 58, 8, 6, 1, 39, 3, 247, - 162, 26, 180, 8, 4, 1, 39, 3, 247, 162, 26, 180, 8, 6, 1, 39, 3, 247, - 162, 26, 232, 238, 8, 4, 1, 39, 3, 247, 162, 26, 232, 238, 8, 6, 1, 39, - 3, 247, 162, 26, 231, 53, 57, 8, 4, 1, 39, 3, 247, 162, 26, 231, 53, 57, - 8, 6, 1, 39, 3, 247, 162, 26, 202, 56, 8, 4, 1, 39, 3, 247, 162, 26, 202, - 56, 8, 6, 1, 39, 3, 247, 162, 26, 76, 58, 8, 4, 1, 39, 3, 247, 162, 26, - 76, 58, 8, 6, 1, 237, 10, 3, 76, 58, 8, 4, 1, 237, 10, 3, 76, 58, 8, 6, - 1, 237, 10, 3, 231, 53, 57, 8, 4, 1, 237, 10, 3, 231, 53, 57, 8, 6, 1, - 237, 10, 3, 202, 56, 8, 4, 1, 237, 10, 3, 202, 56, 8, 6, 1, 237, 10, 3, - 244, 105, 26, 180, 8, 4, 1, 237, 10, 3, 244, 105, 26, 180, 8, 6, 1, 237, - 10, 3, 244, 105, 26, 232, 238, 8, 4, 1, 237, 10, 3, 244, 105, 26, 232, - 238, 8, 6, 1, 237, 10, 3, 244, 105, 26, 231, 53, 57, 8, 4, 1, 237, 10, 3, - 244, 105, 26, 231, 53, 57, 8, 6, 1, 237, 10, 3, 244, 105, 26, 202, 56, 8, - 4, 1, 237, 10, 3, 244, 105, 26, 202, 56, 8, 6, 1, 237, 10, 3, 244, 105, - 26, 76, 58, 8, 4, 1, 237, 10, 3, 244, 105, 26, 76, 58, 8, 6, 1, 230, 137, - 3, 231, 53, 57, 8, 4, 1, 230, 137, 3, 231, 53, 57, 8, 6, 1, 230, 137, 3, - 76, 58, 8, 4, 1, 230, 137, 3, 76, 58, 8, 6, 1, 169, 3, 76, 58, 8, 4, 1, - 169, 3, 76, 58, 8, 6, 1, 169, 3, 231, 53, 57, 8, 4, 1, 169, 3, 231, 53, - 57, 8, 6, 1, 169, 3, 244, 105, 26, 180, 8, 4, 1, 169, 3, 244, 105, 26, - 180, 8, 6, 1, 169, 3, 244, 105, 26, 232, 238, 8, 4, 1, 169, 3, 244, 105, - 26, 232, 238, 8, 6, 1, 169, 3, 244, 105, 26, 231, 53, 57, 8, 4, 1, 169, - 3, 244, 105, 26, 231, 53, 57, 8, 6, 1, 169, 3, 244, 105, 26, 202, 56, 8, - 4, 1, 169, 3, 244, 105, 26, 202, 56, 8, 6, 1, 169, 3, 244, 105, 26, 76, - 58, 8, 4, 1, 169, 3, 244, 105, 26, 76, 58, 8, 6, 1, 169, 3, 230, 247, 26, - 180, 8, 4, 1, 169, 3, 230, 247, 26, 180, 8, 6, 1, 169, 3, 230, 247, 26, - 232, 238, 8, 4, 1, 169, 3, 230, 247, 26, 232, 238, 8, 6, 1, 169, 3, 230, - 247, 26, 231, 53, 57, 8, 4, 1, 169, 3, 230, 247, 26, 231, 53, 57, 8, 6, - 1, 169, 3, 230, 247, 26, 202, 56, 8, 4, 1, 169, 3, 230, 247, 26, 202, 56, - 8, 6, 1, 169, 3, 230, 247, 26, 76, 58, 8, 4, 1, 169, 3, 230, 247, 26, 76, - 58, 8, 6, 1, 115, 3, 76, 58, 8, 4, 1, 115, 3, 76, 58, 8, 6, 1, 115, 3, - 231, 53, 57, 8, 4, 1, 115, 3, 231, 53, 57, 8, 6, 1, 115, 3, 230, 247, 26, - 180, 8, 4, 1, 115, 3, 230, 247, 26, 180, 8, 6, 1, 115, 3, 230, 247, 26, - 232, 238, 8, 4, 1, 115, 3, 230, 247, 26, 232, 238, 8, 6, 1, 115, 3, 230, - 247, 26, 231, 53, 57, 8, 4, 1, 115, 3, 230, 247, 26, 231, 53, 57, 8, 6, - 1, 115, 3, 230, 247, 26, 202, 56, 8, 4, 1, 115, 3, 230, 247, 26, 202, 56, - 8, 6, 1, 115, 3, 230, 247, 26, 76, 58, 8, 4, 1, 115, 3, 230, 247, 26, 76, - 58, 8, 6, 1, 196, 144, 3, 232, 238, 8, 4, 1, 196, 144, 3, 232, 238, 8, 6, - 1, 196, 144, 3, 76, 58, 8, 4, 1, 196, 144, 3, 76, 58, 8, 6, 1, 196, 144, - 3, 231, 53, 57, 8, 4, 1, 196, 144, 3, 231, 53, 57, 8, 6, 1, 196, 144, 3, - 202, 56, 8, 4, 1, 196, 144, 3, 202, 56, 8, 6, 1, 218, 227, 221, 196, 8, - 4, 1, 218, 227, 221, 196, 8, 6, 1, 218, 227, 199, 215, 8, 4, 1, 218, 227, - 199, 215, 8, 6, 1, 196, 144, 3, 221, 129, 8, 4, 1, 196, 144, 3, 221, 129, - 31, 4, 1, 250, 237, 3, 211, 179, 31, 4, 1, 250, 237, 3, 239, 185, 31, 4, - 1, 250, 237, 3, 211, 180, 26, 199, 120, 31, 4, 1, 250, 237, 3, 239, 186, - 26, 199, 120, 31, 4, 1, 250, 237, 3, 211, 180, 26, 213, 200, 31, 4, 1, - 250, 237, 3, 239, 186, 26, 213, 200, 31, 4, 1, 250, 237, 3, 211, 180, 26, - 212, 237, 31, 4, 1, 250, 237, 3, 239, 186, 26, 212, 237, 31, 6, 1, 250, - 237, 3, 211, 179, 31, 6, 1, 250, 237, 3, 239, 185, 31, 6, 1, 250, 237, 3, - 211, 180, 26, 199, 120, 31, 6, 1, 250, 237, 3, 239, 186, 26, 199, 120, - 31, 6, 1, 250, 237, 3, 211, 180, 26, 213, 200, 31, 6, 1, 250, 237, 3, - 239, 186, 26, 213, 200, 31, 6, 1, 250, 237, 3, 211, 180, 26, 212, 237, - 31, 6, 1, 250, 237, 3, 239, 186, 26, 212, 237, 31, 4, 1, 236, 52, 3, 211, - 179, 31, 4, 1, 236, 52, 3, 239, 185, 31, 4, 1, 236, 52, 3, 211, 180, 26, - 199, 120, 31, 4, 1, 236, 52, 3, 239, 186, 26, 199, 120, 31, 4, 1, 236, - 52, 3, 211, 180, 26, 213, 200, 31, 4, 1, 236, 52, 3, 239, 186, 26, 213, - 200, 31, 6, 1, 236, 52, 3, 211, 179, 31, 6, 1, 236, 52, 3, 239, 185, 31, - 6, 1, 236, 52, 3, 211, 180, 26, 199, 120, 31, 6, 1, 236, 52, 3, 239, 186, - 26, 199, 120, 31, 6, 1, 236, 52, 3, 211, 180, 26, 213, 200, 31, 6, 1, - 236, 52, 3, 239, 186, 26, 213, 200, 31, 4, 1, 236, 6, 3, 211, 179, 31, 4, - 1, 236, 6, 3, 239, 185, 31, 4, 1, 236, 6, 3, 211, 180, 26, 199, 120, 31, - 4, 1, 236, 6, 3, 239, 186, 26, 199, 120, 31, 4, 1, 236, 6, 3, 211, 180, - 26, 213, 200, 31, 4, 1, 236, 6, 3, 239, 186, 26, 213, 200, 31, 4, 1, 236, - 6, 3, 211, 180, 26, 212, 237, 31, 4, 1, 236, 6, 3, 239, 186, 26, 212, - 237, 31, 6, 1, 236, 6, 3, 211, 179, 31, 6, 1, 236, 6, 3, 239, 185, 31, 6, - 1, 236, 6, 3, 211, 180, 26, 199, 120, 31, 6, 1, 236, 6, 3, 239, 186, 26, - 199, 120, 31, 6, 1, 236, 6, 3, 211, 180, 26, 213, 200, 31, 6, 1, 236, 6, - 3, 239, 186, 26, 213, 200, 31, 6, 1, 236, 6, 3, 211, 180, 26, 212, 237, - 31, 6, 1, 236, 6, 3, 239, 186, 26, 212, 237, 31, 4, 1, 225, 155, 3, 211, - 179, 31, 4, 1, 225, 155, 3, 239, 185, 31, 4, 1, 225, 155, 3, 211, 180, - 26, 199, 120, 31, 4, 1, 225, 155, 3, 239, 186, 26, 199, 120, 31, 4, 1, - 225, 155, 3, 211, 180, 26, 213, 200, 31, 4, 1, 225, 155, 3, 239, 186, 26, - 213, 200, 31, 4, 1, 225, 155, 3, 211, 180, 26, 212, 237, 31, 4, 1, 225, - 155, 3, 239, 186, 26, 212, 237, 31, 6, 1, 225, 155, 3, 211, 179, 31, 6, - 1, 225, 155, 3, 239, 185, 31, 6, 1, 225, 155, 3, 211, 180, 26, 199, 120, - 31, 6, 1, 225, 155, 3, 239, 186, 26, 199, 120, 31, 6, 1, 225, 155, 3, - 211, 180, 26, 213, 200, 31, 6, 1, 225, 155, 3, 239, 186, 26, 213, 200, - 31, 6, 1, 225, 155, 3, 211, 180, 26, 212, 237, 31, 6, 1, 225, 155, 3, - 239, 186, 26, 212, 237, 31, 4, 1, 214, 52, 3, 211, 179, 31, 4, 1, 214, - 52, 3, 239, 185, 31, 4, 1, 214, 52, 3, 211, 180, 26, 199, 120, 31, 4, 1, - 214, 52, 3, 239, 186, 26, 199, 120, 31, 4, 1, 214, 52, 3, 211, 180, 26, - 213, 200, 31, 4, 1, 214, 52, 3, 239, 186, 26, 213, 200, 31, 6, 1, 214, - 52, 3, 211, 179, 31, 6, 1, 214, 52, 3, 239, 185, 31, 6, 1, 214, 52, 3, - 211, 180, 26, 199, 120, 31, 6, 1, 214, 52, 3, 239, 186, 26, 199, 120, 31, - 6, 1, 214, 52, 3, 211, 180, 26, 213, 200, 31, 6, 1, 214, 52, 3, 239, 186, - 26, 213, 200, 31, 4, 1, 200, 13, 3, 211, 179, 31, 4, 1, 200, 13, 3, 239, - 185, 31, 4, 1, 200, 13, 3, 211, 180, 26, 199, 120, 31, 4, 1, 200, 13, 3, - 239, 186, 26, 199, 120, 31, 4, 1, 200, 13, 3, 211, 180, 26, 213, 200, 31, - 4, 1, 200, 13, 3, 239, 186, 26, 213, 200, 31, 4, 1, 200, 13, 3, 211, 180, - 26, 212, 237, 31, 4, 1, 200, 13, 3, 239, 186, 26, 212, 237, 31, 6, 1, - 200, 13, 3, 239, 185, 31, 6, 1, 200, 13, 3, 239, 186, 26, 199, 120, 31, - 6, 1, 200, 13, 3, 239, 186, 26, 213, 200, 31, 6, 1, 200, 13, 3, 239, 186, - 26, 212, 237, 31, 4, 1, 214, 54, 3, 211, 179, 31, 4, 1, 214, 54, 3, 239, - 185, 31, 4, 1, 214, 54, 3, 211, 180, 26, 199, 120, 31, 4, 1, 214, 54, 3, - 239, 186, 26, 199, 120, 31, 4, 1, 214, 54, 3, 211, 180, 26, 213, 200, 31, - 4, 1, 214, 54, 3, 239, 186, 26, 213, 200, 31, 4, 1, 214, 54, 3, 211, 180, - 26, 212, 237, 31, 4, 1, 214, 54, 3, 239, 186, 26, 212, 237, 31, 6, 1, - 214, 54, 3, 211, 179, 31, 6, 1, 214, 54, 3, 239, 185, 31, 6, 1, 214, 54, - 3, 211, 180, 26, 199, 120, 31, 6, 1, 214, 54, 3, 239, 186, 26, 199, 120, - 31, 6, 1, 214, 54, 3, 211, 180, 26, 213, 200, 31, 6, 1, 214, 54, 3, 239, - 186, 26, 213, 200, 31, 6, 1, 214, 54, 3, 211, 180, 26, 212, 237, 31, 6, - 1, 214, 54, 3, 239, 186, 26, 212, 237, 31, 4, 1, 250, 237, 3, 199, 120, - 31, 4, 1, 250, 237, 3, 213, 200, 31, 4, 1, 236, 52, 3, 199, 120, 31, 4, - 1, 236, 52, 3, 213, 200, 31, 4, 1, 236, 6, 3, 199, 120, 31, 4, 1, 236, 6, - 3, 213, 200, 31, 4, 1, 225, 155, 3, 199, 120, 31, 4, 1, 225, 155, 3, 213, - 200, 31, 4, 1, 214, 52, 3, 199, 120, 31, 4, 1, 214, 52, 3, 213, 200, 31, - 4, 1, 200, 13, 3, 199, 120, 31, 4, 1, 200, 13, 3, 213, 200, 31, 4, 1, - 214, 54, 3, 199, 120, 31, 4, 1, 214, 54, 3, 213, 200, 31, 4, 1, 250, 237, - 3, 211, 180, 26, 195, 223, 31, 4, 1, 250, 237, 3, 239, 186, 26, 195, 223, - 31, 4, 1, 250, 237, 3, 211, 180, 26, 199, 121, 26, 195, 223, 31, 4, 1, - 250, 237, 3, 239, 186, 26, 199, 121, 26, 195, 223, 31, 4, 1, 250, 237, 3, - 211, 180, 26, 213, 201, 26, 195, 223, 31, 4, 1, 250, 237, 3, 239, 186, - 26, 213, 201, 26, 195, 223, 31, 4, 1, 250, 237, 3, 211, 180, 26, 212, - 238, 26, 195, 223, 31, 4, 1, 250, 237, 3, 239, 186, 26, 212, 238, 26, - 195, 223, 31, 6, 1, 250, 237, 3, 211, 180, 26, 211, 193, 31, 6, 1, 250, - 237, 3, 239, 186, 26, 211, 193, 31, 6, 1, 250, 237, 3, 211, 180, 26, 199, - 121, 26, 211, 193, 31, 6, 1, 250, 237, 3, 239, 186, 26, 199, 121, 26, - 211, 193, 31, 6, 1, 250, 237, 3, 211, 180, 26, 213, 201, 26, 211, 193, - 31, 6, 1, 250, 237, 3, 239, 186, 26, 213, 201, 26, 211, 193, 31, 6, 1, - 250, 237, 3, 211, 180, 26, 212, 238, 26, 211, 193, 31, 6, 1, 250, 237, 3, - 239, 186, 26, 212, 238, 26, 211, 193, 31, 4, 1, 236, 6, 3, 211, 180, 26, - 195, 223, 31, 4, 1, 236, 6, 3, 239, 186, 26, 195, 223, 31, 4, 1, 236, 6, - 3, 211, 180, 26, 199, 121, 26, 195, 223, 31, 4, 1, 236, 6, 3, 239, 186, - 26, 199, 121, 26, 195, 223, 31, 4, 1, 236, 6, 3, 211, 180, 26, 213, 201, - 26, 195, 223, 31, 4, 1, 236, 6, 3, 239, 186, 26, 213, 201, 26, 195, 223, - 31, 4, 1, 236, 6, 3, 211, 180, 26, 212, 238, 26, 195, 223, 31, 4, 1, 236, - 6, 3, 239, 186, 26, 212, 238, 26, 195, 223, 31, 6, 1, 236, 6, 3, 211, - 180, 26, 211, 193, 31, 6, 1, 236, 6, 3, 239, 186, 26, 211, 193, 31, 6, 1, - 236, 6, 3, 211, 180, 26, 199, 121, 26, 211, 193, 31, 6, 1, 236, 6, 3, - 239, 186, 26, 199, 121, 26, 211, 193, 31, 6, 1, 236, 6, 3, 211, 180, 26, - 213, 201, 26, 211, 193, 31, 6, 1, 236, 6, 3, 239, 186, 26, 213, 201, 26, - 211, 193, 31, 6, 1, 236, 6, 3, 211, 180, 26, 212, 238, 26, 211, 193, 31, - 6, 1, 236, 6, 3, 239, 186, 26, 212, 238, 26, 211, 193, 31, 4, 1, 214, 54, - 3, 211, 180, 26, 195, 223, 31, 4, 1, 214, 54, 3, 239, 186, 26, 195, 223, - 31, 4, 1, 214, 54, 3, 211, 180, 26, 199, 121, 26, 195, 223, 31, 4, 1, - 214, 54, 3, 239, 186, 26, 199, 121, 26, 195, 223, 31, 4, 1, 214, 54, 3, - 211, 180, 26, 213, 201, 26, 195, 223, 31, 4, 1, 214, 54, 3, 239, 186, 26, - 213, 201, 26, 195, 223, 31, 4, 1, 214, 54, 3, 211, 180, 26, 212, 238, 26, - 195, 223, 31, 4, 1, 214, 54, 3, 239, 186, 26, 212, 238, 26, 195, 223, 31, - 6, 1, 214, 54, 3, 211, 180, 26, 211, 193, 31, 6, 1, 214, 54, 3, 239, 186, - 26, 211, 193, 31, 6, 1, 214, 54, 3, 211, 180, 26, 199, 121, 26, 211, 193, - 31, 6, 1, 214, 54, 3, 239, 186, 26, 199, 121, 26, 211, 193, 31, 6, 1, - 214, 54, 3, 211, 180, 26, 213, 201, 26, 211, 193, 31, 6, 1, 214, 54, 3, - 239, 186, 26, 213, 201, 26, 211, 193, 31, 6, 1, 214, 54, 3, 211, 180, 26, - 212, 238, 26, 211, 193, 31, 6, 1, 214, 54, 3, 239, 186, 26, 212, 238, 26, - 211, 193, 31, 4, 1, 250, 237, 3, 198, 213, 31, 4, 1, 250, 237, 3, 220, - 18, 31, 4, 1, 250, 237, 3, 199, 121, 26, 195, 223, 31, 4, 1, 250, 237, 3, - 195, 223, 31, 4, 1, 250, 237, 3, 213, 201, 26, 195, 223, 31, 4, 1, 250, - 237, 3, 212, 237, 31, 4, 1, 250, 237, 3, 212, 238, 26, 195, 223, 31, 6, - 1, 250, 237, 3, 198, 213, 31, 6, 1, 250, 237, 3, 220, 18, 31, 6, 1, 250, - 237, 3, 199, 120, 31, 6, 1, 250, 237, 3, 213, 200, 31, 6, 1, 250, 237, 3, - 211, 193, 31, 223, 131, 31, 211, 193, 31, 211, 179, 31, 212, 237, 31, - 239, 12, 26, 212, 237, 31, 4, 1, 236, 6, 3, 199, 121, 26, 195, 223, 31, - 4, 1, 236, 6, 3, 195, 223, 31, 4, 1, 236, 6, 3, 213, 201, 26, 195, 223, - 31, 4, 1, 236, 6, 3, 212, 237, 31, 4, 1, 236, 6, 3, 212, 238, 26, 195, - 223, 31, 6, 1, 236, 52, 3, 199, 120, 31, 6, 1, 236, 52, 3, 213, 200, 31, - 6, 1, 236, 6, 3, 199, 120, 31, 6, 1, 236, 6, 3, 213, 200, 31, 6, 1, 236, - 6, 3, 211, 193, 31, 211, 180, 26, 199, 120, 31, 211, 180, 26, 213, 200, - 31, 211, 180, 26, 212, 237, 31, 4, 1, 225, 155, 3, 198, 213, 31, 4, 1, - 225, 155, 3, 220, 18, 31, 4, 1, 225, 155, 3, 239, 12, 26, 199, 120, 31, - 4, 1, 225, 155, 3, 239, 12, 26, 213, 200, 31, 4, 1, 225, 155, 3, 212, - 237, 31, 4, 1, 225, 155, 3, 239, 12, 26, 212, 237, 31, 6, 1, 225, 155, 3, - 198, 213, 31, 6, 1, 225, 155, 3, 220, 18, 31, 6, 1, 225, 155, 3, 199, - 120, 31, 6, 1, 225, 155, 3, 213, 200, 31, 239, 186, 26, 199, 120, 31, - 239, 186, 26, 213, 200, 31, 239, 186, 26, 212, 237, 31, 4, 1, 200, 13, 3, - 198, 213, 31, 4, 1, 200, 13, 3, 220, 18, 31, 4, 1, 200, 13, 3, 239, 12, - 26, 199, 120, 31, 4, 1, 200, 13, 3, 239, 12, 26, 213, 200, 31, 4, 1, 210, - 26, 3, 211, 179, 31, 4, 1, 210, 26, 3, 239, 185, 31, 4, 1, 200, 13, 3, - 212, 237, 31, 4, 1, 200, 13, 3, 239, 12, 26, 212, 237, 31, 6, 1, 200, 13, - 3, 198, 213, 31, 6, 1, 200, 13, 3, 220, 18, 31, 6, 1, 200, 13, 3, 199, - 120, 31, 6, 1, 200, 13, 3, 213, 200, 31, 6, 1, 210, 26, 3, 239, 185, 31, - 239, 12, 26, 199, 120, 31, 239, 12, 26, 213, 200, 31, 199, 120, 31, 4, 1, - 214, 54, 3, 199, 121, 26, 195, 223, 31, 4, 1, 214, 54, 3, 195, 223, 31, - 4, 1, 214, 54, 3, 213, 201, 26, 195, 223, 31, 4, 1, 214, 54, 3, 212, 237, - 31, 4, 1, 214, 54, 3, 212, 238, 26, 195, 223, 31, 6, 1, 214, 52, 3, 199, - 120, 31, 6, 1, 214, 52, 3, 213, 200, 31, 6, 1, 214, 54, 3, 199, 120, 31, - 6, 1, 214, 54, 3, 213, 200, 31, 6, 1, 214, 54, 3, 211, 193, 31, 213, 200, - 31, 239, 185, 236, 107, 211, 43, 236, 118, 211, 43, 236, 107, 205, 110, - 236, 118, 205, 110, 202, 120, 205, 110, 234, 143, 205, 110, 205, 240, - 205, 110, 235, 23, 205, 110, 211, 163, 205, 110, 202, 157, 205, 110, 232, - 117, 205, 110, 195, 80, 197, 53, 205, 110, 195, 80, 197, 53, 215, 211, - 195, 80, 197, 53, 225, 15, 222, 77, 78, 209, 221, 78, 230, 151, 215, 212, - 230, 151, 235, 23, 239, 188, 236, 107, 239, 188, 236, 118, 239, 188, 231, - 43, 153, 54, 83, 221, 233, 54, 125, 221, 233, 50, 206, 19, 211, 11, 78, - 52, 206, 19, 211, 11, 78, 206, 19, 221, 111, 211, 11, 78, 206, 19, 231, - 188, 211, 11, 78, 50, 54, 211, 11, 78, 52, 54, 211, 11, 78, 54, 221, 111, - 211, 11, 78, 54, 231, 188, 211, 11, 78, 239, 241, 54, 239, 241, 247, 122, - 201, 157, 247, 122, 106, 76, 222, 97, 114, 76, 222, 97, 231, 43, 236, - 122, 230, 149, 212, 55, 221, 234, 207, 46, 213, 94, 207, 46, 222, 77, - 236, 116, 209, 221, 236, 116, 212, 34, 238, 208, 234, 159, 222, 77, 213, - 208, 209, 221, 213, 208, 217, 125, 215, 219, 205, 110, 212, 245, 218, - 194, 56, 212, 245, 202, 249, 202, 131, 56, 211, 222, 54, 211, 222, 201, - 145, 211, 222, 210, 40, 211, 222, 210, 40, 54, 211, 222, 210, 40, 201, - 145, 211, 222, 246, 229, 206, 19, 222, 81, 250, 193, 211, 11, 78, 206, - 19, 209, 225, 250, 193, 211, 11, 78, 210, 104, 78, 54, 235, 225, 78, 225, - 171, 213, 210, 200, 42, 183, 202, 79, 246, 230, 225, 188, 212, 55, 250, - 27, 230, 152, 247, 122, 234, 135, 205, 209, 50, 46, 247, 176, 3, 211, 22, - 52, 46, 247, 176, 3, 211, 22, 54, 211, 28, 78, 211, 28, 235, 225, 78, - 235, 225, 211, 28, 78, 202, 32, 2, 236, 7, 210, 40, 212, 122, 56, 64, - 104, 247, 122, 64, 90, 247, 122, 125, 250, 29, 210, 40, 207, 61, 244, 68, - 200, 20, 114, 250, 28, 250, 252, 199, 37, 244, 21, 218, 181, 56, 204, 14, - 239, 188, 225, 163, 200, 42, 234, 200, 211, 163, 78, 122, 76, 211, 162, - 211, 39, 211, 222, 234, 145, 76, 211, 162, 234, 237, 76, 211, 162, 114, - 76, 211, 162, 234, 145, 76, 78, 237, 120, 240, 182, 201, 156, 83, 234, - 145, 238, 120, 219, 99, 13, 205, 110, 197, 3, 225, 15, 234, 96, 250, 129, - 225, 161, 202, 48, 225, 161, 207, 46, 225, 161, 212, 70, 222, 77, 225, - 131, 209, 221, 225, 131, 234, 249, 204, 149, 225, 131, 212, 34, 238, 208, - 225, 131, 225, 200, 203, 217, 204, 31, 251, 112, 203, 217, 204, 31, 225, - 200, 9, 234, 161, 206, 231, 251, 112, 9, 234, 161, 206, 231, 217, 119, - 17, 206, 232, 215, 215, 17, 206, 232, 204, 62, 195, 79, 204, 62, 8, 4, 1, - 68, 204, 62, 136, 204, 62, 150, 204, 62, 174, 204, 62, 182, 204, 62, 178, - 204, 62, 184, 204, 62, 96, 56, 204, 62, 218, 180, 204, 62, 236, 49, 56, - 204, 62, 50, 213, 80, 204, 62, 52, 213, 80, 204, 62, 8, 4, 1, 217, 225, - 204, 110, 195, 79, 204, 110, 98, 204, 110, 103, 204, 110, 135, 204, 110, - 136, 204, 110, 150, 204, 110, 174, 204, 110, 182, 204, 110, 178, 204, - 110, 184, 204, 110, 96, 56, 204, 110, 218, 180, 204, 110, 236, 49, 56, - 204, 110, 50, 213, 80, 204, 110, 52, 213, 80, 8, 204, 110, 4, 1, 63, 8, - 204, 110, 4, 1, 70, 8, 204, 110, 4, 1, 74, 8, 204, 110, 4, 1, 196, 216, - 8, 204, 110, 4, 1, 208, 119, 8, 204, 110, 4, 1, 232, 154, 8, 204, 110, 4, - 1, 224, 227, 8, 204, 110, 4, 1, 158, 8, 204, 110, 4, 1, 221, 40, 8, 204, - 110, 4, 1, 217, 225, 8, 204, 110, 4, 1, 213, 195, 8, 204, 110, 4, 1, 209, - 35, 8, 204, 110, 4, 1, 203, 185, 235, 242, 56, 244, 33, 56, 240, 167, 56, - 234, 124, 234, 129, 56, 221, 213, 56, 218, 195, 56, 217, 142, 56, 212, - 222, 56, 209, 63, 56, 197, 11, 56, 217, 0, 206, 197, 56, 238, 131, 56, - 235, 243, 56, 223, 219, 56, 201, 7, 56, 237, 100, 56, 233, 159, 213, 1, - 56, 212, 219, 56, 232, 209, 56, 249, 246, 56, 230, 225, 56, 246, 171, 56, - 221, 203, 201, 202, 56, 205, 91, 56, 202, 246, 56, 225, 215, 209, 63, 56, - 200, 243, 221, 213, 56, 215, 201, 113, 56, 219, 220, 56, 209, 86, 56, - 222, 126, 56, 248, 2, 56, 37, 50, 232, 54, 57, 37, 52, 232, 54, 57, 37, - 172, 83, 221, 234, 213, 211, 37, 206, 139, 83, 221, 234, 213, 211, 37, - 250, 169, 59, 57, 37, 244, 69, 59, 57, 37, 50, 59, 57, 37, 52, 59, 57, - 37, 209, 211, 213, 211, 37, 244, 69, 209, 211, 213, 211, 37, 250, 169, - 209, 211, 213, 211, 37, 122, 238, 121, 57, 37, 234, 145, 238, 121, 57, - 37, 236, 102, 244, 113, 37, 236, 102, 205, 57, 37, 236, 102, 239, 8, 37, - 236, 102, 244, 114, 248, 240, 37, 50, 52, 59, 57, 37, 236, 102, 208, 110, - 37, 236, 102, 224, 41, 37, 236, 102, 200, 10, 212, 52, 201, 160, 37, 210, - 41, 205, 140, 213, 211, 37, 54, 83, 204, 163, 213, 211, 37, 250, 179, - 102, 37, 201, 145, 200, 44, 37, 197, 56, 247, 155, 57, 37, 104, 59, 213, - 211, 37, 172, 54, 205, 140, 213, 211, 37, 90, 232, 54, 3, 161, 237, 102, - 37, 104, 232, 54, 3, 161, 237, 102, 37, 50, 59, 58, 37, 52, 59, 58, 37, - 250, 30, 57, 251, 118, 214, 87, 251, 102, 202, 2, 202, 187, 204, 120, - 190, 6, 247, 69, 239, 99, 246, 161, 246, 156, 221, 234, 102, 246, 231, - 214, 87, 247, 28, 200, 54, 235, 244, 241, 1, 208, 107, 239, 99, 235, 100, - 144, 4, 234, 71, 144, 6, 232, 154, 247, 248, 6, 232, 154, 190, 6, 232, - 154, 212, 88, 241, 1, 212, 88, 241, 2, 126, 114, 212, 163, 144, 6, 68, - 247, 248, 6, 68, 144, 6, 158, 144, 4, 158, 223, 1, 72, 248, 190, 102, - 190, 6, 217, 225, 215, 65, 56, 205, 124, 210, 116, 240, 224, 144, 6, 213, - 195, 190, 6, 213, 195, 190, 6, 211, 116, 144, 6, 143, 247, 248, 6, 143, - 190, 6, 143, 211, 230, 203, 96, 210, 53, 207, 37, 78, 203, 2, 56, 201, - 192, 113, 56, 199, 89, 190, 6, 195, 157, 213, 228, 56, 214, 77, 56, 225, - 163, 214, 77, 56, 247, 248, 6, 195, 157, 200, 240, 31, 4, 1, 225, 154, - 224, 82, 56, 250, 188, 56, 144, 6, 249, 219, 247, 248, 6, 247, 69, 236, - 12, 102, 144, 4, 70, 144, 6, 70, 144, 6, 235, 184, 200, 240, 6, 235, 184, - 144, 6, 221, 40, 144, 4, 74, 149, 102, 248, 64, 102, 233, 60, 102, 239, - 225, 102, 225, 205, 205, 122, 209, 148, 6, 211, 116, 235, 103, 56, 190, - 4, 212, 163, 190, 4, 233, 231, 190, 6, 233, 231, 190, 6, 212, 163, 190, - 217, 224, 204, 81, 200, 240, 44, 6, 234, 71, 200, 240, 44, 6, 158, 210, - 40, 44, 6, 158, 200, 240, 44, 6, 196, 143, 190, 41, 6, 240, 98, 190, 41, - 4, 240, 98, 190, 41, 4, 70, 190, 41, 4, 68, 190, 41, 4, 225, 108, 211, - 197, 221, 233, 200, 240, 250, 213, 212, 245, 56, 251, 21, 200, 240, 4, - 235, 184, 16, 38, 208, 183, 205, 122, 197, 206, 234, 135, 106, 207, 23, - 197, 206, 234, 135, 106, 216, 91, 197, 206, 234, 135, 106, 202, 239, 197, - 206, 234, 135, 106, 202, 154, 197, 206, 234, 135, 114, 202, 151, 197, - 206, 234, 135, 106, 235, 28, 197, 206, 234, 135, 114, 235, 27, 197, 206, - 234, 135, 122, 235, 27, 197, 206, 234, 135, 234, 145, 235, 27, 197, 206, - 234, 135, 106, 205, 232, 197, 206, 234, 135, 234, 237, 205, 230, 197, - 206, 234, 135, 106, 236, 156, 197, 206, 234, 135, 122, 236, 154, 197, - 206, 234, 135, 234, 237, 236, 154, 197, 206, 234, 135, 207, 27, 236, 154, - 234, 135, 215, 66, 98, 209, 161, 215, 67, 98, 209, 161, 215, 67, 103, - 209, 161, 215, 67, 135, 209, 161, 215, 67, 136, 209, 161, 215, 67, 150, - 209, 161, 215, 67, 174, 209, 161, 215, 67, 182, 209, 161, 215, 67, 178, - 209, 161, 215, 67, 184, 209, 161, 215, 67, 202, 248, 209, 161, 215, 67, - 236, 127, 209, 161, 215, 67, 200, 219, 209, 161, 215, 67, 235, 25, 209, - 161, 215, 67, 106, 230, 201, 209, 161, 215, 67, 234, 237, 230, 201, 209, - 161, 215, 67, 106, 202, 130, 4, 209, 161, 215, 67, 98, 4, 209, 161, 215, - 67, 103, 4, 209, 161, 215, 67, 135, 4, 209, 161, 215, 67, 136, 4, 209, - 161, 215, 67, 150, 4, 209, 161, 215, 67, 174, 4, 209, 161, 215, 67, 182, - 4, 209, 161, 215, 67, 178, 4, 209, 161, 215, 67, 184, 4, 209, 161, 215, - 67, 202, 248, 4, 209, 161, 215, 67, 236, 127, 4, 209, 161, 215, 67, 200, - 219, 4, 209, 161, 215, 67, 235, 25, 4, 209, 161, 215, 67, 106, 230, 201, - 4, 209, 161, 215, 67, 234, 237, 230, 201, 4, 209, 161, 215, 67, 106, 202, - 130, 209, 161, 215, 67, 106, 202, 131, 247, 70, 240, 98, 209, 161, 215, - 67, 234, 237, 202, 130, 209, 161, 215, 67, 202, 249, 202, 130, 209, 161, - 215, 67, 210, 40, 106, 230, 201, 8, 4, 1, 210, 40, 247, 69, 209, 161, - 215, 67, 205, 242, 222, 121, 20, 209, 161, 215, 67, 235, 26, 236, 205, - 20, 209, 161, 215, 67, 235, 26, 202, 130, 209, 161, 215, 67, 106, 230, - 202, 202, 130, 197, 206, 234, 135, 195, 80, 202, 151, 200, 240, 17, 103, - 200, 240, 17, 135, 104, 51, 200, 8, 51, 90, 51, 237, 103, 51, 50, 52, 51, - 120, 133, 51, 164, 197, 81, 51, 164, 236, 199, 51, 205, 121, 236, 199, - 51, 205, 121, 197, 81, 51, 104, 59, 3, 101, 90, 59, 3, 101, 104, 197, - 115, 51, 90, 197, 115, 51, 104, 114, 232, 20, 51, 200, 8, 114, 232, 20, - 51, 90, 114, 232, 20, 51, 237, 103, 114, 232, 20, 51, 104, 59, 3, 203, - 103, 90, 59, 3, 203, 103, 104, 59, 234, 116, 153, 200, 8, 59, 234, 116, - 153, 90, 59, 234, 116, 153, 237, 103, 59, 234, 116, 153, 120, 133, 59, 3, - 248, 176, 104, 59, 3, 124, 90, 59, 3, 124, 104, 59, 3, 221, 129, 90, 59, - 3, 221, 129, 50, 52, 197, 115, 51, 50, 52, 59, 3, 101, 237, 103, 195, 24, - 51, 200, 8, 59, 3, 202, 40, 222, 76, 200, 8, 59, 3, 202, 40, 209, 219, - 237, 103, 59, 3, 202, 40, 222, 76, 237, 103, 59, 3, 202, 40, 209, 219, - 90, 59, 3, 240, 222, 237, 102, 237, 103, 59, 3, 240, 222, 222, 76, 250, - 169, 201, 222, 207, 64, 51, 244, 69, 201, 222, 207, 64, 51, 164, 197, 81, - 59, 202, 2, 172, 153, 104, 59, 202, 2, 248, 190, 126, 90, 59, 202, 2, - 153, 250, 169, 185, 244, 114, 51, 244, 69, 185, 244, 114, 51, 104, 232, - 54, 3, 161, 200, 7, 104, 232, 54, 3, 161, 237, 102, 200, 8, 232, 54, 3, - 161, 209, 219, 200, 8, 232, 54, 3, 161, 222, 76, 90, 232, 54, 3, 161, - 200, 7, 90, 232, 54, 3, 161, 237, 102, 237, 103, 232, 54, 3, 161, 209, - 219, 237, 103, 232, 54, 3, 161, 222, 76, 90, 59, 126, 104, 51, 200, 8, - 59, 104, 77, 237, 103, 51, 104, 59, 126, 90, 51, 104, 213, 156, 250, 64, - 200, 8, 213, 156, 250, 64, 90, 213, 156, 250, 64, 237, 103, 213, 156, - 250, 64, 104, 232, 54, 126, 90, 232, 53, 90, 232, 54, 126, 104, 232, 53, - 104, 54, 59, 3, 101, 50, 52, 54, 59, 3, 101, 90, 54, 59, 3, 101, 104, 54, - 51, 200, 8, 54, 51, 90, 54, 51, 237, 103, 54, 51, 50, 52, 54, 51, 120, - 133, 54, 51, 164, 197, 81, 54, 51, 164, 236, 199, 54, 51, 205, 121, 236, - 199, 54, 51, 205, 121, 197, 81, 54, 51, 104, 201, 145, 51, 90, 201, 145, - 51, 104, 205, 50, 51, 90, 205, 50, 51, 200, 8, 59, 3, 54, 101, 237, 103, - 59, 3, 54, 101, 104, 239, 187, 51, 200, 8, 239, 187, 51, 90, 239, 187, - 51, 237, 103, 239, 187, 51, 104, 59, 202, 2, 153, 90, 59, 202, 2, 153, - 104, 67, 51, 200, 8, 67, 51, 90, 67, 51, 237, 103, 67, 51, 200, 8, 67, - 59, 234, 116, 153, 200, 8, 67, 59, 214, 49, 213, 25, 200, 8, 67, 59, 214, - 49, 213, 26, 3, 231, 43, 153, 200, 8, 67, 59, 214, 49, 213, 26, 3, 83, - 153, 200, 8, 67, 54, 51, 200, 8, 67, 54, 59, 214, 49, 213, 25, 90, 67, - 59, 234, 116, 197, 139, 164, 197, 81, 59, 202, 2, 240, 221, 205, 121, - 236, 199, 59, 202, 2, 240, 221, 120, 133, 67, 51, 52, 59, 3, 4, 244, 113, - 237, 103, 59, 104, 77, 200, 8, 51, 122, 90, 250, 64, 104, 59, 3, 83, 101, - 90, 59, 3, 83, 101, 50, 52, 59, 3, 83, 101, 104, 59, 3, 54, 83, 101, 90, - 59, 3, 54, 83, 101, 50, 52, 59, 3, 54, 83, 101, 104, 214, 21, 51, 90, - 214, 21, 51, 50, 52, 214, 21, 51, 38, 250, 248, 244, 17, 213, 72, 238, - 248, 202, 177, 235, 220, 202, 177, 238, 145, 215, 194, 235, 221, 236, - 108, 207, 32, 225, 219, 217, 153, 236, 131, 214, 87, 215, 194, 250, 209, - 236, 131, 214, 87, 4, 236, 131, 214, 87, 240, 251, 250, 53, 219, 77, 238, - 145, 215, 194, 240, 253, 250, 53, 219, 77, 4, 240, 251, 250, 53, 219, 77, - 236, 98, 77, 211, 199, 217, 224, 211, 209, 217, 224, 240, 228, 217, 224, - 204, 81, 218, 181, 56, 218, 179, 56, 76, 212, 70, 238, 179, 205, 209, - 207, 33, 218, 180, 250, 30, 214, 13, 209, 211, 214, 13, 247, 123, 214, - 13, 46, 209, 154, 240, 158, 209, 154, 234, 138, 209, 154, 211, 195, 147, - 225, 207, 52, 250, 192, 250, 192, 219, 108, 250, 192, 205, 90, 250, 192, - 238, 181, 238, 145, 215, 194, 238, 185, 213, 86, 147, 215, 194, 213, 86, - 147, 221, 153, 250, 202, 221, 153, 214, 3, 225, 168, 200, 34, 225, 182, - 54, 225, 182, 201, 145, 225, 182, 240, 245, 225, 182, 204, 51, 225, 182, - 198, 225, 225, 182, 244, 69, 225, 182, 244, 69, 240, 245, 225, 182, 250, - 169, 240, 245, 225, 182, 202, 176, 248, 107, 210, 143, 211, 196, 76, 218, - 180, 235, 228, 233, 165, 211, 196, 231, 58, 202, 57, 214, 13, 210, 40, - 202, 56, 225, 163, 222, 106, 209, 35, 206, 21, 197, 114, 196, 247, 211, - 209, 215, 194, 202, 56, 218, 181, 202, 56, 250, 22, 171, 147, 215, 194, - 250, 22, 171, 147, 250, 125, 171, 147, 250, 125, 247, 93, 215, 194, 251, - 111, 171, 147, 217, 19, 250, 125, 215, 203, 251, 111, 171, 147, 250, 241, - 171, 147, 215, 194, 250, 241, 171, 147, 250, 241, 171, 214, 4, 171, 147, - 201, 145, 202, 56, 250, 249, 171, 147, 236, 44, 147, 233, 164, 236, 44, - 147, 238, 249, 248, 58, 250, 127, 202, 187, 221, 241, 233, 164, 171, 147, - 250, 125, 171, 202, 2, 214, 4, 202, 187, 225, 246, 214, 87, 225, 246, 77, - 214, 4, 250, 125, 171, 147, 244, 33, 236, 48, 236, 49, 244, 32, 209, 211, - 225, 231, 171, 147, 209, 211, 171, 147, 240, 215, 147, 236, 11, 236, 47, - 147, 204, 228, 236, 48, 239, 81, 171, 147, 171, 202, 2, 247, 81, 239, - 100, 219, 108, 247, 80, 211, 26, 171, 147, 215, 194, 171, 147, 230, 81, - 147, 215, 194, 230, 81, 147, 204, 170, 236, 44, 147, 222, 42, 214, 4, - 171, 147, 232, 232, 214, 4, 171, 147, 222, 42, 126, 171, 147, 232, 232, - 126, 171, 147, 222, 42, 247, 93, 215, 194, 171, 147, 232, 232, 247, 93, - 215, 194, 171, 147, 218, 46, 222, 41, 218, 46, 232, 231, 248, 58, 215, - 194, 236, 44, 147, 215, 194, 222, 41, 215, 194, 232, 231, 217, 19, 222, - 42, 215, 203, 171, 147, 217, 19, 232, 232, 215, 203, 171, 147, 222, 42, - 214, 4, 236, 44, 147, 232, 232, 214, 4, 236, 44, 147, 217, 19, 222, 42, - 215, 203, 236, 44, 147, 217, 19, 232, 232, 215, 203, 236, 44, 147, 222, - 42, 214, 4, 232, 231, 232, 232, 214, 4, 222, 41, 217, 19, 222, 42, 215, - 203, 232, 231, 217, 19, 232, 232, 215, 203, 222, 41, 211, 238, 204, 100, - 211, 239, 214, 4, 171, 147, 204, 101, 214, 4, 171, 147, 211, 239, 214, 4, - 236, 44, 147, 204, 101, 214, 4, 236, 44, 147, 238, 145, 215, 194, 211, - 241, 238, 145, 215, 194, 204, 102, 204, 109, 214, 87, 204, 61, 214, 87, - 215, 194, 39, 204, 109, 214, 87, 215, 194, 39, 204, 61, 214, 87, 204, - 109, 77, 214, 4, 171, 147, 204, 61, 77, 214, 4, 171, 147, 217, 19, 39, - 204, 109, 77, 215, 203, 171, 147, 217, 19, 39, 204, 61, 77, 215, 203, - 171, 147, 204, 109, 77, 3, 215, 194, 171, 147, 204, 61, 77, 3, 215, 194, - 171, 147, 218, 27, 218, 28, 218, 29, 218, 28, 200, 34, 46, 225, 246, 214, - 87, 46, 213, 251, 214, 87, 46, 225, 246, 77, 214, 4, 171, 147, 46, 213, - 251, 77, 214, 4, 171, 147, 46, 246, 244, 46, 240, 150, 45, 212, 70, 45, - 218, 180, 45, 202, 48, 45, 238, 179, 205, 209, 45, 76, 214, 13, 45, 209, - 211, 214, 13, 45, 250, 30, 214, 13, 45, 236, 48, 45, 239, 188, 99, 212, - 70, 99, 218, 180, 99, 202, 48, 99, 76, 214, 13, 52, 203, 115, 50, 203, - 115, 133, 203, 115, 120, 203, 115, 250, 33, 218, 149, 201, 122, 234, 167, - 201, 145, 83, 248, 190, 52, 200, 239, 54, 83, 248, 190, 54, 52, 200, 239, - 238, 145, 215, 194, 211, 189, 215, 194, 201, 122, 238, 145, 215, 194, - 234, 168, 217, 22, 54, 83, 248, 190, 54, 52, 200, 239, 211, 239, 200, 47, - 210, 87, 204, 101, 200, 47, 210, 87, 215, 200, 204, 123, 214, 87, 240, - 251, 250, 53, 215, 200, 204, 122, 215, 200, 204, 123, 77, 214, 4, 171, - 147, 240, 251, 250, 53, 215, 200, 204, 123, 214, 4, 171, 147, 213, 251, - 214, 87, 225, 246, 214, 87, 218, 34, 231, 235, 241, 6, 219, 164, 225, - 179, 196, 175, 217, 133, 215, 202, 52, 250, 193, 3, 250, 101, 52, 201, - 160, 217, 224, 221, 153, 250, 202, 217, 224, 221, 153, 214, 3, 217, 224, - 225, 168, 217, 224, 200, 34, 239, 9, 214, 13, 76, 214, 13, 204, 228, 214, - 13, 238, 179, 202, 48, 247, 185, 50, 215, 200, 235, 102, 207, 60, 211, - 209, 52, 215, 200, 235, 102, 207, 60, 211, 209, 50, 207, 60, 211, 209, - 52, 207, 60, 211, 209, 210, 40, 202, 57, 236, 48, 240, 141, 221, 153, - 214, 3, 240, 141, 221, 153, 250, 202, 54, 204, 108, 54, 204, 60, 54, 225, - 168, 54, 200, 34, 212, 99, 171, 26, 213, 86, 147, 222, 42, 3, 238, 123, - 232, 232, 3, 238, 123, 199, 36, 218, 46, 222, 41, 199, 36, 218, 46, 232, - 231, 222, 42, 171, 202, 2, 214, 4, 232, 231, 232, 232, 171, 202, 2, 214, - 4, 222, 41, 171, 202, 2, 214, 4, 222, 41, 171, 202, 2, 214, 4, 232, 231, - 171, 202, 2, 214, 4, 211, 238, 171, 202, 2, 214, 4, 204, 100, 238, 145, - 215, 194, 211, 242, 214, 4, 236, 50, 238, 145, 215, 194, 204, 103, 214, - 4, 236, 50, 215, 194, 46, 225, 246, 77, 214, 4, 171, 147, 215, 194, 46, - 213, 251, 77, 214, 4, 171, 147, 46, 225, 246, 77, 214, 4, 215, 194, 171, - 147, 46, 213, 251, 77, 214, 4, 215, 194, 171, 147, 222, 42, 247, 93, 215, - 194, 236, 44, 147, 232, 232, 247, 93, 215, 194, 236, 44, 147, 211, 239, - 247, 93, 215, 194, 236, 44, 147, 204, 101, 247, 93, 215, 194, 236, 44, - 147, 215, 194, 215, 200, 204, 123, 214, 87, 238, 145, 215, 194, 240, 253, - 250, 53, 215, 200, 204, 122, 215, 194, 215, 200, 204, 123, 77, 214, 4, - 171, 147, 238, 145, 215, 194, 240, 253, 250, 53, 215, 200, 204, 123, 214, - 4, 236, 50, 83, 236, 122, 218, 226, 231, 43, 236, 122, 120, 52, 239, 15, - 236, 122, 133, 52, 239, 15, 236, 122, 236, 131, 77, 3, 172, 231, 43, 101, - 236, 131, 77, 3, 83, 248, 190, 250, 19, 236, 98, 77, 231, 43, 101, 4, - 236, 131, 77, 3, 83, 248, 190, 250, 19, 236, 98, 77, 231, 43, 101, 236, - 131, 77, 3, 76, 57, 236, 131, 77, 3, 213, 216, 4, 236, 131, 77, 3, 213, - 216, 236, 131, 77, 3, 200, 45, 236, 131, 77, 3, 114, 231, 43, 204, 150, - 240, 251, 3, 172, 231, 43, 101, 240, 251, 3, 83, 248, 190, 250, 19, 236, - 98, 77, 231, 43, 101, 4, 240, 251, 3, 83, 248, 190, 250, 19, 236, 98, 77, - 231, 43, 101, 240, 251, 3, 213, 216, 4, 240, 251, 3, 213, 216, 195, 158, - 215, 192, 248, 230, 219, 76, 239, 10, 56, 236, 133, 51, 230, 231, 120, - 250, 67, 133, 250, 67, 211, 203, 212, 225, 197, 111, 221, 233, 50, 246, - 164, 52, 246, 164, 50, 234, 206, 52, 234, 206, 247, 199, 52, 240, 184, - 247, 199, 50, 240, 184, 201, 222, 52, 240, 184, 201, 222, 50, 240, 184, - 210, 40, 215, 194, 56, 46, 221, 102, 250, 101, 208, 78, 208, 87, 203, 2, - 210, 117, 212, 25, 225, 212, 199, 11, 205, 57, 212, 93, 77, 225, 178, 56, - 200, 240, 215, 194, 56, 197, 121, 230, 233, 201, 222, 50, 240, 221, 201, - 222, 52, 240, 221, 247, 199, 50, 240, 221, 247, 199, 52, 240, 221, 201, - 222, 155, 225, 182, 247, 199, 155, 225, 182, 234, 111, 205, 181, 120, - 250, 68, 248, 59, 114, 231, 43, 248, 178, 214, 6, 224, 45, 236, 40, 202, - 2, 202, 187, 209, 230, 196, 217, 225, 231, 39, 210, 114, 247, 184, 224, - 43, 222, 81, 250, 193, 170, 209, 225, 250, 193, 170, 236, 40, 202, 2, - 202, 187, 222, 86, 248, 70, 209, 210, 240, 108, 250, 249, 250, 76, 203, - 216, 201, 207, 209, 68, 238, 228, 213, 252, 241, 10, 203, 71, 205, 194, - 240, 211, 240, 210, 250, 144, 234, 94, 16, 230, 130, 250, 144, 234, 94, - 16, 205, 48, 211, 43, 250, 144, 234, 94, 16, 211, 44, 236, 50, 250, 144, - 234, 94, 16, 211, 44, 238, 185, 250, 144, 234, 94, 16, 211, 44, 239, 8, - 250, 144, 234, 94, 16, 211, 44, 225, 7, 250, 144, 234, 94, 16, 211, 44, - 244, 113, 250, 144, 234, 94, 16, 244, 114, 204, 201, 250, 144, 234, 94, - 16, 244, 114, 225, 7, 250, 144, 234, 94, 16, 205, 210, 153, 250, 144, - 234, 94, 16, 248, 241, 153, 250, 144, 234, 94, 16, 211, 44, 205, 209, - 250, 144, 234, 94, 16, 211, 44, 248, 240, 250, 144, 234, 94, 16, 211, 44, - 222, 41, 250, 144, 234, 94, 16, 211, 44, 232, 231, 250, 144, 234, 94, 16, - 104, 199, 126, 250, 144, 234, 94, 16, 90, 199, 126, 250, 144, 234, 94, - 16, 211, 44, 104, 51, 250, 144, 234, 94, 16, 211, 44, 90, 51, 250, 144, - 234, 94, 16, 244, 114, 248, 240, 250, 144, 234, 94, 16, 133, 203, 116, - 200, 45, 250, 144, 234, 94, 16, 239, 81, 204, 201, 250, 144, 234, 94, 16, - 211, 44, 133, 246, 229, 250, 144, 234, 94, 16, 211, 44, 239, 80, 250, - 144, 234, 94, 16, 133, 203, 116, 225, 7, 250, 144, 234, 94, 16, 200, 8, - 199, 126, 250, 144, 234, 94, 16, 211, 44, 200, 8, 51, 250, 144, 234, 94, - 16, 120, 203, 116, 213, 216, 250, 144, 234, 94, 16, 239, 93, 204, 201, - 250, 144, 234, 94, 16, 211, 44, 120, 246, 229, 250, 144, 234, 94, 16, - 211, 44, 239, 92, 250, 144, 234, 94, 16, 120, 203, 116, 225, 7, 250, 144, - 234, 94, 16, 237, 103, 199, 126, 250, 144, 234, 94, 16, 211, 44, 237, - 103, 51, 250, 144, 234, 94, 16, 211, 10, 200, 45, 250, 144, 234, 94, 16, - 239, 81, 200, 45, 250, 144, 234, 94, 16, 239, 9, 200, 45, 250, 144, 234, - 94, 16, 225, 8, 200, 45, 250, 144, 234, 94, 16, 244, 114, 200, 45, 250, - 144, 234, 94, 16, 120, 206, 151, 225, 7, 250, 144, 234, 94, 16, 211, 10, - 211, 43, 250, 144, 234, 94, 16, 244, 114, 204, 227, 250, 144, 234, 94, - 16, 211, 44, 244, 32, 250, 144, 234, 94, 16, 120, 203, 116, 239, 18, 250, - 144, 234, 94, 16, 239, 93, 239, 18, 250, 144, 234, 94, 16, 204, 228, 239, - 18, 250, 144, 234, 94, 16, 225, 8, 239, 18, 250, 144, 234, 94, 16, 244, - 114, 239, 18, 250, 144, 234, 94, 16, 133, 206, 151, 204, 201, 250, 144, - 234, 94, 16, 50, 206, 151, 204, 201, 250, 144, 234, 94, 16, 202, 57, 239, - 18, 250, 144, 234, 94, 16, 232, 232, 239, 18, 250, 144, 234, 94, 16, 244, - 24, 153, 250, 144, 234, 94, 16, 239, 93, 202, 56, 250, 144, 234, 94, 16, - 195, 23, 250, 144, 234, 94, 16, 204, 202, 202, 56, 250, 144, 234, 94, 16, - 207, 62, 200, 45, 250, 144, 234, 94, 16, 211, 44, 215, 194, 236, 50, 250, - 144, 234, 94, 16, 211, 44, 211, 27, 250, 144, 234, 94, 16, 133, 246, 230, - 202, 56, 250, 144, 234, 94, 16, 120, 246, 230, 202, 56, 250, 144, 234, - 94, 16, 225, 154, 250, 144, 234, 94, 16, 210, 25, 250, 144, 234, 94, 16, - 214, 53, 250, 144, 234, 94, 16, 250, 237, 200, 45, 250, 144, 234, 94, 16, - 236, 52, 200, 45, 250, 144, 234, 94, 16, 225, 155, 200, 45, 250, 144, - 234, 94, 16, 214, 54, 200, 45, 250, 144, 234, 94, 16, 250, 236, 215, 194, - 244, 222, 78, 52, 250, 193, 3, 237, 103, 195, 24, 51, 206, 120, 185, 247, - 184, 248, 84, 102, 83, 221, 234, 3, 108, 238, 123, 225, 188, 102, 240, - 246, 200, 43, 102, 238, 201, 200, 43, 102, 236, 110, 102, 241, 25, 102, - 67, 46, 3, 246, 156, 83, 221, 233, 236, 82, 102, 250, 228, 224, 46, 102, - 231, 248, 102, 45, 231, 43, 248, 190, 3, 215, 191, 45, 201, 161, 237, - 106, 247, 149, 244, 114, 3, 215, 197, 51, 200, 41, 102, 218, 109, 102, - 230, 147, 102, 214, 22, 232, 153, 102, 214, 22, 222, 255, 102, 213, 60, - 102, 213, 59, 102, 238, 210, 240, 139, 16, 234, 161, 103, 205, 145, 102, - 250, 144, 234, 94, 16, 211, 43, 239, 112, 207, 47, 224, 46, 102, 211, - 224, 213, 164, 216, 249, 213, 164, 211, 219, 208, 111, 102, 244, 85, 208, - 111, 102, 50, 213, 81, 200, 17, 124, 50, 213, 81, 235, 212, 50, 213, 81, - 221, 107, 124, 52, 213, 81, 200, 17, 124, 52, 213, 81, 235, 212, 52, 213, - 81, 221, 107, 124, 50, 46, 247, 176, 200, 17, 240, 221, 50, 46, 247, 176, - 235, 212, 50, 46, 247, 176, 221, 107, 240, 221, 52, 46, 247, 176, 200, - 17, 240, 221, 52, 46, 247, 176, 235, 212, 52, 46, 247, 176, 221, 107, - 240, 221, 50, 240, 141, 247, 176, 200, 17, 124, 50, 240, 141, 247, 176, - 108, 212, 155, 50, 240, 141, 247, 176, 221, 107, 124, 240, 141, 247, 176, - 235, 212, 52, 240, 141, 247, 176, 200, 17, 124, 52, 240, 141, 247, 176, - 108, 212, 155, 52, 240, 141, 247, 176, 221, 107, 124, 225, 183, 235, 212, - 231, 43, 221, 234, 235, 212, 200, 17, 50, 214, 4, 221, 107, 52, 240, 141, - 247, 176, 208, 88, 200, 17, 52, 214, 4, 221, 107, 50, 240, 141, 247, 176, - 208, 88, 204, 82, 201, 221, 204, 82, 247, 198, 201, 222, 46, 170, 247, - 199, 46, 170, 247, 199, 46, 247, 176, 126, 201, 222, 46, 170, 43, 16, - 247, 198, 50, 83, 107, 221, 233, 52, 83, 107, 221, 233, 231, 43, 208, - 130, 221, 232, 231, 43, 208, 130, 221, 231, 231, 43, 208, 130, 221, 230, - 231, 43, 208, 130, 221, 229, 239, 72, 16, 167, 83, 26, 201, 222, 209, - 230, 239, 72, 16, 167, 83, 26, 247, 199, 209, 230, 239, 72, 16, 167, 83, - 3, 244, 113, 239, 72, 16, 167, 133, 26, 231, 43, 3, 244, 113, 239, 72, - 16, 167, 120, 26, 231, 43, 3, 244, 113, 239, 72, 16, 167, 83, 3, 201, - 160, 239, 72, 16, 167, 133, 26, 231, 43, 3, 201, 160, 239, 72, 16, 167, - 120, 26, 231, 43, 3, 201, 160, 239, 72, 16, 167, 83, 26, 197, 114, 239, - 72, 16, 167, 133, 26, 231, 43, 3, 197, 114, 239, 72, 16, 167, 120, 26, - 231, 43, 3, 197, 114, 239, 72, 16, 167, 133, 26, 231, 42, 239, 72, 16, - 167, 120, 26, 231, 42, 239, 72, 16, 167, 83, 26, 201, 222, 222, 86, 239, - 72, 16, 167, 83, 26, 247, 199, 222, 86, 46, 234, 174, 210, 45, 102, 236, - 147, 102, 83, 221, 234, 235, 212, 219, 46, 247, 161, 219, 46, 172, 126, - 206, 138, 219, 46, 206, 139, 126, 221, 144, 219, 46, 172, 126, 114, 206, - 124, 219, 46, 114, 206, 125, 126, 221, 144, 219, 46, 114, 206, 125, 225, - 16, 219, 46, 201, 141, 219, 46, 202, 218, 219, 46, 212, 252, 236, 203, - 232, 223, 234, 88, 201, 222, 213, 80, 247, 199, 213, 80, 201, 222, 240, - 141, 170, 247, 199, 240, 141, 170, 201, 222, 201, 210, 206, 201, 170, - 247, 199, 201, 210, 206, 201, 170, 67, 201, 177, 248, 70, 209, 211, 3, - 244, 113, 204, 183, 234, 217, 251, 126, 240, 138, 236, 132, 225, 168, - 239, 112, 235, 216, 102, 64, 209, 225, 54, 201, 160, 64, 222, 81, 54, - 201, 160, 64, 200, 19, 54, 201, 160, 64, 237, 105, 54, 201, 160, 64, 209, - 225, 54, 201, 161, 3, 83, 153, 64, 222, 81, 54, 201, 161, 3, 83, 153, 64, - 209, 225, 201, 161, 3, 54, 83, 153, 251, 14, 244, 70, 204, 190, 202, 49, - 244, 70, 230, 234, 3, 234, 197, 208, 172, 64, 219, 99, 222, 81, 201, 160, - 64, 219, 99, 209, 225, 201, 160, 64, 219, 99, 200, 19, 201, 160, 64, 219, - 99, 237, 105, 201, 160, 54, 83, 153, 64, 46, 38, 204, 193, 64, 244, 114, - 38, 210, 118, 212, 6, 102, 212, 6, 214, 47, 102, 212, 6, 214, 49, 102, - 212, 6, 205, 205, 102, 214, 105, 235, 203, 102, 16, 38, 215, 71, 16, 38, - 204, 223, 77, 232, 19, 16, 38, 204, 223, 77, 202, 206, 16, 38, 236, 98, - 77, 202, 206, 16, 38, 236, 98, 77, 201, 182, 16, 38, 236, 85, 16, 38, - 251, 114, 16, 38, 248, 83, 16, 38, 248, 239, 16, 38, 231, 43, 203, 117, - 16, 38, 221, 234, 235, 60, 16, 38, 83, 203, 117, 16, 38, 234, 161, 235, - 60, 16, 38, 246, 221, 210, 44, 16, 38, 206, 175, 213, 224, 16, 38, 206, - 175, 225, 230, 16, 38, 239, 183, 221, 224, 236, 22, 16, 38, 239, 51, 240, - 241, 98, 16, 38, 239, 51, 240, 241, 103, 16, 38, 239, 51, 240, 241, 135, - 16, 38, 239, 51, 240, 241, 136, 16, 38, 217, 20, 251, 114, 16, 38, 203, - 211, 226, 37, 16, 38, 236, 98, 77, 201, 183, 247, 240, 16, 38, 247, 2, - 16, 38, 236, 98, 77, 219, 98, 16, 38, 204, 106, 16, 38, 236, 22, 16, 38, - 235, 18, 207, 46, 16, 38, 232, 222, 207, 46, 16, 38, 210, 119, 207, 46, - 16, 38, 200, 33, 207, 46, 16, 38, 205, 110, 16, 38, 239, 90, 247, 244, - 102, 185, 247, 184, 16, 38, 216, 252, 16, 38, 239, 91, 234, 161, 103, 16, - 38, 204, 107, 234, 161, 103, 214, 101, 124, 214, 101, 246, 131, 214, 101, - 234, 164, 214, 101, 225, 163, 234, 164, 214, 101, 248, 80, 247, 135, 214, - 101, 247, 192, 202, 79, 214, 101, 247, 172, 248, 195, 230, 80, 214, 101, - 250, 215, 77, 244, 221, 214, 101, 239, 188, 214, 101, 240, 127, 251, 118, - 215, 69, 214, 101, 54, 248, 240, 45, 17, 98, 45, 17, 103, 45, 17, 135, - 45, 17, 136, 45, 17, 150, 45, 17, 174, 45, 17, 182, 45, 17, 178, 45, 17, - 184, 45, 35, 202, 248, 45, 35, 236, 127, 45, 35, 200, 219, 45, 35, 202, - 149, 45, 35, 234, 139, 45, 35, 235, 29, 45, 35, 205, 236, 45, 35, 207, - 24, 45, 35, 236, 158, 45, 35, 216, 94, 45, 35, 200, 214, 116, 17, 98, - 116, 17, 103, 116, 17, 135, 116, 17, 136, 116, 17, 150, 116, 17, 174, - 116, 17, 182, 116, 17, 178, 116, 17, 184, 116, 35, 202, 248, 116, 35, - 236, 127, 116, 35, 200, 219, 116, 35, 202, 149, 116, 35, 234, 139, 116, - 35, 235, 29, 116, 35, 205, 236, 116, 35, 207, 24, 116, 35, 236, 158, 116, - 35, 216, 94, 116, 35, 200, 214, 17, 106, 234, 98, 204, 193, 17, 114, 234, - 98, 204, 193, 17, 122, 234, 98, 204, 193, 17, 234, 145, 234, 98, 204, - 193, 17, 234, 237, 234, 98, 204, 193, 17, 205, 242, 234, 98, 204, 193, - 17, 207, 27, 234, 98, 204, 193, 17, 236, 161, 234, 98, 204, 193, 17, 216, - 97, 234, 98, 204, 193, 35, 202, 249, 234, 98, 204, 193, 35, 236, 128, - 234, 98, 204, 193, 35, 200, 220, 234, 98, 204, 193, 35, 202, 150, 234, - 98, 204, 193, 35, 234, 140, 234, 98, 204, 193, 35, 235, 30, 234, 98, 204, - 193, 35, 205, 237, 234, 98, 204, 193, 35, 207, 25, 234, 98, 204, 193, 35, - 236, 159, 234, 98, 204, 193, 35, 216, 95, 234, 98, 204, 193, 35, 200, - 215, 234, 98, 204, 193, 116, 8, 4, 1, 63, 116, 8, 4, 1, 249, 219, 116, 8, - 4, 1, 247, 69, 116, 8, 4, 1, 240, 98, 116, 8, 4, 1, 70, 116, 8, 4, 1, - 235, 184, 116, 8, 4, 1, 234, 71, 116, 8, 4, 1, 232, 154, 116, 8, 4, 1, - 68, 116, 8, 4, 1, 225, 108, 116, 8, 4, 1, 224, 227, 116, 8, 4, 1, 158, - 116, 8, 4, 1, 221, 40, 116, 8, 4, 1, 217, 225, 116, 8, 4, 1, 74, 116, 8, - 4, 1, 213, 195, 116, 8, 4, 1, 211, 116, 116, 8, 4, 1, 143, 116, 8, 4, 1, - 209, 35, 116, 8, 4, 1, 203, 185, 116, 8, 4, 1, 66, 116, 8, 4, 1, 199, - 215, 116, 8, 4, 1, 197, 189, 116, 8, 4, 1, 196, 216, 116, 8, 4, 1, 196, - 143, 116, 8, 4, 1, 195, 157, 45, 8, 6, 1, 63, 45, 8, 6, 1, 249, 219, 45, - 8, 6, 1, 247, 69, 45, 8, 6, 1, 240, 98, 45, 8, 6, 1, 70, 45, 8, 6, 1, - 235, 184, 45, 8, 6, 1, 234, 71, 45, 8, 6, 1, 232, 154, 45, 8, 6, 1, 68, - 45, 8, 6, 1, 225, 108, 45, 8, 6, 1, 224, 227, 45, 8, 6, 1, 158, 45, 8, 6, - 1, 221, 40, 45, 8, 6, 1, 217, 225, 45, 8, 6, 1, 74, 45, 8, 6, 1, 213, - 195, 45, 8, 6, 1, 211, 116, 45, 8, 6, 1, 143, 45, 8, 6, 1, 209, 35, 45, - 8, 6, 1, 203, 185, 45, 8, 6, 1, 66, 45, 8, 6, 1, 199, 215, 45, 8, 6, 1, - 197, 189, 45, 8, 6, 1, 196, 216, 45, 8, 6, 1, 196, 143, 45, 8, 6, 1, 195, - 157, 45, 8, 4, 1, 63, 45, 8, 4, 1, 249, 219, 45, 8, 4, 1, 247, 69, 45, 8, - 4, 1, 240, 98, 45, 8, 4, 1, 70, 45, 8, 4, 1, 235, 184, 45, 8, 4, 1, 234, - 71, 45, 8, 4, 1, 232, 154, 45, 8, 4, 1, 68, 45, 8, 4, 1, 225, 108, 45, 8, - 4, 1, 224, 227, 45, 8, 4, 1, 158, 45, 8, 4, 1, 221, 40, 45, 8, 4, 1, 217, - 225, 45, 8, 4, 1, 74, 45, 8, 4, 1, 213, 195, 45, 8, 4, 1, 211, 116, 45, - 8, 4, 1, 143, 45, 8, 4, 1, 209, 35, 45, 8, 4, 1, 203, 185, 45, 8, 4, 1, - 66, 45, 8, 4, 1, 199, 215, 45, 8, 4, 1, 197, 189, 45, 8, 4, 1, 196, 216, - 45, 8, 4, 1, 196, 143, 45, 8, 4, 1, 195, 157, 45, 17, 195, 79, 217, 20, - 45, 35, 236, 127, 217, 20, 45, 35, 200, 219, 217, 20, 45, 35, 202, 149, - 217, 20, 45, 35, 234, 139, 217, 20, 45, 35, 235, 29, 217, 20, 45, 35, - 205, 236, 217, 20, 45, 35, 207, 24, 217, 20, 45, 35, 236, 158, 217, 20, - 45, 35, 216, 94, 217, 20, 45, 35, 200, 214, 54, 45, 17, 98, 54, 45, 17, - 103, 54, 45, 17, 135, 54, 45, 17, 136, 54, 45, 17, 150, 54, 45, 17, 174, - 54, 45, 17, 182, 54, 45, 17, 178, 54, 45, 17, 184, 54, 45, 35, 202, 248, - 217, 20, 45, 17, 195, 79, 107, 127, 167, 231, 42, 107, 127, 85, 231, 42, - 107, 127, 167, 199, 88, 107, 127, 85, 199, 88, 107, 127, 167, 201, 145, - 239, 189, 231, 42, 107, 127, 85, 201, 145, 239, 189, 231, 42, 107, 127, - 167, 201, 145, 239, 189, 199, 88, 107, 127, 85, 201, 145, 239, 189, 199, - 88, 107, 127, 167, 211, 39, 239, 189, 231, 42, 107, 127, 85, 211, 39, - 239, 189, 231, 42, 107, 127, 167, 211, 39, 239, 189, 199, 88, 107, 127, - 85, 211, 39, 239, 189, 199, 88, 107, 127, 167, 133, 26, 209, 230, 107, - 127, 133, 167, 26, 52, 232, 6, 107, 127, 133, 85, 26, 52, 221, 253, 107, - 127, 85, 133, 26, 209, 230, 107, 127, 167, 133, 26, 222, 86, 107, 127, - 133, 167, 26, 50, 232, 6, 107, 127, 133, 85, 26, 50, 221, 253, 107, 127, - 85, 133, 26, 222, 86, 107, 127, 167, 120, 26, 209, 230, 107, 127, 120, - 167, 26, 52, 232, 6, 107, 127, 120, 85, 26, 52, 221, 253, 107, 127, 85, - 120, 26, 209, 230, 107, 127, 167, 120, 26, 222, 86, 107, 127, 120, 167, - 26, 50, 232, 6, 107, 127, 120, 85, 26, 50, 221, 253, 107, 127, 85, 120, - 26, 222, 86, 107, 127, 167, 83, 26, 209, 230, 107, 127, 83, 167, 26, 52, - 232, 6, 107, 127, 120, 85, 26, 52, 133, 221, 253, 107, 127, 133, 85, 26, - 52, 120, 221, 253, 107, 127, 83, 85, 26, 52, 221, 253, 107, 127, 133, - 167, 26, 52, 120, 232, 6, 107, 127, 120, 167, 26, 52, 133, 232, 6, 107, - 127, 85, 83, 26, 209, 230, 107, 127, 167, 83, 26, 222, 86, 107, 127, 83, - 167, 26, 50, 232, 6, 107, 127, 120, 85, 26, 50, 133, 221, 253, 107, 127, - 133, 85, 26, 50, 120, 221, 253, 107, 127, 83, 85, 26, 50, 221, 253, 107, - 127, 133, 167, 26, 50, 120, 232, 6, 107, 127, 120, 167, 26, 50, 133, 232, - 6, 107, 127, 85, 83, 26, 222, 86, 107, 127, 167, 133, 26, 231, 42, 107, - 127, 50, 85, 26, 52, 133, 221, 253, 107, 127, 52, 85, 26, 50, 133, 221, - 253, 107, 127, 133, 167, 26, 231, 43, 232, 6, 107, 127, 133, 85, 26, 231, - 43, 221, 253, 107, 127, 52, 167, 26, 50, 133, 232, 6, 107, 127, 50, 167, - 26, 52, 133, 232, 6, 107, 127, 85, 133, 26, 231, 42, 107, 127, 167, 120, - 26, 231, 42, 107, 127, 50, 85, 26, 52, 120, 221, 253, 107, 127, 52, 85, - 26, 50, 120, 221, 253, 107, 127, 120, 167, 26, 231, 43, 232, 6, 107, 127, - 120, 85, 26, 231, 43, 221, 253, 107, 127, 52, 167, 26, 50, 120, 232, 6, - 107, 127, 50, 167, 26, 52, 120, 232, 6, 107, 127, 85, 120, 26, 231, 42, - 107, 127, 167, 83, 26, 231, 42, 107, 127, 50, 85, 26, 52, 83, 221, 253, - 107, 127, 52, 85, 26, 50, 83, 221, 253, 107, 127, 83, 167, 26, 231, 43, - 232, 6, 107, 127, 120, 85, 26, 133, 231, 43, 221, 253, 107, 127, 133, 85, - 26, 120, 231, 43, 221, 253, 107, 127, 83, 85, 26, 231, 43, 221, 253, 107, - 127, 50, 120, 85, 26, 52, 133, 221, 253, 107, 127, 52, 120, 85, 26, 50, - 133, 221, 253, 107, 127, 50, 133, 85, 26, 52, 120, 221, 253, 107, 127, - 52, 133, 85, 26, 50, 120, 221, 253, 107, 127, 133, 167, 26, 120, 231, 43, - 232, 6, 107, 127, 120, 167, 26, 133, 231, 43, 232, 6, 107, 127, 52, 167, - 26, 50, 83, 232, 6, 107, 127, 50, 167, 26, 52, 83, 232, 6, 107, 127, 85, - 83, 26, 231, 42, 107, 127, 167, 54, 239, 189, 231, 42, 107, 127, 85, 54, - 239, 189, 231, 42, 107, 127, 167, 54, 239, 189, 199, 88, 107, 127, 85, - 54, 239, 189, 199, 88, 107, 127, 54, 231, 42, 107, 127, 54, 199, 88, 107, - 127, 133, 206, 19, 26, 52, 237, 115, 107, 127, 133, 54, 26, 52, 206, 18, - 107, 127, 54, 133, 26, 209, 230, 107, 127, 133, 206, 19, 26, 50, 237, - 115, 107, 127, 133, 54, 26, 50, 206, 18, 107, 127, 54, 133, 26, 222, 86, - 107, 127, 120, 206, 19, 26, 52, 237, 115, 107, 127, 120, 54, 26, 52, 206, - 18, 107, 127, 54, 120, 26, 209, 230, 107, 127, 120, 206, 19, 26, 50, 237, - 115, 107, 127, 120, 54, 26, 50, 206, 18, 107, 127, 54, 120, 26, 222, 86, - 107, 127, 83, 206, 19, 26, 52, 237, 115, 107, 127, 83, 54, 26, 52, 206, - 18, 107, 127, 54, 83, 26, 209, 230, 107, 127, 83, 206, 19, 26, 50, 237, - 115, 107, 127, 83, 54, 26, 50, 206, 18, 107, 127, 54, 83, 26, 222, 86, - 107, 127, 133, 206, 19, 26, 231, 43, 237, 115, 107, 127, 133, 54, 26, - 231, 43, 206, 18, 107, 127, 54, 133, 26, 231, 42, 107, 127, 120, 206, 19, - 26, 231, 43, 237, 115, 107, 127, 120, 54, 26, 231, 43, 206, 18, 107, 127, - 54, 120, 26, 231, 42, 107, 127, 83, 206, 19, 26, 231, 43, 237, 115, 107, - 127, 83, 54, 26, 231, 43, 206, 18, 107, 127, 54, 83, 26, 231, 42, 107, - 127, 167, 250, 102, 133, 26, 209, 230, 107, 127, 167, 250, 102, 133, 26, - 222, 86, 107, 127, 167, 250, 102, 120, 26, 222, 86, 107, 127, 167, 250, - 102, 120, 26, 209, 230, 107, 127, 167, 239, 15, 200, 17, 52, 202, 2, 221, - 107, 222, 86, 107, 127, 167, 239, 15, 200, 17, 50, 202, 2, 221, 107, 209, - 230, 107, 127, 167, 239, 15, 240, 182, 107, 127, 167, 222, 86, 107, 127, - 167, 200, 20, 107, 127, 167, 209, 230, 107, 127, 167, 237, 106, 107, 127, - 85, 222, 86, 107, 127, 85, 200, 20, 107, 127, 85, 209, 230, 107, 127, 85, - 237, 106, 107, 127, 167, 50, 26, 85, 209, 230, 107, 127, 167, 120, 26, - 85, 237, 106, 107, 127, 85, 50, 26, 167, 209, 230, 107, 127, 85, 120, 26, - 167, 237, 106, 200, 17, 155, 247, 240, 221, 107, 106, 236, 157, 247, 240, - 221, 107, 106, 211, 37, 247, 240, 221, 107, 122, 236, 155, 247, 240, 221, - 107, 155, 247, 240, 221, 107, 234, 237, 236, 155, 247, 240, 221, 107, - 122, 211, 35, 247, 240, 221, 107, 207, 27, 236, 155, 247, 240, 234, 98, - 247, 240, 50, 207, 27, 236, 155, 247, 240, 50, 122, 211, 35, 247, 240, - 50, 234, 237, 236, 155, 247, 240, 50, 155, 247, 240, 50, 122, 236, 155, - 247, 240, 50, 106, 211, 37, 247, 240, 50, 106, 236, 157, 247, 240, 52, - 155, 247, 240, 167, 206, 251, 219, 99, 206, 251, 239, 194, 206, 251, 200, - 17, 106, 236, 157, 247, 240, 52, 106, 236, 157, 247, 240, 211, 41, 221, - 107, 222, 86, 211, 41, 221, 107, 209, 230, 211, 41, 200, 17, 222, 86, - 211, 41, 200, 17, 50, 26, 221, 107, 50, 26, 221, 107, 209, 230, 211, 41, - 200, 17, 50, 26, 221, 107, 209, 230, 211, 41, 200, 17, 50, 26, 200, 17, - 52, 26, 221, 107, 222, 86, 211, 41, 200, 17, 50, 26, 200, 17, 52, 26, - 221, 107, 209, 230, 211, 41, 200, 17, 209, 230, 211, 41, 200, 17, 52, 26, - 221, 107, 222, 86, 211, 41, 200, 17, 52, 26, 221, 107, 50, 26, 221, 107, - 209, 230, 64, 205, 57, 67, 205, 57, 67, 46, 3, 209, 139, 240, 220, 67, - 46, 240, 252, 64, 4, 205, 57, 46, 3, 231, 43, 235, 16, 46, 3, 83, 235, - 16, 46, 3, 213, 243, 240, 177, 235, 16, 46, 3, 200, 17, 50, 202, 2, 221, - 107, 52, 235, 16, 46, 3, 200, 17, 52, 202, 2, 221, 107, 50, 235, 16, 46, - 3, 239, 15, 240, 177, 235, 16, 64, 4, 205, 57, 67, 4, 205, 57, 64, 210, - 113, 67, 210, 113, 64, 83, 210, 113, 67, 83, 210, 113, 64, 213, 84, 67, - 213, 84, 64, 200, 19, 201, 160, 67, 200, 19, 201, 160, 64, 200, 19, 4, - 201, 160, 67, 200, 19, 4, 201, 160, 64, 209, 225, 201, 160, 67, 209, 225, - 201, 160, 64, 209, 225, 4, 201, 160, 67, 209, 225, 4, 201, 160, 64, 209, - 225, 212, 53, 67, 209, 225, 212, 53, 64, 237, 105, 201, 160, 67, 237, - 105, 201, 160, 64, 237, 105, 4, 201, 160, 67, 237, 105, 4, 201, 160, 64, - 222, 81, 201, 160, 67, 222, 81, 201, 160, 64, 222, 81, 4, 201, 160, 67, - 222, 81, 4, 201, 160, 64, 222, 81, 212, 53, 67, 222, 81, 212, 53, 64, - 239, 8, 67, 239, 8, 67, 239, 9, 240, 252, 64, 4, 239, 8, 234, 246, 221, - 102, 67, 244, 113, 237, 120, 244, 113, 244, 114, 3, 83, 235, 16, 247, - 118, 64, 244, 113, 244, 114, 3, 50, 155, 247, 250, 244, 114, 3, 52, 155, - 247, 250, 244, 114, 3, 221, 107, 155, 247, 250, 244, 114, 3, 200, 17, - 155, 247, 250, 244, 114, 3, 200, 17, 52, 211, 41, 247, 250, 244, 114, 3, - 250, 249, 247, 93, 200, 17, 50, 211, 41, 247, 250, 50, 155, 64, 244, 113, - 52, 155, 64, 244, 113, 225, 164, 247, 122, 225, 164, 67, 244, 113, 200, - 17, 155, 225, 164, 67, 244, 113, 221, 107, 155, 225, 164, 67, 244, 113, - 200, 17, 50, 211, 41, 244, 107, 250, 101, 200, 17, 52, 211, 41, 244, 107, - 250, 101, 221, 107, 52, 211, 41, 244, 107, 250, 101, 221, 107, 50, 211, - 41, 244, 107, 250, 101, 200, 17, 155, 244, 113, 221, 107, 155, 244, 113, - 64, 221, 107, 52, 201, 160, 64, 221, 107, 50, 201, 160, 64, 200, 17, 50, - 201, 160, 64, 200, 17, 52, 201, 160, 67, 247, 122, 46, 3, 50, 155, 247, - 250, 46, 3, 52, 155, 247, 250, 46, 3, 200, 17, 50, 239, 15, 155, 247, - 250, 46, 3, 221, 107, 52, 239, 15, 155, 247, 250, 67, 46, 3, 83, 248, 7, - 221, 233, 67, 200, 19, 201, 161, 3, 238, 123, 200, 19, 201, 161, 3, 50, - 155, 247, 250, 200, 19, 201, 161, 3, 52, 155, 247, 250, 222, 130, 244, - 113, 67, 46, 3, 200, 17, 50, 211, 40, 67, 46, 3, 221, 107, 50, 211, 40, - 67, 46, 3, 221, 107, 52, 211, 40, 67, 46, 3, 200, 17, 52, 211, 40, 67, - 244, 114, 3, 200, 17, 50, 211, 40, 67, 244, 114, 3, 221, 107, 50, 211, - 40, 67, 244, 114, 3, 221, 107, 52, 211, 40, 67, 244, 114, 3, 200, 17, 52, - 211, 40, 200, 17, 50, 201, 160, 200, 17, 52, 201, 160, 221, 107, 50, 201, - 160, 67, 219, 99, 205, 57, 64, 219, 99, 205, 57, 67, 219, 99, 4, 205, 57, - 64, 219, 99, 4, 205, 57, 221, 107, 52, 201, 160, 64, 204, 79, 3, 210, - 137, 244, 58, 200, 59, 205, 164, 244, 26, 64, 204, 227, 67, 204, 227, - 221, 250, 202, 109, 204, 78, 250, 48, 215, 217, 239, 62, 215, 217, 241, - 5, 214, 9, 64, 203, 1, 67, 203, 1, 248, 207, 247, 184, 248, 207, 107, 3, - 244, 221, 248, 207, 107, 3, 196, 216, 208, 185, 200, 60, 3, 210, 167, - 237, 81, 230, 240, 248, 57, 67, 206, 148, 212, 155, 64, 206, 148, 212, - 155, 206, 238, 210, 40, 209, 148, 234, 203, 232, 13, 247, 122, 64, 50, - 212, 52, 225, 216, 64, 52, 212, 52, 225, 216, 67, 50, 212, 52, 225, 216, - 67, 120, 212, 52, 225, 216, 67, 52, 212, 52, 225, 216, 67, 133, 212, 52, - 225, 216, 205, 215, 26, 240, 181, 246, 205, 56, 210, 179, 56, 248, 15, - 56, 247, 27, 250, 183, 213, 244, 240, 182, 244, 196, 210, 25, 240, 183, - 77, 221, 124, 240, 183, 77, 225, 73, 204, 228, 26, 240, 192, 235, 84, - 102, 251, 99, 206, 241, 232, 102, 26, 206, 60, 213, 34, 102, 196, 10, - 196, 90, 201, 150, 38, 232, 8, 201, 150, 38, 222, 158, 201, 150, 38, 234, - 254, 201, 150, 38, 202, 110, 201, 150, 38, 197, 44, 201, 150, 38, 197, - 119, 201, 150, 38, 218, 79, 201, 150, 38, 236, 202, 197, 71, 77, 239, 36, - 67, 234, 110, 235, 112, 67, 205, 180, 235, 112, 64, 205, 180, 235, 112, - 67, 204, 79, 3, 210, 137, 234, 249, 211, 37, 218, 98, 222, 123, 211, 37, - 218, 98, 219, 67, 235, 52, 56, 236, 202, 219, 227, 56, 224, 242, 208, - 148, 200, 0, 217, 11, 212, 66, 250, 87, 203, 55, 233, 173, 247, 0, 222, - 48, 198, 250, 222, 8, 208, 113, 208, 210, 246, 239, 250, 119, 212, 104, - 67, 244, 203, 223, 222, 67, 244, 203, 211, 29, 67, 244, 203, 209, 157, - 67, 244, 203, 248, 6, 67, 244, 203, 223, 170, 67, 244, 203, 213, 46, 64, - 244, 203, 223, 222, 64, 244, 203, 211, 29, 64, 244, 203, 209, 157, 64, - 244, 203, 248, 6, 64, 244, 203, 223, 170, 64, 244, 203, 213, 46, 64, 205, - 108, 204, 91, 67, 232, 13, 204, 91, 67, 239, 9, 204, 91, 64, 244, 55, - 204, 91, 67, 205, 108, 204, 91, 64, 232, 13, 204, 91, 64, 239, 9, 204, - 91, 67, 244, 55, 204, 91, 230, 240, 205, 62, 211, 37, 215, 188, 236, 157, - 215, 188, 248, 115, 236, 157, 215, 183, 248, 115, 205, 235, 215, 183, - 218, 1, 234, 220, 56, 218, 1, 217, 118, 56, 218, 1, 206, 225, 56, 197, - 81, 203, 205, 240, 182, 236, 199, 203, 205, 240, 182, 200, 29, 210, 109, - 102, 210, 109, 16, 38, 200, 182, 212, 85, 210, 109, 16, 38, 200, 180, - 212, 85, 210, 109, 16, 38, 200, 179, 212, 85, 210, 109, 16, 38, 200, 177, - 212, 85, 210, 109, 16, 38, 200, 175, 212, 85, 210, 109, 16, 38, 200, 173, - 212, 85, 210, 109, 16, 38, 200, 171, 212, 85, 210, 109, 16, 38, 233, 170, - 219, 165, 64, 200, 29, 210, 109, 102, 210, 110, 213, 101, 102, 213, 71, - 213, 101, 102, 212, 236, 213, 101, 56, 197, 69, 102, 239, 1, 235, 111, - 239, 1, 235, 110, 239, 1, 235, 109, 239, 1, 235, 108, 239, 1, 235, 107, - 239, 1, 235, 106, 67, 244, 114, 3, 76, 209, 230, 67, 244, 114, 3, 114, - 238, 120, 64, 244, 114, 3, 67, 76, 209, 230, 64, 244, 114, 3, 114, 67, - 238, 120, 218, 114, 38, 196, 90, 218, 114, 38, 196, 9, 238, 238, 38, 232, - 233, 196, 90, 238, 238, 38, 222, 40, 196, 9, 238, 238, 38, 222, 40, 196, - 90, 238, 238, 38, 232, 233, 196, 9, 67, 234, 229, 64, 234, 229, 232, 102, - 26, 212, 159, 250, 204, 240, 180, 204, 15, 204, 236, 77, 251, 73, 208, - 131, 251, 9, 234, 199, 233, 183, 204, 236, 77, 231, 237, 250, 8, 102, - 234, 215, 213, 220, 67, 204, 227, 122, 221, 228, 240, 238, 209, 230, 122, - 221, 228, 240, 238, 222, 86, 197, 130, 56, 128, 198, 226, 56, 237, 111, - 235, 52, 56, 237, 111, 219, 227, 56, 225, 174, 235, 52, 26, 219, 227, 56, - 219, 227, 26, 235, 52, 56, 219, 227, 3, 204, 163, 56, 219, 227, 3, 204, - 163, 26, 219, 227, 26, 235, 52, 56, 83, 219, 227, 3, 204, 163, 56, 231, - 43, 219, 227, 3, 204, 163, 56, 219, 99, 67, 244, 113, 219, 99, 64, 244, - 113, 219, 99, 4, 67, 244, 113, 219, 183, 102, 238, 177, 102, 200, 26, - 213, 70, 102, 244, 37, 234, 93, 199, 252, 217, 3, 246, 141, 213, 147, - 224, 248, 199, 34, 244, 176, 64, 218, 99, 221, 247, 207, 17, 207, 58, - 211, 19, 207, 35, 205, 152, 248, 210, 248, 175, 99, 224, 45, 67, 237, 92, - 219, 222, 67, 237, 92, 223, 222, 64, 237, 92, 219, 222, 64, 237, 92, 223, - 222, 205, 165, 197, 31, 205, 168, 204, 79, 248, 90, 244, 58, 210, 166, - 64, 205, 164, 202, 111, 244, 59, 26, 210, 166, 200, 240, 67, 206, 148, - 212, 155, 200, 240, 64, 206, 148, 212, 155, 67, 239, 9, 225, 231, 205, - 57, 240, 176, 222, 137, 238, 205, 246, 235, 214, 12, 212, 159, 246, 236, - 205, 198, 231, 247, 3, 67, 240, 182, 45, 240, 176, 222, 137, 246, 132, - 215, 226, 236, 76, 250, 233, 214, 41, 50, 197, 105, 201, 190, 64, 200, - 193, 50, 197, 105, 201, 190, 67, 200, 193, 50, 197, 105, 201, 190, 64, - 50, 222, 138, 219, 66, 67, 50, 222, 138, 219, 66, 237, 87, 205, 190, 56, - 85, 67, 237, 105, 201, 160, 50, 244, 67, 236, 76, 99, 208, 185, 235, 93, - 239, 15, 225, 231, 67, 244, 114, 225, 231, 64, 205, 57, 64, 201, 124, - 210, 51, 50, 236, 75, 210, 51, 50, 236, 74, 250, 23, 16, 38, 200, 0, 85, - 244, 114, 3, 204, 163, 26, 114, 238, 121, 57, 212, 253, 209, 227, 225, - 176, 212, 253, 222, 83, 225, 176, 212, 253, 225, 163, 212, 253, 64, 240, - 183, 214, 49, 206, 176, 206, 164, 206, 113, 244, 142, 246, 213, 231, 176, - 205, 243, 233, 184, 197, 31, 230, 213, 233, 184, 3, 232, 71, 219, 205, - 16, 38, 221, 252, 218, 79, 200, 60, 214, 49, 232, 223, 234, 146, 234, - 230, 225, 231, 231, 63, 235, 42, 208, 205, 46, 234, 145, 240, 220, 205, - 218, 230, 90, 205, 222, 212, 228, 3, 248, 210, 202, 240, 225, 93, 248, - 195, 102, 232, 16, 232, 235, 102, 234, 101, 211, 164, 240, 151, 214, 49, - 64, 205, 57, 67, 234, 230, 3, 231, 43, 108, 64, 204, 164, 64, 208, 215, - 208, 117, 200, 17, 247, 245, 208, 117, 64, 208, 117, 221, 107, 247, 245, - 208, 117, 67, 208, 117, 67, 85, 244, 222, 78, 203, 2, 221, 163, 56, 203, - 72, 237, 86, 251, 33, 236, 71, 210, 164, 234, 242, 210, 164, 232, 94, - 199, 21, 232, 94, 196, 240, 232, 94, 221, 107, 52, 213, 7, 213, 7, 200, - 17, 52, 213, 7, 67, 216, 130, 64, 216, 130, 244, 222, 78, 85, 244, 222, - 78, 218, 30, 196, 216, 85, 218, 30, 196, 216, 248, 207, 196, 216, 85, - 248, 207, 196, 216, 213, 220, 31, 240, 182, 85, 31, 240, 182, 185, 246, - 156, 240, 182, 85, 185, 246, 156, 240, 182, 8, 240, 182, 206, 249, 67, 8, - 240, 182, 213, 220, 8, 240, 182, 219, 224, 240, 182, 204, 228, 77, 239, - 181, 234, 145, 203, 21, 250, 29, 234, 145, 248, 208, 250, 29, 85, 234, - 145, 248, 208, 250, 29, 234, 145, 244, 53, 250, 29, 64, 234, 145, 212, - 54, 204, 227, 67, 234, 145, 212, 54, 204, 227, 205, 103, 204, 173, 213, - 220, 67, 204, 227, 45, 67, 204, 227, 185, 246, 156, 64, 204, 227, 64, - 246, 156, 67, 204, 227, 213, 220, 64, 204, 227, 85, 213, 220, 64, 204, - 227, 212, 114, 204, 227, 206, 249, 67, 204, 227, 85, 250, 29, 185, 246, - 156, 250, 29, 236, 161, 205, 73, 250, 29, 236, 161, 212, 54, 64, 204, - 227, 236, 161, 212, 54, 212, 114, 204, 227, 205, 242, 212, 54, 64, 204, - 227, 236, 161, 212, 54, 210, 111, 64, 204, 227, 85, 236, 161, 212, 54, - 210, 111, 64, 204, 227, 200, 220, 212, 54, 64, 204, 227, 205, 237, 212, - 54, 250, 29, 203, 21, 250, 29, 185, 246, 156, 203, 21, 250, 29, 85, 203, - 21, 250, 29, 205, 242, 212, 216, 64, 26, 67, 234, 202, 64, 234, 202, 67, - 234, 202, 236, 161, 212, 216, 213, 220, 64, 234, 202, 45, 185, 246, 156, - 236, 161, 212, 54, 204, 227, 85, 203, 21, 212, 114, 250, 29, 205, 166, - 202, 73, 201, 153, 205, 166, 85, 244, 199, 205, 166, 205, 105, 85, 205, - 105, 248, 208, 250, 29, 236, 161, 203, 21, 211, 198, 250, 29, 85, 236, - 161, 203, 21, 211, 198, 250, 29, 240, 183, 78, 206, 249, 67, 244, 113, - 217, 20, 99, 240, 183, 78, 221, 107, 52, 237, 83, 67, 205, 57, 200, 17, - 52, 237, 83, 67, 205, 57, 221, 107, 52, 206, 249, 67, 205, 57, 200, 17, - 52, 206, 249, 67, 205, 57, 64, 211, 28, 113, 213, 247, 67, 211, 28, 113, - 213, 247, 67, 235, 225, 113, 213, 247, 64, 239, 9, 218, 181, 67, 196, - 216, 85, 235, 225, 113, 102, 167, 83, 153, 219, 99, 83, 153, 85, 83, 153, - 85, 206, 19, 200, 240, 244, 24, 211, 11, 113, 213, 247, 85, 206, 19, 244, - 24, 211, 11, 113, 213, 247, 85, 54, 200, 240, 244, 24, 211, 11, 113, 213, - 247, 85, 54, 244, 24, 211, 11, 113, 213, 247, 85, 125, 206, 19, 244, 24, - 211, 11, 113, 213, 247, 85, 125, 54, 244, 24, 211, 11, 113, 213, 247, - 240, 133, 204, 210, 213, 94, 2, 213, 247, 85, 235, 225, 113, 213, 247, - 85, 232, 13, 235, 225, 113, 213, 247, 85, 64, 232, 12, 209, 148, 85, 64, - 232, 13, 247, 122, 234, 203, 232, 12, 209, 148, 234, 203, 232, 13, 247, - 122, 219, 99, 50, 213, 81, 213, 247, 219, 99, 52, 213, 81, 213, 247, 219, - 99, 234, 216, 50, 213, 81, 213, 247, 219, 99, 234, 216, 52, 213, 81, 213, - 247, 219, 99, 222, 81, 250, 193, 247, 176, 213, 247, 219, 99, 209, 225, - 250, 193, 247, 176, 213, 247, 85, 222, 81, 250, 193, 211, 11, 113, 213, - 247, 85, 209, 225, 250, 193, 211, 11, 113, 213, 247, 85, 222, 81, 250, - 193, 247, 176, 213, 247, 85, 209, 225, 250, 193, 247, 176, 213, 247, 167, - 50, 201, 210, 206, 201, 247, 176, 213, 247, 167, 52, 201, 210, 206, 201, - 247, 176, 213, 247, 219, 99, 50, 240, 141, 247, 176, 213, 247, 219, 99, - 52, 240, 141, 247, 176, 213, 247, 238, 217, 217, 20, 45, 17, 98, 238, - 217, 217, 20, 45, 17, 103, 238, 217, 217, 20, 45, 17, 135, 238, 217, 217, - 20, 45, 17, 136, 238, 217, 217, 20, 45, 17, 150, 238, 217, 217, 20, 45, - 17, 174, 238, 217, 217, 20, 45, 17, 182, 238, 217, 217, 20, 45, 17, 178, - 238, 217, 217, 20, 45, 17, 184, 238, 217, 217, 20, 45, 35, 202, 248, 238, - 217, 45, 44, 17, 98, 238, 217, 45, 44, 17, 103, 238, 217, 45, 44, 17, - 135, 238, 217, 45, 44, 17, 136, 238, 217, 45, 44, 17, 150, 238, 217, 45, - 44, 17, 174, 238, 217, 45, 44, 17, 182, 238, 217, 45, 44, 17, 178, 238, - 217, 45, 44, 17, 184, 238, 217, 45, 44, 35, 202, 248, 238, 217, 217, 20, - 45, 44, 17, 98, 238, 217, 217, 20, 45, 44, 17, 103, 238, 217, 217, 20, - 45, 44, 17, 135, 238, 217, 217, 20, 45, 44, 17, 136, 238, 217, 217, 20, - 45, 44, 17, 150, 238, 217, 217, 20, 45, 44, 17, 174, 238, 217, 217, 20, - 45, 44, 17, 182, 238, 217, 217, 20, 45, 44, 17, 178, 238, 217, 217, 20, - 45, 44, 17, 184, 238, 217, 217, 20, 45, 44, 35, 202, 248, 85, 197, 55, - 90, 51, 85, 96, 56, 85, 218, 181, 56, 85, 238, 179, 56, 85, 205, 121, - 236, 199, 51, 85, 90, 51, 85, 164, 236, 199, 51, 237, 97, 212, 56, 90, - 51, 85, 209, 140, 90, 51, 201, 159, 90, 51, 85, 201, 159, 90, 51, 239, - 187, 201, 159, 90, 51, 85, 239, 187, 201, 159, 90, 51, 64, 90, 51, 202, - 125, 201, 220, 90, 250, 67, 202, 125, 247, 197, 90, 250, 67, 64, 90, 250, - 67, 85, 64, 240, 133, 237, 103, 26, 90, 51, 85, 64, 240, 133, 200, 8, 26, - 90, 51, 205, 54, 64, 90, 51, 85, 241, 18, 64, 90, 51, 209, 224, 67, 90, - 51, 222, 80, 67, 90, 51, 248, 244, 206, 249, 67, 90, 51, 234, 113, 206, - 249, 67, 90, 51, 85, 221, 107, 209, 223, 67, 90, 51, 85, 200, 17, 209, - 223, 67, 90, 51, 215, 190, 221, 107, 209, 223, 67, 90, 51, 240, 141, 221, - 129, 215, 190, 200, 17, 209, 223, 67, 90, 51, 45, 85, 67, 90, 51, 197, - 66, 90, 51, 247, 249, 205, 121, 236, 199, 51, 247, 249, 90, 51, 247, 249, - 164, 236, 199, 51, 85, 247, 249, 205, 121, 236, 199, 51, 85, 247, 249, - 90, 51, 85, 247, 249, 164, 236, 199, 51, 203, 23, 90, 51, 85, 203, 22, - 90, 51, 197, 91, 90, 51, 85, 197, 91, 90, 51, 214, 18, 90, 51, 54, 240, - 141, 221, 129, 122, 238, 227, 250, 192, 67, 201, 161, 240, 252, 4, 67, - 201, 160, 212, 231, 185, 204, 108, 185, 204, 60, 50, 209, 34, 248, 230, - 239, 86, 52, 209, 34, 248, 230, 239, 86, 214, 4, 3, 76, 225, 186, 210, - 41, 205, 140, 211, 237, 204, 108, 204, 61, 211, 237, 205, 139, 83, 248, - 190, 3, 231, 43, 101, 13, 209, 203, 239, 14, 172, 238, 178, 13, 235, 93, - 239, 14, 99, 221, 153, 250, 202, 99, 221, 153, 214, 3, 67, 239, 9, 3, - 246, 154, 238, 123, 26, 3, 238, 123, 236, 131, 77, 214, 16, 200, 7, 221, - 107, 52, 240, 222, 3, 238, 123, 200, 17, 50, 240, 222, 3, 238, 123, 50, - 213, 222, 225, 18, 52, 213, 222, 225, 18, 234, 98, 213, 222, 225, 18, - 222, 130, 120, 203, 115, 222, 130, 133, 203, 115, 50, 26, 52, 54, 200, - 239, 50, 26, 52, 203, 115, 50, 218, 34, 172, 52, 203, 115, 172, 50, 203, - 115, 120, 203, 116, 3, 244, 114, 57, 221, 103, 238, 184, 247, 81, 231, - 43, 209, 79, 67, 241, 17, 239, 8, 67, 241, 17, 239, 9, 3, 104, 202, 83, - 67, 241, 17, 239, 9, 3, 90, 202, 83, 67, 46, 3, 104, 202, 83, 67, 46, 3, - 90, 202, 83, 13, 50, 67, 46, 170, 13, 52, 67, 46, 170, 13, 50, 250, 193, - 170, 13, 52, 250, 193, 170, 13, 50, 54, 250, 193, 170, 13, 52, 54, 250, - 193, 170, 13, 50, 67, 201, 210, 206, 201, 170, 13, 52, 67, 201, 210, 206, - 201, 170, 13, 50, 234, 216, 213, 80, 13, 52, 234, 216, 213, 80, 200, 8, - 211, 39, 51, 237, 103, 211, 39, 51, 250, 169, 233, 222, 244, 114, 51, - 244, 69, 233, 222, 244, 114, 51, 52, 59, 3, 45, 212, 70, 172, 104, 51, - 172, 90, 51, 172, 50, 52, 51, 172, 104, 54, 51, 172, 90, 54, 51, 172, 50, - 52, 54, 51, 172, 104, 59, 234, 116, 153, 172, 90, 59, 234, 116, 153, 172, - 104, 54, 59, 234, 116, 153, 172, 90, 54, 59, 234, 116, 153, 172, 90, 205, - 50, 51, 61, 62, 247, 243, 61, 62, 238, 119, 61, 62, 237, 247, 61, 62, - 238, 118, 61, 62, 237, 183, 61, 62, 238, 54, 61, 62, 237, 246, 61, 62, - 238, 117, 61, 62, 237, 151, 61, 62, 238, 22, 61, 62, 237, 214, 61, 62, - 238, 85, 61, 62, 237, 182, 61, 62, 238, 53, 61, 62, 237, 245, 61, 62, - 238, 116, 61, 62, 237, 135, 61, 62, 238, 6, 61, 62, 237, 198, 61, 62, - 238, 69, 61, 62, 237, 166, 61, 62, 238, 37, 61, 62, 237, 229, 61, 62, - 238, 100, 61, 62, 237, 150, 61, 62, 238, 21, 61, 62, 237, 213, 61, 62, - 238, 84, 61, 62, 237, 181, 61, 62, 238, 52, 61, 62, 237, 244, 61, 62, - 238, 115, 61, 62, 237, 127, 61, 62, 237, 254, 61, 62, 237, 190, 61, 62, - 238, 61, 61, 62, 237, 158, 61, 62, 238, 29, 61, 62, 237, 221, 61, 62, - 238, 92, 61, 62, 237, 142, 61, 62, 238, 13, 61, 62, 237, 205, 61, 62, - 238, 76, 61, 62, 237, 173, 61, 62, 238, 44, 61, 62, 237, 236, 61, 62, - 238, 107, 61, 62, 237, 134, 61, 62, 238, 5, 61, 62, 237, 197, 61, 62, - 238, 68, 61, 62, 237, 165, 61, 62, 238, 36, 61, 62, 237, 228, 61, 62, - 238, 99, 61, 62, 237, 149, 61, 62, 238, 20, 61, 62, 237, 212, 61, 62, - 238, 83, 61, 62, 237, 180, 61, 62, 238, 51, 61, 62, 237, 243, 61, 62, - 238, 114, 61, 62, 237, 123, 61, 62, 237, 250, 61, 62, 237, 186, 61, 62, - 238, 57, 61, 62, 237, 154, 61, 62, 238, 25, 61, 62, 237, 217, 61, 62, - 238, 88, 61, 62, 237, 138, 61, 62, 238, 9, 61, 62, 237, 201, 61, 62, 238, - 72, 61, 62, 237, 169, 61, 62, 238, 40, 61, 62, 237, 232, 61, 62, 238, - 103, 61, 62, 237, 130, 61, 62, 238, 1, 61, 62, 237, 193, 61, 62, 238, 64, - 61, 62, 237, 161, 61, 62, 238, 32, 61, 62, 237, 224, 61, 62, 238, 95, 61, - 62, 237, 145, 61, 62, 238, 16, 61, 62, 237, 208, 61, 62, 238, 79, 61, 62, - 237, 176, 61, 62, 238, 47, 61, 62, 237, 239, 61, 62, 238, 110, 61, 62, - 237, 126, 61, 62, 237, 253, 61, 62, 237, 189, 61, 62, 238, 60, 61, 62, - 237, 157, 61, 62, 238, 28, 61, 62, 237, 220, 61, 62, 238, 91, 61, 62, - 237, 141, 61, 62, 238, 12, 61, 62, 237, 204, 61, 62, 238, 75, 61, 62, - 237, 172, 61, 62, 238, 43, 61, 62, 237, 235, 61, 62, 238, 106, 61, 62, - 237, 133, 61, 62, 238, 4, 61, 62, 237, 196, 61, 62, 238, 67, 61, 62, 237, - 164, 61, 62, 238, 35, 61, 62, 237, 227, 61, 62, 238, 98, 61, 62, 237, - 148, 61, 62, 238, 19, 61, 62, 237, 211, 61, 62, 238, 82, 61, 62, 237, - 179, 61, 62, 238, 50, 61, 62, 237, 242, 61, 62, 238, 113, 61, 62, 237, - 121, 61, 62, 237, 248, 61, 62, 237, 184, 61, 62, 238, 55, 61, 62, 237, - 152, 61, 62, 238, 23, 61, 62, 237, 215, 61, 62, 238, 86, 61, 62, 237, - 136, 61, 62, 238, 7, 61, 62, 237, 199, 61, 62, 238, 70, 61, 62, 237, 167, - 61, 62, 238, 38, 61, 62, 237, 230, 61, 62, 238, 101, 61, 62, 237, 128, - 61, 62, 237, 255, 61, 62, 237, 191, 61, 62, 238, 62, 61, 62, 237, 159, - 61, 62, 238, 30, 61, 62, 237, 222, 61, 62, 238, 93, 61, 62, 237, 143, 61, - 62, 238, 14, 61, 62, 237, 206, 61, 62, 238, 77, 61, 62, 237, 174, 61, 62, - 238, 45, 61, 62, 237, 237, 61, 62, 238, 108, 61, 62, 237, 124, 61, 62, - 237, 251, 61, 62, 237, 187, 61, 62, 238, 58, 61, 62, 237, 155, 61, 62, - 238, 26, 61, 62, 237, 218, 61, 62, 238, 89, 61, 62, 237, 139, 61, 62, - 238, 10, 61, 62, 237, 202, 61, 62, 238, 73, 61, 62, 237, 170, 61, 62, - 238, 41, 61, 62, 237, 233, 61, 62, 238, 104, 61, 62, 237, 131, 61, 62, - 238, 2, 61, 62, 237, 194, 61, 62, 238, 65, 61, 62, 237, 162, 61, 62, 238, - 33, 61, 62, 237, 225, 61, 62, 238, 96, 61, 62, 237, 146, 61, 62, 238, 17, - 61, 62, 237, 209, 61, 62, 238, 80, 61, 62, 237, 177, 61, 62, 238, 48, 61, - 62, 237, 240, 61, 62, 238, 111, 61, 62, 237, 122, 61, 62, 237, 249, 61, - 62, 237, 185, 61, 62, 238, 56, 61, 62, 237, 153, 61, 62, 238, 24, 61, 62, - 237, 216, 61, 62, 238, 87, 61, 62, 237, 137, 61, 62, 238, 8, 61, 62, 237, - 200, 61, 62, 238, 71, 61, 62, 237, 168, 61, 62, 238, 39, 61, 62, 237, - 231, 61, 62, 238, 102, 61, 62, 237, 129, 61, 62, 238, 0, 61, 62, 237, - 192, 61, 62, 238, 63, 61, 62, 237, 160, 61, 62, 238, 31, 61, 62, 237, - 223, 61, 62, 238, 94, 61, 62, 237, 144, 61, 62, 238, 15, 61, 62, 237, - 207, 61, 62, 238, 78, 61, 62, 237, 175, 61, 62, 238, 46, 61, 62, 237, - 238, 61, 62, 238, 109, 61, 62, 237, 125, 61, 62, 237, 252, 61, 62, 237, - 188, 61, 62, 238, 59, 61, 62, 237, 156, 61, 62, 238, 27, 61, 62, 237, - 219, 61, 62, 238, 90, 61, 62, 237, 140, 61, 62, 238, 11, 61, 62, 237, - 203, 61, 62, 238, 74, 61, 62, 237, 171, 61, 62, 238, 42, 61, 62, 237, - 234, 61, 62, 238, 105, 61, 62, 237, 132, 61, 62, 238, 3, 61, 62, 237, - 195, 61, 62, 238, 66, 61, 62, 237, 163, 61, 62, 238, 34, 61, 62, 237, - 226, 61, 62, 238, 97, 61, 62, 237, 147, 61, 62, 238, 18, 61, 62, 237, - 210, 61, 62, 238, 81, 61, 62, 237, 178, 61, 62, 238, 49, 61, 62, 237, - 241, 61, 62, 238, 112, 90, 200, 196, 59, 3, 83, 101, 90, 200, 196, 59, 3, - 54, 83, 101, 104, 54, 59, 3, 83, 101, 90, 54, 59, 3, 83, 101, 50, 52, 54, - 59, 3, 83, 101, 90, 200, 196, 59, 234, 116, 153, 104, 54, 59, 234, 116, - 153, 90, 54, 59, 234, 116, 153, 237, 103, 59, 3, 231, 43, 101, 200, 8, - 59, 3, 231, 43, 101, 200, 8, 201, 145, 51, 237, 103, 201, 145, 51, 104, - 54, 239, 189, 51, 90, 54, 239, 189, 51, 104, 201, 145, 239, 189, 51, 90, - 201, 145, 239, 189, 51, 90, 200, 196, 201, 145, 239, 189, 51, 90, 59, 3, - 237, 120, 204, 209, 200, 8, 59, 202, 2, 153, 237, 103, 59, 202, 2, 153, - 90, 59, 3, 203, 104, 3, 83, 101, 90, 59, 3, 203, 104, 3, 54, 83, 101, 90, - 200, 196, 59, 3, 203, 103, 90, 200, 196, 59, 3, 203, 104, 3, 83, 101, 90, - 200, 196, 59, 3, 203, 104, 3, 54, 83, 101, 104, 250, 69, 90, 250, 69, - 104, 54, 250, 69, 90, 54, 250, 69, 104, 59, 202, 2, 64, 239, 8, 90, 59, - 202, 2, 64, 239, 8, 104, 59, 234, 116, 248, 190, 202, 2, 64, 239, 8, 90, - 59, 234, 116, 248, 190, 202, 2, 64, 239, 8, 164, 197, 81, 26, 205, 121, - 236, 199, 51, 164, 236, 199, 26, 205, 121, 197, 81, 51, 164, 197, 81, 59, - 3, 124, 164, 236, 199, 59, 3, 124, 205, 121, 236, 199, 59, 3, 124, 205, - 121, 197, 81, 59, 3, 124, 164, 197, 81, 59, 26, 164, 236, 199, 51, 164, - 236, 199, 59, 26, 205, 121, 236, 199, 51, 205, 121, 236, 199, 59, 26, - 205, 121, 197, 81, 51, 205, 121, 197, 81, 59, 26, 164, 197, 81, 51, 209, - 203, 239, 15, 240, 176, 235, 93, 239, 14, 235, 93, 239, 15, 240, 176, - 209, 203, 239, 14, 205, 121, 236, 199, 59, 240, 176, 164, 236, 199, 51, - 164, 236, 199, 59, 240, 176, 205, 121, 236, 199, 51, 235, 93, 239, 15, - 240, 176, 164, 236, 199, 51, 209, 203, 239, 15, 240, 176, 205, 121, 236, - 199, 51, 164, 236, 199, 59, 240, 176, 164, 197, 81, 51, 164, 197, 81, 59, - 240, 176, 164, 236, 199, 51, 197, 115, 59, 212, 52, 238, 207, 209, 230, - 59, 212, 52, 90, 202, 178, 240, 131, 200, 7, 59, 212, 52, 90, 202, 178, - 240, 131, 237, 102, 59, 212, 52, 237, 103, 202, 178, 240, 131, 222, 76, - 59, 212, 52, 237, 103, 202, 178, 240, 131, 209, 219, 209, 222, 250, 102, - 244, 69, 51, 222, 79, 250, 102, 250, 169, 51, 201, 222, 250, 102, 250, - 169, 51, 247, 199, 250, 102, 250, 169, 51, 201, 222, 250, 102, 244, 69, - 59, 3, 218, 180, 201, 222, 250, 102, 250, 169, 59, 3, 212, 70, 221, 107, - 52, 207, 63, 244, 69, 51, 221, 107, 50, 207, 63, 250, 169, 51, 250, 169, - 244, 67, 244, 114, 51, 244, 69, 244, 67, 244, 114, 51, 90, 59, 89, 206, - 139, 104, 51, 104, 59, 89, 206, 139, 90, 51, 206, 139, 90, 59, 89, 104, - 51, 90, 59, 3, 96, 58, 104, 59, 3, 96, 58, 90, 59, 202, 117, 196, 216, - 50, 52, 59, 202, 117, 4, 244, 113, 200, 8, 200, 196, 59, 234, 116, 4, - 244, 113, 50, 161, 120, 52, 161, 133, 232, 53, 50, 161, 133, 52, 161, - 120, 232, 53, 120, 161, 52, 133, 161, 50, 232, 53, 120, 161, 50, 133, - 161, 52, 232, 53, 50, 161, 120, 52, 161, 120, 232, 53, 120, 161, 52, 133, - 161, 52, 232, 53, 50, 161, 133, 52, 161, 133, 232, 53, 120, 161, 50, 133, - 161, 50, 232, 53, 104, 232, 54, 3, 161, 120, 202, 2, 153, 90, 232, 54, 3, - 161, 120, 202, 2, 153, 200, 8, 232, 54, 3, 161, 52, 202, 2, 153, 237, - 103, 232, 54, 3, 161, 52, 202, 2, 153, 104, 232, 54, 3, 161, 133, 202, 2, - 153, 90, 232, 54, 3, 161, 133, 202, 2, 153, 200, 8, 232, 54, 3, 161, 50, - 202, 2, 153, 237, 103, 232, 54, 3, 161, 50, 202, 2, 153, 104, 232, 54, 3, - 161, 120, 234, 116, 153, 90, 232, 54, 3, 161, 120, 234, 116, 153, 200, 8, - 232, 54, 3, 161, 52, 234, 116, 153, 237, 103, 232, 54, 3, 161, 52, 234, - 116, 153, 104, 232, 54, 3, 161, 133, 234, 116, 153, 90, 232, 54, 3, 161, - 133, 234, 116, 153, 200, 8, 232, 54, 3, 161, 50, 234, 116, 153, 237, 103, - 232, 54, 3, 161, 50, 234, 116, 153, 104, 232, 54, 3, 161, 120, 89, 104, - 232, 54, 3, 161, 237, 106, 200, 8, 232, 54, 3, 161, 50, 248, 65, 200, 8, - 232, 54, 3, 161, 209, 230, 90, 232, 54, 3, 161, 120, 89, 90, 232, 54, 3, - 161, 237, 106, 237, 103, 232, 54, 3, 161, 50, 248, 65, 237, 103, 232, 54, - 3, 161, 209, 230, 104, 232, 54, 3, 161, 120, 89, 90, 232, 54, 3, 161, - 200, 20, 104, 232, 54, 3, 161, 133, 89, 90, 232, 54, 3, 161, 237, 106, - 90, 232, 54, 3, 161, 120, 89, 104, 232, 54, 3, 161, 200, 20, 90, 232, 54, - 3, 161, 133, 89, 104, 232, 54, 3, 161, 237, 106, 104, 232, 54, 3, 161, - 120, 89, 172, 239, 188, 104, 232, 54, 3, 161, 133, 248, 81, 172, 239, - 188, 90, 232, 54, 3, 161, 120, 89, 172, 239, 188, 90, 232, 54, 3, 161, - 133, 248, 81, 172, 239, 188, 200, 8, 232, 54, 3, 161, 50, 248, 65, 237, - 103, 232, 54, 3, 161, 209, 230, 237, 103, 232, 54, 3, 161, 50, 248, 65, - 200, 8, 232, 54, 3, 161, 209, 230, 52, 54, 59, 3, 209, 139, 232, 22, 236, - 49, 2, 89, 90, 51, 202, 57, 214, 14, 89, 90, 51, 104, 59, 89, 202, 57, - 214, 13, 90, 59, 89, 202, 57, 214, 13, 90, 59, 89, 250, 241, 171, 147, - 222, 42, 89, 104, 51, 104, 59, 202, 117, 222, 41, 232, 232, 89, 90, 51, - 204, 109, 89, 90, 51, 104, 59, 202, 117, 204, 108, 204, 61, 89, 104, 51, - 50, 234, 248, 203, 103, 52, 234, 248, 203, 103, 120, 234, 248, 203, 103, - 133, 234, 248, 203, 103, 201, 145, 83, 248, 190, 239, 86, 195, 158, 215, - 192, 205, 68, 195, 158, 215, 192, 200, 183, 244, 32, 50, 67, 240, 141, - 170, 52, 67, 240, 141, 170, 50, 67, 213, 80, 52, 67, 213, 80, 195, 158, - 215, 192, 50, 225, 246, 170, 195, 158, 215, 192, 52, 225, 246, 170, 195, - 158, 215, 192, 50, 248, 19, 170, 195, 158, 215, 192, 52, 248, 19, 170, - 50, 46, 247, 176, 3, 200, 45, 52, 46, 247, 176, 3, 200, 45, 50, 46, 247, - 176, 3, 202, 84, 225, 231, 201, 222, 240, 221, 52, 46, 247, 176, 3, 202, - 84, 225, 231, 247, 199, 240, 221, 50, 46, 247, 176, 3, 202, 84, 225, 231, - 247, 199, 240, 221, 52, 46, 247, 176, 3, 202, 84, 225, 231, 201, 222, - 240, 221, 50, 250, 193, 247, 176, 3, 238, 123, 52, 250, 193, 247, 176, 3, - 238, 123, 50, 250, 102, 222, 42, 170, 52, 250, 102, 232, 232, 170, 54, - 50, 250, 102, 232, 232, 170, 54, 52, 250, 102, 222, 42, 170, 50, 64, 201, - 210, 206, 201, 170, 52, 64, 201, 210, 206, 201, 170, 237, 120, 235, 49, - 83, 195, 24, 221, 233, 219, 108, 250, 193, 214, 16, 222, 86, 52, 250, - 193, 199, 119, 3, 205, 57, 219, 108, 52, 250, 193, 3, 238, 123, 250, 193, - 3, 209, 36, 225, 186, 251, 110, 250, 192, 205, 90, 250, 193, 214, 16, - 222, 86, 205, 90, 250, 193, 214, 16, 200, 20, 200, 240, 250, 192, 210, - 40, 250, 192, 250, 193, 3, 200, 45, 210, 40, 250, 193, 3, 200, 45, 214, - 109, 250, 193, 214, 16, 200, 20, 214, 109, 250, 193, 214, 16, 237, 106, - 219, 108, 250, 193, 3, 185, 250, 80, 236, 95, 225, 231, 59, 212, 52, 120, - 26, 209, 230, 219, 108, 250, 193, 3, 185, 250, 80, 236, 95, 225, 231, 59, - 212, 52, 120, 26, 222, 86, 219, 108, 250, 193, 3, 185, 250, 80, 236, 95, - 225, 231, 59, 212, 52, 133, 26, 209, 230, 219, 108, 250, 193, 3, 185, - 250, 80, 236, 95, 225, 231, 59, 212, 52, 133, 26, 222, 86, 219, 108, 250, - 193, 3, 185, 250, 80, 236, 95, 225, 231, 59, 212, 52, 52, 26, 200, 20, - 219, 108, 250, 193, 3, 185, 250, 80, 236, 95, 225, 231, 59, 212, 52, 50, - 26, 200, 20, 219, 108, 250, 193, 3, 185, 250, 80, 236, 95, 225, 231, 59, - 212, 52, 52, 26, 237, 106, 219, 108, 250, 193, 3, 185, 250, 80, 236, 95, - 225, 231, 59, 212, 52, 50, 26, 237, 106, 210, 40, 236, 108, 207, 32, 236, - 108, 207, 33, 3, 213, 216, 236, 108, 207, 33, 3, 4, 244, 114, 57, 236, - 108, 207, 33, 3, 52, 59, 57, 236, 108, 207, 33, 3, 50, 59, 57, 244, 114, - 3, 231, 43, 153, 45, 83, 153, 45, 213, 85, 45, 210, 41, 205, 139, 45, - 212, 231, 244, 114, 238, 184, 247, 81, 231, 43, 248, 190, 26, 201, 222, - 155, 238, 184, 247, 81, 83, 153, 244, 114, 3, 204, 63, 196, 216, 45, 250, - 167, 238, 179, 56, 120, 59, 202, 117, 244, 113, 45, 67, 247, 122, 45, - 247, 122, 45, 222, 41, 45, 232, 231, 244, 114, 3, 4, 244, 114, 202, 2, - 202, 187, 209, 230, 244, 114, 3, 114, 231, 43, 204, 151, 202, 2, 202, - 187, 209, 230, 99, 209, 203, 239, 15, 205, 209, 99, 235, 93, 239, 15, - 205, 209, 99, 250, 29, 99, 4, 244, 113, 99, 205, 57, 114, 225, 17, 205, - 55, 201, 161, 3, 76, 57, 201, 161, 3, 200, 45, 209, 36, 225, 231, 201, - 160, 201, 161, 3, 207, 40, 250, 19, 247, 198, 52, 201, 161, 89, 50, 201, - 160, 50, 201, 161, 248, 65, 83, 153, 83, 248, 190, 248, 65, 52, 201, 160, - 247, 186, 3, 50, 155, 247, 250, 247, 186, 3, 52, 155, 247, 250, 64, 247, - 185, 24, 3, 50, 155, 247, 250, 24, 3, 52, 155, 247, 250, 67, 230, 233, - 64, 230, 233, 50, 197, 50, 235, 49, 52, 197, 50, 235, 49, 50, 54, 197, - 50, 235, 49, 52, 54, 197, 50, 235, 49, 225, 223, 225, 207, 202, 80, 126, - 225, 207, 225, 208, 217, 22, 3, 83, 153, 237, 114, 218, 34, 46, 3, 240, - 244, 213, 221, 225, 220, 250, 52, 206, 101, 211, 209, 236, 49, 2, 26, - 205, 211, 213, 85, 236, 49, 2, 26, 205, 211, 213, 86, 3, 202, 57, 57, - 230, 81, 202, 2, 26, 205, 211, 213, 85, 233, 37, 204, 226, 202, 175, 237, - 105, 201, 161, 3, 50, 155, 247, 250, 237, 105, 201, 161, 3, 52, 155, 247, - 250, 64, 239, 9, 3, 133, 51, 64, 221, 102, 67, 244, 114, 3, 133, 51, 64, - 244, 114, 3, 133, 51, 236, 33, 67, 205, 57, 236, 33, 64, 205, 57, 236, - 33, 67, 239, 8, 236, 33, 64, 239, 8, 236, 33, 67, 244, 113, 236, 33, 64, - 244, 113, 209, 78, 210, 41, 205, 140, 214, 13, 205, 140, 3, 213, 216, - 210, 41, 205, 140, 3, 231, 43, 101, 248, 28, 205, 139, 248, 28, 210, 41, - 205, 139, 54, 212, 70, 201, 145, 212, 70, 222, 81, 240, 133, 250, 193, - 170, 209, 225, 240, 133, 250, 193, 170, 202, 41, 218, 178, 217, 224, 45, - 76, 214, 13, 217, 224, 45, 96, 214, 13, 217, 224, 45, 24, 214, 13, 217, - 224, 200, 35, 214, 14, 3, 238, 123, 217, 224, 200, 35, 214, 14, 3, 212, - 70, 217, 224, 46, 225, 169, 214, 13, 217, 224, 46, 200, 35, 214, 13, 114, - 221, 153, 26, 214, 13, 114, 221, 153, 214, 4, 214, 13, 217, 224, 24, 214, - 13, 218, 128, 114, 204, 84, 204, 82, 3, 225, 182, 211, 39, 225, 183, 214, - 13, 235, 1, 213, 74, 225, 182, 225, 183, 3, 54, 101, 225, 183, 249, 237, - 3, 205, 209, 244, 106, 234, 95, 250, 169, 225, 180, 221, 234, 225, 181, - 3, 210, 112, 213, 53, 250, 77, 212, 46, 221, 234, 225, 181, 3, 207, 63, - 213, 53, 250, 77, 212, 46, 221, 234, 225, 181, 215, 194, 225, 225, 202, - 187, 212, 46, 225, 183, 250, 77, 39, 212, 56, 214, 13, 211, 33, 225, 183, - 214, 13, 225, 183, 3, 104, 59, 3, 124, 225, 183, 3, 24, 56, 225, 183, 3, - 225, 168, 225, 183, 3, 200, 34, 225, 183, 3, 213, 216, 225, 183, 3, 200, - 45, 225, 18, 222, 130, 50, 201, 161, 214, 13, 195, 158, 215, 192, 208, - 125, 241, 24, 195, 158, 215, 192, 208, 125, 212, 110, 195, 158, 215, 192, - 208, 125, 211, 204, 96, 2, 3, 4, 244, 114, 57, 96, 2, 3, 244, 105, 251, - 123, 57, 96, 2, 3, 202, 57, 57, 96, 2, 3, 76, 58, 96, 2, 3, 202, 57, 58, - 96, 2, 3, 204, 110, 103, 96, 2, 3, 64, 201, 160, 218, 181, 2, 3, 244, 24, - 57, 218, 181, 2, 3, 76, 58, 218, 181, 2, 3, 235, 93, 238, 120, 218, 181, - 2, 3, 209, 203, 238, 120, 96, 2, 225, 231, 50, 155, 244, 113, 96, 2, 225, - 231, 52, 155, 244, 113, 199, 104, 214, 4, 240, 183, 211, 209, 218, 30, 2, - 3, 76, 57, 218, 30, 2, 3, 200, 45, 207, 60, 211, 210, 3, 247, 199, 244, - 66, 205, 184, 211, 209, 218, 30, 2, 225, 231, 50, 155, 244, 113, 218, 30, - 2, 225, 231, 52, 155, 244, 113, 45, 218, 30, 2, 3, 244, 105, 251, 122, - 218, 30, 2, 225, 231, 54, 244, 113, 45, 238, 179, 56, 96, 2, 225, 231, - 201, 160, 218, 181, 2, 225, 231, 201, 160, 218, 30, 2, 225, 231, 201, - 160, 225, 177, 211, 209, 209, 220, 225, 177, 211, 209, 195, 158, 215, - 192, 210, 86, 241, 24, 250, 223, 214, 4, 240, 228, 225, 169, 3, 238, 123, - 200, 35, 3, 218, 181, 56, 200, 35, 3, 213, 216, 225, 169, 3, 213, 216, - 225, 169, 3, 221, 153, 250, 202, 200, 35, 3, 221, 153, 214, 3, 200, 35, - 89, 225, 168, 225, 169, 89, 200, 34, 200, 35, 89, 248, 190, 89, 225, 168, - 225, 169, 89, 248, 190, 89, 200, 34, 200, 35, 248, 65, 26, 225, 17, 3, - 200, 34, 225, 169, 248, 65, 26, 225, 17, 3, 225, 168, 244, 67, 200, 35, - 3, 207, 39, 244, 67, 225, 169, 3, 207, 39, 54, 46, 225, 168, 54, 46, 200, - 34, 244, 67, 200, 35, 3, 207, 40, 26, 205, 184, 211, 209, 221, 153, 26, - 3, 76, 57, 221, 153, 214, 4, 3, 76, 57, 54, 221, 153, 250, 202, 54, 221, - 153, 214, 3, 114, 225, 170, 221, 153, 250, 202, 114, 225, 170, 221, 153, - 214, 3, 205, 193, 222, 130, 214, 3, 205, 193, 222, 130, 250, 202, 221, - 153, 214, 4, 213, 212, 221, 153, 250, 202, 221, 153, 26, 3, 108, 204, - 209, 221, 153, 214, 4, 3, 108, 204, 209, 221, 153, 26, 3, 231, 43, 239, - 188, 221, 153, 214, 4, 3, 231, 43, 239, 188, 221, 153, 26, 3, 54, 213, - 216, 221, 153, 26, 3, 200, 45, 221, 153, 26, 3, 54, 200, 45, 4, 199, 101, - 3, 200, 45, 221, 153, 214, 4, 3, 54, 213, 216, 221, 153, 214, 4, 3, 54, - 200, 45, 195, 158, 215, 192, 238, 133, 250, 159, 195, 158, 215, 192, 210, - 154, 250, 159, 236, 49, 2, 3, 76, 58, 230, 81, 3, 76, 57, 201, 145, 231, - 43, 248, 190, 3, 54, 83, 101, 201, 145, 231, 43, 248, 190, 3, 201, 145, - 83, 101, 202, 57, 214, 14, 3, 76, 57, 202, 57, 214, 14, 3, 209, 203, 238, - 120, 206, 28, 218, 181, 206, 27, 241, 11, 3, 76, 57, 236, 49, 3, 250, 29, - 250, 241, 171, 202, 2, 3, 244, 105, 251, 122, 250, 125, 171, 214, 4, 171, - 147, 236, 49, 2, 89, 96, 56, 96, 2, 89, 236, 49, 56, 236, 49, 2, 89, 202, - 57, 214, 13, 54, 244, 33, 236, 50, 114, 241, 4, 236, 49, 206, 42, 122, - 241, 4, 236, 49, 206, 42, 236, 49, 2, 3, 114, 238, 121, 89, 26, 114, 238, - 121, 58, 236, 44, 3, 234, 145, 238, 121, 57, 222, 42, 3, 244, 114, 225, - 186, 232, 232, 3, 244, 114, 225, 186, 222, 42, 3, 211, 28, 113, 57, 232, - 232, 3, 211, 28, 113, 57, 222, 42, 214, 4, 205, 211, 171, 147, 232, 232, - 214, 4, 205, 211, 171, 147, 222, 42, 214, 4, 205, 211, 171, 202, 2, 3, - 76, 225, 186, 232, 232, 214, 4, 205, 211, 171, 202, 2, 3, 76, 225, 186, - 222, 42, 214, 4, 205, 211, 171, 202, 2, 3, 76, 57, 232, 232, 214, 4, 205, - 211, 171, 202, 2, 3, 76, 57, 222, 42, 214, 4, 205, 211, 171, 202, 2, 3, - 76, 89, 209, 230, 232, 232, 214, 4, 205, 211, 171, 202, 2, 3, 76, 89, - 222, 86, 222, 42, 214, 4, 250, 126, 232, 232, 214, 4, 250, 126, 222, 42, - 26, 206, 17, 215, 194, 171, 147, 232, 232, 26, 206, 17, 215, 194, 171, - 147, 222, 42, 26, 215, 194, 250, 126, 232, 232, 26, 215, 194, 250, 126, - 222, 42, 89, 237, 113, 171, 89, 232, 231, 232, 232, 89, 237, 113, 171, - 89, 222, 41, 222, 42, 89, 206, 28, 214, 4, 236, 50, 232, 232, 89, 206, - 28, 214, 4, 236, 50, 222, 42, 89, 206, 28, 89, 232, 231, 232, 232, 89, - 206, 28, 89, 222, 41, 222, 42, 89, 232, 232, 89, 237, 113, 236, 50, 232, - 232, 89, 222, 42, 89, 237, 113, 236, 50, 222, 42, 89, 205, 211, 171, 89, - 232, 232, 89, 205, 211, 236, 50, 232, 232, 89, 205, 211, 171, 89, 222, - 42, 89, 205, 211, 236, 50, 205, 211, 171, 202, 2, 214, 4, 222, 41, 205, - 211, 171, 202, 2, 214, 4, 232, 231, 205, 211, 171, 202, 2, 214, 4, 222, - 42, 3, 76, 225, 186, 205, 211, 171, 202, 2, 214, 4, 232, 232, 3, 76, 225, - 186, 237, 113, 171, 202, 2, 214, 4, 222, 41, 237, 113, 171, 202, 2, 214, - 4, 232, 231, 237, 113, 205, 211, 171, 202, 2, 214, 4, 222, 41, 237, 113, - 205, 211, 171, 202, 2, 214, 4, 232, 231, 206, 28, 214, 4, 222, 41, 206, - 28, 214, 4, 232, 231, 206, 28, 89, 222, 42, 89, 236, 49, 56, 206, 28, 89, - 232, 232, 89, 236, 49, 56, 54, 217, 7, 222, 41, 54, 217, 7, 232, 231, 54, - 217, 7, 222, 42, 3, 200, 45, 232, 232, 213, 212, 222, 41, 232, 232, 248, - 65, 222, 41, 222, 42, 244, 67, 247, 81, 240, 134, 232, 232, 244, 67, 247, - 81, 240, 134, 222, 42, 244, 67, 247, 81, 240, 135, 89, 205, 211, 236, 50, - 232, 232, 244, 67, 247, 81, 240, 135, 89, 205, 211, 236, 50, 205, 185, - 202, 191, 222, 128, 202, 191, 205, 185, 202, 192, 214, 4, 171, 147, 222, - 128, 202, 192, 214, 4, 171, 147, 236, 49, 2, 3, 247, 115, 57, 211, 239, - 89, 206, 17, 236, 49, 56, 204, 101, 89, 206, 17, 236, 49, 56, 211, 239, - 89, 206, 17, 215, 194, 171, 147, 204, 101, 89, 206, 17, 215, 194, 171, - 147, 211, 239, 89, 236, 49, 56, 204, 101, 89, 236, 49, 56, 211, 239, 89, - 215, 194, 171, 147, 204, 101, 89, 215, 194, 171, 147, 211, 239, 89, 250, - 241, 171, 147, 204, 101, 89, 250, 241, 171, 147, 211, 239, 89, 215, 194, - 250, 241, 171, 147, 204, 101, 89, 215, 194, 250, 241, 171, 147, 54, 211, - 238, 54, 204, 100, 204, 109, 3, 238, 123, 204, 61, 3, 238, 123, 204, 109, - 3, 96, 2, 58, 204, 61, 3, 96, 2, 58, 204, 109, 3, 218, 30, 2, 58, 204, - 61, 3, 218, 30, 2, 58, 204, 109, 77, 214, 4, 171, 202, 2, 3, 76, 57, 204, - 61, 77, 214, 4, 171, 202, 2, 3, 76, 57, 204, 109, 77, 89, 236, 49, 56, - 204, 61, 77, 89, 236, 49, 56, 204, 109, 77, 89, 202, 57, 214, 13, 204, - 61, 77, 89, 202, 57, 214, 13, 204, 109, 77, 89, 250, 241, 171, 147, 204, - 61, 77, 89, 250, 241, 171, 147, 204, 109, 77, 89, 215, 194, 171, 147, - 204, 61, 77, 89, 215, 194, 171, 147, 46, 50, 185, 107, 214, 13, 46, 52, - 185, 107, 214, 13, 244, 67, 204, 108, 244, 67, 204, 60, 244, 67, 204, - 109, 214, 4, 171, 147, 244, 67, 204, 61, 214, 4, 171, 147, 204, 109, 89, - 204, 60, 204, 61, 89, 204, 108, 204, 109, 89, 204, 108, 204, 61, 89, 204, - 60, 204, 61, 248, 65, 204, 108, 204, 61, 248, 65, 26, 225, 17, 247, 81, - 239, 189, 3, 204, 108, 236, 131, 77, 214, 16, 237, 102, 212, 100, 3, 203, - 17, 201, 221, 201, 178, 225, 168, 234, 162, 215, 209, 206, 139, 50, 203, - 115, 206, 139, 133, 203, 115, 206, 139, 120, 203, 115, 212, 232, 3, 209, - 35, 83, 248, 190, 201, 145, 52, 200, 239, 54, 83, 248, 190, 50, 200, 239, - 83, 248, 190, 54, 50, 200, 239, 54, 83, 248, 190, 54, 50, 200, 239, 172, - 239, 189, 234, 116, 50, 219, 78, 77, 54, 199, 88, 206, 139, 133, 203, - 116, 3, 213, 216, 206, 139, 120, 203, 116, 3, 200, 45, 206, 139, 120, - 203, 116, 89, 206, 139, 133, 203, 115, 54, 133, 203, 115, 54, 120, 203, - 115, 54, 204, 163, 215, 194, 56, 210, 40, 54, 204, 163, 215, 194, 56, - 238, 145, 215, 194, 238, 186, 3, 210, 40, 217, 21, 205, 209, 83, 221, - 234, 3, 244, 114, 57, 83, 221, 234, 3, 244, 114, 58, 133, 203, 116, 3, - 244, 114, 58, 213, 86, 3, 231, 43, 101, 213, 86, 3, 202, 57, 214, 13, - 201, 145, 83, 248, 190, 248, 21, 210, 87, 201, 145, 83, 248, 190, 3, 231, - 43, 101, 201, 145, 244, 33, 214, 13, 201, 145, 217, 7, 222, 41, 201, 145, - 217, 7, 232, 231, 237, 113, 205, 211, 222, 42, 214, 4, 171, 147, 237, - 113, 205, 211, 232, 232, 214, 4, 171, 147, 201, 145, 205, 140, 248, 21, - 210, 87, 222, 130, 201, 145, 83, 248, 190, 214, 13, 54, 205, 140, 214, - 13, 67, 83, 153, 217, 224, 67, 83, 153, 164, 236, 199, 67, 51, 164, 197, - 81, 67, 51, 205, 121, 236, 199, 67, 51, 205, 121, 197, 81, 67, 51, 50, - 52, 67, 51, 104, 64, 51, 200, 8, 64, 51, 237, 103, 64, 51, 164, 236, 199, - 64, 51, 164, 197, 81, 64, 51, 205, 121, 236, 199, 64, 51, 205, 121, 197, - 81, 64, 51, 50, 52, 64, 51, 120, 133, 64, 51, 90, 59, 3, 202, 40, 237, - 102, 90, 59, 3, 202, 40, 200, 7, 104, 59, 3, 202, 40, 237, 102, 104, 59, - 3, 202, 40, 200, 7, 46, 3, 201, 222, 155, 247, 250, 46, 3, 247, 199, 155, - 247, 250, 46, 3, 200, 17, 52, 239, 15, 155, 247, 250, 46, 3, 221, 107, - 50, 239, 15, 155, 247, 250, 239, 9, 3, 50, 155, 247, 250, 239, 9, 3, 52, - 155, 247, 250, 239, 9, 3, 201, 222, 155, 247, 250, 239, 9, 3, 247, 199, - 155, 247, 250, 237, 120, 205, 57, 64, 222, 130, 205, 57, 67, 222, 130, - 205, 57, 64, 199, 36, 4, 205, 57, 67, 199, 36, 4, 205, 57, 64, 212, 254, - 67, 212, 254, 67, 231, 228, 64, 231, 228, 231, 43, 64, 231, 228, 64, 222, - 130, 244, 113, 64, 219, 99, 239, 8, 67, 219, 99, 239, 8, 64, 219, 99, - 221, 102, 67, 219, 99, 221, 102, 64, 4, 239, 8, 64, 4, 221, 102, 67, 4, - 221, 102, 64, 231, 43, 236, 123, 67, 231, 43, 236, 123, 64, 83, 236, 123, - 67, 83, 236, 123, 50, 59, 3, 4, 244, 113, 122, 104, 250, 64, 50, 59, 3, - 45, 212, 70, 172, 104, 205, 50, 51, 104, 200, 196, 59, 3, 83, 101, 104, - 200, 196, 59, 3, 54, 83, 101, 104, 200, 196, 59, 234, 116, 153, 104, 200, - 196, 201, 145, 239, 189, 51, 104, 59, 3, 237, 120, 204, 209, 104, 59, 3, - 203, 104, 3, 83, 101, 104, 59, 3, 203, 104, 3, 54, 83, 101, 104, 200, - 196, 59, 3, 203, 103, 104, 200, 196, 59, 3, 203, 104, 3, 83, 101, 104, - 200, 196, 59, 3, 203, 104, 3, 54, 83, 101, 104, 59, 202, 117, 196, 216, - 197, 115, 59, 212, 52, 238, 207, 222, 86, 236, 49, 2, 89, 104, 51, 210, - 41, 202, 57, 214, 14, 89, 104, 51, 104, 59, 89, 210, 41, 250, 241, 171, - 147, 90, 59, 202, 117, 232, 231, 90, 59, 202, 117, 204, 60, 104, 211, 39, - 51, 90, 211, 39, 51, 210, 41, 202, 57, 214, 14, 89, 90, 51, 90, 59, 89, - 210, 41, 250, 241, 171, 147, 202, 57, 214, 14, 89, 104, 51, 104, 59, 89, - 250, 241, 171, 147, 104, 59, 89, 210, 41, 202, 57, 214, 13, 90, 59, 89, - 210, 41, 202, 57, 214, 13, 237, 103, 201, 159, 195, 24, 51, 206, 139, - 205, 211, 164, 51, 206, 139, 248, 242, 205, 121, 51, 67, 219, 99, 204, - 227, 64, 4, 204, 227, 67, 4, 204, 227, 64, 209, 225, 212, 254, 67, 209, - 225, 212, 254, 85, 222, 130, 244, 113, 85, 213, 218, 3, 213, 218, 225, - 186, 85, 244, 114, 3, 244, 114, 225, 186, 85, 244, 113, 85, 45, 208, 185, - 205, 211, 164, 59, 3, 231, 52, 232, 22, 248, 242, 205, 121, 59, 3, 231, - 52, 203, 103, 205, 211, 164, 59, 3, 231, 43, 203, 103, 248, 242, 205, - 121, 59, 3, 231, 43, 203, 103, 248, 73, 59, 212, 52, 237, 103, 202, 178, - 164, 236, 198, 206, 139, 248, 73, 59, 212, 52, 237, 103, 202, 178, 164, - 236, 198, 104, 201, 159, 51, 200, 8, 201, 159, 51, 90, 201, 159, 51, 237, - 103, 201, 159, 51, 50, 52, 201, 159, 51, 120, 133, 201, 159, 51, 164, - 197, 81, 201, 159, 51, 164, 236, 199, 201, 159, 51, 205, 121, 236, 199, - 201, 159, 51, 205, 121, 197, 81, 201, 159, 51, 104, 201, 159, 239, 187, - 51, 200, 8, 201, 159, 239, 187, 51, 90, 201, 159, 239, 187, 51, 237, 103, - 201, 159, 239, 187, 51, 244, 69, 201, 159, 185, 244, 114, 51, 250, 169, - 201, 159, 185, 244, 114, 51, 104, 201, 159, 59, 202, 2, 153, 200, 8, 201, - 159, 59, 202, 2, 153, 90, 201, 159, 59, 202, 2, 153, 237, 103, 201, 159, - 59, 202, 2, 153, 164, 197, 81, 201, 159, 59, 202, 2, 153, 164, 236, 199, - 201, 159, 59, 202, 2, 153, 205, 121, 236, 199, 201, 159, 59, 202, 2, 153, - 205, 121, 197, 81, 201, 159, 59, 202, 2, 153, 104, 201, 159, 59, 3, 54, - 231, 43, 101, 200, 8, 201, 159, 59, 3, 54, 231, 43, 101, 90, 201, 159, - 59, 3, 54, 231, 43, 101, 237, 103, 201, 159, 59, 3, 54, 231, 43, 101, - 231, 43, 203, 123, 224, 45, 83, 203, 123, 224, 45, 104, 201, 159, 59, - 126, 90, 201, 159, 51, 200, 8, 201, 159, 59, 104, 77, 237, 103, 201, 159, - 51, 90, 201, 159, 59, 126, 104, 201, 159, 51, 237, 103, 201, 159, 59, - 104, 77, 200, 8, 201, 159, 51, 104, 201, 159, 213, 156, 250, 64, 200, 8, - 201, 159, 213, 156, 250, 64, 90, 201, 159, 213, 156, 250, 64, 237, 103, - 201, 159, 213, 156, 250, 64, 104, 64, 45, 67, 51, 200, 8, 64, 45, 67, 51, - 90, 64, 45, 67, 51, 237, 103, 64, 45, 67, 51, 250, 169, 201, 159, 52, - 200, 149, 51, 250, 169, 201, 159, 247, 199, 200, 149, 51, 250, 169, 201, - 159, 50, 200, 149, 51, 250, 169, 201, 159, 201, 222, 200, 149, 51, 210, - 45, 222, 86, 210, 45, 209, 230, 216, 253, 222, 86, 216, 253, 209, 230, - 234, 145, 240, 222, 250, 65, 244, 109, 250, 168, 90, 64, 51, 202, 125, - 201, 220, 104, 236, 45, 250, 67, 202, 125, 209, 226, 200, 8, 236, 45, - 250, 67, 202, 125, 201, 220, 90, 236, 45, 250, 67, 202, 125, 222, 82, - 237, 103, 236, 45, 250, 67, 64, 104, 236, 45, 250, 67, 64, 200, 8, 236, - 45, 250, 67, 64, 90, 236, 45, 250, 67, 64, 237, 103, 236, 45, 250, 67, - 237, 103, 201, 159, 59, 3, 172, 202, 40, 222, 76, 237, 103, 201, 159, 59, - 3, 172, 202, 40, 209, 219, 200, 8, 201, 159, 59, 3, 172, 202, 40, 222, - 76, 200, 8, 201, 159, 59, 3, 172, 202, 40, 209, 219, 104, 201, 159, 59, - 3, 172, 202, 40, 200, 7, 90, 201, 159, 59, 3, 172, 202, 40, 200, 7, 104, - 201, 159, 59, 3, 172, 202, 40, 237, 102, 90, 201, 159, 59, 3, 172, 202, - 40, 237, 102, 64, 240, 133, 237, 103, 26, 104, 51, 64, 240, 133, 237, - 103, 26, 90, 51, 64, 240, 133, 200, 8, 26, 104, 51, 64, 240, 133, 200, 8, - 26, 90, 51, 64, 240, 133, 104, 26, 200, 8, 51, 64, 240, 133, 90, 26, 200, - 8, 51, 64, 240, 133, 104, 26, 237, 103, 51, 64, 240, 133, 90, 26, 237, - 103, 51, 210, 14, 59, 133, 222, 86, 210, 14, 59, 133, 209, 230, 210, 14, - 59, 120, 222, 86, 210, 14, 59, 120, 209, 230, 210, 14, 59, 50, 200, 20, - 210, 14, 59, 52, 200, 20, 210, 14, 59, 50, 237, 106, 210, 14, 59, 52, - 237, 106, 200, 8, 67, 59, 234, 116, 248, 190, 3, 231, 43, 153, 120, 250, - 68, 225, 231, 39, 210, 114, 247, 184, 213, 212, 67, 205, 55, 213, 212, - 67, 26, 64, 205, 55, 213, 212, 64, 205, 55, 248, 207, 107, 3, 167, 196, - 216, 45, 196, 216, 45, 27, 196, 216, 64, 46, 246, 153, 64, 239, 9, 246, - 153, 200, 240, 64, 212, 254, 231, 43, 64, 214, 100, 64, 214, 100, 64, - 219, 99, 200, 19, 201, 161, 246, 153, 64, 219, 99, 237, 105, 201, 161, - 246, 153, 64, 219, 99, 222, 81, 201, 161, 246, 153, 64, 219, 99, 209, - 225, 201, 161, 246, 153, 201, 222, 155, 64, 244, 113, 247, 199, 155, 64, - 244, 113, 167, 234, 145, 212, 54, 64, 240, 129, 209, 148, 167, 234, 145, - 212, 54, 64, 240, 129, 67, 234, 145, 212, 54, 240, 129, 209, 148, 67, - 234, 145, 212, 54, 240, 129, 46, 212, 25, 225, 212, 200, 49, 56, 232, - 222, 78, 212, 67, 234, 161, 103, 212, 67, 234, 161, 135, 212, 67, 234, - 161, 136, 212, 67, 234, 161, 150, 201, 180, 211, 194, 250, 25, 230, 154, - 212, 174, 217, 8, 67, 218, 99, 207, 69, 64, 239, 9, 214, 49, 240, 182, - 201, 123, 167, 218, 99, 250, 60, 240, 148, 232, 126, 195, 77, 223, 103, - 250, 138, 251, 97, 197, 207, 212, 26, 50, 155, 64, 204, 227, 52, 155, 64, - 204, 227, 204, 228, 3, 50, 155, 247, 250, 204, 228, 3, 52, 155, 247, 250, - 104, 200, 196, 59, 3, 201, 161, 250, 66, 200, 8, 200, 196, 59, 3, 201, - 161, 250, 66, 90, 200, 196, 59, 3, 201, 161, 250, 66, 237, 103, 200, 196, - 59, 3, 201, 161, 250, 66, 236, 35, 234, 161, 98, 236, 35, 234, 161, 103, - 208, 86, 209, 58, 250, 24, 16, 199, 8, 209, 58, 250, 24, 16, 215, 180, - 209, 58, 250, 24, 16, 211, 16, 209, 58, 250, 24, 16, 248, 16, 209, 58, - 250, 24, 16, 207, 52, 209, 58, 250, 24, 16, 201, 172, 236, 49, 2, 3, 225, - 208, 58, 200, 31, 102, 207, 48, 102, 237, 111, 102, 213, 63, 102, 210, - 40, 52, 250, 192, 123, 6, 1, 249, 220, 123, 6, 1, 247, 126, 123, 6, 1, - 199, 103, 123, 6, 1, 233, 41, 123, 6, 1, 238, 149, 123, 6, 1, 196, 34, - 123, 6, 1, 195, 58, 123, 6, 1, 237, 24, 123, 6, 1, 195, 84, 123, 6, 1, - 225, 112, 123, 6, 1, 84, 225, 112, 123, 6, 1, 68, 123, 6, 1, 238, 170, - 123, 6, 1, 224, 171, 123, 6, 1, 221, 197, 123, 6, 1, 217, 229, 123, 6, 1, - 217, 121, 123, 6, 1, 214, 35, 123, 6, 1, 212, 49, 123, 6, 1, 209, 202, - 123, 6, 1, 205, 191, 123, 6, 1, 200, 226, 123, 6, 1, 200, 66, 123, 6, 1, - 234, 119, 123, 6, 1, 231, 234, 123, 6, 1, 213, 230, 123, 6, 1, 213, 35, - 123, 6, 1, 206, 111, 123, 6, 1, 201, 72, 123, 6, 1, 244, 156, 123, 6, 1, - 207, 6, 123, 6, 1, 196, 43, 123, 6, 1, 196, 45, 123, 6, 1, 196, 77, 123, - 6, 1, 205, 86, 142, 123, 6, 1, 195, 215, 123, 6, 1, 4, 195, 181, 123, 6, - 1, 4, 195, 182, 3, 203, 103, 123, 6, 1, 196, 0, 123, 6, 1, 225, 153, 4, - 195, 181, 123, 6, 1, 248, 28, 195, 181, 123, 6, 1, 225, 153, 248, 28, - 195, 181, 123, 6, 1, 234, 239, 123, 6, 1, 225, 110, 123, 6, 1, 206, 110, - 123, 6, 1, 201, 135, 63, 123, 6, 1, 222, 118, 217, 229, 123, 4, 1, 249, - 220, 123, 4, 1, 247, 126, 123, 4, 1, 199, 103, 123, 4, 1, 233, 41, 123, - 4, 1, 238, 149, 123, 4, 1, 196, 34, 123, 4, 1, 195, 58, 123, 4, 1, 237, - 24, 123, 4, 1, 195, 84, 123, 4, 1, 225, 112, 123, 4, 1, 84, 225, 112, - 123, 4, 1, 68, 123, 4, 1, 238, 170, 123, 4, 1, 224, 171, 123, 4, 1, 221, - 197, 123, 4, 1, 217, 229, 123, 4, 1, 217, 121, 123, 4, 1, 214, 35, 123, - 4, 1, 212, 49, 123, 4, 1, 209, 202, 123, 4, 1, 205, 191, 123, 4, 1, 200, - 226, 123, 4, 1, 200, 66, 123, 4, 1, 234, 119, 123, 4, 1, 231, 234, 123, - 4, 1, 213, 230, 123, 4, 1, 213, 35, 123, 4, 1, 206, 111, 123, 4, 1, 201, - 72, 123, 4, 1, 244, 156, 123, 4, 1, 207, 6, 123, 4, 1, 196, 43, 123, 4, - 1, 196, 45, 123, 4, 1, 196, 77, 123, 4, 1, 205, 86, 142, 123, 4, 1, 195, - 215, 123, 4, 1, 4, 195, 181, 123, 4, 1, 4, 195, 182, 3, 203, 103, 123, 4, - 1, 196, 0, 123, 4, 1, 225, 153, 4, 195, 181, 123, 4, 1, 248, 28, 195, - 181, 123, 4, 1, 225, 153, 248, 28, 195, 181, 123, 4, 1, 234, 239, 123, 4, - 1, 225, 110, 123, 4, 1, 206, 110, 123, 4, 1, 201, 135, 63, 123, 4, 1, - 222, 118, 217, 229, 8, 6, 1, 223, 1, 3, 54, 153, 8, 4, 1, 223, 1, 3, 54, - 153, 8, 6, 1, 223, 1, 3, 108, 202, 56, 8, 6, 1, 213, 196, 3, 101, 8, 6, - 1, 210, 237, 3, 203, 103, 8, 4, 1, 39, 3, 101, 8, 4, 1, 203, 186, 3, 239, - 15, 101, 8, 6, 1, 232, 155, 3, 239, 63, 8, 4, 1, 232, 155, 3, 239, 63, 8, - 6, 1, 224, 228, 3, 239, 63, 8, 4, 1, 224, 228, 3, 239, 63, 8, 6, 1, 195, - 158, 3, 239, 63, 8, 4, 1, 195, 158, 3, 239, 63, 8, 6, 1, 250, 236, 8, 6, - 1, 221, 41, 3, 124, 8, 6, 1, 200, 240, 63, 8, 6, 1, 200, 240, 250, 236, - 8, 4, 1, 199, 216, 3, 52, 124, 8, 6, 1, 197, 190, 3, 124, 8, 4, 1, 197, - 190, 3, 124, 8, 4, 1, 199, 216, 3, 240, 144, 8, 6, 1, 155, 232, 154, 8, - 4, 1, 155, 232, 154, 8, 4, 1, 203, 101, 212, 189, 8, 4, 1, 237, 10, 3, - 215, 191, 8, 4, 1, 200, 240, 210, 237, 3, 203, 103, 8, 4, 1, 169, 3, 125, - 209, 211, 225, 186, 8, 1, 4, 6, 200, 240, 70, 8, 204, 110, 4, 1, 225, - 108, 71, 1, 6, 199, 215, 8, 6, 1, 209, 36, 3, 204, 30, 203, 103, 8, 6, 1, - 195, 158, 3, 204, 30, 203, 103, 87, 6, 1, 251, 4, 87, 4, 1, 251, 4, 87, - 6, 1, 199, 20, 87, 4, 1, 199, 20, 87, 6, 1, 233, 231, 87, 4, 1, 233, 231, - 87, 6, 1, 239, 226, 87, 4, 1, 239, 226, 87, 6, 1, 236, 162, 87, 4, 1, - 236, 162, 87, 6, 1, 205, 126, 87, 4, 1, 205, 126, 87, 6, 1, 195, 95, 87, - 4, 1, 195, 95, 87, 6, 1, 232, 47, 87, 4, 1, 232, 47, 87, 6, 1, 202, 166, - 87, 4, 1, 202, 166, 87, 6, 1, 230, 95, 87, 4, 1, 230, 95, 87, 6, 1, 224, - 155, 87, 4, 1, 224, 155, 87, 6, 1, 222, 113, 87, 4, 1, 222, 113, 87, 6, - 1, 218, 243, 87, 4, 1, 218, 243, 87, 6, 1, 216, 141, 87, 4, 1, 216, 141, - 87, 6, 1, 223, 102, 87, 4, 1, 223, 102, 87, 6, 1, 74, 87, 4, 1, 74, 87, - 6, 1, 212, 163, 87, 4, 1, 212, 163, 87, 6, 1, 209, 185, 87, 4, 1, 209, - 185, 87, 6, 1, 206, 31, 87, 4, 1, 206, 31, 87, 6, 1, 203, 57, 87, 4, 1, - 203, 57, 87, 6, 1, 200, 96, 87, 4, 1, 200, 96, 87, 6, 1, 235, 33, 87, 4, - 1, 235, 33, 87, 6, 1, 224, 16, 87, 4, 1, 224, 16, 87, 6, 1, 211, 186, 87, - 4, 1, 211, 186, 87, 6, 1, 214, 27, 87, 4, 1, 214, 27, 87, 6, 1, 239, 13, - 251, 10, 87, 4, 1, 239, 13, 251, 10, 87, 6, 1, 36, 87, 251, 40, 87, 4, 1, - 36, 87, 251, 40, 87, 6, 1, 240, 165, 236, 162, 87, 4, 1, 240, 165, 236, - 162, 87, 6, 1, 239, 13, 224, 155, 87, 4, 1, 239, 13, 224, 155, 87, 6, 1, - 239, 13, 216, 141, 87, 4, 1, 239, 13, 216, 141, 87, 6, 1, 240, 165, 216, - 141, 87, 4, 1, 240, 165, 216, 141, 87, 6, 1, 36, 87, 214, 27, 87, 4, 1, - 36, 87, 214, 27, 87, 6, 1, 208, 177, 87, 4, 1, 208, 177, 87, 6, 1, 240, - 180, 206, 203, 87, 4, 1, 240, 180, 206, 203, 87, 6, 1, 36, 87, 206, 203, - 87, 4, 1, 36, 87, 206, 203, 87, 6, 1, 36, 87, 236, 20, 87, 4, 1, 36, 87, - 236, 20, 87, 6, 1, 251, 23, 224, 21, 87, 4, 1, 251, 23, 224, 21, 87, 6, - 1, 239, 13, 231, 44, 87, 4, 1, 239, 13, 231, 44, 87, 6, 1, 36, 87, 231, - 44, 87, 4, 1, 36, 87, 231, 44, 87, 6, 1, 36, 87, 142, 87, 4, 1, 36, 87, - 142, 87, 6, 1, 223, 0, 142, 87, 4, 1, 223, 0, 142, 87, 6, 1, 36, 87, 231, - 254, 87, 4, 1, 36, 87, 231, 254, 87, 6, 1, 36, 87, 232, 50, 87, 4, 1, 36, - 87, 232, 50, 87, 6, 1, 36, 87, 233, 226, 87, 4, 1, 36, 87, 233, 226, 87, - 6, 1, 36, 87, 238, 173, 87, 4, 1, 36, 87, 238, 173, 87, 6, 1, 36, 87, - 206, 169, 87, 4, 1, 36, 87, 206, 169, 87, 6, 1, 36, 215, 78, 206, 169, - 87, 4, 1, 36, 215, 78, 206, 169, 87, 6, 1, 36, 215, 78, 216, 192, 87, 4, - 1, 36, 215, 78, 216, 192, 87, 6, 1, 36, 215, 78, 215, 15, 87, 4, 1, 36, - 215, 78, 215, 15, 87, 6, 1, 36, 215, 78, 197, 116, 87, 4, 1, 36, 215, 78, - 197, 116, 87, 16, 224, 179, 87, 16, 218, 244, 209, 185, 87, 16, 212, 164, - 209, 185, 87, 16, 204, 218, 87, 16, 203, 58, 209, 185, 87, 16, 224, 17, - 209, 185, 87, 16, 206, 170, 206, 31, 87, 6, 1, 240, 165, 206, 203, 87, 4, - 1, 240, 165, 206, 203, 87, 6, 1, 240, 165, 233, 226, 87, 4, 1, 240, 165, - 233, 226, 87, 37, 216, 142, 57, 87, 37, 205, 79, 250, 37, 87, 37, 205, - 79, 222, 50, 87, 6, 1, 247, 223, 224, 21, 87, 4, 1, 247, 223, 224, 21, - 87, 36, 215, 78, 234, 98, 204, 193, 87, 36, 215, 78, 238, 210, 211, 28, - 78, 87, 36, 215, 78, 225, 210, 211, 28, 78, 87, 36, 215, 78, 199, 90, - 238, 183, 87, 234, 135, 106, 232, 108, 87, 234, 98, 204, 193, 87, 218, - 94, 238, 183, 93, 4, 1, 250, 208, 93, 4, 1, 248, 201, 93, 4, 1, 233, 230, - 93, 4, 1, 238, 132, 93, 4, 1, 236, 106, 93, 4, 1, 199, 5, 93, 4, 1, 195, - 82, 93, 4, 1, 203, 82, 93, 4, 1, 225, 230, 93, 4, 1, 224, 165, 93, 4, 1, - 222, 124, 93, 4, 1, 219, 222, 93, 4, 1, 217, 126, 93, 4, 1, 214, 48, 93, - 4, 1, 213, 96, 93, 4, 1, 195, 70, 93, 4, 1, 210, 178, 93, 4, 1, 208, 174, - 93, 4, 1, 203, 69, 93, 4, 1, 200, 55, 93, 4, 1, 212, 197, 93, 4, 1, 224, - 26, 93, 4, 1, 233, 103, 93, 4, 1, 211, 93, 93, 4, 1, 206, 167, 93, 4, 1, - 244, 182, 93, 4, 1, 247, 4, 93, 4, 1, 225, 53, 93, 4, 1, 244, 120, 93, 4, - 1, 246, 120, 93, 4, 1, 196, 200, 93, 4, 1, 225, 68, 93, 4, 1, 232, 125, - 93, 4, 1, 232, 32, 93, 4, 1, 231, 201, 93, 4, 1, 197, 101, 93, 4, 1, 232, - 60, 93, 4, 1, 231, 69, 93, 4, 1, 196, 2, 93, 4, 1, 251, 79, 202, 76, 1, - 165, 202, 76, 1, 196, 120, 202, 76, 1, 196, 119, 202, 76, 1, 196, 109, - 202, 76, 1, 196, 107, 202, 76, 1, 248, 67, 251, 124, 196, 102, 202, 76, - 1, 196, 102, 202, 76, 1, 196, 117, 202, 76, 1, 196, 114, 202, 76, 1, 196, - 116, 202, 76, 1, 196, 115, 202, 76, 1, 196, 25, 202, 76, 1, 196, 111, - 202, 76, 1, 196, 100, 202, 76, 1, 201, 12, 196, 100, 202, 76, 1, 196, 97, - 202, 76, 1, 196, 105, 202, 76, 1, 248, 67, 251, 124, 196, 105, 202, 76, - 1, 201, 12, 196, 105, 202, 76, 1, 196, 104, 202, 76, 1, 196, 124, 202, - 76, 1, 196, 98, 202, 76, 1, 201, 12, 196, 98, 202, 76, 1, 196, 87, 202, - 76, 1, 201, 12, 196, 87, 202, 76, 1, 196, 20, 202, 76, 1, 196, 67, 202, - 76, 1, 251, 52, 196, 67, 202, 76, 1, 201, 12, 196, 67, 202, 76, 1, 196, - 96, 202, 76, 1, 196, 95, 202, 76, 1, 196, 92, 202, 76, 1, 201, 12, 196, - 106, 202, 76, 1, 201, 12, 196, 90, 202, 76, 1, 196, 88, 202, 76, 1, 195, - 215, 202, 76, 1, 196, 85, 202, 76, 1, 196, 83, 202, 76, 1, 196, 108, 202, - 76, 1, 201, 12, 196, 108, 202, 76, 1, 249, 225, 196, 108, 202, 76, 1, - 196, 82, 202, 76, 1, 196, 80, 202, 76, 1, 196, 81, 202, 76, 1, 196, 79, - 202, 76, 1, 196, 78, 202, 76, 1, 196, 118, 202, 76, 1, 196, 76, 202, 76, - 1, 196, 74, 202, 76, 1, 196, 73, 202, 76, 1, 196, 71, 202, 76, 1, 196, - 68, 202, 76, 1, 203, 48, 196, 68, 202, 76, 1, 196, 66, 202, 76, 1, 196, - 65, 202, 76, 1, 196, 0, 202, 76, 71, 1, 222, 229, 78, 202, 76, 207, 47, - 78, 202, 76, 105, 225, 15, 34, 5, 221, 165, 34, 5, 218, 153, 34, 5, 209, - 177, 34, 5, 205, 154, 34, 5, 206, 153, 34, 5, 247, 229, 34, 5, 201, 250, - 34, 5, 244, 45, 34, 5, 215, 218, 34, 5, 214, 255, 34, 5, 233, 34, 214, - 117, 34, 5, 195, 10, 34, 5, 238, 152, 34, 5, 239, 133, 34, 5, 225, 19, - 34, 5, 202, 140, 34, 5, 244, 168, 34, 5, 212, 176, 34, 5, 212, 61, 34, 5, - 233, 118, 34, 5, 233, 114, 34, 5, 233, 115, 34, 5, 233, 116, 34, 5, 205, - 43, 34, 5, 204, 253, 34, 5, 205, 10, 34, 5, 205, 42, 34, 5, 205, 15, 34, - 5, 205, 16, 34, 5, 205, 2, 34, 5, 246, 199, 34, 5, 246, 178, 34, 5, 246, - 180, 34, 5, 246, 198, 34, 5, 246, 196, 34, 5, 246, 197, 34, 5, 246, 179, - 34, 5, 194, 228, 34, 5, 194, 206, 34, 5, 194, 219, 34, 5, 194, 227, 34, - 5, 194, 222, 34, 5, 194, 223, 34, 5, 194, 211, 34, 5, 246, 194, 34, 5, - 246, 181, 34, 5, 246, 183, 34, 5, 246, 193, 34, 5, 246, 191, 34, 5, 246, - 192, 34, 5, 246, 182, 34, 5, 210, 249, 34, 5, 210, 239, 34, 5, 210, 245, - 34, 5, 210, 248, 34, 5, 210, 246, 34, 5, 210, 247, 34, 5, 210, 244, 34, - 5, 223, 11, 34, 5, 223, 3, 34, 5, 223, 6, 34, 5, 223, 10, 34, 5, 223, 7, - 34, 5, 223, 8, 34, 5, 223, 4, 34, 5, 196, 159, 34, 5, 196, 146, 34, 5, - 196, 154, 34, 5, 196, 158, 34, 5, 196, 156, 34, 5, 196, 157, 34, 5, 196, - 153, 34, 5, 232, 166, 34, 5, 232, 156, 34, 5, 232, 159, 34, 5, 232, 165, - 34, 5, 232, 161, 34, 5, 232, 162, 34, 5, 232, 158, 37, 40, 1, 248, 119, - 37, 40, 1, 199, 105, 37, 40, 1, 233, 98, 37, 40, 1, 239, 119, 37, 40, 1, - 195, 65, 37, 40, 1, 195, 88, 37, 40, 1, 157, 37, 40, 1, 236, 138, 37, 40, - 1, 236, 117, 37, 40, 1, 236, 106, 37, 40, 1, 74, 37, 40, 1, 213, 35, 37, - 40, 1, 236, 42, 37, 40, 1, 236, 30, 37, 40, 1, 203, 36, 37, 40, 1, 142, - 37, 40, 1, 201, 87, 37, 40, 1, 244, 223, 37, 40, 1, 207, 6, 37, 40, 1, - 206, 214, 37, 40, 1, 234, 239, 37, 40, 1, 236, 26, 37, 40, 1, 63, 37, 40, - 1, 226, 35, 37, 40, 1, 238, 171, 37, 40, 1, 218, 112, 200, 70, 37, 40, 1, - 196, 79, 37, 40, 1, 195, 215, 37, 40, 1, 225, 152, 63, 37, 40, 1, 221, - 205, 195, 181, 37, 40, 1, 248, 28, 195, 181, 37, 40, 1, 225, 152, 248, - 28, 195, 181, 52, 250, 193, 204, 105, 219, 185, 52, 250, 193, 237, 120, - 204, 105, 219, 185, 50, 204, 105, 170, 52, 204, 105, 170, 50, 237, 120, - 204, 105, 170, 52, 237, 120, 204, 105, 170, 210, 164, 225, 173, 219, 185, - 210, 164, 237, 120, 225, 173, 219, 185, 237, 120, 201, 179, 219, 185, 50, - 201, 179, 170, 52, 201, 179, 170, 210, 164, 205, 57, 50, 210, 164, 214, - 50, 170, 52, 210, 164, 214, 50, 170, 236, 185, 240, 219, 213, 92, 234, - 163, 213, 92, 210, 40, 234, 163, 213, 92, 230, 148, 237, 120, 214, 112, - 237, 103, 250, 203, 200, 8, 250, 203, 237, 120, 209, 225, 250, 192, 54, - 214, 109, 230, 151, 225, 163, 225, 171, 213, 145, 247, 171, 230, 152, 3, - 239, 18, 202, 57, 3, 209, 211, 57, 50, 125, 213, 83, 170, 52, 125, 213, - 83, 170, 202, 57, 3, 76, 57, 202, 57, 3, 76, 58, 50, 83, 248, 190, 3, - 211, 22, 52, 83, 248, 190, 3, 211, 22, 201, 222, 50, 155, 170, 201, 222, - 52, 155, 170, 247, 199, 50, 155, 170, 247, 199, 52, 155, 170, 50, 206, - 53, 115, 170, 52, 206, 53, 115, 170, 50, 54, 213, 80, 52, 54, 213, 80, - 114, 238, 121, 126, 106, 76, 211, 162, 106, 76, 126, 114, 238, 121, 211, - 162, 99, 234, 145, 76, 211, 162, 234, 237, 76, 78, 210, 40, 211, 28, 78, - 83, 202, 56, 209, 211, 212, 55, 197, 3, 207, 47, 108, 238, 123, 200, 240, - 244, 23, 210, 164, 238, 123, 210, 164, 244, 23, 200, 240, 207, 61, 239, - 242, 3, 50, 232, 208, 239, 242, 3, 52, 232, 208, 200, 240, 239, 241, 201, - 222, 155, 208, 89, 56, 200, 197, 239, 188, 202, 123, 239, 188, 204, 208, - 234, 98, 204, 193, 83, 205, 242, 238, 120, 197, 50, 83, 221, 233, 246, - 242, 54, 230, 151, 210, 40, 244, 23, 54, 221, 108, 211, 11, 78, 239, 189, - 3, 50, 200, 11, 54, 204, 44, 78, 225, 163, 125, 224, 113, 225, 163, 125, - 224, 114, 3, 224, 114, 57, 125, 224, 113, 125, 224, 114, 3, 238, 123, 54, - 204, 238, 244, 23, 237, 120, 205, 139, 201, 145, 239, 241, 219, 100, 244, - 23, 213, 91, 78, 211, 161, 236, 129, 78, 12, 43, 210, 70, 12, 43, 244, - 78, 12, 43, 208, 92, 98, 12, 43, 208, 92, 103, 12, 43, 208, 92, 135, 12, - 43, 212, 227, 12, 43, 247, 184, 12, 43, 203, 120, 12, 43, 223, 173, 98, - 12, 43, 223, 173, 103, 12, 43, 238, 180, 12, 43, 208, 96, 12, 43, 4, 98, - 12, 43, 4, 103, 12, 43, 222, 145, 98, 12, 43, 222, 145, 103, 12, 43, 222, - 145, 135, 12, 43, 222, 145, 136, 12, 43, 205, 174, 12, 43, 202, 127, 12, - 43, 205, 171, 98, 12, 43, 205, 171, 103, 12, 43, 232, 13, 98, 12, 43, - 232, 13, 103, 12, 43, 232, 94, 12, 43, 210, 153, 12, 43, 244, 165, 12, - 43, 204, 78, 12, 43, 218, 98, 12, 43, 239, 117, 12, 43, 218, 87, 12, 43, - 244, 96, 12, 43, 197, 120, 98, 12, 43, 197, 120, 103, 12, 43, 234, 254, - 12, 43, 213, 47, 98, 12, 43, 213, 47, 103, 12, 43, 206, 26, 155, 201, - 171, 201, 98, 12, 43, 240, 204, 12, 43, 238, 143, 12, 43, 225, 100, 12, - 43, 247, 222, 77, 244, 61, 12, 43, 235, 202, 12, 43, 205, 81, 98, 12, 43, - 205, 81, 103, 12, 43, 248, 203, 12, 43, 206, 33, 12, 43, 247, 66, 206, - 33, 12, 43, 217, 6, 98, 12, 43, 217, 6, 103, 12, 43, 217, 6, 135, 12, 43, - 217, 6, 136, 12, 43, 219, 59, 12, 43, 206, 205, 12, 43, 210, 159, 12, 43, - 235, 232, 12, 43, 214, 62, 12, 43, 247, 146, 98, 12, 43, 247, 146, 103, - 12, 43, 219, 106, 12, 43, 218, 93, 12, 43, 232, 242, 98, 12, 43, 232, - 242, 103, 12, 43, 232, 242, 135, 12, 43, 202, 74, 12, 43, 244, 60, 12, - 43, 197, 81, 98, 12, 43, 197, 81, 103, 12, 43, 247, 66, 208, 85, 12, 43, - 206, 26, 230, 246, 12, 43, 230, 246, 12, 43, 247, 66, 205, 93, 12, 43, - 247, 66, 206, 200, 12, 43, 234, 174, 12, 43, 247, 66, 246, 218, 12, 43, - 206, 26, 197, 141, 12, 43, 197, 142, 98, 12, 43, 197, 142, 103, 12, 43, - 244, 99, 12, 43, 247, 66, 233, 17, 12, 43, 172, 98, 12, 43, 172, 103, 12, - 43, 247, 66, 221, 144, 12, 43, 247, 66, 233, 212, 12, 43, 218, 83, 98, - 12, 43, 218, 83, 103, 12, 43, 210, 166, 12, 43, 247, 232, 12, 43, 247, - 66, 203, 75, 222, 92, 12, 43, 247, 66, 222, 94, 12, 43, 247, 66, 197, 44, - 12, 43, 247, 66, 234, 192, 12, 43, 236, 196, 98, 12, 43, 236, 196, 103, - 12, 43, 236, 196, 135, 12, 43, 247, 66, 236, 195, 12, 43, 232, 22, 12, - 43, 247, 66, 230, 242, 12, 43, 247, 218, 12, 43, 233, 82, 12, 43, 247, - 66, 234, 247, 12, 43, 247, 66, 248, 13, 12, 43, 247, 66, 208, 188, 12, - 43, 206, 26, 197, 72, 12, 43, 206, 26, 196, 57, 12, 43, 247, 66, 234, - 117, 12, 43, 225, 107, 235, 237, 12, 43, 247, 66, 235, 237, 12, 43, 225, - 107, 201, 223, 12, 43, 247, 66, 201, 223, 12, 43, 225, 107, 237, 95, 12, - 43, 247, 66, 237, 95, 12, 43, 200, 237, 12, 43, 225, 107, 200, 237, 12, - 43, 247, 66, 200, 237, 79, 43, 98, 79, 43, 221, 233, 79, 43, 238, 123, - 79, 43, 205, 209, 79, 43, 208, 91, 79, 43, 124, 79, 43, 103, 79, 43, 222, - 6, 79, 43, 219, 222, 79, 43, 222, 71, 79, 43, 236, 81, 79, 43, 178, 79, - 43, 133, 247, 184, 79, 43, 240, 207, 79, 43, 230, 89, 79, 43, 203, 120, - 79, 43, 185, 247, 184, 79, 43, 223, 172, 79, 43, 212, 5, 79, 43, 196, - 249, 79, 43, 205, 70, 79, 43, 52, 185, 247, 184, 79, 43, 231, 202, 236, - 101, 79, 43, 202, 248, 79, 43, 238, 180, 79, 43, 208, 96, 79, 43, 244, - 78, 79, 43, 211, 211, 79, 43, 251, 61, 79, 43, 218, 74, 79, 43, 236, 101, - 79, 43, 236, 202, 79, 43, 208, 124, 79, 43, 233, 26, 79, 43, 233, 27, - 205, 188, 79, 43, 235, 236, 79, 43, 248, 27, 79, 43, 197, 15, 79, 43, - 244, 186, 79, 43, 209, 158, 79, 43, 225, 226, 79, 43, 205, 186, 79, 43, - 222, 144, 79, 43, 240, 217, 79, 43, 205, 61, 79, 43, 218, 79, 79, 43, - 209, 199, 79, 43, 197, 0, 79, 43, 214, 40, 79, 43, 200, 246, 79, 43, 237, - 76, 79, 43, 206, 139, 202, 127, 79, 43, 237, 120, 244, 78, 79, 43, 172, - 204, 169, 79, 43, 114, 232, 69, 79, 43, 206, 145, 79, 43, 247, 191, 79, - 43, 205, 170, 79, 43, 247, 152, 79, 43, 204, 207, 79, 43, 232, 12, 79, - 43, 232, 109, 79, 43, 238, 127, 79, 43, 232, 94, 79, 43, 247, 171, 79, - 43, 210, 153, 79, 43, 208, 109, 79, 43, 238, 212, 79, 43, 249, 230, 79, - 43, 205, 57, 79, 43, 215, 193, 79, 43, 204, 78, 79, 43, 208, 136, 79, 43, - 218, 98, 79, 43, 201, 170, 79, 43, 222, 225, 79, 43, 204, 193, 79, 43, - 239, 117, 79, 43, 197, 96, 79, 43, 238, 155, 215, 193, 79, 43, 244, 19, - 79, 43, 234, 91, 79, 43, 244, 90, 79, 43, 204, 213, 79, 43, 197, 119, 79, - 43, 234, 254, 79, 43, 244, 86, 79, 43, 235, 76, 79, 43, 54, 196, 216, 79, - 43, 155, 201, 171, 201, 98, 79, 43, 205, 200, 79, 43, 235, 88, 79, 43, - 240, 204, 79, 43, 238, 143, 79, 43, 211, 208, 79, 43, 225, 100, 79, 43, - 219, 82, 79, 43, 202, 55, 79, 43, 204, 25, 79, 43, 222, 0, 79, 43, 199, - 242, 79, 43, 235, 31, 79, 43, 247, 222, 77, 244, 61, 79, 43, 206, 59, 79, - 43, 237, 120, 202, 240, 79, 43, 197, 67, 79, 43, 205, 217, 79, 43, 238, - 199, 79, 43, 235, 202, 79, 43, 205, 96, 79, 43, 51, 79, 43, 204, 195, 79, - 43, 205, 80, 79, 43, 201, 195, 79, 43, 232, 251, 79, 43, 246, 204, 79, - 43, 204, 231, 79, 43, 248, 203, 79, 43, 210, 11, 79, 43, 206, 33, 79, 43, - 225, 92, 79, 43, 217, 5, 79, 43, 206, 205, 79, 43, 235, 64, 79, 43, 214, - 62, 79, 43, 250, 202, 79, 43, 212, 77, 79, 43, 236, 206, 79, 43, 247, - 145, 79, 43, 219, 106, 79, 43, 218, 182, 79, 43, 207, 68, 79, 43, 250, - 71, 79, 43, 218, 93, 79, 43, 201, 228, 79, 43, 214, 11, 79, 43, 247, 226, - 79, 43, 204, 191, 79, 43, 244, 31, 79, 43, 232, 241, 79, 43, 202, 74, 79, - 43, 225, 189, 79, 43, 247, 238, 79, 43, 197, 142, 236, 101, 79, 43, 244, - 60, 79, 43, 197, 80, 79, 43, 208, 85, 79, 43, 230, 246, 79, 43, 205, 93, - 79, 43, 199, 130, 79, 43, 248, 114, 79, 43, 212, 127, 79, 43, 248, 232, - 79, 43, 206, 200, 79, 43, 210, 107, 79, 43, 209, 72, 79, 43, 234, 174, - 79, 43, 247, 224, 79, 43, 246, 218, 79, 43, 247, 255, 79, 43, 218, 95, - 79, 43, 197, 141, 79, 43, 244, 99, 79, 43, 197, 40, 79, 43, 238, 191, 79, - 43, 199, 6, 79, 43, 233, 17, 79, 43, 221, 144, 79, 43, 233, 212, 79, 43, - 218, 82, 79, 43, 205, 208, 79, 43, 206, 139, 203, 102, 248, 13, 79, 43, - 210, 166, 79, 43, 247, 232, 79, 43, 196, 239, 79, 43, 235, 112, 79, 43, - 222, 92, 79, 43, 203, 75, 222, 92, 79, 43, 222, 88, 79, 43, 205, 123, 79, - 43, 222, 94, 79, 43, 197, 44, 79, 43, 234, 192, 79, 43, 236, 195, 79, 43, - 232, 22, 79, 43, 234, 133, 79, 43, 230, 242, 79, 43, 247, 218, 79, 43, - 203, 87, 79, 43, 232, 116, 79, 43, 235, 24, 79, 43, 208, 221, 197, 40, - 79, 43, 246, 206, 79, 43, 233, 82, 79, 43, 234, 247, 79, 43, 248, 13, 79, - 43, 208, 188, 79, 43, 239, 102, 79, 43, 197, 72, 79, 43, 231, 245, 79, - 43, 196, 57, 79, 43, 218, 193, 79, 43, 247, 250, 79, 43, 236, 113, 79, - 43, 234, 117, 79, 43, 201, 142, 79, 43, 237, 79, 79, 43, 210, 147, 79, - 43, 215, 195, 79, 43, 235, 237, 79, 43, 201, 223, 79, 43, 237, 95, 79, - 43, 200, 237, 79, 43, 234, 195, 141, 239, 61, 183, 50, 202, 2, 209, 230, - 141, 239, 61, 183, 89, 202, 2, 58, 141, 239, 61, 183, 50, 202, 2, 108, - 26, 209, 230, 141, 239, 61, 183, 89, 202, 2, 108, 26, 58, 141, 239, 61, - 183, 234, 98, 204, 48, 141, 239, 61, 183, 204, 49, 234, 116, 57, 141, - 239, 61, 183, 204, 49, 234, 116, 58, 141, 239, 61, 183, 204, 49, 234, - 116, 222, 86, 141, 239, 61, 183, 204, 49, 234, 116, 200, 17, 222, 86, - 141, 239, 61, 183, 204, 49, 234, 116, 200, 17, 209, 230, 141, 239, 61, - 183, 204, 49, 234, 116, 221, 107, 222, 86, 141, 239, 61, 183, 213, 214, - 141, 205, 110, 141, 244, 23, 141, 234, 98, 204, 193, 238, 188, 78, 225, - 93, 225, 209, 204, 230, 102, 141, 225, 123, 78, 141, 244, 63, 78, 141, - 35, 195, 79, 50, 250, 193, 170, 52, 250, 193, 170, 50, 54, 250, 193, 170, - 52, 54, 250, 193, 170, 50, 240, 222, 170, 52, 240, 222, 170, 50, 67, 240, - 222, 170, 52, 67, 240, 222, 170, 50, 64, 222, 49, 170, 52, 64, 222, 49, - 170, 212, 19, 78, 233, 151, 78, 50, 201, 210, 206, 201, 170, 52, 201, - 210, 206, 201, 170, 50, 67, 222, 49, 170, 52, 67, 222, 49, 170, 50, 67, - 201, 210, 206, 201, 170, 52, 67, 201, 210, 206, 201, 170, 50, 67, 46, - 170, 52, 67, 46, 170, 197, 115, 239, 188, 210, 40, 54, 211, 223, 211, 11, - 78, 54, 211, 223, 211, 11, 78, 125, 54, 211, 223, 211, 11, 78, 212, 19, - 113, 235, 112, 232, 66, 215, 67, 98, 232, 66, 215, 67, 103, 232, 66, 215, - 67, 135, 232, 66, 215, 67, 136, 232, 66, 215, 67, 150, 232, 66, 215, 67, - 174, 232, 66, 215, 67, 182, 232, 66, 215, 67, 178, 232, 66, 215, 67, 184, - 141, 222, 30, 154, 78, 141, 209, 203, 154, 78, 141, 239, 70, 154, 78, - 141, 236, 80, 154, 78, 29, 206, 19, 76, 154, 78, 29, 54, 76, 154, 78, - 197, 111, 239, 188, 83, 224, 164, 210, 71, 78, 83, 224, 164, 210, 71, 3, - 198, 233, 205, 124, 78, 83, 224, 164, 210, 71, 113, 200, 17, 232, 108, - 83, 224, 164, 210, 71, 3, 198, 233, 205, 124, 113, 200, 17, 232, 108, 83, - 224, 164, 210, 71, 113, 221, 107, 232, 108, 45, 212, 19, 78, 141, 203, 4, - 221, 234, 235, 61, 207, 47, 102, 232, 66, 215, 67, 202, 248, 232, 66, - 215, 67, 200, 214, 232, 66, 215, 67, 202, 147, 83, 141, 225, 123, 78, - 219, 167, 78, 213, 74, 250, 229, 78, 141, 60, 225, 212, 141, 155, 235, - 17, 205, 110, 193, 1, 4, 63, 193, 1, 63, 193, 1, 4, 68, 193, 1, 68, 193, - 1, 4, 66, 193, 1, 66, 193, 1, 4, 70, 193, 1, 70, 193, 1, 4, 74, 193, 1, - 74, 193, 1, 157, 193, 1, 234, 4, 193, 1, 223, 249, 193, 1, 233, 74, 193, - 1, 223, 86, 193, 1, 232, 214, 193, 1, 224, 101, 193, 1, 233, 186, 193, 1, - 223, 165, 193, 1, 233, 26, 193, 1, 187, 193, 1, 195, 114, 193, 1, 206, - 69, 193, 1, 195, 33, 193, 1, 204, 139, 193, 1, 194, 255, 193, 1, 208, - 103, 193, 1, 195, 88, 193, 1, 205, 162, 193, 1, 195, 11, 193, 1, 203, - 137, 193, 1, 240, 3, 193, 1, 202, 94, 193, 1, 239, 20, 193, 1, 4, 201, - 20, 193, 1, 201, 20, 193, 1, 237, 74, 193, 1, 203, 36, 193, 1, 239, 119, - 193, 1, 147, 193, 1, 238, 154, 193, 1, 179, 193, 1, 216, 141, 193, 1, - 215, 111, 193, 1, 217, 34, 193, 1, 215, 225, 193, 1, 142, 193, 1, 248, - 252, 193, 1, 163, 193, 1, 231, 214, 193, 1, 248, 41, 193, 1, 212, 163, - 193, 1, 230, 219, 193, 1, 247, 138, 193, 1, 211, 175, 193, 1, 232, 32, - 193, 1, 248, 119, 193, 1, 213, 35, 193, 1, 231, 81, 193, 1, 247, 230, - 193, 1, 212, 62, 193, 1, 168, 193, 1, 218, 243, 193, 1, 218, 56, 193, 1, - 219, 114, 193, 1, 218, 160, 193, 1, 4, 165, 193, 1, 165, 193, 1, 4, 195, - 215, 193, 1, 195, 215, 193, 1, 4, 196, 0, 193, 1, 196, 0, 193, 1, 173, - 193, 1, 210, 23, 193, 1, 209, 95, 193, 1, 210, 133, 193, 1, 209, 185, - 193, 1, 4, 197, 156, 193, 1, 197, 156, 193, 1, 197, 64, 193, 1, 197, 101, - 193, 1, 197, 28, 193, 1, 217, 225, 193, 1, 197, 209, 193, 1, 4, 157, 193, - 1, 4, 224, 101, 37, 224, 126, 198, 233, 205, 124, 78, 37, 224, 126, 207, - 66, 205, 124, 78, 224, 126, 198, 233, 205, 124, 78, 224, 126, 207, 66, - 205, 124, 78, 193, 225, 123, 78, 193, 198, 233, 225, 123, 78, 193, 238, - 235, 195, 231, 224, 126, 54, 230, 151, 73, 1, 4, 63, 73, 1, 63, 73, 1, 4, - 68, 73, 1, 68, 73, 1, 4, 66, 73, 1, 66, 73, 1, 4, 70, 73, 1, 70, 73, 1, - 4, 74, 73, 1, 74, 73, 1, 157, 73, 1, 234, 4, 73, 1, 223, 249, 73, 1, 233, - 74, 73, 1, 223, 86, 73, 1, 232, 214, 73, 1, 224, 101, 73, 1, 233, 186, - 73, 1, 223, 165, 73, 1, 233, 26, 73, 1, 187, 73, 1, 195, 114, 73, 1, 206, - 69, 73, 1, 195, 33, 73, 1, 204, 139, 73, 1, 194, 255, 73, 1, 208, 103, - 73, 1, 195, 88, 73, 1, 205, 162, 73, 1, 195, 11, 73, 1, 203, 137, 73, 1, - 240, 3, 73, 1, 202, 94, 73, 1, 239, 20, 73, 1, 4, 201, 20, 73, 1, 201, - 20, 73, 1, 237, 74, 73, 1, 203, 36, 73, 1, 239, 119, 73, 1, 147, 73, 1, - 238, 154, 73, 1, 179, 73, 1, 216, 141, 73, 1, 215, 111, 73, 1, 217, 34, - 73, 1, 215, 225, 73, 1, 142, 73, 1, 248, 252, 73, 1, 163, 73, 1, 231, - 214, 73, 1, 248, 41, 73, 1, 212, 163, 73, 1, 230, 219, 73, 1, 247, 138, - 73, 1, 211, 175, 73, 1, 232, 32, 73, 1, 248, 119, 73, 1, 213, 35, 73, 1, - 231, 81, 73, 1, 247, 230, 73, 1, 212, 62, 73, 1, 168, 73, 1, 218, 243, - 73, 1, 218, 56, 73, 1, 219, 114, 73, 1, 218, 160, 73, 1, 4, 165, 73, 1, - 165, 73, 1, 4, 195, 215, 73, 1, 195, 215, 73, 1, 4, 196, 0, 73, 1, 196, - 0, 73, 1, 173, 73, 1, 210, 23, 73, 1, 209, 95, 73, 1, 210, 133, 73, 1, - 209, 185, 73, 1, 4, 197, 156, 73, 1, 197, 156, 73, 1, 197, 64, 73, 1, - 197, 101, 73, 1, 197, 28, 73, 1, 217, 225, 73, 1, 197, 209, 73, 1, 4, - 157, 73, 1, 4, 224, 101, 73, 1, 199, 137, 73, 1, 199, 23, 73, 1, 199, - 105, 73, 1, 198, 237, 73, 108, 238, 123, 224, 126, 211, 200, 205, 124, - 78, 73, 225, 123, 78, 73, 198, 233, 225, 123, 78, 73, 238, 235, 223, 128, - 247, 208, 1, 249, 219, 247, 208, 1, 213, 195, 247, 208, 1, 221, 40, 247, - 208, 1, 235, 184, 247, 208, 1, 240, 98, 247, 208, 1, 203, 185, 247, 208, - 1, 217, 225, 247, 208, 1, 158, 247, 208, 1, 234, 71, 247, 208, 1, 224, - 227, 247, 208, 1, 232, 154, 247, 208, 1, 225, 108, 247, 208, 1, 211, 116, - 247, 208, 1, 196, 216, 247, 208, 1, 195, 75, 247, 208, 1, 246, 138, 247, - 208, 1, 207, 8, 247, 208, 1, 143, 247, 208, 1, 195, 157, 247, 208, 1, - 247, 69, 247, 208, 1, 209, 35, 247, 208, 1, 63, 247, 208, 1, 74, 247, - 208, 1, 70, 247, 208, 1, 236, 170, 247, 208, 1, 251, 45, 247, 208, 1, - 236, 163, 247, 208, 1, 250, 0, 247, 208, 1, 213, 229, 247, 208, 1, 250, - 208, 247, 208, 1, 236, 106, 247, 208, 1, 250, 199, 247, 208, 1, 236, 92, - 247, 208, 1, 236, 42, 247, 208, 1, 68, 247, 208, 1, 66, 247, 208, 1, 225, - 121, 247, 208, 1, 199, 215, 247, 208, 1, 216, 246, 247, 208, 1, 233, 30, - 247, 208, 1, 226, 9, 247, 208, 1, 169, 3, 76, 57, 247, 208, 1, 216, 6, - 29, 1, 223, 198, 29, 1, 205, 35, 29, 1, 223, 191, 29, 1, 216, 126, 29, 1, - 216, 124, 29, 1, 216, 123, 29, 1, 202, 69, 29, 1, 205, 24, 29, 1, 210, 6, - 29, 1, 210, 1, 29, 1, 209, 254, 29, 1, 209, 247, 29, 1, 209, 242, 29, 1, - 209, 237, 29, 1, 209, 248, 29, 1, 210, 4, 29, 1, 218, 221, 29, 1, 212, - 149, 29, 1, 205, 32, 29, 1, 212, 138, 29, 1, 206, 9, 29, 1, 205, 29, 29, - 1, 226, 31, 29, 1, 244, 126, 29, 1, 205, 39, 29, 1, 244, 191, 29, 1, 224, - 14, 29, 1, 202, 160, 29, 1, 212, 187, 29, 1, 231, 198, 29, 1, 63, 29, 1, - 251, 90, 29, 1, 165, 29, 1, 196, 113, 29, 1, 236, 69, 29, 1, 70, 29, 1, - 196, 52, 29, 1, 196, 65, 29, 1, 74, 29, 1, 197, 156, 29, 1, 197, 147, 29, - 1, 214, 91, 29, 1, 196, 0, 29, 1, 66, 29, 1, 197, 83, 29, 1, 197, 101, - 29, 1, 197, 64, 29, 1, 195, 215, 29, 1, 235, 251, 29, 1, 196, 20, 29, 1, - 68, 29, 235, 14, 29, 1, 205, 33, 29, 1, 216, 116, 29, 1, 216, 118, 29, 1, - 216, 121, 29, 1, 209, 255, 29, 1, 209, 236, 29, 1, 209, 244, 29, 1, 209, - 249, 29, 1, 209, 234, 29, 1, 218, 214, 29, 1, 218, 211, 29, 1, 218, 215, - 29, 1, 224, 149, 29, 1, 212, 144, 29, 1, 212, 130, 29, 1, 212, 136, 29, - 1, 212, 133, 29, 1, 212, 147, 29, 1, 212, 131, 29, 1, 224, 147, 29, 1, - 224, 145, 29, 1, 206, 2, 29, 1, 206, 0, 29, 1, 205, 248, 29, 1, 205, 253, - 29, 1, 206, 7, 29, 1, 213, 113, 29, 1, 205, 36, 29, 1, 196, 42, 29, 1, - 196, 36, 29, 1, 196, 37, 29, 1, 224, 148, 29, 1, 205, 37, 29, 1, 196, 48, - 29, 1, 195, 244, 29, 1, 195, 243, 29, 1, 195, 246, 29, 1, 195, 202, 29, - 1, 195, 203, 29, 1, 195, 206, 29, 1, 250, 110, 29, 1, 250, 104, 141, 250, - 180, 221, 222, 78, 141, 250, 180, 210, 41, 78, 141, 250, 180, 106, 78, - 141, 250, 180, 114, 78, 141, 250, 180, 122, 78, 141, 250, 180, 234, 145, - 78, 141, 250, 180, 201, 222, 78, 141, 250, 180, 108, 78, 141, 250, 180, - 247, 199, 78, 141, 250, 180, 234, 249, 78, 141, 250, 180, 208, 92, 78, - 141, 250, 180, 202, 155, 78, 141, 250, 180, 234, 138, 78, 141, 250, 180, - 232, 9, 78, 141, 250, 180, 236, 203, 78, 141, 250, 180, 219, 223, 78, - 247, 208, 1, 247, 138, 247, 208, 1, 195, 33, 247, 208, 1, 225, 63, 247, - 208, 1, 232, 214, 247, 208, 1, 236, 184, 247, 208, 1, 236, 89, 247, 208, - 1, 214, 33, 247, 208, 1, 214, 37, 247, 208, 1, 225, 148, 247, 208, 1, - 250, 182, 247, 208, 1, 225, 196, 247, 208, 1, 200, 25, 247, 208, 1, 225, - 247, 247, 208, 1, 216, 224, 247, 208, 1, 251, 39, 247, 208, 1, 249, 251, - 247, 208, 1, 250, 225, 247, 208, 1, 214, 56, 247, 208, 1, 214, 39, 247, - 208, 1, 225, 193, 247, 208, 48, 1, 213, 195, 247, 208, 48, 1, 203, 185, - 247, 208, 48, 1, 224, 227, 247, 208, 48, 1, 232, 154, 247, 208, 1, 233, - 113, 247, 208, 1, 222, 25, 247, 208, 1, 194, 235, 12, 204, 163, 203, 185, - 12, 204, 163, 197, 75, 12, 204, 163, 196, 191, 12, 204, 163, 247, 82, 12, - 204, 163, 204, 35, 12, 204, 163, 230, 141, 12, 204, 163, 230, 145, 12, - 204, 163, 230, 228, 12, 204, 163, 230, 142, 12, 204, 163, 203, 188, 12, - 204, 163, 230, 144, 12, 204, 163, 230, 140, 12, 204, 163, 230, 226, 12, - 204, 163, 230, 143, 12, 204, 163, 230, 139, 12, 204, 163, 217, 225, 12, - 204, 163, 232, 154, 12, 204, 163, 209, 35, 12, 204, 163, 213, 195, 12, - 204, 163, 205, 113, 12, 204, 163, 240, 98, 12, 204, 163, 230, 146, 12, - 204, 163, 231, 224, 12, 204, 163, 203, 197, 12, 204, 163, 204, 13, 12, - 204, 163, 204, 242, 12, 204, 163, 207, 14, 12, 204, 163, 213, 39, 12, - 204, 163, 211, 118, 12, 204, 163, 202, 3, 12, 204, 163, 203, 187, 12, - 204, 163, 204, 24, 12, 204, 163, 230, 156, 12, 204, 163, 230, 138, 12, - 204, 163, 212, 207, 12, 204, 163, 211, 116, 73, 1, 4, 223, 86, 73, 1, 4, - 206, 69, 73, 1, 4, 204, 139, 73, 1, 4, 147, 73, 1, 4, 215, 111, 73, 1, 4, - 142, 73, 1, 4, 231, 214, 73, 1, 4, 230, 219, 73, 1, 4, 232, 32, 73, 1, 4, - 231, 81, 73, 1, 4, 218, 56, 73, 1, 4, 173, 73, 1, 4, 210, 23, 73, 1, 4, - 209, 95, 73, 1, 4, 210, 133, 73, 1, 4, 209, 185, 116, 29, 223, 198, 116, - 29, 216, 126, 116, 29, 202, 69, 116, 29, 210, 6, 116, 29, 218, 221, 116, - 29, 212, 149, 116, 29, 206, 9, 116, 29, 226, 31, 116, 29, 244, 126, 116, - 29, 244, 191, 116, 29, 224, 14, 116, 29, 202, 160, 116, 29, 212, 187, - 116, 29, 231, 198, 116, 29, 223, 199, 63, 116, 29, 216, 127, 63, 116, 29, - 202, 70, 63, 116, 29, 210, 7, 63, 116, 29, 218, 222, 63, 116, 29, 212, - 150, 63, 116, 29, 206, 10, 63, 116, 29, 226, 32, 63, 116, 29, 244, 127, - 63, 116, 29, 244, 192, 63, 116, 29, 224, 15, 63, 116, 29, 202, 161, 63, - 116, 29, 212, 188, 63, 116, 29, 231, 199, 63, 116, 29, 244, 127, 66, 116, - 223, 132, 183, 214, 71, 116, 223, 132, 183, 169, 230, 219, 116, 230, 79, - 98, 116, 230, 79, 103, 116, 230, 79, 135, 116, 230, 79, 136, 116, 230, - 79, 150, 116, 230, 79, 174, 116, 230, 79, 182, 116, 230, 79, 178, 116, - 230, 79, 184, 116, 230, 79, 202, 248, 116, 230, 79, 218, 98, 116, 230, - 79, 234, 254, 116, 230, 79, 197, 119, 116, 230, 79, 197, 8, 116, 230, 79, - 219, 52, 116, 230, 79, 236, 202, 116, 230, 79, 204, 78, 116, 230, 79, - 204, 196, 116, 230, 79, 232, 41, 116, 230, 79, 205, 151, 116, 230, 79, - 217, 136, 116, 230, 79, 205, 95, 116, 230, 79, 235, 9, 116, 230, 79, 241, - 12, 116, 230, 79, 222, 228, 116, 230, 79, 210, 64, 116, 230, 79, 247, 14, - 116, 230, 79, 204, 145, 116, 230, 79, 204, 58, 116, 230, 79, 236, 79, - 116, 230, 79, 210, 54, 116, 230, 79, 250, 244, 116, 230, 79, 235, 41, - 116, 230, 79, 210, 52, 116, 230, 79, 207, 68, 116, 230, 79, 210, 128, 45, - 230, 79, 211, 27, 45, 230, 79, 223, 224, 45, 230, 79, 208, 122, 45, 230, - 79, 223, 128, 45, 35, 202, 249, 214, 49, 64, 205, 57, 45, 35, 200, 215, - 214, 49, 64, 205, 57, 45, 35, 202, 148, 214, 49, 64, 205, 57, 45, 35, - 234, 152, 214, 49, 64, 205, 57, 45, 35, 235, 26, 214, 49, 64, 205, 57, - 45, 35, 205, 229, 214, 49, 64, 205, 57, 45, 35, 207, 22, 214, 49, 64, - 205, 57, 45, 35, 236, 152, 214, 49, 64, 205, 57, 213, 70, 56, 45, 35, - 200, 215, 98, 45, 35, 200, 215, 103, 45, 35, 200, 215, 135, 45, 35, 200, - 215, 136, 45, 35, 200, 215, 150, 45, 35, 200, 215, 174, 45, 35, 200, 215, - 182, 45, 35, 200, 215, 178, 45, 35, 200, 215, 184, 45, 35, 202, 147, 45, - 35, 202, 148, 98, 45, 35, 202, 148, 103, 45, 35, 202, 148, 135, 45, 35, - 202, 148, 136, 45, 35, 202, 148, 150, 45, 29, 223, 198, 45, 29, 216, 126, - 45, 29, 202, 69, 45, 29, 210, 6, 45, 29, 218, 221, 45, 29, 212, 149, 45, - 29, 206, 9, 45, 29, 226, 31, 45, 29, 244, 126, 45, 29, 244, 191, 45, 29, - 224, 14, 45, 29, 202, 160, 45, 29, 212, 187, 45, 29, 231, 198, 45, 29, - 223, 199, 63, 45, 29, 216, 127, 63, 45, 29, 202, 70, 63, 45, 29, 210, 7, - 63, 45, 29, 218, 222, 63, 45, 29, 212, 150, 63, 45, 29, 206, 10, 63, 45, - 29, 226, 32, 63, 45, 29, 244, 127, 63, 45, 29, 244, 192, 63, 45, 29, 224, - 15, 63, 45, 29, 202, 161, 63, 45, 29, 212, 188, 63, 45, 29, 231, 199, 63, - 45, 223, 132, 183, 246, 126, 45, 223, 132, 183, 224, 253, 45, 29, 226, - 32, 66, 223, 132, 204, 230, 102, 45, 230, 79, 98, 45, 230, 79, 103, 45, - 230, 79, 135, 45, 230, 79, 136, 45, 230, 79, 150, 45, 230, 79, 174, 45, - 230, 79, 182, 45, 230, 79, 178, 45, 230, 79, 184, 45, 230, 79, 202, 248, - 45, 230, 79, 218, 98, 45, 230, 79, 234, 254, 45, 230, 79, 197, 119, 45, - 230, 79, 197, 8, 45, 230, 79, 219, 52, 45, 230, 79, 236, 202, 45, 230, - 79, 204, 78, 45, 230, 79, 204, 196, 45, 230, 79, 232, 41, 45, 230, 79, - 205, 151, 45, 230, 79, 217, 136, 45, 230, 79, 205, 95, 45, 230, 79, 235, - 9, 45, 230, 79, 241, 12, 45, 230, 79, 222, 228, 45, 230, 79, 208, 90, 45, - 230, 79, 219, 226, 45, 230, 79, 235, 51, 45, 230, 79, 204, 90, 45, 230, - 79, 235, 229, 45, 230, 79, 211, 218, 45, 230, 79, 250, 4, 45, 230, 79, - 225, 124, 45, 230, 79, 210, 52, 45, 230, 79, 240, 227, 45, 230, 79, 240, - 216, 45, 230, 79, 231, 191, 45, 230, 79, 246, 155, 45, 230, 79, 221, 112, - 45, 230, 79, 222, 86, 45, 230, 79, 209, 230, 45, 230, 79, 219, 101, 45, - 230, 79, 210, 82, 45, 230, 79, 204, 145, 45, 230, 79, 204, 58, 45, 230, - 79, 236, 79, 45, 230, 79, 210, 54, 45, 230, 79, 250, 244, 45, 230, 79, - 216, 112, 45, 35, 202, 148, 174, 45, 35, 202, 148, 182, 45, 35, 202, 148, - 178, 45, 35, 202, 148, 184, 45, 35, 234, 151, 45, 35, 234, 152, 98, 45, - 35, 234, 152, 103, 45, 35, 234, 152, 135, 45, 35, 234, 152, 136, 45, 35, - 234, 152, 150, 45, 35, 234, 152, 174, 45, 35, 234, 152, 182, 45, 35, 234, - 152, 178, 45, 35, 234, 152, 184, 45, 35, 235, 25, 141, 203, 4, 16, 38, - 225, 95, 141, 203, 4, 16, 38, 235, 63, 141, 203, 4, 16, 38, 219, 192, - 141, 203, 4, 16, 38, 250, 124, 141, 203, 4, 16, 38, 219, 158, 141, 203, - 4, 16, 38, 224, 250, 141, 203, 4, 16, 38, 224, 251, 141, 203, 4, 16, 38, - 249, 252, 141, 203, 4, 16, 38, 207, 45, 141, 203, 4, 16, 38, 214, 97, - 141, 203, 4, 16, 38, 215, 181, 141, 203, 4, 16, 38, 239, 114, 46, 231, - 224, 46, 236, 38, 46, 235, 239, 221, 239, 222, 10, 56, 45, 73, 63, 45, - 73, 68, 45, 73, 66, 45, 73, 70, 45, 73, 74, 45, 73, 157, 45, 73, 223, - 249, 45, 73, 223, 86, 45, 73, 224, 101, 45, 73, 223, 165, 45, 73, 187, - 45, 73, 206, 69, 45, 73, 204, 139, 45, 73, 208, 103, 45, 73, 205, 162, - 45, 73, 203, 137, 45, 73, 202, 94, 45, 73, 201, 20, 45, 73, 203, 36, 45, - 73, 147, 45, 73, 179, 45, 73, 216, 141, 45, 73, 215, 111, 45, 73, 217, - 34, 45, 73, 215, 225, 45, 73, 142, 45, 73, 231, 214, 45, 73, 230, 219, - 45, 73, 232, 32, 45, 73, 231, 81, 45, 73, 168, 45, 73, 218, 243, 45, 73, - 218, 56, 45, 73, 219, 114, 45, 73, 218, 160, 45, 73, 165, 45, 73, 195, - 215, 45, 73, 196, 0, 45, 73, 173, 45, 73, 210, 23, 45, 73, 209, 95, 45, - 73, 210, 133, 45, 73, 209, 185, 45, 73, 197, 156, 45, 73, 197, 64, 45, - 73, 197, 101, 45, 73, 197, 28, 46, 250, 149, 46, 250, 54, 46, 250, 176, - 46, 251, 224, 46, 225, 198, 46, 225, 166, 46, 200, 23, 46, 236, 10, 46, - 236, 181, 46, 214, 36, 46, 214, 29, 46, 224, 177, 46, 224, 141, 46, 224, - 136, 46, 233, 216, 46, 233, 225, 46, 233, 62, 46, 233, 58, 46, 223, 2, - 46, 233, 49, 46, 223, 215, 46, 223, 214, 46, 223, 213, 46, 223, 212, 46, - 232, 183, 46, 232, 182, 46, 223, 50, 46, 223, 52, 46, 224, 88, 46, 223, - 130, 46, 223, 138, 46, 208, 207, 46, 208, 166, 46, 205, 246, 46, 207, 51, - 46, 207, 50, 46, 239, 255, 46, 239, 57, 46, 238, 124, 46, 201, 241, 46, - 217, 131, 46, 215, 182, 46, 232, 113, 46, 213, 174, 46, 213, 173, 46, - 248, 249, 46, 212, 160, 46, 212, 123, 46, 212, 124, 46, 248, 9, 46, 230, - 214, 46, 230, 209, 46, 247, 96, 46, 230, 193, 46, 231, 251, 46, 212, 218, - 46, 213, 3, 46, 231, 233, 46, 212, 255, 46, 213, 17, 46, 248, 100, 46, - 212, 51, 46, 247, 204, 46, 231, 57, 46, 212, 38, 46, 231, 48, 46, 231, - 50, 46, 219, 239, 46, 219, 235, 46, 219, 244, 46, 219, 179, 46, 219, 208, - 46, 218, 200, 46, 218, 175, 46, 218, 174, 46, 219, 89, 46, 219, 86, 46, - 219, 90, 46, 196, 123, 46, 196, 121, 46, 195, 200, 46, 209, 201, 46, 209, - 205, 46, 209, 62, 46, 209, 55, 46, 210, 79, 46, 210, 76, 46, 197, 117, - 141, 203, 4, 16, 38, 230, 236, 195, 79, 141, 203, 4, 16, 38, 230, 236, - 98, 141, 203, 4, 16, 38, 230, 236, 103, 141, 203, 4, 16, 38, 230, 236, - 135, 141, 203, 4, 16, 38, 230, 236, 136, 141, 203, 4, 16, 38, 230, 236, - 150, 141, 203, 4, 16, 38, 230, 236, 174, 141, 203, 4, 16, 38, 230, 236, - 182, 141, 203, 4, 16, 38, 230, 236, 178, 141, 203, 4, 16, 38, 230, 236, - 184, 141, 203, 4, 16, 38, 230, 236, 202, 248, 141, 203, 4, 16, 38, 230, - 236, 236, 127, 141, 203, 4, 16, 38, 230, 236, 200, 219, 141, 203, 4, 16, - 38, 230, 236, 202, 149, 141, 203, 4, 16, 38, 230, 236, 234, 139, 141, - 203, 4, 16, 38, 230, 236, 235, 29, 141, 203, 4, 16, 38, 230, 236, 205, - 236, 141, 203, 4, 16, 38, 230, 236, 207, 24, 141, 203, 4, 16, 38, 230, - 236, 236, 158, 141, 203, 4, 16, 38, 230, 236, 216, 94, 141, 203, 4, 16, - 38, 230, 236, 200, 214, 141, 203, 4, 16, 38, 230, 236, 200, 208, 141, - 203, 4, 16, 38, 230, 236, 200, 203, 141, 203, 4, 16, 38, 230, 236, 200, - 205, 141, 203, 4, 16, 38, 230, 236, 200, 210, 46, 230, 227, 46, 240, 3, - 46, 250, 0, 46, 153, 46, 213, 219, 46, 213, 40, 46, 238, 157, 46, 238, - 158, 205, 56, 46, 238, 158, 240, 157, 46, 225, 121, 46, 236, 41, 217, - 137, 231, 252, 46, 236, 41, 217, 137, 203, 208, 46, 236, 41, 217, 137, - 203, 100, 46, 236, 41, 217, 137, 219, 85, 46, 240, 218, 46, 213, 180, - 250, 211, 46, 179, 46, 218, 57, 63, 46, 168, 46, 157, 46, 224, 104, 46, - 219, 153, 46, 233, 204, 46, 247, 20, 46, 224, 103, 46, 212, 208, 46, 216, - 248, 46, 218, 57, 235, 184, 46, 218, 57, 234, 71, 46, 219, 28, 46, 224, - 40, 46, 230, 146, 46, 223, 251, 46, 218, 245, 46, 233, 76, 46, 202, 96, - 46, 218, 57, 158, 46, 218, 168, 46, 238, 167, 46, 223, 180, 46, 234, 190, - 46, 216, 7, 46, 218, 57, 221, 40, 46, 218, 165, 46, 244, 47, 46, 223, - 174, 46, 218, 166, 205, 56, 46, 244, 48, 205, 56, 46, 221, 41, 205, 56, - 46, 223, 175, 205, 56, 46, 218, 166, 240, 157, 46, 244, 48, 240, 157, 46, - 221, 41, 240, 157, 46, 223, 175, 240, 157, 46, 221, 41, 126, 209, 35, 46, - 221, 41, 126, 209, 36, 205, 56, 46, 163, 46, 223, 122, 46, 218, 61, 46, - 233, 0, 46, 210, 183, 46, 210, 184, 126, 209, 35, 46, 210, 184, 126, 209, - 36, 205, 56, 46, 211, 188, 46, 215, 149, 46, 218, 57, 209, 35, 46, 218, - 59, 46, 211, 136, 46, 215, 45, 46, 218, 57, 199, 215, 46, 217, 249, 46, - 223, 40, 46, 217, 250, 219, 89, 46, 211, 135, 46, 215, 44, 46, 218, 57, - 197, 189, 46, 217, 243, 46, 223, 38, 46, 217, 244, 219, 89, 46, 224, 228, - 214, 76, 46, 221, 41, 214, 76, 46, 250, 225, 46, 247, 179, 46, 246, 200, - 46, 246, 177, 46, 247, 70, 126, 224, 40, 46, 244, 46, 46, 239, 173, 46, - 232, 167, 46, 142, 46, 230, 228, 46, 225, 230, 46, 223, 187, 46, 223, - 175, 246, 243, 46, 223, 88, 46, 221, 169, 46, 221, 168, 46, 221, 154, 46, - 221, 56, 46, 219, 154, 205, 186, 46, 218, 199, 46, 218, 126, 46, 212, - 206, 46, 212, 65, 46, 212, 0, 46, 211, 254, 46, 205, 47, 46, 204, 39, 46, - 197, 103, 46, 199, 216, 126, 221, 40, 46, 39, 126, 221, 40, 141, 203, 4, - 16, 38, 239, 177, 98, 141, 203, 4, 16, 38, 239, 177, 103, 141, 203, 4, - 16, 38, 239, 177, 135, 141, 203, 4, 16, 38, 239, 177, 136, 141, 203, 4, - 16, 38, 239, 177, 150, 141, 203, 4, 16, 38, 239, 177, 174, 141, 203, 4, - 16, 38, 239, 177, 182, 141, 203, 4, 16, 38, 239, 177, 178, 141, 203, 4, - 16, 38, 239, 177, 184, 141, 203, 4, 16, 38, 239, 177, 202, 248, 141, 203, - 4, 16, 38, 239, 177, 236, 127, 141, 203, 4, 16, 38, 239, 177, 200, 219, - 141, 203, 4, 16, 38, 239, 177, 202, 149, 141, 203, 4, 16, 38, 239, 177, - 234, 139, 141, 203, 4, 16, 38, 239, 177, 235, 29, 141, 203, 4, 16, 38, - 239, 177, 205, 236, 141, 203, 4, 16, 38, 239, 177, 207, 24, 141, 203, 4, - 16, 38, 239, 177, 236, 158, 141, 203, 4, 16, 38, 239, 177, 216, 94, 141, - 203, 4, 16, 38, 239, 177, 200, 214, 141, 203, 4, 16, 38, 239, 177, 200, - 208, 141, 203, 4, 16, 38, 239, 177, 200, 203, 141, 203, 4, 16, 38, 239, - 177, 200, 205, 141, 203, 4, 16, 38, 239, 177, 200, 210, 141, 203, 4, 16, - 38, 239, 177, 200, 211, 141, 203, 4, 16, 38, 239, 177, 200, 206, 141, - 203, 4, 16, 38, 239, 177, 200, 207, 141, 203, 4, 16, 38, 239, 177, 200, - 213, 141, 203, 4, 16, 38, 239, 177, 200, 209, 141, 203, 4, 16, 38, 239, - 177, 202, 147, 141, 203, 4, 16, 38, 239, 177, 202, 146, 46, 233, 242, - 231, 227, 38, 202, 187, 240, 196, 232, 8, 231, 227, 38, 202, 187, 210, - 121, 236, 202, 231, 227, 38, 238, 246, 250, 19, 202, 187, 248, 95, 231, - 227, 38, 195, 228, 234, 182, 231, 227, 38, 197, 143, 231, 227, 38, 241, - 15, 231, 227, 38, 202, 187, 250, 78, 231, 227, 38, 231, 64, 201, 247, - 231, 227, 38, 4, 203, 83, 231, 227, 38, 201, 173, 231, 227, 38, 213, 33, - 231, 227, 38, 204, 229, 231, 227, 38, 235, 53, 231, 227, 38, 232, 234, - 212, 22, 231, 227, 38, 218, 146, 231, 227, 38, 236, 78, 231, 227, 38, - 234, 183, 231, 227, 38, 197, 1, 214, 49, 202, 187, 239, 115, 231, 227, - 38, 250, 128, 231, 227, 38, 240, 250, 231, 227, 38, 248, 0, 202, 116, - 231, 227, 38, 232, 254, 231, 227, 38, 205, 74, 250, 148, 231, 227, 38, - 210, 44, 231, 227, 38, 225, 192, 231, 227, 38, 232, 234, 203, 83, 231, - 227, 38, 218, 75, 240, 220, 231, 227, 38, 232, 234, 211, 231, 231, 227, - 38, 202, 187, 251, 127, 197, 119, 231, 227, 38, 202, 187, 244, 75, 234, - 254, 231, 227, 38, 225, 206, 231, 227, 38, 237, 50, 231, 227, 38, 210, - 47, 231, 227, 38, 232, 234, 212, 5, 231, 227, 38, 211, 206, 231, 227, 38, - 239, 193, 77, 202, 187, 221, 253, 231, 227, 38, 202, 187, 235, 91, 231, - 227, 38, 214, 9, 231, 227, 38, 214, 104, 231, 227, 38, 239, 85, 231, 227, - 38, 239, 107, 231, 227, 38, 225, 221, 231, 227, 38, 247, 165, 231, 227, - 38, 244, 25, 202, 2, 219, 92, 231, 227, 38, 233, 211, 201, 247, 231, 227, - 38, 211, 146, 200, 9, 231, 227, 38, 214, 8, 231, 227, 38, 202, 187, 197, - 85, 231, 227, 38, 210, 35, 231, 227, 38, 202, 187, 246, 206, 231, 227, - 38, 202, 187, 250, 74, 202, 110, 231, 227, 38, 202, 187, 224, 89, 204, - 200, 218, 79, 231, 227, 38, 239, 52, 231, 227, 38, 202, 187, 219, 182, - 219, 240, 231, 227, 38, 251, 128, 231, 227, 38, 202, 187, 197, 136, 231, - 227, 38, 202, 187, 233, 166, 197, 44, 231, 227, 38, 202, 187, 225, 3, - 222, 158, 231, 227, 38, 238, 196, 231, 227, 38, 221, 240, 231, 227, 38, - 225, 195, 201, 97, 231, 227, 38, 4, 211, 231, 231, 227, 38, 251, 63, 244, - 15, 231, 227, 38, 248, 98, 244, 15, 11, 5, 225, 125, 11, 5, 225, 117, 11, - 5, 68, 11, 5, 225, 151, 11, 5, 226, 33, 11, 5, 226, 16, 11, 5, 226, 35, - 11, 5, 226, 34, 11, 5, 250, 18, 11, 5, 249, 231, 11, 5, 63, 11, 5, 250, - 150, 11, 5, 200, 21, 11, 5, 200, 24, 11, 5, 200, 22, 11, 5, 213, 237, 11, - 5, 213, 204, 11, 5, 74, 11, 5, 214, 24, 11, 5, 235, 230, 11, 5, 70, 11, - 5, 196, 237, 11, 5, 248, 3, 11, 5, 247, 254, 11, 5, 248, 41, 11, 5, 248, - 14, 11, 5, 248, 30, 11, 5, 248, 29, 11, 5, 248, 32, 11, 5, 248, 31, 11, - 5, 248, 166, 11, 5, 248, 158, 11, 5, 248, 252, 11, 5, 248, 191, 11, 5, - 247, 108, 11, 5, 247, 112, 11, 5, 247, 109, 11, 5, 247, 203, 11, 5, 247, - 184, 11, 5, 247, 230, 11, 5, 247, 209, 11, 5, 248, 56, 11, 5, 248, 119, - 11, 5, 248, 68, 11, 5, 247, 92, 11, 5, 247, 87, 11, 5, 247, 138, 11, 5, - 247, 107, 11, 5, 247, 100, 11, 5, 247, 105, 11, 5, 247, 75, 11, 5, 247, - 73, 11, 5, 247, 80, 11, 5, 247, 78, 11, 5, 247, 76, 11, 5, 247, 77, 11, - 5, 212, 101, 11, 5, 212, 97, 11, 5, 212, 163, 11, 5, 212, 113, 11, 5, - 212, 129, 11, 5, 212, 156, 11, 5, 212, 152, 11, 5, 213, 56, 11, 5, 213, - 45, 11, 5, 163, 11, 5, 213, 102, 11, 5, 211, 156, 11, 5, 211, 158, 11, 5, - 211, 157, 11, 5, 212, 15, 11, 5, 212, 3, 11, 5, 212, 62, 11, 5, 212, 33, - 11, 5, 211, 142, 11, 5, 211, 138, 11, 5, 211, 175, 11, 5, 211, 155, 11, - 5, 211, 147, 11, 5, 211, 153, 11, 5, 211, 120, 11, 5, 211, 119, 11, 5, - 211, 124, 11, 5, 211, 123, 11, 5, 211, 121, 11, 5, 211, 122, 11, 5, 248, - 140, 11, 5, 248, 139, 11, 5, 248, 146, 11, 5, 248, 141, 11, 5, 248, 143, - 11, 5, 248, 142, 11, 5, 248, 145, 11, 5, 248, 144, 11, 5, 248, 152, 11, - 5, 248, 151, 11, 5, 248, 155, 11, 5, 248, 153, 11, 5, 248, 131, 11, 5, - 248, 133, 11, 5, 248, 132, 11, 5, 248, 136, 11, 5, 248, 135, 11, 5, 248, - 138, 11, 5, 248, 137, 11, 5, 248, 147, 11, 5, 248, 150, 11, 5, 248, 148, - 11, 5, 248, 127, 11, 5, 248, 126, 11, 5, 248, 134, 11, 5, 248, 130, 11, - 5, 248, 128, 11, 5, 248, 129, 11, 5, 248, 123, 11, 5, 248, 122, 11, 5, - 248, 125, 11, 5, 248, 124, 11, 5, 217, 97, 11, 5, 217, 96, 11, 5, 217, - 102, 11, 5, 217, 98, 11, 5, 217, 99, 11, 5, 217, 101, 11, 5, 217, 100, - 11, 5, 217, 105, 11, 5, 217, 104, 11, 5, 217, 107, 11, 5, 217, 106, 11, - 5, 217, 93, 11, 5, 217, 92, 11, 5, 217, 95, 11, 5, 217, 94, 11, 5, 217, - 86, 11, 5, 217, 85, 11, 5, 217, 90, 11, 5, 217, 89, 11, 5, 217, 87, 11, - 5, 217, 88, 11, 5, 217, 80, 11, 5, 217, 79, 11, 5, 217, 84, 11, 5, 217, - 83, 11, 5, 217, 81, 11, 5, 217, 82, 11, 5, 231, 125, 11, 5, 231, 124, 11, - 5, 231, 130, 11, 5, 231, 126, 11, 5, 231, 127, 11, 5, 231, 129, 11, 5, - 231, 128, 11, 5, 231, 133, 11, 5, 231, 132, 11, 5, 231, 135, 11, 5, 231, - 134, 11, 5, 231, 116, 11, 5, 231, 118, 11, 5, 231, 117, 11, 5, 231, 121, - 11, 5, 231, 120, 11, 5, 231, 123, 11, 5, 231, 122, 11, 5, 231, 112, 11, - 5, 231, 111, 11, 5, 231, 119, 11, 5, 231, 115, 11, 5, 231, 113, 11, 5, - 231, 114, 11, 5, 231, 106, 11, 5, 231, 110, 11, 5, 231, 109, 11, 5, 231, - 107, 11, 5, 231, 108, 11, 5, 218, 171, 11, 5, 218, 170, 11, 5, 218, 243, - 11, 5, 218, 177, 11, 5, 218, 207, 11, 5, 218, 225, 11, 5, 218, 223, 11, - 5, 219, 166, 11, 5, 219, 161, 11, 5, 168, 11, 5, 219, 204, 11, 5, 218, - 19, 11, 5, 218, 18, 11, 5, 218, 22, 11, 5, 218, 20, 11, 5, 218, 89, 11, - 5, 218, 63, 11, 5, 218, 160, 11, 5, 218, 96, 11, 5, 219, 39, 11, 5, 219, - 114, 11, 5, 217, 255, 11, 5, 217, 251, 11, 5, 218, 56, 11, 5, 218, 15, - 11, 5, 218, 8, 11, 5, 218, 13, 11, 5, 217, 228, 11, 5, 217, 227, 11, 5, - 217, 233, 11, 5, 217, 230, 11, 5, 234, 240, 11, 5, 234, 234, 11, 5, 235, - 33, 11, 5, 235, 0, 11, 5, 235, 82, 11, 5, 235, 73, 11, 5, 235, 118, 11, - 5, 235, 87, 11, 5, 234, 136, 11, 5, 234, 188, 11, 5, 234, 169, 11, 5, - 234, 87, 11, 5, 234, 86, 11, 5, 234, 104, 11, 5, 234, 92, 11, 5, 234, 90, - 11, 5, 234, 91, 11, 5, 234, 74, 11, 5, 234, 73, 11, 5, 234, 77, 11, 5, - 234, 75, 11, 5, 198, 244, 11, 5, 198, 239, 11, 5, 199, 23, 11, 5, 198, - 253, 11, 5, 199, 12, 11, 5, 199, 9, 11, 5, 199, 15, 11, 5, 199, 14, 11, - 5, 199, 113, 11, 5, 199, 108, 11, 5, 199, 137, 11, 5, 199, 125, 11, 5, - 198, 218, 11, 5, 198, 214, 11, 5, 198, 237, 11, 5, 198, 220, 11, 5, 199, - 27, 11, 5, 199, 94, 11, 5, 197, 202, 11, 5, 197, 200, 11, 5, 197, 209, - 11, 5, 197, 205, 11, 5, 197, 203, 11, 5, 197, 204, 11, 5, 197, 193, 11, - 5, 197, 192, 11, 5, 197, 197, 11, 5, 197, 196, 11, 5, 197, 194, 11, 5, - 197, 195, 11, 5, 238, 189, 11, 5, 238, 176, 11, 5, 239, 20, 11, 5, 238, - 216, 11, 5, 238, 251, 11, 5, 239, 0, 11, 5, 238, 255, 11, 5, 239, 184, - 11, 5, 239, 178, 11, 5, 240, 3, 11, 5, 239, 204, 11, 5, 237, 55, 11, 5, - 237, 56, 11, 5, 238, 123, 11, 5, 237, 101, 11, 5, 238, 154, 11, 5, 238, - 126, 11, 5, 239, 50, 11, 5, 239, 119, 11, 5, 239, 71, 11, 5, 237, 46, 11, - 5, 237, 44, 11, 5, 237, 74, 11, 5, 237, 54, 11, 5, 237, 49, 11, 5, 237, - 52, 11, 5, 202, 29, 11, 5, 202, 21, 11, 5, 202, 94, 11, 5, 202, 39, 11, - 5, 202, 77, 11, 5, 202, 79, 11, 5, 202, 78, 11, 5, 203, 62, 11, 5, 203, - 47, 11, 5, 203, 137, 11, 5, 203, 73, 11, 5, 200, 251, 11, 5, 200, 250, - 11, 5, 200, 253, 11, 5, 200, 252, 11, 5, 201, 208, 11, 5, 201, 198, 11, - 5, 147, 11, 5, 201, 221, 11, 5, 202, 208, 11, 5, 203, 36, 11, 5, 202, - 235, 11, 5, 200, 234, 11, 5, 200, 229, 11, 5, 201, 20, 11, 5, 200, 249, - 11, 5, 200, 235, 11, 5, 200, 247, 11, 5, 239, 136, 11, 5, 239, 135, 11, - 5, 239, 141, 11, 5, 239, 137, 11, 5, 239, 138, 11, 5, 239, 140, 11, 5, - 239, 139, 11, 5, 239, 157, 11, 5, 239, 156, 11, 5, 239, 164, 11, 5, 239, - 158, 11, 5, 239, 126, 11, 5, 239, 128, 11, 5, 239, 127, 11, 5, 239, 131, - 11, 5, 239, 130, 11, 5, 239, 134, 11, 5, 239, 132, 11, 5, 239, 149, 11, - 5, 239, 152, 11, 5, 239, 150, 11, 5, 239, 122, 11, 5, 239, 121, 11, 5, - 239, 129, 11, 5, 239, 125, 11, 5, 239, 123, 11, 5, 239, 124, 11, 5, 217, - 53, 11, 5, 217, 52, 11, 5, 217, 60, 11, 5, 217, 55, 11, 5, 217, 56, 11, - 5, 217, 57, 11, 5, 217, 69, 11, 5, 217, 68, 11, 5, 217, 75, 11, 5, 217, - 70, 11, 5, 217, 45, 11, 5, 217, 44, 11, 5, 217, 51, 11, 5, 217, 46, 11, - 5, 217, 61, 11, 5, 217, 67, 11, 5, 217, 65, 11, 5, 217, 37, 11, 5, 217, - 36, 11, 5, 217, 42, 11, 5, 217, 40, 11, 5, 217, 38, 11, 5, 217, 39, 11, - 5, 231, 91, 11, 5, 231, 90, 11, 5, 231, 97, 11, 5, 231, 92, 11, 5, 231, - 94, 11, 5, 231, 93, 11, 5, 231, 96, 11, 5, 231, 95, 11, 5, 231, 103, 11, - 5, 231, 101, 11, 5, 231, 105, 11, 5, 231, 104, 11, 5, 231, 84, 11, 5, - 231, 85, 11, 5, 231, 88, 11, 5, 231, 87, 11, 5, 231, 89, 11, 5, 231, 98, - 11, 5, 231, 100, 11, 5, 231, 99, 11, 5, 231, 83, 11, 5, 216, 86, 11, 5, - 216, 84, 11, 5, 216, 141, 11, 5, 216, 89, 11, 5, 216, 115, 11, 5, 216, - 129, 11, 5, 216, 128, 11, 5, 217, 112, 11, 5, 179, 11, 5, 217, 128, 11, - 5, 215, 55, 11, 5, 215, 57, 11, 5, 215, 56, 11, 5, 215, 193, 11, 5, 215, - 177, 11, 5, 215, 225, 11, 5, 215, 204, 11, 5, 216, 250, 11, 5, 217, 34, - 11, 5, 217, 12, 11, 5, 215, 50, 11, 5, 215, 46, 11, 5, 215, 111, 11, 5, - 215, 54, 11, 5, 215, 52, 11, 5, 215, 53, 11, 5, 231, 156, 11, 5, 231, - 155, 11, 5, 231, 161, 11, 5, 231, 157, 11, 5, 231, 158, 11, 5, 231, 160, - 11, 5, 231, 159, 11, 5, 231, 167, 11, 5, 231, 165, 11, 5, 231, 169, 11, - 5, 231, 168, 11, 5, 231, 148, 11, 5, 231, 150, 11, 5, 231, 149, 11, 5, - 231, 152, 11, 5, 231, 154, 11, 5, 231, 153, 11, 5, 231, 162, 11, 5, 231, - 164, 11, 5, 231, 163, 11, 5, 231, 144, 11, 5, 231, 143, 11, 5, 231, 151, - 11, 5, 231, 147, 11, 5, 231, 145, 11, 5, 231, 146, 11, 5, 231, 138, 11, - 5, 231, 137, 11, 5, 231, 142, 11, 5, 231, 141, 11, 5, 231, 139, 11, 5, - 231, 140, 11, 5, 221, 209, 11, 5, 221, 201, 11, 5, 222, 11, 11, 5, 221, - 219, 11, 5, 222, 2, 11, 5, 222, 1, 11, 5, 222, 5, 11, 5, 222, 3, 11, 5, - 222, 122, 11, 5, 222, 110, 11, 5, 175, 11, 5, 222, 133, 11, 5, 221, 73, - 11, 5, 221, 72, 11, 5, 221, 75, 11, 5, 221, 74, 11, 5, 221, 120, 11, 5, - 221, 104, 11, 5, 221, 166, 11, 5, 221, 126, 11, 5, 222, 28, 11, 5, 222, - 99, 11, 5, 222, 46, 11, 5, 221, 67, 11, 5, 221, 65, 11, 5, 221, 95, 11, - 5, 221, 71, 11, 5, 221, 69, 11, 5, 221, 70, 11, 5, 221, 45, 11, 5, 221, - 44, 11, 5, 221, 55, 11, 5, 221, 48, 11, 5, 221, 46, 11, 5, 221, 47, 11, - 5, 233, 45, 11, 5, 233, 44, 11, 5, 233, 74, 11, 5, 233, 57, 11, 5, 233, - 66, 11, 5, 233, 65, 11, 5, 233, 68, 11, 5, 233, 67, 11, 5, 233, 213, 11, - 5, 233, 208, 11, 5, 234, 4, 11, 5, 233, 223, 11, 5, 232, 188, 11, 5, 232, - 187, 11, 5, 232, 190, 11, 5, 232, 189, 11, 5, 233, 3, 11, 5, 233, 1, 11, - 5, 233, 26, 11, 5, 233, 12, 11, 5, 233, 152, 11, 5, 233, 150, 11, 5, 233, - 186, 11, 5, 233, 163, 11, 5, 232, 177, 11, 5, 232, 176, 11, 5, 232, 214, - 11, 5, 232, 186, 11, 5, 232, 178, 11, 5, 232, 185, 11, 5, 223, 204, 11, - 5, 223, 200, 11, 5, 223, 249, 11, 5, 223, 218, 11, 5, 223, 230, 11, 5, - 223, 234, 11, 5, 223, 232, 11, 5, 224, 127, 11, 5, 224, 109, 11, 5, 157, - 11, 5, 224, 156, 11, 5, 223, 57, 11, 5, 223, 62, 11, 5, 223, 59, 11, 5, - 223, 129, 11, 5, 223, 124, 11, 5, 223, 165, 11, 5, 223, 136, 11, 5, 224, - 64, 11, 5, 224, 47, 11, 5, 224, 101, 11, 5, 224, 68, 11, 5, 223, 45, 11, - 5, 223, 41, 11, 5, 223, 86, 11, 5, 223, 56, 11, 5, 223, 49, 11, 5, 223, - 53, 11, 5, 233, 134, 11, 5, 233, 133, 11, 5, 233, 138, 11, 5, 233, 135, - 11, 5, 233, 137, 11, 5, 233, 136, 11, 5, 233, 145, 11, 5, 233, 144, 11, - 5, 233, 148, 11, 5, 233, 146, 11, 5, 233, 125, 11, 5, 233, 124, 11, 5, - 233, 127, 11, 5, 233, 126, 11, 5, 233, 130, 11, 5, 233, 129, 11, 5, 233, - 132, 11, 5, 233, 131, 11, 5, 233, 140, 11, 5, 233, 139, 11, 5, 233, 143, - 11, 5, 233, 141, 11, 5, 233, 120, 11, 5, 233, 119, 11, 5, 233, 128, 11, - 5, 233, 123, 11, 5, 233, 121, 11, 5, 233, 122, 11, 5, 219, 6, 11, 5, 219, - 7, 11, 5, 219, 25, 11, 5, 219, 24, 11, 5, 219, 27, 11, 5, 219, 26, 11, 5, - 218, 253, 11, 5, 218, 255, 11, 5, 218, 254, 11, 5, 219, 2, 11, 5, 219, 1, - 11, 5, 219, 4, 11, 5, 219, 3, 11, 5, 219, 8, 11, 5, 219, 10, 11, 5, 219, - 9, 11, 5, 218, 249, 11, 5, 218, 248, 11, 5, 219, 0, 11, 5, 218, 252, 11, - 5, 218, 250, 11, 5, 218, 251, 11, 5, 230, 166, 11, 5, 230, 165, 11, 5, - 230, 172, 11, 5, 230, 167, 11, 5, 230, 169, 11, 5, 230, 168, 11, 5, 230, - 171, 11, 5, 230, 170, 11, 5, 230, 177, 11, 5, 230, 176, 11, 5, 230, 179, - 11, 5, 230, 178, 11, 5, 230, 158, 11, 5, 230, 157, 11, 5, 230, 160, 11, - 5, 230, 159, 11, 5, 230, 162, 11, 5, 230, 161, 11, 5, 230, 164, 11, 5, - 230, 163, 11, 5, 230, 173, 11, 5, 230, 175, 11, 5, 230, 174, 11, 5, 216, - 189, 11, 5, 216, 191, 11, 5, 216, 190, 11, 5, 216, 234, 11, 5, 216, 232, - 11, 5, 216, 244, 11, 5, 216, 237, 11, 5, 216, 151, 11, 5, 216, 150, 11, - 5, 216, 152, 11, 5, 216, 161, 11, 5, 216, 158, 11, 5, 216, 169, 11, 5, - 216, 163, 11, 5, 216, 225, 11, 5, 216, 231, 11, 5, 216, 227, 11, 5, 231, - 175, 11, 5, 231, 192, 11, 5, 231, 201, 11, 5, 232, 50, 11, 5, 232, 39, - 11, 5, 142, 11, 5, 232, 62, 11, 5, 230, 195, 11, 5, 230, 194, 11, 5, 230, - 197, 11, 5, 230, 196, 11, 5, 230, 239, 11, 5, 230, 230, 11, 5, 231, 81, - 11, 5, 231, 46, 11, 5, 231, 229, 11, 5, 232, 32, 11, 5, 231, 241, 11, 5, - 197, 122, 11, 5, 197, 107, 11, 5, 197, 156, 11, 5, 197, 133, 11, 5, 196, - 226, 11, 5, 196, 228, 11, 5, 196, 227, 11, 5, 196, 250, 11, 5, 197, 28, - 11, 5, 197, 4, 11, 5, 197, 76, 11, 5, 197, 101, 11, 5, 197, 82, 11, 5, - 195, 18, 11, 5, 195, 17, 11, 5, 195, 33, 11, 5, 195, 21, 11, 5, 195, 26, - 11, 5, 195, 28, 11, 5, 195, 27, 11, 5, 195, 96, 11, 5, 195, 93, 11, 5, - 195, 114, 11, 5, 195, 100, 11, 5, 194, 248, 11, 5, 194, 250, 11, 5, 194, - 249, 11, 5, 195, 6, 11, 5, 195, 5, 11, 5, 195, 11, 11, 5, 195, 7, 11, 5, - 195, 76, 11, 5, 195, 88, 11, 5, 195, 81, 11, 5, 194, 244, 11, 5, 194, - 243, 11, 5, 194, 255, 11, 5, 194, 247, 11, 5, 194, 245, 11, 5, 194, 246, - 11, 5, 194, 230, 11, 5, 194, 229, 11, 5, 194, 235, 11, 5, 194, 233, 11, - 5, 194, 231, 11, 5, 194, 232, 11, 5, 244, 102, 11, 5, 244, 95, 11, 5, - 244, 131, 11, 5, 244, 115, 11, 5, 244, 128, 11, 5, 244, 122, 11, 5, 244, - 130, 11, 5, 244, 129, 11, 5, 246, 211, 11, 5, 246, 203, 11, 5, 247, 36, - 11, 5, 246, 244, 11, 5, 240, 152, 11, 5, 240, 154, 11, 5, 240, 153, 11, - 5, 240, 214, 11, 5, 240, 202, 11, 5, 244, 46, 11, 5, 240, 232, 11, 5, - 246, 140, 11, 5, 246, 176, 11, 5, 246, 145, 11, 5, 240, 124, 11, 5, 240, - 122, 11, 5, 240, 162, 11, 5, 240, 150, 11, 5, 240, 130, 11, 5, 240, 145, - 11, 5, 240, 101, 11, 5, 240, 100, 11, 5, 240, 113, 11, 5, 240, 107, 11, - 5, 240, 102, 11, 5, 240, 104, 11, 5, 194, 213, 11, 5, 194, 212, 11, 5, - 194, 219, 11, 5, 194, 214, 11, 5, 194, 216, 11, 5, 194, 215, 11, 5, 194, - 218, 11, 5, 194, 217, 11, 5, 194, 225, 11, 5, 194, 224, 11, 5, 194, 228, - 11, 5, 194, 226, 11, 5, 194, 209, 11, 5, 194, 211, 11, 5, 194, 210, 11, - 5, 194, 220, 11, 5, 194, 223, 11, 5, 194, 221, 11, 5, 194, 202, 11, 5, - 194, 206, 11, 5, 194, 205, 11, 5, 194, 203, 11, 5, 194, 204, 11, 5, 194, - 196, 11, 5, 194, 195, 11, 5, 194, 201, 11, 5, 194, 199, 11, 5, 194, 197, - 11, 5, 194, 198, 11, 5, 214, 224, 11, 5, 214, 223, 11, 5, 214, 229, 11, - 5, 214, 225, 11, 5, 214, 226, 11, 5, 214, 228, 11, 5, 214, 227, 11, 5, - 214, 234, 11, 5, 214, 233, 11, 5, 214, 237, 11, 5, 214, 236, 11, 5, 214, - 217, 11, 5, 214, 218, 11, 5, 214, 221, 11, 5, 214, 222, 11, 5, 214, 230, - 11, 5, 214, 232, 11, 5, 214, 212, 11, 5, 214, 220, 11, 5, 214, 216, 11, - 5, 214, 213, 11, 5, 214, 214, 11, 5, 214, 207, 11, 5, 214, 206, 11, 5, - 214, 211, 11, 5, 214, 210, 11, 5, 214, 208, 11, 5, 214, 209, 11, 5, 205, - 244, 11, 5, 174, 11, 5, 206, 69, 11, 5, 205, 247, 11, 5, 206, 49, 11, 5, - 206, 52, 11, 5, 206, 50, 11, 5, 208, 155, 11, 5, 208, 139, 11, 5, 187, - 11, 5, 208, 163, 11, 5, 204, 68, 11, 5, 204, 70, 11, 5, 204, 69, 11, 5, - 205, 127, 11, 5, 205, 116, 11, 5, 205, 162, 11, 5, 205, 131, 11, 5, 207, - 19, 11, 5, 208, 103, 11, 5, 207, 49, 11, 5, 204, 43, 11, 5, 204, 40, 11, - 5, 204, 139, 11, 5, 204, 67, 11, 5, 204, 47, 11, 5, 204, 55, 11, 5, 203, - 199, 11, 5, 203, 198, 11, 5, 204, 12, 11, 5, 203, 207, 11, 5, 203, 201, - 11, 5, 203, 206, 11, 5, 205, 4, 11, 5, 205, 3, 11, 5, 205, 10, 11, 5, - 205, 5, 11, 5, 205, 7, 11, 5, 205, 9, 11, 5, 205, 8, 11, 5, 205, 19, 11, - 5, 205, 17, 11, 5, 205, 43, 11, 5, 205, 20, 11, 5, 204, 255, 11, 5, 204, - 254, 11, 5, 205, 2, 11, 5, 205, 0, 11, 5, 205, 13, 11, 5, 205, 16, 11, 5, - 205, 14, 11, 5, 204, 251, 11, 5, 204, 249, 11, 5, 204, 253, 11, 5, 204, - 252, 11, 5, 204, 244, 11, 5, 204, 243, 11, 5, 204, 248, 11, 5, 204, 247, - 11, 5, 204, 245, 11, 5, 204, 246, 11, 5, 195, 69, 11, 5, 195, 68, 11, 5, - 195, 74, 11, 5, 195, 71, 11, 5, 195, 48, 11, 5, 195, 50, 11, 5, 195, 49, - 11, 5, 195, 53, 11, 5, 195, 52, 11, 5, 195, 57, 11, 5, 195, 54, 11, 5, - 195, 62, 11, 5, 195, 61, 11, 5, 195, 65, 11, 5, 195, 63, 11, 5, 195, 44, - 11, 5, 195, 43, 11, 5, 195, 51, 11, 5, 195, 47, 11, 5, 195, 45, 11, 5, - 195, 46, 11, 5, 195, 36, 11, 5, 195, 35, 11, 5, 195, 40, 11, 5, 195, 39, - 11, 5, 195, 37, 11, 5, 195, 38, 11, 5, 244, 229, 11, 5, 244, 225, 11, 5, - 246, 136, 11, 5, 246, 122, 11, 5, 244, 146, 11, 5, 244, 145, 11, 5, 244, - 148, 11, 5, 244, 147, 11, 5, 244, 161, 11, 5, 244, 160, 11, 5, 244, 169, - 11, 5, 244, 164, 11, 5, 244, 200, 11, 5, 244, 198, 11, 5, 244, 223, 11, - 5, 244, 208, 11, 5, 244, 140, 11, 5, 244, 150, 11, 5, 244, 144, 11, 5, - 244, 141, 11, 5, 244, 143, 11, 5, 244, 133, 11, 5, 244, 132, 11, 5, 244, - 137, 11, 5, 244, 136, 11, 5, 244, 134, 11, 5, 244, 135, 11, 5, 209, 131, - 11, 5, 209, 135, 11, 5, 209, 113, 11, 5, 209, 114, 11, 5, 209, 118, 11, - 5, 209, 117, 11, 5, 209, 121, 11, 5, 209, 119, 11, 5, 209, 125, 11, 5, - 209, 124, 11, 5, 209, 130, 11, 5, 209, 126, 11, 5, 209, 109, 11, 5, 209, - 107, 11, 5, 209, 115, 11, 5, 209, 112, 11, 5, 209, 110, 11, 5, 209, 111, - 11, 5, 209, 102, 11, 5, 209, 101, 11, 5, 209, 106, 11, 5, 209, 105, 11, - 5, 209, 103, 11, 5, 209, 104, 11, 5, 215, 172, 11, 5, 215, 171, 11, 5, - 215, 174, 11, 5, 215, 173, 11, 5, 215, 163, 11, 5, 215, 165, 11, 5, 215, - 164, 11, 5, 215, 167, 11, 5, 215, 166, 11, 5, 215, 170, 11, 5, 215, 169, - 11, 5, 215, 157, 11, 5, 215, 156, 11, 5, 215, 162, 11, 5, 215, 160, 11, - 5, 215, 158, 11, 5, 215, 159, 11, 5, 215, 151, 11, 5, 215, 150, 11, 5, - 215, 155, 11, 5, 215, 154, 11, 5, 215, 152, 11, 5, 215, 153, 11, 5, 206, - 221, 11, 5, 206, 216, 11, 5, 207, 6, 11, 5, 206, 234, 11, 5, 206, 96, 11, - 5, 206, 98, 11, 5, 206, 97, 11, 5, 206, 123, 11, 5, 206, 118, 11, 5, 206, - 154, 11, 5, 206, 143, 11, 5, 206, 189, 11, 5, 206, 182, 11, 5, 206, 211, - 11, 5, 206, 198, 11, 5, 206, 92, 11, 5, 206, 89, 11, 5, 206, 108, 11, 5, - 206, 95, 11, 5, 206, 93, 11, 5, 206, 94, 11, 5, 206, 72, 11, 5, 206, 71, - 11, 5, 206, 78, 11, 5, 206, 75, 11, 5, 206, 73, 11, 5, 206, 74, 11, 5, - 210, 147, 11, 5, 210, 141, 11, 5, 173, 11, 5, 210, 153, 11, 5, 209, 65, - 11, 5, 209, 67, 11, 5, 209, 66, 11, 5, 209, 149, 11, 5, 209, 137, 11, 5, - 209, 185, 11, 5, 209, 153, 11, 5, 210, 33, 11, 5, 210, 133, 11, 5, 210, - 75, 11, 5, 209, 57, 11, 5, 209, 54, 11, 5, 209, 95, 11, 5, 209, 64, 11, - 5, 209, 60, 11, 5, 209, 61, 11, 5, 209, 39, 11, 5, 209, 38, 11, 5, 209, - 44, 11, 5, 209, 42, 11, 5, 209, 40, 11, 5, 209, 41, 11, 5, 225, 51, 11, - 5, 225, 50, 11, 5, 225, 63, 11, 5, 225, 52, 11, 5, 225, 59, 11, 5, 225, - 58, 11, 5, 225, 61, 11, 5, 225, 60, 11, 5, 224, 245, 11, 5, 224, 244, 11, - 5, 224, 247, 11, 5, 224, 246, 11, 5, 225, 7, 11, 5, 225, 5, 11, 5, 225, - 20, 11, 5, 225, 9, 11, 5, 224, 238, 11, 5, 224, 236, 11, 5, 225, 1, 11, - 5, 224, 243, 11, 5, 224, 240, 11, 5, 224, 241, 11, 5, 224, 230, 11, 5, - 224, 229, 11, 5, 224, 234, 11, 5, 224, 233, 11, 5, 224, 231, 11, 5, 224, - 232, 11, 5, 211, 62, 11, 5, 211, 60, 11, 5, 211, 70, 11, 5, 211, 63, 11, - 5, 211, 67, 11, 5, 211, 66, 11, 5, 211, 69, 11, 5, 211, 68, 11, 5, 211, - 12, 11, 5, 211, 9, 11, 5, 211, 14, 11, 5, 211, 13, 11, 5, 211, 49, 11, 5, - 211, 48, 11, 5, 211, 58, 11, 5, 211, 52, 11, 5, 211, 4, 11, 5, 211, 0, - 11, 5, 211, 46, 11, 5, 211, 8, 11, 5, 211, 6, 11, 5, 211, 7, 11, 5, 210, - 240, 11, 5, 210, 238, 11, 5, 210, 250, 11, 5, 210, 243, 11, 5, 210, 241, - 11, 5, 210, 242, 11, 5, 225, 40, 11, 5, 225, 39, 11, 5, 225, 46, 11, 5, - 225, 41, 11, 5, 225, 43, 11, 5, 225, 42, 11, 5, 225, 45, 11, 5, 225, 44, - 11, 5, 225, 31, 11, 5, 225, 33, 11, 5, 225, 32, 11, 5, 225, 36, 11, 5, - 225, 35, 11, 5, 225, 38, 11, 5, 225, 37, 11, 5, 225, 27, 11, 5, 225, 26, - 11, 5, 225, 34, 11, 5, 225, 30, 11, 5, 225, 28, 11, 5, 225, 29, 11, 5, - 225, 23, 11, 5, 225, 22, 11, 5, 225, 25, 11, 5, 225, 24, 11, 5, 216, 59, - 11, 5, 216, 58, 11, 5, 216, 66, 11, 5, 216, 60, 11, 5, 216, 62, 11, 5, - 216, 61, 11, 5, 216, 65, 11, 5, 216, 63, 11, 5, 216, 48, 11, 5, 216, 49, - 11, 5, 216, 54, 11, 5, 216, 53, 11, 5, 216, 57, 11, 5, 216, 55, 11, 5, - 216, 43, 11, 5, 216, 52, 11, 5, 216, 47, 11, 5, 216, 44, 11, 5, 216, 45, - 11, 5, 216, 38, 11, 5, 216, 37, 11, 5, 216, 42, 11, 5, 216, 41, 11, 5, - 216, 39, 11, 5, 216, 40, 11, 5, 215, 3, 11, 5, 215, 2, 11, 5, 215, 15, - 11, 5, 215, 7, 11, 5, 215, 12, 11, 5, 215, 11, 11, 5, 215, 14, 11, 5, - 215, 13, 11, 5, 214, 244, 11, 5, 214, 246, 11, 5, 214, 245, 11, 5, 214, - 251, 11, 5, 214, 250, 11, 5, 215, 0, 11, 5, 214, 252, 11, 5, 214, 242, - 11, 5, 214, 240, 11, 5, 214, 249, 11, 5, 214, 243, 11, 5, 196, 181, 11, - 5, 196, 180, 11, 5, 196, 190, 11, 5, 196, 183, 11, 5, 196, 185, 11, 5, - 196, 184, 11, 5, 196, 187, 11, 5, 196, 186, 11, 5, 196, 169, 11, 5, 196, - 170, 11, 5, 196, 174, 11, 5, 196, 173, 11, 5, 196, 179, 11, 5, 196, 177, - 11, 5, 196, 147, 11, 5, 196, 145, 11, 5, 196, 160, 11, 5, 196, 150, 11, - 5, 196, 148, 11, 5, 196, 149, 11, 5, 196, 6, 11, 5, 196, 4, 11, 5, 196, - 20, 11, 5, 196, 7, 11, 5, 196, 14, 11, 5, 196, 13, 11, 5, 196, 17, 11, 5, - 196, 15, 11, 5, 195, 189, 11, 5, 195, 188, 11, 5, 195, 192, 11, 5, 195, - 190, 11, 5, 195, 230, 11, 5, 195, 225, 11, 5, 196, 0, 11, 5, 195, 234, - 11, 5, 195, 180, 11, 5, 195, 176, 11, 5, 195, 215, 11, 5, 195, 187, 11, - 5, 195, 183, 11, 5, 195, 184, 11, 5, 195, 160, 11, 5, 195, 159, 11, 5, - 195, 167, 11, 5, 195, 163, 11, 5, 195, 161, 11, 5, 195, 162, 11, 43, 211, - 49, 11, 43, 222, 11, 11, 43, 223, 204, 11, 43, 215, 7, 11, 43, 240, 107, - 11, 43, 205, 10, 11, 43, 233, 131, 11, 43, 233, 163, 11, 43, 218, 243, - 11, 43, 230, 166, 11, 43, 221, 47, 11, 43, 248, 127, 11, 43, 218, 96, 11, - 43, 196, 0, 11, 43, 211, 142, 11, 43, 230, 160, 11, 43, 203, 62, 11, 43, - 234, 4, 11, 43, 194, 247, 11, 43, 240, 101, 11, 43, 239, 124, 11, 43, - 247, 105, 11, 43, 233, 127, 11, 43, 214, 252, 11, 43, 201, 20, 11, 43, - 214, 24, 11, 43, 225, 27, 11, 43, 195, 6, 11, 43, 211, 120, 11, 43, 231, - 123, 11, 43, 196, 6, 11, 43, 197, 204, 11, 43, 206, 78, 11, 43, 199, 94, - 11, 43, 195, 114, 11, 43, 225, 20, 11, 43, 214, 216, 11, 43, 225, 25, 11, - 43, 233, 3, 11, 43, 225, 45, 11, 43, 197, 28, 11, 43, 237, 74, 11, 43, - 206, 94, 11, 43, 222, 5, 11, 43, 240, 113, 11, 43, 240, 153, 11, 43, 244, - 115, 11, 43, 230, 163, 11, 43, 206, 221, 11, 43, 194, 246, 11, 43, 206, - 143, 11, 43, 244, 223, 11, 43, 194, 216, 11, 43, 217, 101, 11, 43, 224, - 101, 221, 210, 1, 248, 252, 221, 210, 1, 163, 221, 210, 1, 212, 205, 221, - 210, 1, 240, 3, 221, 210, 1, 203, 137, 221, 210, 1, 202, 202, 221, 210, - 1, 234, 4, 221, 210, 1, 157, 221, 210, 1, 224, 38, 221, 210, 1, 225, 105, - 221, 210, 1, 247, 36, 221, 210, 1, 246, 136, 221, 210, 1, 237, 29, 221, - 210, 1, 201, 93, 221, 210, 1, 201, 83, 221, 210, 1, 168, 221, 210, 1, - 179, 221, 210, 1, 175, 221, 210, 1, 187, 221, 210, 1, 195, 74, 221, 210, - 1, 195, 114, 221, 210, 1, 216, 244, 221, 210, 1, 142, 221, 210, 1, 196, - 202, 221, 210, 1, 231, 223, 221, 210, 1, 235, 118, 221, 210, 1, 197, 156, - 221, 210, 1, 207, 6, 221, 210, 1, 165, 221, 210, 1, 233, 112, 221, 210, - 1, 63, 221, 210, 1, 251, 90, 221, 210, 1, 70, 221, 210, 1, 235, 251, 221, - 210, 1, 68, 221, 210, 1, 74, 221, 210, 1, 66, 221, 210, 1, 200, 81, 221, - 210, 1, 200, 75, 221, 210, 1, 214, 91, 221, 210, 1, 154, 217, 232, 202, - 94, 221, 210, 1, 154, 217, 171, 212, 62, 221, 210, 1, 154, 217, 232, 240, - 112, 221, 210, 1, 154, 217, 232, 247, 230, 221, 210, 1, 154, 217, 232, - 179, 221, 210, 1, 154, 217, 232, 225, 72, 221, 210, 211, 163, 244, 23, - 221, 210, 211, 163, 234, 98, 204, 193, 53, 5, 236, 184, 53, 5, 236, 180, - 53, 5, 232, 4, 53, 5, 197, 90, 53, 5, 197, 89, 53, 5, 213, 22, 53, 5, - 248, 48, 53, 5, 248, 105, 53, 5, 219, 140, 53, 5, 223, 117, 53, 5, 219, - 19, 53, 5, 233, 199, 53, 5, 235, 62, 53, 5, 199, 100, 53, 5, 203, 16, 53, - 5, 202, 184, 53, 5, 239, 34, 53, 5, 239, 31, 53, 5, 222, 90, 53, 5, 210, - 105, 53, 5, 239, 105, 53, 5, 217, 66, 53, 5, 208, 85, 53, 5, 206, 209, - 53, 5, 195, 85, 53, 5, 195, 64, 53, 5, 246, 168, 53, 5, 225, 82, 53, 5, - 216, 73, 53, 5, 196, 62, 53, 5, 224, 92, 53, 5, 216, 217, 53, 5, 233, - 178, 53, 5, 219, 97, 53, 5, 217, 23, 53, 5, 215, 23, 53, 5, 68, 53, 5, - 225, 230, 53, 5, 231, 214, 53, 5, 231, 184, 53, 5, 197, 64, 53, 5, 197, - 46, 53, 5, 212, 163, 53, 5, 248, 46, 53, 5, 248, 41, 53, 5, 219, 133, 53, - 5, 223, 114, 53, 5, 219, 16, 53, 5, 233, 195, 53, 5, 235, 33, 53, 5, 199, - 23, 53, 5, 202, 94, 53, 5, 202, 164, 53, 5, 239, 26, 53, 5, 239, 30, 53, - 5, 222, 11, 53, 5, 210, 23, 53, 5, 239, 20, 53, 5, 217, 60, 53, 5, 206, - 69, 53, 5, 206, 179, 53, 5, 195, 33, 53, 5, 195, 60, 53, 5, 244, 131, 53, - 5, 225, 63, 53, 5, 216, 66, 53, 5, 196, 20, 53, 5, 223, 249, 53, 5, 216, - 209, 53, 5, 233, 74, 53, 5, 218, 243, 53, 5, 216, 141, 53, 5, 215, 15, - 53, 5, 63, 53, 5, 250, 208, 53, 5, 216, 239, 53, 5, 142, 53, 5, 232, 97, - 53, 5, 197, 156, 53, 5, 197, 137, 53, 5, 163, 53, 5, 248, 53, 53, 5, 248, - 252, 53, 5, 219, 148, 53, 5, 223, 122, 53, 5, 223, 120, 53, 5, 219, 23, - 53, 5, 233, 203, 53, 5, 235, 118, 53, 5, 199, 137, 53, 5, 203, 137, 53, - 5, 202, 202, 53, 5, 239, 44, 53, 5, 239, 33, 53, 5, 175, 53, 5, 173, 53, - 5, 240, 3, 53, 5, 217, 75, 53, 5, 187, 53, 5, 207, 6, 53, 5, 195, 114, - 53, 5, 195, 74, 53, 5, 247, 36, 53, 5, 225, 105, 53, 5, 216, 82, 53, 5, - 165, 53, 5, 157, 53, 5, 224, 165, 53, 5, 216, 223, 53, 5, 234, 4, 53, 5, - 168, 53, 5, 179, 53, 5, 215, 34, 53, 5, 214, 33, 53, 5, 214, 28, 53, 5, - 231, 54, 53, 5, 197, 9, 53, 5, 197, 5, 53, 5, 212, 37, 53, 5, 248, 44, - 53, 5, 247, 217, 53, 5, 219, 128, 53, 5, 223, 112, 53, 5, 219, 12, 53, 5, - 233, 191, 53, 5, 234, 177, 53, 5, 198, 222, 53, 5, 201, 226, 53, 5, 202, - 136, 53, 5, 239, 23, 53, 5, 239, 28, 53, 5, 221, 133, 53, 5, 209, 159, - 53, 5, 238, 129, 53, 5, 217, 47, 53, 5, 205, 133, 53, 5, 206, 147, 53, 5, - 195, 8, 53, 5, 195, 55, 53, 5, 240, 237, 53, 5, 225, 10, 53, 5, 216, 56, - 53, 5, 195, 235, 53, 5, 223, 141, 53, 5, 216, 207, 53, 5, 233, 14, 53, 5, - 218, 104, 53, 5, 215, 208, 53, 5, 214, 253, 53, 5, 66, 53, 5, 200, 55, - 53, 5, 230, 219, 53, 5, 230, 203, 53, 5, 196, 237, 53, 5, 196, 230, 53, - 5, 211, 175, 53, 5, 248, 43, 53, 5, 247, 138, 53, 5, 219, 127, 53, 5, - 223, 110, 53, 5, 219, 11, 53, 5, 233, 190, 53, 5, 234, 104, 53, 5, 197, - 209, 53, 5, 201, 20, 53, 5, 202, 114, 53, 5, 239, 21, 53, 5, 239, 27, 53, - 5, 221, 95, 53, 5, 209, 95, 53, 5, 237, 74, 53, 5, 217, 42, 53, 5, 204, - 139, 53, 5, 206, 108, 53, 5, 194, 255, 53, 5, 195, 51, 53, 5, 240, 162, - 53, 5, 225, 1, 53, 5, 216, 52, 53, 5, 195, 215, 53, 5, 223, 86, 53, 5, - 216, 206, 53, 5, 232, 214, 53, 5, 218, 56, 53, 5, 215, 111, 53, 5, 214, - 249, 53, 5, 74, 53, 5, 214, 48, 53, 5, 216, 165, 53, 5, 231, 81, 53, 5, - 231, 57, 53, 5, 197, 28, 53, 5, 197, 10, 53, 5, 212, 62, 53, 5, 248, 45, - 53, 5, 247, 230, 53, 5, 219, 129, 53, 5, 223, 113, 53, 5, 219, 14, 53, 5, - 233, 193, 53, 5, 233, 192, 53, 5, 234, 188, 53, 5, 198, 237, 53, 5, 147, - 53, 5, 202, 141, 53, 5, 239, 24, 53, 5, 239, 29, 53, 5, 221, 166, 53, 5, - 209, 185, 53, 5, 238, 154, 53, 5, 217, 51, 53, 5, 205, 162, 53, 5, 206, - 154, 53, 5, 195, 11, 53, 5, 195, 57, 53, 5, 244, 46, 53, 5, 225, 20, 53, - 5, 216, 57, 53, 5, 196, 0, 53, 5, 223, 165, 53, 5, 216, 208, 53, 5, 233, - 26, 53, 5, 218, 160, 53, 5, 215, 225, 53, 5, 215, 0, 53, 5, 70, 53, 5, - 236, 106, 53, 5, 216, 228, 53, 5, 232, 32, 53, 5, 231, 244, 53, 5, 197, - 101, 53, 5, 197, 84, 53, 5, 213, 35, 53, 5, 248, 49, 53, 5, 248, 119, 53, - 5, 219, 141, 53, 5, 223, 118, 53, 5, 223, 116, 53, 5, 219, 20, 53, 5, - 233, 200, 53, 5, 233, 198, 53, 5, 235, 69, 53, 5, 199, 105, 53, 5, 203, - 36, 53, 5, 202, 186, 53, 5, 239, 35, 53, 5, 239, 32, 53, 5, 222, 99, 53, - 5, 210, 133, 53, 5, 239, 119, 53, 5, 217, 67, 53, 5, 208, 103, 53, 5, - 206, 211, 53, 5, 195, 88, 53, 5, 195, 65, 53, 5, 246, 176, 53, 5, 225, - 84, 53, 5, 216, 75, 53, 5, 196, 65, 53, 5, 224, 101, 53, 5, 216, 218, 53, - 5, 216, 214, 53, 5, 233, 186, 53, 5, 233, 172, 53, 5, 219, 114, 53, 5, - 217, 34, 53, 5, 215, 24, 53, 5, 216, 246, 53, 5, 222, 52, 53, 244, 23, - 53, 234, 98, 204, 193, 53, 211, 28, 78, 53, 5, 217, 50, 235, 118, 53, 5, - 217, 50, 157, 53, 5, 217, 50, 205, 133, 53, 16, 235, 58, 53, 16, 224, 90, - 53, 16, 202, 44, 53, 16, 216, 108, 53, 16, 248, 196, 53, 16, 235, 117, - 53, 16, 203, 130, 53, 16, 239, 209, 53, 16, 238, 128, 53, 16, 223, 63, - 53, 16, 201, 230, 53, 16, 238, 153, 53, 16, 225, 11, 53, 17, 195, 79, 53, - 17, 98, 53, 17, 103, 53, 17, 135, 53, 17, 136, 53, 17, 150, 53, 17, 174, - 53, 17, 182, 53, 17, 178, 53, 17, 184, 53, 5, 217, 50, 168, 53, 5, 217, - 50, 238, 154, 40, 6, 1, 195, 83, 40, 4, 1, 195, 83, 40, 6, 1, 237, 24, - 40, 4, 1, 237, 24, 40, 6, 1, 210, 40, 237, 26, 40, 4, 1, 210, 40, 237, - 26, 40, 6, 1, 225, 154, 40, 4, 1, 225, 154, 40, 6, 1, 238, 171, 40, 4, 1, - 238, 171, 40, 6, 1, 218, 112, 200, 70, 40, 4, 1, 218, 112, 200, 70, 40, - 6, 1, 247, 151, 214, 53, 40, 4, 1, 247, 151, 214, 53, 40, 6, 1, 217, 2, - 196, 47, 40, 4, 1, 217, 2, 196, 47, 40, 6, 1, 196, 44, 3, 248, 246, 196, - 47, 40, 4, 1, 196, 44, 3, 248, 246, 196, 47, 40, 6, 1, 225, 152, 196, 79, - 40, 4, 1, 225, 152, 196, 79, 40, 6, 1, 210, 40, 195, 215, 40, 4, 1, 210, - 40, 195, 215, 40, 6, 1, 225, 152, 63, 40, 4, 1, 225, 152, 63, 40, 6, 1, - 244, 67, 221, 205, 195, 181, 40, 4, 1, 244, 67, 221, 205, 195, 181, 40, - 6, 1, 247, 242, 195, 181, 40, 4, 1, 247, 242, 195, 181, 40, 6, 1, 225, - 152, 244, 67, 221, 205, 195, 181, 40, 4, 1, 225, 152, 244, 67, 221, 205, - 195, 181, 40, 6, 1, 196, 2, 40, 4, 1, 196, 2, 40, 6, 1, 210, 40, 201, 87, - 40, 4, 1, 210, 40, 201, 87, 40, 6, 1, 205, 148, 239, 119, 40, 4, 1, 205, - 148, 239, 119, 40, 6, 1, 205, 148, 236, 138, 40, 4, 1, 205, 148, 236, - 138, 40, 6, 1, 205, 148, 236, 117, 40, 4, 1, 205, 148, 236, 117, 40, 6, - 1, 218, 116, 74, 40, 4, 1, 218, 116, 74, 40, 6, 1, 248, 17, 74, 40, 4, 1, - 248, 17, 74, 40, 6, 1, 54, 218, 116, 74, 40, 4, 1, 54, 218, 116, 74, 40, - 1, 218, 33, 74, 37, 40, 197, 191, 37, 40, 202, 249, 218, 192, 56, 37, 40, - 230, 202, 218, 192, 56, 37, 40, 202, 131, 218, 192, 56, 205, 207, 250, - 29, 37, 40, 1, 200, 67, 226, 35, 37, 40, 1, 68, 37, 40, 1, 196, 20, 37, - 40, 1, 66, 37, 40, 1, 232, 58, 56, 37, 40, 1, 196, 43, 37, 40, 1, 205, - 148, 56, 37, 40, 1, 214, 53, 37, 40, 224, 113, 37, 40, 213, 42, 40, 224, - 113, 40, 213, 42, 40, 6, 1, 237, 39, 40, 4, 1, 237, 39, 40, 6, 1, 237, - 15, 40, 4, 1, 237, 15, 40, 6, 1, 195, 41, 40, 4, 1, 195, 41, 40, 6, 1, - 246, 192, 40, 4, 1, 246, 192, 40, 6, 1, 237, 12, 40, 4, 1, 237, 12, 40, - 6, 1, 203, 37, 3, 108, 124, 40, 4, 1, 203, 37, 3, 108, 124, 40, 6, 1, - 200, 223, 40, 4, 1, 200, 223, 40, 6, 1, 201, 62, 40, 4, 1, 201, 62, 40, - 6, 1, 201, 67, 40, 4, 1, 201, 67, 40, 6, 1, 203, 42, 40, 4, 1, 203, 42, - 40, 6, 1, 230, 184, 40, 4, 1, 230, 184, 40, 6, 1, 206, 84, 40, 4, 1, 206, - 84, 40, 6, 1, 54, 74, 40, 4, 1, 54, 74, 40, 6, 1, 240, 180, 74, 40, 4, 1, - 240, 180, 74, 71, 1, 40, 232, 58, 56, 71, 1, 40, 205, 148, 56, 37, 40, 1, - 236, 177, 37, 40, 1, 225, 152, 70, 25, 1, 63, 25, 1, 157, 25, 1, 66, 25, - 1, 223, 86, 25, 1, 236, 184, 25, 1, 210, 105, 25, 1, 203, 113, 25, 1, 74, - 25, 1, 215, 15, 25, 1, 68, 25, 1, 175, 25, 1, 163, 25, 1, 209, 217, 25, - 1, 210, 9, 25, 1, 222, 89, 25, 1, 219, 96, 25, 1, 203, 130, 25, 1, 217, - 73, 25, 1, 216, 80, 25, 1, 221, 40, 25, 1, 204, 41, 25, 1, 218, 56, 25, - 1, 206, 174, 25, 1, 206, 69, 25, 1, 206, 184, 25, 1, 207, 28, 25, 1, 223, - 7, 25, 1, 224, 64, 25, 1, 215, 79, 25, 1, 215, 111, 25, 1, 216, 51, 25, - 1, 195, 232, 25, 1, 206, 108, 25, 1, 195, 185, 25, 1, 165, 25, 1, 215, - 145, 25, 1, 224, 50, 25, 1, 212, 209, 25, 1, 216, 73, 25, 1, 215, 126, - 25, 1, 211, 167, 25, 1, 196, 234, 25, 1, 213, 22, 25, 1, 235, 62, 25, 1, - 209, 95, 25, 1, 221, 95, 25, 1, 218, 243, 25, 1, 216, 141, 25, 1, 210, - 42, 25, 1, 210, 178, 25, 1, 224, 74, 25, 1, 216, 172, 25, 1, 216, 223, - 25, 1, 216, 244, 25, 1, 206, 154, 25, 1, 211, 172, 25, 1, 234, 104, 25, - 1, 234, 181, 25, 1, 197, 156, 25, 1, 179, 25, 1, 222, 11, 25, 1, 212, - 163, 25, 1, 221, 125, 25, 1, 223, 165, 25, 1, 219, 138, 25, 1, 210, 77, - 25, 1, 219, 73, 25, 1, 168, 25, 1, 202, 94, 25, 1, 223, 249, 25, 1, 218, - 160, 25, 1, 219, 146, 25, 1, 202, 226, 25, 1, 223, 122, 25, 1, 202, 248, - 25, 1, 215, 113, 25, 1, 208, 182, 25, 1, 235, 114, 25, 1, 223, 125, 25, - 1, 223, 156, 25, 37, 113, 223, 134, 25, 37, 113, 201, 5, 25, 216, 79, 25, - 234, 98, 204, 193, 25, 244, 32, 25, 244, 23, 25, 207, 61, 25, 211, 28, - 78, 71, 1, 244, 181, 154, 196, 10, 212, 115, 71, 1, 244, 181, 154, 196, - 91, 212, 115, 71, 1, 244, 181, 154, 196, 10, 206, 235, 71, 1, 244, 181, - 154, 196, 91, 206, 235, 71, 1, 244, 181, 154, 196, 10, 211, 46, 71, 1, - 244, 181, 154, 196, 91, 211, 46, 71, 1, 244, 181, 154, 196, 10, 209, 95, - 71, 1, 244, 181, 154, 196, 91, 209, 95, 71, 1, 235, 209, 237, 120, 154, - 153, 71, 1, 128, 237, 120, 154, 153, 71, 1, 218, 230, 237, 120, 154, 153, - 71, 1, 125, 237, 120, 154, 153, 71, 1, 235, 208, 237, 120, 154, 153, 71, - 1, 235, 209, 237, 120, 222, 78, 154, 153, 71, 1, 128, 237, 120, 222, 78, - 154, 153, 71, 1, 218, 230, 237, 120, 222, 78, 154, 153, 71, 1, 125, 237, - 120, 222, 78, 154, 153, 71, 1, 235, 208, 237, 120, 222, 78, 154, 153, 71, - 1, 235, 209, 222, 78, 154, 153, 71, 1, 128, 222, 78, 154, 153, 71, 1, - 218, 230, 222, 78, 154, 153, 71, 1, 125, 222, 78, 154, 153, 71, 1, 235, - 208, 222, 78, 154, 153, 71, 1, 76, 83, 153, 71, 1, 76, 205, 209, 71, 1, - 76, 231, 43, 153, 71, 1, 221, 107, 52, 240, 222, 250, 192, 71, 1, 210, - 164, 120, 51, 71, 1, 210, 164, 133, 51, 71, 1, 210, 164, 235, 225, 78, - 71, 1, 210, 164, 225, 163, 235, 225, 78, 71, 1, 125, 225, 163, 235, 225, - 78, 71, 1, 204, 173, 26, 128, 201, 239, 71, 1, 204, 173, 26, 125, 201, - 239, 8, 6, 1, 236, 172, 251, 10, 8, 4, 1, 236, 172, 251, 10, 8, 6, 1, - 236, 172, 251, 40, 8, 4, 1, 236, 172, 251, 40, 8, 6, 1, 231, 242, 8, 4, - 1, 231, 242, 8, 6, 1, 200, 169, 8, 4, 1, 200, 169, 8, 6, 1, 201, 164, 8, - 4, 1, 201, 164, 8, 6, 1, 240, 159, 8, 4, 1, 240, 159, 8, 6, 1, 240, 160, - 3, 244, 23, 8, 4, 1, 240, 160, 3, 244, 23, 8, 1, 4, 6, 235, 184, 8, 1, 4, - 6, 209, 35, 8, 6, 1, 252, 10, 8, 4, 1, 252, 10, 8, 6, 1, 250, 153, 8, 4, - 1, 250, 153, 8, 6, 1, 250, 0, 8, 4, 1, 250, 0, 8, 6, 1, 249, 240, 8, 4, - 1, 249, 240, 8, 6, 1, 249, 241, 3, 231, 43, 153, 8, 4, 1, 249, 241, 3, - 231, 43, 153, 8, 6, 1, 249, 229, 8, 4, 1, 249, 229, 8, 6, 1, 210, 40, - 247, 70, 3, 238, 123, 8, 4, 1, 210, 40, 247, 70, 3, 238, 123, 8, 6, 1, - 224, 228, 3, 101, 8, 4, 1, 224, 228, 3, 101, 8, 6, 1, 224, 228, 3, 239, - 15, 101, 8, 4, 1, 224, 228, 3, 239, 15, 101, 8, 6, 1, 224, 228, 3, 204, - 163, 26, 239, 15, 101, 8, 4, 1, 224, 228, 3, 204, 163, 26, 239, 15, 101, - 8, 6, 1, 247, 149, 158, 8, 4, 1, 247, 149, 158, 8, 6, 1, 223, 1, 3, 128, - 101, 8, 4, 1, 223, 1, 3, 128, 101, 8, 6, 1, 169, 3, 172, 204, 163, 213, - 211, 8, 4, 1, 169, 3, 172, 204, 163, 213, 211, 8, 6, 1, 169, 3, 221, 129, - 8, 4, 1, 169, 3, 221, 129, 8, 6, 1, 214, 33, 8, 4, 1, 214, 33, 8, 6, 1, - 213, 196, 3, 204, 163, 202, 117, 239, 63, 8, 4, 1, 213, 196, 3, 204, 163, - 202, 117, 239, 63, 8, 6, 1, 213, 196, 3, 234, 201, 8, 4, 1, 213, 196, 3, - 234, 201, 8, 6, 1, 213, 196, 3, 205, 49, 203, 103, 8, 4, 1, 213, 196, 3, - 205, 49, 203, 103, 8, 6, 1, 211, 117, 3, 204, 163, 202, 117, 239, 63, 8, - 4, 1, 211, 117, 3, 204, 163, 202, 117, 239, 63, 8, 6, 1, 211, 117, 3, - 239, 15, 101, 8, 4, 1, 211, 117, 3, 239, 15, 101, 8, 6, 1, 210, 237, 209, - 142, 8, 4, 1, 210, 237, 209, 142, 8, 6, 1, 209, 76, 209, 142, 8, 4, 1, - 209, 76, 209, 142, 8, 6, 1, 199, 216, 3, 239, 15, 101, 8, 4, 1, 199, 216, - 3, 239, 15, 101, 8, 6, 1, 197, 197, 8, 4, 1, 197, 197, 8, 6, 1, 198, 245, - 195, 157, 8, 4, 1, 198, 245, 195, 157, 8, 6, 1, 202, 135, 3, 101, 8, 4, - 1, 202, 135, 3, 101, 8, 6, 1, 202, 135, 3, 204, 163, 202, 117, 239, 63, - 8, 4, 1, 202, 135, 3, 204, 163, 202, 117, 239, 63, 8, 6, 1, 199, 95, 8, - 4, 1, 199, 95, 8, 6, 1, 236, 7, 8, 4, 1, 236, 7, 8, 6, 1, 225, 139, 8, 4, - 1, 225, 139, 8, 6, 1, 241, 19, 8, 4, 1, 241, 19, 71, 1, 199, 244, 8, 4, - 1, 237, 63, 8, 4, 1, 221, 78, 8, 4, 1, 218, 26, 8, 4, 1, 215, 70, 8, 4, - 1, 209, 75, 8, 1, 4, 6, 209, 75, 8, 4, 1, 201, 2, 8, 4, 1, 200, 62, 8, 6, - 1, 225, 184, 240, 98, 8, 4, 1, 225, 184, 240, 98, 8, 6, 1, 225, 184, 235, - 184, 8, 4, 1, 225, 184, 235, 184, 8, 6, 1, 225, 184, 234, 71, 8, 6, 1, - 200, 240, 225, 184, 234, 71, 8, 4, 1, 200, 240, 225, 184, 234, 71, 8, 6, - 1, 200, 240, 158, 8, 4, 1, 200, 240, 158, 8, 6, 1, 225, 184, 143, 8, 4, - 1, 225, 184, 143, 8, 6, 1, 225, 184, 209, 35, 8, 4, 1, 225, 184, 209, 35, - 8, 6, 1, 225, 184, 203, 185, 8, 4, 1, 225, 184, 203, 185, 71, 1, 125, - 244, 105, 251, 122, 71, 1, 244, 32, 71, 1, 206, 139, 236, 49, 56, 8, 6, - 1, 208, 186, 8, 4, 1, 208, 186, 8, 6, 1, 200, 240, 232, 154, 8, 4, 1, - 223, 1, 3, 210, 46, 231, 53, 26, 248, 79, 8, 1, 206, 12, 238, 123, 8, 6, - 1, 217, 226, 3, 239, 63, 8, 4, 1, 217, 226, 3, 239, 63, 8, 6, 1, 247, 70, - 3, 153, 8, 4, 1, 247, 70, 3, 153, 8, 4, 1, 247, 70, 3, 213, 152, 124, 8, - 4, 1, 232, 155, 3, 213, 152, 124, 8, 6, 1, 72, 3, 234, 201, 8, 4, 1, 72, - 3, 234, 201, 8, 6, 1, 235, 185, 3, 101, 8, 4, 1, 235, 185, 3, 101, 8, 6, - 1, 198, 229, 251, 90, 8, 4, 1, 198, 229, 251, 90, 8, 6, 1, 198, 229, 214, - 91, 8, 4, 1, 198, 229, 214, 91, 8, 6, 1, 198, 229, 200, 81, 8, 4, 1, 198, - 229, 200, 81, 8, 6, 1, 234, 72, 3, 214, 109, 101, 8, 4, 1, 234, 72, 3, - 214, 109, 101, 8, 6, 1, 224, 228, 3, 214, 109, 101, 8, 4, 1, 224, 228, 3, - 214, 109, 101, 8, 6, 1, 217, 226, 3, 214, 109, 101, 8, 4, 1, 217, 226, 3, - 214, 109, 101, 8, 6, 1, 210, 237, 3, 214, 109, 101, 8, 4, 1, 210, 237, 3, - 214, 109, 101, 8, 6, 1, 209, 36, 3, 214, 109, 101, 8, 4, 1, 209, 36, 3, - 214, 109, 101, 8, 6, 1, 232, 155, 3, 124, 8, 6, 1, 210, 40, 185, 70, 8, - 6, 1, 144, 234, 71, 8, 6, 1, 223, 1, 3, 248, 79, 8, 6, 1, 4, 6, 68, 8, 1, - 4, 6, 211, 116, 8, 6, 1, 200, 240, 224, 227, 8, 6, 1, 200, 240, 203, 185, - 8, 6, 1, 225, 109, 3, 240, 178, 8, 6, 1, 244, 195, 8, 6, 1, 248, 61, 8, - 4, 1, 248, 61, 8, 6, 1, 214, 53, 8, 4, 1, 214, 53, 8, 6, 1, 115, 3, 101, - 8, 4, 1, 115, 3, 101, 8, 236, 54, 1, 206, 53, 68, 71, 1, 6, 232, 155, 3, - 101, 71, 1, 4, 32, 214, 91, 8, 1, 4, 6, 200, 240, 221, 40, 8, 236, 54, 1, - 210, 40, 235, 184, 8, 236, 54, 1, 210, 40, 213, 195, 8, 236, 54, 1, 225, - 163, 221, 40, 8, 236, 54, 1, 230, 137, 221, 135, 8, 236, 54, 1, 250, 99, - 221, 40, 204, 10, 217, 146, 1, 63, 204, 10, 217, 146, 1, 68, 204, 10, - 217, 146, 2, 237, 41, 204, 10, 217, 146, 1, 66, 204, 10, 217, 146, 1, 70, - 204, 10, 217, 146, 1, 74, 204, 10, 217, 146, 2, 232, 52, 204, 10, 217, - 146, 1, 223, 165, 204, 10, 217, 146, 1, 224, 9, 204, 10, 217, 146, 1, - 233, 26, 204, 10, 217, 146, 1, 233, 84, 204, 10, 217, 146, 2, 250, 155, - 204, 10, 217, 146, 1, 244, 46, 204, 10, 217, 146, 1, 244, 169, 204, 10, - 217, 146, 1, 225, 20, 204, 10, 217, 146, 1, 225, 65, 204, 10, 217, 146, - 1, 201, 35, 204, 10, 217, 146, 1, 201, 41, 204, 10, 217, 146, 1, 239, - 134, 204, 10, 217, 146, 1, 239, 143, 204, 10, 217, 146, 1, 147, 204, 10, - 217, 146, 1, 202, 141, 204, 10, 217, 146, 1, 238, 154, 204, 10, 217, 146, - 1, 239, 24, 204, 10, 217, 146, 1, 215, 225, 204, 10, 217, 146, 1, 212, - 62, 204, 10, 217, 146, 1, 212, 177, 204, 10, 217, 146, 1, 247, 230, 204, - 10, 217, 146, 1, 248, 45, 204, 10, 217, 146, 1, 218, 160, 204, 10, 217, - 146, 1, 209, 185, 204, 10, 217, 146, 1, 221, 166, 204, 10, 217, 146, 1, - 209, 121, 204, 10, 217, 146, 1, 205, 162, 204, 10, 217, 146, 1, 231, 81, - 204, 10, 217, 146, 18, 2, 63, 204, 10, 217, 146, 18, 2, 68, 204, 10, 217, - 146, 18, 2, 66, 204, 10, 217, 146, 18, 2, 70, 204, 10, 217, 146, 18, 2, - 214, 33, 204, 10, 217, 146, 212, 57, 219, 189, 204, 10, 217, 146, 212, - 57, 219, 188, 204, 10, 217, 146, 212, 57, 219, 187, 204, 10, 217, 146, - 212, 57, 219, 186, 164, 225, 214, 234, 135, 106, 211, 36, 164, 225, 214, - 234, 135, 106, 232, 108, 164, 225, 214, 234, 135, 122, 211, 34, 164, 225, - 214, 234, 135, 106, 205, 234, 164, 225, 214, 234, 135, 106, 236, 156, - 164, 225, 214, 234, 135, 122, 205, 233, 164, 225, 214, 211, 37, 78, 164, - 225, 214, 212, 92, 78, 164, 225, 214, 209, 63, 78, 164, 225, 214, 211, - 38, 78, 212, 201, 1, 157, 212, 201, 1, 224, 38, 212, 201, 1, 234, 4, 212, - 201, 1, 216, 244, 212, 201, 1, 247, 36, 212, 201, 1, 246, 136, 212, 201, - 1, 225, 105, 212, 201, 1, 215, 34, 212, 201, 1, 203, 137, 212, 201, 1, - 202, 202, 212, 201, 1, 240, 3, 212, 201, 1, 179, 212, 201, 1, 163, 212, - 201, 1, 212, 205, 212, 201, 1, 248, 252, 212, 201, 1, 168, 212, 201, 1, - 201, 93, 212, 201, 1, 201, 83, 212, 201, 1, 237, 29, 212, 201, 1, 197, - 156, 212, 201, 1, 195, 74, 212, 201, 1, 195, 114, 212, 201, 1, 4, 63, - 212, 201, 1, 165, 212, 201, 1, 173, 212, 201, 1, 175, 212, 201, 1, 207, - 6, 212, 201, 1, 187, 212, 201, 1, 142, 212, 201, 1, 63, 212, 201, 1, 68, - 212, 201, 1, 66, 212, 201, 1, 70, 212, 201, 1, 74, 212, 201, 1, 211, 108, - 212, 201, 1, 196, 202, 212, 201, 1, 235, 118, 212, 201, 1, 233, 148, 212, - 201, 1, 236, 184, 212, 201, 204, 119, 1, 197, 156, 212, 201, 204, 119, 1, - 165, 212, 201, 1, 201, 58, 212, 201, 1, 201, 46, 212, 201, 1, 239, 164, - 212, 201, 1, 216, 5, 212, 201, 1, 250, 233, 165, 212, 201, 1, 198, 232, - 207, 6, 212, 201, 1, 198, 233, 142, 212, 201, 1, 250, 36, 235, 118, 212, - 201, 204, 119, 1, 173, 212, 201, 204, 65, 1, 173, 212, 201, 1, 246, 251, - 212, 201, 206, 19, 232, 23, 78, 212, 201, 54, 232, 23, 78, 212, 201, 113, - 206, 254, 212, 201, 113, 54, 206, 254, 208, 144, 2, 250, 155, 208, 144, - 2, 198, 247, 208, 144, 1, 63, 208, 144, 1, 252, 10, 208, 144, 1, 68, 208, - 144, 1, 226, 8, 208, 144, 1, 66, 208, 144, 1, 199, 229, 208, 144, 1, 111, - 143, 208, 144, 1, 111, 209, 136, 208, 144, 1, 111, 158, 208, 144, 1, 111, - 221, 196, 208, 144, 1, 70, 208, 144, 1, 236, 184, 208, 144, 1, 251, 45, - 208, 144, 1, 74, 208, 144, 1, 214, 33, 208, 144, 1, 250, 0, 208, 144, 1, - 157, 208, 144, 1, 224, 38, 208, 144, 1, 234, 4, 208, 144, 1, 233, 112, - 208, 144, 1, 216, 244, 208, 144, 1, 247, 36, 208, 144, 1, 246, 136, 208, - 144, 1, 225, 105, 208, 144, 1, 225, 71, 208, 144, 1, 215, 34, 208, 144, - 1, 201, 58, 208, 144, 1, 201, 46, 208, 144, 1, 239, 164, 208, 144, 1, - 239, 148, 208, 144, 1, 216, 5, 208, 144, 1, 203, 137, 208, 144, 1, 202, - 202, 208, 144, 1, 240, 3, 208, 144, 1, 239, 44, 208, 144, 1, 179, 208, - 144, 1, 163, 208, 144, 1, 212, 205, 208, 144, 1, 248, 252, 208, 144, 1, - 248, 53, 208, 144, 1, 168, 208, 144, 1, 165, 208, 144, 1, 173, 208, 144, - 1, 175, 208, 144, 1, 199, 137, 208, 144, 1, 207, 6, 208, 144, 1, 205, 43, - 208, 144, 1, 187, 208, 144, 1, 142, 208, 144, 1, 221, 195, 208, 144, 105, - 2, 232, 127, 208, 144, 18, 2, 252, 10, 208, 144, 18, 2, 68, 208, 144, 18, - 2, 226, 8, 208, 144, 18, 2, 66, 208, 144, 18, 2, 199, 229, 208, 144, 18, - 2, 111, 143, 208, 144, 18, 2, 111, 209, 136, 208, 144, 18, 2, 111, 158, - 208, 144, 18, 2, 111, 221, 196, 208, 144, 18, 2, 70, 208, 144, 18, 2, - 236, 184, 208, 144, 18, 2, 251, 45, 208, 144, 18, 2, 74, 208, 144, 18, 2, - 214, 33, 208, 144, 18, 2, 250, 0, 208, 144, 2, 198, 252, 208, 144, 2, - 246, 251, 208, 144, 239, 211, 208, 144, 54, 239, 211, 208, 144, 17, 195, - 79, 208, 144, 17, 98, 208, 144, 17, 103, 208, 144, 17, 135, 208, 144, 17, - 136, 208, 144, 17, 150, 208, 144, 17, 174, 208, 144, 17, 182, 208, 144, - 17, 178, 208, 144, 17, 184, 37, 97, 17, 195, 79, 37, 97, 17, 98, 37, 97, - 17, 103, 37, 97, 17, 135, 37, 97, 17, 136, 37, 97, 17, 150, 37, 97, 17, - 174, 37, 97, 17, 182, 37, 97, 17, 178, 37, 97, 17, 184, 37, 97, 1, 63, - 37, 97, 1, 66, 37, 97, 1, 157, 37, 97, 1, 179, 37, 97, 1, 163, 37, 97, 1, - 173, 37, 97, 1, 199, 23, 37, 97, 2, 249, 239, 97, 2, 205, 109, 246, 251, - 97, 2, 246, 252, 198, 252, 97, 2, 54, 246, 252, 198, 252, 97, 2, 246, - 252, 103, 97, 2, 246, 252, 135, 97, 2, 246, 252, 249, 239, 97, 2, 211, - 145, 97, 233, 224, 235, 14, 97, 246, 229, 97, 232, 15, 97, 2, 206, 57, - 97, 225, 97, 214, 56, 97, 1, 249, 229, 97, 18, 2, 249, 229, 224, 107, - 222, 12, 17, 195, 79, 224, 107, 222, 12, 17, 98, 224, 107, 222, 12, 17, - 103, 224, 107, 222, 12, 17, 135, 224, 107, 222, 12, 17, 136, 224, 107, - 222, 12, 17, 150, 224, 107, 222, 12, 17, 174, 224, 107, 222, 12, 17, 182, - 224, 107, 222, 12, 17, 178, 224, 107, 222, 12, 17, 184, 224, 107, 222, - 12, 1, 157, 224, 107, 222, 12, 1, 224, 38, 224, 107, 222, 12, 1, 234, 4, - 224, 107, 222, 12, 1, 216, 244, 224, 107, 222, 12, 1, 187, 224, 107, 222, - 12, 1, 207, 6, 224, 107, 222, 12, 1, 195, 114, 224, 107, 222, 12, 1, 215, - 34, 224, 107, 222, 12, 1, 203, 137, 224, 107, 222, 12, 1, 230, 223, 224, - 107, 222, 12, 1, 179, 224, 107, 222, 12, 1, 163, 224, 107, 222, 12, 1, - 212, 205, 224, 107, 222, 12, 1, 168, 224, 107, 222, 12, 1, 240, 3, 224, - 107, 222, 12, 1, 248, 252, 224, 107, 222, 12, 1, 173, 224, 107, 222, 12, - 1, 165, 224, 107, 222, 12, 1, 175, 224, 107, 222, 12, 1, 197, 156, 224, - 107, 222, 12, 1, 202, 202, 224, 107, 222, 12, 1, 142, 224, 107, 222, 12, - 1, 199, 137, 224, 107, 222, 12, 1, 247, 36, 224, 107, 222, 12, 1, 63, - 224, 107, 222, 12, 1, 214, 91, 224, 107, 222, 12, 1, 68, 224, 107, 222, - 12, 1, 214, 33, 224, 107, 222, 12, 18, 200, 81, 224, 107, 222, 12, 18, - 70, 224, 107, 222, 12, 18, 66, 224, 107, 222, 12, 18, 236, 184, 224, 107, - 222, 12, 18, 74, 224, 107, 222, 12, 154, 212, 78, 224, 107, 222, 12, 154, - 247, 11, 224, 107, 222, 12, 154, 247, 12, 212, 78, 224, 107, 222, 12, 2, - 240, 117, 224, 107, 222, 12, 2, 206, 77, 210, 89, 1, 157, 210, 89, 1, - 234, 4, 210, 89, 1, 216, 244, 210, 89, 1, 203, 137, 210, 89, 1, 240, 3, - 210, 89, 1, 179, 210, 89, 1, 163, 210, 89, 1, 248, 252, 210, 89, 1, 168, - 210, 89, 1, 247, 36, 210, 89, 1, 225, 105, 210, 89, 1, 215, 34, 210, 89, - 1, 187, 210, 89, 1, 173, 210, 89, 1, 175, 210, 89, 1, 165, 210, 89, 1, - 197, 156, 210, 89, 1, 142, 210, 89, 1, 219, 148, 210, 89, 1, 216, 223, - 210, 89, 1, 217, 75, 210, 89, 1, 215, 1, 210, 89, 1, 63, 210, 89, 18, 2, - 68, 210, 89, 18, 2, 66, 210, 89, 18, 2, 70, 210, 89, 18, 2, 251, 45, 210, - 89, 18, 2, 74, 210, 89, 18, 2, 250, 0, 210, 89, 18, 2, 235, 251, 210, 89, - 18, 2, 236, 212, 210, 89, 105, 2, 216, 246, 210, 89, 105, 2, 217, 225, - 210, 89, 105, 2, 143, 210, 89, 105, 2, 232, 154, 210, 89, 198, 252, 210, - 89, 208, 89, 78, 29, 134, 202, 65, 29, 134, 202, 64, 29, 134, 202, 62, - 29, 134, 202, 67, 29, 134, 210, 1, 29, 134, 209, 241, 29, 134, 209, 236, - 29, 134, 209, 238, 29, 134, 209, 254, 29, 134, 209, 247, 29, 134, 209, - 240, 29, 134, 210, 3, 29, 134, 209, 242, 29, 134, 210, 5, 29, 134, 210, - 2, 29, 134, 218, 217, 29, 134, 218, 208, 29, 134, 218, 211, 29, 134, 212, - 134, 29, 134, 212, 145, 29, 134, 212, 146, 29, 134, 205, 27, 29, 134, - 226, 21, 29, 134, 226, 28, 29, 134, 205, 38, 29, 134, 205, 25, 29, 134, - 212, 186, 29, 134, 231, 193, 29, 134, 205, 22, 225, 90, 2, 213, 108, 225, - 90, 2, 246, 173, 225, 90, 2, 222, 107, 225, 90, 2, 197, 49, 225, 90, 1, - 63, 225, 90, 1, 230, 137, 224, 111, 225, 90, 1, 68, 225, 90, 1, 226, 8, - 225, 90, 1, 66, 225, 90, 1, 213, 180, 246, 143, 225, 90, 1, 216, 245, - 222, 65, 225, 90, 1, 216, 245, 222, 66, 210, 148, 225, 90, 1, 70, 225, - 90, 1, 251, 45, 225, 90, 1, 74, 225, 90, 1, 157, 225, 90, 1, 224, 217, - 208, 157, 225, 90, 1, 224, 217, 218, 11, 225, 90, 1, 234, 4, 225, 90, 1, - 234, 5, 218, 11, 225, 90, 1, 216, 244, 225, 90, 1, 247, 36, 225, 90, 1, - 247, 37, 218, 11, 225, 90, 1, 225, 105, 225, 90, 1, 215, 35, 218, 11, - 225, 90, 1, 225, 106, 219, 245, 225, 90, 1, 215, 34, 225, 90, 1, 201, 58, - 225, 90, 1, 201, 59, 219, 245, 225, 90, 1, 239, 164, 225, 90, 1, 239, - 165, 219, 245, 225, 90, 1, 217, 171, 218, 11, 225, 90, 1, 203, 137, 225, - 90, 1, 203, 138, 218, 11, 225, 90, 1, 240, 3, 225, 90, 1, 240, 4, 219, - 245, 225, 90, 1, 179, 225, 90, 1, 163, 225, 90, 1, 213, 180, 218, 11, - 225, 90, 1, 248, 252, 225, 90, 1, 248, 253, 218, 11, 225, 90, 1, 168, - 225, 90, 1, 165, 225, 90, 1, 173, 225, 90, 1, 210, 201, 251, 55, 225, 90, - 1, 175, 225, 90, 1, 197, 156, 225, 90, 1, 208, 234, 218, 11, 225, 90, 1, - 208, 234, 219, 245, 225, 90, 1, 187, 225, 90, 1, 142, 225, 90, 2, 246, - 174, 202, 251, 225, 90, 18, 2, 203, 65, 225, 90, 18, 2, 201, 244, 225, - 90, 18, 2, 196, 231, 225, 90, 18, 2, 196, 232, 219, 84, 225, 90, 18, 2, - 204, 88, 225, 90, 18, 2, 204, 89, 219, 72, 225, 90, 18, 2, 203, 89, 225, - 90, 18, 2, 238, 206, 218, 10, 225, 90, 18, 2, 212, 247, 225, 90, 105, 2, - 224, 67, 225, 90, 105, 2, 213, 5, 225, 90, 105, 2, 247, 21, 225, 90, 213, - 121, 225, 90, 50, 210, 62, 225, 90, 52, 210, 62, 225, 90, 213, 169, 250, - 201, 225, 90, 213, 169, 220, 9, 225, 90, 213, 169, 221, 82, 225, 90, 213, - 169, 197, 42, 225, 90, 213, 169, 213, 122, 225, 90, 213, 169, 221, 225, - 225, 90, 213, 169, 221, 76, 225, 90, 213, 169, 251, 100, 225, 90, 213, - 169, 251, 101, 251, 100, 225, 90, 213, 169, 212, 103, 225, 90, 200, 240, - 213, 169, 212, 103, 225, 90, 213, 117, 225, 90, 17, 195, 79, 225, 90, 17, - 98, 225, 90, 17, 103, 225, 90, 17, 135, 225, 90, 17, 136, 225, 90, 17, - 150, 225, 90, 17, 174, 225, 90, 17, 182, 225, 90, 17, 178, 225, 90, 17, - 184, 225, 90, 213, 169, 202, 31, 200, 255, 225, 90, 213, 169, 225, 135, - 75, 1, 206, 237, 233, 112, 75, 1, 206, 237, 246, 136, 75, 1, 206, 237, - 225, 71, 75, 1, 206, 237, 216, 5, 75, 1, 206, 237, 248, 53, 75, 2, 206, - 237, 208, 141, 75, 71, 1, 206, 237, 210, 106, 75, 1, 49, 222, 210, 215, - 34, 75, 1, 49, 222, 210, 235, 118, 75, 1, 49, 222, 210, 234, 4, 75, 1, - 49, 222, 210, 233, 112, 75, 1, 49, 222, 210, 225, 105, 75, 1, 49, 222, - 210, 225, 71, 75, 1, 49, 222, 210, 239, 164, 75, 1, 49, 222, 210, 239, - 148, 75, 1, 49, 222, 210, 216, 5, 75, 49, 222, 210, 17, 195, 79, 75, 49, - 222, 210, 17, 98, 75, 49, 222, 210, 17, 103, 75, 49, 222, 210, 17, 135, - 75, 49, 222, 210, 17, 136, 75, 49, 222, 210, 17, 150, 75, 49, 222, 210, - 17, 174, 75, 49, 222, 210, 17, 182, 75, 49, 222, 210, 17, 178, 75, 49, - 222, 210, 17, 184, 75, 1, 49, 222, 210, 221, 195, 75, 1, 49, 222, 210, - 240, 3, 75, 1, 49, 222, 210, 239, 44, 75, 1, 49, 222, 210, 248, 252, 75, - 1, 49, 222, 210, 248, 53, 246, 129, 1, 63, 246, 129, 1, 68, 246, 129, 1, - 66, 246, 129, 1, 70, 246, 129, 1, 251, 45, 246, 129, 1, 74, 246, 129, 1, - 157, 246, 129, 1, 224, 38, 246, 129, 1, 234, 4, 246, 129, 1, 233, 112, - 246, 129, 1, 216, 153, 246, 129, 1, 216, 244, 246, 129, 1, 246, 136, 246, - 129, 1, 244, 197, 246, 129, 1, 225, 105, 246, 129, 1, 225, 71, 246, 129, - 1, 216, 143, 246, 129, 1, 216, 145, 246, 129, 1, 216, 144, 246, 129, 1, - 203, 137, 246, 129, 1, 202, 202, 246, 129, 1, 240, 3, 246, 129, 1, 239, - 44, 246, 129, 1, 215, 77, 246, 129, 1, 179, 246, 129, 1, 239, 164, 246, - 129, 1, 163, 246, 129, 1, 212, 1, 246, 129, 1, 212, 205, 246, 129, 1, - 248, 252, 246, 129, 1, 248, 53, 246, 129, 1, 218, 44, 246, 129, 1, 168, - 246, 129, 1, 248, 155, 246, 129, 1, 165, 246, 129, 1, 173, 246, 129, 1, - 175, 246, 129, 1, 199, 137, 246, 129, 1, 205, 43, 246, 129, 1, 187, 246, - 129, 1, 142, 246, 129, 18, 2, 252, 10, 246, 129, 18, 2, 68, 246, 129, 18, - 2, 226, 8, 246, 129, 18, 2, 236, 163, 246, 129, 18, 2, 66, 246, 129, 18, - 2, 214, 91, 246, 129, 18, 2, 74, 246, 129, 18, 2, 251, 45, 246, 129, 18, - 2, 250, 0, 246, 129, 18, 2, 200, 81, 246, 129, 105, 2, 165, 246, 129, - 105, 2, 173, 246, 129, 105, 2, 175, 246, 129, 105, 2, 197, 156, 246, 129, - 1, 48, 224, 227, 246, 129, 1, 48, 234, 71, 246, 129, 1, 48, 216, 246, - 246, 129, 105, 2, 48, 216, 246, 246, 129, 1, 48, 246, 138, 246, 129, 1, - 48, 203, 185, 246, 129, 1, 48, 217, 225, 246, 129, 1, 48, 213, 195, 246, - 129, 1, 48, 196, 143, 246, 129, 1, 48, 143, 246, 129, 1, 48, 158, 246, - 129, 1, 48, 205, 46, 246, 129, 105, 2, 48, 221, 40, 246, 129, 105, 2, 48, - 232, 154, 246, 129, 17, 195, 79, 246, 129, 17, 98, 246, 129, 17, 103, - 246, 129, 17, 135, 246, 129, 17, 136, 246, 129, 17, 150, 246, 129, 17, - 174, 246, 129, 17, 182, 246, 129, 17, 178, 246, 129, 17, 184, 246, 129, - 211, 163, 205, 83, 246, 129, 211, 163, 239, 211, 246, 129, 211, 163, 54, - 239, 211, 246, 129, 211, 163, 201, 145, 239, 211, 75, 1, 224, 31, 234, 4, - 75, 1, 224, 31, 247, 36, 75, 1, 224, 31, 246, 136, 75, 1, 224, 31, 225, - 105, 75, 1, 224, 31, 225, 71, 75, 1, 224, 31, 215, 34, 75, 1, 224, 31, - 201, 58, 75, 1, 224, 31, 201, 46, 75, 1, 224, 31, 239, 164, 75, 1, 224, - 31, 239, 148, 75, 1, 224, 31, 239, 44, 75, 1, 224, 31, 179, 75, 1, 224, - 31, 187, 75, 1, 224, 31, 142, 75, 1, 224, 31, 231, 223, 75, 1, 224, 31, - 235, 118, 75, 71, 1, 224, 31, 210, 106, 75, 1, 224, 31, 196, 202, 75, 1, - 224, 31, 195, 114, 75, 1, 224, 31, 173, 75, 221, 152, 224, 31, 214, 114, - 75, 221, 152, 224, 31, 211, 59, 75, 221, 152, 224, 31, 231, 136, 75, 16, - 251, 32, 235, 224, 75, 16, 251, 32, 98, 75, 16, 251, 32, 103, 75, 1, 251, - 32, 173, 75, 2, 213, 104, 224, 140, 201, 239, 75, 2, 49, 222, 210, 201, - 237, 75, 2, 49, 222, 210, 201, 234, 75, 1, 206, 85, 213, 149, 246, 136, - 75, 1, 206, 85, 213, 149, 207, 6, 49, 199, 13, 1, 125, 223, 165, 49, 199, - 13, 1, 128, 223, 165, 49, 199, 13, 1, 125, 224, 9, 49, 199, 13, 1, 128, - 224, 9, 49, 199, 13, 1, 125, 224, 18, 49, 199, 13, 1, 128, 224, 18, 49, - 199, 13, 1, 125, 233, 26, 49, 199, 13, 1, 128, 233, 26, 49, 199, 13, 1, - 125, 216, 169, 49, 199, 13, 1, 128, 216, 169, 49, 199, 13, 1, 125, 244, - 46, 49, 199, 13, 1, 128, 244, 46, 49, 199, 13, 1, 125, 244, 169, 49, 199, - 13, 1, 128, 244, 169, 49, 199, 13, 1, 125, 205, 162, 49, 199, 13, 1, 128, - 205, 162, 49, 199, 13, 1, 125, 215, 0, 49, 199, 13, 1, 128, 215, 0, 49, - 199, 13, 1, 125, 238, 154, 49, 199, 13, 1, 128, 238, 154, 49, 199, 13, 1, - 125, 147, 49, 199, 13, 1, 128, 147, 49, 199, 13, 1, 125, 202, 141, 49, - 199, 13, 1, 128, 202, 141, 49, 199, 13, 1, 125, 215, 225, 49, 199, 13, 1, - 128, 215, 225, 49, 199, 13, 1, 125, 247, 230, 49, 199, 13, 1, 128, 247, - 230, 49, 199, 13, 1, 125, 212, 62, 49, 199, 13, 1, 128, 212, 62, 49, 199, - 13, 1, 125, 212, 177, 49, 199, 13, 1, 128, 212, 177, 49, 199, 13, 1, 125, - 234, 188, 49, 199, 13, 1, 128, 234, 188, 49, 199, 13, 1, 125, 218, 160, - 49, 199, 13, 1, 128, 218, 160, 49, 199, 13, 1, 125, 196, 0, 49, 199, 13, - 1, 128, 196, 0, 49, 199, 13, 1, 125, 209, 185, 49, 199, 13, 1, 128, 209, - 185, 49, 199, 13, 1, 125, 221, 166, 49, 199, 13, 1, 128, 221, 166, 49, - 199, 13, 1, 125, 198, 237, 49, 199, 13, 1, 128, 198, 237, 49, 199, 13, 1, - 125, 231, 81, 49, 199, 13, 1, 128, 231, 81, 49, 199, 13, 1, 125, 74, 49, - 199, 13, 1, 128, 74, 49, 199, 13, 219, 242, 224, 161, 49, 199, 13, 18, - 252, 10, 49, 199, 13, 18, 68, 49, 199, 13, 18, 200, 81, 49, 199, 13, 18, - 66, 49, 199, 13, 18, 70, 49, 199, 13, 18, 74, 49, 199, 13, 219, 242, 224, - 12, 49, 199, 13, 18, 230, 98, 49, 199, 13, 18, 200, 80, 49, 199, 13, 18, - 200, 96, 49, 199, 13, 18, 249, 254, 49, 199, 13, 18, 249, 229, 49, 199, - 13, 18, 250, 208, 49, 199, 13, 18, 250, 225, 49, 199, 13, 154, 219, 242, - 236, 145, 49, 199, 13, 154, 219, 242, 215, 76, 49, 199, 13, 154, 219, - 242, 202, 141, 49, 199, 13, 154, 219, 242, 205, 135, 49, 199, 13, 16, - 223, 144, 49, 199, 13, 16, 215, 76, 49, 199, 13, 16, 208, 184, 49, 199, - 13, 16, 231, 82, 231, 68, 49, 199, 13, 16, 223, 154, 223, 153, 219, 91, - 219, 155, 1, 70, 219, 91, 219, 155, 1, 74, 219, 91, 219, 155, 1, 246, - 136, 219, 91, 219, 155, 1, 215, 34, 219, 91, 219, 155, 1, 201, 58, 219, - 91, 219, 155, 1, 201, 46, 219, 91, 219, 155, 1, 239, 164, 219, 91, 219, - 155, 1, 239, 148, 219, 91, 219, 155, 1, 216, 5, 219, 91, 219, 155, 1, - 207, 6, 219, 91, 219, 155, 1, 205, 43, 219, 91, 219, 155, 18, 2, 226, 8, - 219, 91, 219, 155, 18, 2, 199, 229, 219, 91, 219, 155, 18, 2, 251, 230, - 219, 91, 219, 155, 18, 2, 250, 0, 219, 91, 219, 155, 18, 2, 251, 223, - 219, 91, 219, 155, 244, 212, 219, 91, 219, 155, 251, 51, 224, 0, 219, 91, - 219, 155, 250, 184, 219, 91, 219, 155, 5, 210, 68, 78, 219, 91, 219, 155, - 197, 3, 210, 68, 78, 219, 91, 219, 155, 18, 2, 198, 247, 219, 91, 219, - 155, 198, 252, 34, 5, 201, 39, 34, 5, 201, 42, 34, 5, 201, 45, 34, 5, - 201, 43, 34, 5, 201, 44, 34, 5, 201, 41, 34, 5, 239, 142, 34, 5, 239, - 144, 34, 5, 239, 147, 34, 5, 239, 145, 34, 5, 239, 146, 34, 5, 239, 143, - 34, 5, 237, 16, 34, 5, 237, 20, 34, 5, 237, 28, 34, 5, 237, 25, 34, 5, - 237, 26, 34, 5, 237, 17, 34, 5, 246, 190, 34, 5, 246, 184, 34, 5, 246, - 186, 34, 5, 246, 189, 34, 5, 246, 187, 34, 5, 246, 188, 34, 5, 246, 185, - 34, 5, 248, 155, 34, 5, 248, 134, 34, 5, 248, 146, 34, 5, 248, 154, 34, - 5, 248, 149, 34, 5, 248, 150, 34, 5, 248, 138, 8, 4, 1, 248, 184, 250, - 236, 8, 4, 1, 39, 210, 38, 8, 4, 1, 247, 246, 70, 8, 4, 1, 248, 184, 70, - 8, 4, 1, 237, 10, 3, 234, 201, 8, 4, 1, 222, 51, 235, 184, 8, 4, 1, 144, - 234, 72, 3, 240, 178, 8, 4, 1, 223, 1, 3, 225, 163, 222, 106, 209, 35, 8, - 4, 1, 223, 1, 3, 54, 108, 202, 56, 8, 4, 1, 223, 1, 3, 108, 209, 210, 8, - 4, 1, 221, 41, 3, 240, 178, 8, 4, 1, 217, 226, 3, 240, 178, 8, 4, 1, 236, - 93, 3, 240, 178, 8, 4, 1, 247, 246, 74, 8, 4, 1, 247, 246, 169, 3, 101, - 8, 4, 1, 185, 169, 3, 101, 8, 4, 1, 225, 163, 214, 91, 8, 4, 1, 200, 240, - 214, 92, 3, 101, 8, 4, 1, 200, 240, 214, 92, 3, 231, 43, 101, 8, 4, 1, - 200, 240, 169, 214, 19, 8, 4, 1, 200, 240, 169, 214, 20, 3, 101, 8, 4, 1, - 204, 198, 143, 8, 1, 4, 6, 210, 237, 3, 52, 222, 74, 8, 4, 1, 210, 237, - 197, 31, 232, 72, 8, 4, 1, 54, 143, 8, 4, 1, 210, 237, 3, 240, 178, 8, 4, - 1, 54, 210, 237, 3, 240, 178, 8, 4, 1, 144, 143, 8, 4, 1, 144, 210, 237, - 3, 209, 210, 8, 4, 1, 248, 174, 236, 20, 8, 4, 1, 115, 3, 206, 139, 52, - 222, 74, 8, 4, 1, 115, 248, 190, 3, 206, 139, 52, 222, 74, 8, 4, 1, 200, - 73, 8, 4, 1, 200, 240, 200, 73, 8, 4, 1, 115, 3, 50, 124, 8, 4, 1, 244, - 195, 8, 4, 1, 244, 196, 3, 125, 52, 209, 210, 8, 4, 1, 244, 196, 3, 125, - 50, 207, 41, 8, 4, 1, 196, 217, 3, 125, 52, 209, 210, 8, 4, 1, 196, 217, - 3, 172, 50, 222, 74, 8, 4, 1, 196, 217, 3, 172, 50, 222, 75, 26, 125, 52, - 209, 210, 8, 4, 1, 196, 217, 3, 172, 50, 222, 75, 3, 207, 41, 8, 4, 1, - 196, 144, 3, 206, 139, 52, 222, 74, 71, 247, 162, 3, 225, 163, 247, 161, - 71, 1, 4, 231, 242, 71, 1, 4, 223, 1, 3, 225, 163, 222, 106, 209, 35, 71, - 1, 4, 223, 1, 3, 108, 202, 56, 71, 1, 4, 115, 3, 50, 124, 8, 4, 1, 208, - 201, 196, 79, 8, 4, 1, 225, 152, 70, 8, 4, 1, 185, 214, 91, 8, 4, 1, 200, - 24, 8, 4, 1, 225, 163, 250, 236, 31, 1, 4, 6, 214, 53, 94, 4, 1, 63, 94, - 4, 1, 70, 94, 4, 1, 68, 94, 4, 1, 74, 94, 4, 1, 66, 94, 4, 1, 199, 215, - 94, 4, 1, 234, 4, 94, 4, 1, 157, 94, 4, 1, 233, 186, 94, 4, 1, 233, 74, - 94, 4, 1, 233, 26, 94, 4, 1, 232, 214, 94, 4, 1, 232, 175, 94, 4, 1, 142, - 94, 4, 1, 232, 32, 94, 4, 1, 231, 214, 94, 4, 1, 231, 81, 94, 4, 1, 230, - 219, 94, 4, 1, 230, 188, 94, 4, 1, 175, 94, 4, 1, 222, 99, 94, 4, 1, 222, - 11, 94, 4, 1, 221, 166, 94, 4, 1, 221, 95, 94, 4, 1, 221, 64, 94, 4, 1, - 168, 94, 4, 1, 219, 114, 94, 4, 1, 218, 243, 94, 4, 1, 218, 160, 94, 4, - 1, 218, 56, 94, 4, 1, 179, 94, 4, 1, 231, 105, 94, 4, 1, 217, 145, 94, 4, - 1, 217, 34, 94, 4, 1, 216, 141, 94, 4, 1, 215, 225, 94, 4, 1, 215, 111, - 94, 4, 1, 215, 45, 94, 4, 1, 211, 45, 94, 4, 1, 211, 31, 94, 4, 1, 211, - 24, 94, 4, 1, 211, 14, 94, 4, 1, 211, 3, 94, 4, 1, 211, 1, 94, 4, 1, 187, - 94, 4, 1, 209, 35, 94, 4, 1, 208, 103, 94, 4, 1, 206, 69, 94, 4, 1, 205, - 162, 94, 4, 1, 204, 139, 94, 4, 1, 204, 39, 94, 4, 1, 240, 3, 94, 4, 1, - 203, 137, 94, 4, 1, 239, 119, 94, 4, 1, 203, 36, 94, 4, 1, 239, 20, 94, - 4, 1, 202, 94, 94, 4, 1, 238, 154, 94, 4, 1, 237, 74, 94, 4, 1, 237, 43, - 94, 4, 1, 238, 166, 94, 4, 1, 202, 19, 94, 4, 1, 202, 18, 94, 4, 1, 202, - 7, 94, 4, 1, 202, 6, 94, 4, 1, 202, 5, 94, 4, 1, 202, 4, 94, 4, 1, 201, - 93, 94, 4, 1, 201, 87, 94, 4, 1, 201, 72, 94, 4, 1, 201, 70, 94, 4, 1, - 201, 66, 94, 4, 1, 201, 65, 94, 4, 1, 197, 156, 94, 4, 1, 197, 101, 94, - 4, 1, 197, 64, 94, 4, 1, 197, 28, 94, 4, 1, 196, 237, 94, 4, 1, 196, 224, - 94, 4, 1, 165, 219, 91, 219, 155, 1, 223, 151, 219, 91, 219, 155, 1, 208, - 184, 219, 91, 219, 155, 1, 222, 211, 219, 91, 219, 155, 1, 218, 171, 219, - 91, 219, 155, 1, 163, 219, 91, 219, 155, 1, 179, 219, 91, 219, 155, 1, - 244, 187, 219, 91, 219, 155, 1, 202, 58, 219, 91, 219, 155, 1, 224, 3, - 219, 91, 219, 155, 1, 216, 159, 219, 91, 219, 155, 1, 202, 133, 219, 91, - 219, 155, 1, 197, 145, 219, 91, 219, 155, 1, 196, 90, 219, 91, 219, 155, - 1, 230, 208, 219, 91, 219, 155, 1, 200, 55, 219, 91, 219, 155, 1, 68, - 219, 91, 219, 155, 1, 212, 199, 219, 91, 219, 155, 1, 250, 11, 219, 91, - 219, 155, 1, 233, 18, 219, 91, 219, 155, 1, 225, 69, 219, 91, 219, 155, - 1, 210, 173, 219, 91, 219, 155, 1, 248, 252, 219, 91, 219, 155, 1, 225, - 53, 219, 91, 219, 155, 1, 238, 233, 219, 91, 219, 155, 1, 233, 81, 219, - 91, 219, 155, 1, 239, 22, 219, 91, 219, 155, 1, 248, 51, 219, 91, 219, - 155, 1, 223, 152, 221, 134, 219, 91, 219, 155, 1, 222, 212, 221, 134, - 219, 91, 219, 155, 1, 218, 172, 221, 134, 219, 91, 219, 155, 1, 213, 180, - 221, 134, 219, 91, 219, 155, 1, 217, 171, 221, 134, 219, 91, 219, 155, 1, - 202, 59, 221, 134, 219, 91, 219, 155, 1, 216, 160, 221, 134, 219, 91, - 219, 155, 1, 230, 137, 221, 134, 219, 91, 219, 155, 18, 2, 214, 46, 219, - 91, 219, 155, 18, 2, 225, 228, 219, 91, 219, 155, 18, 2, 250, 206, 219, - 91, 219, 155, 18, 2, 196, 54, 219, 91, 219, 155, 18, 2, 205, 125, 219, - 91, 219, 155, 18, 2, 200, 52, 219, 91, 219, 155, 18, 2, 244, 210, 219, - 91, 219, 155, 18, 2, 215, 60, 219, 91, 219, 155, 244, 211, 219, 91, 219, - 155, 221, 79, 225, 114, 219, 91, 219, 155, 250, 123, 225, 114, 219, 91, - 219, 155, 17, 195, 79, 219, 91, 219, 155, 17, 98, 219, 91, 219, 155, 17, - 103, 219, 91, 219, 155, 17, 135, 219, 91, 219, 155, 17, 136, 219, 91, - 219, 155, 17, 150, 219, 91, 219, 155, 17, 174, 219, 91, 219, 155, 17, - 182, 219, 91, 219, 155, 17, 178, 219, 91, 219, 155, 17, 184, 29, 224, - 249, 214, 194, 29, 224, 249, 214, 199, 29, 224, 249, 195, 249, 29, 224, - 249, 195, 248, 29, 224, 249, 195, 247, 29, 224, 249, 200, 146, 29, 224, - 249, 200, 150, 29, 224, 249, 195, 209, 29, 224, 249, 195, 205, 29, 224, - 249, 235, 250, 29, 224, 249, 235, 248, 29, 224, 249, 235, 249, 29, 224, - 249, 235, 246, 29, 224, 249, 230, 123, 29, 224, 249, 230, 122, 29, 224, - 249, 230, 120, 29, 224, 249, 230, 121, 29, 224, 249, 230, 126, 29, 224, - 249, 230, 119, 29, 224, 249, 230, 118, 29, 224, 249, 230, 128, 29, 224, - 249, 250, 109, 29, 224, 249, 250, 108, 29, 112, 216, 119, 29, 112, 216, - 125, 29, 112, 205, 24, 29, 112, 205, 23, 29, 112, 202, 64, 29, 112, 202, - 62, 29, 112, 202, 61, 29, 112, 202, 67, 29, 112, 202, 68, 29, 112, 202, - 60, 29, 112, 209, 241, 29, 112, 210, 0, 29, 112, 205, 30, 29, 112, 209, - 253, 29, 112, 209, 243, 29, 112, 209, 245, 29, 112, 209, 232, 29, 112, - 209, 233, 29, 112, 224, 146, 29, 112, 218, 216, 29, 112, 218, 210, 29, - 112, 205, 34, 29, 112, 218, 213, 29, 112, 218, 219, 29, 112, 212, 130, - 29, 112, 212, 139, 29, 112, 212, 143, 29, 112, 205, 32, 29, 112, 212, - 133, 29, 112, 212, 147, 29, 112, 212, 148, 29, 112, 206, 1, 29, 112, 206, - 4, 29, 112, 205, 28, 29, 112, 205, 26, 29, 112, 205, 255, 29, 112, 206, - 7, 29, 112, 206, 8, 29, 112, 205, 249, 29, 112, 206, 6, 29, 112, 213, - 111, 29, 112, 213, 112, 29, 112, 196, 38, 29, 112, 196, 41, 29, 112, 244, - 124, 29, 112, 244, 123, 29, 112, 205, 39, 29, 112, 212, 184, 29, 112, - 212, 183, 12, 15, 227, 255, 12, 15, 227, 254, 12, 15, 227, 253, 12, 15, + 0, 205, 148, 236, 89, 78, 211, 61, 78, 31, 55, 239, 9, 55, 213, 44, 55, + 251, 110, 251, 29, 50, 213, 139, 53, 213, 139, 250, 178, 98, 55, 244, + 158, 231, 5, 234, 216, 204, 226, 205, 177, 17, 195, 79, 17, 100, 17, 102, + 17, 134, 17, 136, 17, 146, 17, 167, 17, 178, 17, 171, 17, 182, 244, 167, + 207, 105, 222, 139, 55, 236, 171, 55, 233, 93, 55, 211, 78, 78, 244, 156, + 250, 167, 8, 6, 1, 63, 8, 6, 1, 250, 111, 8, 6, 1, 247, 206, 8, 6, 1, + 240, 230, 8, 6, 1, 69, 8, 6, 1, 236, 48, 8, 6, 1, 234, 189, 8, 6, 1, 233, + 14, 8, 6, 1, 68, 8, 6, 1, 225, 216, 8, 6, 1, 225, 79, 8, 6, 1, 159, 8, 6, + 1, 221, 135, 8, 6, 1, 218, 54, 8, 6, 1, 72, 8, 6, 1, 214, 2, 8, 6, 1, + 211, 166, 8, 6, 1, 144, 8, 6, 1, 209, 80, 8, 6, 1, 203, 216, 8, 6, 1, 66, + 8, 6, 1, 199, 230, 8, 6, 1, 197, 199, 8, 6, 1, 196, 222, 8, 6, 1, 196, + 148, 8, 6, 1, 195, 158, 50, 47, 179, 210, 90, 205, 177, 53, 47, 179, 244, + 240, 252, 21, 126, 222, 74, 233, 100, 252, 21, 8, 4, 1, 63, 8, 4, 1, 250, + 111, 8, 4, 1, 247, 206, 8, 4, 1, 240, 230, 8, 4, 1, 69, 8, 4, 1, 236, 48, + 8, 4, 1, 234, 189, 8, 4, 1, 233, 14, 8, 4, 1, 68, 8, 4, 1, 225, 216, 8, + 4, 1, 225, 79, 8, 4, 1, 159, 8, 4, 1, 221, 135, 8, 4, 1, 218, 54, 8, 4, + 1, 72, 8, 4, 1, 214, 2, 8, 4, 1, 211, 166, 8, 4, 1, 144, 8, 4, 1, 209, + 80, 8, 4, 1, 203, 216, 8, 4, 1, 66, 8, 4, 1, 199, 230, 8, 4, 1, 197, 199, + 8, 4, 1, 196, 222, 8, 4, 1, 196, 148, 8, 4, 1, 195, 158, 50, 241, 17, + 179, 83, 222, 74, 53, 241, 17, 179, 202, 84, 216, 43, 205, 148, 226, 16, + 236, 89, 78, 247, 38, 55, 212, 62, 55, 241, 16, 55, 196, 60, 55, 248, 32, + 154, 208, 133, 55, 239, 149, 241, 104, 55, 235, 169, 214, 66, 226, 67, + 222, 178, 52, 251, 90, 211, 61, 78, 216, 18, 55, 205, 186, 231, 6, 210, + 148, 55, 220, 113, 239, 230, 55, 212, 123, 55, 204, 95, 102, 204, 95, + 134, 252, 9, 252, 21, 219, 68, 55, 212, 178, 55, 112, 238, 252, 247, 49, + 204, 95, 100, 220, 12, 214, 66, 226, 67, 210, 17, 52, 251, 90, 211, 61, + 78, 197, 217, 191, 97, 211, 86, 197, 217, 191, 97, 232, 224, 197, 217, + 191, 115, 211, 84, 226, 16, 211, 78, 78, 8, 6, 1, 39, 3, 233, 99, 8, 6, + 1, 39, 3, 186, 8, 6, 1, 39, 3, 244, 239, 8, 6, 1, 39, 3, 202, 84, 8, 6, + 1, 39, 3, 239, 149, 8, 6, 1, 39, 3, 210, 3, 57, 8, 6, 1, 251, 244, 8, 6, + 1, 247, 207, 3, 247, 49, 8, 6, 1, 237, 135, 3, 233, 99, 8, 6, 1, 237, + 135, 3, 186, 8, 6, 1, 237, 135, 3, 244, 239, 8, 6, 1, 237, 135, 3, 239, + 149, 8, 6, 1, 230, 248, 3, 233, 99, 8, 6, 1, 230, 248, 3, 186, 8, 6, 1, + 230, 248, 3, 244, 239, 8, 6, 1, 230, 248, 3, 239, 149, 8, 6, 1, 236, 120, + 8, 6, 1, 218, 55, 3, 202, 84, 8, 6, 1, 177, 3, 233, 99, 8, 6, 1, 177, 3, + 186, 8, 6, 1, 177, 3, 244, 239, 8, 6, 1, 177, 3, 202, 84, 8, 6, 1, 177, + 3, 239, 149, 218, 117, 55, 8, 6, 1, 177, 3, 106, 8, 6, 1, 118, 3, 233, + 99, 8, 6, 1, 118, 3, 186, 8, 6, 1, 118, 3, 244, 239, 8, 6, 1, 118, 3, + 239, 149, 8, 6, 1, 196, 149, 3, 186, 8, 6, 1, 202, 162, 8, 4, 1, 207, 13, + 209, 80, 8, 4, 1, 39, 3, 233, 99, 8, 4, 1, 39, 3, 186, 8, 4, 1, 39, 3, + 244, 239, 8, 4, 1, 39, 3, 202, 84, 8, 4, 1, 39, 3, 239, 149, 8, 4, 1, 39, + 3, 210, 3, 57, 8, 4, 1, 251, 244, 8, 4, 1, 247, 207, 3, 247, 49, 8, 4, 1, + 237, 135, 3, 233, 99, 8, 4, 1, 237, 135, 3, 186, 8, 4, 1, 237, 135, 3, + 244, 239, 8, 4, 1, 237, 135, 3, 239, 149, 8, 4, 1, 230, 248, 3, 233, 99, + 8, 4, 1, 230, 248, 3, 186, 8, 4, 1, 230, 248, 3, 244, 239, 8, 4, 1, 230, + 248, 3, 239, 149, 8, 4, 1, 236, 120, 8, 4, 1, 218, 55, 3, 202, 84, 8, 4, + 1, 177, 3, 233, 99, 8, 4, 1, 177, 3, 186, 8, 4, 1, 177, 3, 244, 239, 8, + 4, 1, 177, 3, 202, 84, 8, 4, 1, 177, 3, 239, 149, 239, 53, 55, 8, 4, 1, + 177, 3, 106, 8, 4, 1, 118, 3, 233, 99, 8, 4, 1, 118, 3, 186, 8, 4, 1, + 118, 3, 244, 239, 8, 4, 1, 118, 3, 239, 149, 8, 4, 1, 196, 149, 3, 186, + 8, 4, 1, 202, 162, 8, 4, 1, 196, 149, 3, 239, 149, 8, 6, 1, 39, 3, 220, + 113, 8, 4, 1, 39, 3, 220, 113, 8, 6, 1, 39, 3, 248, 46, 8, 4, 1, 39, 3, + 248, 46, 8, 6, 1, 39, 3, 214, 150, 8, 4, 1, 39, 3, 214, 150, 8, 6, 1, + 247, 207, 3, 186, 8, 4, 1, 247, 207, 3, 186, 8, 6, 1, 247, 207, 3, 244, + 239, 8, 4, 1, 247, 207, 3, 244, 239, 8, 6, 1, 247, 207, 3, 76, 57, 8, 4, + 1, 247, 207, 3, 76, 57, 8, 6, 1, 247, 207, 3, 247, 105, 8, 4, 1, 247, + 207, 3, 247, 105, 8, 6, 1, 240, 231, 3, 247, 105, 8, 4, 1, 240, 231, 3, + 247, 105, 8, 6, 1, 240, 231, 3, 106, 8, 4, 1, 240, 231, 3, 106, 8, 6, 1, + 237, 135, 3, 220, 113, 8, 4, 1, 237, 135, 3, 220, 113, 8, 6, 1, 237, 135, + 3, 248, 46, 8, 4, 1, 237, 135, 3, 248, 46, 8, 6, 1, 237, 135, 3, 76, 57, + 8, 4, 1, 237, 135, 3, 76, 57, 8, 6, 1, 237, 135, 3, 214, 150, 8, 4, 1, + 237, 135, 3, 214, 150, 8, 6, 1, 237, 135, 3, 247, 105, 8, 4, 1, 237, 135, + 3, 247, 105, 8, 6, 1, 234, 190, 3, 244, 239, 8, 4, 1, 234, 190, 3, 244, + 239, 8, 6, 1, 234, 190, 3, 248, 46, 8, 4, 1, 234, 190, 3, 248, 46, 8, 6, + 1, 234, 190, 3, 76, 57, 8, 4, 1, 234, 190, 3, 76, 57, 8, 6, 1, 234, 190, + 3, 247, 49, 8, 4, 1, 234, 190, 3, 247, 49, 8, 6, 1, 233, 15, 3, 244, 239, + 8, 4, 1, 233, 15, 3, 244, 239, 8, 6, 1, 233, 15, 3, 106, 8, 4, 1, 233, + 15, 3, 106, 8, 6, 1, 230, 248, 3, 202, 84, 8, 4, 1, 230, 248, 3, 202, 84, + 8, 6, 1, 230, 248, 3, 220, 113, 8, 4, 1, 230, 248, 3, 220, 113, 8, 6, 1, + 230, 248, 3, 248, 46, 8, 4, 1, 230, 248, 3, 248, 46, 8, 6, 1, 230, 248, + 3, 214, 150, 8, 4, 1, 230, 248, 3, 214, 150, 8, 6, 1, 230, 248, 3, 76, + 57, 8, 4, 1, 238, 251, 68, 8, 6, 33, 226, 117, 8, 4, 33, 226, 117, 8, 6, + 1, 225, 217, 3, 244, 239, 8, 4, 1, 225, 217, 3, 244, 239, 8, 6, 1, 225, + 80, 3, 247, 49, 8, 4, 1, 225, 80, 3, 247, 49, 8, 4, 1, 223, 209, 8, 6, 1, + 223, 99, 3, 186, 8, 4, 1, 223, 99, 3, 186, 8, 6, 1, 223, 99, 3, 247, 49, + 8, 4, 1, 223, 99, 3, 247, 49, 8, 6, 1, 223, 99, 3, 247, 105, 8, 4, 1, + 223, 99, 3, 247, 105, 8, 6, 1, 223, 99, 3, 112, 238, 252, 8, 4, 1, 223, + 99, 3, 112, 238, 252, 8, 6, 1, 223, 99, 3, 106, 8, 4, 1, 223, 99, 3, 106, + 8, 6, 1, 218, 55, 3, 186, 8, 4, 1, 218, 55, 3, 186, 8, 6, 1, 218, 55, 3, + 247, 49, 8, 4, 1, 218, 55, 3, 247, 49, 8, 6, 1, 218, 55, 3, 247, 105, 8, + 4, 1, 218, 55, 3, 247, 105, 8, 4, 1, 218, 55, 212, 36, 247, 218, 251, 29, + 8, 6, 1, 236, 214, 8, 4, 1, 236, 214, 8, 6, 1, 177, 3, 220, 113, 8, 4, 1, + 177, 3, 220, 113, 8, 6, 1, 177, 3, 248, 46, 8, 4, 1, 177, 3, 248, 46, 8, + 6, 1, 177, 3, 52, 186, 8, 4, 1, 177, 3, 52, 186, 8, 6, 33, 214, 163, 8, + 4, 33, 214, 163, 8, 6, 1, 211, 31, 3, 186, 8, 4, 1, 211, 31, 3, 186, 8, + 6, 1, 211, 31, 3, 247, 49, 8, 4, 1, 211, 31, 3, 247, 49, 8, 6, 1, 211, + 31, 3, 247, 105, 8, 4, 1, 211, 31, 3, 247, 105, 8, 6, 1, 209, 81, 3, 186, + 8, 4, 1, 209, 81, 3, 186, 8, 6, 1, 209, 81, 3, 244, 239, 8, 4, 1, 209, + 81, 3, 244, 239, 8, 6, 1, 209, 81, 3, 247, 49, 8, 4, 1, 209, 81, 3, 247, + 49, 8, 6, 1, 209, 81, 3, 247, 105, 8, 4, 1, 209, 81, 3, 247, 105, 8, 6, + 1, 203, 217, 3, 247, 49, 8, 4, 1, 203, 217, 3, 247, 49, 8, 6, 1, 203, + 217, 3, 247, 105, 8, 4, 1, 203, 217, 3, 247, 105, 8, 6, 1, 203, 217, 3, + 106, 8, 4, 1, 203, 217, 3, 106, 8, 6, 1, 118, 3, 202, 84, 8, 4, 1, 118, + 3, 202, 84, 8, 6, 1, 118, 3, 220, 113, 8, 4, 1, 118, 3, 220, 113, 8, 6, + 1, 118, 3, 248, 46, 8, 4, 1, 118, 3, 248, 46, 8, 6, 1, 118, 3, 210, 3, + 57, 8, 4, 1, 118, 3, 210, 3, 57, 8, 6, 1, 118, 3, 52, 186, 8, 4, 1, 118, + 3, 52, 186, 8, 6, 1, 118, 3, 214, 150, 8, 4, 1, 118, 3, 214, 150, 8, 6, + 1, 197, 200, 3, 244, 239, 8, 4, 1, 197, 200, 3, 244, 239, 8, 6, 1, 196, + 149, 3, 244, 239, 8, 4, 1, 196, 149, 3, 244, 239, 8, 6, 1, 196, 149, 3, + 239, 149, 8, 6, 1, 195, 159, 3, 186, 8, 4, 1, 195, 159, 3, 186, 8, 6, 1, + 195, 159, 3, 76, 57, 8, 4, 1, 195, 159, 3, 76, 57, 8, 6, 1, 195, 159, 3, + 247, 105, 8, 4, 1, 195, 159, 3, 247, 105, 8, 4, 1, 181, 209, 80, 8, 4, 1, + 74, 3, 106, 8, 6, 1, 74, 3, 122, 8, 6, 1, 74, 3, 201, 240, 8, 4, 1, 74, + 3, 201, 240, 8, 6, 1, 152, 167, 8, 4, 1, 152, 167, 8, 6, 1, 192, 72, 8, + 6, 1, 247, 207, 3, 122, 8, 4, 1, 247, 207, 3, 122, 8, 6, 1, 251, 219, + 240, 230, 8, 6, 1, 240, 231, 3, 122, 8, 6, 1, 240, 231, 3, 201, 240, 8, + 4, 1, 240, 231, 3, 201, 240, 8, 4, 1, 163, 239, 211, 8, 6, 1, 210, 89, + 69, 8, 6, 1, 208, 163, 8, 6, 1, 192, 69, 8, 6, 1, 236, 49, 3, 122, 8, 4, + 1, 236, 49, 3, 122, 8, 6, 1, 234, 190, 3, 122, 8, 6, 1, 234, 93, 8, 4, 1, + 231, 43, 8, 6, 1, 226, 6, 8, 6, 1, 230, 248, 3, 106, 8, 6, 1, 225, 80, 3, + 122, 8, 4, 1, 225, 80, 3, 122, 8, 4, 1, 223, 99, 3, 154, 8, 4, 1, 222, + 246, 3, 106, 8, 6, 1, 163, 221, 135, 8, 6, 1, 218, 55, 3, 50, 122, 8, 4, + 1, 218, 55, 3, 181, 53, 222, 171, 8, 6, 1, 177, 3, 112, 202, 84, 8, 6, 1, + 177, 3, 231, 101, 8, 4, 1, 177, 3, 231, 101, 8, 6, 1, 214, 145, 8, 4, 1, + 214, 145, 8, 6, 1, 214, 3, 3, 122, 8, 4, 1, 214, 3, 3, 122, 8, 1, 195, + 220, 8, 6, 1, 152, 102, 8, 4, 1, 152, 102, 8, 6, 1, 236, 140, 8, 1, 210, + 89, 236, 141, 221, 224, 8, 4, 1, 203, 217, 3, 213, 214, 122, 8, 6, 1, + 203, 217, 3, 122, 8, 4, 1, 203, 217, 3, 122, 8, 6, 1, 203, 217, 3, 210, + 95, 122, 8, 6, 1, 118, 3, 231, 101, 8, 4, 1, 118, 3, 231, 101, 8, 6, 1, + 200, 28, 8, 6, 1, 199, 231, 3, 122, 8, 6, 1, 196, 149, 3, 122, 8, 4, 1, + 196, 149, 3, 122, 8, 6, 1, 195, 159, 3, 106, 8, 4, 1, 195, 159, 3, 106, + 8, 6, 1, 236, 51, 8, 6, 1, 236, 52, 210, 88, 8, 4, 1, 236, 52, 210, 88, + 8, 4, 1, 236, 52, 3, 203, 135, 8, 1, 99, 3, 106, 8, 6, 1, 152, 146, 8, 4, + 1, 152, 146, 8, 1, 226, 16, 233, 151, 204, 227, 3, 106, 8, 1, 196, 225, + 8, 1, 239, 204, 244, 214, 8, 1, 222, 217, 244, 214, 8, 1, 251, 123, 244, + 214, 8, 1, 210, 95, 244, 214, 8, 6, 1, 237, 157, 3, 247, 105, 8, 6, 1, + 240, 231, 3, 4, 1, 195, 159, 3, 247, 105, 8, 4, 1, 237, 157, 3, 247, 105, + 8, 6, 1, 222, 40, 8, 6, 1, 223, 99, 3, 4, 1, 225, 216, 8, 4, 1, 222, 40, + 8, 6, 1, 216, 164, 8, 6, 1, 218, 55, 3, 4, 1, 225, 216, 8, 4, 1, 216, + 164, 8, 6, 1, 39, 3, 247, 105, 8, 4, 1, 39, 3, 247, 105, 8, 6, 1, 230, + 248, 3, 247, 105, 8, 4, 1, 230, 248, 3, 247, 105, 8, 6, 1, 177, 3, 247, + 105, 8, 4, 1, 177, 3, 247, 105, 8, 6, 1, 118, 3, 247, 105, 8, 4, 1, 118, + 3, 247, 105, 8, 6, 1, 118, 3, 239, 150, 26, 220, 113, 8, 4, 1, 118, 3, + 239, 150, 26, 220, 113, 8, 6, 1, 118, 3, 239, 150, 26, 186, 8, 4, 1, 118, + 3, 239, 150, 26, 186, 8, 6, 1, 118, 3, 239, 150, 26, 247, 105, 8, 4, 1, + 118, 3, 239, 150, 26, 247, 105, 8, 6, 1, 118, 3, 239, 150, 26, 233, 99, + 8, 4, 1, 118, 3, 239, 150, 26, 233, 99, 8, 4, 1, 163, 69, 8, 6, 1, 39, 3, + 239, 150, 26, 220, 113, 8, 4, 1, 39, 3, 239, 150, 26, 220, 113, 8, 6, 1, + 39, 3, 76, 90, 26, 220, 113, 8, 4, 1, 39, 3, 76, 90, 26, 220, 113, 8, 6, + 1, 251, 245, 3, 220, 113, 8, 4, 1, 251, 245, 3, 220, 113, 8, 6, 1, 234, + 190, 3, 106, 8, 4, 1, 234, 190, 3, 106, 8, 6, 1, 234, 190, 3, 247, 105, + 8, 4, 1, 234, 190, 3, 247, 105, 8, 6, 1, 225, 80, 3, 247, 105, 8, 4, 1, + 225, 80, 3, 247, 105, 8, 6, 1, 177, 3, 214, 150, 8, 4, 1, 177, 3, 214, + 150, 8, 6, 1, 177, 3, 214, 151, 26, 220, 113, 8, 4, 1, 177, 3, 214, 151, + 26, 220, 113, 8, 6, 1, 236, 52, 3, 247, 105, 8, 4, 1, 236, 52, 3, 247, + 105, 8, 4, 1, 225, 217, 3, 247, 105, 8, 6, 1, 237, 156, 8, 6, 1, 240, + 231, 3, 4, 1, 195, 158, 8, 4, 1, 237, 156, 8, 6, 1, 234, 190, 3, 186, 8, + 4, 1, 234, 190, 3, 186, 8, 6, 1, 231, 40, 8, 6, 1, 196, 225, 8, 6, 1, + 218, 55, 3, 233, 99, 8, 4, 1, 218, 55, 3, 233, 99, 8, 6, 1, 39, 3, 210, + 3, 90, 26, 186, 8, 4, 1, 39, 3, 210, 3, 90, 26, 186, 8, 6, 1, 251, 245, + 3, 186, 8, 4, 1, 251, 245, 3, 186, 8, 6, 1, 177, 3, 204, 196, 26, 186, 8, + 4, 1, 177, 3, 204, 196, 26, 186, 8, 6, 1, 39, 3, 52, 233, 99, 8, 4, 1, + 39, 3, 52, 233, 99, 8, 6, 1, 39, 3, 226, 16, 248, 46, 8, 4, 1, 39, 3, + 226, 16, 248, 46, 8, 6, 1, 237, 135, 3, 52, 233, 99, 8, 4, 1, 237, 135, + 3, 52, 233, 99, 8, 6, 1, 237, 135, 3, 226, 16, 248, 46, 8, 4, 1, 237, + 135, 3, 226, 16, 248, 46, 8, 6, 1, 230, 248, 3, 52, 233, 99, 8, 4, 1, + 230, 248, 3, 52, 233, 99, 8, 6, 1, 230, 248, 3, 226, 16, 248, 46, 8, 4, + 1, 230, 248, 3, 226, 16, 248, 46, 8, 6, 1, 177, 3, 52, 233, 99, 8, 4, 1, + 177, 3, 52, 233, 99, 8, 6, 1, 177, 3, 226, 16, 248, 46, 8, 4, 1, 177, 3, + 226, 16, 248, 46, 8, 6, 1, 211, 31, 3, 52, 233, 99, 8, 4, 1, 211, 31, 3, + 52, 233, 99, 8, 6, 1, 211, 31, 3, 226, 16, 248, 46, 8, 4, 1, 211, 31, 3, + 226, 16, 248, 46, 8, 6, 1, 118, 3, 52, 233, 99, 8, 4, 1, 118, 3, 52, 233, + 99, 8, 6, 1, 118, 3, 226, 16, 248, 46, 8, 4, 1, 118, 3, 226, 16, 248, 46, + 8, 6, 1, 209, 81, 3, 244, 159, 60, 8, 4, 1, 209, 81, 3, 244, 159, 60, 8, + 6, 1, 203, 217, 3, 244, 159, 60, 8, 4, 1, 203, 217, 3, 244, 159, 60, 8, + 6, 1, 195, 239, 8, 4, 1, 195, 239, 8, 6, 1, 233, 15, 3, 247, 105, 8, 4, + 1, 233, 15, 3, 247, 105, 8, 6, 1, 218, 55, 3, 181, 53, 222, 171, 8, 4, 1, + 240, 231, 3, 241, 20, 8, 6, 1, 214, 38, 8, 4, 1, 214, 38, 8, 6, 1, 195, + 159, 3, 122, 8, 4, 1, 195, 159, 3, 122, 8, 6, 1, 39, 3, 76, 57, 8, 4, 1, + 39, 3, 76, 57, 8, 6, 1, 237, 135, 3, 247, 49, 8, 4, 1, 237, 135, 3, 247, + 49, 8, 6, 1, 177, 3, 239, 150, 26, 220, 113, 8, 4, 1, 177, 3, 239, 150, + 26, 220, 113, 8, 6, 1, 177, 3, 202, 85, 26, 220, 113, 8, 4, 1, 177, 3, + 202, 85, 26, 220, 113, 8, 6, 1, 177, 3, 76, 57, 8, 4, 1, 177, 3, 76, 57, + 8, 6, 1, 177, 3, 76, 90, 26, 220, 113, 8, 4, 1, 177, 3, 76, 90, 26, 220, + 113, 8, 6, 1, 196, 149, 3, 220, 113, 8, 4, 1, 196, 149, 3, 220, 113, 8, + 4, 1, 223, 99, 3, 241, 20, 8, 4, 1, 218, 55, 3, 241, 20, 8, 4, 1, 203, + 217, 3, 241, 20, 8, 4, 1, 238, 251, 225, 216, 8, 4, 1, 240, 50, 239, 109, + 8, 4, 1, 211, 97, 239, 109, 8, 6, 1, 39, 3, 106, 8, 6, 1, 247, 207, 3, + 106, 8, 4, 1, 247, 207, 3, 106, 8, 6, 1, 223, 99, 3, 154, 8, 6, 1, 203, + 217, 3, 239, 146, 106, 8, 4, 1, 209, 81, 3, 204, 63, 203, 135, 8, 4, 1, + 195, 159, 3, 204, 63, 203, 135, 8, 6, 1, 233, 151, 204, 226, 8, 4, 1, + 233, 151, 204, 226, 8, 6, 1, 74, 3, 106, 8, 6, 1, 118, 154, 8, 6, 1, 163, + 199, 230, 8, 6, 1, 237, 135, 3, 106, 8, 4, 1, 237, 135, 3, 106, 8, 6, 1, + 225, 217, 3, 106, 8, 4, 1, 225, 217, 3, 106, 8, 6, 1, 4, 211, 167, 3, + 231, 164, 203, 135, 8, 4, 1, 211, 167, 3, 231, 164, 203, 135, 8, 6, 1, + 211, 31, 3, 106, 8, 4, 1, 211, 31, 3, 106, 8, 6, 1, 196, 149, 3, 106, 8, + 4, 1, 196, 149, 3, 106, 8, 4, 1, 163, 63, 8, 4, 1, 251, 133, 8, 4, 1, + 163, 251, 133, 8, 4, 1, 74, 3, 122, 8, 4, 1, 192, 72, 8, 4, 1, 247, 207, + 3, 241, 20, 8, 4, 1, 240, 231, 3, 203, 135, 8, 4, 1, 240, 231, 3, 122, 8, + 4, 1, 210, 89, 69, 8, 4, 1, 208, 163, 8, 4, 1, 208, 164, 3, 122, 8, 4, 1, + 192, 69, 8, 4, 1, 210, 89, 192, 69, 8, 4, 1, 210, 89, 192, 237, 135, 3, + 122, 8, 4, 1, 244, 202, 210, 89, 192, 69, 8, 4, 1, 238, 251, 225, 217, 3, + 106, 8, 4, 1, 234, 190, 3, 122, 8, 4, 1, 145, 234, 189, 8, 1, 4, 6, 234, + 189, 8, 4, 1, 234, 93, 8, 4, 1, 210, 207, 231, 101, 8, 4, 1, 163, 233, + 14, 8, 4, 1, 233, 15, 3, 122, 8, 4, 1, 232, 99, 3, 122, 8, 4, 1, 230, + 248, 3, 106, 8, 4, 1, 226, 6, 8, 1, 4, 6, 68, 8, 4, 1, 223, 99, 3, 112, + 202, 84, 8, 4, 1, 223, 99, 3, 248, 224, 8, 4, 1, 223, 99, 3, 210, 95, + 122, 8, 4, 1, 222, 124, 8, 4, 1, 163, 221, 135, 8, 4, 1, 163, 221, 136, + 3, 181, 222, 171, 8, 4, 1, 221, 136, 3, 122, 8, 4, 1, 218, 55, 3, 50, + 122, 8, 4, 1, 218, 55, 3, 210, 95, 122, 8, 1, 4, 6, 218, 54, 8, 4, 1, + 249, 73, 72, 8, 1, 4, 6, 214, 163, 8, 4, 1, 244, 202, 214, 123, 8, 4, 1, + 212, 245, 8, 4, 1, 163, 144, 8, 4, 1, 163, 211, 31, 3, 181, 222, 171, 8, + 4, 1, 163, 211, 31, 3, 122, 8, 4, 1, 211, 31, 3, 181, 222, 171, 8, 4, 1, + 211, 31, 3, 203, 135, 8, 4, 1, 211, 31, 3, 235, 107, 8, 4, 1, 210, 89, + 211, 31, 3, 235, 107, 8, 1, 4, 6, 144, 8, 1, 4, 6, 226, 16, 144, 8, 4, 1, + 209, 81, 3, 122, 8, 4, 1, 236, 140, 8, 4, 1, 238, 251, 225, 217, 3, 204, + 196, 26, 122, 8, 4, 1, 205, 91, 210, 89, 236, 140, 8, 4, 1, 236, 141, 3, + 241, 20, 8, 4, 1, 163, 203, 216, 8, 4, 1, 203, 217, 3, 210, 95, 122, 8, + 4, 1, 118, 154, 8, 4, 1, 200, 28, 8, 4, 1, 199, 231, 3, 122, 8, 4, 1, + 163, 199, 230, 8, 4, 1, 163, 197, 199, 8, 4, 1, 163, 196, 148, 8, 1, 4, + 6, 196, 148, 8, 4, 1, 195, 159, 3, 210, 95, 122, 8, 4, 1, 195, 159, 3, + 241, 20, 8, 4, 1, 236, 51, 8, 4, 1, 236, 52, 3, 241, 20, 8, 1, 233, 151, + 204, 226, 8, 1, 212, 252, 198, 244, 234, 240, 8, 1, 226, 16, 233, 151, + 204, 226, 8, 1, 204, 204, 247, 206, 8, 1, 248, 167, 244, 214, 8, 1, 4, 6, + 250, 111, 8, 4, 1, 244, 202, 192, 69, 8, 1, 4, 6, 234, 190, 3, 122, 8, 1, + 4, 6, 233, 14, 8, 4, 1, 225, 217, 3, 241, 56, 8, 4, 1, 163, 225, 79, 8, + 1, 4, 6, 159, 8, 4, 1, 211, 167, 3, 122, 8, 1, 233, 151, 204, 227, 3, + 106, 8, 1, 210, 89, 233, 151, 204, 227, 3, 106, 8, 4, 1, 237, 157, 239, + 109, 8, 4, 1, 239, 177, 239, 109, 8, 4, 1, 237, 157, 239, 110, 3, 241, + 20, 8, 4, 1, 201, 115, 239, 109, 8, 4, 1, 203, 7, 239, 109, 8, 4, 1, 203, + 75, 239, 110, 3, 241, 20, 8, 4, 1, 235, 166, 239, 109, 8, 4, 1, 221, 192, + 239, 109, 8, 4, 1, 221, 137, 239, 109, 8, 1, 248, 167, 213, 43, 8, 1, + 248, 175, 213, 43, 8, 4, 1, 163, 233, 15, 3, 235, 107, 8, 4, 1, 163, 233, + 15, 3, 235, 108, 26, 203, 135, 73, 1, 4, 233, 14, 73, 1, 4, 233, 15, 3, + 122, 73, 1, 4, 225, 216, 73, 1, 4, 144, 73, 1, 4, 163, 144, 73, 1, 4, + 163, 211, 31, 3, 122, 73, 1, 4, 6, 226, 16, 144, 73, 1, 4, 197, 199, 73, + 1, 4, 196, 148, 73, 1, 212, 18, 73, 1, 52, 212, 18, 73, 1, 163, 244, 158, + 73, 1, 251, 29, 73, 1, 210, 89, 244, 158, 73, 1, 53, 157, 210, 2, 73, 1, + 50, 157, 210, 2, 73, 1, 233, 151, 204, 226, 73, 1, 210, 89, 233, 151, + 204, 226, 73, 1, 50, 250, 216, 73, 1, 53, 250, 216, 73, 1, 124, 250, 216, + 73, 1, 135, 250, 216, 73, 1, 244, 240, 252, 21, 247, 105, 73, 1, 83, 222, + 74, 73, 1, 220, 113, 73, 1, 252, 9, 252, 21, 73, 1, 233, 100, 252, 21, + 73, 1, 126, 83, 222, 74, 73, 1, 126, 220, 113, 73, 1, 126, 233, 100, 252, + 21, 73, 1, 126, 252, 9, 252, 21, 73, 1, 201, 177, 244, 167, 73, 1, 157, + 201, 177, 244, 167, 73, 1, 247, 34, 53, 157, 210, 2, 73, 1, 247, 34, 50, + 157, 210, 2, 73, 1, 124, 203, 147, 73, 1, 135, 203, 147, 73, 1, 98, 55, + 73, 1, 219, 15, 55, 248, 46, 76, 57, 210, 3, 57, 214, 150, 4, 202, 84, + 52, 252, 9, 252, 21, 73, 1, 210, 73, 122, 73, 1, 241, 61, 252, 21, 73, 1, + 4, 234, 93, 73, 1, 4, 159, 73, 1, 4, 209, 80, 73, 1, 4, 196, 222, 73, 1, + 4, 210, 89, 233, 151, 204, 226, 73, 1, 236, 73, 152, 154, 73, 1, 130, + 152, 154, 73, 1, 219, 64, 152, 154, 73, 1, 126, 152, 154, 73, 1, 236, 72, + 152, 154, 73, 1, 196, 13, 239, 201, 152, 78, 73, 1, 196, 96, 239, 201, + 152, 78, 73, 1, 198, 242, 73, 1, 200, 68, 73, 1, 52, 251, 29, 73, 1, 126, + 135, 250, 216, 73, 1, 126, 124, 250, 216, 73, 1, 126, 50, 250, 216, 73, + 1, 126, 53, 250, 216, 73, 1, 126, 210, 2, 73, 1, 112, 233, 100, 252, 21, + 73, 1, 112, 52, 233, 100, 252, 21, 73, 1, 112, 52, 252, 9, 252, 21, 73, + 1, 126, 202, 84, 73, 1, 210, 214, 244, 167, 73, 1, 248, 242, 130, 202, + 11, 73, 1, 236, 221, 130, 202, 11, 73, 1, 248, 242, 126, 202, 11, 73, 1, + 236, 221, 126, 202, 11, 73, 1, 206, 246, 73, 1, 192, 206, 246, 73, 1, + 126, 50, 51, 38, 233, 100, 252, 21, 38, 252, 9, 252, 21, 38, 244, 240, + 252, 21, 38, 202, 84, 38, 220, 113, 38, 214, 18, 38, 248, 46, 38, 76, 57, + 38, 239, 149, 38, 231, 164, 57, 38, 210, 3, 57, 38, 52, 252, 9, 252, 21, + 38, 247, 105, 38, 83, 222, 75, 57, 38, 52, 83, 222, 75, 57, 38, 52, 233, + 100, 252, 21, 38, 247, 132, 38, 226, 16, 248, 46, 38, 163, 244, 159, 57, + 38, 244, 159, 57, 38, 210, 89, 244, 159, 57, 38, 244, 159, 90, 210, 22, + 38, 233, 100, 252, 22, 60, 38, 252, 9, 252, 22, 60, 38, 50, 203, 148, 60, + 38, 53, 203, 148, 60, 38, 50, 251, 90, 57, 38, 231, 101, 38, 50, 157, + 210, 3, 60, 38, 124, 203, 148, 60, 38, 135, 203, 148, 60, 38, 98, 2, 60, + 38, 219, 15, 2, 60, 38, 213, 212, 231, 164, 60, 38, 210, 95, 231, 164, + 60, 38, 76, 60, 38, 239, 150, 60, 38, 210, 3, 60, 38, 244, 159, 60, 38, + 247, 49, 38, 214, 150, 38, 83, 222, 75, 60, 38, 248, 39, 60, 38, 226, 16, + 52, 250, 251, 60, 38, 247, 106, 60, 38, 244, 240, 252, 22, 60, 38, 248, + 47, 60, 38, 226, 16, 248, 47, 60, 38, 202, 85, 60, 38, 220, 114, 60, 38, + 126, 222, 74, 38, 52, 126, 222, 74, 38, 202, 85, 214, 19, 38, 206, 182, + 204, 196, 214, 19, 38, 181, 204, 196, 214, 19, 38, 206, 182, 205, 178, + 214, 19, 38, 181, 205, 178, 214, 19, 38, 53, 157, 210, 3, 60, 38, 226, + 16, 248, 39, 60, 38, 47, 60, 38, 208, 141, 60, 38, 196, 223, 57, 38, 83, + 202, 84, 38, 52, 214, 18, 38, 233, 100, 152, 78, 38, 252, 9, 152, 78, 38, + 32, 213, 37, 38, 32, 223, 231, 38, 32, 239, 143, 201, 248, 38, 32, 195, + 225, 38, 248, 39, 57, 38, 236, 171, 2, 60, 38, 52, 83, 222, 75, 60, 38, + 50, 251, 90, 60, 38, 216, 18, 202, 85, 57, 38, 231, 170, 57, 38, 251, + 138, 180, 202, 30, 57, 38, 50, 53, 61, 60, 38, 200, 24, 61, 60, 38, 233, + 106, 225, 123, 38, 53, 250, 217, 57, 38, 50, 157, 210, 3, 57, 38, 235, + 163, 38, 196, 223, 60, 38, 50, 250, 217, 60, 38, 53, 250, 217, 60, 38, + 53, 250, 217, 26, 124, 250, 217, 60, 38, 53, 157, 210, 3, 57, 38, 76, 90, + 210, 22, 38, 250, 179, 60, 38, 52, 210, 3, 60, 38, 195, 24, 57, 38, 52, + 248, 47, 60, 38, 52, 248, 46, 38, 52, 220, 113, 38, 52, 220, 114, 60, 38, + 52, 202, 84, 38, 52, 226, 16, 248, 46, 38, 52, 91, 61, 60, 38, 8, 4, 1, + 63, 38, 8, 4, 1, 69, 38, 8, 4, 1, 68, 38, 8, 4, 1, 72, 38, 8, 4, 1, 66, + 38, 8, 4, 1, 247, 206, 38, 8, 4, 1, 240, 230, 38, 8, 4, 1, 233, 14, 38, + 8, 4, 1, 221, 135, 38, 8, 4, 1, 144, 38, 8, 4, 1, 203, 216, 38, 8, 4, 1, + 199, 230, 38, 8, 4, 1, 196, 222, 32, 6, 1, 232, 87, 32, 4, 1, 232, 87, + 32, 6, 1, 250, 250, 208, 222, 32, 4, 1, 250, 250, 208, 222, 32, 215, 141, + 55, 32, 221, 202, 215, 141, 55, 32, 6, 1, 213, 195, 239, 117, 32, 4, 1, + 213, 195, 239, 117, 32, 195, 225, 32, 4, 210, 89, 221, 172, 206, 87, 105, + 32, 4, 237, 249, 221, 172, 206, 87, 105, 32, 4, 210, 89, 237, 249, 221, + 172, 206, 87, 105, 32, 211, 78, 78, 32, 6, 1, 195, 232, 32, 201, 248, 32, + 239, 143, 201, 248, 32, 6, 1, 251, 134, 3, 201, 248, 32, 251, 73, 203, + 35, 32, 6, 1, 236, 174, 3, 201, 248, 32, 6, 1, 236, 126, 3, 201, 248, 32, + 6, 1, 226, 7, 3, 201, 248, 32, 6, 1, 214, 122, 3, 201, 248, 32, 6, 1, + 200, 29, 3, 201, 248, 32, 6, 1, 214, 124, 3, 201, 248, 32, 4, 1, 226, 7, + 3, 239, 143, 26, 201, 248, 32, 6, 1, 251, 133, 32, 6, 1, 248, 205, 32, 6, + 1, 234, 93, 32, 6, 1, 239, 211, 32, 6, 1, 236, 173, 32, 6, 1, 195, 78, + 32, 6, 1, 236, 125, 32, 6, 1, 202, 199, 32, 6, 1, 226, 6, 32, 6, 1, 225, + 1, 32, 6, 1, 222, 244, 32, 6, 1, 218, 144, 32, 6, 1, 215, 185, 32, 6, 1, + 196, 196, 32, 6, 1, 214, 121, 32, 6, 1, 212, 219, 32, 6, 1, 210, 74, 32, + 6, 1, 206, 86, 32, 6, 1, 203, 89, 32, 6, 1, 200, 28, 32, 6, 1, 212, 245, + 32, 6, 1, 245, 74, 32, 6, 1, 211, 237, 32, 6, 1, 214, 123, 32, 6, 1, 226, + 7, 3, 239, 142, 32, 6, 1, 200, 29, 3, 239, 142, 32, 4, 1, 251, 134, 3, + 201, 248, 32, 4, 1, 236, 174, 3, 201, 248, 32, 4, 1, 236, 126, 3, 201, + 248, 32, 4, 1, 226, 7, 3, 201, 248, 32, 4, 1, 200, 29, 3, 239, 143, 26, + 201, 248, 32, 4, 1, 251, 133, 32, 4, 1, 248, 205, 32, 4, 1, 234, 93, 32, + 4, 1, 239, 211, 32, 4, 1, 236, 173, 32, 4, 1, 195, 78, 32, 4, 1, 236, + 125, 32, 4, 1, 202, 199, 32, 4, 1, 226, 6, 32, 4, 1, 225, 1, 32, 4, 1, + 222, 244, 32, 4, 1, 218, 144, 32, 4, 1, 215, 185, 32, 4, 1, 196, 196, 32, + 4, 1, 214, 121, 32, 4, 1, 212, 219, 32, 4, 1, 210, 74, 32, 4, 1, 48, 206, + 86, 32, 4, 1, 206, 86, 32, 4, 1, 203, 89, 32, 4, 1, 200, 28, 32, 4, 1, + 212, 245, 32, 4, 1, 245, 74, 32, 4, 1, 211, 237, 32, 4, 1, 214, 123, 32, + 4, 1, 226, 7, 3, 239, 142, 32, 4, 1, 200, 29, 3, 239, 142, 32, 4, 1, 214, + 122, 3, 201, 248, 32, 4, 1, 200, 29, 3, 201, 248, 32, 4, 1, 214, 124, 3, + 201, 248, 32, 6, 225, 31, 105, 32, 248, 206, 105, 32, 202, 200, 105, 32, + 200, 29, 3, 231, 164, 105, 32, 200, 29, 3, 252, 9, 26, 231, 164, 105, 32, + 200, 29, 3, 239, 150, 26, 231, 164, 105, 32, 212, 246, 105, 32, 212, 220, + 105, 32, 225, 31, 105, 32, 1, 250, 250, 223, 235, 32, 4, 1, 250, 250, + 223, 235, 32, 1, 204, 236, 32, 4, 1, 204, 236, 32, 1, 239, 117, 32, 4, 1, + 239, 117, 32, 1, 223, 235, 32, 4, 1, 223, 235, 32, 1, 208, 222, 32, 4, 1, + 208, 222, 88, 6, 1, 206, 247, 88, 4, 1, 206, 247, 88, 6, 1, 235, 173, 88, + 4, 1, 235, 173, 88, 6, 1, 224, 128, 88, 4, 1, 224, 128, 88, 6, 1, 231, + 155, 88, 4, 1, 231, 155, 88, 6, 1, 234, 88, 88, 4, 1, 234, 88, 88, 6, 1, + 206, 213, 88, 4, 1, 206, 213, 88, 6, 1, 239, 227, 88, 4, 1, 239, 227, 32, + 225, 2, 105, 32, 210, 75, 105, 32, 221, 172, 206, 87, 105, 32, 1, 195, + 232, 32, 6, 202, 200, 105, 32, 221, 172, 236, 174, 105, 32, 210, 89, 221, + 172, 236, 174, 105, 32, 6, 1, 206, 198, 32, 4, 1, 206, 198, 32, 6, 221, + 172, 206, 87, 105, 32, 6, 1, 208, 219, 32, 4, 1, 208, 219, 32, 210, 75, + 3, 204, 196, 105, 32, 6, 210, 89, 221, 172, 206, 87, 105, 32, 6, 237, + 249, 221, 172, 206, 87, 105, 32, 6, 210, 89, 237, 249, 221, 172, 206, 87, + 105, 40, 6, 1, 226, 147, 3, 233, 99, 40, 6, 1, 226, 11, 40, 6, 1, 239, + 45, 40, 6, 1, 233, 160, 40, 6, 1, 200, 84, 226, 146, 40, 6, 1, 237, 152, + 40, 6, 1, 247, 216, 68, 40, 6, 1, 196, 24, 40, 6, 1, 225, 192, 40, 6, 1, + 222, 39, 40, 6, 1, 216, 156, 40, 6, 1, 201, 101, 40, 6, 1, 224, 37, 40, + 6, 1, 230, 248, 3, 233, 99, 40, 6, 1, 206, 182, 66, 40, 6, 1, 237, 148, + 40, 6, 1, 63, 40, 6, 1, 249, 8, 40, 6, 1, 199, 118, 40, 6, 1, 233, 215, + 40, 6, 1, 239, 251, 40, 6, 1, 226, 146, 40, 6, 1, 195, 65, 40, 6, 1, 195, + 88, 40, 6, 1, 68, 40, 6, 1, 206, 182, 68, 40, 6, 1, 155, 40, 6, 1, 237, + 6, 40, 6, 1, 236, 240, 40, 6, 1, 236, 229, 40, 6, 1, 72, 40, 6, 1, 213, + 91, 40, 6, 1, 236, 162, 40, 6, 1, 236, 150, 40, 6, 1, 203, 68, 40, 6, 1, + 66, 40, 6, 1, 237, 46, 40, 6, 1, 142, 40, 6, 1, 201, 107, 40, 6, 1, 245, + 102, 40, 6, 1, 207, 50, 40, 6, 1, 207, 2, 40, 6, 1, 232, 172, 55, 40, 6, + 1, 196, 47, 40, 6, 1, 205, 186, 55, 40, 6, 1, 69, 40, 6, 1, 195, 217, 40, + 6, 1, 164, 40, 4, 1, 63, 40, 4, 1, 249, 8, 40, 4, 1, 199, 118, 40, 4, 1, + 233, 215, 40, 4, 1, 239, 251, 40, 4, 1, 226, 146, 40, 4, 1, 195, 65, 40, + 4, 1, 195, 88, 40, 4, 1, 68, 40, 4, 1, 206, 182, 68, 40, 4, 1, 155, 40, + 4, 1, 237, 6, 40, 4, 1, 236, 240, 40, 4, 1, 236, 229, 40, 4, 1, 72, 40, + 4, 1, 213, 91, 40, 4, 1, 236, 162, 40, 4, 1, 236, 150, 40, 4, 1, 203, 68, + 40, 4, 1, 66, 40, 4, 1, 237, 46, 40, 4, 1, 142, 40, 4, 1, 201, 107, 40, + 4, 1, 245, 102, 40, 4, 1, 207, 50, 40, 4, 1, 207, 2, 40, 4, 1, 232, 172, + 55, 40, 4, 1, 196, 47, 40, 4, 1, 205, 186, 55, 40, 4, 1, 69, 40, 4, 1, + 195, 217, 40, 4, 1, 164, 40, 4, 1, 226, 147, 3, 233, 99, 40, 4, 1, 226, + 11, 40, 4, 1, 239, 45, 40, 4, 1, 233, 160, 40, 4, 1, 200, 84, 226, 146, + 40, 4, 1, 237, 152, 40, 4, 1, 247, 216, 68, 40, 4, 1, 196, 24, 40, 4, 1, + 225, 192, 40, 4, 1, 222, 39, 40, 4, 1, 216, 156, 40, 4, 1, 201, 101, 40, + 4, 1, 224, 37, 40, 4, 1, 230, 248, 3, 233, 99, 40, 4, 1, 206, 182, 66, + 40, 4, 1, 237, 148, 40, 6, 1, 214, 123, 40, 4, 1, 214, 123, 40, 6, 1, + 196, 84, 40, 4, 1, 196, 84, 40, 6, 1, 226, 4, 69, 40, 4, 1, 226, 4, 69, + 40, 6, 1, 222, 46, 195, 182, 40, 4, 1, 222, 46, 195, 182, 40, 6, 1, 226, + 4, 222, 46, 195, 182, 40, 4, 1, 226, 4, 222, 46, 195, 182, 40, 6, 1, 248, + 170, 195, 182, 40, 4, 1, 248, 170, 195, 182, 40, 6, 1, 226, 4, 248, 170, + 195, 182, 40, 4, 1, 226, 4, 248, 170, 195, 182, 40, 6, 1, 223, 202, 40, + 4, 1, 223, 202, 40, 6, 1, 211, 237, 40, 4, 1, 211, 237, 40, 6, 1, 235, + 102, 40, 4, 1, 235, 102, 40, 6, 1, 225, 218, 40, 4, 1, 225, 218, 40, 6, + 1, 225, 219, 3, 52, 233, 100, 252, 21, 40, 4, 1, 225, 219, 3, 52, 233, + 100, 252, 21, 40, 6, 1, 200, 87, 40, 4, 1, 200, 87, 40, 6, 1, 209, 187, + 214, 123, 40, 4, 1, 209, 187, 214, 123, 40, 6, 1, 214, 124, 3, 202, 54, + 40, 4, 1, 214, 124, 3, 202, 54, 40, 6, 1, 214, 48, 40, 4, 1, 214, 48, 40, + 6, 1, 223, 235, 40, 4, 1, 223, 235, 40, 202, 158, 55, 38, 40, 202, 54, + 38, 40, 213, 213, 38, 40, 240, 62, 212, 118, 38, 40, 211, 231, 212, 118, + 38, 40, 212, 102, 38, 40, 231, 57, 202, 158, 55, 38, 40, 219, 26, 55, 40, + 6, 1, 206, 182, 230, 248, 3, 203, 135, 40, 4, 1, 206, 182, 230, 248, 3, + 203, 135, 40, 6, 1, 207, 101, 55, 40, 4, 1, 207, 101, 55, 40, 6, 1, 236, + 163, 3, 202, 111, 40, 4, 1, 236, 163, 3, 202, 111, 40, 6, 1, 233, 216, 3, + 200, 27, 40, 4, 1, 233, 216, 3, 200, 27, 40, 6, 1, 233, 216, 3, 106, 40, + 4, 1, 233, 216, 3, 106, 40, 6, 1, 233, 216, 3, 112, 122, 40, 4, 1, 233, + 216, 3, 112, 122, 40, 6, 1, 195, 66, 3, 239, 194, 40, 4, 1, 195, 66, 3, + 239, 194, 40, 6, 1, 195, 89, 3, 239, 194, 40, 4, 1, 195, 89, 3, 239, 194, + 40, 6, 1, 225, 69, 3, 239, 194, 40, 4, 1, 225, 69, 3, 239, 194, 40, 6, 1, + 225, 69, 3, 83, 106, 40, 4, 1, 225, 69, 3, 83, 106, 40, 6, 1, 225, 69, 3, + 106, 40, 4, 1, 225, 69, 3, 106, 40, 6, 1, 249, 61, 155, 40, 4, 1, 249, + 61, 155, 40, 6, 1, 236, 230, 3, 239, 194, 40, 4, 1, 236, 230, 3, 239, + 194, 40, 6, 33, 236, 230, 233, 215, 40, 4, 33, 236, 230, 233, 215, 40, 6, + 1, 213, 92, 3, 112, 122, 40, 4, 1, 213, 92, 3, 112, 122, 40, 6, 1, 252, + 28, 142, 40, 4, 1, 252, 28, 142, 40, 6, 1, 236, 151, 3, 239, 194, 40, 4, + 1, 236, 151, 3, 239, 194, 40, 6, 1, 203, 69, 3, 239, 194, 40, 4, 1, 203, + 69, 3, 239, 194, 40, 6, 1, 204, 218, 66, 40, 4, 1, 204, 218, 66, 40, 6, + 1, 204, 218, 118, 3, 106, 40, 4, 1, 204, 218, 118, 3, 106, 40, 6, 1, 233, + 3, 3, 239, 194, 40, 4, 1, 233, 3, 3, 239, 194, 40, 6, 33, 203, 69, 201, + 107, 40, 4, 33, 203, 69, 201, 107, 40, 6, 1, 245, 103, 3, 239, 194, 40, + 4, 1, 245, 103, 3, 239, 194, 40, 6, 1, 245, 103, 3, 83, 106, 40, 4, 1, + 245, 103, 3, 83, 106, 40, 6, 1, 206, 224, 40, 4, 1, 206, 224, 40, 6, 1, + 252, 28, 245, 102, 40, 4, 1, 252, 28, 245, 102, 40, 6, 1, 252, 28, 245, + 103, 3, 239, 194, 40, 4, 1, 252, 28, 245, 103, 3, 239, 194, 40, 1, 213, + 202, 40, 6, 1, 195, 66, 3, 248, 46, 40, 4, 1, 195, 66, 3, 248, 46, 40, 6, + 1, 225, 69, 3, 122, 40, 4, 1, 225, 69, 3, 122, 40, 6, 1, 237, 7, 3, 203, + 135, 40, 4, 1, 237, 7, 3, 203, 135, 40, 6, 1, 236, 230, 3, 122, 40, 4, 1, + 236, 230, 3, 122, 40, 6, 1, 236, 230, 3, 203, 135, 40, 4, 1, 236, 230, 3, + 203, 135, 40, 6, 1, 224, 139, 245, 102, 40, 4, 1, 224, 139, 245, 102, 40, + 6, 1, 236, 241, 3, 203, 135, 40, 4, 1, 236, 241, 3, 203, 135, 40, 4, 1, + 213, 202, 40, 6, 1, 39, 3, 248, 46, 40, 4, 1, 39, 3, 248, 46, 40, 6, 1, + 39, 3, 239, 149, 40, 4, 1, 39, 3, 239, 149, 40, 6, 33, 39, 226, 146, 40, + 4, 33, 39, 226, 146, 40, 6, 1, 226, 147, 3, 248, 46, 40, 4, 1, 226, 147, + 3, 248, 46, 40, 6, 1, 208, 163, 40, 4, 1, 208, 163, 40, 6, 1, 208, 164, + 3, 239, 149, 40, 4, 1, 208, 164, 3, 239, 149, 40, 6, 1, 195, 66, 3, 239, + 149, 40, 4, 1, 195, 66, 3, 239, 149, 40, 6, 1, 195, 89, 3, 239, 149, 40, + 4, 1, 195, 89, 3, 239, 149, 40, 6, 1, 252, 28, 237, 152, 40, 4, 1, 252, + 28, 237, 152, 40, 6, 1, 230, 248, 3, 220, 113, 40, 4, 1, 230, 248, 3, + 220, 113, 40, 6, 1, 230, 248, 3, 239, 149, 40, 4, 1, 230, 248, 3, 239, + 149, 40, 6, 1, 177, 3, 239, 149, 40, 4, 1, 177, 3, 239, 149, 40, 6, 1, + 249, 73, 72, 40, 4, 1, 249, 73, 72, 40, 6, 1, 249, 73, 177, 3, 239, 149, + 40, 4, 1, 249, 73, 177, 3, 239, 149, 40, 6, 1, 237, 135, 3, 239, 149, 40, + 4, 1, 237, 135, 3, 239, 149, 40, 6, 1, 118, 3, 220, 113, 40, 4, 1, 118, + 3, 220, 113, 40, 6, 1, 118, 3, 239, 149, 40, 4, 1, 118, 3, 239, 149, 40, + 6, 1, 118, 3, 52, 186, 40, 4, 1, 118, 3, 52, 186, 40, 6, 1, 245, 103, 3, + 239, 149, 40, 4, 1, 245, 103, 3, 239, 149, 40, 6, 1, 233, 216, 3, 239, + 194, 40, 4, 1, 233, 216, 3, 239, 194, 40, 6, 1, 196, 48, 3, 239, 149, 40, + 4, 1, 196, 48, 3, 239, 149, 40, 6, 1, 233, 216, 3, 204, 196, 26, 122, 40, + 4, 1, 233, 216, 3, 204, 196, 26, 122, 40, 6, 1, 233, 3, 3, 122, 40, 4, 1, + 233, 3, 3, 122, 40, 6, 1, 233, 3, 3, 106, 40, 4, 1, 233, 3, 3, 106, 40, + 6, 1, 223, 245, 239, 251, 40, 4, 1, 223, 245, 239, 251, 40, 6, 1, 223, + 245, 239, 45, 40, 4, 1, 223, 245, 239, 45, 40, 6, 1, 223, 245, 195, 15, + 40, 4, 1, 223, 245, 195, 15, 40, 6, 1, 223, 245, 237, 144, 40, 4, 1, 223, + 245, 237, 144, 40, 6, 1, 223, 245, 222, 39, 40, 4, 1, 223, 245, 222, 39, + 40, 6, 1, 223, 245, 216, 156, 40, 4, 1, 223, 245, 216, 156, 40, 6, 1, + 223, 245, 206, 8, 40, 4, 1, 223, 245, 206, 8, 40, 6, 1, 223, 245, 202, + 48, 40, 4, 1, 223, 245, 202, 48, 40, 6, 1, 210, 89, 195, 88, 40, 4, 1, + 210, 89, 195, 88, 40, 6, 1, 237, 7, 3, 122, 40, 4, 1, 237, 7, 3, 122, 40, + 6, 1, 222, 121, 40, 4, 1, 222, 121, 40, 6, 1, 210, 77, 40, 4, 1, 210, 77, + 40, 6, 1, 196, 118, 40, 4, 1, 196, 118, 40, 6, 1, 211, 158, 40, 4, 1, + 211, 158, 40, 6, 1, 197, 109, 40, 4, 1, 197, 109, 40, 6, 1, 251, 159, + 155, 40, 4, 1, 251, 159, 155, 40, 6, 1, 237, 7, 3, 112, 122, 40, 4, 1, + 237, 7, 3, 112, 122, 40, 6, 1, 236, 230, 3, 112, 122, 40, 4, 1, 236, 230, + 3, 112, 122, 40, 6, 1, 213, 92, 3, 239, 194, 40, 4, 1, 213, 92, 3, 239, + 194, 40, 6, 1, 206, 225, 3, 239, 194, 40, 4, 1, 206, 225, 3, 239, 194, + 40, 6, 1, 236, 230, 3, 50, 122, 40, 4, 1, 236, 230, 3, 50, 122, 40, 6, 1, + 237, 136, 40, 4, 1, 237, 136, 40, 6, 1, 240, 44, 40, 4, 1, 240, 44, 40, + 6, 1, 237, 7, 3, 239, 194, 40, 4, 1, 237, 7, 3, 239, 194, 250, 229, 6, 1, + 250, 118, 250, 229, 6, 1, 248, 222, 250, 229, 6, 1, 233, 178, 250, 229, + 6, 1, 240, 135, 250, 229, 6, 1, 237, 59, 250, 229, 6, 1, 195, 115, 250, + 229, 6, 1, 237, 39, 250, 229, 6, 1, 236, 127, 250, 229, 6, 1, 149, 250, + 229, 6, 1, 195, 65, 250, 229, 6, 1, 226, 54, 250, 229, 6, 1, 222, 43, + 250, 229, 6, 1, 196, 200, 250, 229, 6, 1, 247, 173, 250, 229, 6, 1, 224, + 181, 250, 229, 6, 1, 231, 192, 250, 229, 6, 1, 225, 213, 250, 229, 6, 1, + 233, 226, 250, 229, 6, 1, 245, 92, 250, 229, 6, 1, 219, 163, 250, 229, 6, + 1, 196, 24, 250, 229, 6, 1, 216, 3, 250, 229, 6, 1, 207, 50, 250, 229, 6, + 1, 198, 248, 250, 229, 6, 1, 247, 15, 250, 229, 6, 1, 213, 71, 250, 229, + 6, 1, 225, 174, 250, 229, 6, 1, 169, 250, 229, 6, 1, 208, 119, 250, 229, + 6, 1, 199, 39, 250, 229, 6, 1, 202, 51, 250, 229, 6, 1, 210, 141, 250, + 229, 6, 1, 244, 181, 250, 229, 6, 1, 196, 8, 250, 229, 6, 1, 212, 153, + 250, 229, 6, 1, 224, 192, 250, 229, 6, 1, 214, 148, 250, 229, 6, 1, 235, + 175, 250, 229, 73, 1, 50, 157, 210, 2, 250, 229, 251, 29, 250, 229, 236, + 233, 78, 250, 229, 236, 89, 78, 250, 229, 244, 158, 250, 229, 211, 78, + 78, 250, 229, 252, 29, 78, 250, 229, 4, 1, 163, 250, 118, 250, 229, 4, 1, + 250, 118, 250, 229, 4, 1, 248, 222, 250, 229, 4, 1, 233, 178, 250, 229, + 4, 1, 240, 135, 250, 229, 4, 1, 237, 59, 250, 229, 4, 1, 195, 115, 250, + 229, 4, 1, 237, 39, 250, 229, 4, 1, 236, 127, 250, 229, 4, 1, 149, 250, + 229, 4, 1, 195, 65, 250, 229, 4, 1, 226, 54, 250, 229, 4, 1, 222, 43, + 250, 229, 4, 1, 196, 200, 250, 229, 4, 1, 247, 173, 250, 229, 4, 1, 224, + 181, 250, 229, 4, 1, 231, 192, 250, 229, 4, 1, 225, 213, 250, 229, 4, 1, + 233, 226, 250, 229, 4, 1, 245, 92, 250, 229, 4, 1, 219, 163, 250, 229, 4, + 1, 196, 24, 250, 229, 4, 1, 216, 3, 250, 229, 4, 1, 207, 50, 250, 229, 4, + 1, 198, 248, 250, 229, 4, 1, 247, 15, 250, 229, 4, 1, 213, 71, 250, 229, + 4, 1, 225, 174, 250, 229, 4, 1, 169, 250, 229, 4, 1, 208, 119, 250, 229, + 4, 1, 199, 39, 250, 229, 4, 1, 202, 51, 250, 229, 4, 1, 210, 141, 250, + 229, 4, 1, 244, 181, 250, 229, 4, 1, 196, 8, 250, 229, 4, 1, 212, 153, + 250, 229, 4, 1, 224, 192, 250, 229, 4, 1, 214, 148, 250, 229, 4, 1, 235, + 175, 250, 229, 4, 33, 237, 60, 196, 8, 250, 229, 4, 1, 11, 3, 106, 250, + 229, 234, 216, 204, 226, 250, 229, 231, 6, 210, 21, 250, 229, 236, 123, + 55, 222, 182, 250, 229, 236, 123, 55, 250, 229, 237, 221, 55, 123, 252, + 22, 236, 118, 123, 252, 22, 208, 120, 123, 252, 22, 207, 27, 123, 252, + 22, 195, 100, 211, 141, 123, 252, 22, 195, 100, 234, 112, 123, 252, 22, + 202, 66, 123, 252, 22, 210, 86, 123, 252, 22, 195, 98, 123, 252, 22, 213, + 123, 123, 252, 22, 196, 37, 123, 252, 22, 202, 240, 123, 252, 22, 234, + 21, 123, 252, 22, 234, 22, 218, 101, 123, 252, 22, 234, 19, 123, 252, 22, + 211, 142, 213, 155, 123, 252, 22, 203, 30, 234, 40, 123, 252, 22, 213, + 97, 123, 252, 22, 250, 158, 232, 239, 123, 252, 22, 218, 111, 123, 252, + 22, 220, 85, 123, 252, 22, 219, 152, 123, 252, 22, 219, 153, 224, 193, + 123, 252, 22, 240, 71, 123, 252, 22, 211, 153, 123, 252, 22, 203, 30, + 211, 136, 123, 252, 22, 196, 50, 248, 223, 195, 238, 123, 252, 22, 214, + 130, 123, 252, 22, 226, 105, 123, 252, 22, 239, 228, 123, 252, 22, 195, + 22, 123, 117, 220, 7, 244, 248, 123, 212, 110, 206, 227, 123, 212, 110, + 232, 163, 208, 120, 123, 212, 110, 232, 163, 213, 114, 123, 212, 110, + 232, 163, 211, 146, 123, 212, 110, 232, 32, 123, 212, 110, 201, 104, 123, + 212, 110, 208, 120, 123, 212, 110, 213, 114, 123, 212, 110, 211, 146, + 123, 212, 110, 231, 176, 123, 212, 110, 231, 177, 232, 165, 36, 199, 122, + 123, 212, 110, 211, 82, 123, 212, 110, 240, 120, 214, 72, 220, 41, 123, + 212, 110, 219, 141, 123, 211, 213, 220, 38, 123, 212, 110, 210, 226, 123, + 211, 213, 213, 125, 123, 212, 110, 206, 212, 238, 252, 123, 212, 110, + 206, 66, 238, 252, 123, 211, 213, 205, 187, 213, 116, 123, 117, 200, 33, + 238, 252, 123, 117, 221, 202, 238, 252, 123, 211, 213, 215, 138, 232, + 238, 123, 212, 110, 211, 147, 211, 141, 123, 1, 251, 163, 123, 1, 248, + 207, 123, 1, 233, 176, 123, 1, 240, 100, 123, 1, 232, 146, 123, 1, 199, + 122, 123, 1, 195, 92, 123, 1, 232, 88, 123, 1, 203, 1, 123, 1, 195, 241, + 123, 1, 48, 225, 34, 123, 1, 225, 34, 123, 1, 222, 240, 123, 1, 48, 219, + 170, 123, 1, 219, 170, 123, 1, 48, 215, 137, 123, 1, 215, 137, 123, 1, + 208, 225, 123, 1, 250, 116, 123, 1, 48, 213, 91, 123, 1, 213, 91, 123, 1, + 48, 201, 108, 123, 1, 201, 108, 123, 1, 211, 105, 123, 1, 210, 109, 123, + 1, 206, 211, 123, 1, 203, 85, 123, 195, 242, 201, 180, 123, 33, 196, 22, + 52, 199, 122, 123, 33, 196, 22, 199, 123, 195, 241, 123, 33, 196, 22, 52, + 195, 241, 123, 211, 213, 234, 21, 123, 211, 213, 234, 19, 9, 31, 55, 9, + 2, 208, 218, 9, 235, 34, 220, 23, 9, 2, 209, 3, 9, 2, 208, 221, 9, 31, + 117, 57, 251, 8, 241, 36, 209, 200, 251, 8, 234, 255, 209, 200, 9, 210, + 190, 251, 8, 213, 45, 219, 28, 55, 251, 8, 213, 45, 203, 24, 202, 159, + 55, 251, 221, 55, 9, 244, 158, 9, 240, 58, 207, 90, 9, 212, 112, 199, + 102, 55, 9, 2, 219, 7, 9, 2, 208, 235, 251, 166, 197, 133, 9, 2, 251, + 166, 250, 183, 9, 2, 210, 224, 251, 165, 9, 2, 210, 232, 251, 143, 251, + 81, 9, 2, 203, 126, 9, 4, 130, 203, 139, 9, 4, 130, 33, 151, 3, 222, 249, + 3, 196, 64, 9, 4, 130, 195, 106, 9, 4, 235, 199, 9, 4, 240, 94, 9, 4, + 224, 237, 9, 207, 105, 9, 1, 78, 9, 201, 165, 76, 211, 213, 78, 9, 211, + 78, 78, 9, 1, 224, 241, 196, 64, 9, 1, 232, 212, 9, 1, 151, 3, 220, 109, + 57, 9, 1, 151, 3, 232, 213, 57, 9, 1, 197, 118, 3, 232, 213, 57, 9, 1, + 151, 3, 232, 213, 60, 9, 1, 93, 3, 232, 213, 57, 9, 1, 251, 163, 9, 1, + 248, 238, 9, 1, 203, 42, 220, 34, 9, 1, 203, 41, 9, 1, 202, 213, 9, 1, + 225, 188, 9, 1, 232, 235, 9, 1, 224, 141, 9, 1, 240, 106, 9, 1, 202, 225, + 9, 1, 210, 141, 9, 1, 195, 106, 9, 1, 208, 125, 9, 1, 206, 251, 9, 1, + 209, 8, 9, 1, 240, 129, 9, 1, 203, 139, 9, 1, 195, 109, 9, 1, 251, 193, + 9, 1, 233, 224, 9, 1, 224, 191, 3, 99, 238, 250, 57, 9, 1, 224, 191, 3, + 115, 238, 250, 60, 9, 1, 235, 203, 93, 3, 226, 16, 199, 230, 9, 1, 235, + 203, 93, 3, 99, 238, 250, 57, 9, 1, 235, 203, 93, 3, 115, 238, 250, 57, + 9, 203, 91, 9, 1, 235, 175, 9, 1, 211, 151, 9, 1, 225, 34, 9, 1, 222, + 248, 9, 1, 219, 184, 9, 1, 216, 30, 9, 1, 232, 112, 9, 1, 197, 117, 9, 1, + 151, 220, 68, 9, 1, 196, 64, 9, 235, 197, 9, 240, 92, 9, 224, 235, 9, + 235, 199, 9, 240, 94, 9, 224, 237, 9, 207, 40, 9, 204, 119, 9, 220, 107, + 57, 9, 232, 213, 57, 9, 232, 213, 60, 9, 204, 143, 251, 163, 9, 226, 16, + 240, 94, 9, 117, 216, 31, 233, 195, 9, 194, 241, 9, 18, 2, 4, 199, 231, + 57, 9, 18, 2, 226, 16, 4, 199, 231, 57, 9, 18, 2, 76, 60, 9, 210, 89, + 240, 94, 9, 235, 200, 3, 99, 238, 249, 9, 197, 119, 232, 213, 60, 251, 8, + 17, 195, 79, 251, 8, 17, 100, 251, 8, 17, 102, 251, 8, 17, 134, 251, 8, + 17, 136, 251, 8, 17, 146, 251, 8, 17, 167, 251, 8, 17, 178, 251, 8, 17, + 171, 251, 8, 17, 182, 9, 213, 44, 55, 9, 239, 243, 207, 90, 9, 202, 158, + 207, 90, 9, 235, 100, 212, 108, 205, 7, 9, 1, 238, 251, 248, 238, 9, 1, + 238, 251, 211, 151, 9, 1, 204, 95, 251, 163, 9, 1, 151, 197, 134, 9, 1, + 151, 3, 197, 119, 232, 213, 57, 9, 1, 151, 3, 197, 119, 232, 213, 60, 9, + 1, 130, 232, 212, 9, 1, 130, 232, 213, 251, 163, 9, 1, 130, 232, 213, + 197, 117, 9, 1, 118, 3, 232, 213, 57, 9, 1, 130, 232, 213, 196, 64, 9, 1, + 201, 70, 9, 1, 201, 68, 9, 1, 248, 248, 9, 1, 203, 42, 3, 210, 2, 9, 1, + 203, 42, 3, 115, 238, 250, 90, 237, 229, 9, 1, 213, 71, 9, 1, 203, 39, 9, + 1, 248, 236, 9, 1, 168, 3, 232, 213, 57, 9, 1, 168, 3, 99, 238, 250, 83, + 57, 9, 1, 215, 94, 9, 1, 237, 161, 9, 1, 168, 3, 115, 238, 250, 57, 9, 1, + 203, 72, 9, 1, 203, 70, 9, 1, 240, 35, 9, 1, 240, 107, 3, 210, 2, 9, 1, + 240, 107, 3, 76, 60, 9, 1, 240, 107, 3, 76, 248, 226, 26, 4, 203, 139, 9, + 1, 240, 113, 9, 1, 240, 37, 9, 1, 237, 190, 9, 1, 240, 107, 3, 115, 238, + 250, 90, 237, 229, 9, 1, 240, 107, 3, 235, 6, 238, 250, 57, 9, 1, 209, + 173, 9, 1, 210, 142, 3, 4, 199, 230, 9, 1, 210, 142, 3, 210, 2, 9, 1, + 210, 142, 3, 76, 60, 9, 1, 210, 142, 3, 4, 199, 231, 60, 9, 1, 210, 142, + 3, 76, 248, 226, 26, 76, 57, 9, 1, 210, 142, 3, 99, 238, 250, 57, 9, 1, + 225, 185, 9, 1, 210, 142, 3, 235, 6, 238, 250, 57, 9, 1, 208, 126, 3, 76, + 248, 226, 26, 76, 57, 9, 1, 208, 126, 3, 115, 238, 250, 60, 9, 1, 208, + 126, 3, 115, 238, 250, 248, 226, 26, 115, 238, 250, 57, 9, 1, 209, 9, 3, + 99, 238, 250, 60, 9, 1, 209, 9, 3, 115, 238, 250, 57, 9, 1, 203, 140, 3, + 115, 238, 250, 57, 9, 1, 251, 194, 3, 115, 238, 250, 57, 9, 1, 238, 251, + 235, 175, 9, 1, 235, 176, 3, 76, 218, 161, 60, 9, 1, 235, 176, 3, 76, 60, + 9, 1, 199, 111, 9, 1, 235, 176, 3, 115, 238, 250, 60, 9, 1, 213, 69, 9, + 1, 211, 152, 3, 76, 57, 9, 1, 211, 152, 3, 115, 238, 250, 57, 9, 1, 224, + 190, 9, 1, 204, 63, 225, 34, 9, 1, 225, 35, 3, 210, 2, 9, 1, 225, 35, 3, + 76, 57, 9, 1, 217, 72, 9, 1, 225, 35, 3, 115, 238, 250, 60, 9, 1, 234, + 109, 9, 1, 234, 110, 3, 210, 2, 9, 1, 216, 249, 9, 1, 234, 110, 3, 99, + 238, 250, 60, 9, 1, 233, 62, 9, 1, 234, 110, 3, 115, 238, 250, 57, 9, 1, + 222, 249, 3, 4, 199, 230, 9, 1, 222, 249, 3, 76, 57, 9, 1, 222, 249, 3, + 115, 238, 250, 57, 9, 1, 222, 249, 3, 115, 238, 250, 60, 9, 1, 216, 31, + 3, 76, 60, 9, 1, 216, 31, 233, 195, 9, 1, 209, 235, 9, 1, 216, 31, 3, + 210, 2, 9, 1, 216, 31, 3, 115, 238, 250, 57, 9, 1, 232, 113, 239, 23, 9, + 1, 203, 73, 3, 76, 57, 9, 1, 232, 113, 3, 93, 57, 9, 1, 232, 113, 233, + 140, 9, 1, 232, 113, 233, 141, 3, 232, 213, 57, 9, 1, 203, 42, 220, 35, + 233, 140, 9, 1, 197, 118, 3, 210, 2, 9, 1, 224, 66, 214, 163, 9, 1, 214, + 163, 9, 1, 66, 9, 1, 195, 217, 9, 1, 224, 66, 195, 217, 9, 1, 197, 118, + 3, 99, 238, 250, 57, 9, 1, 199, 118, 9, 1, 235, 203, 196, 64, 9, 1, 93, + 3, 203, 135, 9, 1, 93, 3, 4, 199, 230, 9, 1, 197, 118, 3, 76, 57, 9, 1, + 69, 9, 1, 93, 3, 115, 238, 250, 60, 9, 1, 93, 249, 71, 9, 1, 93, 249, 72, + 3, 232, 213, 57, 9, 234, 216, 204, 226, 9, 1, 251, 244, 9, 4, 130, 33, + 209, 9, 3, 222, 249, 3, 151, 220, 68, 9, 4, 130, 33, 211, 152, 3, 222, + 249, 3, 151, 220, 68, 9, 4, 130, 87, 84, 20, 9, 4, 130, 222, 249, 251, + 163, 9, 4, 130, 225, 188, 9, 4, 130, 115, 238, 249, 9, 4, 130, 208, 125, + 9, 236, 221, 77, 250, 120, 9, 205, 3, 77, 209, 132, 237, 7, 232, 27, 9, + 4, 130, 209, 185, 195, 79, 9, 4, 130, 200, 31, 210, 161, 195, 79, 9, 4, + 130, 238, 251, 232, 137, 77, 224, 141, 9, 4, 130, 87, 70, 20, 9, 4, 126, + 208, 125, 9, 4, 130, 220, 108, 9, 4, 197, 117, 9, 4, 196, 64, 9, 4, 130, + 196, 64, 9, 4, 130, 216, 30, 9, 212, 148, 77, 208, 249, 9, 236, 231, 247, + 36, 126, 204, 226, 9, 236, 231, 247, 36, 130, 204, 226, 9, 209, 185, 130, + 204, 227, 3, 235, 134, 247, 35, 9, 4, 126, 219, 184, 9, 1, 240, 107, 3, + 226, 16, 199, 230, 9, 1, 210, 142, 3, 226, 16, 199, 230, 236, 78, 251, 8, + 17, 195, 79, 236, 78, 251, 8, 17, 100, 236, 78, 251, 8, 17, 102, 236, 78, + 251, 8, 17, 134, 236, 78, 251, 8, 17, 136, 236, 78, 251, 8, 17, 146, 236, + 78, 251, 8, 17, 167, 236, 78, 251, 8, 17, 178, 236, 78, 251, 8, 17, 171, + 236, 78, 251, 8, 17, 182, 9, 1, 206, 252, 3, 76, 60, 9, 1, 240, 130, 3, + 76, 60, 9, 1, 233, 225, 3, 76, 60, 9, 2, 206, 65, 251, 110, 9, 2, 206, + 65, 212, 69, 219, 163, 9, 1, 232, 113, 3, 226, 16, 199, 230, 203, 236, + 236, 221, 77, 213, 152, 203, 236, 204, 90, 234, 216, 204, 226, 203, 236, + 204, 145, 234, 216, 204, 226, 203, 236, 204, 90, 244, 167, 203, 236, 204, + 145, 244, 167, 203, 236, 231, 154, 244, 167, 203, 236, 244, 168, 206, 4, + 222, 183, 203, 236, 244, 168, 206, 4, 210, 22, 203, 236, 204, 90, 244, + 168, 206, 4, 222, 183, 203, 236, 204, 145, 244, 168, 206, 4, 210, 22, + 203, 236, 241, 122, 203, 236, 232, 170, 214, 183, 203, 236, 232, 170, + 219, 139, 203, 236, 232, 170, 250, 180, 203, 236, 252, 29, 78, 203, 236, + 1, 251, 168, 203, 236, 1, 204, 95, 251, 168, 203, 236, 1, 248, 204, 203, + 236, 1, 234, 99, 203, 236, 1, 234, 100, 234, 76, 203, 236, 1, 240, 103, + 203, 236, 1, 238, 251, 240, 104, 209, 251, 203, 236, 1, 232, 146, 203, + 236, 1, 197, 117, 203, 236, 1, 195, 106, 203, 236, 1, 232, 86, 203, 236, + 1, 202, 253, 203, 236, 1, 202, 254, 234, 76, 203, 236, 1, 195, 200, 203, + 236, 1, 195, 201, 232, 146, 203, 236, 1, 225, 4, 203, 236, 1, 222, 247, + 203, 236, 1, 219, 24, 203, 236, 1, 215, 137, 203, 236, 1, 207, 98, 203, + 236, 1, 48, 207, 98, 203, 236, 1, 69, 203, 236, 1, 213, 91, 203, 236, 1, + 210, 89, 213, 91, 203, 236, 1, 209, 5, 203, 236, 1, 211, 145, 203, 236, + 1, 209, 251, 203, 236, 1, 206, 211, 203, 236, 1, 203, 82, 203, 236, 1, + 213, 29, 248, 189, 203, 236, 1, 213, 29, 233, 222, 203, 236, 1, 213, 29, + 239, 170, 203, 236, 211, 227, 57, 203, 236, 211, 227, 60, 203, 236, 211, + 227, 237, 248, 203, 236, 195, 4, 57, 203, 236, 195, 4, 60, 203, 236, 195, + 4, 237, 248, 203, 236, 210, 185, 57, 203, 236, 210, 185, 60, 203, 236, + 237, 249, 195, 12, 231, 153, 203, 236, 237, 249, 195, 12, 251, 82, 203, + 236, 232, 151, 57, 203, 236, 232, 151, 60, 203, 236, 232, 150, 237, 248, + 203, 236, 236, 144, 57, 203, 236, 236, 144, 60, 203, 236, 209, 96, 203, + 236, 235, 169, 238, 252, 203, 236, 211, 55, 203, 236, 209, 126, 203, 236, + 99, 83, 238, 250, 57, 203, 236, 99, 83, 238, 250, 60, 203, 236, 115, 238, + 250, 57, 203, 236, 115, 238, 250, 60, 203, 236, 214, 181, 222, 75, 57, + 203, 236, 214, 181, 222, 75, 60, 203, 236, 218, 87, 203, 236, 249, 70, + 203, 236, 1, 205, 182, 195, 72, 203, 236, 1, 205, 182, 224, 134, 203, + 236, 1, 205, 182, 235, 188, 9, 1, 248, 239, 3, 115, 238, 250, 231, 103, + 60, 9, 1, 248, 239, 3, 76, 248, 226, 26, 115, 238, 250, 57, 9, 1, 248, + 239, 3, 115, 238, 250, 212, 106, 200, 24, 60, 9, 1, 248, 239, 3, 115, + 238, 250, 212, 106, 200, 24, 248, 226, 26, 99, 238, 250, 57, 9, 1, 248, + 239, 3, 99, 238, 250, 248, 226, 26, 76, 57, 9, 1, 248, 239, 3, 226, 16, + 4, 199, 231, 60, 9, 1, 248, 239, 3, 4, 199, 230, 9, 1, 168, 3, 99, 238, + 250, 57, 9, 1, 168, 3, 115, 238, 250, 212, 106, 200, 24, 60, 9, 1, 240, + 107, 3, 99, 238, 250, 199, 50, 248, 226, 26, 4, 203, 139, 9, 1, 240, 107, + 3, 226, 16, 4, 199, 231, 60, 9, 1, 210, 142, 3, 106, 9, 1, 208, 126, 3, + 235, 6, 238, 250, 57, 9, 1, 251, 194, 3, 99, 238, 250, 57, 9, 1, 251, + 194, 3, 115, 238, 250, 212, 106, 237, 230, 57, 9, 1, 251, 194, 3, 99, + 238, 250, 199, 50, 57, 9, 1, 235, 176, 3, 99, 238, 250, 60, 9, 1, 235, + 176, 3, 115, 238, 250, 212, 106, 200, 24, 60, 9, 1, 224, 191, 3, 76, 57, + 9, 1, 224, 191, 3, 115, 238, 250, 57, 9, 1, 224, 191, 3, 115, 238, 250, + 212, 106, 200, 24, 60, 9, 1, 87, 3, 76, 57, 9, 1, 87, 3, 76, 60, 9, 1, + 216, 31, 3, 99, 238, 250, 60, 9, 1, 216, 31, 3, 4, 203, 139, 9, 1, 216, + 31, 3, 4, 199, 230, 9, 1, 222, 249, 3, 154, 9, 1, 210, 142, 3, 99, 238, + 250, 199, 50, 57, 9, 1, 210, 142, 3, 232, 213, 57, 9, 1, 208, 126, 3, 99, + 238, 250, 199, 50, 57, 9, 1, 168, 3, 4, 9, 1, 203, 140, 60, 9, 1, 168, 3, + 4, 9, 1, 203, 140, 26, 99, 238, 249, 9, 1, 208, 126, 3, 4, 9, 1, 203, + 140, 26, 99, 238, 249, 9, 1, 210, 142, 3, 4, 9, 1, 203, 140, 26, 99, 238, + 249, 9, 1, 168, 3, 4, 9, 1, 203, 140, 57, 9, 1, 151, 3, 236, 78, 251, 8, + 17, 99, 57, 9, 1, 151, 3, 236, 78, 251, 8, 17, 115, 57, 9, 1, 235, 203, + 93, 3, 236, 78, 251, 8, 17, 99, 57, 9, 1, 235, 203, 93, 3, 236, 78, 251, + 8, 17, 115, 57, 9, 1, 235, 203, 93, 3, 236, 78, 251, 8, 17, 235, 6, 60, + 9, 1, 197, 118, 3, 236, 78, 251, 8, 17, 99, 57, 9, 1, 197, 118, 3, 236, + 78, 251, 8, 17, 115, 57, 9, 1, 93, 249, 72, 3, 236, 78, 251, 8, 17, 99, + 57, 9, 1, 93, 249, 72, 3, 236, 78, 251, 8, 17, 115, 57, 9, 1, 168, 3, + 236, 78, 251, 8, 17, 235, 6, 60, 9, 1, 208, 126, 3, 236, 78, 251, 8, 17, + 235, 6, 57, 9, 1, 208, 126, 3, 226, 16, 199, 230, 9, 1, 225, 35, 3, 99, + 238, 250, 57, 202, 230, 1, 232, 245, 202, 230, 1, 207, 5, 202, 230, 1, + 216, 29, 202, 230, 1, 210, 243, 202, 230, 1, 249, 142, 202, 230, 1, 222, + 118, 202, 230, 1, 225, 49, 202, 230, 1, 251, 150, 202, 230, 1, 199, 150, + 202, 230, 1, 219, 183, 202, 230, 1, 235, 236, 202, 230, 1, 239, 173, 202, + 230, 1, 202, 232, 202, 230, 1, 223, 78, 202, 230, 1, 234, 118, 202, 230, + 1, 233, 146, 202, 230, 1, 208, 124, 202, 230, 1, 240, 56, 202, 230, 1, + 195, 95, 202, 230, 1, 203, 84, 202, 230, 1, 196, 129, 202, 230, 1, 213, + 105, 202, 230, 1, 225, 197, 202, 230, 1, 245, 105, 202, 230, 1, 201, 77, + 202, 230, 1, 232, 78, 202, 230, 1, 224, 144, 202, 230, 1, 202, 231, 202, + 230, 1, 195, 113, 202, 230, 1, 206, 250, 202, 230, 1, 209, 12, 202, 230, + 1, 240, 133, 202, 230, 1, 149, 202, 230, 1, 195, 11, 202, 230, 1, 251, + 190, 202, 230, 1, 233, 223, 202, 230, 1, 211, 155, 202, 230, 1, 197, 159, + 202, 230, 252, 31, 202, 230, 252, 132, 202, 230, 230, 203, 202, 230, 237, + 52, 202, 230, 200, 107, 202, 230, 214, 100, 202, 230, 237, 62, 202, 230, + 236, 68, 202, 230, 214, 180, 202, 230, 214, 188, 202, 230, 204, 119, 202, + 230, 1, 217, 243, 216, 113, 17, 195, 79, 216, 113, 17, 100, 216, 113, 17, + 102, 216, 113, 17, 134, 216, 113, 17, 136, 216, 113, 17, 146, 216, 113, + 17, 167, 216, 113, 17, 178, 216, 113, 17, 171, 216, 113, 17, 182, 216, + 113, 1, 63, 216, 113, 1, 237, 53, 216, 113, 1, 68, 216, 113, 1, 69, 216, + 113, 1, 66, 216, 113, 1, 214, 101, 216, 113, 1, 72, 216, 113, 1, 240, + 121, 216, 113, 1, 218, 54, 216, 113, 1, 249, 144, 216, 113, 1, 161, 216, + 113, 1, 189, 216, 113, 1, 225, 213, 216, 113, 1, 247, 15, 216, 113, 1, + 240, 135, 216, 113, 1, 169, 216, 113, 1, 209, 181, 216, 113, 1, 183, 216, + 113, 1, 234, 64, 216, 113, 1, 235, 238, 216, 113, 1, 155, 216, 113, 1, + 172, 216, 113, 1, 218, 0, 197, 23, 216, 113, 1, 166, 216, 113, 1, 215, + 108, 216, 113, 1, 176, 216, 113, 1, 142, 216, 113, 1, 197, 166, 216, 113, + 1, 164, 216, 113, 1, 215, 109, 197, 23, 216, 113, 1, 225, 120, 225, 213, + 216, 113, 1, 225, 120, 247, 15, 216, 113, 1, 225, 120, 169, 216, 113, 38, + 206, 182, 130, 202, 11, 216, 113, 38, 206, 182, 126, 202, 11, 216, 113, + 38, 206, 182, 209, 250, 202, 11, 216, 113, 38, 181, 239, 193, 202, 11, + 216, 113, 38, 181, 130, 202, 11, 216, 113, 38, 181, 126, 202, 11, 216, + 113, 38, 181, 209, 250, 202, 11, 216, 113, 38, 217, 207, 78, 216, 113, + 38, 52, 76, 57, 216, 113, 130, 152, 251, 29, 216, 113, 126, 152, 251, 29, + 216, 113, 16, 214, 102, 239, 207, 216, 113, 16, 234, 63, 216, 113, 244, + 158, 216, 113, 236, 89, 78, 216, 113, 223, 51, 216, 113, 240, 82, 216, + 113, 238, 254, 55, 216, 113, 203, 116, 55, 208, 228, 1, 251, 170, 208, + 228, 1, 248, 144, 208, 228, 1, 234, 98, 208, 228, 1, 240, 105, 208, 228, + 1, 225, 224, 208, 228, 1, 249, 142, 208, 228, 1, 195, 82, 208, 228, 1, + 225, 233, 208, 228, 1, 202, 57, 208, 228, 1, 195, 181, 208, 228, 1, 225, + 50, 208, 228, 1, 223, 74, 208, 228, 1, 219, 24, 208, 228, 1, 215, 137, + 208, 228, 1, 206, 63, 208, 228, 1, 226, 85, 208, 228, 1, 235, 152, 208, + 228, 1, 201, 111, 208, 228, 1, 211, 75, 208, 228, 1, 209, 251, 208, 228, + 1, 207, 24, 208, 228, 1, 203, 161, 208, 228, 117, 226, 85, 208, 228, 117, + 226, 84, 208, 228, 117, 214, 175, 208, 228, 117, 240, 119, 208, 228, 73, + 1, 236, 178, 195, 181, 208, 228, 117, 236, 178, 195, 181, 208, 228, 18, + 2, 181, 69, 208, 228, 18, 2, 69, 208, 228, 18, 2, 214, 17, 252, 167, 208, + 228, 18, 2, 181, 252, 167, 208, 228, 18, 2, 252, 167, 208, 228, 18, 2, + 214, 17, 63, 208, 228, 18, 2, 181, 63, 208, 228, 18, 2, 63, 208, 228, 73, + 1, 206, 182, 63, 208, 228, 18, 2, 206, 182, 63, 208, 228, 18, 2, 181, 66, + 208, 228, 18, 2, 66, 208, 228, 73, 1, 68, 208, 228, 18, 2, 181, 68, 208, + 228, 18, 2, 68, 208, 228, 18, 2, 72, 208, 228, 18, 2, 204, 119, 208, 228, + 117, 217, 92, 208, 228, 211, 213, 217, 92, 208, 228, 211, 213, 251, 218, + 208, 228, 211, 213, 251, 95, 208, 228, 211, 213, 249, 48, 208, 228, 211, + 213, 250, 159, 208, 228, 211, 213, 206, 199, 208, 228, 252, 29, 78, 208, + 228, 211, 213, 219, 173, 211, 111, 208, 228, 211, 213, 195, 19, 208, 228, + 211, 213, 211, 111, 208, 228, 211, 213, 195, 112, 208, 228, 211, 213, + 201, 0, 208, 228, 211, 213, 250, 235, 208, 228, 211, 213, 205, 187, 220, + 9, 208, 228, 211, 213, 251, 76, 220, 57, 1, 232, 219, 220, 57, 1, 252, + 116, 220, 57, 1, 251, 216, 220, 57, 1, 252, 5, 220, 57, 1, 251, 208, 220, + 57, 1, 199, 251, 220, 57, 1, 250, 113, 220, 57, 1, 225, 233, 220, 57, 1, + 250, 156, 220, 57, 1, 251, 175, 220, 57, 1, 251, 180, 220, 57, 1, 251, + 172, 220, 57, 1, 251, 122, 220, 57, 1, 251, 105, 220, 57, 1, 250, 201, + 220, 57, 1, 226, 85, 220, 57, 1, 251, 45, 220, 57, 1, 250, 169, 220, 57, + 1, 251, 17, 220, 57, 1, 251, 13, 220, 57, 1, 250, 194, 220, 57, 1, 250, + 167, 220, 57, 1, 237, 174, 220, 57, 1, 225, 42, 220, 57, 1, 251, 193, + 220, 57, 251, 222, 78, 220, 57, 198, 246, 78, 220, 57, 234, 35, 78, 220, + 57, 211, 212, 203, 236, 1, 131, 217, 70, 203, 236, 1, 131, 225, 213, 203, + 236, 1, 131, 215, 108, 203, 236, 1, 131, 201, 78, 203, 236, 1, 131, 216, + 85, 203, 236, 1, 131, 216, 67, 203, 236, 1, 131, 248, 196, 203, 236, 1, + 131, 169, 203, 236, 1, 131, 222, 36, 203, 236, 1, 131, 222, 25, 203, 236, + 1, 131, 205, 80, 9, 1, 248, 239, 3, 4, 199, 231, 60, 9, 1, 248, 239, 3, + 232, 213, 57, 9, 1, 225, 189, 3, 99, 238, 250, 57, 9, 1, 203, 140, 3, 99, + 238, 250, 57, 9, 1, 235, 176, 3, 76, 248, 226, 26, 115, 238, 250, 57, 9, + 1, 211, 152, 3, 76, 60, 9, 1, 222, 249, 3, 52, 154, 9, 1, 87, 3, 115, + 238, 250, 57, 9, 1, 93, 3, 99, 238, 250, 248, 226, 26, 232, 213, 57, 9, + 1, 93, 3, 99, 238, 250, 248, 226, 26, 76, 57, 9, 1, 210, 142, 3, 221, + 224, 9, 1, 197, 118, 3, 76, 197, 38, 9, 1, 209, 214, 196, 64, 9, 1, 126, + 251, 163, 9, 1, 240, 107, 3, 115, 238, 250, 60, 9, 1, 209, 9, 3, 115, + 238, 250, 60, 9, 1, 234, 110, 3, 226, 16, 106, 9, 1, 204, 218, 197, 117, + 9, 1, 195, 107, 3, 226, 16, 199, 231, 57, 9, 1, 251, 194, 3, 115, 238, + 250, 60, 9, 1, 225, 35, 3, 76, 60, 9, 1, 248, 239, 3, 4, 87, 57, 9, 1, + 213, 72, 3, 4, 87, 57, 9, 1, 203, 42, 3, 4, 203, 42, 57, 9, 1, 210, 142, + 3, 4, 216, 31, 57, 9, 1, 93, 3, 99, 238, 250, 248, 226, 26, 4, 216, 31, + 57, 9, 1, 251, 219, 235, 175, 9, 1, 251, 219, 211, 151, 9, 1, 251, 219, + 216, 30, 9, 4, 126, 197, 117, 9, 4, 130, 197, 9, 251, 10, 9, 4, 130, 209, + 8, 9, 4, 130, 251, 193, 9, 4, 130, 211, 151, 9, 4, 130, 216, 31, 3, 224, + 237, 9, 4, 126, 216, 31, 3, 224, 237, 9, 4, 130, 197, 9, 250, 166, 9, 4, + 130, 197, 9, 250, 200, 9, 4, 130, 197, 9, 251, 104, 9, 4, 130, 197, 9, + 208, 243, 9, 4, 130, 197, 9, 211, 115, 9, 4, 130, 197, 9, 197, 140, 9, 4, + 130, 235, 34, 220, 23, 9, 4, 130, 2, 209, 3, 9, 239, 70, 236, 221, 77, + 250, 120, 9, 163, 240, 95, 60, 9, 241, 17, 235, 199, 9, 241, 17, 240, 94, + 9, 241, 17, 224, 237, 9, 241, 17, 235, 197, 9, 241, 17, 240, 92, 9, 241, + 17, 224, 235, 9, 152, 97, 76, 57, 9, 152, 99, 238, 250, 57, 9, 152, 221, + 225, 57, 9, 152, 97, 76, 60, 9, 152, 99, 238, 250, 60, 9, 152, 221, 225, + 60, 9, 192, 235, 197, 9, 192, 240, 92, 9, 192, 224, 235, 9, 4, 130, 197, + 117, 9, 235, 200, 3, 210, 2, 9, 235, 200, 3, 76, 57, 9, 224, 238, 3, 76, + 60, 9, 50, 250, 217, 57, 9, 53, 250, 217, 57, 9, 50, 250, 217, 60, 9, 53, + 250, 217, 60, 9, 52, 53, 250, 217, 57, 9, 52, 53, 250, 217, 90, 3, 238, + 252, 9, 53, 250, 217, 90, 3, 238, 252, 9, 240, 95, 3, 238, 252, 9, 117, + 206, 96, 216, 31, 233, 195, 101, 2, 226, 16, 247, 132, 101, 2, 247, 132, + 101, 2, 251, 50, 101, 2, 199, 2, 101, 1, 206, 182, 63, 101, 1, 63, 101, + 1, 252, 167, 101, 1, 68, 101, 1, 226, 119, 101, 1, 66, 101, 1, 199, 245, + 101, 1, 110, 144, 101, 1, 110, 159, 101, 1, 247, 135, 69, 101, 1, 206, + 182, 69, 101, 1, 69, 101, 1, 251, 199, 101, 1, 247, 135, 72, 101, 1, 206, + 182, 72, 101, 1, 72, 101, 1, 250, 149, 101, 1, 155, 101, 1, 224, 145, + 101, 1, 234, 122, 101, 1, 233, 229, 101, 1, 217, 70, 101, 1, 247, 173, + 101, 1, 247, 15, 101, 1, 225, 213, 101, 1, 225, 179, 101, 1, 215, 108, + 101, 1, 201, 78, 101, 1, 201, 66, 101, 1, 240, 40, 101, 1, 240, 24, 101, + 1, 216, 85, 101, 1, 189, 101, 1, 202, 233, 101, 1, 240, 135, 101, 1, 239, + 175, 101, 1, 176, 101, 1, 216, 67, 101, 1, 161, 101, 1, 213, 5, 101, 1, + 249, 144, 101, 1, 248, 196, 101, 1, 166, 101, 1, 164, 101, 1, 169, 101, + 1, 209, 181, 101, 1, 172, 101, 1, 222, 36, 101, 1, 222, 25, 101, 1, 199, + 152, 101, 1, 207, 50, 101, 1, 205, 80, 101, 1, 183, 101, 1, 142, 101, 18, + 2, 214, 163, 101, 18, 2, 214, 99, 101, 2, 215, 148, 101, 2, 250, 131, + 101, 18, 2, 252, 167, 101, 18, 2, 68, 101, 18, 2, 226, 119, 101, 18, 2, + 66, 101, 18, 2, 199, 245, 101, 18, 2, 110, 144, 101, 18, 2, 110, 209, + 182, 101, 18, 2, 247, 135, 69, 101, 18, 2, 206, 182, 69, 101, 18, 2, 69, + 101, 18, 2, 251, 199, 101, 18, 2, 247, 135, 72, 101, 18, 2, 206, 182, 72, + 101, 18, 2, 72, 101, 18, 2, 250, 149, 101, 2, 199, 7, 101, 18, 2, 212, + 10, 69, 101, 18, 2, 250, 126, 101, 214, 126, 101, 204, 206, 2, 200, 101, + 101, 204, 206, 2, 251, 52, 101, 233, 100, 252, 21, 101, 252, 9, 252, 21, + 101, 18, 2, 247, 135, 181, 69, 101, 18, 2, 200, 99, 101, 18, 2, 199, 244, + 101, 1, 211, 158, 101, 1, 224, 126, 101, 1, 233, 204, 101, 1, 195, 115, + 101, 1, 240, 29, 101, 1, 210, 77, 101, 1, 235, 238, 101, 1, 195, 167, + 101, 1, 110, 209, 182, 101, 1, 110, 222, 37, 101, 18, 2, 110, 159, 101, + 18, 2, 110, 222, 37, 101, 240, 87, 101, 52, 240, 87, 101, 17, 195, 79, + 101, 17, 100, 101, 17, 102, 101, 17, 134, 101, 17, 136, 101, 17, 146, + 101, 17, 167, 101, 17, 178, 101, 17, 171, 101, 17, 182, 101, 252, 29, 55, + 101, 2, 130, 205, 147, 238, 252, 101, 1, 247, 135, 63, 101, 1, 214, 163, + 101, 1, 214, 99, 101, 1, 250, 126, 101, 1, 200, 99, 101, 1, 199, 244, + 101, 1, 220, 15, 240, 40, 101, 1, 195, 74, 101, 1, 85, 164, 101, 1, 234, + 9, 101, 1, 225, 157, 101, 1, 233, 151, 204, 226, 101, 1, 240, 30, 101, 1, + 249, 44, 248, 218, 251, 79, 248, 218, 2, 247, 132, 248, 218, 2, 251, 50, + 248, 218, 2, 199, 2, 248, 218, 1, 63, 248, 218, 1, 252, 167, 248, 218, 1, + 68, 248, 218, 1, 226, 119, 248, 218, 1, 66, 248, 218, 1, 199, 245, 248, + 218, 1, 110, 144, 248, 218, 1, 110, 159, 248, 218, 1, 69, 248, 218, 1, + 251, 199, 248, 218, 1, 72, 248, 218, 1, 250, 149, 248, 218, 1, 155, 248, + 218, 1, 224, 145, 248, 218, 1, 234, 122, 248, 218, 1, 233, 229, 248, 218, + 1, 217, 70, 248, 218, 1, 247, 173, 248, 218, 1, 247, 15, 248, 218, 1, + 225, 213, 248, 218, 1, 225, 179, 248, 218, 1, 215, 108, 248, 218, 1, 201, + 78, 248, 218, 1, 201, 66, 248, 218, 1, 240, 40, 248, 218, 1, 240, 24, + 248, 218, 1, 216, 85, 248, 218, 1, 189, 248, 218, 1, 202, 233, 248, 218, + 1, 240, 135, 248, 218, 1, 239, 175, 248, 218, 1, 176, 248, 218, 1, 161, + 248, 218, 1, 213, 5, 248, 218, 1, 249, 144, 248, 218, 1, 248, 196, 248, + 218, 1, 166, 248, 218, 1, 164, 248, 218, 1, 169, 248, 218, 1, 172, 248, + 218, 1, 207, 50, 248, 218, 1, 205, 80, 248, 218, 1, 183, 248, 218, 1, + 142, 248, 218, 2, 215, 148, 248, 218, 2, 250, 131, 248, 218, 18, 2, 252, + 167, 248, 218, 18, 2, 68, 248, 218, 18, 2, 226, 119, 248, 218, 18, 2, 66, + 248, 218, 18, 2, 199, 245, 248, 218, 18, 2, 110, 144, 248, 218, 18, 2, + 110, 209, 182, 248, 218, 18, 2, 69, 248, 218, 18, 2, 251, 199, 248, 218, + 18, 2, 72, 248, 218, 18, 2, 250, 149, 248, 218, 2, 199, 7, 248, 218, 1, + 224, 136, 189, 248, 218, 250, 150, 222, 157, 78, 248, 218, 1, 209, 181, + 248, 218, 1, 210, 77, 248, 218, 1, 195, 167, 248, 218, 1, 110, 209, 182, + 248, 218, 1, 110, 222, 37, 248, 218, 18, 2, 110, 159, 248, 218, 18, 2, + 110, 222, 37, 248, 218, 17, 195, 79, 248, 218, 17, 100, 248, 218, 17, + 102, 248, 218, 17, 134, 248, 218, 17, 136, 248, 218, 17, 146, 248, 218, + 17, 167, 248, 218, 17, 178, 248, 218, 17, 171, 248, 218, 17, 182, 248, + 218, 1, 210, 251, 3, 112, 239, 145, 248, 218, 1, 210, 251, 3, 221, 202, + 239, 145, 248, 218, 209, 108, 78, 248, 218, 209, 108, 55, 248, 218, 241, + 16, 215, 140, 100, 248, 218, 241, 16, 215, 140, 102, 248, 218, 241, 16, + 215, 140, 134, 248, 218, 241, 16, 215, 140, 136, 248, 218, 241, 16, 215, + 140, 97, 222, 140, 202, 223, 202, 218, 239, 205, 248, 218, 241, 16, 239, + 206, 206, 23, 248, 218, 225, 234, 248, 218, 234, 89, 78, 248, 218, 1, + 199, 115, 251, 50, 248, 218, 252, 29, 55, 248, 218, 208, 215, 78, 233, + 41, 2, 252, 4, 248, 162, 233, 41, 2, 248, 162, 233, 41, 2, 199, 2, 233, + 41, 1, 63, 233, 41, 1, 252, 167, 233, 41, 1, 68, 233, 41, 1, 226, 119, + 233, 41, 1, 66, 233, 41, 1, 199, 245, 233, 41, 1, 237, 53, 233, 41, 1, + 251, 199, 233, 41, 1, 214, 101, 233, 41, 1, 250, 149, 233, 41, 1, 155, + 233, 41, 1, 224, 145, 233, 41, 1, 234, 122, 233, 41, 1, 233, 229, 233, + 41, 1, 217, 70, 233, 41, 1, 247, 173, 233, 41, 1, 247, 15, 233, 41, 1, + 225, 213, 233, 41, 1, 225, 179, 233, 41, 1, 215, 108, 233, 41, 1, 201, + 78, 233, 41, 1, 201, 66, 233, 41, 1, 240, 40, 233, 41, 1, 240, 24, 233, + 41, 1, 216, 85, 233, 41, 1, 189, 233, 41, 1, 202, 233, 233, 41, 1, 240, + 135, 233, 41, 1, 239, 175, 233, 41, 1, 176, 233, 41, 1, 161, 233, 41, 1, + 213, 5, 233, 41, 1, 249, 144, 233, 41, 1, 248, 196, 233, 41, 1, 166, 233, + 41, 1, 164, 233, 41, 1, 169, 233, 41, 1, 172, 233, 41, 1, 222, 36, 233, + 41, 1, 199, 152, 233, 41, 1, 207, 50, 233, 41, 1, 183, 233, 41, 1, 142, + 233, 41, 2, 215, 148, 233, 41, 18, 2, 252, 167, 233, 41, 18, 2, 68, 233, + 41, 18, 2, 226, 119, 233, 41, 18, 2, 66, 233, 41, 18, 2, 199, 245, 233, + 41, 18, 2, 237, 53, 233, 41, 18, 2, 251, 199, 233, 41, 18, 2, 214, 101, + 233, 41, 18, 2, 250, 149, 233, 41, 2, 199, 7, 233, 41, 2, 200, 103, 233, + 41, 1, 224, 126, 233, 41, 1, 233, 204, 233, 41, 1, 195, 115, 233, 41, 1, + 209, 181, 233, 41, 1, 235, 238, 233, 41, 17, 195, 79, 233, 41, 17, 100, + 233, 41, 17, 102, 233, 41, 17, 134, 233, 41, 17, 136, 233, 41, 17, 146, + 233, 41, 17, 167, 233, 41, 17, 178, 233, 41, 17, 171, 233, 41, 17, 182, + 233, 41, 202, 65, 233, 41, 252, 3, 233, 41, 225, 254, 233, 41, 200, 17, + 233, 41, 237, 14, 214, 106, 233, 41, 2, 196, 104, 233, 41, 252, 29, 55, + 233, 57, 2, 247, 132, 233, 57, 2, 251, 50, 233, 57, 2, 199, 2, 233, 57, + 1, 63, 233, 57, 1, 252, 167, 233, 57, 1, 68, 233, 57, 1, 226, 119, 233, + 57, 1, 66, 233, 57, 1, 199, 245, 233, 57, 1, 110, 144, 233, 57, 1, 110, + 159, 233, 57, 18, 247, 135, 69, 233, 57, 1, 69, 233, 57, 1, 251, 199, + 233, 57, 18, 247, 135, 72, 233, 57, 1, 72, 233, 57, 1, 250, 149, 233, 57, + 1, 155, 233, 57, 1, 224, 145, 233, 57, 1, 234, 122, 233, 57, 1, 233, 229, + 233, 57, 1, 217, 70, 233, 57, 1, 247, 173, 233, 57, 1, 247, 15, 233, 57, + 1, 225, 213, 233, 57, 1, 225, 179, 233, 57, 1, 215, 108, 233, 57, 1, 201, + 78, 233, 57, 1, 201, 66, 233, 57, 1, 240, 40, 233, 57, 1, 240, 24, 233, + 57, 1, 216, 85, 233, 57, 1, 189, 233, 57, 1, 202, 233, 233, 57, 1, 240, + 135, 233, 57, 1, 239, 175, 233, 57, 1, 176, 233, 57, 1, 161, 233, 57, 1, + 213, 5, 233, 57, 1, 249, 144, 233, 57, 1, 248, 196, 233, 57, 1, 166, 233, + 57, 1, 164, 233, 57, 1, 169, 233, 57, 1, 172, 233, 57, 1, 222, 36, 233, + 57, 1, 199, 152, 233, 57, 1, 207, 50, 233, 57, 1, 205, 80, 233, 57, 1, + 183, 233, 57, 1, 142, 233, 57, 2, 215, 148, 233, 57, 2, 250, 131, 233, + 57, 18, 2, 252, 167, 233, 57, 18, 2, 68, 233, 57, 18, 2, 226, 119, 233, + 57, 18, 2, 66, 233, 57, 18, 2, 199, 245, 233, 57, 18, 2, 110, 144, 233, + 57, 18, 2, 110, 209, 182, 233, 57, 18, 2, 247, 135, 69, 233, 57, 18, 2, + 69, 233, 57, 18, 2, 251, 199, 233, 57, 18, 2, 247, 135, 72, 233, 57, 18, + 2, 72, 233, 57, 18, 2, 250, 149, 233, 57, 2, 199, 7, 233, 57, 214, 126, + 233, 57, 1, 110, 209, 182, 233, 57, 1, 110, 222, 37, 233, 57, 18, 2, 110, + 159, 233, 57, 18, 2, 110, 222, 37, 233, 57, 17, 195, 79, 233, 57, 17, + 100, 233, 57, 17, 102, 233, 57, 17, 134, 233, 57, 17, 136, 233, 57, 17, + 146, 233, 57, 17, 167, 233, 57, 17, 178, 233, 57, 17, 171, 233, 57, 17, + 182, 233, 57, 252, 29, 55, 233, 57, 209, 108, 55, 233, 57, 1, 195, 74, + 233, 57, 2, 204, 119, 233, 57, 2, 207, 40, 233, 57, 2, 220, 106, 233, 57, + 2, 202, 153, 215, 149, 57, 233, 57, 2, 244, 249, 215, 149, 57, 233, 57, + 2, 200, 217, 215, 149, 57, 214, 61, 2, 247, 132, 214, 61, 2, 251, 50, + 214, 61, 2, 199, 2, 214, 61, 1, 63, 214, 61, 1, 252, 167, 214, 61, 1, 68, + 214, 61, 1, 226, 119, 214, 61, 1, 66, 214, 61, 1, 199, 245, 214, 61, 1, + 110, 144, 214, 61, 1, 110, 159, 214, 61, 1, 69, 214, 61, 1, 251, 199, + 214, 61, 1, 72, 214, 61, 1, 250, 149, 214, 61, 1, 155, 214, 61, 1, 224, + 145, 214, 61, 1, 234, 122, 214, 61, 1, 233, 229, 214, 61, 1, 217, 70, + 214, 61, 1, 247, 173, 214, 61, 1, 247, 15, 214, 61, 1, 225, 213, 214, 61, + 1, 225, 179, 214, 61, 1, 215, 108, 214, 61, 1, 201, 78, 214, 61, 1, 201, + 66, 214, 61, 1, 240, 40, 214, 61, 1, 240, 24, 214, 61, 1, 216, 85, 214, + 61, 1, 189, 214, 61, 1, 202, 233, 214, 61, 1, 240, 135, 214, 61, 1, 239, + 175, 214, 61, 1, 176, 214, 61, 1, 161, 214, 61, 1, 213, 5, 214, 61, 1, + 249, 144, 214, 61, 1, 248, 196, 214, 61, 1, 166, 214, 61, 1, 164, 214, + 61, 1, 169, 214, 61, 1, 172, 214, 61, 1, 222, 36, 214, 61, 1, 199, 152, + 214, 61, 1, 207, 50, 214, 61, 1, 205, 80, 214, 61, 1, 183, 214, 61, 1, + 142, 214, 61, 2, 215, 148, 214, 61, 2, 250, 131, 214, 61, 18, 2, 252, + 167, 214, 61, 18, 2, 68, 214, 61, 18, 2, 226, 119, 214, 61, 18, 2, 66, + 214, 61, 18, 2, 199, 245, 214, 61, 18, 2, 110, 144, 214, 61, 18, 2, 110, + 209, 182, 214, 61, 18, 2, 69, 214, 61, 18, 2, 251, 199, 214, 61, 18, 2, + 72, 214, 61, 18, 2, 250, 149, 214, 61, 2, 199, 7, 214, 61, 251, 200, 222, + 157, 78, 214, 61, 250, 150, 222, 157, 78, 214, 61, 1, 209, 181, 214, 61, + 1, 210, 77, 214, 61, 1, 195, 167, 214, 61, 1, 110, 209, 182, 214, 61, 1, + 110, 222, 37, 214, 61, 18, 2, 110, 159, 214, 61, 18, 2, 110, 222, 37, + 214, 61, 17, 195, 79, 214, 61, 17, 100, 214, 61, 17, 102, 214, 61, 17, + 134, 214, 61, 17, 136, 214, 61, 17, 146, 214, 61, 17, 167, 214, 61, 17, + 178, 214, 61, 17, 171, 214, 61, 17, 182, 214, 61, 225, 234, 214, 61, 1, + 197, 166, 214, 61, 191, 97, 211, 86, 214, 61, 191, 97, 232, 224, 214, 61, + 191, 115, 211, 84, 214, 61, 191, 97, 206, 21, 214, 61, 191, 97, 237, 25, + 214, 61, 191, 115, 206, 18, 42, 2, 251, 50, 42, 2, 199, 2, 42, 1, 63, 42, + 1, 252, 167, 42, 1, 68, 42, 1, 226, 119, 42, 1, 66, 42, 1, 199, 245, 42, + 1, 69, 42, 1, 237, 53, 42, 1, 251, 199, 42, 1, 72, 42, 1, 214, 101, 42, + 1, 250, 149, 42, 1, 155, 42, 1, 217, 70, 42, 1, 247, 173, 42, 1, 225, + 213, 42, 1, 215, 108, 42, 1, 201, 78, 42, 1, 216, 85, 42, 1, 189, 42, 1, + 176, 42, 1, 216, 67, 42, 1, 161, 42, 1, 166, 42, 1, 164, 42, 1, 169, 42, + 1, 209, 181, 42, 1, 172, 42, 1, 222, 36, 42, 1, 222, 25, 42, 1, 199, 152, + 42, 1, 207, 50, 42, 1, 205, 80, 42, 1, 183, 42, 1, 142, 42, 18, 2, 252, + 167, 42, 18, 2, 68, 42, 18, 2, 226, 119, 42, 18, 2, 66, 42, 18, 2, 199, + 245, 42, 18, 2, 69, 42, 18, 2, 237, 53, 42, 18, 2, 251, 199, 42, 18, 2, + 72, 42, 18, 2, 214, 101, 42, 18, 2, 250, 149, 42, 2, 199, 7, 42, 214, + 126, 42, 250, 150, 222, 157, 78, 42, 17, 195, 79, 42, 17, 100, 42, 17, + 102, 42, 17, 134, 42, 17, 136, 42, 17, 146, 42, 17, 167, 42, 17, 178, 42, + 17, 171, 42, 17, 182, 42, 31, 203, 23, 42, 31, 97, 231, 56, 42, 31, 97, + 170, 42, 240, 53, 55, 42, 218, 197, 55, 42, 196, 67, 55, 42, 239, 247, + 55, 42, 241, 73, 55, 42, 250, 202, 90, 55, 42, 209, 108, 55, 42, 31, 55, + 194, 194, 2, 38, 247, 133, 57, 194, 194, 2, 247, 132, 194, 194, 2, 251, + 50, 194, 194, 2, 199, 2, 194, 194, 2, 38, 251, 51, 57, 194, 194, 1, 63, + 194, 194, 1, 252, 167, 194, 194, 1, 68, 194, 194, 1, 226, 119, 194, 194, + 1, 66, 194, 194, 1, 199, 245, 194, 194, 1, 110, 144, 194, 194, 1, 110, + 159, 194, 194, 1, 69, 194, 194, 1, 237, 53, 194, 194, 1, 251, 199, 194, + 194, 1, 72, 194, 194, 1, 214, 101, 194, 194, 1, 250, 149, 194, 194, 1, + 155, 194, 194, 1, 224, 145, 194, 194, 1, 234, 122, 194, 194, 1, 233, 229, + 194, 194, 1, 217, 70, 194, 194, 1, 247, 173, 194, 194, 1, 247, 15, 194, + 194, 1, 225, 213, 194, 194, 1, 225, 179, 194, 194, 1, 215, 108, 194, 194, + 1, 201, 78, 194, 194, 1, 201, 66, 194, 194, 1, 240, 40, 194, 194, 1, 240, + 24, 194, 194, 1, 216, 85, 194, 194, 1, 189, 194, 194, 1, 202, 233, 194, + 194, 1, 240, 135, 194, 194, 1, 239, 175, 194, 194, 1, 176, 194, 194, 1, + 161, 194, 194, 1, 213, 5, 194, 194, 1, 249, 144, 194, 194, 1, 248, 196, + 194, 194, 1, 166, 194, 194, 1, 164, 194, 194, 1, 169, 194, 194, 1, 209, + 181, 194, 194, 1, 172, 194, 194, 1, 222, 36, 194, 194, 1, 222, 25, 194, + 194, 1, 199, 152, 194, 194, 1, 207, 50, 194, 194, 1, 205, 80, 194, 194, + 1, 183, 194, 194, 1, 142, 194, 194, 2, 250, 131, 194, 194, 18, 2, 252, + 167, 194, 194, 18, 2, 68, 194, 194, 18, 2, 226, 119, 194, 194, 18, 2, 66, + 194, 194, 18, 2, 199, 245, 194, 194, 18, 2, 110, 144, 194, 194, 18, 2, + 110, 209, 182, 194, 194, 18, 2, 69, 194, 194, 18, 2, 237, 53, 194, 194, + 18, 2, 251, 199, 194, 194, 18, 2, 72, 194, 194, 18, 2, 214, 101, 194, + 194, 18, 2, 250, 149, 194, 194, 2, 199, 7, 194, 194, 222, 157, 78, 194, + 194, 251, 200, 222, 157, 78, 194, 194, 1, 201, 113, 194, 194, 1, 237, + 155, 194, 194, 1, 209, 162, 194, 194, 1, 110, 209, 182, 194, 194, 1, 110, + 222, 37, 194, 194, 18, 2, 110, 159, 194, 194, 18, 2, 110, 222, 37, 194, + 194, 17, 195, 79, 194, 194, 17, 100, 194, 194, 17, 102, 194, 194, 17, + 134, 194, 194, 17, 136, 194, 194, 17, 146, 194, 194, 17, 167, 194, 194, + 17, 178, 194, 194, 17, 171, 194, 194, 17, 182, 194, 194, 2, 206, 100, + 194, 194, 191, 17, 195, 80, 36, 214, 167, 212, 56, 77, 136, 194, 194, + 191, 17, 97, 36, 214, 167, 212, 56, 77, 136, 194, 194, 191, 17, 99, 36, + 214, 167, 212, 56, 77, 136, 194, 194, 191, 17, 115, 36, 214, 167, 212, + 56, 77, 136, 194, 194, 191, 17, 97, 36, 236, 102, 212, 56, 77, 136, 194, + 194, 191, 17, 99, 36, 236, 102, 212, 56, 77, 136, 194, 194, 191, 17, 115, + 36, 236, 102, 212, 56, 77, 136, 194, 194, 2, 200, 250, 225, 10, 2, 205, + 147, 247, 132, 225, 10, 2, 247, 132, 225, 10, 2, 251, 50, 225, 10, 2, + 199, 2, 225, 10, 2, 206, 100, 225, 10, 1, 63, 225, 10, 1, 252, 167, 225, + 10, 1, 68, 225, 10, 1, 226, 119, 225, 10, 1, 66, 225, 10, 1, 199, 245, + 225, 10, 1, 110, 144, 225, 10, 1, 110, 159, 225, 10, 1, 69, 225, 10, 1, + 237, 53, 225, 10, 1, 251, 199, 225, 10, 1, 72, 225, 10, 1, 214, 101, 225, + 10, 1, 250, 149, 225, 10, 1, 155, 225, 10, 1, 224, 145, 225, 10, 1, 234, + 122, 225, 10, 1, 233, 229, 225, 10, 1, 217, 70, 225, 10, 1, 247, 173, + 225, 10, 1, 247, 15, 225, 10, 1, 225, 213, 225, 10, 1, 225, 179, 225, 10, + 1, 215, 108, 225, 10, 1, 201, 78, 225, 10, 1, 201, 66, 225, 10, 1, 240, + 40, 225, 10, 1, 240, 24, 225, 10, 1, 216, 85, 225, 10, 1, 189, 225, 10, + 1, 202, 233, 225, 10, 1, 240, 135, 225, 10, 1, 239, 175, 225, 10, 1, 176, + 225, 10, 1, 161, 225, 10, 1, 213, 5, 225, 10, 1, 249, 144, 225, 10, 1, + 248, 196, 225, 10, 1, 166, 225, 10, 1, 164, 225, 10, 1, 169, 225, 10, 1, + 209, 181, 225, 10, 1, 172, 225, 10, 1, 222, 36, 225, 10, 1, 199, 152, + 225, 10, 1, 207, 50, 225, 10, 1, 205, 80, 225, 10, 1, 183, 225, 10, 1, + 142, 225, 10, 2, 215, 148, 225, 10, 2, 250, 131, 225, 10, 18, 2, 252, + 167, 225, 10, 18, 2, 68, 225, 10, 18, 2, 226, 119, 225, 10, 18, 2, 66, + 225, 10, 18, 2, 199, 245, 225, 10, 18, 2, 110, 144, 225, 10, 18, 2, 110, + 209, 182, 225, 10, 18, 2, 69, 225, 10, 18, 2, 237, 53, 225, 10, 18, 2, + 251, 199, 225, 10, 18, 2, 72, 225, 10, 18, 2, 214, 101, 225, 10, 18, 2, + 250, 149, 225, 10, 2, 199, 7, 225, 10, 222, 157, 78, 225, 10, 251, 200, + 222, 157, 78, 225, 10, 1, 235, 238, 225, 10, 1, 110, 209, 182, 225, 10, + 1, 110, 222, 37, 225, 10, 18, 2, 110, 159, 225, 10, 18, 2, 110, 222, 37, + 225, 10, 17, 195, 79, 225, 10, 17, 100, 225, 10, 17, 102, 225, 10, 17, + 134, 225, 10, 17, 136, 225, 10, 17, 146, 225, 10, 17, 167, 225, 10, 17, + 178, 225, 10, 17, 171, 225, 10, 17, 182, 225, 10, 2, 225, 164, 225, 10, + 2, 200, 34, 131, 2, 38, 251, 51, 57, 131, 2, 247, 132, 131, 2, 251, 50, + 131, 2, 199, 2, 131, 1, 63, 131, 1, 252, 167, 131, 1, 68, 131, 1, 226, + 119, 131, 1, 66, 131, 1, 199, 245, 131, 1, 110, 144, 131, 1, 110, 159, + 131, 1, 69, 131, 1, 237, 53, 131, 1, 251, 199, 131, 1, 72, 131, 1, 214, + 101, 131, 1, 250, 149, 131, 1, 155, 131, 1, 224, 145, 131, 1, 234, 122, + 131, 1, 233, 229, 131, 1, 217, 70, 131, 1, 247, 173, 131, 1, 247, 15, + 131, 1, 225, 213, 131, 1, 225, 179, 131, 1, 215, 108, 131, 1, 201, 78, + 131, 1, 201, 66, 131, 1, 240, 40, 131, 1, 240, 24, 131, 1, 216, 85, 131, + 1, 189, 131, 1, 202, 233, 131, 1, 240, 135, 131, 1, 239, 175, 131, 1, + 176, 131, 1, 216, 67, 131, 1, 161, 131, 1, 213, 5, 131, 1, 249, 144, 131, + 1, 248, 196, 131, 1, 166, 131, 1, 164, 131, 1, 169, 131, 1, 209, 181, + 131, 1, 172, 131, 1, 222, 36, 131, 1, 222, 25, 131, 1, 199, 152, 131, 1, + 207, 50, 131, 1, 205, 80, 131, 1, 183, 131, 1, 142, 131, 1, 201, 47, 131, + 2, 83, 249, 79, 199, 7, 131, 2, 244, 242, 199, 7, 131, 2, 250, 131, 131, + 18, 2, 252, 167, 131, 18, 2, 68, 131, 18, 2, 226, 119, 131, 18, 2, 66, + 131, 18, 2, 199, 245, 131, 18, 2, 110, 144, 131, 18, 2, 110, 209, 182, + 131, 18, 2, 69, 131, 18, 2, 237, 53, 131, 18, 2, 251, 199, 131, 18, 2, + 72, 131, 18, 2, 214, 101, 131, 18, 2, 250, 149, 131, 2, 199, 7, 131, 1, + 76, 210, 116, 131, 2, 213, 155, 131, 1, 245, 63, 221, 135, 131, 1, 245, + 63, 196, 148, 131, 1, 245, 63, 222, 26, 131, 250, 150, 222, 157, 78, 131, + 191, 97, 214, 114, 131, 191, 97, 235, 16, 131, 191, 115, 237, 21, 131, + 191, 97, 200, 237, 131, 191, 97, 203, 14, 131, 191, 115, 200, 236, 131, + 191, 97, 235, 147, 131, 1, 250, 250, 226, 119, 131, 1, 110, 209, 182, + 131, 1, 110, 222, 37, 131, 18, 2, 110, 159, 131, 18, 2, 110, 222, 37, + 131, 17, 195, 79, 131, 17, 100, 131, 17, 102, 131, 17, 134, 131, 17, 136, + 131, 17, 146, 131, 17, 167, 131, 17, 178, 131, 17, 171, 131, 17, 182, + 131, 31, 203, 23, 131, 31, 97, 231, 56, 131, 31, 97, 170, 131, 191, 97, + 211, 86, 131, 191, 97, 232, 224, 131, 191, 115, 211, 84, 131, 191, 97, + 206, 21, 131, 191, 97, 237, 25, 131, 191, 115, 206, 18, 131, 240, 58, 78, + 131, 1, 245, 63, 216, 86, 131, 1, 245, 63, 218, 54, 131, 1, 245, 63, 209, + 182, 131, 1, 245, 63, 159, 131, 1, 245, 63, 222, 37, 131, 1, 245, 63, + 225, 79, 153, 2, 251, 49, 153, 2, 199, 1, 153, 1, 250, 119, 153, 1, 252, + 120, 153, 1, 251, 224, 153, 1, 251, 239, 153, 1, 225, 223, 153, 1, 226, + 118, 153, 1, 199, 236, 153, 1, 199, 239, 153, 1, 225, 249, 153, 1, 225, + 250, 153, 1, 226, 104, 153, 1, 226, 106, 153, 1, 236, 69, 153, 1, 237, + 48, 153, 1, 251, 182, 153, 1, 214, 6, 153, 1, 214, 94, 153, 1, 250, 134, + 153, 1, 251, 136, 224, 213, 153, 1, 220, 87, 224, 213, 153, 1, 251, 136, + 234, 67, 153, 1, 220, 87, 234, 67, 153, 1, 225, 9, 217, 240, 153, 1, 208, + 209, 234, 67, 153, 1, 251, 136, 247, 82, 153, 1, 220, 87, 247, 82, 153, + 1, 251, 136, 225, 195, 153, 1, 220, 87, 225, 195, 153, 1, 203, 159, 217, + 240, 153, 1, 203, 159, 208, 208, 217, 241, 153, 1, 208, 209, 225, 195, + 153, 1, 251, 136, 201, 74, 153, 1, 220, 87, 201, 74, 153, 1, 251, 136, + 240, 31, 153, 1, 220, 87, 240, 31, 153, 1, 218, 83, 217, 193, 153, 1, + 208, 209, 240, 31, 153, 1, 251, 136, 203, 76, 153, 1, 220, 87, 203, 76, + 153, 1, 251, 136, 240, 51, 153, 1, 220, 87, 240, 51, 153, 1, 240, 83, + 217, 193, 153, 1, 208, 209, 240, 51, 153, 1, 251, 136, 213, 99, 153, 1, + 220, 87, 213, 99, 153, 1, 251, 136, 249, 46, 153, 1, 220, 87, 249, 46, + 153, 1, 219, 248, 153, 1, 251, 116, 249, 46, 153, 1, 196, 74, 153, 1, + 210, 189, 153, 1, 240, 83, 222, 205, 153, 1, 199, 120, 153, 1, 203, 159, + 208, 179, 153, 1, 218, 83, 208, 179, 153, 1, 240, 83, 208, 179, 153, 1, + 232, 152, 153, 1, 218, 83, 222, 205, 153, 1, 235, 190, 153, 2, 251, 171, + 153, 18, 2, 251, 234, 153, 18, 2, 224, 170, 251, 241, 153, 18, 2, 239, + 118, 251, 241, 153, 18, 2, 224, 170, 225, 246, 153, 18, 2, 239, 118, 225, + 246, 153, 18, 2, 224, 170, 213, 241, 153, 18, 2, 239, 118, 213, 241, 153, + 18, 2, 234, 111, 153, 18, 2, 223, 246, 153, 18, 2, 239, 118, 223, 246, + 153, 18, 2, 223, 248, 239, 225, 153, 18, 2, 223, 247, 232, 246, 251, 234, + 153, 18, 2, 223, 247, 232, 246, 239, 118, 251, 234, 153, 18, 2, 223, 247, + 232, 246, 234, 66, 153, 18, 2, 234, 66, 153, 222, 49, 17, 195, 79, 153, + 222, 49, 17, 100, 153, 222, 49, 17, 102, 153, 222, 49, 17, 134, 153, 222, + 49, 17, 136, 153, 222, 49, 17, 146, 153, 222, 49, 17, 167, 153, 222, 49, + 17, 178, 153, 222, 49, 17, 171, 153, 222, 49, 17, 182, 153, 18, 2, 239, + 118, 234, 111, 153, 18, 2, 239, 118, 234, 66, 153, 211, 213, 223, 164, + 202, 228, 190, 224, 11, 225, 30, 202, 228, 190, 224, 117, 224, 140, 202, + 228, 190, 224, 117, 224, 108, 202, 228, 190, 224, 117, 224, 103, 202, + 228, 190, 224, 117, 224, 113, 202, 228, 190, 224, 117, 210, 210, 202, + 228, 190, 216, 252, 216, 239, 202, 228, 190, 245, 49, 247, 4, 202, 228, + 190, 245, 49, 245, 59, 202, 228, 190, 245, 49, 247, 3, 202, 228, 190, + 205, 201, 205, 200, 202, 228, 190, 245, 49, 245, 45, 202, 228, 190, 196, + 4, 196, 11, 202, 228, 190, 239, 28, 247, 12, 202, 228, 190, 202, 30, 213, + 113, 202, 228, 190, 202, 170, 202, 222, 202, 228, 190, 202, 170, 217, + 216, 202, 228, 190, 202, 170, 212, 222, 202, 228, 190, 216, 50, 217, 100, + 202, 228, 190, 239, 28, 239, 226, 202, 228, 190, 202, 30, 203, 106, 202, + 228, 190, 202, 170, 202, 136, 202, 228, 190, 202, 170, 202, 229, 202, + 228, 190, 202, 170, 202, 165, 202, 228, 190, 216, 50, 215, 185, 202, 228, + 190, 248, 116, 249, 109, 202, 228, 190, 212, 117, 212, 149, 202, 228, + 190, 212, 234, 212, 224, 202, 228, 190, 235, 51, 235, 238, 202, 228, 190, + 212, 234, 212, 254, 202, 228, 190, 235, 51, 235, 209, 202, 228, 190, 212, + 234, 208, 223, 202, 228, 190, 218, 251, 166, 202, 228, 190, 196, 4, 196, + 105, 202, 228, 190, 209, 233, 209, 133, 202, 228, 190, 209, 140, 202, + 228, 190, 222, 7, 222, 67, 202, 228, 190, 221, 190, 202, 228, 190, 197, + 35, 197, 156, 202, 228, 190, 205, 201, 208, 239, 202, 228, 190, 205, 201, + 209, 104, 202, 228, 190, 205, 201, 204, 163, 202, 228, 190, 231, 193, + 232, 34, 202, 228, 190, 222, 7, 245, 28, 202, 228, 190, 177, 251, 96, + 202, 228, 190, 231, 193, 216, 40, 202, 228, 190, 213, 216, 202, 228, 190, + 208, 203, 63, 202, 228, 190, 220, 81, 232, 210, 202, 228, 190, 208, 203, + 252, 167, 202, 228, 190, 208, 203, 251, 122, 202, 228, 190, 208, 203, 68, + 202, 228, 190, 208, 203, 226, 119, 202, 228, 190, 208, 203, 200, 99, 202, + 228, 190, 208, 203, 200, 97, 202, 228, 190, 208, 203, 66, 202, 228, 190, + 208, 203, 199, 245, 202, 228, 190, 212, 236, 202, 228, 241, 16, 16, 249, + 110, 202, 228, 190, 208, 203, 69, 202, 228, 190, 208, 203, 251, 244, 202, + 228, 190, 208, 203, 72, 202, 228, 190, 208, 203, 251, 200, 220, 75, 202, + 228, 190, 208, 203, 251, 200, 220, 76, 202, 228, 190, 222, 252, 202, 228, + 190, 220, 72, 202, 228, 190, 220, 73, 202, 228, 190, 220, 81, 237, 13, + 202, 228, 190, 220, 81, 202, 169, 202, 228, 190, 220, 81, 201, 183, 202, + 228, 190, 220, 81, 245, 107, 202, 228, 190, 202, 220, 202, 228, 190, 216, + 186, 202, 228, 190, 196, 99, 202, 228, 190, 235, 41, 202, 228, 17, 195, + 79, 202, 228, 17, 100, 202, 228, 17, 102, 202, 228, 17, 134, 202, 228, + 17, 136, 202, 228, 17, 146, 202, 228, 17, 167, 202, 228, 17, 178, 202, + 228, 17, 171, 202, 228, 17, 182, 202, 228, 190, 251, 91, 202, 228, 190, + 224, 114, 222, 231, 1, 224, 10, 222, 231, 1, 224, 117, 204, 108, 222, + 231, 1, 224, 117, 203, 117, 222, 231, 1, 213, 209, 233, 229, 222, 231, 1, + 216, 251, 222, 231, 1, 244, 181, 222, 231, 1, 213, 209, 247, 15, 222, + 231, 1, 205, 201, 203, 117, 222, 231, 1, 213, 209, 225, 179, 222, 231, 1, + 215, 72, 222, 231, 1, 213, 209, 215, 108, 222, 231, 1, 213, 209, 201, 78, + 222, 231, 1, 213, 209, 201, 66, 222, 231, 1, 213, 209, 240, 40, 222, 231, + 1, 213, 209, 240, 24, 222, 231, 1, 213, 209, 216, 85, 222, 231, 1, 239, + 27, 222, 231, 1, 149, 222, 231, 1, 202, 170, 204, 108, 222, 231, 1, 202, + 170, 203, 117, 222, 231, 1, 213, 209, 239, 175, 222, 231, 1, 216, 49, + 222, 231, 1, 248, 115, 222, 231, 1, 212, 116, 222, 231, 1, 212, 234, 204, + 108, 222, 231, 1, 235, 51, 203, 117, 222, 231, 1, 212, 234, 203, 117, + 222, 231, 1, 235, 51, 204, 108, 222, 231, 1, 213, 209, 248, 196, 222, + 231, 1, 218, 250, 222, 231, 1, 196, 3, 222, 231, 1, 222, 7, 222, 67, 222, + 231, 1, 222, 7, 221, 222, 222, 231, 1, 197, 34, 222, 231, 1, 208, 211, + 207, 50, 222, 231, 1, 208, 211, 205, 80, 222, 231, 1, 205, 201, 204, 108, + 222, 231, 1, 231, 193, 204, 108, 222, 231, 1, 213, 209, 222, 36, 222, + 231, 1, 72, 222, 231, 1, 231, 193, 203, 117, 222, 231, 236, 246, 222, + 231, 18, 2, 63, 222, 231, 18, 2, 220, 81, 225, 16, 222, 231, 18, 2, 252, + 167, 222, 231, 18, 2, 251, 122, 222, 231, 18, 2, 68, 222, 231, 18, 2, + 226, 119, 222, 231, 18, 2, 196, 148, 222, 231, 18, 2, 195, 168, 222, 231, + 18, 2, 66, 222, 231, 18, 2, 199, 245, 222, 231, 2, 213, 209, 199, 7, 222, + 231, 18, 2, 220, 81, 223, 244, 222, 231, 207, 100, 2, 222, 6, 222, 231, + 207, 100, 2, 215, 72, 222, 231, 18, 2, 69, 222, 231, 18, 2, 237, 32, 222, + 231, 18, 2, 72, 222, 231, 18, 2, 250, 121, 222, 231, 18, 2, 251, 199, + 222, 231, 224, 11, 172, 222, 231, 152, 220, 81, 237, 13, 222, 231, 152, + 220, 81, 202, 169, 222, 231, 152, 220, 81, 202, 122, 222, 231, 152, 220, + 81, 247, 90, 222, 231, 247, 138, 78, 222, 231, 216, 195, 222, 231, 17, + 195, 79, 222, 231, 17, 100, 222, 231, 17, 102, 222, 231, 17, 134, 222, + 231, 17, 136, 222, 231, 17, 146, 222, 231, 17, 167, 222, 231, 17, 178, + 222, 231, 17, 171, 222, 231, 17, 182, 222, 231, 231, 193, 216, 49, 222, + 231, 231, 193, 218, 250, 222, 231, 1, 224, 118, 233, 143, 222, 231, 1, + 224, 118, 215, 72, 82, 5, 214, 126, 82, 117, 233, 77, 196, 16, 219, 95, + 201, 119, 63, 82, 117, 233, 77, 196, 16, 219, 95, 255, 168, 209, 237, + 249, 10, 166, 82, 117, 233, 77, 196, 16, 219, 95, 255, 168, 233, 77, 201, + 99, 166, 82, 117, 84, 196, 16, 219, 95, 219, 208, 166, 82, 117, 244, 198, + 196, 16, 219, 95, 207, 57, 166, 82, 117, 247, 110, 196, 16, 219, 95, 212, + 223, 207, 43, 166, 82, 117, 196, 16, 219, 95, 201, 99, 207, 43, 166, 82, + 117, 208, 177, 207, 42, 82, 117, 248, 23, 196, 16, 219, 94, 82, 117, 248, + 137, 206, 192, 196, 16, 219, 94, 82, 117, 226, 21, 201, 98, 82, 117, 239, + 218, 201, 99, 248, 22, 82, 117, 207, 42, 82, 117, 215, 77, 207, 42, 82, + 117, 201, 99, 207, 42, 82, 117, 215, 77, 201, 99, 207, 42, 82, 117, 210, + 5, 245, 88, 205, 97, 207, 42, 82, 117, 210, 81, 233, 111, 207, 42, 82, + 117, 247, 110, 255, 172, 209, 145, 219, 207, 181, 247, 141, 82, 117, 233, + 77, 201, 98, 82, 221, 246, 2, 247, 13, 209, 144, 82, 221, 246, 2, 222, + 119, 209, 144, 82, 250, 173, 2, 207, 53, 234, 50, 255, 173, 209, 144, 82, + 250, 173, 2, 255, 170, 161, 82, 250, 173, 2, 208, 148, 201, 93, 82, 2, + 210, 184, 239, 42, 234, 49, 82, 2, 210, 184, 239, 42, 233, 145, 82, 2, + 210, 184, 239, 42, 233, 78, 82, 2, 210, 184, 217, 236, 234, 49, 82, 2, + 210, 184, 217, 236, 233, 145, 82, 2, 210, 184, 239, 42, 210, 184, 217, + 235, 82, 17, 195, 79, 82, 17, 100, 82, 17, 102, 82, 17, 134, 82, 17, 136, + 82, 17, 146, 82, 17, 167, 82, 17, 178, 82, 17, 171, 82, 17, 182, 82, 17, + 157, 100, 82, 17, 157, 102, 82, 17, 157, 134, 82, 17, 157, 136, 82, 17, + 157, 146, 82, 17, 157, 167, 82, 17, 157, 178, 82, 17, 157, 171, 82, 17, + 157, 182, 82, 17, 157, 195, 79, 82, 117, 248, 25, 209, 144, 82, 117, 217, + 61, 247, 208, 215, 89, 195, 13, 82, 117, 247, 110, 255, 172, 209, 145, + 247, 209, 219, 40, 247, 141, 82, 117, 217, 61, 247, 208, 207, 54, 209, + 144, 82, 117, 245, 103, 219, 94, 82, 117, 201, 114, 255, 169, 82, 117, + 233, 60, 209, 145, 233, 17, 82, 117, 233, 60, 209, 145, 233, 23, 82, 117, + 251, 97, 224, 135, 233, 17, 82, 117, 251, 97, 224, 135, 233, 23, 82, 2, + 196, 91, 201, 97, 82, 2, 220, 37, 201, 97, 82, 1, 155, 82, 1, 224, 145, + 82, 1, 234, 122, 82, 1, 233, 229, 82, 1, 217, 70, 82, 1, 247, 173, 82, 1, + 247, 15, 82, 1, 225, 213, 82, 1, 215, 108, 82, 1, 201, 78, 82, 1, 201, + 66, 82, 1, 240, 40, 82, 1, 240, 24, 82, 1, 216, 85, 82, 1, 189, 82, 1, + 202, 233, 82, 1, 240, 135, 82, 1, 239, 175, 82, 1, 176, 82, 1, 161, 82, + 1, 213, 5, 82, 1, 249, 144, 82, 1, 248, 196, 82, 1, 166, 82, 1, 201, 113, + 82, 1, 201, 103, 82, 1, 237, 155, 82, 1, 237, 149, 82, 1, 197, 166, 82, + 1, 195, 74, 82, 1, 195, 115, 82, 1, 255, 175, 82, 1, 164, 82, 1, 169, 82, + 1, 172, 82, 1, 207, 50, 82, 1, 205, 80, 82, 1, 183, 82, 1, 142, 82, 1, + 63, 82, 1, 223, 200, 82, 1, 235, 96, 169, 82, 1, 224, 35, 82, 1, 209, + 181, 82, 18, 2, 252, 167, 82, 18, 2, 68, 82, 18, 2, 226, 119, 82, 18, 2, + 66, 82, 18, 2, 199, 245, 82, 18, 2, 110, 144, 82, 18, 2, 110, 209, 182, + 82, 18, 2, 110, 159, 82, 18, 2, 110, 222, 37, 82, 18, 2, 69, 82, 18, 2, + 237, 53, 82, 18, 2, 72, 82, 18, 2, 214, 101, 82, 2, 209, 243, 204, 173, + 217, 71, 209, 232, 82, 2, 209, 237, 249, 9, 82, 18, 2, 210, 89, 68, 82, + 18, 2, 210, 89, 226, 119, 82, 2, 215, 89, 195, 14, 217, 244, 240, 135, + 82, 2, 205, 215, 222, 198, 82, 117, 232, 226, 82, 117, 213, 201, 82, 2, + 222, 201, 209, 144, 82, 2, 196, 96, 209, 144, 82, 2, 222, 202, 201, 114, + 247, 141, 82, 2, 219, 210, 247, 141, 82, 2, 233, 81, 247, 142, 210, 79, + 82, 2, 233, 81, 219, 196, 210, 79, 82, 2, 226, 16, 219, 210, 247, 141, + 82, 204, 152, 2, 222, 202, 201, 114, 247, 141, 82, 204, 152, 2, 219, 210, + 247, 141, 82, 204, 152, 2, 226, 16, 219, 210, 247, 141, 82, 204, 152, 1, + 155, 82, 204, 152, 1, 224, 145, 82, 204, 152, 1, 234, 122, 82, 204, 152, + 1, 233, 229, 82, 204, 152, 1, 217, 70, 82, 204, 152, 1, 247, 173, 82, + 204, 152, 1, 247, 15, 82, 204, 152, 1, 225, 213, 82, 204, 152, 1, 215, + 108, 82, 204, 152, 1, 201, 78, 82, 204, 152, 1, 201, 66, 82, 204, 152, 1, + 240, 40, 82, 204, 152, 1, 240, 24, 82, 204, 152, 1, 216, 85, 82, 204, + 152, 1, 189, 82, 204, 152, 1, 202, 233, 82, 204, 152, 1, 240, 135, 82, + 204, 152, 1, 239, 175, 82, 204, 152, 1, 176, 82, 204, 152, 1, 161, 82, + 204, 152, 1, 213, 5, 82, 204, 152, 1, 249, 144, 82, 204, 152, 1, 248, + 196, 82, 204, 152, 1, 166, 82, 204, 152, 1, 201, 113, 82, 204, 152, 1, + 201, 103, 82, 204, 152, 1, 237, 155, 82, 204, 152, 1, 237, 149, 82, 204, + 152, 1, 197, 166, 82, 204, 152, 1, 195, 74, 82, 204, 152, 1, 195, 115, + 82, 204, 152, 1, 255, 175, 82, 204, 152, 1, 164, 82, 204, 152, 1, 169, + 82, 204, 152, 1, 172, 82, 204, 152, 1, 207, 50, 82, 204, 152, 1, 205, 80, + 82, 204, 152, 1, 183, 82, 204, 152, 1, 142, 82, 204, 152, 1, 63, 82, 204, + 152, 1, 223, 200, 82, 204, 152, 1, 235, 96, 197, 166, 82, 204, 152, 1, + 235, 96, 164, 82, 204, 152, 1, 235, 96, 169, 82, 223, 187, 209, 141, 224, + 145, 82, 223, 187, 209, 141, 224, 146, 247, 209, 219, 40, 247, 141, 82, + 247, 125, 2, 85, 248, 255, 82, 247, 125, 2, 175, 248, 255, 82, 247, 125, + 2, 247, 129, 203, 58, 82, 247, 125, 2, 208, 176, 255, 174, 82, 16, 237, + 216, 248, 20, 82, 16, 210, 183, 209, 244, 82, 16, 213, 228, 234, 48, 82, + 16, 210, 183, 209, 245, 210, 81, 233, 110, 82, 16, 212, 223, 161, 82, 16, + 216, 27, 248, 20, 82, 16, 216, 27, 248, 21, 215, 77, 255, 171, 82, 16, + 216, 27, 248, 21, 233, 79, 255, 171, 82, 16, 216, 27, 248, 21, 247, 209, + 255, 171, 82, 2, 210, 184, 217, 236, 210, 184, 239, 41, 82, 2, 210, 184, + 217, 236, 233, 78, 82, 117, 248, 24, 206, 192, 233, 192, 219, 95, 210, + 80, 82, 117, 218, 252, 196, 16, 233, 192, 219, 95, 210, 80, 82, 117, 215, + 77, 201, 98, 82, 117, 84, 248, 53, 209, 234, 196, 16, 219, 95, 219, 208, + 166, 82, 117, 244, 198, 248, 53, 209, 234, 196, 16, 219, 95, 207, 57, + 166, 210, 21, 204, 69, 55, 222, 182, 204, 69, 55, 210, 21, 204, 69, 2, 3, + 238, 249, 222, 182, 204, 69, 2, 3, 238, 249, 82, 117, 222, 193, 219, 211, + 209, 144, 82, 117, 201, 209, 219, 211, 209, 144, 75, 1, 155, 75, 1, 224, + 145, 75, 1, 234, 122, 75, 1, 233, 229, 75, 1, 217, 70, 75, 1, 247, 173, + 75, 1, 247, 15, 75, 1, 225, 213, 75, 1, 225, 179, 75, 1, 215, 108, 75, 1, + 216, 51, 75, 1, 201, 78, 75, 1, 201, 66, 75, 1, 240, 40, 75, 1, 240, 24, + 75, 1, 216, 85, 75, 1, 189, 75, 1, 202, 233, 75, 1, 240, 135, 75, 1, 239, + 175, 75, 1, 176, 75, 1, 161, 75, 1, 213, 5, 75, 1, 249, 144, 75, 1, 248, + 196, 75, 1, 166, 75, 1, 164, 75, 1, 169, 75, 1, 172, 75, 1, 197, 166, 75, + 1, 183, 75, 1, 142, 75, 1, 222, 36, 75, 1, 63, 75, 1, 207, 25, 63, 75, 1, + 68, 75, 1, 226, 119, 75, 1, 66, 75, 1, 199, 245, 75, 1, 69, 75, 1, 218, + 215, 69, 75, 1, 72, 75, 1, 250, 149, 75, 18, 2, 203, 120, 252, 167, 75, + 18, 2, 252, 167, 75, 18, 2, 68, 75, 18, 2, 226, 119, 75, 18, 2, 66, 75, + 18, 2, 199, 245, 75, 18, 2, 69, 75, 18, 2, 251, 199, 75, 18, 2, 218, 215, + 226, 119, 75, 18, 2, 218, 215, 72, 75, 18, 2, 237, 135, 57, 75, 2, 251, + 50, 75, 2, 76, 60, 75, 2, 199, 2, 75, 2, 199, 7, 75, 2, 250, 198, 75, + 108, 2, 219, 193, 164, 75, 108, 2, 219, 193, 169, 75, 108, 2, 219, 193, + 197, 166, 75, 108, 2, 219, 193, 142, 75, 1, 233, 95, 183, 75, 17, 195, + 79, 75, 17, 100, 75, 17, 102, 75, 17, 134, 75, 17, 136, 75, 17, 146, 75, + 17, 167, 75, 17, 178, 75, 17, 171, 75, 17, 182, 75, 2, 222, 46, 208, 132, + 75, 2, 208, 132, 75, 16, 221, 255, 75, 16, 244, 151, 75, 16, 251, 220, + 75, 16, 234, 28, 75, 1, 207, 50, 75, 1, 205, 80, 75, 1, 110, 144, 75, 1, + 110, 209, 182, 75, 1, 110, 159, 75, 1, 110, 222, 37, 75, 18, 2, 110, 144, + 75, 18, 2, 110, 209, 182, 75, 18, 2, 110, 159, 75, 18, 2, 110, 222, 37, + 75, 1, 218, 215, 217, 70, 75, 1, 218, 215, 225, 179, 75, 1, 218, 215, + 249, 44, 75, 1, 218, 215, 249, 39, 75, 108, 2, 218, 215, 219, 193, 176, + 75, 108, 2, 218, 215, 219, 193, 166, 75, 108, 2, 218, 215, 219, 193, 172, + 75, 1, 207, 56, 224, 247, 207, 50, 75, 18, 2, 207, 56, 224, 247, 236, + 115, 75, 152, 117, 207, 56, 224, 247, 232, 160, 75, 152, 117, 207, 56, + 224, 247, 224, 209, 212, 233, 75, 1, 197, 86, 211, 178, 224, 247, 202, + 233, 75, 1, 197, 86, 211, 178, 224, 247, 211, 184, 75, 18, 2, 197, 86, + 211, 178, 224, 247, 236, 115, 75, 18, 2, 197, 86, 211, 178, 224, 247, + 200, 99, 75, 2, 197, 86, 211, 178, 224, 247, 202, 10, 75, 2, 197, 86, + 211, 178, 224, 247, 202, 9, 75, 2, 197, 86, 211, 178, 224, 247, 202, 8, + 75, 2, 197, 86, 211, 178, 224, 247, 202, 7, 75, 2, 197, 86, 211, 178, + 224, 247, 202, 6, 75, 1, 237, 66, 211, 178, 224, 247, 216, 85, 75, 1, + 237, 66, 211, 178, 224, 247, 195, 175, 75, 1, 237, 66, 211, 178, 224, + 247, 233, 194, 75, 18, 2, 234, 43, 224, 247, 68, 75, 18, 2, 224, 214, + 214, 163, 75, 18, 2, 224, 214, 66, 75, 18, 2, 224, 214, 237, 53, 75, 1, + 207, 25, 155, 75, 1, 207, 25, 224, 145, 75, 1, 207, 25, 234, 122, 75, 1, + 207, 25, 247, 173, 75, 1, 207, 25, 195, 115, 75, 1, 207, 25, 215, 108, + 75, 1, 207, 25, 240, 135, 75, 1, 207, 25, 176, 75, 1, 207, 25, 213, 5, + 75, 1, 207, 25, 235, 238, 75, 1, 207, 25, 249, 144, 75, 1, 207, 25, 202, + 233, 75, 1, 207, 25, 142, 75, 108, 2, 207, 25, 219, 193, 197, 166, 75, + 18, 2, 207, 25, 252, 167, 75, 18, 2, 207, 25, 69, 75, 18, 2, 207, 25, + 237, 135, 57, 75, 18, 2, 207, 25, 48, 196, 148, 75, 2, 207, 25, 202, 9, + 75, 2, 207, 25, 202, 8, 75, 2, 207, 25, 202, 6, 75, 2, 207, 25, 202, 5, + 75, 2, 207, 25, 241, 90, 202, 9, 75, 2, 207, 25, 241, 90, 202, 8, 75, 2, + 207, 25, 241, 90, 236, 232, 202, 11, 75, 1, 209, 119, 213, 211, 235, 238, + 75, 2, 209, 119, 213, 211, 202, 6, 75, 207, 25, 17, 195, 79, 75, 207, 25, + 17, 100, 75, 207, 25, 17, 102, 75, 207, 25, 17, 134, 75, 207, 25, 17, + 136, 75, 207, 25, 17, 146, 75, 207, 25, 17, 167, 75, 207, 25, 17, 178, + 75, 207, 25, 17, 171, 75, 207, 25, 17, 182, 75, 2, 224, 138, 202, 10, 75, + 2, 224, 138, 202, 8, 75, 18, 2, 251, 185, 63, 75, 18, 2, 251, 185, 251, + 199, 75, 16, 207, 25, 100, 75, 16, 207, 25, 236, 88, 94, 6, 1, 251, 105, + 94, 6, 1, 249, 92, 94, 6, 1, 234, 92, 94, 6, 1, 239, 5, 94, 6, 1, 236, + 229, 94, 6, 1, 199, 16, 94, 6, 1, 195, 82, 94, 6, 1, 203, 114, 94, 6, 1, + 226, 85, 94, 6, 1, 225, 16, 94, 6, 1, 222, 221, 94, 6, 1, 220, 61, 94, 6, + 1, 217, 210, 94, 6, 1, 214, 118, 94, 6, 1, 213, 156, 94, 6, 1, 195, 70, + 94, 6, 1, 210, 228, 94, 6, 1, 208, 219, 94, 6, 1, 203, 101, 94, 6, 1, + 200, 72, 94, 6, 1, 212, 253, 94, 6, 1, 224, 133, 94, 6, 1, 233, 220, 94, + 6, 1, 211, 143, 94, 6, 1, 206, 211, 94, 6, 1, 245, 61, 94, 6, 1, 247, + 141, 94, 6, 1, 225, 161, 94, 6, 1, 244, 255, 94, 6, 1, 246, 255, 94, 6, + 1, 196, 206, 94, 6, 1, 225, 176, 94, 6, 1, 232, 241, 94, 6, 1, 232, 146, + 94, 6, 1, 232, 57, 94, 6, 1, 197, 109, 94, 6, 1, 232, 174, 94, 6, 1, 231, + 180, 94, 6, 1, 196, 5, 94, 6, 1, 251, 233, 94, 1, 251, 105, 94, 1, 249, + 92, 94, 1, 234, 92, 94, 1, 239, 5, 94, 1, 236, 229, 94, 1, 199, 16, 94, + 1, 195, 82, 94, 1, 203, 114, 94, 1, 226, 85, 94, 1, 225, 16, 94, 1, 222, + 221, 94, 1, 220, 61, 94, 1, 217, 210, 94, 1, 214, 118, 94, 1, 213, 156, + 94, 1, 195, 70, 94, 1, 210, 228, 94, 1, 208, 219, 94, 1, 203, 101, 94, 1, + 200, 72, 94, 1, 212, 253, 94, 1, 224, 133, 94, 1, 233, 220, 94, 1, 211, + 143, 94, 1, 206, 211, 94, 1, 245, 61, 94, 1, 247, 141, 94, 1, 225, 161, + 94, 1, 244, 255, 94, 1, 246, 255, 94, 1, 196, 206, 94, 1, 225, 176, 94, + 1, 232, 241, 94, 1, 232, 146, 94, 1, 232, 57, 94, 1, 197, 109, 94, 1, + 232, 174, 94, 1, 231, 180, 94, 1, 235, 152, 94, 1, 196, 5, 94, 1, 236, + 248, 94, 1, 163, 234, 92, 94, 1, 251, 193, 94, 213, 153, 207, 90, 73, 1, + 94, 217, 210, 94, 1, 251, 233, 94, 1, 232, 172, 55, 94, 1, 223, 72, 55, + 29, 137, 224, 47, 29, 137, 205, 72, 29, 137, 216, 207, 29, 137, 202, 97, + 29, 137, 205, 61, 29, 137, 210, 54, 29, 137, 219, 55, 29, 137, 212, 205, + 29, 137, 205, 69, 29, 137, 206, 52, 29, 137, 205, 66, 29, 137, 226, 142, + 29, 137, 245, 5, 29, 137, 205, 76, 29, 137, 245, 70, 29, 137, 224, 121, + 29, 137, 202, 191, 29, 137, 212, 243, 29, 137, 232, 54, 29, 137, 216, + 203, 29, 137, 205, 70, 29, 137, 216, 197, 29, 137, 216, 201, 29, 137, + 202, 94, 29, 137, 210, 42, 29, 137, 205, 68, 29, 137, 210, 52, 29, 137, + 224, 253, 29, 137, 219, 48, 29, 137, 225, 0, 29, 137, 212, 200, 29, 137, + 212, 198, 29, 137, 212, 186, 29, 137, 212, 194, 29, 137, 212, 192, 29, + 137, 212, 189, 29, 137, 212, 191, 29, 137, 212, 188, 29, 137, 212, 193, + 29, 137, 212, 203, 29, 137, 212, 204, 29, 137, 212, 187, 29, 137, 212, + 197, 29, 137, 224, 254, 29, 137, 224, 252, 29, 137, 206, 45, 29, 137, + 206, 43, 29, 137, 206, 35, 29, 137, 206, 38, 29, 137, 206, 44, 29, 137, + 206, 40, 29, 137, 206, 39, 29, 137, 206, 37, 29, 137, 206, 48, 29, 137, + 206, 50, 29, 137, 206, 51, 29, 137, 206, 46, 29, 137, 206, 36, 29, 137, + 206, 41, 29, 137, 206, 49, 29, 137, 245, 52, 29, 137, 245, 50, 29, 137, + 247, 28, 29, 137, 247, 26, 29, 137, 213, 173, 29, 137, 226, 137, 29, 137, + 226, 128, 29, 137, 226, 136, 29, 137, 226, 133, 29, 137, 226, 131, 29, + 137, 226, 135, 29, 137, 205, 73, 29, 137, 226, 140, 29, 137, 226, 141, + 29, 137, 226, 129, 29, 137, 226, 134, 29, 137, 196, 46, 29, 137, 245, 4, + 29, 137, 245, 53, 29, 137, 245, 51, 29, 137, 247, 29, 29, 137, 247, 27, + 29, 137, 245, 68, 29, 137, 245, 69, 29, 137, 245, 54, 29, 137, 247, 30, + 29, 137, 212, 241, 29, 137, 224, 255, 29, 137, 205, 74, 29, 137, 196, 52, + 29, 137, 224, 38, 29, 137, 216, 199, 29, 137, 216, 205, 29, 137, 216, + 204, 29, 137, 202, 91, 29, 137, 235, 133, 29, 225, 101, 235, 133, 29, + 225, 101, 63, 29, 225, 101, 251, 244, 29, 225, 101, 164, 29, 225, 101, + 196, 118, 29, 225, 101, 236, 191, 29, 225, 101, 69, 29, 225, 101, 196, + 56, 29, 225, 101, 196, 69, 29, 225, 101, 72, 29, 225, 101, 197, 166, 29, + 225, 101, 197, 157, 29, 225, 101, 214, 163, 29, 225, 101, 196, 3, 29, + 225, 101, 66, 29, 225, 101, 197, 91, 29, 225, 101, 197, 109, 29, 225, + 101, 197, 70, 29, 225, 101, 195, 217, 29, 225, 101, 236, 115, 29, 225, + 101, 196, 24, 29, 225, 101, 68, 29, 225, 101, 255, 163, 29, 225, 101, + 255, 162, 29, 225, 101, 196, 132, 29, 225, 101, 196, 130, 29, 225, 101, + 236, 189, 29, 225, 101, 236, 188, 29, 225, 101, 236, 190, 29, 225, 101, + 196, 55, 29, 225, 101, 196, 54, 29, 225, 101, 215, 17, 29, 225, 101, 215, + 18, 29, 225, 101, 215, 11, 29, 225, 101, 215, 16, 29, 225, 101, 215, 14, + 29, 225, 101, 195, 247, 29, 225, 101, 195, 246, 29, 225, 101, 195, 245, + 29, 225, 101, 195, 248, 29, 225, 101, 195, 249, 29, 225, 101, 200, 172, + 29, 225, 101, 200, 171, 29, 225, 101, 200, 169, 29, 225, 101, 200, 165, + 29, 225, 101, 200, 166, 29, 225, 101, 195, 212, 29, 225, 101, 195, 209, + 29, 225, 101, 195, 210, 29, 225, 101, 195, 204, 29, 225, 101, 195, 205, + 29, 225, 101, 195, 206, 29, 225, 101, 195, 208, 29, 225, 101, 236, 109, + 29, 225, 101, 236, 111, 29, 225, 101, 196, 23, 29, 225, 101, 230, 243, + 29, 225, 101, 230, 235, 29, 225, 101, 230, 238, 29, 225, 101, 230, 236, + 29, 225, 101, 230, 240, 29, 225, 101, 230, 242, 29, 225, 101, 251, 5, 29, + 225, 101, 251, 2, 29, 225, 101, 251, 0, 29, 225, 101, 251, 1, 29, 225, + 101, 205, 77, 29, 225, 101, 255, 164, 29, 225, 101, 196, 131, 29, 225, + 101, 196, 53, 29, 225, 101, 215, 13, 29, 225, 101, 215, 12, 29, 116, 224, + 47, 29, 116, 205, 72, 29, 116, 224, 40, 29, 116, 216, 207, 29, 116, 216, + 205, 29, 116, 216, 204, 29, 116, 202, 97, 29, 116, 210, 54, 29, 116, 210, + 49, 29, 116, 210, 46, 29, 116, 210, 39, 29, 116, 210, 34, 29, 116, 210, + 29, 29, 116, 210, 40, 29, 116, 210, 52, 29, 116, 219, 55, 29, 116, 212, + 205, 29, 116, 212, 194, 29, 116, 206, 52, 29, 116, 205, 66, 29, 116, 226, + 142, 29, 116, 245, 5, 29, 116, 245, 70, 29, 116, 224, 121, 29, 116, 202, + 191, 29, 116, 212, 243, 29, 116, 232, 54, 29, 116, 224, 41, 29, 116, 224, + 39, 29, 116, 216, 203, 29, 116, 216, 197, 29, 116, 216, 199, 29, 116, + 216, 202, 29, 116, 216, 198, 29, 116, 202, 94, 29, 116, 202, 91, 29, 116, + 210, 47, 29, 116, 210, 42, 29, 116, 210, 28, 29, 116, 210, 27, 29, 116, + 205, 68, 29, 116, 210, 44, 29, 116, 210, 43, 29, 116, 210, 36, 29, 116, + 210, 38, 29, 116, 210, 51, 29, 116, 210, 31, 29, 116, 210, 41, 29, 116, + 210, 50, 29, 116, 210, 26, 29, 116, 219, 51, 29, 116, 219, 46, 29, 116, + 219, 48, 29, 116, 219, 45, 29, 116, 219, 43, 29, 116, 219, 49, 29, 116, + 219, 54, 29, 116, 219, 52, 29, 116, 225, 0, 29, 116, 212, 196, 29, 116, + 212, 197, 29, 116, 212, 202, 29, 116, 224, 254, 29, 116, 206, 45, 29, + 116, 206, 35, 29, 116, 206, 38, 29, 116, 206, 40, 29, 116, 213, 173, 29, + 116, 226, 137, 29, 116, 226, 130, 29, 116, 205, 73, 29, 116, 226, 138, + 29, 116, 196, 46, 29, 116, 196, 40, 29, 116, 196, 41, 29, 116, 212, 241, + 29, 116, 224, 255, 29, 116, 232, 52, 29, 116, 232, 50, 29, 116, 232, 53, + 29, 116, 232, 51, 29, 116, 196, 52, 29, 116, 224, 43, 29, 116, 224, 42, + 29, 116, 224, 46, 29, 116, 224, 44, 29, 116, 224, 45, 29, 116, 205, 70, + 35, 5, 142, 35, 5, 231, 74, 35, 5, 232, 70, 35, 5, 232, 245, 35, 5, 232, + 117, 35, 5, 232, 146, 35, 5, 231, 192, 35, 5, 231, 183, 35, 5, 172, 35, + 5, 221, 190, 35, 5, 222, 108, 35, 5, 223, 81, 35, 5, 222, 187, 35, 5, + 222, 196, 35, 5, 222, 6, 35, 5, 221, 158, 35, 5, 232, 79, 35, 5, 232, 73, + 35, 5, 232, 75, 35, 5, 232, 78, 35, 5, 232, 76, 35, 5, 232, 77, 35, 5, + 232, 74, 35, 5, 232, 72, 35, 5, 166, 35, 5, 218, 144, 35, 5, 219, 77, 35, + 5, 220, 118, 35, 5, 219, 187, 35, 5, 219, 206, 35, 5, 218, 250, 35, 5, + 218, 71, 35, 5, 203, 227, 35, 5, 203, 221, 35, 5, 203, 223, 35, 5, 203, + 226, 35, 5, 203, 224, 35, 5, 203, 225, 35, 5, 203, 222, 35, 5, 203, 220, + 35, 5, 169, 35, 5, 209, 140, 35, 5, 210, 72, 35, 5, 210, 243, 35, 5, 210, + 154, 35, 5, 210, 182, 35, 5, 209, 232, 35, 5, 209, 98, 35, 5, 183, 35, 5, + 204, 172, 35, 5, 206, 112, 35, 5, 209, 13, 35, 5, 208, 129, 35, 5, 208, + 147, 35, 5, 205, 200, 35, 5, 204, 67, 35, 5, 207, 50, 35, 5, 206, 151, + 35, 5, 206, 223, 35, 5, 207, 45, 35, 5, 206, 253, 35, 5, 206, 255, 35, 5, + 206, 198, 35, 5, 206, 130, 35, 5, 211, 158, 35, 5, 211, 96, 35, 5, 211, + 120, 35, 5, 211, 157, 35, 5, 211, 137, 35, 5, 211, 138, 35, 5, 211, 108, + 35, 5, 211, 107, 35, 5, 211, 49, 35, 5, 211, 45, 35, 5, 211, 48, 35, 5, + 211, 46, 35, 5, 211, 47, 35, 5, 211, 134, 35, 5, 211, 126, 35, 5, 211, + 129, 35, 5, 211, 133, 35, 5, 211, 130, 35, 5, 211, 131, 35, 5, 211, 128, + 35, 5, 211, 125, 35, 5, 211, 121, 35, 5, 211, 124, 35, 5, 211, 122, 35, + 5, 211, 123, 35, 5, 249, 144, 35, 5, 248, 20, 35, 5, 248, 183, 35, 5, + 249, 142, 35, 5, 248, 250, 35, 5, 249, 8, 35, 5, 248, 115, 35, 5, 247, + 223, 35, 5, 199, 152, 35, 5, 197, 220, 35, 5, 199, 34, 35, 5, 199, 151, + 35, 5, 199, 113, 35, 5, 199, 118, 35, 5, 198, 248, 35, 5, 197, 209, 35, + 5, 189, 35, 5, 201, 40, 35, 5, 202, 122, 35, 5, 203, 162, 35, 5, 203, 48, + 35, 5, 203, 68, 35, 5, 149, 35, 5, 200, 245, 35, 5, 247, 173, 35, 5, 241, + 40, 35, 5, 245, 10, 35, 5, 247, 172, 35, 5, 247, 48, 35, 5, 247, 56, 35, + 5, 244, 181, 35, 5, 240, 253, 35, 5, 196, 208, 35, 5, 196, 177, 35, 5, + 196, 196, 35, 5, 196, 207, 35, 5, 196, 201, 35, 5, 196, 202, 35, 5, 196, + 185, 35, 5, 196, 184, 35, 5, 196, 170, 35, 5, 196, 166, 35, 5, 196, 169, + 35, 5, 196, 167, 35, 5, 196, 168, 35, 5, 176, 35, 5, 215, 185, 35, 5, + 216, 222, 35, 5, 217, 243, 35, 5, 217, 106, 35, 5, 217, 117, 35, 5, 216, + 49, 35, 5, 215, 117, 35, 5, 215, 108, 35, 5, 215, 65, 35, 5, 215, 88, 35, + 5, 215, 107, 35, 5, 215, 96, 35, 5, 215, 97, 35, 5, 215, 72, 35, 5, 215, + 55, 35, 5, 233, 151, 63, 35, 5, 233, 151, 66, 35, 5, 233, 151, 68, 35, 5, + 233, 151, 252, 167, 35, 5, 233, 151, 237, 53, 35, 5, 233, 151, 69, 35, 5, + 233, 151, 72, 35, 5, 233, 151, 197, 166, 35, 5, 155, 35, 5, 223, 186, 35, + 5, 224, 100, 35, 5, 225, 54, 35, 5, 224, 199, 35, 5, 224, 208, 35, 5, + 224, 10, 35, 5, 224, 5, 35, 5, 223, 135, 35, 5, 223, 128, 35, 5, 223, + 134, 35, 5, 223, 129, 35, 5, 223, 130, 35, 5, 223, 121, 35, 5, 223, 115, + 35, 5, 223, 117, 35, 5, 223, 120, 35, 5, 223, 118, 35, 5, 223, 119, 35, + 5, 223, 116, 35, 5, 223, 114, 35, 5, 223, 110, 35, 5, 223, 113, 35, 5, + 223, 111, 35, 5, 223, 112, 35, 5, 197, 166, 35, 5, 196, 243, 35, 5, 197, + 70, 35, 5, 197, 160, 35, 5, 197, 98, 35, 5, 197, 109, 35, 5, 197, 34, 35, + 5, 197, 26, 35, 5, 212, 252, 63, 35, 5, 212, 252, 66, 35, 5, 212, 252, + 68, 35, 5, 212, 252, 252, 167, 35, 5, 212, 252, 237, 53, 35, 5, 212, 252, + 69, 35, 5, 212, 252, 72, 35, 5, 195, 115, 35, 5, 194, 255, 35, 5, 195, + 33, 35, 5, 195, 113, 35, 5, 195, 85, 35, 5, 195, 88, 35, 5, 195, 11, 35, + 5, 194, 242, 35, 5, 195, 74, 35, 5, 195, 51, 35, 5, 195, 60, 35, 5, 195, + 73, 35, 5, 195, 64, 35, 5, 195, 65, 35, 5, 195, 57, 35, 5, 195, 42, 35, + 5, 164, 35, 5, 195, 217, 35, 5, 196, 24, 35, 5, 196, 129, 35, 5, 196, 66, + 35, 5, 196, 69, 35, 5, 196, 3, 35, 5, 195, 243, 35, 5, 240, 135, 35, 5, + 237, 200, 35, 5, 239, 151, 35, 5, 240, 134, 35, 5, 239, 236, 35, 5, 239, + 251, 35, 5, 239, 27, 35, 5, 237, 166, 35, 5, 240, 40, 35, 5, 240, 5, 35, + 5, 240, 17, 35, 5, 240, 39, 35, 5, 240, 27, 35, 5, 240, 28, 35, 5, 240, + 10, 35, 5, 239, 252, 35, 5, 225, 213, 35, 5, 225, 109, 35, 5, 225, 171, + 35, 5, 225, 212, 35, 5, 225, 190, 35, 5, 225, 192, 35, 5, 225, 128, 35, + 5, 225, 87, 35, 5, 234, 122, 35, 5, 233, 75, 35, 5, 233, 191, 35, 5, 234, + 119, 35, 5, 234, 39, 35, 5, 234, 47, 35, 5, 233, 143, 35, 5, 233, 142, + 35, 5, 233, 33, 35, 5, 233, 29, 35, 5, 233, 32, 35, 5, 233, 30, 35, 5, + 233, 31, 35, 5, 234, 9, 35, 5, 233, 245, 35, 5, 233, 255, 35, 5, 234, 8, + 35, 5, 234, 3, 35, 5, 234, 4, 35, 5, 233, 249, 35, 5, 233, 234, 35, 5, + 202, 233, 35, 5, 202, 142, 35, 5, 202, 195, 35, 5, 202, 232, 35, 5, 202, + 215, 35, 5, 202, 217, 35, 5, 202, 169, 35, 5, 202, 133, 35, 5, 247, 15, + 35, 5, 245, 29, 35, 5, 245, 74, 35, 5, 247, 14, 35, 5, 245, 98, 35, 5, + 245, 102, 35, 5, 245, 48, 35, 5, 245, 18, 35, 5, 213, 5, 35, 5, 212, 225, + 35, 5, 212, 245, 35, 5, 213, 4, 35, 5, 212, 247, 35, 5, 212, 248, 35, 5, + 212, 233, 35, 5, 212, 221, 35, 5, 201, 113, 35, 5, 201, 86, 35, 5, 201, + 92, 35, 5, 201, 112, 35, 5, 201, 106, 35, 5, 201, 107, 35, 5, 201, 90, + 35, 5, 201, 84, 35, 5, 200, 186, 35, 5, 200, 178, 35, 5, 200, 182, 35, 5, + 200, 185, 35, 5, 200, 183, 35, 5, 200, 184, 35, 5, 200, 180, 35, 5, 200, + 179, 35, 5, 235, 238, 35, 5, 234, 222, 35, 5, 235, 152, 35, 5, 235, 237, + 35, 5, 235, 181, 35, 5, 235, 188, 35, 5, 235, 50, 35, 5, 234, 200, 35, 5, + 161, 35, 5, 211, 226, 35, 5, 212, 219, 35, 5, 213, 242, 35, 5, 213, 78, + 35, 5, 213, 91, 35, 5, 212, 116, 35, 5, 211, 184, 35, 5, 209, 88, 35, 5, + 218, 60, 35, 5, 234, 194, 35, 38, 234, 35, 26, 18, 222, 157, 78, 35, 38, + 18, 222, 157, 78, 35, 38, 234, 35, 78, 35, 208, 133, 78, 35, 197, 8, 35, + 234, 216, 204, 226, 35, 244, 158, 35, 207, 105, 35, 244, 167, 35, 212, + 31, 244, 167, 35, 211, 78, 78, 35, 213, 153, 207, 90, 35, 17, 100, 35, + 17, 102, 35, 17, 134, 35, 17, 136, 35, 17, 146, 35, 17, 167, 35, 17, 178, + 35, 17, 171, 35, 17, 182, 35, 31, 203, 23, 35, 31, 200, 234, 35, 31, 202, + 177, 35, 31, 235, 13, 35, 31, 235, 144, 35, 31, 206, 13, 35, 31, 207, 65, + 35, 31, 237, 19, 35, 31, 216, 173, 35, 31, 231, 56, 35, 31, 203, 24, 170, + 35, 5, 208, 138, 218, 71, 35, 5, 218, 67, 35, 5, 218, 68, 35, 5, 218, 69, + 35, 5, 208, 138, 247, 223, 35, 5, 247, 220, 35, 5, 247, 221, 35, 5, 247, + 222, 35, 5, 208, 138, 234, 200, 35, 5, 234, 196, 35, 5, 234, 197, 35, 5, + 234, 198, 35, 5, 208, 138, 211, 184, 35, 5, 211, 180, 35, 5, 211, 181, + 35, 5, 211, 182, 35, 202, 12, 117, 196, 6, 35, 202, 12, 117, 239, 196, + 35, 202, 12, 117, 210, 8, 35, 202, 12, 117, 206, 182, 210, 8, 35, 202, + 12, 117, 239, 125, 35, 202, 12, 117, 224, 180, 35, 202, 12, 117, 245, 56, + 35, 202, 12, 117, 232, 59, 35, 202, 12, 117, 239, 195, 35, 202, 12, 117, + 223, 151, 95, 1, 63, 95, 1, 69, 95, 1, 68, 95, 1, 72, 95, 1, 66, 95, 1, + 199, 230, 95, 1, 234, 122, 95, 1, 155, 95, 1, 234, 47, 95, 1, 233, 191, + 95, 1, 233, 143, 95, 1, 233, 75, 95, 1, 233, 35, 95, 1, 142, 95, 1, 232, + 146, 95, 1, 232, 70, 95, 1, 231, 192, 95, 1, 231, 74, 95, 1, 231, 43, 95, + 1, 172, 95, 1, 222, 196, 95, 1, 222, 108, 95, 1, 222, 6, 95, 1, 221, 190, + 95, 1, 221, 159, 95, 1, 166, 95, 1, 219, 206, 95, 1, 219, 77, 95, 1, 218, + 250, 95, 1, 218, 144, 95, 1, 176, 95, 1, 231, 216, 95, 1, 217, 230, 95, + 1, 217, 117, 95, 1, 216, 222, 95, 1, 216, 49, 95, 1, 215, 185, 95, 1, + 215, 119, 95, 1, 211, 95, 95, 1, 211, 81, 95, 1, 211, 74, 95, 1, 211, 64, + 95, 1, 211, 53, 95, 1, 211, 51, 95, 1, 183, 95, 1, 209, 80, 95, 1, 208, + 147, 95, 1, 206, 112, 95, 1, 205, 200, 95, 1, 204, 172, 95, 1, 204, 72, + 95, 1, 240, 135, 95, 1, 189, 95, 1, 239, 251, 95, 1, 203, 68, 95, 1, 239, + 151, 95, 1, 202, 122, 95, 1, 239, 27, 95, 1, 237, 200, 95, 1, 237, 169, + 95, 1, 239, 39, 95, 1, 202, 47, 95, 1, 202, 46, 95, 1, 202, 35, 95, 1, + 202, 34, 95, 1, 202, 33, 95, 1, 202, 32, 95, 1, 201, 113, 95, 1, 201, + 107, 95, 1, 201, 92, 95, 1, 201, 90, 95, 1, 201, 86, 95, 1, 201, 85, 95, + 1, 197, 166, 95, 1, 197, 109, 95, 1, 197, 70, 95, 1, 197, 34, 95, 1, 196, + 243, 95, 1, 196, 230, 95, 1, 164, 95, 1, 196, 69, 95, 1, 196, 24, 95, 1, + 196, 3, 95, 1, 195, 217, 95, 1, 195, 176, 95, 1, 218, 78, 95, 4, 1, 196, + 69, 95, 4, 1, 196, 24, 95, 4, 1, 196, 3, 95, 4, 1, 195, 217, 95, 4, 1, + 195, 176, 95, 4, 1, 218, 78, 21, 22, 231, 6, 21, 22, 69, 21, 22, 252, + 131, 21, 22, 68, 21, 22, 226, 119, 21, 22, 72, 21, 22, 214, 101, 21, 22, + 196, 147, 214, 101, 21, 22, 92, 237, 53, 21, 22, 92, 68, 21, 22, 63, 21, + 22, 252, 167, 21, 22, 197, 109, 21, 22, 197, 87, 197, 109, 21, 22, 197, + 70, 21, 22, 197, 87, 197, 70, 21, 22, 197, 54, 21, 22, 197, 87, 197, 54, + 21, 22, 197, 34, 21, 22, 197, 87, 197, 34, 21, 22, 197, 15, 21, 22, 197, + 87, 197, 15, 21, 22, 217, 204, 197, 15, 21, 22, 197, 166, 21, 22, 197, + 87, 197, 166, 21, 22, 197, 160, 21, 22, 197, 87, 197, 160, 21, 22, 217, + 204, 197, 160, 21, 22, 251, 199, 21, 22, 196, 147, 197, 199, 21, 22, 233, + 151, 204, 226, 21, 22, 48, 186, 21, 22, 48, 233, 99, 21, 22, 48, 248, 84, + 157, 210, 2, 21, 22, 48, 201, 243, 157, 210, 2, 21, 22, 48, 53, 157, 210, + 2, 21, 22, 48, 210, 2, 21, 22, 48, 52, 186, 21, 22, 48, 52, 206, 182, 83, + 204, 183, 21, 22, 48, 112, 238, 252, 21, 22, 48, 206, 182, 231, 154, 106, + 21, 22, 48, 212, 124, 21, 22, 48, 135, 203, 147, 21, 22, 236, 229, 21, + 22, 226, 85, 21, 22, 214, 118, 21, 22, 251, 105, 21, 22, 213, 91, 21, 22, + 213, 240, 21, 22, 212, 219, 21, 22, 212, 181, 21, 22, 212, 116, 21, 22, + 212, 90, 21, 22, 196, 147, 212, 90, 21, 22, 92, 232, 117, 21, 22, 92, + 232, 70, 21, 22, 161, 21, 22, 213, 242, 21, 22, 211, 182, 21, 22, 197, + 87, 211, 182, 21, 22, 211, 180, 21, 22, 197, 87, 211, 180, 21, 22, 211, + 179, 21, 22, 197, 87, 211, 179, 21, 22, 211, 177, 21, 22, 197, 87, 211, + 177, 21, 22, 211, 176, 21, 22, 197, 87, 211, 176, 21, 22, 211, 184, 21, + 22, 197, 87, 211, 184, 21, 22, 211, 183, 21, 22, 197, 87, 211, 183, 21, + 22, 196, 147, 211, 183, 21, 22, 214, 2, 21, 22, 197, 87, 214, 2, 21, 22, + 92, 233, 14, 21, 22, 203, 68, 21, 22, 203, 160, 21, 22, 202, 122, 21, 22, + 202, 99, 21, 22, 149, 21, 22, 201, 247, 21, 22, 196, 147, 201, 247, 21, + 22, 92, 239, 236, 21, 22, 92, 239, 151, 21, 22, 189, 21, 22, 203, 162, + 21, 22, 200, 243, 21, 22, 197, 87, 200, 243, 21, 22, 200, 221, 21, 22, + 197, 87, 200, 221, 21, 22, 200, 220, 21, 22, 197, 87, 200, 220, 21, 22, + 102, 21, 22, 197, 87, 102, 21, 22, 200, 211, 21, 22, 197, 87, 200, 211, + 21, 22, 200, 245, 21, 22, 197, 87, 200, 245, 21, 22, 200, 244, 21, 22, + 197, 87, 200, 244, 21, 22, 217, 204, 200, 244, 21, 22, 203, 216, 21, 22, + 201, 73, 21, 22, 201, 57, 21, 22, 201, 55, 21, 22, 201, 78, 21, 22, 224, + 208, 21, 22, 225, 48, 21, 22, 224, 100, 21, 22, 224, 79, 21, 22, 224, 10, + 21, 22, 223, 241, 21, 22, 196, 147, 223, 241, 21, 22, 155, 21, 22, 225, + 54, 21, 22, 223, 130, 21, 22, 197, 87, 223, 130, 21, 22, 223, 128, 21, + 22, 197, 87, 223, 128, 21, 22, 223, 127, 21, 22, 197, 87, 223, 127, 21, + 22, 223, 125, 21, 22, 197, 87, 223, 125, 21, 22, 223, 124, 21, 22, 197, + 87, 223, 124, 21, 22, 223, 135, 21, 22, 197, 87, 223, 135, 21, 22, 223, + 134, 21, 22, 197, 87, 223, 134, 21, 22, 217, 204, 223, 134, 21, 22, 225, + 79, 21, 22, 223, 136, 21, 22, 205, 158, 224, 192, 21, 22, 205, 158, 224, + 80, 21, 22, 205, 158, 224, 0, 21, 22, 205, 158, 225, 32, 21, 22, 247, 56, + 21, 22, 247, 171, 21, 22, 245, 10, 21, 22, 245, 0, 21, 22, 244, 181, 21, + 22, 241, 116, 21, 22, 196, 147, 241, 116, 21, 22, 247, 173, 21, 22, 247, + 172, 21, 22, 240, 251, 21, 22, 197, 87, 240, 251, 21, 22, 240, 249, 21, + 22, 197, 87, 240, 249, 21, 22, 240, 248, 21, 22, 197, 87, 240, 248, 21, + 22, 240, 247, 21, 22, 197, 87, 240, 247, 21, 22, 240, 246, 21, 22, 197, + 87, 240, 246, 21, 22, 240, 253, 21, 22, 197, 87, 240, 253, 21, 22, 240, + 252, 21, 22, 197, 87, 240, 252, 21, 22, 217, 204, 240, 252, 21, 22, 247, + 206, 21, 22, 208, 178, 202, 235, 21, 22, 219, 206, 21, 22, 220, 117, 21, + 22, 219, 77, 21, 22, 219, 39, 21, 22, 218, 250, 21, 22, 218, 194, 21, 22, + 196, 147, 218, 194, 21, 22, 166, 21, 22, 220, 118, 21, 22, 218, 69, 21, + 22, 197, 87, 218, 69, 21, 22, 218, 67, 21, 22, 197, 87, 218, 67, 21, 22, + 218, 66, 21, 22, 197, 87, 218, 66, 21, 22, 218, 65, 21, 22, 197, 87, 218, + 65, 21, 22, 218, 64, 21, 22, 197, 87, 218, 64, 21, 22, 218, 71, 21, 22, + 197, 87, 218, 71, 21, 22, 218, 70, 21, 22, 197, 87, 218, 70, 21, 22, 217, + 204, 218, 70, 21, 22, 221, 135, 21, 22, 197, 87, 221, 135, 21, 22, 219, + 81, 21, 22, 250, 165, 221, 135, 21, 22, 208, 178, 221, 135, 21, 22, 217, + 117, 21, 22, 217, 242, 21, 22, 216, 222, 21, 22, 216, 189, 21, 22, 216, + 49, 21, 22, 216, 32, 21, 22, 196, 147, 216, 32, 21, 22, 176, 21, 22, 217, + 243, 21, 22, 215, 115, 21, 22, 197, 87, 215, 115, 21, 22, 215, 117, 21, + 22, 197, 87, 215, 117, 21, 22, 215, 116, 21, 22, 197, 87, 215, 116, 21, + 22, 217, 204, 215, 116, 21, 22, 218, 54, 21, 22, 92, 217, 72, 21, 22, + 216, 227, 21, 22, 222, 196, 21, 22, 223, 80, 21, 22, 222, 108, 21, 22, + 222, 90, 21, 22, 222, 6, 21, 22, 221, 228, 21, 22, 196, 147, 221, 228, + 21, 22, 172, 21, 22, 223, 81, 21, 22, 221, 156, 21, 22, 197, 87, 221, + 156, 21, 22, 221, 155, 21, 22, 197, 87, 221, 155, 21, 22, 221, 154, 21, + 22, 197, 87, 221, 154, 21, 22, 221, 153, 21, 22, 197, 87, 221, 153, 21, + 22, 221, 152, 21, 22, 197, 87, 221, 152, 21, 22, 221, 158, 21, 22, 197, + 87, 221, 158, 21, 22, 221, 157, 21, 22, 197, 87, 221, 157, 21, 22, 159, + 21, 22, 197, 87, 159, 21, 22, 219, 193, 159, 21, 22, 208, 147, 21, 22, + 209, 11, 21, 22, 206, 112, 21, 22, 206, 84, 21, 22, 205, 200, 21, 22, + 205, 171, 21, 22, 196, 147, 205, 171, 21, 22, 183, 21, 22, 209, 13, 21, + 22, 204, 62, 21, 22, 197, 87, 204, 62, 21, 22, 204, 56, 21, 22, 197, 87, + 204, 56, 21, 22, 204, 55, 21, 22, 197, 87, 204, 55, 21, 22, 204, 50, 21, + 22, 197, 87, 204, 50, 21, 22, 204, 49, 21, 22, 197, 87, 204, 49, 21, 22, + 204, 67, 21, 22, 197, 87, 204, 67, 21, 22, 204, 66, 21, 22, 197, 87, 204, + 66, 21, 22, 217, 204, 204, 66, 21, 22, 209, 80, 21, 22, 250, 165, 209, + 80, 21, 22, 204, 68, 21, 22, 248, 132, 209, 80, 21, 22, 218, 187, 206, 7, + 21, 22, 217, 204, 205, 252, 21, 22, 217, 204, 209, 78, 21, 22, 217, 204, + 205, 96, 21, 22, 217, 204, 204, 175, 21, 22, 217, 204, 205, 251, 21, 22, + 217, 204, 208, 150, 21, 22, 206, 255, 21, 22, 206, 223, 21, 22, 206, 218, + 21, 22, 206, 198, 21, 22, 206, 190, 21, 22, 207, 50, 21, 22, 207, 45, 21, + 22, 206, 127, 21, 22, 197, 87, 206, 127, 21, 22, 206, 126, 21, 22, 197, + 87, 206, 126, 21, 22, 206, 125, 21, 22, 197, 87, 206, 125, 21, 22, 206, + 124, 21, 22, 197, 87, 206, 124, 21, 22, 206, 123, 21, 22, 197, 87, 206, + 123, 21, 22, 206, 130, 21, 22, 197, 87, 206, 130, 21, 22, 206, 129, 21, + 22, 197, 87, 206, 129, 21, 22, 207, 52, 21, 22, 196, 69, 21, 22, 196, + 127, 21, 22, 196, 24, 21, 22, 196, 14, 21, 22, 196, 3, 21, 22, 195, 237, + 21, 22, 196, 147, 195, 237, 21, 22, 164, 21, 22, 196, 129, 21, 22, 195, + 173, 21, 22, 197, 87, 195, 173, 21, 22, 195, 172, 21, 22, 197, 87, 195, + 172, 21, 22, 195, 171, 21, 22, 197, 87, 195, 171, 21, 22, 195, 170, 21, + 22, 197, 87, 195, 170, 21, 22, 195, 169, 21, 22, 197, 87, 195, 169, 21, + 22, 195, 175, 21, 22, 197, 87, 195, 175, 21, 22, 195, 174, 21, 22, 197, + 87, 195, 174, 21, 22, 217, 204, 195, 174, 21, 22, 196, 148, 21, 22, 248, + 181, 196, 148, 21, 22, 197, 87, 196, 148, 21, 22, 208, 178, 196, 24, 21, + 22, 210, 182, 21, 22, 211, 30, 210, 182, 21, 22, 197, 87, 222, 196, 21, + 22, 210, 242, 21, 22, 210, 72, 21, 22, 210, 9, 21, 22, 209, 232, 21, 22, + 209, 206, 21, 22, 197, 87, 222, 6, 21, 22, 169, 21, 22, 210, 243, 21, 22, + 197, 87, 172, 21, 22, 209, 97, 21, 22, 197, 87, 209, 97, 21, 22, 144, 21, + 22, 197, 87, 144, 21, 22, 219, 193, 144, 21, 22, 235, 188, 21, 22, 235, + 235, 21, 22, 235, 152, 21, 22, 235, 138, 21, 22, 235, 50, 21, 22, 235, + 39, 21, 22, 235, 238, 21, 22, 235, 237, 21, 22, 234, 199, 21, 22, 197, + 87, 234, 199, 21, 22, 236, 48, 21, 22, 202, 217, 21, 22, 218, 52, 202, + 217, 21, 22, 202, 195, 21, 22, 218, 52, 202, 195, 21, 22, 202, 189, 21, + 22, 218, 52, 202, 189, 21, 22, 202, 169, 21, 22, 202, 164, 21, 22, 202, + 233, 21, 22, 202, 232, 21, 22, 202, 132, 21, 22, 197, 87, 202, 132, 21, + 22, 202, 235, 21, 22, 201, 64, 21, 22, 201, 62, 21, 22, 201, 61, 21, 22, + 201, 66, 21, 22, 201, 67, 21, 22, 200, 204, 21, 22, 200, 203, 21, 22, + 200, 202, 21, 22, 200, 206, 21, 22, 215, 136, 232, 146, 21, 22, 215, 136, + 232, 70, 21, 22, 215, 136, 232, 42, 21, 22, 215, 136, 231, 192, 21, 22, + 215, 136, 231, 165, 21, 22, 215, 136, 142, 21, 22, 215, 136, 232, 245, + 21, 22, 215, 136, 233, 14, 21, 22, 215, 135, 233, 14, 21, 22, 232, 26, + 21, 22, 211, 154, 21, 22, 211, 120, 21, 22, 211, 114, 21, 22, 211, 108, + 21, 22, 211, 103, 21, 22, 211, 158, 21, 22, 211, 157, 21, 22, 211, 166, + 21, 22, 202, 43, 21, 22, 202, 41, 21, 22, 202, 40, 21, 22, 202, 44, 21, + 22, 197, 87, 210, 182, 21, 22, 197, 87, 210, 72, 21, 22, 197, 87, 209, + 232, 21, 22, 197, 87, 169, 21, 22, 217, 68, 21, 22, 217, 18, 21, 22, 217, + 14, 21, 22, 216, 251, 21, 22, 216, 246, 21, 22, 217, 70, 21, 22, 217, 69, + 21, 22, 217, 72, 21, 22, 216, 78, 21, 22, 208, 178, 206, 255, 21, 22, + 208, 178, 206, 223, 21, 22, 208, 178, 206, 198, 21, 22, 208, 178, 207, + 50, 21, 22, 197, 13, 202, 217, 21, 22, 197, 13, 202, 195, 21, 22, 197, + 13, 202, 169, 21, 22, 197, 13, 202, 233, 21, 22, 197, 13, 202, 235, 21, + 22, 222, 115, 21, 22, 222, 114, 21, 22, 222, 113, 21, 22, 222, 112, 21, + 22, 222, 121, 21, 22, 222, 120, 21, 22, 222, 122, 21, 22, 202, 234, 202, + 217, 21, 22, 202, 234, 202, 195, 21, 22, 202, 234, 202, 189, 21, 22, 202, + 234, 202, 169, 21, 22, 202, 234, 202, 164, 21, 22, 202, 234, 202, 233, + 21, 22, 202, 234, 202, 232, 21, 22, 202, 234, 202, 235, 21, 22, 251, 183, + 250, 111, 21, 22, 248, 132, 69, 21, 22, 248, 132, 68, 21, 22, 248, 132, + 72, 21, 22, 248, 132, 63, 21, 22, 248, 132, 197, 109, 21, 22, 248, 132, + 197, 70, 21, 22, 248, 132, 197, 34, 21, 22, 248, 132, 197, 166, 21, 22, + 248, 132, 217, 117, 21, 22, 248, 132, 216, 222, 21, 22, 248, 132, 216, + 49, 21, 22, 248, 132, 176, 21, 22, 248, 132, 224, 208, 21, 22, 248, 132, + 224, 100, 21, 22, 248, 132, 224, 10, 21, 22, 248, 132, 155, 21, 22, 208, + 178, 232, 146, 21, 22, 208, 178, 232, 70, 21, 22, 208, 178, 231, 192, 21, + 22, 208, 178, 142, 21, 22, 92, 233, 197, 21, 22, 92, 233, 201, 21, 22, + 92, 233, 215, 21, 22, 92, 233, 214, 21, 22, 92, 233, 203, 21, 22, 92, + 233, 229, 21, 22, 92, 209, 140, 21, 22, 92, 209, 232, 21, 22, 92, 210, + 182, 21, 22, 92, 210, 154, 21, 22, 92, 210, 72, 21, 22, 92, 169, 21, 22, + 92, 196, 243, 21, 22, 92, 197, 34, 21, 22, 92, 197, 109, 21, 22, 92, 197, + 98, 21, 22, 92, 197, 70, 21, 22, 92, 197, 166, 21, 22, 92, 231, 35, 21, + 22, 92, 231, 36, 21, 22, 92, 231, 39, 21, 22, 92, 231, 38, 21, 22, 92, + 231, 37, 21, 22, 92, 231, 42, 21, 22, 92, 202, 142, 21, 22, 92, 202, 169, + 21, 22, 92, 202, 217, 21, 22, 92, 202, 215, 21, 22, 92, 202, 195, 21, 22, + 92, 202, 233, 21, 22, 92, 201, 45, 21, 22, 92, 201, 55, 21, 22, 92, 201, + 73, 21, 22, 92, 201, 72, 21, 22, 92, 201, 57, 21, 22, 92, 201, 78, 21, + 22, 92, 211, 226, 21, 22, 92, 212, 116, 21, 22, 92, 213, 91, 21, 22, 92, + 213, 78, 21, 22, 92, 212, 219, 21, 22, 92, 161, 21, 22, 92, 214, 2, 21, + 22, 92, 233, 75, 21, 22, 92, 233, 143, 21, 22, 92, 234, 47, 21, 22, 92, + 234, 39, 21, 22, 92, 233, 191, 21, 22, 92, 234, 122, 21, 22, 92, 224, + 109, 21, 22, 92, 224, 116, 21, 22, 92, 224, 130, 21, 22, 92, 224, 129, + 21, 22, 92, 224, 123, 21, 22, 92, 224, 145, 21, 22, 92, 224, 30, 21, 22, + 92, 224, 31, 21, 22, 92, 224, 34, 21, 22, 92, 224, 33, 21, 22, 92, 224, + 32, 21, 22, 92, 224, 35, 21, 22, 92, 224, 36, 21, 22, 92, 215, 185, 21, + 22, 92, 216, 49, 21, 22, 92, 217, 117, 21, 22, 92, 217, 106, 21, 22, 92, + 216, 222, 21, 22, 92, 176, 21, 22, 92, 218, 144, 21, 22, 92, 218, 250, + 21, 22, 92, 219, 206, 21, 22, 92, 219, 187, 21, 22, 92, 219, 77, 21, 22, + 92, 166, 21, 22, 92, 195, 217, 21, 22, 92, 196, 3, 21, 22, 92, 196, 69, + 21, 22, 92, 196, 66, 21, 22, 92, 196, 24, 21, 22, 92, 164, 21, 22, 92, + 225, 109, 21, 22, 208, 178, 225, 109, 21, 22, 92, 225, 128, 21, 22, 92, + 225, 192, 21, 22, 92, 225, 190, 21, 22, 92, 225, 171, 21, 22, 208, 178, + 225, 171, 21, 22, 92, 225, 213, 21, 22, 92, 225, 142, 21, 22, 92, 225, + 146, 21, 22, 92, 225, 156, 21, 22, 92, 225, 155, 21, 22, 92, 225, 154, + 21, 22, 92, 225, 157, 21, 22, 92, 221, 190, 21, 22, 92, 222, 6, 21, 22, + 92, 222, 196, 21, 22, 92, 222, 187, 21, 22, 92, 222, 108, 21, 22, 92, + 172, 21, 22, 92, 239, 32, 21, 22, 92, 239, 33, 21, 22, 92, 239, 38, 21, + 22, 92, 239, 37, 21, 22, 92, 239, 34, 21, 22, 92, 239, 39, 21, 22, 92, + 222, 111, 21, 22, 92, 222, 113, 21, 22, 92, 222, 117, 21, 22, 92, 222, + 116, 21, 22, 92, 222, 115, 21, 22, 92, 222, 121, 21, 22, 92, 202, 38, 21, + 22, 92, 202, 40, 21, 22, 92, 202, 43, 21, 22, 92, 202, 42, 21, 22, 92, + 202, 41, 21, 22, 92, 202, 44, 21, 22, 92, 202, 33, 21, 22, 92, 202, 34, + 21, 22, 92, 202, 46, 21, 22, 92, 202, 45, 21, 22, 92, 202, 35, 21, 22, + 92, 202, 47, 21, 22, 92, 194, 255, 21, 22, 92, 195, 11, 21, 22, 92, 195, + 88, 21, 22, 92, 195, 85, 21, 22, 92, 195, 33, 21, 22, 92, 195, 115, 21, + 22, 92, 195, 158, 21, 22, 92, 84, 195, 158, 21, 22, 92, 237, 142, 21, 22, + 92, 237, 143, 21, 22, 92, 237, 152, 21, 22, 92, 237, 151, 21, 22, 92, + 237, 146, 21, 22, 92, 237, 155, 21, 22, 92, 204, 172, 21, 22, 92, 205, + 200, 21, 22, 92, 208, 147, 21, 22, 92, 208, 129, 21, 22, 92, 206, 112, + 21, 22, 92, 183, 21, 22, 92, 206, 151, 21, 22, 92, 206, 198, 21, 22, 92, + 206, 255, 21, 22, 92, 206, 253, 21, 22, 92, 206, 223, 21, 22, 92, 207, + 50, 21, 22, 92, 207, 52, 21, 22, 92, 201, 86, 21, 22, 92, 201, 90, 21, + 22, 92, 201, 107, 21, 22, 92, 201, 106, 21, 22, 92, 201, 92, 21, 22, 92, + 201, 113, 21, 22, 92, 245, 29, 21, 22, 92, 245, 48, 21, 22, 92, 245, 102, + 21, 22, 92, 245, 98, 21, 22, 92, 245, 74, 21, 22, 92, 247, 15, 21, 22, + 92, 201, 48, 21, 22, 92, 201, 49, 21, 22, 92, 201, 52, 21, 22, 92, 201, + 51, 21, 22, 92, 201, 50, 21, 22, 92, 201, 53, 21, 22, 245, 75, 55, 21, + 22, 234, 216, 204, 226, 21, 22, 211, 150, 21, 22, 217, 66, 21, 22, 216, + 75, 21, 22, 216, 74, 21, 22, 216, 73, 21, 22, 216, 72, 21, 22, 216, 77, + 21, 22, 216, 76, 21, 22, 197, 13, 202, 130, 21, 22, 197, 13, 202, 129, + 21, 22, 197, 13, 202, 128, 21, 22, 197, 13, 202, 127, 21, 22, 197, 13, + 202, 126, 21, 22, 197, 13, 202, 133, 21, 22, 197, 13, 202, 132, 21, 22, + 197, 13, 48, 202, 235, 21, 22, 248, 132, 197, 199, 214, 152, 205, 149, + 78, 214, 152, 1, 248, 232, 214, 152, 1, 221, 176, 214, 152, 1, 235, 185, + 214, 152, 1, 208, 251, 214, 152, 1, 216, 171, 214, 152, 1, 200, 111, 214, + 152, 1, 240, 108, 214, 152, 1, 202, 71, 214, 152, 1, 244, 170, 214, 152, + 1, 247, 43, 214, 152, 1, 218, 127, 214, 152, 1, 233, 122, 214, 152, 1, + 217, 56, 214, 152, 1, 204, 219, 214, 152, 1, 209, 127, 214, 152, 1, 251, + 195, 214, 152, 1, 214, 105, 214, 152, 1, 200, 21, 214, 152, 1, 237, 79, + 214, 152, 1, 226, 10, 214, 152, 1, 237, 80, 214, 152, 1, 214, 71, 214, + 152, 1, 200, 88, 214, 152, 1, 226, 125, 214, 152, 1, 237, 77, 214, 152, + 1, 213, 68, 214, 152, 235, 184, 78, 214, 152, 210, 89, 235, 184, 78, 209, + 116, 1, 235, 174, 235, 165, 235, 189, 236, 48, 209, 116, 1, 199, 230, + 209, 116, 1, 200, 6, 200, 22, 66, 209, 116, 1, 195, 220, 209, 116, 1, + 196, 148, 209, 116, 1, 197, 199, 209, 116, 1, 202, 135, 202, 134, 202, + 162, 209, 116, 1, 236, 120, 209, 116, 1, 251, 69, 63, 209, 116, 1, 214, + 53, 72, 209, 116, 1, 252, 25, 63, 209, 116, 1, 251, 228, 209, 116, 1, + 221, 235, 72, 209, 116, 1, 206, 175, 72, 209, 116, 1, 72, 209, 116, 1, + 214, 163, 209, 116, 1, 214, 118, 209, 116, 1, 210, 221, 210, 234, 210, + 139, 144, 209, 116, 1, 224, 224, 209, 116, 1, 247, 39, 209, 116, 1, 224, + 225, 225, 79, 209, 116, 1, 234, 189, 209, 116, 1, 236, 214, 209, 116, 1, + 234, 42, 233, 20, 234, 189, 209, 116, 1, 234, 82, 209, 116, 1, 196, 235, + 196, 226, 197, 199, 209, 116, 1, 232, 236, 233, 14, 209, 116, 1, 232, + 240, 233, 14, 209, 116, 1, 221, 237, 233, 14, 209, 116, 1, 206, 178, 233, + 14, 209, 116, 1, 217, 199, 215, 98, 217, 200, 218, 54, 209, 116, 1, 206, + 176, 218, 54, 209, 116, 1, 237, 246, 209, 116, 1, 225, 244, 225, 248, + 225, 235, 68, 209, 116, 1, 69, 209, 116, 1, 225, 182, 225, 216, 209, 116, + 1, 234, 23, 209, 116, 1, 221, 238, 251, 244, 209, 116, 1, 206, 180, 63, + 209, 116, 1, 225, 227, 236, 187, 209, 116, 1, 213, 24, 213, 49, 214, 2, + 209, 116, 1, 251, 156, 236, 185, 209, 116, 1, 205, 155, 209, 80, 209, + 116, 1, 206, 88, 221, 234, 209, 80, 209, 116, 1, 206, 174, 209, 80, 209, + 116, 1, 247, 206, 209, 116, 1, 195, 158, 209, 116, 1, 202, 52, 202, 64, + 200, 188, 203, 216, 209, 116, 1, 206, 173, 203, 216, 209, 116, 1, 240, + 230, 209, 116, 1, 248, 210, 248, 213, 248, 138, 250, 111, 209, 116, 1, + 206, 179, 250, 111, 209, 116, 1, 237, 245, 209, 116, 1, 214, 85, 209, + 116, 1, 237, 33, 237, 40, 69, 209, 116, 1, 220, 50, 220, 62, 221, 135, + 209, 116, 1, 221, 236, 221, 135, 209, 116, 1, 206, 177, 221, 135, 209, + 116, 1, 222, 211, 223, 58, 221, 245, 159, 209, 116, 1, 237, 247, 209, + 116, 1, 226, 58, 209, 116, 1, 226, 59, 209, 116, 1, 240, 122, 240, 128, + 240, 230, 209, 116, 1, 214, 46, 236, 119, 72, 209, 116, 1, 237, 75, 209, + 116, 1, 226, 8, 209, 116, 1, 240, 250, 209, 116, 1, 247, 156, 209, 116, + 1, 247, 55, 209, 116, 1, 205, 13, 209, 116, 1, 221, 233, 209, 116, 1, + 206, 172, 209, 116, 1, 230, 199, 209, 116, 1, 211, 166, 209, 116, 1, 196, + 222, 209, 116, 206, 62, 211, 212, 209, 116, 218, 119, 211, 212, 209, 116, + 241, 61, 211, 212, 209, 116, 250, 232, 105, 209, 116, 200, 247, 105, 209, + 116, 248, 230, 105, 209, 116, 1, 225, 79, 209, 116, 1, 207, 52, 209, 116, + 1, 214, 101, 209, 116, 1, 234, 246, 247, 94, 214, 52, 209, 116, 1, 234, + 246, 247, 94, 225, 247, 209, 116, 1, 234, 246, 247, 94, 237, 39, 209, + 116, 1, 234, 246, 247, 94, 252, 24, 209, 116, 1, 234, 246, 247, 94, 251, + 228, 203, 142, 1, 63, 203, 142, 1, 68, 203, 142, 1, 66, 203, 142, 1, 155, + 203, 142, 1, 234, 122, 203, 142, 1, 217, 70, 203, 142, 1, 189, 203, 142, + 1, 240, 135, 203, 142, 1, 176, 203, 142, 1, 161, 203, 142, 1, 249, 144, + 203, 142, 1, 166, 203, 142, 1, 164, 203, 142, 1, 172, 203, 142, 1, 197, + 166, 203, 142, 1, 183, 203, 142, 1, 142, 203, 142, 18, 2, 68, 203, 142, + 18, 2, 66, 203, 142, 2, 199, 7, 232, 178, 1, 63, 232, 178, 1, 68, 232, + 178, 1, 66, 232, 178, 1, 155, 232, 178, 1, 234, 122, 232, 178, 1, 217, + 70, 232, 178, 1, 189, 232, 178, 1, 240, 135, 232, 178, 1, 176, 232, 178, + 1, 161, 232, 178, 1, 249, 144, 232, 178, 1, 166, 232, 178, 1, 164, 232, + 178, 1, 169, 232, 178, 1, 172, 232, 178, 1, 197, 166, 232, 178, 1, 183, + 232, 178, 1, 142, 232, 178, 18, 2, 68, 232, 178, 18, 2, 66, 232, 178, 2, + 213, 193, 212, 238, 206, 62, 211, 212, 212, 238, 52, 211, 212, 248, 12, + 1, 63, 248, 12, 1, 68, 248, 12, 1, 66, 248, 12, 1, 155, 248, 12, 1, 234, + 122, 248, 12, 1, 217, 70, 248, 12, 1, 189, 248, 12, 1, 240, 135, 248, 12, + 1, 176, 248, 12, 1, 161, 248, 12, 1, 249, 144, 248, 12, 1, 166, 248, 12, + 1, 164, 248, 12, 1, 169, 248, 12, 1, 172, 248, 12, 1, 197, 166, 248, 12, + 1, 183, 248, 12, 1, 142, 248, 12, 18, 2, 68, 248, 12, 18, 2, 66, 203, + 141, 1, 63, 203, 141, 1, 68, 203, 141, 1, 66, 203, 141, 1, 155, 203, 141, + 1, 234, 122, 203, 141, 1, 217, 70, 203, 141, 1, 189, 203, 141, 1, 240, + 135, 203, 141, 1, 176, 203, 141, 1, 161, 203, 141, 1, 249, 144, 203, 141, + 1, 166, 203, 141, 1, 164, 203, 141, 1, 172, 203, 141, 1, 197, 166, 203, + 141, 1, 183, 203, 141, 18, 2, 68, 203, 141, 18, 2, 66, 89, 1, 155, 89, 1, + 224, 145, 89, 1, 224, 10, 89, 1, 224, 116, 89, 1, 216, 251, 89, 1, 247, + 173, 89, 1, 247, 15, 89, 1, 244, 181, 89, 1, 245, 48, 89, 1, 215, 72, 89, + 1, 240, 135, 89, 1, 201, 66, 89, 1, 239, 27, 89, 1, 201, 61, 89, 1, 216, + 55, 89, 1, 189, 89, 1, 202, 233, 89, 1, 149, 89, 1, 202, 169, 89, 1, 216, + 49, 89, 1, 249, 144, 89, 1, 213, 5, 89, 1, 212, 116, 89, 1, 212, 233, 89, + 1, 218, 250, 89, 1, 196, 3, 89, 1, 209, 232, 89, 1, 222, 6, 89, 1, 198, + 248, 89, 1, 207, 50, 89, 1, 205, 39, 89, 1, 183, 89, 1, 142, 89, 1, 172, + 89, 1, 211, 158, 89, 226, 72, 18, 211, 144, 89, 226, 72, 18, 211, 157, + 89, 226, 72, 18, 211, 120, 89, 226, 72, 18, 211, 114, 89, 226, 72, 18, + 211, 96, 89, 226, 72, 18, 211, 65, 89, 226, 72, 18, 211, 53, 89, 226, 72, + 18, 211, 52, 89, 226, 72, 18, 209, 89, 89, 226, 72, 18, 209, 82, 89, 226, + 72, 18, 221, 150, 89, 226, 72, 18, 221, 138, 89, 226, 72, 18, 211, 138, + 89, 226, 72, 18, 211, 150, 89, 226, 72, 18, 211, 104, 200, 201, 100, 89, + 226, 72, 18, 211, 104, 200, 201, 102, 89, 226, 72, 18, 211, 140, 89, 18, + 226, 56, 251, 17, 89, 18, 226, 56, 252, 167, 89, 18, 2, 252, 167, 89, 18, + 2, 68, 89, 18, 2, 226, 119, 89, 18, 2, 196, 148, 89, 18, 2, 195, 168, 89, + 18, 2, 66, 89, 18, 2, 199, 245, 89, 18, 2, 200, 114, 89, 18, 2, 214, 163, + 89, 18, 2, 164, 89, 18, 2, 226, 146, 89, 18, 2, 69, 89, 18, 2, 251, 244, + 89, 18, 2, 251, 199, 89, 18, 2, 214, 101, 89, 18, 2, 250, 149, 89, 2, + 216, 187, 89, 2, 210, 176, 89, 2, 195, 179, 89, 2, 218, 82, 89, 2, 201, + 168, 89, 2, 249, 81, 89, 2, 209, 221, 89, 2, 202, 21, 89, 2, 225, 23, 89, + 2, 251, 201, 89, 2, 208, 220, 208, 212, 89, 2, 199, 4, 89, 2, 244, 173, + 89, 2, 249, 51, 89, 2, 224, 137, 89, 2, 249, 76, 89, 2, 247, 144, 212, + 182, 223, 142, 89, 2, 222, 164, 201, 247, 89, 2, 248, 198, 89, 2, 212, + 235, 218, 137, 89, 2, 223, 239, 89, 241, 16, 16, 210, 56, 89, 2, 250, + 130, 89, 2, 250, 152, 89, 17, 195, 79, 89, 17, 100, 89, 17, 102, 89, 17, + 134, 89, 17, 136, 89, 17, 146, 89, 17, 167, 89, 17, 178, 89, 17, 171, 89, + 17, 182, 89, 16, 222, 164, 250, 154, 205, 174, 89, 16, 222, 164, 250, + 154, 218, 103, 89, 16, 222, 164, 250, 154, 212, 181, 89, 16, 222, 164, + 250, 154, 248, 233, 89, 16, 222, 164, 250, 154, 247, 248, 89, 16, 222, + 164, 250, 154, 212, 48, 89, 16, 222, 164, 250, 154, 212, 42, 89, 16, 222, + 164, 250, 154, 212, 40, 89, 16, 222, 164, 250, 154, 212, 46, 89, 16, 222, + 164, 250, 154, 212, 44, 96, 248, 153, 96, 236, 246, 96, 244, 158, 96, + 234, 216, 204, 226, 96, 244, 167, 96, 235, 6, 238, 249, 96, 202, 20, 205, + 186, 231, 6, 96, 206, 104, 5, 248, 80, 220, 23, 96, 220, 58, 244, 158, + 96, 220, 58, 234, 216, 204, 226, 96, 216, 169, 96, 234, 245, 62, 208, + 115, 100, 96, 234, 245, 62, 208, 115, 102, 96, 234, 245, 62, 208, 115, + 134, 96, 18, 207, 90, 96, 17, 195, 79, 96, 17, 100, 96, 17, 102, 96, 17, + 134, 96, 17, 136, 96, 17, 146, 96, 17, 167, 96, 17, 178, 96, 17, 171, 96, + 17, 182, 96, 1, 63, 96, 1, 69, 96, 1, 68, 96, 1, 72, 96, 1, 66, 96, 1, + 214, 163, 96, 1, 200, 99, 96, 1, 237, 53, 96, 1, 176, 96, 1, 251, 96, 96, + 1, 249, 144, 96, 1, 161, 96, 1, 211, 158, 96, 1, 234, 122, 96, 1, 166, + 96, 1, 172, 96, 1, 183, 96, 1, 207, 50, 96, 1, 189, 96, 1, 240, 135, 96, + 1, 247, 15, 96, 1, 225, 213, 96, 1, 164, 96, 1, 169, 96, 1, 197, 166, 96, + 1, 235, 238, 96, 1, 155, 96, 1, 224, 145, 96, 1, 201, 113, 96, 1, 195, + 115, 96, 1, 232, 245, 96, 1, 195, 3, 96, 1, 222, 121, 96, 1, 195, 60, 96, + 1, 245, 74, 96, 1, 202, 20, 181, 18, 55, 96, 1, 202, 20, 69, 96, 1, 202, + 20, 68, 96, 1, 202, 20, 72, 96, 1, 202, 20, 66, 96, 1, 202, 20, 214, 163, + 96, 1, 202, 20, 200, 99, 96, 1, 202, 20, 251, 96, 96, 1, 202, 20, 249, + 144, 96, 1, 202, 20, 161, 96, 1, 202, 20, 211, 158, 96, 1, 202, 20, 234, + 122, 96, 1, 202, 20, 166, 96, 1, 202, 20, 189, 96, 1, 202, 20, 240, 135, + 96, 1, 202, 20, 247, 15, 96, 1, 202, 20, 225, 213, 96, 1, 202, 20, 201, + 113, 96, 1, 202, 20, 164, 96, 1, 202, 20, 197, 166, 96, 1, 202, 20, 155, + 96, 1, 202, 20, 234, 119, 96, 1, 202, 20, 232, 245, 96, 1, 202, 20, 225, + 170, 96, 1, 202, 20, 216, 212, 96, 1, 202, 20, 237, 155, 96, 1, 206, 104, + 69, 96, 1, 206, 104, 68, 96, 1, 206, 104, 225, 224, 96, 1, 206, 104, 200, + 99, 96, 1, 206, 104, 66, 96, 1, 206, 104, 251, 96, 96, 1, 206, 104, 155, + 96, 1, 206, 104, 234, 122, 96, 1, 206, 104, 142, 96, 1, 206, 104, 161, + 96, 1, 206, 104, 207, 50, 96, 1, 206, 104, 189, 96, 1, 206, 104, 240, + 135, 96, 1, 206, 104, 225, 213, 96, 1, 206, 104, 235, 238, 96, 1, 206, + 104, 234, 119, 96, 1, 206, 104, 232, 245, 96, 1, 206, 104, 201, 113, 96, + 1, 206, 104, 195, 115, 96, 1, 206, 104, 210, 243, 96, 1, 206, 104, 247, + 15, 96, 1, 206, 104, 195, 74, 96, 1, 220, 58, 68, 96, 1, 220, 58, 155, + 96, 1, 220, 58, 169, 96, 1, 220, 58, 235, 238, 96, 1, 220, 58, 195, 74, + 96, 1, 247, 16, 3, 99, 238, 249, 96, 1, 251, 155, 234, 102, 251, 51, 100, + 96, 1, 251, 155, 234, 102, 199, 3, 100, 96, 1, 251, 155, 234, 102, 240, + 96, 96, 1, 251, 155, 234, 102, 200, 109, 96, 1, 251, 155, 234, 102, 226, + 16, 200, 109, 96, 1, 251, 155, 234, 102, 249, 95, 96, 1, 251, 155, 234, + 102, 115, 249, 95, 96, 1, 251, 155, 234, 102, 63, 96, 1, 251, 155, 234, + 102, 68, 96, 1, 251, 155, 234, 102, 155, 96, 1, 251, 155, 234, 102, 217, + 70, 96, 1, 251, 155, 234, 102, 247, 173, 96, 1, 251, 155, 234, 102, 201, + 78, 96, 1, 251, 155, 234, 102, 201, 66, 96, 1, 251, 155, 234, 102, 240, + 40, 96, 1, 251, 155, 234, 102, 216, 85, 96, 1, 251, 155, 234, 102, 189, + 96, 1, 251, 155, 234, 102, 240, 135, 96, 1, 251, 155, 234, 102, 161, 96, + 1, 251, 155, 234, 102, 213, 5, 96, 1, 251, 155, 234, 102, 205, 80, 96, 1, + 251, 155, 234, 102, 195, 74, 96, 1, 251, 155, 234, 102, 195, 115, 96, 1, + 251, 155, 234, 102, 251, 208, 96, 1, 202, 20, 251, 155, 234, 102, 189, + 96, 1, 202, 20, 251, 155, 234, 102, 195, 74, 96, 1, 220, 58, 251, 155, + 234, 102, 233, 229, 96, 1, 220, 58, 251, 155, 234, 102, 217, 70, 96, 1, + 220, 58, 251, 155, 234, 102, 247, 173, 96, 1, 220, 58, 251, 155, 234, + 102, 225, 179, 96, 1, 220, 58, 251, 155, 234, 102, 201, 78, 96, 1, 220, + 58, 251, 155, 234, 102, 240, 24, 96, 1, 220, 58, 251, 155, 234, 102, 189, + 96, 1, 220, 58, 251, 155, 234, 102, 239, 175, 96, 1, 220, 58, 251, 155, + 234, 102, 205, 80, 96, 1, 220, 58, 251, 155, 234, 102, 240, 244, 96, 1, + 220, 58, 251, 155, 234, 102, 195, 74, 96, 1, 220, 58, 251, 155, 234, 102, + 195, 115, 96, 1, 251, 155, 234, 102, 157, 66, 96, 1, 251, 155, 234, 102, + 157, 164, 96, 1, 220, 58, 251, 155, 234, 102, 248, 196, 96, 1, 251, 155, + 234, 102, 240, 123, 96, 1, 220, 58, 251, 155, 234, 102, 222, 121, 21, 22, + 214, 7, 21, 22, 250, 121, 21, 22, 252, 121, 21, 22, 197, 112, 21, 22, + 212, 54, 21, 22, 213, 100, 21, 22, 211, 175, 21, 22, 203, 77, 21, 22, + 224, 215, 21, 22, 223, 132, 21, 22, 219, 250, 21, 22, 216, 0, 21, 22, + 217, 194, 21, 22, 222, 206, 21, 22, 205, 153, 21, 22, 208, 180, 21, 22, + 206, 160, 21, 22, 207, 3, 21, 22, 206, 122, 21, 22, 195, 226, 21, 22, + 196, 75, 21, 22, 210, 190, 21, 22, 215, 114, 21, 22, 214, 140, 215, 114, + 21, 22, 215, 113, 21, 22, 214, 140, 215, 113, 21, 22, 215, 112, 21, 22, + 214, 140, 215, 112, 21, 22, 215, 111, 21, 22, 214, 140, 215, 111, 21, 22, + 209, 94, 21, 22, 209, 93, 21, 22, 209, 92, 21, 22, 209, 91, 21, 22, 209, + 90, 21, 22, 209, 98, 21, 22, 214, 140, 214, 2, 21, 22, 214, 140, 203, + 216, 21, 22, 214, 140, 225, 79, 21, 22, 214, 140, 247, 206, 21, 22, 214, + 140, 221, 135, 21, 22, 214, 140, 218, 54, 21, 22, 214, 140, 209, 80, 21, + 22, 214, 140, 207, 52, 21, 22, 237, 66, 197, 199, 21, 22, 197, 86, 197, + 199, 21, 22, 48, 4, 210, 2, 21, 22, 48, 210, 214, 238, 252, 21, 22, 211, + 30, 209, 95, 21, 22, 197, 87, 221, 228, 21, 22, 197, 87, 223, 81, 21, 22, + 202, 131, 21, 22, 202, 133, 21, 22, 201, 58, 21, 22, 201, 60, 21, 22, + 201, 65, 21, 22, 202, 37, 21, 22, 202, 39, 21, 22, 208, 178, 206, 127, + 21, 22, 208, 178, 206, 190, 21, 22, 208, 178, 231, 165, 21, 22, 92, 233, + 28, 21, 22, 92, 239, 209, 234, 39, 21, 22, 92, 234, 119, 21, 22, 92, 233, + 33, 21, 22, 208, 178, 225, 89, 21, 22, 92, 225, 87, 21, 22, 248, 253, + 239, 209, 159, 21, 22, 248, 253, 239, 209, 144, 21, 22, 92, 239, 204, + 209, 80, 222, 84, 198, 226, 222, 134, 222, 84, 1, 155, 222, 84, 1, 224, + 145, 222, 84, 1, 234, 122, 222, 84, 1, 233, 229, 222, 84, 1, 217, 70, + 222, 84, 1, 247, 173, 222, 84, 1, 247, 15, 222, 84, 1, 225, 213, 222, 84, + 1, 225, 179, 222, 84, 1, 196, 97, 222, 84, 1, 189, 222, 84, 1, 202, 233, + 222, 84, 1, 240, 135, 222, 84, 1, 239, 175, 222, 84, 1, 176, 222, 84, 1, + 161, 222, 84, 1, 213, 5, 222, 84, 1, 249, 144, 222, 84, 1, 248, 196, 222, + 84, 1, 166, 222, 84, 1, 164, 222, 84, 1, 169, 222, 84, 1, 172, 222, 84, + 1, 197, 166, 222, 84, 1, 207, 50, 222, 84, 1, 205, 80, 222, 84, 1, 183, + 222, 84, 1, 142, 222, 84, 1, 233, 24, 222, 84, 1, 201, 217, 222, 84, 18, + 2, 63, 222, 84, 18, 2, 68, 222, 84, 18, 2, 66, 222, 84, 18, 2, 237, 53, + 222, 84, 18, 2, 251, 199, 222, 84, 18, 2, 214, 101, 222, 84, 18, 2, 250, + 149, 222, 84, 18, 2, 69, 222, 84, 18, 2, 72, 222, 84, 204, 152, 1, 164, + 222, 84, 204, 152, 1, 169, 222, 84, 204, 152, 1, 197, 166, 222, 84, 4, 1, + 155, 222, 84, 4, 1, 217, 70, 222, 84, 4, 1, 251, 50, 222, 84, 4, 1, 189, + 222, 84, 4, 1, 176, 222, 84, 4, 1, 161, 222, 84, 4, 1, 166, 222, 84, 4, + 1, 169, 222, 84, 4, 1, 172, 222, 84, 2, 218, 124, 222, 84, 2, 224, 187, + 222, 84, 2, 209, 14, 222, 84, 2, 221, 228, 222, 84, 236, 89, 78, 222, 84, + 211, 78, 78, 222, 84, 17, 195, 79, 222, 84, 17, 100, 222, 84, 17, 102, + 222, 84, 17, 134, 222, 84, 17, 136, 222, 84, 17, 146, 222, 84, 17, 167, + 222, 84, 17, 178, 222, 84, 17, 171, 222, 84, 17, 182, 49, 222, 197, 1, + 155, 49, 222, 197, 1, 196, 208, 49, 222, 197, 1, 217, 70, 49, 222, 197, + 1, 201, 113, 49, 222, 197, 1, 183, 49, 222, 197, 1, 164, 49, 222, 197, 1, + 189, 49, 222, 197, 1, 202, 233, 49, 222, 197, 1, 172, 49, 222, 197, 1, + 161, 49, 222, 197, 1, 213, 5, 49, 222, 197, 1, 166, 49, 222, 197, 1, 235, + 238, 49, 222, 197, 1, 199, 152, 49, 222, 197, 1, 142, 49, 222, 197, 1, + 211, 158, 49, 222, 197, 1, 224, 145, 49, 222, 197, 1, 201, 103, 49, 222, + 197, 1, 176, 49, 222, 197, 1, 63, 49, 222, 197, 1, 68, 49, 222, 197, 1, + 237, 53, 49, 222, 197, 1, 237, 39, 49, 222, 197, 1, 66, 49, 222, 197, 1, + 214, 101, 49, 222, 197, 1, 72, 49, 222, 197, 1, 200, 99, 49, 222, 197, 1, + 69, 49, 222, 197, 1, 250, 147, 49, 222, 197, 1, 251, 199, 49, 222, 197, + 1, 202, 9, 49, 222, 197, 1, 202, 8, 49, 222, 197, 1, 202, 7, 49, 222, + 197, 1, 202, 6, 49, 222, 197, 1, 202, 5, 217, 82, 49, 221, 184, 1, 130, + 211, 158, 217, 82, 49, 221, 184, 1, 126, 211, 158, 217, 82, 49, 221, 184, + 1, 130, 155, 217, 82, 49, 221, 184, 1, 130, 196, 208, 217, 82, 49, 221, + 184, 1, 130, 217, 70, 217, 82, 49, 221, 184, 1, 126, 155, 217, 82, 49, + 221, 184, 1, 126, 196, 208, 217, 82, 49, 221, 184, 1, 126, 217, 70, 217, + 82, 49, 221, 184, 1, 130, 201, 113, 217, 82, 49, 221, 184, 1, 130, 183, + 217, 82, 49, 221, 184, 1, 130, 164, 217, 82, 49, 221, 184, 1, 126, 201, + 113, 217, 82, 49, 221, 184, 1, 126, 183, 217, 82, 49, 221, 184, 1, 126, + 164, 217, 82, 49, 221, 184, 1, 130, 189, 217, 82, 49, 221, 184, 1, 130, + 202, 233, 217, 82, 49, 221, 184, 1, 130, 176, 217, 82, 49, 221, 184, 1, + 126, 189, 217, 82, 49, 221, 184, 1, 126, 202, 233, 217, 82, 49, 221, 184, + 1, 126, 176, 217, 82, 49, 221, 184, 1, 130, 161, 217, 82, 49, 221, 184, + 1, 130, 213, 5, 217, 82, 49, 221, 184, 1, 130, 166, 217, 82, 49, 221, + 184, 1, 126, 161, 217, 82, 49, 221, 184, 1, 126, 213, 5, 217, 82, 49, + 221, 184, 1, 126, 166, 217, 82, 49, 221, 184, 1, 130, 235, 238, 217, 82, + 49, 221, 184, 1, 130, 199, 152, 217, 82, 49, 221, 184, 1, 130, 172, 217, + 82, 49, 221, 184, 1, 126, 235, 238, 217, 82, 49, 221, 184, 1, 126, 199, + 152, 217, 82, 49, 221, 184, 1, 126, 172, 217, 82, 49, 221, 184, 1, 130, + 142, 217, 82, 49, 221, 184, 1, 130, 240, 135, 217, 82, 49, 221, 184, 1, + 130, 249, 144, 217, 82, 49, 221, 184, 1, 126, 142, 217, 82, 49, 221, 184, + 1, 126, 240, 135, 217, 82, 49, 221, 184, 1, 126, 249, 144, 217, 82, 49, + 221, 184, 1, 130, 223, 137, 217, 82, 49, 221, 184, 1, 130, 196, 174, 217, + 82, 49, 221, 184, 1, 126, 223, 137, 217, 82, 49, 221, 184, 1, 126, 196, + 174, 217, 82, 49, 221, 184, 1, 130, 204, 163, 217, 82, 49, 221, 184, 1, + 126, 204, 163, 217, 82, 49, 221, 184, 18, 2, 18, 206, 170, 217, 82, 49, + 221, 184, 18, 2, 252, 167, 217, 82, 49, 221, 184, 18, 2, 226, 119, 217, + 82, 49, 221, 184, 18, 2, 66, 217, 82, 49, 221, 184, 18, 2, 199, 245, 217, + 82, 49, 221, 184, 18, 2, 69, 217, 82, 49, 221, 184, 18, 2, 251, 244, 217, + 82, 49, 221, 184, 18, 2, 72, 217, 82, 49, 221, 184, 18, 2, 214, 189, 217, + 82, 49, 221, 184, 18, 2, 200, 99, 217, 82, 49, 221, 184, 18, 2, 250, 121, + 217, 82, 49, 221, 184, 18, 2, 252, 121, 217, 82, 49, 221, 184, 18, 2, + 199, 237, 217, 82, 49, 221, 184, 18, 2, 214, 7, 217, 82, 49, 221, 184, + 18, 2, 214, 186, 217, 82, 49, 221, 184, 18, 2, 200, 94, 217, 82, 49, 221, + 184, 18, 2, 225, 224, 217, 82, 49, 221, 184, 1, 48, 199, 230, 217, 82, + 49, 221, 184, 1, 48, 217, 72, 217, 82, 49, 221, 184, 1, 48, 218, 54, 217, + 82, 49, 221, 184, 1, 48, 221, 135, 217, 82, 49, 221, 184, 1, 48, 225, 79, + 217, 82, 49, 221, 184, 1, 48, 240, 230, 217, 82, 49, 221, 184, 1, 48, + 250, 111, 217, 82, 49, 221, 184, 152, 220, 27, 217, 82, 49, 221, 184, + 152, 220, 26, 217, 82, 49, 221, 184, 17, 195, 79, 217, 82, 49, 221, 184, + 17, 100, 217, 82, 49, 221, 184, 17, 102, 217, 82, 49, 221, 184, 17, 134, + 217, 82, 49, 221, 184, 17, 136, 217, 82, 49, 221, 184, 17, 146, 217, 82, + 49, 221, 184, 17, 167, 217, 82, 49, 221, 184, 17, 178, 217, 82, 49, 221, + 184, 17, 171, 217, 82, 49, 221, 184, 17, 182, 217, 82, 49, 221, 184, 120, + 17, 100, 217, 82, 49, 221, 184, 2, 223, 64, 217, 82, 49, 221, 184, 2, + 223, 63, 89, 16, 213, 110, 89, 16, 218, 104, 224, 2, 89, 16, 212, 182, + 224, 2, 89, 16, 248, 234, 224, 2, 89, 16, 247, 249, 224, 2, 89, 16, 212, + 49, 224, 2, 89, 16, 212, 43, 224, 2, 89, 16, 212, 41, 224, 2, 89, 16, + 212, 47, 224, 2, 89, 16, 212, 45, 224, 2, 89, 16, 240, 81, 224, 2, 89, + 16, 240, 77, 224, 2, 89, 16, 240, 76, 224, 2, 89, 16, 240, 79, 224, 2, + 89, 16, 240, 78, 224, 2, 89, 16, 240, 75, 224, 2, 89, 16, 200, 253, 89, + 16, 218, 104, 209, 219, 89, 16, 212, 182, 209, 219, 89, 16, 248, 234, + 209, 219, 89, 16, 247, 249, 209, 219, 89, 16, 212, 49, 209, 219, 89, 16, + 212, 43, 209, 219, 89, 16, 212, 41, 209, 219, 89, 16, 212, 47, 209, 219, + 89, 16, 212, 45, 209, 219, 89, 16, 240, 81, 209, 219, 89, 16, 240, 77, + 209, 219, 89, 16, 240, 76, 209, 219, 89, 16, 240, 79, 209, 219, 89, 16, + 240, 78, 209, 219, 89, 16, 240, 75, 209, 219, 248, 13, 1, 155, 248, 13, + 1, 234, 122, 248, 13, 1, 217, 70, 248, 13, 1, 217, 13, 248, 13, 1, 161, + 248, 13, 1, 249, 144, 248, 13, 1, 166, 248, 13, 1, 218, 150, 248, 13, 1, + 189, 248, 13, 1, 240, 135, 248, 13, 1, 176, 248, 13, 1, 215, 251, 248, + 13, 1, 247, 173, 248, 13, 1, 225, 213, 248, 13, 1, 215, 108, 248, 13, 1, + 215, 99, 248, 13, 1, 164, 248, 13, 1, 169, 248, 13, 1, 172, 248, 13, 1, + 199, 152, 248, 13, 1, 183, 248, 13, 1, 63, 248, 13, 1, 142, 248, 13, 18, + 2, 68, 248, 13, 18, 2, 66, 248, 13, 18, 2, 69, 248, 13, 18, 2, 72, 248, + 13, 18, 2, 251, 244, 248, 13, 213, 207, 248, 13, 236, 221, 77, 208, 132, + 49, 120, 1, 130, 155, 49, 120, 1, 130, 224, 145, 49, 120, 1, 130, 223, + 121, 49, 120, 1, 126, 155, 49, 120, 1, 126, 223, 121, 49, 120, 1, 126, + 224, 145, 49, 120, 1, 217, 70, 49, 120, 1, 130, 247, 173, 49, 120, 1, + 130, 247, 15, 49, 120, 1, 126, 247, 173, 49, 120, 1, 126, 183, 49, 120, + 1, 126, 247, 15, 49, 120, 1, 215, 108, 49, 120, 1, 210, 196, 49, 120, 1, + 130, 210, 194, 49, 120, 1, 240, 135, 49, 120, 1, 126, 210, 194, 49, 120, + 1, 210, 205, 49, 120, 1, 130, 189, 49, 120, 1, 130, 202, 233, 49, 120, 1, + 126, 189, 49, 120, 1, 126, 202, 233, 49, 120, 1, 176, 49, 120, 1, 249, + 144, 49, 120, 1, 130, 161, 49, 120, 1, 130, 213, 5, 49, 120, 1, 130, 235, + 238, 49, 120, 1, 126, 161, 49, 120, 1, 126, 235, 238, 49, 120, 1, 126, + 213, 5, 49, 120, 1, 166, 49, 120, 1, 126, 164, 49, 120, 1, 130, 164, 49, + 120, 1, 169, 49, 120, 1, 209, 129, 49, 120, 1, 172, 49, 120, 1, 221, 183, + 49, 120, 1, 197, 166, 49, 120, 1, 130, 207, 50, 49, 120, 1, 130, 205, 80, + 49, 120, 1, 130, 183, 49, 120, 1, 130, 142, 49, 120, 1, 222, 36, 49, 120, + 1, 63, 49, 120, 1, 126, 142, 49, 120, 1, 68, 49, 120, 1, 226, 119, 49, + 120, 1, 66, 49, 120, 1, 199, 245, 49, 120, 1, 237, 53, 49, 120, 1, 214, + 101, 49, 120, 1, 223, 64, 49, 120, 1, 233, 95, 183, 49, 120, 108, 2, 219, + 193, 169, 49, 120, 108, 2, 219, 193, 172, 49, 120, 108, 2, 223, 82, 203, + 111, 223, 53, 49, 120, 2, 220, 81, 225, 13, 223, 53, 49, 120, 108, 2, 48, + 217, 70, 49, 120, 108, 2, 126, 161, 49, 120, 108, 2, 130, 210, 195, 214, + 72, 126, 161, 49, 120, 108, 2, 166, 49, 120, 108, 2, 249, 144, 49, 120, + 108, 2, 183, 49, 120, 2, 208, 244, 49, 120, 18, 2, 63, 49, 120, 18, 2, + 220, 81, 208, 199, 49, 120, 18, 2, 252, 167, 49, 120, 18, 2, 203, 120, + 252, 167, 49, 120, 18, 2, 68, 49, 120, 18, 2, 226, 119, 49, 120, 18, 2, + 200, 99, 49, 120, 18, 2, 199, 244, 49, 120, 18, 2, 66, 49, 120, 18, 2, + 199, 245, 49, 120, 18, 2, 72, 49, 120, 18, 2, 214, 190, 60, 49, 120, 18, + 2, 214, 7, 49, 120, 18, 2, 69, 49, 120, 18, 2, 251, 244, 49, 120, 18, 2, + 214, 101, 49, 120, 18, 2, 251, 199, 49, 120, 18, 2, 120, 251, 199, 49, + 120, 18, 2, 214, 190, 57, 49, 120, 2, 220, 81, 225, 12, 49, 120, 2, 202, + 10, 49, 120, 2, 202, 9, 49, 120, 2, 224, 105, 202, 8, 49, 120, 2, 224, + 105, 202, 7, 49, 120, 2, 224, 105, 202, 6, 49, 120, 2, 210, 251, 232, + 244, 49, 120, 2, 220, 81, 208, 229, 49, 120, 2, 224, 104, 224, 249, 49, + 120, 38, 241, 43, 238, 252, 49, 120, 231, 156, 17, 195, 79, 49, 120, 231, + 156, 17, 100, 49, 120, 231, 156, 17, 102, 49, 120, 231, 156, 17, 134, 49, + 120, 231, 156, 17, 136, 49, 120, 231, 156, 17, 146, 49, 120, 231, 156, + 17, 167, 49, 120, 231, 156, 17, 178, 49, 120, 231, 156, 17, 171, 49, 120, + 231, 156, 17, 182, 49, 120, 120, 17, 195, 79, 49, 120, 120, 17, 100, 49, + 120, 120, 17, 102, 49, 120, 120, 17, 134, 49, 120, 120, 17, 136, 49, 120, + 120, 17, 146, 49, 120, 120, 17, 167, 49, 120, 120, 17, 178, 49, 120, 120, + 17, 171, 49, 120, 120, 17, 182, 49, 120, 2, 197, 64, 49, 120, 2, 197, 63, + 49, 120, 2, 208, 184, 49, 120, 2, 224, 176, 49, 120, 2, 231, 84, 49, 120, + 2, 239, 11, 49, 120, 2, 210, 89, 209, 194, 210, 205, 49, 120, 2, 220, 81, + 196, 98, 49, 120, 2, 225, 47, 49, 120, 2, 225, 46, 49, 120, 2, 208, 194, + 49, 120, 2, 208, 193, 49, 120, 2, 232, 181, 49, 120, 2, 247, 170, 38, + 237, 239, 244, 240, 252, 21, 38, 239, 148, 38, 226, 62, 38, 237, 230, 51, + 38, 201, 165, 238, 252, 38, 196, 221, 60, 38, 197, 56, 222, 75, 60, 38, + 192, 117, 60, 38, 52, 192, 117, 60, 38, 175, 247, 37, 204, 196, 60, 38, + 204, 182, 247, 37, 204, 196, 60, 38, 213, 141, 57, 38, 52, 213, 141, 57, + 38, 213, 141, 60, 38, 213, 141, 214, 19, 141, 2, 200, 82, 210, 59, 141, + 2, 200, 82, 247, 134, 141, 2, 247, 52, 141, 2, 204, 86, 141, 2, 248, 150, + 141, 1, 251, 178, 141, 1, 251, 179, 203, 50, 141, 1, 226, 115, 141, 1, + 226, 116, 203, 50, 141, 1, 200, 85, 141, 1, 200, 86, 203, 50, 141, 1, + 210, 251, 210, 122, 141, 1, 210, 251, 210, 123, 203, 50, 141, 1, 223, 82, + 222, 158, 141, 1, 223, 82, 222, 159, 203, 50, 141, 1, 237, 11, 141, 1, + 251, 196, 141, 1, 214, 136, 141, 1, 214, 137, 203, 50, 141, 1, 155, 141, + 1, 225, 69, 220, 84, 141, 1, 234, 122, 141, 1, 234, 123, 233, 128, 141, + 1, 217, 70, 141, 1, 247, 173, 141, 1, 247, 174, 223, 68, 141, 1, 225, + 213, 141, 1, 225, 214, 225, 183, 141, 1, 215, 108, 141, 1, 203, 169, 222, + 216, 141, 1, 203, 169, 218, 99, 220, 84, 141, 1, 240, 136, 218, 99, 251, + 135, 141, 1, 240, 136, 218, 99, 220, 84, 141, 1, 218, 0, 210, 208, 141, + 1, 189, 141, 1, 203, 169, 203, 81, 141, 1, 240, 135, 141, 1, 240, 136, + 220, 105, 141, 1, 176, 141, 1, 161, 141, 1, 213, 243, 225, 5, 141, 1, + 249, 144, 141, 1, 249, 145, 224, 188, 141, 1, 166, 141, 1, 164, 141, 1, + 169, 141, 1, 172, 141, 1, 197, 166, 141, 1, 209, 23, 209, 0, 141, 1, 209, + 23, 208, 206, 141, 1, 183, 141, 1, 142, 141, 2, 210, 112, 141, 18, 2, + 203, 50, 141, 18, 2, 200, 81, 141, 18, 2, 200, 82, 208, 202, 141, 18, 2, + 204, 121, 141, 18, 2, 204, 122, 226, 107, 141, 18, 2, 210, 251, 210, 122, + 141, 18, 2, 210, 251, 210, 123, 203, 50, 141, 18, 2, 223, 82, 222, 158, + 141, 18, 2, 223, 82, 222, 159, 203, 50, 141, 18, 2, 203, 121, 141, 18, 2, + 203, 122, 210, 122, 141, 18, 2, 203, 122, 203, 50, 141, 18, 2, 203, 122, + 210, 123, 203, 50, 141, 18, 2, 213, 47, 141, 18, 2, 213, 48, 203, 50, + 141, 252, 0, 251, 255, 141, 1, 225, 35, 208, 201, 141, 1, 224, 111, 208, + 201, 141, 1, 200, 181, 208, 201, 141, 1, 237, 47, 208, 201, 141, 1, 199, + 119, 208, 201, 141, 1, 195, 105, 208, 201, 141, 1, 250, 170, 208, 201, + 141, 17, 195, 79, 141, 17, 100, 141, 17, 102, 141, 17, 134, 141, 17, 136, + 141, 17, 146, 141, 17, 167, 141, 17, 178, 141, 17, 171, 141, 17, 182, + 141, 213, 170, 141, 213, 199, 141, 197, 48, 141, 247, 107, 213, 192, 141, + 247, 107, 206, 81, 141, 247, 107, 213, 138, 141, 213, 198, 141, 34, 16, + 239, 3, 141, 34, 16, 239, 208, 141, 34, 16, 237, 183, 141, 34, 16, 240, + 85, 141, 34, 16, 240, 86, 204, 86, 141, 34, 16, 239, 93, 141, 34, 16, + 240, 127, 141, 34, 16, 239, 184, 141, 34, 16, 240, 109, 141, 34, 16, 240, + 86, 234, 41, 141, 34, 16, 38, 203, 43, 141, 34, 16, 38, 236, 218, 141, + 34, 16, 38, 224, 183, 141, 34, 16, 38, 224, 185, 141, 34, 16, 38, 225, + 187, 141, 34, 16, 38, 224, 184, 3, 225, 187, 141, 34, 16, 38, 224, 186, + 3, 225, 187, 141, 34, 16, 38, 248, 219, 141, 34, 16, 38, 233, 132, 141, + 34, 16, 210, 20, 192, 237, 194, 141, 34, 16, 210, 20, 192, 240, 125, 141, + 34, 16, 210, 20, 244, 202, 201, 26, 141, 34, 16, 210, 20, 244, 202, 203, + 131, 141, 34, 16, 222, 181, 192, 213, 184, 141, 34, 16, 222, 181, 192, + 211, 210, 141, 34, 16, 222, 181, 244, 202, 212, 144, 141, 34, 16, 222, + 181, 244, 202, 212, 128, 141, 34, 16, 222, 181, 192, 212, 170, 204, 110, + 2, 213, 167, 204, 110, 2, 213, 180, 204, 110, 2, 213, 176, 204, 110, 1, + 63, 204, 110, 1, 68, 204, 110, 1, 66, 204, 110, 1, 251, 244, 204, 110, 1, + 72, 204, 110, 1, 69, 204, 110, 1, 236, 115, 204, 110, 1, 155, 204, 110, + 1, 211, 158, 204, 110, 1, 234, 122, 204, 110, 1, 217, 70, 204, 110, 1, + 247, 173, 204, 110, 1, 225, 213, 204, 110, 1, 195, 115, 204, 110, 1, 215, + 108, 204, 110, 1, 189, 204, 110, 1, 240, 135, 204, 110, 1, 176, 204, 110, + 1, 161, 204, 110, 1, 235, 238, 204, 110, 1, 199, 152, 204, 110, 1, 249, + 144, 204, 110, 1, 166, 204, 110, 1, 164, 204, 110, 1, 169, 204, 110, 1, + 172, 204, 110, 1, 197, 166, 204, 110, 1, 183, 204, 110, 1, 196, 208, 204, + 110, 1, 142, 204, 110, 108, 2, 213, 196, 204, 110, 108, 2, 213, 169, 204, + 110, 108, 2, 213, 166, 204, 110, 18, 2, 213, 183, 204, 110, 18, 2, 213, + 165, 204, 110, 18, 2, 213, 189, 204, 110, 18, 2, 213, 175, 204, 110, 18, + 2, 213, 197, 204, 110, 18, 2, 213, 185, 204, 110, 2, 213, 200, 204, 110, + 2, 199, 7, 204, 110, 108, 2, 213, 126, 166, 204, 110, 108, 2, 213, 126, + 197, 166, 204, 110, 1, 224, 145, 204, 110, 1, 204, 43, 204, 110, 17, 195, + 79, 204, 110, 17, 100, 204, 110, 17, 102, 204, 110, 17, 134, 204, 110, + 17, 136, 204, 110, 17, 146, 204, 110, 17, 167, 204, 110, 17, 178, 204, + 110, 17, 171, 204, 110, 17, 182, 204, 110, 250, 131, 204, 110, 1, 210, + 92, 204, 110, 1, 222, 131, 204, 110, 1, 248, 196, 204, 110, 1, 48, 225, + 79, 204, 110, 1, 48, 221, 135, 249, 54, 1, 63, 249, 54, 1, 206, 73, 63, + 249, 54, 1, 142, 249, 54, 1, 206, 73, 142, 249, 54, 1, 220, 56, 142, 249, + 54, 1, 249, 144, 249, 54, 1, 224, 246, 249, 144, 249, 54, 1, 161, 249, + 54, 1, 206, 73, 161, 249, 54, 1, 176, 249, 54, 1, 220, 56, 176, 249, 54, + 1, 197, 166, 249, 54, 1, 206, 73, 197, 166, 249, 54, 1, 213, 215, 197, + 166, 249, 54, 1, 234, 122, 249, 54, 1, 206, 73, 234, 122, 249, 54, 1, + 225, 213, 249, 54, 1, 240, 135, 249, 54, 1, 169, 249, 54, 1, 206, 73, + 169, 249, 54, 1, 166, 249, 54, 1, 206, 73, 166, 249, 54, 1, 205, 157, + 189, 249, 54, 1, 216, 22, 189, 249, 54, 1, 183, 249, 54, 1, 206, 73, 183, + 249, 54, 1, 220, 56, 183, 249, 54, 1, 164, 249, 54, 1, 206, 73, 164, 249, + 54, 1, 217, 70, 249, 54, 1, 172, 249, 54, 1, 206, 73, 172, 249, 54, 1, + 215, 108, 249, 54, 1, 247, 173, 249, 54, 1, 217, 158, 249, 54, 1, 219, + 240, 249, 54, 1, 68, 249, 54, 1, 66, 249, 54, 2, 202, 14, 249, 54, 18, 2, + 69, 249, 54, 18, 2, 213, 215, 69, 249, 54, 18, 2, 237, 53, 249, 54, 18, + 2, 68, 249, 54, 18, 2, 224, 246, 68, 249, 54, 18, 2, 72, 249, 54, 18, 2, + 224, 246, 72, 249, 54, 18, 2, 66, 249, 54, 18, 2, 118, 36, 206, 73, 183, + 249, 54, 108, 2, 217, 72, 249, 54, 108, 2, 233, 14, 249, 54, 213, 178, + 249, 54, 213, 174, 249, 54, 16, 248, 160, 218, 0, 219, 140, 249, 54, 16, + 248, 160, 212, 174, 249, 54, 16, 248, 160, 225, 106, 249, 54, 16, 248, + 160, 213, 178, 222, 142, 1, 155, 222, 142, 1, 224, 28, 222, 142, 1, 224, + 145, 222, 142, 1, 234, 122, 222, 142, 1, 233, 159, 222, 142, 1, 217, 70, + 222, 142, 1, 247, 173, 222, 142, 1, 247, 15, 222, 142, 1, 225, 213, 222, + 142, 1, 215, 108, 222, 142, 1, 189, 222, 142, 1, 202, 233, 222, 142, 1, + 240, 135, 222, 142, 1, 176, 222, 142, 1, 161, 222, 142, 1, 212, 149, 222, + 142, 1, 213, 5, 222, 142, 1, 235, 238, 222, 142, 1, 235, 94, 222, 142, 1, + 249, 144, 222, 142, 1, 248, 136, 222, 142, 1, 166, 222, 142, 1, 219, 1, + 222, 142, 1, 201, 113, 222, 142, 1, 201, 103, 222, 142, 1, 237, 155, 222, + 142, 1, 164, 222, 142, 1, 169, 222, 142, 1, 172, 222, 142, 1, 142, 222, + 142, 1, 232, 24, 222, 142, 1, 199, 152, 222, 142, 1, 183, 222, 142, 1, + 207, 50, 222, 142, 1, 197, 166, 222, 142, 1, 63, 222, 142, 204, 152, 1, + 164, 222, 142, 204, 152, 1, 169, 222, 142, 18, 2, 252, 167, 222, 142, 18, + 2, 68, 222, 142, 18, 2, 72, 222, 142, 18, 2, 214, 101, 222, 142, 18, 2, + 66, 222, 142, 18, 2, 199, 245, 222, 142, 18, 2, 69, 222, 142, 108, 2, + 225, 79, 222, 142, 108, 2, 221, 135, 222, 142, 108, 2, 159, 222, 142, + 108, 2, 218, 54, 222, 142, 108, 2, 214, 2, 222, 142, 108, 2, 144, 222, + 142, 108, 2, 203, 216, 222, 142, 108, 2, 215, 80, 222, 142, 108, 2, 225, + 12, 222, 142, 2, 210, 206, 222, 142, 2, 215, 148, 222, 142, 211, 213, + 203, 164, 222, 142, 211, 213, 215, 92, 202, 125, 203, 164, 222, 142, 211, + 213, 247, 24, 222, 142, 211, 213, 201, 95, 247, 24, 222, 142, 211, 213, + 201, 94, 222, 142, 17, 195, 79, 222, 142, 17, 100, 222, 142, 17, 102, + 222, 142, 17, 134, 222, 142, 17, 136, 222, 142, 17, 146, 222, 142, 17, + 167, 222, 142, 17, 178, 222, 142, 17, 171, 222, 142, 17, 182, 222, 142, + 1, 201, 78, 222, 142, 1, 201, 66, 222, 142, 1, 240, 40, 214, 134, 245, + 67, 17, 195, 79, 214, 134, 245, 67, 17, 100, 214, 134, 245, 67, 17, 102, + 214, 134, 245, 67, 17, 134, 214, 134, 245, 67, 17, 136, 214, 134, 245, + 67, 17, 146, 214, 134, 245, 67, 17, 167, 214, 134, 245, 67, 17, 178, 214, + 134, 245, 67, 17, 171, 214, 134, 245, 67, 17, 182, 214, 134, 245, 67, 1, + 172, 214, 134, 245, 67, 1, 250, 167, 214, 134, 245, 67, 1, 251, 216, 214, + 134, 245, 67, 1, 251, 96, 214, 134, 245, 67, 1, 251, 172, 214, 134, 245, + 67, 1, 223, 81, 214, 134, 245, 67, 1, 252, 129, 214, 134, 245, 67, 1, + 252, 130, 214, 134, 245, 67, 1, 252, 128, 214, 134, 245, 67, 1, 252, 122, + 214, 134, 245, 67, 1, 222, 108, 214, 134, 245, 67, 1, 225, 247, 214, 134, + 245, 67, 1, 226, 120, 214, 134, 245, 67, 1, 226, 13, 214, 134, 245, 67, + 1, 226, 0, 214, 134, 245, 67, 1, 221, 190, 214, 134, 245, 67, 1, 200, + 106, 214, 134, 245, 67, 1, 200, 104, 214, 134, 245, 67, 1, 200, 42, 214, + 134, 245, 67, 1, 199, 237, 214, 134, 245, 67, 1, 222, 196, 214, 134, 245, + 67, 1, 236, 182, 214, 134, 245, 67, 1, 237, 56, 214, 134, 245, 67, 1, + 236, 229, 214, 134, 245, 67, 1, 236, 154, 214, 134, 245, 67, 1, 222, 6, + 214, 134, 245, 67, 1, 214, 43, 214, 134, 245, 67, 1, 214, 185, 214, 134, + 245, 67, 1, 214, 28, 214, 134, 245, 67, 1, 214, 148, 214, 134, 245, 67, + 218, 145, 201, 43, 214, 134, 245, 67, 234, 117, 201, 44, 214, 134, 245, + 67, 218, 139, 201, 44, 214, 134, 245, 67, 210, 137, 214, 134, 245, 67, + 213, 3, 214, 134, 245, 67, 251, 207, 214, 134, 245, 67, 211, 213, 218, + 135, 214, 134, 245, 67, 211, 213, 52, 218, 135, 40, 4, 1, 209, 185, 199, + 118, 40, 4, 1, 221, 232, 239, 251, 40, 4, 1, 217, 209, 72, 40, 4, 1, 197, + 62, 236, 150, 40, 4, 1, 203, 120, 203, 68, 40, 4, 1, 202, 150, 203, 68, + 40, 4, 1, 203, 120, 232, 172, 55, 40, 4, 1, 203, 120, 196, 84, 40, 4, 1, + 200, 67, 200, 87, 94, 218, 146, 6, 1, 251, 105, 94, 218, 146, 6, 1, 249, + 92, 94, 218, 146, 6, 1, 234, 92, 94, 218, 146, 6, 1, 239, 5, 94, 218, + 146, 6, 1, 236, 229, 94, 218, 146, 6, 1, 199, 16, 94, 218, 146, 6, 1, + 195, 82, 94, 218, 146, 6, 1, 203, 114, 94, 218, 146, 6, 1, 226, 85, 94, + 218, 146, 6, 1, 225, 16, 94, 218, 146, 6, 1, 222, 221, 94, 218, 146, 6, + 1, 220, 61, 94, 218, 146, 6, 1, 217, 210, 94, 218, 146, 6, 1, 214, 118, + 94, 218, 146, 6, 1, 213, 156, 94, 218, 146, 6, 1, 195, 70, 94, 218, 146, + 6, 1, 210, 228, 94, 218, 146, 6, 1, 208, 219, 94, 218, 146, 6, 1, 203, + 101, 94, 218, 146, 6, 1, 200, 72, 94, 218, 146, 6, 1, 212, 253, 94, 218, + 146, 6, 1, 224, 133, 94, 218, 146, 6, 1, 233, 220, 94, 218, 146, 6, 1, + 211, 143, 94, 218, 146, 6, 1, 206, 211, 94, 218, 146, 6, 1, 245, 61, 94, + 218, 146, 6, 1, 247, 141, 94, 218, 146, 6, 1, 225, 161, 94, 218, 146, 6, + 1, 244, 255, 94, 218, 146, 6, 1, 246, 255, 94, 218, 146, 6, 1, 196, 206, + 94, 218, 146, 6, 1, 225, 176, 94, 218, 146, 6, 1, 232, 241, 94, 218, 146, + 6, 1, 232, 146, 94, 218, 146, 6, 1, 232, 57, 94, 218, 146, 6, 1, 197, + 109, 94, 218, 146, 6, 1, 232, 174, 94, 218, 146, 6, 1, 231, 180, 94, 218, + 146, 6, 1, 235, 152, 94, 218, 146, 6, 1, 196, 5, 94, 218, 146, 6, 1, 236, + 248, 94, 218, 146, 6, 1, 163, 234, 92, 94, 218, 146, 6, 1, 251, 193, 94, + 218, 146, 6, 1, 251, 233, 94, 218, 146, 6, 1, 232, 172, 55, 94, 218, 146, + 6, 1, 223, 72, 55, 204, 110, 211, 213, 248, 160, 204, 79, 204, 110, 211, + 213, 248, 160, 213, 179, 204, 110, 211, 213, 248, 160, 211, 200, 204, + 110, 211, 213, 248, 160, 247, 158, 204, 110, 211, 213, 248, 160, 222, + 132, 208, 198, 204, 110, 211, 213, 248, 160, 225, 69, 208, 198, 204, 110, + 211, 213, 248, 160, 240, 136, 208, 198, 204, 110, 211, 213, 248, 160, + 249, 145, 208, 198, 199, 115, 152, 224, 242, 199, 115, 152, 207, 16, 199, + 115, 152, 212, 28, 199, 115, 2, 216, 190, 199, 115, 2, 196, 106, 219, 60, + 204, 70, 199, 115, 152, 196, 106, 251, 212, 226, 72, 204, 70, 199, 115, + 152, 196, 106, 226, 72, 204, 70, 199, 115, 152, 196, 106, 224, 230, 226, + 72, 204, 70, 199, 115, 152, 247, 135, 60, 199, 115, 152, 196, 106, 224, + 230, 226, 72, 204, 71, 208, 165, 199, 115, 152, 52, 204, 70, 199, 115, + 152, 201, 165, 204, 70, 199, 115, 152, 224, 230, 251, 52, 199, 115, 152, + 76, 60, 199, 115, 152, 99, 238, 250, 60, 199, 115, 152, 115, 238, 250, + 60, 199, 115, 152, 210, 10, 224, 241, 226, 72, 204, 70, 199, 115, 152, + 250, 164, 226, 72, 204, 70, 199, 115, 2, 199, 3, 204, 70, 199, 115, 2, + 199, 3, 200, 101, 199, 115, 2, 210, 89, 199, 3, 200, 101, 199, 115, 2, + 199, 3, 251, 52, 199, 115, 2, 210, 89, 199, 3, 251, 52, 199, 115, 2, 199, + 3, 200, 102, 3, 203, 135, 199, 115, 2, 199, 3, 251, 53, 3, 203, 135, 199, + 115, 2, 251, 51, 251, 67, 199, 115, 2, 251, 51, 249, 111, 199, 115, 2, + 251, 51, 199, 142, 199, 115, 2, 251, 51, 199, 143, 3, 203, 135, 199, 115, + 2, 202, 58, 199, 115, 2, 232, 82, 181, 251, 50, 199, 115, 2, 181, 251, + 50, 199, 115, 2, 209, 142, 181, 251, 50, 199, 115, 2, 251, 51, 200, 108, + 218, 126, 199, 115, 2, 250, 246, 199, 115, 2, 209, 194, 250, 246, 199, + 115, 152, 247, 135, 57, 199, 115, 2, 225, 164, 199, 115, 2, 200, 34, 199, + 115, 2, 250, 162, 199, 115, 152, 210, 3, 57, 199, 115, 152, 52, 210, 3, + 57, 199, 115, 2, 52, 251, 51, 251, 67, 8, 1, 4, 6, 63, 8, 1, 4, 6, 251, + 244, 8, 4, 1, 163, 251, 244, 8, 1, 4, 6, 249, 73, 250, 111, 8, 1, 4, 6, + 247, 206, 8, 1, 4, 6, 240, 230, 8, 1, 4, 6, 236, 120, 8, 1, 4, 6, 69, 8, + 4, 1, 163, 192, 69, 8, 4, 1, 163, 68, 8, 1, 4, 6, 225, 216, 8, 1, 4, 6, + 225, 79, 8, 1, 4, 6, 223, 99, 3, 106, 8, 1, 4, 6, 221, 135, 8, 1, 4, 6, + 210, 89, 218, 54, 8, 1, 4, 6, 72, 8, 1, 4, 6, 192, 72, 8, 4, 1, 206, 96, + 72, 8, 4, 1, 206, 96, 192, 72, 8, 4, 1, 206, 96, 177, 3, 106, 8, 4, 1, + 163, 214, 163, 8, 1, 4, 6, 214, 38, 8, 4, 1, 201, 243, 157, 72, 8, 4, 1, + 248, 84, 157, 72, 8, 1, 4, 6, 214, 2, 8, 1, 4, 6, 210, 89, 144, 8, 1, 4, + 6, 163, 144, 8, 1, 4, 6, 203, 216, 8, 1, 4, 6, 66, 8, 4, 1, 206, 96, 66, + 8, 4, 1, 206, 96, 239, 147, 66, 8, 4, 1, 206, 96, 163, 221, 135, 8, 1, 4, + 6, 199, 230, 8, 1, 4, 6, 197, 199, 8, 1, 4, 6, 195, 158, 8, 1, 4, 6, 236, + 51, 8, 1, 198, 244, 222, 222, 205, 119, 8, 1, 251, 193, 32, 1, 4, 6, 234, + 93, 32, 1, 4, 6, 222, 244, 32, 1, 4, 6, 212, 219, 32, 1, 4, 6, 210, 74, + 32, 1, 4, 6, 211, 237, 40, 1, 4, 6, 237, 6, 73, 1, 6, 63, 73, 1, 6, 251, + 244, 73, 1, 6, 250, 111, 73, 1, 6, 249, 73, 250, 111, 73, 1, 6, 240, 230, + 73, 1, 6, 69, 73, 1, 6, 210, 89, 69, 73, 1, 6, 234, 189, 73, 1, 6, 233, + 14, 73, 1, 6, 68, 73, 1, 6, 225, 216, 73, 1, 6, 225, 79, 73, 1, 6, 159, + 73, 1, 6, 221, 135, 73, 1, 6, 218, 54, 73, 1, 6, 210, 89, 218, 54, 73, 1, + 6, 72, 73, 1, 6, 214, 38, 73, 1, 6, 214, 2, 73, 1, 6, 144, 73, 1, 6, 203, + 216, 73, 1, 6, 66, 73, 1, 6, 197, 199, 73, 1, 4, 63, 73, 1, 4, 163, 63, + 73, 1, 4, 251, 133, 73, 1, 4, 163, 251, 244, 73, 1, 4, 250, 111, 73, 1, + 4, 240, 230, 73, 1, 4, 69, 73, 1, 4, 208, 163, 73, 1, 4, 192, 69, 73, 1, + 4, 163, 192, 69, 73, 1, 4, 234, 189, 73, 1, 4, 163, 68, 73, 1, 4, 225, + 79, 73, 1, 4, 221, 135, 73, 1, 4, 236, 214, 73, 1, 4, 72, 73, 1, 4, 192, + 72, 73, 1, 4, 201, 243, 157, 72, 73, 1, 4, 248, 84, 157, 72, 73, 1, 4, + 214, 2, 73, 1, 4, 203, 216, 73, 1, 4, 66, 73, 1, 4, 206, 96, 66, 73, 1, + 4, 163, 221, 135, 73, 1, 4, 199, 230, 73, 1, 4, 251, 193, 73, 1, 4, 248, + 205, 73, 1, 4, 32, 234, 93, 73, 1, 4, 239, 211, 73, 1, 4, 32, 212, 245, + 73, 1, 4, 245, 74, 8, 204, 143, 4, 1, 68, 8, 204, 143, 4, 1, 144, 8, 204, + 143, 4, 1, 66, 8, 204, 143, 4, 1, 199, 230, 32, 204, 143, 4, 1, 248, 205, + 32, 204, 143, 4, 1, 234, 93, 32, 204, 143, 4, 1, 210, 74, 32, 204, 143, + 4, 1, 212, 245, 32, 204, 143, 4, 1, 245, 74, 8, 4, 1, 200, 99, 8, 4, 1, + 74, 3, 112, 202, 84, 8, 4, 1, 240, 231, 3, 112, 202, 84, 8, 4, 1, 236, + 49, 3, 112, 202, 84, 8, 4, 1, 221, 136, 3, 112, 202, 84, 8, 4, 1, 218, + 55, 3, 112, 202, 84, 8, 4, 1, 214, 3, 3, 112, 202, 84, 8, 4, 1, 211, 31, + 3, 112, 202, 84, 8, 4, 1, 211, 31, 3, 235, 108, 26, 112, 202, 84, 8, 4, + 1, 209, 81, 3, 112, 202, 84, 8, 4, 1, 203, 217, 3, 112, 202, 84, 8, 4, 1, + 195, 159, 3, 112, 202, 84, 8, 4, 1, 163, 234, 189, 73, 1, 40, 236, 229, + 8, 4, 1, 226, 38, 234, 189, 8, 4, 1, 202, 236, 3, 204, 200, 8, 4, 6, 1, + 230, 248, 3, 106, 8, 4, 1, 226, 7, 3, 106, 8, 4, 1, 214, 3, 3, 106, 8, 4, + 6, 1, 118, 3, 106, 8, 4, 1, 200, 29, 3, 106, 8, 4, 1, 74, 3, 213, 214, + 122, 8, 4, 1, 240, 231, 3, 213, 214, 122, 8, 4, 1, 236, 49, 3, 213, 214, + 122, 8, 4, 1, 234, 190, 3, 213, 214, 122, 8, 4, 1, 225, 80, 3, 213, 214, + 122, 8, 4, 1, 223, 99, 3, 213, 214, 122, 8, 4, 1, 221, 136, 3, 213, 214, + 122, 8, 4, 1, 218, 55, 3, 213, 214, 122, 8, 4, 1, 214, 3, 3, 213, 214, + 122, 8, 4, 1, 211, 31, 3, 213, 214, 122, 8, 4, 1, 209, 81, 3, 213, 214, + 122, 8, 4, 1, 236, 141, 3, 213, 214, 122, 8, 4, 1, 199, 231, 3, 213, 214, + 122, 8, 4, 1, 196, 223, 3, 213, 214, 122, 8, 4, 1, 195, 159, 3, 213, 214, + 122, 8, 4, 1, 39, 3, 210, 95, 122, 8, 4, 1, 251, 134, 3, 210, 95, 122, 8, + 4, 1, 240, 231, 3, 231, 164, 26, 203, 135, 8, 4, 1, 237, 135, 3, 210, 95, + 122, 8, 4, 1, 192, 237, 135, 3, 210, 95, 122, 8, 4, 1, 210, 89, 192, 237, + 135, 3, 210, 95, 122, 8, 4, 1, 208, 164, 3, 210, 95, 122, 8, 4, 1, 230, + 248, 3, 210, 95, 122, 8, 4, 1, 192, 177, 3, 210, 95, 122, 8, 4, 1, 236, + 141, 3, 210, 95, 122, 8, 4, 1, 118, 3, 210, 95, 122, 8, 4, 1, 236, 52, 3, + 210, 95, 122, 73, 1, 4, 163, 251, 133, 73, 1, 4, 247, 206, 73, 1, 4, 247, + 207, 3, 241, 20, 73, 1, 4, 236, 120, 73, 1, 4, 210, 89, 192, 69, 73, 1, + 4, 236, 48, 73, 1, 4, 238, 251, 225, 217, 3, 106, 73, 1, 4, 145, 234, + 189, 73, 1, 4, 163, 233, 14, 73, 1, 4, 230, 248, 3, 106, 73, 1, 4, 226, + 6, 73, 1, 4, 6, 68, 73, 1, 4, 6, 230, 248, 3, 106, 73, 1, 4, 225, 217, 3, + 241, 56, 73, 1, 4, 223, 99, 3, 210, 95, 122, 73, 1, 4, 223, 99, 3, 213, + 214, 122, 73, 1, 4, 6, 159, 73, 1, 4, 221, 136, 3, 122, 73, 1, 4, 163, + 221, 136, 3, 181, 222, 171, 73, 1, 4, 218, 55, 3, 50, 122, 73, 1, 4, 218, + 55, 3, 210, 95, 122, 73, 1, 4, 6, 218, 54, 73, 1, 4, 249, 73, 72, 73, 1, + 4, 212, 245, 73, 1, 4, 209, 81, 3, 122, 73, 1, 4, 236, 140, 73, 1, 4, + 203, 217, 3, 213, 214, 122, 73, 1, 4, 118, 154, 73, 1, 4, 200, 28, 73, 1, + 4, 6, 66, 73, 1, 4, 199, 231, 3, 122, 73, 1, 4, 163, 199, 230, 73, 1, 4, + 195, 158, 73, 1, 4, 195, 159, 3, 210, 95, 122, 73, 1, 4, 195, 159, 3, + 241, 20, 73, 1, 4, 236, 51, 73, 1, 4, 202, 199, 38, 237, 249, 233, 100, + 252, 21, 38, 237, 249, 252, 9, 252, 21, 38, 205, 213, 60, 38, 204, 77, + 78, 38, 220, 112, 38, 233, 97, 38, 220, 110, 38, 252, 7, 38, 233, 98, 38, + 252, 8, 38, 8, 4, 1, 211, 31, 60, 38, 248, 45, 38, 220, 111, 38, 52, 244, + 240, 57, 38, 214, 151, 57, 38, 195, 24, 60, 38, 225, 248, 60, 38, 200, + 22, 57, 38, 200, 5, 57, 38, 8, 4, 1, 235, 78, 192, 39, 57, 38, 8, 4, 1, + 251, 244, 38, 8, 4, 1, 251, 48, 38, 8, 4, 1, 250, 132, 38, 8, 4, 1, 247, + 207, 247, 49, 38, 8, 4, 1, 226, 38, 240, 230, 38, 8, 4, 1, 236, 120, 38, + 8, 4, 1, 234, 189, 38, 8, 1, 4, 6, 234, 189, 38, 8, 4, 1, 225, 79, 38, 8, + 4, 1, 159, 38, 8, 1, 4, 6, 159, 38, 8, 1, 4, 6, 221, 135, 38, 8, 4, 1, + 218, 54, 38, 8, 1, 4, 6, 218, 54, 38, 8, 1, 4, 6, 144, 38, 8, 4, 1, 211, + 31, 209, 188, 38, 8, 4, 1, 209, 80, 38, 8, 4, 1, 181, 209, 80, 38, 8, 4, + 1, 195, 158, 38, 8, 4, 1, 251, 133, 38, 8, 4, 1, 250, 111, 38, 8, 4, 1, + 248, 205, 38, 8, 4, 1, 208, 163, 38, 8, 4, 1, 236, 48, 38, 8, 4, 1, 223, + 99, 3, 52, 112, 202, 84, 38, 8, 4, 1, 177, 3, 175, 247, 37, 106, 38, 8, + 4, 1, 214, 2, 38, 8, 4, 1, 236, 140, 38, 8, 4, 1, 118, 3, 175, 247, 37, + 106, 38, 8, 4, 1, 197, 199, 38, 8, 4, 1, 39, 3, 239, 149, 38, 8, 4, 1, + 177, 3, 239, 149, 38, 8, 4, 1, 118, 3, 239, 149, 38, 124, 203, 148, 57, + 38, 224, 221, 90, 210, 22, 38, 224, 221, 90, 222, 183, 38, 76, 90, 222, + 183, 38, 197, 62, 226, 16, 248, 39, 60, 38, 239, 220, 78, 38, 52, 226, + 16, 248, 47, 60, 38, 251, 138, 180, 202, 30, 60, 38, 50, 250, 217, 57, + 38, 53, 250, 217, 26, 135, 250, 217, 60, 8, 6, 1, 39, 3, 210, 3, 60, 8, + 4, 1, 39, 3, 210, 3, 60, 8, 6, 1, 74, 3, 76, 57, 8, 4, 1, 74, 3, 76, 57, + 8, 6, 1, 74, 3, 76, 60, 8, 4, 1, 74, 3, 76, 60, 8, 6, 1, 74, 3, 222, 75, + 60, 8, 4, 1, 74, 3, 222, 75, 60, 8, 6, 1, 247, 207, 3, 247, 50, 26, 186, + 8, 4, 1, 247, 207, 3, 247, 50, 26, 186, 8, 6, 1, 240, 231, 3, 76, 57, 8, + 4, 1, 240, 231, 3, 76, 57, 8, 6, 1, 240, 231, 3, 76, 60, 8, 4, 1, 240, + 231, 3, 76, 60, 8, 6, 1, 240, 231, 3, 222, 75, 60, 8, 4, 1, 240, 231, 3, + 222, 75, 60, 8, 6, 1, 240, 231, 3, 247, 49, 8, 4, 1, 240, 231, 3, 247, + 49, 8, 6, 1, 240, 231, 3, 244, 240, 60, 8, 4, 1, 240, 231, 3, 244, 240, + 60, 8, 6, 1, 237, 135, 3, 220, 114, 26, 233, 99, 8, 4, 1, 237, 135, 3, + 220, 114, 26, 233, 99, 8, 6, 1, 237, 135, 3, 220, 114, 26, 186, 8, 4, 1, + 237, 135, 3, 220, 114, 26, 186, 8, 6, 1, 237, 135, 3, 244, 240, 60, 8, 4, + 1, 237, 135, 3, 244, 240, 60, 8, 6, 1, 237, 135, 3, 202, 85, 60, 8, 4, 1, + 237, 135, 3, 202, 85, 60, 8, 6, 1, 237, 135, 3, 247, 50, 26, 248, 46, 8, + 4, 1, 237, 135, 3, 247, 50, 26, 248, 46, 8, 6, 1, 236, 49, 3, 76, 57, 8, + 4, 1, 236, 49, 3, 76, 57, 8, 6, 1, 234, 190, 3, 220, 113, 8, 4, 1, 234, + 190, 3, 220, 113, 8, 6, 1, 233, 15, 3, 76, 57, 8, 4, 1, 233, 15, 3, 76, + 57, 8, 6, 1, 233, 15, 3, 76, 60, 8, 4, 1, 233, 15, 3, 76, 60, 8, 6, 1, + 233, 15, 3, 239, 149, 8, 4, 1, 233, 15, 3, 239, 149, 8, 6, 1, 233, 15, 3, + 247, 49, 8, 4, 1, 233, 15, 3, 247, 49, 8, 6, 1, 233, 15, 3, 248, 47, 60, + 8, 4, 1, 233, 15, 3, 248, 47, 60, 8, 6, 1, 230, 248, 3, 202, 85, 60, 8, + 4, 1, 230, 248, 3, 202, 85, 60, 8, 6, 1, 230, 248, 3, 239, 150, 26, 186, + 8, 4, 1, 230, 248, 3, 239, 150, 26, 186, 8, 6, 1, 225, 80, 3, 186, 8, 4, + 1, 225, 80, 3, 186, 8, 6, 1, 225, 80, 3, 76, 60, 8, 4, 1, 225, 80, 3, 76, + 60, 8, 6, 1, 225, 80, 3, 222, 75, 60, 8, 4, 1, 225, 80, 3, 222, 75, 60, + 8, 6, 1, 223, 99, 3, 76, 60, 8, 4, 1, 223, 99, 3, 76, 60, 8, 6, 1, 223, + 99, 3, 76, 248, 226, 26, 220, 113, 8, 4, 1, 223, 99, 3, 76, 248, 226, 26, + 220, 113, 8, 6, 1, 223, 99, 3, 222, 75, 60, 8, 4, 1, 223, 99, 3, 222, 75, + 60, 8, 6, 1, 223, 99, 3, 244, 240, 60, 8, 4, 1, 223, 99, 3, 244, 240, 60, + 8, 6, 1, 221, 136, 3, 186, 8, 4, 1, 221, 136, 3, 186, 8, 6, 1, 221, 136, + 3, 76, 57, 8, 4, 1, 221, 136, 3, 76, 57, 8, 6, 1, 221, 136, 3, 76, 60, 8, + 4, 1, 221, 136, 3, 76, 60, 8, 6, 1, 218, 55, 3, 76, 57, 8, 4, 1, 218, 55, + 3, 76, 57, 8, 6, 1, 218, 55, 3, 76, 60, 8, 4, 1, 218, 55, 3, 76, 60, 8, + 6, 1, 218, 55, 3, 222, 75, 60, 8, 4, 1, 218, 55, 3, 222, 75, 60, 8, 6, 1, + 218, 55, 3, 244, 240, 60, 8, 4, 1, 218, 55, 3, 244, 240, 60, 8, 6, 1, + 177, 3, 202, 85, 26, 186, 8, 4, 1, 177, 3, 202, 85, 26, 186, 8, 6, 1, + 177, 3, 202, 85, 26, 239, 149, 8, 4, 1, 177, 3, 202, 85, 26, 239, 149, 8, + 6, 1, 177, 3, 220, 114, 26, 233, 99, 8, 4, 1, 177, 3, 220, 114, 26, 233, + 99, 8, 6, 1, 177, 3, 220, 114, 26, 186, 8, 4, 1, 177, 3, 220, 114, 26, + 186, 8, 6, 1, 214, 3, 3, 186, 8, 4, 1, 214, 3, 3, 186, 8, 6, 1, 214, 3, + 3, 76, 57, 8, 4, 1, 214, 3, 3, 76, 57, 8, 6, 1, 211, 31, 3, 76, 57, 8, 4, + 1, 211, 31, 3, 76, 57, 8, 6, 1, 211, 31, 3, 76, 60, 8, 4, 1, 211, 31, 3, + 76, 60, 8, 6, 1, 211, 31, 3, 76, 248, 226, 26, 220, 113, 8, 4, 1, 211, + 31, 3, 76, 248, 226, 26, 220, 113, 8, 6, 1, 211, 31, 3, 222, 75, 60, 8, + 4, 1, 211, 31, 3, 222, 75, 60, 8, 6, 1, 209, 81, 3, 76, 57, 8, 4, 1, 209, + 81, 3, 76, 57, 8, 6, 1, 209, 81, 3, 76, 60, 8, 4, 1, 209, 81, 3, 76, 60, + 8, 6, 1, 209, 81, 3, 252, 9, 26, 76, 57, 8, 4, 1, 209, 81, 3, 252, 9, 26, + 76, 57, 8, 6, 1, 209, 81, 3, 247, 106, 26, 76, 57, 8, 4, 1, 209, 81, 3, + 247, 106, 26, 76, 57, 8, 6, 1, 209, 81, 3, 76, 248, 226, 26, 76, 57, 8, + 4, 1, 209, 81, 3, 76, 248, 226, 26, 76, 57, 8, 6, 1, 203, 217, 3, 76, 57, + 8, 4, 1, 203, 217, 3, 76, 57, 8, 6, 1, 203, 217, 3, 76, 60, 8, 4, 1, 203, + 217, 3, 76, 60, 8, 6, 1, 203, 217, 3, 222, 75, 60, 8, 4, 1, 203, 217, 3, + 222, 75, 60, 8, 6, 1, 203, 217, 3, 244, 240, 60, 8, 4, 1, 203, 217, 3, + 244, 240, 60, 8, 6, 1, 118, 3, 239, 150, 60, 8, 4, 1, 118, 3, 239, 150, + 60, 8, 6, 1, 118, 3, 202, 85, 60, 8, 4, 1, 118, 3, 202, 85, 60, 8, 6, 1, + 118, 3, 244, 240, 60, 8, 4, 1, 118, 3, 244, 240, 60, 8, 6, 1, 118, 3, + 202, 85, 26, 186, 8, 4, 1, 118, 3, 202, 85, 26, 186, 8, 6, 1, 118, 3, + 220, 114, 26, 239, 149, 8, 4, 1, 118, 3, 220, 114, 26, 239, 149, 8, 6, 1, + 199, 231, 3, 202, 84, 8, 4, 1, 199, 231, 3, 202, 84, 8, 6, 1, 199, 231, + 3, 76, 60, 8, 4, 1, 199, 231, 3, 76, 60, 8, 6, 1, 197, 200, 3, 233, 99, + 8, 4, 1, 197, 200, 3, 233, 99, 8, 6, 1, 197, 200, 3, 186, 8, 4, 1, 197, + 200, 3, 186, 8, 6, 1, 197, 200, 3, 239, 149, 8, 4, 1, 197, 200, 3, 239, + 149, 8, 6, 1, 197, 200, 3, 76, 57, 8, 4, 1, 197, 200, 3, 76, 57, 8, 6, 1, + 197, 200, 3, 76, 60, 8, 4, 1, 197, 200, 3, 76, 60, 8, 6, 1, 196, 223, 3, + 76, 57, 8, 4, 1, 196, 223, 3, 76, 57, 8, 6, 1, 196, 223, 3, 239, 149, 8, + 4, 1, 196, 223, 3, 239, 149, 8, 6, 1, 196, 149, 3, 76, 57, 8, 4, 1, 196, + 149, 3, 76, 57, 8, 6, 1, 195, 159, 3, 244, 239, 8, 4, 1, 195, 159, 3, + 244, 239, 8, 6, 1, 195, 159, 3, 76, 60, 8, 4, 1, 195, 159, 3, 76, 60, 8, + 6, 1, 195, 159, 3, 222, 75, 60, 8, 4, 1, 195, 159, 3, 222, 75, 60, 8, 4, + 1, 233, 15, 3, 222, 75, 60, 8, 4, 1, 203, 217, 3, 239, 149, 8, 4, 1, 197, + 200, 3, 210, 3, 57, 8, 4, 1, 196, 149, 3, 210, 3, 57, 8, 4, 1, 39, 3, 53, + 157, 210, 2, 8, 4, 1, 181, 209, 81, 3, 76, 57, 8, 4, 1, 181, 209, 81, 3, + 239, 146, 106, 8, 4, 1, 181, 209, 81, 3, 130, 106, 8, 6, 1, 207, 13, 209, + 80, 8, 4, 1, 239, 211, 8, 6, 1, 39, 3, 76, 60, 8, 4, 1, 39, 3, 76, 60, 8, + 6, 1, 39, 3, 231, 164, 57, 8, 4, 1, 39, 3, 231, 164, 57, 8, 6, 1, 39, 3, + 244, 240, 26, 186, 8, 4, 1, 39, 3, 244, 240, 26, 186, 8, 6, 1, 39, 3, + 244, 240, 26, 233, 99, 8, 4, 1, 39, 3, 244, 240, 26, 233, 99, 8, 6, 1, + 39, 3, 244, 240, 26, 231, 164, 57, 8, 4, 1, 39, 3, 244, 240, 26, 231, + 164, 57, 8, 6, 1, 39, 3, 244, 240, 26, 202, 84, 8, 4, 1, 39, 3, 244, 240, + 26, 202, 84, 8, 6, 1, 39, 3, 244, 240, 26, 76, 60, 8, 4, 1, 39, 3, 244, + 240, 26, 76, 60, 8, 6, 1, 39, 3, 248, 47, 26, 186, 8, 4, 1, 39, 3, 248, + 47, 26, 186, 8, 6, 1, 39, 3, 248, 47, 26, 233, 99, 8, 4, 1, 39, 3, 248, + 47, 26, 233, 99, 8, 6, 1, 39, 3, 248, 47, 26, 231, 164, 57, 8, 4, 1, 39, + 3, 248, 47, 26, 231, 164, 57, 8, 6, 1, 39, 3, 248, 47, 26, 202, 84, 8, 4, + 1, 39, 3, 248, 47, 26, 202, 84, 8, 6, 1, 39, 3, 248, 47, 26, 76, 60, 8, + 4, 1, 39, 3, 248, 47, 26, 76, 60, 8, 6, 1, 237, 135, 3, 76, 60, 8, 4, 1, + 237, 135, 3, 76, 60, 8, 6, 1, 237, 135, 3, 231, 164, 57, 8, 4, 1, 237, + 135, 3, 231, 164, 57, 8, 6, 1, 237, 135, 3, 202, 84, 8, 4, 1, 237, 135, + 3, 202, 84, 8, 6, 1, 237, 135, 3, 244, 240, 26, 186, 8, 4, 1, 237, 135, + 3, 244, 240, 26, 186, 8, 6, 1, 237, 135, 3, 244, 240, 26, 233, 99, 8, 4, + 1, 237, 135, 3, 244, 240, 26, 233, 99, 8, 6, 1, 237, 135, 3, 244, 240, + 26, 231, 164, 57, 8, 4, 1, 237, 135, 3, 244, 240, 26, 231, 164, 57, 8, 6, + 1, 237, 135, 3, 244, 240, 26, 202, 84, 8, 4, 1, 237, 135, 3, 244, 240, + 26, 202, 84, 8, 6, 1, 237, 135, 3, 244, 240, 26, 76, 60, 8, 4, 1, 237, + 135, 3, 244, 240, 26, 76, 60, 8, 6, 1, 230, 248, 3, 231, 164, 57, 8, 4, + 1, 230, 248, 3, 231, 164, 57, 8, 6, 1, 230, 248, 3, 76, 60, 8, 4, 1, 230, + 248, 3, 76, 60, 8, 6, 1, 177, 3, 76, 60, 8, 4, 1, 177, 3, 76, 60, 8, 6, + 1, 177, 3, 231, 164, 57, 8, 4, 1, 177, 3, 231, 164, 57, 8, 6, 1, 177, 3, + 244, 240, 26, 186, 8, 4, 1, 177, 3, 244, 240, 26, 186, 8, 6, 1, 177, 3, + 244, 240, 26, 233, 99, 8, 4, 1, 177, 3, 244, 240, 26, 233, 99, 8, 6, 1, + 177, 3, 244, 240, 26, 231, 164, 57, 8, 4, 1, 177, 3, 244, 240, 26, 231, + 164, 57, 8, 6, 1, 177, 3, 244, 240, 26, 202, 84, 8, 4, 1, 177, 3, 244, + 240, 26, 202, 84, 8, 6, 1, 177, 3, 244, 240, 26, 76, 60, 8, 4, 1, 177, 3, + 244, 240, 26, 76, 60, 8, 6, 1, 177, 3, 231, 102, 26, 186, 8, 4, 1, 177, + 3, 231, 102, 26, 186, 8, 6, 1, 177, 3, 231, 102, 26, 233, 99, 8, 4, 1, + 177, 3, 231, 102, 26, 233, 99, 8, 6, 1, 177, 3, 231, 102, 26, 231, 164, + 57, 8, 4, 1, 177, 3, 231, 102, 26, 231, 164, 57, 8, 6, 1, 177, 3, 231, + 102, 26, 202, 84, 8, 4, 1, 177, 3, 231, 102, 26, 202, 84, 8, 6, 1, 177, + 3, 231, 102, 26, 76, 60, 8, 4, 1, 177, 3, 231, 102, 26, 76, 60, 8, 6, 1, + 118, 3, 76, 60, 8, 4, 1, 118, 3, 76, 60, 8, 6, 1, 118, 3, 231, 164, 57, + 8, 4, 1, 118, 3, 231, 164, 57, 8, 6, 1, 118, 3, 231, 102, 26, 186, 8, 4, + 1, 118, 3, 231, 102, 26, 186, 8, 6, 1, 118, 3, 231, 102, 26, 233, 99, 8, + 4, 1, 118, 3, 231, 102, 26, 233, 99, 8, 6, 1, 118, 3, 231, 102, 26, 231, + 164, 57, 8, 4, 1, 118, 3, 231, 102, 26, 231, 164, 57, 8, 6, 1, 118, 3, + 231, 102, 26, 202, 84, 8, 4, 1, 118, 3, 231, 102, 26, 202, 84, 8, 6, 1, + 118, 3, 231, 102, 26, 76, 60, 8, 4, 1, 118, 3, 231, 102, 26, 76, 60, 8, + 6, 1, 196, 149, 3, 233, 99, 8, 4, 1, 196, 149, 3, 233, 99, 8, 6, 1, 196, + 149, 3, 76, 60, 8, 4, 1, 196, 149, 3, 76, 60, 8, 6, 1, 196, 149, 3, 231, + 164, 57, 8, 4, 1, 196, 149, 3, 231, 164, 57, 8, 6, 1, 196, 149, 3, 202, + 84, 8, 4, 1, 196, 149, 3, 202, 84, 8, 6, 1, 219, 61, 222, 37, 8, 4, 1, + 219, 61, 222, 37, 8, 6, 1, 219, 61, 199, 230, 8, 4, 1, 219, 61, 199, 230, + 8, 6, 1, 196, 149, 3, 221, 224, 8, 4, 1, 196, 149, 3, 221, 224, 32, 4, 1, + 251, 134, 3, 211, 230, 32, 4, 1, 251, 134, 3, 240, 61, 32, 4, 1, 251, + 134, 3, 211, 231, 26, 199, 133, 32, 4, 1, 251, 134, 3, 240, 62, 26, 199, + 133, 32, 4, 1, 251, 134, 3, 211, 231, 26, 214, 8, 32, 4, 1, 251, 134, 3, + 240, 62, 26, 214, 8, 32, 4, 1, 251, 134, 3, 211, 231, 26, 213, 37, 32, 4, + 1, 251, 134, 3, 240, 62, 26, 213, 37, 32, 6, 1, 251, 134, 3, 211, 230, + 32, 6, 1, 251, 134, 3, 240, 61, 32, 6, 1, 251, 134, 3, 211, 231, 26, 199, + 133, 32, 6, 1, 251, 134, 3, 240, 62, 26, 199, 133, 32, 6, 1, 251, 134, 3, + 211, 231, 26, 214, 8, 32, 6, 1, 251, 134, 3, 240, 62, 26, 214, 8, 32, 6, + 1, 251, 134, 3, 211, 231, 26, 213, 37, 32, 6, 1, 251, 134, 3, 240, 62, + 26, 213, 37, 32, 4, 1, 236, 174, 3, 211, 230, 32, 4, 1, 236, 174, 3, 240, + 61, 32, 4, 1, 236, 174, 3, 211, 231, 26, 199, 133, 32, 4, 1, 236, 174, 3, + 240, 62, 26, 199, 133, 32, 4, 1, 236, 174, 3, 211, 231, 26, 214, 8, 32, + 4, 1, 236, 174, 3, 240, 62, 26, 214, 8, 32, 6, 1, 236, 174, 3, 211, 230, + 32, 6, 1, 236, 174, 3, 240, 61, 32, 6, 1, 236, 174, 3, 211, 231, 26, 199, + 133, 32, 6, 1, 236, 174, 3, 240, 62, 26, 199, 133, 32, 6, 1, 236, 174, 3, + 211, 231, 26, 214, 8, 32, 6, 1, 236, 174, 3, 240, 62, 26, 214, 8, 32, 4, + 1, 236, 126, 3, 211, 230, 32, 4, 1, 236, 126, 3, 240, 61, 32, 4, 1, 236, + 126, 3, 211, 231, 26, 199, 133, 32, 4, 1, 236, 126, 3, 240, 62, 26, 199, + 133, 32, 4, 1, 236, 126, 3, 211, 231, 26, 214, 8, 32, 4, 1, 236, 126, 3, + 240, 62, 26, 214, 8, 32, 4, 1, 236, 126, 3, 211, 231, 26, 213, 37, 32, 4, + 1, 236, 126, 3, 240, 62, 26, 213, 37, 32, 6, 1, 236, 126, 3, 211, 230, + 32, 6, 1, 236, 126, 3, 240, 61, 32, 6, 1, 236, 126, 3, 211, 231, 26, 199, + 133, 32, 6, 1, 236, 126, 3, 240, 62, 26, 199, 133, 32, 6, 1, 236, 126, 3, + 211, 231, 26, 214, 8, 32, 6, 1, 236, 126, 3, 240, 62, 26, 214, 8, 32, 6, + 1, 236, 126, 3, 211, 231, 26, 213, 37, 32, 6, 1, 236, 126, 3, 240, 62, + 26, 213, 37, 32, 4, 1, 226, 7, 3, 211, 230, 32, 4, 1, 226, 7, 3, 240, 61, + 32, 4, 1, 226, 7, 3, 211, 231, 26, 199, 133, 32, 4, 1, 226, 7, 3, 240, + 62, 26, 199, 133, 32, 4, 1, 226, 7, 3, 211, 231, 26, 214, 8, 32, 4, 1, + 226, 7, 3, 240, 62, 26, 214, 8, 32, 4, 1, 226, 7, 3, 211, 231, 26, 213, + 37, 32, 4, 1, 226, 7, 3, 240, 62, 26, 213, 37, 32, 6, 1, 226, 7, 3, 211, + 230, 32, 6, 1, 226, 7, 3, 240, 61, 32, 6, 1, 226, 7, 3, 211, 231, 26, + 199, 133, 32, 6, 1, 226, 7, 3, 240, 62, 26, 199, 133, 32, 6, 1, 226, 7, + 3, 211, 231, 26, 214, 8, 32, 6, 1, 226, 7, 3, 240, 62, 26, 214, 8, 32, 6, + 1, 226, 7, 3, 211, 231, 26, 213, 37, 32, 6, 1, 226, 7, 3, 240, 62, 26, + 213, 37, 32, 4, 1, 214, 122, 3, 211, 230, 32, 4, 1, 214, 122, 3, 240, 61, + 32, 4, 1, 214, 122, 3, 211, 231, 26, 199, 133, 32, 4, 1, 214, 122, 3, + 240, 62, 26, 199, 133, 32, 4, 1, 214, 122, 3, 211, 231, 26, 214, 8, 32, + 4, 1, 214, 122, 3, 240, 62, 26, 214, 8, 32, 6, 1, 214, 122, 3, 211, 230, + 32, 6, 1, 214, 122, 3, 240, 61, 32, 6, 1, 214, 122, 3, 211, 231, 26, 199, + 133, 32, 6, 1, 214, 122, 3, 240, 62, 26, 199, 133, 32, 6, 1, 214, 122, 3, + 211, 231, 26, 214, 8, 32, 6, 1, 214, 122, 3, 240, 62, 26, 214, 8, 32, 4, + 1, 200, 29, 3, 211, 230, 32, 4, 1, 200, 29, 3, 240, 61, 32, 4, 1, 200, + 29, 3, 211, 231, 26, 199, 133, 32, 4, 1, 200, 29, 3, 240, 62, 26, 199, + 133, 32, 4, 1, 200, 29, 3, 211, 231, 26, 214, 8, 32, 4, 1, 200, 29, 3, + 240, 62, 26, 214, 8, 32, 4, 1, 200, 29, 3, 211, 231, 26, 213, 37, 32, 4, + 1, 200, 29, 3, 240, 62, 26, 213, 37, 32, 6, 1, 200, 29, 3, 240, 61, 32, + 6, 1, 200, 29, 3, 240, 62, 26, 199, 133, 32, 6, 1, 200, 29, 3, 240, 62, + 26, 214, 8, 32, 6, 1, 200, 29, 3, 240, 62, 26, 213, 37, 32, 4, 1, 214, + 124, 3, 211, 230, 32, 4, 1, 214, 124, 3, 240, 61, 32, 4, 1, 214, 124, 3, + 211, 231, 26, 199, 133, 32, 4, 1, 214, 124, 3, 240, 62, 26, 199, 133, 32, + 4, 1, 214, 124, 3, 211, 231, 26, 214, 8, 32, 4, 1, 214, 124, 3, 240, 62, + 26, 214, 8, 32, 4, 1, 214, 124, 3, 211, 231, 26, 213, 37, 32, 4, 1, 214, + 124, 3, 240, 62, 26, 213, 37, 32, 6, 1, 214, 124, 3, 211, 230, 32, 6, 1, + 214, 124, 3, 240, 61, 32, 6, 1, 214, 124, 3, 211, 231, 26, 199, 133, 32, + 6, 1, 214, 124, 3, 240, 62, 26, 199, 133, 32, 6, 1, 214, 124, 3, 211, + 231, 26, 214, 8, 32, 6, 1, 214, 124, 3, 240, 62, 26, 214, 8, 32, 6, 1, + 214, 124, 3, 211, 231, 26, 213, 37, 32, 6, 1, 214, 124, 3, 240, 62, 26, + 213, 37, 32, 4, 1, 251, 134, 3, 199, 133, 32, 4, 1, 251, 134, 3, 214, 8, + 32, 4, 1, 236, 174, 3, 199, 133, 32, 4, 1, 236, 174, 3, 214, 8, 32, 4, 1, + 236, 126, 3, 199, 133, 32, 4, 1, 236, 126, 3, 214, 8, 32, 4, 1, 226, 7, + 3, 199, 133, 32, 4, 1, 226, 7, 3, 214, 8, 32, 4, 1, 214, 122, 3, 199, + 133, 32, 4, 1, 214, 122, 3, 214, 8, 32, 4, 1, 200, 29, 3, 199, 133, 32, + 4, 1, 200, 29, 3, 214, 8, 32, 4, 1, 214, 124, 3, 199, 133, 32, 4, 1, 214, + 124, 3, 214, 8, 32, 4, 1, 251, 134, 3, 211, 231, 26, 195, 225, 32, 4, 1, + 251, 134, 3, 240, 62, 26, 195, 225, 32, 4, 1, 251, 134, 3, 211, 231, 26, + 199, 134, 26, 195, 225, 32, 4, 1, 251, 134, 3, 240, 62, 26, 199, 134, 26, + 195, 225, 32, 4, 1, 251, 134, 3, 211, 231, 26, 214, 9, 26, 195, 225, 32, + 4, 1, 251, 134, 3, 240, 62, 26, 214, 9, 26, 195, 225, 32, 4, 1, 251, 134, + 3, 211, 231, 26, 213, 38, 26, 195, 225, 32, 4, 1, 251, 134, 3, 240, 62, + 26, 213, 38, 26, 195, 225, 32, 6, 1, 251, 134, 3, 211, 231, 26, 211, 244, + 32, 6, 1, 251, 134, 3, 240, 62, 26, 211, 244, 32, 6, 1, 251, 134, 3, 211, + 231, 26, 199, 134, 26, 211, 244, 32, 6, 1, 251, 134, 3, 240, 62, 26, 199, + 134, 26, 211, 244, 32, 6, 1, 251, 134, 3, 211, 231, 26, 214, 9, 26, 211, + 244, 32, 6, 1, 251, 134, 3, 240, 62, 26, 214, 9, 26, 211, 244, 32, 6, 1, + 251, 134, 3, 211, 231, 26, 213, 38, 26, 211, 244, 32, 6, 1, 251, 134, 3, + 240, 62, 26, 213, 38, 26, 211, 244, 32, 4, 1, 236, 126, 3, 211, 231, 26, + 195, 225, 32, 4, 1, 236, 126, 3, 240, 62, 26, 195, 225, 32, 4, 1, 236, + 126, 3, 211, 231, 26, 199, 134, 26, 195, 225, 32, 4, 1, 236, 126, 3, 240, + 62, 26, 199, 134, 26, 195, 225, 32, 4, 1, 236, 126, 3, 211, 231, 26, 214, + 9, 26, 195, 225, 32, 4, 1, 236, 126, 3, 240, 62, 26, 214, 9, 26, 195, + 225, 32, 4, 1, 236, 126, 3, 211, 231, 26, 213, 38, 26, 195, 225, 32, 4, + 1, 236, 126, 3, 240, 62, 26, 213, 38, 26, 195, 225, 32, 6, 1, 236, 126, + 3, 211, 231, 26, 211, 244, 32, 6, 1, 236, 126, 3, 240, 62, 26, 211, 244, + 32, 6, 1, 236, 126, 3, 211, 231, 26, 199, 134, 26, 211, 244, 32, 6, 1, + 236, 126, 3, 240, 62, 26, 199, 134, 26, 211, 244, 32, 6, 1, 236, 126, 3, + 211, 231, 26, 214, 9, 26, 211, 244, 32, 6, 1, 236, 126, 3, 240, 62, 26, + 214, 9, 26, 211, 244, 32, 6, 1, 236, 126, 3, 211, 231, 26, 213, 38, 26, + 211, 244, 32, 6, 1, 236, 126, 3, 240, 62, 26, 213, 38, 26, 211, 244, 32, + 4, 1, 214, 124, 3, 211, 231, 26, 195, 225, 32, 4, 1, 214, 124, 3, 240, + 62, 26, 195, 225, 32, 4, 1, 214, 124, 3, 211, 231, 26, 199, 134, 26, 195, + 225, 32, 4, 1, 214, 124, 3, 240, 62, 26, 199, 134, 26, 195, 225, 32, 4, + 1, 214, 124, 3, 211, 231, 26, 214, 9, 26, 195, 225, 32, 4, 1, 214, 124, + 3, 240, 62, 26, 214, 9, 26, 195, 225, 32, 4, 1, 214, 124, 3, 211, 231, + 26, 213, 38, 26, 195, 225, 32, 4, 1, 214, 124, 3, 240, 62, 26, 213, 38, + 26, 195, 225, 32, 6, 1, 214, 124, 3, 211, 231, 26, 211, 244, 32, 6, 1, + 214, 124, 3, 240, 62, 26, 211, 244, 32, 6, 1, 214, 124, 3, 211, 231, 26, + 199, 134, 26, 211, 244, 32, 6, 1, 214, 124, 3, 240, 62, 26, 199, 134, 26, + 211, 244, 32, 6, 1, 214, 124, 3, 211, 231, 26, 214, 9, 26, 211, 244, 32, + 6, 1, 214, 124, 3, 240, 62, 26, 214, 9, 26, 211, 244, 32, 6, 1, 214, 124, + 3, 211, 231, 26, 213, 38, 26, 211, 244, 32, 6, 1, 214, 124, 3, 240, 62, + 26, 213, 38, 26, 211, 244, 32, 4, 1, 251, 134, 3, 198, 224, 32, 4, 1, + 251, 134, 3, 220, 113, 32, 4, 1, 251, 134, 3, 199, 134, 26, 195, 225, 32, + 4, 1, 251, 134, 3, 195, 225, 32, 4, 1, 251, 134, 3, 214, 9, 26, 195, 225, + 32, 4, 1, 251, 134, 3, 213, 37, 32, 4, 1, 251, 134, 3, 213, 38, 26, 195, + 225, 32, 6, 1, 251, 134, 3, 198, 224, 32, 6, 1, 251, 134, 3, 220, 113, + 32, 6, 1, 251, 134, 3, 199, 133, 32, 6, 1, 251, 134, 3, 214, 8, 32, 6, 1, + 251, 134, 3, 211, 244, 32, 223, 231, 32, 211, 244, 32, 211, 230, 32, 213, + 37, 32, 239, 143, 26, 213, 37, 32, 4, 1, 236, 126, 3, 199, 134, 26, 195, + 225, 32, 4, 1, 236, 126, 3, 195, 225, 32, 4, 1, 236, 126, 3, 214, 9, 26, + 195, 225, 32, 4, 1, 236, 126, 3, 213, 37, 32, 4, 1, 236, 126, 3, 213, 38, + 26, 195, 225, 32, 6, 1, 236, 174, 3, 199, 133, 32, 6, 1, 236, 174, 3, + 214, 8, 32, 6, 1, 236, 126, 3, 199, 133, 32, 6, 1, 236, 126, 3, 214, 8, + 32, 6, 1, 236, 126, 3, 211, 244, 32, 211, 231, 26, 199, 133, 32, 211, + 231, 26, 214, 8, 32, 211, 231, 26, 213, 37, 32, 4, 1, 226, 7, 3, 198, + 224, 32, 4, 1, 226, 7, 3, 220, 113, 32, 4, 1, 226, 7, 3, 239, 143, 26, + 199, 133, 32, 4, 1, 226, 7, 3, 239, 143, 26, 214, 8, 32, 4, 1, 226, 7, 3, + 213, 37, 32, 4, 1, 226, 7, 3, 239, 143, 26, 213, 37, 32, 6, 1, 226, 7, 3, + 198, 224, 32, 6, 1, 226, 7, 3, 220, 113, 32, 6, 1, 226, 7, 3, 199, 133, + 32, 6, 1, 226, 7, 3, 214, 8, 32, 240, 62, 26, 199, 133, 32, 240, 62, 26, + 214, 8, 32, 240, 62, 26, 213, 37, 32, 4, 1, 200, 29, 3, 198, 224, 32, 4, + 1, 200, 29, 3, 220, 113, 32, 4, 1, 200, 29, 3, 239, 143, 26, 199, 133, + 32, 4, 1, 200, 29, 3, 239, 143, 26, 214, 8, 32, 4, 1, 210, 75, 3, 211, + 230, 32, 4, 1, 210, 75, 3, 240, 61, 32, 4, 1, 200, 29, 3, 213, 37, 32, 4, + 1, 200, 29, 3, 239, 143, 26, 213, 37, 32, 6, 1, 200, 29, 3, 198, 224, 32, + 6, 1, 200, 29, 3, 220, 113, 32, 6, 1, 200, 29, 3, 199, 133, 32, 6, 1, + 200, 29, 3, 214, 8, 32, 6, 1, 210, 75, 3, 240, 61, 32, 239, 143, 26, 199, + 133, 32, 239, 143, 26, 214, 8, 32, 199, 133, 32, 4, 1, 214, 124, 3, 199, + 134, 26, 195, 225, 32, 4, 1, 214, 124, 3, 195, 225, 32, 4, 1, 214, 124, + 3, 214, 9, 26, 195, 225, 32, 4, 1, 214, 124, 3, 213, 37, 32, 4, 1, 214, + 124, 3, 213, 38, 26, 195, 225, 32, 6, 1, 214, 122, 3, 199, 133, 32, 6, 1, + 214, 122, 3, 214, 8, 32, 6, 1, 214, 124, 3, 199, 133, 32, 6, 1, 214, 124, + 3, 214, 8, 32, 6, 1, 214, 124, 3, 211, 244, 32, 214, 8, 32, 240, 61, 236, + 230, 211, 93, 236, 241, 211, 93, 236, 230, 205, 148, 236, 241, 205, 148, + 202, 148, 205, 148, 235, 4, 205, 148, 206, 27, 205, 148, 235, 142, 205, + 148, 211, 213, 205, 148, 202, 188, 205, 148, 232, 233, 205, 148, 195, 80, + 197, 59, 205, 148, 195, 80, 197, 59, 216, 35, 195, 80, 197, 59, 225, 123, + 222, 174, 78, 210, 13, 78, 231, 6, 216, 36, 231, 6, 235, 142, 240, 64, + 236, 230, 240, 64, 236, 241, 240, 64, 231, 154, 154, 52, 83, 222, 74, 52, + 126, 222, 74, 50, 206, 62, 211, 61, 78, 53, 206, 62, 211, 61, 78, 206, + 62, 221, 206, 211, 61, 78, 206, 62, 232, 44, 211, 61, 78, 50, 52, 211, + 61, 78, 53, 52, 211, 61, 78, 52, 221, 206, 211, 61, 78, 52, 232, 44, 211, + 61, 78, 240, 117, 52, 240, 117, 248, 4, 201, 177, 248, 4, 97, 76, 222, + 194, 99, 76, 222, 194, 231, 154, 236, 246, 231, 4, 212, 109, 222, 75, + 207, 90, 213, 153, 207, 90, 222, 174, 236, 239, 210, 13, 236, 239, 212, + 87, 239, 83, 235, 21, 222, 174, 214, 16, 210, 13, 214, 16, 217, 209, 216, + 43, 205, 148, 213, 45, 219, 28, 55, 213, 45, 203, 24, 202, 159, 55, 212, + 18, 52, 212, 18, 201, 165, 212, 18, 210, 89, 212, 18, 210, 89, 52, 212, + 18, 210, 89, 201, 165, 212, 18, 247, 109, 206, 62, 222, 178, 251, 90, + 211, 61, 78, 206, 62, 210, 17, 251, 90, 211, 61, 78, 210, 153, 78, 52, + 236, 89, 78, 226, 25, 214, 18, 200, 59, 190, 202, 107, 247, 110, 226, 42, + 212, 109, 250, 176, 231, 7, 248, 4, 191, 205, 248, 50, 47, 248, 61, 3, + 211, 72, 53, 47, 248, 61, 3, 211, 72, 52, 211, 78, 78, 211, 78, 236, 89, + 78, 236, 89, 211, 78, 78, 202, 60, 2, 236, 127, 210, 89, 212, 178, 55, + 58, 107, 248, 4, 58, 91, 248, 4, 126, 250, 178, 210, 89, 207, 105, 244, + 203, 200, 36, 99, 250, 177, 251, 149, 199, 49, 244, 156, 219, 15, 55, + 204, 46, 240, 64, 226, 16, 200, 59, 235, 62, 211, 213, 78, 115, 76, 211, + 212, 211, 89, 212, 18, 235, 6, 76, 211, 212, 235, 100, 76, 211, 212, 99, + 76, 211, 212, 235, 6, 76, 78, 237, 249, 241, 60, 201, 176, 83, 235, 6, + 238, 249, 219, 189, 13, 205, 148, 197, 9, 225, 123, 234, 214, 251, 24, + 226, 14, 202, 76, 226, 14, 207, 90, 226, 14, 212, 124, 222, 174, 225, + 239, 210, 13, 225, 239, 235, 112, 204, 182, 225, 239, 212, 87, 239, 83, + 225, 239, 226, 55, 203, 248, 204, 64, 252, 11, 203, 248, 204, 64, 226, + 55, 9, 235, 23, 207, 19, 252, 11, 9, 235, 23, 207, 19, 217, 203, 17, 207, + 20, 216, 39, 17, 207, 20, 204, 95, 195, 79, 204, 95, 8, 4, 1, 68, 204, + 95, 136, 204, 95, 146, 204, 95, 167, 204, 95, 178, 204, 95, 171, 204, 95, + 182, 204, 95, 98, 55, 204, 95, 219, 14, 204, 95, 236, 171, 55, 204, 95, + 50, 213, 139, 204, 95, 53, 213, 139, 204, 95, 8, 4, 1, 218, 54, 204, 143, + 195, 79, 204, 143, 100, 204, 143, 102, 204, 143, 134, 204, 143, 136, 204, + 143, 146, 204, 143, 167, 204, 143, 178, 204, 143, 171, 204, 143, 182, + 204, 143, 98, 55, 204, 143, 219, 14, 204, 143, 236, 171, 55, 204, 143, + 50, 213, 139, 204, 143, 53, 213, 139, 8, 204, 143, 4, 1, 63, 8, 204, 143, + 4, 1, 69, 8, 204, 143, 4, 1, 72, 8, 204, 143, 4, 1, 196, 222, 8, 204, + 143, 4, 1, 208, 163, 8, 204, 143, 4, 1, 233, 14, 8, 204, 143, 4, 1, 225, + 79, 8, 204, 143, 4, 1, 159, 8, 204, 143, 4, 1, 221, 135, 8, 204, 143, 4, + 1, 218, 54, 8, 204, 143, 4, 1, 214, 2, 8, 204, 143, 4, 1, 209, 80, 8, + 204, 143, 4, 1, 203, 216, 236, 106, 55, 244, 168, 55, 241, 45, 55, 234, + 242, 234, 247, 55, 222, 54, 55, 219, 29, 55, 217, 227, 55, 213, 22, 55, + 209, 108, 55, 197, 17, 55, 217, 82, 206, 241, 55, 239, 4, 55, 236, 107, + 55, 224, 69, 55, 201, 27, 55, 237, 227, 55, 234, 20, 213, 57, 55, 213, + 19, 55, 233, 70, 55, 250, 139, 55, 231, 80, 55, 247, 51, 55, 222, 44, + 201, 223, 55, 205, 128, 55, 203, 21, 55, 226, 70, 209, 108, 55, 201, 6, + 222, 54, 55, 216, 25, 117, 55, 220, 59, 55, 209, 131, 55, 222, 223, 55, + 248, 143, 55, 38, 50, 232, 168, 57, 38, 53, 232, 168, 57, 38, 181, 83, + 222, 75, 214, 19, 38, 206, 182, 83, 222, 75, 214, 19, 38, 251, 64, 61, + 57, 38, 244, 204, 61, 57, 38, 50, 61, 57, 38, 53, 61, 57, 38, 210, 3, + 214, 19, 38, 244, 204, 210, 3, 214, 19, 38, 251, 64, 210, 3, 214, 19, 38, + 115, 238, 250, 57, 38, 235, 6, 238, 250, 57, 38, 236, 225, 244, 248, 38, + 236, 225, 205, 94, 38, 236, 225, 239, 139, 38, 236, 225, 244, 249, 249, + 132, 38, 50, 53, 61, 57, 38, 236, 225, 208, 154, 38, 236, 225, 224, 148, + 38, 236, 225, 200, 26, 212, 106, 201, 180, 38, 210, 90, 205, 178, 214, + 19, 38, 52, 83, 204, 196, 214, 19, 38, 251, 74, 105, 38, 201, 165, 200, + 61, 38, 197, 62, 248, 39, 57, 38, 107, 61, 214, 19, 38, 181, 52, 205, + 178, 214, 19, 38, 91, 232, 168, 3, 165, 237, 229, 38, 107, 232, 168, 3, + 165, 237, 229, 38, 50, 61, 60, 38, 53, 61, 60, 38, 250, 179, 57, 252, 17, + 214, 158, 252, 1, 202, 30, 202, 218, 204, 153, 237, 240, 6, 247, 206, + 239, 230, 247, 41, 247, 36, 222, 75, 105, 247, 111, 214, 158, 247, 165, + 200, 71, 236, 108, 241, 136, 208, 151, 239, 230, 235, 220, 145, 4, 234, + 189, 145, 6, 233, 14, 248, 133, 6, 233, 14, 237, 240, 6, 233, 14, 212, + 143, 241, 136, 212, 143, 241, 137, 127, 99, 212, 219, 145, 6, 68, 248, + 133, 6, 68, 145, 6, 159, 145, 4, 159, 223, 99, 74, 249, 79, 105, 237, + 240, 6, 218, 54, 215, 139, 55, 205, 162, 210, 165, 241, 103, 145, 6, 214, + 2, 237, 240, 6, 214, 2, 237, 240, 6, 211, 166, 145, 6, 144, 248, 133, 6, + 144, 237, 240, 6, 144, 212, 26, 203, 128, 210, 102, 207, 81, 78, 203, 34, + 55, 201, 213, 117, 55, 199, 101, 237, 240, 6, 195, 158, 214, 37, 55, 214, + 147, 55, 226, 16, 214, 147, 55, 248, 133, 6, 195, 158, 163, 32, 4, 1, + 226, 6, 224, 189, 55, 251, 84, 55, 145, 6, 250, 111, 248, 133, 6, 247, + 206, 236, 132, 105, 145, 4, 69, 145, 6, 69, 145, 6, 236, 48, 163, 6, 236, + 48, 145, 6, 221, 135, 145, 4, 72, 151, 105, 248, 208, 105, 233, 177, 105, + 240, 101, 105, 226, 60, 205, 160, 209, 194, 6, 211, 166, 235, 223, 55, + 237, 240, 4, 212, 219, 237, 240, 4, 234, 93, 237, 240, 6, 234, 93, 237, + 240, 6, 212, 219, 237, 240, 218, 53, 204, 114, 163, 45, 6, 234, 189, 163, + 45, 6, 159, 210, 89, 45, 6, 159, 163, 45, 6, 196, 148, 237, 240, 41, 6, + 240, 230, 237, 240, 41, 4, 240, 230, 237, 240, 41, 4, 69, 237, 240, 41, + 4, 68, 237, 240, 41, 4, 225, 216, 211, 248, 222, 74, 163, 251, 110, 213, + 45, 55, 251, 174, 163, 4, 236, 48, 16, 36, 208, 228, 205, 160, 197, 217, + 191, 97, 207, 67, 197, 217, 191, 97, 216, 172, 197, 217, 191, 97, 203, + 14, 197, 217, 191, 97, 202, 184, 197, 217, 191, 99, 202, 181, 197, 217, + 191, 97, 235, 147, 197, 217, 191, 99, 235, 146, 197, 217, 191, 115, 235, + 146, 197, 217, 191, 235, 6, 235, 146, 197, 217, 191, 97, 206, 17, 197, + 217, 191, 235, 100, 206, 15, 197, 217, 191, 97, 237, 25, 197, 217, 191, + 115, 237, 23, 197, 217, 191, 235, 100, 237, 23, 197, 217, 191, 207, 71, + 237, 23, 191, 215, 140, 100, 209, 208, 215, 141, 100, 209, 208, 215, 141, + 102, 209, 208, 215, 141, 134, 209, 208, 215, 141, 136, 209, 208, 215, + 141, 146, 209, 208, 215, 141, 167, 209, 208, 215, 141, 178, 209, 208, + 215, 141, 171, 209, 208, 215, 141, 182, 209, 208, 215, 141, 203, 23, 209, + 208, 215, 141, 236, 251, 209, 208, 215, 141, 200, 239, 209, 208, 215, + 141, 235, 144, 209, 208, 215, 141, 97, 231, 56, 209, 208, 215, 141, 235, + 100, 231, 56, 209, 208, 215, 141, 97, 170, 4, 209, 208, 215, 141, 100, 4, + 209, 208, 215, 141, 102, 4, 209, 208, 215, 141, 134, 4, 209, 208, 215, + 141, 136, 4, 209, 208, 215, 141, 146, 4, 209, 208, 215, 141, 167, 4, 209, + 208, 215, 141, 178, 4, 209, 208, 215, 141, 171, 4, 209, 208, 215, 141, + 182, 4, 209, 208, 215, 141, 203, 23, 4, 209, 208, 215, 141, 236, 251, 4, + 209, 208, 215, 141, 200, 239, 4, 209, 208, 215, 141, 235, 144, 4, 209, + 208, 215, 141, 97, 231, 56, 4, 209, 208, 215, 141, 235, 100, 231, 56, 4, + 209, 208, 215, 141, 97, 170, 209, 208, 215, 141, 97, 202, 159, 247, 207, + 240, 230, 209, 208, 215, 141, 235, 100, 170, 209, 208, 215, 141, 203, 24, + 170, 209, 208, 215, 141, 210, 89, 97, 231, 56, 8, 4, 1, 210, 89, 247, + 206, 209, 208, 215, 141, 206, 29, 222, 218, 20, 209, 208, 215, 141, 235, + 145, 237, 74, 20, 209, 208, 215, 141, 235, 145, 170, 209, 208, 215, 141, + 97, 231, 57, 170, 197, 217, 191, 195, 80, 202, 181, 163, 17, 102, 163, + 17, 134, 107, 51, 200, 24, 51, 91, 51, 237, 230, 51, 50, 53, 51, 124, + 135, 51, 173, 197, 89, 51, 173, 237, 68, 51, 205, 159, 237, 68, 51, 205, + 159, 197, 89, 51, 107, 61, 3, 106, 91, 61, 3, 106, 107, 197, 123, 51, 91, + 197, 123, 51, 107, 99, 232, 134, 51, 200, 24, 99, 232, 134, 51, 91, 99, + 232, 134, 51, 237, 230, 99, 232, 134, 51, 107, 61, 3, 203, 135, 91, 61, + 3, 203, 135, 107, 61, 234, 234, 154, 200, 24, 61, 234, 234, 154, 91, 61, + 234, 234, 154, 237, 230, 61, 234, 234, 154, 124, 135, 61, 3, 249, 65, + 107, 61, 3, 122, 91, 61, 3, 122, 107, 61, 3, 221, 224, 91, 61, 3, 221, + 224, 50, 53, 197, 123, 51, 50, 53, 61, 3, 106, 237, 230, 195, 24, 51, + 200, 24, 61, 3, 202, 68, 222, 173, 200, 24, 61, 3, 202, 68, 210, 11, 237, + 230, 61, 3, 202, 68, 222, 173, 237, 230, 61, 3, 202, 68, 210, 11, 91, 61, + 3, 241, 101, 237, 229, 237, 230, 61, 3, 241, 101, 222, 173, 251, 64, 201, + 243, 207, 108, 51, 244, 204, 201, 243, 207, 108, 51, 173, 197, 89, 61, + 202, 30, 181, 154, 107, 61, 202, 30, 249, 79, 127, 91, 61, 202, 30, 154, + 251, 64, 192, 244, 249, 51, 244, 204, 192, 244, 249, 51, 107, 232, 168, + 3, 165, 200, 23, 107, 232, 168, 3, 165, 237, 229, 200, 24, 232, 168, 3, + 165, 210, 11, 200, 24, 232, 168, 3, 165, 222, 173, 91, 232, 168, 3, 165, + 200, 23, 91, 232, 168, 3, 165, 237, 229, 237, 230, 232, 168, 3, 165, 210, + 11, 237, 230, 232, 168, 3, 165, 222, 173, 91, 61, 127, 107, 51, 200, 24, + 61, 107, 77, 237, 230, 51, 107, 61, 127, 91, 51, 107, 213, 218, 250, 213, + 200, 24, 213, 218, 250, 213, 91, 213, 218, 250, 213, 237, 230, 213, 218, + 250, 213, 107, 232, 168, 127, 91, 232, 167, 91, 232, 168, 127, 107, 232, + 167, 107, 52, 61, 3, 106, 50, 53, 52, 61, 3, 106, 91, 52, 61, 3, 106, + 107, 52, 51, 200, 24, 52, 51, 91, 52, 51, 237, 230, 52, 51, 50, 53, 52, + 51, 124, 135, 52, 51, 173, 197, 89, 52, 51, 173, 237, 68, 52, 51, 205, + 159, 237, 68, 52, 51, 205, 159, 197, 89, 52, 51, 107, 201, 165, 51, 91, + 201, 165, 51, 107, 205, 87, 51, 91, 205, 87, 51, 200, 24, 61, 3, 52, 106, + 237, 230, 61, 3, 52, 106, 107, 240, 63, 51, 200, 24, 240, 63, 51, 91, + 240, 63, 51, 237, 230, 240, 63, 51, 107, 61, 202, 30, 154, 91, 61, 202, + 30, 154, 107, 59, 51, 200, 24, 59, 51, 91, 59, 51, 237, 230, 59, 51, 200, + 24, 59, 61, 234, 234, 154, 200, 24, 59, 61, 214, 119, 213, 81, 200, 24, + 59, 61, 214, 119, 213, 82, 3, 231, 154, 154, 200, 24, 59, 61, 214, 119, + 213, 82, 3, 83, 154, 200, 24, 59, 52, 51, 200, 24, 59, 52, 61, 214, 119, + 213, 81, 91, 59, 61, 234, 234, 197, 148, 173, 197, 89, 61, 202, 30, 241, + 100, 205, 159, 237, 68, 61, 202, 30, 241, 100, 124, 135, 59, 51, 53, 61, + 3, 4, 244, 248, 237, 230, 61, 107, 77, 200, 24, 51, 115, 91, 250, 213, + 107, 61, 3, 83, 106, 91, 61, 3, 83, 106, 50, 53, 61, 3, 83, 106, 107, 61, + 3, 52, 83, 106, 91, 61, 3, 52, 83, 106, 50, 53, 61, 3, 52, 83, 106, 107, + 214, 89, 51, 91, 214, 89, 51, 50, 53, 214, 89, 51, 36, 251, 145, 244, + 152, 213, 131, 239, 123, 202, 208, 236, 84, 202, 208, 239, 18, 216, 18, + 236, 85, 236, 231, 207, 76, 226, 74, 217, 238, 236, 255, 214, 158, 216, + 18, 251, 106, 236, 255, 214, 158, 4, 236, 255, 214, 158, 241, 130, 250, + 202, 219, 167, 239, 18, 216, 18, 241, 132, 250, 202, 219, 167, 4, 241, + 130, 250, 202, 219, 167, 236, 221, 77, 211, 250, 218, 53, 212, 4, 218, + 53, 241, 107, 218, 53, 204, 114, 219, 15, 55, 219, 13, 55, 76, 212, 124, + 239, 53, 205, 248, 207, 77, 219, 14, 250, 179, 214, 81, 210, 3, 214, 81, + 248, 5, 214, 81, 47, 209, 200, 241, 36, 209, 200, 234, 255, 209, 200, + 211, 246, 149, 226, 62, 53, 251, 89, 251, 89, 219, 200, 251, 89, 205, + 127, 251, 89, 239, 56, 239, 18, 216, 18, 239, 60, 213, 145, 149, 216, 18, + 213, 145, 149, 221, 248, 251, 99, 221, 248, 214, 71, 226, 22, 200, 51, + 226, 36, 52, 226, 36, 201, 165, 226, 36, 241, 124, 226, 36, 204, 84, 226, + 36, 198, 236, 226, 36, 244, 204, 226, 36, 244, 204, 241, 124, 226, 36, + 251, 64, 241, 124, 226, 36, 202, 207, 248, 252, 210, 193, 211, 247, 76, + 219, 14, 236, 92, 234, 26, 211, 247, 231, 169, 202, 85, 214, 81, 210, 89, + 202, 84, 226, 16, 222, 203, 209, 80, 206, 64, 197, 122, 196, 253, 212, 4, + 216, 18, 202, 84, 219, 15, 202, 84, 250, 171, 180, 149, 216, 18, 250, + 171, 180, 149, 251, 20, 180, 149, 251, 20, 247, 231, 216, 18, 252, 10, + 180, 149, 217, 102, 251, 20, 216, 27, 252, 10, 180, 149, 251, 138, 180, + 149, 216, 18, 251, 138, 180, 149, 251, 138, 180, 214, 72, 180, 149, 201, + 165, 202, 84, 251, 146, 180, 149, 236, 164, 149, 234, 25, 236, 164, 149, + 239, 124, 248, 202, 251, 22, 202, 218, 222, 82, 234, 25, 180, 149, 251, + 20, 180, 202, 30, 214, 72, 202, 218, 226, 101, 214, 158, 226, 101, 77, + 214, 72, 251, 20, 180, 149, 244, 168, 236, 170, 236, 171, 244, 167, 210, + 3, 226, 86, 180, 149, 210, 3, 180, 149, 241, 93, 149, 236, 131, 236, 169, + 149, 205, 8, 236, 170, 239, 212, 180, 149, 180, 202, 30, 247, 218, 239, + 231, 219, 200, 247, 217, 211, 76, 180, 149, 216, 18, 180, 149, 230, 192, + 149, 216, 18, 230, 192, 149, 204, 203, 236, 164, 149, 222, 139, 214, 72, + 180, 149, 233, 93, 214, 72, 180, 149, 222, 139, 127, 180, 149, 233, 93, + 127, 180, 149, 222, 139, 247, 231, 216, 18, 180, 149, 233, 93, 247, 231, + 216, 18, 180, 149, 218, 134, 222, 138, 218, 134, 233, 92, 248, 202, 216, + 18, 236, 164, 149, 216, 18, 222, 138, 216, 18, 233, 92, 217, 102, 222, + 139, 216, 27, 180, 149, 217, 102, 233, 93, 216, 27, 180, 149, 222, 139, + 214, 72, 236, 164, 149, 233, 93, 214, 72, 236, 164, 149, 217, 102, 222, + 139, 216, 27, 236, 164, 149, 217, 102, 233, 93, 216, 27, 236, 164, 149, + 222, 139, 214, 72, 233, 92, 233, 93, 214, 72, 222, 138, 217, 102, 222, + 139, 216, 27, 233, 92, 217, 102, 233, 93, 216, 27, 222, 138, 212, 34, + 204, 133, 212, 35, 214, 72, 180, 149, 204, 134, 214, 72, 180, 149, 212, + 35, 214, 72, 236, 164, 149, 204, 134, 214, 72, 236, 164, 149, 239, 18, + 216, 18, 212, 37, 239, 18, 216, 18, 204, 135, 204, 142, 214, 158, 204, + 94, 214, 158, 216, 18, 39, 204, 142, 214, 158, 216, 18, 39, 204, 94, 214, + 158, 204, 142, 77, 214, 72, 180, 149, 204, 94, 77, 214, 72, 180, 149, + 217, 102, 39, 204, 142, 77, 216, 27, 180, 149, 217, 102, 39, 204, 94, 77, + 216, 27, 180, 149, 204, 142, 77, 3, 216, 18, 180, 149, 204, 94, 77, 3, + 216, 18, 180, 149, 218, 114, 218, 115, 218, 116, 218, 115, 200, 51, 47, + 226, 101, 214, 158, 47, 214, 62, 214, 158, 47, 226, 101, 77, 214, 72, + 180, 149, 47, 214, 62, 77, 214, 72, 180, 149, 47, 247, 124, 47, 241, 26, + 46, 212, 124, 46, 219, 14, 46, 202, 76, 46, 239, 53, 205, 248, 46, 76, + 214, 81, 46, 210, 3, 214, 81, 46, 250, 179, 214, 81, 46, 236, 170, 46, + 240, 64, 103, 212, 124, 103, 219, 14, 103, 202, 76, 103, 76, 214, 81, 53, + 203, 147, 50, 203, 147, 135, 203, 147, 124, 203, 147, 250, 182, 218, 239, + 201, 142, 235, 29, 201, 165, 83, 249, 79, 53, 201, 3, 52, 83, 249, 79, + 52, 53, 201, 3, 239, 18, 216, 18, 211, 240, 216, 18, 201, 142, 239, 18, + 216, 18, 235, 30, 217, 105, 52, 83, 249, 79, 52, 53, 201, 3, 212, 35, + 200, 64, 210, 136, 204, 134, 200, 64, 210, 136, 216, 24, 204, 156, 214, + 158, 241, 130, 250, 202, 216, 24, 204, 155, 216, 24, 204, 156, 77, 214, + 72, 180, 149, 241, 130, 250, 202, 216, 24, 204, 156, 214, 72, 180, 149, + 214, 62, 214, 158, 226, 101, 214, 158, 218, 121, 232, 91, 241, 141, 220, + 0, 226, 33, 196, 181, 217, 218, 216, 26, 53, 251, 90, 3, 250, 252, 53, + 201, 180, 218, 53, 221, 248, 251, 99, 218, 53, 221, 248, 214, 71, 218, + 53, 226, 22, 218, 53, 200, 51, 239, 140, 214, 81, 76, 214, 81, 205, 8, + 214, 81, 239, 53, 202, 76, 248, 70, 50, 216, 24, 235, 222, 207, 104, 212, + 4, 53, 216, 24, 235, 222, 207, 104, 212, 4, 50, 207, 104, 212, 4, 53, + 207, 104, 212, 4, 210, 89, 202, 85, 236, 170, 241, 17, 221, 248, 214, 71, + 241, 17, 221, 248, 251, 99, 52, 204, 141, 52, 204, 93, 52, 226, 22, 52, + 200, 51, 212, 154, 180, 26, 213, 145, 149, 222, 139, 3, 238, 252, 233, + 93, 3, 238, 252, 199, 48, 218, 134, 222, 138, 199, 48, 218, 134, 233, 92, + 222, 139, 180, 202, 30, 214, 72, 233, 92, 233, 93, 180, 202, 30, 214, 72, + 222, 138, 180, 202, 30, 214, 72, 222, 138, 180, 202, 30, 214, 72, 233, + 92, 180, 202, 30, 214, 72, 212, 34, 180, 202, 30, 214, 72, 204, 133, 239, + 18, 216, 18, 212, 38, 214, 72, 236, 172, 239, 18, 216, 18, 204, 136, 214, + 72, 236, 172, 216, 18, 47, 226, 101, 77, 214, 72, 180, 149, 216, 18, 47, + 214, 62, 77, 214, 72, 180, 149, 47, 226, 101, 77, 214, 72, 216, 18, 180, + 149, 47, 214, 62, 77, 214, 72, 216, 18, 180, 149, 222, 139, 247, 231, + 216, 18, 236, 164, 149, 233, 93, 247, 231, 216, 18, 236, 164, 149, 212, + 35, 247, 231, 216, 18, 236, 164, 149, 204, 134, 247, 231, 216, 18, 236, + 164, 149, 216, 18, 216, 24, 204, 156, 214, 158, 239, 18, 216, 18, 241, + 132, 250, 202, 216, 24, 204, 155, 216, 18, 216, 24, 204, 156, 77, 214, + 72, 180, 149, 239, 18, 216, 18, 241, 132, 250, 202, 216, 24, 204, 156, + 214, 72, 236, 172, 83, 236, 246, 219, 60, 231, 154, 236, 246, 124, 53, + 239, 146, 236, 246, 135, 53, 239, 146, 236, 246, 236, 255, 77, 3, 181, + 231, 154, 106, 236, 255, 77, 3, 83, 249, 79, 250, 168, 236, 221, 77, 231, + 154, 106, 4, 236, 255, 77, 3, 83, 249, 79, 250, 168, 236, 221, 77, 231, + 154, 106, 236, 255, 77, 3, 76, 57, 236, 255, 77, 3, 214, 25, 4, 236, 255, + 77, 3, 214, 25, 236, 255, 77, 3, 200, 62, 236, 255, 77, 3, 99, 231, 154, + 204, 183, 241, 130, 3, 181, 231, 154, 106, 241, 130, 3, 83, 249, 79, 250, + 168, 236, 221, 77, 231, 154, 106, 4, 241, 130, 3, 83, 249, 79, 250, 168, + 236, 221, 77, 231, 154, 106, 241, 130, 3, 214, 25, 4, 241, 130, 3, 214, + 25, 195, 159, 216, 16, 249, 122, 219, 166, 239, 141, 55, 237, 1, 51, 231, + 86, 124, 250, 216, 135, 250, 216, 211, 254, 213, 25, 197, 119, 222, 74, + 50, 247, 44, 53, 247, 44, 50, 235, 68, 53, 235, 68, 248, 84, 53, 241, 62, + 248, 84, 50, 241, 62, 201, 243, 53, 241, 62, 201, 243, 50, 241, 62, 210, + 89, 216, 18, 55, 47, 221, 197, 250, 252, 208, 122, 208, 131, 203, 34, + 210, 166, 212, 78, 226, 67, 199, 22, 205, 94, 212, 148, 77, 226, 32, 55, + 163, 216, 18, 55, 197, 129, 231, 88, 201, 243, 50, 241, 100, 201, 243, + 53, 241, 100, 248, 84, 50, 241, 100, 248, 84, 53, 241, 100, 201, 243, + 157, 226, 36, 248, 84, 157, 226, 36, 234, 229, 205, 219, 124, 250, 217, + 248, 203, 99, 231, 154, 249, 67, 214, 74, 224, 152, 236, 160, 202, 30, + 202, 218, 210, 22, 196, 223, 226, 86, 39, 210, 163, 248, 69, 224, 150, + 222, 178, 251, 90, 179, 210, 17, 251, 90, 179, 236, 160, 202, 30, 202, + 218, 222, 183, 248, 214, 210, 2, 240, 240, 251, 146, 250, 225, 203, 247, + 201, 228, 209, 113, 239, 103, 214, 63, 241, 145, 203, 103, 205, 233, 241, + 89, 241, 88, 251, 39, 234, 212, 16, 230, 241, 251, 39, 234, 212, 16, 205, + 85, 211, 93, 251, 39, 234, 212, 16, 211, 94, 236, 172, 251, 39, 234, 212, + 16, 211, 94, 239, 60, 251, 39, 234, 212, 16, 211, 94, 239, 139, 251, 39, + 234, 212, 16, 211, 94, 225, 115, 251, 39, 234, 212, 16, 211, 94, 244, + 248, 251, 39, 234, 212, 16, 244, 249, 204, 234, 251, 39, 234, 212, 16, + 244, 249, 225, 115, 251, 39, 234, 212, 16, 205, 249, 154, 251, 39, 234, + 212, 16, 249, 133, 154, 251, 39, 234, 212, 16, 211, 94, 205, 248, 251, + 39, 234, 212, 16, 211, 94, 249, 132, 251, 39, 234, 212, 16, 211, 94, 222, + 138, 251, 39, 234, 212, 16, 211, 94, 233, 92, 251, 39, 234, 212, 16, 107, + 199, 140, 251, 39, 234, 212, 16, 91, 199, 140, 251, 39, 234, 212, 16, + 211, 94, 107, 51, 251, 39, 234, 212, 16, 211, 94, 91, 51, 251, 39, 234, + 212, 16, 244, 249, 249, 132, 251, 39, 234, 212, 16, 135, 203, 148, 200, + 62, 251, 39, 234, 212, 16, 239, 212, 204, 234, 251, 39, 234, 212, 16, + 211, 94, 135, 247, 109, 251, 39, 234, 212, 16, 211, 94, 239, 211, 251, + 39, 234, 212, 16, 135, 203, 148, 225, 115, 251, 39, 234, 212, 16, 200, + 24, 199, 140, 251, 39, 234, 212, 16, 211, 94, 200, 24, 51, 251, 39, 234, + 212, 16, 124, 203, 148, 214, 25, 251, 39, 234, 212, 16, 239, 224, 204, + 234, 251, 39, 234, 212, 16, 211, 94, 124, 247, 109, 251, 39, 234, 212, + 16, 211, 94, 239, 223, 251, 39, 234, 212, 16, 124, 203, 148, 225, 115, + 251, 39, 234, 212, 16, 237, 230, 199, 140, 251, 39, 234, 212, 16, 211, + 94, 237, 230, 51, 251, 39, 234, 212, 16, 211, 60, 200, 62, 251, 39, 234, + 212, 16, 239, 212, 200, 62, 251, 39, 234, 212, 16, 239, 140, 200, 62, + 251, 39, 234, 212, 16, 225, 116, 200, 62, 251, 39, 234, 212, 16, 244, + 249, 200, 62, 251, 39, 234, 212, 16, 124, 206, 195, 225, 115, 251, 39, + 234, 212, 16, 211, 60, 211, 93, 251, 39, 234, 212, 16, 244, 249, 205, 7, + 251, 39, 234, 212, 16, 211, 94, 244, 167, 251, 39, 234, 212, 16, 124, + 203, 148, 239, 149, 251, 39, 234, 212, 16, 239, 224, 239, 149, 251, 39, + 234, 212, 16, 205, 8, 239, 149, 251, 39, 234, 212, 16, 225, 116, 239, + 149, 251, 39, 234, 212, 16, 244, 249, 239, 149, 251, 39, 234, 212, 16, + 135, 206, 195, 204, 234, 251, 39, 234, 212, 16, 50, 206, 195, 204, 234, + 251, 39, 234, 212, 16, 202, 85, 239, 149, 251, 39, 234, 212, 16, 233, 93, + 239, 149, 251, 39, 234, 212, 16, 244, 159, 154, 251, 39, 234, 212, 16, + 239, 224, 202, 84, 251, 39, 234, 212, 16, 195, 23, 251, 39, 234, 212, 16, + 204, 235, 202, 84, 251, 39, 234, 212, 16, 207, 106, 200, 62, 251, 39, + 234, 212, 16, 211, 94, 216, 18, 236, 172, 251, 39, 234, 212, 16, 211, 94, + 211, 77, 251, 39, 234, 212, 16, 135, 247, 110, 202, 84, 251, 39, 234, + 212, 16, 124, 247, 110, 202, 84, 251, 39, 234, 212, 16, 226, 6, 251, 39, + 234, 212, 16, 210, 74, 251, 39, 234, 212, 16, 214, 123, 251, 39, 234, + 212, 16, 251, 134, 200, 62, 251, 39, 234, 212, 16, 236, 174, 200, 62, + 251, 39, 234, 212, 16, 226, 7, 200, 62, 251, 39, 234, 212, 16, 214, 124, + 200, 62, 251, 39, 234, 212, 16, 251, 133, 216, 18, 245, 101, 78, 53, 251, + 90, 3, 237, 230, 195, 24, 51, 206, 163, 192, 248, 69, 248, 229, 105, 83, + 222, 75, 3, 112, 238, 252, 226, 42, 105, 241, 125, 200, 60, 105, 239, 76, + 200, 60, 105, 236, 233, 105, 241, 160, 105, 59, 47, 3, 247, 36, 83, 222, + 74, 236, 204, 105, 251, 125, 224, 153, 105, 232, 104, 105, 46, 231, 154, + 249, 79, 3, 216, 15, 46, 201, 181, 237, 234, 248, 32, 244, 249, 3, 216, + 21, 51, 200, 58, 105, 218, 199, 105, 231, 2, 105, 214, 90, 233, 13, 105, + 214, 90, 223, 97, 105, 213, 119, 105, 213, 118, 105, 239, 85, 241, 15, + 16, 235, 23, 102, 205, 183, 105, 251, 39, 234, 212, 16, 211, 93, 239, + 243, 207, 91, 224, 153, 105, 212, 20, 213, 226, 217, 75, 213, 226, 212, + 15, 208, 155, 105, 244, 220, 208, 155, 105, 50, 213, 140, 200, 33, 122, + 50, 213, 140, 236, 76, 50, 213, 140, 221, 202, 122, 53, 213, 140, 200, + 33, 122, 53, 213, 140, 236, 76, 53, 213, 140, 221, 202, 122, 50, 47, 248, + 61, 200, 33, 241, 100, 50, 47, 248, 61, 236, 76, 50, 47, 248, 61, 221, + 202, 241, 100, 53, 47, 248, 61, 200, 33, 241, 100, 53, 47, 248, 61, 236, + 76, 53, 47, 248, 61, 221, 202, 241, 100, 50, 241, 17, 248, 61, 200, 33, + 122, 50, 241, 17, 248, 61, 112, 212, 211, 50, 241, 17, 248, 61, 221, 202, + 122, 241, 17, 248, 61, 236, 76, 53, 241, 17, 248, 61, 200, 33, 122, 53, + 241, 17, 248, 61, 112, 212, 211, 53, 241, 17, 248, 61, 221, 202, 122, + 226, 37, 236, 76, 231, 154, 222, 75, 236, 76, 200, 33, 50, 214, 72, 221, + 202, 53, 241, 17, 248, 61, 208, 132, 200, 33, 53, 214, 72, 221, 202, 50, + 241, 17, 248, 61, 208, 132, 204, 115, 201, 242, 204, 115, 248, 83, 201, + 243, 47, 179, 248, 84, 47, 179, 248, 84, 47, 248, 61, 127, 201, 243, 47, + 179, 44, 16, 248, 83, 50, 83, 111, 222, 74, 53, 83, 111, 222, 74, 231, + 154, 208, 174, 222, 73, 231, 154, 208, 174, 222, 72, 231, 154, 208, 174, + 222, 71, 231, 154, 208, 174, 222, 70, 239, 203, 16, 175, 83, 26, 201, + 243, 210, 22, 239, 203, 16, 175, 83, 26, 248, 84, 210, 22, 239, 203, 16, + 175, 83, 3, 244, 248, 239, 203, 16, 175, 135, 26, 231, 154, 3, 244, 248, + 239, 203, 16, 175, 124, 26, 231, 154, 3, 244, 248, 239, 203, 16, 175, 83, + 3, 201, 180, 239, 203, 16, 175, 135, 26, 231, 154, 3, 201, 180, 239, 203, + 16, 175, 124, 26, 231, 154, 3, 201, 180, 239, 203, 16, 175, 83, 26, 197, + 122, 239, 203, 16, 175, 135, 26, 231, 154, 3, 197, 122, 239, 203, 16, + 175, 124, 26, 231, 154, 3, 197, 122, 239, 203, 16, 175, 135, 26, 231, + 153, 239, 203, 16, 175, 124, 26, 231, 153, 239, 203, 16, 175, 83, 26, + 201, 243, 222, 183, 239, 203, 16, 175, 83, 26, 248, 84, 222, 183, 47, + 235, 36, 210, 94, 105, 237, 15, 105, 83, 222, 75, 236, 76, 219, 136, 248, + 46, 219, 136, 181, 127, 206, 181, 219, 136, 206, 182, 127, 221, 239, 219, + 136, 181, 127, 99, 206, 167, 219, 136, 99, 206, 168, 127, 221, 239, 219, + 136, 99, 206, 168, 225, 124, 219, 136, 201, 161, 219, 136, 202, 249, 219, + 136, 213, 52, 237, 72, 233, 84, 234, 206, 201, 243, 213, 139, 248, 84, + 213, 139, 201, 243, 241, 17, 179, 248, 84, 241, 17, 179, 201, 243, 201, + 231, 206, 245, 179, 248, 84, 201, 231, 206, 245, 179, 59, 201, 197, 248, + 214, 210, 3, 3, 244, 248, 204, 216, 235, 79, 252, 25, 241, 14, 237, 0, + 226, 22, 239, 243, 236, 80, 105, 58, 210, 17, 52, 201, 180, 58, 222, 178, + 52, 201, 180, 58, 200, 35, 52, 201, 180, 58, 237, 233, 52, 201, 180, 58, + 210, 17, 52, 201, 181, 3, 83, 154, 58, 222, 178, 52, 201, 181, 3, 83, + 154, 58, 210, 17, 201, 181, 3, 52, 83, 154, 251, 167, 244, 205, 204, 223, + 202, 77, 244, 205, 231, 89, 3, 235, 59, 208, 217, 58, 219, 189, 222, 178, + 201, 180, 58, 219, 189, 210, 17, 201, 180, 58, 219, 189, 200, 35, 201, + 180, 58, 219, 189, 237, 233, 201, 180, 52, 83, 154, 58, 47, 36, 204, 226, + 58, 244, 249, 36, 210, 167, 212, 58, 105, 212, 58, 214, 117, 105, 212, + 58, 214, 119, 105, 212, 58, 205, 244, 105, 214, 177, 236, 67, 105, 16, + 36, 215, 145, 16, 36, 205, 3, 77, 232, 133, 16, 36, 205, 3, 77, 202, 237, + 16, 36, 236, 221, 77, 202, 237, 16, 36, 236, 221, 77, 201, 202, 16, 36, + 236, 207, 16, 36, 252, 13, 16, 36, 248, 228, 16, 36, 249, 131, 16, 36, + 231, 154, 203, 149, 16, 36, 222, 75, 235, 179, 16, 36, 83, 203, 149, 16, + 36, 235, 23, 235, 179, 16, 36, 247, 101, 210, 93, 16, 36, 206, 219, 214, + 33, 16, 36, 206, 219, 226, 85, 16, 36, 240, 59, 222, 65, 236, 142, 16, + 36, 239, 182, 241, 120, 100, 16, 36, 239, 182, 241, 120, 102, 16, 36, + 239, 182, 241, 120, 134, 16, 36, 239, 182, 241, 120, 136, 16, 36, 217, + 103, 252, 13, 16, 36, 203, 242, 226, 148, 16, 36, 236, 221, 77, 201, 203, + 248, 125, 16, 36, 247, 139, 16, 36, 236, 221, 77, 219, 188, 16, 36, 204, + 139, 16, 36, 236, 142, 16, 36, 235, 137, 207, 90, 16, 36, 233, 83, 207, + 90, 16, 36, 210, 168, 207, 90, 16, 36, 200, 50, 207, 90, 16, 36, 205, + 148, 16, 36, 239, 221, 248, 129, 105, 192, 248, 69, 16, 36, 217, 78, 16, + 36, 239, 222, 235, 23, 102, 16, 36, 204, 140, 235, 23, 102, 214, 173, + 122, 214, 173, 247, 10, 214, 173, 235, 26, 214, 173, 226, 16, 235, 26, + 214, 173, 248, 225, 248, 17, 214, 173, 248, 77, 202, 107, 214, 173, 248, + 57, 249, 84, 230, 191, 214, 173, 251, 112, 77, 245, 100, 214, 173, 240, + 64, 214, 173, 241, 3, 252, 17, 215, 143, 214, 173, 52, 249, 132, 46, 17, + 100, 46, 17, 102, 46, 17, 134, 46, 17, 136, 46, 17, 146, 46, 17, 167, 46, + 17, 178, 46, 17, 171, 46, 17, 182, 46, 31, 203, 23, 46, 31, 236, 251, 46, + 31, 200, 239, 46, 31, 202, 179, 46, 31, 235, 0, 46, 31, 235, 148, 46, 31, + 206, 23, 46, 31, 207, 68, 46, 31, 237, 27, 46, 31, 216, 175, 46, 31, 200, + 234, 119, 17, 100, 119, 17, 102, 119, 17, 134, 119, 17, 136, 119, 17, + 146, 119, 17, 167, 119, 17, 178, 119, 17, 171, 119, 17, 182, 119, 31, + 203, 23, 119, 31, 236, 251, 119, 31, 200, 239, 119, 31, 202, 179, 119, + 31, 235, 0, 119, 31, 235, 148, 119, 31, 206, 23, 119, 31, 207, 68, 119, + 31, 237, 27, 119, 31, 216, 175, 119, 31, 200, 234, 17, 97, 234, 216, 204, + 226, 17, 99, 234, 216, 204, 226, 17, 115, 234, 216, 204, 226, 17, 235, 6, + 234, 216, 204, 226, 17, 235, 100, 234, 216, 204, 226, 17, 206, 29, 234, + 216, 204, 226, 17, 207, 71, 234, 216, 204, 226, 17, 237, 30, 234, 216, + 204, 226, 17, 216, 178, 234, 216, 204, 226, 31, 203, 24, 234, 216, 204, + 226, 31, 236, 252, 234, 216, 204, 226, 31, 200, 240, 234, 216, 204, 226, + 31, 202, 180, 234, 216, 204, 226, 31, 235, 1, 234, 216, 204, 226, 31, + 235, 149, 234, 216, 204, 226, 31, 206, 24, 234, 216, 204, 226, 31, 207, + 69, 234, 216, 204, 226, 31, 237, 28, 234, 216, 204, 226, 31, 216, 176, + 234, 216, 204, 226, 31, 200, 235, 234, 216, 204, 226, 119, 8, 4, 1, 63, + 119, 8, 4, 1, 250, 111, 119, 8, 4, 1, 247, 206, 119, 8, 4, 1, 240, 230, + 119, 8, 4, 1, 69, 119, 8, 4, 1, 236, 48, 119, 8, 4, 1, 234, 189, 119, 8, + 4, 1, 233, 14, 119, 8, 4, 1, 68, 119, 8, 4, 1, 225, 216, 119, 8, 4, 1, + 225, 79, 119, 8, 4, 1, 159, 119, 8, 4, 1, 221, 135, 119, 8, 4, 1, 218, + 54, 119, 8, 4, 1, 72, 119, 8, 4, 1, 214, 2, 119, 8, 4, 1, 211, 166, 119, + 8, 4, 1, 144, 119, 8, 4, 1, 209, 80, 119, 8, 4, 1, 203, 216, 119, 8, 4, + 1, 66, 119, 8, 4, 1, 199, 230, 119, 8, 4, 1, 197, 199, 119, 8, 4, 1, 196, + 222, 119, 8, 4, 1, 196, 148, 119, 8, 4, 1, 195, 158, 46, 8, 6, 1, 63, 46, + 8, 6, 1, 250, 111, 46, 8, 6, 1, 247, 206, 46, 8, 6, 1, 240, 230, 46, 8, + 6, 1, 69, 46, 8, 6, 1, 236, 48, 46, 8, 6, 1, 234, 189, 46, 8, 6, 1, 233, + 14, 46, 8, 6, 1, 68, 46, 8, 6, 1, 225, 216, 46, 8, 6, 1, 225, 79, 46, 8, + 6, 1, 159, 46, 8, 6, 1, 221, 135, 46, 8, 6, 1, 218, 54, 46, 8, 6, 1, 72, + 46, 8, 6, 1, 214, 2, 46, 8, 6, 1, 211, 166, 46, 8, 6, 1, 144, 46, 8, 6, + 1, 209, 80, 46, 8, 6, 1, 203, 216, 46, 8, 6, 1, 66, 46, 8, 6, 1, 199, + 230, 46, 8, 6, 1, 197, 199, 46, 8, 6, 1, 196, 222, 46, 8, 6, 1, 196, 148, + 46, 8, 6, 1, 195, 158, 46, 8, 4, 1, 63, 46, 8, 4, 1, 250, 111, 46, 8, 4, + 1, 247, 206, 46, 8, 4, 1, 240, 230, 46, 8, 4, 1, 69, 46, 8, 4, 1, 236, + 48, 46, 8, 4, 1, 234, 189, 46, 8, 4, 1, 233, 14, 46, 8, 4, 1, 68, 46, 8, + 4, 1, 225, 216, 46, 8, 4, 1, 225, 79, 46, 8, 4, 1, 159, 46, 8, 4, 1, 221, + 135, 46, 8, 4, 1, 218, 54, 46, 8, 4, 1, 72, 46, 8, 4, 1, 214, 2, 46, 8, + 4, 1, 211, 166, 46, 8, 4, 1, 144, 46, 8, 4, 1, 209, 80, 46, 8, 4, 1, 203, + 216, 46, 8, 4, 1, 66, 46, 8, 4, 1, 199, 230, 46, 8, 4, 1, 197, 199, 46, + 8, 4, 1, 196, 222, 46, 8, 4, 1, 196, 148, 46, 8, 4, 1, 195, 158, 46, 17, + 195, 79, 217, 103, 46, 31, 236, 251, 217, 103, 46, 31, 200, 239, 217, + 103, 46, 31, 202, 179, 217, 103, 46, 31, 235, 0, 217, 103, 46, 31, 235, + 148, 217, 103, 46, 31, 206, 23, 217, 103, 46, 31, 207, 68, 217, 103, 46, + 31, 237, 27, 217, 103, 46, 31, 216, 175, 217, 103, 46, 31, 200, 234, 52, + 46, 17, 100, 52, 46, 17, 102, 52, 46, 17, 134, 52, 46, 17, 136, 52, 46, + 17, 146, 52, 46, 17, 167, 52, 46, 17, 178, 52, 46, 17, 171, 52, 46, 17, + 182, 52, 46, 31, 203, 23, 217, 103, 46, 17, 195, 79, 111, 129, 175, 231, + 153, 111, 129, 85, 231, 153, 111, 129, 175, 199, 100, 111, 129, 85, 199, + 100, 111, 129, 175, 201, 165, 240, 65, 231, 153, 111, 129, 85, 201, 165, + 240, 65, 231, 153, 111, 129, 175, 201, 165, 240, 65, 199, 100, 111, 129, + 85, 201, 165, 240, 65, 199, 100, 111, 129, 175, 211, 89, 240, 65, 231, + 153, 111, 129, 85, 211, 89, 240, 65, 231, 153, 111, 129, 175, 211, 89, + 240, 65, 199, 100, 111, 129, 85, 211, 89, 240, 65, 199, 100, 111, 129, + 175, 135, 26, 210, 22, 111, 129, 135, 175, 26, 53, 232, 119, 111, 129, + 135, 85, 26, 53, 222, 94, 111, 129, 85, 135, 26, 210, 22, 111, 129, 175, + 135, 26, 222, 183, 111, 129, 135, 175, 26, 50, 232, 119, 111, 129, 135, + 85, 26, 50, 222, 94, 111, 129, 85, 135, 26, 222, 183, 111, 129, 175, 124, + 26, 210, 22, 111, 129, 124, 175, 26, 53, 232, 119, 111, 129, 124, 85, 26, + 53, 222, 94, 111, 129, 85, 124, 26, 210, 22, 111, 129, 175, 124, 26, 222, + 183, 111, 129, 124, 175, 26, 50, 232, 119, 111, 129, 124, 85, 26, 50, + 222, 94, 111, 129, 85, 124, 26, 222, 183, 111, 129, 175, 83, 26, 210, 22, + 111, 129, 83, 175, 26, 53, 232, 119, 111, 129, 124, 85, 26, 53, 135, 222, + 94, 111, 129, 135, 85, 26, 53, 124, 222, 94, 111, 129, 83, 85, 26, 53, + 222, 94, 111, 129, 135, 175, 26, 53, 124, 232, 119, 111, 129, 124, 175, + 26, 53, 135, 232, 119, 111, 129, 85, 83, 26, 210, 22, 111, 129, 175, 83, + 26, 222, 183, 111, 129, 83, 175, 26, 50, 232, 119, 111, 129, 124, 85, 26, + 50, 135, 222, 94, 111, 129, 135, 85, 26, 50, 124, 222, 94, 111, 129, 83, + 85, 26, 50, 222, 94, 111, 129, 135, 175, 26, 50, 124, 232, 119, 111, 129, + 124, 175, 26, 50, 135, 232, 119, 111, 129, 85, 83, 26, 222, 183, 111, + 129, 175, 135, 26, 231, 153, 111, 129, 50, 85, 26, 53, 135, 222, 94, 111, + 129, 53, 85, 26, 50, 135, 222, 94, 111, 129, 135, 175, 26, 231, 154, 232, + 119, 111, 129, 135, 85, 26, 231, 154, 222, 94, 111, 129, 53, 175, 26, 50, + 135, 232, 119, 111, 129, 50, 175, 26, 53, 135, 232, 119, 111, 129, 85, + 135, 26, 231, 153, 111, 129, 175, 124, 26, 231, 153, 111, 129, 50, 85, + 26, 53, 124, 222, 94, 111, 129, 53, 85, 26, 50, 124, 222, 94, 111, 129, + 124, 175, 26, 231, 154, 232, 119, 111, 129, 124, 85, 26, 231, 154, 222, + 94, 111, 129, 53, 175, 26, 50, 124, 232, 119, 111, 129, 50, 175, 26, 53, + 124, 232, 119, 111, 129, 85, 124, 26, 231, 153, 111, 129, 175, 83, 26, + 231, 153, 111, 129, 50, 85, 26, 53, 83, 222, 94, 111, 129, 53, 85, 26, + 50, 83, 222, 94, 111, 129, 83, 175, 26, 231, 154, 232, 119, 111, 129, + 124, 85, 26, 135, 231, 154, 222, 94, 111, 129, 135, 85, 26, 124, 231, + 154, 222, 94, 111, 129, 83, 85, 26, 231, 154, 222, 94, 111, 129, 50, 124, + 85, 26, 53, 135, 222, 94, 111, 129, 53, 124, 85, 26, 50, 135, 222, 94, + 111, 129, 50, 135, 85, 26, 53, 124, 222, 94, 111, 129, 53, 135, 85, 26, + 50, 124, 222, 94, 111, 129, 135, 175, 26, 124, 231, 154, 232, 119, 111, + 129, 124, 175, 26, 135, 231, 154, 232, 119, 111, 129, 53, 175, 26, 50, + 83, 232, 119, 111, 129, 50, 175, 26, 53, 83, 232, 119, 111, 129, 85, 83, + 26, 231, 153, 111, 129, 175, 52, 240, 65, 231, 153, 111, 129, 85, 52, + 240, 65, 231, 153, 111, 129, 175, 52, 240, 65, 199, 100, 111, 129, 85, + 52, 240, 65, 199, 100, 111, 129, 52, 231, 153, 111, 129, 52, 199, 100, + 111, 129, 135, 206, 62, 26, 53, 237, 244, 111, 129, 135, 52, 26, 53, 206, + 61, 111, 129, 52, 135, 26, 210, 22, 111, 129, 135, 206, 62, 26, 50, 237, + 244, 111, 129, 135, 52, 26, 50, 206, 61, 111, 129, 52, 135, 26, 222, 183, + 111, 129, 124, 206, 62, 26, 53, 237, 244, 111, 129, 124, 52, 26, 53, 206, + 61, 111, 129, 52, 124, 26, 210, 22, 111, 129, 124, 206, 62, 26, 50, 237, + 244, 111, 129, 124, 52, 26, 50, 206, 61, 111, 129, 52, 124, 26, 222, 183, + 111, 129, 83, 206, 62, 26, 53, 237, 244, 111, 129, 83, 52, 26, 53, 206, + 61, 111, 129, 52, 83, 26, 210, 22, 111, 129, 83, 206, 62, 26, 50, 237, + 244, 111, 129, 83, 52, 26, 50, 206, 61, 111, 129, 52, 83, 26, 222, 183, + 111, 129, 135, 206, 62, 26, 231, 154, 237, 244, 111, 129, 135, 52, 26, + 231, 154, 206, 61, 111, 129, 52, 135, 26, 231, 153, 111, 129, 124, 206, + 62, 26, 231, 154, 237, 244, 111, 129, 124, 52, 26, 231, 154, 206, 61, + 111, 129, 52, 124, 26, 231, 153, 111, 129, 83, 206, 62, 26, 231, 154, + 237, 244, 111, 129, 83, 52, 26, 231, 154, 206, 61, 111, 129, 52, 83, 26, + 231, 153, 111, 129, 175, 250, 253, 135, 26, 210, 22, 111, 129, 175, 250, + 253, 135, 26, 222, 183, 111, 129, 175, 250, 253, 124, 26, 222, 183, 111, + 129, 175, 250, 253, 124, 26, 210, 22, 111, 129, 175, 239, 146, 200, 33, + 53, 202, 30, 221, 202, 222, 183, 111, 129, 175, 239, 146, 200, 33, 50, + 202, 30, 221, 202, 210, 22, 111, 129, 175, 239, 146, 241, 60, 111, 129, + 175, 222, 183, 111, 129, 175, 200, 36, 111, 129, 175, 210, 22, 111, 129, + 175, 237, 234, 111, 129, 85, 222, 183, 111, 129, 85, 200, 36, 111, 129, + 85, 210, 22, 111, 129, 85, 237, 234, 111, 129, 175, 50, 26, 85, 210, 22, + 111, 129, 175, 124, 26, 85, 237, 234, 111, 129, 85, 50, 26, 175, 210, 22, + 111, 129, 85, 124, 26, 175, 237, 234, 200, 33, 157, 248, 125, 221, 202, + 97, 237, 26, 248, 125, 221, 202, 97, 211, 87, 248, 125, 221, 202, 115, + 237, 24, 248, 125, 221, 202, 157, 248, 125, 221, 202, 235, 100, 237, 24, + 248, 125, 221, 202, 115, 211, 85, 248, 125, 221, 202, 207, 71, 237, 24, + 248, 125, 234, 216, 248, 125, 50, 207, 71, 237, 24, 248, 125, 50, 115, + 211, 85, 248, 125, 50, 235, 100, 237, 24, 248, 125, 50, 157, 248, 125, + 50, 115, 237, 24, 248, 125, 50, 97, 211, 87, 248, 125, 50, 97, 237, 26, + 248, 125, 53, 157, 248, 125, 175, 207, 39, 219, 189, 207, 39, 240, 70, + 207, 39, 200, 33, 97, 237, 26, 248, 125, 53, 97, 237, 26, 248, 125, 211, + 91, 221, 202, 222, 183, 211, 91, 221, 202, 210, 22, 211, 91, 200, 33, + 222, 183, 211, 91, 200, 33, 50, 26, 221, 202, 50, 26, 221, 202, 210, 22, + 211, 91, 200, 33, 50, 26, 221, 202, 210, 22, 211, 91, 200, 33, 50, 26, + 200, 33, 53, 26, 221, 202, 222, 183, 211, 91, 200, 33, 50, 26, 200, 33, + 53, 26, 221, 202, 210, 22, 211, 91, 200, 33, 210, 22, 211, 91, 200, 33, + 53, 26, 221, 202, 222, 183, 211, 91, 200, 33, 53, 26, 221, 202, 50, 26, + 221, 202, 210, 22, 58, 205, 94, 59, 205, 94, 59, 47, 3, 209, 185, 241, + 99, 59, 47, 241, 131, 58, 4, 205, 94, 47, 3, 231, 154, 235, 135, 47, 3, + 83, 235, 135, 47, 3, 214, 54, 241, 55, 235, 135, 47, 3, 200, 33, 50, 202, + 30, 221, 202, 53, 235, 135, 47, 3, 200, 33, 53, 202, 30, 221, 202, 50, + 235, 135, 47, 3, 239, 146, 241, 55, 235, 135, 58, 4, 205, 94, 59, 4, 205, + 94, 58, 210, 162, 59, 210, 162, 58, 83, 210, 162, 59, 83, 210, 162, 58, + 213, 143, 59, 213, 143, 58, 200, 35, 201, 180, 59, 200, 35, 201, 180, 58, + 200, 35, 4, 201, 180, 59, 200, 35, 4, 201, 180, 58, 210, 17, 201, 180, + 59, 210, 17, 201, 180, 58, 210, 17, 4, 201, 180, 59, 210, 17, 4, 201, + 180, 58, 210, 17, 212, 107, 59, 210, 17, 212, 107, 58, 237, 233, 201, + 180, 59, 237, 233, 201, 180, 58, 237, 233, 4, 201, 180, 59, 237, 233, 4, + 201, 180, 58, 222, 178, 201, 180, 59, 222, 178, 201, 180, 58, 222, 178, + 4, 201, 180, 59, 222, 178, 4, 201, 180, 58, 222, 178, 212, 107, 59, 222, + 178, 212, 107, 58, 239, 139, 59, 239, 139, 59, 239, 140, 241, 131, 58, 4, + 239, 139, 235, 109, 221, 197, 59, 244, 248, 237, 249, 244, 248, 244, 249, + 3, 83, 235, 135, 248, 0, 58, 244, 248, 244, 249, 3, 50, 157, 248, 135, + 244, 249, 3, 53, 157, 248, 135, 244, 249, 3, 221, 202, 157, 248, 135, + 244, 249, 3, 200, 33, 157, 248, 135, 244, 249, 3, 200, 33, 53, 211, 91, + 248, 135, 244, 249, 3, 251, 146, 247, 231, 200, 33, 50, 211, 91, 248, + 135, 50, 157, 58, 244, 248, 53, 157, 58, 244, 248, 226, 18, 248, 4, 226, + 18, 59, 244, 248, 200, 33, 157, 226, 18, 59, 244, 248, 221, 202, 157, + 226, 18, 59, 244, 248, 200, 33, 50, 211, 91, 244, 242, 250, 252, 200, 33, + 53, 211, 91, 244, 242, 250, 252, 221, 202, 53, 211, 91, 244, 242, 250, + 252, 221, 202, 50, 211, 91, 244, 242, 250, 252, 200, 33, 157, 244, 248, + 221, 202, 157, 244, 248, 58, 221, 202, 53, 201, 180, 58, 221, 202, 50, + 201, 180, 58, 200, 33, 50, 201, 180, 58, 200, 33, 53, 201, 180, 59, 248, + 4, 47, 3, 50, 157, 248, 135, 47, 3, 53, 157, 248, 135, 47, 3, 200, 33, + 50, 239, 146, 157, 248, 135, 47, 3, 221, 202, 53, 239, 146, 157, 248, + 135, 59, 47, 3, 83, 248, 149, 222, 74, 59, 200, 35, 201, 181, 3, 238, + 252, 200, 35, 201, 181, 3, 50, 157, 248, 135, 200, 35, 201, 181, 3, 53, + 157, 248, 135, 222, 227, 244, 248, 59, 47, 3, 200, 33, 50, 211, 90, 59, + 47, 3, 221, 202, 50, 211, 90, 59, 47, 3, 221, 202, 53, 211, 90, 59, 47, + 3, 200, 33, 53, 211, 90, 59, 244, 249, 3, 200, 33, 50, 211, 90, 59, 244, + 249, 3, 221, 202, 50, 211, 90, 59, 244, 249, 3, 221, 202, 53, 211, 90, + 59, 244, 249, 3, 200, 33, 53, 211, 90, 200, 33, 50, 201, 180, 200, 33, + 53, 201, 180, 221, 202, 50, 201, 180, 59, 219, 189, 205, 94, 58, 219, + 189, 205, 94, 59, 219, 189, 4, 205, 94, 58, 219, 189, 4, 205, 94, 221, + 202, 53, 201, 180, 58, 204, 112, 3, 210, 187, 244, 193, 200, 76, 205, + 202, 244, 161, 58, 205, 7, 59, 205, 7, 222, 91, 202, 137, 204, 111, 250, + 197, 216, 41, 239, 193, 216, 41, 241, 140, 214, 77, 58, 203, 33, 59, 203, + 33, 249, 98, 248, 69, 249, 98, 111, 3, 245, 100, 249, 98, 111, 3, 196, + 222, 208, 230, 200, 77, 3, 210, 217, 237, 207, 231, 95, 248, 200, 59, + 206, 191, 212, 211, 58, 206, 191, 212, 211, 207, 26, 210, 89, 209, 194, + 235, 65, 232, 126, 248, 4, 58, 50, 212, 106, 226, 71, 58, 53, 212, 106, + 226, 71, 59, 50, 212, 106, 226, 71, 59, 124, 212, 106, 226, 71, 59, 53, + 212, 106, 226, 71, 59, 135, 212, 106, 226, 71, 205, 255, 26, 241, 59, + 247, 85, 55, 210, 229, 55, 248, 157, 55, 247, 164, 251, 78, 214, 55, 241, + 60, 245, 75, 210, 74, 241, 61, 77, 221, 219, 241, 61, 77, 225, 181, 205, + 8, 26, 241, 70, 235, 203, 105, 251, 253, 207, 29, 232, 216, 26, 206, 103, + 213, 90, 105, 196, 13, 196, 95, 201, 170, 36, 232, 121, 201, 170, 36, + 223, 0, 201, 170, 36, 235, 117, 201, 170, 36, 202, 138, 201, 170, 36, + 197, 50, 201, 170, 36, 197, 127, 201, 170, 36, 218, 168, 201, 170, 36, + 237, 71, 197, 78, 77, 239, 167, 59, 234, 228, 235, 232, 59, 205, 218, + 235, 232, 58, 205, 218, 235, 232, 59, 204, 112, 3, 210, 187, 235, 112, + 211, 87, 218, 188, 222, 220, 211, 87, 218, 188, 219, 157, 235, 171, 55, + 237, 71, 220, 66, 55, 225, 94, 208, 192, 200, 16, 217, 93, 212, 120, 250, + 238, 203, 87, 234, 34, 247, 137, 222, 145, 199, 5, 222, 105, 208, 157, + 208, 255, 247, 119, 251, 14, 212, 159, 59, 245, 82, 224, 72, 59, 245, 82, + 211, 79, 59, 245, 82, 209, 203, 59, 245, 82, 248, 147, 59, 245, 82, 224, + 18, 59, 245, 82, 213, 102, 58, 245, 82, 224, 72, 58, 245, 82, 211, 79, + 58, 245, 82, 209, 203, 58, 245, 82, 248, 147, 58, 245, 82, 224, 18, 58, + 245, 82, 213, 102, 58, 205, 146, 204, 124, 59, 232, 126, 204, 124, 59, + 239, 140, 204, 124, 58, 244, 190, 204, 124, 59, 205, 146, 204, 124, 58, + 232, 126, 204, 124, 58, 239, 140, 204, 124, 59, 244, 190, 204, 124, 231, + 95, 205, 99, 211, 87, 216, 12, 237, 26, 216, 12, 249, 4, 237, 26, 216, 7, + 249, 4, 206, 22, 216, 7, 218, 88, 235, 82, 55, 218, 88, 217, 202, 55, + 218, 88, 207, 13, 55, 197, 89, 203, 236, 241, 60, 237, 68, 203, 236, 241, + 60, 200, 46, 210, 158, 105, 210, 158, 16, 36, 200, 200, 212, 139, 210, + 158, 16, 36, 200, 198, 212, 139, 210, 158, 16, 36, 200, 197, 212, 139, + 210, 158, 16, 36, 200, 195, 212, 139, 210, 158, 16, 36, 200, 193, 212, + 139, 210, 158, 16, 36, 200, 191, 212, 139, 210, 158, 16, 36, 200, 189, + 212, 139, 210, 158, 16, 36, 234, 31, 220, 1, 58, 200, 46, 210, 158, 105, + 210, 159, 213, 161, 105, 213, 130, 213, 161, 105, 213, 36, 213, 161, 55, + 197, 76, 105, 239, 132, 235, 231, 239, 132, 235, 230, 239, 132, 235, 229, + 239, 132, 235, 228, 239, 132, 235, 227, 239, 132, 235, 226, 59, 244, 249, + 3, 76, 210, 22, 59, 244, 249, 3, 99, 238, 249, 58, 244, 249, 3, 59, 76, + 210, 22, 58, 244, 249, 3, 99, 59, 238, 249, 218, 204, 36, 196, 95, 218, + 204, 36, 196, 12, 239, 113, 36, 233, 94, 196, 95, 239, 113, 36, 222, 137, + 196, 12, 239, 113, 36, 222, 137, 196, 95, 239, 113, 36, 233, 94, 196, 12, + 59, 235, 92, 58, 235, 92, 232, 216, 26, 212, 215, 251, 101, 241, 58, 204, + 47, 205, 17, 77, 251, 227, 208, 175, 251, 162, 235, 61, 234, 44, 205, 17, + 77, 232, 93, 250, 157, 105, 235, 77, 214, 29, 59, 205, 7, 115, 222, 69, + 241, 117, 210, 22, 115, 222, 69, 241, 117, 222, 183, 197, 138, 55, 130, + 198, 237, 55, 237, 239, 235, 171, 55, 237, 239, 220, 66, 55, 226, 28, + 235, 171, 26, 220, 66, 55, 220, 66, 26, 235, 171, 55, 220, 66, 3, 204, + 196, 55, 220, 66, 3, 204, 196, 26, 220, 66, 26, 235, 171, 55, 83, 220, + 66, 3, 204, 196, 55, 231, 154, 220, 66, 3, 204, 196, 55, 219, 189, 59, + 244, 248, 219, 189, 58, 244, 248, 219, 189, 4, 59, 244, 248, 220, 20, + 105, 239, 51, 105, 200, 43, 213, 129, 105, 244, 172, 234, 211, 200, 12, + 217, 85, 247, 21, 213, 208, 225, 100, 199, 45, 245, 55, 58, 218, 189, + 222, 88, 207, 61, 207, 102, 211, 69, 207, 79, 205, 190, 249, 102, 249, + 64, 103, 224, 152, 59, 237, 219, 220, 61, 59, 237, 219, 224, 72, 58, 237, + 219, 220, 61, 58, 237, 219, 224, 72, 205, 203, 197, 37, 205, 206, 204, + 112, 248, 235, 244, 193, 210, 216, 58, 205, 202, 202, 139, 244, 194, 26, + 210, 216, 163, 59, 206, 191, 212, 211, 163, 58, 206, 191, 212, 211, 59, + 239, 140, 226, 86, 205, 94, 241, 54, 222, 234, 239, 80, 247, 115, 214, + 80, 212, 215, 247, 116, 205, 237, 232, 103, 3, 59, 241, 60, 46, 241, 54, + 222, 234, 247, 11, 216, 50, 236, 198, 251, 130, 214, 110, 50, 197, 113, + 201, 210, 58, 200, 212, 50, 197, 113, 201, 210, 59, 200, 212, 50, 197, + 113, 201, 210, 58, 50, 222, 235, 219, 156, 59, 50, 222, 235, 219, 156, + 237, 214, 205, 228, 55, 85, 59, 237, 233, 201, 180, 50, 244, 202, 236, + 198, 103, 208, 230, 235, 212, 239, 146, 226, 86, 59, 244, 249, 226, 86, + 58, 205, 94, 58, 201, 144, 210, 100, 50, 236, 197, 210, 100, 50, 236, + 196, 250, 172, 16, 36, 200, 16, 85, 244, 249, 3, 204, 196, 26, 99, 238, + 250, 57, 213, 53, 210, 19, 226, 30, 213, 53, 222, 180, 226, 30, 213, 53, + 226, 16, 213, 53, 58, 241, 61, 214, 119, 206, 220, 206, 208, 206, 156, + 245, 21, 247, 93, 232, 31, 206, 30, 234, 45, 197, 37, 231, 68, 234, 45, + 3, 232, 185, 220, 43, 16, 36, 222, 93, 218, 168, 200, 77, 214, 119, 233, + 84, 235, 7, 235, 93, 226, 86, 231, 174, 235, 161, 208, 250, 47, 235, 6, + 241, 99, 206, 2, 230, 201, 206, 6, 213, 28, 3, 249, 102, 203, 15, 225, + 201, 249, 84, 105, 232, 130, 233, 96, 105, 234, 219, 211, 214, 241, 27, + 214, 119, 58, 205, 94, 59, 235, 93, 3, 231, 154, 112, 58, 204, 197, 58, + 209, 4, 208, 161, 200, 33, 248, 130, 208, 161, 58, 208, 161, 221, 202, + 248, 130, 208, 161, 59, 208, 161, 59, 85, 245, 101, 78, 203, 34, 222, 3, + 55, 203, 104, 237, 213, 251, 186, 236, 193, 210, 214, 235, 105, 210, 214, + 232, 208, 199, 32, 232, 208, 196, 246, 232, 208, 221, 202, 53, 213, 63, + 213, 63, 200, 33, 53, 213, 63, 59, 216, 211, 58, 216, 211, 245, 101, 78, + 85, 245, 101, 78, 218, 117, 196, 222, 85, 218, 117, 196, 222, 249, 98, + 196, 222, 85, 249, 98, 196, 222, 214, 29, 32, 241, 60, 85, 32, 241, 60, + 192, 247, 36, 241, 60, 85, 192, 247, 36, 241, 60, 8, 241, 60, 207, 37, + 59, 8, 241, 60, 214, 29, 8, 241, 60, 220, 63, 241, 60, 205, 8, 77, 240, + 57, 235, 6, 203, 53, 250, 178, 235, 6, 249, 99, 250, 178, 85, 235, 6, + 249, 99, 250, 178, 235, 6, 244, 188, 250, 178, 58, 235, 6, 212, 108, 205, + 7, 59, 235, 6, 212, 108, 205, 7, 205, 141, 204, 206, 214, 29, 59, 205, 7, + 46, 59, 205, 7, 192, 247, 36, 58, 205, 7, 58, 247, 36, 59, 205, 7, 214, + 29, 58, 205, 7, 85, 214, 29, 58, 205, 7, 212, 169, 205, 7, 207, 37, 59, + 205, 7, 85, 250, 178, 192, 247, 36, 250, 178, 237, 30, 205, 110, 250, + 178, 237, 30, 212, 108, 58, 205, 7, 237, 30, 212, 108, 212, 169, 205, 7, + 206, 29, 212, 108, 58, 205, 7, 237, 30, 212, 108, 210, 160, 58, 205, 7, + 85, 237, 30, 212, 108, 210, 160, 58, 205, 7, 200, 240, 212, 108, 58, 205, + 7, 206, 24, 212, 108, 250, 178, 203, 53, 250, 178, 192, 247, 36, 203, 53, + 250, 178, 85, 203, 53, 250, 178, 206, 29, 213, 16, 58, 26, 59, 235, 64, + 58, 235, 64, 59, 235, 64, 237, 30, 213, 16, 214, 29, 58, 235, 64, 46, + 192, 247, 36, 237, 30, 212, 108, 205, 7, 85, 203, 53, 212, 169, 250, 178, + 205, 204, 202, 101, 201, 173, 205, 204, 85, 245, 78, 205, 204, 205, 143, + 85, 205, 143, 249, 99, 250, 178, 237, 30, 203, 53, 211, 249, 250, 178, + 85, 237, 30, 203, 53, 211, 249, 250, 178, 241, 61, 78, 207, 37, 59, 244, + 248, 217, 103, 103, 241, 61, 78, 221, 202, 53, 237, 209, 59, 205, 94, + 200, 33, 53, 237, 209, 59, 205, 94, 221, 202, 53, 207, 37, 59, 205, 94, + 200, 33, 53, 207, 37, 59, 205, 94, 58, 211, 78, 117, 214, 58, 59, 211, + 78, 117, 214, 58, 59, 236, 89, 117, 214, 58, 58, 239, 140, 219, 15, 59, + 196, 222, 85, 236, 89, 117, 105, 175, 83, 154, 219, 189, 83, 154, 85, 83, + 154, 85, 206, 62, 163, 244, 159, 211, 61, 117, 214, 58, 85, 206, 62, 244, + 159, 211, 61, 117, 214, 58, 85, 52, 163, 244, 159, 211, 61, 117, 214, 58, + 85, 52, 244, 159, 211, 61, 117, 214, 58, 85, 126, 206, 62, 244, 159, 211, + 61, 117, 214, 58, 85, 126, 52, 244, 159, 211, 61, 117, 214, 58, 241, 9, + 204, 244, 213, 153, 2, 214, 58, 85, 236, 89, 117, 214, 58, 85, 232, 126, + 236, 89, 117, 214, 58, 85, 58, 232, 125, 209, 194, 85, 58, 232, 126, 248, + 4, 235, 65, 232, 125, 209, 194, 235, 65, 232, 126, 248, 4, 219, 189, 50, + 213, 140, 214, 58, 219, 189, 53, 213, 140, 214, 58, 219, 189, 235, 78, + 50, 213, 140, 214, 58, 219, 189, 235, 78, 53, 213, 140, 214, 58, 219, + 189, 222, 178, 251, 90, 248, 61, 214, 58, 219, 189, 210, 17, 251, 90, + 248, 61, 214, 58, 85, 222, 178, 251, 90, 211, 61, 117, 214, 58, 85, 210, + 17, 251, 90, 211, 61, 117, 214, 58, 85, 222, 178, 251, 90, 248, 61, 214, + 58, 85, 210, 17, 251, 90, 248, 61, 214, 58, 175, 50, 201, 231, 206, 245, + 248, 61, 214, 58, 175, 53, 201, 231, 206, 245, 248, 61, 214, 58, 219, + 189, 50, 241, 17, 248, 61, 214, 58, 219, 189, 53, 241, 17, 248, 61, 214, + 58, 239, 92, 217, 103, 46, 17, 100, 239, 92, 217, 103, 46, 17, 102, 239, + 92, 217, 103, 46, 17, 134, 239, 92, 217, 103, 46, 17, 136, 239, 92, 217, + 103, 46, 17, 146, 239, 92, 217, 103, 46, 17, 167, 239, 92, 217, 103, 46, + 17, 178, 239, 92, 217, 103, 46, 17, 171, 239, 92, 217, 103, 46, 17, 182, + 239, 92, 217, 103, 46, 31, 203, 23, 239, 92, 46, 45, 17, 100, 239, 92, + 46, 45, 17, 102, 239, 92, 46, 45, 17, 134, 239, 92, 46, 45, 17, 136, 239, + 92, 46, 45, 17, 146, 239, 92, 46, 45, 17, 167, 239, 92, 46, 45, 17, 178, + 239, 92, 46, 45, 17, 171, 239, 92, 46, 45, 17, 182, 239, 92, 46, 45, 31, + 203, 23, 239, 92, 217, 103, 46, 45, 17, 100, 239, 92, 217, 103, 46, 45, + 17, 102, 239, 92, 217, 103, 46, 45, 17, 134, 239, 92, 217, 103, 46, 45, + 17, 136, 239, 92, 217, 103, 46, 45, 17, 146, 239, 92, 217, 103, 46, 45, + 17, 167, 239, 92, 217, 103, 46, 45, 17, 178, 239, 92, 217, 103, 46, 45, + 17, 171, 239, 92, 217, 103, 46, 45, 17, 182, 239, 92, 217, 103, 46, 45, + 31, 203, 23, 85, 197, 61, 91, 51, 85, 98, 55, 85, 219, 15, 55, 85, 239, + 53, 55, 85, 205, 159, 237, 68, 51, 85, 91, 51, 85, 173, 237, 68, 51, 237, + 224, 212, 110, 91, 51, 85, 209, 186, 91, 51, 201, 179, 91, 51, 85, 201, + 179, 91, 51, 240, 63, 201, 179, 91, 51, 85, 240, 63, 201, 179, 91, 51, + 58, 91, 51, 202, 154, 201, 241, 91, 250, 216, 202, 154, 248, 82, 91, 250, + 216, 58, 91, 250, 216, 85, 58, 241, 9, 237, 230, 26, 91, 51, 85, 58, 241, + 9, 200, 24, 26, 91, 51, 205, 91, 58, 91, 51, 85, 241, 153, 58, 91, 51, + 210, 16, 59, 91, 51, 222, 177, 59, 91, 51, 249, 136, 207, 37, 59, 91, 51, + 234, 231, 207, 37, 59, 91, 51, 85, 221, 202, 210, 15, 59, 91, 51, 85, + 200, 33, 210, 15, 59, 91, 51, 216, 14, 221, 202, 210, 15, 59, 91, 51, + 241, 17, 221, 224, 216, 14, 200, 33, 210, 15, 59, 91, 51, 46, 85, 59, 91, + 51, 197, 72, 91, 51, 248, 134, 205, 159, 237, 68, 51, 248, 134, 91, 51, + 248, 134, 173, 237, 68, 51, 85, 248, 134, 205, 159, 237, 68, 51, 85, 248, + 134, 91, 51, 85, 248, 134, 173, 237, 68, 51, 203, 55, 91, 51, 85, 203, + 54, 91, 51, 197, 99, 91, 51, 85, 197, 99, 91, 51, 214, 86, 91, 51, 52, + 241, 17, 221, 224, 115, 239, 102, 251, 89, 59, 201, 181, 241, 131, 4, 59, + 201, 180, 213, 31, 192, 204, 141, 192, 204, 93, 50, 209, 79, 249, 122, + 239, 217, 53, 209, 79, 249, 122, 239, 217, 214, 72, 3, 76, 226, 40, 210, + 90, 205, 178, 212, 33, 204, 141, 204, 94, 212, 33, 205, 177, 83, 249, 79, + 3, 231, 154, 106, 13, 209, 250, 239, 145, 181, 239, 52, 13, 235, 212, + 239, 145, 103, 221, 248, 251, 99, 103, 221, 248, 214, 71, 59, 239, 140, + 3, 247, 34, 238, 252, 26, 3, 238, 252, 236, 255, 77, 214, 84, 200, 23, + 221, 202, 53, 241, 101, 3, 238, 252, 200, 33, 50, 241, 101, 3, 238, 252, + 50, 214, 31, 225, 126, 53, 214, 31, 225, 126, 234, 216, 214, 31, 225, + 126, 222, 227, 124, 203, 147, 222, 227, 135, 203, 147, 50, 26, 53, 52, + 201, 3, 50, 26, 53, 203, 147, 50, 218, 121, 181, 53, 203, 147, 181, 50, + 203, 147, 124, 203, 148, 3, 244, 249, 57, 221, 198, 239, 59, 247, 218, + 231, 154, 209, 124, 59, 241, 152, 239, 139, 59, 241, 152, 239, 140, 3, + 107, 202, 111, 59, 241, 152, 239, 140, 3, 91, 202, 111, 59, 47, 3, 107, + 202, 111, 59, 47, 3, 91, 202, 111, 13, 50, 59, 47, 179, 13, 53, 59, 47, + 179, 13, 50, 251, 90, 179, 13, 53, 251, 90, 179, 13, 50, 52, 251, 90, + 179, 13, 53, 52, 251, 90, 179, 13, 50, 59, 201, 231, 206, 245, 179, 13, + 53, 59, 201, 231, 206, 245, 179, 13, 50, 235, 78, 213, 139, 13, 53, 235, + 78, 213, 139, 200, 24, 211, 89, 51, 237, 230, 211, 89, 51, 251, 64, 234, + 84, 244, 249, 51, 244, 204, 234, 84, 244, 249, 51, 53, 61, 3, 46, 212, + 124, 181, 107, 51, 181, 91, 51, 181, 50, 53, 51, 181, 107, 52, 51, 181, + 91, 52, 51, 181, 50, 53, 52, 51, 181, 107, 61, 234, 234, 154, 181, 91, + 61, 234, 234, 154, 181, 107, 52, 61, 234, 234, 154, 181, 91, 52, 61, 234, + 234, 154, 181, 91, 205, 87, 51, 64, 65, 248, 128, 64, 65, 238, 248, 64, + 65, 238, 120, 64, 65, 238, 247, 64, 65, 238, 56, 64, 65, 238, 183, 64, + 65, 238, 119, 64, 65, 238, 246, 64, 65, 238, 24, 64, 65, 238, 151, 64, + 65, 238, 87, 64, 65, 238, 214, 64, 65, 238, 55, 64, 65, 238, 182, 64, 65, + 238, 118, 64, 65, 238, 245, 64, 65, 238, 8, 64, 65, 238, 135, 64, 65, + 238, 71, 64, 65, 238, 198, 64, 65, 238, 39, 64, 65, 238, 166, 64, 65, + 238, 102, 64, 65, 238, 229, 64, 65, 238, 23, 64, 65, 238, 150, 64, 65, + 238, 86, 64, 65, 238, 213, 64, 65, 238, 54, 64, 65, 238, 181, 64, 65, + 238, 117, 64, 65, 238, 244, 64, 65, 238, 0, 64, 65, 238, 127, 64, 65, + 238, 63, 64, 65, 238, 190, 64, 65, 238, 31, 64, 65, 238, 158, 64, 65, + 238, 94, 64, 65, 238, 221, 64, 65, 238, 15, 64, 65, 238, 142, 64, 65, + 238, 78, 64, 65, 238, 205, 64, 65, 238, 46, 64, 65, 238, 173, 64, 65, + 238, 109, 64, 65, 238, 236, 64, 65, 238, 7, 64, 65, 238, 134, 64, 65, + 238, 70, 64, 65, 238, 197, 64, 65, 238, 38, 64, 65, 238, 165, 64, 65, + 238, 101, 64, 65, 238, 228, 64, 65, 238, 22, 64, 65, 238, 149, 64, 65, + 238, 85, 64, 65, 238, 212, 64, 65, 238, 53, 64, 65, 238, 180, 64, 65, + 238, 116, 64, 65, 238, 243, 64, 65, 237, 252, 64, 65, 238, 123, 64, 65, + 238, 59, 64, 65, 238, 186, 64, 65, 238, 27, 64, 65, 238, 154, 64, 65, + 238, 90, 64, 65, 238, 217, 64, 65, 238, 11, 64, 65, 238, 138, 64, 65, + 238, 74, 64, 65, 238, 201, 64, 65, 238, 42, 64, 65, 238, 169, 64, 65, + 238, 105, 64, 65, 238, 232, 64, 65, 238, 3, 64, 65, 238, 130, 64, 65, + 238, 66, 64, 65, 238, 193, 64, 65, 238, 34, 64, 65, 238, 161, 64, 65, + 238, 97, 64, 65, 238, 224, 64, 65, 238, 18, 64, 65, 238, 145, 64, 65, + 238, 81, 64, 65, 238, 208, 64, 65, 238, 49, 64, 65, 238, 176, 64, 65, + 238, 112, 64, 65, 238, 239, 64, 65, 237, 255, 64, 65, 238, 126, 64, 65, + 238, 62, 64, 65, 238, 189, 64, 65, 238, 30, 64, 65, 238, 157, 64, 65, + 238, 93, 64, 65, 238, 220, 64, 65, 238, 14, 64, 65, 238, 141, 64, 65, + 238, 77, 64, 65, 238, 204, 64, 65, 238, 45, 64, 65, 238, 172, 64, 65, + 238, 108, 64, 65, 238, 235, 64, 65, 238, 6, 64, 65, 238, 133, 64, 65, + 238, 69, 64, 65, 238, 196, 64, 65, 238, 37, 64, 65, 238, 164, 64, 65, + 238, 100, 64, 65, 238, 227, 64, 65, 238, 21, 64, 65, 238, 148, 64, 65, + 238, 84, 64, 65, 238, 211, 64, 65, 238, 52, 64, 65, 238, 179, 64, 65, + 238, 115, 64, 65, 238, 242, 64, 65, 237, 250, 64, 65, 238, 121, 64, 65, + 238, 57, 64, 65, 238, 184, 64, 65, 238, 25, 64, 65, 238, 152, 64, 65, + 238, 88, 64, 65, 238, 215, 64, 65, 238, 9, 64, 65, 238, 136, 64, 65, 238, + 72, 64, 65, 238, 199, 64, 65, 238, 40, 64, 65, 238, 167, 64, 65, 238, + 103, 64, 65, 238, 230, 64, 65, 238, 1, 64, 65, 238, 128, 64, 65, 238, 64, + 64, 65, 238, 191, 64, 65, 238, 32, 64, 65, 238, 159, 64, 65, 238, 95, 64, + 65, 238, 222, 64, 65, 238, 16, 64, 65, 238, 143, 64, 65, 238, 79, 64, 65, + 238, 206, 64, 65, 238, 47, 64, 65, 238, 174, 64, 65, 238, 110, 64, 65, + 238, 237, 64, 65, 237, 253, 64, 65, 238, 124, 64, 65, 238, 60, 64, 65, + 238, 187, 64, 65, 238, 28, 64, 65, 238, 155, 64, 65, 238, 91, 64, 65, + 238, 218, 64, 65, 238, 12, 64, 65, 238, 139, 64, 65, 238, 75, 64, 65, + 238, 202, 64, 65, 238, 43, 64, 65, 238, 170, 64, 65, 238, 106, 64, 65, + 238, 233, 64, 65, 238, 4, 64, 65, 238, 131, 64, 65, 238, 67, 64, 65, 238, + 194, 64, 65, 238, 35, 64, 65, 238, 162, 64, 65, 238, 98, 64, 65, 238, + 225, 64, 65, 238, 19, 64, 65, 238, 146, 64, 65, 238, 82, 64, 65, 238, + 209, 64, 65, 238, 50, 64, 65, 238, 177, 64, 65, 238, 113, 64, 65, 238, + 240, 64, 65, 237, 251, 64, 65, 238, 122, 64, 65, 238, 58, 64, 65, 238, + 185, 64, 65, 238, 26, 64, 65, 238, 153, 64, 65, 238, 89, 64, 65, 238, + 216, 64, 65, 238, 10, 64, 65, 238, 137, 64, 65, 238, 73, 64, 65, 238, + 200, 64, 65, 238, 41, 64, 65, 238, 168, 64, 65, 238, 104, 64, 65, 238, + 231, 64, 65, 238, 2, 64, 65, 238, 129, 64, 65, 238, 65, 64, 65, 238, 192, + 64, 65, 238, 33, 64, 65, 238, 160, 64, 65, 238, 96, 64, 65, 238, 223, 64, + 65, 238, 17, 64, 65, 238, 144, 64, 65, 238, 80, 64, 65, 238, 207, 64, 65, + 238, 48, 64, 65, 238, 175, 64, 65, 238, 111, 64, 65, 238, 238, 64, 65, + 237, 254, 64, 65, 238, 125, 64, 65, 238, 61, 64, 65, 238, 188, 64, 65, + 238, 29, 64, 65, 238, 156, 64, 65, 238, 92, 64, 65, 238, 219, 64, 65, + 238, 13, 64, 65, 238, 140, 64, 65, 238, 76, 64, 65, 238, 203, 64, 65, + 238, 44, 64, 65, 238, 171, 64, 65, 238, 107, 64, 65, 238, 234, 64, 65, + 238, 5, 64, 65, 238, 132, 64, 65, 238, 68, 64, 65, 238, 195, 64, 65, 238, + 36, 64, 65, 238, 163, 64, 65, 238, 99, 64, 65, 238, 226, 64, 65, 238, 20, + 64, 65, 238, 147, 64, 65, 238, 83, 64, 65, 238, 210, 64, 65, 238, 51, 64, + 65, 238, 178, 64, 65, 238, 114, 64, 65, 238, 241, 91, 200, 215, 61, 3, + 83, 106, 91, 200, 215, 61, 3, 52, 83, 106, 107, 52, 61, 3, 83, 106, 91, + 52, 61, 3, 83, 106, 50, 53, 52, 61, 3, 83, 106, 91, 200, 215, 61, 234, + 234, 154, 107, 52, 61, 234, 234, 154, 91, 52, 61, 234, 234, 154, 237, + 230, 61, 3, 231, 154, 106, 200, 24, 61, 3, 231, 154, 106, 200, 24, 201, + 165, 51, 237, 230, 201, 165, 51, 107, 52, 240, 65, 51, 91, 52, 240, 65, + 51, 107, 201, 165, 240, 65, 51, 91, 201, 165, 240, 65, 51, 91, 200, 215, + 201, 165, 240, 65, 51, 91, 61, 3, 237, 249, 204, 243, 200, 24, 61, 202, + 30, 154, 237, 230, 61, 202, 30, 154, 91, 61, 3, 203, 136, 3, 83, 106, 91, + 61, 3, 203, 136, 3, 52, 83, 106, 91, 200, 215, 61, 3, 203, 135, 91, 200, + 215, 61, 3, 203, 136, 3, 83, 106, 91, 200, 215, 61, 3, 203, 136, 3, 52, + 83, 106, 107, 250, 218, 91, 250, 218, 107, 52, 250, 218, 91, 52, 250, + 218, 107, 61, 202, 30, 58, 239, 139, 91, 61, 202, 30, 58, 239, 139, 107, + 61, 234, 234, 249, 79, 202, 30, 58, 239, 139, 91, 61, 234, 234, 249, 79, + 202, 30, 58, 239, 139, 173, 197, 89, 26, 205, 159, 237, 68, 51, 173, 237, + 68, 26, 205, 159, 197, 89, 51, 173, 197, 89, 61, 3, 122, 173, 237, 68, + 61, 3, 122, 205, 159, 237, 68, 61, 3, 122, 205, 159, 197, 89, 61, 3, 122, + 173, 197, 89, 61, 26, 173, 237, 68, 51, 173, 237, 68, 61, 26, 205, 159, + 237, 68, 51, 205, 159, 237, 68, 61, 26, 205, 159, 197, 89, 51, 205, 159, + 197, 89, 61, 26, 173, 197, 89, 51, 209, 250, 239, 146, 241, 54, 235, 212, + 239, 145, 235, 212, 239, 146, 241, 54, 209, 250, 239, 145, 205, 159, 237, + 68, 61, 241, 54, 173, 237, 68, 51, 173, 237, 68, 61, 241, 54, 205, 159, + 237, 68, 51, 235, 212, 239, 146, 241, 54, 173, 237, 68, 51, 209, 250, + 239, 146, 241, 54, 205, 159, 237, 68, 51, 173, 237, 68, 61, 241, 54, 173, + 197, 89, 51, 173, 197, 89, 61, 241, 54, 173, 237, 68, 51, 197, 123, 61, + 212, 106, 239, 82, 210, 22, 61, 212, 106, 91, 202, 209, 241, 7, 200, 23, + 61, 212, 106, 91, 202, 209, 241, 7, 237, 229, 61, 212, 106, 237, 230, + 202, 209, 241, 7, 222, 173, 61, 212, 106, 237, 230, 202, 209, 241, 7, + 210, 11, 210, 14, 250, 253, 244, 204, 51, 222, 176, 250, 253, 251, 64, + 51, 201, 243, 250, 253, 251, 64, 51, 248, 84, 250, 253, 251, 64, 51, 201, + 243, 250, 253, 244, 204, 61, 3, 219, 14, 201, 243, 250, 253, 251, 64, 61, + 3, 212, 124, 221, 202, 53, 207, 107, 244, 204, 51, 221, 202, 50, 207, + 107, 251, 64, 51, 251, 64, 244, 202, 244, 249, 51, 244, 204, 244, 202, + 244, 249, 51, 91, 61, 90, 206, 182, 107, 51, 107, 61, 90, 206, 182, 91, + 51, 206, 182, 91, 61, 90, 107, 51, 91, 61, 3, 98, 60, 107, 61, 3, 98, 60, + 91, 61, 202, 145, 196, 222, 50, 53, 61, 202, 145, 4, 244, 248, 200, 24, + 200, 215, 61, 234, 234, 4, 244, 248, 50, 165, 124, 53, 165, 135, 232, + 167, 50, 165, 135, 53, 165, 124, 232, 167, 124, 165, 53, 135, 165, 50, + 232, 167, 124, 165, 50, 135, 165, 53, 232, 167, 50, 165, 124, 53, 165, + 124, 232, 167, 124, 165, 53, 135, 165, 53, 232, 167, 50, 165, 135, 53, + 165, 135, 232, 167, 124, 165, 50, 135, 165, 50, 232, 167, 107, 232, 168, + 3, 165, 124, 202, 30, 154, 91, 232, 168, 3, 165, 124, 202, 30, 154, 200, + 24, 232, 168, 3, 165, 53, 202, 30, 154, 237, 230, 232, 168, 3, 165, 53, + 202, 30, 154, 107, 232, 168, 3, 165, 135, 202, 30, 154, 91, 232, 168, 3, + 165, 135, 202, 30, 154, 200, 24, 232, 168, 3, 165, 50, 202, 30, 154, 237, + 230, 232, 168, 3, 165, 50, 202, 30, 154, 107, 232, 168, 3, 165, 124, 234, + 234, 154, 91, 232, 168, 3, 165, 124, 234, 234, 154, 200, 24, 232, 168, 3, + 165, 53, 234, 234, 154, 237, 230, 232, 168, 3, 165, 53, 234, 234, 154, + 107, 232, 168, 3, 165, 135, 234, 234, 154, 91, 232, 168, 3, 165, 135, + 234, 234, 154, 200, 24, 232, 168, 3, 165, 50, 234, 234, 154, 237, 230, + 232, 168, 3, 165, 50, 234, 234, 154, 107, 232, 168, 3, 165, 124, 90, 107, + 232, 168, 3, 165, 237, 234, 200, 24, 232, 168, 3, 165, 50, 248, 209, 200, + 24, 232, 168, 3, 165, 210, 22, 91, 232, 168, 3, 165, 124, 90, 91, 232, + 168, 3, 165, 237, 234, 237, 230, 232, 168, 3, 165, 50, 248, 209, 237, + 230, 232, 168, 3, 165, 210, 22, 107, 232, 168, 3, 165, 124, 90, 91, 232, + 168, 3, 165, 200, 36, 107, 232, 168, 3, 165, 135, 90, 91, 232, 168, 3, + 165, 237, 234, 91, 232, 168, 3, 165, 124, 90, 107, 232, 168, 3, 165, 200, + 36, 91, 232, 168, 3, 165, 135, 90, 107, 232, 168, 3, 165, 237, 234, 107, + 232, 168, 3, 165, 124, 90, 181, 240, 64, 107, 232, 168, 3, 165, 135, 248, + 226, 181, 240, 64, 91, 232, 168, 3, 165, 124, 90, 181, 240, 64, 91, 232, + 168, 3, 165, 135, 248, 226, 181, 240, 64, 200, 24, 232, 168, 3, 165, 50, + 248, 209, 237, 230, 232, 168, 3, 165, 210, 22, 237, 230, 232, 168, 3, + 165, 50, 248, 209, 200, 24, 232, 168, 3, 165, 210, 22, 53, 52, 61, 3, + 209, 185, 232, 136, 236, 171, 2, 90, 91, 51, 202, 85, 214, 82, 90, 91, + 51, 107, 61, 90, 202, 85, 214, 81, 91, 61, 90, 202, 85, 214, 81, 91, 61, + 90, 251, 138, 180, 149, 222, 139, 90, 107, 51, 107, 61, 202, 145, 222, + 138, 233, 93, 90, 91, 51, 204, 142, 90, 91, 51, 107, 61, 202, 145, 204, + 141, 204, 94, 90, 107, 51, 50, 235, 111, 203, 135, 53, 235, 111, 203, + 135, 124, 235, 111, 203, 135, 135, 235, 111, 203, 135, 201, 165, 83, 249, + 79, 239, 217, 195, 159, 216, 16, 205, 105, 195, 159, 216, 16, 200, 201, + 244, 167, 50, 59, 241, 17, 179, 53, 59, 241, 17, 179, 50, 59, 213, 139, + 53, 59, 213, 139, 195, 159, 216, 16, 50, 226, 101, 179, 195, 159, 216, + 16, 53, 226, 101, 179, 195, 159, 216, 16, 50, 248, 161, 179, 195, 159, + 216, 16, 53, 248, 161, 179, 50, 47, 248, 61, 3, 200, 62, 53, 47, 248, 61, + 3, 200, 62, 50, 47, 248, 61, 3, 202, 112, 226, 86, 201, 243, 241, 100, + 53, 47, 248, 61, 3, 202, 112, 226, 86, 248, 84, 241, 100, 50, 47, 248, + 61, 3, 202, 112, 226, 86, 248, 84, 241, 100, 53, 47, 248, 61, 3, 202, + 112, 226, 86, 201, 243, 241, 100, 50, 251, 90, 248, 61, 3, 238, 252, 53, + 251, 90, 248, 61, 3, 238, 252, 50, 250, 253, 222, 139, 179, 53, 250, 253, + 233, 93, 179, 52, 50, 250, 253, 233, 93, 179, 52, 53, 250, 253, 222, 139, + 179, 50, 58, 201, 231, 206, 245, 179, 53, 58, 201, 231, 206, 245, 179, + 237, 249, 235, 168, 83, 195, 24, 222, 74, 219, 200, 251, 90, 214, 84, + 222, 183, 53, 251, 90, 199, 132, 3, 205, 94, 219, 200, 53, 251, 90, 3, + 238, 252, 251, 90, 3, 209, 81, 226, 40, 252, 9, 251, 89, 205, 127, 251, + 90, 214, 84, 222, 183, 205, 127, 251, 90, 214, 84, 200, 36, 163, 251, 89, + 210, 89, 251, 89, 251, 90, 3, 200, 62, 210, 89, 251, 90, 3, 200, 62, 214, + 181, 251, 90, 214, 84, 200, 36, 214, 181, 251, 90, 214, 84, 237, 234, + 219, 200, 251, 90, 3, 192, 250, 231, 236, 217, 226, 86, 61, 212, 106, + 124, 26, 210, 22, 219, 200, 251, 90, 3, 192, 250, 231, 236, 217, 226, 86, + 61, 212, 106, 124, 26, 222, 183, 219, 200, 251, 90, 3, 192, 250, 231, + 236, 217, 226, 86, 61, 212, 106, 135, 26, 210, 22, 219, 200, 251, 90, 3, + 192, 250, 231, 236, 217, 226, 86, 61, 212, 106, 135, 26, 222, 183, 219, + 200, 251, 90, 3, 192, 250, 231, 236, 217, 226, 86, 61, 212, 106, 53, 26, + 200, 36, 219, 200, 251, 90, 3, 192, 250, 231, 236, 217, 226, 86, 61, 212, + 106, 50, 26, 200, 36, 219, 200, 251, 90, 3, 192, 250, 231, 236, 217, 226, + 86, 61, 212, 106, 53, 26, 237, 234, 219, 200, 251, 90, 3, 192, 250, 231, + 236, 217, 226, 86, 61, 212, 106, 50, 26, 237, 234, 210, 89, 236, 231, + 207, 76, 236, 231, 207, 77, 3, 214, 25, 236, 231, 207, 77, 3, 4, 244, + 249, 57, 236, 231, 207, 77, 3, 53, 61, 57, 236, 231, 207, 77, 3, 50, 61, + 57, 244, 249, 3, 231, 154, 154, 46, 83, 154, 46, 213, 144, 46, 210, 90, + 205, 177, 46, 213, 31, 244, 249, 239, 59, 247, 218, 231, 154, 249, 79, + 26, 201, 243, 157, 239, 59, 247, 218, 83, 154, 244, 249, 3, 204, 96, 196, + 222, 46, 251, 62, 239, 53, 55, 124, 61, 202, 145, 244, 248, 46, 59, 248, + 4, 46, 248, 4, 46, 222, 138, 46, 233, 92, 244, 249, 3, 4, 244, 249, 202, + 30, 202, 218, 210, 22, 244, 249, 3, 99, 231, 154, 204, 184, 202, 30, 202, + 218, 210, 22, 103, 209, 250, 239, 146, 205, 248, 103, 235, 212, 239, 146, + 205, 248, 103, 250, 178, 103, 4, 244, 248, 103, 205, 94, 99, 225, 125, + 205, 92, 201, 181, 3, 76, 57, 201, 181, 3, 200, 62, 209, 81, 226, 86, + 201, 180, 201, 181, 3, 207, 84, 250, 168, 248, 83, 53, 201, 181, 90, 50, + 201, 180, 50, 201, 181, 248, 209, 83, 154, 83, 249, 79, 248, 209, 53, + 201, 180, 248, 71, 3, 50, 157, 248, 135, 248, 71, 3, 53, 157, 248, 135, + 58, 248, 70, 24, 3, 50, 157, 248, 135, 24, 3, 53, 157, 248, 135, 59, 231, + 88, 58, 231, 88, 50, 197, 56, 235, 168, 53, 197, 56, 235, 168, 50, 52, + 197, 56, 235, 168, 53, 52, 197, 56, 235, 168, 226, 78, 226, 62, 202, 108, + 127, 226, 62, 226, 63, 217, 105, 3, 83, 154, 237, 243, 218, 121, 47, 3, + 241, 123, 214, 30, 226, 75, 250, 201, 206, 144, 212, 4, 236, 171, 2, 26, + 205, 250, 213, 144, 236, 171, 2, 26, 205, 250, 213, 145, 3, 202, 85, 57, + 230, 192, 202, 30, 26, 205, 250, 213, 144, 233, 154, 205, 6, 202, 206, + 237, 233, 201, 181, 3, 50, 157, 248, 135, 237, 233, 201, 181, 3, 53, 157, + 248, 135, 58, 239, 140, 3, 135, 51, 58, 221, 197, 59, 244, 249, 3, 135, + 51, 58, 244, 249, 3, 135, 51, 236, 153, 59, 205, 94, 236, 153, 58, 205, + 94, 236, 153, 59, 239, 139, 236, 153, 58, 239, 139, 236, 153, 59, 244, + 248, 236, 153, 58, 244, 248, 209, 123, 210, 90, 205, 178, 214, 81, 205, + 178, 3, 214, 25, 210, 90, 205, 178, 3, 231, 154, 106, 248, 170, 205, 177, + 248, 170, 210, 90, 205, 177, 52, 212, 124, 201, 165, 212, 124, 222, 178, + 241, 9, 251, 90, 179, 210, 17, 241, 9, 251, 90, 179, 202, 69, 219, 12, + 218, 53, 46, 76, 214, 81, 218, 53, 46, 98, 214, 81, 218, 53, 46, 24, 214, + 81, 218, 53, 200, 52, 214, 82, 3, 238, 252, 218, 53, 200, 52, 214, 82, 3, + 212, 124, 218, 53, 47, 226, 23, 214, 81, 218, 53, 47, 200, 52, 214, 81, + 99, 221, 248, 26, 214, 81, 99, 221, 248, 214, 72, 214, 81, 218, 53, 24, + 214, 81, 218, 218, 99, 204, 117, 204, 115, 3, 226, 36, 211, 89, 226, 37, + 214, 81, 235, 120, 213, 133, 226, 36, 226, 37, 3, 52, 106, 226, 37, 250, + 129, 3, 205, 248, 244, 241, 234, 213, 251, 64, 226, 34, 222, 75, 226, 35, + 3, 210, 161, 213, 112, 250, 226, 212, 100, 222, 75, 226, 35, 3, 207, 107, + 213, 112, 250, 226, 212, 100, 222, 75, 226, 35, 216, 18, 226, 80, 202, + 218, 212, 100, 226, 37, 250, 226, 39, 212, 110, 214, 81, 211, 83, 226, + 37, 214, 81, 226, 37, 3, 107, 61, 3, 122, 226, 37, 3, 24, 55, 226, 37, 3, + 226, 22, 226, 37, 3, 200, 51, 226, 37, 3, 214, 25, 226, 37, 3, 200, 62, + 225, 126, 222, 227, 50, 201, 181, 214, 81, 195, 159, 216, 16, 208, 169, + 241, 159, 195, 159, 216, 16, 208, 169, 212, 165, 195, 159, 216, 16, 208, + 169, 211, 255, 98, 2, 3, 4, 244, 249, 57, 98, 2, 3, 244, 240, 252, 22, + 57, 98, 2, 3, 202, 85, 57, 98, 2, 3, 76, 60, 98, 2, 3, 202, 85, 60, 98, + 2, 3, 204, 143, 102, 98, 2, 3, 58, 201, 180, 219, 15, 2, 3, 244, 159, 57, + 219, 15, 2, 3, 76, 60, 219, 15, 2, 3, 235, 212, 238, 249, 219, 15, 2, 3, + 209, 250, 238, 249, 98, 2, 226, 86, 50, 157, 244, 248, 98, 2, 226, 86, + 53, 157, 244, 248, 199, 117, 214, 72, 241, 61, 212, 4, 218, 117, 2, 3, + 76, 57, 218, 117, 2, 3, 200, 62, 207, 104, 212, 5, 3, 248, 84, 244, 201, + 205, 222, 212, 4, 218, 117, 2, 226, 86, 50, 157, 244, 248, 218, 117, 2, + 226, 86, 53, 157, 244, 248, 46, 218, 117, 2, 3, 244, 240, 252, 21, 218, + 117, 2, 226, 86, 52, 244, 248, 46, 239, 53, 55, 98, 2, 226, 86, 201, 180, + 219, 15, 2, 226, 86, 201, 180, 218, 117, 2, 226, 86, 201, 180, 226, 31, + 212, 4, 210, 12, 226, 31, 212, 4, 195, 159, 216, 16, 210, 135, 241, 159, + 251, 120, 214, 72, 241, 107, 226, 23, 3, 238, 252, 200, 52, 3, 219, 15, + 55, 200, 52, 3, 214, 25, 226, 23, 3, 214, 25, 226, 23, 3, 221, 248, 251, + 99, 200, 52, 3, 221, 248, 214, 71, 200, 52, 90, 226, 22, 226, 23, 90, + 200, 51, 200, 52, 90, 249, 79, 90, 226, 22, 226, 23, 90, 249, 79, 90, + 200, 51, 200, 52, 248, 209, 26, 225, 125, 3, 200, 51, 226, 23, 248, 209, + 26, 225, 125, 3, 226, 22, 244, 202, 200, 52, 3, 207, 83, 244, 202, 226, + 23, 3, 207, 83, 52, 47, 226, 22, 52, 47, 200, 51, 244, 202, 200, 52, 3, + 207, 84, 26, 205, 222, 212, 4, 221, 248, 26, 3, 76, 57, 221, 248, 214, + 72, 3, 76, 57, 52, 221, 248, 251, 99, 52, 221, 248, 214, 71, 99, 226, 24, + 221, 248, 251, 99, 99, 226, 24, 221, 248, 214, 71, 205, 232, 222, 227, + 214, 71, 205, 232, 222, 227, 251, 99, 221, 248, 214, 72, 214, 21, 221, + 248, 251, 99, 221, 248, 26, 3, 112, 204, 243, 221, 248, 214, 72, 3, 112, + 204, 243, 221, 248, 26, 3, 231, 154, 240, 64, 221, 248, 214, 72, 3, 231, + 154, 240, 64, 221, 248, 26, 3, 52, 214, 25, 221, 248, 26, 3, 200, 62, + 221, 248, 26, 3, 52, 200, 62, 4, 199, 114, 3, 200, 62, 221, 248, 214, 72, + 3, 52, 214, 25, 221, 248, 214, 72, 3, 52, 200, 62, 195, 159, 216, 16, + 239, 6, 251, 54, 195, 159, 216, 16, 210, 204, 251, 54, 236, 171, 2, 3, + 76, 60, 230, 192, 3, 76, 57, 201, 165, 231, 154, 249, 79, 3, 52, 83, 106, + 201, 165, 231, 154, 249, 79, 3, 201, 165, 83, 106, 202, 85, 214, 82, 3, + 76, 57, 202, 85, 214, 82, 3, 209, 250, 238, 249, 206, 71, 219, 15, 206, + 70, 241, 146, 3, 76, 57, 236, 171, 3, 250, 178, 251, 138, 180, 202, 30, + 3, 244, 240, 252, 21, 251, 20, 180, 214, 72, 180, 149, 236, 171, 2, 90, + 98, 55, 98, 2, 90, 236, 171, 55, 236, 171, 2, 90, 202, 85, 214, 81, 52, + 244, 168, 236, 172, 99, 241, 139, 236, 171, 206, 85, 115, 241, 139, 236, + 171, 206, 85, 236, 171, 2, 3, 99, 238, 250, 90, 26, 99, 238, 250, 60, + 236, 164, 3, 235, 6, 238, 250, 57, 222, 139, 3, 244, 249, 226, 40, 233, + 93, 3, 244, 249, 226, 40, 222, 139, 3, 211, 78, 117, 57, 233, 93, 3, 211, + 78, 117, 57, 222, 139, 214, 72, 205, 250, 180, 149, 233, 93, 214, 72, + 205, 250, 180, 149, 222, 139, 214, 72, 205, 250, 180, 202, 30, 3, 76, + 226, 40, 233, 93, 214, 72, 205, 250, 180, 202, 30, 3, 76, 226, 40, 222, + 139, 214, 72, 205, 250, 180, 202, 30, 3, 76, 57, 233, 93, 214, 72, 205, + 250, 180, 202, 30, 3, 76, 57, 222, 139, 214, 72, 205, 250, 180, 202, 30, + 3, 76, 90, 210, 22, 233, 93, 214, 72, 205, 250, 180, 202, 30, 3, 76, 90, + 222, 183, 222, 139, 214, 72, 251, 21, 233, 93, 214, 72, 251, 21, 222, + 139, 26, 206, 60, 216, 18, 180, 149, 233, 93, 26, 206, 60, 216, 18, 180, + 149, 222, 139, 26, 216, 18, 251, 21, 233, 93, 26, 216, 18, 251, 21, 222, + 139, 90, 237, 242, 180, 90, 233, 92, 233, 93, 90, 237, 242, 180, 90, 222, + 138, 222, 139, 90, 206, 71, 214, 72, 236, 172, 233, 93, 90, 206, 71, 214, + 72, 236, 172, 222, 139, 90, 206, 71, 90, 233, 92, 233, 93, 90, 206, 71, + 90, 222, 138, 222, 139, 90, 233, 93, 90, 237, 242, 236, 172, 233, 93, 90, + 222, 139, 90, 237, 242, 236, 172, 222, 139, 90, 205, 250, 180, 90, 233, + 93, 90, 205, 250, 236, 172, 233, 93, 90, 205, 250, 180, 90, 222, 139, 90, + 205, 250, 236, 172, 205, 250, 180, 202, 30, 214, 72, 222, 138, 205, 250, + 180, 202, 30, 214, 72, 233, 92, 205, 250, 180, 202, 30, 214, 72, 222, + 139, 3, 76, 226, 40, 205, 250, 180, 202, 30, 214, 72, 233, 93, 3, 76, + 226, 40, 237, 242, 180, 202, 30, 214, 72, 222, 138, 237, 242, 180, 202, + 30, 214, 72, 233, 92, 237, 242, 205, 250, 180, 202, 30, 214, 72, 222, + 138, 237, 242, 205, 250, 180, 202, 30, 214, 72, 233, 92, 206, 71, 214, + 72, 222, 138, 206, 71, 214, 72, 233, 92, 206, 71, 90, 222, 139, 90, 236, + 171, 55, 206, 71, 90, 233, 93, 90, 236, 171, 55, 52, 217, 89, 222, 138, + 52, 217, 89, 233, 92, 52, 217, 89, 222, 139, 3, 200, 62, 233, 93, 214, + 21, 222, 138, 233, 93, 248, 209, 222, 138, 222, 139, 244, 202, 247, 218, + 241, 10, 233, 93, 244, 202, 247, 218, 241, 10, 222, 139, 244, 202, 247, + 218, 241, 11, 90, 205, 250, 236, 172, 233, 93, 244, 202, 247, 218, 241, + 11, 90, 205, 250, 236, 172, 205, 223, 202, 222, 222, 225, 202, 222, 205, + 223, 202, 223, 214, 72, 180, 149, 222, 225, 202, 223, 214, 72, 180, 149, + 236, 171, 2, 3, 247, 253, 57, 212, 35, 90, 206, 60, 236, 171, 55, 204, + 134, 90, 206, 60, 236, 171, 55, 212, 35, 90, 206, 60, 216, 18, 180, 149, + 204, 134, 90, 206, 60, 216, 18, 180, 149, 212, 35, 90, 236, 171, 55, 204, + 134, 90, 236, 171, 55, 212, 35, 90, 216, 18, 180, 149, 204, 134, 90, 216, + 18, 180, 149, 212, 35, 90, 251, 138, 180, 149, 204, 134, 90, 251, 138, + 180, 149, 212, 35, 90, 216, 18, 251, 138, 180, 149, 204, 134, 90, 216, + 18, 251, 138, 180, 149, 52, 212, 34, 52, 204, 133, 204, 142, 3, 238, 252, + 204, 94, 3, 238, 252, 204, 142, 3, 98, 2, 60, 204, 94, 3, 98, 2, 60, 204, + 142, 3, 218, 117, 2, 60, 204, 94, 3, 218, 117, 2, 60, 204, 142, 77, 214, + 72, 180, 202, 30, 3, 76, 57, 204, 94, 77, 214, 72, 180, 202, 30, 3, 76, + 57, 204, 142, 77, 90, 236, 171, 55, 204, 94, 77, 90, 236, 171, 55, 204, + 142, 77, 90, 202, 85, 214, 81, 204, 94, 77, 90, 202, 85, 214, 81, 204, + 142, 77, 90, 251, 138, 180, 149, 204, 94, 77, 90, 251, 138, 180, 149, + 204, 142, 77, 90, 216, 18, 180, 149, 204, 94, 77, 90, 216, 18, 180, 149, + 47, 50, 192, 111, 214, 81, 47, 53, 192, 111, 214, 81, 244, 202, 204, 141, + 244, 202, 204, 93, 244, 202, 204, 142, 214, 72, 180, 149, 244, 202, 204, + 94, 214, 72, 180, 149, 204, 142, 90, 204, 93, 204, 94, 90, 204, 141, 204, + 142, 90, 204, 141, 204, 94, 90, 204, 93, 204, 94, 248, 209, 204, 141, + 204, 94, 248, 209, 26, 225, 125, 247, 218, 240, 65, 3, 204, 141, 236, + 255, 77, 214, 84, 237, 229, 212, 155, 3, 203, 49, 201, 242, 201, 198, + 226, 22, 235, 24, 216, 33, 206, 182, 50, 203, 147, 206, 182, 135, 203, + 147, 206, 182, 124, 203, 147, 213, 32, 3, 209, 80, 83, 249, 79, 201, 165, + 53, 201, 3, 52, 83, 249, 79, 50, 201, 3, 83, 249, 79, 52, 50, 201, 3, 52, + 83, 249, 79, 52, 50, 201, 3, 181, 240, 65, 234, 234, 50, 219, 168, 77, + 52, 199, 100, 206, 182, 135, 203, 148, 3, 214, 25, 206, 182, 124, 203, + 148, 3, 200, 62, 206, 182, 124, 203, 148, 90, 206, 182, 135, 203, 147, + 52, 135, 203, 147, 52, 124, 203, 147, 52, 204, 196, 216, 18, 55, 210, 89, + 52, 204, 196, 216, 18, 55, 239, 18, 216, 18, 239, 61, 3, 210, 89, 217, + 104, 205, 248, 83, 222, 75, 3, 244, 249, 57, 83, 222, 75, 3, 244, 249, + 60, 135, 203, 148, 3, 244, 249, 60, 213, 145, 3, 231, 154, 106, 213, 145, + 3, 202, 85, 214, 81, 201, 165, 83, 249, 79, 248, 163, 210, 136, 201, 165, + 83, 249, 79, 3, 231, 154, 106, 201, 165, 244, 168, 214, 81, 201, 165, + 217, 89, 222, 138, 201, 165, 217, 89, 233, 92, 237, 242, 205, 250, 222, + 139, 214, 72, 180, 149, 237, 242, 205, 250, 233, 93, 214, 72, 180, 149, + 201, 165, 205, 178, 248, 163, 210, 136, 222, 227, 201, 165, 83, 249, 79, + 214, 81, 52, 205, 178, 214, 81, 59, 83, 154, 218, 53, 59, 83, 154, 173, + 237, 68, 59, 51, 173, 197, 89, 59, 51, 205, 159, 237, 68, 59, 51, 205, + 159, 197, 89, 59, 51, 50, 53, 59, 51, 107, 58, 51, 200, 24, 58, 51, 237, + 230, 58, 51, 173, 237, 68, 58, 51, 173, 197, 89, 58, 51, 205, 159, 237, + 68, 58, 51, 205, 159, 197, 89, 58, 51, 50, 53, 58, 51, 124, 135, 58, 51, + 91, 61, 3, 202, 68, 237, 229, 91, 61, 3, 202, 68, 200, 23, 107, 61, 3, + 202, 68, 237, 229, 107, 61, 3, 202, 68, 200, 23, 47, 3, 201, 243, 157, + 248, 135, 47, 3, 248, 84, 157, 248, 135, 47, 3, 200, 33, 53, 239, 146, + 157, 248, 135, 47, 3, 221, 202, 50, 239, 146, 157, 248, 135, 239, 140, 3, + 50, 157, 248, 135, 239, 140, 3, 53, 157, 248, 135, 239, 140, 3, 201, 243, + 157, 248, 135, 239, 140, 3, 248, 84, 157, 248, 135, 237, 249, 205, 94, + 58, 222, 227, 205, 94, 59, 222, 227, 205, 94, 58, 199, 48, 4, 205, 94, + 59, 199, 48, 4, 205, 94, 58, 213, 54, 59, 213, 54, 59, 232, 84, 58, 232, + 84, 231, 154, 58, 232, 84, 58, 222, 227, 244, 248, 58, 219, 189, 239, + 139, 59, 219, 189, 239, 139, 58, 219, 189, 221, 197, 59, 219, 189, 221, + 197, 58, 4, 239, 139, 58, 4, 221, 197, 59, 4, 221, 197, 58, 231, 154, + 236, 247, 59, 231, 154, 236, 247, 58, 83, 236, 247, 59, 83, 236, 247, 50, + 61, 3, 4, 244, 248, 115, 107, 250, 213, 50, 61, 3, 46, 212, 124, 181, + 107, 205, 87, 51, 107, 200, 215, 61, 3, 83, 106, 107, 200, 215, 61, 3, + 52, 83, 106, 107, 200, 215, 61, 234, 234, 154, 107, 200, 215, 201, 165, + 240, 65, 51, 107, 61, 3, 237, 249, 204, 243, 107, 61, 3, 203, 136, 3, 83, + 106, 107, 61, 3, 203, 136, 3, 52, 83, 106, 107, 200, 215, 61, 3, 203, + 135, 107, 200, 215, 61, 3, 203, 136, 3, 83, 106, 107, 200, 215, 61, 3, + 203, 136, 3, 52, 83, 106, 107, 61, 202, 145, 196, 222, 197, 123, 61, 212, + 106, 239, 82, 222, 183, 236, 171, 2, 90, 107, 51, 210, 90, 202, 85, 214, + 82, 90, 107, 51, 107, 61, 90, 210, 90, 251, 138, 180, 149, 91, 61, 202, + 145, 233, 92, 91, 61, 202, 145, 204, 93, 107, 211, 89, 51, 91, 211, 89, + 51, 210, 90, 202, 85, 214, 82, 90, 91, 51, 91, 61, 90, 210, 90, 251, 138, + 180, 149, 202, 85, 214, 82, 90, 107, 51, 107, 61, 90, 251, 138, 180, 149, + 107, 61, 90, 210, 90, 202, 85, 214, 81, 91, 61, 90, 210, 90, 202, 85, + 214, 81, 237, 230, 201, 179, 195, 24, 51, 206, 182, 205, 250, 173, 51, + 206, 182, 249, 134, 205, 159, 51, 59, 219, 189, 205, 7, 58, 4, 205, 7, + 59, 4, 205, 7, 58, 210, 17, 213, 54, 59, 210, 17, 213, 54, 85, 222, 227, + 244, 248, 85, 214, 27, 3, 214, 27, 226, 40, 85, 244, 249, 3, 244, 249, + 226, 40, 85, 244, 248, 85, 46, 208, 230, 205, 250, 173, 61, 3, 231, 163, + 232, 136, 249, 134, 205, 159, 61, 3, 231, 163, 203, 135, 205, 250, 173, + 61, 3, 231, 154, 203, 135, 249, 134, 205, 159, 61, 3, 231, 154, 203, 135, + 248, 217, 61, 212, 106, 237, 230, 202, 209, 173, 237, 67, 206, 182, 248, + 217, 61, 212, 106, 237, 230, 202, 209, 173, 237, 67, 107, 201, 179, 51, + 200, 24, 201, 179, 51, 91, 201, 179, 51, 237, 230, 201, 179, 51, 50, 53, + 201, 179, 51, 124, 135, 201, 179, 51, 173, 197, 89, 201, 179, 51, 173, + 237, 68, 201, 179, 51, 205, 159, 237, 68, 201, 179, 51, 205, 159, 197, + 89, 201, 179, 51, 107, 201, 179, 240, 63, 51, 200, 24, 201, 179, 240, 63, + 51, 91, 201, 179, 240, 63, 51, 237, 230, 201, 179, 240, 63, 51, 244, 204, + 201, 179, 192, 244, 249, 51, 251, 64, 201, 179, 192, 244, 249, 51, 107, + 201, 179, 61, 202, 30, 154, 200, 24, 201, 179, 61, 202, 30, 154, 91, 201, + 179, 61, 202, 30, 154, 237, 230, 201, 179, 61, 202, 30, 154, 173, 197, + 89, 201, 179, 61, 202, 30, 154, 173, 237, 68, 201, 179, 61, 202, 30, 154, + 205, 159, 237, 68, 201, 179, 61, 202, 30, 154, 205, 159, 197, 89, 201, + 179, 61, 202, 30, 154, 107, 201, 179, 61, 3, 52, 231, 154, 106, 200, 24, + 201, 179, 61, 3, 52, 231, 154, 106, 91, 201, 179, 61, 3, 52, 231, 154, + 106, 237, 230, 201, 179, 61, 3, 52, 231, 154, 106, 231, 154, 203, 155, + 224, 152, 83, 203, 155, 224, 152, 107, 201, 179, 61, 127, 91, 201, 179, + 51, 200, 24, 201, 179, 61, 107, 77, 237, 230, 201, 179, 51, 91, 201, 179, + 61, 127, 107, 201, 179, 51, 237, 230, 201, 179, 61, 107, 77, 200, 24, + 201, 179, 51, 107, 201, 179, 213, 218, 250, 213, 200, 24, 201, 179, 213, + 218, 250, 213, 91, 201, 179, 213, 218, 250, 213, 237, 230, 201, 179, 213, + 218, 250, 213, 107, 58, 46, 59, 51, 200, 24, 58, 46, 59, 51, 91, 58, 46, + 59, 51, 237, 230, 58, 46, 59, 51, 251, 64, 201, 179, 53, 200, 167, 51, + 251, 64, 201, 179, 248, 84, 200, 167, 51, 251, 64, 201, 179, 50, 200, + 167, 51, 251, 64, 201, 179, 201, 243, 200, 167, 51, 210, 94, 222, 183, + 210, 94, 210, 22, 217, 79, 222, 183, 217, 79, 210, 22, 235, 6, 241, 101, + 250, 214, 244, 244, 251, 63, 91, 58, 51, 202, 154, 201, 241, 107, 236, + 165, 250, 216, 202, 154, 210, 18, 200, 24, 236, 165, 250, 216, 202, 154, + 201, 241, 91, 236, 165, 250, 216, 202, 154, 222, 179, 237, 230, 236, 165, + 250, 216, 58, 107, 236, 165, 250, 216, 58, 200, 24, 236, 165, 250, 216, + 58, 91, 236, 165, 250, 216, 58, 237, 230, 236, 165, 250, 216, 237, 230, + 201, 179, 61, 3, 181, 202, 68, 222, 173, 237, 230, 201, 179, 61, 3, 181, + 202, 68, 210, 11, 200, 24, 201, 179, 61, 3, 181, 202, 68, 222, 173, 200, + 24, 201, 179, 61, 3, 181, 202, 68, 210, 11, 107, 201, 179, 61, 3, 181, + 202, 68, 200, 23, 91, 201, 179, 61, 3, 181, 202, 68, 200, 23, 107, 201, + 179, 61, 3, 181, 202, 68, 237, 229, 91, 201, 179, 61, 3, 181, 202, 68, + 237, 229, 58, 241, 9, 237, 230, 26, 107, 51, 58, 241, 9, 237, 230, 26, + 91, 51, 58, 241, 9, 200, 24, 26, 107, 51, 58, 241, 9, 200, 24, 26, 91, + 51, 58, 241, 9, 107, 26, 200, 24, 51, 58, 241, 9, 91, 26, 200, 24, 51, + 58, 241, 9, 107, 26, 237, 230, 51, 58, 241, 9, 91, 26, 237, 230, 51, 210, + 63, 61, 135, 222, 183, 210, 63, 61, 135, 210, 22, 210, 63, 61, 124, 222, + 183, 210, 63, 61, 124, 210, 22, 210, 63, 61, 50, 200, 36, 210, 63, 61, + 53, 200, 36, 210, 63, 61, 50, 237, 234, 210, 63, 61, 53, 237, 234, 200, + 24, 59, 61, 234, 234, 249, 79, 3, 231, 154, 154, 124, 250, 217, 226, 86, + 39, 210, 163, 248, 69, 214, 21, 59, 205, 92, 214, 21, 59, 26, 58, 205, + 92, 214, 21, 58, 205, 92, 249, 98, 111, 3, 175, 196, 222, 46, 196, 222, + 46, 27, 196, 222, 58, 47, 247, 33, 58, 239, 140, 247, 33, 163, 58, 213, + 54, 231, 154, 58, 214, 172, 58, 214, 172, 58, 219, 189, 200, 35, 201, + 181, 247, 33, 58, 219, 189, 237, 233, 201, 181, 247, 33, 58, 219, 189, + 222, 178, 201, 181, 247, 33, 58, 219, 189, 210, 17, 201, 181, 247, 33, + 217, 94, 235, 23, 102, 201, 243, 157, 58, 244, 248, 248, 84, 157, 58, + 244, 248, 175, 235, 6, 212, 108, 58, 241, 5, 209, 194, 175, 235, 6, 212, + 108, 58, 241, 5, 59, 235, 6, 212, 108, 241, 5, 209, 194, 59, 235, 6, 212, + 108, 241, 5, 47, 212, 78, 226, 67, 200, 66, 55, 233, 83, 78, 212, 121, + 235, 23, 102, 212, 121, 235, 23, 134, 212, 121, 235, 23, 136, 212, 121, + 235, 23, 146, 201, 200, 211, 245, 250, 174, 231, 9, 212, 230, 217, 90, + 59, 218, 189, 207, 113, 58, 239, 140, 214, 119, 241, 60, 201, 143, 175, + 218, 189, 250, 209, 241, 24, 232, 242, 195, 77, 223, 203, 251, 33, 251, + 251, 197, 218, 212, 79, 50, 157, 58, 205, 7, 53, 157, 58, 205, 7, 205, 8, + 3, 50, 157, 248, 135, 205, 8, 3, 53, 157, 248, 135, 107, 200, 215, 61, 3, + 201, 181, 250, 215, 200, 24, 200, 215, 61, 3, 201, 181, 250, 215, 91, + 200, 215, 61, 3, 201, 181, 250, 215, 237, 230, 200, 215, 61, 3, 201, 181, + 250, 215, 236, 155, 235, 23, 100, 236, 155, 235, 23, 102, 208, 130, 209, + 103, 250, 173, 16, 199, 19, 209, 103, 250, 173, 16, 216, 4, 209, 103, + 250, 173, 16, 211, 66, 209, 103, 250, 173, 16, 248, 158, 209, 103, 250, + 173, 16, 207, 96, 209, 103, 250, 173, 16, 201, 192, 236, 171, 2, 3, 226, + 63, 60, 200, 48, 105, 207, 92, 105, 237, 239, 105, 213, 122, 105, 210, + 89, 53, 251, 89, 232, 105, 213, 106, 105, 125, 6, 1, 250, 112, 125, 6, 1, + 248, 8, 125, 6, 1, 199, 116, 125, 6, 1, 233, 158, 125, 6, 1, 239, 22, + 125, 6, 1, 196, 38, 125, 6, 1, 195, 58, 125, 6, 1, 237, 150, 125, 6, 1, + 195, 84, 125, 6, 1, 225, 220, 125, 6, 1, 84, 225, 220, 125, 6, 1, 68, + 125, 6, 1, 239, 43, 125, 6, 1, 225, 22, 125, 6, 1, 222, 38, 125, 6, 1, + 218, 58, 125, 6, 1, 217, 205, 125, 6, 1, 214, 103, 125, 6, 1, 212, 103, + 125, 6, 1, 209, 249, 125, 6, 1, 205, 229, 125, 6, 1, 200, 246, 125, 6, 1, + 200, 83, 125, 6, 1, 234, 237, 125, 6, 1, 232, 90, 125, 6, 1, 214, 39, + 125, 6, 1, 213, 91, 125, 6, 1, 206, 154, 125, 6, 1, 201, 92, 125, 6, 1, + 245, 35, 125, 6, 1, 207, 50, 125, 6, 1, 196, 47, 125, 6, 1, 196, 49, 125, + 6, 1, 196, 82, 125, 6, 1, 205, 123, 142, 125, 6, 1, 195, 217, 125, 6, 1, + 4, 195, 182, 125, 6, 1, 4, 195, 183, 3, 203, 135, 125, 6, 1, 196, 3, 125, + 6, 1, 226, 5, 4, 195, 182, 125, 6, 1, 248, 170, 195, 182, 125, 6, 1, 226, + 5, 248, 170, 195, 182, 125, 6, 1, 235, 102, 125, 6, 1, 225, 218, 125, 6, + 1, 206, 153, 125, 6, 1, 201, 155, 63, 125, 6, 1, 222, 215, 218, 58, 125, + 4, 1, 250, 112, 125, 4, 1, 248, 8, 125, 4, 1, 199, 116, 125, 4, 1, 233, + 158, 125, 4, 1, 239, 22, 125, 4, 1, 196, 38, 125, 4, 1, 195, 58, 125, 4, + 1, 237, 150, 125, 4, 1, 195, 84, 125, 4, 1, 225, 220, 125, 4, 1, 84, 225, + 220, 125, 4, 1, 68, 125, 4, 1, 239, 43, 125, 4, 1, 225, 22, 125, 4, 1, + 222, 38, 125, 4, 1, 218, 58, 125, 4, 1, 217, 205, 125, 4, 1, 214, 103, + 125, 4, 1, 212, 103, 125, 4, 1, 209, 249, 125, 4, 1, 205, 229, 125, 4, 1, + 200, 246, 125, 4, 1, 200, 83, 125, 4, 1, 234, 237, 125, 4, 1, 232, 90, + 125, 4, 1, 214, 39, 125, 4, 1, 213, 91, 125, 4, 1, 206, 154, 125, 4, 1, + 201, 92, 125, 4, 1, 245, 35, 125, 4, 1, 207, 50, 125, 4, 1, 196, 47, 125, + 4, 1, 196, 49, 125, 4, 1, 196, 82, 125, 4, 1, 205, 123, 142, 125, 4, 1, + 195, 217, 125, 4, 1, 4, 195, 182, 125, 4, 1, 4, 195, 183, 3, 203, 135, + 125, 4, 1, 196, 3, 125, 4, 1, 226, 5, 4, 195, 182, 125, 4, 1, 248, 170, + 195, 182, 125, 4, 1, 226, 5, 248, 170, 195, 182, 125, 4, 1, 235, 102, + 125, 4, 1, 225, 218, 125, 4, 1, 206, 153, 125, 4, 1, 201, 155, 63, 125, + 4, 1, 222, 215, 218, 58, 8, 6, 1, 223, 99, 3, 52, 154, 8, 4, 1, 223, 99, + 3, 52, 154, 8, 6, 1, 223, 99, 3, 112, 202, 84, 8, 6, 1, 214, 3, 3, 106, + 8, 6, 1, 211, 31, 3, 203, 135, 8, 4, 1, 39, 3, 106, 8, 4, 1, 203, 217, 3, + 239, 146, 106, 8, 6, 1, 233, 15, 3, 239, 194, 8, 4, 1, 233, 15, 3, 239, + 194, 8, 6, 1, 225, 80, 3, 239, 194, 8, 4, 1, 225, 80, 3, 239, 194, 8, 6, + 1, 195, 159, 3, 239, 194, 8, 4, 1, 195, 159, 3, 239, 194, 8, 6, 1, 251, + 133, 8, 6, 1, 221, 136, 3, 122, 8, 6, 1, 163, 63, 8, 6, 1, 163, 251, 133, + 8, 4, 1, 199, 231, 3, 53, 122, 8, 6, 1, 197, 200, 3, 122, 8, 4, 1, 197, + 200, 3, 122, 8, 4, 1, 199, 231, 3, 241, 20, 8, 6, 1, 157, 233, 14, 8, 4, + 1, 157, 233, 14, 8, 4, 1, 203, 133, 212, 245, 8, 4, 1, 237, 135, 3, 216, + 15, 8, 4, 1, 163, 211, 31, 3, 203, 135, 8, 4, 1, 177, 3, 126, 210, 3, + 226, 40, 8, 1, 4, 6, 163, 69, 8, 204, 143, 4, 1, 225, 216, 73, 1, 6, 199, + 230, 8, 6, 1, 209, 81, 3, 204, 63, 203, 135, 8, 6, 1, 195, 159, 3, 204, + 63, 203, 135, 88, 6, 1, 251, 157, 88, 4, 1, 251, 157, 88, 6, 1, 199, 31, + 88, 4, 1, 199, 31, 88, 6, 1, 234, 93, 88, 4, 1, 234, 93, 88, 6, 1, 240, + 102, 88, 4, 1, 240, 102, 88, 6, 1, 237, 31, 88, 4, 1, 237, 31, 88, 6, 1, + 205, 164, 88, 4, 1, 205, 164, 88, 6, 1, 195, 96, 88, 4, 1, 195, 96, 88, + 6, 1, 232, 161, 88, 4, 1, 232, 161, 88, 6, 1, 202, 197, 88, 4, 1, 202, + 197, 88, 6, 1, 230, 206, 88, 4, 1, 230, 206, 88, 6, 1, 225, 6, 88, 4, 1, + 225, 6, 88, 6, 1, 222, 210, 88, 4, 1, 222, 210, 88, 6, 1, 219, 77, 88, 4, + 1, 219, 77, 88, 6, 1, 216, 222, 88, 4, 1, 216, 222, 88, 6, 1, 223, 202, + 88, 4, 1, 223, 202, 88, 6, 1, 72, 88, 4, 1, 72, 88, 6, 1, 212, 219, 88, + 4, 1, 212, 219, 88, 6, 1, 209, 232, 88, 4, 1, 209, 232, 88, 6, 1, 206, + 74, 88, 4, 1, 206, 74, 88, 6, 1, 203, 89, 88, 4, 1, 203, 89, 88, 6, 1, + 200, 114, 88, 4, 1, 200, 114, 88, 6, 1, 235, 152, 88, 4, 1, 235, 152, 88, + 6, 1, 224, 123, 88, 4, 1, 224, 123, 88, 6, 1, 211, 237, 88, 4, 1, 211, + 237, 88, 6, 1, 214, 95, 88, 4, 1, 214, 95, 88, 6, 1, 239, 144, 251, 163, + 88, 4, 1, 239, 144, 251, 163, 88, 6, 1, 37, 88, 251, 193, 88, 4, 1, 37, + 88, 251, 193, 88, 6, 1, 241, 43, 237, 31, 88, 4, 1, 241, 43, 237, 31, 88, + 6, 1, 239, 144, 225, 6, 88, 4, 1, 239, 144, 225, 6, 88, 6, 1, 239, 144, + 216, 222, 88, 4, 1, 239, 144, 216, 222, 88, 6, 1, 241, 43, 216, 222, 88, + 4, 1, 241, 43, 216, 222, 88, 6, 1, 37, 88, 214, 95, 88, 4, 1, 37, 88, + 214, 95, 88, 6, 1, 208, 222, 88, 4, 1, 208, 222, 88, 6, 1, 241, 58, 206, + 247, 88, 4, 1, 241, 58, 206, 247, 88, 6, 1, 37, 88, 206, 247, 88, 4, 1, + 37, 88, 206, 247, 88, 6, 1, 37, 88, 236, 140, 88, 4, 1, 37, 88, 236, 140, + 88, 6, 1, 251, 176, 224, 128, 88, 4, 1, 251, 176, 224, 128, 88, 6, 1, + 239, 144, 231, 155, 88, 4, 1, 239, 144, 231, 155, 88, 6, 1, 37, 88, 231, + 155, 88, 4, 1, 37, 88, 231, 155, 88, 6, 1, 37, 88, 142, 88, 4, 1, 37, 88, + 142, 88, 6, 1, 223, 98, 142, 88, 4, 1, 223, 98, 142, 88, 6, 1, 37, 88, + 232, 111, 88, 4, 1, 37, 88, 232, 111, 88, 6, 1, 37, 88, 232, 164, 88, 4, + 1, 37, 88, 232, 164, 88, 6, 1, 37, 88, 234, 88, 88, 4, 1, 37, 88, 234, + 88, 88, 6, 1, 37, 88, 239, 46, 88, 4, 1, 37, 88, 239, 46, 88, 6, 1, 37, + 88, 206, 213, 88, 4, 1, 37, 88, 206, 213, 88, 6, 1, 37, 215, 152, 206, + 213, 88, 4, 1, 37, 215, 152, 206, 213, 88, 6, 1, 37, 215, 152, 217, 18, + 88, 4, 1, 37, 215, 152, 217, 18, 88, 6, 1, 37, 215, 152, 215, 88, 88, 4, + 1, 37, 215, 152, 215, 88, 88, 6, 1, 37, 215, 152, 197, 124, 88, 4, 1, 37, + 215, 152, 197, 124, 88, 16, 225, 30, 88, 16, 219, 78, 209, 232, 88, 16, + 212, 220, 209, 232, 88, 16, 204, 252, 88, 16, 203, 90, 209, 232, 88, 16, + 224, 124, 209, 232, 88, 16, 206, 214, 206, 74, 88, 6, 1, 241, 43, 206, + 247, 88, 4, 1, 241, 43, 206, 247, 88, 6, 1, 241, 43, 234, 88, 88, 4, 1, + 241, 43, 234, 88, 88, 38, 216, 223, 57, 88, 38, 205, 116, 250, 186, 88, + 38, 205, 116, 222, 147, 88, 6, 1, 248, 108, 224, 128, 88, 4, 1, 248, 108, + 224, 128, 88, 37, 215, 152, 234, 216, 204, 226, 88, 37, 215, 152, 239, + 85, 211, 78, 78, 88, 37, 215, 152, 226, 65, 211, 78, 78, 88, 37, 215, + 152, 199, 102, 239, 58, 88, 191, 97, 232, 224, 88, 234, 216, 204, 226, + 88, 218, 184, 239, 58, 94, 4, 1, 251, 105, 94, 4, 1, 249, 92, 94, 4, 1, + 234, 92, 94, 4, 1, 239, 5, 94, 4, 1, 236, 229, 94, 4, 1, 199, 16, 94, 4, + 1, 195, 82, 94, 4, 1, 203, 114, 94, 4, 1, 226, 85, 94, 4, 1, 225, 16, 94, + 4, 1, 222, 221, 94, 4, 1, 220, 61, 94, 4, 1, 217, 210, 94, 4, 1, 214, + 118, 94, 4, 1, 213, 156, 94, 4, 1, 195, 70, 94, 4, 1, 210, 228, 94, 4, 1, + 208, 219, 94, 4, 1, 203, 101, 94, 4, 1, 200, 72, 94, 4, 1, 212, 253, 94, + 4, 1, 224, 133, 94, 4, 1, 233, 220, 94, 4, 1, 211, 143, 94, 4, 1, 206, + 211, 94, 4, 1, 245, 61, 94, 4, 1, 247, 141, 94, 4, 1, 225, 161, 94, 4, 1, + 244, 255, 94, 4, 1, 246, 255, 94, 4, 1, 196, 206, 94, 4, 1, 225, 176, 94, + 4, 1, 232, 241, 94, 4, 1, 232, 146, 94, 4, 1, 232, 57, 94, 4, 1, 197, + 109, 94, 4, 1, 232, 174, 94, 4, 1, 231, 180, 94, 4, 1, 196, 5, 94, 4, 1, + 251, 233, 202, 104, 1, 164, 202, 104, 1, 196, 125, 202, 104, 1, 196, 124, + 202, 104, 1, 196, 114, 202, 104, 1, 196, 112, 202, 104, 1, 248, 211, 252, + 23, 196, 107, 202, 104, 1, 196, 107, 202, 104, 1, 196, 122, 202, 104, 1, + 196, 119, 202, 104, 1, 196, 121, 202, 104, 1, 196, 120, 202, 104, 1, 196, + 29, 202, 104, 1, 196, 116, 202, 104, 1, 196, 105, 202, 104, 1, 201, 32, + 196, 105, 202, 104, 1, 196, 102, 202, 104, 1, 196, 110, 202, 104, 1, 248, + 211, 252, 23, 196, 110, 202, 104, 1, 201, 32, 196, 110, 202, 104, 1, 196, + 109, 202, 104, 1, 196, 129, 202, 104, 1, 196, 103, 202, 104, 1, 201, 32, + 196, 103, 202, 104, 1, 196, 92, 202, 104, 1, 201, 32, 196, 92, 202, 104, + 1, 196, 24, 202, 104, 1, 196, 71, 202, 104, 1, 251, 206, 196, 71, 202, + 104, 1, 201, 32, 196, 71, 202, 104, 1, 196, 101, 202, 104, 1, 196, 100, + 202, 104, 1, 196, 97, 202, 104, 1, 201, 32, 196, 111, 202, 104, 1, 201, + 32, 196, 95, 202, 104, 1, 196, 93, 202, 104, 1, 195, 217, 202, 104, 1, + 196, 90, 202, 104, 1, 196, 88, 202, 104, 1, 196, 113, 202, 104, 1, 201, + 32, 196, 113, 202, 104, 1, 250, 117, 196, 113, 202, 104, 1, 196, 87, 202, + 104, 1, 196, 85, 202, 104, 1, 196, 86, 202, 104, 1, 196, 84, 202, 104, 1, + 196, 83, 202, 104, 1, 196, 123, 202, 104, 1, 196, 81, 202, 104, 1, 196, + 79, 202, 104, 1, 196, 78, 202, 104, 1, 196, 75, 202, 104, 1, 196, 72, + 202, 104, 1, 203, 80, 196, 72, 202, 104, 1, 196, 70, 202, 104, 1, 196, + 69, 202, 104, 1, 196, 3, 202, 104, 73, 1, 223, 71, 78, 202, 104, 207, 91, + 78, 202, 104, 108, 225, 123, 35, 5, 222, 5, 35, 5, 218, 243, 35, 5, 209, + 224, 35, 5, 205, 192, 35, 5, 206, 197, 35, 5, 248, 114, 35, 5, 202, 22, + 35, 5, 244, 180, 35, 5, 216, 42, 35, 5, 215, 71, 35, 5, 233, 151, 214, + 189, 35, 5, 195, 10, 35, 5, 239, 25, 35, 5, 240, 9, 35, 5, 225, 127, 35, + 5, 202, 168, 35, 5, 245, 47, 35, 5, 212, 232, 35, 5, 212, 115, 35, 5, + 233, 235, 35, 5, 233, 231, 35, 5, 233, 232, 35, 5, 233, 233, 35, 5, 205, + 80, 35, 5, 205, 34, 35, 5, 205, 47, 35, 5, 205, 79, 35, 5, 205, 52, 35, + 5, 205, 53, 35, 5, 205, 39, 35, 5, 247, 79, 35, 5, 247, 58, 35, 5, 247, + 60, 35, 5, 247, 78, 35, 5, 247, 76, 35, 5, 247, 77, 35, 5, 247, 59, 35, + 5, 194, 228, 35, 5, 194, 206, 35, 5, 194, 219, 35, 5, 194, 227, 35, 5, + 194, 222, 35, 5, 194, 223, 35, 5, 194, 211, 35, 5, 247, 74, 35, 5, 247, + 61, 35, 5, 247, 63, 35, 5, 247, 73, 35, 5, 247, 71, 35, 5, 247, 72, 35, + 5, 247, 62, 35, 5, 211, 43, 35, 5, 211, 33, 35, 5, 211, 39, 35, 5, 211, + 42, 35, 5, 211, 40, 35, 5, 211, 41, 35, 5, 211, 38, 35, 5, 223, 109, 35, + 5, 223, 101, 35, 5, 223, 104, 35, 5, 223, 108, 35, 5, 223, 105, 35, 5, + 223, 106, 35, 5, 223, 102, 35, 5, 196, 164, 35, 5, 196, 151, 35, 5, 196, + 159, 35, 5, 196, 163, 35, 5, 196, 161, 35, 5, 196, 162, 35, 5, 196, 158, + 35, 5, 233, 26, 35, 5, 233, 16, 35, 5, 233, 19, 35, 5, 233, 25, 35, 5, + 233, 21, 35, 5, 233, 22, 35, 5, 233, 18, 38, 40, 1, 249, 8, 38, 40, 1, + 199, 118, 38, 40, 1, 233, 215, 38, 40, 1, 239, 251, 38, 40, 1, 195, 65, + 38, 40, 1, 195, 88, 38, 40, 1, 155, 38, 40, 1, 237, 6, 38, 40, 1, 236, + 240, 38, 40, 1, 236, 229, 38, 40, 1, 72, 38, 40, 1, 213, 91, 38, 40, 1, + 236, 162, 38, 40, 1, 236, 150, 38, 40, 1, 203, 68, 38, 40, 1, 142, 38, + 40, 1, 201, 107, 38, 40, 1, 245, 102, 38, 40, 1, 207, 50, 38, 40, 1, 207, + 2, 38, 40, 1, 235, 102, 38, 40, 1, 236, 146, 38, 40, 1, 63, 38, 40, 1, + 226, 146, 38, 40, 1, 239, 44, 38, 40, 1, 218, 202, 200, 87, 38, 40, 1, + 196, 84, 38, 40, 1, 195, 217, 38, 40, 1, 226, 4, 63, 38, 40, 1, 222, 46, + 195, 182, 38, 40, 1, 248, 170, 195, 182, 38, 40, 1, 226, 4, 248, 170, + 195, 182, 53, 251, 90, 204, 138, 220, 23, 53, 251, 90, 237, 249, 204, + 138, 220, 23, 50, 204, 138, 179, 53, 204, 138, 179, 50, 237, 249, 204, + 138, 179, 53, 237, 249, 204, 138, 179, 210, 214, 226, 27, 220, 23, 210, + 214, 237, 249, 226, 27, 220, 23, 237, 249, 201, 199, 220, 23, 50, 201, + 199, 179, 53, 201, 199, 179, 210, 214, 205, 94, 50, 210, 214, 214, 120, + 179, 53, 210, 214, 214, 120, 179, 237, 54, 241, 97, 213, 151, 235, 25, + 213, 151, 210, 89, 235, 25, 213, 151, 231, 3, 237, 249, 214, 184, 237, + 230, 251, 100, 200, 24, 251, 100, 237, 249, 210, 17, 251, 89, 52, 214, + 181, 231, 6, 226, 16, 226, 25, 213, 206, 248, 56, 231, 7, 3, 239, 149, + 202, 85, 3, 210, 3, 57, 50, 126, 213, 142, 179, 53, 126, 213, 142, 179, + 202, 85, 3, 76, 57, 202, 85, 3, 76, 60, 50, 83, 249, 79, 3, 211, 72, 53, + 83, 249, 79, 3, 211, 72, 201, 243, 50, 157, 179, 201, 243, 53, 157, 179, + 248, 84, 50, 157, 179, 248, 84, 53, 157, 179, 50, 206, 96, 118, 179, 53, + 206, 96, 118, 179, 50, 52, 213, 139, 53, 52, 213, 139, 99, 238, 250, 127, + 97, 76, 211, 212, 97, 76, 127, 99, 238, 250, 211, 212, 103, 235, 6, 76, + 211, 212, 235, 100, 76, 78, 210, 89, 211, 78, 78, 83, 202, 84, 210, 3, + 212, 109, 197, 9, 207, 91, 112, 238, 252, 163, 244, 158, 210, 214, 238, + 252, 210, 214, 244, 158, 163, 207, 105, 240, 118, 3, 50, 233, 69, 240, + 118, 3, 53, 233, 69, 163, 240, 117, 201, 243, 157, 208, 133, 55, 200, + 216, 240, 64, 202, 152, 240, 64, 204, 242, 234, 216, 204, 226, 83, 206, + 29, 238, 249, 197, 56, 83, 222, 74, 247, 122, 52, 231, 6, 210, 89, 244, + 158, 52, 221, 203, 211, 61, 78, 240, 65, 3, 50, 200, 27, 52, 204, 77, 78, + 226, 16, 126, 224, 220, 226, 16, 126, 224, 221, 3, 224, 221, 57, 126, + 224, 220, 126, 224, 221, 3, 238, 252, 52, 205, 19, 244, 158, 237, 249, + 205, 177, 201, 165, 240, 117, 219, 190, 244, 158, 213, 150, 78, 211, 211, + 236, 253, 78, 241, 98, 199, 102, 239, 58, 12, 44, 210, 119, 12, 44, 244, + 213, 12, 44, 208, 136, 100, 12, 44, 208, 136, 102, 12, 44, 208, 136, 134, + 12, 44, 213, 27, 12, 44, 248, 69, 12, 44, 203, 152, 12, 44, 224, 21, 100, + 12, 44, 224, 21, 102, 12, 44, 239, 55, 12, 44, 208, 140, 12, 44, 4, 100, + 12, 44, 4, 102, 12, 44, 222, 243, 100, 12, 44, 222, 243, 102, 12, 44, + 222, 243, 134, 12, 44, 222, 243, 136, 12, 44, 205, 212, 12, 44, 202, 156, + 12, 44, 205, 209, 100, 12, 44, 205, 209, 102, 12, 44, 232, 126, 100, 12, + 44, 232, 126, 102, 12, 44, 232, 208, 12, 44, 210, 203, 12, 44, 245, 44, + 12, 44, 204, 111, 12, 44, 218, 188, 12, 44, 239, 248, 12, 44, 218, 177, + 12, 44, 244, 231, 12, 44, 197, 128, 100, 12, 44, 197, 128, 102, 12, 44, + 235, 117, 12, 44, 213, 104, 100, 12, 44, 213, 104, 102, 12, 44, 206, 69, + 157, 201, 191, 201, 118, 12, 44, 241, 82, 12, 44, 239, 16, 12, 44, 225, + 208, 12, 44, 248, 107, 77, 244, 196, 12, 44, 236, 66, 12, 44, 205, 118, + 100, 12, 44, 205, 118, 102, 12, 44, 249, 94, 12, 44, 206, 76, 12, 44, + 247, 203, 206, 76, 12, 44, 217, 88, 100, 12, 44, 217, 88, 102, 12, 44, + 217, 88, 134, 12, 44, 217, 88, 136, 12, 44, 219, 149, 12, 44, 206, 249, + 12, 44, 210, 209, 12, 44, 236, 96, 12, 44, 214, 132, 12, 44, 248, 28, + 100, 12, 44, 248, 28, 102, 12, 44, 219, 198, 12, 44, 218, 183, 12, 44, + 233, 103, 100, 12, 44, 233, 103, 102, 12, 44, 233, 103, 134, 12, 44, 202, + 102, 12, 44, 244, 195, 12, 44, 197, 89, 100, 12, 44, 197, 89, 102, 12, + 44, 247, 203, 208, 129, 12, 44, 206, 69, 231, 101, 12, 44, 231, 101, 12, + 44, 247, 203, 205, 131, 12, 44, 247, 203, 206, 244, 12, 44, 235, 36, 12, + 44, 247, 203, 247, 98, 12, 44, 206, 69, 197, 150, 12, 44, 197, 151, 100, + 12, 44, 197, 151, 102, 12, 44, 244, 234, 12, 44, 247, 203, 233, 134, 12, + 44, 181, 100, 12, 44, 181, 102, 12, 44, 247, 203, 221, 239, 12, 44, 247, + 203, 234, 73, 12, 44, 218, 172, 100, 12, 44, 218, 172, 102, 12, 44, 210, + 216, 12, 44, 248, 117, 12, 44, 247, 203, 203, 107, 222, 189, 12, 44, 247, + 203, 222, 191, 12, 44, 247, 203, 197, 50, 12, 44, 247, 203, 235, 54, 12, + 44, 237, 65, 100, 12, 44, 237, 65, 102, 12, 44, 237, 65, 134, 12, 44, + 247, 203, 237, 64, 12, 44, 232, 136, 12, 44, 247, 203, 231, 97, 12, 44, + 248, 103, 12, 44, 233, 199, 12, 44, 247, 203, 235, 110, 12, 44, 247, 203, + 248, 155, 12, 44, 247, 203, 208, 233, 12, 44, 206, 69, 197, 79, 12, 44, + 206, 69, 196, 61, 12, 44, 247, 203, 234, 235, 12, 44, 225, 215, 236, 101, + 12, 44, 247, 203, 236, 101, 12, 44, 225, 215, 201, 244, 12, 44, 247, 203, + 201, 244, 12, 44, 225, 215, 237, 222, 12, 44, 247, 203, 237, 222, 12, 44, + 201, 1, 12, 44, 225, 215, 201, 1, 12, 44, 247, 203, 201, 1, 79, 44, 100, + 79, 44, 222, 74, 79, 44, 238, 252, 79, 44, 205, 248, 79, 44, 208, 135, + 79, 44, 122, 79, 44, 102, 79, 44, 222, 103, 79, 44, 220, 61, 79, 44, 222, + 168, 79, 44, 236, 203, 79, 44, 171, 79, 44, 135, 248, 69, 79, 44, 241, + 85, 79, 44, 230, 200, 79, 44, 203, 152, 79, 44, 192, 248, 69, 79, 44, + 224, 20, 79, 44, 212, 57, 79, 44, 196, 255, 79, 44, 205, 107, 79, 44, 53, + 192, 248, 69, 79, 44, 232, 58, 236, 224, 79, 44, 203, 23, 79, 44, 239, + 55, 79, 44, 208, 140, 79, 44, 244, 213, 79, 44, 212, 7, 79, 44, 251, 215, + 79, 44, 218, 163, 79, 44, 236, 224, 79, 44, 237, 71, 79, 44, 208, 168, + 79, 44, 233, 143, 79, 44, 233, 144, 205, 226, 79, 44, 236, 100, 79, 44, + 248, 169, 79, 44, 197, 21, 79, 44, 245, 65, 79, 44, 209, 205, 79, 44, + 226, 81, 79, 44, 205, 224, 79, 44, 222, 242, 79, 44, 241, 95, 79, 44, + 205, 98, 79, 44, 218, 168, 79, 44, 209, 246, 79, 44, 197, 6, 79, 44, 214, + 109, 79, 44, 201, 9, 79, 44, 237, 202, 79, 44, 206, 182, 202, 156, 79, + 44, 237, 249, 244, 213, 79, 44, 181, 204, 202, 79, 44, 99, 232, 183, 79, + 44, 206, 188, 79, 44, 248, 76, 79, 44, 205, 208, 79, 44, 248, 35, 79, 44, + 204, 241, 79, 44, 232, 125, 79, 44, 232, 225, 79, 44, 239, 0, 79, 44, + 232, 208, 79, 44, 248, 56, 79, 44, 210, 203, 79, 44, 208, 153, 79, 44, + 239, 87, 79, 44, 250, 122, 79, 44, 205, 94, 79, 44, 216, 17, 79, 44, 204, + 111, 79, 44, 208, 180, 79, 44, 218, 188, 79, 44, 201, 190, 79, 44, 223, + 67, 79, 44, 204, 226, 79, 44, 239, 248, 79, 44, 197, 104, 79, 44, 239, + 28, 216, 17, 79, 44, 244, 154, 79, 44, 234, 209, 79, 44, 244, 225, 79, + 44, 204, 247, 79, 44, 197, 127, 79, 44, 235, 117, 79, 44, 244, 221, 79, + 44, 235, 195, 79, 44, 52, 196, 222, 79, 44, 157, 201, 191, 201, 118, 79, + 44, 205, 239, 79, 44, 235, 207, 79, 44, 241, 82, 79, 44, 239, 16, 79, 44, + 212, 3, 79, 44, 225, 208, 79, 44, 219, 172, 79, 44, 202, 83, 79, 44, 204, + 58, 79, 44, 222, 97, 79, 44, 200, 2, 79, 44, 235, 150, 79, 44, 248, 107, + 77, 244, 196, 79, 44, 206, 102, 79, 44, 237, 249, 203, 15, 79, 44, 197, + 73, 79, 44, 206, 1, 79, 44, 239, 74, 79, 44, 236, 66, 79, 44, 205, 134, + 79, 44, 51, 79, 44, 204, 228, 79, 44, 205, 117, 79, 44, 201, 216, 79, 44, + 233, 112, 79, 44, 247, 84, 79, 44, 205, 12, 79, 44, 249, 94, 79, 44, 210, + 60, 79, 44, 206, 76, 79, 44, 225, 200, 79, 44, 217, 87, 79, 44, 206, 249, + 79, 44, 235, 183, 79, 44, 214, 132, 79, 44, 251, 99, 79, 44, 212, 131, + 79, 44, 237, 75, 79, 44, 248, 27, 79, 44, 219, 198, 79, 44, 219, 16, 79, + 44, 207, 112, 79, 44, 250, 220, 79, 44, 218, 183, 79, 44, 201, 249, 79, + 44, 214, 79, 79, 44, 248, 111, 79, 44, 204, 224, 79, 44, 244, 166, 79, + 44, 233, 102, 79, 44, 202, 102, 79, 44, 226, 44, 79, 44, 248, 123, 79, + 44, 197, 151, 236, 224, 79, 44, 244, 195, 79, 44, 197, 88, 79, 44, 208, + 129, 79, 44, 231, 101, 79, 44, 205, 131, 79, 44, 199, 144, 79, 44, 249, + 3, 79, 44, 212, 183, 79, 44, 249, 124, 79, 44, 206, 244, 79, 44, 210, + 156, 79, 44, 209, 117, 79, 44, 235, 36, 79, 44, 248, 109, 79, 44, 247, + 98, 79, 44, 248, 140, 79, 44, 218, 185, 79, 44, 197, 150, 79, 44, 244, + 234, 79, 44, 197, 46, 79, 44, 239, 66, 79, 44, 199, 17, 79, 44, 233, 134, + 79, 44, 221, 239, 79, 44, 234, 73, 79, 44, 218, 171, 79, 44, 205, 247, + 79, 44, 206, 182, 203, 134, 248, 155, 79, 44, 210, 216, 79, 44, 248, 117, + 79, 44, 196, 245, 79, 44, 235, 232, 79, 44, 222, 189, 79, 44, 203, 107, + 222, 189, 79, 44, 222, 185, 79, 44, 205, 161, 79, 44, 222, 191, 79, 44, + 197, 50, 79, 44, 235, 54, 79, 44, 237, 64, 79, 44, 232, 136, 79, 44, 234, + 251, 79, 44, 231, 97, 79, 44, 248, 103, 79, 44, 203, 119, 79, 44, 232, + 232, 79, 44, 235, 143, 79, 44, 209, 10, 197, 46, 79, 44, 247, 86, 79, 44, + 233, 199, 79, 44, 235, 110, 79, 44, 248, 155, 79, 44, 208, 233, 79, 44, + 239, 233, 79, 44, 197, 79, 79, 44, 232, 101, 79, 44, 196, 61, 79, 44, + 219, 27, 79, 44, 248, 135, 79, 44, 236, 236, 79, 44, 234, 235, 79, 44, + 201, 162, 79, 44, 237, 205, 79, 44, 210, 197, 79, 44, 216, 19, 79, 44, + 236, 101, 79, 44, 201, 244, 79, 44, 237, 222, 79, 44, 201, 1, 79, 44, + 235, 57, 143, 239, 192, 190, 50, 202, 30, 210, 22, 143, 239, 192, 190, + 90, 202, 30, 60, 143, 239, 192, 190, 50, 202, 30, 112, 26, 210, 22, 143, + 239, 192, 190, 90, 202, 30, 112, 26, 60, 143, 239, 192, 190, 234, 216, + 204, 81, 143, 239, 192, 190, 204, 82, 234, 234, 57, 143, 239, 192, 190, + 204, 82, 234, 234, 60, 143, 239, 192, 190, 204, 82, 234, 234, 222, 183, + 143, 239, 192, 190, 204, 82, 234, 234, 200, 33, 222, 183, 143, 239, 192, + 190, 204, 82, 234, 234, 200, 33, 210, 22, 143, 239, 192, 190, 204, 82, + 234, 234, 221, 202, 222, 183, 143, 239, 192, 190, 214, 23, 143, 205, 148, + 143, 244, 158, 143, 234, 216, 204, 226, 239, 63, 78, 225, 201, 226, 64, + 205, 11, 105, 143, 225, 231, 78, 143, 244, 198, 78, 143, 31, 195, 79, 50, + 251, 90, 179, 53, 251, 90, 179, 50, 52, 251, 90, 179, 53, 52, 251, 90, + 179, 50, 241, 101, 179, 53, 241, 101, 179, 50, 59, 241, 101, 179, 53, 59, + 241, 101, 179, 50, 58, 222, 146, 179, 53, 58, 222, 146, 179, 212, 71, 78, + 234, 12, 78, 50, 201, 231, 206, 245, 179, 53, 201, 231, 206, 245, 179, + 50, 59, 222, 146, 179, 53, 59, 222, 146, 179, 50, 59, 201, 231, 206, 245, + 179, 53, 59, 201, 231, 206, 245, 179, 50, 59, 47, 179, 53, 59, 47, 179, + 197, 123, 240, 64, 210, 89, 52, 212, 19, 211, 61, 78, 52, 212, 19, 211, + 61, 78, 126, 52, 212, 19, 211, 61, 78, 212, 71, 117, 235, 232, 232, 180, + 215, 141, 100, 232, 180, 215, 141, 102, 232, 180, 215, 141, 134, 232, + 180, 215, 141, 136, 232, 180, 215, 141, 146, 232, 180, 215, 141, 167, + 232, 180, 215, 141, 178, 232, 180, 215, 141, 171, 232, 180, 215, 141, + 182, 143, 222, 127, 152, 78, 143, 209, 250, 152, 78, 143, 239, 201, 152, + 78, 143, 236, 202, 152, 78, 29, 206, 62, 76, 152, 78, 29, 52, 76, 152, + 78, 197, 119, 240, 64, 83, 225, 15, 210, 120, 78, 83, 225, 15, 210, 120, + 3, 198, 244, 205, 162, 78, 83, 225, 15, 210, 120, 117, 200, 33, 232, 224, + 83, 225, 15, 210, 120, 3, 198, 244, 205, 162, 117, 200, 33, 232, 224, 83, + 225, 15, 210, 120, 117, 221, 202, 232, 224, 46, 212, 71, 78, 143, 203, + 36, 222, 75, 235, 180, 207, 91, 105, 232, 180, 215, 141, 203, 23, 232, + 180, 215, 141, 200, 234, 232, 180, 215, 141, 202, 177, 83, 143, 225, 231, + 78, 220, 4, 78, 213, 133, 251, 126, 78, 143, 62, 226, 67, 143, 157, 235, + 136, 205, 148, 188, 1, 4, 63, 188, 1, 63, 188, 1, 4, 68, 188, 1, 68, 188, + 1, 4, 66, 188, 1, 66, 188, 1, 4, 69, 188, 1, 69, 188, 1, 4, 72, 188, 1, + 72, 188, 1, 155, 188, 1, 234, 122, 188, 1, 224, 100, 188, 1, 233, 191, + 188, 1, 223, 186, 188, 1, 233, 75, 188, 1, 224, 208, 188, 1, 234, 47, + 188, 1, 224, 10, 188, 1, 233, 143, 188, 1, 183, 188, 1, 195, 115, 188, 1, + 206, 112, 188, 1, 195, 33, 188, 1, 204, 172, 188, 1, 194, 255, 188, 1, + 208, 147, 188, 1, 195, 88, 188, 1, 205, 200, 188, 1, 195, 11, 188, 1, + 189, 188, 1, 240, 135, 188, 1, 202, 122, 188, 1, 239, 151, 188, 1, 4, + 201, 40, 188, 1, 201, 40, 188, 1, 237, 200, 188, 1, 203, 68, 188, 1, 239, + 251, 188, 1, 149, 188, 1, 239, 27, 188, 1, 176, 188, 1, 216, 222, 188, 1, + 215, 185, 188, 1, 217, 117, 188, 1, 216, 49, 188, 1, 142, 188, 1, 249, + 144, 188, 1, 161, 188, 1, 232, 70, 188, 1, 248, 183, 188, 1, 212, 219, + 188, 1, 231, 74, 188, 1, 248, 20, 188, 1, 211, 226, 188, 1, 232, 146, + 188, 1, 249, 8, 188, 1, 213, 91, 188, 1, 231, 192, 188, 1, 248, 115, 188, + 1, 212, 116, 188, 1, 166, 188, 1, 219, 77, 188, 1, 218, 144, 188, 1, 219, + 206, 188, 1, 218, 250, 188, 1, 4, 164, 188, 1, 164, 188, 1, 4, 195, 217, + 188, 1, 195, 217, 188, 1, 4, 196, 3, 188, 1, 196, 3, 188, 1, 169, 188, 1, + 210, 72, 188, 1, 209, 140, 188, 1, 210, 182, 188, 1, 209, 232, 188, 1, 4, + 197, 166, 188, 1, 197, 166, 188, 1, 197, 70, 188, 1, 197, 109, 188, 1, + 197, 34, 188, 1, 218, 54, 188, 1, 197, 220, 188, 1, 4, 155, 188, 1, 4, + 224, 208, 38, 224, 233, 198, 244, 205, 162, 78, 38, 224, 233, 207, 110, + 205, 162, 78, 224, 233, 198, 244, 205, 162, 78, 224, 233, 207, 110, 205, + 162, 78, 188, 225, 231, 78, 188, 198, 244, 225, 231, 78, 188, 239, 110, + 195, 233, 224, 233, 52, 231, 6, 71, 1, 4, 63, 71, 1, 63, 71, 1, 4, 68, + 71, 1, 68, 71, 1, 4, 66, 71, 1, 66, 71, 1, 4, 69, 71, 1, 69, 71, 1, 4, + 72, 71, 1, 72, 71, 1, 155, 71, 1, 234, 122, 71, 1, 224, 100, 71, 1, 233, + 191, 71, 1, 223, 186, 71, 1, 233, 75, 71, 1, 224, 208, 71, 1, 234, 47, + 71, 1, 224, 10, 71, 1, 233, 143, 71, 1, 183, 71, 1, 195, 115, 71, 1, 206, + 112, 71, 1, 195, 33, 71, 1, 204, 172, 71, 1, 194, 255, 71, 1, 208, 147, + 71, 1, 195, 88, 71, 1, 205, 200, 71, 1, 195, 11, 71, 1, 189, 71, 1, 240, + 135, 71, 1, 202, 122, 71, 1, 239, 151, 71, 1, 4, 201, 40, 71, 1, 201, 40, + 71, 1, 237, 200, 71, 1, 203, 68, 71, 1, 239, 251, 71, 1, 149, 71, 1, 239, + 27, 71, 1, 176, 71, 1, 216, 222, 71, 1, 215, 185, 71, 1, 217, 117, 71, 1, + 216, 49, 71, 1, 142, 71, 1, 249, 144, 71, 1, 161, 71, 1, 232, 70, 71, 1, + 248, 183, 71, 1, 212, 219, 71, 1, 231, 74, 71, 1, 248, 20, 71, 1, 211, + 226, 71, 1, 232, 146, 71, 1, 249, 8, 71, 1, 213, 91, 71, 1, 231, 192, 71, + 1, 248, 115, 71, 1, 212, 116, 71, 1, 166, 71, 1, 219, 77, 71, 1, 218, + 144, 71, 1, 219, 206, 71, 1, 218, 250, 71, 1, 4, 164, 71, 1, 164, 71, 1, + 4, 195, 217, 71, 1, 195, 217, 71, 1, 4, 196, 3, 71, 1, 196, 3, 71, 1, + 169, 71, 1, 210, 72, 71, 1, 209, 140, 71, 1, 210, 182, 71, 1, 209, 232, + 71, 1, 4, 197, 166, 71, 1, 197, 166, 71, 1, 197, 70, 71, 1, 197, 109, 71, + 1, 197, 34, 71, 1, 218, 54, 71, 1, 197, 220, 71, 1, 4, 155, 71, 1, 4, + 224, 208, 71, 1, 199, 152, 71, 1, 199, 34, 71, 1, 199, 118, 71, 1, 198, + 248, 71, 112, 238, 252, 224, 233, 211, 251, 205, 162, 78, 71, 225, 231, + 78, 71, 198, 244, 225, 231, 78, 71, 239, 110, 223, 228, 248, 93, 1, 250, + 111, 248, 93, 1, 214, 2, 248, 93, 1, 221, 135, 248, 93, 1, 236, 48, 248, + 93, 1, 240, 230, 248, 93, 1, 203, 216, 248, 93, 1, 218, 54, 248, 93, 1, + 159, 248, 93, 1, 234, 189, 248, 93, 1, 225, 79, 248, 93, 1, 233, 14, 248, + 93, 1, 225, 216, 248, 93, 1, 211, 166, 248, 93, 1, 196, 222, 248, 93, 1, + 195, 75, 248, 93, 1, 247, 17, 248, 93, 1, 207, 52, 248, 93, 1, 144, 248, + 93, 1, 195, 158, 248, 93, 1, 247, 206, 248, 93, 1, 209, 80, 248, 93, 1, + 63, 248, 93, 1, 72, 248, 93, 1, 69, 248, 93, 1, 237, 39, 248, 93, 1, 251, + 199, 248, 93, 1, 237, 32, 248, 93, 1, 250, 149, 248, 93, 1, 214, 38, 248, + 93, 1, 251, 105, 248, 93, 1, 236, 229, 248, 93, 1, 251, 96, 248, 93, 1, + 236, 214, 248, 93, 1, 236, 162, 248, 93, 1, 68, 248, 93, 1, 66, 248, 93, + 1, 225, 229, 248, 93, 1, 199, 230, 248, 93, 1, 217, 72, 248, 93, 1, 233, + 147, 248, 93, 1, 226, 120, 248, 93, 1, 177, 3, 76, 57, 248, 93, 1, 216, + 86, 29, 1, 224, 47, 29, 1, 205, 72, 29, 1, 224, 40, 29, 1, 216, 207, 29, + 1, 216, 205, 29, 1, 216, 204, 29, 1, 202, 97, 29, 1, 205, 61, 29, 1, 210, + 54, 29, 1, 210, 49, 29, 1, 210, 46, 29, 1, 210, 39, 29, 1, 210, 34, 29, + 1, 210, 29, 29, 1, 210, 40, 29, 1, 210, 52, 29, 1, 219, 55, 29, 1, 212, + 205, 29, 1, 205, 69, 29, 1, 212, 194, 29, 1, 206, 52, 29, 1, 205, 66, 29, + 1, 226, 142, 29, 1, 245, 5, 29, 1, 205, 76, 29, 1, 245, 70, 29, 1, 224, + 121, 29, 1, 202, 191, 29, 1, 212, 243, 29, 1, 232, 54, 29, 1, 63, 29, 1, + 251, 244, 29, 1, 164, 29, 1, 196, 118, 29, 1, 236, 191, 29, 1, 69, 29, 1, + 196, 56, 29, 1, 196, 69, 29, 1, 72, 29, 1, 197, 166, 29, 1, 197, 157, 29, + 1, 214, 163, 29, 1, 196, 3, 29, 1, 66, 29, 1, 197, 91, 29, 1, 197, 109, + 29, 1, 197, 70, 29, 1, 195, 217, 29, 1, 236, 115, 29, 1, 196, 24, 29, 1, + 68, 29, 235, 133, 29, 1, 205, 70, 29, 1, 216, 197, 29, 1, 216, 199, 29, + 1, 216, 202, 29, 1, 210, 47, 29, 1, 210, 28, 29, 1, 210, 36, 29, 1, 210, + 41, 29, 1, 210, 26, 29, 1, 219, 48, 29, 1, 219, 45, 29, 1, 219, 49, 29, + 1, 225, 0, 29, 1, 212, 200, 29, 1, 212, 186, 29, 1, 212, 192, 29, 1, 212, + 189, 29, 1, 212, 203, 29, 1, 212, 187, 29, 1, 224, 254, 29, 1, 224, 252, + 29, 1, 206, 45, 29, 1, 206, 43, 29, 1, 206, 35, 29, 1, 206, 40, 29, 1, + 206, 50, 29, 1, 213, 173, 29, 1, 205, 73, 29, 1, 196, 46, 29, 1, 196, 40, + 29, 1, 196, 41, 29, 1, 224, 255, 29, 1, 205, 74, 29, 1, 196, 52, 29, 1, + 195, 247, 29, 1, 195, 246, 29, 1, 195, 249, 29, 1, 195, 204, 29, 1, 195, + 205, 29, 1, 195, 208, 29, 1, 251, 5, 29, 1, 250, 255, 143, 251, 75, 222, + 63, 78, 143, 251, 75, 210, 90, 78, 143, 251, 75, 97, 78, 143, 251, 75, + 99, 78, 143, 251, 75, 115, 78, 143, 251, 75, 235, 6, 78, 143, 251, 75, + 201, 243, 78, 143, 251, 75, 112, 78, 143, 251, 75, 248, 84, 78, 143, 251, + 75, 235, 112, 78, 143, 251, 75, 208, 136, 78, 143, 251, 75, 202, 185, 78, + 143, 251, 75, 234, 255, 78, 143, 251, 75, 232, 122, 78, 143, 251, 75, + 237, 72, 78, 143, 251, 75, 220, 62, 78, 248, 93, 1, 248, 20, 248, 93, 1, + 195, 33, 248, 93, 1, 225, 171, 248, 93, 1, 233, 75, 248, 93, 1, 237, 53, + 248, 93, 1, 236, 211, 248, 93, 1, 214, 101, 248, 93, 1, 214, 105, 248, + 93, 1, 226, 0, 248, 93, 1, 251, 77, 248, 93, 1, 226, 51, 248, 93, 1, 200, + 42, 248, 93, 1, 226, 102, 248, 93, 1, 217, 50, 248, 93, 1, 251, 192, 248, + 93, 1, 250, 144, 248, 93, 1, 251, 122, 248, 93, 1, 214, 126, 248, 93, 1, + 214, 108, 248, 93, 1, 226, 48, 248, 93, 48, 1, 214, 2, 248, 93, 48, 1, + 203, 216, 248, 93, 48, 1, 225, 79, 248, 93, 48, 1, 233, 14, 248, 93, 1, + 233, 230, 248, 93, 1, 222, 122, 248, 93, 1, 194, 235, 12, 204, 196, 203, + 216, 12, 204, 196, 197, 82, 12, 204, 196, 196, 197, 12, 204, 196, 247, + 219, 12, 204, 196, 204, 68, 12, 204, 196, 230, 252, 12, 204, 196, 231, 0, + 12, 204, 196, 231, 83, 12, 204, 196, 230, 253, 12, 204, 196, 203, 219, + 12, 204, 196, 230, 255, 12, 204, 196, 230, 251, 12, 204, 196, 231, 81, + 12, 204, 196, 230, 254, 12, 204, 196, 230, 250, 12, 204, 196, 218, 54, + 12, 204, 196, 233, 14, 12, 204, 196, 209, 80, 12, 204, 196, 214, 2, 12, + 204, 196, 205, 151, 12, 204, 196, 240, 230, 12, 204, 196, 231, 1, 12, + 204, 196, 232, 80, 12, 204, 196, 203, 228, 12, 204, 196, 204, 45, 12, + 204, 196, 205, 23, 12, 204, 196, 207, 58, 12, 204, 196, 213, 95, 12, 204, + 196, 211, 168, 12, 204, 196, 202, 31, 12, 204, 196, 203, 218, 12, 204, + 196, 204, 57, 12, 204, 196, 231, 11, 12, 204, 196, 230, 249, 12, 204, + 196, 213, 7, 12, 204, 196, 211, 166, 71, 1, 4, 223, 186, 71, 1, 4, 206, + 112, 71, 1, 4, 204, 172, 71, 1, 4, 149, 71, 1, 4, 215, 185, 71, 1, 4, + 142, 71, 1, 4, 232, 70, 71, 1, 4, 231, 74, 71, 1, 4, 232, 146, 71, 1, 4, + 231, 192, 71, 1, 4, 218, 144, 71, 1, 4, 169, 71, 1, 4, 210, 72, 71, 1, 4, + 209, 140, 71, 1, 4, 210, 182, 71, 1, 4, 209, 232, 119, 29, 224, 47, 119, + 29, 216, 207, 119, 29, 202, 97, 119, 29, 210, 54, 119, 29, 219, 55, 119, + 29, 212, 205, 119, 29, 206, 52, 119, 29, 226, 142, 119, 29, 245, 5, 119, + 29, 245, 70, 119, 29, 224, 121, 119, 29, 202, 191, 119, 29, 212, 243, + 119, 29, 232, 54, 119, 29, 224, 48, 63, 119, 29, 216, 208, 63, 119, 29, + 202, 98, 63, 119, 29, 210, 55, 63, 119, 29, 219, 56, 63, 119, 29, 212, + 206, 63, 119, 29, 206, 53, 63, 119, 29, 226, 143, 63, 119, 29, 245, 6, + 63, 119, 29, 245, 71, 63, 119, 29, 224, 122, 63, 119, 29, 202, 192, 63, + 119, 29, 212, 244, 63, 119, 29, 232, 55, 63, 119, 29, 245, 6, 66, 119, + 223, 232, 190, 214, 141, 119, 223, 232, 190, 177, 231, 74, 119, 230, 190, + 100, 119, 230, 190, 102, 119, 230, 190, 134, 119, 230, 190, 136, 119, + 230, 190, 146, 119, 230, 190, 167, 119, 230, 190, 178, 119, 230, 190, + 171, 119, 230, 190, 182, 119, 230, 190, 203, 23, 119, 230, 190, 218, 188, + 119, 230, 190, 235, 117, 119, 230, 190, 197, 127, 119, 230, 190, 197, 14, + 119, 230, 190, 219, 142, 119, 230, 190, 237, 71, 119, 230, 190, 204, 111, + 119, 230, 190, 204, 229, 119, 230, 190, 232, 155, 119, 230, 190, 205, + 189, 119, 230, 190, 217, 221, 119, 230, 190, 205, 133, 119, 230, 190, + 235, 128, 119, 230, 190, 241, 147, 119, 230, 190, 223, 70, 119, 230, 190, + 210, 113, 119, 230, 190, 247, 151, 119, 230, 190, 204, 178, 119, 230, + 190, 204, 91, 119, 230, 190, 236, 201, 119, 230, 190, 210, 103, 119, 230, + 190, 251, 141, 119, 230, 190, 235, 160, 119, 230, 190, 210, 101, 119, + 230, 190, 207, 112, 119, 230, 190, 210, 177, 46, 230, 190, 211, 77, 46, + 230, 190, 224, 74, 46, 230, 190, 208, 166, 46, 230, 190, 223, 228, 46, + 31, 203, 24, 214, 119, 58, 205, 94, 46, 31, 200, 235, 214, 119, 58, 205, + 94, 46, 31, 202, 178, 214, 119, 58, 205, 94, 46, 31, 235, 14, 214, 119, + 58, 205, 94, 46, 31, 235, 145, 214, 119, 58, 205, 94, 46, 31, 206, 14, + 214, 119, 58, 205, 94, 46, 31, 207, 66, 214, 119, 58, 205, 94, 46, 31, + 237, 20, 214, 119, 58, 205, 94, 213, 129, 55, 46, 31, 200, 235, 100, 46, + 31, 200, 235, 102, 46, 31, 200, 235, 134, 46, 31, 200, 235, 136, 46, 31, + 200, 235, 146, 46, 31, 200, 235, 167, 46, 31, 200, 235, 178, 46, 31, 200, + 235, 171, 46, 31, 200, 235, 182, 46, 31, 202, 177, 46, 31, 202, 178, 100, + 46, 31, 202, 178, 102, 46, 31, 202, 178, 134, 46, 31, 202, 178, 136, 46, + 31, 202, 178, 146, 46, 29, 224, 47, 46, 29, 216, 207, 46, 29, 202, 97, + 46, 29, 210, 54, 46, 29, 219, 55, 46, 29, 212, 205, 46, 29, 206, 52, 46, + 29, 226, 142, 46, 29, 245, 5, 46, 29, 245, 70, 46, 29, 224, 121, 46, 29, + 202, 191, 46, 29, 212, 243, 46, 29, 232, 54, 46, 29, 224, 48, 63, 46, 29, + 216, 208, 63, 46, 29, 202, 98, 63, 46, 29, 210, 55, 63, 46, 29, 219, 56, + 63, 46, 29, 212, 206, 63, 46, 29, 206, 53, 63, 46, 29, 226, 143, 63, 46, + 29, 245, 6, 63, 46, 29, 245, 71, 63, 46, 29, 224, 122, 63, 46, 29, 202, + 192, 63, 46, 29, 212, 244, 63, 46, 29, 232, 55, 63, 46, 223, 232, 190, + 247, 5, 46, 223, 232, 190, 225, 105, 46, 29, 226, 143, 66, 223, 232, 205, + 11, 105, 46, 230, 190, 100, 46, 230, 190, 102, 46, 230, 190, 134, 46, + 230, 190, 136, 46, 230, 190, 146, 46, 230, 190, 167, 46, 230, 190, 178, + 46, 230, 190, 171, 46, 230, 190, 182, 46, 230, 190, 203, 23, 46, 230, + 190, 218, 188, 46, 230, 190, 235, 117, 46, 230, 190, 197, 127, 46, 230, + 190, 197, 14, 46, 230, 190, 219, 142, 46, 230, 190, 237, 71, 46, 230, + 190, 204, 111, 46, 230, 190, 204, 229, 46, 230, 190, 232, 155, 46, 230, + 190, 205, 189, 46, 230, 190, 217, 221, 46, 230, 190, 205, 133, 46, 230, + 190, 235, 128, 46, 230, 190, 241, 147, 46, 230, 190, 223, 70, 46, 230, + 190, 208, 134, 46, 230, 190, 220, 65, 46, 230, 190, 235, 170, 46, 230, + 190, 204, 123, 46, 230, 190, 236, 93, 46, 230, 190, 212, 14, 46, 230, + 190, 250, 153, 46, 230, 190, 225, 232, 46, 230, 190, 210, 101, 46, 230, + 190, 241, 106, 46, 230, 190, 241, 94, 46, 230, 190, 232, 47, 46, 230, + 190, 247, 35, 46, 230, 190, 221, 207, 46, 230, 190, 222, 183, 46, 230, + 190, 210, 22, 46, 230, 190, 219, 191, 46, 230, 190, 210, 131, 46, 230, + 190, 204, 178, 46, 230, 190, 204, 91, 46, 230, 190, 236, 201, 46, 230, + 190, 210, 103, 46, 230, 190, 251, 141, 46, 230, 190, 216, 193, 46, 31, + 202, 178, 167, 46, 31, 202, 178, 178, 46, 31, 202, 178, 171, 46, 31, 202, + 178, 182, 46, 31, 235, 13, 46, 31, 235, 14, 100, 46, 31, 235, 14, 102, + 46, 31, 235, 14, 134, 46, 31, 235, 14, 136, 46, 31, 235, 14, 146, 46, 31, + 235, 14, 167, 46, 31, 235, 14, 178, 46, 31, 235, 14, 171, 46, 31, 235, + 14, 182, 46, 31, 235, 144, 143, 203, 36, 16, 36, 225, 203, 143, 203, 36, + 16, 36, 235, 182, 143, 203, 36, 16, 36, 220, 30, 143, 203, 36, 16, 36, + 251, 19, 143, 203, 36, 16, 36, 219, 250, 143, 203, 36, 16, 36, 225, 102, + 143, 203, 36, 16, 36, 225, 103, 143, 203, 36, 16, 36, 250, 145, 143, 203, + 36, 16, 36, 207, 89, 143, 203, 36, 16, 36, 214, 169, 143, 203, 36, 16, + 36, 216, 5, 143, 203, 36, 16, 36, 239, 245, 47, 232, 80, 47, 236, 158, + 47, 236, 103, 222, 80, 222, 107, 55, 46, 71, 63, 46, 71, 68, 46, 71, 66, + 46, 71, 69, 46, 71, 72, 46, 71, 155, 46, 71, 224, 100, 46, 71, 223, 186, + 46, 71, 224, 208, 46, 71, 224, 10, 46, 71, 183, 46, 71, 206, 112, 46, 71, + 204, 172, 46, 71, 208, 147, 46, 71, 205, 200, 46, 71, 189, 46, 71, 202, + 122, 46, 71, 201, 40, 46, 71, 203, 68, 46, 71, 149, 46, 71, 176, 46, 71, + 216, 222, 46, 71, 215, 185, 46, 71, 217, 117, 46, 71, 216, 49, 46, 71, + 142, 46, 71, 232, 70, 46, 71, 231, 74, 46, 71, 232, 146, 46, 71, 231, + 192, 46, 71, 166, 46, 71, 219, 77, 46, 71, 218, 144, 46, 71, 219, 206, + 46, 71, 218, 250, 46, 71, 164, 46, 71, 195, 217, 46, 71, 196, 3, 46, 71, + 169, 46, 71, 210, 72, 46, 71, 209, 140, 46, 71, 210, 182, 46, 71, 209, + 232, 46, 71, 197, 166, 46, 71, 197, 70, 46, 71, 197, 109, 46, 71, 197, + 34, 47, 251, 44, 47, 250, 203, 47, 251, 71, 47, 252, 124, 47, 226, 53, + 47, 226, 20, 47, 200, 39, 47, 236, 130, 47, 237, 50, 47, 214, 104, 47, + 214, 97, 47, 225, 28, 47, 224, 248, 47, 224, 243, 47, 234, 77, 47, 234, + 87, 47, 233, 179, 47, 233, 175, 47, 223, 100, 47, 233, 166, 47, 224, 65, + 47, 224, 64, 47, 224, 63, 47, 224, 62, 47, 233, 43, 47, 233, 42, 47, 223, + 149, 47, 223, 152, 47, 224, 195, 47, 223, 230, 47, 223, 238, 47, 208, + 252, 47, 208, 210, 47, 206, 33, 47, 207, 95, 47, 207, 94, 47, 240, 131, + 47, 239, 188, 47, 238, 253, 47, 202, 13, 47, 217, 215, 47, 216, 6, 47, + 232, 229, 47, 213, 236, 47, 213, 235, 47, 249, 141, 47, 212, 216, 47, + 212, 179, 47, 212, 180, 47, 248, 151, 47, 231, 69, 47, 231, 64, 47, 247, + 234, 47, 231, 48, 47, 232, 108, 47, 213, 18, 47, 213, 59, 47, 232, 89, + 47, 213, 55, 47, 213, 73, 47, 248, 245, 47, 212, 105, 47, 248, 89, 47, + 231, 168, 47, 212, 91, 47, 231, 159, 47, 231, 161, 47, 220, 78, 47, 220, + 74, 47, 220, 83, 47, 220, 16, 47, 220, 47, 47, 219, 34, 47, 219, 9, 47, + 219, 8, 47, 219, 179, 47, 219, 176, 47, 219, 180, 47, 196, 128, 47, 196, + 126, 47, 195, 202, 47, 209, 248, 47, 209, 252, 47, 209, 107, 47, 209, + 100, 47, 210, 128, 47, 210, 125, 47, 197, 125, 143, 203, 36, 16, 36, 231, + 91, 195, 79, 143, 203, 36, 16, 36, 231, 91, 100, 143, 203, 36, 16, 36, + 231, 91, 102, 143, 203, 36, 16, 36, 231, 91, 134, 143, 203, 36, 16, 36, + 231, 91, 136, 143, 203, 36, 16, 36, 231, 91, 146, 143, 203, 36, 16, 36, + 231, 91, 167, 143, 203, 36, 16, 36, 231, 91, 178, 143, 203, 36, 16, 36, + 231, 91, 171, 143, 203, 36, 16, 36, 231, 91, 182, 143, 203, 36, 16, 36, + 231, 91, 203, 23, 143, 203, 36, 16, 36, 231, 91, 236, 251, 143, 203, 36, + 16, 36, 231, 91, 200, 239, 143, 203, 36, 16, 36, 231, 91, 202, 179, 143, + 203, 36, 16, 36, 231, 91, 235, 0, 143, 203, 36, 16, 36, 231, 91, 235, + 148, 143, 203, 36, 16, 36, 231, 91, 206, 23, 143, 203, 36, 16, 36, 231, + 91, 207, 68, 143, 203, 36, 16, 36, 231, 91, 237, 27, 143, 203, 36, 16, + 36, 231, 91, 216, 175, 143, 203, 36, 16, 36, 231, 91, 200, 234, 143, 203, + 36, 16, 36, 231, 91, 200, 227, 143, 203, 36, 16, 36, 231, 91, 200, 222, + 143, 203, 36, 16, 36, 231, 91, 200, 224, 143, 203, 36, 16, 36, 231, 91, + 200, 229, 47, 231, 82, 47, 240, 135, 47, 250, 149, 47, 154, 47, 214, 28, + 47, 213, 96, 47, 239, 30, 47, 239, 31, 205, 93, 47, 239, 31, 241, 34, 47, + 225, 229, 47, 236, 161, 217, 222, 232, 109, 47, 236, 161, 217, 222, 203, + 239, 47, 236, 161, 217, 222, 203, 132, 47, 236, 161, 217, 222, 219, 175, + 47, 241, 96, 47, 213, 243, 251, 108, 47, 176, 47, 218, 145, 63, 47, 166, + 47, 155, 47, 224, 211, 47, 219, 245, 47, 234, 65, 47, 247, 157, 47, 224, + 210, 47, 213, 8, 47, 217, 74, 47, 218, 145, 236, 48, 47, 218, 145, 234, + 189, 47, 219, 118, 47, 224, 147, 47, 231, 1, 47, 224, 102, 47, 219, 79, + 47, 233, 193, 47, 202, 124, 47, 218, 145, 159, 47, 219, 2, 47, 239, 40, + 47, 224, 29, 47, 235, 52, 47, 216, 87, 47, 218, 145, 221, 135, 47, 218, + 255, 47, 244, 182, 47, 224, 23, 47, 219, 0, 205, 93, 47, 244, 183, 205, + 93, 47, 221, 136, 205, 93, 47, 224, 24, 205, 93, 47, 219, 0, 241, 34, 47, + 244, 183, 241, 34, 47, 221, 136, 241, 34, 47, 224, 24, 241, 34, 47, 221, + 136, 127, 209, 80, 47, 221, 136, 127, 209, 81, 205, 93, 47, 161, 47, 223, + 222, 47, 218, 150, 47, 233, 117, 47, 210, 233, 47, 210, 234, 127, 209, + 80, 47, 210, 234, 127, 209, 81, 205, 93, 47, 211, 239, 47, 215, 226, 47, + 218, 145, 209, 80, 47, 218, 147, 47, 211, 186, 47, 215, 119, 47, 218, + 145, 199, 230, 47, 218, 78, 47, 223, 138, 47, 218, 79, 219, 179, 47, 211, + 185, 47, 215, 118, 47, 218, 145, 197, 199, 47, 218, 72, 47, 223, 136, 47, + 218, 73, 219, 179, 47, 225, 80, 214, 146, 47, 221, 136, 214, 146, 47, + 251, 122, 47, 248, 64, 47, 247, 80, 47, 247, 57, 47, 247, 207, 127, 224, + 147, 47, 244, 181, 47, 240, 49, 47, 233, 27, 47, 142, 47, 231, 83, 47, + 226, 85, 47, 224, 36, 47, 224, 24, 247, 123, 47, 223, 188, 47, 222, 9, + 47, 222, 8, 47, 221, 249, 47, 221, 151, 47, 219, 246, 205, 224, 47, 219, + 33, 47, 218, 216, 47, 213, 6, 47, 212, 119, 47, 212, 52, 47, 212, 50, 47, + 205, 84, 47, 204, 72, 47, 197, 111, 47, 199, 231, 127, 221, 135, 47, 39, + 127, 221, 135, 143, 203, 36, 16, 36, 240, 53, 100, 143, 203, 36, 16, 36, + 240, 53, 102, 143, 203, 36, 16, 36, 240, 53, 134, 143, 203, 36, 16, 36, + 240, 53, 136, 143, 203, 36, 16, 36, 240, 53, 146, 143, 203, 36, 16, 36, + 240, 53, 167, 143, 203, 36, 16, 36, 240, 53, 178, 143, 203, 36, 16, 36, + 240, 53, 171, 143, 203, 36, 16, 36, 240, 53, 182, 143, 203, 36, 16, 36, + 240, 53, 203, 23, 143, 203, 36, 16, 36, 240, 53, 236, 251, 143, 203, 36, + 16, 36, 240, 53, 200, 239, 143, 203, 36, 16, 36, 240, 53, 202, 179, 143, + 203, 36, 16, 36, 240, 53, 235, 0, 143, 203, 36, 16, 36, 240, 53, 235, + 148, 143, 203, 36, 16, 36, 240, 53, 206, 23, 143, 203, 36, 16, 36, 240, + 53, 207, 68, 143, 203, 36, 16, 36, 240, 53, 237, 27, 143, 203, 36, 16, + 36, 240, 53, 216, 175, 143, 203, 36, 16, 36, 240, 53, 200, 234, 143, 203, + 36, 16, 36, 240, 53, 200, 227, 143, 203, 36, 16, 36, 240, 53, 200, 222, + 143, 203, 36, 16, 36, 240, 53, 200, 224, 143, 203, 36, 16, 36, 240, 53, + 200, 229, 143, 203, 36, 16, 36, 240, 53, 200, 230, 143, 203, 36, 16, 36, + 240, 53, 200, 225, 143, 203, 36, 16, 36, 240, 53, 200, 226, 143, 203, 36, + 16, 36, 240, 53, 200, 233, 143, 203, 36, 16, 36, 240, 53, 200, 228, 143, + 203, 36, 16, 36, 240, 53, 202, 177, 143, 203, 36, 16, 36, 240, 53, 202, + 175, 47, 234, 104, 232, 83, 36, 202, 218, 241, 74, 232, 121, 232, 83, 36, + 202, 218, 210, 170, 237, 71, 232, 83, 36, 239, 121, 250, 168, 202, 218, + 248, 240, 232, 83, 36, 195, 230, 235, 44, 232, 83, 36, 197, 152, 232, 83, + 36, 241, 150, 232, 83, 36, 202, 218, 250, 227, 232, 83, 36, 231, 175, + 202, 19, 232, 83, 36, 4, 203, 115, 232, 83, 36, 201, 193, 232, 83, 36, + 213, 89, 232, 83, 36, 205, 9, 232, 83, 36, 235, 172, 232, 83, 36, 233, + 95, 212, 74, 232, 83, 36, 218, 236, 232, 83, 36, 236, 200, 232, 83, 36, + 235, 45, 232, 83, 36, 197, 7, 214, 119, 202, 218, 239, 246, 232, 83, 36, + 251, 23, 232, 83, 36, 241, 129, 232, 83, 36, 248, 141, 202, 144, 232, 83, + 36, 233, 115, 232, 83, 36, 205, 111, 251, 43, 232, 83, 36, 210, 93, 232, + 83, 36, 226, 47, 232, 83, 36, 233, 95, 203, 115, 232, 83, 36, 218, 164, + 241, 99, 232, 83, 36, 233, 95, 212, 27, 232, 83, 36, 202, 218, 252, 26, + 197, 127, 232, 83, 36, 202, 218, 244, 210, 235, 117, 232, 83, 36, 226, + 61, 232, 83, 36, 237, 176, 232, 83, 36, 210, 96, 232, 83, 36, 233, 95, + 212, 57, 232, 83, 36, 212, 1, 232, 83, 36, 240, 69, 77, 202, 218, 222, + 94, 232, 83, 36, 202, 218, 235, 210, 232, 83, 36, 214, 77, 232, 83, 36, + 214, 176, 232, 83, 36, 239, 216, 232, 83, 36, 239, 238, 232, 83, 36, 226, + 76, 232, 83, 36, 248, 50, 232, 83, 36, 244, 160, 202, 30, 219, 182, 232, + 83, 36, 234, 72, 202, 19, 232, 83, 36, 211, 196, 200, 25, 232, 83, 36, + 214, 76, 232, 83, 36, 202, 218, 197, 93, 232, 83, 36, 210, 84, 232, 83, + 36, 202, 218, 247, 86, 232, 83, 36, 202, 218, 250, 223, 202, 138, 232, + 83, 36, 202, 218, 224, 196, 204, 233, 218, 168, 232, 83, 36, 239, 183, + 232, 83, 36, 202, 218, 220, 19, 220, 79, 232, 83, 36, 252, 27, 232, 83, + 36, 202, 218, 197, 144, 232, 83, 36, 202, 218, 234, 27, 197, 50, 232, 83, + 36, 202, 218, 225, 111, 223, 0, 232, 83, 36, 239, 71, 232, 83, 36, 222, + 81, 232, 83, 36, 226, 50, 201, 117, 232, 83, 36, 4, 212, 27, 232, 83, 36, + 251, 217, 244, 150, 232, 83, 36, 248, 243, 244, 150, 11, 5, 225, 233, 11, + 5, 225, 225, 11, 5, 68, 11, 5, 226, 3, 11, 5, 226, 144, 11, 5, 226, 127, + 11, 5, 226, 146, 11, 5, 226, 145, 11, 5, 250, 167, 11, 5, 250, 123, 11, + 5, 63, 11, 5, 251, 45, 11, 5, 200, 37, 11, 5, 200, 41, 11, 5, 200, 38, + 11, 5, 214, 48, 11, 5, 214, 12, 11, 5, 72, 11, 5, 214, 92, 11, 5, 236, + 94, 11, 5, 69, 11, 5, 196, 243, 11, 5, 248, 144, 11, 5, 248, 139, 11, 5, + 248, 183, 11, 5, 248, 156, 11, 5, 248, 172, 11, 5, 248, 171, 11, 5, 248, + 174, 11, 5, 248, 173, 11, 5, 249, 55, 11, 5, 249, 47, 11, 5, 249, 144, + 11, 5, 249, 80, 11, 5, 247, 246, 11, 5, 247, 250, 11, 5, 247, 247, 11, 5, + 248, 88, 11, 5, 248, 69, 11, 5, 248, 115, 11, 5, 248, 94, 11, 5, 248, + 199, 11, 5, 249, 8, 11, 5, 248, 212, 11, 5, 247, 230, 11, 5, 247, 224, + 11, 5, 248, 20, 11, 5, 247, 245, 11, 5, 247, 238, 11, 5, 247, 243, 11, 5, + 247, 212, 11, 5, 247, 210, 11, 5, 247, 217, 11, 5, 247, 215, 11, 5, 247, + 213, 11, 5, 247, 214, 11, 5, 212, 156, 11, 5, 212, 152, 11, 5, 212, 219, + 11, 5, 212, 168, 11, 5, 212, 185, 11, 5, 212, 212, 11, 5, 212, 208, 11, + 5, 213, 115, 11, 5, 213, 101, 11, 5, 161, 11, 5, 213, 162, 11, 5, 211, + 206, 11, 5, 211, 208, 11, 5, 211, 207, 11, 5, 212, 67, 11, 5, 212, 55, + 11, 5, 212, 116, 11, 5, 212, 86, 11, 5, 211, 192, 11, 5, 211, 188, 11, 5, + 211, 226, 11, 5, 211, 205, 11, 5, 211, 197, 11, 5, 211, 203, 11, 5, 211, + 170, 11, 5, 211, 169, 11, 5, 211, 174, 11, 5, 211, 173, 11, 5, 211, 171, + 11, 5, 211, 172, 11, 5, 249, 29, 11, 5, 249, 28, 11, 5, 249, 35, 11, 5, + 249, 30, 11, 5, 249, 32, 11, 5, 249, 31, 11, 5, 249, 34, 11, 5, 249, 33, + 11, 5, 249, 41, 11, 5, 249, 40, 11, 5, 249, 44, 11, 5, 249, 42, 11, 5, + 249, 20, 11, 5, 249, 22, 11, 5, 249, 21, 11, 5, 249, 25, 11, 5, 249, 24, + 11, 5, 249, 27, 11, 5, 249, 26, 11, 5, 249, 36, 11, 5, 249, 39, 11, 5, + 249, 37, 11, 5, 249, 16, 11, 5, 249, 15, 11, 5, 249, 23, 11, 5, 249, 19, + 11, 5, 249, 17, 11, 5, 249, 18, 11, 5, 249, 12, 11, 5, 249, 11, 11, 5, + 249, 14, 11, 5, 249, 13, 11, 5, 217, 181, 11, 5, 217, 180, 11, 5, 217, + 186, 11, 5, 217, 182, 11, 5, 217, 183, 11, 5, 217, 185, 11, 5, 217, 184, + 11, 5, 217, 189, 11, 5, 217, 188, 11, 5, 217, 191, 11, 5, 217, 190, 11, + 5, 217, 177, 11, 5, 217, 176, 11, 5, 217, 179, 11, 5, 217, 178, 11, 5, + 217, 170, 11, 5, 217, 169, 11, 5, 217, 174, 11, 5, 217, 173, 11, 5, 217, + 171, 11, 5, 217, 172, 11, 5, 217, 164, 11, 5, 217, 163, 11, 5, 217, 168, + 11, 5, 217, 167, 11, 5, 217, 165, 11, 5, 217, 166, 11, 5, 231, 236, 11, + 5, 231, 235, 11, 5, 231, 241, 11, 5, 231, 237, 11, 5, 231, 238, 11, 5, + 231, 240, 11, 5, 231, 239, 11, 5, 231, 244, 11, 5, 231, 243, 11, 5, 231, + 246, 11, 5, 231, 245, 11, 5, 231, 227, 11, 5, 231, 229, 11, 5, 231, 228, + 11, 5, 231, 232, 11, 5, 231, 231, 11, 5, 231, 234, 11, 5, 231, 233, 11, + 5, 231, 223, 11, 5, 231, 222, 11, 5, 231, 230, 11, 5, 231, 226, 11, 5, + 231, 224, 11, 5, 231, 225, 11, 5, 231, 217, 11, 5, 231, 221, 11, 5, 231, + 220, 11, 5, 231, 218, 11, 5, 231, 219, 11, 5, 219, 5, 11, 5, 219, 4, 11, + 5, 219, 77, 11, 5, 219, 11, 11, 5, 219, 41, 11, 5, 219, 59, 11, 5, 219, + 57, 11, 5, 220, 3, 11, 5, 219, 253, 11, 5, 166, 11, 5, 220, 42, 11, 5, + 218, 106, 11, 5, 218, 105, 11, 5, 218, 109, 11, 5, 218, 107, 11, 5, 218, + 179, 11, 5, 218, 152, 11, 5, 218, 250, 11, 5, 218, 186, 11, 5, 219, 129, + 11, 5, 219, 206, 11, 5, 218, 86, 11, 5, 218, 80, 11, 5, 218, 144, 11, 5, + 218, 102, 11, 5, 218, 95, 11, 5, 218, 100, 11, 5, 218, 57, 11, 5, 218, + 56, 11, 5, 218, 62, 11, 5, 218, 59, 11, 5, 235, 103, 11, 5, 235, 97, 11, + 5, 235, 152, 11, 5, 235, 119, 11, 5, 235, 201, 11, 5, 235, 192, 11, 5, + 235, 238, 11, 5, 235, 206, 11, 5, 234, 253, 11, 5, 235, 50, 11, 5, 235, + 31, 11, 5, 234, 205, 11, 5, 234, 204, 11, 5, 234, 222, 11, 5, 234, 210, + 11, 5, 234, 208, 11, 5, 234, 209, 11, 5, 234, 192, 11, 5, 234, 191, 11, + 5, 234, 195, 11, 5, 234, 193, 11, 5, 198, 255, 11, 5, 198, 250, 11, 5, + 199, 34, 11, 5, 199, 8, 11, 5, 199, 23, 11, 5, 199, 20, 11, 5, 199, 26, + 11, 5, 199, 25, 11, 5, 199, 126, 11, 5, 199, 121, 11, 5, 199, 152, 11, 5, + 199, 139, 11, 5, 198, 229, 11, 5, 198, 225, 11, 5, 198, 248, 11, 5, 198, + 231, 11, 5, 199, 38, 11, 5, 199, 106, 11, 5, 197, 213, 11, 5, 197, 211, + 11, 5, 197, 220, 11, 5, 197, 216, 11, 5, 197, 214, 11, 5, 197, 215, 11, + 5, 197, 203, 11, 5, 197, 202, 11, 5, 197, 207, 11, 5, 197, 206, 11, 5, + 197, 204, 11, 5, 197, 205, 11, 5, 239, 64, 11, 5, 239, 50, 11, 5, 239, + 151, 11, 5, 239, 91, 11, 5, 239, 126, 11, 5, 239, 131, 11, 5, 239, 130, + 11, 5, 240, 60, 11, 5, 240, 54, 11, 5, 240, 135, 11, 5, 240, 80, 11, 5, + 237, 181, 11, 5, 237, 182, 11, 5, 238, 252, 11, 5, 237, 228, 11, 5, 239, + 27, 11, 5, 238, 255, 11, 5, 239, 181, 11, 5, 239, 251, 11, 5, 239, 202, + 11, 5, 237, 172, 11, 5, 237, 170, 11, 5, 237, 200, 11, 5, 237, 180, 11, + 5, 237, 175, 11, 5, 237, 178, 11, 5, 202, 57, 11, 5, 202, 49, 11, 5, 202, + 122, 11, 5, 202, 67, 11, 5, 202, 105, 11, 5, 202, 107, 11, 5, 202, 106, + 11, 5, 203, 94, 11, 5, 203, 79, 11, 5, 189, 11, 5, 203, 105, 11, 5, 201, + 15, 11, 5, 201, 14, 11, 5, 201, 17, 11, 5, 201, 16, 11, 5, 201, 229, 11, + 5, 201, 219, 11, 5, 149, 11, 5, 201, 242, 11, 5, 202, 239, 11, 5, 203, + 68, 11, 5, 203, 10, 11, 5, 200, 254, 11, 5, 200, 249, 11, 5, 201, 40, 11, + 5, 201, 13, 11, 5, 200, 255, 11, 5, 201, 10, 11, 5, 240, 12, 11, 5, 240, + 11, 11, 5, 240, 17, 11, 5, 240, 13, 11, 5, 240, 14, 11, 5, 240, 16, 11, + 5, 240, 15, 11, 5, 240, 33, 11, 5, 240, 32, 11, 5, 240, 40, 11, 5, 240, + 34, 11, 5, 240, 2, 11, 5, 240, 4, 11, 5, 240, 3, 11, 5, 240, 7, 11, 5, + 240, 6, 11, 5, 240, 10, 11, 5, 240, 8, 11, 5, 240, 25, 11, 5, 240, 28, + 11, 5, 240, 26, 11, 5, 239, 254, 11, 5, 239, 253, 11, 5, 240, 5, 11, 5, + 240, 1, 11, 5, 239, 255, 11, 5, 240, 0, 11, 5, 217, 136, 11, 5, 217, 135, + 11, 5, 217, 143, 11, 5, 217, 138, 11, 5, 217, 139, 11, 5, 217, 140, 11, + 5, 217, 152, 11, 5, 217, 151, 11, 5, 217, 158, 11, 5, 217, 153, 11, 5, + 217, 128, 11, 5, 217, 127, 11, 5, 217, 134, 11, 5, 217, 129, 11, 5, 217, + 144, 11, 5, 217, 150, 11, 5, 217, 148, 11, 5, 217, 120, 11, 5, 217, 119, + 11, 5, 217, 125, 11, 5, 217, 123, 11, 5, 217, 121, 11, 5, 217, 122, 11, + 5, 231, 202, 11, 5, 231, 201, 11, 5, 231, 208, 11, 5, 231, 203, 11, 5, + 231, 205, 11, 5, 231, 204, 11, 5, 231, 207, 11, 5, 231, 206, 11, 5, 231, + 214, 11, 5, 231, 212, 11, 5, 231, 216, 11, 5, 231, 215, 11, 5, 231, 195, + 11, 5, 231, 196, 11, 5, 231, 199, 11, 5, 231, 198, 11, 5, 231, 200, 11, + 5, 231, 209, 11, 5, 231, 211, 11, 5, 231, 210, 11, 5, 231, 194, 11, 5, + 216, 167, 11, 5, 216, 165, 11, 5, 216, 222, 11, 5, 216, 170, 11, 5, 216, + 196, 11, 5, 216, 210, 11, 5, 216, 209, 11, 5, 217, 196, 11, 5, 176, 11, + 5, 217, 212, 11, 5, 215, 129, 11, 5, 215, 131, 11, 5, 215, 130, 11, 5, + 216, 17, 11, 5, 216, 1, 11, 5, 216, 49, 11, 5, 216, 28, 11, 5, 217, 76, + 11, 5, 217, 117, 11, 5, 217, 95, 11, 5, 215, 124, 11, 5, 215, 120, 11, 5, + 215, 185, 11, 5, 215, 128, 11, 5, 215, 126, 11, 5, 215, 127, 11, 5, 232, + 11, 11, 5, 232, 10, 11, 5, 232, 16, 11, 5, 232, 12, 11, 5, 232, 13, 11, + 5, 232, 15, 11, 5, 232, 14, 11, 5, 232, 22, 11, 5, 232, 20, 11, 5, 232, + 24, 11, 5, 232, 23, 11, 5, 232, 3, 11, 5, 232, 5, 11, 5, 232, 4, 11, 5, + 232, 7, 11, 5, 232, 9, 11, 5, 232, 8, 11, 5, 232, 17, 11, 5, 232, 19, 11, + 5, 232, 18, 11, 5, 231, 255, 11, 5, 231, 254, 11, 5, 232, 6, 11, 5, 232, + 2, 11, 5, 232, 0, 11, 5, 232, 1, 11, 5, 231, 249, 11, 5, 231, 248, 11, 5, + 231, 253, 11, 5, 231, 252, 11, 5, 231, 250, 11, 5, 231, 251, 11, 5, 222, + 50, 11, 5, 222, 42, 11, 5, 222, 108, 11, 5, 222, 60, 11, 5, 222, 99, 11, + 5, 222, 98, 11, 5, 222, 102, 11, 5, 222, 100, 11, 5, 222, 219, 11, 5, + 222, 207, 11, 5, 172, 11, 5, 222, 230, 11, 5, 221, 168, 11, 5, 221, 167, + 11, 5, 221, 170, 11, 5, 221, 169, 11, 5, 221, 215, 11, 5, 221, 199, 11, + 5, 222, 6, 11, 5, 221, 221, 11, 5, 222, 125, 11, 5, 222, 196, 11, 5, 222, + 143, 11, 5, 221, 162, 11, 5, 221, 160, 11, 5, 221, 190, 11, 5, 221, 166, + 11, 5, 221, 164, 11, 5, 221, 165, 11, 5, 221, 140, 11, 5, 221, 139, 11, + 5, 221, 150, 11, 5, 221, 143, 11, 5, 221, 141, 11, 5, 221, 142, 11, 5, + 233, 162, 11, 5, 233, 161, 11, 5, 233, 191, 11, 5, 233, 174, 11, 5, 233, + 183, 11, 5, 233, 182, 11, 5, 233, 185, 11, 5, 233, 184, 11, 5, 234, 74, + 11, 5, 234, 69, 11, 5, 234, 122, 11, 5, 234, 85, 11, 5, 233, 48, 11, 5, + 233, 47, 11, 5, 233, 50, 11, 5, 233, 49, 11, 5, 233, 120, 11, 5, 233, + 118, 11, 5, 233, 143, 11, 5, 233, 129, 11, 5, 234, 13, 11, 5, 234, 11, + 11, 5, 234, 47, 11, 5, 234, 24, 11, 5, 233, 37, 11, 5, 233, 36, 11, 5, + 233, 75, 11, 5, 233, 46, 11, 5, 233, 38, 11, 5, 233, 45, 11, 5, 224, 54, + 11, 5, 224, 49, 11, 5, 224, 100, 11, 5, 224, 68, 11, 5, 224, 81, 11, 5, + 224, 85, 11, 5, 224, 83, 11, 5, 224, 234, 11, 5, 224, 216, 11, 5, 155, + 11, 5, 225, 7, 11, 5, 223, 157, 11, 5, 223, 162, 11, 5, 223, 159, 11, 5, + 223, 229, 11, 5, 223, 224, 11, 5, 224, 10, 11, 5, 223, 236, 11, 5, 224, + 171, 11, 5, 224, 154, 11, 5, 224, 208, 11, 5, 224, 175, 11, 5, 223, 144, + 11, 5, 223, 140, 11, 5, 223, 186, 11, 5, 223, 156, 11, 5, 223, 148, 11, + 5, 223, 153, 11, 5, 233, 251, 11, 5, 233, 250, 11, 5, 233, 255, 11, 5, + 233, 252, 11, 5, 233, 254, 11, 5, 233, 253, 11, 5, 234, 6, 11, 5, 234, 5, + 11, 5, 234, 9, 11, 5, 234, 7, 11, 5, 233, 242, 11, 5, 233, 241, 11, 5, + 233, 244, 11, 5, 233, 243, 11, 5, 233, 247, 11, 5, 233, 246, 11, 5, 233, + 249, 11, 5, 233, 248, 11, 5, 234, 1, 11, 5, 234, 0, 11, 5, 234, 4, 11, 5, + 234, 2, 11, 5, 233, 237, 11, 5, 233, 236, 11, 5, 233, 245, 11, 5, 233, + 240, 11, 5, 233, 238, 11, 5, 233, 239, 11, 5, 219, 96, 11, 5, 219, 97, + 11, 5, 219, 115, 11, 5, 219, 114, 11, 5, 219, 117, 11, 5, 219, 116, 11, + 5, 219, 87, 11, 5, 219, 89, 11, 5, 219, 88, 11, 5, 219, 92, 11, 5, 219, + 91, 11, 5, 219, 94, 11, 5, 219, 93, 11, 5, 219, 98, 11, 5, 219, 100, 11, + 5, 219, 99, 11, 5, 219, 83, 11, 5, 219, 82, 11, 5, 219, 90, 11, 5, 219, + 86, 11, 5, 219, 84, 11, 5, 219, 85, 11, 5, 231, 21, 11, 5, 231, 20, 11, + 5, 231, 27, 11, 5, 231, 22, 11, 5, 231, 24, 11, 5, 231, 23, 11, 5, 231, + 26, 11, 5, 231, 25, 11, 5, 231, 32, 11, 5, 231, 31, 11, 5, 231, 34, 11, + 5, 231, 33, 11, 5, 231, 13, 11, 5, 231, 12, 11, 5, 231, 15, 11, 5, 231, + 14, 11, 5, 231, 17, 11, 5, 231, 16, 11, 5, 231, 19, 11, 5, 231, 18, 11, + 5, 231, 28, 11, 5, 231, 30, 11, 5, 231, 29, 11, 5, 217, 15, 11, 5, 217, + 17, 11, 5, 217, 16, 11, 5, 217, 60, 11, 5, 217, 58, 11, 5, 217, 70, 11, + 5, 217, 63, 11, 5, 216, 232, 11, 5, 216, 231, 11, 5, 216, 233, 11, 5, + 216, 243, 11, 5, 216, 240, 11, 5, 216, 251, 11, 5, 216, 245, 11, 5, 217, + 51, 11, 5, 217, 57, 11, 5, 217, 53, 11, 5, 232, 30, 11, 5, 232, 48, 11, + 5, 232, 57, 11, 5, 232, 164, 11, 5, 232, 153, 11, 5, 142, 11, 5, 232, + 176, 11, 5, 231, 50, 11, 5, 231, 49, 11, 5, 231, 52, 11, 5, 231, 51, 11, + 5, 231, 94, 11, 5, 231, 85, 11, 5, 231, 192, 11, 5, 231, 157, 11, 5, 232, + 85, 11, 5, 232, 146, 11, 5, 232, 97, 11, 5, 197, 130, 11, 5, 197, 115, + 11, 5, 197, 166, 11, 5, 197, 141, 11, 5, 196, 232, 11, 5, 196, 234, 11, + 5, 196, 233, 11, 5, 197, 0, 11, 5, 197, 34, 11, 5, 197, 10, 11, 5, 197, + 83, 11, 5, 197, 109, 11, 5, 197, 90, 11, 5, 195, 18, 11, 5, 195, 17, 11, + 5, 195, 33, 11, 5, 195, 21, 11, 5, 195, 26, 11, 5, 195, 28, 11, 5, 195, + 27, 11, 5, 195, 97, 11, 5, 195, 94, 11, 5, 195, 115, 11, 5, 195, 101, 11, + 5, 194, 248, 11, 5, 194, 250, 11, 5, 194, 249, 11, 5, 195, 6, 11, 5, 195, + 5, 11, 5, 195, 11, 11, 5, 195, 7, 11, 5, 195, 76, 11, 5, 195, 88, 11, 5, + 195, 81, 11, 5, 194, 244, 11, 5, 194, 243, 11, 5, 194, 255, 11, 5, 194, + 247, 11, 5, 194, 245, 11, 5, 194, 246, 11, 5, 194, 230, 11, 5, 194, 229, + 11, 5, 194, 235, 11, 5, 194, 233, 11, 5, 194, 231, 11, 5, 194, 232, 11, + 5, 244, 237, 11, 5, 244, 230, 11, 5, 245, 10, 11, 5, 244, 250, 11, 5, + 245, 7, 11, 5, 245, 1, 11, 5, 245, 9, 11, 5, 245, 8, 11, 5, 247, 91, 11, + 5, 247, 83, 11, 5, 247, 173, 11, 5, 247, 124, 11, 5, 241, 28, 11, 5, 241, + 30, 11, 5, 241, 29, 11, 5, 241, 92, 11, 5, 241, 80, 11, 5, 244, 181, 11, + 5, 241, 111, 11, 5, 247, 19, 11, 5, 247, 56, 11, 5, 247, 25, 11, 5, 241, + 0, 11, 5, 240, 254, 11, 5, 241, 40, 11, 5, 241, 26, 11, 5, 241, 6, 11, 5, + 241, 21, 11, 5, 240, 233, 11, 5, 240, 232, 11, 5, 240, 245, 11, 5, 240, + 239, 11, 5, 240, 234, 11, 5, 240, 236, 11, 5, 194, 213, 11, 5, 194, 212, + 11, 5, 194, 219, 11, 5, 194, 214, 11, 5, 194, 216, 11, 5, 194, 215, 11, + 5, 194, 218, 11, 5, 194, 217, 11, 5, 194, 225, 11, 5, 194, 224, 11, 5, + 194, 228, 11, 5, 194, 226, 11, 5, 194, 209, 11, 5, 194, 211, 11, 5, 194, + 210, 11, 5, 194, 220, 11, 5, 194, 223, 11, 5, 194, 221, 11, 5, 194, 202, + 11, 5, 194, 206, 11, 5, 194, 205, 11, 5, 194, 203, 11, 5, 194, 204, 11, + 5, 194, 196, 11, 5, 194, 195, 11, 5, 194, 201, 11, 5, 194, 199, 11, 5, + 194, 197, 11, 5, 194, 198, 11, 5, 215, 40, 11, 5, 215, 39, 11, 5, 215, + 45, 11, 5, 215, 41, 11, 5, 215, 42, 11, 5, 215, 44, 11, 5, 215, 43, 11, + 5, 215, 50, 11, 5, 215, 49, 11, 5, 215, 53, 11, 5, 215, 52, 11, 5, 215, + 33, 11, 5, 215, 34, 11, 5, 215, 37, 11, 5, 215, 38, 11, 5, 215, 46, 11, + 5, 215, 48, 11, 5, 215, 28, 11, 5, 215, 36, 11, 5, 215, 32, 11, 5, 215, + 29, 11, 5, 215, 30, 11, 5, 215, 23, 11, 5, 215, 22, 11, 5, 215, 27, 11, + 5, 215, 26, 11, 5, 215, 24, 11, 5, 215, 25, 11, 5, 206, 31, 11, 5, 167, + 11, 5, 206, 112, 11, 5, 206, 34, 11, 5, 206, 92, 11, 5, 206, 95, 11, 5, + 206, 93, 11, 5, 208, 199, 11, 5, 208, 183, 11, 5, 183, 11, 5, 208, 207, + 11, 5, 204, 101, 11, 5, 204, 103, 11, 5, 204, 102, 11, 5, 205, 165, 11, + 5, 205, 154, 11, 5, 205, 200, 11, 5, 205, 169, 11, 5, 207, 63, 11, 5, + 208, 147, 11, 5, 207, 93, 11, 5, 204, 76, 11, 5, 204, 73, 11, 5, 204, + 172, 11, 5, 204, 100, 11, 5, 204, 80, 11, 5, 204, 88, 11, 5, 203, 230, + 11, 5, 203, 229, 11, 5, 204, 44, 11, 5, 203, 238, 11, 5, 203, 232, 11, 5, + 203, 237, 11, 5, 205, 41, 11, 5, 205, 40, 11, 5, 205, 47, 11, 5, 205, 42, + 11, 5, 205, 44, 11, 5, 205, 46, 11, 5, 205, 45, 11, 5, 205, 56, 11, 5, + 205, 54, 11, 5, 205, 80, 11, 5, 205, 57, 11, 5, 205, 36, 11, 5, 205, 35, + 11, 5, 205, 39, 11, 5, 205, 37, 11, 5, 205, 50, 11, 5, 205, 53, 11, 5, + 205, 51, 11, 5, 205, 32, 11, 5, 205, 30, 11, 5, 205, 34, 11, 5, 205, 33, + 11, 5, 205, 25, 11, 5, 205, 24, 11, 5, 205, 29, 11, 5, 205, 28, 11, 5, + 205, 26, 11, 5, 205, 27, 11, 5, 195, 69, 11, 5, 195, 68, 11, 5, 195, 74, + 11, 5, 195, 71, 11, 5, 195, 48, 11, 5, 195, 50, 11, 5, 195, 49, 11, 5, + 195, 53, 11, 5, 195, 52, 11, 5, 195, 57, 11, 5, 195, 54, 11, 5, 195, 62, + 11, 5, 195, 61, 11, 5, 195, 65, 11, 5, 195, 63, 11, 5, 195, 44, 11, 5, + 195, 43, 11, 5, 195, 51, 11, 5, 195, 47, 11, 5, 195, 45, 11, 5, 195, 46, + 11, 5, 195, 36, 11, 5, 195, 35, 11, 5, 195, 40, 11, 5, 195, 39, 11, 5, + 195, 37, 11, 5, 195, 38, 11, 5, 245, 108, 11, 5, 245, 104, 11, 5, 247, + 15, 11, 5, 247, 1, 11, 5, 245, 25, 11, 5, 245, 24, 11, 5, 245, 27, 11, 5, + 245, 26, 11, 5, 245, 40, 11, 5, 245, 39, 11, 5, 245, 48, 11, 5, 245, 43, + 11, 5, 245, 79, 11, 5, 245, 77, 11, 5, 245, 102, 11, 5, 245, 87, 11, 5, + 245, 19, 11, 5, 245, 29, 11, 5, 245, 23, 11, 5, 245, 20, 11, 5, 245, 22, + 11, 5, 245, 12, 11, 5, 245, 11, 11, 5, 245, 16, 11, 5, 245, 15, 11, 5, + 245, 13, 11, 5, 245, 14, 11, 5, 209, 177, 11, 5, 209, 181, 11, 5, 209, + 159, 11, 5, 209, 160, 11, 5, 209, 164, 11, 5, 209, 163, 11, 5, 209, 167, + 11, 5, 209, 165, 11, 5, 209, 171, 11, 5, 209, 170, 11, 5, 209, 176, 11, + 5, 209, 172, 11, 5, 209, 155, 11, 5, 209, 153, 11, 5, 209, 161, 11, 5, + 209, 158, 11, 5, 209, 156, 11, 5, 209, 157, 11, 5, 209, 148, 11, 5, 209, + 147, 11, 5, 209, 152, 11, 5, 209, 151, 11, 5, 209, 149, 11, 5, 209, 150, + 11, 5, 215, 249, 11, 5, 215, 248, 11, 5, 215, 251, 11, 5, 215, 250, 11, + 5, 215, 240, 11, 5, 215, 242, 11, 5, 215, 241, 11, 5, 215, 244, 11, 5, + 215, 243, 11, 5, 215, 247, 11, 5, 215, 246, 11, 5, 215, 234, 11, 5, 215, + 233, 11, 5, 215, 239, 11, 5, 215, 237, 11, 5, 215, 235, 11, 5, 215, 236, + 11, 5, 215, 228, 11, 5, 215, 227, 11, 5, 215, 232, 11, 5, 215, 231, 11, + 5, 215, 229, 11, 5, 215, 230, 11, 5, 207, 9, 11, 5, 207, 4, 11, 5, 207, + 50, 11, 5, 207, 22, 11, 5, 206, 139, 11, 5, 206, 141, 11, 5, 206, 140, + 11, 5, 206, 166, 11, 5, 206, 161, 11, 5, 206, 198, 11, 5, 206, 186, 11, + 5, 206, 233, 11, 5, 206, 226, 11, 5, 206, 255, 11, 5, 206, 242, 11, 5, + 206, 135, 11, 5, 206, 132, 11, 5, 206, 151, 11, 5, 206, 138, 11, 5, 206, + 136, 11, 5, 206, 137, 11, 5, 206, 115, 11, 5, 206, 114, 11, 5, 206, 121, + 11, 5, 206, 118, 11, 5, 206, 116, 11, 5, 206, 117, 11, 5, 210, 197, 11, + 5, 210, 191, 11, 5, 169, 11, 5, 210, 203, 11, 5, 209, 110, 11, 5, 209, + 112, 11, 5, 209, 111, 11, 5, 209, 195, 11, 5, 209, 183, 11, 5, 209, 232, + 11, 5, 209, 199, 11, 5, 210, 82, 11, 5, 210, 182, 11, 5, 210, 124, 11, 5, + 209, 102, 11, 5, 209, 99, 11, 5, 209, 140, 11, 5, 209, 109, 11, 5, 209, + 105, 11, 5, 209, 106, 11, 5, 209, 84, 11, 5, 209, 83, 11, 5, 209, 89, 11, + 5, 209, 87, 11, 5, 209, 85, 11, 5, 209, 86, 11, 5, 225, 159, 11, 5, 225, + 158, 11, 5, 225, 171, 11, 5, 225, 160, 11, 5, 225, 167, 11, 5, 225, 166, + 11, 5, 225, 169, 11, 5, 225, 168, 11, 5, 225, 97, 11, 5, 225, 96, 11, 5, + 225, 99, 11, 5, 225, 98, 11, 5, 225, 115, 11, 5, 225, 113, 11, 5, 225, + 128, 11, 5, 225, 117, 11, 5, 225, 90, 11, 5, 225, 88, 11, 5, 225, 109, + 11, 5, 225, 95, 11, 5, 225, 92, 11, 5, 225, 93, 11, 5, 225, 82, 11, 5, + 225, 81, 11, 5, 225, 86, 11, 5, 225, 85, 11, 5, 225, 83, 11, 5, 225, 84, + 11, 5, 211, 112, 11, 5, 211, 110, 11, 5, 211, 120, 11, 5, 211, 113, 11, + 5, 211, 117, 11, 5, 211, 116, 11, 5, 211, 119, 11, 5, 211, 118, 11, 5, + 211, 62, 11, 5, 211, 59, 11, 5, 211, 64, 11, 5, 211, 63, 11, 5, 211, 99, + 11, 5, 211, 98, 11, 5, 211, 108, 11, 5, 211, 102, 11, 5, 211, 54, 11, 5, + 211, 50, 11, 5, 211, 96, 11, 5, 211, 58, 11, 5, 211, 56, 11, 5, 211, 57, + 11, 5, 211, 34, 11, 5, 211, 32, 11, 5, 211, 44, 11, 5, 211, 37, 11, 5, + 211, 35, 11, 5, 211, 36, 11, 5, 225, 148, 11, 5, 225, 147, 11, 5, 225, + 154, 11, 5, 225, 149, 11, 5, 225, 151, 11, 5, 225, 150, 11, 5, 225, 153, + 11, 5, 225, 152, 11, 5, 225, 139, 11, 5, 225, 141, 11, 5, 225, 140, 11, + 5, 225, 144, 11, 5, 225, 143, 11, 5, 225, 146, 11, 5, 225, 145, 11, 5, + 225, 135, 11, 5, 225, 134, 11, 5, 225, 142, 11, 5, 225, 138, 11, 5, 225, + 136, 11, 5, 225, 137, 11, 5, 225, 131, 11, 5, 225, 130, 11, 5, 225, 133, + 11, 5, 225, 132, 11, 5, 216, 140, 11, 5, 216, 139, 11, 5, 216, 147, 11, + 5, 216, 141, 11, 5, 216, 143, 11, 5, 216, 142, 11, 5, 216, 146, 11, 5, + 216, 144, 11, 5, 216, 129, 11, 5, 216, 130, 11, 5, 216, 135, 11, 5, 216, + 134, 11, 5, 216, 138, 11, 5, 216, 136, 11, 5, 216, 124, 11, 5, 216, 133, + 11, 5, 216, 128, 11, 5, 216, 125, 11, 5, 216, 126, 11, 5, 216, 119, 11, + 5, 216, 118, 11, 5, 216, 123, 11, 5, 216, 122, 11, 5, 216, 120, 11, 5, + 216, 121, 11, 5, 215, 75, 11, 5, 215, 74, 11, 5, 215, 88, 11, 5, 215, 79, + 11, 5, 215, 84, 11, 5, 215, 83, 11, 5, 215, 86, 11, 5, 215, 85, 11, 5, + 215, 60, 11, 5, 215, 62, 11, 5, 215, 61, 11, 5, 215, 67, 11, 5, 215, 66, + 11, 5, 215, 72, 11, 5, 215, 68, 11, 5, 215, 58, 11, 5, 215, 56, 11, 5, + 215, 65, 11, 5, 215, 59, 11, 5, 196, 187, 11, 5, 196, 186, 11, 5, 196, + 196, 11, 5, 196, 189, 11, 5, 196, 191, 11, 5, 196, 190, 11, 5, 196, 193, + 11, 5, 196, 192, 11, 5, 196, 175, 11, 5, 196, 176, 11, 5, 196, 180, 11, + 5, 196, 179, 11, 5, 196, 185, 11, 5, 196, 183, 11, 5, 196, 152, 11, 5, + 196, 150, 11, 5, 196, 165, 11, 5, 196, 155, 11, 5, 196, 153, 11, 5, 196, + 154, 11, 5, 196, 9, 11, 5, 196, 7, 11, 5, 196, 24, 11, 5, 196, 10, 11, 5, + 196, 18, 11, 5, 196, 17, 11, 5, 196, 21, 11, 5, 196, 19, 11, 5, 195, 190, + 11, 5, 195, 189, 11, 5, 195, 193, 11, 5, 195, 191, 11, 5, 195, 232, 11, + 5, 195, 227, 11, 5, 196, 3, 11, 5, 195, 236, 11, 5, 195, 181, 11, 5, 195, + 177, 11, 5, 195, 217, 11, 5, 195, 188, 11, 5, 195, 184, 11, 5, 195, 185, + 11, 5, 195, 161, 11, 5, 195, 160, 11, 5, 195, 168, 11, 5, 195, 164, 11, + 5, 195, 162, 11, 5, 195, 163, 11, 44, 211, 99, 11, 44, 222, 108, 11, 44, + 224, 54, 11, 44, 215, 79, 11, 44, 240, 239, 11, 44, 205, 47, 11, 44, 233, + 248, 11, 44, 234, 24, 11, 44, 219, 77, 11, 44, 231, 21, 11, 44, 221, 142, + 11, 44, 249, 16, 11, 44, 218, 186, 11, 44, 196, 3, 11, 44, 211, 192, 11, + 44, 231, 15, 11, 44, 203, 94, 11, 44, 234, 122, 11, 44, 194, 247, 11, 44, + 240, 233, 11, 44, 240, 0, 11, 44, 247, 243, 11, 44, 233, 244, 11, 44, + 215, 68, 11, 44, 201, 40, 11, 44, 214, 92, 11, 44, 225, 135, 11, 44, 195, + 6, 11, 44, 211, 170, 11, 44, 231, 234, 11, 44, 196, 9, 11, 44, 197, 215, + 11, 44, 206, 121, 11, 44, 199, 106, 11, 44, 195, 115, 11, 44, 225, 128, + 11, 44, 215, 32, 11, 44, 225, 133, 11, 44, 233, 120, 11, 44, 225, 153, + 11, 44, 197, 34, 11, 44, 237, 200, 11, 44, 206, 137, 11, 44, 222, 102, + 11, 44, 240, 245, 11, 44, 241, 29, 11, 44, 244, 250, 11, 44, 231, 18, 11, + 44, 207, 9, 11, 44, 194, 246, 11, 44, 206, 186, 11, 44, 245, 102, 11, 44, + 194, 216, 11, 44, 217, 185, 11, 44, 224, 208, 222, 51, 1, 249, 144, 222, + 51, 1, 161, 222, 51, 1, 213, 5, 222, 51, 1, 240, 135, 222, 51, 1, 189, + 222, 51, 1, 202, 233, 222, 51, 1, 234, 122, 222, 51, 1, 155, 222, 51, 1, + 224, 145, 222, 51, 1, 225, 213, 222, 51, 1, 247, 173, 222, 51, 1, 247, + 15, 222, 51, 1, 237, 155, 222, 51, 1, 201, 113, 222, 51, 1, 201, 103, + 222, 51, 1, 166, 222, 51, 1, 176, 222, 51, 1, 172, 222, 51, 1, 183, 222, + 51, 1, 195, 74, 222, 51, 1, 195, 115, 222, 51, 1, 217, 70, 222, 51, 1, + 142, 222, 51, 1, 196, 208, 222, 51, 1, 232, 79, 222, 51, 1, 235, 238, + 222, 51, 1, 197, 166, 222, 51, 1, 207, 50, 222, 51, 1, 164, 222, 51, 1, + 233, 229, 222, 51, 1, 63, 222, 51, 1, 251, 244, 222, 51, 1, 69, 222, 51, + 1, 236, 115, 222, 51, 1, 68, 222, 51, 1, 72, 222, 51, 1, 66, 222, 51, 1, + 200, 99, 222, 51, 1, 200, 92, 222, 51, 1, 214, 163, 222, 51, 1, 152, 218, + 61, 202, 122, 222, 51, 1, 152, 218, 0, 212, 116, 222, 51, 1, 152, 218, + 61, 240, 244, 222, 51, 1, 152, 218, 61, 248, 115, 222, 51, 1, 152, 218, + 61, 176, 222, 51, 1, 152, 218, 61, 225, 180, 222, 51, 211, 213, 244, 158, + 222, 51, 211, 213, 234, 216, 204, 226, 54, 5, 237, 53, 54, 5, 237, 49, + 54, 5, 232, 117, 54, 5, 197, 98, 54, 5, 197, 97, 54, 5, 213, 78, 54, 5, + 248, 190, 54, 5, 248, 250, 54, 5, 219, 232, 54, 5, 223, 217, 54, 5, 219, + 109, 54, 5, 234, 60, 54, 5, 235, 181, 54, 5, 199, 113, 54, 5, 203, 48, + 54, 5, 202, 215, 54, 5, 239, 165, 54, 5, 239, 162, 54, 5, 222, 187, 54, + 5, 210, 154, 54, 5, 239, 236, 54, 5, 217, 149, 54, 5, 208, 129, 54, 5, + 206, 253, 54, 5, 195, 85, 54, 5, 195, 64, 54, 5, 247, 48, 54, 5, 225, + 190, 54, 5, 216, 154, 54, 5, 196, 66, 54, 5, 224, 199, 54, 5, 217, 43, + 54, 5, 234, 39, 54, 5, 219, 187, 54, 5, 217, 106, 54, 5, 215, 96, 54, 5, + 68, 54, 5, 226, 85, 54, 5, 232, 70, 54, 5, 232, 40, 54, 5, 197, 70, 54, + 5, 197, 52, 54, 5, 212, 219, 54, 5, 248, 188, 54, 5, 248, 183, 54, 5, + 219, 225, 54, 5, 223, 214, 54, 5, 219, 106, 54, 5, 234, 56, 54, 5, 235, + 152, 54, 5, 199, 34, 54, 5, 202, 122, 54, 5, 202, 195, 54, 5, 239, 157, + 54, 5, 239, 161, 54, 5, 222, 108, 54, 5, 210, 72, 54, 5, 239, 151, 54, 5, + 217, 143, 54, 5, 206, 112, 54, 5, 206, 223, 54, 5, 195, 33, 54, 5, 195, + 60, 54, 5, 245, 10, 54, 5, 225, 171, 54, 5, 216, 147, 54, 5, 196, 24, 54, + 5, 224, 100, 54, 5, 217, 35, 54, 5, 233, 191, 54, 5, 219, 77, 54, 5, 216, + 222, 54, 5, 215, 88, 54, 5, 63, 54, 5, 251, 105, 54, 5, 217, 65, 54, 5, + 142, 54, 5, 232, 211, 54, 5, 197, 166, 54, 5, 197, 146, 54, 5, 161, 54, + 5, 248, 196, 54, 5, 249, 144, 54, 5, 219, 240, 54, 5, 223, 222, 54, 5, + 223, 220, 54, 5, 219, 113, 54, 5, 234, 64, 54, 5, 235, 238, 54, 5, 199, + 152, 54, 5, 189, 54, 5, 202, 233, 54, 5, 239, 175, 54, 5, 239, 164, 54, + 5, 172, 54, 5, 169, 54, 5, 240, 135, 54, 5, 217, 158, 54, 5, 183, 54, 5, + 207, 50, 54, 5, 195, 115, 54, 5, 195, 74, 54, 5, 247, 173, 54, 5, 225, + 213, 54, 5, 216, 163, 54, 5, 164, 54, 5, 155, 54, 5, 225, 16, 54, 5, 217, + 49, 54, 5, 234, 122, 54, 5, 166, 54, 5, 176, 54, 5, 215, 108, 54, 5, 214, + 101, 54, 5, 214, 96, 54, 5, 231, 165, 54, 5, 197, 15, 54, 5, 197, 11, 54, + 5, 212, 90, 54, 5, 248, 186, 54, 5, 248, 102, 54, 5, 219, 220, 54, 5, + 223, 212, 54, 5, 219, 102, 54, 5, 234, 52, 54, 5, 235, 39, 54, 5, 198, + 233, 54, 5, 201, 247, 54, 5, 202, 164, 54, 5, 239, 154, 54, 5, 239, 159, + 54, 5, 221, 228, 54, 5, 209, 206, 54, 5, 239, 2, 54, 5, 217, 130, 54, 5, + 205, 171, 54, 5, 206, 190, 54, 5, 195, 8, 54, 5, 195, 55, 54, 5, 241, + 116, 54, 5, 225, 118, 54, 5, 216, 137, 54, 5, 195, 237, 54, 5, 223, 241, + 54, 5, 217, 33, 54, 5, 233, 131, 54, 5, 218, 194, 54, 5, 216, 32, 54, 5, + 215, 69, 54, 5, 66, 54, 5, 200, 72, 54, 5, 231, 74, 54, 5, 231, 58, 54, + 5, 196, 243, 54, 5, 196, 236, 54, 5, 211, 226, 54, 5, 248, 185, 54, 5, + 248, 20, 54, 5, 219, 219, 54, 5, 223, 210, 54, 5, 219, 101, 54, 5, 234, + 51, 54, 5, 234, 222, 54, 5, 197, 220, 54, 5, 201, 40, 54, 5, 202, 142, + 54, 5, 239, 152, 54, 5, 239, 158, 54, 5, 221, 190, 54, 5, 209, 140, 54, + 5, 237, 200, 54, 5, 217, 125, 54, 5, 204, 172, 54, 5, 206, 151, 54, 5, + 194, 255, 54, 5, 195, 51, 54, 5, 241, 40, 54, 5, 225, 109, 54, 5, 216, + 133, 54, 5, 195, 217, 54, 5, 223, 186, 54, 5, 217, 32, 54, 5, 233, 75, + 54, 5, 218, 144, 54, 5, 215, 185, 54, 5, 215, 65, 54, 5, 72, 54, 5, 214, + 118, 54, 5, 216, 247, 54, 5, 231, 192, 54, 5, 231, 168, 54, 5, 197, 34, + 54, 5, 197, 16, 54, 5, 212, 116, 54, 5, 248, 187, 54, 5, 248, 115, 54, 5, + 219, 221, 54, 5, 223, 213, 54, 5, 219, 104, 54, 5, 234, 54, 54, 5, 234, + 53, 54, 5, 235, 50, 54, 5, 198, 248, 54, 5, 149, 54, 5, 202, 169, 54, 5, + 239, 155, 54, 5, 239, 160, 54, 5, 222, 6, 54, 5, 209, 232, 54, 5, 239, + 27, 54, 5, 217, 134, 54, 5, 205, 200, 54, 5, 206, 198, 54, 5, 195, 11, + 54, 5, 195, 57, 54, 5, 244, 181, 54, 5, 225, 128, 54, 5, 216, 138, 54, 5, + 196, 3, 54, 5, 224, 10, 54, 5, 217, 34, 54, 5, 233, 143, 54, 5, 218, 250, + 54, 5, 216, 49, 54, 5, 215, 72, 54, 5, 69, 54, 5, 236, 229, 54, 5, 217, + 54, 54, 5, 232, 146, 54, 5, 232, 100, 54, 5, 197, 109, 54, 5, 197, 92, + 54, 5, 213, 91, 54, 5, 248, 191, 54, 5, 249, 8, 54, 5, 219, 233, 54, 5, + 223, 218, 54, 5, 223, 216, 54, 5, 219, 110, 54, 5, 234, 61, 54, 5, 234, + 59, 54, 5, 235, 188, 54, 5, 199, 118, 54, 5, 203, 68, 54, 5, 202, 217, + 54, 5, 239, 166, 54, 5, 239, 163, 54, 5, 222, 196, 54, 5, 210, 182, 54, + 5, 239, 251, 54, 5, 217, 150, 54, 5, 208, 147, 54, 5, 206, 255, 54, 5, + 195, 88, 54, 5, 195, 65, 54, 5, 247, 56, 54, 5, 225, 192, 54, 5, 216, + 156, 54, 5, 196, 69, 54, 5, 224, 208, 54, 5, 217, 44, 54, 5, 217, 40, 54, + 5, 234, 47, 54, 5, 234, 33, 54, 5, 219, 206, 54, 5, 217, 117, 54, 5, 215, + 97, 54, 5, 217, 72, 54, 5, 222, 149, 54, 244, 158, 54, 234, 216, 204, + 226, 54, 211, 78, 78, 54, 5, 217, 133, 235, 238, 54, 5, 217, 133, 155, + 54, 5, 217, 133, 205, 171, 54, 16, 235, 177, 54, 16, 224, 197, 54, 16, + 202, 72, 54, 16, 216, 189, 54, 16, 249, 86, 54, 16, 235, 237, 54, 16, + 203, 162, 54, 16, 240, 85, 54, 16, 239, 1, 54, 16, 223, 163, 54, 16, 201, + 251, 54, 16, 239, 26, 54, 16, 225, 119, 54, 17, 195, 79, 54, 17, 100, 54, + 17, 102, 54, 17, 134, 54, 17, 136, 54, 17, 146, 54, 17, 167, 54, 17, 178, + 54, 17, 171, 54, 17, 182, 54, 5, 217, 133, 166, 54, 5, 217, 133, 239, 27, + 40, 6, 1, 195, 83, 40, 4, 1, 195, 83, 40, 6, 1, 237, 150, 40, 4, 1, 237, + 150, 40, 6, 1, 210, 89, 237, 152, 40, 4, 1, 210, 89, 237, 152, 40, 6, 1, + 226, 6, 40, 4, 1, 226, 6, 40, 6, 1, 239, 44, 40, 4, 1, 239, 44, 40, 6, 1, + 218, 202, 200, 87, 40, 4, 1, 218, 202, 200, 87, 40, 6, 1, 248, 34, 214, + 123, 40, 4, 1, 248, 34, 214, 123, 40, 6, 1, 217, 84, 196, 51, 40, 4, 1, + 217, 84, 196, 51, 40, 6, 1, 196, 48, 3, 249, 138, 196, 51, 40, 4, 1, 196, + 48, 3, 249, 138, 196, 51, 40, 6, 1, 226, 4, 196, 84, 40, 4, 1, 226, 4, + 196, 84, 40, 6, 1, 210, 89, 195, 217, 40, 4, 1, 210, 89, 195, 217, 40, 6, + 1, 226, 4, 63, 40, 4, 1, 226, 4, 63, 40, 6, 1, 244, 202, 222, 46, 195, + 182, 40, 4, 1, 244, 202, 222, 46, 195, 182, 40, 6, 1, 248, 127, 195, 182, + 40, 4, 1, 248, 127, 195, 182, 40, 6, 1, 226, 4, 244, 202, 222, 46, 195, + 182, 40, 4, 1, 226, 4, 244, 202, 222, 46, 195, 182, 40, 6, 1, 196, 5, 40, + 4, 1, 196, 5, 40, 6, 1, 210, 89, 201, 107, 40, 4, 1, 210, 89, 201, 107, + 40, 6, 1, 205, 186, 239, 251, 40, 4, 1, 205, 186, 239, 251, 40, 6, 1, + 205, 186, 237, 6, 40, 4, 1, 205, 186, 237, 6, 40, 6, 1, 205, 186, 236, + 240, 40, 4, 1, 205, 186, 236, 240, 40, 6, 1, 218, 206, 72, 40, 4, 1, 218, + 206, 72, 40, 6, 1, 248, 159, 72, 40, 4, 1, 248, 159, 72, 40, 6, 1, 52, + 218, 206, 72, 40, 4, 1, 52, 218, 206, 72, 40, 1, 218, 120, 72, 38, 40, + 197, 201, 38, 40, 203, 24, 219, 26, 55, 38, 40, 231, 57, 219, 26, 55, 38, + 40, 202, 159, 219, 26, 55, 205, 246, 250, 178, 38, 40, 1, 200, 84, 226, + 146, 38, 40, 1, 68, 38, 40, 1, 196, 24, 38, 40, 1, 66, 38, 40, 1, 232, + 172, 55, 38, 40, 1, 196, 47, 38, 40, 1, 205, 186, 55, 38, 40, 1, 214, + 123, 38, 40, 224, 220, 38, 40, 213, 98, 40, 224, 220, 40, 213, 98, 40, 6, + 1, 237, 165, 40, 4, 1, 237, 165, 40, 6, 1, 237, 141, 40, 4, 1, 237, 141, + 40, 6, 1, 195, 41, 40, 4, 1, 195, 41, 40, 6, 1, 247, 72, 40, 4, 1, 247, + 72, 40, 6, 1, 237, 137, 40, 4, 1, 237, 137, 40, 6, 1, 203, 69, 3, 112, + 122, 40, 4, 1, 203, 69, 3, 112, 122, 40, 6, 1, 200, 243, 40, 4, 1, 200, + 243, 40, 6, 1, 201, 82, 40, 4, 1, 201, 82, 40, 6, 1, 201, 87, 40, 4, 1, + 201, 87, 40, 6, 1, 203, 74, 40, 4, 1, 203, 74, 40, 6, 1, 231, 39, 40, 4, + 1, 231, 39, 40, 6, 1, 206, 127, 40, 4, 1, 206, 127, 40, 6, 1, 52, 72, 40, + 4, 1, 52, 72, 40, 6, 1, 241, 58, 72, 40, 4, 1, 241, 58, 72, 73, 1, 40, + 232, 172, 55, 73, 1, 40, 205, 186, 55, 38, 40, 1, 237, 46, 38, 40, 1, + 226, 4, 69, 25, 1, 63, 25, 1, 155, 25, 1, 66, 25, 1, 223, 186, 25, 1, + 237, 53, 25, 1, 210, 154, 25, 1, 203, 145, 25, 1, 72, 25, 1, 215, 88, 25, + 1, 68, 25, 1, 172, 25, 1, 161, 25, 1, 210, 9, 25, 1, 210, 57, 25, 1, 222, + 186, 25, 1, 219, 186, 25, 1, 203, 162, 25, 1, 217, 156, 25, 1, 216, 161, + 25, 1, 221, 135, 25, 1, 204, 74, 25, 1, 218, 144, 25, 1, 206, 218, 25, 1, + 206, 112, 25, 1, 206, 228, 25, 1, 207, 72, 25, 1, 223, 105, 25, 1, 224, + 171, 25, 1, 215, 153, 25, 1, 215, 185, 25, 1, 216, 132, 25, 1, 195, 234, + 25, 1, 206, 151, 25, 1, 195, 186, 25, 1, 164, 25, 1, 215, 222, 25, 1, + 224, 157, 25, 1, 213, 9, 25, 1, 216, 154, 25, 1, 215, 202, 25, 1, 211, + 217, 25, 1, 196, 240, 25, 1, 213, 78, 25, 1, 235, 181, 25, 1, 209, 140, + 25, 1, 221, 190, 25, 1, 219, 77, 25, 1, 216, 222, 25, 1, 210, 91, 25, 1, + 210, 228, 25, 1, 224, 181, 25, 1, 216, 254, 25, 1, 217, 49, 25, 1, 217, + 70, 25, 1, 206, 198, 25, 1, 211, 222, 25, 1, 234, 222, 25, 1, 235, 43, + 25, 1, 197, 166, 25, 1, 176, 25, 1, 222, 108, 25, 1, 212, 219, 25, 1, + 221, 220, 25, 1, 224, 10, 25, 1, 219, 230, 25, 1, 210, 126, 25, 1, 219, + 163, 25, 1, 166, 25, 1, 202, 122, 25, 1, 224, 100, 25, 1, 218, 250, 25, + 1, 219, 238, 25, 1, 203, 1, 25, 1, 223, 222, 25, 1, 203, 23, 25, 1, 215, + 188, 25, 1, 208, 227, 25, 1, 235, 234, 25, 1, 223, 225, 25, 1, 224, 1, + 25, 38, 117, 223, 234, 25, 38, 117, 201, 25, 25, 216, 160, 25, 234, 216, + 204, 226, 25, 244, 167, 25, 244, 158, 25, 207, 105, 25, 211, 78, 78, 73, + 1, 245, 60, 152, 196, 13, 212, 170, 73, 1, 245, 60, 152, 196, 96, 212, + 170, 73, 1, 245, 60, 152, 196, 13, 207, 23, 73, 1, 245, 60, 152, 196, 96, + 207, 23, 73, 1, 245, 60, 152, 196, 13, 211, 96, 73, 1, 245, 60, 152, 196, + 96, 211, 96, 73, 1, 245, 60, 152, 196, 13, 209, 140, 73, 1, 245, 60, 152, + 196, 96, 209, 140, 73, 1, 236, 73, 237, 249, 152, 154, 73, 1, 130, 237, + 249, 152, 154, 73, 1, 219, 64, 237, 249, 152, 154, 73, 1, 126, 237, 249, + 152, 154, 73, 1, 236, 72, 237, 249, 152, 154, 73, 1, 236, 73, 237, 249, + 222, 175, 152, 154, 73, 1, 130, 237, 249, 222, 175, 152, 154, 73, 1, 219, + 64, 237, 249, 222, 175, 152, 154, 73, 1, 126, 237, 249, 222, 175, 152, + 154, 73, 1, 236, 72, 237, 249, 222, 175, 152, 154, 73, 1, 236, 73, 222, + 175, 152, 154, 73, 1, 130, 222, 175, 152, 154, 73, 1, 219, 64, 222, 175, + 152, 154, 73, 1, 126, 222, 175, 152, 154, 73, 1, 236, 72, 222, 175, 152, + 154, 73, 1, 76, 83, 154, 73, 1, 76, 205, 248, 73, 1, 76, 231, 154, 154, + 73, 1, 221, 202, 53, 241, 101, 251, 89, 73, 1, 210, 214, 124, 51, 73, 1, + 210, 214, 135, 51, 73, 1, 210, 214, 236, 89, 78, 73, 1, 210, 214, 226, + 16, 236, 89, 78, 73, 1, 126, 226, 16, 236, 89, 78, 73, 1, 204, 206, 26, + 130, 202, 11, 73, 1, 204, 206, 26, 126, 202, 11, 8, 6, 1, 237, 41, 251, + 163, 8, 4, 1, 237, 41, 251, 163, 8, 6, 1, 237, 41, 251, 193, 8, 4, 1, + 237, 41, 251, 193, 8, 6, 1, 232, 98, 8, 4, 1, 232, 98, 8, 6, 1, 200, 187, + 8, 4, 1, 200, 187, 8, 6, 1, 201, 184, 8, 4, 1, 201, 184, 8, 6, 1, 241, + 37, 8, 4, 1, 241, 37, 8, 6, 1, 241, 38, 3, 244, 158, 8, 4, 1, 241, 38, 3, + 244, 158, 8, 1, 4, 6, 236, 48, 8, 1, 4, 6, 209, 80, 8, 6, 1, 252, 167, 8, + 4, 1, 252, 167, 8, 6, 1, 251, 48, 8, 4, 1, 251, 48, 8, 6, 1, 250, 149, 8, + 4, 1, 250, 149, 8, 6, 1, 250, 132, 8, 4, 1, 250, 132, 8, 6, 1, 250, 133, + 3, 231, 154, 154, 8, 4, 1, 250, 133, 3, 231, 154, 154, 8, 6, 1, 250, 121, + 8, 4, 1, 250, 121, 8, 6, 1, 210, 89, 247, 207, 3, 238, 252, 8, 4, 1, 210, + 89, 247, 207, 3, 238, 252, 8, 6, 1, 225, 80, 3, 106, 8, 4, 1, 225, 80, 3, + 106, 8, 6, 1, 225, 80, 3, 239, 146, 106, 8, 4, 1, 225, 80, 3, 239, 146, + 106, 8, 6, 1, 225, 80, 3, 204, 196, 26, 239, 146, 106, 8, 4, 1, 225, 80, + 3, 204, 196, 26, 239, 146, 106, 8, 6, 1, 248, 32, 159, 8, 4, 1, 248, 32, + 159, 8, 6, 1, 223, 99, 3, 130, 106, 8, 4, 1, 223, 99, 3, 130, 106, 8, 6, + 1, 177, 3, 181, 204, 196, 214, 19, 8, 4, 1, 177, 3, 181, 204, 196, 214, + 19, 8, 6, 1, 177, 3, 221, 224, 8, 4, 1, 177, 3, 221, 224, 8, 6, 1, 214, + 101, 8, 4, 1, 214, 101, 8, 6, 1, 214, 3, 3, 204, 196, 202, 145, 239, 194, + 8, 4, 1, 214, 3, 3, 204, 196, 202, 145, 239, 194, 8, 6, 1, 214, 3, 3, + 235, 63, 8, 4, 1, 214, 3, 3, 235, 63, 8, 6, 1, 214, 3, 3, 205, 86, 203, + 135, 8, 4, 1, 214, 3, 3, 205, 86, 203, 135, 8, 6, 1, 211, 167, 3, 204, + 196, 202, 145, 239, 194, 8, 4, 1, 211, 167, 3, 204, 196, 202, 145, 239, + 194, 8, 6, 1, 211, 167, 3, 239, 146, 106, 8, 4, 1, 211, 167, 3, 239, 146, + 106, 8, 6, 1, 211, 31, 209, 188, 8, 4, 1, 211, 31, 209, 188, 8, 6, 1, + 209, 121, 209, 188, 8, 4, 1, 209, 121, 209, 188, 8, 6, 1, 199, 231, 3, + 239, 146, 106, 8, 4, 1, 199, 231, 3, 239, 146, 106, 8, 6, 1, 197, 207, 8, + 4, 1, 197, 207, 8, 6, 1, 199, 0, 195, 158, 8, 4, 1, 199, 0, 195, 158, 8, + 6, 1, 202, 163, 3, 106, 8, 4, 1, 202, 163, 3, 106, 8, 6, 1, 202, 163, 3, + 204, 196, 202, 145, 239, 194, 8, 4, 1, 202, 163, 3, 204, 196, 202, 145, + 239, 194, 8, 6, 1, 199, 107, 8, 4, 1, 199, 107, 8, 6, 1, 236, 127, 8, 4, + 1, 236, 127, 8, 6, 1, 225, 247, 8, 4, 1, 225, 247, 8, 6, 1, 241, 154, 8, + 4, 1, 241, 154, 73, 1, 200, 4, 8, 4, 1, 237, 189, 8, 4, 1, 221, 173, 8, + 4, 1, 218, 113, 8, 4, 1, 215, 144, 8, 4, 1, 209, 120, 8, 1, 4, 6, 209, + 120, 8, 4, 1, 201, 22, 8, 4, 1, 200, 79, 8, 6, 1, 226, 38, 240, 230, 8, + 4, 1, 226, 38, 240, 230, 8, 6, 1, 226, 38, 236, 48, 8, 4, 1, 226, 38, + 236, 48, 8, 6, 1, 226, 38, 234, 189, 8, 6, 1, 163, 226, 38, 234, 189, 8, + 4, 1, 163, 226, 38, 234, 189, 8, 6, 1, 163, 159, 8, 4, 1, 163, 159, 8, 6, + 1, 226, 38, 144, 8, 4, 1, 226, 38, 144, 8, 6, 1, 226, 38, 209, 80, 8, 4, + 1, 226, 38, 209, 80, 8, 6, 1, 226, 38, 203, 216, 8, 4, 1, 226, 38, 203, + 216, 73, 1, 126, 244, 240, 252, 21, 73, 1, 244, 167, 73, 1, 206, 182, + 236, 171, 55, 8, 6, 1, 208, 231, 8, 4, 1, 208, 231, 8, 6, 1, 163, 233, + 14, 8, 4, 1, 223, 99, 3, 210, 95, 231, 164, 26, 248, 224, 8, 1, 206, 55, + 238, 252, 8, 6, 1, 218, 55, 3, 239, 194, 8, 4, 1, 218, 55, 3, 239, 194, + 8, 6, 1, 247, 207, 3, 154, 8, 4, 1, 247, 207, 3, 154, 8, 4, 1, 247, 207, + 3, 213, 214, 122, 8, 4, 1, 233, 15, 3, 213, 214, 122, 8, 6, 1, 74, 3, + 235, 63, 8, 4, 1, 74, 3, 235, 63, 8, 6, 1, 236, 49, 3, 106, 8, 4, 1, 236, + 49, 3, 106, 8, 6, 1, 198, 240, 251, 244, 8, 4, 1, 198, 240, 251, 244, 8, + 6, 1, 198, 240, 214, 163, 8, 4, 1, 198, 240, 214, 163, 8, 6, 1, 198, 240, + 200, 99, 8, 4, 1, 198, 240, 200, 99, 8, 6, 1, 234, 190, 3, 214, 181, 106, + 8, 4, 1, 234, 190, 3, 214, 181, 106, 8, 6, 1, 225, 80, 3, 214, 181, 106, + 8, 4, 1, 225, 80, 3, 214, 181, 106, 8, 6, 1, 218, 55, 3, 214, 181, 106, + 8, 4, 1, 218, 55, 3, 214, 181, 106, 8, 6, 1, 211, 31, 3, 214, 181, 106, + 8, 4, 1, 211, 31, 3, 214, 181, 106, 8, 6, 1, 209, 81, 3, 214, 181, 106, + 8, 4, 1, 209, 81, 3, 214, 181, 106, 8, 6, 1, 233, 15, 3, 122, 8, 6, 1, + 210, 89, 192, 69, 8, 6, 1, 145, 234, 189, 8, 6, 1, 223, 99, 3, 248, 224, + 8, 6, 1, 4, 6, 68, 8, 1, 4, 6, 211, 166, 8, 6, 1, 163, 225, 79, 8, 6, 1, + 163, 203, 216, 8, 6, 1, 225, 217, 3, 241, 56, 8, 6, 1, 245, 74, 8, 6, 1, + 248, 205, 8, 4, 1, 248, 205, 8, 6, 1, 214, 123, 8, 4, 1, 214, 123, 8, 6, + 1, 118, 3, 106, 8, 4, 1, 118, 3, 106, 8, 6, 1, 233, 151, 63, 8, 4, 1, + 233, 151, 63, 8, 6, 1, 233, 151, 68, 8, 4, 1, 233, 151, 68, 8, 6, 1, 233, + 151, 66, 8, 4, 1, 233, 151, 66, 8, 6, 1, 251, 86, 197, 199, 8, 4, 1, 251, + 86, 197, 199, 8, 6, 1, 247, 207, 3, 213, 214, 122, 8, 6, 1, 209, 81, 3, + 122, 8, 6, 1, 195, 159, 3, 213, 214, 122, 8, 236, 176, 1, 206, 96, 68, + 73, 1, 6, 233, 15, 3, 106, 73, 1, 4, 33, 214, 163, 8, 1, 4, 6, 163, 221, + 135, 8, 236, 176, 1, 210, 89, 236, 48, 8, 236, 176, 1, 210, 89, 214, 2, + 8, 236, 176, 1, 226, 16, 221, 135, 8, 236, 176, 1, 230, 248, 221, 230, 8, + 236, 176, 1, 250, 250, 221, 135, 204, 41, 217, 231, 1, 63, 204, 41, 217, + 231, 1, 68, 204, 41, 217, 231, 2, 237, 167, 204, 41, 217, 231, 1, 66, + 204, 41, 217, 231, 1, 69, 204, 41, 217, 231, 1, 72, 204, 41, 217, 231, 2, + 232, 166, 204, 41, 217, 231, 1, 224, 10, 204, 41, 217, 231, 1, 224, 116, + 204, 41, 217, 231, 1, 233, 143, 204, 41, 217, 231, 1, 233, 201, 204, 41, + 217, 231, 2, 251, 50, 204, 41, 217, 231, 1, 244, 181, 204, 41, 217, 231, + 1, 245, 48, 204, 41, 217, 231, 1, 225, 128, 204, 41, 217, 231, 1, 225, + 173, 204, 41, 217, 231, 1, 201, 55, 204, 41, 217, 231, 1, 201, 61, 204, + 41, 217, 231, 1, 240, 10, 204, 41, 217, 231, 1, 240, 19, 204, 41, 217, + 231, 1, 149, 204, 41, 217, 231, 1, 202, 169, 204, 41, 217, 231, 1, 239, + 27, 204, 41, 217, 231, 1, 239, 155, 204, 41, 217, 231, 1, 216, 49, 204, + 41, 217, 231, 1, 212, 116, 204, 41, 217, 231, 1, 212, 233, 204, 41, 217, + 231, 1, 248, 115, 204, 41, 217, 231, 1, 248, 187, 204, 41, 217, 231, 1, + 218, 250, 204, 41, 217, 231, 1, 209, 232, 204, 41, 217, 231, 1, 222, 6, + 204, 41, 217, 231, 1, 209, 167, 204, 41, 217, 231, 1, 205, 200, 204, 41, + 217, 231, 1, 231, 192, 204, 41, 217, 231, 18, 2, 63, 204, 41, 217, 231, + 18, 2, 68, 204, 41, 217, 231, 18, 2, 66, 204, 41, 217, 231, 18, 2, 69, + 204, 41, 217, 231, 18, 2, 214, 101, 204, 41, 217, 231, 212, 111, 220, 27, + 204, 41, 217, 231, 212, 111, 220, 26, 204, 41, 217, 231, 212, 111, 220, + 25, 204, 41, 217, 231, 212, 111, 220, 24, 173, 226, 69, 191, 97, 211, 86, + 173, 226, 69, 191, 97, 232, 224, 173, 226, 69, 191, 115, 211, 84, 173, + 226, 69, 191, 97, 206, 21, 173, 226, 69, 191, 97, 237, 25, 173, 226, 69, + 191, 115, 206, 18, 173, 226, 69, 211, 87, 78, 173, 226, 69, 212, 147, 78, + 173, 226, 69, 209, 108, 78, 173, 226, 69, 211, 88, 78, 213, 1, 1, 155, + 213, 1, 1, 224, 145, 213, 1, 1, 234, 122, 213, 1, 1, 217, 70, 213, 1, 1, + 247, 173, 213, 1, 1, 247, 15, 213, 1, 1, 225, 213, 213, 1, 1, 215, 108, + 213, 1, 1, 189, 213, 1, 1, 202, 233, 213, 1, 1, 240, 135, 213, 1, 1, 176, + 213, 1, 1, 161, 213, 1, 1, 213, 5, 213, 1, 1, 249, 144, 213, 1, 1, 166, + 213, 1, 1, 201, 113, 213, 1, 1, 201, 103, 213, 1, 1, 237, 155, 213, 1, 1, + 197, 166, 213, 1, 1, 195, 74, 213, 1, 1, 195, 115, 213, 1, 1, 4, 63, 213, + 1, 1, 164, 213, 1, 1, 169, 213, 1, 1, 172, 213, 1, 1, 207, 50, 213, 1, 1, + 183, 213, 1, 1, 142, 213, 1, 1, 63, 213, 1, 1, 68, 213, 1, 1, 66, 213, 1, + 1, 69, 213, 1, 1, 72, 213, 1, 1, 211, 158, 213, 1, 1, 196, 208, 213, 1, + 1, 235, 238, 213, 1, 1, 234, 9, 213, 1, 1, 237, 53, 213, 1, 204, 152, 1, + 197, 166, 213, 1, 204, 152, 1, 164, 213, 1, 1, 201, 78, 213, 1, 1, 201, + 66, 213, 1, 1, 240, 40, 213, 1, 1, 216, 85, 213, 1, 1, 251, 130, 164, + 213, 1, 1, 198, 243, 207, 50, 213, 1, 1, 198, 244, 142, 213, 1, 1, 250, + 185, 235, 238, 213, 1, 204, 152, 1, 169, 213, 1, 204, 98, 1, 169, 213, 1, + 1, 247, 132, 213, 1, 206, 62, 232, 137, 78, 213, 1, 52, 232, 137, 78, + 213, 1, 117, 207, 42, 213, 1, 117, 52, 207, 42, 208, 188, 2, 251, 50, + 208, 188, 2, 199, 2, 208, 188, 1, 63, 208, 188, 1, 252, 167, 208, 188, 1, + 68, 208, 188, 1, 226, 119, 208, 188, 1, 66, 208, 188, 1, 199, 245, 208, + 188, 1, 110, 144, 208, 188, 1, 110, 209, 182, 208, 188, 1, 110, 159, 208, + 188, 1, 110, 222, 37, 208, 188, 1, 69, 208, 188, 1, 237, 53, 208, 188, 1, + 251, 199, 208, 188, 1, 72, 208, 188, 1, 214, 101, 208, 188, 1, 250, 149, + 208, 188, 1, 155, 208, 188, 1, 224, 145, 208, 188, 1, 234, 122, 208, 188, + 1, 233, 229, 208, 188, 1, 217, 70, 208, 188, 1, 247, 173, 208, 188, 1, + 247, 15, 208, 188, 1, 225, 213, 208, 188, 1, 225, 179, 208, 188, 1, 215, + 108, 208, 188, 1, 201, 78, 208, 188, 1, 201, 66, 208, 188, 1, 240, 40, + 208, 188, 1, 240, 24, 208, 188, 1, 216, 85, 208, 188, 1, 189, 208, 188, + 1, 202, 233, 208, 188, 1, 240, 135, 208, 188, 1, 239, 175, 208, 188, 1, + 176, 208, 188, 1, 161, 208, 188, 1, 213, 5, 208, 188, 1, 249, 144, 208, + 188, 1, 248, 196, 208, 188, 1, 166, 208, 188, 1, 164, 208, 188, 1, 169, + 208, 188, 1, 172, 208, 188, 1, 199, 152, 208, 188, 1, 207, 50, 208, 188, + 1, 205, 80, 208, 188, 1, 183, 208, 188, 1, 142, 208, 188, 1, 222, 36, + 208, 188, 108, 2, 232, 243, 208, 188, 18, 2, 252, 167, 208, 188, 18, 2, + 68, 208, 188, 18, 2, 226, 119, 208, 188, 18, 2, 66, 208, 188, 18, 2, 199, + 245, 208, 188, 18, 2, 110, 144, 208, 188, 18, 2, 110, 209, 182, 208, 188, + 18, 2, 110, 159, 208, 188, 18, 2, 110, 222, 37, 208, 188, 18, 2, 69, 208, + 188, 18, 2, 237, 53, 208, 188, 18, 2, 251, 199, 208, 188, 18, 2, 72, 208, + 188, 18, 2, 214, 101, 208, 188, 18, 2, 250, 149, 208, 188, 2, 199, 7, + 208, 188, 2, 247, 132, 208, 188, 240, 87, 208, 188, 52, 240, 87, 208, + 188, 17, 195, 79, 208, 188, 17, 100, 208, 188, 17, 102, 208, 188, 17, + 134, 208, 188, 17, 136, 208, 188, 17, 146, 208, 188, 17, 167, 208, 188, + 17, 178, 208, 188, 17, 171, 208, 188, 17, 182, 38, 101, 17, 195, 79, 38, + 101, 17, 100, 38, 101, 17, 102, 38, 101, 17, 134, 38, 101, 17, 136, 38, + 101, 17, 146, 38, 101, 17, 167, 38, 101, 17, 178, 38, 101, 17, 171, 38, + 101, 17, 182, 38, 101, 1, 63, 38, 101, 1, 66, 38, 101, 1, 155, 38, 101, + 1, 176, 38, 101, 1, 161, 38, 101, 1, 169, 38, 101, 1, 199, 34, 38, 101, + 2, 250, 131, 101, 2, 205, 147, 247, 132, 101, 2, 247, 133, 199, 7, 101, + 2, 52, 247, 133, 199, 7, 101, 2, 247, 133, 102, 101, 2, 247, 133, 134, + 101, 2, 247, 133, 250, 131, 101, 2, 211, 195, 101, 234, 86, 235, 133, + 101, 247, 109, 101, 232, 129, 101, 2, 206, 100, 101, 225, 205, 214, 126, + 101, 1, 250, 121, 101, 18, 2, 250, 121, 224, 214, 222, 109, 17, 195, 79, + 224, 214, 222, 109, 17, 100, 224, 214, 222, 109, 17, 102, 224, 214, 222, + 109, 17, 134, 224, 214, 222, 109, 17, 136, 224, 214, 222, 109, 17, 146, + 224, 214, 222, 109, 17, 167, 224, 214, 222, 109, 17, 178, 224, 214, 222, + 109, 17, 171, 224, 214, 222, 109, 17, 182, 224, 214, 222, 109, 1, 155, + 224, 214, 222, 109, 1, 224, 145, 224, 214, 222, 109, 1, 234, 122, 224, + 214, 222, 109, 1, 217, 70, 224, 214, 222, 109, 1, 183, 224, 214, 222, + 109, 1, 207, 50, 224, 214, 222, 109, 1, 195, 115, 224, 214, 222, 109, 1, + 215, 108, 224, 214, 222, 109, 1, 189, 224, 214, 222, 109, 1, 231, 78, + 224, 214, 222, 109, 1, 176, 224, 214, 222, 109, 1, 161, 224, 214, 222, + 109, 1, 213, 5, 224, 214, 222, 109, 1, 166, 224, 214, 222, 109, 1, 240, + 135, 224, 214, 222, 109, 1, 249, 144, 224, 214, 222, 109, 1, 169, 224, + 214, 222, 109, 1, 164, 224, 214, 222, 109, 1, 172, 224, 214, 222, 109, 1, + 197, 166, 224, 214, 222, 109, 1, 202, 233, 224, 214, 222, 109, 1, 142, + 224, 214, 222, 109, 1, 199, 152, 224, 214, 222, 109, 1, 247, 173, 224, + 214, 222, 109, 1, 63, 224, 214, 222, 109, 1, 214, 163, 224, 214, 222, + 109, 1, 68, 224, 214, 222, 109, 1, 214, 101, 224, 214, 222, 109, 18, 200, + 99, 224, 214, 222, 109, 18, 69, 224, 214, 222, 109, 18, 66, 224, 214, + 222, 109, 18, 237, 53, 224, 214, 222, 109, 18, 72, 224, 214, 222, 109, + 152, 212, 132, 224, 214, 222, 109, 152, 247, 148, 224, 214, 222, 109, + 152, 247, 149, 212, 132, 224, 214, 222, 109, 2, 240, 249, 224, 214, 222, + 109, 2, 206, 120, 210, 138, 1, 155, 210, 138, 1, 234, 122, 210, 138, 1, + 217, 70, 210, 138, 1, 189, 210, 138, 1, 240, 135, 210, 138, 1, 176, 210, + 138, 1, 161, 210, 138, 1, 249, 144, 210, 138, 1, 166, 210, 138, 1, 247, + 173, 210, 138, 1, 225, 213, 210, 138, 1, 215, 108, 210, 138, 1, 183, 210, + 138, 1, 169, 210, 138, 1, 172, 210, 138, 1, 164, 210, 138, 1, 197, 166, + 210, 138, 1, 142, 210, 138, 1, 219, 240, 210, 138, 1, 217, 49, 210, 138, + 1, 217, 158, 210, 138, 1, 215, 73, 210, 138, 1, 63, 210, 138, 18, 2, 68, + 210, 138, 18, 2, 66, 210, 138, 18, 2, 69, 210, 138, 18, 2, 251, 199, 210, + 138, 18, 2, 72, 210, 138, 18, 2, 250, 149, 210, 138, 18, 2, 236, 115, + 210, 138, 18, 2, 237, 81, 210, 138, 108, 2, 217, 72, 210, 138, 108, 2, + 218, 54, 210, 138, 108, 2, 144, 210, 138, 108, 2, 233, 14, 210, 138, 199, + 7, 210, 138, 208, 133, 78, 29, 137, 202, 93, 29, 137, 202, 92, 29, 137, + 202, 90, 29, 137, 202, 95, 29, 137, 210, 49, 29, 137, 210, 33, 29, 137, + 210, 28, 29, 137, 210, 30, 29, 137, 210, 46, 29, 137, 210, 39, 29, 137, + 210, 32, 29, 137, 210, 51, 29, 137, 210, 34, 29, 137, 210, 53, 29, 137, + 210, 50, 29, 137, 219, 51, 29, 137, 219, 42, 29, 137, 219, 45, 29, 137, + 212, 190, 29, 137, 212, 201, 29, 137, 212, 202, 29, 137, 205, 64, 29, + 137, 226, 132, 29, 137, 226, 139, 29, 137, 205, 75, 29, 137, 205, 62, 29, + 137, 212, 242, 29, 137, 232, 49, 29, 137, 205, 59, 225, 198, 2, 213, 168, + 225, 198, 2, 247, 53, 225, 198, 2, 222, 204, 225, 198, 2, 197, 55, 225, + 198, 1, 63, 225, 198, 1, 230, 248, 224, 218, 225, 198, 1, 68, 225, 198, + 1, 226, 119, 225, 198, 1, 66, 225, 198, 1, 213, 243, 247, 23, 225, 198, + 1, 217, 71, 222, 162, 225, 198, 1, 217, 71, 222, 163, 210, 198, 225, 198, + 1, 69, 225, 198, 1, 251, 199, 225, 198, 1, 72, 225, 198, 1, 155, 225, + 198, 1, 225, 69, 208, 201, 225, 198, 1, 225, 69, 218, 98, 225, 198, 1, + 234, 122, 225, 198, 1, 234, 123, 218, 98, 225, 198, 1, 217, 70, 225, 198, + 1, 247, 173, 225, 198, 1, 247, 174, 218, 98, 225, 198, 1, 225, 213, 225, + 198, 1, 215, 109, 218, 98, 225, 198, 1, 225, 214, 220, 84, 225, 198, 1, + 215, 108, 225, 198, 1, 201, 78, 225, 198, 1, 201, 79, 220, 84, 225, 198, + 1, 240, 40, 225, 198, 1, 240, 41, 220, 84, 225, 198, 1, 218, 0, 218, 98, + 225, 198, 1, 189, 225, 198, 1, 203, 169, 218, 98, 225, 198, 1, 240, 135, + 225, 198, 1, 240, 136, 220, 84, 225, 198, 1, 176, 225, 198, 1, 161, 225, + 198, 1, 213, 243, 218, 98, 225, 198, 1, 249, 144, 225, 198, 1, 249, 145, + 218, 98, 225, 198, 1, 166, 225, 198, 1, 164, 225, 198, 1, 169, 225, 198, + 1, 210, 251, 251, 209, 225, 198, 1, 172, 225, 198, 1, 197, 166, 225, 198, + 1, 209, 23, 218, 98, 225, 198, 1, 209, 23, 220, 84, 225, 198, 1, 183, + 225, 198, 1, 142, 225, 198, 2, 247, 54, 203, 27, 225, 198, 18, 2, 203, + 97, 225, 198, 18, 2, 202, 16, 225, 198, 18, 2, 196, 237, 225, 198, 18, 2, + 196, 238, 219, 174, 225, 198, 18, 2, 204, 121, 225, 198, 18, 2, 204, 122, + 219, 162, 225, 198, 18, 2, 203, 121, 225, 198, 18, 2, 239, 81, 218, 97, + 225, 198, 18, 2, 213, 47, 225, 198, 108, 2, 224, 174, 225, 198, 108, 2, + 213, 61, 225, 198, 108, 2, 247, 158, 225, 198, 213, 181, 225, 198, 50, + 210, 111, 225, 198, 53, 210, 111, 225, 198, 213, 231, 251, 98, 225, 198, + 213, 231, 220, 104, 225, 198, 213, 231, 221, 177, 225, 198, 213, 231, + 197, 48, 225, 198, 213, 231, 213, 182, 225, 198, 213, 231, 222, 66, 225, + 198, 213, 231, 221, 171, 225, 198, 213, 231, 251, 255, 225, 198, 213, + 231, 252, 0, 251, 255, 225, 198, 213, 231, 212, 158, 225, 198, 163, 213, + 231, 212, 158, 225, 198, 213, 177, 225, 198, 17, 195, 79, 225, 198, 17, + 100, 225, 198, 17, 102, 225, 198, 17, 134, 225, 198, 17, 136, 225, 198, + 17, 146, 225, 198, 17, 167, 225, 198, 17, 178, 225, 198, 17, 171, 225, + 198, 17, 182, 225, 198, 213, 231, 202, 59, 201, 19, 225, 198, 213, 231, + 225, 243, 75, 1, 207, 25, 233, 229, 75, 1, 207, 25, 247, 15, 75, 1, 207, + 25, 225, 179, 75, 1, 207, 25, 216, 85, 75, 1, 207, 25, 248, 196, 75, 2, + 207, 25, 208, 185, 75, 73, 1, 207, 25, 210, 155, 75, 1, 49, 223, 52, 215, + 108, 75, 1, 49, 223, 52, 235, 238, 75, 1, 49, 223, 52, 234, 122, 75, 1, + 49, 223, 52, 233, 229, 75, 1, 49, 223, 52, 225, 213, 75, 1, 49, 223, 52, + 225, 179, 75, 1, 49, 223, 52, 240, 40, 75, 1, 49, 223, 52, 240, 24, 75, + 1, 49, 223, 52, 216, 85, 75, 49, 223, 52, 17, 195, 79, 75, 49, 223, 52, + 17, 100, 75, 49, 223, 52, 17, 102, 75, 49, 223, 52, 17, 134, 75, 49, 223, + 52, 17, 136, 75, 49, 223, 52, 17, 146, 75, 49, 223, 52, 17, 167, 75, 49, + 223, 52, 17, 178, 75, 49, 223, 52, 17, 171, 75, 49, 223, 52, 17, 182, 75, + 1, 49, 223, 52, 222, 36, 75, 1, 49, 223, 52, 240, 135, 75, 1, 49, 223, + 52, 239, 175, 75, 1, 49, 223, 52, 249, 144, 75, 1, 49, 223, 52, 248, 196, + 247, 8, 1, 63, 247, 8, 1, 68, 247, 8, 1, 66, 247, 8, 1, 69, 247, 8, 1, + 251, 199, 247, 8, 1, 72, 247, 8, 1, 155, 247, 8, 1, 224, 145, 247, 8, 1, + 234, 122, 247, 8, 1, 233, 229, 247, 8, 1, 216, 235, 247, 8, 1, 217, 70, + 247, 8, 1, 247, 15, 247, 8, 1, 245, 76, 247, 8, 1, 225, 213, 247, 8, 1, + 225, 179, 247, 8, 1, 216, 224, 247, 8, 1, 216, 226, 247, 8, 1, 216, 225, + 247, 8, 1, 189, 247, 8, 1, 202, 233, 247, 8, 1, 240, 135, 247, 8, 1, 239, + 175, 247, 8, 1, 215, 151, 247, 8, 1, 176, 247, 8, 1, 240, 40, 247, 8, 1, + 161, 247, 8, 1, 212, 53, 247, 8, 1, 213, 5, 247, 8, 1, 249, 144, 247, 8, + 1, 248, 196, 247, 8, 1, 218, 132, 247, 8, 1, 166, 247, 8, 1, 249, 44, + 247, 8, 1, 164, 247, 8, 1, 169, 247, 8, 1, 172, 247, 8, 1, 199, 152, 247, + 8, 1, 205, 80, 247, 8, 1, 183, 247, 8, 1, 142, 247, 8, 18, 2, 252, 167, + 247, 8, 18, 2, 68, 247, 8, 18, 2, 226, 119, 247, 8, 18, 2, 237, 32, 247, + 8, 18, 2, 66, 247, 8, 18, 2, 214, 163, 247, 8, 18, 2, 72, 247, 8, 18, 2, + 251, 199, 247, 8, 18, 2, 250, 149, 247, 8, 18, 2, 200, 99, 247, 8, 108, + 2, 164, 247, 8, 108, 2, 169, 247, 8, 108, 2, 172, 247, 8, 108, 2, 197, + 166, 247, 8, 1, 48, 225, 79, 247, 8, 1, 48, 234, 189, 247, 8, 1, 48, 217, + 72, 247, 8, 108, 2, 48, 217, 72, 247, 8, 1, 48, 247, 17, 247, 8, 1, 48, + 203, 216, 247, 8, 1, 48, 218, 54, 247, 8, 1, 48, 214, 2, 247, 8, 1, 48, + 196, 148, 247, 8, 1, 48, 144, 247, 8, 1, 48, 159, 247, 8, 1, 48, 205, 83, + 247, 8, 108, 2, 48, 221, 135, 247, 8, 108, 2, 48, 233, 14, 247, 8, 17, + 195, 79, 247, 8, 17, 100, 247, 8, 17, 102, 247, 8, 17, 134, 247, 8, 17, + 136, 247, 8, 17, 146, 247, 8, 17, 167, 247, 8, 17, 178, 247, 8, 17, 171, + 247, 8, 17, 182, 247, 8, 211, 213, 205, 120, 247, 8, 211, 213, 240, 87, + 247, 8, 211, 213, 52, 240, 87, 247, 8, 211, 213, 201, 165, 240, 87, 75, + 1, 224, 138, 234, 122, 75, 1, 224, 138, 247, 173, 75, 1, 224, 138, 247, + 15, 75, 1, 224, 138, 225, 213, 75, 1, 224, 138, 225, 179, 75, 1, 224, + 138, 215, 108, 75, 1, 224, 138, 201, 78, 75, 1, 224, 138, 201, 66, 75, 1, + 224, 138, 240, 40, 75, 1, 224, 138, 240, 24, 75, 1, 224, 138, 239, 175, + 75, 1, 224, 138, 176, 75, 1, 224, 138, 183, 75, 1, 224, 138, 142, 75, 1, + 224, 138, 232, 79, 75, 1, 224, 138, 235, 238, 75, 73, 1, 224, 138, 210, + 155, 75, 1, 224, 138, 196, 208, 75, 1, 224, 138, 195, 115, 75, 1, 224, + 138, 169, 75, 221, 247, 224, 138, 214, 186, 75, 221, 247, 224, 138, 211, + 109, 75, 221, 247, 224, 138, 231, 247, 75, 16, 251, 185, 236, 88, 75, 16, + 251, 185, 100, 75, 16, 251, 185, 102, 75, 1, 251, 185, 169, 75, 2, 213, + 164, 224, 247, 202, 11, 75, 2, 49, 223, 52, 202, 9, 75, 2, 49, 223, 52, + 202, 6, 75, 1, 206, 128, 213, 211, 247, 15, 75, 1, 206, 128, 213, 211, + 207, 50, 49, 199, 24, 1, 126, 224, 10, 49, 199, 24, 1, 130, 224, 10, 49, + 199, 24, 1, 126, 224, 116, 49, 199, 24, 1, 130, 224, 116, 49, 199, 24, 1, + 126, 224, 125, 49, 199, 24, 1, 130, 224, 125, 49, 199, 24, 1, 126, 233, + 143, 49, 199, 24, 1, 130, 233, 143, 49, 199, 24, 1, 126, 216, 251, 49, + 199, 24, 1, 130, 216, 251, 49, 199, 24, 1, 126, 244, 181, 49, 199, 24, 1, + 130, 244, 181, 49, 199, 24, 1, 126, 245, 48, 49, 199, 24, 1, 130, 245, + 48, 49, 199, 24, 1, 126, 205, 200, 49, 199, 24, 1, 130, 205, 200, 49, + 199, 24, 1, 126, 215, 72, 49, 199, 24, 1, 130, 215, 72, 49, 199, 24, 1, + 126, 239, 27, 49, 199, 24, 1, 130, 239, 27, 49, 199, 24, 1, 126, 149, 49, + 199, 24, 1, 130, 149, 49, 199, 24, 1, 126, 202, 169, 49, 199, 24, 1, 130, + 202, 169, 49, 199, 24, 1, 126, 216, 49, 49, 199, 24, 1, 130, 216, 49, 49, + 199, 24, 1, 126, 248, 115, 49, 199, 24, 1, 130, 248, 115, 49, 199, 24, 1, + 126, 212, 116, 49, 199, 24, 1, 130, 212, 116, 49, 199, 24, 1, 126, 212, + 233, 49, 199, 24, 1, 130, 212, 233, 49, 199, 24, 1, 126, 235, 50, 49, + 199, 24, 1, 130, 235, 50, 49, 199, 24, 1, 126, 218, 250, 49, 199, 24, 1, + 130, 218, 250, 49, 199, 24, 1, 126, 196, 3, 49, 199, 24, 1, 130, 196, 3, + 49, 199, 24, 1, 126, 209, 232, 49, 199, 24, 1, 130, 209, 232, 49, 199, + 24, 1, 126, 222, 6, 49, 199, 24, 1, 130, 222, 6, 49, 199, 24, 1, 126, + 198, 248, 49, 199, 24, 1, 130, 198, 248, 49, 199, 24, 1, 126, 231, 192, + 49, 199, 24, 1, 130, 231, 192, 49, 199, 24, 1, 126, 72, 49, 199, 24, 1, + 130, 72, 49, 199, 24, 220, 81, 225, 12, 49, 199, 24, 18, 252, 167, 49, + 199, 24, 18, 68, 49, 199, 24, 18, 200, 99, 49, 199, 24, 18, 66, 49, 199, + 24, 18, 69, 49, 199, 24, 18, 72, 49, 199, 24, 220, 81, 224, 119, 49, 199, + 24, 18, 230, 209, 49, 199, 24, 18, 200, 98, 49, 199, 24, 18, 200, 114, + 49, 199, 24, 18, 250, 147, 49, 199, 24, 18, 250, 121, 49, 199, 24, 18, + 251, 105, 49, 199, 24, 18, 251, 122, 49, 199, 24, 152, 220, 81, 237, 13, + 49, 199, 24, 152, 220, 81, 215, 150, 49, 199, 24, 152, 220, 81, 202, 169, + 49, 199, 24, 152, 220, 81, 205, 173, 49, 199, 24, 16, 223, 244, 49, 199, + 24, 16, 215, 150, 49, 199, 24, 16, 208, 229, 49, 199, 24, 16, 231, 193, + 231, 179, 49, 199, 24, 16, 223, 255, 223, 254, 219, 181, 219, 247, 1, 69, + 219, 181, 219, 247, 1, 72, 219, 181, 219, 247, 1, 247, 15, 219, 181, 219, + 247, 1, 215, 108, 219, 181, 219, 247, 1, 201, 78, 219, 181, 219, 247, 1, + 201, 66, 219, 181, 219, 247, 1, 240, 40, 219, 181, 219, 247, 1, 240, 24, + 219, 181, 219, 247, 1, 216, 85, 219, 181, 219, 247, 1, 207, 50, 219, 181, + 219, 247, 1, 205, 80, 219, 181, 219, 247, 18, 2, 226, 119, 219, 181, 219, + 247, 18, 2, 199, 245, 219, 181, 219, 247, 18, 2, 252, 131, 219, 181, 219, + 247, 18, 2, 250, 149, 219, 181, 219, 247, 18, 2, 252, 123, 219, 181, 219, + 247, 245, 91, 219, 181, 219, 247, 251, 205, 224, 107, 219, 181, 219, 247, + 251, 79, 219, 181, 219, 247, 5, 210, 117, 78, 219, 181, 219, 247, 197, 9, + 210, 117, 78, 219, 181, 219, 247, 18, 2, 199, 2, 219, 181, 219, 247, 199, + 7, 35, 5, 201, 59, 35, 5, 201, 62, 35, 5, 201, 65, 35, 5, 201, 63, 35, 5, + 201, 64, 35, 5, 201, 61, 35, 5, 240, 18, 35, 5, 240, 20, 35, 5, 240, 23, + 35, 5, 240, 21, 35, 5, 240, 22, 35, 5, 240, 19, 35, 5, 237, 142, 35, 5, + 237, 146, 35, 5, 237, 154, 35, 5, 237, 151, 35, 5, 237, 152, 35, 5, 237, + 143, 35, 5, 247, 70, 35, 5, 247, 64, 35, 5, 247, 66, 35, 5, 247, 69, 35, + 5, 247, 67, 35, 5, 247, 68, 35, 5, 247, 65, 35, 5, 249, 44, 35, 5, 249, + 23, 35, 5, 249, 35, 35, 5, 249, 43, 35, 5, 249, 38, 35, 5, 249, 39, 35, + 5, 249, 27, 8, 4, 1, 249, 73, 251, 133, 8, 4, 1, 39, 210, 87, 8, 4, 1, + 248, 131, 69, 8, 4, 1, 249, 73, 69, 8, 4, 1, 237, 135, 3, 235, 63, 8, 4, + 1, 222, 148, 236, 48, 8, 4, 1, 145, 234, 190, 3, 241, 56, 8, 4, 1, 223, + 99, 3, 226, 16, 222, 203, 209, 80, 8, 4, 1, 223, 99, 3, 52, 112, 202, 84, + 8, 4, 1, 223, 99, 3, 112, 210, 2, 8, 4, 1, 221, 136, 3, 241, 56, 8, 4, 1, + 218, 55, 3, 241, 56, 8, 4, 1, 236, 215, 3, 241, 56, 8, 4, 1, 248, 131, + 72, 8, 4, 1, 248, 131, 177, 3, 106, 8, 4, 1, 192, 177, 3, 106, 8, 4, 1, + 226, 16, 214, 163, 8, 4, 1, 163, 214, 164, 3, 106, 8, 4, 1, 163, 214, + 164, 3, 231, 154, 106, 8, 4, 1, 163, 177, 214, 87, 8, 4, 1, 163, 177, + 214, 88, 3, 106, 8, 4, 1, 204, 231, 144, 8, 1, 4, 6, 211, 31, 3, 53, 222, + 171, 8, 4, 1, 211, 31, 197, 37, 232, 186, 8, 4, 1, 52, 144, 8, 4, 1, 211, + 31, 3, 241, 56, 8, 4, 1, 52, 211, 31, 3, 241, 56, 8, 4, 1, 145, 144, 8, + 4, 1, 145, 211, 31, 3, 210, 2, 8, 4, 1, 249, 63, 236, 140, 8, 4, 1, 118, + 3, 206, 182, 53, 222, 171, 8, 4, 1, 118, 249, 79, 3, 206, 182, 53, 222, + 171, 8, 4, 1, 200, 90, 8, 4, 1, 163, 200, 90, 8, 4, 1, 118, 3, 50, 122, + 8, 4, 1, 245, 74, 8, 4, 1, 245, 75, 3, 126, 53, 210, 2, 8, 4, 1, 245, 75, + 3, 126, 50, 207, 85, 8, 4, 1, 196, 223, 3, 126, 53, 210, 2, 8, 4, 1, 196, + 223, 3, 181, 50, 222, 171, 8, 4, 1, 196, 223, 3, 181, 50, 222, 172, 26, + 126, 53, 210, 2, 8, 4, 1, 196, 223, 3, 181, 50, 222, 172, 3, 207, 85, 8, + 4, 1, 196, 149, 3, 206, 182, 53, 222, 171, 73, 248, 47, 3, 226, 16, 248, + 46, 73, 1, 4, 232, 98, 73, 1, 4, 223, 99, 3, 226, 16, 222, 203, 209, 80, + 73, 1, 4, 223, 99, 3, 112, 202, 84, 73, 1, 4, 118, 3, 50, 122, 8, 4, 1, + 208, 246, 196, 84, 8, 4, 1, 226, 4, 69, 8, 4, 1, 192, 214, 163, 8, 4, 1, + 200, 41, 8, 4, 1, 226, 16, 251, 133, 32, 1, 4, 6, 214, 123, 8, 4, 1, 237, + 157, 239, 110, 3, 210, 95, 122, 8, 4, 1, 201, 115, 239, 110, 3, 210, 95, + 122, 95, 4, 1, 63, 95, 4, 1, 69, 95, 4, 1, 68, 95, 4, 1, 72, 95, 4, 1, + 66, 95, 4, 1, 199, 230, 95, 4, 1, 234, 122, 95, 4, 1, 155, 95, 4, 1, 234, + 47, 95, 4, 1, 233, 191, 95, 4, 1, 233, 143, 95, 4, 1, 233, 75, 95, 4, 1, + 233, 35, 95, 4, 1, 142, 95, 4, 1, 232, 146, 95, 4, 1, 232, 70, 95, 4, 1, + 231, 192, 95, 4, 1, 231, 74, 95, 4, 1, 231, 43, 95, 4, 1, 172, 95, 4, 1, + 222, 196, 95, 4, 1, 222, 108, 95, 4, 1, 222, 6, 95, 4, 1, 221, 190, 95, + 4, 1, 221, 159, 95, 4, 1, 166, 95, 4, 1, 219, 206, 95, 4, 1, 219, 77, 95, + 4, 1, 218, 250, 95, 4, 1, 218, 144, 95, 4, 1, 176, 95, 4, 1, 231, 216, + 95, 4, 1, 217, 230, 95, 4, 1, 217, 117, 95, 4, 1, 216, 222, 95, 4, 1, + 216, 49, 95, 4, 1, 215, 185, 95, 4, 1, 215, 119, 95, 4, 1, 211, 95, 95, + 4, 1, 211, 81, 95, 4, 1, 211, 74, 95, 4, 1, 211, 64, 95, 4, 1, 211, 53, + 95, 4, 1, 211, 51, 95, 4, 1, 183, 95, 4, 1, 209, 80, 95, 4, 1, 208, 147, + 95, 4, 1, 206, 112, 95, 4, 1, 205, 200, 95, 4, 1, 204, 172, 95, 4, 1, + 204, 72, 95, 4, 1, 240, 135, 95, 4, 1, 189, 95, 4, 1, 239, 251, 95, 4, 1, + 203, 68, 95, 4, 1, 239, 151, 95, 4, 1, 202, 122, 95, 4, 1, 239, 27, 95, + 4, 1, 237, 200, 95, 4, 1, 237, 169, 95, 4, 1, 239, 39, 95, 4, 1, 202, 47, + 95, 4, 1, 202, 46, 95, 4, 1, 202, 35, 95, 4, 1, 202, 34, 95, 4, 1, 202, + 33, 95, 4, 1, 202, 32, 95, 4, 1, 201, 113, 95, 4, 1, 201, 107, 95, 4, 1, + 201, 92, 95, 4, 1, 201, 90, 95, 4, 1, 201, 86, 95, 4, 1, 201, 85, 95, 4, + 1, 197, 166, 95, 4, 1, 197, 109, 95, 4, 1, 197, 70, 95, 4, 1, 197, 34, + 95, 4, 1, 196, 243, 95, 4, 1, 196, 230, 95, 4, 1, 164, 219, 181, 219, + 247, 1, 223, 251, 219, 181, 219, 247, 1, 208, 229, 219, 181, 219, 247, 1, + 223, 53, 219, 181, 219, 247, 1, 219, 5, 219, 181, 219, 247, 1, 161, 219, + 181, 219, 247, 1, 176, 219, 181, 219, 247, 1, 245, 66, 219, 181, 219, + 247, 1, 202, 86, 219, 181, 219, 247, 1, 224, 110, 219, 181, 219, 247, 1, + 216, 241, 219, 181, 219, 247, 1, 202, 161, 219, 181, 219, 247, 1, 197, + 154, 219, 181, 219, 247, 1, 196, 95, 219, 181, 219, 247, 1, 231, 63, 219, + 181, 219, 247, 1, 200, 72, 219, 181, 219, 247, 1, 68, 219, 181, 219, 247, + 1, 212, 255, 219, 181, 219, 247, 1, 250, 160, 219, 181, 219, 247, 1, 233, + 135, 219, 181, 219, 247, 1, 225, 177, 219, 181, 219, 247, 1, 210, 223, + 219, 181, 219, 247, 1, 249, 144, 219, 181, 219, 247, 1, 225, 161, 219, + 181, 219, 247, 1, 239, 108, 219, 181, 219, 247, 1, 233, 198, 219, 181, + 219, 247, 1, 239, 153, 219, 181, 219, 247, 1, 248, 193, 219, 181, 219, + 247, 1, 223, 252, 221, 229, 219, 181, 219, 247, 1, 223, 54, 221, 229, + 219, 181, 219, 247, 1, 219, 6, 221, 229, 219, 181, 219, 247, 1, 213, 243, + 221, 229, 219, 181, 219, 247, 1, 218, 0, 221, 229, 219, 181, 219, 247, 1, + 202, 87, 221, 229, 219, 181, 219, 247, 1, 216, 242, 221, 229, 219, 181, + 219, 247, 1, 230, 248, 221, 229, 219, 181, 219, 247, 18, 2, 214, 116, + 219, 181, 219, 247, 18, 2, 226, 83, 219, 181, 219, 247, 18, 2, 251, 103, + 219, 181, 219, 247, 18, 2, 196, 58, 219, 181, 219, 247, 18, 2, 205, 163, + 219, 181, 219, 247, 18, 2, 200, 69, 219, 181, 219, 247, 18, 2, 245, 89, + 219, 181, 219, 247, 18, 2, 215, 134, 219, 181, 219, 247, 245, 90, 219, + 181, 219, 247, 221, 174, 225, 222, 219, 181, 219, 247, 251, 18, 225, 222, + 219, 181, 219, 247, 17, 195, 79, 219, 181, 219, 247, 17, 100, 219, 181, + 219, 247, 17, 102, 219, 181, 219, 247, 17, 134, 219, 181, 219, 247, 17, + 136, 219, 181, 219, 247, 17, 146, 219, 181, 219, 247, 17, 167, 219, 181, + 219, 247, 17, 178, 219, 181, 219, 247, 17, 171, 219, 181, 219, 247, 17, + 182, 29, 225, 101, 215, 10, 29, 225, 101, 215, 15, 29, 225, 101, 195, + 252, 29, 225, 101, 195, 251, 29, 225, 101, 195, 250, 29, 225, 101, 200, + 164, 29, 225, 101, 200, 168, 29, 225, 101, 195, 211, 29, 225, 101, 195, + 207, 29, 225, 101, 236, 114, 29, 225, 101, 236, 112, 29, 225, 101, 236, + 113, 29, 225, 101, 236, 110, 29, 225, 101, 230, 234, 29, 225, 101, 230, + 233, 29, 225, 101, 230, 231, 29, 225, 101, 230, 232, 29, 225, 101, 230, + 237, 29, 225, 101, 230, 230, 29, 225, 101, 230, 229, 29, 225, 101, 230, + 239, 29, 225, 101, 251, 4, 29, 225, 101, 251, 3, 29, 116, 216, 200, 29, + 116, 216, 206, 29, 116, 205, 61, 29, 116, 205, 60, 29, 116, 202, 92, 29, + 116, 202, 90, 29, 116, 202, 89, 29, 116, 202, 95, 29, 116, 202, 96, 29, + 116, 202, 88, 29, 116, 210, 33, 29, 116, 210, 48, 29, 116, 205, 67, 29, + 116, 210, 45, 29, 116, 210, 35, 29, 116, 210, 37, 29, 116, 210, 24, 29, + 116, 210, 25, 29, 116, 224, 253, 29, 116, 219, 50, 29, 116, 219, 44, 29, + 116, 205, 71, 29, 116, 219, 47, 29, 116, 219, 53, 29, 116, 212, 186, 29, + 116, 212, 195, 29, 116, 212, 199, 29, 116, 205, 69, 29, 116, 212, 189, + 29, 116, 212, 203, 29, 116, 212, 204, 29, 116, 206, 44, 29, 116, 206, 47, + 29, 116, 205, 65, 29, 116, 205, 63, 29, 116, 206, 42, 29, 116, 206, 50, + 29, 116, 206, 51, 29, 116, 206, 36, 29, 116, 206, 49, 29, 116, 213, 171, + 29, 116, 213, 172, 29, 116, 196, 42, 29, 116, 196, 45, 29, 116, 245, 3, + 29, 116, 245, 2, 29, 116, 205, 76, 29, 116, 212, 240, 29, 116, 212, 239, + 12, 15, 228, 110, 12, 15, 228, 109, 12, 15, 228, 108, 12, 15, 228, 107, + 12, 15, 228, 106, 12, 15, 228, 105, 12, 15, 228, 104, 12, 15, 228, 103, + 12, 15, 228, 102, 12, 15, 228, 101, 12, 15, 228, 100, 12, 15, 228, 99, + 12, 15, 228, 98, 12, 15, 228, 97, 12, 15, 228, 96, 12, 15, 228, 95, 12, + 15, 228, 94, 12, 15, 228, 93, 12, 15, 228, 92, 12, 15, 228, 91, 12, 15, + 228, 90, 12, 15, 228, 89, 12, 15, 228, 88, 12, 15, 228, 87, 12, 15, 228, + 86, 12, 15, 228, 85, 12, 15, 228, 84, 12, 15, 228, 83, 12, 15, 228, 82, + 12, 15, 228, 81, 12, 15, 228, 80, 12, 15, 228, 79, 12, 15, 228, 78, 12, + 15, 228, 77, 12, 15, 228, 76, 12, 15, 228, 75, 12, 15, 228, 74, 12, 15, + 228, 73, 12, 15, 228, 72, 12, 15, 228, 71, 12, 15, 228, 70, 12, 15, 228, + 69, 12, 15, 228, 68, 12, 15, 228, 67, 12, 15, 228, 66, 12, 15, 228, 65, + 12, 15, 228, 64, 12, 15, 228, 63, 12, 15, 228, 62, 12, 15, 228, 61, 12, + 15, 228, 60, 12, 15, 228, 59, 12, 15, 228, 58, 12, 15, 228, 57, 12, 15, + 228, 56, 12, 15, 228, 55, 12, 15, 228, 54, 12, 15, 228, 53, 12, 15, 228, + 52, 12, 15, 228, 51, 12, 15, 228, 50, 12, 15, 228, 49, 12, 15, 228, 48, + 12, 15, 228, 47, 12, 15, 228, 46, 12, 15, 228, 45, 12, 15, 228, 44, 12, + 15, 228, 43, 12, 15, 228, 42, 12, 15, 228, 41, 12, 15, 228, 40, 12, 15, + 228, 39, 12, 15, 228, 38, 12, 15, 228, 37, 12, 15, 228, 36, 12, 15, 228, + 35, 12, 15, 228, 34, 12, 15, 228, 33, 12, 15, 228, 32, 12, 15, 228, 31, + 12, 15, 228, 30, 12, 15, 228, 29, 12, 15, 228, 28, 12, 15, 228, 27, 12, + 15, 228, 26, 12, 15, 228, 25, 12, 15, 228, 24, 12, 15, 228, 23, 12, 15, + 228, 22, 12, 15, 228, 21, 12, 15, 228, 20, 12, 15, 228, 19, 12, 15, 228, + 18, 12, 15, 228, 17, 12, 15, 228, 16, 12, 15, 228, 15, 12, 15, 228, 14, + 12, 15, 228, 13, 12, 15, 228, 12, 12, 15, 228, 11, 12, 15, 228, 10, 12, + 15, 228, 9, 12, 15, 228, 8, 12, 15, 228, 7, 12, 15, 228, 6, 12, 15, 228, + 5, 12, 15, 228, 4, 12, 15, 228, 3, 12, 15, 228, 2, 12, 15, 228, 1, 12, + 15, 228, 0, 12, 15, 227, 255, 12, 15, 227, 254, 12, 15, 227, 253, 12, 15, 227, 252, 12, 15, 227, 251, 12, 15, 227, 250, 12, 15, 227, 249, 12, 15, 227, 248, 12, 15, 227, 247, 12, 15, 227, 246, 12, 15, 227, 245, 12, 15, 227, 244, 12, 15, 227, 243, 12, 15, 227, 242, 12, 15, 227, 241, 12, 15, @@ -12958,963 +13085,866 @@ static unsigned char phrasebook[] = { 12, 15, 226, 165, 12, 15, 226, 164, 12, 15, 226, 163, 12, 15, 226, 162, 12, 15, 226, 161, 12, 15, 226, 160, 12, 15, 226, 159, 12, 15, 226, 158, 12, 15, 226, 157, 12, 15, 226, 156, 12, 15, 226, 155, 12, 15, 226, 154, - 12, 15, 226, 153, 12, 15, 226, 152, 12, 15, 226, 151, 12, 15, 226, 150, - 12, 15, 226, 149, 12, 15, 226, 148, 12, 15, 226, 147, 12, 15, 226, 146, - 12, 15, 226, 145, 12, 15, 226, 144, 12, 15, 226, 143, 12, 15, 226, 142, - 12, 15, 226, 141, 12, 15, 226, 140, 12, 15, 226, 139, 12, 15, 226, 138, - 12, 15, 226, 137, 12, 15, 226, 136, 12, 15, 226, 135, 12, 15, 226, 134, - 12, 15, 226, 133, 12, 15, 226, 132, 12, 15, 226, 131, 12, 15, 226, 130, - 12, 15, 226, 129, 12, 15, 226, 128, 12, 15, 226, 127, 12, 15, 226, 126, - 12, 15, 226, 125, 12, 15, 226, 124, 12, 15, 226, 123, 12, 15, 226, 122, - 12, 15, 226, 121, 12, 15, 226, 120, 12, 15, 226, 119, 12, 15, 226, 118, - 12, 15, 226, 117, 12, 15, 226, 116, 12, 15, 226, 115, 12, 15, 226, 114, - 12, 15, 226, 113, 12, 15, 226, 112, 12, 15, 226, 111, 12, 15, 226, 110, - 12, 15, 226, 109, 12, 15, 226, 108, 12, 15, 226, 107, 12, 15, 226, 106, - 12, 15, 226, 105, 12, 15, 226, 104, 12, 15, 226, 103, 12, 15, 226, 102, - 12, 15, 226, 101, 12, 15, 226, 100, 12, 15, 226, 99, 12, 15, 226, 98, 12, - 15, 226, 97, 12, 15, 226, 96, 12, 15, 226, 95, 12, 15, 226, 94, 12, 15, - 226, 93, 12, 15, 226, 92, 12, 15, 226, 91, 12, 15, 226, 90, 12, 15, 226, - 89, 12, 15, 226, 88, 12, 15, 226, 87, 12, 15, 226, 86, 12, 15, 226, 85, - 12, 15, 226, 84, 12, 15, 226, 83, 12, 15, 226, 82, 12, 15, 226, 81, 12, - 15, 226, 80, 12, 15, 226, 79, 12, 15, 226, 78, 12, 15, 226, 77, 12, 15, - 226, 76, 12, 15, 226, 75, 12, 15, 226, 74, 12, 15, 226, 73, 12, 15, 226, - 72, 12, 15, 226, 71, 12, 15, 226, 70, 12, 15, 226, 69, 12, 15, 226, 68, - 12, 15, 226, 67, 12, 15, 226, 66, 12, 15, 226, 65, 12, 15, 226, 64, 12, - 15, 226, 63, 12, 15, 226, 62, 12, 15, 226, 61, 12, 15, 226, 60, 12, 15, - 226, 59, 12, 15, 226, 58, 12, 15, 226, 57, 12, 15, 226, 56, 12, 15, 226, - 55, 12, 15, 226, 54, 12, 15, 226, 53, 12, 15, 226, 52, 12, 15, 226, 51, - 12, 15, 226, 50, 12, 15, 226, 49, 12, 15, 226, 48, 12, 15, 226, 47, 12, - 15, 226, 46, 12, 15, 226, 45, 12, 15, 226, 44, 12, 15, 226, 43, 12, 15, - 226, 42, 12, 15, 226, 41, 12, 15, 226, 40, 8, 4, 32, 235, 37, 8, 4, 32, - 235, 33, 8, 4, 32, 234, 232, 8, 4, 32, 235, 36, 8, 4, 32, 235, 35, 8, 4, - 32, 172, 209, 36, 203, 185, 8, 4, 32, 204, 242, 192, 4, 32, 219, 74, 215, - 179, 192, 4, 32, 219, 74, 236, 190, 192, 4, 32, 219, 74, 225, 199, 192, - 4, 32, 199, 29, 215, 179, 192, 4, 32, 219, 74, 196, 194, 119, 1, 195, - 240, 3, 231, 177, 119, 212, 56, 225, 0, 199, 117, 119, 32, 196, 18, 195, - 240, 195, 240, 213, 55, 119, 1, 250, 228, 249, 224, 119, 1, 197, 56, 251, - 10, 119, 1, 197, 56, 239, 224, 119, 1, 197, 56, 232, 32, 119, 1, 197, 56, - 224, 183, 119, 1, 197, 56, 222, 142, 119, 1, 197, 56, 48, 219, 80, 119, - 1, 197, 56, 210, 60, 119, 1, 197, 56, 203, 53, 119, 1, 250, 228, 96, 56, - 119, 1, 206, 168, 3, 206, 168, 238, 123, 119, 1, 206, 168, 3, 206, 23, - 238, 123, 119, 1, 206, 168, 3, 239, 244, 26, 206, 168, 238, 123, 119, 1, - 206, 168, 3, 239, 244, 26, 206, 23, 238, 123, 119, 1, 149, 3, 213, 55, - 119, 1, 149, 3, 211, 96, 119, 1, 149, 3, 219, 203, 119, 1, 248, 64, 3, - 239, 243, 119, 1, 233, 60, 3, 239, 243, 119, 1, 239, 225, 3, 239, 243, - 119, 1, 232, 33, 3, 219, 203, 119, 1, 199, 110, 3, 239, 243, 119, 1, 195, - 92, 3, 239, 243, 119, 1, 202, 227, 3, 239, 243, 119, 1, 195, 240, 3, 239, - 243, 119, 1, 48, 224, 184, 3, 239, 243, 119, 1, 224, 184, 3, 239, 243, - 119, 1, 222, 143, 3, 239, 243, 119, 1, 219, 81, 3, 239, 243, 119, 1, 215, - 64, 3, 239, 243, 119, 1, 208, 181, 3, 239, 243, 119, 1, 48, 213, 36, 3, - 239, 243, 119, 1, 213, 36, 3, 239, 243, 119, 1, 201, 89, 3, 239, 243, - 119, 1, 211, 56, 3, 239, 243, 119, 1, 210, 61, 3, 239, 243, 119, 1, 206, - 168, 3, 239, 243, 119, 1, 203, 54, 3, 239, 243, 119, 1, 199, 110, 3, 231, - 65, 119, 1, 248, 64, 3, 210, 176, 119, 1, 224, 184, 3, 210, 176, 119, 1, - 213, 36, 3, 210, 176, 119, 32, 149, 222, 142, 9, 1, 149, 197, 127, 69, - 20, 9, 1, 149, 197, 127, 48, 20, 9, 1, 248, 104, 69, 20, 9, 1, 248, 104, - 48, 20, 9, 1, 248, 104, 84, 20, 9, 1, 248, 104, 194, 194, 20, 9, 1, 213, - 16, 69, 20, 9, 1, 213, 16, 48, 20, 9, 1, 213, 16, 84, 20, 9, 1, 213, 16, - 194, 194, 20, 9, 1, 248, 92, 69, 20, 9, 1, 248, 92, 48, 20, 9, 1, 248, - 92, 84, 20, 9, 1, 248, 92, 194, 194, 20, 9, 1, 201, 49, 69, 20, 9, 1, - 201, 49, 48, 20, 9, 1, 201, 49, 84, 20, 9, 1, 201, 49, 194, 194, 20, 9, - 1, 203, 8, 69, 20, 9, 1, 203, 8, 48, 20, 9, 1, 203, 8, 84, 20, 9, 1, 203, - 8, 194, 194, 20, 9, 1, 201, 51, 69, 20, 9, 1, 201, 51, 48, 20, 9, 1, 201, - 51, 84, 20, 9, 1, 201, 51, 194, 194, 20, 9, 1, 199, 99, 69, 20, 9, 1, - 199, 99, 48, 20, 9, 1, 199, 99, 84, 20, 9, 1, 199, 99, 194, 194, 20, 9, - 1, 213, 14, 69, 20, 9, 1, 213, 14, 48, 20, 9, 1, 213, 14, 84, 20, 9, 1, - 213, 14, 194, 194, 20, 9, 1, 237, 36, 69, 20, 9, 1, 237, 36, 48, 20, 9, - 1, 237, 36, 84, 20, 9, 1, 237, 36, 194, 194, 20, 9, 1, 215, 22, 69, 20, - 9, 1, 215, 22, 48, 20, 9, 1, 215, 22, 84, 20, 9, 1, 215, 22, 194, 194, - 20, 9, 1, 203, 41, 69, 20, 9, 1, 203, 41, 48, 20, 9, 1, 203, 41, 84, 20, - 9, 1, 203, 41, 194, 194, 20, 9, 1, 203, 39, 69, 20, 9, 1, 203, 39, 48, - 20, 9, 1, 203, 39, 84, 20, 9, 1, 203, 39, 194, 194, 20, 9, 1, 239, 162, - 69, 20, 9, 1, 239, 162, 48, 20, 9, 1, 239, 238, 69, 20, 9, 1, 239, 238, - 48, 20, 9, 1, 237, 65, 69, 20, 9, 1, 237, 65, 48, 20, 9, 1, 239, 160, 69, - 20, 9, 1, 239, 160, 48, 20, 9, 1, 225, 78, 69, 20, 9, 1, 225, 78, 48, 20, - 9, 1, 209, 128, 69, 20, 9, 1, 209, 128, 48, 20, 9, 1, 224, 84, 69, 20, 9, - 1, 224, 84, 48, 20, 9, 1, 224, 84, 84, 20, 9, 1, 224, 84, 194, 194, 20, - 9, 1, 233, 248, 69, 20, 9, 1, 233, 248, 48, 20, 9, 1, 233, 248, 84, 20, - 9, 1, 233, 248, 194, 194, 20, 9, 1, 232, 202, 69, 20, 9, 1, 232, 202, 48, - 20, 9, 1, 232, 202, 84, 20, 9, 1, 232, 202, 194, 194, 20, 9, 1, 216, 168, - 69, 20, 9, 1, 216, 168, 48, 20, 9, 1, 216, 168, 84, 20, 9, 1, 216, 168, - 194, 194, 20, 9, 1, 215, 207, 233, 79, 69, 20, 9, 1, 215, 207, 233, 79, - 48, 20, 9, 1, 209, 189, 69, 20, 9, 1, 209, 189, 48, 20, 9, 1, 209, 189, - 84, 20, 9, 1, 209, 189, 194, 194, 20, 9, 1, 232, 0, 3, 92, 89, 69, 20, 9, - 1, 232, 0, 3, 92, 89, 48, 20, 9, 1, 232, 0, 233, 24, 69, 20, 9, 1, 232, - 0, 233, 24, 48, 20, 9, 1, 232, 0, 233, 24, 84, 20, 9, 1, 232, 0, 233, 24, - 194, 194, 20, 9, 1, 232, 0, 238, 151, 69, 20, 9, 1, 232, 0, 238, 151, 48, - 20, 9, 1, 232, 0, 238, 151, 84, 20, 9, 1, 232, 0, 238, 151, 194, 194, 20, - 9, 1, 92, 248, 183, 69, 20, 9, 1, 92, 248, 183, 48, 20, 9, 1, 92, 248, - 183, 3, 232, 99, 89, 69, 20, 9, 1, 92, 248, 183, 3, 232, 99, 89, 48, 20, - 9, 16, 76, 57, 9, 16, 76, 58, 9, 16, 114, 238, 121, 57, 9, 16, 114, 238, - 121, 58, 9, 16, 122, 238, 121, 57, 9, 16, 122, 238, 121, 58, 9, 16, 122, - 238, 121, 212, 52, 237, 103, 57, 9, 16, 122, 238, 121, 212, 52, 237, 103, - 58, 9, 16, 234, 145, 238, 121, 57, 9, 16, 234, 145, 238, 121, 58, 9, 16, - 54, 83, 248, 190, 58, 9, 16, 114, 238, 121, 199, 38, 57, 9, 16, 114, 238, - 121, 199, 38, 58, 9, 16, 209, 210, 9, 16, 4, 203, 108, 57, 9, 16, 4, 203, - 108, 58, 9, 1, 216, 247, 69, 20, 9, 1, 216, 247, 48, 20, 9, 1, 216, 247, - 84, 20, 9, 1, 216, 247, 194, 194, 20, 9, 1, 115, 69, 20, 9, 1, 115, 48, - 20, 9, 1, 214, 92, 69, 20, 9, 1, 214, 92, 48, 20, 9, 1, 195, 216, 69, 20, - 9, 1, 195, 216, 48, 20, 9, 1, 115, 3, 232, 99, 89, 69, 20, 9, 1, 199, - 106, 69, 20, 9, 1, 199, 106, 48, 20, 9, 1, 223, 216, 214, 92, 69, 20, 9, - 1, 223, 216, 214, 92, 48, 20, 9, 1, 223, 216, 195, 216, 69, 20, 9, 1, - 223, 216, 195, 216, 48, 20, 9, 1, 237, 10, 69, 20, 9, 1, 237, 10, 48, 20, - 9, 1, 237, 10, 84, 20, 9, 1, 237, 10, 194, 194, 20, 9, 1, 200, 72, 224, - 105, 223, 216, 149, 219, 230, 84, 20, 9, 1, 200, 72, 224, 105, 223, 216, - 149, 219, 230, 194, 194, 20, 9, 32, 92, 3, 232, 99, 89, 3, 149, 69, 20, - 9, 32, 92, 3, 232, 99, 89, 3, 149, 48, 20, 9, 32, 92, 3, 232, 99, 89, 3, - 251, 91, 69, 20, 9, 32, 92, 3, 232, 99, 89, 3, 251, 91, 48, 20, 9, 32, - 92, 3, 232, 99, 89, 3, 197, 110, 69, 20, 9, 32, 92, 3, 232, 99, 89, 3, - 197, 110, 48, 20, 9, 32, 92, 3, 232, 99, 89, 3, 115, 69, 20, 9, 32, 92, - 3, 232, 99, 89, 3, 115, 48, 20, 9, 32, 92, 3, 232, 99, 89, 3, 214, 92, - 69, 20, 9, 32, 92, 3, 232, 99, 89, 3, 214, 92, 48, 20, 9, 32, 92, 3, 232, - 99, 89, 3, 195, 216, 69, 20, 9, 32, 92, 3, 232, 99, 89, 3, 195, 216, 48, - 20, 9, 32, 92, 3, 232, 99, 89, 3, 237, 10, 69, 20, 9, 32, 92, 3, 232, 99, - 89, 3, 237, 10, 48, 20, 9, 32, 92, 3, 232, 99, 89, 3, 237, 10, 84, 20, 9, - 32, 200, 72, 223, 216, 92, 3, 232, 99, 89, 3, 149, 219, 230, 69, 20, 9, - 32, 200, 72, 223, 216, 92, 3, 232, 99, 89, 3, 149, 219, 230, 48, 20, 9, - 32, 200, 72, 223, 216, 92, 3, 232, 99, 89, 3, 149, 219, 230, 84, 20, 9, - 1, 235, 84, 92, 69, 20, 9, 1, 235, 84, 92, 48, 20, 9, 1, 235, 84, 92, 84, - 20, 9, 1, 235, 84, 92, 194, 194, 20, 9, 32, 92, 3, 232, 99, 89, 3, 225, - 81, 69, 20, 9, 32, 92, 3, 232, 99, 89, 3, 162, 69, 20, 9, 32, 92, 3, 232, - 99, 89, 3, 86, 69, 20, 9, 32, 92, 3, 232, 99, 89, 3, 149, 219, 230, 69, - 20, 9, 32, 92, 3, 232, 99, 89, 3, 92, 69, 20, 9, 32, 248, 94, 3, 225, 81, - 69, 20, 9, 32, 248, 94, 3, 162, 69, 20, 9, 32, 248, 94, 3, 224, 35, 69, - 20, 9, 32, 248, 94, 3, 86, 69, 20, 9, 32, 248, 94, 3, 149, 219, 230, 69, - 20, 9, 32, 248, 94, 3, 92, 69, 20, 9, 32, 203, 10, 3, 225, 81, 69, 20, 9, - 32, 203, 10, 3, 162, 69, 20, 9, 32, 203, 10, 3, 224, 35, 69, 20, 9, 32, - 203, 10, 3, 86, 69, 20, 9, 32, 203, 10, 3, 149, 219, 230, 69, 20, 9, 32, - 203, 10, 3, 92, 69, 20, 9, 32, 202, 183, 3, 225, 81, 69, 20, 9, 32, 202, - 183, 3, 86, 69, 20, 9, 32, 202, 183, 3, 149, 219, 230, 69, 20, 9, 32, - 202, 183, 3, 92, 69, 20, 9, 32, 225, 81, 3, 162, 69, 20, 9, 32, 225, 81, - 3, 86, 69, 20, 9, 32, 162, 3, 225, 81, 69, 20, 9, 32, 162, 3, 86, 69, 20, - 9, 32, 224, 35, 3, 225, 81, 69, 20, 9, 32, 224, 35, 3, 162, 69, 20, 9, - 32, 224, 35, 3, 86, 69, 20, 9, 32, 208, 82, 3, 225, 81, 69, 20, 9, 32, - 208, 82, 3, 162, 69, 20, 9, 32, 208, 82, 3, 224, 35, 69, 20, 9, 32, 208, - 82, 3, 86, 69, 20, 9, 32, 208, 220, 3, 162, 69, 20, 9, 32, 208, 220, 3, - 86, 69, 20, 9, 32, 239, 254, 3, 225, 81, 69, 20, 9, 32, 239, 254, 3, 162, - 69, 20, 9, 32, 239, 254, 3, 224, 35, 69, 20, 9, 32, 239, 254, 3, 86, 69, - 20, 9, 32, 203, 108, 3, 162, 69, 20, 9, 32, 203, 108, 3, 86, 69, 20, 9, - 32, 195, 109, 3, 86, 69, 20, 9, 32, 251, 41, 3, 225, 81, 69, 20, 9, 32, - 251, 41, 3, 86, 69, 20, 9, 32, 233, 108, 3, 225, 81, 69, 20, 9, 32, 233, - 108, 3, 86, 69, 20, 9, 32, 235, 57, 3, 225, 81, 69, 20, 9, 32, 235, 57, - 3, 162, 69, 20, 9, 32, 235, 57, 3, 224, 35, 69, 20, 9, 32, 235, 57, 3, - 86, 69, 20, 9, 32, 235, 57, 3, 149, 219, 230, 69, 20, 9, 32, 235, 57, 3, - 92, 69, 20, 9, 32, 211, 102, 3, 162, 69, 20, 9, 32, 211, 102, 3, 86, 69, - 20, 9, 32, 211, 102, 3, 149, 219, 230, 69, 20, 9, 32, 211, 102, 3, 92, - 69, 20, 9, 32, 224, 184, 3, 149, 69, 20, 9, 32, 224, 184, 3, 225, 81, 69, - 20, 9, 32, 224, 184, 3, 162, 69, 20, 9, 32, 224, 184, 3, 224, 35, 69, 20, - 9, 32, 224, 184, 3, 222, 151, 69, 20, 9, 32, 224, 184, 3, 86, 69, 20, 9, - 32, 224, 184, 3, 149, 219, 230, 69, 20, 9, 32, 224, 184, 3, 92, 69, 20, - 9, 32, 222, 151, 3, 225, 81, 69, 20, 9, 32, 222, 151, 3, 162, 69, 20, 9, - 32, 222, 151, 3, 224, 35, 69, 20, 9, 32, 222, 151, 3, 86, 69, 20, 9, 32, - 222, 151, 3, 149, 219, 230, 69, 20, 9, 32, 222, 151, 3, 92, 69, 20, 9, - 32, 86, 3, 225, 81, 69, 20, 9, 32, 86, 3, 162, 69, 20, 9, 32, 86, 3, 224, - 35, 69, 20, 9, 32, 86, 3, 86, 69, 20, 9, 32, 86, 3, 149, 219, 230, 69, - 20, 9, 32, 86, 3, 92, 69, 20, 9, 32, 215, 207, 3, 225, 81, 69, 20, 9, 32, - 215, 207, 3, 162, 69, 20, 9, 32, 215, 207, 3, 224, 35, 69, 20, 9, 32, - 215, 207, 3, 86, 69, 20, 9, 32, 215, 207, 3, 149, 219, 230, 69, 20, 9, - 32, 215, 207, 3, 92, 69, 20, 9, 32, 232, 0, 3, 225, 81, 69, 20, 9, 32, - 232, 0, 3, 86, 69, 20, 9, 32, 232, 0, 3, 149, 219, 230, 69, 20, 9, 32, - 232, 0, 3, 92, 69, 20, 9, 32, 92, 3, 225, 81, 69, 20, 9, 32, 92, 3, 162, - 69, 20, 9, 32, 92, 3, 224, 35, 69, 20, 9, 32, 92, 3, 86, 69, 20, 9, 32, - 92, 3, 149, 219, 230, 69, 20, 9, 32, 92, 3, 92, 69, 20, 9, 32, 202, 195, - 3, 204, 62, 149, 69, 20, 9, 32, 210, 93, 3, 204, 62, 149, 69, 20, 9, 32, - 149, 219, 230, 3, 204, 62, 149, 69, 20, 9, 32, 206, 253, 3, 239, 217, 69, - 20, 9, 32, 206, 253, 3, 224, 129, 69, 20, 9, 32, 206, 253, 3, 235, 81, - 69, 20, 9, 32, 206, 253, 3, 239, 219, 69, 20, 9, 32, 206, 253, 3, 224, - 131, 69, 20, 9, 32, 206, 253, 3, 204, 62, 149, 69, 20, 9, 32, 92, 3, 232, - 99, 89, 3, 210, 93, 48, 20, 9, 32, 92, 3, 232, 99, 89, 3, 195, 106, 48, - 20, 9, 32, 92, 3, 232, 99, 89, 3, 86, 48, 20, 9, 32, 92, 3, 232, 99, 89, - 3, 215, 207, 48, 20, 9, 32, 92, 3, 232, 99, 89, 3, 149, 219, 230, 48, 20, - 9, 32, 92, 3, 232, 99, 89, 3, 92, 48, 20, 9, 32, 248, 94, 3, 210, 93, 48, - 20, 9, 32, 248, 94, 3, 195, 106, 48, 20, 9, 32, 248, 94, 3, 86, 48, 20, - 9, 32, 248, 94, 3, 215, 207, 48, 20, 9, 32, 248, 94, 3, 149, 219, 230, - 48, 20, 9, 32, 248, 94, 3, 92, 48, 20, 9, 32, 203, 10, 3, 210, 93, 48, - 20, 9, 32, 203, 10, 3, 195, 106, 48, 20, 9, 32, 203, 10, 3, 86, 48, 20, - 9, 32, 203, 10, 3, 215, 207, 48, 20, 9, 32, 203, 10, 3, 149, 219, 230, - 48, 20, 9, 32, 203, 10, 3, 92, 48, 20, 9, 32, 202, 183, 3, 210, 93, 48, - 20, 9, 32, 202, 183, 3, 195, 106, 48, 20, 9, 32, 202, 183, 3, 86, 48, 20, - 9, 32, 202, 183, 3, 215, 207, 48, 20, 9, 32, 202, 183, 3, 149, 219, 230, - 48, 20, 9, 32, 202, 183, 3, 92, 48, 20, 9, 32, 235, 57, 3, 149, 219, 230, - 48, 20, 9, 32, 235, 57, 3, 92, 48, 20, 9, 32, 211, 102, 3, 149, 219, 230, - 48, 20, 9, 32, 211, 102, 3, 92, 48, 20, 9, 32, 224, 184, 3, 149, 48, 20, - 9, 32, 224, 184, 3, 222, 151, 48, 20, 9, 32, 224, 184, 3, 86, 48, 20, 9, - 32, 224, 184, 3, 149, 219, 230, 48, 20, 9, 32, 224, 184, 3, 92, 48, 20, - 9, 32, 222, 151, 3, 86, 48, 20, 9, 32, 222, 151, 3, 149, 219, 230, 48, - 20, 9, 32, 222, 151, 3, 92, 48, 20, 9, 32, 86, 3, 149, 48, 20, 9, 32, 86, - 3, 86, 48, 20, 9, 32, 215, 207, 3, 210, 93, 48, 20, 9, 32, 215, 207, 3, - 195, 106, 48, 20, 9, 32, 215, 207, 3, 86, 48, 20, 9, 32, 215, 207, 3, - 215, 207, 48, 20, 9, 32, 215, 207, 3, 149, 219, 230, 48, 20, 9, 32, 215, - 207, 3, 92, 48, 20, 9, 32, 149, 219, 230, 3, 204, 62, 149, 48, 20, 9, 32, - 92, 3, 210, 93, 48, 20, 9, 32, 92, 3, 195, 106, 48, 20, 9, 32, 92, 3, 86, - 48, 20, 9, 32, 92, 3, 215, 207, 48, 20, 9, 32, 92, 3, 149, 219, 230, 48, - 20, 9, 32, 92, 3, 92, 48, 20, 9, 32, 92, 3, 232, 99, 89, 3, 225, 81, 84, - 20, 9, 32, 92, 3, 232, 99, 89, 3, 162, 84, 20, 9, 32, 92, 3, 232, 99, 89, - 3, 224, 35, 84, 20, 9, 32, 92, 3, 232, 99, 89, 3, 86, 84, 20, 9, 32, 92, - 3, 232, 99, 89, 3, 232, 0, 84, 20, 9, 32, 248, 94, 3, 225, 81, 84, 20, 9, - 32, 248, 94, 3, 162, 84, 20, 9, 32, 248, 94, 3, 224, 35, 84, 20, 9, 32, - 248, 94, 3, 86, 84, 20, 9, 32, 248, 94, 3, 232, 0, 84, 20, 9, 32, 203, - 10, 3, 225, 81, 84, 20, 9, 32, 203, 10, 3, 162, 84, 20, 9, 32, 203, 10, - 3, 224, 35, 84, 20, 9, 32, 203, 10, 3, 86, 84, 20, 9, 32, 203, 10, 3, - 232, 0, 84, 20, 9, 32, 202, 183, 3, 86, 84, 20, 9, 32, 225, 81, 3, 162, - 84, 20, 9, 32, 225, 81, 3, 86, 84, 20, 9, 32, 162, 3, 225, 81, 84, 20, 9, - 32, 162, 3, 86, 84, 20, 9, 32, 224, 35, 3, 225, 81, 84, 20, 9, 32, 224, - 35, 3, 86, 84, 20, 9, 32, 208, 82, 3, 225, 81, 84, 20, 9, 32, 208, 82, 3, - 162, 84, 20, 9, 32, 208, 82, 3, 224, 35, 84, 20, 9, 32, 208, 82, 3, 86, - 84, 20, 9, 32, 208, 220, 3, 162, 84, 20, 9, 32, 208, 220, 3, 224, 35, 84, - 20, 9, 32, 208, 220, 3, 86, 84, 20, 9, 32, 239, 254, 3, 225, 81, 84, 20, - 9, 32, 239, 254, 3, 162, 84, 20, 9, 32, 239, 254, 3, 224, 35, 84, 20, 9, - 32, 239, 254, 3, 86, 84, 20, 9, 32, 203, 108, 3, 162, 84, 20, 9, 32, 195, - 109, 3, 86, 84, 20, 9, 32, 251, 41, 3, 225, 81, 84, 20, 9, 32, 251, 41, - 3, 86, 84, 20, 9, 32, 233, 108, 3, 225, 81, 84, 20, 9, 32, 233, 108, 3, - 86, 84, 20, 9, 32, 235, 57, 3, 225, 81, 84, 20, 9, 32, 235, 57, 3, 162, - 84, 20, 9, 32, 235, 57, 3, 224, 35, 84, 20, 9, 32, 235, 57, 3, 86, 84, - 20, 9, 32, 211, 102, 3, 162, 84, 20, 9, 32, 211, 102, 3, 86, 84, 20, 9, - 32, 224, 184, 3, 225, 81, 84, 20, 9, 32, 224, 184, 3, 162, 84, 20, 9, 32, - 224, 184, 3, 224, 35, 84, 20, 9, 32, 224, 184, 3, 222, 151, 84, 20, 9, - 32, 224, 184, 3, 86, 84, 20, 9, 32, 222, 151, 3, 225, 81, 84, 20, 9, 32, - 222, 151, 3, 162, 84, 20, 9, 32, 222, 151, 3, 224, 35, 84, 20, 9, 32, - 222, 151, 3, 86, 84, 20, 9, 32, 222, 151, 3, 232, 0, 84, 20, 9, 32, 86, - 3, 225, 81, 84, 20, 9, 32, 86, 3, 162, 84, 20, 9, 32, 86, 3, 224, 35, 84, - 20, 9, 32, 86, 3, 86, 84, 20, 9, 32, 215, 207, 3, 225, 81, 84, 20, 9, 32, - 215, 207, 3, 162, 84, 20, 9, 32, 215, 207, 3, 224, 35, 84, 20, 9, 32, - 215, 207, 3, 86, 84, 20, 9, 32, 215, 207, 3, 232, 0, 84, 20, 9, 32, 232, - 0, 3, 225, 81, 84, 20, 9, 32, 232, 0, 3, 86, 84, 20, 9, 32, 232, 0, 3, - 204, 62, 149, 84, 20, 9, 32, 92, 3, 225, 81, 84, 20, 9, 32, 92, 3, 162, - 84, 20, 9, 32, 92, 3, 224, 35, 84, 20, 9, 32, 92, 3, 86, 84, 20, 9, 32, - 92, 3, 232, 0, 84, 20, 9, 32, 92, 3, 232, 99, 89, 3, 86, 194, 194, 20, 9, - 32, 92, 3, 232, 99, 89, 3, 232, 0, 194, 194, 20, 9, 32, 248, 94, 3, 86, - 194, 194, 20, 9, 32, 248, 94, 3, 232, 0, 194, 194, 20, 9, 32, 203, 10, 3, - 86, 194, 194, 20, 9, 32, 203, 10, 3, 232, 0, 194, 194, 20, 9, 32, 202, - 183, 3, 86, 194, 194, 20, 9, 32, 202, 183, 3, 232, 0, 194, 194, 20, 9, - 32, 208, 82, 3, 86, 194, 194, 20, 9, 32, 208, 82, 3, 232, 0, 194, 194, - 20, 9, 32, 206, 208, 3, 86, 194, 194, 20, 9, 32, 206, 208, 3, 232, 0, - 194, 194, 20, 9, 32, 224, 184, 3, 222, 151, 194, 194, 20, 9, 32, 224, - 184, 3, 86, 194, 194, 20, 9, 32, 222, 151, 3, 86, 194, 194, 20, 9, 32, - 215, 207, 3, 86, 194, 194, 20, 9, 32, 215, 207, 3, 232, 0, 194, 194, 20, - 9, 32, 92, 3, 86, 194, 194, 20, 9, 32, 92, 3, 232, 0, 194, 194, 20, 9, - 32, 206, 253, 3, 235, 81, 194, 194, 20, 9, 32, 206, 253, 3, 239, 219, - 194, 194, 20, 9, 32, 206, 253, 3, 224, 131, 194, 194, 20, 9, 32, 203, - 108, 3, 149, 219, 230, 69, 20, 9, 32, 203, 108, 3, 92, 69, 20, 9, 32, - 251, 41, 3, 149, 219, 230, 69, 20, 9, 32, 251, 41, 3, 92, 69, 20, 9, 32, - 233, 108, 3, 149, 219, 230, 69, 20, 9, 32, 233, 108, 3, 92, 69, 20, 9, - 32, 208, 82, 3, 149, 219, 230, 69, 20, 9, 32, 208, 82, 3, 92, 69, 20, 9, - 32, 206, 208, 3, 149, 219, 230, 69, 20, 9, 32, 206, 208, 3, 92, 69, 20, - 9, 32, 162, 3, 149, 219, 230, 69, 20, 9, 32, 162, 3, 92, 69, 20, 9, 32, - 225, 81, 3, 149, 219, 230, 69, 20, 9, 32, 225, 81, 3, 92, 69, 20, 9, 32, - 224, 35, 3, 149, 219, 230, 69, 20, 9, 32, 224, 35, 3, 92, 69, 20, 9, 32, - 208, 220, 3, 149, 219, 230, 69, 20, 9, 32, 208, 220, 3, 92, 69, 20, 9, - 32, 239, 254, 3, 149, 219, 230, 69, 20, 9, 32, 239, 254, 3, 92, 69, 20, - 9, 32, 206, 208, 3, 225, 81, 69, 20, 9, 32, 206, 208, 3, 162, 69, 20, 9, - 32, 206, 208, 3, 224, 35, 69, 20, 9, 32, 206, 208, 3, 86, 69, 20, 9, 32, - 206, 208, 3, 210, 93, 69, 20, 9, 32, 208, 82, 3, 210, 93, 69, 20, 9, 32, - 208, 220, 3, 210, 93, 69, 20, 9, 32, 239, 254, 3, 210, 93, 69, 20, 9, 32, - 203, 108, 3, 149, 219, 230, 48, 20, 9, 32, 203, 108, 3, 92, 48, 20, 9, - 32, 251, 41, 3, 149, 219, 230, 48, 20, 9, 32, 251, 41, 3, 92, 48, 20, 9, - 32, 233, 108, 3, 149, 219, 230, 48, 20, 9, 32, 233, 108, 3, 92, 48, 20, - 9, 32, 208, 82, 3, 149, 219, 230, 48, 20, 9, 32, 208, 82, 3, 92, 48, 20, - 9, 32, 206, 208, 3, 149, 219, 230, 48, 20, 9, 32, 206, 208, 3, 92, 48, - 20, 9, 32, 162, 3, 149, 219, 230, 48, 20, 9, 32, 162, 3, 92, 48, 20, 9, - 32, 225, 81, 3, 149, 219, 230, 48, 20, 9, 32, 225, 81, 3, 92, 48, 20, 9, - 32, 224, 35, 3, 149, 219, 230, 48, 20, 9, 32, 224, 35, 3, 92, 48, 20, 9, - 32, 208, 220, 3, 149, 219, 230, 48, 20, 9, 32, 208, 220, 3, 92, 48, 20, - 9, 32, 239, 254, 3, 149, 219, 230, 48, 20, 9, 32, 239, 254, 3, 92, 48, - 20, 9, 32, 206, 208, 3, 225, 81, 48, 20, 9, 32, 206, 208, 3, 162, 48, 20, - 9, 32, 206, 208, 3, 224, 35, 48, 20, 9, 32, 206, 208, 3, 86, 48, 20, 9, - 32, 206, 208, 3, 210, 93, 48, 20, 9, 32, 208, 82, 3, 210, 93, 48, 20, 9, - 32, 208, 220, 3, 210, 93, 48, 20, 9, 32, 239, 254, 3, 210, 93, 48, 20, 9, - 32, 206, 208, 3, 225, 81, 84, 20, 9, 32, 206, 208, 3, 162, 84, 20, 9, 32, - 206, 208, 3, 224, 35, 84, 20, 9, 32, 206, 208, 3, 86, 84, 20, 9, 32, 208, - 82, 3, 232, 0, 84, 20, 9, 32, 206, 208, 3, 232, 0, 84, 20, 9, 32, 203, - 108, 3, 86, 84, 20, 9, 32, 208, 82, 3, 225, 81, 194, 194, 20, 9, 32, 208, - 82, 3, 162, 194, 194, 20, 9, 32, 208, 82, 3, 224, 35, 194, 194, 20, 9, - 32, 206, 208, 3, 225, 81, 194, 194, 20, 9, 32, 206, 208, 3, 162, 194, - 194, 20, 9, 32, 206, 208, 3, 224, 35, 194, 194, 20, 9, 32, 203, 108, 3, - 86, 194, 194, 20, 9, 32, 195, 109, 3, 86, 194, 194, 20, 9, 32, 149, 3, - 235, 79, 48, 20, 9, 32, 149, 3, 235, 79, 69, 20, 213, 245, 50, 213, 80, - 213, 245, 52, 213, 80, 9, 32, 203, 10, 3, 225, 81, 3, 86, 84, 20, 9, 32, - 203, 10, 3, 162, 3, 225, 81, 48, 20, 9, 32, 203, 10, 3, 162, 3, 225, 81, - 84, 20, 9, 32, 203, 10, 3, 162, 3, 86, 84, 20, 9, 32, 203, 10, 3, 224, - 35, 3, 86, 84, 20, 9, 32, 203, 10, 3, 86, 3, 225, 81, 84, 20, 9, 32, 203, - 10, 3, 86, 3, 162, 84, 20, 9, 32, 203, 10, 3, 86, 3, 224, 35, 84, 20, 9, - 32, 225, 81, 3, 86, 3, 162, 48, 20, 9, 32, 225, 81, 3, 86, 3, 162, 84, - 20, 9, 32, 162, 3, 86, 3, 92, 48, 20, 9, 32, 162, 3, 86, 3, 149, 219, - 230, 48, 20, 9, 32, 208, 82, 3, 162, 3, 225, 81, 84, 20, 9, 32, 208, 82, - 3, 225, 81, 3, 162, 84, 20, 9, 32, 208, 82, 3, 225, 81, 3, 149, 219, 230, - 48, 20, 9, 32, 208, 82, 3, 86, 3, 162, 48, 20, 9, 32, 208, 82, 3, 86, 3, - 162, 84, 20, 9, 32, 208, 82, 3, 86, 3, 225, 81, 84, 20, 9, 32, 208, 82, - 3, 86, 3, 86, 48, 20, 9, 32, 208, 82, 3, 86, 3, 86, 84, 20, 9, 32, 208, - 220, 3, 162, 3, 162, 48, 20, 9, 32, 208, 220, 3, 162, 3, 162, 84, 20, 9, - 32, 208, 220, 3, 86, 3, 86, 48, 20, 9, 32, 206, 208, 3, 162, 3, 86, 48, - 20, 9, 32, 206, 208, 3, 162, 3, 86, 84, 20, 9, 32, 206, 208, 3, 225, 81, - 3, 92, 48, 20, 9, 32, 206, 208, 3, 86, 3, 224, 35, 48, 20, 9, 32, 206, - 208, 3, 86, 3, 224, 35, 84, 20, 9, 32, 206, 208, 3, 86, 3, 86, 48, 20, 9, - 32, 206, 208, 3, 86, 3, 86, 84, 20, 9, 32, 239, 254, 3, 162, 3, 149, 219, - 230, 48, 20, 9, 32, 239, 254, 3, 224, 35, 3, 86, 48, 20, 9, 32, 239, 254, - 3, 224, 35, 3, 86, 84, 20, 9, 32, 203, 108, 3, 86, 3, 162, 48, 20, 9, 32, - 203, 108, 3, 86, 3, 162, 84, 20, 9, 32, 203, 108, 3, 86, 3, 86, 84, 20, - 9, 32, 203, 108, 3, 86, 3, 92, 48, 20, 9, 32, 251, 41, 3, 225, 81, 3, 86, - 48, 20, 9, 32, 251, 41, 3, 86, 3, 86, 48, 20, 9, 32, 251, 41, 3, 86, 3, - 86, 84, 20, 9, 32, 251, 41, 3, 86, 3, 149, 219, 230, 48, 20, 9, 32, 233, - 108, 3, 86, 3, 86, 48, 20, 9, 32, 233, 108, 3, 86, 3, 92, 48, 20, 9, 32, - 233, 108, 3, 86, 3, 149, 219, 230, 48, 20, 9, 32, 235, 57, 3, 224, 35, 3, - 86, 48, 20, 9, 32, 235, 57, 3, 224, 35, 3, 86, 84, 20, 9, 32, 211, 102, - 3, 86, 3, 162, 48, 20, 9, 32, 211, 102, 3, 86, 3, 86, 48, 20, 9, 32, 222, - 151, 3, 162, 3, 86, 48, 20, 9, 32, 222, 151, 3, 162, 3, 92, 48, 20, 9, - 32, 222, 151, 3, 162, 3, 149, 219, 230, 48, 20, 9, 32, 222, 151, 3, 225, - 81, 3, 225, 81, 84, 20, 9, 32, 222, 151, 3, 225, 81, 3, 225, 81, 48, 20, - 9, 32, 222, 151, 3, 224, 35, 3, 86, 48, 20, 9, 32, 222, 151, 3, 224, 35, - 3, 86, 84, 20, 9, 32, 222, 151, 3, 86, 3, 162, 48, 20, 9, 32, 222, 151, - 3, 86, 3, 162, 84, 20, 9, 32, 86, 3, 162, 3, 225, 81, 84, 20, 9, 32, 86, - 3, 162, 3, 86, 84, 20, 9, 32, 86, 3, 162, 3, 92, 48, 20, 9, 32, 86, 3, - 225, 81, 3, 162, 84, 20, 9, 32, 86, 3, 225, 81, 3, 86, 84, 20, 9, 32, 86, - 3, 224, 35, 3, 225, 81, 84, 20, 9, 32, 86, 3, 224, 35, 3, 86, 84, 20, 9, - 32, 86, 3, 225, 81, 3, 224, 35, 84, 20, 9, 32, 232, 0, 3, 86, 3, 225, 81, - 84, 20, 9, 32, 232, 0, 3, 86, 3, 86, 84, 20, 9, 32, 215, 207, 3, 162, 3, - 86, 84, 20, 9, 32, 215, 207, 3, 162, 3, 149, 219, 230, 48, 20, 9, 32, - 215, 207, 3, 225, 81, 3, 86, 48, 20, 9, 32, 215, 207, 3, 225, 81, 3, 86, - 84, 20, 9, 32, 215, 207, 3, 225, 81, 3, 149, 219, 230, 48, 20, 9, 32, - 215, 207, 3, 86, 3, 92, 48, 20, 9, 32, 215, 207, 3, 86, 3, 149, 219, 230, - 48, 20, 9, 32, 92, 3, 86, 3, 86, 48, 20, 9, 32, 92, 3, 86, 3, 86, 84, 20, - 9, 32, 248, 94, 3, 224, 35, 3, 92, 48, 20, 9, 32, 203, 10, 3, 225, 81, 3, - 92, 48, 20, 9, 32, 203, 10, 3, 225, 81, 3, 149, 219, 230, 48, 20, 9, 32, - 203, 10, 3, 224, 35, 3, 92, 48, 20, 9, 32, 203, 10, 3, 224, 35, 3, 149, - 219, 230, 48, 20, 9, 32, 203, 10, 3, 86, 3, 92, 48, 20, 9, 32, 203, 10, - 3, 86, 3, 149, 219, 230, 48, 20, 9, 32, 225, 81, 3, 86, 3, 92, 48, 20, 9, - 32, 225, 81, 3, 162, 3, 149, 219, 230, 48, 20, 9, 32, 225, 81, 3, 86, 3, - 149, 219, 230, 48, 20, 9, 32, 208, 82, 3, 224, 35, 3, 149, 219, 230, 48, - 20, 9, 32, 208, 220, 3, 162, 3, 92, 48, 20, 9, 32, 206, 208, 3, 162, 3, - 92, 48, 20, 9, 32, 239, 254, 3, 162, 3, 92, 48, 20, 9, 32, 222, 151, 3, - 225, 81, 3, 92, 48, 20, 9, 32, 222, 151, 3, 86, 3, 92, 48, 20, 9, 32, 92, - 3, 162, 3, 92, 48, 20, 9, 32, 92, 3, 225, 81, 3, 92, 48, 20, 9, 32, 92, - 3, 86, 3, 92, 48, 20, 9, 32, 86, 3, 86, 3, 92, 48, 20, 9, 32, 211, 102, - 3, 86, 3, 92, 48, 20, 9, 32, 215, 207, 3, 162, 3, 92, 48, 20, 9, 32, 211, - 102, 3, 86, 3, 162, 84, 20, 9, 32, 222, 151, 3, 162, 3, 86, 84, 20, 9, - 32, 251, 41, 3, 86, 3, 92, 48, 20, 9, 32, 224, 184, 3, 86, 3, 92, 48, 20, - 9, 32, 215, 207, 3, 225, 81, 3, 162, 84, 20, 9, 32, 86, 3, 224, 35, 3, - 92, 48, 20, 9, 32, 222, 151, 3, 225, 81, 3, 86, 84, 20, 9, 32, 224, 184, - 3, 86, 3, 86, 48, 20, 9, 32, 222, 151, 3, 225, 81, 3, 86, 48, 20, 9, 32, - 215, 207, 3, 225, 81, 3, 162, 48, 20, 9, 32, 225, 81, 3, 162, 3, 92, 48, - 20, 9, 32, 162, 3, 225, 81, 3, 92, 48, 20, 9, 32, 86, 3, 225, 81, 3, 92, - 48, 20, 9, 32, 235, 57, 3, 86, 3, 92, 48, 20, 9, 32, 248, 94, 3, 162, 3, - 92, 48, 20, 9, 32, 224, 184, 3, 86, 3, 86, 84, 20, 9, 32, 251, 41, 3, - 225, 81, 3, 86, 84, 20, 9, 32, 208, 220, 3, 86, 3, 86, 84, 20, 9, 32, - 208, 82, 3, 224, 35, 3, 92, 48, 20, 9, 32, 215, 207, 3, 225, 81, 3, 92, - 48, 20, 9, 32, 208, 191, 199, 239, 250, 53, 223, 133, 204, 194, 2, 69, - 20, 9, 32, 211, 98, 199, 239, 250, 53, 223, 133, 204, 194, 2, 69, 20, 9, - 32, 250, 247, 69, 20, 9, 32, 251, 24, 69, 20, 9, 32, 218, 127, 69, 20, 9, - 32, 208, 192, 69, 20, 9, 32, 210, 149, 69, 20, 9, 32, 251, 13, 69, 20, 9, - 32, 197, 129, 69, 20, 9, 32, 208, 191, 69, 20, 9, 32, 208, 190, 251, 13, - 197, 128, 9, 32, 225, 96, 210, 15, 56, 9, 32, 248, 5, 250, 116, 250, 117, - 60, 208, 69, 60, 207, 214, 60, 207, 146, 60, 207, 135, 60, 207, 124, 60, - 207, 113, 60, 207, 102, 60, 207, 91, 60, 207, 80, 60, 208, 68, 60, 208, - 57, 60, 208, 46, 60, 208, 35, 60, 208, 24, 60, 208, 13, 60, 208, 2, 211, - 228, 234, 161, 38, 83, 244, 23, 211, 228, 234, 161, 38, 83, 141, 244, 23, - 211, 228, 234, 161, 38, 83, 141, 234, 98, 204, 193, 211, 228, 234, 161, - 38, 83, 244, 32, 211, 228, 234, 161, 38, 83, 207, 61, 211, 228, 234, 161, - 38, 83, 235, 225, 78, 211, 228, 234, 161, 38, 83, 211, 28, 78, 211, 228, - 234, 161, 38, 83, 50, 67, 222, 49, 170, 211, 228, 234, 161, 38, 83, 52, - 67, 222, 49, 247, 173, 211, 228, 234, 161, 38, 83, 231, 43, 236, 122, 37, - 32, 50, 232, 108, 37, 32, 52, 232, 108, 37, 54, 202, 57, 50, 232, 108, - 37, 54, 202, 57, 52, 232, 108, 37, 220, 19, 50, 232, 108, 37, 220, 19, - 52, 232, 108, 37, 241, 7, 220, 18, 37, 32, 50, 155, 58, 37, 32, 52, 155, - 58, 37, 202, 57, 50, 155, 58, 37, 202, 57, 52, 155, 58, 37, 220, 19, 50, - 155, 58, 37, 220, 19, 52, 155, 58, 37, 241, 7, 220, 19, 58, 37, 40, 202, - 27, 50, 232, 108, 37, 40, 202, 27, 52, 232, 108, 211, 228, 234, 161, 38, - 83, 114, 76, 222, 97, 211, 228, 234, 161, 38, 83, 236, 118, 239, 188, - 211, 228, 234, 161, 38, 83, 236, 107, 239, 188, 211, 228, 234, 161, 38, - 83, 125, 221, 233, 211, 228, 234, 161, 38, 83, 197, 111, 125, 221, 233, - 211, 228, 234, 161, 38, 83, 50, 213, 80, 211, 228, 234, 161, 38, 83, 52, - 213, 80, 211, 228, 234, 161, 38, 83, 50, 240, 141, 170, 211, 228, 234, - 161, 38, 83, 52, 240, 141, 170, 211, 228, 234, 161, 38, 83, 50, 201, 210, - 206, 201, 170, 211, 228, 234, 161, 38, 83, 52, 201, 210, 206, 201, 170, - 211, 228, 234, 161, 38, 83, 50, 64, 222, 49, 170, 211, 228, 234, 161, 38, - 83, 52, 64, 222, 49, 170, 211, 228, 234, 161, 38, 83, 50, 54, 250, 193, - 170, 211, 228, 234, 161, 38, 83, 52, 54, 250, 193, 170, 211, 228, 234, - 161, 38, 83, 50, 250, 193, 170, 211, 228, 234, 161, 38, 83, 52, 250, 193, - 170, 211, 228, 234, 161, 38, 83, 50, 240, 222, 170, 211, 228, 234, 161, - 38, 83, 52, 240, 222, 170, 211, 228, 234, 161, 38, 83, 50, 67, 240, 222, - 170, 211, 228, 234, 161, 38, 83, 52, 67, 240, 222, 170, 207, 36, 238, - 123, 67, 207, 36, 238, 123, 211, 228, 234, 161, 38, 83, 50, 46, 170, 211, - 228, 234, 161, 38, 83, 52, 46, 170, 239, 187, 213, 210, 246, 152, 213, - 210, 197, 111, 213, 210, 54, 197, 111, 213, 210, 239, 187, 125, 221, 233, - 246, 152, 125, 221, 233, 197, 111, 125, 221, 233, 4, 244, 23, 4, 141, - 244, 23, 4, 234, 98, 204, 193, 4, 207, 61, 4, 244, 32, 4, 211, 28, 78, 4, - 235, 225, 78, 4, 236, 118, 239, 188, 4, 50, 213, 80, 4, 52, 213, 80, 4, - 50, 240, 141, 170, 4, 52, 240, 141, 170, 4, 50, 201, 210, 206, 201, 170, - 4, 52, 201, 210, 206, 201, 170, 4, 35, 56, 4, 250, 213, 4, 250, 29, 4, - 96, 56, 4, 230, 150, 4, 222, 42, 56, 4, 232, 232, 56, 4, 236, 49, 56, 4, - 210, 41, 205, 139, 4, 238, 136, 56, 4, 212, 244, 56, 4, 244, 21, 250, 18, - 9, 235, 79, 69, 20, 9, 203, 60, 3, 235, 79, 57, 9, 239, 217, 69, 20, 9, - 203, 104, 234, 134, 9, 224, 129, 69, 20, 9, 235, 81, 69, 20, 9, 235, 81, - 194, 194, 20, 9, 239, 219, 69, 20, 9, 239, 219, 194, 194, 20, 9, 224, - 131, 69, 20, 9, 224, 131, 194, 194, 20, 9, 206, 253, 69, 20, 9, 206, 253, - 194, 194, 20, 9, 204, 87, 69, 20, 9, 204, 87, 194, 194, 20, 9, 1, 232, - 99, 69, 20, 9, 1, 149, 3, 220, 14, 89, 69, 20, 9, 1, 149, 3, 220, 14, 89, - 48, 20, 9, 1, 149, 3, 232, 99, 89, 69, 20, 9, 1, 149, 3, 232, 99, 89, 48, - 20, 9, 1, 197, 110, 3, 232, 99, 89, 69, 20, 9, 1, 197, 110, 3, 232, 99, - 89, 48, 20, 9, 1, 149, 3, 232, 99, 248, 81, 69, 20, 9, 1, 149, 3, 232, - 99, 248, 81, 48, 20, 9, 1, 92, 3, 232, 99, 89, 69, 20, 9, 1, 92, 3, 232, - 99, 89, 48, 20, 9, 1, 92, 3, 232, 99, 89, 84, 20, 9, 1, 92, 3, 232, 99, - 89, 194, 194, 20, 9, 1, 149, 69, 20, 9, 1, 149, 48, 20, 9, 1, 248, 94, - 69, 20, 9, 1, 248, 94, 48, 20, 9, 1, 248, 94, 84, 20, 9, 1, 248, 94, 194, - 194, 20, 9, 1, 203, 10, 219, 197, 69, 20, 9, 1, 203, 10, 219, 197, 48, - 20, 9, 1, 203, 10, 69, 20, 9, 1, 203, 10, 48, 20, 9, 1, 203, 10, 84, 20, - 9, 1, 203, 10, 194, 194, 20, 9, 1, 202, 183, 69, 20, 9, 1, 202, 183, 48, - 20, 9, 1, 202, 183, 84, 20, 9, 1, 202, 183, 194, 194, 20, 9, 1, 225, 81, - 69, 20, 9, 1, 225, 81, 48, 20, 9, 1, 225, 81, 84, 20, 9, 1, 225, 81, 194, - 194, 20, 9, 1, 162, 69, 20, 9, 1, 162, 48, 20, 9, 1, 162, 84, 20, 9, 1, - 162, 194, 194, 20, 9, 1, 224, 35, 69, 20, 9, 1, 224, 35, 48, 20, 9, 1, - 224, 35, 84, 20, 9, 1, 224, 35, 194, 194, 20, 9, 1, 239, 231, 69, 20, 9, - 1, 239, 231, 48, 20, 9, 1, 202, 195, 69, 20, 9, 1, 202, 195, 48, 20, 9, - 1, 210, 93, 69, 20, 9, 1, 210, 93, 48, 20, 9, 1, 195, 106, 69, 20, 9, 1, - 195, 106, 48, 20, 9, 1, 208, 82, 69, 20, 9, 1, 208, 82, 48, 20, 9, 1, - 208, 82, 84, 20, 9, 1, 208, 82, 194, 194, 20, 9, 1, 206, 208, 69, 20, 9, - 1, 206, 208, 48, 20, 9, 1, 206, 208, 84, 20, 9, 1, 206, 208, 194, 194, - 20, 9, 1, 208, 220, 69, 20, 9, 1, 208, 220, 48, 20, 9, 1, 208, 220, 84, - 20, 9, 1, 208, 220, 194, 194, 20, 9, 1, 239, 254, 69, 20, 9, 1, 239, 254, - 48, 20, 9, 1, 239, 254, 84, 20, 9, 1, 239, 254, 194, 194, 20, 9, 1, 203, - 108, 69, 20, 9, 1, 203, 108, 48, 20, 9, 1, 203, 108, 84, 20, 9, 1, 203, - 108, 194, 194, 20, 9, 1, 195, 109, 69, 20, 9, 1, 195, 109, 48, 20, 9, 1, - 195, 109, 84, 20, 9, 1, 195, 109, 194, 194, 20, 9, 1, 251, 41, 69, 20, 9, - 1, 251, 41, 48, 20, 9, 1, 251, 41, 84, 20, 9, 1, 251, 41, 194, 194, 20, - 9, 1, 233, 108, 69, 20, 9, 1, 233, 108, 48, 20, 9, 1, 233, 108, 84, 20, - 9, 1, 233, 108, 194, 194, 20, 9, 1, 235, 57, 69, 20, 9, 1, 235, 57, 48, - 20, 9, 1, 235, 57, 84, 20, 9, 1, 235, 57, 194, 194, 20, 9, 1, 211, 102, - 69, 20, 9, 1, 211, 102, 48, 20, 9, 1, 211, 102, 84, 20, 9, 1, 211, 102, - 194, 194, 20, 9, 1, 224, 184, 69, 20, 9, 1, 224, 184, 48, 20, 9, 1, 224, - 184, 84, 20, 9, 1, 224, 184, 194, 194, 20, 9, 1, 222, 151, 69, 20, 9, 1, - 222, 151, 48, 20, 9, 1, 222, 151, 84, 20, 9, 1, 222, 151, 194, 194, 20, - 9, 1, 86, 69, 20, 9, 1, 86, 48, 20, 9, 1, 86, 84, 20, 9, 1, 86, 194, 194, - 20, 9, 1, 215, 207, 69, 20, 9, 1, 215, 207, 48, 20, 9, 1, 215, 207, 84, - 20, 9, 1, 215, 207, 194, 194, 20, 9, 1, 232, 0, 69, 20, 9, 1, 232, 0, 48, - 20, 9, 1, 232, 0, 84, 20, 9, 1, 232, 0, 194, 194, 20, 9, 1, 197, 110, 69, - 20, 9, 1, 197, 110, 48, 20, 9, 1, 149, 219, 230, 69, 20, 9, 1, 149, 219, - 230, 48, 20, 9, 1, 92, 69, 20, 9, 1, 92, 48, 20, 9, 1, 92, 84, 20, 9, 1, - 92, 194, 194, 20, 9, 32, 222, 151, 3, 149, 3, 220, 14, 89, 69, 20, 9, 32, - 222, 151, 3, 149, 3, 220, 14, 89, 48, 20, 9, 32, 222, 151, 3, 149, 3, - 232, 99, 89, 69, 20, 9, 32, 222, 151, 3, 149, 3, 232, 99, 89, 48, 20, 9, - 32, 222, 151, 3, 149, 3, 232, 99, 248, 81, 69, 20, 9, 32, 222, 151, 3, - 149, 3, 232, 99, 248, 81, 48, 20, 9, 32, 222, 151, 3, 149, 69, 20, 9, 32, - 222, 151, 3, 149, 48, 20, 195, 80, 197, 53, 215, 219, 205, 110, 166, 235, - 225, 78, 166, 211, 11, 78, 166, 35, 56, 166, 238, 136, 56, 166, 212, 244, - 56, 166, 250, 213, 166, 250, 134, 166, 50, 213, 80, 166, 52, 213, 80, - 166, 250, 29, 166, 96, 56, 166, 244, 23, 166, 230, 150, 166, 234, 98, - 204, 193, 166, 205, 139, 166, 17, 195, 79, 166, 17, 98, 166, 17, 103, - 166, 17, 135, 166, 17, 136, 166, 17, 150, 166, 17, 174, 166, 17, 182, - 166, 17, 178, 166, 17, 184, 166, 244, 32, 166, 207, 61, 166, 222, 42, 56, - 166, 236, 49, 56, 166, 232, 232, 56, 166, 211, 28, 78, 166, 244, 21, 250, - 18, 166, 8, 6, 1, 63, 166, 8, 6, 1, 249, 219, 166, 8, 6, 1, 247, 69, 166, - 8, 6, 1, 240, 98, 166, 8, 6, 1, 70, 166, 8, 6, 1, 235, 184, 166, 8, 6, 1, - 234, 71, 166, 8, 6, 1, 232, 154, 166, 8, 6, 1, 68, 166, 8, 6, 1, 225, - 108, 166, 8, 6, 1, 224, 227, 166, 8, 6, 1, 158, 166, 8, 6, 1, 221, 40, - 166, 8, 6, 1, 217, 225, 166, 8, 6, 1, 74, 166, 8, 6, 1, 213, 195, 166, 8, - 6, 1, 211, 116, 166, 8, 6, 1, 143, 166, 8, 6, 1, 209, 35, 166, 8, 6, 1, - 203, 185, 166, 8, 6, 1, 66, 166, 8, 6, 1, 199, 215, 166, 8, 6, 1, 197, - 189, 166, 8, 6, 1, 196, 216, 166, 8, 6, 1, 196, 143, 166, 8, 6, 1, 195, - 157, 166, 50, 46, 170, 166, 210, 41, 205, 139, 166, 52, 46, 170, 166, - 244, 105, 251, 122, 166, 125, 221, 233, 166, 232, 239, 251, 122, 166, 8, - 4, 1, 63, 166, 8, 4, 1, 249, 219, 166, 8, 4, 1, 247, 69, 166, 8, 4, 1, - 240, 98, 166, 8, 4, 1, 70, 166, 8, 4, 1, 235, 184, 166, 8, 4, 1, 234, 71, - 166, 8, 4, 1, 232, 154, 166, 8, 4, 1, 68, 166, 8, 4, 1, 225, 108, 166, 8, - 4, 1, 224, 227, 166, 8, 4, 1, 158, 166, 8, 4, 1, 221, 40, 166, 8, 4, 1, - 217, 225, 166, 8, 4, 1, 74, 166, 8, 4, 1, 213, 195, 166, 8, 4, 1, 211, - 116, 166, 8, 4, 1, 143, 166, 8, 4, 1, 209, 35, 166, 8, 4, 1, 203, 185, - 166, 8, 4, 1, 66, 166, 8, 4, 1, 199, 215, 166, 8, 4, 1, 197, 189, 166, 8, - 4, 1, 196, 216, 166, 8, 4, 1, 196, 143, 166, 8, 4, 1, 195, 157, 166, 50, - 240, 141, 170, 166, 83, 221, 233, 166, 52, 240, 141, 170, 166, 202, 56, - 166, 50, 67, 213, 80, 166, 52, 67, 213, 80, 137, 141, 234, 98, 204, 193, - 137, 50, 240, 222, 170, 137, 52, 240, 222, 170, 137, 141, 244, 23, 137, - 73, 108, 238, 123, 137, 73, 1, 197, 28, 137, 73, 1, 4, 63, 137, 73, 1, 4, - 68, 137, 73, 1, 4, 66, 137, 73, 1, 4, 70, 137, 73, 1, 4, 74, 137, 73, 1, - 4, 165, 137, 73, 1, 4, 195, 215, 137, 73, 1, 4, 196, 0, 137, 73, 1, 4, - 201, 20, 137, 224, 126, 211, 200, 205, 124, 78, 137, 73, 1, 63, 137, 73, - 1, 68, 137, 73, 1, 66, 137, 73, 1, 70, 137, 73, 1, 74, 137, 73, 1, 157, - 137, 73, 1, 223, 249, 137, 73, 1, 223, 86, 137, 73, 1, 224, 101, 137, 73, - 1, 223, 165, 137, 73, 1, 187, 137, 73, 1, 206, 69, 137, 73, 1, 204, 139, - 137, 73, 1, 208, 103, 137, 73, 1, 205, 162, 137, 73, 1, 203, 137, 137, - 73, 1, 202, 94, 137, 73, 1, 201, 20, 137, 73, 1, 203, 36, 137, 73, 1, - 147, 137, 73, 1, 179, 137, 73, 1, 216, 141, 137, 73, 1, 215, 111, 137, - 73, 1, 217, 34, 137, 73, 1, 215, 225, 137, 73, 1, 142, 137, 73, 1, 231, - 214, 137, 73, 1, 230, 219, 137, 73, 1, 232, 32, 137, 73, 1, 231, 81, 137, - 73, 1, 168, 137, 73, 1, 218, 243, 137, 73, 1, 218, 56, 137, 73, 1, 219, - 114, 137, 73, 1, 218, 160, 137, 73, 1, 165, 137, 73, 1, 195, 215, 137, - 73, 1, 196, 0, 137, 73, 1, 173, 137, 73, 1, 210, 23, 137, 73, 1, 209, 95, - 137, 73, 1, 210, 133, 137, 73, 1, 209, 185, 137, 73, 1, 197, 156, 137, - 73, 1, 217, 225, 137, 73, 198, 233, 205, 124, 78, 137, 73, 207, 66, 205, - 124, 78, 137, 29, 235, 14, 137, 29, 1, 223, 198, 137, 29, 1, 205, 35, - 137, 29, 1, 223, 191, 137, 29, 1, 216, 126, 137, 29, 1, 216, 124, 137, - 29, 1, 216, 123, 137, 29, 1, 202, 69, 137, 29, 1, 205, 24, 137, 29, 1, - 210, 6, 137, 29, 1, 210, 1, 137, 29, 1, 209, 254, 137, 29, 1, 209, 247, - 137, 29, 1, 209, 242, 137, 29, 1, 209, 237, 137, 29, 1, 209, 248, 137, - 29, 1, 210, 4, 137, 29, 1, 218, 221, 137, 29, 1, 212, 149, 137, 29, 1, - 205, 32, 137, 29, 1, 212, 138, 137, 29, 1, 206, 9, 137, 29, 1, 205, 29, - 137, 29, 1, 226, 31, 137, 29, 1, 244, 126, 137, 29, 1, 205, 39, 137, 29, - 1, 244, 191, 137, 29, 1, 224, 14, 137, 29, 1, 202, 160, 137, 29, 1, 212, - 187, 137, 29, 1, 231, 198, 137, 29, 1, 63, 137, 29, 1, 251, 90, 137, 29, - 1, 165, 137, 29, 1, 196, 113, 137, 29, 1, 236, 69, 137, 29, 1, 70, 137, - 29, 1, 196, 52, 137, 29, 1, 196, 65, 137, 29, 1, 74, 137, 29, 1, 197, - 156, 137, 29, 1, 197, 147, 137, 29, 1, 214, 91, 137, 29, 1, 196, 0, 137, - 29, 1, 66, 137, 29, 1, 197, 83, 137, 29, 1, 197, 101, 137, 29, 1, 197, - 64, 137, 29, 1, 195, 215, 137, 29, 1, 235, 251, 137, 29, 1, 196, 20, 137, - 29, 1, 68, 166, 246, 158, 56, 166, 212, 10, 56, 166, 215, 194, 56, 166, - 220, 18, 166, 247, 149, 153, 166, 196, 56, 56, 166, 197, 11, 56, 137, - 234, 156, 167, 199, 88, 137, 104, 51, 137, 200, 8, 51, 137, 90, 51, 137, - 237, 103, 51, 137, 64, 205, 57, 137, 67, 244, 113, 225, 175, 250, 180, - 250, 204, 225, 175, 250, 180, 207, 46, 225, 175, 250, 180, 202, 233, 214, - 110, 210, 65, 246, 119, 210, 65, 246, 119, 30, 72, 5, 249, 203, 63, 30, - 72, 5, 249, 172, 70, 30, 72, 5, 249, 181, 68, 30, 72, 5, 249, 149, 74, - 30, 72, 5, 249, 199, 66, 30, 72, 5, 249, 218, 240, 3, 30, 72, 5, 249, - 165, 239, 119, 30, 72, 5, 249, 205, 239, 20, 30, 72, 5, 249, 195, 238, - 154, 30, 72, 5, 249, 159, 237, 74, 30, 72, 5, 249, 153, 225, 105, 30, 72, - 5, 249, 164, 225, 84, 30, 72, 5, 249, 174, 225, 20, 30, 72, 5, 249, 145, - 225, 1, 30, 72, 5, 249, 133, 157, 30, 72, 5, 249, 166, 224, 101, 30, 72, - 5, 249, 143, 223, 249, 30, 72, 5, 249, 140, 223, 165, 30, 72, 5, 249, - 129, 223, 86, 30, 72, 5, 249, 130, 168, 30, 72, 5, 249, 196, 219, 114, - 30, 72, 5, 249, 137, 218, 243, 30, 72, 5, 249, 194, 218, 160, 30, 72, 5, - 249, 186, 218, 56, 30, 72, 5, 249, 207, 179, 30, 72, 5, 249, 185, 217, - 34, 30, 72, 5, 249, 179, 216, 141, 30, 72, 5, 249, 158, 215, 225, 30, 72, - 5, 249, 155, 215, 111, 30, 72, 5, 249, 214, 163, 30, 72, 5, 249, 138, - 213, 35, 30, 72, 5, 249, 171, 212, 163, 30, 72, 5, 249, 198, 212, 62, 30, - 72, 5, 249, 160, 211, 175, 30, 72, 5, 249, 193, 211, 108, 30, 72, 5, 249, - 132, 211, 88, 30, 72, 5, 249, 188, 211, 70, 30, 72, 5, 249, 177, 211, 58, - 30, 72, 5, 249, 150, 173, 30, 72, 5, 249, 182, 210, 133, 30, 72, 5, 249, - 157, 210, 23, 30, 72, 5, 249, 216, 209, 185, 30, 72, 5, 249, 183, 209, - 95, 30, 72, 5, 249, 178, 187, 30, 72, 5, 249, 201, 208, 103, 30, 72, 5, - 249, 169, 206, 69, 30, 72, 5, 249, 197, 205, 162, 30, 72, 5, 249, 152, - 204, 139, 30, 72, 5, 249, 151, 203, 137, 30, 72, 5, 249, 212, 203, 36, - 30, 72, 5, 249, 173, 202, 94, 30, 72, 5, 249, 210, 147, 30, 72, 5, 249, - 141, 201, 20, 30, 72, 5, 249, 156, 197, 156, 30, 72, 5, 249, 135, 197, - 101, 30, 72, 5, 249, 170, 197, 64, 30, 72, 5, 249, 168, 197, 28, 30, 72, - 5, 249, 192, 195, 114, 30, 72, 5, 249, 136, 195, 88, 30, 72, 5, 249, 189, - 195, 11, 30, 72, 5, 249, 184, 254, 19, 30, 72, 5, 249, 167, 253, 163, 30, - 72, 5, 249, 126, 250, 0, 30, 72, 5, 249, 139, 237, 39, 30, 72, 5, 249, - 122, 237, 38, 30, 72, 5, 249, 162, 215, 43, 30, 72, 5, 249, 180, 211, - 173, 30, 72, 5, 249, 148, 211, 177, 30, 72, 5, 249, 134, 210, 195, 30, - 72, 5, 249, 176, 210, 194, 30, 72, 5, 249, 142, 209, 178, 30, 72, 5, 249, - 144, 203, 131, 30, 72, 5, 249, 124, 200, 223, 30, 72, 5, 249, 121, 103, - 30, 72, 16, 249, 191, 30, 72, 16, 249, 190, 30, 72, 16, 249, 187, 30, 72, - 16, 249, 175, 30, 72, 16, 249, 163, 30, 72, 16, 249, 161, 30, 72, 16, - 249, 154, 30, 72, 16, 249, 147, 30, 72, 16, 249, 146, 30, 72, 16, 249, - 131, 30, 72, 16, 249, 128, 30, 72, 16, 249, 127, 30, 72, 16, 249, 125, - 30, 72, 16, 249, 123, 30, 72, 145, 249, 120, 219, 222, 30, 72, 145, 249, - 119, 197, 15, 30, 72, 145, 249, 118, 239, 102, 30, 72, 145, 249, 117, - 236, 46, 30, 72, 145, 249, 116, 219, 190, 30, 72, 145, 249, 115, 204, - 234, 30, 72, 145, 249, 114, 235, 232, 30, 72, 145, 249, 113, 210, 159, - 30, 72, 145, 249, 112, 206, 210, 30, 72, 145, 249, 111, 232, 24, 30, 72, - 145, 249, 110, 205, 118, 30, 72, 145, 249, 109, 247, 228, 30, 72, 145, - 249, 108, 240, 204, 30, 72, 145, 249, 107, 247, 124, 30, 72, 145, 249, - 106, 197, 72, 30, 72, 145, 249, 105, 248, 186, 30, 72, 145, 249, 104, - 214, 58, 30, 72, 145, 249, 103, 205, 89, 30, 72, 145, 249, 102, 240, 106, - 30, 72, 218, 114, 249, 101, 224, 152, 30, 72, 218, 114, 249, 100, 224, - 163, 30, 72, 145, 249, 99, 214, 73, 30, 72, 145, 249, 98, 197, 40, 30, - 72, 145, 249, 97, 30, 72, 218, 114, 249, 96, 250, 92, 30, 72, 218, 114, - 249, 95, 219, 65, 30, 72, 145, 249, 94, 247, 148, 30, 72, 145, 249, 93, - 233, 17, 30, 72, 145, 249, 92, 30, 72, 145, 249, 91, 197, 6, 30, 72, 145, - 249, 90, 30, 72, 145, 249, 89, 30, 72, 145, 249, 88, 230, 246, 30, 72, - 145, 249, 87, 30, 72, 145, 249, 86, 30, 72, 145, 249, 85, 30, 72, 218, - 114, 249, 83, 200, 238, 30, 72, 145, 249, 82, 30, 72, 145, 249, 81, 30, - 72, 145, 249, 80, 244, 61, 30, 72, 145, 249, 79, 30, 72, 145, 249, 78, - 30, 72, 145, 249, 77, 233, 217, 30, 72, 145, 249, 76, 250, 79, 30, 72, - 145, 249, 75, 30, 72, 145, 249, 74, 30, 72, 145, 249, 73, 30, 72, 145, - 249, 72, 30, 72, 145, 249, 71, 30, 72, 145, 249, 70, 30, 72, 145, 249, - 69, 30, 72, 145, 249, 68, 30, 72, 145, 249, 67, 30, 72, 145, 249, 66, - 218, 106, 30, 72, 145, 249, 65, 30, 72, 145, 249, 64, 201, 170, 30, 72, - 145, 249, 63, 30, 72, 145, 249, 62, 30, 72, 145, 249, 61, 30, 72, 145, - 249, 60, 30, 72, 145, 249, 59, 30, 72, 145, 249, 58, 30, 72, 145, 249, - 57, 30, 72, 145, 249, 56, 30, 72, 145, 249, 55, 30, 72, 145, 249, 54, 30, - 72, 145, 249, 53, 30, 72, 145, 249, 52, 231, 246, 30, 72, 145, 249, 31, - 234, 170, 30, 72, 145, 249, 28, 248, 161, 30, 72, 145, 249, 23, 205, 96, - 30, 72, 145, 249, 22, 51, 30, 72, 145, 249, 21, 30, 72, 145, 249, 20, - 204, 16, 30, 72, 145, 249, 19, 30, 72, 145, 249, 18, 30, 72, 145, 249, - 17, 197, 68, 244, 232, 30, 72, 145, 249, 16, 244, 232, 30, 72, 145, 249, - 15, 244, 233, 234, 131, 30, 72, 145, 249, 14, 197, 70, 30, 72, 145, 249, - 13, 30, 72, 145, 249, 12, 30, 72, 218, 114, 249, 11, 238, 211, 30, 72, - 145, 249, 10, 30, 72, 145, 249, 9, 30, 72, 145, 249, 7, 30, 72, 145, 249, - 6, 30, 72, 145, 249, 5, 30, 72, 145, 249, 4, 239, 191, 30, 72, 145, 249, - 3, 30, 72, 145, 249, 2, 30, 72, 145, 249, 1, 30, 72, 145, 249, 0, 30, 72, - 145, 248, 255, 30, 72, 145, 199, 35, 249, 84, 30, 72, 145, 199, 35, 249, - 51, 30, 72, 145, 199, 35, 249, 50, 30, 72, 145, 199, 35, 249, 49, 30, 72, - 145, 199, 35, 249, 48, 30, 72, 145, 199, 35, 249, 47, 30, 72, 145, 199, - 35, 249, 46, 30, 72, 145, 199, 35, 249, 45, 30, 72, 145, 199, 35, 249, - 44, 30, 72, 145, 199, 35, 249, 43, 30, 72, 145, 199, 35, 249, 42, 30, 72, - 145, 199, 35, 249, 41, 30, 72, 145, 199, 35, 249, 40, 30, 72, 145, 199, - 35, 249, 39, 30, 72, 145, 199, 35, 249, 38, 30, 72, 145, 199, 35, 249, - 37, 30, 72, 145, 199, 35, 249, 36, 30, 72, 145, 199, 35, 249, 35, 30, 72, - 145, 199, 35, 249, 34, 30, 72, 145, 199, 35, 249, 33, 30, 72, 145, 199, - 35, 249, 32, 30, 72, 145, 199, 35, 249, 30, 30, 72, 145, 199, 35, 249, - 29, 30, 72, 145, 199, 35, 249, 27, 30, 72, 145, 199, 35, 249, 26, 30, 72, - 145, 199, 35, 249, 25, 30, 72, 145, 199, 35, 249, 24, 30, 72, 145, 199, - 35, 249, 8, 30, 72, 145, 199, 35, 248, 254, 251, 83, 197, 3, 207, 47, - 221, 233, 251, 83, 197, 3, 207, 47, 238, 123, 251, 83, 244, 222, 78, 251, - 83, 35, 98, 251, 83, 35, 103, 251, 83, 35, 135, 251, 83, 35, 136, 251, - 83, 35, 150, 251, 83, 35, 174, 251, 83, 35, 182, 251, 83, 35, 178, 251, - 83, 35, 184, 251, 83, 35, 202, 248, 251, 83, 35, 200, 214, 251, 83, 35, - 202, 147, 251, 83, 35, 234, 151, 251, 83, 35, 235, 25, 251, 83, 35, 205, - 228, 251, 83, 35, 207, 21, 251, 83, 35, 236, 151, 251, 83, 35, 216, 92, - 251, 83, 35, 106, 230, 201, 251, 83, 35, 114, 230, 201, 251, 83, 35, 122, - 230, 201, 251, 83, 35, 234, 145, 230, 201, 251, 83, 35, 234, 237, 230, - 201, 251, 83, 35, 205, 242, 230, 201, 251, 83, 35, 207, 27, 230, 201, - 251, 83, 35, 236, 161, 230, 201, 251, 83, 35, 216, 97, 230, 201, 251, 83, - 35, 106, 202, 130, 251, 83, 35, 114, 202, 130, 251, 83, 35, 122, 202, - 130, 251, 83, 35, 234, 145, 202, 130, 251, 83, 35, 234, 237, 202, 130, - 251, 83, 35, 205, 242, 202, 130, 251, 83, 35, 207, 27, 202, 130, 251, 83, - 35, 236, 161, 202, 130, 251, 83, 35, 216, 97, 202, 130, 251, 83, 35, 202, - 249, 202, 130, 251, 83, 35, 200, 215, 202, 130, 251, 83, 35, 202, 148, - 202, 130, 251, 83, 35, 234, 152, 202, 130, 251, 83, 35, 235, 26, 202, - 130, 251, 83, 35, 205, 229, 202, 130, 251, 83, 35, 207, 22, 202, 130, - 251, 83, 35, 236, 152, 202, 130, 251, 83, 35, 216, 93, 202, 130, 251, 83, - 197, 86, 248, 177, 200, 32, 251, 83, 197, 86, 234, 249, 204, 104, 251, - 83, 197, 86, 208, 92, 204, 104, 251, 83, 197, 86, 202, 155, 204, 104, - 251, 83, 197, 86, 234, 138, 204, 104, 251, 83, 237, 77, 219, 110, 234, - 249, 204, 104, 251, 83, 221, 214, 219, 110, 234, 249, 204, 104, 251, 83, - 219, 110, 208, 92, 204, 104, 251, 83, 219, 110, 202, 155, 204, 104, 31, - 251, 113, 250, 2, 106, 211, 36, 31, 251, 113, 250, 2, 106, 232, 108, 31, - 251, 113, 250, 2, 106, 237, 99, 31, 251, 113, 250, 2, 150, 31, 251, 113, - 250, 2, 235, 25, 31, 251, 113, 250, 2, 234, 237, 230, 201, 31, 251, 113, - 250, 2, 234, 237, 202, 130, 31, 251, 113, 250, 2, 235, 26, 202, 130, 31, - 251, 113, 250, 2, 234, 237, 203, 91, 31, 251, 113, 250, 2, 202, 249, 203, - 91, 31, 251, 113, 250, 2, 235, 26, 203, 91, 31, 251, 113, 250, 2, 106, - 230, 202, 203, 91, 31, 251, 113, 250, 2, 234, 237, 230, 202, 203, 91, 31, - 251, 113, 250, 2, 106, 202, 131, 203, 91, 31, 251, 113, 250, 2, 234, 237, - 202, 131, 203, 91, 31, 251, 113, 250, 2, 234, 237, 204, 221, 31, 251, - 113, 250, 2, 202, 249, 204, 221, 31, 251, 113, 250, 2, 235, 26, 204, 221, - 31, 251, 113, 250, 2, 106, 230, 202, 204, 221, 31, 251, 113, 250, 2, 234, - 237, 230, 202, 204, 221, 31, 251, 113, 250, 2, 106, 202, 131, 204, 221, - 31, 251, 113, 250, 2, 202, 249, 202, 131, 204, 221, 31, 251, 113, 250, 2, - 235, 26, 202, 131, 204, 221, 31, 251, 113, 250, 2, 202, 249, 218, 163, - 31, 251, 113, 231, 240, 106, 212, 80, 31, 251, 113, 202, 170, 98, 31, - 251, 113, 231, 236, 98, 31, 251, 113, 236, 55, 103, 31, 251, 113, 202, - 170, 103, 31, 251, 113, 240, 103, 114, 237, 98, 31, 251, 113, 236, 55, - 114, 237, 98, 31, 251, 113, 201, 136, 150, 31, 251, 113, 201, 136, 202, - 248, 31, 251, 113, 201, 136, 202, 249, 250, 233, 20, 31, 251, 113, 231, - 236, 202, 248, 31, 251, 113, 219, 54, 202, 248, 31, 251, 113, 202, 170, - 202, 248, 31, 251, 113, 202, 170, 202, 147, 31, 251, 113, 201, 136, 235, - 25, 31, 251, 113, 201, 136, 235, 26, 250, 233, 20, 31, 251, 113, 231, - 236, 235, 25, 31, 251, 113, 202, 170, 235, 25, 31, 251, 113, 202, 170, - 106, 230, 201, 31, 251, 113, 202, 170, 122, 230, 201, 31, 251, 113, 236, - 55, 234, 237, 230, 201, 31, 251, 113, 201, 136, 234, 237, 230, 201, 31, - 251, 113, 202, 170, 234, 237, 230, 201, 31, 251, 113, 246, 215, 234, 237, - 230, 201, 31, 251, 113, 217, 111, 234, 237, 230, 201, 31, 251, 113, 202, - 170, 106, 202, 130, 31, 251, 113, 202, 170, 234, 237, 202, 130, 31, 251, - 113, 239, 83, 234, 237, 218, 163, 31, 251, 113, 204, 181, 235, 26, 218, - 163, 31, 106, 155, 56, 31, 106, 155, 2, 250, 233, 20, 31, 114, 202, 152, - 56, 31, 122, 211, 35, 56, 31, 196, 63, 56, 31, 203, 92, 56, 31, 237, 100, - 56, 31, 214, 107, 56, 31, 114, 214, 106, 56, 31, 122, 214, 106, 56, 31, - 234, 145, 214, 106, 56, 31, 234, 237, 214, 106, 56, 31, 219, 48, 56, 31, - 223, 9, 248, 177, 56, 31, 221, 207, 56, 31, 213, 226, 56, 31, 196, 193, - 56, 31, 250, 59, 56, 31, 250, 75, 56, 31, 232, 248, 56, 31, 201, 96, 248, - 177, 56, 31, 195, 80, 56, 31, 106, 211, 37, 56, 31, 206, 11, 56, 31, 225, - 211, 56, 215, 214, 56, 209, 161, 207, 18, 56, 209, 161, 200, 48, 56, 209, - 161, 207, 53, 56, 209, 161, 207, 16, 56, 209, 161, 238, 226, 207, 16, 56, - 209, 161, 206, 34, 56, 209, 161, 239, 79, 56, 209, 161, 211, 20, 56, 209, - 161, 207, 34, 56, 209, 161, 237, 53, 56, 209, 161, 250, 53, 56, 209, 161, - 246, 151, 56, 31, 16, 203, 58, 210, 25, 212, 200, 238, 203, 2, 213, 24, - 212, 200, 238, 203, 2, 212, 72, 232, 22, 212, 200, 238, 203, 2, 203, 61, - 232, 22, 212, 200, 238, 203, 2, 246, 238, 212, 200, 238, 203, 2, 244, - 186, 212, 200, 238, 203, 2, 197, 15, 212, 200, 238, 203, 2, 231, 246, - 212, 200, 238, 203, 2, 233, 209, 212, 200, 238, 203, 2, 202, 85, 212, - 200, 238, 203, 2, 51, 212, 200, 238, 203, 2, 247, 191, 212, 200, 238, - 203, 2, 206, 176, 212, 200, 238, 203, 2, 244, 54, 212, 200, 238, 203, 2, - 219, 221, 212, 200, 238, 203, 2, 219, 163, 212, 200, 238, 203, 2, 208, - 141, 212, 200, 238, 203, 2, 222, 6, 212, 200, 238, 203, 2, 247, 212, 212, - 200, 238, 203, 2, 246, 222, 212, 86, 212, 200, 238, 203, 2, 238, 137, - 212, 200, 238, 203, 2, 244, 29, 212, 200, 238, 203, 2, 205, 196, 212, - 200, 238, 203, 2, 244, 30, 212, 200, 238, 203, 2, 248, 102, 212, 200, - 238, 203, 2, 206, 163, 212, 200, 238, 203, 2, 230, 246, 212, 200, 238, - 203, 2, 231, 204, 212, 200, 238, 203, 2, 247, 119, 222, 74, 212, 200, - 238, 203, 2, 246, 211, 212, 200, 238, 203, 2, 210, 159, 212, 200, 238, - 203, 2, 236, 209, 212, 200, 238, 203, 2, 237, 107, 212, 200, 238, 203, 2, - 200, 254, 212, 200, 238, 203, 2, 248, 105, 212, 200, 238, 203, 2, 212, - 87, 201, 170, 212, 200, 238, 203, 2, 199, 3, 212, 200, 238, 203, 2, 213, - 97, 212, 200, 238, 203, 2, 209, 151, 212, 200, 238, 203, 2, 221, 246, - 212, 200, 238, 203, 2, 213, 205, 248, 245, 212, 200, 238, 203, 2, 234, - 195, 212, 200, 238, 203, 2, 232, 240, 212, 200, 238, 203, 2, 204, 182, - 212, 200, 238, 203, 2, 4, 249, 230, 212, 200, 238, 203, 2, 197, 111, 248, - 197, 212, 200, 238, 203, 2, 37, 214, 109, 101, 221, 53, 1, 63, 221, 53, - 1, 70, 221, 53, 1, 249, 219, 221, 53, 1, 248, 54, 221, 53, 1, 234, 71, - 221, 53, 1, 240, 98, 221, 53, 1, 68, 221, 53, 1, 197, 189, 221, 53, 1, - 195, 157, 221, 53, 1, 202, 204, 221, 53, 1, 225, 108, 221, 53, 1, 224, - 227, 221, 53, 1, 211, 116, 221, 53, 1, 158, 221, 53, 1, 221, 40, 221, 53, - 1, 217, 225, 221, 53, 1, 218, 165, 221, 53, 1, 216, 6, 221, 53, 1, 66, - 221, 53, 1, 213, 195, 221, 53, 1, 223, 187, 221, 53, 1, 143, 221, 53, 1, - 209, 35, 221, 53, 1, 203, 185, 221, 53, 1, 201, 61, 221, 53, 1, 250, 208, - 221, 53, 1, 236, 106, 221, 53, 1, 232, 154, 221, 53, 1, 196, 216, 246, - 228, 1, 63, 246, 228, 1, 213, 181, 246, 228, 1, 240, 98, 246, 228, 1, - 158, 246, 228, 1, 199, 227, 246, 228, 1, 143, 246, 228, 1, 222, 103, 246, - 228, 1, 254, 19, 246, 228, 1, 211, 116, 246, 228, 1, 249, 219, 246, 228, - 1, 221, 40, 246, 228, 1, 74, 246, 228, 1, 240, 5, 246, 228, 1, 203, 185, - 246, 228, 1, 207, 8, 246, 228, 1, 207, 7, 246, 228, 1, 209, 35, 246, 228, - 1, 247, 68, 246, 228, 1, 66, 246, 228, 1, 216, 6, 246, 228, 1, 196, 216, - 246, 228, 1, 217, 225, 246, 228, 1, 201, 60, 246, 228, 1, 213, 195, 246, - 228, 1, 205, 46, 246, 228, 1, 68, 246, 228, 1, 70, 246, 228, 1, 199, 224, - 246, 228, 1, 224, 227, 246, 228, 1, 224, 218, 246, 228, 1, 217, 77, 246, - 228, 1, 199, 229, 246, 228, 1, 234, 71, 246, 228, 1, 234, 6, 246, 228, 1, - 204, 242, 246, 228, 1, 204, 241, 246, 228, 1, 216, 246, 246, 228, 1, 226, - 8, 246, 228, 1, 247, 67, 246, 228, 1, 201, 61, 246, 228, 1, 199, 226, - 246, 228, 1, 209, 136, 246, 228, 1, 219, 153, 246, 228, 1, 219, 152, 246, - 228, 1, 219, 151, 246, 228, 1, 219, 150, 246, 228, 1, 222, 102, 246, 228, - 1, 236, 213, 246, 228, 1, 199, 225, 87, 236, 58, 202, 129, 78, 87, 236, - 58, 17, 98, 87, 236, 58, 17, 103, 87, 236, 58, 17, 135, 87, 236, 58, 17, - 136, 87, 236, 58, 17, 150, 87, 236, 58, 17, 174, 87, 236, 58, 17, 182, - 87, 236, 58, 17, 178, 87, 236, 58, 17, 184, 87, 236, 58, 35, 202, 248, - 87, 236, 58, 35, 200, 214, 87, 236, 58, 35, 202, 147, 87, 236, 58, 35, - 234, 151, 87, 236, 58, 35, 235, 25, 87, 236, 58, 35, 205, 228, 87, 236, - 58, 35, 207, 21, 87, 236, 58, 35, 236, 151, 87, 236, 58, 35, 216, 92, 87, - 236, 58, 35, 106, 230, 201, 87, 236, 58, 35, 114, 230, 201, 87, 236, 58, - 35, 122, 230, 201, 87, 236, 58, 35, 234, 145, 230, 201, 87, 236, 58, 35, - 234, 237, 230, 201, 87, 236, 58, 35, 205, 242, 230, 201, 87, 236, 58, 35, - 207, 27, 230, 201, 87, 236, 58, 35, 236, 161, 230, 201, 87, 236, 58, 35, - 216, 97, 230, 201, 36, 41, 1, 63, 36, 41, 1, 248, 119, 36, 41, 1, 224, - 101, 36, 41, 1, 239, 119, 36, 41, 1, 70, 36, 41, 1, 199, 105, 36, 41, 1, - 195, 88, 36, 41, 1, 232, 32, 36, 41, 1, 202, 186, 36, 41, 1, 68, 36, 41, - 1, 157, 36, 41, 1, 236, 138, 36, 41, 1, 236, 117, 36, 41, 1, 236, 106, - 36, 41, 1, 236, 20, 36, 41, 1, 74, 36, 41, 1, 213, 35, 36, 41, 1, 206, - 211, 36, 41, 1, 223, 86, 36, 41, 1, 236, 42, 36, 41, 1, 236, 30, 36, 41, - 1, 203, 36, 36, 41, 1, 66, 36, 41, 1, 236, 141, 36, 41, 1, 212, 192, 36, - 41, 1, 224, 23, 36, 41, 1, 236, 177, 36, 41, 1, 236, 32, 36, 41, 1, 244, - 223, 36, 41, 1, 226, 8, 36, 41, 1, 199, 229, 36, 41, 1, 236, 13, 36, 41, - 215, 67, 98, 36, 41, 215, 67, 150, 36, 41, 215, 67, 202, 248, 36, 41, - 215, 67, 235, 25, 36, 41, 1, 196, 65, 36, 41, 1, 215, 198, 201, 87, 36, - 41, 1, 205, 119, 201, 87, 233, 2, 1, 251, 48, 233, 2, 1, 248, 216, 233, - 2, 1, 233, 71, 233, 2, 1, 239, 240, 233, 2, 1, 251, 44, 233, 2, 1, 211, - 99, 233, 2, 1, 225, 120, 233, 2, 1, 232, 121, 233, 2, 1, 202, 143, 233, - 2, 1, 236, 149, 233, 2, 1, 223, 46, 233, 2, 1, 222, 215, 233, 2, 1, 219, - 212, 233, 2, 1, 217, 113, 233, 2, 1, 225, 76, 233, 2, 1, 199, 247, 233, - 2, 1, 213, 155, 233, 2, 1, 216, 92, 233, 2, 1, 210, 172, 233, 2, 1, 208, - 145, 233, 2, 1, 203, 6, 233, 2, 1, 197, 38, 233, 2, 1, 235, 98, 233, 2, - 1, 226, 12, 233, 2, 1, 230, 185, 233, 2, 1, 213, 236, 233, 2, 1, 216, 97, - 230, 201, 36, 212, 235, 1, 250, 208, 36, 212, 235, 1, 247, 105, 36, 212, - 235, 1, 233, 244, 36, 212, 235, 1, 238, 141, 36, 212, 235, 1, 70, 36, - 212, 235, 1, 195, 56, 36, 212, 235, 1, 237, 21, 36, 212, 235, 1, 195, 95, - 36, 212, 235, 1, 237, 19, 36, 212, 235, 1, 68, 36, 212, 235, 1, 223, 150, - 36, 212, 235, 1, 222, 70, 36, 212, 235, 1, 219, 71, 36, 212, 235, 1, 217, - 15, 36, 212, 235, 1, 198, 221, 36, 212, 235, 1, 213, 21, 36, 212, 235, 1, - 210, 91, 36, 212, 235, 1, 206, 41, 36, 212, 235, 1, 203, 105, 36, 212, - 235, 1, 66, 36, 212, 235, 1, 244, 204, 36, 212, 235, 1, 206, 146, 36, - 212, 235, 1, 206, 213, 36, 212, 235, 1, 195, 217, 36, 212, 235, 1, 196, - 43, 36, 212, 235, 1, 74, 36, 212, 235, 1, 214, 33, 36, 212, 235, 1, 236, - 177, 36, 212, 235, 1, 142, 36, 212, 235, 1, 201, 71, 36, 212, 235, 1, - 199, 93, 36, 212, 235, 1, 196, 47, 36, 212, 235, 1, 196, 45, 36, 212, - 235, 1, 196, 79, 36, 212, 235, 1, 226, 35, 36, 212, 235, 1, 195, 215, 36, - 212, 235, 1, 165, 36, 212, 235, 1, 230, 98, 37, 36, 212, 235, 1, 250, - 208, 37, 36, 212, 235, 1, 238, 141, 37, 36, 212, 235, 1, 195, 95, 37, 36, - 212, 235, 1, 217, 15, 37, 36, 212, 235, 1, 206, 41, 200, 76, 1, 250, 240, - 200, 76, 1, 248, 61, 200, 76, 1, 233, 232, 200, 76, 1, 224, 38, 200, 76, - 1, 239, 80, 200, 76, 1, 231, 81, 200, 76, 1, 197, 28, 200, 76, 1, 195, - 78, 200, 76, 1, 230, 238, 200, 76, 1, 202, 226, 200, 76, 1, 195, 239, - 200, 76, 1, 224, 183, 200, 76, 1, 206, 167, 200, 76, 1, 222, 146, 200, - 76, 1, 219, 80, 200, 76, 1, 239, 40, 200, 76, 1, 215, 63, 200, 76, 1, - 194, 255, 200, 76, 1, 208, 179, 200, 76, 1, 251, 40, 200, 76, 1, 211, - 175, 200, 76, 1, 208, 218, 200, 76, 1, 211, 51, 200, 76, 1, 210, 150, - 200, 76, 1, 202, 190, 200, 76, 1, 233, 107, 200, 76, 1, 147, 200, 76, 1, - 68, 200, 76, 1, 66, 200, 76, 1, 204, 253, 200, 76, 197, 3, 238, 183, 36, - 212, 229, 2, 63, 36, 212, 229, 2, 68, 36, 212, 229, 2, 66, 36, 212, 229, - 2, 157, 36, 212, 229, 2, 223, 86, 36, 212, 229, 2, 234, 4, 36, 212, 229, - 2, 232, 214, 36, 212, 229, 2, 196, 202, 36, 212, 229, 2, 247, 36, 36, - 212, 229, 2, 225, 105, 36, 212, 229, 2, 225, 63, 36, 212, 229, 2, 203, - 137, 36, 212, 229, 2, 201, 20, 36, 212, 229, 2, 240, 3, 36, 212, 229, 2, - 239, 20, 36, 212, 229, 2, 237, 74, 36, 212, 229, 2, 202, 202, 36, 212, - 229, 2, 163, 36, 212, 229, 2, 248, 252, 36, 212, 229, 2, 235, 118, 36, - 212, 229, 2, 179, 36, 212, 229, 2, 215, 111, 36, 212, 229, 2, 168, 36, - 212, 229, 2, 218, 243, 36, 212, 229, 2, 218, 56, 36, 212, 229, 2, 165, - 36, 212, 229, 2, 199, 137, 36, 212, 229, 2, 199, 23, 36, 212, 229, 2, - 173, 36, 212, 229, 2, 209, 95, 36, 212, 229, 2, 175, 36, 212, 229, 2, - 187, 36, 212, 229, 2, 195, 114, 36, 212, 229, 2, 207, 6, 36, 212, 229, 2, - 205, 43, 36, 212, 229, 2, 142, 36, 212, 229, 2, 249, 250, 36, 212, 229, - 2, 249, 249, 36, 212, 229, 2, 249, 248, 36, 212, 229, 2, 196, 172, 36, - 212, 229, 2, 239, 236, 36, 212, 229, 2, 239, 235, 36, 212, 229, 2, 248, - 227, 36, 212, 229, 2, 247, 88, 36, 212, 229, 197, 3, 238, 183, 36, 212, - 229, 35, 98, 36, 212, 229, 35, 103, 36, 212, 229, 35, 202, 248, 36, 212, - 229, 35, 200, 214, 36, 212, 229, 35, 230, 201, 239, 60, 6, 1, 172, 68, - 239, 60, 6, 1, 172, 70, 239, 60, 6, 1, 172, 63, 239, 60, 6, 1, 172, 251, - 54, 239, 60, 6, 1, 172, 74, 239, 60, 6, 1, 172, 214, 33, 239, 60, 6, 1, - 206, 139, 68, 239, 60, 6, 1, 206, 139, 70, 239, 60, 6, 1, 206, 139, 63, - 239, 60, 6, 1, 206, 139, 251, 54, 239, 60, 6, 1, 206, 139, 74, 239, 60, - 6, 1, 206, 139, 214, 33, 239, 60, 6, 1, 249, 229, 239, 60, 6, 1, 213, - 207, 239, 60, 6, 1, 196, 237, 239, 60, 6, 1, 196, 62, 239, 60, 6, 1, 232, - 154, 239, 60, 6, 1, 213, 22, 239, 60, 6, 1, 248, 105, 239, 60, 6, 1, 203, - 16, 239, 60, 6, 1, 239, 105, 239, 60, 6, 1, 244, 219, 239, 60, 6, 1, 225, - 82, 239, 60, 6, 1, 224, 108, 239, 60, 6, 1, 233, 207, 239, 60, 6, 1, 236, - 177, 239, 60, 6, 1, 199, 100, 239, 60, 6, 1, 236, 0, 239, 60, 6, 1, 202, - 184, 239, 60, 6, 1, 236, 30, 239, 60, 6, 1, 195, 85, 239, 60, 6, 1, 236, - 20, 239, 60, 6, 1, 195, 64, 239, 60, 6, 1, 236, 42, 239, 60, 6, 1, 236, - 138, 239, 60, 6, 1, 236, 117, 239, 60, 6, 1, 236, 106, 239, 60, 6, 1, - 236, 92, 239, 60, 6, 1, 214, 75, 239, 60, 6, 1, 235, 233, 239, 60, 4, 1, - 172, 68, 239, 60, 4, 1, 172, 70, 239, 60, 4, 1, 172, 63, 239, 60, 4, 1, - 172, 251, 54, 239, 60, 4, 1, 172, 74, 239, 60, 4, 1, 172, 214, 33, 239, - 60, 4, 1, 206, 139, 68, 239, 60, 4, 1, 206, 139, 70, 239, 60, 4, 1, 206, - 139, 63, 239, 60, 4, 1, 206, 139, 251, 54, 239, 60, 4, 1, 206, 139, 74, - 239, 60, 4, 1, 206, 139, 214, 33, 239, 60, 4, 1, 249, 229, 239, 60, 4, 1, - 213, 207, 239, 60, 4, 1, 196, 237, 239, 60, 4, 1, 196, 62, 239, 60, 4, 1, - 232, 154, 239, 60, 4, 1, 213, 22, 239, 60, 4, 1, 248, 105, 239, 60, 4, 1, - 203, 16, 239, 60, 4, 1, 239, 105, 239, 60, 4, 1, 244, 219, 239, 60, 4, 1, - 225, 82, 239, 60, 4, 1, 224, 108, 239, 60, 4, 1, 233, 207, 239, 60, 4, 1, - 236, 177, 239, 60, 4, 1, 199, 100, 239, 60, 4, 1, 236, 0, 239, 60, 4, 1, - 202, 184, 239, 60, 4, 1, 236, 30, 239, 60, 4, 1, 195, 85, 239, 60, 4, 1, - 236, 20, 239, 60, 4, 1, 195, 64, 239, 60, 4, 1, 236, 42, 239, 60, 4, 1, - 236, 138, 239, 60, 4, 1, 236, 117, 239, 60, 4, 1, 236, 106, 239, 60, 4, - 1, 236, 92, 239, 60, 4, 1, 214, 75, 239, 60, 4, 1, 235, 233, 206, 218, 1, - 213, 19, 206, 218, 1, 201, 208, 206, 218, 1, 223, 237, 206, 218, 1, 235, - 62, 206, 218, 1, 202, 159, 206, 218, 1, 205, 162, 206, 218, 1, 204, 52, - 206, 218, 1, 244, 142, 206, 218, 1, 196, 64, 206, 218, 1, 230, 198, 206, - 218, 1, 248, 40, 206, 218, 1, 239, 118, 206, 218, 1, 233, 246, 206, 218, - 1, 198, 216, 206, 218, 1, 202, 165, 206, 218, 1, 195, 8, 206, 218, 1, - 219, 109, 206, 218, 1, 224, 255, 206, 218, 1, 197, 19, 206, 218, 1, 232, - 131, 206, 218, 1, 221, 149, 206, 218, 1, 218, 189, 206, 218, 1, 226, 15, - 206, 218, 1, 236, 175, 206, 218, 1, 250, 45, 206, 218, 1, 251, 95, 206, - 218, 1, 214, 48, 206, 218, 1, 197, 6, 206, 218, 1, 213, 224, 206, 218, 1, - 251, 54, 206, 218, 1, 209, 176, 206, 218, 1, 215, 63, 206, 218, 1, 236, - 195, 206, 218, 1, 251, 59, 206, 218, 1, 230, 89, 206, 218, 1, 200, 20, - 206, 218, 1, 214, 115, 206, 218, 1, 214, 25, 206, 218, 1, 214, 73, 206, - 218, 1, 249, 232, 206, 218, 1, 250, 94, 206, 218, 1, 214, 3, 206, 218, 1, - 251, 35, 206, 218, 1, 236, 34, 206, 218, 1, 250, 72, 206, 218, 1, 236, - 206, 206, 218, 1, 230, 97, 206, 218, 1, 196, 26, 213, 238, 1, 251, 10, - 213, 238, 1, 248, 252, 213, 238, 1, 203, 137, 213, 238, 1, 225, 105, 213, - 238, 1, 196, 202, 213, 238, 1, 224, 38, 213, 238, 1, 239, 104, 213, 238, - 1, 173, 213, 238, 1, 187, 213, 238, 1, 206, 173, 213, 238, 1, 239, 44, - 213, 238, 1, 246, 201, 213, 238, 1, 234, 4, 213, 238, 1, 235, 118, 213, - 238, 1, 211, 106, 213, 238, 1, 224, 199, 213, 238, 1, 222, 235, 213, 238, - 1, 218, 203, 213, 238, 1, 215, 47, 213, 238, 1, 197, 109, 213, 238, 1, - 142, 213, 238, 1, 165, 213, 238, 1, 63, 213, 238, 1, 70, 213, 238, 1, 68, - 213, 238, 1, 74, 213, 238, 1, 66, 213, 238, 1, 252, 10, 213, 238, 1, 236, - 184, 213, 238, 1, 214, 33, 213, 238, 17, 195, 79, 213, 238, 17, 98, 213, - 238, 17, 103, 213, 238, 17, 135, 213, 238, 17, 136, 213, 238, 17, 150, - 213, 238, 17, 174, 213, 238, 17, 182, 213, 238, 17, 178, 213, 238, 17, - 184, 213, 240, 6, 1, 63, 213, 240, 6, 1, 251, 45, 213, 240, 6, 1, 251, - 40, 213, 240, 6, 1, 251, 54, 213, 240, 6, 1, 247, 178, 213, 240, 6, 1, - 246, 136, 213, 240, 6, 1, 236, 169, 213, 240, 6, 1, 70, 213, 240, 6, 1, - 236, 150, 213, 240, 6, 1, 142, 213, 240, 6, 1, 230, 155, 213, 240, 6, 1, - 68, 213, 240, 6, 1, 157, 213, 240, 6, 1, 236, 168, 213, 240, 6, 1, 223, - 11, 213, 240, 6, 1, 175, 213, 240, 6, 1, 168, 213, 240, 6, 1, 179, 213, - 240, 6, 1, 74, 213, 240, 6, 1, 214, 72, 213, 240, 6, 1, 163, 213, 240, 6, - 1, 236, 167, 213, 240, 6, 1, 187, 213, 240, 6, 1, 207, 6, 213, 240, 6, 1, - 203, 137, 213, 240, 6, 1, 236, 166, 213, 240, 6, 1, 201, 93, 213, 240, 6, - 1, 236, 165, 213, 240, 6, 1, 201, 83, 213, 240, 6, 1, 239, 44, 213, 240, - 6, 1, 66, 213, 240, 6, 1, 197, 156, 213, 240, 6, 1, 224, 38, 213, 240, 6, - 1, 233, 112, 213, 240, 6, 1, 195, 114, 213, 240, 6, 1, 195, 74, 213, 240, - 4, 1, 63, 213, 240, 4, 1, 251, 45, 213, 240, 4, 1, 251, 40, 213, 240, 4, - 1, 251, 54, 213, 240, 4, 1, 247, 178, 213, 240, 4, 1, 246, 136, 213, 240, - 4, 1, 236, 169, 213, 240, 4, 1, 70, 213, 240, 4, 1, 236, 150, 213, 240, - 4, 1, 142, 213, 240, 4, 1, 230, 155, 213, 240, 4, 1, 68, 213, 240, 4, 1, - 157, 213, 240, 4, 1, 236, 168, 213, 240, 4, 1, 223, 11, 213, 240, 4, 1, - 175, 213, 240, 4, 1, 168, 213, 240, 4, 1, 179, 213, 240, 4, 1, 74, 213, - 240, 4, 1, 214, 72, 213, 240, 4, 1, 163, 213, 240, 4, 1, 236, 167, 213, - 240, 4, 1, 187, 213, 240, 4, 1, 207, 6, 213, 240, 4, 1, 203, 137, 213, - 240, 4, 1, 236, 166, 213, 240, 4, 1, 201, 93, 213, 240, 4, 1, 236, 165, - 213, 240, 4, 1, 201, 83, 213, 240, 4, 1, 239, 44, 213, 240, 4, 1, 66, - 213, 240, 4, 1, 197, 156, 213, 240, 4, 1, 224, 38, 213, 240, 4, 1, 233, - 112, 213, 240, 4, 1, 195, 114, 213, 240, 4, 1, 195, 74, 236, 134, 1, 63, - 236, 134, 1, 248, 119, 236, 134, 1, 246, 176, 236, 134, 1, 244, 223, 236, - 134, 1, 239, 119, 236, 134, 1, 217, 67, 236, 134, 1, 239, 35, 236, 134, - 1, 236, 163, 236, 134, 1, 70, 236, 134, 1, 235, 69, 236, 134, 1, 233, - 186, 236, 134, 1, 233, 43, 236, 134, 1, 232, 32, 236, 134, 1, 68, 236, - 134, 1, 225, 84, 236, 134, 1, 224, 101, 236, 134, 1, 222, 99, 236, 134, - 1, 221, 190, 236, 134, 1, 219, 114, 236, 134, 1, 217, 34, 236, 134, 1, - 179, 236, 134, 1, 216, 75, 236, 134, 1, 74, 236, 134, 1, 213, 35, 236, - 134, 1, 211, 88, 236, 134, 1, 210, 133, 236, 134, 1, 209, 130, 236, 134, - 1, 208, 103, 236, 134, 1, 206, 211, 236, 134, 1, 203, 36, 236, 134, 1, - 202, 186, 236, 134, 1, 66, 236, 134, 1, 199, 105, 236, 134, 1, 196, 196, - 236, 134, 1, 196, 143, 236, 134, 1, 195, 88, 236, 134, 1, 195, 65, 236, - 134, 1, 233, 98, 236, 134, 1, 233, 104, 236, 134, 1, 224, 23, 246, 208, - 251, 11, 1, 250, 235, 246, 208, 251, 11, 1, 248, 63, 246, 208, 251, 11, - 1, 233, 61, 246, 208, 251, 11, 1, 239, 184, 246, 208, 251, 11, 1, 236, - 194, 246, 208, 251, 11, 1, 195, 98, 246, 208, 251, 11, 1, 235, 193, 246, - 208, 251, 11, 1, 195, 59, 246, 208, 251, 11, 1, 203, 64, 246, 208, 251, - 11, 1, 246, 136, 246, 208, 251, 11, 1, 195, 226, 246, 208, 251, 11, 1, - 195, 74, 246, 208, 251, 11, 1, 225, 147, 246, 208, 251, 11, 1, 207, 6, - 246, 208, 251, 11, 1, 222, 139, 246, 208, 251, 11, 1, 225, 159, 246, 208, - 251, 11, 1, 196, 192, 246, 208, 251, 11, 1, 237, 37, 246, 208, 251, 11, - 1, 246, 235, 246, 208, 251, 11, 1, 225, 64, 246, 208, 251, 11, 1, 224, - 143, 246, 208, 251, 11, 1, 221, 49, 246, 208, 251, 11, 1, 231, 225, 246, - 208, 251, 11, 1, 211, 89, 246, 208, 251, 11, 1, 250, 152, 246, 208, 251, - 11, 1, 244, 159, 246, 208, 251, 11, 1, 244, 195, 246, 208, 251, 11, 1, - 240, 110, 246, 208, 251, 11, 1, 219, 201, 246, 208, 251, 11, 1, 211, 93, - 246, 208, 251, 11, 1, 215, 178, 246, 208, 251, 11, 1, 237, 14, 246, 208, - 251, 11, 1, 206, 245, 246, 208, 251, 11, 1, 225, 85, 246, 208, 251, 11, - 1, 214, 48, 246, 208, 251, 11, 1, 200, 187, 246, 208, 251, 11, 1, 235, - 92, 246, 208, 251, 11, 1, 237, 27, 246, 208, 251, 11, 1, 244, 229, 246, - 208, 251, 11, 1, 213, 8, 246, 208, 251, 11, 1, 233, 88, 246, 208, 251, - 11, 1, 210, 147, 246, 208, 251, 11, 1, 207, 15, 246, 208, 251, 11, 1, - 199, 26, 246, 208, 251, 11, 1, 202, 22, 246, 208, 251, 11, 1, 206, 117, - 246, 208, 251, 11, 1, 225, 118, 246, 208, 251, 11, 1, 240, 111, 246, 208, - 251, 11, 1, 246, 201, 246, 208, 251, 11, 1, 196, 69, 246, 208, 251, 11, - 1, 212, 98, 246, 208, 251, 11, 1, 223, 202, 246, 208, 251, 11, 244, 101, - 78, 30, 39, 2, 251, 216, 30, 39, 2, 251, 215, 30, 39, 2, 251, 214, 30, - 39, 2, 251, 213, 30, 39, 2, 251, 212, 30, 39, 2, 251, 211, 30, 39, 2, - 251, 210, 30, 39, 2, 251, 209, 30, 39, 2, 251, 208, 30, 39, 2, 251, 207, - 30, 39, 2, 251, 206, 30, 39, 2, 251, 205, 30, 39, 2, 251, 204, 30, 39, 2, - 251, 203, 30, 39, 2, 251, 202, 30, 39, 2, 251, 201, 30, 39, 2, 251, 200, - 30, 39, 2, 251, 199, 30, 39, 2, 251, 198, 30, 39, 2, 251, 197, 30, 39, 2, - 251, 196, 30, 39, 2, 251, 195, 30, 39, 2, 251, 194, 30, 39, 2, 251, 193, - 30, 39, 2, 251, 192, 30, 39, 2, 251, 191, 30, 39, 2, 251, 190, 30, 39, 2, - 254, 224, 30, 39, 2, 251, 189, 30, 39, 2, 251, 188, 30, 39, 2, 251, 187, - 30, 39, 2, 251, 186, 30, 39, 2, 251, 185, 30, 39, 2, 251, 184, 30, 39, 2, - 251, 183, 30, 39, 2, 251, 182, 30, 39, 2, 251, 181, 30, 39, 2, 251, 180, - 30, 39, 2, 251, 179, 30, 39, 2, 251, 178, 30, 39, 2, 251, 177, 30, 39, 2, - 251, 176, 30, 39, 2, 251, 175, 30, 39, 2, 251, 174, 30, 39, 2, 251, 173, - 30, 39, 2, 251, 172, 30, 39, 2, 251, 171, 30, 39, 2, 251, 170, 30, 39, 2, - 251, 169, 30, 39, 2, 251, 168, 30, 39, 2, 251, 167, 30, 39, 2, 251, 166, - 30, 39, 2, 251, 165, 30, 39, 2, 251, 164, 30, 39, 2, 251, 163, 30, 39, 2, - 251, 162, 30, 39, 2, 251, 161, 30, 39, 2, 251, 160, 30, 39, 2, 251, 159, - 30, 39, 2, 251, 158, 30, 39, 2, 251, 157, 30, 39, 2, 251, 156, 30, 39, 2, - 251, 155, 30, 39, 2, 251, 154, 30, 39, 2, 251, 153, 30, 39, 2, 251, 152, - 30, 39, 2, 251, 151, 30, 39, 2, 251, 150, 30, 39, 2, 251, 149, 30, 39, 2, - 251, 148, 30, 39, 2, 251, 147, 30, 39, 2, 254, 137, 30, 39, 2, 251, 146, - 30, 39, 2, 251, 145, 30, 39, 2, 254, 102, 30, 39, 2, 251, 144, 30, 39, 2, - 251, 143, 30, 39, 2, 251, 142, 30, 39, 2, 251, 141, 30, 39, 2, 254, 89, - 30, 39, 2, 251, 140, 30, 39, 2, 251, 139, 30, 39, 2, 251, 138, 30, 39, 2, - 251, 137, 30, 39, 2, 251, 136, 30, 39, 2, 253, 161, 30, 39, 2, 253, 160, - 30, 39, 2, 253, 159, 30, 39, 2, 253, 158, 30, 39, 2, 253, 157, 30, 39, 2, - 253, 156, 30, 39, 2, 253, 155, 30, 39, 2, 253, 154, 30, 39, 2, 253, 152, - 30, 39, 2, 253, 151, 30, 39, 2, 253, 150, 30, 39, 2, 253, 149, 30, 39, 2, - 253, 148, 30, 39, 2, 253, 147, 30, 39, 2, 253, 145, 30, 39, 2, 253, 144, - 30, 39, 2, 253, 143, 30, 39, 2, 253, 142, 30, 39, 2, 253, 141, 30, 39, 2, - 253, 140, 30, 39, 2, 253, 139, 30, 39, 2, 253, 138, 30, 39, 2, 253, 137, - 30, 39, 2, 253, 136, 30, 39, 2, 253, 135, 30, 39, 2, 253, 134, 30, 39, 2, - 253, 133, 30, 39, 2, 253, 132, 30, 39, 2, 253, 131, 30, 39, 2, 253, 130, - 30, 39, 2, 253, 129, 30, 39, 2, 253, 128, 30, 39, 2, 253, 127, 30, 39, 2, - 253, 125, 30, 39, 2, 253, 124, 30, 39, 2, 253, 123, 30, 39, 2, 253, 119, - 30, 39, 2, 253, 118, 30, 39, 2, 253, 117, 30, 39, 2, 253, 116, 30, 39, 2, - 253, 112, 30, 39, 2, 253, 111, 30, 39, 2, 253, 110, 30, 39, 2, 253, 109, - 30, 39, 2, 253, 108, 30, 39, 2, 253, 107, 30, 39, 2, 253, 106, 30, 39, 2, - 253, 105, 30, 39, 2, 253, 104, 30, 39, 2, 253, 103, 30, 39, 2, 253, 102, - 30, 39, 2, 253, 101, 30, 39, 2, 253, 100, 30, 39, 2, 253, 99, 30, 39, 2, - 253, 98, 30, 39, 2, 253, 97, 30, 39, 2, 253, 96, 30, 39, 2, 253, 95, 30, - 39, 2, 253, 94, 30, 39, 2, 253, 93, 30, 39, 2, 253, 92, 30, 39, 2, 253, - 91, 30, 39, 2, 253, 90, 30, 39, 2, 253, 88, 30, 39, 2, 253, 87, 30, 39, - 2, 253, 86, 30, 39, 2, 253, 85, 30, 39, 2, 253, 84, 30, 39, 2, 253, 82, - 30, 39, 2, 253, 81, 30, 39, 2, 253, 80, 30, 39, 2, 253, 79, 30, 39, 2, - 253, 77, 30, 39, 2, 253, 76, 30, 39, 2, 253, 75, 30, 39, 2, 253, 41, 30, - 39, 2, 253, 39, 30, 39, 2, 253, 37, 30, 39, 2, 253, 35, 30, 39, 2, 253, - 33, 30, 39, 2, 253, 31, 30, 39, 2, 253, 29, 30, 39, 2, 253, 27, 30, 39, - 2, 253, 25, 30, 39, 2, 253, 23, 30, 39, 2, 253, 21, 30, 39, 2, 253, 18, - 30, 39, 2, 253, 16, 30, 39, 2, 253, 14, 30, 39, 2, 253, 12, 30, 39, 2, - 253, 10, 30, 39, 2, 253, 8, 30, 39, 2, 253, 6, 30, 39, 2, 253, 4, 30, 39, - 2, 252, 178, 30, 39, 2, 252, 177, 30, 39, 2, 252, 176, 30, 39, 2, 252, - 175, 30, 39, 2, 252, 174, 30, 39, 2, 252, 173, 30, 39, 2, 252, 171, 30, - 39, 2, 252, 170, 30, 39, 2, 252, 169, 30, 39, 2, 252, 168, 30, 39, 2, - 252, 167, 30, 39, 2, 252, 166, 30, 39, 2, 252, 164, 30, 39, 2, 252, 163, - 30, 39, 2, 252, 159, 30, 39, 2, 252, 158, 30, 39, 2, 252, 156, 30, 39, 2, - 252, 155, 30, 39, 2, 252, 154, 30, 39, 2, 252, 153, 30, 39, 2, 252, 152, - 30, 39, 2, 252, 151, 30, 39, 2, 252, 150, 30, 39, 2, 252, 149, 30, 39, 2, - 252, 148, 30, 39, 2, 252, 147, 30, 39, 2, 252, 146, 30, 39, 2, 252, 145, - 30, 39, 2, 252, 144, 30, 39, 2, 252, 143, 30, 39, 2, 252, 142, 30, 39, 2, - 252, 141, 30, 39, 2, 252, 140, 30, 39, 2, 252, 139, 30, 39, 2, 252, 138, - 30, 39, 2, 252, 137, 30, 39, 2, 252, 136, 30, 39, 2, 252, 135, 30, 39, 2, - 252, 134, 30, 39, 2, 252, 133, 30, 39, 2, 252, 132, 30, 39, 2, 252, 131, - 30, 39, 2, 252, 130, 30, 39, 2, 252, 129, 30, 39, 2, 252, 128, 30, 39, 2, - 252, 127, 30, 39, 2, 252, 126, 30, 39, 2, 252, 125, 30, 39, 2, 252, 124, - 30, 39, 2, 252, 123, 30, 39, 2, 252, 122, 30, 39, 2, 252, 121, 30, 39, 2, - 252, 120, 30, 39, 2, 252, 119, 30, 39, 2, 252, 118, 30, 39, 2, 252, 117, - 30, 39, 2, 252, 116, 30, 39, 2, 252, 115, 30, 39, 2, 252, 114, 30, 39, 2, - 252, 113, 30, 39, 2, 252, 112, 30, 39, 2, 252, 111, 30, 39, 2, 252, 110, - 30, 39, 2, 252, 109, 30, 39, 2, 252, 108, 30, 39, 2, 252, 107, 30, 39, 2, - 252, 106, 30, 39, 2, 252, 105, 30, 39, 2, 252, 104, 30, 39, 2, 252, 103, - 30, 39, 2, 252, 102, 30, 39, 2, 252, 101, 30, 39, 2, 252, 100, 30, 39, 2, - 252, 99, 30, 39, 2, 252, 98, 30, 39, 2, 252, 97, 30, 39, 2, 252, 96, 30, - 39, 2, 252, 95, 30, 39, 2, 252, 94, 30, 39, 2, 252, 93, 30, 39, 2, 252, - 92, 30, 39, 2, 252, 91, 30, 39, 2, 252, 90, 30, 39, 2, 252, 89, 30, 39, + 12, 15, 226, 153, 12, 15, 226, 152, 12, 15, 226, 151, 8, 4, 33, 235, 156, + 8, 4, 33, 235, 152, 8, 4, 33, 235, 95, 8, 4, 33, 235, 155, 8, 4, 33, 235, + 154, 8, 4, 33, 181, 209, 81, 203, 216, 8, 4, 33, 205, 23, 250, 229, 4, + 33, 219, 164, 216, 3, 250, 229, 4, 33, 219, 164, 237, 59, 250, 229, 4, + 33, 219, 164, 226, 54, 250, 229, 4, 33, 199, 40, 216, 3, 250, 229, 4, 33, + 219, 164, 196, 200, 123, 1, 195, 242, 3, 232, 32, 123, 212, 110, 225, + 108, 199, 130, 123, 33, 196, 22, 195, 242, 195, 242, 213, 114, 123, 1, + 251, 125, 250, 116, 123, 1, 197, 62, 251, 163, 123, 1, 197, 62, 240, 100, + 123, 1, 197, 62, 232, 146, 123, 1, 197, 62, 225, 34, 123, 1, 197, 62, + 222, 240, 123, 1, 197, 62, 48, 219, 170, 123, 1, 197, 62, 210, 109, 123, + 1, 197, 62, 203, 85, 123, 1, 251, 125, 98, 55, 123, 1, 206, 212, 3, 206, + 212, 238, 252, 123, 1, 206, 212, 3, 206, 66, 238, 252, 123, 1, 206, 212, + 3, 240, 120, 26, 206, 212, 238, 252, 123, 1, 206, 212, 3, 240, 120, 26, + 206, 66, 238, 252, 123, 1, 151, 3, 213, 114, 123, 1, 151, 3, 211, 146, + 123, 1, 151, 3, 220, 41, 123, 1, 248, 208, 3, 240, 119, 123, 1, 233, 177, + 3, 240, 119, 123, 1, 240, 101, 3, 240, 119, 123, 1, 232, 147, 3, 220, 41, + 123, 1, 199, 123, 3, 240, 119, 123, 1, 195, 93, 3, 240, 119, 123, 1, 203, + 2, 3, 240, 119, 123, 1, 195, 242, 3, 240, 119, 123, 1, 48, 225, 35, 3, + 240, 119, 123, 1, 225, 35, 3, 240, 119, 123, 1, 222, 241, 3, 240, 119, + 123, 1, 219, 171, 3, 240, 119, 123, 1, 215, 138, 3, 240, 119, 123, 1, + 208, 226, 3, 240, 119, 123, 1, 48, 213, 92, 3, 240, 119, 123, 1, 213, 92, + 3, 240, 119, 123, 1, 201, 109, 3, 240, 119, 123, 1, 211, 106, 3, 240, + 119, 123, 1, 210, 110, 3, 240, 119, 123, 1, 206, 212, 3, 240, 119, 123, + 1, 203, 86, 3, 240, 119, 123, 1, 199, 123, 3, 231, 176, 123, 1, 248, 208, + 3, 210, 226, 123, 1, 225, 35, 3, 210, 226, 123, 1, 213, 92, 3, 210, 226, + 123, 33, 151, 222, 240, 9, 1, 151, 197, 135, 70, 20, 9, 1, 151, 197, 135, + 48, 20, 9, 1, 248, 249, 70, 20, 9, 1, 248, 249, 48, 20, 9, 1, 248, 249, + 84, 20, 9, 1, 248, 249, 219, 193, 20, 9, 1, 213, 72, 70, 20, 9, 1, 213, + 72, 48, 20, 9, 1, 213, 72, 84, 20, 9, 1, 213, 72, 219, 193, 20, 9, 1, + 248, 237, 70, 20, 9, 1, 248, 237, 48, 20, 9, 1, 248, 237, 84, 20, 9, 1, + 248, 237, 219, 193, 20, 9, 1, 201, 69, 70, 20, 9, 1, 201, 69, 48, 20, 9, + 1, 201, 69, 84, 20, 9, 1, 201, 69, 219, 193, 20, 9, 1, 203, 40, 70, 20, + 9, 1, 203, 40, 48, 20, 9, 1, 203, 40, 84, 20, 9, 1, 203, 40, 219, 193, + 20, 9, 1, 201, 71, 70, 20, 9, 1, 201, 71, 48, 20, 9, 1, 201, 71, 84, 20, + 9, 1, 201, 71, 219, 193, 20, 9, 1, 199, 112, 70, 20, 9, 1, 199, 112, 48, + 20, 9, 1, 199, 112, 84, 20, 9, 1, 199, 112, 219, 193, 20, 9, 1, 213, 70, + 70, 20, 9, 1, 213, 70, 48, 20, 9, 1, 213, 70, 84, 20, 9, 1, 213, 70, 219, + 193, 20, 9, 1, 237, 162, 70, 20, 9, 1, 237, 162, 48, 20, 9, 1, 237, 162, + 84, 20, 9, 1, 237, 162, 219, 193, 20, 9, 1, 215, 95, 70, 20, 9, 1, 215, + 95, 48, 20, 9, 1, 215, 95, 84, 20, 9, 1, 215, 95, 219, 193, 20, 9, 1, + 203, 73, 70, 20, 9, 1, 203, 73, 48, 20, 9, 1, 203, 73, 84, 20, 9, 1, 203, + 73, 219, 193, 20, 9, 1, 203, 71, 70, 20, 9, 1, 203, 71, 48, 20, 9, 1, + 203, 71, 84, 20, 9, 1, 203, 71, 219, 193, 20, 9, 1, 240, 38, 70, 20, 9, + 1, 240, 38, 48, 20, 9, 1, 240, 114, 70, 20, 9, 1, 240, 114, 48, 20, 9, 1, + 237, 191, 70, 20, 9, 1, 237, 191, 48, 20, 9, 1, 240, 36, 70, 20, 9, 1, + 240, 36, 48, 20, 9, 1, 225, 186, 70, 20, 9, 1, 225, 186, 48, 20, 9, 1, + 209, 174, 70, 20, 9, 1, 209, 174, 48, 20, 9, 1, 224, 191, 70, 20, 9, 1, + 224, 191, 48, 20, 9, 1, 224, 191, 84, 20, 9, 1, 224, 191, 219, 193, 20, + 9, 1, 234, 110, 70, 20, 9, 1, 234, 110, 48, 20, 9, 1, 234, 110, 84, 20, + 9, 1, 234, 110, 219, 193, 20, 9, 1, 233, 63, 70, 20, 9, 1, 233, 63, 48, + 20, 9, 1, 233, 63, 84, 20, 9, 1, 233, 63, 219, 193, 20, 9, 1, 216, 250, + 70, 20, 9, 1, 216, 250, 48, 20, 9, 1, 216, 250, 84, 20, 9, 1, 216, 250, + 219, 193, 20, 9, 1, 216, 31, 233, 196, 70, 20, 9, 1, 216, 31, 233, 196, + 48, 20, 9, 1, 209, 236, 70, 20, 9, 1, 209, 236, 48, 20, 9, 1, 209, 236, + 84, 20, 9, 1, 209, 236, 219, 193, 20, 9, 1, 232, 113, 3, 93, 90, 70, 20, + 9, 1, 232, 113, 3, 93, 90, 48, 20, 9, 1, 232, 113, 233, 141, 70, 20, 9, + 1, 232, 113, 233, 141, 48, 20, 9, 1, 232, 113, 233, 141, 84, 20, 9, 1, + 232, 113, 233, 141, 219, 193, 20, 9, 1, 232, 113, 239, 24, 70, 20, 9, 1, + 232, 113, 239, 24, 48, 20, 9, 1, 232, 113, 239, 24, 84, 20, 9, 1, 232, + 113, 239, 24, 219, 193, 20, 9, 1, 93, 249, 72, 70, 20, 9, 1, 93, 249, 72, + 48, 20, 9, 1, 93, 249, 72, 3, 232, 213, 90, 70, 20, 9, 1, 93, 249, 72, 3, + 232, 213, 90, 48, 20, 9, 16, 76, 57, 9, 16, 76, 60, 9, 16, 99, 238, 250, + 57, 9, 16, 99, 238, 250, 60, 9, 16, 115, 238, 250, 57, 9, 16, 115, 238, + 250, 60, 9, 16, 115, 238, 250, 212, 106, 237, 230, 57, 9, 16, 115, 238, + 250, 212, 106, 237, 230, 60, 9, 16, 235, 6, 238, 250, 57, 9, 16, 235, 6, + 238, 250, 60, 9, 16, 52, 83, 249, 79, 60, 9, 16, 99, 238, 250, 199, 50, + 57, 9, 16, 99, 238, 250, 199, 50, 60, 9, 16, 210, 2, 9, 16, 4, 203, 140, + 57, 9, 16, 4, 203, 140, 60, 9, 1, 217, 73, 70, 20, 9, 1, 217, 73, 48, 20, + 9, 1, 217, 73, 84, 20, 9, 1, 217, 73, 219, 193, 20, 9, 1, 118, 70, 20, 9, + 1, 118, 48, 20, 9, 1, 214, 164, 70, 20, 9, 1, 214, 164, 48, 20, 9, 1, + 195, 218, 70, 20, 9, 1, 195, 218, 48, 20, 9, 1, 118, 3, 232, 213, 90, 70, + 20, 9, 1, 199, 119, 70, 20, 9, 1, 199, 119, 48, 20, 9, 1, 224, 66, 214, + 164, 70, 20, 9, 1, 224, 66, 214, 164, 48, 20, 9, 1, 224, 66, 195, 218, + 70, 20, 9, 1, 224, 66, 195, 218, 48, 20, 9, 1, 237, 135, 70, 20, 9, 1, + 237, 135, 48, 20, 9, 1, 237, 135, 84, 20, 9, 1, 237, 135, 219, 193, 20, + 9, 1, 200, 89, 224, 212, 224, 66, 151, 220, 69, 84, 20, 9, 1, 200, 89, + 224, 212, 224, 66, 151, 220, 69, 219, 193, 20, 9, 33, 93, 3, 232, 213, + 90, 3, 151, 70, 20, 9, 33, 93, 3, 232, 213, 90, 3, 151, 48, 20, 9, 33, + 93, 3, 232, 213, 90, 3, 251, 245, 70, 20, 9, 33, 93, 3, 232, 213, 90, 3, + 251, 245, 48, 20, 9, 33, 93, 3, 232, 213, 90, 3, 197, 118, 70, 20, 9, 33, + 93, 3, 232, 213, 90, 3, 197, 118, 48, 20, 9, 33, 93, 3, 232, 213, 90, 3, + 118, 70, 20, 9, 33, 93, 3, 232, 213, 90, 3, 118, 48, 20, 9, 33, 93, 3, + 232, 213, 90, 3, 214, 164, 70, 20, 9, 33, 93, 3, 232, 213, 90, 3, 214, + 164, 48, 20, 9, 33, 93, 3, 232, 213, 90, 3, 195, 218, 70, 20, 9, 33, 93, + 3, 232, 213, 90, 3, 195, 218, 48, 20, 9, 33, 93, 3, 232, 213, 90, 3, 237, + 135, 70, 20, 9, 33, 93, 3, 232, 213, 90, 3, 237, 135, 48, 20, 9, 33, 93, + 3, 232, 213, 90, 3, 237, 135, 84, 20, 9, 33, 200, 89, 224, 66, 93, 3, + 232, 213, 90, 3, 151, 220, 69, 70, 20, 9, 33, 200, 89, 224, 66, 93, 3, + 232, 213, 90, 3, 151, 220, 69, 48, 20, 9, 33, 200, 89, 224, 66, 93, 3, + 232, 213, 90, 3, 151, 220, 69, 84, 20, 9, 1, 235, 203, 93, 70, 20, 9, 1, + 235, 203, 93, 48, 20, 9, 1, 235, 203, 93, 84, 20, 9, 1, 235, 203, 93, + 219, 193, 20, 9, 33, 93, 3, 232, 213, 90, 3, 225, 189, 70, 20, 9, 33, 93, + 3, 232, 213, 90, 3, 168, 70, 20, 9, 33, 93, 3, 232, 213, 90, 3, 87, 70, + 20, 9, 33, 93, 3, 232, 213, 90, 3, 151, 220, 69, 70, 20, 9, 33, 93, 3, + 232, 213, 90, 3, 93, 70, 20, 9, 33, 248, 239, 3, 225, 189, 70, 20, 9, 33, + 248, 239, 3, 168, 70, 20, 9, 33, 248, 239, 3, 224, 142, 70, 20, 9, 33, + 248, 239, 3, 87, 70, 20, 9, 33, 248, 239, 3, 151, 220, 69, 70, 20, 9, 33, + 248, 239, 3, 93, 70, 20, 9, 33, 203, 42, 3, 225, 189, 70, 20, 9, 33, 203, + 42, 3, 168, 70, 20, 9, 33, 203, 42, 3, 224, 142, 70, 20, 9, 33, 203, 42, + 3, 87, 70, 20, 9, 33, 203, 42, 3, 151, 220, 69, 70, 20, 9, 33, 203, 42, + 3, 93, 70, 20, 9, 33, 202, 214, 3, 225, 189, 70, 20, 9, 33, 202, 214, 3, + 87, 70, 20, 9, 33, 202, 214, 3, 151, 220, 69, 70, 20, 9, 33, 202, 214, 3, + 93, 70, 20, 9, 33, 225, 189, 3, 168, 70, 20, 9, 33, 225, 189, 3, 87, 70, + 20, 9, 33, 168, 3, 225, 189, 70, 20, 9, 33, 168, 3, 87, 70, 20, 9, 33, + 224, 142, 3, 225, 189, 70, 20, 9, 33, 224, 142, 3, 168, 70, 20, 9, 33, + 224, 142, 3, 87, 70, 20, 9, 33, 208, 126, 3, 225, 189, 70, 20, 9, 33, + 208, 126, 3, 168, 70, 20, 9, 33, 208, 126, 3, 224, 142, 70, 20, 9, 33, + 208, 126, 3, 87, 70, 20, 9, 33, 209, 9, 3, 168, 70, 20, 9, 33, 209, 9, 3, + 87, 70, 20, 9, 33, 240, 130, 3, 225, 189, 70, 20, 9, 33, 240, 130, 3, + 168, 70, 20, 9, 33, 240, 130, 3, 224, 142, 70, 20, 9, 33, 240, 130, 3, + 87, 70, 20, 9, 33, 203, 140, 3, 168, 70, 20, 9, 33, 203, 140, 3, 87, 70, + 20, 9, 33, 195, 110, 3, 87, 70, 20, 9, 33, 251, 194, 3, 225, 189, 70, 20, + 9, 33, 251, 194, 3, 87, 70, 20, 9, 33, 233, 225, 3, 225, 189, 70, 20, 9, + 33, 233, 225, 3, 87, 70, 20, 9, 33, 235, 176, 3, 225, 189, 70, 20, 9, 33, + 235, 176, 3, 168, 70, 20, 9, 33, 235, 176, 3, 224, 142, 70, 20, 9, 33, + 235, 176, 3, 87, 70, 20, 9, 33, 235, 176, 3, 151, 220, 69, 70, 20, 9, 33, + 235, 176, 3, 93, 70, 20, 9, 33, 211, 152, 3, 168, 70, 20, 9, 33, 211, + 152, 3, 87, 70, 20, 9, 33, 211, 152, 3, 151, 220, 69, 70, 20, 9, 33, 211, + 152, 3, 93, 70, 20, 9, 33, 225, 35, 3, 151, 70, 20, 9, 33, 225, 35, 3, + 225, 189, 70, 20, 9, 33, 225, 35, 3, 168, 70, 20, 9, 33, 225, 35, 3, 224, + 142, 70, 20, 9, 33, 225, 35, 3, 222, 249, 70, 20, 9, 33, 225, 35, 3, 87, + 70, 20, 9, 33, 225, 35, 3, 151, 220, 69, 70, 20, 9, 33, 225, 35, 3, 93, + 70, 20, 9, 33, 222, 249, 3, 225, 189, 70, 20, 9, 33, 222, 249, 3, 168, + 70, 20, 9, 33, 222, 249, 3, 224, 142, 70, 20, 9, 33, 222, 249, 3, 87, 70, + 20, 9, 33, 222, 249, 3, 151, 220, 69, 70, 20, 9, 33, 222, 249, 3, 93, 70, + 20, 9, 33, 87, 3, 225, 189, 70, 20, 9, 33, 87, 3, 168, 70, 20, 9, 33, 87, + 3, 224, 142, 70, 20, 9, 33, 87, 3, 87, 70, 20, 9, 33, 87, 3, 151, 220, + 69, 70, 20, 9, 33, 87, 3, 93, 70, 20, 9, 33, 216, 31, 3, 225, 189, 70, + 20, 9, 33, 216, 31, 3, 168, 70, 20, 9, 33, 216, 31, 3, 224, 142, 70, 20, + 9, 33, 216, 31, 3, 87, 70, 20, 9, 33, 216, 31, 3, 151, 220, 69, 70, 20, + 9, 33, 216, 31, 3, 93, 70, 20, 9, 33, 232, 113, 3, 225, 189, 70, 20, 9, + 33, 232, 113, 3, 87, 70, 20, 9, 33, 232, 113, 3, 151, 220, 69, 70, 20, 9, + 33, 232, 113, 3, 93, 70, 20, 9, 33, 93, 3, 225, 189, 70, 20, 9, 33, 93, + 3, 168, 70, 20, 9, 33, 93, 3, 224, 142, 70, 20, 9, 33, 93, 3, 87, 70, 20, + 9, 33, 93, 3, 151, 220, 69, 70, 20, 9, 33, 93, 3, 93, 70, 20, 9, 33, 202, + 226, 3, 204, 95, 151, 70, 20, 9, 33, 210, 142, 3, 204, 95, 151, 70, 20, + 9, 33, 151, 220, 69, 3, 204, 95, 151, 70, 20, 9, 33, 207, 41, 3, 240, 93, + 70, 20, 9, 33, 207, 41, 3, 224, 236, 70, 20, 9, 33, 207, 41, 3, 235, 200, + 70, 20, 9, 33, 207, 41, 3, 240, 95, 70, 20, 9, 33, 207, 41, 3, 224, 238, + 70, 20, 9, 33, 207, 41, 3, 204, 95, 151, 70, 20, 9, 33, 93, 3, 232, 213, + 90, 3, 210, 142, 48, 20, 9, 33, 93, 3, 232, 213, 90, 3, 195, 107, 48, 20, + 9, 33, 93, 3, 232, 213, 90, 3, 87, 48, 20, 9, 33, 93, 3, 232, 213, 90, 3, + 216, 31, 48, 20, 9, 33, 93, 3, 232, 213, 90, 3, 151, 220, 69, 48, 20, 9, + 33, 93, 3, 232, 213, 90, 3, 93, 48, 20, 9, 33, 248, 239, 3, 210, 142, 48, + 20, 9, 33, 248, 239, 3, 195, 107, 48, 20, 9, 33, 248, 239, 3, 87, 48, 20, + 9, 33, 248, 239, 3, 216, 31, 48, 20, 9, 33, 248, 239, 3, 151, 220, 69, + 48, 20, 9, 33, 248, 239, 3, 93, 48, 20, 9, 33, 203, 42, 3, 210, 142, 48, + 20, 9, 33, 203, 42, 3, 195, 107, 48, 20, 9, 33, 203, 42, 3, 87, 48, 20, + 9, 33, 203, 42, 3, 216, 31, 48, 20, 9, 33, 203, 42, 3, 151, 220, 69, 48, + 20, 9, 33, 203, 42, 3, 93, 48, 20, 9, 33, 202, 214, 3, 210, 142, 48, 20, + 9, 33, 202, 214, 3, 195, 107, 48, 20, 9, 33, 202, 214, 3, 87, 48, 20, 9, + 33, 202, 214, 3, 216, 31, 48, 20, 9, 33, 202, 214, 3, 151, 220, 69, 48, + 20, 9, 33, 202, 214, 3, 93, 48, 20, 9, 33, 235, 176, 3, 151, 220, 69, 48, + 20, 9, 33, 235, 176, 3, 93, 48, 20, 9, 33, 211, 152, 3, 151, 220, 69, 48, + 20, 9, 33, 211, 152, 3, 93, 48, 20, 9, 33, 225, 35, 3, 151, 48, 20, 9, + 33, 225, 35, 3, 222, 249, 48, 20, 9, 33, 225, 35, 3, 87, 48, 20, 9, 33, + 225, 35, 3, 151, 220, 69, 48, 20, 9, 33, 225, 35, 3, 93, 48, 20, 9, 33, + 222, 249, 3, 87, 48, 20, 9, 33, 222, 249, 3, 151, 220, 69, 48, 20, 9, 33, + 222, 249, 3, 93, 48, 20, 9, 33, 87, 3, 151, 48, 20, 9, 33, 87, 3, 87, 48, + 20, 9, 33, 216, 31, 3, 210, 142, 48, 20, 9, 33, 216, 31, 3, 195, 107, 48, + 20, 9, 33, 216, 31, 3, 87, 48, 20, 9, 33, 216, 31, 3, 216, 31, 48, 20, 9, + 33, 216, 31, 3, 151, 220, 69, 48, 20, 9, 33, 216, 31, 3, 93, 48, 20, 9, + 33, 151, 220, 69, 3, 204, 95, 151, 48, 20, 9, 33, 93, 3, 210, 142, 48, + 20, 9, 33, 93, 3, 195, 107, 48, 20, 9, 33, 93, 3, 87, 48, 20, 9, 33, 93, + 3, 216, 31, 48, 20, 9, 33, 93, 3, 151, 220, 69, 48, 20, 9, 33, 93, 3, 93, + 48, 20, 9, 33, 93, 3, 232, 213, 90, 3, 225, 189, 84, 20, 9, 33, 93, 3, + 232, 213, 90, 3, 168, 84, 20, 9, 33, 93, 3, 232, 213, 90, 3, 224, 142, + 84, 20, 9, 33, 93, 3, 232, 213, 90, 3, 87, 84, 20, 9, 33, 93, 3, 232, + 213, 90, 3, 232, 113, 84, 20, 9, 33, 248, 239, 3, 225, 189, 84, 20, 9, + 33, 248, 239, 3, 168, 84, 20, 9, 33, 248, 239, 3, 224, 142, 84, 20, 9, + 33, 248, 239, 3, 87, 84, 20, 9, 33, 248, 239, 3, 232, 113, 84, 20, 9, 33, + 203, 42, 3, 225, 189, 84, 20, 9, 33, 203, 42, 3, 168, 84, 20, 9, 33, 203, + 42, 3, 224, 142, 84, 20, 9, 33, 203, 42, 3, 87, 84, 20, 9, 33, 203, 42, + 3, 232, 113, 84, 20, 9, 33, 202, 214, 3, 87, 84, 20, 9, 33, 225, 189, 3, + 168, 84, 20, 9, 33, 225, 189, 3, 87, 84, 20, 9, 33, 168, 3, 225, 189, 84, + 20, 9, 33, 168, 3, 87, 84, 20, 9, 33, 224, 142, 3, 225, 189, 84, 20, 9, + 33, 224, 142, 3, 87, 84, 20, 9, 33, 208, 126, 3, 225, 189, 84, 20, 9, 33, + 208, 126, 3, 168, 84, 20, 9, 33, 208, 126, 3, 224, 142, 84, 20, 9, 33, + 208, 126, 3, 87, 84, 20, 9, 33, 209, 9, 3, 168, 84, 20, 9, 33, 209, 9, 3, + 224, 142, 84, 20, 9, 33, 209, 9, 3, 87, 84, 20, 9, 33, 240, 130, 3, 225, + 189, 84, 20, 9, 33, 240, 130, 3, 168, 84, 20, 9, 33, 240, 130, 3, 224, + 142, 84, 20, 9, 33, 240, 130, 3, 87, 84, 20, 9, 33, 203, 140, 3, 168, 84, + 20, 9, 33, 195, 110, 3, 87, 84, 20, 9, 33, 251, 194, 3, 225, 189, 84, 20, + 9, 33, 251, 194, 3, 87, 84, 20, 9, 33, 233, 225, 3, 225, 189, 84, 20, 9, + 33, 233, 225, 3, 87, 84, 20, 9, 33, 235, 176, 3, 225, 189, 84, 20, 9, 33, + 235, 176, 3, 168, 84, 20, 9, 33, 235, 176, 3, 224, 142, 84, 20, 9, 33, + 235, 176, 3, 87, 84, 20, 9, 33, 211, 152, 3, 168, 84, 20, 9, 33, 211, + 152, 3, 87, 84, 20, 9, 33, 225, 35, 3, 225, 189, 84, 20, 9, 33, 225, 35, + 3, 168, 84, 20, 9, 33, 225, 35, 3, 224, 142, 84, 20, 9, 33, 225, 35, 3, + 222, 249, 84, 20, 9, 33, 225, 35, 3, 87, 84, 20, 9, 33, 222, 249, 3, 225, + 189, 84, 20, 9, 33, 222, 249, 3, 168, 84, 20, 9, 33, 222, 249, 3, 224, + 142, 84, 20, 9, 33, 222, 249, 3, 87, 84, 20, 9, 33, 222, 249, 3, 232, + 113, 84, 20, 9, 33, 87, 3, 225, 189, 84, 20, 9, 33, 87, 3, 168, 84, 20, + 9, 33, 87, 3, 224, 142, 84, 20, 9, 33, 87, 3, 87, 84, 20, 9, 33, 216, 31, + 3, 225, 189, 84, 20, 9, 33, 216, 31, 3, 168, 84, 20, 9, 33, 216, 31, 3, + 224, 142, 84, 20, 9, 33, 216, 31, 3, 87, 84, 20, 9, 33, 216, 31, 3, 232, + 113, 84, 20, 9, 33, 232, 113, 3, 225, 189, 84, 20, 9, 33, 232, 113, 3, + 87, 84, 20, 9, 33, 232, 113, 3, 204, 95, 151, 84, 20, 9, 33, 93, 3, 225, + 189, 84, 20, 9, 33, 93, 3, 168, 84, 20, 9, 33, 93, 3, 224, 142, 84, 20, + 9, 33, 93, 3, 87, 84, 20, 9, 33, 93, 3, 232, 113, 84, 20, 9, 33, 93, 3, + 232, 213, 90, 3, 87, 219, 193, 20, 9, 33, 93, 3, 232, 213, 90, 3, 232, + 113, 219, 193, 20, 9, 33, 248, 239, 3, 87, 219, 193, 20, 9, 33, 248, 239, + 3, 232, 113, 219, 193, 20, 9, 33, 203, 42, 3, 87, 219, 193, 20, 9, 33, + 203, 42, 3, 232, 113, 219, 193, 20, 9, 33, 202, 214, 3, 87, 219, 193, 20, + 9, 33, 202, 214, 3, 232, 113, 219, 193, 20, 9, 33, 208, 126, 3, 87, 219, + 193, 20, 9, 33, 208, 126, 3, 232, 113, 219, 193, 20, 9, 33, 206, 252, 3, + 87, 219, 193, 20, 9, 33, 206, 252, 3, 232, 113, 219, 193, 20, 9, 33, 225, + 35, 3, 222, 249, 219, 193, 20, 9, 33, 225, 35, 3, 87, 219, 193, 20, 9, + 33, 222, 249, 3, 87, 219, 193, 20, 9, 33, 216, 31, 3, 87, 219, 193, 20, + 9, 33, 216, 31, 3, 232, 113, 219, 193, 20, 9, 33, 93, 3, 87, 219, 193, + 20, 9, 33, 93, 3, 232, 113, 219, 193, 20, 9, 33, 207, 41, 3, 235, 200, + 219, 193, 20, 9, 33, 207, 41, 3, 240, 95, 219, 193, 20, 9, 33, 207, 41, + 3, 224, 238, 219, 193, 20, 9, 33, 203, 140, 3, 151, 220, 69, 70, 20, 9, + 33, 203, 140, 3, 93, 70, 20, 9, 33, 251, 194, 3, 151, 220, 69, 70, 20, 9, + 33, 251, 194, 3, 93, 70, 20, 9, 33, 233, 225, 3, 151, 220, 69, 70, 20, 9, + 33, 233, 225, 3, 93, 70, 20, 9, 33, 208, 126, 3, 151, 220, 69, 70, 20, 9, + 33, 208, 126, 3, 93, 70, 20, 9, 33, 206, 252, 3, 151, 220, 69, 70, 20, 9, + 33, 206, 252, 3, 93, 70, 20, 9, 33, 168, 3, 151, 220, 69, 70, 20, 9, 33, + 168, 3, 93, 70, 20, 9, 33, 225, 189, 3, 151, 220, 69, 70, 20, 9, 33, 225, + 189, 3, 93, 70, 20, 9, 33, 224, 142, 3, 151, 220, 69, 70, 20, 9, 33, 224, + 142, 3, 93, 70, 20, 9, 33, 209, 9, 3, 151, 220, 69, 70, 20, 9, 33, 209, + 9, 3, 93, 70, 20, 9, 33, 240, 130, 3, 151, 220, 69, 70, 20, 9, 33, 240, + 130, 3, 93, 70, 20, 9, 33, 206, 252, 3, 225, 189, 70, 20, 9, 33, 206, + 252, 3, 168, 70, 20, 9, 33, 206, 252, 3, 224, 142, 70, 20, 9, 33, 206, + 252, 3, 87, 70, 20, 9, 33, 206, 252, 3, 210, 142, 70, 20, 9, 33, 208, + 126, 3, 210, 142, 70, 20, 9, 33, 209, 9, 3, 210, 142, 70, 20, 9, 33, 240, + 130, 3, 210, 142, 70, 20, 9, 33, 203, 140, 3, 151, 220, 69, 48, 20, 9, + 33, 203, 140, 3, 93, 48, 20, 9, 33, 251, 194, 3, 151, 220, 69, 48, 20, 9, + 33, 251, 194, 3, 93, 48, 20, 9, 33, 233, 225, 3, 151, 220, 69, 48, 20, 9, + 33, 233, 225, 3, 93, 48, 20, 9, 33, 208, 126, 3, 151, 220, 69, 48, 20, 9, + 33, 208, 126, 3, 93, 48, 20, 9, 33, 206, 252, 3, 151, 220, 69, 48, 20, 9, + 33, 206, 252, 3, 93, 48, 20, 9, 33, 168, 3, 151, 220, 69, 48, 20, 9, 33, + 168, 3, 93, 48, 20, 9, 33, 225, 189, 3, 151, 220, 69, 48, 20, 9, 33, 225, + 189, 3, 93, 48, 20, 9, 33, 224, 142, 3, 151, 220, 69, 48, 20, 9, 33, 224, + 142, 3, 93, 48, 20, 9, 33, 209, 9, 3, 151, 220, 69, 48, 20, 9, 33, 209, + 9, 3, 93, 48, 20, 9, 33, 240, 130, 3, 151, 220, 69, 48, 20, 9, 33, 240, + 130, 3, 93, 48, 20, 9, 33, 206, 252, 3, 225, 189, 48, 20, 9, 33, 206, + 252, 3, 168, 48, 20, 9, 33, 206, 252, 3, 224, 142, 48, 20, 9, 33, 206, + 252, 3, 87, 48, 20, 9, 33, 206, 252, 3, 210, 142, 48, 20, 9, 33, 208, + 126, 3, 210, 142, 48, 20, 9, 33, 209, 9, 3, 210, 142, 48, 20, 9, 33, 240, + 130, 3, 210, 142, 48, 20, 9, 33, 206, 252, 3, 225, 189, 84, 20, 9, 33, + 206, 252, 3, 168, 84, 20, 9, 33, 206, 252, 3, 224, 142, 84, 20, 9, 33, + 206, 252, 3, 87, 84, 20, 9, 33, 208, 126, 3, 232, 113, 84, 20, 9, 33, + 206, 252, 3, 232, 113, 84, 20, 9, 33, 203, 140, 3, 87, 84, 20, 9, 33, + 208, 126, 3, 225, 189, 219, 193, 20, 9, 33, 208, 126, 3, 168, 219, 193, + 20, 9, 33, 208, 126, 3, 224, 142, 219, 193, 20, 9, 33, 206, 252, 3, 225, + 189, 219, 193, 20, 9, 33, 206, 252, 3, 168, 219, 193, 20, 9, 33, 206, + 252, 3, 224, 142, 219, 193, 20, 9, 33, 203, 140, 3, 87, 219, 193, 20, 9, + 33, 195, 110, 3, 87, 219, 193, 20, 9, 33, 151, 3, 235, 198, 48, 20, 9, + 33, 151, 3, 235, 198, 70, 20, 214, 56, 50, 213, 139, 214, 56, 53, 213, + 139, 9, 33, 203, 42, 3, 225, 189, 3, 87, 84, 20, 9, 33, 203, 42, 3, 168, + 3, 225, 189, 48, 20, 9, 33, 203, 42, 3, 168, 3, 225, 189, 84, 20, 9, 33, + 203, 42, 3, 168, 3, 87, 84, 20, 9, 33, 203, 42, 3, 224, 142, 3, 87, 84, + 20, 9, 33, 203, 42, 3, 87, 3, 225, 189, 84, 20, 9, 33, 203, 42, 3, 87, 3, + 168, 84, 20, 9, 33, 203, 42, 3, 87, 3, 224, 142, 84, 20, 9, 33, 225, 189, + 3, 87, 3, 168, 48, 20, 9, 33, 225, 189, 3, 87, 3, 168, 84, 20, 9, 33, + 168, 3, 87, 3, 93, 48, 20, 9, 33, 168, 3, 87, 3, 151, 220, 69, 48, 20, 9, + 33, 208, 126, 3, 168, 3, 225, 189, 84, 20, 9, 33, 208, 126, 3, 225, 189, + 3, 168, 84, 20, 9, 33, 208, 126, 3, 225, 189, 3, 151, 220, 69, 48, 20, 9, + 33, 208, 126, 3, 87, 3, 168, 48, 20, 9, 33, 208, 126, 3, 87, 3, 168, 84, + 20, 9, 33, 208, 126, 3, 87, 3, 225, 189, 84, 20, 9, 33, 208, 126, 3, 87, + 3, 87, 48, 20, 9, 33, 208, 126, 3, 87, 3, 87, 84, 20, 9, 33, 209, 9, 3, + 168, 3, 168, 48, 20, 9, 33, 209, 9, 3, 168, 3, 168, 84, 20, 9, 33, 209, + 9, 3, 87, 3, 87, 48, 20, 9, 33, 206, 252, 3, 168, 3, 87, 48, 20, 9, 33, + 206, 252, 3, 168, 3, 87, 84, 20, 9, 33, 206, 252, 3, 225, 189, 3, 93, 48, + 20, 9, 33, 206, 252, 3, 87, 3, 224, 142, 48, 20, 9, 33, 206, 252, 3, 87, + 3, 224, 142, 84, 20, 9, 33, 206, 252, 3, 87, 3, 87, 48, 20, 9, 33, 206, + 252, 3, 87, 3, 87, 84, 20, 9, 33, 240, 130, 3, 168, 3, 151, 220, 69, 48, + 20, 9, 33, 240, 130, 3, 224, 142, 3, 87, 48, 20, 9, 33, 240, 130, 3, 224, + 142, 3, 87, 84, 20, 9, 33, 203, 140, 3, 87, 3, 168, 48, 20, 9, 33, 203, + 140, 3, 87, 3, 168, 84, 20, 9, 33, 203, 140, 3, 87, 3, 87, 84, 20, 9, 33, + 203, 140, 3, 87, 3, 93, 48, 20, 9, 33, 251, 194, 3, 225, 189, 3, 87, 48, + 20, 9, 33, 251, 194, 3, 87, 3, 87, 48, 20, 9, 33, 251, 194, 3, 87, 3, 87, + 84, 20, 9, 33, 251, 194, 3, 87, 3, 151, 220, 69, 48, 20, 9, 33, 233, 225, + 3, 87, 3, 87, 48, 20, 9, 33, 233, 225, 3, 87, 3, 93, 48, 20, 9, 33, 233, + 225, 3, 87, 3, 151, 220, 69, 48, 20, 9, 33, 235, 176, 3, 224, 142, 3, 87, + 48, 20, 9, 33, 235, 176, 3, 224, 142, 3, 87, 84, 20, 9, 33, 211, 152, 3, + 87, 3, 168, 48, 20, 9, 33, 211, 152, 3, 87, 3, 87, 48, 20, 9, 33, 222, + 249, 3, 168, 3, 87, 48, 20, 9, 33, 222, 249, 3, 168, 3, 93, 48, 20, 9, + 33, 222, 249, 3, 168, 3, 151, 220, 69, 48, 20, 9, 33, 222, 249, 3, 225, + 189, 3, 225, 189, 84, 20, 9, 33, 222, 249, 3, 225, 189, 3, 225, 189, 48, + 20, 9, 33, 222, 249, 3, 224, 142, 3, 87, 48, 20, 9, 33, 222, 249, 3, 224, + 142, 3, 87, 84, 20, 9, 33, 222, 249, 3, 87, 3, 168, 48, 20, 9, 33, 222, + 249, 3, 87, 3, 168, 84, 20, 9, 33, 87, 3, 168, 3, 225, 189, 84, 20, 9, + 33, 87, 3, 168, 3, 87, 84, 20, 9, 33, 87, 3, 168, 3, 93, 48, 20, 9, 33, + 87, 3, 225, 189, 3, 168, 84, 20, 9, 33, 87, 3, 225, 189, 3, 87, 84, 20, + 9, 33, 87, 3, 224, 142, 3, 225, 189, 84, 20, 9, 33, 87, 3, 224, 142, 3, + 87, 84, 20, 9, 33, 87, 3, 225, 189, 3, 224, 142, 84, 20, 9, 33, 232, 113, + 3, 87, 3, 225, 189, 84, 20, 9, 33, 232, 113, 3, 87, 3, 87, 84, 20, 9, 33, + 216, 31, 3, 168, 3, 87, 84, 20, 9, 33, 216, 31, 3, 168, 3, 151, 220, 69, + 48, 20, 9, 33, 216, 31, 3, 225, 189, 3, 87, 48, 20, 9, 33, 216, 31, 3, + 225, 189, 3, 87, 84, 20, 9, 33, 216, 31, 3, 225, 189, 3, 151, 220, 69, + 48, 20, 9, 33, 216, 31, 3, 87, 3, 93, 48, 20, 9, 33, 216, 31, 3, 87, 3, + 151, 220, 69, 48, 20, 9, 33, 93, 3, 87, 3, 87, 48, 20, 9, 33, 93, 3, 87, + 3, 87, 84, 20, 9, 33, 248, 239, 3, 224, 142, 3, 93, 48, 20, 9, 33, 203, + 42, 3, 225, 189, 3, 93, 48, 20, 9, 33, 203, 42, 3, 225, 189, 3, 151, 220, + 69, 48, 20, 9, 33, 203, 42, 3, 224, 142, 3, 93, 48, 20, 9, 33, 203, 42, + 3, 224, 142, 3, 151, 220, 69, 48, 20, 9, 33, 203, 42, 3, 87, 3, 93, 48, + 20, 9, 33, 203, 42, 3, 87, 3, 151, 220, 69, 48, 20, 9, 33, 225, 189, 3, + 87, 3, 93, 48, 20, 9, 33, 225, 189, 3, 168, 3, 151, 220, 69, 48, 20, 9, + 33, 225, 189, 3, 87, 3, 151, 220, 69, 48, 20, 9, 33, 208, 126, 3, 224, + 142, 3, 151, 220, 69, 48, 20, 9, 33, 209, 9, 3, 168, 3, 93, 48, 20, 9, + 33, 206, 252, 3, 168, 3, 93, 48, 20, 9, 33, 240, 130, 3, 168, 3, 93, 48, + 20, 9, 33, 222, 249, 3, 225, 189, 3, 93, 48, 20, 9, 33, 222, 249, 3, 87, + 3, 93, 48, 20, 9, 33, 93, 3, 168, 3, 93, 48, 20, 9, 33, 93, 3, 225, 189, + 3, 93, 48, 20, 9, 33, 93, 3, 87, 3, 93, 48, 20, 9, 33, 87, 3, 87, 3, 93, + 48, 20, 9, 33, 211, 152, 3, 87, 3, 93, 48, 20, 9, 33, 216, 31, 3, 168, 3, + 93, 48, 20, 9, 33, 211, 152, 3, 87, 3, 168, 84, 20, 9, 33, 222, 249, 3, + 168, 3, 87, 84, 20, 9, 33, 251, 194, 3, 87, 3, 93, 48, 20, 9, 33, 225, + 35, 3, 87, 3, 93, 48, 20, 9, 33, 216, 31, 3, 225, 189, 3, 168, 84, 20, 9, + 33, 87, 3, 224, 142, 3, 93, 48, 20, 9, 33, 222, 249, 3, 225, 189, 3, 87, + 84, 20, 9, 33, 225, 35, 3, 87, 3, 87, 48, 20, 9, 33, 222, 249, 3, 225, + 189, 3, 87, 48, 20, 9, 33, 216, 31, 3, 225, 189, 3, 168, 48, 20, 9, 33, + 225, 189, 3, 168, 3, 93, 48, 20, 9, 33, 168, 3, 225, 189, 3, 93, 48, 20, + 9, 33, 87, 3, 225, 189, 3, 93, 48, 20, 9, 33, 235, 176, 3, 87, 3, 93, 48, + 20, 9, 33, 248, 239, 3, 168, 3, 93, 48, 20, 9, 33, 225, 35, 3, 87, 3, 87, + 84, 20, 9, 33, 251, 194, 3, 225, 189, 3, 87, 84, 20, 9, 33, 209, 9, 3, + 87, 3, 87, 84, 20, 9, 33, 208, 126, 3, 224, 142, 3, 93, 48, 20, 9, 33, + 216, 31, 3, 225, 189, 3, 93, 48, 20, 9, 33, 208, 236, 199, 255, 250, 202, + 223, 233, 204, 227, 2, 70, 20, 9, 33, 211, 148, 199, 255, 250, 202, 223, + 233, 204, 227, 2, 70, 20, 9, 33, 251, 144, 70, 20, 9, 33, 251, 177, 70, + 20, 9, 33, 218, 217, 70, 20, 9, 33, 208, 237, 70, 20, 9, 33, 210, 199, + 70, 20, 9, 33, 251, 166, 70, 20, 9, 33, 197, 137, 70, 20, 9, 33, 208, + 236, 70, 20, 9, 33, 208, 235, 251, 166, 197, 136, 9, 33, 225, 204, 210, + 64, 55, 9, 33, 248, 146, 251, 11, 251, 12, 62, 208, 113, 62, 208, 2, 62, + 207, 190, 62, 207, 179, 62, 207, 168, 62, 207, 157, 62, 207, 146, 62, + 207, 135, 62, 207, 124, 62, 208, 112, 62, 208, 101, 62, 208, 90, 62, 208, + 79, 62, 208, 68, 62, 208, 57, 62, 208, 46, 212, 24, 235, 23, 36, 83, 244, + 158, 212, 24, 235, 23, 36, 83, 143, 244, 158, 212, 24, 235, 23, 36, 83, + 143, 234, 216, 204, 226, 212, 24, 235, 23, 36, 83, 244, 167, 212, 24, + 235, 23, 36, 83, 207, 105, 212, 24, 235, 23, 36, 83, 236, 89, 78, 212, + 24, 235, 23, 36, 83, 211, 78, 78, 212, 24, 235, 23, 36, 83, 50, 59, 222, + 146, 179, 212, 24, 235, 23, 36, 83, 53, 59, 222, 146, 248, 58, 212, 24, + 235, 23, 36, 83, 231, 154, 236, 246, 38, 33, 50, 232, 224, 38, 33, 53, + 232, 224, 38, 52, 202, 85, 50, 232, 224, 38, 52, 202, 85, 53, 232, 224, + 38, 220, 114, 50, 232, 224, 38, 220, 114, 53, 232, 224, 38, 241, 142, + 220, 113, 38, 33, 50, 157, 60, 38, 33, 53, 157, 60, 38, 202, 85, 50, 157, + 60, 38, 202, 85, 53, 157, 60, 38, 220, 114, 50, 157, 60, 38, 220, 114, + 53, 157, 60, 38, 241, 142, 220, 114, 60, 38, 40, 202, 55, 50, 232, 224, + 38, 40, 202, 55, 53, 232, 224, 212, 24, 235, 23, 36, 83, 99, 76, 222, + 194, 212, 24, 235, 23, 36, 83, 236, 241, 240, 64, 212, 24, 235, 23, 36, + 83, 236, 230, 240, 64, 212, 24, 235, 23, 36, 83, 126, 222, 74, 212, 24, + 235, 23, 36, 83, 197, 119, 126, 222, 74, 212, 24, 235, 23, 36, 83, 50, + 213, 139, 212, 24, 235, 23, 36, 83, 53, 213, 139, 212, 24, 235, 23, 36, + 83, 50, 241, 17, 179, 212, 24, 235, 23, 36, 83, 53, 241, 17, 179, 212, + 24, 235, 23, 36, 83, 50, 201, 231, 206, 245, 179, 212, 24, 235, 23, 36, + 83, 53, 201, 231, 206, 245, 179, 212, 24, 235, 23, 36, 83, 50, 58, 222, + 146, 179, 212, 24, 235, 23, 36, 83, 53, 58, 222, 146, 179, 212, 24, 235, + 23, 36, 83, 50, 52, 251, 90, 179, 212, 24, 235, 23, 36, 83, 53, 52, 251, + 90, 179, 212, 24, 235, 23, 36, 83, 50, 251, 90, 179, 212, 24, 235, 23, + 36, 83, 53, 251, 90, 179, 212, 24, 235, 23, 36, 83, 50, 241, 101, 179, + 212, 24, 235, 23, 36, 83, 53, 241, 101, 179, 212, 24, 235, 23, 36, 83, + 50, 59, 241, 101, 179, 212, 24, 235, 23, 36, 83, 53, 59, 241, 101, 179, + 207, 80, 238, 252, 59, 207, 80, 238, 252, 212, 24, 235, 23, 36, 83, 50, + 47, 179, 212, 24, 235, 23, 36, 83, 53, 47, 179, 240, 63, 214, 18, 247, + 32, 214, 18, 197, 119, 214, 18, 52, 197, 119, 214, 18, 240, 63, 126, 222, + 74, 247, 32, 126, 222, 74, 197, 119, 126, 222, 74, 4, 244, 158, 4, 143, + 244, 158, 4, 234, 216, 204, 226, 4, 207, 105, 4, 244, 167, 4, 211, 78, + 78, 4, 236, 89, 78, 4, 236, 241, 240, 64, 4, 50, 213, 139, 4, 53, 213, + 139, 4, 50, 241, 17, 179, 4, 53, 241, 17, 179, 4, 50, 201, 231, 206, 245, + 179, 4, 53, 201, 231, 206, 245, 179, 4, 31, 55, 4, 251, 110, 4, 250, 178, + 4, 98, 55, 4, 231, 5, 4, 222, 139, 55, 4, 233, 93, 55, 4, 236, 171, 55, + 4, 210, 90, 205, 177, 4, 239, 9, 55, 4, 213, 44, 55, 4, 244, 156, 250, + 167, 9, 235, 198, 70, 20, 9, 203, 92, 3, 235, 198, 57, 9, 240, 93, 70, + 20, 9, 203, 136, 234, 252, 9, 224, 236, 70, 20, 9, 235, 200, 70, 20, 9, + 235, 200, 219, 193, 20, 9, 240, 95, 70, 20, 9, 240, 95, 219, 193, 20, 9, + 224, 238, 70, 20, 9, 224, 238, 219, 193, 20, 9, 207, 41, 70, 20, 9, 207, + 41, 219, 193, 20, 9, 204, 120, 70, 20, 9, 204, 120, 219, 193, 20, 9, 1, + 232, 213, 70, 20, 9, 1, 151, 3, 220, 109, 90, 70, 20, 9, 1, 151, 3, 220, + 109, 90, 48, 20, 9, 1, 151, 3, 232, 213, 90, 70, 20, 9, 1, 151, 3, 232, + 213, 90, 48, 20, 9, 1, 197, 118, 3, 232, 213, 90, 70, 20, 9, 1, 197, 118, + 3, 232, 213, 90, 48, 20, 9, 1, 151, 3, 232, 213, 248, 226, 70, 20, 9, 1, + 151, 3, 232, 213, 248, 226, 48, 20, 9, 1, 93, 3, 232, 213, 90, 70, 20, 9, + 1, 93, 3, 232, 213, 90, 48, 20, 9, 1, 93, 3, 232, 213, 90, 84, 20, 9, 1, + 93, 3, 232, 213, 90, 219, 193, 20, 9, 1, 151, 70, 20, 9, 1, 151, 48, 20, + 9, 1, 248, 239, 70, 20, 9, 1, 248, 239, 48, 20, 9, 1, 248, 239, 84, 20, + 9, 1, 248, 239, 219, 193, 20, 9, 1, 203, 42, 220, 35, 70, 20, 9, 1, 203, + 42, 220, 35, 48, 20, 9, 1, 203, 42, 70, 20, 9, 1, 203, 42, 48, 20, 9, 1, + 203, 42, 84, 20, 9, 1, 203, 42, 219, 193, 20, 9, 1, 202, 214, 70, 20, 9, + 1, 202, 214, 48, 20, 9, 1, 202, 214, 84, 20, 9, 1, 202, 214, 219, 193, + 20, 9, 1, 225, 189, 70, 20, 9, 1, 225, 189, 48, 20, 9, 1, 225, 189, 84, + 20, 9, 1, 225, 189, 219, 193, 20, 9, 1, 168, 70, 20, 9, 1, 168, 48, 20, + 9, 1, 168, 84, 20, 9, 1, 168, 219, 193, 20, 9, 1, 224, 142, 70, 20, 9, 1, + 224, 142, 48, 20, 9, 1, 224, 142, 84, 20, 9, 1, 224, 142, 219, 193, 20, + 9, 1, 240, 107, 70, 20, 9, 1, 240, 107, 48, 20, 9, 1, 202, 226, 70, 20, + 9, 1, 202, 226, 48, 20, 9, 1, 210, 142, 70, 20, 9, 1, 210, 142, 48, 20, + 9, 1, 195, 107, 70, 20, 9, 1, 195, 107, 48, 20, 9, 1, 208, 126, 70, 20, + 9, 1, 208, 126, 48, 20, 9, 1, 208, 126, 84, 20, 9, 1, 208, 126, 219, 193, + 20, 9, 1, 206, 252, 70, 20, 9, 1, 206, 252, 48, 20, 9, 1, 206, 252, 84, + 20, 9, 1, 206, 252, 219, 193, 20, 9, 1, 209, 9, 70, 20, 9, 1, 209, 9, 48, + 20, 9, 1, 209, 9, 84, 20, 9, 1, 209, 9, 219, 193, 20, 9, 1, 240, 130, 70, + 20, 9, 1, 240, 130, 48, 20, 9, 1, 240, 130, 84, 20, 9, 1, 240, 130, 219, + 193, 20, 9, 1, 203, 140, 70, 20, 9, 1, 203, 140, 48, 20, 9, 1, 203, 140, + 84, 20, 9, 1, 203, 140, 219, 193, 20, 9, 1, 195, 110, 70, 20, 9, 1, 195, + 110, 48, 20, 9, 1, 195, 110, 84, 20, 9, 1, 195, 110, 219, 193, 20, 9, 1, + 251, 194, 70, 20, 9, 1, 251, 194, 48, 20, 9, 1, 251, 194, 84, 20, 9, 1, + 251, 194, 219, 193, 20, 9, 1, 233, 225, 70, 20, 9, 1, 233, 225, 48, 20, + 9, 1, 233, 225, 84, 20, 9, 1, 233, 225, 219, 193, 20, 9, 1, 235, 176, 70, + 20, 9, 1, 235, 176, 48, 20, 9, 1, 235, 176, 84, 20, 9, 1, 235, 176, 219, + 193, 20, 9, 1, 211, 152, 70, 20, 9, 1, 211, 152, 48, 20, 9, 1, 211, 152, + 84, 20, 9, 1, 211, 152, 219, 193, 20, 9, 1, 225, 35, 70, 20, 9, 1, 225, + 35, 48, 20, 9, 1, 225, 35, 84, 20, 9, 1, 225, 35, 219, 193, 20, 9, 1, + 222, 249, 70, 20, 9, 1, 222, 249, 48, 20, 9, 1, 222, 249, 84, 20, 9, 1, + 222, 249, 219, 193, 20, 9, 1, 87, 70, 20, 9, 1, 87, 48, 20, 9, 1, 87, 84, + 20, 9, 1, 87, 219, 193, 20, 9, 1, 216, 31, 70, 20, 9, 1, 216, 31, 48, 20, + 9, 1, 216, 31, 84, 20, 9, 1, 216, 31, 219, 193, 20, 9, 1, 232, 113, 70, + 20, 9, 1, 232, 113, 48, 20, 9, 1, 232, 113, 84, 20, 9, 1, 232, 113, 219, + 193, 20, 9, 1, 197, 118, 70, 20, 9, 1, 197, 118, 48, 20, 9, 1, 151, 220, + 69, 70, 20, 9, 1, 151, 220, 69, 48, 20, 9, 1, 93, 70, 20, 9, 1, 93, 48, + 20, 9, 1, 93, 84, 20, 9, 1, 93, 219, 193, 20, 9, 33, 222, 249, 3, 151, 3, + 220, 109, 90, 70, 20, 9, 33, 222, 249, 3, 151, 3, 220, 109, 90, 48, 20, + 9, 33, 222, 249, 3, 151, 3, 232, 213, 90, 70, 20, 9, 33, 222, 249, 3, + 151, 3, 232, 213, 90, 48, 20, 9, 33, 222, 249, 3, 151, 3, 232, 213, 248, + 226, 70, 20, 9, 33, 222, 249, 3, 151, 3, 232, 213, 248, 226, 48, 20, 9, + 33, 222, 249, 3, 151, 70, 20, 9, 33, 222, 249, 3, 151, 48, 20, 195, 80, + 197, 59, 216, 43, 205, 148, 174, 236, 89, 78, 174, 211, 61, 78, 174, 31, + 55, 174, 239, 9, 55, 174, 213, 44, 55, 174, 251, 110, 174, 251, 29, 174, + 50, 213, 139, 174, 53, 213, 139, 174, 250, 178, 174, 98, 55, 174, 244, + 158, 174, 231, 5, 174, 234, 216, 204, 226, 174, 205, 177, 174, 17, 195, + 79, 174, 17, 100, 174, 17, 102, 174, 17, 134, 174, 17, 136, 174, 17, 146, + 174, 17, 167, 174, 17, 178, 174, 17, 171, 174, 17, 182, 174, 244, 167, + 174, 207, 105, 174, 222, 139, 55, 174, 236, 171, 55, 174, 233, 93, 55, + 174, 211, 78, 78, 174, 244, 156, 250, 167, 174, 8, 6, 1, 63, 174, 8, 6, + 1, 250, 111, 174, 8, 6, 1, 247, 206, 174, 8, 6, 1, 240, 230, 174, 8, 6, + 1, 69, 174, 8, 6, 1, 236, 48, 174, 8, 6, 1, 234, 189, 174, 8, 6, 1, 233, + 14, 174, 8, 6, 1, 68, 174, 8, 6, 1, 225, 216, 174, 8, 6, 1, 225, 79, 174, + 8, 6, 1, 159, 174, 8, 6, 1, 221, 135, 174, 8, 6, 1, 218, 54, 174, 8, 6, + 1, 72, 174, 8, 6, 1, 214, 2, 174, 8, 6, 1, 211, 166, 174, 8, 6, 1, 144, + 174, 8, 6, 1, 209, 80, 174, 8, 6, 1, 203, 216, 174, 8, 6, 1, 66, 174, 8, + 6, 1, 199, 230, 174, 8, 6, 1, 197, 199, 174, 8, 6, 1, 196, 222, 174, 8, + 6, 1, 196, 148, 174, 8, 6, 1, 195, 158, 174, 50, 47, 179, 174, 210, 90, + 205, 177, 174, 53, 47, 179, 174, 244, 240, 252, 21, 174, 126, 222, 74, + 174, 233, 100, 252, 21, 174, 8, 4, 1, 63, 174, 8, 4, 1, 250, 111, 174, 8, + 4, 1, 247, 206, 174, 8, 4, 1, 240, 230, 174, 8, 4, 1, 69, 174, 8, 4, 1, + 236, 48, 174, 8, 4, 1, 234, 189, 174, 8, 4, 1, 233, 14, 174, 8, 4, 1, 68, + 174, 8, 4, 1, 225, 216, 174, 8, 4, 1, 225, 79, 174, 8, 4, 1, 159, 174, 8, + 4, 1, 221, 135, 174, 8, 4, 1, 218, 54, 174, 8, 4, 1, 72, 174, 8, 4, 1, + 214, 2, 174, 8, 4, 1, 211, 166, 174, 8, 4, 1, 144, 174, 8, 4, 1, 209, 80, + 174, 8, 4, 1, 203, 216, 174, 8, 4, 1, 66, 174, 8, 4, 1, 199, 230, 174, 8, + 4, 1, 197, 199, 174, 8, 4, 1, 196, 222, 174, 8, 4, 1, 196, 148, 174, 8, + 4, 1, 195, 158, 174, 50, 241, 17, 179, 174, 83, 222, 74, 174, 53, 241, + 17, 179, 174, 202, 84, 174, 50, 59, 213, 139, 174, 53, 59, 213, 139, 138, + 143, 234, 216, 204, 226, 138, 50, 241, 101, 179, 138, 53, 241, 101, 179, + 138, 143, 244, 158, 138, 71, 112, 238, 252, 138, 71, 1, 197, 34, 138, 71, + 1, 4, 63, 138, 71, 1, 4, 68, 138, 71, 1, 4, 66, 138, 71, 1, 4, 69, 138, + 71, 1, 4, 72, 138, 71, 1, 4, 164, 138, 71, 1, 4, 195, 217, 138, 71, 1, 4, + 196, 3, 138, 71, 1, 4, 201, 40, 138, 224, 233, 211, 251, 205, 162, 78, + 138, 71, 1, 63, 138, 71, 1, 68, 138, 71, 1, 66, 138, 71, 1, 69, 138, 71, + 1, 72, 138, 71, 1, 155, 138, 71, 1, 224, 100, 138, 71, 1, 223, 186, 138, + 71, 1, 224, 208, 138, 71, 1, 224, 10, 138, 71, 1, 183, 138, 71, 1, 206, + 112, 138, 71, 1, 204, 172, 138, 71, 1, 208, 147, 138, 71, 1, 205, 200, + 138, 71, 1, 189, 138, 71, 1, 202, 122, 138, 71, 1, 201, 40, 138, 71, 1, + 203, 68, 138, 71, 1, 149, 138, 71, 1, 176, 138, 71, 1, 216, 222, 138, 71, + 1, 215, 185, 138, 71, 1, 217, 117, 138, 71, 1, 216, 49, 138, 71, 1, 142, + 138, 71, 1, 232, 70, 138, 71, 1, 231, 74, 138, 71, 1, 232, 146, 138, 71, + 1, 231, 192, 138, 71, 1, 166, 138, 71, 1, 219, 77, 138, 71, 1, 218, 144, + 138, 71, 1, 219, 206, 138, 71, 1, 218, 250, 138, 71, 1, 164, 138, 71, 1, + 195, 217, 138, 71, 1, 196, 3, 138, 71, 1, 169, 138, 71, 1, 210, 72, 138, + 71, 1, 209, 140, 138, 71, 1, 210, 182, 138, 71, 1, 209, 232, 138, 71, 1, + 197, 166, 138, 71, 1, 218, 54, 138, 71, 198, 244, 205, 162, 78, 138, 71, + 207, 110, 205, 162, 78, 138, 29, 235, 133, 138, 29, 1, 224, 47, 138, 29, + 1, 205, 72, 138, 29, 1, 224, 40, 138, 29, 1, 216, 207, 138, 29, 1, 216, + 205, 138, 29, 1, 216, 204, 138, 29, 1, 202, 97, 138, 29, 1, 205, 61, 138, + 29, 1, 210, 54, 138, 29, 1, 210, 49, 138, 29, 1, 210, 46, 138, 29, 1, + 210, 39, 138, 29, 1, 210, 34, 138, 29, 1, 210, 29, 138, 29, 1, 210, 40, + 138, 29, 1, 210, 52, 138, 29, 1, 219, 55, 138, 29, 1, 212, 205, 138, 29, + 1, 205, 69, 138, 29, 1, 212, 194, 138, 29, 1, 206, 52, 138, 29, 1, 205, + 66, 138, 29, 1, 226, 142, 138, 29, 1, 245, 5, 138, 29, 1, 205, 76, 138, + 29, 1, 245, 70, 138, 29, 1, 224, 121, 138, 29, 1, 202, 191, 138, 29, 1, + 212, 243, 138, 29, 1, 232, 54, 138, 29, 1, 63, 138, 29, 1, 251, 244, 138, + 29, 1, 164, 138, 29, 1, 196, 118, 138, 29, 1, 236, 191, 138, 29, 1, 69, + 138, 29, 1, 196, 56, 138, 29, 1, 196, 69, 138, 29, 1, 72, 138, 29, 1, + 197, 166, 138, 29, 1, 197, 157, 138, 29, 1, 214, 163, 138, 29, 1, 196, 3, + 138, 29, 1, 66, 138, 29, 1, 197, 91, 138, 29, 1, 197, 109, 138, 29, 1, + 197, 70, 138, 29, 1, 195, 217, 138, 29, 1, 236, 115, 138, 29, 1, 196, 24, + 138, 29, 1, 68, 174, 247, 38, 55, 174, 212, 62, 55, 174, 216, 18, 55, + 174, 220, 113, 174, 248, 32, 154, 174, 196, 60, 55, 174, 197, 17, 55, + 138, 235, 18, 175, 199, 100, 138, 107, 51, 138, 200, 24, 51, 138, 91, 51, + 138, 237, 230, 51, 138, 58, 205, 94, 138, 59, 244, 248, 226, 29, 251, 75, + 251, 101, 226, 29, 251, 75, 207, 90, 226, 29, 251, 75, 203, 8, 214, 182, + 210, 114, 246, 254, 210, 114, 246, 254, 30, 74, 5, 250, 95, 63, 30, 74, + 5, 250, 64, 69, 30, 74, 5, 250, 73, 68, 30, 74, 5, 250, 41, 72, 30, 74, + 5, 250, 91, 66, 30, 74, 5, 250, 110, 240, 135, 30, 74, 5, 250, 57, 239, + 251, 30, 74, 5, 250, 97, 239, 151, 30, 74, 5, 250, 87, 239, 27, 30, 74, + 5, 250, 51, 237, 200, 30, 74, 5, 250, 45, 225, 213, 30, 74, 5, 250, 56, + 225, 192, 30, 74, 5, 250, 66, 225, 128, 30, 74, 5, 250, 37, 225, 109, 30, + 74, 5, 250, 25, 155, 30, 74, 5, 250, 58, 224, 208, 30, 74, 5, 250, 35, + 224, 100, 30, 74, 5, 250, 32, 224, 10, 30, 74, 5, 250, 21, 223, 186, 30, + 74, 5, 250, 22, 166, 30, 74, 5, 250, 88, 219, 206, 30, 74, 5, 250, 29, + 219, 77, 30, 74, 5, 250, 86, 218, 250, 30, 74, 5, 250, 78, 218, 144, 30, + 74, 5, 250, 99, 176, 30, 74, 5, 250, 77, 217, 117, 30, 74, 5, 250, 71, + 216, 222, 30, 74, 5, 250, 50, 216, 49, 30, 74, 5, 250, 47, 215, 185, 30, + 74, 5, 250, 106, 161, 30, 74, 5, 250, 30, 213, 91, 30, 74, 5, 250, 63, + 212, 219, 30, 74, 5, 250, 90, 212, 116, 30, 74, 5, 250, 52, 211, 226, 30, + 74, 5, 250, 85, 211, 158, 30, 74, 5, 250, 24, 211, 138, 30, 74, 5, 250, + 80, 211, 120, 30, 74, 5, 250, 69, 211, 108, 30, 74, 5, 250, 42, 169, 30, + 74, 5, 250, 74, 210, 182, 30, 74, 5, 250, 49, 210, 72, 30, 74, 5, 250, + 108, 209, 232, 30, 74, 5, 250, 75, 209, 140, 30, 74, 5, 250, 70, 183, 30, + 74, 5, 250, 93, 208, 147, 30, 74, 5, 250, 61, 206, 112, 30, 74, 5, 250, + 89, 205, 200, 30, 74, 5, 250, 44, 204, 172, 30, 74, 5, 250, 43, 189, 30, + 74, 5, 250, 104, 203, 68, 30, 74, 5, 250, 65, 202, 122, 30, 74, 5, 250, + 102, 149, 30, 74, 5, 250, 33, 201, 40, 30, 74, 5, 250, 48, 197, 166, 30, + 74, 5, 250, 27, 197, 109, 30, 74, 5, 250, 62, 197, 70, 30, 74, 5, 250, + 60, 197, 34, 30, 74, 5, 250, 84, 195, 115, 30, 74, 5, 250, 28, 195, 88, + 30, 74, 5, 250, 81, 195, 11, 30, 74, 5, 250, 76, 254, 176, 30, 74, 5, + 250, 59, 254, 64, 30, 74, 5, 250, 18, 250, 149, 30, 74, 5, 250, 31, 237, + 165, 30, 74, 5, 250, 14, 237, 164, 30, 74, 5, 250, 54, 215, 117, 30, 74, + 5, 250, 72, 211, 224, 30, 74, 5, 250, 40, 211, 228, 30, 74, 5, 250, 26, + 210, 245, 30, 74, 5, 250, 68, 210, 244, 30, 74, 5, 250, 34, 209, 225, 30, + 74, 5, 250, 36, 203, 163, 30, 74, 5, 250, 16, 200, 243, 30, 74, 5, 250, + 13, 102, 30, 74, 16, 250, 83, 30, 74, 16, 250, 82, 30, 74, 16, 250, 79, + 30, 74, 16, 250, 67, 30, 74, 16, 250, 55, 30, 74, 16, 250, 53, 30, 74, + 16, 250, 46, 30, 74, 16, 250, 39, 30, 74, 16, 250, 38, 30, 74, 16, 250, + 23, 30, 74, 16, 250, 20, 30, 74, 16, 250, 19, 30, 74, 16, 250, 17, 30, + 74, 16, 250, 15, 30, 74, 147, 250, 12, 220, 61, 30, 74, 147, 250, 11, + 197, 21, 30, 74, 147, 250, 10, 239, 233, 30, 74, 147, 250, 9, 236, 168, + 30, 74, 147, 250, 8, 220, 28, 30, 74, 147, 250, 7, 205, 15, 30, 74, 147, + 250, 6, 236, 96, 30, 74, 147, 250, 5, 210, 209, 30, 74, 147, 250, 4, 206, + 254, 30, 74, 147, 250, 3, 232, 138, 30, 74, 147, 250, 2, 205, 156, 30, + 74, 147, 250, 1, 248, 113, 30, 74, 147, 250, 0, 241, 82, 30, 74, 147, + 249, 255, 248, 6, 30, 74, 147, 249, 254, 197, 79, 30, 74, 147, 249, 253, + 249, 75, 30, 74, 147, 249, 252, 214, 128, 30, 74, 147, 249, 251, 205, + 126, 30, 74, 147, 249, 250, 240, 238, 30, 74, 218, 204, 249, 249, 225, 3, + 30, 74, 218, 204, 249, 248, 225, 14, 30, 74, 147, 249, 247, 214, 143, 30, + 74, 147, 249, 246, 197, 46, 30, 74, 147, 249, 245, 30, 74, 218, 204, 249, + 244, 250, 243, 30, 74, 218, 204, 249, 243, 219, 155, 30, 74, 147, 249, + 242, 248, 31, 30, 74, 147, 249, 241, 233, 134, 30, 74, 147, 249, 240, 30, + 74, 147, 249, 239, 197, 12, 30, 74, 147, 249, 238, 30, 74, 147, 249, 237, + 30, 74, 147, 249, 236, 231, 101, 30, 74, 147, 249, 235, 30, 74, 147, 249, + 234, 30, 74, 147, 249, 233, 30, 74, 218, 204, 249, 231, 201, 2, 30, 74, + 147, 249, 230, 30, 74, 147, 249, 229, 30, 74, 147, 249, 228, 244, 196, + 30, 74, 147, 249, 227, 30, 74, 147, 249, 226, 30, 74, 147, 249, 225, 234, + 78, 30, 74, 147, 249, 224, 250, 228, 30, 74, 147, 249, 223, 30, 74, 147, + 249, 222, 30, 74, 147, 249, 221, 30, 74, 147, 249, 220, 30, 74, 147, 249, + 219, 30, 74, 147, 249, 218, 30, 74, 147, 249, 217, 30, 74, 147, 249, 216, + 30, 74, 147, 249, 215, 30, 74, 147, 249, 214, 218, 196, 30, 74, 147, 249, + 213, 30, 74, 147, 249, 212, 201, 190, 30, 74, 147, 249, 211, 30, 74, 147, + 249, 210, 30, 74, 147, 249, 209, 30, 74, 147, 249, 208, 30, 74, 147, 249, + 207, 30, 74, 147, 249, 206, 30, 74, 147, 249, 205, 30, 74, 147, 249, 204, + 30, 74, 147, 249, 203, 30, 74, 147, 249, 202, 30, 74, 147, 249, 201, 30, + 74, 147, 249, 200, 232, 102, 30, 74, 147, 249, 179, 235, 32, 30, 74, 147, + 249, 176, 249, 50, 30, 74, 147, 249, 171, 205, 134, 30, 74, 147, 249, + 170, 51, 30, 74, 147, 249, 169, 30, 74, 147, 249, 168, 204, 48, 30, 74, + 147, 249, 167, 30, 74, 147, 249, 166, 30, 74, 147, 249, 165, 197, 74, + 245, 111, 30, 74, 147, 249, 164, 245, 111, 30, 74, 147, 249, 163, 245, + 112, 234, 249, 30, 74, 147, 249, 162, 197, 77, 30, 74, 147, 249, 161, 30, + 74, 147, 249, 160, 30, 74, 218, 204, 249, 159, 239, 86, 30, 74, 147, 249, + 158, 30, 74, 147, 249, 157, 30, 74, 147, 249, 155, 30, 74, 147, 249, 154, + 30, 74, 147, 249, 153, 30, 74, 147, 249, 152, 240, 67, 30, 74, 147, 249, + 151, 30, 74, 147, 249, 150, 30, 74, 147, 249, 149, 30, 74, 147, 249, 148, + 30, 74, 147, 249, 147, 30, 74, 147, 199, 47, 249, 232, 30, 74, 147, 199, + 47, 249, 199, 30, 74, 147, 199, 47, 249, 198, 30, 74, 147, 199, 47, 249, + 197, 30, 74, 147, 199, 47, 249, 196, 30, 74, 147, 199, 47, 249, 195, 30, + 74, 147, 199, 47, 249, 194, 30, 74, 147, 199, 47, 249, 193, 30, 74, 147, + 199, 47, 249, 192, 30, 74, 147, 199, 47, 249, 191, 30, 74, 147, 199, 47, + 249, 190, 30, 74, 147, 199, 47, 249, 189, 30, 74, 147, 199, 47, 249, 188, + 30, 74, 147, 199, 47, 249, 187, 30, 74, 147, 199, 47, 249, 186, 30, 74, + 147, 199, 47, 249, 185, 30, 74, 147, 199, 47, 249, 184, 30, 74, 147, 199, + 47, 249, 183, 30, 74, 147, 199, 47, 249, 182, 30, 74, 147, 199, 47, 249, + 181, 30, 74, 147, 199, 47, 249, 180, 30, 74, 147, 199, 47, 249, 178, 30, + 74, 147, 199, 47, 249, 177, 30, 74, 147, 199, 47, 249, 175, 30, 74, 147, + 199, 47, 249, 174, 30, 74, 147, 199, 47, 249, 173, 30, 74, 147, 199, 47, + 249, 172, 30, 74, 147, 199, 47, 249, 156, 30, 74, 147, 199, 47, 249, 146, + 251, 237, 197, 9, 207, 91, 222, 74, 251, 237, 197, 9, 207, 91, 238, 252, + 251, 237, 245, 101, 78, 251, 237, 31, 100, 251, 237, 31, 102, 251, 237, + 31, 134, 251, 237, 31, 136, 251, 237, 31, 146, 251, 237, 31, 167, 251, + 237, 31, 178, 251, 237, 31, 171, 251, 237, 31, 182, 251, 237, 31, 203, + 23, 251, 237, 31, 200, 234, 251, 237, 31, 202, 177, 251, 237, 31, 235, + 13, 251, 237, 31, 235, 144, 251, 237, 31, 206, 13, 251, 237, 31, 207, 65, + 251, 237, 31, 237, 19, 251, 237, 31, 216, 173, 251, 237, 31, 97, 231, 56, + 251, 237, 31, 99, 231, 56, 251, 237, 31, 115, 231, 56, 251, 237, 31, 235, + 6, 231, 56, 251, 237, 31, 235, 100, 231, 56, 251, 237, 31, 206, 29, 231, + 56, 251, 237, 31, 207, 71, 231, 56, 251, 237, 31, 237, 30, 231, 56, 251, + 237, 31, 216, 178, 231, 56, 251, 237, 31, 97, 170, 251, 237, 31, 99, 170, + 251, 237, 31, 115, 170, 251, 237, 31, 235, 6, 170, 251, 237, 31, 235, + 100, 170, 251, 237, 31, 206, 29, 170, 251, 237, 31, 207, 71, 170, 251, + 237, 31, 237, 30, 170, 251, 237, 31, 216, 178, 170, 251, 237, 31, 203, + 24, 170, 251, 237, 31, 200, 235, 170, 251, 237, 31, 202, 178, 170, 251, + 237, 31, 235, 14, 170, 251, 237, 31, 235, 145, 170, 251, 237, 31, 206, + 14, 170, 251, 237, 31, 207, 66, 170, 251, 237, 31, 237, 20, 170, 251, + 237, 31, 216, 174, 170, 251, 237, 197, 94, 249, 66, 200, 49, 251, 237, + 197, 94, 235, 112, 204, 137, 251, 237, 197, 94, 208, 136, 204, 137, 251, + 237, 197, 94, 202, 185, 204, 137, 251, 237, 197, 94, 234, 255, 204, 137, + 251, 237, 237, 203, 219, 202, 235, 112, 204, 137, 251, 237, 222, 55, 219, + 202, 235, 112, 204, 137, 251, 237, 219, 202, 208, 136, 204, 137, 251, + 237, 219, 202, 202, 185, 204, 137, 32, 252, 12, 250, 151, 97, 211, 86, + 32, 252, 12, 250, 151, 97, 232, 224, 32, 252, 12, 250, 151, 97, 237, 226, + 32, 252, 12, 250, 151, 146, 32, 252, 12, 250, 151, 235, 144, 32, 252, 12, + 250, 151, 235, 100, 231, 56, 32, 252, 12, 250, 151, 235, 100, 170, 32, + 252, 12, 250, 151, 235, 145, 170, 32, 252, 12, 250, 151, 235, 100, 203, + 123, 32, 252, 12, 250, 151, 203, 24, 203, 123, 32, 252, 12, 250, 151, + 235, 145, 203, 123, 32, 252, 12, 250, 151, 97, 231, 57, 203, 123, 32, + 252, 12, 250, 151, 235, 100, 231, 57, 203, 123, 32, 252, 12, 250, 151, + 97, 202, 159, 203, 123, 32, 252, 12, 250, 151, 235, 100, 202, 159, 203, + 123, 32, 252, 12, 250, 151, 235, 100, 204, 255, 32, 252, 12, 250, 151, + 203, 24, 204, 255, 32, 252, 12, 250, 151, 235, 145, 204, 255, 32, 252, + 12, 250, 151, 97, 231, 57, 204, 255, 32, 252, 12, 250, 151, 235, 100, + 231, 57, 204, 255, 32, 252, 12, 250, 151, 97, 202, 159, 204, 255, 32, + 252, 12, 250, 151, 203, 24, 202, 159, 204, 255, 32, 252, 12, 250, 151, + 235, 145, 202, 159, 204, 255, 32, 252, 12, 250, 151, 203, 24, 218, 253, + 32, 252, 12, 232, 96, 97, 212, 134, 32, 252, 12, 202, 201, 100, 32, 252, + 12, 232, 92, 100, 32, 252, 12, 236, 177, 102, 32, 252, 12, 202, 201, 102, + 32, 252, 12, 240, 235, 99, 237, 225, 32, 252, 12, 236, 177, 99, 237, 225, + 32, 252, 12, 201, 156, 146, 32, 252, 12, 201, 156, 203, 23, 32, 252, 12, + 201, 156, 203, 24, 251, 130, 20, 32, 252, 12, 232, 92, 203, 23, 32, 252, + 12, 219, 144, 203, 23, 32, 252, 12, 202, 201, 203, 23, 32, 252, 12, 202, + 201, 202, 177, 32, 252, 12, 201, 156, 235, 144, 32, 252, 12, 201, 156, + 235, 145, 251, 130, 20, 32, 252, 12, 232, 92, 235, 144, 32, 252, 12, 202, + 201, 235, 144, 32, 252, 12, 202, 201, 97, 231, 56, 32, 252, 12, 202, 201, + 115, 231, 56, 32, 252, 12, 236, 177, 235, 100, 231, 56, 32, 252, 12, 201, + 156, 235, 100, 231, 56, 32, 252, 12, 202, 201, 235, 100, 231, 56, 32, + 252, 12, 247, 95, 235, 100, 231, 56, 32, 252, 12, 217, 195, 235, 100, + 231, 56, 32, 252, 12, 202, 201, 97, 170, 32, 252, 12, 202, 201, 235, 100, + 170, 32, 252, 12, 239, 214, 235, 100, 218, 253, 32, 252, 12, 204, 214, + 235, 145, 218, 253, 32, 97, 157, 55, 32, 97, 157, 2, 251, 130, 20, 32, + 99, 202, 182, 55, 32, 115, 211, 85, 55, 32, 196, 67, 55, 32, 203, 124, + 55, 32, 237, 227, 55, 32, 214, 179, 55, 32, 99, 214, 178, 55, 32, 115, + 214, 178, 55, 32, 235, 6, 214, 178, 55, 32, 235, 100, 214, 178, 55, 32, + 219, 138, 55, 32, 223, 107, 249, 66, 55, 32, 222, 48, 55, 32, 214, 35, + 55, 32, 196, 199, 55, 32, 250, 208, 55, 32, 250, 224, 55, 32, 233, 109, + 55, 32, 201, 116, 249, 66, 55, 32, 195, 80, 55, 32, 97, 211, 87, 55, 32, + 206, 54, 55, 32, 226, 66, 55, 216, 38, 55, 209, 208, 207, 62, 55, 209, + 208, 200, 65, 55, 209, 208, 207, 97, 55, 209, 208, 207, 60, 55, 209, 208, + 239, 101, 207, 60, 55, 209, 208, 206, 77, 55, 209, 208, 239, 210, 55, + 209, 208, 211, 70, 55, 209, 208, 207, 78, 55, 209, 208, 237, 179, 55, + 209, 208, 250, 202, 55, 209, 208, 247, 31, 55, 32, 16, 203, 90, 210, 74, + 213, 0, 239, 78, 2, 213, 80, 213, 0, 239, 78, 2, 212, 126, 232, 136, 213, + 0, 239, 78, 2, 203, 93, 232, 136, 213, 0, 239, 78, 2, 247, 118, 213, 0, + 239, 78, 2, 245, 65, 213, 0, 239, 78, 2, 197, 21, 213, 0, 239, 78, 2, + 232, 102, 213, 0, 239, 78, 2, 234, 70, 213, 0, 239, 78, 2, 202, 113, 213, + 0, 239, 78, 2, 51, 213, 0, 239, 78, 2, 248, 76, 213, 0, 239, 78, 2, 206, + 220, 213, 0, 239, 78, 2, 244, 189, 213, 0, 239, 78, 2, 220, 60, 213, 0, + 239, 78, 2, 219, 255, 213, 0, 239, 78, 2, 208, 185, 213, 0, 239, 78, 2, + 222, 103, 213, 0, 239, 78, 2, 248, 97, 213, 0, 239, 78, 2, 247, 102, 212, + 141, 213, 0, 239, 78, 2, 239, 10, 213, 0, 239, 78, 2, 244, 164, 213, 0, + 239, 78, 2, 205, 235, 213, 0, 239, 78, 2, 244, 165, 213, 0, 239, 78, 2, + 248, 247, 213, 0, 239, 78, 2, 206, 207, 213, 0, 239, 78, 2, 231, 101, + 213, 0, 239, 78, 2, 232, 60, 213, 0, 239, 78, 2, 248, 1, 222, 171, 213, + 0, 239, 78, 2, 247, 91, 213, 0, 239, 78, 2, 210, 209, 213, 0, 239, 78, 2, + 237, 78, 213, 0, 239, 78, 2, 237, 235, 213, 0, 239, 78, 2, 201, 18, 213, + 0, 239, 78, 2, 248, 250, 213, 0, 239, 78, 2, 212, 142, 201, 190, 213, 0, + 239, 78, 2, 199, 14, 213, 0, 239, 78, 2, 213, 157, 213, 0, 239, 78, 2, + 209, 197, 213, 0, 239, 78, 2, 222, 87, 213, 0, 239, 78, 2, 214, 13, 249, + 137, 213, 0, 239, 78, 2, 235, 57, 213, 0, 239, 78, 2, 233, 101, 213, 0, + 239, 78, 2, 204, 215, 213, 0, 239, 78, 2, 4, 250, 122, 213, 0, 239, 78, + 2, 197, 119, 249, 88, 213, 0, 239, 78, 2, 38, 214, 181, 106, 221, 148, 1, + 63, 221, 148, 1, 69, 221, 148, 1, 250, 111, 221, 148, 1, 248, 197, 221, + 148, 1, 234, 189, 221, 148, 1, 240, 230, 221, 148, 1, 68, 221, 148, 1, + 197, 199, 221, 148, 1, 195, 158, 221, 148, 1, 202, 235, 221, 148, 1, 225, + 216, 221, 148, 1, 225, 79, 221, 148, 1, 211, 166, 221, 148, 1, 159, 221, + 148, 1, 221, 135, 221, 148, 1, 218, 54, 221, 148, 1, 218, 255, 221, 148, + 1, 216, 86, 221, 148, 1, 66, 221, 148, 1, 214, 2, 221, 148, 1, 224, 36, + 221, 148, 1, 144, 221, 148, 1, 209, 80, 221, 148, 1, 203, 216, 221, 148, + 1, 201, 81, 221, 148, 1, 251, 105, 221, 148, 1, 236, 229, 221, 148, 1, + 233, 14, 221, 148, 1, 196, 222, 247, 108, 1, 63, 247, 108, 1, 213, 244, + 247, 108, 1, 240, 230, 247, 108, 1, 159, 247, 108, 1, 199, 243, 247, 108, + 1, 144, 247, 108, 1, 222, 200, 247, 108, 1, 254, 176, 247, 108, 1, 211, + 166, 247, 108, 1, 250, 111, 247, 108, 1, 221, 135, 247, 108, 1, 72, 247, + 108, 1, 240, 137, 247, 108, 1, 203, 216, 247, 108, 1, 207, 52, 247, 108, + 1, 207, 51, 247, 108, 1, 209, 80, 247, 108, 1, 247, 205, 247, 108, 1, 66, + 247, 108, 1, 216, 86, 247, 108, 1, 196, 222, 247, 108, 1, 218, 54, 247, + 108, 1, 201, 80, 247, 108, 1, 214, 2, 247, 108, 1, 205, 83, 247, 108, 1, + 68, 247, 108, 1, 69, 247, 108, 1, 199, 240, 247, 108, 1, 225, 79, 247, + 108, 1, 225, 70, 247, 108, 1, 217, 160, 247, 108, 1, 199, 245, 247, 108, + 1, 234, 189, 247, 108, 1, 234, 124, 247, 108, 1, 205, 23, 247, 108, 1, + 205, 22, 247, 108, 1, 217, 72, 247, 108, 1, 226, 119, 247, 108, 1, 247, + 204, 247, 108, 1, 201, 81, 247, 108, 1, 199, 242, 247, 108, 1, 209, 182, + 247, 108, 1, 219, 245, 247, 108, 1, 219, 244, 247, 108, 1, 219, 243, 247, + 108, 1, 219, 242, 247, 108, 1, 222, 199, 247, 108, 1, 237, 82, 247, 108, + 1, 199, 241, 88, 236, 180, 202, 158, 78, 88, 236, 180, 17, 100, 88, 236, + 180, 17, 102, 88, 236, 180, 17, 134, 88, 236, 180, 17, 136, 88, 236, 180, + 17, 146, 88, 236, 180, 17, 167, 88, 236, 180, 17, 178, 88, 236, 180, 17, + 171, 88, 236, 180, 17, 182, 88, 236, 180, 31, 203, 23, 88, 236, 180, 31, + 200, 234, 88, 236, 180, 31, 202, 177, 88, 236, 180, 31, 235, 13, 88, 236, + 180, 31, 235, 144, 88, 236, 180, 31, 206, 13, 88, 236, 180, 31, 207, 65, + 88, 236, 180, 31, 237, 19, 88, 236, 180, 31, 216, 173, 88, 236, 180, 31, + 97, 231, 56, 88, 236, 180, 31, 99, 231, 56, 88, 236, 180, 31, 115, 231, + 56, 88, 236, 180, 31, 235, 6, 231, 56, 88, 236, 180, 31, 235, 100, 231, + 56, 88, 236, 180, 31, 206, 29, 231, 56, 88, 236, 180, 31, 207, 71, 231, + 56, 88, 236, 180, 31, 237, 30, 231, 56, 88, 236, 180, 31, 216, 178, 231, + 56, 37, 41, 1, 63, 37, 41, 1, 249, 8, 37, 41, 1, 224, 208, 37, 41, 1, + 239, 251, 37, 41, 1, 69, 37, 41, 1, 199, 118, 37, 41, 1, 195, 88, 37, 41, + 1, 232, 146, 37, 41, 1, 202, 217, 37, 41, 1, 68, 37, 41, 1, 155, 37, 41, + 1, 237, 6, 37, 41, 1, 236, 240, 37, 41, 1, 236, 229, 37, 41, 1, 236, 140, + 37, 41, 1, 72, 37, 41, 1, 213, 91, 37, 41, 1, 206, 255, 37, 41, 1, 223, + 186, 37, 41, 1, 236, 162, 37, 41, 1, 236, 150, 37, 41, 1, 203, 68, 37, + 41, 1, 66, 37, 41, 1, 237, 9, 37, 41, 1, 212, 248, 37, 41, 1, 224, 130, + 37, 41, 1, 237, 46, 37, 41, 1, 236, 152, 37, 41, 1, 245, 102, 37, 41, 1, + 226, 119, 37, 41, 1, 199, 245, 37, 41, 1, 236, 133, 37, 41, 215, 141, + 100, 37, 41, 215, 141, 146, 37, 41, 215, 141, 203, 23, 37, 41, 215, 141, + 235, 144, 37, 41, 1, 196, 69, 37, 41, 1, 216, 22, 201, 107, 37, 41, 1, + 205, 157, 201, 107, 233, 119, 1, 251, 202, 233, 119, 1, 249, 108, 233, + 119, 1, 233, 188, 233, 119, 1, 240, 116, 233, 119, 1, 251, 197, 233, 119, + 1, 211, 149, 233, 119, 1, 225, 228, 233, 119, 1, 232, 237, 233, 119, 1, + 202, 171, 233, 119, 1, 237, 17, 233, 119, 1, 223, 145, 233, 119, 1, 223, + 57, 233, 119, 1, 220, 51, 233, 119, 1, 217, 197, 233, 119, 1, 225, 184, + 233, 119, 1, 200, 7, 233, 119, 1, 213, 217, 233, 119, 1, 216, 173, 233, + 119, 1, 210, 222, 233, 119, 1, 208, 189, 233, 119, 1, 203, 38, 233, 119, + 1, 197, 44, 233, 119, 1, 235, 218, 233, 119, 1, 226, 123, 233, 119, 1, + 231, 40, 233, 119, 1, 214, 47, 233, 119, 1, 216, 178, 231, 56, 37, 213, + 35, 1, 251, 105, 37, 213, 35, 1, 247, 243, 37, 213, 35, 1, 234, 106, 37, + 213, 35, 1, 239, 14, 37, 213, 35, 1, 69, 37, 213, 35, 1, 195, 56, 37, + 213, 35, 1, 237, 147, 37, 213, 35, 1, 195, 96, 37, 213, 35, 1, 237, 145, + 37, 213, 35, 1, 68, 37, 213, 35, 1, 223, 250, 37, 213, 35, 1, 222, 167, + 37, 213, 35, 1, 219, 161, 37, 213, 35, 1, 217, 98, 37, 213, 35, 1, 198, + 232, 37, 213, 35, 1, 213, 77, 37, 213, 35, 1, 210, 140, 37, 213, 35, 1, + 206, 84, 37, 213, 35, 1, 203, 137, 37, 213, 35, 1, 66, 37, 213, 35, 1, + 245, 83, 37, 213, 35, 1, 206, 189, 37, 213, 35, 1, 207, 1, 37, 213, 35, + 1, 195, 219, 37, 213, 35, 1, 196, 47, 37, 213, 35, 1, 72, 37, 213, 35, 1, + 214, 101, 37, 213, 35, 1, 237, 46, 37, 213, 35, 1, 142, 37, 213, 35, 1, + 201, 91, 37, 213, 35, 1, 199, 105, 37, 213, 35, 1, 196, 51, 37, 213, 35, + 1, 196, 49, 37, 213, 35, 1, 196, 84, 37, 213, 35, 1, 226, 146, 37, 213, + 35, 1, 195, 217, 37, 213, 35, 1, 164, 37, 213, 35, 1, 230, 209, 38, 37, + 213, 35, 1, 251, 105, 38, 37, 213, 35, 1, 239, 14, 38, 37, 213, 35, 1, + 195, 96, 38, 37, 213, 35, 1, 217, 98, 38, 37, 213, 35, 1, 206, 84, 200, + 93, 1, 251, 137, 200, 93, 1, 248, 205, 200, 93, 1, 234, 94, 200, 93, 1, + 224, 145, 200, 93, 1, 239, 211, 200, 93, 1, 231, 192, 200, 93, 1, 197, + 34, 200, 93, 1, 195, 78, 200, 93, 1, 231, 93, 200, 93, 1, 203, 1, 200, + 93, 1, 195, 241, 200, 93, 1, 225, 34, 200, 93, 1, 206, 211, 200, 93, 1, + 222, 244, 200, 93, 1, 219, 170, 200, 93, 1, 239, 171, 200, 93, 1, 215, + 137, 200, 93, 1, 194, 255, 200, 93, 1, 208, 224, 200, 93, 1, 251, 193, + 200, 93, 1, 211, 226, 200, 93, 1, 209, 7, 200, 93, 1, 211, 101, 200, 93, + 1, 210, 200, 200, 93, 1, 202, 221, 200, 93, 1, 233, 224, 200, 93, 1, 149, + 200, 93, 1, 68, 200, 93, 1, 66, 200, 93, 1, 205, 34, 200, 93, 197, 9, + 239, 58, 37, 213, 29, 2, 63, 37, 213, 29, 2, 68, 37, 213, 29, 2, 66, 37, + 213, 29, 2, 155, 37, 213, 29, 2, 223, 186, 37, 213, 29, 2, 234, 122, 37, + 213, 29, 2, 233, 75, 37, 213, 29, 2, 196, 208, 37, 213, 29, 2, 247, 173, + 37, 213, 29, 2, 225, 213, 37, 213, 29, 2, 225, 171, 37, 213, 29, 2, 189, + 37, 213, 29, 2, 201, 40, 37, 213, 29, 2, 240, 135, 37, 213, 29, 2, 239, + 151, 37, 213, 29, 2, 237, 200, 37, 213, 29, 2, 202, 233, 37, 213, 29, 2, + 161, 37, 213, 29, 2, 249, 144, 37, 213, 29, 2, 235, 238, 37, 213, 29, 2, + 176, 37, 213, 29, 2, 215, 185, 37, 213, 29, 2, 166, 37, 213, 29, 2, 219, + 77, 37, 213, 29, 2, 218, 144, 37, 213, 29, 2, 164, 37, 213, 29, 2, 199, + 152, 37, 213, 29, 2, 199, 34, 37, 213, 29, 2, 169, 37, 213, 29, 2, 209, + 140, 37, 213, 29, 2, 172, 37, 213, 29, 2, 183, 37, 213, 29, 2, 195, 115, + 37, 213, 29, 2, 207, 50, 37, 213, 29, 2, 205, 80, 37, 213, 29, 2, 142, + 37, 213, 29, 2, 250, 143, 37, 213, 29, 2, 250, 142, 37, 213, 29, 2, 250, + 141, 37, 213, 29, 2, 196, 178, 37, 213, 29, 2, 240, 112, 37, 213, 29, 2, + 240, 111, 37, 213, 29, 2, 249, 119, 37, 213, 29, 2, 247, 225, 37, 213, + 29, 197, 9, 239, 58, 37, 213, 29, 31, 100, 37, 213, 29, 31, 102, 37, 213, + 29, 31, 203, 23, 37, 213, 29, 31, 200, 234, 37, 213, 29, 31, 231, 56, + 239, 191, 6, 1, 181, 68, 239, 191, 6, 1, 181, 69, 239, 191, 6, 1, 181, + 63, 239, 191, 6, 1, 181, 251, 208, 239, 191, 6, 1, 181, 72, 239, 191, 6, + 1, 181, 214, 101, 239, 191, 6, 1, 206, 182, 68, 239, 191, 6, 1, 206, 182, + 69, 239, 191, 6, 1, 206, 182, 63, 239, 191, 6, 1, 206, 182, 251, 208, + 239, 191, 6, 1, 206, 182, 72, 239, 191, 6, 1, 206, 182, 214, 101, 239, + 191, 6, 1, 250, 121, 239, 191, 6, 1, 214, 15, 239, 191, 6, 1, 196, 243, + 239, 191, 6, 1, 196, 66, 239, 191, 6, 1, 233, 14, 239, 191, 6, 1, 213, + 78, 239, 191, 6, 1, 248, 250, 239, 191, 6, 1, 203, 48, 239, 191, 6, 1, + 239, 236, 239, 191, 6, 1, 245, 98, 239, 191, 6, 1, 225, 190, 239, 191, 6, + 1, 224, 215, 239, 191, 6, 1, 234, 68, 239, 191, 6, 1, 237, 46, 239, 191, + 6, 1, 199, 113, 239, 191, 6, 1, 236, 120, 239, 191, 6, 1, 202, 215, 239, + 191, 6, 1, 236, 150, 239, 191, 6, 1, 195, 85, 239, 191, 6, 1, 236, 140, + 239, 191, 6, 1, 195, 64, 239, 191, 6, 1, 236, 162, 239, 191, 6, 1, 237, + 6, 239, 191, 6, 1, 236, 240, 239, 191, 6, 1, 236, 229, 239, 191, 6, 1, + 236, 214, 239, 191, 6, 1, 214, 145, 239, 191, 6, 1, 236, 97, 239, 191, 4, + 1, 181, 68, 239, 191, 4, 1, 181, 69, 239, 191, 4, 1, 181, 63, 239, 191, + 4, 1, 181, 251, 208, 239, 191, 4, 1, 181, 72, 239, 191, 4, 1, 181, 214, + 101, 239, 191, 4, 1, 206, 182, 68, 239, 191, 4, 1, 206, 182, 69, 239, + 191, 4, 1, 206, 182, 63, 239, 191, 4, 1, 206, 182, 251, 208, 239, 191, 4, + 1, 206, 182, 72, 239, 191, 4, 1, 206, 182, 214, 101, 239, 191, 4, 1, 250, + 121, 239, 191, 4, 1, 214, 15, 239, 191, 4, 1, 196, 243, 239, 191, 4, 1, + 196, 66, 239, 191, 4, 1, 233, 14, 239, 191, 4, 1, 213, 78, 239, 191, 4, + 1, 248, 250, 239, 191, 4, 1, 203, 48, 239, 191, 4, 1, 239, 236, 239, 191, + 4, 1, 245, 98, 239, 191, 4, 1, 225, 190, 239, 191, 4, 1, 224, 215, 239, + 191, 4, 1, 234, 68, 239, 191, 4, 1, 237, 46, 239, 191, 4, 1, 199, 113, + 239, 191, 4, 1, 236, 120, 239, 191, 4, 1, 202, 215, 239, 191, 4, 1, 236, + 150, 239, 191, 4, 1, 195, 85, 239, 191, 4, 1, 236, 140, 239, 191, 4, 1, + 195, 64, 239, 191, 4, 1, 236, 162, 239, 191, 4, 1, 237, 6, 239, 191, 4, + 1, 236, 240, 239, 191, 4, 1, 236, 229, 239, 191, 4, 1, 236, 214, 239, + 191, 4, 1, 214, 145, 239, 191, 4, 1, 236, 97, 207, 6, 1, 213, 75, 207, 6, + 1, 201, 229, 207, 6, 1, 224, 88, 207, 6, 1, 235, 181, 207, 6, 1, 202, + 190, 207, 6, 1, 205, 200, 207, 6, 1, 204, 85, 207, 6, 1, 245, 21, 207, 6, + 1, 196, 68, 207, 6, 1, 231, 53, 207, 6, 1, 248, 182, 207, 6, 1, 239, 250, + 207, 6, 1, 234, 108, 207, 6, 1, 198, 227, 207, 6, 1, 202, 196, 207, 6, 1, + 195, 8, 207, 6, 1, 219, 201, 207, 6, 1, 225, 107, 207, 6, 1, 197, 25, + 207, 6, 1, 232, 247, 207, 6, 1, 221, 244, 207, 6, 1, 219, 23, 207, 6, 1, + 226, 126, 207, 6, 1, 237, 44, 207, 6, 1, 250, 194, 207, 6, 1, 251, 249, + 207, 6, 1, 214, 118, 207, 6, 1, 197, 12, 207, 6, 1, 214, 33, 207, 6, 1, + 251, 208, 207, 6, 1, 209, 223, 207, 6, 1, 215, 137, 207, 6, 1, 237, 64, + 207, 6, 1, 251, 213, 207, 6, 1, 230, 200, 207, 6, 1, 200, 36, 207, 6, 1, + 214, 187, 207, 6, 1, 214, 93, 207, 6, 1, 214, 143, 207, 6, 1, 250, 124, + 207, 6, 1, 250, 245, 207, 6, 1, 214, 71, 207, 6, 1, 251, 188, 207, 6, 1, + 236, 154, 207, 6, 1, 250, 221, 207, 6, 1, 237, 75, 207, 6, 1, 230, 208, + 207, 6, 1, 196, 30, 214, 49, 1, 251, 163, 214, 49, 1, 249, 144, 214, 49, + 1, 189, 214, 49, 1, 225, 213, 214, 49, 1, 196, 208, 214, 49, 1, 224, 145, + 214, 49, 1, 239, 235, 214, 49, 1, 169, 214, 49, 1, 183, 214, 49, 1, 206, + 217, 214, 49, 1, 239, 175, 214, 49, 1, 247, 81, 214, 49, 1, 234, 122, + 214, 49, 1, 235, 238, 214, 49, 1, 211, 156, 214, 49, 1, 225, 50, 214, 49, + 1, 223, 77, 214, 49, 1, 219, 37, 214, 49, 1, 215, 121, 214, 49, 1, 197, + 117, 214, 49, 1, 142, 214, 49, 1, 164, 214, 49, 1, 63, 214, 49, 1, 69, + 214, 49, 1, 68, 214, 49, 1, 72, 214, 49, 1, 66, 214, 49, 1, 252, 167, + 214, 49, 1, 237, 53, 214, 49, 1, 214, 101, 214, 49, 17, 195, 79, 214, 49, + 17, 100, 214, 49, 17, 102, 214, 49, 17, 134, 214, 49, 17, 136, 214, 49, + 17, 146, 214, 49, 17, 167, 214, 49, 17, 178, 214, 49, 17, 171, 214, 49, + 17, 182, 214, 51, 6, 1, 63, 214, 51, 6, 1, 251, 199, 214, 51, 6, 1, 251, + 193, 214, 51, 6, 1, 251, 208, 214, 51, 6, 1, 248, 63, 214, 51, 6, 1, 247, + 15, 214, 51, 6, 1, 237, 38, 214, 51, 6, 1, 69, 214, 51, 6, 1, 237, 18, + 214, 51, 6, 1, 142, 214, 51, 6, 1, 231, 10, 214, 51, 6, 1, 68, 214, 51, + 6, 1, 155, 214, 51, 6, 1, 237, 37, 214, 51, 6, 1, 223, 109, 214, 51, 6, + 1, 172, 214, 51, 6, 1, 166, 214, 51, 6, 1, 176, 214, 51, 6, 1, 72, 214, + 51, 6, 1, 214, 142, 214, 51, 6, 1, 161, 214, 51, 6, 1, 237, 36, 214, 51, + 6, 1, 183, 214, 51, 6, 1, 207, 50, 214, 51, 6, 1, 189, 214, 51, 6, 1, + 237, 35, 214, 51, 6, 1, 201, 113, 214, 51, 6, 1, 237, 34, 214, 51, 6, 1, + 201, 103, 214, 51, 6, 1, 239, 175, 214, 51, 6, 1, 66, 214, 51, 6, 1, 197, + 166, 214, 51, 6, 1, 224, 145, 214, 51, 6, 1, 233, 229, 214, 51, 6, 1, + 195, 115, 214, 51, 6, 1, 195, 74, 214, 51, 4, 1, 63, 214, 51, 4, 1, 251, + 199, 214, 51, 4, 1, 251, 193, 214, 51, 4, 1, 251, 208, 214, 51, 4, 1, + 248, 63, 214, 51, 4, 1, 247, 15, 214, 51, 4, 1, 237, 38, 214, 51, 4, 1, + 69, 214, 51, 4, 1, 237, 18, 214, 51, 4, 1, 142, 214, 51, 4, 1, 231, 10, + 214, 51, 4, 1, 68, 214, 51, 4, 1, 155, 214, 51, 4, 1, 237, 37, 214, 51, + 4, 1, 223, 109, 214, 51, 4, 1, 172, 214, 51, 4, 1, 166, 214, 51, 4, 1, + 176, 214, 51, 4, 1, 72, 214, 51, 4, 1, 214, 142, 214, 51, 4, 1, 161, 214, + 51, 4, 1, 237, 36, 214, 51, 4, 1, 183, 214, 51, 4, 1, 207, 50, 214, 51, + 4, 1, 189, 214, 51, 4, 1, 237, 35, 214, 51, 4, 1, 201, 113, 214, 51, 4, + 1, 237, 34, 214, 51, 4, 1, 201, 103, 214, 51, 4, 1, 239, 175, 214, 51, 4, + 1, 66, 214, 51, 4, 1, 197, 166, 214, 51, 4, 1, 224, 145, 214, 51, 4, 1, + 233, 229, 214, 51, 4, 1, 195, 115, 214, 51, 4, 1, 195, 74, 237, 2, 1, 63, + 237, 2, 1, 249, 8, 237, 2, 1, 247, 56, 237, 2, 1, 245, 102, 237, 2, 1, + 239, 251, 237, 2, 1, 217, 150, 237, 2, 1, 239, 166, 237, 2, 1, 237, 32, + 237, 2, 1, 69, 237, 2, 1, 235, 188, 237, 2, 1, 234, 47, 237, 2, 1, 233, + 160, 237, 2, 1, 232, 146, 237, 2, 1, 68, 237, 2, 1, 225, 192, 237, 2, 1, + 224, 208, 237, 2, 1, 222, 196, 237, 2, 1, 222, 31, 237, 2, 1, 219, 206, + 237, 2, 1, 217, 117, 237, 2, 1, 176, 237, 2, 1, 216, 156, 237, 2, 1, 72, + 237, 2, 1, 213, 91, 237, 2, 1, 211, 138, 237, 2, 1, 210, 182, 237, 2, 1, + 209, 176, 237, 2, 1, 208, 147, 237, 2, 1, 206, 255, 237, 2, 1, 203, 68, + 237, 2, 1, 202, 217, 237, 2, 1, 66, 237, 2, 1, 199, 118, 237, 2, 1, 196, + 202, 237, 2, 1, 196, 148, 237, 2, 1, 195, 88, 237, 2, 1, 195, 65, 237, 2, + 1, 233, 215, 237, 2, 1, 233, 221, 237, 2, 1, 224, 130, 247, 88, 251, 164, + 1, 251, 132, 247, 88, 251, 164, 1, 248, 207, 247, 88, 251, 164, 1, 233, + 178, 247, 88, 251, 164, 1, 240, 60, 247, 88, 251, 164, 1, 237, 63, 247, + 88, 251, 164, 1, 195, 99, 247, 88, 251, 164, 1, 236, 57, 247, 88, 251, + 164, 1, 195, 59, 247, 88, 251, 164, 1, 203, 96, 247, 88, 251, 164, 1, + 247, 15, 247, 88, 251, 164, 1, 195, 228, 247, 88, 251, 164, 1, 195, 74, + 247, 88, 251, 164, 1, 225, 255, 247, 88, 251, 164, 1, 207, 50, 247, 88, + 251, 164, 1, 222, 237, 247, 88, 251, 164, 1, 226, 12, 247, 88, 251, 164, + 1, 196, 198, 247, 88, 251, 164, 1, 237, 163, 247, 88, 251, 164, 1, 247, + 115, 247, 88, 251, 164, 1, 225, 172, 247, 88, 251, 164, 1, 224, 250, 247, + 88, 251, 164, 1, 221, 144, 247, 88, 251, 164, 1, 232, 81, 247, 88, 251, + 164, 1, 211, 139, 247, 88, 251, 164, 1, 251, 47, 247, 88, 251, 164, 1, + 245, 38, 247, 88, 251, 164, 1, 245, 74, 247, 88, 251, 164, 1, 240, 242, + 247, 88, 251, 164, 1, 220, 39, 247, 88, 251, 164, 1, 211, 143, 247, 88, + 251, 164, 1, 216, 2, 247, 88, 251, 164, 1, 237, 140, 247, 88, 251, 164, + 1, 207, 33, 247, 88, 251, 164, 1, 225, 193, 247, 88, 251, 164, 1, 214, + 118, 247, 88, 251, 164, 1, 200, 205, 247, 88, 251, 164, 1, 235, 211, 247, + 88, 251, 164, 1, 237, 153, 247, 88, 251, 164, 1, 245, 108, 247, 88, 251, + 164, 1, 213, 64, 247, 88, 251, 164, 1, 233, 205, 247, 88, 251, 164, 1, + 210, 197, 247, 88, 251, 164, 1, 207, 59, 247, 88, 251, 164, 1, 199, 37, + 247, 88, 251, 164, 1, 202, 50, 247, 88, 251, 164, 1, 206, 160, 247, 88, + 251, 164, 1, 225, 226, 247, 88, 251, 164, 1, 240, 243, 247, 88, 251, 164, + 1, 247, 81, 247, 88, 251, 164, 1, 196, 73, 247, 88, 251, 164, 1, 212, + 153, 247, 88, 251, 164, 1, 224, 51, 247, 88, 251, 164, 244, 236, 78, 30, + 39, 2, 252, 115, 30, 39, 2, 252, 114, 30, 39, 2, 252, 113, 30, 39, 2, + 252, 112, 30, 39, 2, 252, 111, 30, 39, 2, 252, 110, 30, 39, 2, 252, 109, + 30, 39, 2, 252, 108, 30, 39, 2, 252, 107, 30, 39, 2, 252, 106, 30, 39, 2, + 252, 105, 30, 39, 2, 252, 104, 30, 39, 2, 252, 103, 30, 39, 2, 252, 102, + 30, 39, 2, 252, 101, 30, 39, 2, 252, 100, 30, 39, 2, 252, 99, 30, 39, 2, + 252, 98, 30, 39, 2, 252, 97, 30, 39, 2, 252, 96, 30, 39, 2, 252, 95, 30, + 39, 2, 252, 94, 30, 39, 2, 252, 93, 30, 39, 2, 252, 92, 30, 39, 2, 252, + 91, 30, 39, 2, 252, 90, 30, 39, 2, 252, 89, 30, 39, 2, 255, 125, 30, 39, 2, 252, 88, 30, 39, 2, 252, 87, 30, 39, 2, 252, 86, 30, 39, 2, 252, 85, 30, 39, 2, 252, 84, 30, 39, 2, 252, 83, 30, 39, 2, 252, 82, 30, 39, 2, 252, 81, 30, 39, 2, 252, 80, 30, 39, 2, 252, 79, 30, 39, 2, 252, 78, 30, @@ -13927,5094 +13957,5743 @@ static unsigned char phrasebook[] = { 56, 30, 39, 2, 252, 55, 30, 39, 2, 252, 54, 30, 39, 2, 252, 53, 30, 39, 2, 252, 52, 30, 39, 2, 252, 51, 30, 39, 2, 252, 50, 30, 39, 2, 252, 49, 30, 39, 2, 252, 48, 30, 39, 2, 252, 47, 30, 39, 2, 252, 46, 30, 39, 2, - 252, 45, 30, 39, 2, 252, 44, 30, 39, 2, 252, 43, 30, 39, 2, 252, 42, 30, - 39, 2, 252, 41, 30, 39, 2, 252, 40, 63, 30, 39, 2, 252, 39, 249, 219, 30, - 39, 2, 252, 38, 240, 98, 30, 39, 2, 252, 37, 70, 30, 39, 2, 252, 36, 235, - 184, 30, 39, 2, 252, 35, 232, 154, 30, 39, 2, 252, 34, 225, 108, 30, 39, - 2, 252, 33, 224, 227, 30, 39, 2, 252, 32, 158, 30, 39, 2, 252, 31, 222, - 244, 30, 39, 2, 252, 30, 222, 243, 30, 39, 2, 252, 29, 222, 242, 30, 39, - 2, 252, 28, 222, 241, 30, 39, 2, 252, 27, 197, 189, 30, 39, 2, 252, 26, - 196, 216, 30, 39, 2, 252, 25, 196, 143, 30, 39, 2, 252, 24, 214, 53, 30, - 39, 2, 252, 23, 251, 131, 30, 39, 2, 252, 22, 248, 156, 30, 39, 2, 252, - 21, 239, 166, 30, 39, 2, 252, 20, 235, 192, 30, 39, 2, 252, 19, 225, 84, - 30, 39, 2, 252, 18, 30, 39, 2, 252, 17, 30, 39, 2, 252, 16, 30, 39, 2, - 252, 15, 30, 39, 2, 252, 14, 30, 39, 2, 252, 13, 30, 39, 2, 252, 12, 30, - 39, 2, 252, 11, 240, 105, 5, 63, 240, 105, 5, 70, 240, 105, 5, 68, 240, - 105, 5, 74, 240, 105, 5, 66, 240, 105, 5, 225, 105, 240, 105, 5, 225, 20, - 240, 105, 5, 157, 240, 105, 5, 224, 101, 240, 105, 5, 223, 249, 240, 105, - 5, 223, 165, 240, 105, 5, 223, 86, 240, 105, 5, 175, 240, 105, 5, 222, - 99, 240, 105, 5, 222, 11, 240, 105, 5, 221, 166, 240, 105, 5, 221, 95, - 240, 105, 5, 168, 240, 105, 5, 219, 114, 240, 105, 5, 218, 243, 240, 105, - 5, 218, 160, 240, 105, 5, 218, 56, 240, 105, 5, 179, 240, 105, 5, 217, - 34, 240, 105, 5, 216, 141, 240, 105, 5, 215, 225, 240, 105, 5, 215, 111, - 240, 105, 5, 163, 240, 105, 5, 213, 35, 240, 105, 5, 212, 163, 240, 105, - 5, 212, 62, 240, 105, 5, 211, 175, 240, 105, 5, 173, 240, 105, 5, 210, - 133, 240, 105, 5, 210, 23, 240, 105, 5, 209, 185, 240, 105, 5, 209, 95, - 240, 105, 5, 187, 240, 105, 5, 208, 103, 240, 105, 5, 206, 69, 240, 105, - 5, 205, 162, 240, 105, 5, 204, 139, 240, 105, 5, 203, 137, 240, 105, 5, - 203, 36, 240, 105, 5, 202, 94, 240, 105, 5, 147, 240, 105, 5, 201, 20, - 240, 105, 5, 197, 156, 240, 105, 5, 197, 101, 240, 105, 5, 197, 64, 240, - 105, 5, 197, 28, 240, 105, 5, 196, 202, 240, 105, 5, 196, 196, 240, 105, - 5, 195, 114, 240, 105, 5, 195, 11, 225, 232, 250, 103, 1, 251, 8, 225, - 232, 250, 103, 1, 248, 60, 225, 232, 250, 103, 1, 233, 59, 225, 232, 250, - 103, 1, 239, 223, 225, 232, 250, 103, 1, 232, 32, 225, 232, 250, 103, 1, - 197, 109, 225, 232, 250, 103, 1, 195, 91, 225, 232, 250, 103, 1, 231, - 230, 225, 232, 250, 103, 1, 202, 222, 225, 232, 250, 103, 1, 195, 238, - 225, 232, 250, 103, 1, 224, 153, 225, 232, 250, 103, 1, 222, 141, 225, - 232, 250, 103, 1, 219, 80, 225, 232, 250, 103, 1, 215, 63, 225, 232, 250, - 103, 1, 208, 180, 225, 232, 250, 103, 1, 249, 224, 225, 232, 250, 103, 1, - 213, 35, 225, 232, 250, 103, 1, 208, 216, 225, 232, 250, 103, 1, 211, 50, - 225, 232, 250, 103, 1, 210, 60, 225, 232, 250, 103, 1, 206, 167, 225, - 232, 250, 103, 1, 203, 50, 225, 232, 250, 103, 208, 89, 56, 225, 232, - 250, 103, 35, 98, 225, 232, 250, 103, 35, 103, 225, 232, 250, 103, 35, - 135, 225, 232, 250, 103, 35, 202, 248, 225, 232, 250, 103, 35, 200, 214, - 225, 232, 250, 103, 35, 106, 230, 201, 225, 232, 250, 103, 35, 106, 202, - 130, 225, 232, 250, 103, 35, 202, 249, 202, 130, 213, 142, 1, 251, 8, - 213, 142, 1, 248, 60, 213, 142, 1, 233, 59, 213, 142, 1, 239, 223, 213, - 142, 1, 232, 32, 213, 142, 1, 197, 109, 213, 142, 1, 195, 91, 213, 142, - 1, 231, 230, 213, 142, 1, 202, 222, 213, 142, 1, 195, 238, 213, 142, 1, - 224, 153, 213, 142, 1, 222, 141, 213, 142, 1, 219, 80, 213, 142, 1, 48, - 215, 63, 213, 142, 1, 215, 63, 213, 142, 1, 208, 180, 213, 142, 1, 249, - 224, 213, 142, 1, 213, 35, 213, 142, 1, 208, 216, 213, 142, 1, 211, 50, - 213, 142, 1, 210, 60, 213, 142, 1, 206, 167, 213, 142, 1, 203, 50, 213, - 142, 222, 81, 234, 214, 213, 142, 209, 225, 234, 214, 213, 142, 35, 98, - 213, 142, 35, 103, 213, 142, 35, 135, 213, 142, 35, 136, 213, 142, 35, - 150, 213, 142, 35, 202, 248, 213, 142, 35, 200, 214, 217, 154, 1, 48, - 251, 8, 217, 154, 1, 251, 8, 217, 154, 1, 48, 248, 60, 217, 154, 1, 248, - 60, 217, 154, 1, 233, 59, 217, 154, 1, 239, 223, 217, 154, 1, 48, 232, - 32, 217, 154, 1, 232, 32, 217, 154, 1, 197, 109, 217, 154, 1, 195, 91, - 217, 154, 1, 231, 230, 217, 154, 1, 202, 222, 217, 154, 1, 48, 195, 238, - 217, 154, 1, 195, 238, 217, 154, 1, 48, 224, 153, 217, 154, 1, 224, 153, - 217, 154, 1, 48, 222, 141, 217, 154, 1, 222, 141, 217, 154, 1, 48, 219, - 80, 217, 154, 1, 219, 80, 217, 154, 1, 48, 215, 63, 217, 154, 1, 215, 63, - 217, 154, 1, 208, 180, 217, 154, 1, 249, 224, 217, 154, 1, 213, 35, 217, - 154, 1, 208, 216, 217, 154, 1, 211, 50, 217, 154, 1, 210, 60, 217, 154, - 1, 48, 206, 167, 217, 154, 1, 206, 167, 217, 154, 1, 203, 50, 217, 154, - 35, 98, 217, 154, 35, 103, 217, 154, 35, 135, 217, 154, 35, 136, 217, - 154, 240, 168, 35, 136, 217, 154, 35, 150, 217, 154, 35, 202, 248, 217, - 154, 35, 200, 214, 217, 154, 35, 106, 230, 201, 232, 45, 1, 251, 8, 232, - 45, 1, 248, 60, 232, 45, 1, 233, 59, 232, 45, 1, 239, 222, 232, 45, 1, - 232, 32, 232, 45, 1, 197, 109, 232, 45, 1, 195, 90, 232, 45, 1, 231, 230, - 232, 45, 1, 202, 222, 232, 45, 1, 195, 238, 232, 45, 1, 224, 153, 232, - 45, 1, 222, 141, 232, 45, 1, 219, 80, 232, 45, 1, 215, 63, 232, 45, 1, - 208, 180, 232, 45, 1, 249, 222, 232, 45, 1, 213, 35, 232, 45, 1, 208, - 216, 232, 45, 1, 211, 50, 232, 45, 1, 206, 167, 232, 45, 1, 203, 50, 232, - 45, 35, 98, 232, 45, 35, 150, 232, 45, 35, 202, 248, 232, 45, 35, 200, - 214, 232, 45, 35, 106, 230, 201, 212, 175, 1, 251, 5, 212, 175, 1, 248, - 63, 212, 175, 1, 233, 233, 212, 175, 1, 239, 82, 212, 175, 1, 232, 32, - 212, 175, 1, 197, 116, 212, 175, 1, 195, 107, 212, 175, 1, 231, 232, 212, - 175, 1, 202, 226, 212, 175, 1, 195, 239, 212, 175, 1, 224, 183, 212, 175, - 1, 222, 147, 212, 175, 1, 219, 80, 212, 175, 1, 215, 63, 212, 175, 1, - 207, 55, 212, 175, 1, 251, 40, 212, 175, 1, 213, 35, 212, 175, 1, 208, - 218, 212, 175, 1, 211, 55, 212, 175, 1, 209, 150, 212, 175, 1, 206, 167, - 212, 175, 1, 203, 57, 212, 175, 35, 98, 212, 175, 35, 202, 248, 212, 175, - 35, 200, 214, 212, 175, 35, 106, 230, 201, 212, 175, 35, 103, 212, 175, - 35, 135, 212, 175, 197, 3, 207, 46, 221, 52, 1, 63, 221, 52, 1, 249, 219, - 221, 52, 1, 234, 71, 221, 52, 1, 240, 98, 221, 52, 1, 70, 221, 52, 1, - 199, 215, 221, 52, 1, 68, 221, 52, 1, 196, 143, 221, 52, 1, 224, 227, - 221, 52, 1, 158, 221, 52, 1, 221, 40, 221, 52, 1, 217, 225, 221, 52, 1, - 74, 221, 52, 1, 143, 221, 52, 1, 205, 46, 221, 52, 1, 203, 185, 221, 52, - 1, 66, 221, 52, 1, 235, 184, 221, 52, 1, 211, 116, 221, 52, 1, 209, 35, - 221, 52, 1, 201, 61, 221, 52, 1, 250, 208, 221, 52, 1, 236, 106, 221, 52, - 1, 221, 55, 221, 52, 1, 216, 6, 221, 52, 1, 247, 69, 221, 52, 201, 157, - 78, 139, 231, 200, 1, 63, 139, 231, 200, 1, 70, 139, 231, 200, 1, 68, - 139, 231, 200, 1, 74, 139, 231, 200, 1, 165, 139, 231, 200, 1, 197, 156, - 139, 231, 200, 1, 248, 252, 139, 231, 200, 1, 248, 251, 139, 231, 200, 1, - 163, 139, 231, 200, 1, 168, 139, 231, 200, 1, 179, 139, 231, 200, 1, 217, - 169, 139, 231, 200, 1, 217, 34, 139, 231, 200, 1, 217, 32, 139, 231, 200, - 1, 173, 139, 231, 200, 1, 210, 199, 139, 231, 200, 1, 175, 139, 231, 200, - 1, 224, 38, 139, 231, 200, 1, 231, 223, 139, 231, 200, 1, 187, 139, 231, - 200, 1, 208, 232, 139, 231, 200, 1, 208, 103, 139, 231, 200, 1, 157, 139, - 231, 200, 1, 211, 108, 139, 231, 200, 1, 203, 137, 139, 231, 200, 1, 203, - 135, 139, 231, 200, 1, 203, 36, 139, 231, 200, 1, 203, 34, 139, 231, 200, - 1, 147, 139, 231, 200, 1, 240, 3, 139, 231, 200, 16, 199, 17, 139, 231, - 200, 16, 199, 16, 139, 240, 136, 1, 63, 139, 240, 136, 1, 70, 139, 240, - 136, 1, 68, 139, 240, 136, 1, 74, 139, 240, 136, 1, 165, 139, 240, 136, - 1, 197, 156, 139, 240, 136, 1, 248, 252, 139, 240, 136, 1, 163, 139, 240, - 136, 1, 168, 139, 240, 136, 1, 179, 139, 240, 136, 1, 217, 34, 139, 240, - 136, 1, 173, 139, 240, 136, 1, 175, 139, 240, 136, 1, 224, 38, 139, 240, - 136, 1, 231, 223, 139, 240, 136, 1, 187, 139, 240, 136, 1, 250, 99, 187, - 139, 240, 136, 1, 208, 103, 139, 240, 136, 1, 157, 139, 240, 136, 1, 211, - 108, 139, 240, 136, 1, 203, 137, 139, 240, 136, 1, 203, 36, 139, 240, - 136, 1, 147, 139, 240, 136, 1, 240, 3, 139, 240, 136, 234, 135, 236, 128, - 200, 221, 139, 240, 136, 234, 135, 106, 232, 108, 139, 240, 136, 221, - 152, 209, 191, 139, 240, 136, 221, 152, 225, 237, 139, 240, 136, 35, 98, - 139, 240, 136, 35, 103, 139, 240, 136, 35, 135, 139, 240, 136, 35, 136, - 139, 240, 136, 35, 150, 139, 240, 136, 35, 174, 139, 240, 136, 35, 182, - 139, 240, 136, 35, 178, 139, 240, 136, 35, 184, 139, 240, 136, 35, 202, - 248, 139, 240, 136, 35, 200, 214, 139, 240, 136, 35, 202, 147, 139, 240, - 136, 35, 234, 151, 139, 240, 136, 35, 235, 25, 139, 240, 136, 35, 205, - 228, 139, 240, 136, 35, 207, 21, 139, 240, 136, 35, 106, 230, 201, 139, - 240, 136, 35, 114, 230, 201, 139, 240, 136, 35, 122, 230, 201, 139, 240, - 136, 35, 234, 145, 230, 201, 139, 240, 136, 35, 234, 237, 230, 201, 139, - 240, 136, 35, 205, 242, 230, 201, 139, 240, 136, 35, 207, 27, 230, 201, - 139, 240, 136, 35, 236, 161, 230, 201, 139, 240, 136, 35, 216, 97, 230, - 201, 139, 240, 136, 35, 106, 202, 130, 139, 240, 136, 35, 114, 202, 130, - 139, 240, 136, 35, 122, 202, 130, 139, 240, 136, 35, 234, 145, 202, 130, - 139, 240, 136, 35, 234, 237, 202, 130, 139, 240, 136, 35, 205, 242, 202, - 130, 139, 240, 136, 35, 207, 27, 202, 130, 139, 240, 136, 35, 236, 161, - 202, 130, 139, 240, 136, 35, 216, 97, 202, 130, 139, 240, 136, 35, 202, - 249, 202, 130, 139, 240, 136, 35, 200, 215, 202, 130, 139, 240, 136, 35, - 202, 148, 202, 130, 139, 240, 136, 35, 234, 152, 202, 130, 139, 240, 136, - 35, 235, 26, 202, 130, 139, 240, 136, 35, 205, 229, 202, 130, 139, 240, - 136, 35, 207, 22, 202, 130, 139, 240, 136, 35, 236, 152, 202, 130, 139, - 240, 136, 35, 216, 93, 202, 130, 139, 240, 136, 35, 106, 230, 202, 202, - 130, 139, 240, 136, 35, 114, 230, 202, 202, 130, 139, 240, 136, 35, 122, - 230, 202, 202, 130, 139, 240, 136, 35, 234, 145, 230, 202, 202, 130, 139, - 240, 136, 35, 234, 237, 230, 202, 202, 130, 139, 240, 136, 35, 205, 242, - 230, 202, 202, 130, 139, 240, 136, 35, 207, 27, 230, 202, 202, 130, 139, - 240, 136, 35, 236, 161, 230, 202, 202, 130, 139, 240, 136, 35, 216, 97, - 230, 202, 202, 130, 139, 240, 136, 234, 135, 106, 200, 222, 139, 240, - 136, 234, 135, 114, 200, 221, 139, 240, 136, 234, 135, 122, 200, 221, - 139, 240, 136, 234, 135, 234, 145, 200, 221, 139, 240, 136, 234, 135, - 234, 237, 200, 221, 139, 240, 136, 234, 135, 205, 242, 200, 221, 139, - 240, 136, 234, 135, 207, 27, 200, 221, 139, 240, 136, 234, 135, 236, 161, - 200, 221, 139, 240, 136, 234, 135, 216, 97, 200, 221, 139, 240, 136, 234, - 135, 202, 249, 200, 221, 224, 25, 1, 63, 224, 25, 18, 2, 68, 224, 25, 18, - 2, 66, 224, 25, 18, 2, 111, 143, 224, 25, 18, 2, 70, 224, 25, 18, 2, 74, - 224, 25, 18, 222, 60, 78, 224, 25, 2, 54, 209, 211, 58, 224, 25, 2, 250, - 155, 224, 25, 2, 198, 247, 224, 25, 1, 157, 224, 25, 1, 224, 38, 224, 25, - 1, 234, 4, 224, 25, 1, 233, 112, 224, 25, 1, 247, 36, 224, 25, 1, 246, - 136, 224, 25, 1, 225, 105, 224, 25, 1, 215, 34, 224, 25, 1, 201, 58, 224, - 25, 1, 201, 46, 224, 25, 1, 239, 164, 224, 25, 1, 239, 148, 224, 25, 1, - 216, 5, 224, 25, 1, 203, 137, 224, 25, 1, 202, 202, 224, 25, 1, 240, 3, - 224, 25, 1, 239, 44, 224, 25, 1, 179, 224, 25, 1, 163, 224, 25, 1, 212, - 205, 224, 25, 1, 248, 252, 224, 25, 1, 248, 53, 224, 25, 1, 168, 224, 25, - 1, 165, 224, 25, 1, 173, 224, 25, 1, 175, 224, 25, 1, 199, 137, 224, 25, - 1, 207, 6, 224, 25, 1, 205, 43, 224, 25, 1, 187, 224, 25, 1, 195, 114, - 224, 25, 1, 142, 224, 25, 1, 223, 186, 224, 25, 1, 201, 26, 224, 25, 1, - 201, 27, 224, 25, 1, 199, 24, 224, 25, 2, 248, 190, 57, 224, 25, 2, 246, - 207, 224, 25, 2, 76, 58, 224, 25, 198, 252, 224, 25, 17, 98, 224, 25, 17, - 103, 224, 25, 17, 135, 224, 25, 17, 136, 224, 25, 35, 202, 248, 224, 25, - 35, 200, 214, 224, 25, 35, 106, 230, 201, 224, 25, 35, 106, 202, 130, - 224, 25, 234, 135, 106, 232, 108, 224, 25, 211, 163, 238, 123, 224, 25, - 211, 163, 4, 244, 113, 224, 25, 211, 163, 244, 113, 224, 25, 211, 163, - 240, 193, 153, 224, 25, 211, 163, 219, 215, 224, 25, 211, 163, 221, 117, - 224, 25, 211, 163, 239, 211, 224, 25, 211, 163, 54, 239, 211, 224, 25, - 211, 163, 221, 227, 36, 205, 121, 250, 114, 1, 232, 32, 36, 205, 121, - 250, 114, 1, 222, 141, 36, 205, 121, 250, 114, 1, 231, 230, 36, 205, 121, - 250, 114, 1, 219, 80, 36, 205, 121, 250, 114, 1, 211, 50, 36, 205, 121, - 250, 114, 1, 197, 109, 36, 205, 121, 250, 114, 1, 206, 167, 36, 205, 121, - 250, 114, 1, 210, 60, 36, 205, 121, 250, 114, 1, 248, 60, 36, 205, 121, - 250, 114, 1, 203, 50, 36, 205, 121, 250, 114, 1, 208, 155, 36, 205, 121, - 250, 114, 1, 224, 153, 36, 205, 121, 250, 114, 1, 215, 63, 36, 205, 121, - 250, 114, 1, 224, 20, 36, 205, 121, 250, 114, 1, 208, 216, 36, 205, 121, - 250, 114, 1, 208, 180, 36, 205, 121, 250, 114, 1, 235, 69, 36, 205, 121, - 250, 114, 1, 251, 10, 36, 205, 121, 250, 114, 1, 249, 222, 36, 205, 121, - 250, 114, 1, 239, 41, 36, 205, 121, 250, 114, 1, 233, 59, 36, 205, 121, - 250, 114, 1, 239, 223, 36, 205, 121, 250, 114, 1, 233, 100, 36, 205, 121, - 250, 114, 1, 202, 222, 36, 205, 121, 250, 114, 1, 195, 90, 36, 205, 121, - 250, 114, 1, 239, 38, 36, 205, 121, 250, 114, 1, 195, 238, 36, 205, 121, - 250, 114, 1, 202, 188, 36, 205, 121, 250, 114, 1, 202, 167, 36, 205, 121, - 250, 114, 35, 98, 36, 205, 121, 250, 114, 35, 235, 25, 36, 205, 121, 250, - 114, 152, 225, 212, 36, 164, 250, 114, 1, 231, 255, 36, 164, 250, 114, 1, - 222, 150, 36, 164, 250, 114, 1, 232, 119, 36, 164, 250, 114, 1, 219, 94, - 36, 164, 250, 114, 1, 211, 101, 36, 164, 250, 114, 1, 197, 109, 36, 164, - 250, 114, 1, 236, 28, 36, 164, 250, 114, 1, 210, 92, 36, 164, 250, 114, - 1, 248, 93, 36, 164, 250, 114, 1, 203, 9, 36, 164, 250, 114, 1, 236, 29, - 36, 164, 250, 114, 1, 224, 183, 36, 164, 250, 114, 1, 215, 206, 36, 164, - 250, 114, 1, 224, 34, 36, 164, 250, 114, 1, 208, 219, 36, 164, 250, 114, - 1, 236, 27, 36, 164, 250, 114, 1, 235, 56, 36, 164, 250, 114, 1, 251, 10, - 36, 164, 250, 114, 1, 251, 40, 36, 164, 250, 114, 1, 239, 253, 36, 164, - 250, 114, 1, 233, 177, 36, 164, 250, 114, 1, 239, 230, 36, 164, 250, 114, - 1, 233, 107, 36, 164, 250, 114, 1, 203, 107, 36, 164, 250, 114, 1, 195, - 105, 36, 164, 250, 114, 1, 202, 194, 36, 164, 250, 114, 1, 196, 60, 36, - 164, 250, 114, 1, 202, 182, 36, 164, 250, 114, 1, 195, 108, 36, 164, 250, - 114, 35, 98, 36, 164, 250, 114, 35, 202, 248, 36, 164, 250, 114, 35, 200, - 214, 219, 213, 1, 251, 8, 219, 213, 1, 248, 60, 219, 213, 1, 248, 47, - 219, 213, 1, 233, 59, 219, 213, 1, 233, 85, 219, 213, 1, 239, 223, 219, - 213, 1, 232, 32, 219, 213, 1, 197, 109, 219, 213, 2, 200, 86, 219, 213, - 1, 195, 91, 219, 213, 1, 195, 67, 219, 213, 1, 225, 86, 219, 213, 1, 225, - 67, 219, 213, 1, 231, 230, 219, 213, 1, 202, 222, 219, 213, 1, 195, 238, - 219, 213, 1, 224, 153, 219, 213, 1, 196, 199, 219, 213, 1, 224, 27, 219, - 213, 1, 222, 141, 219, 213, 1, 239, 37, 219, 213, 1, 202, 193, 219, 213, - 1, 219, 80, 219, 213, 1, 215, 63, 219, 213, 1, 208, 180, 219, 213, 1, - 249, 224, 219, 213, 1, 251, 219, 219, 213, 1, 213, 35, 219, 213, 1, 235, - 69, 219, 213, 1, 208, 216, 219, 213, 1, 211, 50, 219, 213, 1, 196, 176, - 219, 213, 1, 211, 77, 219, 213, 1, 210, 60, 219, 213, 1, 206, 167, 219, - 213, 1, 205, 11, 219, 213, 1, 203, 50, 219, 213, 251, 130, 113, 57, 219, - 213, 251, 130, 113, 58, 219, 213, 35, 98, 219, 213, 35, 150, 219, 213, - 35, 202, 248, 219, 213, 35, 200, 214, 219, 213, 35, 106, 230, 201, 219, - 213, 211, 163, 204, 227, 219, 213, 211, 163, 234, 214, 219, 213, 211, - 163, 54, 76, 197, 33, 238, 123, 219, 213, 211, 163, 76, 197, 33, 238, - 123, 219, 213, 211, 163, 238, 123, 219, 213, 211, 163, 114, 238, 120, - 219, 213, 211, 163, 221, 234, 235, 14, 249, 236, 1, 63, 249, 236, 1, 252, - 10, 249, 236, 1, 250, 153, 249, 236, 1, 251, 225, 249, 236, 1, 250, 208, - 249, 236, 1, 251, 226, 249, 236, 1, 251, 90, 249, 236, 1, 251, 86, 249, - 236, 1, 70, 249, 236, 1, 236, 184, 249, 236, 1, 74, 249, 236, 1, 214, 33, - 249, 236, 1, 68, 249, 236, 1, 226, 8, 249, 236, 1, 66, 249, 236, 1, 199, - 229, 249, 236, 1, 224, 101, 249, 236, 1, 196, 196, 249, 236, 1, 196, 157, - 249, 236, 1, 196, 167, 249, 236, 1, 233, 186, 249, 236, 1, 233, 143, 249, - 236, 1, 233, 98, 249, 236, 1, 246, 176, 249, 236, 1, 225, 84, 249, 236, - 1, 203, 36, 249, 236, 1, 202, 186, 249, 236, 1, 239, 119, 249, 236, 1, - 239, 35, 249, 236, 1, 201, 53, 249, 236, 1, 213, 35, 249, 236, 1, 235, - 69, 249, 236, 1, 248, 119, 249, 236, 1, 248, 49, 249, 236, 1, 216, 231, - 249, 236, 1, 216, 147, 249, 236, 1, 216, 148, 249, 236, 1, 217, 34, 249, - 236, 1, 215, 24, 249, 236, 1, 216, 0, 249, 236, 1, 219, 114, 249, 236, 1, - 231, 131, 249, 236, 1, 195, 164, 249, 236, 1, 196, 65, 249, 236, 1, 199, - 105, 249, 236, 1, 210, 133, 249, 236, 1, 222, 99, 249, 236, 1, 208, 103, - 249, 236, 1, 195, 88, 249, 236, 1, 206, 211, 249, 236, 1, 195, 65, 249, - 236, 1, 206, 76, 249, 236, 1, 205, 12, 249, 236, 1, 232, 32, 249, 236, - 251, 130, 78, 202, 42, 114, 238, 121, 126, 106, 76, 211, 162, 4, 114, - 238, 121, 126, 106, 76, 211, 162, 222, 130, 114, 238, 121, 126, 106, 76, - 211, 162, 222, 130, 106, 76, 126, 114, 238, 121, 211, 162, 222, 130, 114, - 209, 208, 126, 106, 209, 211, 211, 162, 222, 130, 106, 209, 211, 126, - 114, 209, 208, 211, 162, 225, 190, 213, 73, 1, 251, 8, 225, 190, 213, 73, - 1, 248, 60, 225, 190, 213, 73, 1, 233, 59, 225, 190, 213, 73, 1, 239, - 223, 225, 190, 213, 73, 1, 232, 32, 225, 190, 213, 73, 1, 197, 109, 225, - 190, 213, 73, 1, 195, 91, 225, 190, 213, 73, 1, 231, 230, 225, 190, 213, - 73, 1, 202, 222, 225, 190, 213, 73, 1, 195, 238, 225, 190, 213, 73, 1, - 224, 153, 225, 190, 213, 73, 1, 222, 141, 225, 190, 213, 73, 1, 219, 80, - 225, 190, 213, 73, 1, 215, 63, 225, 190, 213, 73, 1, 208, 180, 225, 190, - 213, 73, 1, 249, 224, 225, 190, 213, 73, 1, 213, 35, 225, 190, 213, 73, - 1, 208, 216, 225, 190, 213, 73, 1, 211, 50, 225, 190, 213, 73, 1, 210, - 60, 225, 190, 213, 73, 1, 206, 167, 225, 190, 213, 73, 1, 203, 50, 225, - 190, 213, 73, 35, 98, 225, 190, 213, 73, 35, 103, 225, 190, 213, 73, 35, - 135, 225, 190, 213, 73, 35, 136, 225, 190, 213, 73, 35, 202, 248, 225, - 190, 213, 73, 35, 200, 214, 225, 190, 213, 73, 35, 106, 230, 201, 225, - 190, 213, 73, 35, 106, 202, 130, 225, 190, 213, 159, 1, 251, 8, 225, 190, - 213, 159, 1, 248, 60, 225, 190, 213, 159, 1, 233, 59, 225, 190, 213, 159, - 1, 239, 223, 225, 190, 213, 159, 1, 232, 32, 225, 190, 213, 159, 1, 197, - 108, 225, 190, 213, 159, 1, 195, 91, 225, 190, 213, 159, 1, 231, 230, - 225, 190, 213, 159, 1, 202, 222, 225, 190, 213, 159, 1, 195, 238, 225, - 190, 213, 159, 1, 224, 153, 225, 190, 213, 159, 1, 222, 141, 225, 190, - 213, 159, 1, 219, 79, 225, 190, 213, 159, 1, 215, 63, 225, 190, 213, 159, - 1, 208, 180, 225, 190, 213, 159, 1, 213, 35, 225, 190, 213, 159, 1, 208, - 216, 225, 190, 213, 159, 1, 206, 167, 225, 190, 213, 159, 1, 203, 50, - 225, 190, 213, 159, 35, 98, 225, 190, 213, 159, 35, 103, 225, 190, 213, - 159, 35, 135, 225, 190, 213, 159, 35, 136, 225, 190, 213, 159, 35, 202, - 248, 225, 190, 213, 159, 35, 200, 214, 225, 190, 213, 159, 35, 106, 230, - 201, 225, 190, 213, 159, 35, 106, 202, 130, 211, 187, 213, 159, 1, 251, - 8, 211, 187, 213, 159, 1, 248, 60, 211, 187, 213, 159, 1, 233, 59, 211, - 187, 213, 159, 1, 239, 223, 211, 187, 213, 159, 1, 232, 32, 211, 187, - 213, 159, 1, 197, 108, 211, 187, 213, 159, 1, 195, 91, 211, 187, 213, - 159, 1, 231, 230, 211, 187, 213, 159, 1, 195, 238, 211, 187, 213, 159, 1, - 224, 153, 211, 187, 213, 159, 1, 222, 141, 211, 187, 213, 159, 1, 219, - 79, 211, 187, 213, 159, 1, 215, 63, 211, 187, 213, 159, 1, 208, 180, 211, - 187, 213, 159, 1, 213, 35, 211, 187, 213, 159, 1, 208, 216, 211, 187, - 213, 159, 1, 206, 167, 211, 187, 213, 159, 1, 203, 50, 211, 187, 213, - 159, 208, 89, 78, 211, 187, 213, 159, 200, 240, 208, 89, 78, 211, 187, - 213, 159, 234, 145, 238, 121, 3, 240, 182, 211, 187, 213, 159, 234, 145, - 238, 121, 3, 238, 123, 211, 187, 213, 159, 35, 98, 211, 187, 213, 159, - 35, 103, 211, 187, 213, 159, 35, 135, 211, 187, 213, 159, 35, 136, 211, - 187, 213, 159, 35, 202, 248, 211, 187, 213, 159, 35, 200, 214, 211, 187, - 213, 159, 35, 106, 230, 201, 36, 200, 244, 1, 213, 249, 63, 36, 200, 244, - 1, 196, 53, 63, 36, 200, 244, 1, 196, 53, 251, 90, 36, 200, 244, 1, 213, - 249, 68, 36, 200, 244, 1, 196, 53, 68, 36, 200, 244, 1, 196, 53, 70, 36, - 200, 244, 1, 213, 249, 74, 36, 200, 244, 1, 213, 249, 214, 91, 36, 200, - 244, 1, 196, 53, 214, 91, 36, 200, 244, 1, 213, 249, 251, 217, 36, 200, - 244, 1, 196, 53, 251, 217, 36, 200, 244, 1, 213, 249, 251, 89, 36, 200, - 244, 1, 196, 53, 251, 89, 36, 200, 244, 1, 213, 249, 251, 62, 36, 200, - 244, 1, 196, 53, 251, 62, 36, 200, 244, 1, 213, 249, 251, 84, 36, 200, - 244, 1, 196, 53, 251, 84, 36, 200, 244, 1, 213, 249, 251, 106, 36, 200, - 244, 1, 196, 53, 251, 106, 36, 200, 244, 1, 213, 249, 251, 88, 36, 200, - 244, 1, 213, 249, 235, 191, 36, 200, 244, 1, 196, 53, 235, 191, 36, 200, - 244, 1, 213, 249, 249, 229, 36, 200, 244, 1, 196, 53, 249, 229, 36, 200, - 244, 1, 213, 249, 251, 71, 36, 200, 244, 1, 196, 53, 251, 71, 36, 200, - 244, 1, 213, 249, 251, 82, 36, 200, 244, 1, 196, 53, 251, 82, 36, 200, - 244, 1, 213, 249, 214, 89, 36, 200, 244, 1, 196, 53, 214, 89, 36, 200, - 244, 1, 213, 249, 251, 19, 36, 200, 244, 1, 196, 53, 251, 19, 36, 200, - 244, 1, 213, 249, 251, 81, 36, 200, 244, 1, 213, 249, 236, 120, 36, 200, - 244, 1, 213, 249, 236, 117, 36, 200, 244, 1, 213, 249, 250, 208, 36, 200, - 244, 1, 213, 249, 251, 79, 36, 200, 244, 1, 196, 53, 251, 79, 36, 200, - 244, 1, 213, 249, 236, 84, 36, 200, 244, 1, 196, 53, 236, 84, 36, 200, - 244, 1, 213, 249, 236, 103, 36, 200, 244, 1, 196, 53, 236, 103, 36, 200, - 244, 1, 213, 249, 236, 70, 36, 200, 244, 1, 196, 53, 236, 70, 36, 200, - 244, 1, 196, 53, 250, 199, 36, 200, 244, 1, 213, 249, 236, 92, 36, 200, - 244, 1, 196, 53, 251, 78, 36, 200, 244, 1, 213, 249, 236, 60, 36, 200, - 244, 1, 213, 249, 214, 24, 36, 200, 244, 1, 213, 249, 230, 91, 36, 200, - 244, 1, 213, 249, 236, 192, 36, 200, 244, 1, 196, 53, 236, 192, 36, 200, - 244, 1, 213, 249, 250, 122, 36, 200, 244, 1, 196, 53, 250, 122, 36, 200, - 244, 1, 213, 249, 225, 150, 36, 200, 244, 1, 196, 53, 225, 150, 36, 200, - 244, 1, 213, 249, 214, 5, 36, 200, 244, 1, 196, 53, 214, 5, 36, 200, 244, - 1, 213, 249, 250, 118, 36, 200, 244, 1, 196, 53, 250, 118, 36, 200, 244, - 1, 213, 249, 251, 77, 36, 200, 244, 1, 213, 249, 250, 52, 36, 200, 244, - 1, 213, 249, 251, 75, 36, 200, 244, 1, 213, 249, 250, 45, 36, 200, 244, - 1, 196, 53, 250, 45, 36, 200, 244, 1, 213, 249, 236, 20, 36, 200, 244, 1, - 196, 53, 236, 20, 36, 200, 244, 1, 213, 249, 250, 18, 36, 200, 244, 1, - 196, 53, 250, 18, 36, 200, 244, 1, 213, 249, 251, 72, 36, 200, 244, 1, - 196, 53, 251, 72, 36, 200, 244, 1, 213, 249, 213, 237, 36, 200, 244, 1, - 213, 249, 248, 173, 36, 159, 6, 1, 63, 36, 159, 6, 1, 252, 10, 36, 159, - 6, 1, 236, 194, 36, 159, 6, 1, 250, 220, 36, 159, 6, 1, 236, 192, 36, - 159, 6, 1, 236, 103, 36, 159, 6, 1, 236, 189, 36, 159, 6, 1, 236, 188, - 36, 159, 6, 1, 250, 202, 36, 159, 6, 1, 70, 36, 159, 6, 1, 244, 68, 70, - 36, 159, 6, 1, 236, 184, 36, 159, 6, 1, 236, 177, 36, 159, 6, 1, 236, - 176, 36, 159, 6, 1, 236, 173, 36, 159, 6, 1, 236, 170, 36, 159, 6, 1, 68, - 36, 159, 6, 1, 226, 8, 36, 159, 6, 1, 236, 148, 36, 159, 6, 1, 236, 145, - 36, 159, 6, 1, 251, 27, 36, 159, 6, 1, 200, 28, 36, 159, 6, 1, 236, 138, - 36, 159, 6, 1, 236, 119, 36, 159, 6, 1, 236, 117, 36, 159, 6, 1, 236, - 106, 36, 159, 6, 1, 236, 70, 36, 159, 6, 1, 74, 36, 159, 6, 1, 214, 33, - 36, 159, 6, 1, 216, 104, 214, 91, 36, 159, 6, 1, 209, 85, 214, 91, 36, - 159, 6, 1, 214, 90, 36, 159, 6, 1, 236, 60, 36, 159, 6, 1, 236, 111, 36, - 159, 6, 1, 236, 42, 36, 159, 6, 1, 206, 139, 236, 42, 36, 159, 6, 1, 236, - 30, 36, 159, 6, 1, 236, 9, 36, 159, 6, 1, 236, 7, 36, 159, 6, 1, 236, 84, - 36, 159, 6, 1, 235, 252, 36, 159, 6, 1, 236, 190, 36, 159, 6, 1, 66, 36, - 159, 6, 1, 199, 229, 36, 159, 6, 1, 216, 104, 200, 81, 36, 159, 6, 1, - 209, 85, 200, 81, 36, 159, 6, 1, 235, 239, 36, 159, 6, 1, 235, 191, 36, - 159, 6, 1, 235, 186, 36, 159, 6, 1, 236, 83, 56, 36, 159, 6, 1, 199, 244, - 36, 159, 4, 1, 63, 36, 159, 4, 1, 252, 10, 36, 159, 4, 1, 236, 194, 36, - 159, 4, 1, 250, 220, 36, 159, 4, 1, 236, 192, 36, 159, 4, 1, 236, 103, - 36, 159, 4, 1, 236, 189, 36, 159, 4, 1, 236, 188, 36, 159, 4, 1, 250, - 202, 36, 159, 4, 1, 70, 36, 159, 4, 1, 244, 68, 70, 36, 159, 4, 1, 236, - 184, 36, 159, 4, 1, 236, 177, 36, 159, 4, 1, 236, 176, 36, 159, 4, 1, - 236, 173, 36, 159, 4, 1, 236, 170, 36, 159, 4, 1, 68, 36, 159, 4, 1, 226, - 8, 36, 159, 4, 1, 236, 148, 36, 159, 4, 1, 236, 145, 36, 159, 4, 1, 251, - 27, 36, 159, 4, 1, 200, 28, 36, 159, 4, 1, 236, 138, 36, 159, 4, 1, 236, - 119, 36, 159, 4, 1, 236, 117, 36, 159, 4, 1, 236, 106, 36, 159, 4, 1, - 236, 70, 36, 159, 4, 1, 74, 36, 159, 4, 1, 214, 33, 36, 159, 4, 1, 216, - 104, 214, 91, 36, 159, 4, 1, 209, 85, 214, 91, 36, 159, 4, 1, 214, 90, - 36, 159, 4, 1, 236, 60, 36, 159, 4, 1, 236, 111, 36, 159, 4, 1, 236, 42, - 36, 159, 4, 1, 206, 139, 236, 42, 36, 159, 4, 1, 236, 30, 36, 159, 4, 1, - 236, 9, 36, 159, 4, 1, 236, 7, 36, 159, 4, 1, 236, 84, 36, 159, 4, 1, - 235, 252, 36, 159, 4, 1, 236, 190, 36, 159, 4, 1, 66, 36, 159, 4, 1, 199, - 229, 36, 159, 4, 1, 216, 104, 200, 81, 36, 159, 4, 1, 209, 85, 200, 81, - 36, 159, 4, 1, 235, 239, 36, 159, 4, 1, 235, 191, 36, 159, 4, 1, 235, - 186, 36, 159, 4, 1, 236, 83, 56, 36, 159, 4, 1, 199, 244, 36, 159, 35, - 98, 36, 159, 35, 150, 36, 159, 35, 202, 248, 36, 159, 35, 235, 25, 36, - 159, 35, 106, 230, 201, 36, 159, 35, 106, 202, 130, 232, 65, 209, 167, 1, - 63, 232, 65, 209, 167, 1, 248, 252, 232, 65, 209, 167, 1, 163, 232, 65, - 209, 167, 1, 203, 137, 232, 65, 209, 167, 1, 201, 58, 232, 65, 209, 167, - 1, 225, 105, 232, 65, 209, 167, 1, 247, 36, 232, 65, 209, 167, 1, 142, - 232, 65, 209, 167, 1, 224, 38, 232, 65, 209, 167, 1, 235, 118, 232, 65, - 209, 167, 1, 240, 3, 232, 65, 209, 167, 1, 239, 164, 232, 65, 209, 167, - 1, 173, 232, 65, 209, 167, 1, 209, 135, 232, 65, 209, 167, 1, 195, 114, - 232, 65, 209, 167, 1, 187, 232, 65, 209, 167, 1, 207, 6, 232, 65, 209, - 167, 1, 157, 232, 65, 209, 167, 1, 234, 4, 232, 65, 209, 167, 1, 175, - 232, 65, 209, 167, 1, 168, 232, 65, 209, 167, 1, 179, 232, 65, 209, 167, - 1, 197, 156, 232, 65, 209, 167, 1, 223, 221, 197, 156, 232, 65, 209, 167, - 1, 165, 232, 65, 209, 167, 1, 223, 221, 165, 232, 65, 209, 167, 1, 216, - 244, 232, 65, 209, 167, 1, 215, 34, 232, 65, 209, 167, 1, 199, 137, 232, - 65, 209, 167, 18, 63, 232, 65, 209, 167, 18, 68, 232, 65, 209, 167, 18, - 66, 232, 65, 209, 167, 18, 70, 232, 65, 209, 167, 18, 74, 232, 65, 209, - 167, 113, 208, 200, 232, 65, 209, 167, 113, 217, 171, 224, 5, 232, 65, - 209, 167, 2, 232, 59, 232, 65, 209, 167, 2, 203, 106, 232, 65, 209, 167, - 2, 203, 81, 232, 65, 209, 167, 2, 203, 63, 232, 65, 209, 167, 17, 195, - 79, 232, 65, 209, 167, 17, 98, 232, 65, 209, 167, 17, 103, 232, 65, 209, - 167, 17, 135, 232, 65, 209, 167, 17, 136, 232, 65, 209, 167, 17, 150, - 232, 65, 209, 167, 17, 174, 232, 65, 209, 167, 17, 182, 232, 65, 209, - 167, 17, 178, 232, 65, 209, 167, 17, 184, 209, 73, 17, 98, 209, 73, 17, - 103, 209, 73, 17, 135, 209, 73, 17, 136, 209, 73, 17, 150, 209, 73, 17, - 174, 209, 73, 17, 182, 209, 73, 17, 178, 209, 73, 17, 184, 209, 73, 35, - 202, 248, 209, 73, 35, 200, 214, 209, 73, 35, 202, 147, 209, 73, 35, 234, - 151, 209, 73, 35, 235, 25, 209, 73, 35, 205, 228, 209, 73, 35, 207, 21, - 209, 73, 35, 236, 151, 209, 73, 35, 216, 92, 209, 73, 35, 106, 230, 201, - 209, 73, 35, 114, 230, 201, 209, 73, 35, 122, 230, 201, 209, 73, 35, 234, - 145, 230, 201, 209, 73, 35, 234, 237, 230, 201, 209, 73, 35, 205, 242, - 230, 201, 209, 73, 35, 207, 27, 230, 201, 209, 73, 35, 236, 161, 230, - 201, 209, 73, 35, 216, 97, 230, 201, 209, 73, 234, 135, 106, 232, 108, - 209, 73, 234, 135, 106, 211, 36, 209, 73, 234, 135, 106, 202, 154, 209, - 73, 234, 135, 114, 202, 151, 36, 205, 144, 1, 251, 8, 36, 205, 144, 1, - 48, 251, 8, 36, 205, 144, 1, 248, 60, 36, 205, 144, 1, 48, 248, 60, 36, - 205, 144, 1, 233, 59, 36, 205, 144, 1, 232, 32, 36, 205, 144, 1, 48, 232, - 32, 36, 205, 144, 1, 197, 109, 36, 205, 144, 1, 195, 91, 36, 205, 144, 1, - 231, 230, 36, 205, 144, 1, 195, 238, 36, 205, 144, 1, 224, 153, 36, 205, - 144, 1, 222, 141, 36, 205, 144, 1, 219, 80, 36, 205, 144, 1, 215, 63, 36, - 205, 144, 1, 48, 215, 63, 36, 205, 144, 1, 48, 215, 64, 3, 83, 203, 103, - 36, 205, 144, 1, 208, 180, 36, 205, 144, 1, 249, 224, 36, 205, 144, 1, - 250, 233, 249, 224, 36, 205, 144, 1, 213, 35, 36, 205, 144, 1, 208, 216, - 36, 205, 144, 1, 48, 208, 216, 36, 205, 144, 1, 48, 208, 217, 3, 83, 203, - 103, 36, 205, 144, 1, 210, 58, 36, 205, 144, 1, 206, 167, 36, 205, 144, - 1, 203, 50, 36, 205, 144, 1, 48, 203, 50, 36, 205, 144, 1, 48, 203, 51, - 3, 83, 203, 103, 36, 205, 144, 35, 98, 36, 205, 144, 35, 103, 36, 205, - 144, 35, 135, 36, 205, 144, 35, 136, 36, 205, 144, 35, 150, 36, 205, 144, - 35, 202, 248, 36, 205, 144, 35, 200, 214, 36, 205, 144, 35, 202, 147, 36, - 205, 144, 35, 106, 230, 201, 36, 205, 144, 234, 135, 106, 232, 108, 36, - 205, 144, 32, 249, 223, 205, 144, 1, 251, 8, 205, 144, 1, 248, 60, 205, - 144, 1, 233, 59, 205, 144, 1, 232, 32, 205, 144, 1, 197, 109, 205, 144, - 1, 195, 91, 205, 144, 1, 231, 230, 205, 144, 1, 195, 238, 205, 144, 1, - 224, 153, 205, 144, 1, 222, 141, 205, 144, 1, 219, 80, 205, 144, 1, 215, - 63, 205, 144, 1, 208, 180, 205, 144, 1, 249, 224, 205, 144, 1, 213, 35, - 205, 144, 1, 208, 216, 205, 144, 1, 210, 59, 205, 144, 1, 206, 167, 205, - 144, 1, 203, 50, 205, 144, 1, 235, 40, 205, 144, 1, 222, 44, 205, 144, - 225, 217, 206, 167, 205, 144, 37, 76, 58, 205, 144, 37, 114, 238, 121, - 58, 205, 144, 37, 76, 57, 205, 144, 37, 114, 238, 121, 57, 205, 144, 37, - 240, 135, 57, 205, 144, 37, 240, 135, 58, 205, 144, 37, 231, 53, 57, 205, - 144, 37, 231, 53, 58, 205, 144, 37, 172, 231, 53, 58, 205, 144, 37, 210, - 61, 58, 205, 144, 37, 204, 163, 58, 205, 144, 35, 98, 205, 144, 35, 202, - 248, 205, 144, 35, 200, 214, 205, 144, 35, 106, 230, 201, 205, 144, 211, - 163, 114, 83, 248, 178, 205, 144, 211, 163, 114, 83, 248, 179, 3, 238, - 120, 205, 144, 211, 163, 244, 114, 3, 238, 123, 205, 144, 211, 163, 114, - 244, 111, 3, 238, 120, 205, 144, 211, 163, 155, 244, 114, 3, 238, 123, - 156, 2, 246, 251, 156, 2, 250, 155, 156, 2, 198, 247, 156, 2, 225, 56, - 156, 2, 200, 18, 156, 1, 63, 156, 1, 252, 10, 156, 1, 68, 156, 1, 226, 8, - 156, 1, 66, 156, 1, 199, 229, 156, 1, 111, 143, 156, 1, 111, 209, 136, - 156, 1, 111, 158, 156, 1, 111, 221, 196, 156, 1, 70, 156, 1, 251, 45, - 156, 1, 74, 156, 1, 250, 0, 156, 1, 157, 156, 1, 224, 38, 156, 1, 234, 4, - 156, 1, 233, 112, 156, 1, 216, 244, 156, 1, 247, 36, 156, 1, 246, 136, - 156, 1, 225, 105, 156, 1, 225, 71, 156, 1, 215, 34, 156, 1, 201, 58, 156, - 1, 201, 46, 156, 1, 239, 164, 156, 1, 239, 148, 156, 1, 216, 5, 156, 1, - 203, 137, 156, 1, 202, 202, 156, 1, 240, 3, 156, 1, 239, 44, 156, 1, 179, - 156, 1, 163, 156, 1, 212, 205, 156, 1, 248, 252, 156, 1, 248, 53, 156, 1, - 168, 156, 1, 165, 156, 1, 173, 156, 1, 175, 156, 1, 199, 137, 156, 1, - 207, 6, 156, 1, 205, 43, 156, 1, 187, 156, 1, 142, 156, 1, 221, 195, 156, - 1, 36, 47, 221, 185, 156, 1, 36, 47, 209, 135, 156, 1, 36, 47, 215, 243, - 156, 18, 2, 252, 10, 156, 18, 2, 248, 50, 252, 10, 156, 18, 2, 68, 156, - 18, 2, 226, 8, 156, 18, 2, 66, 156, 18, 2, 199, 229, 156, 18, 2, 111, - 143, 156, 18, 2, 111, 209, 136, 156, 18, 2, 111, 158, 156, 18, 2, 111, - 221, 196, 156, 18, 2, 70, 156, 18, 2, 251, 45, 156, 18, 2, 74, 156, 18, - 2, 250, 0, 156, 198, 252, 156, 239, 211, 156, 54, 239, 211, 156, 211, - 163, 238, 123, 156, 211, 163, 54, 238, 123, 156, 211, 163, 221, 233, 156, - 211, 163, 240, 193, 153, 156, 211, 163, 221, 117, 156, 35, 98, 156, 35, - 103, 156, 35, 135, 156, 35, 136, 156, 35, 150, 156, 35, 174, 156, 35, - 182, 156, 35, 178, 156, 35, 184, 156, 35, 202, 248, 156, 35, 200, 214, - 156, 35, 202, 147, 156, 35, 234, 151, 156, 35, 235, 25, 156, 35, 205, - 228, 156, 35, 207, 21, 156, 35, 236, 151, 156, 35, 216, 92, 156, 35, 106, - 230, 201, 156, 35, 106, 202, 130, 156, 17, 195, 79, 156, 17, 98, 156, 17, - 103, 156, 17, 135, 156, 17, 136, 156, 17, 150, 156, 17, 174, 156, 17, - 182, 156, 17, 178, 156, 17, 184, 156, 35, 225, 15, 224, 176, 2, 246, 251, - 224, 176, 2, 250, 155, 224, 176, 2, 198, 247, 224, 176, 1, 63, 224, 176, - 1, 252, 10, 224, 176, 1, 68, 224, 176, 1, 226, 8, 224, 176, 1, 66, 224, - 176, 1, 199, 229, 224, 176, 1, 70, 224, 176, 1, 251, 45, 224, 176, 1, 74, - 224, 176, 1, 250, 0, 224, 176, 1, 157, 224, 176, 1, 224, 38, 224, 176, 1, - 234, 4, 224, 176, 1, 233, 112, 224, 176, 1, 216, 244, 224, 176, 1, 247, - 36, 224, 176, 1, 246, 136, 224, 176, 1, 225, 105, 224, 176, 1, 225, 71, - 224, 176, 1, 215, 34, 224, 176, 1, 201, 58, 224, 176, 1, 201, 46, 224, - 176, 1, 239, 164, 224, 176, 1, 239, 153, 224, 176, 1, 239, 148, 224, 176, - 1, 210, 28, 224, 176, 1, 216, 5, 224, 176, 1, 203, 137, 224, 176, 1, 202, - 202, 224, 176, 1, 240, 3, 224, 176, 1, 239, 44, 224, 176, 1, 179, 224, - 176, 1, 163, 224, 176, 1, 212, 205, 224, 176, 1, 248, 252, 224, 176, 1, - 248, 53, 224, 176, 1, 168, 224, 176, 1, 165, 224, 176, 1, 173, 224, 176, - 1, 175, 224, 176, 1, 199, 137, 224, 176, 1, 207, 6, 224, 176, 1, 205, 43, - 224, 176, 1, 187, 224, 176, 1, 142, 224, 176, 18, 2, 252, 10, 224, 176, - 18, 2, 68, 224, 176, 18, 2, 226, 8, 224, 176, 18, 2, 66, 224, 176, 18, 2, - 199, 229, 224, 176, 18, 2, 70, 224, 176, 18, 2, 251, 45, 224, 176, 18, 2, - 74, 224, 176, 18, 2, 250, 0, 224, 176, 2, 198, 252, 224, 176, 2, 215, 74, - 224, 176, 251, 130, 56, 224, 176, 236, 73, 56, 224, 176, 35, 56, 224, - 176, 208, 89, 78, 224, 176, 54, 208, 89, 78, 224, 176, 239, 211, 224, - 176, 54, 239, 211, 224, 176, 35, 2, 57, 205, 129, 205, 137, 1, 208, 209, - 205, 129, 205, 137, 1, 203, 107, 205, 129, 205, 137, 1, 248, 222, 205, - 129, 205, 137, 1, 247, 25, 205, 129, 205, 137, 1, 239, 239, 205, 129, - 205, 137, 1, 233, 245, 205, 129, 205, 137, 1, 219, 249, 205, 129, 205, - 137, 1, 216, 241, 205, 129, 205, 137, 1, 222, 214, 205, 129, 205, 137, 1, - 217, 145, 205, 129, 205, 137, 1, 199, 133, 205, 129, 205, 137, 1, 213, - 160, 205, 129, 205, 137, 1, 196, 105, 205, 129, 205, 137, 1, 210, 175, - 205, 129, 205, 137, 1, 232, 119, 205, 129, 205, 137, 1, 224, 181, 205, - 129, 205, 137, 1, 225, 99, 205, 129, 205, 137, 1, 215, 31, 205, 129, 205, - 137, 1, 251, 54, 205, 129, 205, 137, 1, 236, 182, 205, 129, 205, 137, 1, - 226, 9, 205, 129, 205, 137, 1, 200, 75, 205, 129, 205, 137, 1, 214, 78, - 205, 129, 205, 137, 1, 236, 170, 205, 129, 205, 137, 1, 220, 8, 205, 129, - 205, 137, 17, 195, 79, 205, 129, 205, 137, 17, 98, 205, 129, 205, 137, - 17, 103, 205, 129, 205, 137, 17, 135, 205, 129, 205, 137, 17, 136, 205, - 129, 205, 137, 17, 150, 205, 129, 205, 137, 17, 174, 205, 129, 205, 137, - 17, 182, 205, 129, 205, 137, 17, 178, 205, 129, 205, 137, 17, 184, 246, - 130, 2, 246, 251, 246, 130, 2, 250, 155, 246, 130, 2, 198, 247, 246, 130, - 1, 252, 10, 246, 130, 1, 68, 246, 130, 1, 66, 246, 130, 1, 70, 246, 130, - 1, 224, 202, 246, 130, 1, 224, 37, 246, 130, 1, 234, 1, 246, 130, 1, 233, - 111, 246, 130, 1, 216, 243, 246, 130, 1, 247, 35, 246, 130, 1, 246, 135, - 246, 130, 1, 225, 104, 246, 130, 1, 225, 70, 246, 130, 1, 215, 33, 246, - 130, 1, 201, 57, 246, 130, 1, 201, 45, 246, 130, 1, 239, 163, 246, 130, - 1, 239, 147, 246, 130, 1, 216, 4, 246, 130, 1, 203, 130, 246, 130, 1, - 202, 201, 246, 130, 1, 240, 2, 246, 130, 1, 239, 43, 246, 130, 1, 217, - 158, 246, 130, 1, 213, 179, 246, 130, 1, 212, 204, 246, 130, 1, 248, 250, - 246, 130, 1, 248, 52, 246, 130, 1, 220, 23, 246, 130, 1, 195, 165, 246, - 130, 1, 196, 124, 246, 130, 1, 210, 193, 246, 130, 1, 222, 239, 246, 130, - 1, 197, 150, 246, 130, 1, 208, 224, 246, 130, 1, 232, 129, 246, 130, 18, - 2, 63, 246, 130, 18, 2, 68, 246, 130, 18, 2, 226, 8, 246, 130, 18, 2, 66, - 246, 130, 18, 2, 199, 229, 246, 130, 18, 2, 70, 246, 130, 18, 2, 251, 45, - 246, 130, 18, 2, 74, 246, 130, 18, 2, 250, 0, 246, 130, 18, 2, 214, 75, - 246, 130, 169, 78, 246, 130, 250, 1, 78, 246, 130, 198, 252, 246, 130, - 220, 21, 246, 130, 17, 195, 79, 246, 130, 17, 98, 246, 130, 17, 103, 246, - 130, 17, 135, 246, 130, 17, 136, 246, 130, 17, 150, 246, 130, 17, 174, - 246, 130, 17, 182, 246, 130, 17, 178, 246, 130, 17, 184, 246, 130, 208, - 89, 78, 246, 130, 239, 211, 246, 130, 54, 239, 211, 246, 130, 211, 28, - 78, 246, 130, 1, 222, 23, 246, 130, 18, 2, 252, 10, 246, 130, 18, 2, 236, - 163, 219, 247, 1, 63, 219, 247, 1, 68, 219, 247, 1, 66, 219, 247, 1, 70, - 219, 247, 1, 74, 219, 247, 1, 157, 219, 247, 1, 224, 38, 219, 247, 1, - 234, 4, 219, 247, 1, 233, 112, 219, 247, 1, 247, 36, 219, 247, 1, 246, - 136, 219, 247, 1, 225, 105, 219, 247, 1, 225, 71, 219, 247, 1, 215, 34, - 219, 247, 1, 201, 58, 219, 247, 1, 201, 46, 219, 247, 1, 239, 164, 219, - 247, 1, 239, 148, 219, 247, 1, 216, 5, 219, 247, 1, 203, 137, 219, 247, - 1, 202, 202, 219, 247, 1, 240, 3, 219, 247, 1, 239, 44, 219, 247, 1, 179, - 219, 247, 1, 163, 219, 247, 1, 212, 205, 219, 247, 1, 248, 252, 219, 247, - 1, 248, 53, 219, 247, 1, 168, 219, 247, 1, 173, 219, 247, 1, 175, 219, - 247, 1, 199, 137, 219, 247, 1, 187, 219, 247, 1, 142, 219, 247, 1, 209, - 135, 219, 247, 2, 215, 74, 219, 247, 251, 130, 56, 219, 247, 208, 89, 78, - 219, 247, 32, 206, 116, 206, 227, 2, 246, 251, 206, 227, 2, 250, 155, - 206, 227, 2, 198, 247, 206, 227, 1, 63, 206, 227, 1, 252, 10, 206, 227, - 1, 68, 206, 227, 1, 226, 8, 206, 227, 1, 66, 206, 227, 1, 199, 229, 206, - 227, 1, 111, 143, 206, 227, 1, 111, 209, 136, 206, 227, 1, 111, 158, 206, - 227, 1, 111, 221, 196, 206, 227, 1, 70, 206, 227, 1, 251, 45, 206, 227, - 1, 74, 206, 227, 1, 250, 0, 206, 227, 1, 157, 206, 227, 1, 224, 38, 206, - 227, 1, 234, 4, 206, 227, 1, 233, 112, 206, 227, 1, 216, 244, 206, 227, - 1, 247, 36, 206, 227, 1, 246, 136, 206, 227, 1, 225, 105, 206, 227, 1, - 225, 71, 206, 227, 1, 215, 34, 206, 227, 1, 201, 58, 206, 227, 1, 201, - 46, 206, 227, 1, 239, 164, 206, 227, 1, 239, 148, 206, 227, 1, 216, 5, - 206, 227, 1, 203, 137, 206, 227, 1, 202, 202, 206, 227, 1, 240, 3, 206, - 227, 1, 239, 44, 206, 227, 1, 179, 206, 227, 1, 163, 206, 227, 1, 212, - 205, 206, 227, 1, 248, 252, 206, 227, 1, 248, 53, 206, 227, 1, 168, 206, - 227, 1, 165, 206, 227, 1, 173, 206, 227, 1, 175, 206, 227, 1, 221, 195, - 206, 227, 1, 199, 137, 206, 227, 1, 207, 6, 206, 227, 1, 205, 43, 206, - 227, 1, 187, 206, 227, 1, 142, 206, 227, 18, 2, 252, 10, 206, 227, 18, 2, - 68, 206, 227, 18, 2, 226, 8, 206, 227, 18, 2, 66, 206, 227, 18, 2, 199, - 229, 206, 227, 18, 2, 111, 143, 206, 227, 18, 2, 111, 209, 136, 206, 227, - 18, 2, 111, 158, 206, 227, 18, 2, 111, 221, 196, 206, 227, 18, 2, 70, - 206, 227, 18, 2, 251, 45, 206, 227, 18, 2, 74, 206, 227, 18, 2, 250, 0, - 206, 227, 2, 198, 252, 206, 227, 2, 249, 239, 206, 227, 2, 225, 56, 206, - 227, 2, 200, 18, 206, 227, 214, 56, 206, 227, 239, 211, 206, 227, 54, - 239, 211, 206, 227, 251, 130, 56, 206, 227, 207, 46, 206, 227, 208, 170, - 78, 206, 227, 2, 215, 74, 206, 227, 18, 71, 78, 206, 227, 235, 210, 206, - 139, 18, 78, 206, 227, 204, 42, 78, 206, 227, 17, 195, 79, 206, 227, 17, - 98, 206, 227, 17, 103, 206, 227, 17, 135, 206, 227, 17, 136, 206, 227, - 17, 150, 206, 227, 17, 174, 206, 227, 17, 182, 206, 227, 17, 178, 206, - 227, 17, 184, 206, 227, 236, 144, 206, 227, 2, 206, 57, 206, 227, 232, - 15, 206, 227, 240, 248, 56, 206, 227, 208, 89, 219, 189, 206, 227, 208, - 89, 219, 188, 151, 250, 99, 17, 98, 151, 250, 99, 17, 103, 151, 250, 99, - 17, 135, 151, 250, 99, 17, 136, 151, 250, 99, 17, 150, 151, 250, 99, 17, - 174, 151, 250, 99, 17, 182, 151, 250, 99, 17, 178, 151, 250, 99, 17, 184, - 151, 250, 99, 35, 202, 248, 151, 250, 99, 35, 200, 214, 151, 250, 99, 35, - 202, 147, 151, 250, 99, 35, 234, 151, 151, 250, 99, 35, 235, 25, 151, - 250, 99, 35, 205, 228, 151, 250, 99, 35, 207, 21, 151, 250, 99, 35, 236, - 151, 151, 250, 99, 35, 216, 92, 151, 250, 99, 35, 106, 230, 201, 151, - 250, 99, 35, 106, 202, 130, 224, 8, 1, 63, 224, 8, 1, 252, 10, 224, 8, 1, - 68, 224, 8, 1, 66, 224, 8, 1, 70, 224, 8, 1, 251, 45, 224, 8, 1, 74, 224, - 8, 1, 250, 0, 224, 8, 1, 157, 224, 8, 1, 224, 38, 224, 8, 1, 234, 4, 224, - 8, 1, 233, 148, 224, 8, 1, 233, 112, 224, 8, 1, 216, 244, 224, 8, 1, 247, - 36, 224, 8, 1, 246, 136, 224, 8, 1, 225, 105, 224, 8, 1, 225, 49, 224, 8, - 1, 215, 34, 224, 8, 1, 201, 58, 224, 8, 1, 201, 46, 224, 8, 1, 239, 164, - 224, 8, 1, 239, 148, 224, 8, 1, 216, 5, 224, 8, 1, 203, 137, 224, 8, 1, - 202, 202, 224, 8, 1, 240, 3, 224, 8, 1, 239, 154, 224, 8, 1, 239, 44, - 224, 8, 1, 179, 224, 8, 1, 163, 224, 8, 1, 212, 205, 224, 8, 1, 248, 252, - 224, 8, 1, 248, 155, 224, 8, 1, 248, 53, 224, 8, 1, 168, 224, 8, 1, 165, - 224, 8, 1, 173, 224, 8, 1, 175, 224, 8, 1, 199, 137, 224, 8, 1, 187, 224, - 8, 1, 142, 224, 8, 1, 221, 195, 224, 8, 18, 2, 252, 10, 224, 8, 18, 2, - 68, 224, 8, 18, 2, 226, 8, 224, 8, 18, 2, 66, 224, 8, 18, 2, 70, 224, 8, - 18, 2, 251, 45, 224, 8, 18, 2, 74, 224, 8, 18, 2, 250, 0, 224, 8, 2, 250, - 155, 224, 8, 2, 198, 252, 224, 8, 2, 215, 74, 224, 8, 2, 206, 252, 224, - 8, 239, 211, 224, 8, 54, 239, 211, 224, 8, 197, 3, 207, 46, 224, 8, 208, - 89, 78, 224, 8, 54, 208, 89, 78, 224, 8, 251, 130, 56, 224, 8, 2, 204, - 86, 218, 36, 1, 63, 218, 36, 1, 68, 218, 36, 1, 66, 218, 36, 1, 70, 218, - 36, 1, 157, 218, 36, 1, 224, 38, 218, 36, 1, 234, 4, 218, 36, 1, 233, - 112, 218, 36, 1, 247, 36, 218, 36, 1, 246, 136, 218, 36, 1, 225, 105, - 218, 36, 1, 225, 49, 218, 36, 1, 215, 34, 218, 36, 1, 201, 58, 218, 36, - 1, 201, 46, 218, 36, 1, 239, 164, 218, 36, 1, 239, 154, 218, 36, 1, 239, - 148, 218, 36, 1, 216, 5, 218, 36, 1, 203, 137, 218, 36, 1, 202, 202, 218, - 36, 1, 240, 3, 218, 36, 1, 239, 44, 218, 36, 1, 179, 218, 36, 1, 163, - 218, 36, 1, 212, 205, 218, 36, 1, 248, 252, 218, 36, 1, 248, 53, 218, 36, - 1, 168, 218, 36, 1, 165, 218, 36, 1, 173, 218, 36, 1, 175, 218, 36, 1, - 199, 137, 218, 36, 1, 187, 218, 36, 1, 142, 218, 36, 1, 209, 135, 218, - 36, 1, 210, 28, 218, 36, 208, 89, 78, 223, 255, 1, 63, 223, 255, 1, 252, - 10, 223, 255, 1, 68, 223, 255, 1, 226, 8, 223, 255, 1, 66, 223, 255, 1, - 199, 229, 223, 255, 1, 70, 223, 255, 1, 251, 45, 223, 255, 1, 74, 223, - 255, 1, 250, 0, 223, 255, 1, 157, 223, 255, 1, 224, 38, 223, 255, 1, 234, - 4, 223, 255, 1, 233, 148, 223, 255, 1, 233, 112, 223, 255, 1, 216, 244, - 223, 255, 1, 247, 36, 223, 255, 1, 246, 136, 223, 255, 1, 225, 105, 223, - 255, 1, 225, 49, 223, 255, 1, 225, 71, 223, 255, 1, 215, 34, 223, 255, 1, - 201, 58, 223, 255, 1, 201, 46, 223, 255, 1, 239, 164, 223, 255, 1, 239, - 154, 223, 255, 1, 209, 135, 223, 255, 1, 239, 148, 223, 255, 1, 216, 5, - 223, 255, 1, 203, 137, 223, 255, 1, 202, 202, 223, 255, 1, 240, 3, 223, - 255, 1, 239, 44, 223, 255, 1, 179, 223, 255, 1, 163, 223, 255, 1, 212, - 205, 223, 255, 1, 248, 252, 223, 255, 1, 248, 155, 223, 255, 1, 248, 53, - 223, 255, 1, 168, 223, 255, 1, 165, 223, 255, 1, 173, 223, 255, 1, 175, - 223, 255, 1, 199, 137, 223, 255, 1, 207, 6, 223, 255, 1, 187, 223, 255, - 1, 142, 223, 255, 2, 250, 155, 223, 255, 18, 2, 252, 10, 223, 255, 18, 2, - 68, 223, 255, 18, 2, 226, 8, 223, 255, 18, 2, 66, 223, 255, 18, 2, 199, - 229, 223, 255, 18, 2, 70, 223, 255, 18, 2, 251, 45, 223, 255, 18, 2, 74, - 223, 255, 18, 2, 250, 0, 223, 255, 2, 215, 74, 223, 255, 2, 198, 252, - 223, 255, 17, 195, 79, 223, 255, 17, 98, 223, 255, 17, 103, 223, 255, 17, - 135, 223, 255, 17, 136, 223, 255, 17, 150, 223, 255, 17, 174, 223, 255, - 17, 182, 223, 255, 17, 178, 223, 255, 17, 184, 232, 247, 2, 37, 250, 156, - 57, 232, 247, 2, 246, 251, 232, 247, 2, 250, 155, 232, 247, 2, 198, 247, - 232, 247, 1, 63, 232, 247, 1, 252, 10, 232, 247, 1, 68, 232, 247, 1, 226, - 8, 232, 247, 1, 66, 232, 247, 1, 199, 229, 232, 247, 1, 111, 143, 232, - 247, 1, 111, 158, 232, 247, 1, 236, 184, 232, 247, 1, 251, 45, 232, 247, - 1, 214, 33, 232, 247, 1, 250, 0, 232, 247, 1, 157, 232, 247, 1, 224, 38, - 232, 247, 1, 234, 4, 232, 247, 1, 233, 112, 232, 247, 1, 216, 244, 232, - 247, 1, 247, 36, 232, 247, 1, 246, 136, 232, 247, 1, 225, 105, 232, 247, - 1, 225, 71, 232, 247, 1, 215, 34, 232, 247, 1, 201, 58, 232, 247, 1, 201, - 46, 232, 247, 1, 239, 164, 232, 247, 1, 239, 148, 232, 247, 1, 216, 5, - 232, 247, 1, 203, 137, 232, 247, 1, 202, 202, 232, 247, 1, 240, 3, 232, - 247, 1, 239, 44, 232, 247, 1, 179, 232, 247, 1, 163, 232, 247, 1, 212, - 205, 232, 247, 1, 248, 252, 232, 247, 1, 248, 53, 232, 247, 1, 168, 232, - 247, 1, 165, 232, 247, 1, 173, 232, 247, 1, 175, 232, 247, 1, 221, 195, - 232, 247, 1, 199, 137, 232, 247, 1, 207, 6, 232, 247, 1, 205, 43, 232, - 247, 1, 187, 232, 247, 1, 142, 37, 248, 18, 58, 232, 247, 2, 215, 74, - 232, 247, 2, 249, 239, 232, 247, 18, 2, 252, 10, 232, 247, 18, 2, 68, - 232, 247, 18, 2, 226, 8, 232, 247, 18, 2, 66, 232, 247, 18, 2, 199, 229, - 232, 247, 18, 2, 111, 143, 232, 247, 18, 2, 111, 209, 136, 232, 247, 18, - 2, 236, 184, 232, 247, 18, 2, 251, 45, 232, 247, 18, 2, 214, 33, 232, - 247, 18, 2, 250, 0, 232, 247, 2, 198, 252, 232, 247, 214, 56, 232, 247, - 250, 1, 222, 60, 78, 232, 247, 2, 212, 68, 232, 247, 1, 199, 102, 250, - 155, 232, 247, 1, 199, 102, 54, 250, 155, 232, 247, 1, 111, 209, 136, - 232, 247, 1, 111, 221, 196, 232, 247, 18, 2, 111, 158, 232, 247, 18, 2, - 111, 221, 196, 37, 232, 247, 17, 195, 79, 37, 232, 247, 17, 98, 37, 232, - 247, 17, 103, 37, 232, 247, 17, 135, 37, 232, 247, 17, 136, 37, 232, 247, - 17, 150, 37, 232, 247, 17, 174, 37, 232, 247, 1, 63, 37, 232, 247, 1, - 157, 37, 232, 247, 1, 179, 37, 232, 247, 1, 199, 23, 37, 232, 247, 1, - 163, 216, 254, 1, 63, 216, 254, 1, 252, 10, 216, 254, 1, 68, 216, 254, 1, - 226, 8, 216, 254, 1, 66, 216, 254, 1, 199, 229, 216, 254, 1, 111, 143, - 216, 254, 1, 111, 209, 136, 216, 254, 1, 111, 158, 216, 254, 1, 111, 221, - 196, 216, 254, 1, 70, 216, 254, 1, 251, 45, 216, 254, 1, 74, 216, 254, 1, - 250, 0, 216, 254, 1, 157, 216, 254, 1, 224, 38, 216, 254, 1, 234, 4, 216, - 254, 1, 233, 112, 216, 254, 1, 216, 244, 216, 254, 1, 216, 193, 216, 254, - 1, 247, 36, 216, 254, 1, 246, 136, 216, 254, 1, 225, 105, 216, 254, 1, - 225, 71, 216, 254, 1, 215, 34, 216, 254, 1, 215, 17, 216, 254, 1, 201, - 58, 216, 254, 1, 201, 46, 216, 254, 1, 239, 164, 216, 254, 1, 239, 148, - 216, 254, 1, 216, 5, 216, 254, 1, 203, 137, 216, 254, 1, 202, 202, 216, - 254, 1, 240, 3, 216, 254, 1, 239, 44, 216, 254, 1, 179, 216, 254, 1, 216, - 145, 216, 254, 1, 163, 216, 254, 1, 212, 205, 216, 254, 1, 248, 252, 216, - 254, 1, 248, 53, 216, 254, 1, 168, 216, 254, 1, 218, 246, 216, 254, 1, - 165, 216, 254, 1, 173, 216, 254, 1, 210, 28, 216, 254, 1, 175, 216, 254, - 1, 222, 24, 216, 254, 1, 197, 156, 216, 254, 1, 207, 6, 216, 254, 1, 205, - 43, 216, 254, 1, 187, 216, 254, 1, 142, 216, 254, 18, 2, 252, 10, 216, - 254, 18, 2, 68, 216, 254, 18, 2, 226, 8, 216, 254, 18, 2, 66, 216, 254, - 18, 2, 199, 229, 216, 254, 18, 2, 111, 143, 216, 254, 18, 2, 111, 209, - 136, 216, 254, 18, 2, 111, 158, 216, 254, 18, 2, 111, 221, 196, 216, 254, - 18, 2, 70, 216, 254, 18, 2, 251, 45, 216, 254, 18, 2, 74, 216, 254, 18, - 2, 250, 0, 216, 254, 2, 198, 252, 216, 254, 2, 246, 251, 216, 254, 2, - 250, 155, 216, 254, 2, 198, 247, 216, 254, 2, 215, 74, 216, 254, 2, 249, - 239, 216, 254, 2, 48, 250, 155, 216, 254, 214, 56, 216, 254, 206, 56, - 216, 254, 239, 211, 216, 254, 54, 239, 211, 216, 254, 244, 23, 216, 254, - 233, 224, 235, 14, 216, 254, 251, 130, 56, 216, 254, 17, 195, 79, 216, - 254, 17, 98, 216, 254, 17, 103, 216, 254, 17, 135, 216, 254, 17, 136, - 216, 254, 17, 150, 216, 254, 17, 174, 216, 254, 17, 182, 216, 254, 17, - 178, 216, 254, 17, 184, 216, 254, 212, 92, 78, 216, 254, 225, 188, 56, - 216, 254, 208, 170, 78, 202, 33, 250, 184, 202, 33, 1, 63, 202, 33, 1, - 252, 10, 202, 33, 1, 68, 202, 33, 1, 226, 8, 202, 33, 1, 66, 202, 33, 1, - 199, 229, 202, 33, 1, 111, 143, 202, 33, 1, 111, 209, 136, 202, 33, 1, - 111, 158, 202, 33, 1, 111, 221, 196, 202, 33, 1, 70, 202, 33, 1, 251, 45, - 202, 33, 1, 74, 202, 33, 1, 250, 0, 202, 33, 1, 157, 202, 33, 1, 224, 38, - 202, 33, 1, 234, 4, 202, 33, 1, 233, 112, 202, 33, 1, 216, 244, 202, 33, - 1, 247, 36, 202, 33, 1, 246, 136, 202, 33, 1, 225, 105, 202, 33, 1, 225, - 71, 202, 33, 1, 215, 34, 202, 33, 1, 201, 58, 202, 33, 1, 201, 46, 202, - 33, 1, 239, 164, 202, 33, 1, 239, 148, 202, 33, 1, 216, 5, 202, 33, 1, - 203, 137, 202, 33, 1, 202, 202, 202, 33, 1, 240, 3, 202, 33, 1, 239, 44, - 202, 33, 1, 179, 202, 33, 1, 163, 202, 33, 1, 212, 205, 202, 33, 1, 248, - 252, 202, 33, 1, 248, 53, 202, 33, 1, 168, 202, 33, 1, 165, 202, 33, 1, - 173, 202, 33, 1, 175, 202, 33, 1, 199, 137, 202, 33, 1, 207, 6, 202, 33, - 1, 205, 43, 202, 33, 1, 187, 202, 33, 1, 142, 202, 33, 18, 2, 252, 10, - 202, 33, 18, 2, 68, 202, 33, 18, 2, 226, 8, 202, 33, 18, 2, 66, 202, 33, - 18, 2, 199, 229, 202, 33, 18, 2, 111, 143, 202, 33, 18, 2, 111, 209, 136, - 202, 33, 18, 2, 111, 158, 202, 33, 18, 2, 111, 221, 196, 202, 33, 18, 2, - 70, 202, 33, 18, 2, 206, 139, 70, 202, 33, 18, 2, 251, 45, 202, 33, 18, - 2, 74, 202, 33, 18, 2, 206, 139, 74, 202, 33, 18, 2, 250, 0, 202, 33, 2, - 246, 251, 202, 33, 2, 250, 155, 202, 33, 2, 198, 247, 202, 33, 2, 198, - 252, 202, 33, 2, 215, 74, 202, 33, 2, 249, 239, 202, 33, 232, 174, 202, - 33, 251, 130, 56, 202, 33, 214, 56, 202, 33, 17, 195, 79, 202, 33, 17, - 98, 202, 33, 17, 103, 202, 33, 17, 135, 202, 33, 17, 136, 202, 33, 17, - 150, 202, 33, 17, 174, 202, 33, 17, 182, 202, 33, 17, 178, 202, 33, 17, - 184, 206, 58, 1, 63, 206, 58, 1, 252, 10, 206, 58, 1, 68, 206, 58, 1, - 226, 8, 206, 58, 1, 66, 206, 58, 1, 199, 229, 206, 58, 1, 111, 143, 206, - 58, 1, 111, 209, 136, 206, 58, 1, 111, 158, 206, 58, 1, 111, 221, 196, - 206, 58, 1, 70, 206, 58, 1, 251, 45, 206, 58, 1, 74, 206, 58, 1, 250, 0, - 206, 58, 1, 157, 206, 58, 1, 224, 38, 206, 58, 1, 234, 4, 206, 58, 1, - 233, 112, 206, 58, 1, 216, 244, 206, 58, 1, 247, 36, 206, 58, 1, 246, - 136, 206, 58, 1, 225, 105, 206, 58, 1, 225, 71, 206, 58, 1, 215, 34, 206, - 58, 1, 201, 58, 206, 58, 1, 201, 46, 206, 58, 1, 239, 164, 206, 58, 1, - 239, 148, 206, 58, 1, 216, 5, 206, 58, 1, 203, 137, 206, 58, 1, 202, 202, - 206, 58, 1, 240, 3, 206, 58, 1, 239, 44, 206, 58, 1, 179, 206, 58, 1, - 163, 206, 58, 1, 212, 205, 206, 58, 1, 248, 252, 206, 58, 1, 248, 53, - 206, 58, 1, 168, 206, 58, 1, 165, 206, 58, 1, 173, 206, 58, 1, 175, 206, - 58, 1, 199, 137, 206, 58, 1, 207, 6, 206, 58, 1, 205, 43, 206, 58, 1, - 187, 206, 58, 1, 142, 206, 58, 18, 2, 252, 10, 206, 58, 18, 2, 68, 206, - 58, 18, 2, 226, 8, 206, 58, 18, 2, 66, 206, 58, 18, 2, 199, 229, 206, 58, - 18, 2, 111, 143, 206, 58, 18, 2, 111, 209, 136, 206, 58, 18, 2, 70, 206, - 58, 18, 2, 251, 45, 206, 58, 18, 2, 74, 206, 58, 18, 2, 250, 0, 206, 58, - 2, 246, 251, 206, 58, 2, 250, 155, 206, 58, 2, 198, 247, 206, 58, 2, 198, - 252, 206, 58, 2, 215, 74, 206, 58, 2, 206, 57, 206, 58, 239, 211, 206, - 58, 54, 239, 211, 206, 58, 207, 47, 238, 123, 206, 58, 207, 47, 153, 206, - 58, 210, 68, 219, 189, 206, 58, 210, 68, 219, 188, 206, 58, 210, 68, 219, - 187, 206, 58, 236, 98, 77, 202, 207, 78, 206, 58, 208, 89, 113, 3, 201, - 155, 26, 200, 149, 213, 246, 206, 58, 208, 89, 113, 3, 201, 155, 26, 237, - 120, 240, 191, 206, 58, 208, 89, 113, 3, 210, 138, 26, 237, 120, 240, - 191, 206, 58, 208, 89, 113, 3, 210, 138, 26, 237, 120, 54, 240, 191, 206, - 58, 208, 89, 113, 3, 210, 138, 26, 237, 120, 201, 145, 240, 191, 206, 58, - 208, 89, 113, 54, 209, 210, 206, 58, 208, 89, 113, 54, 209, 211, 3, 210, - 137, 206, 58, 208, 89, 113, 3, 54, 240, 191, 206, 58, 208, 89, 113, 3, - 201, 145, 240, 191, 206, 58, 208, 89, 113, 3, 211, 39, 240, 191, 206, 58, - 208, 89, 113, 3, 207, 44, 240, 191, 206, 58, 208, 89, 113, 3, 244, 111, - 26, 210, 137, 206, 58, 208, 89, 113, 3, 244, 111, 26, 114, 236, 100, 206, - 58, 208, 89, 113, 3, 244, 111, 26, 234, 145, 236, 100, 206, 58, 1, 202, - 126, 250, 233, 68, 206, 58, 1, 200, 198, 250, 233, 68, 206, 58, 1, 200, - 198, 250, 233, 226, 8, 206, 58, 1, 250, 233, 66, 206, 58, 18, 2, 250, - 233, 66, 206, 58, 18, 2, 250, 233, 199, 229, 218, 145, 1, 63, 218, 145, - 1, 252, 10, 218, 145, 1, 68, 218, 145, 1, 226, 8, 218, 145, 1, 66, 218, - 145, 1, 199, 229, 218, 145, 1, 111, 143, 218, 145, 1, 111, 209, 136, 218, - 145, 1, 111, 158, 218, 145, 1, 111, 221, 196, 218, 145, 1, 70, 218, 145, - 1, 251, 45, 218, 145, 1, 74, 218, 145, 1, 250, 0, 218, 145, 1, 157, 218, - 145, 1, 224, 38, 218, 145, 1, 234, 4, 218, 145, 1, 233, 112, 218, 145, 1, - 216, 244, 218, 145, 1, 247, 36, 218, 145, 1, 246, 136, 218, 145, 1, 225, - 105, 218, 145, 1, 225, 71, 218, 145, 1, 215, 34, 218, 145, 1, 201, 58, - 218, 145, 1, 201, 46, 218, 145, 1, 239, 164, 218, 145, 1, 239, 148, 218, - 145, 1, 216, 5, 218, 145, 1, 203, 137, 218, 145, 1, 202, 202, 218, 145, - 1, 240, 3, 218, 145, 1, 239, 44, 218, 145, 1, 179, 218, 145, 1, 163, 218, - 145, 1, 212, 205, 218, 145, 1, 248, 252, 218, 145, 1, 248, 53, 218, 145, - 1, 168, 218, 145, 1, 165, 218, 145, 1, 173, 218, 145, 1, 175, 218, 145, - 1, 199, 137, 218, 145, 1, 207, 6, 218, 145, 1, 205, 43, 218, 145, 1, 187, - 218, 145, 1, 142, 218, 145, 1, 221, 195, 218, 145, 18, 2, 252, 10, 218, - 145, 18, 2, 68, 218, 145, 18, 2, 226, 8, 218, 145, 18, 2, 66, 218, 145, - 18, 2, 199, 229, 218, 145, 18, 2, 111, 143, 218, 145, 18, 2, 111, 209, - 136, 218, 145, 18, 2, 111, 158, 218, 145, 18, 2, 111, 221, 196, 218, 145, - 18, 2, 70, 218, 145, 18, 2, 251, 45, 218, 145, 18, 2, 74, 218, 145, 18, - 2, 250, 0, 218, 145, 2, 250, 155, 218, 145, 2, 198, 247, 218, 145, 2, - 198, 252, 218, 145, 2, 250, 96, 218, 145, 239, 211, 218, 145, 54, 239, - 211, 218, 145, 251, 130, 56, 218, 145, 2, 230, 189, 218, 145, 17, 195, - 79, 218, 145, 17, 98, 218, 145, 17, 103, 218, 145, 17, 135, 218, 145, 17, - 136, 218, 145, 17, 150, 218, 145, 17, 174, 218, 145, 17, 182, 218, 145, - 17, 178, 218, 145, 17, 184, 95, 248, 12, 3, 213, 247, 95, 209, 148, 248, - 11, 95, 54, 248, 12, 3, 213, 247, 95, 201, 145, 248, 12, 3, 213, 247, 95, - 248, 12, 3, 54, 213, 247, 95, 209, 148, 248, 12, 3, 213, 247, 95, 209, - 148, 248, 12, 3, 54, 213, 247, 95, 225, 163, 248, 11, 95, 225, 163, 248, - 12, 3, 54, 213, 247, 95, 204, 19, 248, 11, 95, 204, 19, 248, 12, 3, 213, - 247, 95, 204, 19, 248, 12, 3, 54, 213, 247, 95, 200, 240, 204, 19, 248, - 12, 3, 54, 213, 247, 203, 93, 1, 63, 203, 93, 1, 252, 10, 203, 93, 1, 68, - 203, 93, 1, 226, 8, 203, 93, 1, 66, 203, 93, 1, 199, 229, 203, 93, 1, 70, - 203, 93, 1, 251, 45, 203, 93, 1, 74, 203, 93, 1, 250, 0, 203, 93, 1, 157, - 203, 93, 1, 224, 38, 203, 93, 1, 234, 4, 203, 93, 1, 233, 112, 203, 93, - 1, 216, 244, 203, 93, 1, 247, 36, 203, 93, 1, 246, 136, 203, 93, 1, 225, - 105, 203, 93, 1, 225, 71, 203, 93, 1, 215, 34, 203, 93, 1, 201, 58, 203, - 93, 1, 201, 46, 203, 93, 1, 239, 164, 203, 93, 1, 239, 148, 203, 93, 1, - 216, 5, 203, 93, 1, 203, 137, 203, 93, 1, 202, 202, 203, 93, 1, 240, 3, - 203, 93, 1, 239, 44, 203, 93, 1, 179, 203, 93, 1, 163, 203, 93, 1, 212, - 205, 203, 93, 1, 248, 252, 203, 93, 1, 248, 53, 203, 93, 1, 168, 203, 93, - 1, 165, 203, 93, 1, 173, 203, 93, 1, 175, 203, 93, 1, 199, 137, 203, 93, - 1, 207, 6, 203, 93, 1, 187, 203, 93, 1, 142, 203, 93, 1, 209, 135, 203, - 93, 2, 250, 155, 203, 93, 2, 198, 247, 203, 93, 18, 2, 252, 10, 203, 93, - 18, 2, 68, 203, 93, 18, 2, 226, 8, 203, 93, 18, 2, 66, 203, 93, 18, 2, - 199, 229, 203, 93, 18, 2, 70, 203, 93, 18, 2, 251, 45, 203, 93, 18, 2, - 74, 203, 93, 18, 2, 250, 0, 203, 93, 2, 198, 252, 203, 93, 2, 215, 74, - 203, 93, 17, 195, 79, 203, 93, 17, 98, 203, 93, 17, 103, 203, 93, 17, - 135, 203, 93, 17, 136, 203, 93, 17, 150, 203, 93, 17, 174, 203, 93, 17, - 182, 203, 93, 17, 178, 203, 93, 17, 184, 251, 49, 1, 157, 251, 49, 1, - 224, 38, 251, 49, 1, 216, 244, 251, 49, 1, 179, 251, 49, 1, 203, 137, - 251, 49, 1, 250, 233, 203, 137, 251, 49, 1, 163, 251, 49, 1, 212, 205, - 251, 49, 1, 248, 252, 251, 49, 1, 168, 251, 49, 1, 225, 105, 251, 49, 1, - 246, 136, 251, 49, 1, 202, 202, 251, 49, 1, 173, 251, 49, 1, 175, 251, - 49, 1, 187, 251, 49, 1, 215, 34, 251, 49, 1, 142, 251, 49, 1, 63, 251, - 49, 1, 240, 3, 251, 49, 1, 239, 44, 251, 49, 1, 234, 4, 251, 49, 1, 250, - 233, 234, 4, 251, 49, 1, 233, 112, 251, 49, 1, 248, 53, 251, 49, 1, 225, - 71, 251, 49, 1, 250, 233, 248, 252, 251, 49, 105, 2, 194, 194, 175, 251, - 49, 105, 2, 194, 194, 173, 251, 49, 105, 2, 194, 194, 221, 254, 173, 251, - 49, 18, 2, 63, 251, 49, 18, 2, 252, 10, 251, 49, 18, 2, 68, 251, 49, 18, - 2, 226, 8, 251, 49, 18, 2, 66, 251, 49, 18, 2, 199, 229, 251, 49, 18, 2, - 70, 251, 49, 18, 2, 249, 234, 251, 49, 18, 2, 74, 251, 49, 18, 2, 251, - 45, 251, 49, 18, 2, 250, 225, 251, 49, 2, 223, 227, 251, 49, 17, 195, 79, - 251, 49, 17, 98, 251, 49, 17, 103, 251, 49, 17, 135, 251, 49, 17, 136, - 251, 49, 17, 150, 251, 49, 17, 174, 251, 49, 17, 182, 251, 49, 17, 178, - 251, 49, 17, 184, 251, 49, 35, 202, 248, 251, 49, 35, 200, 214, 251, 49, - 2, 4, 208, 88, 251, 49, 2, 208, 88, 251, 49, 2, 209, 80, 251, 49, 16, - 199, 23, 238, 142, 1, 63, 238, 142, 1, 252, 10, 238, 142, 1, 68, 238, - 142, 1, 226, 8, 238, 142, 1, 66, 238, 142, 1, 199, 229, 238, 142, 1, 70, - 238, 142, 1, 251, 45, 238, 142, 1, 74, 238, 142, 1, 250, 0, 238, 142, 1, - 157, 238, 142, 1, 224, 38, 238, 142, 1, 234, 4, 238, 142, 1, 233, 112, - 238, 142, 1, 216, 244, 238, 142, 1, 247, 36, 238, 142, 1, 246, 136, 238, - 142, 1, 225, 105, 238, 142, 1, 225, 71, 238, 142, 1, 215, 34, 238, 142, - 1, 201, 58, 238, 142, 1, 201, 46, 238, 142, 1, 239, 164, 238, 142, 1, - 239, 148, 238, 142, 1, 216, 5, 238, 142, 1, 203, 137, 238, 142, 1, 202, - 202, 238, 142, 1, 240, 3, 238, 142, 1, 239, 44, 238, 142, 1, 179, 238, - 142, 1, 163, 238, 142, 1, 212, 205, 238, 142, 1, 248, 252, 238, 142, 1, - 248, 53, 238, 142, 1, 168, 238, 142, 1, 165, 238, 142, 1, 173, 238, 142, - 1, 175, 238, 142, 1, 199, 137, 238, 142, 1, 207, 6, 238, 142, 1, 205, 43, - 238, 142, 1, 187, 238, 142, 1, 142, 238, 142, 1, 209, 135, 238, 142, 18, - 2, 252, 10, 238, 142, 18, 2, 68, 238, 142, 18, 2, 226, 8, 238, 142, 18, - 2, 66, 238, 142, 18, 2, 199, 229, 238, 142, 18, 2, 111, 143, 238, 142, - 18, 2, 111, 209, 136, 238, 142, 18, 2, 70, 238, 142, 18, 2, 251, 45, 238, - 142, 18, 2, 74, 238, 142, 18, 2, 250, 0, 238, 142, 2, 250, 155, 238, 142, - 2, 198, 247, 238, 142, 2, 198, 252, 238, 142, 2, 215, 74, 238, 142, 251, - 130, 56, 197, 131, 244, 100, 6, 1, 216, 243, 197, 131, 244, 100, 6, 1, - 63, 197, 131, 244, 100, 6, 1, 197, 64, 197, 131, 244, 100, 6, 1, 195, - 215, 197, 131, 244, 100, 6, 1, 165, 197, 131, 244, 100, 6, 1, 196, 0, - 197, 131, 244, 100, 6, 1, 226, 8, 197, 131, 244, 100, 6, 1, 199, 229, - 197, 131, 244, 100, 6, 1, 70, 197, 131, 244, 100, 6, 1, 74, 197, 131, - 244, 100, 6, 1, 250, 199, 197, 131, 244, 100, 6, 1, 234, 4, 197, 131, - 244, 100, 6, 1, 223, 165, 197, 131, 244, 100, 6, 1, 236, 70, 197, 131, - 244, 100, 6, 1, 195, 195, 197, 131, 244, 100, 6, 1, 200, 88, 197, 131, - 244, 100, 6, 1, 236, 89, 197, 131, 244, 100, 6, 1, 214, 94, 197, 131, - 244, 100, 6, 1, 201, 53, 197, 131, 244, 100, 6, 1, 215, 60, 197, 131, - 244, 100, 6, 1, 240, 3, 197, 131, 244, 100, 6, 1, 250, 18, 197, 131, 244, - 100, 6, 1, 250, 225, 197, 131, 244, 100, 6, 1, 247, 138, 197, 131, 244, - 100, 6, 1, 211, 175, 197, 131, 244, 100, 6, 1, 231, 173, 197, 131, 244, - 100, 6, 1, 231, 61, 197, 131, 244, 100, 6, 1, 230, 244, 197, 131, 244, - 100, 6, 1, 232, 60, 197, 131, 244, 100, 6, 1, 204, 250, 197, 131, 244, - 100, 6, 1, 206, 41, 197, 131, 244, 100, 6, 1, 198, 238, 197, 131, 244, - 100, 4, 1, 216, 243, 197, 131, 244, 100, 4, 1, 63, 197, 131, 244, 100, 4, - 1, 197, 64, 197, 131, 244, 100, 4, 1, 195, 215, 197, 131, 244, 100, 4, 1, - 165, 197, 131, 244, 100, 4, 1, 196, 0, 197, 131, 244, 100, 4, 1, 226, 8, - 197, 131, 244, 100, 4, 1, 199, 229, 197, 131, 244, 100, 4, 1, 70, 197, - 131, 244, 100, 4, 1, 74, 197, 131, 244, 100, 4, 1, 250, 199, 197, 131, - 244, 100, 4, 1, 234, 4, 197, 131, 244, 100, 4, 1, 223, 165, 197, 131, - 244, 100, 4, 1, 236, 70, 197, 131, 244, 100, 4, 1, 195, 195, 197, 131, - 244, 100, 4, 1, 200, 88, 197, 131, 244, 100, 4, 1, 236, 89, 197, 131, - 244, 100, 4, 1, 214, 94, 197, 131, 244, 100, 4, 1, 201, 53, 197, 131, - 244, 100, 4, 1, 215, 60, 197, 131, 244, 100, 4, 1, 240, 3, 197, 131, 244, - 100, 4, 1, 250, 18, 197, 131, 244, 100, 4, 1, 250, 225, 197, 131, 244, - 100, 4, 1, 247, 138, 197, 131, 244, 100, 4, 1, 211, 175, 197, 131, 244, - 100, 4, 1, 231, 173, 197, 131, 244, 100, 4, 1, 231, 61, 197, 131, 244, - 100, 4, 1, 230, 244, 197, 131, 244, 100, 4, 1, 232, 60, 197, 131, 244, - 100, 4, 1, 204, 250, 197, 131, 244, 100, 4, 1, 206, 41, 197, 131, 244, - 100, 4, 1, 198, 238, 197, 131, 244, 100, 17, 195, 79, 197, 131, 244, 100, - 17, 98, 197, 131, 244, 100, 17, 103, 197, 131, 244, 100, 17, 135, 197, - 131, 244, 100, 17, 136, 197, 131, 244, 100, 17, 150, 197, 131, 244, 100, - 17, 174, 197, 131, 244, 100, 17, 182, 197, 131, 244, 100, 17, 178, 197, - 131, 244, 100, 17, 184, 197, 131, 244, 100, 35, 202, 248, 197, 131, 244, - 100, 35, 200, 214, 197, 131, 244, 100, 35, 202, 147, 197, 131, 244, 100, - 35, 234, 151, 197, 131, 244, 100, 35, 235, 25, 197, 131, 244, 100, 35, - 205, 228, 197, 131, 244, 100, 35, 207, 21, 197, 131, 244, 100, 35, 236, - 151, 197, 131, 244, 100, 35, 216, 92, 197, 131, 244, 100, 214, 56, 195, - 101, 46, 1, 63, 195, 101, 46, 18, 2, 68, 195, 101, 46, 18, 2, 200, 81, - 195, 101, 46, 18, 2, 66, 195, 101, 46, 18, 2, 70, 195, 101, 46, 18, 2, - 214, 91, 195, 101, 46, 18, 2, 74, 195, 101, 46, 18, 2, 251, 45, 195, 101, - 46, 18, 2, 250, 0, 195, 101, 46, 18, 2, 210, 40, 68, 195, 101, 46, 18, - 222, 60, 78, 195, 101, 46, 1, 157, 195, 101, 46, 1, 224, 38, 195, 101, - 46, 1, 234, 4, 195, 101, 46, 1, 233, 112, 195, 101, 46, 1, 216, 244, 195, - 101, 46, 1, 247, 36, 195, 101, 46, 1, 246, 136, 195, 101, 46, 1, 225, - 105, 195, 101, 46, 1, 215, 34, 195, 101, 46, 1, 201, 58, 195, 101, 46, 1, - 201, 46, 195, 101, 46, 1, 239, 164, 195, 101, 46, 1, 239, 148, 195, 101, - 46, 1, 216, 5, 195, 101, 46, 1, 203, 137, 195, 101, 46, 1, 202, 202, 195, - 101, 46, 1, 240, 3, 195, 101, 46, 1, 239, 44, 195, 101, 46, 1, 179, 195, - 101, 46, 1, 163, 195, 101, 46, 1, 212, 205, 195, 101, 46, 1, 248, 252, - 195, 101, 46, 1, 248, 53, 195, 101, 46, 1, 168, 195, 101, 46, 1, 201, 93, - 195, 101, 46, 1, 201, 83, 195, 101, 46, 1, 237, 29, 195, 101, 46, 1, 237, - 23, 195, 101, 46, 1, 195, 74, 195, 101, 46, 1, 195, 114, 195, 101, 46, 1, - 255, 18, 195, 101, 46, 1, 165, 195, 101, 46, 1, 173, 195, 101, 46, 1, - 175, 195, 101, 46, 1, 199, 137, 195, 101, 46, 1, 207, 6, 195, 101, 46, 1, - 205, 43, 195, 101, 46, 1, 187, 195, 101, 46, 1, 142, 195, 101, 46, 1, - 223, 100, 195, 101, 46, 48, 105, 78, 195, 101, 46, 2, 198, 252, 195, 101, - 46, 2, 246, 251, 195, 101, 46, 2, 246, 252, 3, 213, 247, 195, 101, 46, 2, - 246, 254, 3, 213, 247, 195, 101, 46, 2, 250, 155, 195, 101, 46, 2, 198, - 247, 195, 101, 46, 244, 49, 1, 173, 195, 101, 46, 244, 50, 1, 165, 195, - 101, 46, 244, 50, 1, 173, 195, 101, 46, 244, 50, 1, 175, 195, 101, 46, - 244, 50, 1, 199, 137, 195, 101, 46, 84, 232, 23, 78, 195, 101, 46, 244, - 63, 232, 23, 78, 195, 101, 46, 113, 201, 78, 195, 101, 46, 113, 206, 254, - 195, 101, 46, 113, 54, 206, 254, 195, 101, 46, 113, 172, 201, 78, 195, - 101, 46, 84, 237, 112, 232, 23, 78, 195, 101, 46, 244, 63, 237, 112, 232, - 23, 78, 195, 101, 46, 204, 118, 205, 114, 1, 63, 205, 114, 18, 2, 68, - 205, 114, 18, 2, 200, 81, 205, 114, 18, 2, 66, 205, 114, 18, 2, 70, 205, - 114, 18, 2, 74, 205, 114, 18, 2, 214, 91, 205, 114, 18, 2, 251, 45, 205, - 114, 18, 2, 250, 0, 205, 114, 18, 2, 111, 143, 205, 114, 18, 2, 111, 158, - 205, 114, 18, 222, 60, 78, 205, 114, 1, 157, 205, 114, 1, 224, 38, 205, - 114, 1, 234, 4, 205, 114, 1, 233, 112, 205, 114, 1, 216, 244, 205, 114, - 1, 247, 36, 205, 114, 1, 246, 136, 205, 114, 1, 225, 105, 205, 114, 1, - 225, 71, 205, 114, 1, 215, 34, 205, 114, 1, 201, 58, 205, 114, 1, 201, - 46, 205, 114, 1, 239, 164, 205, 114, 1, 239, 148, 205, 114, 1, 216, 5, - 205, 114, 1, 203, 137, 205, 114, 1, 202, 202, 205, 114, 1, 240, 3, 205, - 114, 1, 239, 44, 205, 114, 1, 179, 205, 114, 1, 163, 205, 114, 1, 212, - 205, 205, 114, 1, 248, 252, 205, 114, 1, 248, 53, 205, 114, 1, 168, 205, - 114, 1, 201, 93, 205, 114, 1, 201, 83, 205, 114, 1, 237, 29, 205, 114, 1, - 195, 74, 205, 114, 1, 195, 114, 205, 114, 1, 255, 18, 205, 114, 1, 165, - 205, 114, 1, 173, 205, 114, 1, 175, 205, 114, 1, 199, 137, 205, 114, 1, - 207, 6, 205, 114, 1, 205, 43, 205, 114, 1, 187, 205, 114, 1, 142, 205, - 114, 1, 223, 100, 205, 114, 244, 49, 1, 173, 205, 114, 244, 49, 1, 175, - 205, 114, 244, 49, 1, 207, 6, 205, 114, 244, 49, 1, 187, 205, 114, 48, - 105, 2, 234, 71, 205, 114, 48, 105, 2, 224, 227, 205, 114, 48, 105, 2, - 216, 246, 205, 114, 48, 105, 2, 240, 98, 205, 114, 48, 105, 2, 217, 225, - 205, 114, 48, 105, 2, 249, 219, 205, 114, 48, 105, 2, 221, 40, 205, 114, - 48, 105, 2, 143, 205, 114, 48, 105, 2, 158, 205, 114, 48, 105, 2, 207, 8, - 205, 114, 48, 105, 2, 209, 35, 205, 114, 48, 105, 2, 255, 18, 205, 114, - 2, 250, 155, 205, 114, 2, 198, 247, 205, 114, 233, 174, 78, 205, 114, - 204, 118, 205, 114, 113, 201, 78, 205, 114, 113, 206, 254, 205, 114, 113, - 54, 206, 254, 205, 114, 113, 212, 68, 205, 114, 232, 23, 113, 3, 218, 99, - 26, 204, 79, 26, 201, 145, 234, 222, 205, 114, 232, 23, 113, 3, 218, 99, - 26, 204, 79, 26, 234, 222, 205, 114, 232, 23, 113, 3, 218, 99, 26, 204, - 78, 205, 114, 202, 234, 219, 189, 205, 114, 202, 234, 219, 188, 213, 50, - 244, 118, 232, 44, 1, 163, 213, 50, 244, 118, 232, 44, 1, 157, 213, 50, - 244, 118, 232, 44, 1, 175, 213, 50, 244, 118, 232, 44, 1, 168, 213, 50, - 244, 118, 232, 44, 1, 240, 3, 213, 50, 244, 118, 232, 44, 1, 195, 114, - 213, 50, 244, 118, 232, 44, 1, 199, 137, 213, 50, 244, 118, 232, 44, 1, - 216, 244, 213, 50, 244, 118, 232, 44, 1, 142, 213, 50, 244, 118, 232, 44, - 1, 234, 4, 213, 50, 244, 118, 232, 44, 1, 224, 38, 213, 50, 244, 118, - 232, 44, 1, 187, 213, 50, 244, 118, 232, 44, 1, 248, 252, 213, 50, 244, - 118, 232, 44, 1, 247, 36, 213, 50, 244, 118, 232, 44, 1, 203, 137, 213, - 50, 244, 118, 232, 44, 1, 202, 202, 213, 50, 244, 118, 232, 44, 1, 179, - 213, 50, 244, 118, 232, 44, 1, 212, 205, 213, 50, 244, 118, 232, 44, 1, - 173, 213, 50, 244, 118, 232, 44, 1, 235, 118, 213, 50, 244, 118, 232, 44, - 1, 246, 136, 213, 50, 244, 118, 232, 44, 1, 63, 213, 50, 244, 118, 232, - 44, 1, 70, 213, 50, 244, 118, 232, 44, 1, 68, 213, 50, 244, 118, 232, 44, - 1, 74, 213, 50, 244, 118, 232, 44, 1, 66, 213, 50, 244, 118, 232, 44, 1, - 200, 96, 213, 50, 244, 118, 232, 44, 1, 230, 98, 213, 50, 244, 118, 232, - 44, 1, 48, 213, 195, 213, 50, 244, 118, 232, 44, 1, 48, 224, 227, 213, - 50, 244, 118, 232, 44, 1, 48, 203, 185, 213, 50, 244, 118, 232, 44, 1, - 48, 221, 40, 213, 50, 244, 118, 232, 44, 1, 48, 217, 225, 213, 50, 244, - 118, 232, 44, 1, 48, 158, 213, 50, 244, 118, 232, 44, 1, 48, 197, 189, - 213, 50, 244, 118, 232, 44, 1, 48, 216, 246, 213, 50, 244, 118, 232, 44, - 1, 48, 196, 143, 213, 50, 244, 118, 232, 44, 209, 203, 154, 221, 144, - 213, 50, 244, 118, 232, 44, 209, 203, 201, 239, 213, 50, 244, 118, 232, - 44, 208, 170, 233, 34, 204, 193, 213, 50, 244, 118, 232, 44, 209, 203, - 154, 172, 235, 10, 213, 50, 244, 118, 232, 44, 209, 203, 154, 235, 10, - 213, 50, 244, 118, 232, 44, 208, 170, 233, 34, 204, 194, 235, 10, 213, - 50, 244, 118, 232, 44, 208, 170, 154, 221, 144, 213, 50, 244, 118, 232, - 44, 208, 170, 201, 239, 213, 50, 244, 118, 232, 44, 208, 170, 154, 172, - 235, 10, 213, 50, 244, 118, 232, 44, 208, 170, 154, 235, 10, 213, 50, - 244, 118, 232, 44, 218, 229, 201, 239, 213, 50, 244, 118, 232, 44, 233, - 34, 204, 194, 199, 118, 213, 50, 244, 118, 232, 44, 218, 229, 154, 172, - 235, 10, 213, 50, 244, 118, 232, 44, 218, 229, 154, 235, 10, 213, 50, - 244, 118, 232, 44, 221, 110, 154, 221, 144, 213, 50, 244, 118, 232, 44, - 221, 110, 201, 239, 213, 50, 244, 118, 232, 44, 233, 34, 204, 193, 213, - 50, 244, 118, 232, 44, 221, 110, 154, 172, 235, 10, 213, 50, 244, 118, - 232, 44, 221, 110, 154, 235, 10, 213, 50, 244, 118, 232, 44, 233, 34, - 204, 194, 235, 10, 189, 1, 63, 189, 1, 252, 10, 189, 1, 68, 189, 1, 226, - 8, 189, 1, 66, 189, 1, 199, 229, 189, 1, 111, 143, 189, 1, 111, 209, 136, - 189, 1, 111, 158, 189, 1, 70, 189, 1, 251, 45, 189, 1, 74, 189, 1, 250, - 0, 189, 1, 157, 189, 1, 224, 38, 189, 1, 234, 4, 189, 1, 233, 112, 189, - 1, 216, 244, 189, 1, 247, 36, 189, 1, 246, 136, 189, 1, 225, 105, 189, 1, - 225, 71, 189, 1, 215, 34, 189, 1, 201, 58, 189, 1, 201, 46, 189, 1, 239, - 164, 189, 1, 239, 148, 189, 1, 216, 5, 189, 1, 203, 137, 189, 1, 202, - 202, 189, 1, 240, 3, 189, 1, 239, 44, 189, 1, 179, 189, 1, 163, 189, 1, - 212, 205, 189, 1, 248, 252, 189, 1, 248, 53, 189, 1, 168, 189, 1, 165, - 189, 1, 173, 189, 1, 175, 189, 1, 199, 137, 189, 1, 207, 6, 189, 1, 205, - 43, 189, 1, 187, 189, 1, 142, 189, 18, 2, 252, 10, 189, 18, 2, 68, 189, - 18, 2, 226, 8, 189, 18, 2, 66, 189, 18, 2, 199, 229, 189, 18, 2, 111, - 143, 189, 18, 2, 111, 209, 136, 189, 18, 2, 111, 158, 189, 18, 2, 70, - 189, 18, 2, 251, 45, 189, 18, 2, 74, 189, 18, 2, 250, 0, 189, 2, 246, - 251, 189, 2, 250, 155, 189, 2, 198, 247, 189, 2, 198, 252, 189, 2, 249, - 239, 189, 239, 211, 189, 54, 239, 211, 189, 197, 3, 207, 46, 189, 233, - 224, 235, 13, 189, 233, 224, 235, 12, 189, 17, 195, 79, 189, 17, 98, 189, - 17, 103, 189, 17, 135, 189, 17, 136, 189, 17, 150, 189, 17, 174, 189, 17, - 182, 189, 17, 178, 189, 17, 184, 189, 35, 98, 189, 35, 103, 189, 35, 135, - 189, 35, 136, 189, 35, 150, 189, 35, 174, 189, 35, 182, 189, 35, 178, - 189, 35, 184, 189, 35, 202, 248, 189, 35, 200, 214, 189, 35, 202, 147, - 189, 35, 234, 151, 189, 35, 235, 25, 189, 35, 205, 228, 189, 35, 207, 21, - 189, 35, 236, 151, 189, 35, 216, 92, 189, 230, 200, 200, 33, 78, 219, - 191, 232, 23, 78, 219, 191, 113, 206, 254, 219, 191, 1, 157, 219, 191, 1, - 224, 38, 219, 191, 1, 234, 4, 219, 191, 1, 216, 244, 219, 191, 1, 247, - 36, 219, 191, 1, 246, 136, 219, 191, 1, 225, 105, 219, 191, 1, 215, 34, - 219, 191, 1, 203, 137, 219, 191, 1, 202, 202, 219, 191, 1, 240, 3, 219, - 191, 1, 179, 219, 191, 1, 163, 219, 191, 1, 212, 205, 219, 191, 1, 248, - 252, 219, 191, 1, 168, 219, 191, 1, 201, 93, 219, 191, 1, 201, 83, 219, - 191, 1, 237, 29, 219, 191, 1, 197, 156, 219, 191, 1, 195, 74, 219, 191, - 1, 195, 114, 219, 191, 1, 255, 18, 219, 191, 1, 165, 219, 191, 1, 173, - 219, 191, 1, 175, 219, 191, 1, 207, 6, 219, 191, 1, 187, 219, 191, 1, - 142, 219, 191, 1, 63, 219, 191, 204, 119, 1, 157, 219, 191, 204, 119, 1, - 224, 38, 219, 191, 204, 119, 1, 234, 4, 219, 191, 204, 119, 1, 216, 244, - 219, 191, 204, 119, 1, 247, 36, 219, 191, 204, 119, 1, 246, 136, 219, - 191, 204, 119, 1, 225, 105, 219, 191, 204, 119, 1, 215, 34, 219, 191, - 204, 119, 1, 203, 137, 219, 191, 204, 119, 1, 202, 202, 219, 191, 204, - 119, 1, 240, 3, 219, 191, 204, 119, 1, 179, 219, 191, 204, 119, 1, 163, - 219, 191, 204, 119, 1, 212, 205, 219, 191, 204, 119, 1, 248, 252, 219, - 191, 204, 119, 1, 168, 219, 191, 204, 119, 1, 201, 93, 219, 191, 204, - 119, 1, 201, 83, 219, 191, 204, 119, 1, 237, 29, 219, 191, 204, 119, 1, - 197, 156, 219, 191, 204, 119, 1, 195, 74, 219, 191, 204, 119, 1, 195, - 114, 219, 191, 204, 119, 1, 165, 219, 191, 204, 119, 1, 173, 219, 191, - 204, 119, 1, 175, 219, 191, 204, 119, 1, 207, 6, 219, 191, 204, 119, 1, - 187, 219, 191, 204, 119, 1, 142, 219, 191, 204, 119, 1, 63, 219, 191, 18, - 2, 252, 10, 219, 191, 18, 2, 68, 219, 191, 18, 2, 66, 219, 191, 18, 2, - 70, 219, 191, 18, 2, 74, 219, 191, 2, 250, 155, 219, 191, 2, 246, 251, - 219, 176, 118, 1, 63, 219, 176, 118, 1, 252, 10, 219, 176, 118, 1, 68, - 219, 176, 118, 1, 226, 8, 219, 176, 118, 1, 66, 219, 176, 118, 1, 199, - 229, 219, 176, 118, 1, 70, 219, 176, 118, 1, 251, 45, 219, 176, 118, 1, - 74, 219, 176, 118, 1, 250, 0, 219, 176, 118, 1, 157, 219, 176, 118, 1, - 224, 38, 219, 176, 118, 1, 234, 4, 219, 176, 118, 1, 233, 112, 219, 176, - 118, 1, 216, 244, 219, 176, 118, 1, 247, 36, 219, 176, 118, 1, 246, 136, - 219, 176, 118, 1, 225, 105, 219, 176, 118, 1, 225, 71, 219, 176, 118, 1, - 215, 34, 219, 176, 118, 1, 201, 58, 219, 176, 118, 1, 201, 46, 219, 176, - 118, 1, 239, 164, 219, 176, 118, 1, 239, 148, 219, 176, 118, 1, 216, 5, - 219, 176, 118, 1, 203, 137, 219, 176, 118, 1, 202, 202, 219, 176, 118, 1, - 240, 3, 219, 176, 118, 1, 239, 44, 219, 176, 118, 1, 179, 219, 176, 118, - 1, 163, 219, 176, 118, 1, 212, 205, 219, 176, 118, 1, 248, 252, 219, 176, - 118, 1, 248, 53, 219, 176, 118, 1, 168, 219, 176, 118, 1, 165, 219, 176, - 118, 1, 173, 219, 176, 118, 1, 175, 219, 176, 118, 1, 199, 137, 219, 176, - 118, 1, 207, 6, 219, 176, 118, 1, 205, 43, 219, 176, 118, 1, 187, 219, - 176, 118, 1, 142, 219, 176, 118, 1, 221, 195, 219, 176, 118, 1, 223, 100, - 219, 176, 118, 1, 225, 21, 219, 176, 118, 1, 201, 196, 219, 176, 118, 18, - 2, 252, 10, 219, 176, 118, 18, 2, 68, 219, 176, 118, 18, 2, 226, 8, 219, - 176, 118, 18, 2, 66, 219, 176, 118, 18, 2, 199, 229, 219, 176, 118, 18, - 2, 111, 143, 219, 176, 118, 18, 2, 70, 219, 176, 118, 18, 2, 251, 45, - 219, 176, 118, 18, 2, 74, 219, 176, 118, 18, 2, 250, 0, 219, 176, 118, 2, - 250, 155, 219, 176, 118, 2, 198, 247, 219, 176, 118, 2, 215, 74, 219, - 176, 118, 2, 246, 253, 219, 176, 118, 2, 232, 110, 219, 176, 118, 198, - 252, 219, 176, 118, 210, 66, 219, 176, 118, 210, 196, 219, 176, 118, 17, - 195, 79, 219, 176, 118, 17, 98, 219, 176, 118, 17, 103, 219, 176, 118, - 17, 135, 219, 176, 118, 17, 136, 219, 176, 118, 17, 150, 219, 176, 118, - 17, 174, 219, 176, 118, 17, 182, 219, 176, 118, 17, 178, 219, 176, 118, - 17, 184, 232, 193, 118, 1, 63, 232, 193, 118, 1, 252, 10, 232, 193, 118, - 1, 68, 232, 193, 118, 1, 226, 8, 232, 193, 118, 1, 66, 232, 193, 118, 1, - 199, 229, 232, 193, 118, 1, 236, 184, 232, 193, 118, 1, 251, 45, 232, - 193, 118, 1, 214, 33, 232, 193, 118, 1, 250, 0, 232, 193, 118, 1, 165, - 232, 193, 118, 1, 199, 137, 232, 193, 118, 1, 248, 252, 232, 193, 118, 1, - 248, 53, 232, 193, 118, 1, 168, 232, 193, 118, 1, 157, 232, 193, 118, 1, - 224, 38, 232, 193, 118, 1, 203, 137, 232, 193, 118, 1, 202, 202, 232, - 193, 118, 1, 175, 232, 193, 118, 1, 234, 4, 232, 193, 118, 1, 233, 112, - 232, 193, 118, 1, 240, 3, 232, 193, 118, 1, 239, 44, 232, 193, 118, 1, - 179, 232, 193, 118, 1, 247, 36, 232, 193, 118, 1, 246, 136, 232, 193, - 118, 1, 201, 58, 232, 193, 118, 1, 201, 46, 232, 193, 118, 1, 221, 195, - 232, 193, 118, 1, 225, 105, 232, 193, 118, 1, 225, 71, 232, 193, 118, 1, - 239, 164, 232, 193, 118, 1, 239, 148, 232, 193, 118, 1, 216, 244, 232, - 193, 118, 1, 163, 232, 193, 118, 1, 212, 205, 232, 193, 118, 1, 142, 232, - 193, 118, 1, 173, 232, 193, 118, 1, 187, 232, 193, 118, 18, 2, 252, 10, - 232, 193, 118, 18, 2, 68, 232, 193, 118, 18, 2, 226, 8, 232, 193, 118, - 18, 2, 66, 232, 193, 118, 18, 2, 199, 229, 232, 193, 118, 18, 2, 236, - 184, 232, 193, 118, 18, 2, 251, 45, 232, 193, 118, 18, 2, 214, 33, 232, - 193, 118, 18, 2, 250, 0, 232, 193, 118, 2, 250, 155, 232, 193, 118, 2, - 198, 247, 232, 193, 118, 198, 252, 232, 193, 118, 214, 56, 232, 193, 118, - 17, 195, 79, 232, 193, 118, 17, 98, 232, 193, 118, 17, 103, 232, 193, - 118, 17, 135, 232, 193, 118, 17, 136, 232, 193, 118, 17, 150, 232, 193, - 118, 17, 174, 232, 193, 118, 17, 182, 232, 193, 118, 17, 178, 232, 193, - 118, 17, 184, 219, 231, 1, 157, 219, 231, 1, 234, 4, 219, 231, 1, 216, - 244, 219, 231, 1, 163, 219, 231, 1, 248, 252, 219, 231, 1, 168, 219, 231, - 1, 203, 137, 219, 231, 1, 240, 3, 219, 231, 1, 179, 219, 231, 1, 247, 36, - 219, 231, 1, 225, 105, 219, 231, 1, 215, 34, 219, 231, 1, 165, 219, 231, - 1, 173, 219, 231, 1, 175, 219, 231, 1, 199, 137, 219, 231, 1, 187, 219, - 231, 1, 63, 219, 231, 250, 195, 219, 231, 18, 2, 68, 219, 231, 18, 2, 66, - 219, 231, 18, 2, 70, 219, 231, 18, 2, 74, 219, 231, 213, 61, 219, 231, - 236, 98, 77, 208, 88, 10, 2, 63, 10, 2, 39, 24, 63, 10, 2, 39, 24, 248, - 234, 10, 2, 39, 24, 233, 229, 202, 237, 10, 2, 39, 24, 142, 10, 2, 39, - 24, 226, 10, 10, 2, 39, 24, 222, 218, 232, 191, 10, 2, 39, 24, 218, 5, - 10, 2, 39, 24, 208, 212, 10, 2, 254, 19, 10, 2, 251, 217, 10, 2, 251, - 218, 24, 250, 43, 10, 2, 251, 218, 24, 237, 60, 232, 191, 10, 2, 251, - 218, 24, 233, 242, 10, 2, 251, 218, 24, 233, 229, 202, 237, 10, 2, 251, - 218, 24, 142, 10, 2, 251, 218, 24, 226, 11, 232, 191, 10, 2, 251, 218, - 24, 225, 240, 10, 2, 251, 218, 24, 222, 219, 10, 2, 251, 218, 24, 206, - 195, 10, 2, 251, 218, 24, 115, 96, 115, 96, 66, 10, 2, 251, 218, 232, - 191, 10, 2, 251, 134, 10, 2, 251, 135, 24, 248, 213, 10, 2, 251, 135, 24, - 233, 229, 202, 237, 10, 2, 251, 135, 24, 219, 115, 96, 236, 106, 10, 2, - 251, 135, 24, 207, 4, 10, 2, 251, 135, 24, 203, 97, 10, 2, 251, 106, 10, - 2, 251, 27, 10, 2, 251, 28, 24, 236, 36, 10, 2, 251, 28, 24, 206, 157, - 96, 233, 46, 10, 2, 251, 19, 10, 2, 251, 20, 24, 251, 19, 10, 2, 251, 20, - 24, 238, 229, 10, 2, 251, 20, 24, 233, 46, 10, 2, 251, 20, 24, 142, 10, - 2, 251, 20, 24, 224, 188, 10, 2, 251, 20, 24, 223, 249, 10, 2, 251, 20, - 24, 206, 211, 10, 2, 251, 20, 24, 199, 237, 10, 2, 251, 16, 10, 2, 251, - 8, 10, 2, 250, 221, 10, 2, 250, 222, 24, 206, 211, 10, 2, 250, 208, 10, - 2, 250, 209, 126, 250, 208, 10, 2, 250, 209, 122, 202, 48, 10, 2, 250, - 209, 96, 217, 149, 214, 10, 250, 209, 96, 217, 148, 10, 2, 250, 209, 96, - 217, 149, 205, 56, 10, 2, 250, 175, 10, 2, 250, 145, 10, 2, 250, 111, 10, - 2, 250, 112, 24, 223, 53, 10, 2, 250, 83, 10, 2, 250, 50, 10, 2, 250, 45, - 10, 2, 250, 46, 195, 29, 202, 237, 10, 2, 250, 46, 224, 192, 202, 237, - 10, 2, 250, 46, 126, 250, 46, 201, 9, 126, 201, 9, 201, 9, 126, 201, 9, - 213, 102, 10, 2, 250, 46, 126, 250, 46, 126, 250, 45, 10, 2, 250, 46, - 126, 250, 46, 126, 250, 46, 240, 176, 250, 46, 126, 250, 46, 126, 250, - 45, 10, 2, 250, 43, 10, 2, 250, 39, 10, 2, 248, 252, 10, 2, 248, 234, 10, - 2, 248, 228, 10, 2, 248, 220, 10, 2, 248, 214, 10, 2, 248, 215, 126, 248, - 214, 10, 2, 248, 213, 10, 2, 153, 10, 2, 248, 189, 10, 2, 248, 41, 10, 2, - 248, 42, 24, 63, 10, 2, 248, 42, 24, 233, 220, 10, 2, 248, 42, 24, 226, - 11, 232, 191, 10, 2, 247, 138, 10, 2, 247, 139, 126, 247, 139, 251, 217, - 10, 2, 247, 139, 126, 247, 139, 200, 55, 10, 2, 247, 139, 240, 176, 247, - 138, 10, 2, 247, 116, 10, 2, 247, 117, 126, 247, 116, 10, 2, 247, 105, - 10, 2, 247, 104, 10, 2, 240, 3, 10, 2, 239, 249, 10, 2, 239, 250, 223, - 209, 24, 39, 96, 219, 174, 10, 2, 239, 250, 223, 209, 24, 250, 221, 10, - 2, 239, 250, 223, 209, 24, 248, 213, 10, 2, 239, 250, 223, 209, 24, 248, - 41, 10, 2, 239, 250, 223, 209, 24, 234, 4, 10, 2, 239, 250, 223, 209, 24, - 234, 5, 96, 219, 174, 10, 2, 239, 250, 223, 209, 24, 233, 74, 10, 2, 239, - 250, 223, 209, 24, 233, 55, 10, 2, 239, 250, 223, 209, 24, 232, 203, 10, - 2, 239, 250, 223, 209, 24, 142, 10, 2, 239, 250, 223, 209, 24, 225, 148, - 10, 2, 239, 250, 223, 209, 24, 225, 149, 96, 221, 95, 10, 2, 239, 250, - 223, 209, 24, 224, 173, 10, 2, 239, 250, 223, 209, 24, 175, 10, 2, 239, - 250, 223, 209, 24, 221, 95, 10, 2, 239, 250, 223, 209, 24, 221, 96, 96, - 219, 173, 10, 2, 239, 250, 223, 209, 24, 221, 78, 10, 2, 239, 250, 223, - 209, 24, 217, 34, 10, 2, 239, 250, 223, 209, 24, 213, 103, 96, 213, 102, - 10, 2, 239, 250, 223, 209, 24, 206, 69, 10, 2, 239, 250, 223, 209, 24, - 203, 97, 10, 2, 239, 250, 223, 209, 24, 200, 98, 96, 233, 55, 10, 2, 239, - 250, 223, 209, 24, 199, 237, 10, 2, 239, 221, 10, 2, 239, 198, 10, 2, - 239, 197, 10, 2, 239, 196, 10, 2, 239, 20, 10, 2, 239, 2, 10, 2, 238, - 231, 10, 2, 238, 232, 24, 206, 211, 10, 2, 238, 229, 10, 2, 238, 219, 10, - 2, 238, 220, 224, 133, 115, 232, 192, 238, 199, 10, 2, 238, 199, 10, 2, - 237, 74, 10, 2, 237, 75, 126, 237, 74, 10, 2, 237, 75, 232, 191, 10, 2, - 237, 75, 206, 192, 10, 2, 237, 72, 10, 2, 237, 73, 24, 236, 17, 10, 2, - 237, 71, 10, 2, 237, 68, 10, 2, 237, 67, 10, 2, 237, 66, 10, 2, 237, 61, - 10, 2, 237, 59, 10, 2, 237, 60, 232, 191, 10, 2, 237, 60, 232, 192, 232, - 191, 10, 2, 237, 58, 10, 2, 237, 51, 10, 2, 70, 10, 2, 237, 10, 24, 213, - 102, 10, 2, 237, 10, 126, 237, 10, 215, 64, 126, 215, 63, 10, 2, 236, - 213, 10, 2, 236, 214, 24, 39, 96, 232, 143, 96, 240, 3, 10, 2, 236, 214, - 24, 233, 220, 10, 2, 236, 214, 24, 218, 243, 10, 2, 236, 214, 24, 208, - 196, 10, 2, 236, 214, 24, 206, 211, 10, 2, 236, 214, 24, 66, 10, 2, 236, - 186, 10, 2, 236, 174, 10, 2, 236, 138, 10, 2, 236, 106, 10, 2, 236, 107, - 24, 233, 228, 10, 2, 236, 107, 24, 233, 229, 202, 237, 10, 2, 236, 107, - 24, 219, 114, 10, 2, 236, 107, 240, 176, 236, 106, 10, 2, 236, 107, 214, - 10, 236, 106, 10, 2, 236, 107, 205, 56, 10, 2, 236, 39, 10, 2, 236, 36, - 10, 2, 236, 17, 10, 2, 235, 189, 10, 2, 235, 190, 24, 63, 10, 2, 235, - 190, 24, 39, 96, 222, 152, 10, 2, 235, 190, 24, 39, 96, 222, 153, 24, - 222, 152, 10, 2, 235, 190, 24, 250, 208, 10, 2, 235, 190, 24, 248, 234, - 10, 2, 235, 190, 24, 237, 60, 232, 191, 10, 2, 235, 190, 24, 237, 60, - 232, 192, 232, 191, 10, 2, 235, 190, 24, 142, 10, 2, 235, 190, 24, 232, - 143, 232, 191, 10, 2, 235, 190, 24, 226, 11, 232, 191, 10, 2, 235, 190, - 24, 224, 132, 10, 2, 235, 190, 24, 224, 133, 205, 56, 10, 2, 235, 190, - 24, 223, 77, 10, 2, 235, 190, 24, 175, 10, 2, 235, 190, 24, 222, 153, 24, - 222, 152, 10, 2, 235, 190, 24, 222, 11, 10, 2, 235, 190, 24, 221, 95, 10, - 2, 235, 190, 24, 200, 97, 10, 2, 235, 190, 24, 200, 86, 10, 2, 234, 4, - 10, 2, 234, 5, 232, 191, 10, 2, 234, 2, 10, 2, 234, 3, 24, 39, 96, 240, - 4, 96, 142, 10, 2, 234, 3, 24, 39, 96, 142, 10, 2, 234, 3, 24, 39, 96, - 226, 10, 10, 2, 234, 3, 24, 251, 135, 202, 238, 96, 203, 122, 10, 2, 234, - 3, 24, 250, 208, 10, 2, 234, 3, 24, 250, 45, 10, 2, 234, 3, 24, 250, 44, - 96, 233, 242, 10, 2, 234, 3, 24, 248, 234, 10, 2, 234, 3, 24, 248, 190, - 96, 173, 10, 2, 234, 3, 24, 247, 105, 10, 2, 234, 3, 24, 247, 106, 96, - 173, 10, 2, 234, 3, 24, 240, 3, 10, 2, 234, 3, 24, 239, 20, 10, 2, 234, - 3, 24, 238, 232, 24, 206, 211, 10, 2, 234, 3, 24, 237, 72, 10, 2, 234, 3, - 24, 236, 138, 10, 2, 234, 3, 24, 236, 139, 96, 175, 10, 2, 234, 3, 24, - 236, 106, 10, 2, 234, 3, 24, 236, 107, 24, 233, 229, 202, 237, 10, 2, - 234, 3, 24, 233, 229, 202, 237, 10, 2, 234, 3, 24, 233, 220, 10, 2, 234, - 3, 24, 233, 74, 10, 2, 234, 3, 24, 233, 72, 10, 2, 234, 3, 24, 233, 73, - 96, 63, 10, 2, 234, 3, 24, 233, 56, 96, 204, 139, 10, 2, 234, 3, 24, 232, - 143, 96, 221, 96, 96, 236, 17, 10, 2, 234, 3, 24, 232, 111, 10, 2, 234, - 3, 24, 232, 112, 96, 175, 10, 2, 234, 3, 24, 231, 215, 96, 222, 11, 10, - 2, 234, 3, 24, 230, 211, 10, 2, 234, 3, 24, 226, 11, 232, 191, 10, 2, - 234, 3, 24, 225, 134, 96, 230, 220, 96, 250, 45, 10, 2, 234, 3, 24, 224, - 173, 10, 2, 234, 3, 24, 224, 132, 10, 2, 234, 3, 24, 223, 235, 10, 2, - 234, 3, 24, 223, 236, 96, 222, 152, 10, 2, 234, 3, 24, 223, 78, 96, 250, - 208, 10, 2, 234, 3, 24, 175, 10, 2, 234, 3, 24, 219, 115, 96, 236, 106, - 10, 2, 234, 3, 24, 218, 243, 10, 2, 234, 3, 24, 215, 63, 10, 2, 234, 3, - 24, 215, 64, 126, 215, 63, 10, 2, 234, 3, 24, 163, 10, 2, 234, 3, 24, - 208, 196, 10, 2, 234, 3, 24, 208, 160, 10, 2, 234, 3, 24, 206, 211, 10, - 2, 234, 3, 24, 206, 212, 96, 200, 247, 10, 2, 234, 3, 24, 206, 177, 10, - 2, 234, 3, 24, 204, 84, 10, 2, 234, 3, 24, 203, 97, 10, 2, 234, 3, 24, - 66, 10, 2, 234, 3, 24, 200, 86, 10, 2, 234, 3, 24, 200, 87, 96, 237, 74, - 10, 2, 234, 3, 126, 234, 2, 10, 2, 233, 253, 10, 2, 233, 254, 240, 176, - 233, 253, 10, 2, 233, 251, 10, 2, 233, 252, 126, 233, 252, 233, 221, 126, - 233, 220, 10, 2, 233, 242, 10, 2, 233, 243, 233, 252, 126, 233, 252, 233, - 221, 126, 233, 220, 10, 2, 233, 241, 10, 2, 233, 239, 10, 2, 233, 230, - 10, 2, 233, 228, 10, 2, 233, 229, 202, 237, 10, 2, 233, 229, 126, 233, - 228, 10, 2, 233, 229, 240, 176, 233, 228, 10, 2, 233, 220, 10, 2, 233, - 219, 10, 2, 233, 214, 10, 2, 233, 155, 10, 2, 233, 156, 24, 223, 53, 10, - 2, 233, 74, 10, 2, 233, 75, 24, 70, 10, 2, 233, 75, 24, 66, 10, 2, 233, - 75, 240, 176, 233, 74, 10, 2, 233, 72, 10, 2, 233, 73, 126, 233, 72, 10, - 2, 233, 73, 240, 176, 233, 72, 10, 2, 233, 69, 10, 2, 233, 55, 10, 2, - 233, 56, 232, 191, 10, 2, 233, 53, 10, 2, 233, 54, 24, 39, 96, 226, 10, - 10, 2, 233, 54, 24, 233, 229, 202, 237, 10, 2, 233, 54, 24, 226, 10, 10, - 2, 233, 54, 24, 221, 96, 96, 226, 10, 10, 2, 233, 54, 24, 163, 10, 2, - 233, 48, 10, 2, 233, 46, 10, 2, 233, 47, 240, 176, 233, 46, 10, 2, 233, - 47, 24, 248, 234, 10, 2, 233, 47, 24, 203, 97, 10, 2, 233, 47, 202, 237, - 10, 2, 232, 214, 10, 2, 232, 215, 240, 176, 232, 214, 10, 2, 232, 212, - 10, 2, 232, 213, 24, 224, 173, 10, 2, 232, 213, 24, 224, 174, 24, 226, - 11, 232, 191, 10, 2, 232, 213, 24, 215, 63, 10, 2, 232, 213, 24, 208, - 197, 96, 201, 8, 10, 2, 232, 213, 232, 191, 10, 2, 232, 203, 10, 2, 232, - 204, 24, 39, 96, 223, 53, 10, 2, 232, 204, 24, 223, 53, 10, 2, 232, 204, - 126, 232, 204, 221, 86, 10, 2, 232, 196, 10, 2, 232, 194, 10, 2, 232, - 195, 24, 206, 211, 10, 2, 232, 185, 10, 2, 232, 184, 10, 2, 232, 180, 10, - 2, 232, 179, 10, 2, 142, 10, 2, 232, 143, 202, 237, 10, 2, 232, 143, 232, - 191, 10, 2, 232, 111, 10, 2, 231, 214, 10, 2, 231, 215, 24, 250, 45, 10, - 2, 231, 215, 24, 250, 43, 10, 2, 231, 215, 24, 248, 234, 10, 2, 231, 215, - 24, 238, 199, 10, 2, 231, 215, 24, 233, 251, 10, 2, 231, 215, 24, 223, - 225, 10, 2, 231, 215, 24, 215, 63, 10, 2, 231, 215, 24, 206, 211, 10, 2, - 231, 215, 24, 66, 10, 2, 230, 219, 10, 2, 230, 211, 10, 2, 230, 212, 24, - 250, 208, 10, 2, 230, 212, 24, 232, 111, 10, 2, 230, 212, 24, 224, 132, - 10, 2, 230, 212, 24, 221, 211, 10, 2, 230, 212, 24, 200, 86, 10, 2, 230, - 207, 10, 2, 68, 10, 2, 230, 137, 63, 10, 2, 230, 93, 10, 2, 226, 38, 10, - 2, 226, 39, 126, 226, 39, 247, 105, 10, 2, 226, 39, 126, 226, 39, 205, - 56, 10, 2, 226, 13, 10, 2, 226, 10, 10, 2, 226, 11, 239, 2, 10, 2, 226, - 11, 210, 23, 10, 2, 226, 11, 126, 226, 11, 206, 161, 126, 206, 161, 200, - 87, 126, 200, 86, 10, 2, 226, 11, 232, 191, 10, 2, 226, 2, 10, 2, 226, 3, - 24, 233, 229, 202, 237, 10, 2, 226, 1, 10, 2, 225, 247, 10, 2, 225, 248, - 24, 203, 97, 10, 2, 225, 248, 240, 176, 225, 247, 10, 2, 225, 248, 214, - 10, 225, 247, 10, 2, 225, 248, 205, 56, 10, 2, 225, 240, 10, 2, 225, 230, - 10, 2, 225, 148, 10, 2, 225, 133, 10, 2, 157, 10, 2, 224, 217, 24, 63, - 10, 2, 224, 217, 24, 251, 106, 10, 2, 224, 217, 24, 251, 107, 96, 223, - 77, 10, 2, 224, 217, 24, 250, 43, 10, 2, 224, 217, 24, 248, 234, 10, 2, - 224, 217, 24, 248, 213, 10, 2, 224, 217, 24, 153, 10, 2, 224, 217, 24, - 248, 41, 10, 2, 224, 217, 24, 236, 36, 10, 2, 224, 217, 24, 236, 17, 10, - 2, 224, 217, 24, 234, 4, 10, 2, 224, 217, 24, 233, 242, 10, 2, 224, 217, - 24, 233, 229, 202, 237, 10, 2, 224, 217, 24, 233, 220, 10, 2, 224, 217, - 24, 233, 221, 96, 207, 5, 96, 63, 10, 2, 224, 217, 24, 233, 74, 10, 2, - 224, 217, 24, 233, 55, 10, 2, 224, 217, 24, 233, 47, 96, 208, 160, 10, 2, - 224, 217, 24, 233, 47, 240, 176, 233, 46, 10, 2, 224, 217, 24, 232, 214, - 10, 2, 224, 217, 24, 232, 184, 10, 2, 224, 217, 24, 226, 10, 10, 2, 224, - 217, 24, 225, 247, 10, 2, 224, 217, 24, 224, 173, 10, 2, 224, 217, 24, - 223, 249, 10, 2, 224, 217, 24, 223, 235, 10, 2, 224, 217, 24, 222, 11, - 10, 2, 224, 217, 24, 221, 95, 10, 2, 224, 217, 24, 219, 114, 10, 2, 224, - 217, 24, 219, 115, 96, 237, 74, 10, 2, 224, 217, 24, 219, 115, 96, 233, - 74, 10, 2, 224, 217, 24, 219, 115, 96, 203, 36, 10, 2, 224, 217, 24, 218, - 243, 10, 2, 224, 217, 24, 218, 244, 96, 215, 58, 10, 2, 224, 217, 24, - 217, 34, 10, 2, 224, 217, 24, 215, 63, 10, 2, 224, 217, 24, 212, 163, 10, - 2, 224, 217, 24, 209, 95, 10, 2, 224, 217, 24, 187, 10, 2, 224, 217, 24, - 208, 160, 10, 2, 224, 217, 24, 207, 6, 10, 2, 224, 217, 24, 206, 211, 10, - 2, 224, 217, 24, 206, 177, 10, 2, 224, 217, 24, 206, 108, 10, 2, 224, - 217, 24, 206, 48, 10, 2, 224, 217, 24, 204, 93, 10, 2, 224, 217, 24, 203, - 69, 10, 2, 224, 217, 24, 66, 10, 2, 224, 217, 24, 200, 97, 10, 2, 224, - 217, 24, 200, 86, 10, 2, 224, 217, 24, 200, 58, 24, 163, 10, 2, 224, 217, - 24, 199, 237, 10, 2, 224, 217, 24, 195, 33, 10, 2, 224, 203, 10, 2, 224, - 204, 240, 176, 224, 203, 10, 2, 224, 193, 10, 2, 224, 190, 10, 2, 224, - 188, 10, 2, 224, 187, 10, 2, 224, 185, 10, 2, 224, 186, 126, 224, 185, - 10, 2, 224, 173, 10, 2, 224, 174, 24, 226, 11, 232, 191, 10, 2, 224, 169, - 10, 2, 224, 170, 24, 248, 234, 10, 2, 224, 170, 240, 176, 224, 169, 10, - 2, 224, 167, 10, 2, 224, 166, 10, 2, 224, 132, 10, 2, 224, 133, 222, 220, - 24, 115, 126, 222, 220, 24, 66, 10, 2, 224, 133, 126, 224, 133, 222, 220, - 24, 115, 126, 222, 220, 24, 66, 10, 2, 224, 65, 10, 2, 223, 249, 10, 2, - 223, 250, 24, 248, 234, 10, 2, 223, 250, 24, 66, 10, 2, 223, 250, 24, - 200, 86, 10, 2, 223, 235, 10, 2, 223, 225, 10, 2, 223, 211, 10, 2, 223, - 210, 10, 2, 223, 208, 10, 2, 223, 209, 126, 223, 208, 10, 2, 223, 86, 10, - 2, 223, 87, 126, 231, 215, 24, 250, 44, 223, 87, 126, 231, 215, 24, 250, - 43, 10, 2, 223, 77, 10, 2, 223, 75, 10, 2, 223, 76, 199, 119, 20, 10, 2, - 223, 74, 10, 2, 223, 66, 10, 2, 223, 67, 232, 191, 10, 2, 223, 65, 10, 2, - 223, 53, 10, 2, 223, 54, 214, 10, 223, 53, 10, 2, 223, 47, 10, 2, 223, - 25, 10, 2, 175, 10, 2, 222, 219, 10, 2, 222, 220, 24, 63, 10, 2, 222, - 220, 24, 39, 96, 240, 4, 96, 142, 10, 2, 222, 220, 24, 39, 96, 233, 220, - 10, 2, 222, 220, 24, 39, 96, 222, 152, 10, 2, 222, 220, 24, 251, 19, 10, - 2, 222, 220, 24, 250, 208, 10, 2, 222, 220, 24, 250, 46, 195, 29, 202, - 237, 10, 2, 222, 220, 24, 248, 234, 10, 2, 222, 220, 24, 248, 41, 10, 2, - 222, 220, 24, 239, 198, 10, 2, 222, 220, 24, 236, 106, 10, 2, 222, 220, - 24, 234, 4, 10, 2, 222, 220, 24, 233, 220, 10, 2, 222, 220, 24, 232, 203, - 10, 2, 222, 220, 24, 232, 204, 96, 232, 203, 10, 2, 222, 220, 24, 142, - 10, 2, 222, 220, 24, 232, 111, 10, 2, 222, 220, 24, 231, 215, 24, 215, - 63, 10, 2, 222, 220, 24, 226, 11, 232, 191, 10, 2, 222, 220, 24, 225, - 247, 10, 2, 222, 220, 24, 225, 248, 96, 142, 10, 2, 222, 220, 24, 225, - 248, 96, 221, 95, 10, 2, 222, 220, 24, 223, 249, 10, 2, 222, 220, 24, - 223, 225, 10, 2, 222, 220, 24, 223, 77, 10, 2, 222, 220, 24, 223, 66, 10, - 2, 222, 220, 24, 223, 67, 96, 231, 215, 96, 63, 10, 2, 222, 220, 24, 222, - 219, 10, 2, 222, 220, 24, 221, 211, 10, 2, 222, 220, 24, 221, 95, 10, 2, - 222, 220, 24, 221, 80, 10, 2, 222, 220, 24, 219, 114, 10, 2, 222, 220, - 24, 219, 115, 96, 236, 106, 10, 2, 222, 220, 24, 218, 5, 10, 2, 222, 220, - 24, 217, 34, 10, 2, 222, 220, 24, 206, 212, 96, 204, 84, 10, 2, 222, 220, - 24, 206, 157, 96, 233, 47, 96, 236, 36, 10, 2, 222, 220, 24, 206, 157, - 96, 233, 47, 202, 237, 10, 2, 222, 220, 24, 206, 106, 10, 2, 222, 220, - 24, 206, 107, 96, 206, 106, 10, 2, 222, 220, 24, 204, 84, 10, 2, 222, - 220, 24, 203, 111, 10, 2, 222, 220, 24, 203, 97, 10, 2, 222, 220, 24, - 203, 37, 96, 39, 96, 204, 140, 96, 179, 10, 2, 222, 220, 24, 66, 10, 2, - 222, 220, 24, 115, 96, 63, 10, 2, 222, 220, 24, 115, 96, 115, 96, 66, 10, - 2, 222, 220, 24, 200, 98, 96, 250, 45, 10, 2, 222, 220, 24, 200, 86, 10, - 2, 222, 220, 24, 199, 237, 10, 2, 222, 220, 205, 56, 10, 2, 222, 217, 10, - 2, 222, 218, 24, 206, 211, 10, 2, 222, 218, 24, 206, 212, 96, 204, 84, - 10, 2, 222, 218, 232, 191, 10, 2, 222, 218, 232, 192, 126, 222, 218, 232, - 192, 206, 211, 10, 2, 222, 213, 10, 2, 222, 152, 10, 2, 222, 153, 24, - 222, 152, 10, 2, 222, 150, 10, 2, 222, 151, 24, 223, 53, 10, 2, 222, 151, - 24, 223, 54, 96, 209, 95, 10, 2, 222, 11, 10, 2, 221, 248, 10, 2, 221, - 236, 10, 2, 221, 211, 10, 2, 221, 95, 10, 2, 221, 96, 24, 248, 234, 10, - 2, 221, 93, 10, 2, 221, 94, 24, 251, 19, 10, 2, 221, 94, 24, 248, 234, - 10, 2, 221, 94, 24, 236, 17, 10, 2, 221, 94, 24, 236, 18, 202, 237, 10, - 2, 221, 94, 24, 233, 229, 202, 237, 10, 2, 221, 94, 24, 231, 215, 24, - 248, 234, 10, 2, 221, 94, 24, 225, 247, 10, 2, 221, 94, 24, 224, 190, 10, - 2, 221, 94, 24, 224, 188, 10, 2, 221, 94, 24, 224, 189, 96, 250, 45, 10, - 2, 221, 94, 24, 223, 249, 10, 2, 221, 94, 24, 222, 240, 96, 250, 45, 10, - 2, 221, 94, 24, 222, 219, 10, 2, 221, 94, 24, 219, 115, 96, 236, 106, 10, - 2, 221, 94, 24, 217, 34, 10, 2, 221, 94, 24, 215, 111, 10, 2, 221, 94, - 24, 206, 70, 96, 250, 45, 10, 2, 221, 94, 24, 206, 40, 96, 247, 138, 10, - 2, 221, 94, 24, 201, 8, 10, 2, 221, 94, 202, 237, 10, 2, 221, 94, 240, - 176, 221, 93, 10, 2, 221, 94, 214, 10, 221, 93, 10, 2, 221, 94, 205, 56, - 10, 2, 221, 94, 206, 192, 10, 2, 221, 92, 10, 2, 221, 86, 10, 2, 221, 87, - 126, 221, 86, 10, 2, 221, 87, 214, 10, 221, 86, 10, 2, 221, 87, 206, 192, - 10, 2, 221, 83, 10, 2, 221, 80, 10, 2, 221, 78, 10, 2, 221, 79, 126, 221, - 78, 10, 2, 221, 79, 126, 221, 79, 233, 221, 126, 233, 220, 10, 2, 168, - 10, 2, 220, 32, 24, 203, 97, 10, 2, 220, 32, 232, 191, 10, 2, 220, 24, - 10, 2, 219, 249, 10, 2, 219, 198, 10, 2, 219, 174, 10, 2, 219, 173, 10, - 2, 219, 114, 10, 2, 219, 60, 10, 2, 218, 243, 10, 2, 218, 188, 10, 2, - 218, 56, 10, 2, 218, 57, 126, 218, 56, 10, 2, 218, 41, 10, 2, 218, 42, - 232, 191, 10, 2, 218, 23, 10, 2, 218, 9, 10, 2, 218, 5, 10, 2, 218, 6, - 24, 63, 10, 2, 218, 6, 24, 223, 53, 10, 2, 218, 6, 24, 195, 114, 10, 2, - 218, 6, 126, 218, 5, 10, 2, 218, 6, 126, 218, 6, 24, 39, 96, 179, 10, 2, - 218, 6, 240, 176, 218, 5, 10, 2, 218, 3, 10, 2, 218, 4, 24, 63, 10, 2, - 218, 4, 24, 39, 96, 239, 20, 10, 2, 218, 4, 24, 239, 20, 10, 2, 218, 4, - 232, 191, 10, 2, 179, 10, 2, 217, 161, 10, 2, 217, 148, 10, 2, 217, 149, - 225, 162, 10, 2, 217, 149, 24, 206, 109, 202, 237, 10, 2, 217, 149, 214, - 10, 217, 148, 10, 2, 217, 147, 10, 2, 217, 140, 215, 49, 10, 2, 217, 139, - 10, 2, 217, 138, 10, 2, 217, 34, 10, 2, 217, 35, 24, 63, 10, 2, 217, 35, - 24, 200, 86, 10, 2, 217, 35, 206, 192, 10, 2, 216, 141, 10, 2, 216, 142, - 24, 70, 10, 2, 216, 132, 10, 2, 216, 102, 10, 2, 216, 103, 24, 233, 229, - 202, 237, 10, 2, 216, 103, 24, 233, 221, 96, 233, 229, 202, 237, 10, 2, - 216, 98, 10, 2, 216, 99, 24, 250, 208, 10, 2, 216, 99, 24, 250, 45, 10, - 2, 216, 99, 24, 250, 46, 96, 250, 45, 10, 2, 216, 99, 24, 232, 203, 10, - 2, 216, 99, 24, 219, 115, 96, 233, 229, 202, 237, 10, 2, 216, 99, 24, - 217, 34, 10, 2, 216, 99, 24, 215, 63, 10, 2, 216, 99, 24, 206, 211, 10, - 2, 216, 99, 24, 206, 212, 96, 39, 250, 208, 10, 2, 216, 99, 24, 206, 212, - 96, 250, 45, 10, 2, 216, 99, 24, 206, 212, 96, 250, 46, 96, 250, 45, 10, - 2, 216, 99, 24, 200, 98, 96, 250, 45, 10, 2, 216, 99, 24, 199, 237, 10, - 2, 216, 87, 10, 2, 215, 111, 10, 2, 215, 80, 10, 2, 215, 63, 10, 2, 215, - 64, 222, 218, 24, 233, 220, 10, 2, 215, 64, 222, 218, 24, 219, 174, 10, - 2, 215, 64, 222, 218, 24, 208, 196, 10, 2, 215, 64, 222, 218, 24, 208, - 197, 126, 215, 64, 222, 218, 24, 208, 196, 10, 2, 215, 64, 222, 218, 24, - 199, 237, 10, 2, 215, 64, 202, 237, 10, 2, 215, 64, 126, 215, 63, 10, 2, - 215, 64, 240, 176, 215, 63, 10, 2, 215, 64, 240, 176, 215, 64, 222, 218, - 126, 222, 217, 10, 2, 215, 58, 10, 2, 215, 59, 251, 135, 24, 250, 39, 10, - 2, 215, 59, 251, 135, 24, 248, 41, 10, 2, 215, 59, 251, 135, 24, 237, 68, - 10, 2, 215, 59, 251, 135, 24, 232, 203, 10, 2, 215, 59, 251, 135, 24, - 226, 11, 232, 191, 10, 2, 215, 59, 251, 135, 24, 224, 188, 10, 2, 215, - 59, 251, 135, 24, 175, 10, 2, 215, 59, 251, 135, 24, 217, 34, 10, 2, 215, - 59, 251, 135, 24, 206, 37, 10, 2, 215, 59, 251, 135, 24, 200, 97, 10, 2, - 215, 59, 223, 209, 24, 248, 41, 10, 2, 215, 59, 223, 209, 24, 248, 42, - 66, 10, 2, 163, 10, 2, 213, 170, 10, 2, 213, 129, 10, 2, 213, 102, 10, 2, - 212, 220, 10, 2, 212, 163, 10, 2, 212, 164, 24, 63, 10, 2, 212, 164, 24, - 251, 217, 10, 2, 212, 164, 24, 248, 41, 10, 2, 212, 164, 24, 247, 138, - 10, 2, 212, 164, 24, 70, 10, 2, 212, 164, 24, 68, 10, 2, 212, 164, 24, - 230, 93, 10, 2, 212, 164, 24, 66, 10, 2, 212, 164, 24, 200, 97, 10, 2, - 212, 164, 240, 176, 212, 163, 10, 2, 212, 105, 10, 2, 212, 106, 24, 224, - 169, 10, 2, 212, 106, 24, 200, 86, 10, 2, 212, 106, 24, 195, 114, 10, 2, - 212, 106, 214, 10, 212, 105, 10, 2, 173, 10, 2, 210, 191, 10, 2, 210, 23, - 10, 2, 209, 95, 10, 2, 187, 10, 2, 208, 213, 215, 49, 10, 2, 208, 212, - 10, 2, 208, 213, 24, 63, 10, 2, 208, 213, 24, 237, 74, 10, 2, 208, 213, - 24, 237, 72, 10, 2, 208, 213, 24, 142, 10, 2, 208, 213, 24, 224, 173, 10, - 2, 208, 213, 24, 223, 53, 10, 2, 208, 213, 24, 221, 78, 10, 2, 208, 213, - 24, 218, 243, 10, 2, 208, 213, 24, 215, 63, 10, 2, 208, 213, 24, 208, - 196, 10, 2, 208, 213, 24, 206, 177, 10, 2, 208, 213, 24, 203, 122, 10, 2, - 208, 213, 24, 200, 97, 10, 2, 208, 213, 24, 200, 92, 10, 2, 208, 213, 24, - 200, 62, 10, 2, 208, 213, 24, 200, 5, 10, 2, 208, 213, 24, 199, 237, 10, - 2, 208, 213, 126, 208, 212, 10, 2, 208, 213, 232, 191, 10, 2, 208, 196, - 10, 2, 208, 197, 222, 220, 24, 250, 43, 10, 2, 208, 168, 10, 2, 208, 160, - 10, 2, 207, 6, 10, 2, 207, 4, 10, 2, 207, 5, 24, 63, 10, 2, 207, 5, 24, - 248, 234, 10, 2, 207, 5, 24, 233, 46, 10, 2, 207, 5, 24, 217, 34, 10, 2, - 207, 5, 24, 206, 106, 10, 2, 207, 5, 24, 200, 247, 10, 2, 207, 5, 24, 66, - 10, 2, 207, 5, 24, 115, 96, 63, 10, 2, 207, 2, 10, 2, 207, 0, 10, 2, 206, - 229, 10, 2, 206, 211, 10, 2, 206, 212, 230, 219, 10, 2, 206, 212, 126, - 206, 212, 233, 252, 126, 233, 252, 233, 221, 126, 233, 220, 10, 2, 206, - 212, 126, 206, 212, 203, 123, 126, 203, 123, 233, 221, 126, 233, 220, 10, - 2, 206, 204, 10, 2, 206, 199, 10, 2, 206, 195, 10, 2, 206, 194, 10, 2, - 206, 191, 10, 2, 206, 177, 10, 2, 206, 178, 24, 63, 10, 2, 206, 178, 24, - 225, 247, 10, 2, 206, 171, 10, 2, 206, 172, 24, 63, 10, 2, 206, 172, 24, - 248, 214, 10, 2, 206, 172, 24, 247, 116, 10, 2, 206, 172, 24, 238, 219, - 10, 2, 206, 172, 24, 233, 220, 10, 2, 206, 172, 24, 226, 10, 10, 2, 206, - 172, 24, 226, 11, 232, 191, 10, 2, 206, 172, 24, 223, 47, 10, 2, 206, - 172, 24, 221, 80, 10, 2, 206, 172, 24, 218, 41, 10, 2, 206, 172, 24, 208, - 196, 10, 2, 206, 165, 10, 2, 206, 160, 10, 2, 206, 161, 202, 237, 10, 2, - 206, 161, 126, 206, 161, 247, 106, 126, 247, 105, 10, 2, 206, 156, 10, 2, - 206, 108, 10, 2, 206, 109, 126, 225, 163, 206, 108, 10, 2, 206, 106, 10, - 2, 206, 104, 10, 2, 206, 69, 10, 2, 206, 70, 232, 191, 10, 2, 206, 48, - 10, 2, 206, 46, 10, 2, 206, 47, 126, 206, 47, 206, 106, 10, 2, 206, 39, - 10, 2, 206, 37, 10, 2, 204, 139, 10, 2, 204, 140, 126, 204, 139, 10, 2, - 204, 96, 10, 2, 204, 95, 10, 2, 204, 93, 10, 2, 204, 84, 10, 2, 204, 83, - 10, 2, 204, 55, 10, 2, 204, 54, 10, 2, 203, 137, 10, 2, 203, 138, 250, - 29, 10, 2, 203, 138, 24, 231, 214, 10, 2, 203, 138, 24, 218, 243, 10, 2, - 203, 138, 232, 191, 10, 2, 203, 122, 10, 2, 203, 123, 126, 203, 123, 216, - 142, 126, 216, 142, 238, 200, 126, 238, 199, 10, 2, 203, 123, 205, 56, - 10, 2, 203, 111, 10, 2, 176, 24, 248, 41, 10, 2, 176, 24, 232, 203, 10, - 2, 176, 24, 206, 211, 10, 2, 176, 24, 206, 108, 10, 2, 176, 24, 201, 8, - 10, 2, 176, 24, 200, 86, 10, 2, 203, 97, 10, 2, 203, 69, 10, 2, 203, 36, - 10, 2, 203, 37, 232, 191, 10, 2, 202, 94, 10, 2, 202, 95, 202, 237, 10, - 2, 202, 58, 10, 2, 202, 35, 10, 2, 202, 36, 24, 203, 97, 10, 2, 202, 36, - 126, 202, 35, 10, 2, 202, 36, 126, 202, 36, 233, 252, 126, 233, 252, 233, - 221, 126, 233, 220, 10, 2, 201, 20, 10, 2, 201, 8, 10, 2, 201, 6, 10, 2, - 201, 2, 10, 2, 200, 247, 10, 2, 200, 248, 126, 200, 248, 195, 115, 126, - 195, 114, 10, 2, 66, 10, 2, 115, 232, 203, 10, 2, 115, 115, 66, 10, 2, - 115, 126, 115, 213, 180, 126, 213, 180, 233, 221, 126, 233, 220, 10, 2, - 115, 126, 115, 204, 56, 126, 204, 55, 10, 2, 115, 126, 115, 115, 210, 40, - 126, 115, 210, 39, 10, 2, 200, 97, 10, 2, 200, 92, 10, 2, 200, 86, 10, 2, - 200, 87, 223, 47, 10, 2, 200, 87, 24, 248, 234, 10, 2, 200, 87, 24, 218, - 243, 10, 2, 200, 87, 24, 115, 96, 115, 96, 66, 10, 2, 200, 87, 24, 115, - 96, 115, 96, 115, 232, 191, 10, 2, 200, 87, 232, 191, 10, 2, 200, 87, - 206, 192, 10, 2, 200, 87, 206, 193, 24, 248, 234, 10, 2, 200, 82, 10, 2, - 200, 62, 10, 2, 200, 63, 24, 222, 219, 10, 2, 200, 63, 24, 219, 115, 96, - 240, 3, 10, 2, 200, 63, 24, 207, 4, 10, 2, 200, 63, 24, 66, 10, 2, 200, - 61, 10, 2, 200, 57, 10, 2, 200, 58, 24, 224, 132, 10, 2, 200, 58, 24, - 163, 10, 2, 200, 55, 10, 2, 200, 56, 232, 191, 10, 2, 200, 5, 10, 2, 200, - 6, 240, 176, 200, 5, 10, 2, 200, 6, 206, 192, 10, 2, 200, 3, 10, 2, 200, - 4, 24, 39, 96, 142, 10, 2, 200, 4, 24, 39, 96, 179, 10, 2, 200, 4, 24, - 251, 19, 10, 2, 200, 4, 24, 142, 10, 2, 200, 4, 24, 215, 63, 10, 2, 200, - 4, 24, 200, 97, 10, 2, 200, 4, 24, 200, 98, 96, 250, 45, 10, 2, 200, 4, - 24, 200, 98, 96, 248, 41, 10, 2, 200, 2, 10, 2, 199, 255, 10, 2, 199, - 254, 10, 2, 199, 250, 10, 2, 199, 251, 24, 63, 10, 2, 199, 251, 24, 250, - 39, 10, 2, 199, 251, 24, 153, 10, 2, 199, 251, 24, 237, 61, 10, 2, 199, - 251, 24, 234, 4, 10, 2, 199, 251, 24, 233, 242, 10, 2, 199, 251, 24, 233, - 229, 202, 237, 10, 2, 199, 251, 24, 233, 220, 10, 2, 199, 251, 24, 232, - 214, 10, 2, 199, 251, 24, 142, 10, 2, 199, 251, 24, 226, 10, 10, 2, 199, - 251, 24, 225, 247, 10, 2, 199, 251, 24, 225, 133, 10, 2, 199, 251, 24, - 223, 249, 10, 2, 199, 251, 24, 221, 78, 10, 2, 199, 251, 24, 218, 188, - 10, 2, 199, 251, 24, 163, 10, 2, 199, 251, 24, 206, 211, 10, 2, 199, 251, - 24, 206, 46, 10, 2, 199, 251, 24, 201, 20, 10, 2, 199, 251, 24, 115, 96, - 232, 203, 10, 2, 199, 251, 24, 200, 86, 10, 2, 199, 251, 24, 199, 248, - 10, 2, 199, 248, 10, 2, 199, 249, 24, 66, 10, 2, 199, 237, 10, 2, 199, - 238, 24, 63, 10, 2, 199, 238, 24, 223, 86, 10, 2, 199, 238, 24, 223, 53, - 10, 2, 199, 238, 24, 203, 97, 10, 2, 199, 233, 10, 2, 199, 236, 10, 2, - 199, 234, 10, 2, 199, 230, 10, 2, 199, 218, 10, 2, 199, 219, 24, 224, - 132, 10, 2, 199, 217, 10, 2, 195, 114, 10, 2, 195, 115, 202, 237, 10, 2, - 195, 115, 99, 24, 223, 53, 10, 2, 195, 110, 10, 2, 195, 102, 10, 2, 195, - 87, 10, 2, 195, 33, 10, 2, 195, 34, 126, 195, 33, 10, 2, 195, 32, 10, 2, - 195, 30, 10, 2, 195, 31, 224, 192, 202, 237, 10, 2, 195, 25, 10, 2, 195, - 16, 10, 2, 194, 255, 10, 2, 194, 253, 10, 2, 194, 254, 24, 63, 10, 2, - 194, 252, 10, 2, 194, 251, 10, 2, 224, 157, 236, 135, 10, 2, 251, 218, - 24, 215, 63, 10, 2, 251, 135, 24, 63, 10, 2, 250, 222, 24, 223, 68, 10, - 2, 239, 250, 223, 209, 24, 200, 98, 96, 219, 174, 10, 2, 239, 248, 10, 2, - 238, 200, 96, 206, 108, 10, 2, 237, 73, 24, 206, 211, 10, 2, 235, 190, - 24, 232, 203, 10, 2, 235, 190, 24, 206, 211, 10, 2, 234, 3, 24, 250, 209, - 96, 224, 174, 96, 63, 10, 2, 234, 3, 24, 250, 43, 10, 2, 233, 185, 10, 2, - 233, 63, 10, 2, 230, 192, 10, 2, 224, 217, 24, 250, 175, 10, 2, 224, 217, - 24, 250, 42, 10, 2, 224, 217, 24, 233, 46, 10, 2, 224, 217, 24, 232, 203, - 10, 2, 224, 217, 24, 231, 215, 24, 250, 43, 10, 2, 224, 217, 24, 221, 78, - 10, 2, 224, 217, 24, 163, 10, 2, 224, 217, 24, 206, 100, 10, 2, 224, 217, - 24, 201, 20, 10, 2, 224, 217, 24, 200, 3, 10, 2, 222, 220, 24, 233, 74, - 10, 2, 221, 94, 206, 193, 24, 248, 234, 10, 2, 221, 94, 24, 236, 18, 96, - 222, 152, 10, 2, 221, 94, 24, 206, 108, 10, 2, 219, 59, 10, 2, 218, 4, - 24, 195, 114, 10, 2, 217, 160, 10, 2, 216, 101, 10, 2, 216, 100, 10, 2, - 216, 99, 24, 248, 214, 10, 2, 216, 99, 24, 233, 74, 10, 2, 215, 81, 209, - 148, 216, 93, 239, 98, 10, 2, 212, 221, 250, 29, 10, 2, 212, 109, 10, 2, - 208, 213, 24, 226, 11, 232, 191, 10, 2, 202, 86, 10, 2, 200, 63, 24, 219, - 114, 10, 2, 115, 66, 10, 152, 2, 114, 250, 45, 10, 152, 2, 122, 250, 45, - 10, 152, 2, 234, 145, 250, 45, 10, 152, 2, 234, 237, 250, 45, 10, 152, 2, - 205, 242, 250, 45, 10, 152, 2, 207, 27, 250, 45, 10, 152, 2, 236, 161, - 250, 45, 10, 152, 2, 216, 97, 250, 45, 10, 152, 2, 122, 238, 199, 10, - 152, 2, 234, 145, 238, 199, 10, 152, 2, 234, 237, 238, 199, 10, 152, 2, - 205, 242, 238, 199, 10, 152, 2, 207, 27, 238, 199, 10, 152, 2, 236, 161, - 238, 199, 10, 152, 2, 216, 97, 238, 199, 10, 152, 2, 234, 145, 66, 10, - 152, 2, 234, 237, 66, 10, 152, 2, 205, 242, 66, 10, 152, 2, 207, 27, 66, - 10, 152, 2, 236, 161, 66, 10, 152, 2, 216, 97, 66, 10, 152, 2, 106, 233, - 157, 10, 152, 2, 114, 233, 157, 10, 152, 2, 122, 233, 157, 10, 152, 2, - 234, 145, 233, 157, 10, 152, 2, 234, 237, 233, 157, 10, 152, 2, 205, 242, - 233, 157, 10, 152, 2, 207, 27, 233, 157, 10, 152, 2, 236, 161, 233, 157, - 10, 152, 2, 216, 97, 233, 157, 10, 152, 2, 106, 233, 154, 10, 152, 2, - 114, 233, 154, 10, 152, 2, 122, 233, 154, 10, 152, 2, 234, 145, 233, 154, - 10, 152, 2, 234, 237, 233, 154, 10, 152, 2, 114, 206, 229, 10, 152, 2, - 122, 206, 229, 10, 152, 2, 122, 206, 230, 199, 119, 20, 10, 152, 2, 234, - 145, 206, 229, 10, 152, 2, 234, 237, 206, 229, 10, 152, 2, 205, 242, 206, - 229, 10, 152, 2, 207, 27, 206, 229, 10, 152, 2, 236, 161, 206, 229, 10, - 152, 2, 216, 97, 206, 229, 10, 152, 2, 106, 206, 222, 10, 152, 2, 114, - 206, 222, 10, 152, 2, 122, 206, 222, 10, 152, 2, 122, 206, 223, 199, 119, - 20, 10, 152, 2, 234, 145, 206, 222, 10, 152, 2, 234, 237, 206, 222, 10, - 152, 2, 206, 230, 24, 233, 243, 96, 238, 199, 10, 152, 2, 206, 230, 24, - 233, 243, 96, 218, 188, 10, 152, 2, 106, 247, 101, 10, 152, 2, 114, 247, - 101, 10, 152, 2, 122, 247, 101, 10, 152, 2, 122, 247, 102, 199, 119, 20, - 10, 152, 2, 234, 145, 247, 101, 10, 152, 2, 234, 237, 247, 101, 10, 152, - 2, 122, 199, 119, 234, 161, 236, 19, 10, 152, 2, 122, 199, 119, 234, 161, - 236, 16, 10, 152, 2, 234, 145, 199, 119, 234, 161, 221, 237, 10, 152, 2, - 234, 145, 199, 119, 234, 161, 221, 235, 10, 152, 2, 234, 145, 199, 119, - 234, 161, 221, 238, 63, 10, 152, 2, 234, 145, 199, 119, 234, 161, 221, - 238, 249, 219, 10, 152, 2, 205, 242, 199, 119, 234, 161, 250, 41, 10, - 152, 2, 207, 27, 199, 119, 234, 161, 225, 239, 10, 152, 2, 207, 27, 199, - 119, 234, 161, 225, 241, 63, 10, 152, 2, 207, 27, 199, 119, 234, 161, - 225, 241, 249, 219, 10, 152, 2, 236, 161, 199, 119, 234, 161, 199, 232, - 10, 152, 2, 236, 161, 199, 119, 234, 161, 199, 231, 10, 152, 2, 216, 97, - 199, 119, 234, 161, 225, 255, 10, 152, 2, 216, 97, 199, 119, 234, 161, - 225, 254, 10, 152, 2, 216, 97, 199, 119, 234, 161, 225, 253, 10, 152, 2, - 216, 97, 199, 119, 234, 161, 226, 0, 63, 10, 152, 2, 114, 250, 46, 202, - 237, 10, 152, 2, 122, 250, 46, 202, 237, 10, 152, 2, 234, 145, 250, 46, - 202, 237, 10, 152, 2, 234, 237, 250, 46, 202, 237, 10, 152, 2, 205, 242, - 250, 46, 202, 237, 10, 152, 2, 106, 248, 199, 10, 152, 2, 114, 248, 199, - 10, 152, 2, 122, 248, 199, 10, 152, 2, 234, 145, 248, 199, 10, 152, 2, - 234, 145, 248, 200, 199, 119, 20, 10, 152, 2, 234, 237, 248, 199, 10, - 152, 2, 234, 237, 248, 200, 199, 119, 20, 10, 152, 2, 216, 110, 10, 152, - 2, 216, 111, 10, 152, 2, 106, 236, 15, 10, 152, 2, 114, 236, 15, 10, 152, - 2, 106, 202, 155, 238, 199, 10, 152, 2, 114, 202, 152, 238, 199, 10, 152, - 2, 234, 237, 205, 231, 238, 199, 10, 152, 2, 106, 202, 155, 199, 119, - 234, 161, 63, 10, 152, 2, 114, 202, 152, 199, 119, 234, 161, 63, 10, 152, - 2, 106, 236, 157, 250, 45, 10, 152, 2, 106, 211, 37, 250, 45, 10, 152, 2, - 36, 250, 32, 106, 205, 232, 10, 152, 2, 36, 250, 32, 106, 211, 36, 10, - 152, 2, 106, 211, 37, 232, 185, 10, 152, 2, 106, 155, 232, 185, 10, 152, - 2, 236, 136, 106, 202, 154, 10, 152, 2, 236, 136, 114, 202, 151, 10, 152, - 2, 236, 136, 234, 151, 10, 152, 2, 236, 136, 235, 25, 10, 152, 2, 234, - 145, 115, 199, 119, 20, 10, 152, 2, 234, 237, 115, 199, 119, 20, 10, 152, - 2, 205, 242, 115, 199, 119, 20, 10, 152, 2, 207, 27, 115, 199, 119, 20, - 10, 152, 2, 236, 161, 115, 199, 119, 20, 10, 152, 2, 216, 97, 115, 199, - 119, 20, 10, 211, 163, 2, 36, 250, 32, 197, 3, 238, 183, 10, 211, 163, 2, - 83, 244, 32, 10, 211, 163, 2, 239, 15, 244, 32, 10, 211, 163, 2, 239, 15, - 201, 156, 10, 211, 163, 2, 239, 15, 211, 42, 10, 2, 251, 218, 24, 215, - 64, 202, 237, 10, 2, 251, 218, 24, 206, 106, 10, 2, 251, 107, 24, 236, - 17, 10, 2, 248, 235, 24, 238, 200, 202, 237, 10, 2, 248, 221, 24, 251, - 134, 10, 2, 248, 221, 24, 216, 141, 10, 2, 248, 221, 24, 195, 114, 10, 2, - 247, 139, 126, 247, 139, 24, 217, 161, 10, 2, 240, 4, 24, 203, 97, 10, 2, - 239, 250, 24, 223, 53, 10, 2, 238, 232, 24, 226, 10, 10, 2, 238, 232, 24, - 115, 115, 66, 10, 2, 238, 230, 24, 200, 86, 10, 2, 237, 69, 24, 250, 175, - 10, 2, 237, 69, 24, 250, 45, 10, 2, 237, 69, 24, 250, 46, 250, 19, 222, - 86, 10, 2, 237, 69, 24, 238, 219, 10, 2, 237, 69, 24, 237, 61, 10, 2, - 237, 69, 24, 236, 36, 10, 2, 237, 69, 24, 234, 4, 10, 2, 237, 69, 24, - 233, 74, 10, 2, 237, 69, 24, 233, 56, 232, 191, 10, 2, 237, 69, 24, 233, - 46, 10, 2, 237, 69, 24, 142, 10, 2, 237, 69, 24, 231, 214, 10, 2, 237, - 69, 24, 226, 11, 232, 191, 10, 2, 237, 69, 24, 224, 132, 10, 2, 237, 69, - 24, 223, 53, 10, 2, 237, 69, 24, 223, 47, 10, 2, 237, 69, 24, 223, 48, - 96, 224, 132, 10, 2, 237, 69, 24, 222, 207, 10, 2, 237, 69, 24, 222, 150, - 10, 2, 237, 69, 24, 222, 151, 24, 223, 53, 10, 2, 237, 69, 24, 221, 84, - 96, 233, 46, 10, 2, 237, 69, 24, 219, 174, 10, 2, 237, 69, 24, 219, 60, - 10, 2, 237, 69, 24, 218, 243, 10, 2, 237, 69, 24, 216, 141, 10, 2, 237, - 69, 24, 212, 163, 10, 2, 237, 69, 24, 206, 211, 10, 2, 237, 69, 24, 206, - 70, 232, 191, 10, 2, 236, 214, 24, 223, 53, 10, 2, 236, 214, 24, 213, - 102, 10, 2, 236, 37, 196, 216, 10, 2, 236, 18, 240, 176, 236, 17, 10, 2, - 235, 190, 206, 193, 24, 250, 45, 10, 2, 235, 190, 206, 193, 24, 231, 214, - 10, 2, 235, 190, 206, 193, 24, 226, 11, 232, 191, 10, 2, 235, 190, 206, - 193, 24, 175, 10, 2, 235, 190, 206, 193, 24, 222, 152, 10, 2, 235, 190, - 206, 193, 24, 219, 114, 10, 2, 235, 190, 206, 193, 24, 219, 60, 10, 2, - 235, 190, 206, 193, 24, 204, 139, 10, 2, 235, 190, 24, 204, 139, 10, 2, - 234, 3, 24, 248, 220, 10, 2, 234, 3, 24, 238, 232, 232, 191, 10, 2, 234, - 3, 24, 237, 69, 24, 226, 11, 232, 191, 10, 2, 234, 3, 24, 237, 69, 24, - 224, 132, 10, 2, 234, 3, 24, 236, 39, 10, 2, 234, 3, 24, 234, 4, 10, 2, - 234, 3, 24, 233, 221, 96, 239, 20, 10, 2, 234, 3, 24, 233, 221, 96, 217, - 34, 10, 2, 234, 3, 24, 232, 143, 96, 63, 10, 2, 234, 3, 24, 223, 48, 96, - 224, 132, 10, 2, 234, 3, 24, 222, 150, 10, 2, 234, 3, 24, 222, 151, 24, - 223, 53, 10, 2, 234, 3, 24, 221, 83, 10, 2, 234, 3, 24, 218, 5, 10, 2, - 234, 3, 24, 217, 34, 10, 2, 234, 3, 24, 217, 35, 96, 236, 213, 10, 2, - 234, 3, 24, 217, 35, 96, 233, 74, 10, 2, 234, 3, 24, 206, 171, 10, 2, - 234, 3, 24, 195, 16, 10, 2, 233, 254, 209, 148, 216, 93, 239, 98, 10, 2, - 233, 156, 24, 66, 10, 2, 233, 47, 24, 233, 47, 240, 176, 233, 46, 10, 2, - 232, 213, 24, 226, 11, 232, 191, 10, 2, 232, 204, 96, 233, 47, 24, 203, - 97, 10, 2, 232, 143, 202, 238, 232, 191, 10, 2, 231, 215, 24, 250, 46, - 126, 231, 215, 24, 250, 45, 10, 2, 224, 217, 24, 247, 138, 10, 2, 224, - 217, 24, 157, 10, 2, 224, 217, 24, 115, 115, 66, 10, 2, 224, 217, 24, - 200, 5, 10, 2, 222, 220, 24, 195, 0, 126, 194, 255, 10, 2, 222, 208, 10, - 2, 222, 206, 10, 2, 222, 205, 10, 2, 222, 204, 10, 2, 222, 203, 10, 2, - 222, 202, 10, 2, 222, 201, 10, 2, 222, 200, 126, 222, 200, 232, 191, 10, - 2, 222, 199, 10, 2, 222, 198, 126, 222, 197, 10, 2, 222, 196, 10, 2, 222, - 195, 10, 2, 222, 194, 10, 2, 222, 193, 10, 2, 222, 192, 10, 2, 222, 191, - 10, 2, 222, 190, 10, 2, 222, 189, 10, 2, 222, 188, 10, 2, 222, 187, 10, - 2, 222, 186, 10, 2, 222, 185, 10, 2, 222, 184, 10, 2, 222, 183, 10, 2, - 222, 182, 10, 2, 222, 181, 10, 2, 222, 180, 10, 2, 222, 179, 10, 2, 222, - 177, 10, 2, 222, 178, 24, 232, 214, 10, 2, 222, 178, 24, 226, 10, 10, 2, - 222, 178, 24, 213, 103, 96, 221, 92, 10, 2, 222, 178, 24, 213, 103, 96, - 213, 103, 96, 221, 92, 10, 2, 222, 178, 24, 200, 98, 96, 248, 252, 10, 2, - 222, 176, 10, 2, 222, 175, 10, 2, 222, 174, 10, 2, 222, 173, 10, 2, 222, - 172, 10, 2, 222, 171, 10, 2, 222, 170, 10, 2, 222, 169, 10, 2, 222, 168, - 10, 2, 222, 167, 10, 2, 222, 165, 10, 2, 222, 166, 24, 250, 45, 10, 2, - 222, 166, 24, 248, 234, 10, 2, 222, 166, 24, 237, 60, 232, 192, 232, 191, - 10, 2, 222, 166, 24, 223, 77, 10, 2, 222, 166, 24, 175, 10, 2, 222, 166, - 24, 203, 69, 10, 2, 222, 166, 24, 203, 36, 10, 2, 222, 166, 24, 200, 97, - 10, 2, 222, 166, 24, 200, 86, 10, 2, 222, 166, 24, 199, 248, 10, 2, 222, - 164, 10, 2, 222, 162, 10, 2, 222, 163, 24, 237, 72, 10, 2, 222, 163, 24, - 234, 4, 10, 2, 222, 163, 24, 226, 10, 10, 2, 222, 163, 24, 226, 11, 232, - 191, 10, 2, 222, 163, 24, 216, 141, 10, 2, 222, 163, 24, 213, 103, 96, - 213, 103, 96, 221, 92, 10, 2, 222, 163, 24, 206, 196, 96, 223, 249, 10, - 2, 222, 163, 24, 200, 86, 10, 2, 222, 163, 24, 199, 248, 10, 2, 222, 160, - 10, 2, 222, 159, 10, 2, 221, 94, 232, 192, 24, 250, 45, 10, 2, 221, 94, - 24, 238, 199, 10, 2, 221, 94, 24, 232, 111, 10, 2, 221, 94, 24, 213, 102, - 10, 2, 221, 94, 24, 213, 103, 96, 213, 103, 96, 221, 92, 10, 2, 221, 94, - 24, 203, 97, 10, 2, 218, 244, 96, 195, 113, 10, 2, 218, 6, 126, 218, 6, - 24, 234, 4, 10, 2, 218, 6, 126, 218, 6, 24, 224, 173, 10, 2, 216, 99, 24, - 238, 232, 232, 191, 10, 2, 216, 99, 24, 233, 46, 10, 2, 216, 99, 24, 232, - 196, 10, 2, 216, 99, 24, 231, 214, 10, 2, 216, 99, 24, 224, 65, 10, 2, - 216, 99, 24, 222, 203, 10, 2, 216, 99, 24, 219, 174, 10, 2, 216, 99, 24, - 213, 103, 96, 213, 102, 10, 2, 216, 99, 24, 66, 10, 2, 216, 99, 24, 115, - 96, 66, 10, 2, 216, 99, 24, 199, 248, 10, 2, 208, 213, 232, 192, 24, 142, - 10, 2, 208, 213, 24, 236, 106, 10, 2, 208, 213, 24, 206, 212, 250, 19, - 222, 86, 10, 2, 208, 213, 24, 203, 97, 10, 2, 207, 3, 202, 237, 10, 2, - 206, 212, 126, 206, 211, 10, 2, 206, 212, 96, 230, 211, 10, 2, 206, 212, - 96, 217, 138, 10, 2, 206, 212, 96, 208, 160, 10, 2, 206, 107, 96, 237, - 69, 24, 216, 141, 10, 2, 206, 107, 96, 236, 214, 24, 250, 208, 10, 2, - 206, 70, 24, 203, 97, 10, 2, 203, 98, 96, 208, 212, 10, 2, 201, 3, 24, - 233, 229, 202, 237, 10, 2, 201, 3, 24, 122, 238, 199, 10, 2, 200, 4, 225, - 162, 10, 2, 200, 4, 24, 200, 86, 10, 2, 199, 251, 24, 239, 197, 10, 2, - 199, 251, 24, 222, 161, 10, 2, 199, 251, 24, 221, 92, 10, 2, 195, 113, - 10, 2, 195, 0, 126, 195, 0, 96, 208, 160, 10, 2, 194, 254, 24, 122, 238, - 200, 202, 237, 14, 7, 255, 3, 14, 7, 255, 2, 14, 7, 255, 1, 14, 7, 255, - 0, 14, 7, 254, 255, 14, 7, 254, 254, 14, 7, 254, 253, 14, 7, 254, 252, - 14, 7, 254, 251, 14, 7, 254, 250, 14, 7, 254, 249, 14, 7, 254, 248, 14, - 7, 254, 247, 14, 7, 254, 245, 14, 7, 254, 244, 14, 7, 254, 243, 14, 7, - 254, 242, 14, 7, 254, 241, 14, 7, 254, 240, 14, 7, 254, 239, 14, 7, 254, - 238, 14, 7, 254, 237, 14, 7, 254, 236, 14, 7, 254, 235, 14, 7, 254, 234, - 14, 7, 254, 233, 14, 7, 254, 232, 14, 7, 254, 231, 14, 7, 254, 230, 14, - 7, 254, 229, 14, 7, 254, 228, 14, 7, 254, 226, 14, 7, 254, 225, 14, 7, - 254, 223, 14, 7, 254, 222, 14, 7, 254, 221, 14, 7, 254, 220, 14, 7, 254, - 219, 14, 7, 254, 218, 14, 7, 254, 217, 14, 7, 254, 216, 14, 7, 254, 215, - 14, 7, 254, 214, 14, 7, 254, 213, 14, 7, 254, 212, 14, 7, 254, 210, 14, - 7, 254, 209, 14, 7, 254, 208, 14, 7, 254, 206, 14, 7, 254, 205, 14, 7, - 254, 204, 14, 7, 254, 203, 14, 7, 254, 202, 14, 7, 254, 201, 14, 7, 254, - 200, 14, 7, 254, 199, 14, 7, 254, 196, 14, 7, 254, 195, 14, 7, 254, 194, - 14, 7, 254, 193, 14, 7, 254, 192, 14, 7, 254, 191, 14, 7, 254, 190, 14, - 7, 254, 189, 14, 7, 254, 188, 14, 7, 254, 187, 14, 7, 254, 186, 14, 7, - 254, 185, 14, 7, 254, 184, 14, 7, 254, 183, 14, 7, 254, 182, 14, 7, 254, - 181, 14, 7, 254, 180, 14, 7, 254, 179, 14, 7, 254, 178, 14, 7, 254, 177, - 14, 7, 254, 173, 14, 7, 254, 172, 14, 7, 254, 171, 14, 7, 254, 170, 14, - 7, 249, 217, 14, 7, 249, 215, 14, 7, 249, 213, 14, 7, 249, 211, 14, 7, - 249, 209, 14, 7, 249, 208, 14, 7, 249, 206, 14, 7, 249, 204, 14, 7, 249, - 202, 14, 7, 249, 200, 14, 7, 247, 65, 14, 7, 247, 64, 14, 7, 247, 63, 14, - 7, 247, 62, 14, 7, 247, 61, 14, 7, 247, 60, 14, 7, 247, 59, 14, 7, 247, - 58, 14, 7, 247, 57, 14, 7, 247, 56, 14, 7, 247, 55, 14, 7, 247, 54, 14, - 7, 247, 53, 14, 7, 247, 52, 14, 7, 247, 51, 14, 7, 247, 50, 14, 7, 247, - 49, 14, 7, 247, 48, 14, 7, 247, 47, 14, 7, 247, 46, 14, 7, 247, 45, 14, - 7, 247, 44, 14, 7, 247, 43, 14, 7, 247, 42, 14, 7, 247, 41, 14, 7, 247, - 40, 14, 7, 247, 39, 14, 7, 247, 38, 14, 7, 240, 97, 14, 7, 240, 96, 14, - 7, 240, 95, 14, 7, 240, 94, 14, 7, 240, 93, 14, 7, 240, 92, 14, 7, 240, - 91, 14, 7, 240, 90, 14, 7, 240, 89, 14, 7, 240, 88, 14, 7, 240, 87, 14, - 7, 240, 86, 14, 7, 240, 85, 14, 7, 240, 84, 14, 7, 240, 83, 14, 7, 240, - 82, 14, 7, 240, 81, 14, 7, 240, 80, 14, 7, 240, 79, 14, 7, 240, 78, 14, - 7, 240, 77, 14, 7, 240, 76, 14, 7, 240, 75, 14, 7, 240, 74, 14, 7, 240, - 73, 14, 7, 240, 72, 14, 7, 240, 71, 14, 7, 240, 70, 14, 7, 240, 69, 14, - 7, 240, 68, 14, 7, 240, 67, 14, 7, 240, 66, 14, 7, 240, 65, 14, 7, 240, - 64, 14, 7, 240, 63, 14, 7, 240, 62, 14, 7, 240, 61, 14, 7, 240, 60, 14, - 7, 240, 59, 14, 7, 240, 58, 14, 7, 240, 57, 14, 7, 240, 56, 14, 7, 240, - 55, 14, 7, 240, 54, 14, 7, 240, 53, 14, 7, 240, 52, 14, 7, 240, 51, 14, - 7, 240, 50, 14, 7, 240, 49, 14, 7, 240, 48, 14, 7, 240, 47, 14, 7, 240, - 46, 14, 7, 240, 45, 14, 7, 240, 44, 14, 7, 240, 43, 14, 7, 240, 42, 14, - 7, 240, 41, 14, 7, 240, 40, 14, 7, 240, 39, 14, 7, 240, 38, 14, 7, 240, - 37, 14, 7, 240, 36, 14, 7, 240, 35, 14, 7, 240, 34, 14, 7, 240, 33, 14, - 7, 240, 32, 14, 7, 240, 31, 14, 7, 240, 30, 14, 7, 240, 29, 14, 7, 240, - 28, 14, 7, 240, 27, 14, 7, 240, 26, 14, 7, 240, 25, 14, 7, 240, 24, 14, - 7, 240, 23, 14, 7, 240, 22, 14, 7, 240, 21, 14, 7, 240, 20, 14, 7, 240, - 19, 14, 7, 240, 18, 14, 7, 240, 17, 14, 7, 240, 16, 14, 7, 240, 15, 14, - 7, 240, 14, 14, 7, 240, 13, 14, 7, 240, 12, 14, 7, 240, 11, 14, 7, 240, - 10, 14, 7, 240, 9, 14, 7, 240, 8, 14, 7, 240, 7, 14, 7, 240, 6, 14, 7, - 237, 2, 14, 7, 237, 1, 14, 7, 237, 0, 14, 7, 236, 255, 14, 7, 236, 254, - 14, 7, 236, 253, 14, 7, 236, 252, 14, 7, 236, 251, 14, 7, 236, 250, 14, - 7, 236, 249, 14, 7, 236, 248, 14, 7, 236, 247, 14, 7, 236, 246, 14, 7, - 236, 245, 14, 7, 236, 244, 14, 7, 236, 243, 14, 7, 236, 242, 14, 7, 236, - 241, 14, 7, 236, 240, 14, 7, 236, 239, 14, 7, 236, 238, 14, 7, 236, 237, - 14, 7, 236, 236, 14, 7, 236, 235, 14, 7, 236, 234, 14, 7, 236, 233, 14, - 7, 236, 232, 14, 7, 236, 231, 14, 7, 236, 230, 14, 7, 236, 229, 14, 7, - 236, 228, 14, 7, 236, 227, 14, 7, 236, 226, 14, 7, 236, 225, 14, 7, 236, - 224, 14, 7, 236, 223, 14, 7, 236, 222, 14, 7, 236, 221, 14, 7, 236, 220, - 14, 7, 236, 219, 14, 7, 236, 218, 14, 7, 236, 217, 14, 7, 236, 216, 14, - 7, 236, 215, 14, 7, 235, 183, 14, 7, 235, 182, 14, 7, 235, 181, 14, 7, - 235, 180, 14, 7, 235, 179, 14, 7, 235, 178, 14, 7, 235, 177, 14, 7, 235, - 176, 14, 7, 235, 175, 14, 7, 235, 174, 14, 7, 235, 173, 14, 7, 235, 172, - 14, 7, 235, 171, 14, 7, 235, 170, 14, 7, 235, 169, 14, 7, 235, 168, 14, - 7, 235, 167, 14, 7, 235, 166, 14, 7, 235, 165, 14, 7, 235, 164, 14, 7, - 235, 163, 14, 7, 235, 162, 14, 7, 235, 161, 14, 7, 235, 160, 14, 7, 235, - 159, 14, 7, 235, 158, 14, 7, 235, 157, 14, 7, 235, 156, 14, 7, 235, 155, - 14, 7, 235, 154, 14, 7, 235, 153, 14, 7, 235, 152, 14, 7, 235, 151, 14, - 7, 235, 150, 14, 7, 235, 149, 14, 7, 235, 148, 14, 7, 235, 147, 14, 7, - 235, 146, 14, 7, 235, 145, 14, 7, 235, 144, 14, 7, 235, 143, 14, 7, 235, - 142, 14, 7, 235, 141, 14, 7, 235, 140, 14, 7, 235, 139, 14, 7, 235, 138, - 14, 7, 235, 137, 14, 7, 235, 136, 14, 7, 235, 135, 14, 7, 235, 134, 14, - 7, 235, 133, 14, 7, 235, 132, 14, 7, 235, 131, 14, 7, 235, 130, 14, 7, - 235, 129, 14, 7, 235, 128, 14, 7, 235, 127, 14, 7, 235, 126, 14, 7, 235, - 125, 14, 7, 235, 124, 14, 7, 235, 123, 14, 7, 235, 122, 14, 7, 235, 121, - 14, 7, 235, 120, 14, 7, 235, 119, 14, 7, 234, 70, 14, 7, 234, 69, 14, 7, - 234, 68, 14, 7, 234, 67, 14, 7, 234, 66, 14, 7, 234, 65, 14, 7, 234, 64, - 14, 7, 234, 63, 14, 7, 234, 62, 14, 7, 234, 61, 14, 7, 234, 60, 14, 7, - 234, 59, 14, 7, 234, 58, 14, 7, 234, 57, 14, 7, 234, 56, 14, 7, 234, 55, - 14, 7, 234, 54, 14, 7, 234, 53, 14, 7, 234, 52, 14, 7, 234, 51, 14, 7, - 234, 50, 14, 7, 234, 49, 14, 7, 234, 48, 14, 7, 234, 47, 14, 7, 234, 46, - 14, 7, 234, 45, 14, 7, 234, 44, 14, 7, 234, 43, 14, 7, 234, 42, 14, 7, - 234, 41, 14, 7, 234, 40, 14, 7, 234, 39, 14, 7, 234, 38, 14, 7, 234, 37, - 14, 7, 234, 36, 14, 7, 234, 35, 14, 7, 234, 34, 14, 7, 234, 33, 14, 7, - 234, 32, 14, 7, 234, 31, 14, 7, 234, 30, 14, 7, 234, 29, 14, 7, 234, 28, - 14, 7, 234, 27, 14, 7, 234, 26, 14, 7, 234, 25, 14, 7, 234, 24, 14, 7, - 234, 23, 14, 7, 234, 22, 14, 7, 234, 21, 14, 7, 234, 20, 14, 7, 234, 19, - 14, 7, 234, 18, 14, 7, 234, 17, 14, 7, 234, 16, 14, 7, 234, 15, 14, 7, - 234, 14, 14, 7, 234, 13, 14, 7, 234, 12, 14, 7, 234, 11, 14, 7, 234, 10, - 14, 7, 234, 9, 14, 7, 234, 8, 14, 7, 234, 7, 14, 7, 232, 152, 14, 7, 232, - 151, 14, 7, 232, 150, 14, 7, 232, 149, 14, 7, 232, 148, 14, 7, 232, 147, - 14, 7, 232, 146, 14, 7, 232, 145, 14, 7, 232, 144, 14, 7, 230, 117, 14, - 7, 230, 116, 14, 7, 230, 115, 14, 7, 230, 114, 14, 7, 230, 113, 14, 7, - 230, 112, 14, 7, 230, 111, 14, 7, 230, 110, 14, 7, 230, 109, 14, 7, 230, - 108, 14, 7, 230, 107, 14, 7, 230, 106, 14, 7, 230, 105, 14, 7, 230, 104, - 14, 7, 230, 103, 14, 7, 230, 102, 14, 7, 230, 101, 14, 7, 230, 100, 14, - 7, 230, 99, 14, 7, 224, 226, 14, 7, 224, 225, 14, 7, 224, 224, 14, 7, - 224, 223, 14, 7, 224, 222, 14, 7, 224, 221, 14, 7, 224, 220, 14, 7, 224, - 219, 14, 7, 222, 254, 14, 7, 222, 253, 14, 7, 222, 252, 14, 7, 222, 251, - 14, 7, 222, 250, 14, 7, 222, 249, 14, 7, 222, 248, 14, 7, 222, 247, 14, - 7, 222, 246, 14, 7, 222, 245, 14, 7, 221, 38, 14, 7, 221, 37, 14, 7, 221, - 36, 14, 7, 221, 34, 14, 7, 221, 32, 14, 7, 221, 31, 14, 7, 221, 29, 14, - 7, 221, 27, 14, 7, 221, 25, 14, 7, 221, 23, 14, 7, 221, 21, 14, 7, 221, - 19, 14, 7, 221, 17, 14, 7, 221, 16, 14, 7, 221, 14, 14, 7, 221, 12, 14, - 7, 221, 11, 14, 7, 221, 10, 14, 7, 221, 9, 14, 7, 221, 8, 14, 7, 221, 7, - 14, 7, 221, 6, 14, 7, 221, 5, 14, 7, 221, 4, 14, 7, 221, 2, 14, 7, 221, - 0, 14, 7, 220, 254, 14, 7, 220, 253, 14, 7, 220, 251, 14, 7, 220, 250, - 14, 7, 220, 248, 14, 7, 220, 247, 14, 7, 220, 245, 14, 7, 220, 243, 14, - 7, 220, 241, 14, 7, 220, 239, 14, 7, 220, 237, 14, 7, 220, 236, 14, 7, - 220, 234, 14, 7, 220, 232, 14, 7, 220, 231, 14, 7, 220, 229, 14, 7, 220, - 227, 14, 7, 220, 225, 14, 7, 220, 223, 14, 7, 220, 222, 14, 7, 220, 220, - 14, 7, 220, 218, 14, 7, 220, 216, 14, 7, 220, 215, 14, 7, 220, 213, 14, - 7, 220, 211, 14, 7, 220, 210, 14, 7, 220, 209, 14, 7, 220, 207, 14, 7, - 220, 205, 14, 7, 220, 203, 14, 7, 220, 201, 14, 7, 220, 199, 14, 7, 220, - 197, 14, 7, 220, 195, 14, 7, 220, 194, 14, 7, 220, 192, 14, 7, 220, 190, - 14, 7, 220, 188, 14, 7, 220, 186, 14, 7, 217, 220, 14, 7, 217, 219, 14, - 7, 217, 218, 14, 7, 217, 217, 14, 7, 217, 216, 14, 7, 217, 215, 14, 7, - 217, 214, 14, 7, 217, 213, 14, 7, 217, 212, 14, 7, 217, 211, 14, 7, 217, - 210, 14, 7, 217, 209, 14, 7, 217, 208, 14, 7, 217, 207, 14, 7, 217, 206, - 14, 7, 217, 205, 14, 7, 217, 204, 14, 7, 217, 203, 14, 7, 217, 202, 14, - 7, 217, 201, 14, 7, 217, 200, 14, 7, 217, 199, 14, 7, 217, 198, 14, 7, - 217, 197, 14, 7, 217, 196, 14, 7, 217, 195, 14, 7, 217, 194, 14, 7, 217, - 193, 14, 7, 217, 192, 14, 7, 217, 191, 14, 7, 217, 190, 14, 7, 217, 189, - 14, 7, 217, 188, 14, 7, 217, 187, 14, 7, 217, 186, 14, 7, 217, 185, 14, - 7, 217, 184, 14, 7, 217, 183, 14, 7, 217, 182, 14, 7, 217, 181, 14, 7, - 217, 180, 14, 7, 217, 179, 14, 7, 217, 178, 14, 7, 217, 177, 14, 7, 217, - 176, 14, 7, 217, 175, 14, 7, 217, 174, 14, 7, 217, 173, 14, 7, 217, 172, - 14, 7, 216, 30, 14, 7, 216, 29, 14, 7, 216, 28, 14, 7, 216, 27, 14, 7, - 216, 26, 14, 7, 216, 25, 14, 7, 216, 24, 14, 7, 216, 23, 14, 7, 216, 22, - 14, 7, 216, 21, 14, 7, 216, 20, 14, 7, 216, 19, 14, 7, 216, 18, 14, 7, - 216, 17, 14, 7, 216, 16, 14, 7, 216, 15, 14, 7, 216, 14, 14, 7, 216, 13, - 14, 7, 216, 12, 14, 7, 216, 11, 14, 7, 216, 10, 14, 7, 216, 9, 14, 7, - 215, 107, 14, 7, 215, 106, 14, 7, 215, 105, 14, 7, 215, 104, 14, 7, 215, - 103, 14, 7, 215, 102, 14, 7, 215, 101, 14, 7, 215, 100, 14, 7, 215, 99, - 14, 7, 215, 98, 14, 7, 215, 97, 14, 7, 215, 96, 14, 7, 215, 95, 14, 7, - 215, 94, 14, 7, 215, 93, 14, 7, 215, 92, 14, 7, 215, 91, 14, 7, 215, 90, - 14, 7, 215, 89, 14, 7, 215, 88, 14, 7, 215, 87, 14, 7, 215, 86, 14, 7, - 215, 85, 14, 7, 215, 84, 14, 7, 215, 83, 14, 7, 215, 82, 14, 7, 214, 193, - 14, 7, 214, 192, 14, 7, 214, 191, 14, 7, 214, 190, 14, 7, 214, 189, 14, - 7, 214, 188, 14, 7, 214, 187, 14, 7, 214, 186, 14, 7, 214, 185, 14, 7, - 214, 184, 14, 7, 214, 183, 14, 7, 214, 182, 14, 7, 214, 181, 14, 7, 214, - 180, 14, 7, 214, 179, 14, 7, 214, 178, 14, 7, 214, 177, 14, 7, 214, 176, - 14, 7, 214, 175, 14, 7, 214, 174, 14, 7, 214, 173, 14, 7, 214, 172, 14, - 7, 214, 171, 14, 7, 214, 170, 14, 7, 214, 169, 14, 7, 214, 168, 14, 7, - 214, 167, 14, 7, 214, 166, 14, 7, 214, 165, 14, 7, 214, 164, 14, 7, 214, - 163, 14, 7, 214, 162, 14, 7, 214, 161, 14, 7, 214, 160, 14, 7, 214, 159, - 14, 7, 214, 158, 14, 7, 214, 157, 14, 7, 214, 156, 14, 7, 214, 155, 14, - 7, 214, 154, 14, 7, 214, 153, 14, 7, 214, 152, 14, 7, 214, 151, 14, 7, - 214, 150, 14, 7, 214, 149, 14, 7, 214, 148, 14, 7, 214, 147, 14, 7, 214, - 146, 14, 7, 214, 145, 14, 7, 214, 144, 14, 7, 214, 143, 14, 7, 214, 142, - 14, 7, 214, 141, 14, 7, 214, 140, 14, 7, 214, 139, 14, 7, 214, 138, 14, - 7, 214, 137, 14, 7, 214, 136, 14, 7, 214, 135, 14, 7, 214, 134, 14, 7, - 214, 133, 14, 7, 214, 132, 14, 7, 214, 131, 14, 7, 214, 130, 14, 7, 214, - 129, 14, 7, 214, 128, 14, 7, 214, 127, 14, 7, 214, 126, 14, 7, 214, 125, - 14, 7, 214, 124, 14, 7, 214, 123, 14, 7, 214, 122, 14, 7, 214, 121, 14, - 7, 214, 120, 14, 7, 214, 119, 14, 7, 213, 194, 14, 7, 213, 193, 14, 7, - 213, 192, 14, 7, 213, 191, 14, 7, 213, 190, 14, 7, 213, 189, 14, 7, 213, - 188, 14, 7, 213, 187, 14, 7, 213, 186, 14, 7, 213, 185, 14, 7, 213, 184, - 14, 7, 213, 183, 14, 7, 213, 182, 14, 7, 211, 115, 14, 7, 211, 114, 14, - 7, 211, 113, 14, 7, 211, 112, 14, 7, 211, 111, 14, 7, 211, 110, 14, 7, - 211, 109, 14, 7, 210, 235, 14, 7, 210, 234, 14, 7, 210, 233, 14, 7, 210, - 232, 14, 7, 210, 231, 14, 7, 210, 230, 14, 7, 210, 229, 14, 7, 210, 228, - 14, 7, 210, 227, 14, 7, 210, 226, 14, 7, 210, 225, 14, 7, 210, 224, 14, - 7, 210, 223, 14, 7, 210, 222, 14, 7, 210, 221, 14, 7, 210, 220, 14, 7, - 210, 219, 14, 7, 210, 218, 14, 7, 210, 217, 14, 7, 210, 216, 14, 7, 210, - 215, 14, 7, 210, 214, 14, 7, 210, 213, 14, 7, 210, 212, 14, 7, 210, 211, - 14, 7, 210, 210, 14, 7, 210, 209, 14, 7, 210, 208, 14, 7, 210, 207, 14, - 7, 210, 206, 14, 7, 210, 205, 14, 7, 210, 204, 14, 7, 210, 203, 14, 7, - 210, 202, 14, 7, 209, 32, 14, 7, 209, 31, 14, 7, 209, 30, 14, 7, 209, 29, - 14, 7, 209, 28, 14, 7, 209, 27, 14, 7, 209, 26, 14, 7, 209, 25, 14, 7, - 209, 24, 14, 7, 209, 23, 14, 7, 209, 22, 14, 7, 209, 21, 14, 7, 209, 20, - 14, 7, 209, 19, 14, 7, 209, 18, 14, 7, 209, 17, 14, 7, 209, 16, 14, 7, - 209, 15, 14, 7, 209, 14, 14, 7, 209, 13, 14, 7, 209, 12, 14, 7, 209, 11, - 14, 7, 209, 10, 14, 7, 209, 9, 14, 7, 209, 8, 14, 7, 209, 7, 14, 7, 209, - 6, 14, 7, 209, 5, 14, 7, 209, 4, 14, 7, 209, 3, 14, 7, 209, 2, 14, 7, - 209, 1, 14, 7, 209, 0, 14, 7, 208, 255, 14, 7, 208, 254, 14, 7, 208, 253, - 14, 7, 208, 252, 14, 7, 208, 251, 14, 7, 208, 250, 14, 7, 208, 249, 14, - 7, 208, 248, 14, 7, 208, 247, 14, 7, 208, 246, 14, 7, 208, 245, 14, 7, - 208, 244, 14, 7, 208, 243, 14, 7, 208, 242, 14, 7, 208, 241, 14, 7, 208, - 240, 14, 7, 208, 239, 14, 7, 208, 238, 14, 7, 208, 237, 14, 7, 208, 236, - 14, 7, 208, 235, 14, 7, 203, 182, 14, 7, 203, 181, 14, 7, 203, 180, 14, - 7, 203, 179, 14, 7, 203, 178, 14, 7, 203, 177, 14, 7, 203, 176, 14, 7, - 203, 175, 14, 7, 203, 174, 14, 7, 203, 173, 14, 7, 203, 172, 14, 7, 203, - 171, 14, 7, 203, 170, 14, 7, 203, 169, 14, 7, 203, 168, 14, 7, 203, 167, - 14, 7, 203, 166, 14, 7, 203, 165, 14, 7, 203, 164, 14, 7, 203, 163, 14, - 7, 203, 162, 14, 7, 203, 161, 14, 7, 203, 160, 14, 7, 203, 159, 14, 7, - 203, 158, 14, 7, 203, 157, 14, 7, 203, 156, 14, 7, 203, 155, 14, 7, 203, - 154, 14, 7, 203, 153, 14, 7, 203, 152, 14, 7, 203, 151, 14, 7, 203, 150, - 14, 7, 203, 149, 14, 7, 203, 148, 14, 7, 203, 147, 14, 7, 203, 146, 14, - 7, 203, 145, 14, 7, 203, 144, 14, 7, 203, 143, 14, 7, 203, 142, 14, 7, - 203, 141, 14, 7, 203, 140, 14, 7, 203, 139, 14, 7, 200, 145, 14, 7, 200, - 144, 14, 7, 200, 143, 14, 7, 200, 142, 14, 7, 200, 141, 14, 7, 200, 140, - 14, 7, 200, 139, 14, 7, 200, 138, 14, 7, 200, 137, 14, 7, 200, 136, 14, - 7, 200, 135, 14, 7, 200, 134, 14, 7, 200, 133, 14, 7, 200, 132, 14, 7, - 200, 131, 14, 7, 200, 130, 14, 7, 200, 129, 14, 7, 200, 128, 14, 7, 200, - 127, 14, 7, 200, 126, 14, 7, 200, 125, 14, 7, 200, 124, 14, 7, 200, 123, - 14, 7, 200, 122, 14, 7, 200, 121, 14, 7, 200, 120, 14, 7, 200, 119, 14, - 7, 200, 118, 14, 7, 200, 117, 14, 7, 200, 116, 14, 7, 200, 115, 14, 7, - 200, 114, 14, 7, 200, 113, 14, 7, 200, 112, 14, 7, 200, 111, 14, 7, 200, - 110, 14, 7, 200, 109, 14, 7, 200, 108, 14, 7, 200, 107, 14, 7, 200, 106, - 14, 7, 200, 105, 14, 7, 200, 104, 14, 7, 200, 103, 14, 7, 200, 102, 14, - 7, 200, 101, 14, 7, 200, 100, 14, 7, 200, 99, 14, 7, 199, 214, 14, 7, - 199, 213, 14, 7, 199, 212, 14, 7, 199, 211, 14, 7, 199, 210, 14, 7, 199, - 209, 14, 7, 199, 208, 14, 7, 199, 207, 14, 7, 199, 206, 14, 7, 199, 205, - 14, 7, 199, 204, 14, 7, 199, 203, 14, 7, 199, 202, 14, 7, 199, 201, 14, - 7, 199, 200, 14, 7, 199, 199, 14, 7, 199, 198, 14, 7, 199, 197, 14, 7, - 199, 196, 14, 7, 199, 195, 14, 7, 199, 194, 14, 7, 199, 193, 14, 7, 199, - 192, 14, 7, 199, 191, 14, 7, 199, 190, 14, 7, 199, 189, 14, 7, 199, 188, - 14, 7, 199, 187, 14, 7, 199, 186, 14, 7, 199, 185, 14, 7, 199, 184, 14, - 7, 199, 183, 14, 7, 199, 182, 14, 7, 199, 181, 14, 7, 199, 180, 14, 7, - 199, 179, 14, 7, 199, 178, 14, 7, 199, 177, 14, 7, 199, 176, 14, 7, 199, - 175, 14, 7, 199, 174, 14, 7, 199, 173, 14, 7, 199, 172, 14, 7, 199, 171, - 14, 7, 199, 170, 14, 7, 199, 169, 14, 7, 199, 168, 14, 7, 199, 167, 14, - 7, 199, 166, 14, 7, 199, 165, 14, 7, 199, 164, 14, 7, 199, 163, 14, 7, - 199, 162, 14, 7, 199, 161, 14, 7, 199, 160, 14, 7, 199, 159, 14, 7, 199, - 158, 14, 7, 199, 157, 14, 7, 199, 156, 14, 7, 199, 155, 14, 7, 199, 154, - 14, 7, 199, 153, 14, 7, 199, 152, 14, 7, 199, 151, 14, 7, 199, 150, 14, - 7, 199, 149, 14, 7, 199, 148, 14, 7, 199, 147, 14, 7, 199, 146, 14, 7, - 199, 145, 14, 7, 199, 144, 14, 7, 199, 143, 14, 7, 199, 142, 14, 7, 199, - 141, 14, 7, 199, 140, 14, 7, 199, 139, 14, 7, 199, 138, 14, 7, 197, 188, - 14, 7, 197, 187, 14, 7, 197, 186, 14, 7, 197, 185, 14, 7, 197, 184, 14, - 7, 197, 183, 14, 7, 197, 182, 14, 7, 197, 181, 14, 7, 197, 180, 14, 7, - 197, 179, 14, 7, 197, 178, 14, 7, 197, 177, 14, 7, 197, 176, 14, 7, 197, - 175, 14, 7, 197, 174, 14, 7, 197, 173, 14, 7, 197, 172, 14, 7, 197, 171, - 14, 7, 197, 170, 14, 7, 197, 169, 14, 7, 197, 168, 14, 7, 197, 167, 14, - 7, 197, 166, 14, 7, 197, 165, 14, 7, 197, 164, 14, 7, 197, 163, 14, 7, - 197, 162, 14, 7, 197, 161, 14, 7, 197, 160, 14, 7, 197, 159, 14, 7, 197, - 158, 14, 7, 197, 157, 14, 7, 196, 214, 14, 7, 196, 213, 14, 7, 196, 212, - 14, 7, 196, 211, 14, 7, 196, 210, 14, 7, 196, 209, 14, 7, 196, 208, 14, - 7, 196, 207, 14, 7, 196, 206, 14, 7, 196, 205, 14, 7, 196, 204, 14, 7, - 196, 203, 14, 7, 196, 141, 14, 7, 196, 140, 14, 7, 196, 139, 14, 7, 196, - 138, 14, 7, 196, 137, 14, 7, 196, 136, 14, 7, 196, 135, 14, 7, 196, 134, - 14, 7, 196, 133, 14, 7, 195, 156, 14, 7, 195, 155, 14, 7, 195, 154, 14, - 7, 195, 153, 14, 7, 195, 152, 14, 7, 195, 151, 14, 7, 195, 150, 14, 7, - 195, 149, 14, 7, 195, 148, 14, 7, 195, 147, 14, 7, 195, 146, 14, 7, 195, - 145, 14, 7, 195, 144, 14, 7, 195, 143, 14, 7, 195, 142, 14, 7, 195, 141, - 14, 7, 195, 140, 14, 7, 195, 139, 14, 7, 195, 138, 14, 7, 195, 137, 14, - 7, 195, 136, 14, 7, 195, 135, 14, 7, 195, 134, 14, 7, 195, 133, 14, 7, - 195, 132, 14, 7, 195, 131, 14, 7, 195, 130, 14, 7, 195, 129, 14, 7, 195, - 128, 14, 7, 195, 127, 14, 7, 195, 126, 14, 7, 195, 125, 14, 7, 195, 124, - 14, 7, 195, 123, 14, 7, 195, 122, 14, 7, 195, 121, 14, 7, 195, 120, 14, - 7, 195, 119, 14, 7, 195, 118, 14, 7, 195, 117, 14, 7, 195, 116, 14, 7, - 252, 9, 14, 7, 252, 8, 14, 7, 252, 7, 14, 7, 252, 6, 14, 7, 252, 5, 14, - 7, 252, 4, 14, 7, 252, 3, 14, 7, 252, 2, 14, 7, 252, 1, 14, 7, 252, 0, - 14, 7, 251, 255, 14, 7, 251, 254, 14, 7, 251, 253, 14, 7, 251, 252, 14, - 7, 251, 251, 14, 7, 251, 250, 14, 7, 251, 249, 14, 7, 251, 248, 14, 7, - 251, 247, 14, 7, 251, 246, 14, 7, 251, 245, 14, 7, 251, 244, 14, 7, 251, - 243, 14, 7, 251, 242, 14, 7, 251, 241, 14, 7, 251, 240, 14, 7, 251, 239, - 14, 7, 251, 238, 14, 7, 251, 237, 14, 7, 251, 236, 14, 7, 251, 235, 14, - 7, 251, 234, 14, 7, 251, 233, 14, 7, 251, 232, 28, 7, 255, 3, 28, 7, 255, - 2, 28, 7, 255, 1, 28, 7, 255, 0, 28, 7, 254, 255, 28, 7, 254, 253, 28, 7, - 254, 250, 28, 7, 254, 249, 28, 7, 254, 248, 28, 7, 254, 247, 28, 7, 254, - 246, 28, 7, 254, 245, 28, 7, 254, 244, 28, 7, 254, 243, 28, 7, 254, 242, - 28, 7, 254, 240, 28, 7, 254, 239, 28, 7, 254, 238, 28, 7, 254, 236, 28, - 7, 254, 235, 28, 7, 254, 234, 28, 7, 254, 233, 28, 7, 254, 232, 28, 7, - 254, 231, 28, 7, 254, 230, 28, 7, 254, 229, 28, 7, 254, 228, 28, 7, 254, - 227, 28, 7, 254, 226, 28, 7, 254, 225, 28, 7, 254, 223, 28, 7, 254, 222, - 28, 7, 254, 221, 28, 7, 254, 220, 28, 7, 254, 218, 28, 7, 254, 217, 28, - 7, 254, 216, 28, 7, 254, 215, 28, 7, 254, 214, 28, 7, 254, 213, 28, 7, - 254, 212, 28, 7, 254, 211, 28, 7, 254, 210, 28, 7, 254, 208, 28, 7, 254, - 207, 28, 7, 254, 206, 28, 7, 254, 204, 28, 7, 254, 202, 28, 7, 254, 201, - 28, 7, 254, 200, 28, 7, 254, 199, 28, 7, 254, 198, 28, 7, 254, 197, 28, - 7, 254, 196, 28, 7, 254, 195, 28, 7, 254, 194, 28, 7, 254, 193, 28, 7, - 254, 192, 28, 7, 254, 191, 28, 7, 254, 190, 28, 7, 254, 189, 28, 7, 254, - 188, 28, 7, 254, 187, 28, 7, 254, 186, 28, 7, 254, 185, 28, 7, 254, 184, - 28, 7, 254, 183, 28, 7, 254, 182, 28, 7, 254, 181, 28, 7, 254, 180, 28, - 7, 254, 179, 28, 7, 254, 178, 28, 7, 254, 177, 28, 7, 254, 176, 28, 7, - 254, 175, 28, 7, 254, 174, 28, 7, 254, 173, 28, 7, 254, 172, 28, 7, 254, - 171, 28, 7, 254, 170, 28, 7, 254, 169, 28, 7, 254, 168, 28, 7, 254, 167, - 28, 7, 254, 166, 28, 7, 254, 165, 28, 7, 254, 164, 28, 7, 254, 163, 28, - 7, 254, 162, 28, 7, 254, 161, 28, 7, 254, 160, 28, 7, 254, 159, 28, 7, - 254, 158, 28, 7, 254, 157, 28, 7, 254, 156, 28, 7, 254, 155, 28, 7, 254, - 154, 28, 7, 254, 153, 28, 7, 254, 152, 28, 7, 254, 151, 28, 7, 254, 150, - 28, 7, 254, 149, 28, 7, 254, 148, 28, 7, 254, 147, 28, 7, 254, 146, 28, - 7, 254, 145, 28, 7, 254, 144, 28, 7, 254, 143, 28, 7, 254, 142, 28, 7, - 254, 141, 28, 7, 254, 140, 28, 7, 254, 139, 28, 7, 254, 138, 28, 7, 254, - 136, 28, 7, 254, 135, 28, 7, 254, 134, 28, 7, 254, 133, 28, 7, 254, 132, - 28, 7, 254, 131, 28, 7, 254, 130, 28, 7, 254, 129, 28, 7, 254, 128, 28, - 7, 254, 127, 28, 7, 254, 126, 28, 7, 254, 125, 28, 7, 254, 124, 28, 7, - 254, 123, 28, 7, 254, 122, 28, 7, 254, 121, 28, 7, 254, 120, 28, 7, 254, - 119, 28, 7, 254, 118, 28, 7, 254, 117, 28, 7, 254, 116, 28, 7, 254, 115, - 28, 7, 254, 114, 28, 7, 254, 113, 28, 7, 254, 112, 28, 7, 254, 111, 28, - 7, 254, 110, 28, 7, 254, 109, 28, 7, 254, 108, 28, 7, 254, 107, 28, 7, - 254, 106, 28, 7, 254, 105, 28, 7, 254, 104, 28, 7, 254, 103, 28, 7, 254, - 101, 28, 7, 254, 100, 28, 7, 254, 99, 28, 7, 254, 98, 28, 7, 254, 97, 28, - 7, 254, 96, 28, 7, 254, 95, 28, 7, 254, 94, 28, 7, 254, 93, 28, 7, 254, - 92, 28, 7, 254, 91, 28, 7, 254, 90, 28, 7, 254, 88, 28, 7, 254, 87, 28, - 7, 254, 86, 28, 7, 254, 85, 28, 7, 254, 84, 28, 7, 254, 83, 28, 7, 254, - 82, 28, 7, 254, 81, 28, 7, 254, 80, 28, 7, 254, 79, 28, 7, 254, 78, 28, - 7, 254, 77, 28, 7, 254, 76, 28, 7, 254, 75, 28, 7, 254, 74, 28, 7, 254, - 73, 28, 7, 254, 72, 28, 7, 254, 71, 28, 7, 254, 70, 28, 7, 254, 69, 28, - 7, 254, 68, 28, 7, 254, 67, 28, 7, 254, 66, 28, 7, 254, 65, 28, 7, 254, - 64, 28, 7, 254, 63, 28, 7, 254, 62, 28, 7, 254, 61, 28, 7, 254, 60, 28, - 7, 254, 59, 28, 7, 254, 58, 28, 7, 254, 57, 28, 7, 254, 56, 28, 7, 254, - 55, 28, 7, 254, 54, 28, 7, 254, 53, 28, 7, 254, 52, 28, 7, 254, 51, 28, - 7, 254, 50, 28, 7, 254, 49, 28, 7, 254, 48, 28, 7, 254, 47, 28, 7, 254, - 46, 28, 7, 254, 45, 28, 7, 254, 44, 28, 7, 254, 43, 28, 7, 254, 42, 28, - 7, 254, 41, 28, 7, 254, 40, 28, 7, 254, 39, 28, 7, 254, 38, 28, 7, 254, - 37, 28, 7, 254, 36, 28, 7, 254, 35, 28, 7, 254, 34, 28, 7, 254, 33, 28, - 7, 254, 32, 28, 7, 254, 31, 28, 7, 254, 30, 28, 7, 254, 29, 28, 7, 254, - 28, 28, 7, 254, 27, 28, 7, 254, 26, 28, 7, 254, 25, 28, 7, 254, 24, 28, - 7, 254, 23, 28, 7, 254, 22, 28, 7, 254, 21, 28, 7, 254, 20, 28, 7, 254, - 18, 28, 7, 254, 17, 28, 7, 254, 16, 28, 7, 254, 15, 28, 7, 254, 14, 28, - 7, 254, 13, 28, 7, 254, 12, 28, 7, 254, 11, 28, 7, 254, 10, 28, 7, 254, - 9, 28, 7, 254, 8, 28, 7, 254, 7, 28, 7, 254, 6, 28, 7, 254, 5, 28, 7, - 254, 4, 28, 7, 254, 3, 28, 7, 254, 2, 28, 7, 254, 1, 28, 7, 254, 0, 28, - 7, 253, 255, 28, 7, 253, 254, 28, 7, 253, 253, 28, 7, 253, 252, 28, 7, - 253, 251, 28, 7, 253, 250, 28, 7, 253, 249, 28, 7, 253, 248, 28, 7, 253, - 247, 28, 7, 253, 246, 28, 7, 253, 245, 28, 7, 253, 244, 28, 7, 253, 243, - 28, 7, 253, 242, 28, 7, 253, 241, 28, 7, 253, 240, 28, 7, 253, 239, 28, - 7, 253, 238, 28, 7, 253, 237, 28, 7, 253, 236, 28, 7, 253, 235, 28, 7, - 253, 234, 28, 7, 253, 233, 28, 7, 253, 232, 28, 7, 253, 231, 28, 7, 253, - 230, 28, 7, 253, 229, 28, 7, 253, 228, 28, 7, 253, 227, 28, 7, 253, 226, - 28, 7, 253, 225, 28, 7, 253, 224, 28, 7, 253, 223, 28, 7, 253, 222, 28, - 7, 253, 221, 28, 7, 253, 220, 28, 7, 253, 219, 28, 7, 253, 218, 28, 7, - 253, 217, 28, 7, 253, 216, 28, 7, 253, 215, 28, 7, 253, 214, 28, 7, 253, - 213, 28, 7, 253, 212, 28, 7, 253, 211, 28, 7, 253, 210, 28, 7, 253, 209, - 28, 7, 253, 208, 28, 7, 253, 207, 28, 7, 253, 206, 28, 7, 253, 205, 28, - 7, 253, 204, 28, 7, 253, 203, 28, 7, 253, 202, 28, 7, 253, 201, 28, 7, - 253, 200, 28, 7, 253, 199, 28, 7, 253, 198, 28, 7, 253, 197, 28, 7, 253, - 196, 28, 7, 253, 195, 28, 7, 253, 194, 28, 7, 253, 193, 28, 7, 253, 192, - 28, 7, 253, 191, 28, 7, 253, 190, 28, 7, 253, 189, 28, 7, 253, 188, 28, - 7, 253, 187, 28, 7, 253, 186, 28, 7, 253, 185, 28, 7, 253, 184, 28, 7, - 253, 183, 28, 7, 253, 182, 28, 7, 253, 181, 28, 7, 253, 180, 28, 7, 253, - 179, 28, 7, 253, 178, 28, 7, 253, 177, 28, 7, 253, 176, 28, 7, 253, 175, - 28, 7, 253, 174, 28, 7, 253, 173, 28, 7, 253, 172, 28, 7, 253, 171, 28, - 7, 253, 170, 28, 7, 253, 169, 28, 7, 253, 168, 28, 7, 253, 167, 28, 7, - 253, 166, 28, 7, 253, 165, 28, 7, 253, 164, 28, 7, 253, 162, 28, 7, 253, - 161, 28, 7, 253, 160, 28, 7, 253, 159, 28, 7, 253, 158, 28, 7, 253, 157, - 28, 7, 253, 156, 28, 7, 253, 155, 28, 7, 253, 154, 28, 7, 253, 153, 28, - 7, 253, 152, 28, 7, 253, 149, 28, 7, 253, 148, 28, 7, 253, 147, 28, 7, - 253, 146, 28, 7, 253, 142, 28, 7, 253, 141, 28, 7, 253, 140, 28, 7, 253, - 139, 28, 7, 253, 138, 28, 7, 253, 137, 28, 7, 253, 136, 28, 7, 253, 135, - 28, 7, 253, 134, 28, 7, 253, 133, 28, 7, 253, 132, 28, 7, 253, 131, 28, - 7, 253, 130, 28, 7, 253, 129, 28, 7, 253, 128, 28, 7, 253, 127, 28, 7, - 253, 126, 28, 7, 253, 125, 28, 7, 253, 124, 28, 7, 253, 122, 28, 7, 253, - 121, 28, 7, 253, 120, 28, 7, 253, 119, 28, 7, 253, 118, 28, 7, 253, 117, - 28, 7, 253, 116, 28, 7, 253, 115, 28, 7, 253, 114, 28, 7, 253, 113, 28, - 7, 253, 112, 28, 7, 253, 111, 28, 7, 253, 110, 28, 7, 253, 109, 28, 7, - 253, 108, 28, 7, 253, 107, 28, 7, 253, 106, 28, 7, 253, 105, 28, 7, 253, - 104, 28, 7, 253, 103, 28, 7, 253, 102, 28, 7, 253, 101, 28, 7, 253, 100, - 28, 7, 253, 99, 28, 7, 253, 98, 28, 7, 253, 97, 28, 7, 253, 96, 28, 7, - 253, 95, 28, 7, 253, 94, 28, 7, 253, 93, 28, 7, 253, 92, 28, 7, 253, 91, - 28, 7, 253, 90, 28, 7, 253, 89, 28, 7, 253, 88, 28, 7, 253, 87, 28, 7, - 253, 86, 28, 7, 253, 85, 28, 7, 253, 84, 28, 7, 253, 83, 28, 7, 253, 82, - 28, 7, 253, 81, 28, 7, 253, 80, 28, 7, 253, 79, 28, 7, 253, 78, 28, 7, - 253, 77, 28, 7, 253, 76, 28, 7, 253, 75, 28, 7, 253, 74, 28, 7, 253, 73, - 28, 7, 253, 72, 28, 7, 253, 71, 28, 7, 253, 70, 28, 7, 253, 69, 28, 7, - 253, 68, 28, 7, 253, 67, 28, 7, 253, 66, 28, 7, 253, 65, 28, 7, 253, 64, - 28, 7, 253, 63, 28, 7, 253, 62, 28, 7, 253, 61, 210, 201, 214, 4, 210, - 23, 28, 7, 253, 60, 28, 7, 253, 59, 28, 7, 253, 58, 28, 7, 253, 57, 28, - 7, 253, 56, 28, 7, 253, 55, 28, 7, 253, 54, 28, 7, 253, 53, 28, 7, 253, - 52, 28, 7, 253, 51, 28, 7, 253, 50, 28, 7, 253, 49, 178, 28, 7, 253, 48, - 28, 7, 253, 47, 28, 7, 253, 46, 28, 7, 253, 45, 28, 7, 253, 44, 28, 7, - 253, 43, 28, 7, 253, 42, 28, 7, 253, 40, 28, 7, 253, 38, 28, 7, 253, 36, - 28, 7, 253, 34, 28, 7, 253, 32, 28, 7, 253, 30, 28, 7, 253, 28, 28, 7, - 253, 26, 28, 7, 253, 24, 28, 7, 253, 22, 248, 97, 221, 152, 78, 28, 7, - 253, 20, 236, 98, 221, 152, 78, 28, 7, 253, 19, 28, 7, 253, 17, 28, 7, - 253, 15, 28, 7, 253, 13, 28, 7, 253, 11, 28, 7, 253, 9, 28, 7, 253, 7, - 28, 7, 253, 5, 28, 7, 253, 3, 28, 7, 253, 2, 28, 7, 253, 1, 28, 7, 253, - 0, 28, 7, 252, 255, 28, 7, 252, 254, 28, 7, 252, 253, 28, 7, 252, 252, - 28, 7, 252, 251, 28, 7, 252, 250, 28, 7, 252, 249, 28, 7, 252, 248, 28, - 7, 252, 247, 28, 7, 252, 246, 28, 7, 252, 245, 28, 7, 252, 244, 28, 7, - 252, 243, 28, 7, 252, 242, 28, 7, 252, 241, 28, 7, 252, 240, 28, 7, 252, - 239, 28, 7, 252, 238, 28, 7, 252, 237, 28, 7, 252, 236, 28, 7, 252, 235, - 28, 7, 252, 234, 28, 7, 252, 233, 28, 7, 252, 232, 28, 7, 252, 231, 28, - 7, 252, 230, 28, 7, 252, 229, 28, 7, 252, 228, 28, 7, 252, 227, 28, 7, - 252, 226, 28, 7, 252, 225, 28, 7, 252, 224, 28, 7, 252, 223, 28, 7, 252, - 222, 28, 7, 252, 221, 28, 7, 252, 220, 28, 7, 252, 219, 28, 7, 252, 218, - 28, 7, 252, 217, 28, 7, 252, 216, 28, 7, 252, 215, 28, 7, 252, 214, 28, - 7, 252, 213, 28, 7, 252, 212, 28, 7, 252, 211, 28, 7, 252, 210, 28, 7, - 252, 209, 28, 7, 252, 208, 28, 7, 252, 207, 28, 7, 252, 206, 28, 7, 252, - 205, 28, 7, 252, 204, 28, 7, 252, 203, 28, 7, 252, 202, 28, 7, 252, 201, - 28, 7, 252, 200, 28, 7, 252, 199, 28, 7, 252, 198, 28, 7, 252, 197, 28, - 7, 252, 196, 28, 7, 252, 195, 28, 7, 252, 194, 28, 7, 252, 193, 28, 7, - 252, 192, 28, 7, 252, 191, 28, 7, 252, 190, 28, 7, 252, 189, 28, 7, 252, - 188, 28, 7, 252, 187, 28, 7, 252, 186, 28, 7, 252, 185, 28, 7, 252, 184, - 28, 7, 252, 183, 28, 7, 252, 182, 28, 7, 252, 181, 28, 7, 252, 180, 28, - 7, 252, 179, 28, 7, 252, 178, 28, 7, 252, 177, 28, 7, 252, 176, 28, 7, - 252, 175, 28, 7, 252, 174, 28, 7, 252, 173, 28, 7, 252, 172, 28, 7, 252, - 171, 28, 7, 252, 170, 28, 7, 252, 169, 28, 7, 252, 168, 28, 7, 252, 167, - 28, 7, 252, 166, 28, 7, 252, 165, 28, 7, 252, 164, 28, 7, 252, 163, 28, - 7, 252, 162, 28, 7, 252, 161, 28, 7, 252, 160, 28, 7, 252, 159, 28, 7, - 252, 158, 28, 7, 252, 157, 28, 7, 252, 156, 28, 7, 252, 155, 28, 7, 252, - 154, 28, 7, 252, 153, 28, 7, 252, 152, 28, 7, 252, 151, 28, 7, 252, 150, - 28, 7, 252, 149, 25, 1, 212, 195, 216, 177, 219, 29, 25, 1, 212, 195, - 233, 194, 234, 180, 25, 1, 212, 195, 212, 39, 219, 30, 212, 111, 25, 1, - 212, 195, 212, 39, 219, 30, 212, 112, 25, 1, 212, 195, 217, 159, 219, 29, - 25, 1, 212, 195, 206, 103, 25, 1, 212, 195, 202, 28, 219, 29, 25, 1, 212, - 195, 214, 238, 219, 29, 25, 1, 212, 195, 206, 166, 213, 180, 216, 66, 25, - 1, 212, 195, 212, 39, 213, 180, 216, 67, 212, 111, 25, 1, 212, 195, 212, - 39, 213, 180, 216, 67, 212, 112, 25, 1, 212, 195, 220, 3, 25, 1, 212, - 195, 201, 21, 220, 4, 25, 1, 212, 195, 216, 238, 25, 1, 212, 195, 220, 0, - 25, 1, 212, 195, 219, 209, 25, 1, 212, 195, 217, 248, 25, 1, 212, 195, - 207, 29, 25, 1, 212, 195, 215, 118, 25, 1, 212, 195, 224, 57, 25, 1, 212, - 195, 216, 34, 25, 1, 212, 195, 204, 41, 25, 1, 212, 195, 216, 176, 25, 1, - 212, 195, 222, 132, 25, 1, 212, 195, 222, 39, 223, 45, 25, 1, 212, 195, - 215, 128, 219, 37, 25, 1, 212, 195, 220, 7, 25, 1, 212, 195, 213, 65, 25, - 1, 212, 195, 233, 93, 25, 1, 212, 195, 213, 133, 25, 1, 212, 195, 218, - 125, 216, 211, 25, 1, 212, 195, 214, 219, 219, 40, 25, 1, 212, 195, 115, - 195, 186, 217, 152, 25, 1, 212, 195, 233, 94, 25, 1, 212, 195, 215, 128, - 215, 129, 25, 1, 212, 195, 205, 245, 25, 1, 212, 195, 219, 22, 25, 1, - 212, 195, 219, 43, 25, 1, 212, 195, 218, 100, 25, 1, 212, 195, 224, 182, - 25, 1, 212, 195, 213, 180, 222, 87, 25, 1, 212, 195, 217, 76, 222, 87, - 25, 1, 212, 195, 212, 217, 25, 1, 212, 195, 220, 1, 25, 1, 212, 195, 216, - 107, 25, 1, 212, 195, 211, 155, 25, 1, 212, 195, 201, 13, 25, 1, 212, - 195, 221, 91, 25, 1, 212, 195, 205, 134, 25, 1, 212, 195, 202, 211, 25, - 1, 212, 195, 219, 254, 25, 1, 212, 195, 224, 64, 25, 1, 212, 195, 217, - 72, 25, 1, 212, 195, 223, 58, 25, 1, 212, 195, 218, 101, 25, 1, 212, 195, - 206, 99, 25, 1, 212, 195, 221, 145, 25, 1, 212, 195, 234, 250, 25, 1, - 212, 195, 209, 162, 25, 1, 212, 195, 223, 111, 25, 1, 212, 195, 205, 130, - 25, 1, 212, 195, 219, 205, 212, 153, 25, 1, 212, 195, 206, 159, 25, 1, - 212, 195, 215, 127, 25, 1, 212, 195, 206, 141, 215, 138, 195, 194, 25, 1, - 212, 195, 215, 4, 218, 121, 25, 1, 212, 195, 213, 175, 25, 1, 212, 195, - 216, 36, 25, 1, 212, 195, 200, 27, 25, 1, 212, 195, 216, 214, 25, 1, 212, - 195, 219, 253, 25, 1, 212, 195, 216, 78, 25, 1, 212, 195, 219, 143, 25, - 1, 212, 195, 215, 18, 25, 1, 212, 195, 202, 215, 25, 1, 212, 195, 205, - 127, 25, 1, 212, 195, 213, 176, 25, 1, 212, 195, 215, 142, 25, 1, 212, - 195, 220, 5, 25, 1, 212, 195, 215, 15, 25, 1, 212, 195, 224, 144, 25, 1, - 212, 195, 215, 145, 25, 1, 212, 195, 199, 100, 25, 1, 212, 195, 221, 95, - 25, 1, 212, 195, 217, 17, 25, 1, 212, 195, 217, 127, 25, 1, 212, 195, - 219, 142, 25, 1, 212, 194, 215, 140, 25, 1, 212, 194, 201, 21, 220, 2, - 25, 1, 212, 194, 206, 51, 25, 1, 212, 194, 207, 33, 201, 20, 25, 1, 212, - 194, 221, 147, 215, 124, 25, 1, 212, 194, 219, 149, 220, 6, 25, 1, 212, - 194, 223, 233, 25, 1, 212, 194, 196, 28, 25, 1, 212, 194, 219, 144, 25, - 1, 212, 194, 224, 168, 25, 1, 212, 194, 213, 18, 25, 1, 212, 194, 196, - 110, 222, 87, 25, 1, 212, 194, 222, 151, 215, 138, 215, 29, 25, 1, 212, - 194, 215, 121, 206, 185, 25, 1, 212, 194, 217, 43, 216, 81, 25, 1, 212, - 194, 233, 91, 25, 1, 212, 194, 212, 101, 25, 1, 212, 194, 201, 21, 215, - 136, 25, 1, 212, 194, 206, 190, 216, 76, 25, 1, 212, 194, 206, 186, 25, - 1, 212, 194, 219, 30, 202, 214, 25, 1, 212, 194, 219, 131, 219, 145, 25, - 1, 212, 194, 215, 16, 215, 124, 25, 1, 212, 194, 224, 53, 25, 1, 212, - 194, 233, 92, 25, 1, 212, 194, 224, 49, 25, 1, 212, 194, 222, 234, 25, 1, - 212, 194, 213, 68, 25, 1, 212, 194, 199, 31, 25, 1, 212, 194, 216, 178, - 217, 246, 25, 1, 212, 194, 216, 213, 219, 127, 25, 1, 212, 194, 196, 235, - 25, 1, 212, 194, 208, 202, 25, 1, 212, 194, 203, 126, 25, 1, 212, 194, - 219, 42, 25, 1, 212, 194, 216, 197, 25, 1, 212, 194, 216, 198, 222, 129, - 25, 1, 212, 194, 219, 32, 25, 1, 212, 194, 204, 94, 25, 1, 212, 194, 219, - 135, 25, 1, 212, 194, 218, 105, 25, 1, 212, 194, 215, 32, 25, 1, 212, - 194, 211, 159, 25, 1, 212, 194, 219, 41, 216, 215, 25, 1, 212, 194, 235, - 38, 25, 1, 212, 194, 219, 122, 25, 1, 212, 194, 235, 62, 25, 1, 212, 194, - 224, 61, 25, 1, 212, 194, 220, 32, 216, 70, 25, 1, 212, 194, 220, 32, - 216, 46, 25, 1, 212, 194, 222, 38, 25, 1, 212, 194, 216, 221, 25, 1, 212, - 194, 215, 147, 25, 1, 212, 194, 168, 25, 1, 212, 194, 223, 217, 25, 1, - 212, 194, 216, 166, 25, 1, 186, 216, 177, 220, 4, 25, 1, 186, 214, 237, - 25, 1, 186, 195, 194, 25, 1, 186, 197, 135, 25, 1, 186, 216, 214, 25, 1, - 186, 217, 64, 25, 1, 186, 216, 184, 25, 1, 186, 233, 101, 25, 1, 186, - 219, 139, 25, 1, 186, 233, 201, 25, 1, 186, 215, 6, 218, 169, 219, 44, - 25, 1, 186, 215, 116, 219, 130, 25, 1, 186, 219, 136, 25, 1, 186, 212, - 107, 25, 1, 186, 217, 49, 25, 1, 186, 219, 147, 247, 32, 25, 1, 186, 224, - 51, 25, 1, 186, 233, 102, 25, 1, 186, 224, 58, 25, 1, 186, 195, 216, 218, - 21, 25, 1, 186, 214, 231, 25, 1, 186, 219, 124, 25, 1, 186, 215, 146, 25, - 1, 186, 219, 130, 25, 1, 186, 196, 29, 25, 1, 186, 223, 119, 25, 1, 186, - 224, 202, 25, 1, 186, 207, 28, 25, 1, 186, 217, 58, 25, 1, 186, 203, 124, - 25, 1, 186, 216, 50, 25, 1, 186, 202, 28, 195, 197, 25, 1, 186, 204, 126, - 25, 1, 186, 216, 204, 215, 29, 25, 1, 186, 199, 30, 25, 1, 186, 217, 130, - 25, 1, 186, 220, 32, 224, 60, 25, 1, 186, 215, 129, 25, 1, 186, 216, 199, - 25, 1, 186, 222, 133, 25, 1, 186, 219, 132, 25, 1, 186, 219, 21, 25, 1, - 186, 215, 123, 25, 1, 186, 202, 210, 25, 1, 186, 216, 201, 25, 1, 186, - 234, 102, 25, 1, 186, 217, 63, 25, 1, 186, 215, 148, 25, 1, 186, 215, - 144, 25, 1, 186, 247, 114, 25, 1, 186, 199, 32, 25, 1, 186, 219, 137, 25, - 1, 186, 209, 95, 25, 1, 186, 216, 80, 25, 1, 186, 222, 150, 25, 1, 186, - 202, 25, 25, 1, 186, 215, 130, 216, 166, 25, 1, 186, 216, 72, 25, 1, 186, - 224, 64, 25, 1, 186, 216, 206, 25, 1, 186, 219, 253, 25, 1, 186, 219, - 125, 25, 1, 186, 221, 95, 25, 1, 186, 223, 45, 25, 1, 186, 216, 78, 25, - 1, 186, 216, 166, 25, 1, 186, 196, 225, 25, 1, 186, 216, 202, 25, 1, 186, - 215, 133, 25, 1, 186, 215, 125, 25, 1, 186, 223, 60, 216, 36, 25, 1, 186, - 215, 131, 25, 1, 186, 217, 71, 25, 1, 186, 220, 32, 215, 136, 25, 1, 186, - 196, 124, 25, 1, 186, 217, 70, 25, 1, 186, 206, 102, 25, 1, 186, 207, 31, - 25, 1, 186, 219, 133, 25, 1, 186, 220, 4, 25, 1, 186, 219, 143, 25, 1, - 186, 224, 52, 25, 1, 186, 219, 134, 25, 1, 186, 224, 56, 25, 1, 186, 219, - 147, 212, 158, 25, 1, 186, 195, 177, 25, 1, 186, 216, 68, 25, 1, 186, - 218, 224, 25, 1, 186, 218, 50, 25, 1, 186, 206, 162, 25, 1, 186, 224, 75, - 222, 111, 25, 1, 186, 224, 75, 235, 75, 25, 1, 186, 216, 236, 25, 1, 186, - 217, 127, 25, 1, 186, 221, 215, 25, 1, 186, 212, 119, 25, 1, 186, 213, 8, - 25, 1, 186, 202, 226, 25, 1, 146, 219, 123, 25, 1, 146, 197, 133, 25, 1, - 146, 216, 66, 25, 1, 146, 219, 29, 25, 1, 146, 216, 64, 25, 1, 146, 222, - 4, 25, 1, 146, 216, 69, 25, 1, 146, 215, 143, 25, 1, 146, 216, 220, 25, - 1, 146, 215, 29, 25, 1, 146, 196, 236, 25, 1, 146, 216, 174, 25, 1, 146, - 206, 209, 25, 1, 146, 216, 185, 25, 1, 146, 224, 59, 25, 1, 146, 202, - 212, 25, 1, 146, 206, 188, 25, 1, 146, 216, 77, 25, 1, 146, 204, 94, 25, - 1, 146, 224, 64, 25, 1, 146, 196, 112, 25, 1, 146, 223, 61, 25, 1, 146, - 208, 163, 25, 1, 146, 219, 34, 25, 1, 146, 217, 62, 25, 1, 146, 219, 225, - 25, 1, 146, 219, 40, 25, 1, 146, 207, 30, 25, 1, 146, 196, 55, 25, 1, - 146, 216, 71, 25, 1, 146, 224, 55, 219, 126, 25, 1, 146, 216, 181, 25, 1, - 146, 201, 20, 25, 1, 146, 233, 111, 25, 1, 146, 216, 171, 25, 1, 146, - 235, 39, 25, 1, 146, 217, 66, 25, 1, 146, 219, 13, 25, 1, 146, 222, 32, - 25, 1, 146, 217, 48, 25, 1, 146, 218, 120, 25, 1, 146, 219, 17, 25, 1, - 146, 211, 139, 25, 1, 146, 219, 15, 25, 1, 146, 219, 31, 25, 1, 146, 221, - 78, 25, 1, 146, 215, 135, 25, 1, 146, 219, 146, 25, 1, 146, 223, 35, 25, - 1, 146, 215, 18, 25, 1, 146, 202, 215, 25, 1, 146, 205, 127, 25, 1, 146, - 195, 177, 25, 1, 146, 224, 56, 25, 1, 146, 210, 177, 25, 1, 146, 203, 15, - 25, 1, 146, 216, 182, 25, 1, 146, 219, 36, 25, 1, 146, 215, 134, 25, 1, - 146, 224, 54, 25, 1, 146, 212, 113, 25, 1, 146, 212, 210, 25, 1, 146, - 214, 248, 25, 1, 146, 222, 38, 25, 1, 146, 216, 221, 25, 1, 146, 219, 33, - 25, 1, 146, 216, 194, 25, 1, 146, 195, 191, 25, 1, 146, 213, 102, 25, 1, - 146, 195, 190, 25, 1, 146, 217, 71, 25, 1, 146, 215, 124, 25, 1, 146, - 204, 128, 25, 1, 146, 223, 65, 25, 1, 146, 216, 210, 25, 1, 146, 216, - 179, 25, 1, 146, 200, 251, 25, 1, 146, 219, 44, 25, 1, 146, 223, 55, 25, - 1, 146, 215, 132, 25, 1, 146, 202, 213, 25, 1, 146, 219, 255, 25, 1, 146, - 216, 219, 25, 1, 146, 222, 31, 25, 1, 146, 216, 200, 25, 1, 146, 215, - 137, 25, 1, 146, 216, 50, 25, 1, 146, 233, 95, 25, 1, 146, 223, 86, 25, - 1, 146, 210, 78, 214, 62, 25, 1, 146, 203, 113, 25, 1, 146, 201, 218, 25, - 1, 146, 215, 15, 25, 1, 146, 209, 217, 25, 1, 146, 222, 89, 25, 1, 146, - 219, 96, 25, 1, 146, 221, 40, 25, 1, 146, 204, 41, 25, 1, 146, 218, 56, - 25, 1, 146, 206, 174, 25, 1, 146, 206, 184, 25, 1, 146, 223, 7, 25, 1, - 146, 215, 111, 25, 1, 146, 206, 108, 25, 1, 146, 215, 126, 25, 1, 146, - 213, 22, 25, 1, 146, 216, 141, 25, 1, 146, 206, 140, 25, 1, 146, 211, - 154, 25, 1, 146, 217, 246, 25, 1, 146, 221, 125, 25, 1, 146, 210, 78, - 218, 45, 25, 1, 146, 202, 94, 25, 1, 146, 215, 113, 25, 1, 146, 219, 147, - 182, 25, 1, 146, 208, 161, 25, 1, 146, 235, 117, 25, 1, 100, 217, 70, 25, - 1, 100, 201, 224, 25, 1, 100, 219, 136, 25, 1, 100, 222, 133, 25, 1, 100, - 198, 224, 25, 1, 100, 221, 131, 25, 1, 100, 213, 179, 25, 1, 100, 205, - 138, 25, 1, 100, 210, 151, 25, 1, 100, 215, 139, 25, 1, 100, 217, 41, 25, - 1, 100, 211, 172, 25, 1, 100, 203, 85, 25, 1, 100, 216, 187, 25, 1, 100, - 223, 115, 25, 1, 100, 196, 228, 25, 1, 100, 208, 85, 25, 1, 100, 216, - 211, 25, 1, 100, 213, 176, 25, 1, 100, 201, 226, 25, 1, 100, 223, 59, 25, - 1, 100, 221, 146, 25, 1, 100, 215, 142, 25, 1, 100, 216, 163, 25, 1, 100, - 220, 5, 25, 1, 100, 216, 180, 25, 1, 100, 216, 162, 25, 1, 100, 215, 141, - 25, 1, 100, 209, 214, 25, 1, 100, 216, 68, 25, 1, 100, 213, 20, 25, 1, - 100, 208, 224, 25, 1, 100, 216, 195, 25, 1, 100, 219, 23, 25, 1, 100, - 233, 89, 25, 1, 100, 216, 183, 25, 1, 100, 216, 79, 25, 1, 100, 219, 204, - 25, 1, 100, 221, 127, 25, 1, 100, 216, 216, 25, 1, 100, 217, 54, 25, 1, - 100, 203, 112, 215, 124, 25, 1, 100, 207, 32, 25, 1, 100, 211, 165, 25, - 1, 100, 217, 74, 205, 146, 25, 1, 100, 216, 203, 215, 29, 25, 1, 100, - 196, 16, 25, 1, 100, 233, 90, 25, 1, 100, 201, 14, 25, 1, 100, 196, 32, - 25, 1, 100, 212, 62, 25, 1, 100, 201, 1, 25, 1, 100, 224, 62, 25, 1, 100, - 204, 127, 25, 1, 100, 202, 214, 25, 1, 100, 199, 33, 25, 1, 100, 197, 77, - 25, 1, 100, 222, 237, 25, 1, 100, 211, 175, 25, 1, 100, 203, 125, 25, 1, - 100, 233, 110, 25, 1, 100, 216, 226, 25, 1, 100, 206, 187, 25, 1, 100, - 219, 18, 25, 1, 100, 219, 140, 25, 1, 100, 214, 235, 25, 1, 100, 216, 32, - 25, 1, 100, 233, 197, 25, 1, 100, 201, 2, 25, 1, 100, 223, 69, 25, 1, - 100, 196, 88, 25, 1, 100, 215, 16, 244, 84, 25, 1, 100, 196, 6, 25, 1, - 100, 219, 35, 25, 1, 100, 217, 59, 25, 1, 100, 212, 154, 25, 1, 100, 195, - 196, 25, 1, 100, 222, 33, 25, 1, 100, 234, 102, 25, 1, 100, 233, 196, 25, - 1, 100, 216, 173, 25, 1, 100, 224, 64, 25, 1, 100, 220, 8, 25, 1, 100, - 216, 186, 25, 1, 100, 233, 96, 25, 1, 100, 235, 118, 25, 1, 100, 215, - 114, 25, 1, 100, 212, 211, 25, 1, 100, 196, 30, 25, 1, 100, 216, 212, 25, - 1, 100, 215, 16, 248, 58, 25, 1, 100, 214, 215, 25, 1, 100, 212, 35, 25, - 1, 100, 218, 224, 25, 1, 100, 234, 100, 25, 1, 100, 217, 152, 25, 1, 100, - 218, 50, 25, 1, 100, 233, 95, 25, 1, 100, 234, 105, 68, 25, 1, 100, 217, - 247, 25, 1, 100, 211, 171, 25, 1, 100, 216, 175, 25, 1, 100, 223, 45, 25, - 1, 100, 212, 151, 25, 1, 100, 215, 127, 25, 1, 100, 196, 31, 25, 1, 100, - 216, 196, 25, 1, 100, 213, 180, 212, 250, 25, 1, 100, 234, 105, 247, 14, - 25, 1, 100, 234, 181, 25, 1, 100, 216, 73, 25, 1, 100, 63, 25, 1, 100, - 201, 218, 25, 1, 100, 74, 25, 1, 100, 68, 25, 1, 100, 222, 131, 25, 1, - 100, 213, 180, 212, 71, 25, 1, 100, 203, 130, 25, 1, 100, 203, 70, 25, 1, - 100, 217, 74, 217, 234, 230, 231, 25, 1, 100, 206, 162, 25, 1, 100, 196, - 27, 25, 1, 100, 216, 156, 25, 1, 100, 195, 201, 25, 1, 100, 195, 233, - 204, 20, 25, 1, 100, 195, 233, 240, 207, 25, 1, 100, 195, 185, 25, 1, - 100, 195, 193, 25, 1, 100, 224, 50, 25, 1, 100, 212, 209, 25, 1, 100, - 216, 74, 236, 53, 25, 1, 100, 211, 167, 25, 1, 100, 196, 234, 25, 1, 100, - 235, 62, 25, 1, 100, 199, 100, 25, 1, 100, 221, 95, 25, 1, 100, 218, 243, - 25, 1, 100, 210, 42, 25, 1, 100, 210, 178, 25, 1, 100, 216, 155, 25, 1, - 100, 216, 244, 25, 1, 100, 206, 154, 25, 1, 100, 206, 140, 25, 1, 100, - 234, 105, 210, 81, 25, 1, 100, 179, 25, 1, 100, 212, 163, 25, 1, 100, - 221, 125, 25, 1, 100, 223, 165, 25, 1, 100, 219, 73, 25, 1, 100, 168, 25, - 1, 100, 219, 201, 25, 1, 100, 202, 216, 25, 1, 100, 223, 249, 25, 1, 100, - 218, 124, 25, 1, 100, 202, 248, 25, 1, 100, 235, 86, 25, 1, 100, 233, 83, - 25, 1, 212, 193, 157, 25, 1, 212, 193, 66, 25, 1, 212, 193, 223, 86, 25, - 1, 212, 193, 236, 184, 25, 1, 212, 193, 210, 105, 25, 1, 212, 193, 203, - 113, 25, 1, 212, 193, 215, 15, 25, 1, 212, 193, 175, 25, 1, 212, 193, - 209, 217, 25, 1, 212, 193, 210, 9, 25, 1, 212, 193, 219, 96, 25, 1, 212, - 193, 203, 130, 25, 1, 212, 193, 217, 73, 25, 1, 212, 193, 216, 80, 25, 1, - 212, 193, 221, 40, 25, 1, 212, 193, 204, 41, 25, 1, 212, 193, 206, 174, - 25, 1, 212, 193, 206, 69, 25, 1, 212, 193, 207, 28, 25, 1, 212, 193, 223, - 7, 25, 1, 212, 193, 224, 64, 25, 1, 212, 193, 215, 79, 25, 1, 212, 193, - 215, 111, 25, 1, 212, 193, 216, 51, 25, 1, 212, 193, 195, 232, 25, 1, - 212, 193, 206, 108, 25, 1, 212, 193, 165, 25, 1, 212, 193, 215, 145, 25, - 1, 212, 193, 212, 209, 25, 1, 212, 193, 215, 126, 25, 1, 212, 193, 196, - 234, 25, 1, 212, 193, 213, 22, 25, 1, 212, 193, 209, 95, 25, 1, 212, 193, - 216, 141, 25, 1, 212, 193, 210, 42, 25, 1, 212, 193, 224, 74, 25, 1, 212, - 193, 216, 172, 25, 1, 212, 193, 216, 223, 25, 1, 212, 193, 206, 154, 25, - 1, 212, 193, 211, 172, 25, 1, 212, 193, 234, 181, 25, 1, 212, 193, 197, - 156, 25, 1, 212, 193, 222, 11, 25, 1, 212, 193, 221, 125, 25, 1, 212, - 193, 223, 165, 25, 1, 212, 193, 219, 138, 25, 1, 212, 193, 210, 77, 25, - 1, 212, 193, 168, 25, 1, 212, 193, 218, 160, 25, 1, 212, 193, 219, 146, - 25, 1, 212, 193, 202, 226, 25, 1, 212, 193, 223, 122, 25, 1, 212, 193, - 208, 182, 25, 1, 212, 193, 197, 208, 218, 60, 1, 203, 137, 218, 60, 1, - 216, 192, 218, 60, 1, 196, 0, 218, 60, 1, 218, 190, 218, 60, 1, 248, 252, - 218, 60, 1, 240, 3, 218, 60, 1, 63, 218, 60, 1, 212, 189, 218, 60, 1, - 224, 33, 218, 60, 1, 232, 63, 218, 60, 1, 239, 234, 218, 60, 1, 244, 150, - 218, 60, 1, 224, 94, 218, 60, 1, 214, 63, 218, 60, 1, 220, 5, 218, 60, 1, - 216, 101, 218, 60, 1, 163, 218, 60, 1, 214, 33, 218, 60, 1, 74, 218, 60, - 1, 209, 185, 218, 60, 1, 206, 179, 218, 60, 1, 202, 185, 218, 60, 1, 236, - 212, 218, 60, 1, 197, 156, 218, 60, 1, 70, 218, 60, 1, 223, 165, 218, 60, - 1, 222, 139, 218, 60, 1, 175, 218, 60, 1, 232, 118, 218, 60, 1, 210, 23, - 218, 60, 1, 203, 5, 218, 60, 17, 195, 79, 218, 60, 17, 98, 218, 60, 17, - 103, 218, 60, 17, 135, 218, 60, 17, 136, 218, 60, 17, 150, 218, 60, 17, - 174, 218, 60, 17, 182, 218, 60, 17, 178, 218, 60, 17, 184, 218, 60, 239, - 211, 218, 60, 54, 239, 211, 248, 169, 199, 134, 1, 236, 88, 248, 169, - 199, 134, 1, 157, 248, 169, 199, 134, 1, 208, 103, 248, 169, 199, 134, 1, - 235, 118, 248, 169, 199, 134, 1, 219, 141, 248, 169, 199, 134, 1, 196, - 17, 248, 169, 199, 134, 1, 233, 245, 248, 169, 199, 134, 1, 239, 25, 248, - 169, 199, 134, 1, 223, 121, 248, 169, 199, 134, 1, 225, 20, 248, 169, - 199, 134, 1, 230, 186, 248, 169, 199, 134, 1, 197, 156, 248, 169, 199, - 134, 1, 195, 11, 248, 169, 199, 134, 1, 233, 190, 248, 169, 199, 134, 1, - 238, 154, 248, 169, 199, 134, 1, 246, 176, 248, 169, 199, 134, 1, 199, - 222, 248, 169, 199, 134, 1, 147, 248, 169, 199, 134, 1, 248, 252, 248, - 169, 199, 134, 1, 197, 209, 248, 169, 199, 134, 1, 196, 59, 248, 169, - 199, 134, 1, 163, 248, 169, 199, 134, 1, 197, 148, 248, 169, 199, 134, 1, - 63, 248, 169, 199, 134, 1, 74, 248, 169, 199, 134, 1, 214, 33, 248, 169, - 199, 134, 1, 66, 248, 169, 199, 134, 1, 236, 184, 248, 169, 199, 134, 1, - 70, 248, 169, 199, 134, 1, 68, 248, 169, 199, 134, 37, 128, 201, 239, - 248, 169, 199, 134, 37, 125, 201, 239, 248, 169, 199, 134, 37, 218, 230, - 201, 239, 248, 169, 199, 134, 37, 221, 109, 201, 239, 248, 169, 199, 134, - 37, 231, 189, 201, 239, 248, 169, 199, 134, 234, 98, 204, 193, 132, 130, - 18, 224, 91, 132, 130, 18, 224, 87, 132, 130, 18, 223, 238, 132, 130, 18, - 223, 203, 132, 130, 18, 224, 119, 132, 130, 18, 224, 116, 132, 130, 18, - 223, 70, 132, 130, 18, 223, 42, 132, 130, 18, 224, 93, 132, 130, 18, 224, - 48, 132, 130, 18, 224, 178, 132, 130, 18, 224, 175, 132, 130, 18, 223, - 140, 132, 130, 18, 223, 137, 132, 130, 18, 224, 112, 132, 130, 18, 224, - 110, 132, 130, 18, 223, 72, 132, 130, 18, 223, 71, 132, 130, 18, 223, - 158, 132, 130, 18, 223, 126, 132, 130, 18, 223, 240, 132, 130, 18, 223, - 239, 132, 130, 18, 224, 193, 132, 130, 18, 224, 115, 132, 130, 18, 223, - 33, 132, 130, 18, 223, 24, 132, 130, 18, 224, 201, 132, 130, 18, 224, - 194, 132, 130, 105, 199, 111, 132, 130, 105, 215, 117, 132, 130, 105, - 222, 117, 132, 130, 105, 232, 43, 132, 130, 105, 216, 8, 132, 130, 105, - 210, 142, 132, 130, 105, 216, 35, 132, 130, 105, 211, 82, 132, 130, 105, - 196, 75, 132, 130, 105, 231, 166, 132, 130, 105, 219, 162, 132, 130, 105, - 244, 227, 132, 130, 105, 217, 78, 132, 130, 105, 231, 102, 132, 130, 105, - 212, 79, 132, 130, 105, 215, 122, 132, 130, 105, 217, 117, 132, 130, 105, - 250, 0, 132, 130, 105, 196, 198, 132, 130, 105, 246, 209, 132, 130, 113, - 244, 119, 201, 11, 132, 130, 113, 244, 119, 205, 162, 132, 130, 113, 244, - 119, 224, 66, 132, 130, 113, 244, 119, 224, 24, 132, 130, 113, 244, 119, - 204, 125, 132, 130, 113, 244, 119, 231, 60, 132, 130, 113, 244, 119, 203, - 56, 132, 130, 2, 198, 219, 202, 138, 132, 130, 2, 198, 219, 201, 82, 246, - 167, 132, 130, 2, 244, 119, 244, 216, 132, 130, 2, 198, 219, 202, 163, - 132, 130, 2, 198, 219, 235, 59, 132, 130, 2, 196, 155, 215, 112, 132, - 130, 2, 196, 155, 210, 25, 132, 130, 2, 196, 155, 201, 201, 132, 130, 2, - 196, 155, 235, 99, 132, 130, 2, 198, 219, 208, 79, 132, 130, 2, 219, 95, - 204, 129, 132, 130, 2, 198, 219, 215, 161, 132, 130, 2, 230, 94, 196, 95, - 132, 130, 2, 196, 197, 132, 130, 2, 244, 119, 201, 69, 209, 168, 132, - 130, 17, 195, 79, 132, 130, 17, 98, 132, 130, 17, 103, 132, 130, 17, 135, - 132, 130, 17, 136, 132, 130, 17, 150, 132, 130, 17, 174, 132, 130, 17, - 182, 132, 130, 17, 178, 132, 130, 17, 184, 132, 130, 35, 202, 243, 132, - 130, 35, 230, 199, 132, 130, 35, 202, 249, 202, 128, 132, 130, 35, 218, - 191, 132, 130, 35, 230, 202, 218, 191, 132, 130, 35, 202, 249, 248, 22, - 132, 130, 35, 201, 147, 132, 130, 2, 198, 219, 221, 90, 132, 130, 2, 196, - 152, 132, 130, 2, 231, 161, 132, 130, 2, 202, 153, 231, 161, 132, 130, 2, - 194, 240, 202, 196, 132, 130, 2, 231, 86, 132, 130, 2, 215, 175, 132, - 130, 2, 196, 189, 132, 130, 2, 215, 115, 132, 130, 2, 249, 240, 132, 130, - 2, 200, 191, 246, 166, 132, 130, 2, 219, 95, 201, 85, 132, 130, 2, 203, - 57, 132, 130, 2, 221, 122, 132, 130, 2, 218, 7, 132, 130, 2, 244, 119, - 232, 114, 221, 68, 215, 120, 215, 119, 132, 130, 2, 244, 119, 240, 161, - 201, 76, 132, 130, 2, 244, 119, 200, 189, 132, 130, 2, 244, 119, 200, - 190, 244, 138, 132, 130, 2, 244, 119, 211, 170, 239, 179, 132, 130, 2, - 244, 119, 215, 168, 201, 209, 132, 130, 244, 91, 2, 201, 80, 132, 130, - 244, 91, 2, 196, 61, 132, 130, 244, 91, 2, 221, 212, 132, 130, 244, 91, - 2, 222, 115, 132, 130, 244, 91, 2, 196, 151, 132, 130, 244, 91, 2, 223, - 141, 132, 130, 244, 91, 2, 232, 40, 132, 130, 244, 91, 2, 218, 48, 132, - 130, 244, 91, 2, 202, 139, 132, 130, 244, 91, 2, 201, 90, 132, 130, 244, - 91, 2, 212, 202, 132, 130, 244, 91, 2, 224, 36, 132, 130, 244, 91, 2, - 232, 104, 132, 130, 244, 91, 2, 199, 131, 132, 130, 244, 91, 2, 235, 95, - 132, 130, 244, 91, 2, 196, 102, 132, 130, 244, 91, 2, 201, 63, 132, 130, - 244, 91, 2, 223, 28, 132, 130, 244, 91, 2, 197, 198, 219, 103, 6, 1, 221, - 40, 219, 103, 6, 1, 209, 35, 219, 103, 6, 1, 199, 215, 219, 103, 6, 1, - 197, 189, 219, 103, 6, 1, 250, 12, 219, 103, 6, 1, 195, 157, 219, 103, 6, - 1, 223, 123, 219, 103, 6, 1, 213, 195, 219, 103, 6, 1, 203, 185, 219, - 103, 6, 1, 234, 71, 219, 103, 6, 1, 235, 184, 219, 103, 6, 1, 68, 219, - 103, 6, 1, 224, 227, 219, 103, 6, 1, 63, 219, 103, 6, 1, 225, 108, 219, - 103, 6, 1, 70, 219, 103, 6, 1, 249, 219, 219, 103, 6, 1, 247, 69, 219, - 103, 6, 1, 66, 219, 103, 6, 1, 195, 215, 219, 103, 6, 1, 158, 219, 103, - 6, 1, 211, 116, 219, 103, 6, 1, 230, 228, 219, 103, 6, 1, 215, 36, 219, - 103, 6, 1, 196, 216, 219, 103, 6, 1, 240, 98, 219, 103, 6, 1, 214, 91, - 219, 103, 6, 1, 217, 225, 219, 103, 6, 1, 143, 219, 103, 6, 1, 74, 219, - 103, 6, 1, 251, 45, 219, 103, 6, 1, 196, 143, 219, 103, 4, 1, 221, 40, - 219, 103, 4, 1, 209, 35, 219, 103, 4, 1, 199, 215, 219, 103, 4, 1, 197, - 189, 219, 103, 4, 1, 250, 12, 219, 103, 4, 1, 195, 157, 219, 103, 4, 1, - 223, 123, 219, 103, 4, 1, 213, 195, 219, 103, 4, 1, 203, 185, 219, 103, - 4, 1, 234, 71, 219, 103, 4, 1, 235, 184, 219, 103, 4, 1, 68, 219, 103, 4, - 1, 224, 227, 219, 103, 4, 1, 63, 219, 103, 4, 1, 225, 108, 219, 103, 4, - 1, 70, 219, 103, 4, 1, 249, 219, 219, 103, 4, 1, 247, 69, 219, 103, 4, 1, - 66, 219, 103, 4, 1, 195, 215, 219, 103, 4, 1, 158, 219, 103, 4, 1, 211, - 116, 219, 103, 4, 1, 230, 228, 219, 103, 4, 1, 215, 36, 219, 103, 4, 1, - 196, 216, 219, 103, 4, 1, 240, 98, 219, 103, 4, 1, 214, 91, 219, 103, 4, - 1, 217, 225, 219, 103, 4, 1, 143, 219, 103, 4, 1, 74, 219, 103, 4, 1, - 251, 45, 219, 103, 4, 1, 196, 143, 219, 103, 17, 195, 79, 219, 103, 17, - 98, 219, 103, 17, 103, 219, 103, 17, 135, 219, 103, 17, 136, 219, 103, - 17, 150, 219, 103, 17, 174, 219, 103, 17, 182, 219, 103, 17, 178, 219, - 103, 17, 184, 219, 103, 35, 202, 248, 219, 103, 35, 236, 127, 219, 103, - 35, 200, 219, 219, 103, 35, 202, 149, 219, 103, 35, 234, 139, 219, 103, - 35, 235, 29, 219, 103, 35, 205, 236, 219, 103, 35, 207, 24, 219, 103, 35, - 236, 158, 219, 103, 35, 216, 94, 219, 103, 17, 106, 250, 233, 20, 219, - 103, 17, 114, 250, 233, 20, 219, 103, 17, 122, 250, 233, 20, 219, 103, - 244, 23, 219, 103, 234, 98, 204, 193, 219, 103, 16, 251, 31, 219, 103, - 235, 225, 214, 78, 121, 1, 163, 121, 1, 248, 252, 121, 1, 11, 163, 121, - 1, 212, 94, 121, 1, 168, 121, 1, 218, 246, 121, 1, 250, 99, 168, 121, 1, - 235, 118, 121, 1, 199, 137, 121, 1, 199, 25, 121, 1, 203, 137, 121, 1, - 240, 3, 121, 1, 11, 201, 58, 121, 1, 11, 203, 137, 121, 1, 201, 58, 121, - 1, 239, 164, 121, 1, 179, 121, 1, 216, 145, 121, 1, 11, 216, 5, 121, 1, - 250, 99, 179, 121, 1, 216, 5, 121, 1, 215, 247, 121, 1, 175, 121, 1, 221, - 54, 121, 1, 222, 24, 121, 1, 222, 13, 121, 1, 202, 16, 121, 1, 238, 163, - 121, 1, 202, 8, 121, 1, 238, 162, 121, 1, 157, 121, 1, 234, 4, 121, 1, - 11, 157, 121, 1, 211, 108, 121, 1, 211, 85, 121, 1, 216, 244, 121, 1, - 216, 193, 121, 1, 250, 99, 216, 244, 121, 1, 142, 121, 1, 196, 202, 121, - 1, 233, 112, 121, 1, 233, 87, 121, 1, 201, 68, 121, 1, 237, 13, 121, 1, - 215, 34, 121, 1, 215, 17, 121, 1, 201, 83, 121, 1, 237, 23, 121, 1, 11, - 201, 83, 121, 1, 11, 237, 23, 121, 1, 210, 103, 201, 83, 121, 1, 207, 6, - 121, 1, 205, 43, 121, 1, 195, 74, 121, 1, 195, 1, 121, 1, 201, 93, 121, - 1, 237, 29, 121, 1, 11, 201, 93, 121, 1, 187, 121, 1, 195, 114, 121, 1, - 195, 2, 121, 1, 194, 228, 121, 1, 194, 208, 121, 1, 250, 99, 194, 228, - 121, 1, 194, 200, 121, 1, 194, 207, 121, 1, 197, 156, 121, 1, 251, 54, - 121, 1, 231, 223, 121, 1, 217, 122, 121, 2, 250, 35, 121, 2, 210, 103, - 198, 231, 121, 2, 210, 103, 250, 35, 121, 18, 2, 63, 121, 18, 2, 252, 10, - 121, 18, 2, 251, 50, 121, 18, 2, 250, 208, 121, 18, 2, 250, 199, 121, 18, - 2, 74, 121, 18, 2, 214, 33, 121, 18, 2, 197, 28, 121, 18, 2, 197, 189, - 121, 18, 2, 70, 121, 18, 2, 236, 106, 121, 18, 2, 236, 92, 121, 18, 2, - 214, 88, 121, 18, 2, 68, 121, 18, 2, 230, 98, 121, 18, 2, 230, 97, 121, - 18, 2, 230, 96, 121, 18, 2, 225, 158, 121, 18, 2, 226, 35, 121, 18, 2, - 226, 8, 121, 18, 2, 225, 121, 121, 18, 2, 225, 204, 121, 18, 2, 66, 121, - 18, 2, 200, 96, 121, 18, 2, 200, 95, 121, 18, 2, 200, 94, 121, 18, 2, - 199, 229, 121, 18, 2, 200, 78, 121, 18, 2, 200, 39, 121, 18, 2, 196, 143, - 121, 18, 2, 196, 20, 121, 18, 2, 251, 90, 121, 18, 2, 251, 86, 121, 18, - 2, 236, 34, 121, 18, 2, 209, 139, 236, 34, 121, 18, 2, 236, 42, 121, 18, - 2, 209, 139, 236, 42, 121, 18, 2, 251, 45, 121, 18, 2, 236, 163, 121, 18, - 2, 250, 0, 121, 18, 2, 213, 229, 121, 18, 2, 217, 225, 121, 18, 2, 216, - 246, 121, 154, 209, 230, 121, 154, 201, 222, 209, 230, 121, 154, 57, 121, - 154, 58, 121, 1, 201, 237, 121, 1, 201, 236, 121, 1, 201, 235, 121, 1, - 201, 234, 121, 1, 201, 233, 121, 1, 201, 232, 121, 1, 201, 231, 121, 1, - 210, 103, 201, 238, 121, 1, 210, 103, 201, 237, 121, 1, 210, 103, 201, - 235, 121, 1, 210, 103, 201, 234, 121, 1, 210, 103, 201, 233, 121, 1, 210, - 103, 201, 231, 19, 225, 123, 78, 42, 225, 123, 78, 19, 244, 12, 19, 244, - 11, 19, 244, 10, 19, 244, 9, 19, 244, 8, 19, 244, 7, 19, 244, 6, 19, 244, - 5, 19, 244, 4, 19, 244, 3, 19, 244, 2, 19, 244, 1, 19, 244, 0, 19, 243, - 255, 19, 243, 254, 19, 243, 253, 19, 243, 252, 19, 243, 251, 19, 243, - 250, 19, 243, 249, 19, 243, 248, 19, 243, 247, 19, 243, 246, 19, 243, - 245, 19, 243, 244, 19, 243, 243, 19, 243, 242, 19, 243, 241, 19, 243, - 240, 19, 243, 239, 19, 243, 238, 19, 243, 237, 19, 243, 236, 19, 243, - 235, 19, 243, 234, 19, 243, 233, 19, 243, 232, 19, 243, 231, 19, 243, - 230, 19, 243, 229, 19, 243, 228, 19, 243, 227, 19, 243, 226, 19, 243, - 225, 19, 243, 224, 19, 243, 223, 19, 243, 222, 19, 243, 221, 19, 243, - 220, 19, 243, 219, 19, 243, 218, 19, 243, 217, 19, 243, 216, 19, 243, - 215, 19, 243, 214, 19, 243, 213, 19, 243, 212, 19, 243, 211, 19, 243, - 210, 19, 243, 209, 19, 243, 208, 19, 243, 207, 19, 243, 206, 19, 243, - 205, 19, 243, 204, 19, 243, 203, 19, 243, 202, 19, 243, 201, 19, 243, - 200, 19, 243, 199, 19, 243, 198, 19, 243, 197, 19, 243, 196, 19, 243, - 195, 19, 243, 194, 19, 243, 193, 19, 243, 192, 19, 243, 191, 19, 243, - 190, 19, 243, 189, 19, 243, 188, 19, 243, 187, 19, 243, 186, 19, 243, - 185, 19, 243, 184, 19, 243, 183, 19, 243, 182, 19, 243, 181, 19, 243, - 180, 19, 243, 179, 19, 243, 178, 19, 243, 177, 19, 243, 176, 19, 243, - 175, 19, 243, 174, 19, 243, 173, 19, 243, 172, 19, 243, 171, 19, 243, - 170, 19, 243, 169, 19, 243, 168, 19, 243, 167, 19, 243, 166, 19, 243, - 165, 19, 243, 164, 19, 243, 163, 19, 243, 162, 19, 243, 161, 19, 243, - 160, 19, 243, 159, 19, 243, 158, 19, 243, 157, 19, 243, 156, 19, 243, - 155, 19, 243, 154, 19, 243, 153, 19, 243, 152, 19, 243, 151, 19, 243, - 150, 19, 243, 149, 19, 243, 148, 19, 243, 147, 19, 243, 146, 19, 243, - 145, 19, 243, 144, 19, 243, 143, 19, 243, 142, 19, 243, 141, 19, 243, - 140, 19, 243, 139, 19, 243, 138, 19, 243, 137, 19, 243, 136, 19, 243, - 135, 19, 243, 134, 19, 243, 133, 19, 243, 132, 19, 243, 131, 19, 243, - 130, 19, 243, 129, 19, 243, 128, 19, 243, 127, 19, 243, 126, 19, 243, - 125, 19, 243, 124, 19, 243, 123, 19, 243, 122, 19, 243, 121, 19, 243, - 120, 19, 243, 119, 19, 243, 118, 19, 243, 117, 19, 243, 116, 19, 243, - 115, 19, 243, 114, 19, 243, 113, 19, 243, 112, 19, 243, 111, 19, 243, - 110, 19, 243, 109, 19, 243, 108, 19, 243, 107, 19, 243, 106, 19, 243, - 105, 19, 243, 104, 19, 243, 103, 19, 243, 102, 19, 243, 101, 19, 243, - 100, 19, 243, 99, 19, 243, 98, 19, 243, 97, 19, 243, 96, 19, 243, 95, 19, - 243, 94, 19, 243, 93, 19, 243, 92, 19, 243, 91, 19, 243, 90, 19, 243, 89, - 19, 243, 88, 19, 243, 87, 19, 243, 86, 19, 243, 85, 19, 243, 84, 19, 243, - 83, 19, 243, 82, 19, 243, 81, 19, 243, 80, 19, 243, 79, 19, 243, 78, 19, - 243, 77, 19, 243, 76, 19, 243, 75, 19, 243, 74, 19, 243, 73, 19, 243, 72, - 19, 243, 71, 19, 243, 70, 19, 243, 69, 19, 243, 68, 19, 243, 67, 19, 243, - 66, 19, 243, 65, 19, 243, 64, 19, 243, 63, 19, 243, 62, 19, 243, 61, 19, - 243, 60, 19, 243, 59, 19, 243, 58, 19, 243, 57, 19, 243, 56, 19, 243, 55, - 19, 243, 54, 19, 243, 53, 19, 243, 52, 19, 243, 51, 19, 243, 50, 19, 243, - 49, 19, 243, 48, 19, 243, 47, 19, 243, 46, 19, 243, 45, 19, 243, 44, 19, - 243, 43, 19, 243, 42, 19, 243, 41, 19, 243, 40, 19, 243, 39, 19, 243, 38, - 19, 243, 37, 19, 243, 36, 19, 243, 35, 19, 243, 34, 19, 243, 33, 19, 243, - 32, 19, 243, 31, 19, 243, 30, 19, 243, 29, 19, 243, 28, 19, 243, 27, 19, - 243, 26, 19, 243, 25, 19, 243, 24, 19, 243, 23, 19, 243, 22, 19, 243, 21, - 19, 243, 20, 19, 243, 19, 19, 243, 18, 19, 243, 17, 19, 243, 16, 19, 243, - 15, 19, 243, 14, 19, 243, 13, 19, 243, 12, 19, 243, 11, 19, 243, 10, 19, - 243, 9, 19, 243, 8, 19, 243, 7, 19, 243, 6, 19, 243, 5, 19, 243, 4, 19, - 243, 3, 19, 243, 2, 19, 243, 1, 19, 243, 0, 19, 242, 255, 19, 242, 254, - 19, 242, 253, 19, 242, 252, 19, 242, 251, 19, 242, 250, 19, 242, 249, 19, - 242, 248, 19, 242, 247, 19, 242, 246, 19, 242, 245, 19, 242, 244, 19, - 242, 243, 19, 242, 242, 19, 242, 241, 19, 242, 240, 19, 242, 239, 19, - 242, 238, 19, 242, 237, 19, 242, 236, 19, 242, 235, 19, 242, 234, 19, - 242, 233, 19, 242, 232, 19, 242, 231, 19, 242, 230, 19, 242, 229, 19, - 242, 228, 19, 242, 227, 19, 242, 226, 19, 242, 225, 19, 242, 224, 19, - 242, 223, 19, 242, 222, 19, 242, 221, 19, 242, 220, 19, 242, 219, 19, - 242, 218, 19, 242, 217, 19, 242, 216, 19, 242, 215, 19, 242, 214, 19, - 242, 213, 19, 242, 212, 19, 242, 211, 19, 242, 210, 19, 242, 209, 19, - 242, 208, 19, 242, 207, 19, 242, 206, 19, 242, 205, 19, 242, 204, 19, - 242, 203, 19, 242, 202, 19, 242, 201, 19, 242, 200, 19, 242, 199, 19, - 242, 198, 19, 242, 197, 19, 242, 196, 19, 242, 195, 19, 242, 194, 19, - 242, 193, 19, 242, 192, 19, 242, 191, 19, 242, 190, 19, 242, 189, 19, - 242, 188, 19, 242, 187, 19, 242, 186, 19, 242, 185, 19, 242, 184, 19, - 242, 183, 19, 242, 182, 19, 242, 181, 19, 242, 180, 19, 242, 179, 19, - 242, 178, 19, 242, 177, 19, 242, 176, 19, 242, 175, 19, 242, 174, 19, - 242, 173, 19, 242, 172, 19, 242, 171, 19, 242, 170, 19, 242, 169, 19, - 242, 168, 19, 242, 167, 19, 242, 166, 19, 242, 165, 19, 242, 164, 19, - 242, 163, 19, 242, 162, 19, 242, 161, 19, 242, 160, 19, 242, 159, 19, - 242, 158, 19, 242, 157, 19, 242, 156, 19, 242, 155, 19, 242, 154, 19, - 242, 153, 19, 242, 152, 19, 242, 151, 19, 242, 150, 19, 242, 149, 19, - 242, 148, 19, 242, 147, 19, 242, 146, 19, 242, 145, 19, 242, 144, 19, - 242, 143, 19, 242, 142, 19, 242, 141, 19, 242, 140, 19, 242, 139, 19, - 242, 138, 19, 242, 137, 19, 242, 136, 19, 242, 135, 19, 242, 134, 19, - 242, 133, 19, 242, 132, 19, 242, 131, 19, 242, 130, 19, 242, 129, 19, - 242, 128, 19, 242, 127, 19, 242, 126, 19, 242, 125, 19, 242, 124, 19, - 242, 123, 19, 242, 122, 19, 242, 121, 19, 242, 120, 19, 242, 119, 19, - 242, 118, 19, 242, 117, 19, 242, 116, 19, 242, 115, 19, 242, 114, 19, - 242, 113, 19, 242, 112, 19, 242, 111, 19, 242, 110, 19, 242, 109, 19, - 242, 108, 19, 242, 107, 19, 242, 106, 19, 242, 105, 19, 242, 104, 19, - 242, 103, 19, 242, 102, 19, 242, 101, 19, 242, 100, 19, 242, 99, 19, 242, - 98, 19, 242, 97, 19, 242, 96, 19, 242, 95, 19, 242, 94, 19, 242, 93, 19, - 242, 92, 19, 242, 91, 19, 242, 90, 19, 242, 89, 19, 242, 88, 19, 242, 87, - 19, 242, 86, 19, 242, 85, 19, 242, 84, 19, 242, 83, 19, 242, 82, 19, 242, - 81, 19, 242, 80, 19, 242, 79, 19, 242, 78, 19, 242, 77, 19, 242, 76, 19, - 242, 75, 19, 242, 74, 19, 242, 73, 19, 242, 72, 19, 242, 71, 19, 242, 70, - 19, 242, 69, 19, 242, 68, 19, 242, 67, 19, 242, 66, 19, 242, 65, 19, 242, - 64, 19, 242, 63, 19, 242, 62, 19, 242, 61, 19, 242, 60, 19, 242, 59, 19, - 242, 58, 19, 242, 57, 19, 242, 56, 19, 242, 55, 19, 242, 54, 19, 242, 53, - 19, 242, 52, 19, 242, 51, 19, 242, 50, 19, 242, 49, 19, 242, 48, 19, 242, - 47, 19, 242, 46, 19, 242, 45, 19, 242, 44, 19, 242, 43, 19, 242, 42, 19, - 242, 41, 19, 242, 40, 19, 242, 39, 19, 242, 38, 19, 242, 37, 19, 242, 36, - 19, 242, 35, 19, 242, 34, 19, 242, 33, 19, 242, 32, 19, 242, 31, 19, 242, - 30, 19, 242, 29, 19, 242, 28, 19, 242, 27, 19, 242, 26, 19, 242, 25, 19, - 242, 24, 19, 242, 23, 19, 242, 22, 19, 242, 21, 19, 242, 20, 19, 242, 19, - 19, 242, 18, 19, 242, 17, 19, 242, 16, 19, 242, 15, 19, 242, 14, 19, 242, - 13, 19, 242, 12, 19, 242, 11, 19, 242, 10, 19, 242, 9, 19, 242, 8, 19, - 242, 7, 19, 242, 6, 19, 242, 5, 19, 242, 4, 19, 242, 3, 19, 242, 2, 19, - 242, 1, 19, 242, 0, 19, 241, 255, 19, 241, 254, 19, 241, 253, 19, 241, - 252, 19, 241, 251, 19, 241, 250, 19, 241, 249, 19, 241, 248, 19, 241, - 247, 19, 241, 246, 19, 241, 245, 19, 241, 244, 19, 241, 243, 19, 241, - 242, 19, 241, 241, 19, 241, 240, 19, 241, 239, 19, 241, 238, 19, 241, - 237, 19, 241, 236, 19, 241, 235, 19, 241, 234, 19, 241, 233, 19, 241, - 232, 19, 241, 231, 19, 241, 230, 19, 241, 229, 19, 241, 228, 19, 241, - 227, 19, 241, 226, 19, 241, 225, 19, 241, 224, 19, 241, 223, 19, 241, - 222, 19, 241, 221, 19, 241, 220, 19, 241, 219, 19, 241, 218, 19, 241, - 217, 19, 241, 216, 19, 241, 215, 19, 241, 214, 19, 241, 213, 19, 241, - 212, 19, 241, 211, 19, 241, 210, 19, 241, 209, 19, 241, 208, 19, 241, - 207, 19, 241, 206, 19, 241, 205, 19, 241, 204, 19, 241, 203, 19, 241, - 202, 19, 241, 201, 19, 241, 200, 19, 241, 199, 19, 241, 198, 19, 241, - 197, 19, 241, 196, 19, 241, 195, 19, 241, 194, 19, 241, 193, 19, 241, - 192, 19, 241, 191, 19, 241, 190, 19, 241, 189, 19, 241, 188, 19, 241, - 187, 19, 241, 186, 19, 241, 185, 19, 241, 184, 19, 241, 183, 19, 241, - 182, 19, 241, 181, 19, 241, 180, 19, 241, 179, 19, 241, 178, 19, 241, - 177, 19, 241, 176, 19, 241, 175, 19, 241, 174, 19, 241, 173, 19, 241, - 172, 19, 241, 171, 19, 241, 170, 19, 241, 169, 19, 241, 168, 19, 241, - 167, 19, 241, 166, 19, 241, 165, 19, 241, 164, 19, 241, 163, 19, 241, - 162, 19, 241, 161, 19, 241, 160, 19, 241, 159, 19, 241, 158, 19, 241, - 157, 19, 241, 156, 19, 241, 155, 19, 241, 154, 19, 241, 153, 19, 241, - 152, 19, 241, 151, 19, 241, 150, 19, 241, 149, 19, 241, 148, 19, 241, - 147, 19, 241, 146, 19, 241, 145, 19, 241, 144, 19, 241, 143, 19, 241, - 142, 19, 241, 141, 19, 241, 140, 19, 241, 139, 19, 241, 138, 19, 241, - 137, 19, 241, 136, 19, 241, 135, 19, 241, 134, 19, 241, 133, 19, 241, - 132, 19, 241, 131, 19, 241, 130, 19, 241, 129, 19, 241, 128, 19, 241, - 127, 19, 241, 126, 19, 241, 125, 19, 241, 124, 19, 241, 123, 19, 241, - 122, 19, 241, 121, 19, 241, 120, 19, 241, 119, 19, 241, 118, 19, 241, - 117, 19, 241, 116, 19, 241, 115, 19, 241, 114, 19, 241, 113, 19, 241, - 112, 19, 241, 111, 19, 241, 110, 19, 241, 109, 19, 241, 108, 19, 241, - 107, 19, 241, 106, 19, 241, 105, 19, 241, 104, 19, 241, 103, 19, 241, - 102, 19, 241, 101, 19, 241, 100, 19, 241, 99, 19, 241, 98, 19, 241, 97, - 19, 241, 96, 19, 241, 95, 19, 241, 94, 19, 241, 93, 19, 241, 92, 19, 241, - 91, 19, 241, 90, 19, 241, 89, 19, 241, 88, 19, 241, 87, 19, 241, 86, 19, - 241, 85, 19, 241, 84, 19, 241, 83, 19, 241, 82, 19, 241, 81, 19, 241, 80, - 19, 241, 79, 19, 241, 78, 19, 241, 77, 19, 241, 76, 19, 241, 75, 19, 241, - 74, 19, 241, 73, 19, 241, 72, 19, 241, 71, 19, 241, 70, 19, 241, 69, 19, - 241, 68, 19, 241, 67, 19, 241, 66, 19, 241, 65, 19, 241, 64, 19, 241, 63, - 19, 241, 62, 19, 241, 61, 19, 241, 60, 19, 241, 59, 19, 241, 58, 19, 241, - 57, 19, 241, 56, 19, 241, 55, 19, 241, 54, 19, 241, 53, 19, 241, 52, 19, - 241, 51, 19, 241, 50, 19, 241, 49, 19, 241, 48, 19, 241, 47, 19, 241, 46, - 19, 241, 45, 19, 241, 44, 19, 241, 43, 19, 241, 42, 19, 241, 41, 19, 241, - 40, 19, 241, 39, 19, 241, 38, 19, 241, 37, 19, 241, 36, 19, 241, 35, 19, - 241, 34, 19, 241, 33, 19, 241, 32, 19, 241, 31, 19, 241, 30, 19, 241, 29, - 19, 241, 28, 19, 241, 27, 19, 241, 26, 73, 1, 250, 99, 70, 193, 1, 250, - 99, 196, 65, 55, 1, 255, 10, 55, 1, 255, 9, 55, 1, 255, 8, 55, 1, 255, 4, - 55, 1, 230, 136, 55, 1, 230, 135, 55, 1, 230, 134, 55, 1, 230, 133, 55, - 1, 200, 159, 55, 1, 200, 158, 55, 1, 200, 157, 55, 1, 200, 156, 55, 1, - 200, 155, 55, 1, 237, 8, 55, 1, 237, 7, 55, 1, 237, 6, 55, 1, 237, 5, 55, - 1, 237, 4, 55, 1, 214, 205, 55, 1, 214, 204, 55, 1, 214, 203, 55, 1, 224, - 216, 55, 1, 224, 213, 55, 1, 224, 212, 55, 1, 224, 211, 55, 1, 224, 210, - 55, 1, 224, 209, 55, 1, 224, 208, 55, 1, 224, 207, 55, 1, 224, 206, 55, - 1, 224, 215, 55, 1, 224, 214, 55, 1, 224, 205, 55, 1, 223, 248, 55, 1, - 223, 247, 55, 1, 223, 246, 55, 1, 223, 245, 55, 1, 223, 244, 55, 1, 223, - 243, 55, 1, 223, 242, 55, 1, 223, 241, 55, 1, 223, 85, 55, 1, 223, 84, - 55, 1, 223, 83, 55, 1, 223, 82, 55, 1, 223, 81, 55, 1, 223, 80, 55, 1, - 223, 79, 55, 1, 224, 100, 55, 1, 224, 99, 55, 1, 224, 98, 55, 1, 224, 97, - 55, 1, 224, 96, 55, 1, 224, 95, 55, 1, 223, 164, 55, 1, 223, 163, 55, 1, - 223, 162, 55, 1, 223, 161, 55, 1, 208, 233, 55, 1, 208, 232, 55, 1, 208, - 231, 55, 1, 208, 230, 55, 1, 208, 229, 55, 1, 208, 228, 55, 1, 208, 227, - 55, 1, 208, 226, 55, 1, 206, 68, 55, 1, 206, 67, 55, 1, 206, 66, 55, 1, - 206, 65, 55, 1, 206, 64, 55, 1, 206, 63, 55, 1, 204, 138, 55, 1, 204, - 137, 55, 1, 204, 136, 55, 1, 204, 135, 55, 1, 204, 134, 55, 1, 204, 133, - 55, 1, 204, 132, 55, 1, 204, 131, 55, 1, 208, 102, 55, 1, 208, 101, 55, - 1, 208, 100, 55, 1, 208, 99, 55, 1, 208, 98, 55, 1, 205, 161, 55, 1, 205, - 160, 55, 1, 205, 159, 55, 1, 205, 158, 55, 1, 205, 157, 55, 1, 205, 156, - 55, 1, 205, 155, 55, 1, 203, 136, 55, 1, 203, 135, 55, 1, 203, 134, 55, - 1, 203, 133, 55, 1, 202, 93, 55, 1, 202, 92, 55, 1, 202, 91, 55, 1, 202, - 90, 55, 1, 202, 89, 55, 1, 202, 88, 55, 1, 202, 87, 55, 1, 201, 19, 55, - 1, 201, 18, 55, 1, 201, 17, 55, 1, 201, 16, 55, 1, 201, 15, 55, 1, 203, - 35, 55, 1, 203, 34, 55, 1, 203, 33, 55, 1, 203, 32, 55, 1, 203, 31, 55, - 1, 203, 30, 55, 1, 203, 29, 55, 1, 203, 28, 55, 1, 203, 27, 55, 1, 202, - 1, 55, 1, 202, 0, 55, 1, 201, 255, 55, 1, 201, 254, 55, 1, 201, 253, 55, - 1, 201, 252, 55, 1, 201, 251, 55, 1, 217, 170, 55, 1, 217, 169, 55, 1, - 217, 168, 55, 1, 217, 167, 55, 1, 217, 166, 55, 1, 217, 165, 55, 1, 217, - 164, 55, 1, 217, 163, 55, 1, 217, 162, 55, 1, 216, 140, 55, 1, 216, 139, - 55, 1, 216, 138, 55, 1, 216, 137, 55, 1, 216, 136, 55, 1, 216, 135, 55, - 1, 216, 134, 55, 1, 216, 133, 55, 1, 215, 110, 55, 1, 215, 109, 55, 1, - 215, 108, 55, 1, 217, 33, 55, 1, 217, 32, 55, 1, 217, 31, 55, 1, 217, 30, - 55, 1, 217, 29, 55, 1, 217, 28, 55, 1, 217, 27, 55, 1, 215, 224, 55, 1, - 215, 223, 55, 1, 215, 222, 55, 1, 215, 221, 55, 1, 215, 220, 55, 1, 232, - 142, 55, 1, 232, 139, 55, 1, 232, 138, 55, 1, 232, 137, 55, 1, 232, 136, - 55, 1, 232, 135, 55, 1, 232, 134, 55, 1, 232, 133, 55, 1, 232, 132, 55, - 1, 232, 141, 55, 1, 232, 140, 55, 1, 231, 213, 55, 1, 231, 212, 55, 1, - 231, 211, 55, 1, 231, 210, 55, 1, 231, 209, 55, 1, 231, 208, 55, 1, 231, - 207, 55, 1, 230, 218, 55, 1, 230, 217, 55, 1, 230, 216, 55, 1, 232, 31, - 55, 1, 232, 30, 55, 1, 232, 29, 55, 1, 232, 28, 55, 1, 232, 27, 55, 1, - 232, 26, 55, 1, 232, 25, 55, 1, 231, 80, 55, 1, 231, 79, 55, 1, 231, 78, - 55, 1, 231, 77, 55, 1, 231, 76, 55, 1, 231, 75, 55, 1, 231, 74, 55, 1, - 231, 73, 55, 1, 220, 31, 55, 1, 220, 30, 55, 1, 220, 29, 55, 1, 220, 28, - 55, 1, 220, 27, 55, 1, 220, 26, 55, 1, 220, 25, 55, 1, 218, 242, 55, 1, - 218, 241, 55, 1, 218, 240, 55, 1, 218, 239, 55, 1, 218, 238, 55, 1, 218, - 237, 55, 1, 218, 236, 55, 1, 218, 55, 55, 1, 218, 54, 55, 1, 218, 53, 55, - 1, 218, 52, 55, 1, 219, 113, 55, 1, 219, 112, 55, 1, 219, 111, 55, 1, - 218, 159, 55, 1, 218, 158, 55, 1, 218, 157, 55, 1, 218, 156, 55, 1, 218, - 155, 55, 1, 218, 154, 55, 1, 196, 132, 55, 1, 196, 131, 55, 1, 196, 130, - 55, 1, 196, 129, 55, 1, 196, 128, 55, 1, 196, 125, 55, 1, 195, 214, 55, - 1, 195, 213, 55, 1, 195, 212, 55, 1, 195, 211, 55, 1, 195, 255, 55, 1, - 195, 254, 55, 1, 195, 253, 55, 1, 195, 252, 55, 1, 195, 251, 55, 1, 195, - 250, 55, 1, 210, 200, 55, 1, 210, 199, 55, 1, 210, 198, 55, 1, 210, 197, - 55, 1, 210, 22, 55, 1, 210, 21, 55, 1, 210, 20, 55, 1, 210, 19, 55, 1, - 210, 18, 55, 1, 210, 17, 55, 1, 210, 16, 55, 1, 209, 94, 55, 1, 209, 93, - 55, 1, 209, 92, 55, 1, 209, 91, 55, 1, 209, 90, 55, 1, 209, 89, 55, 1, - 210, 132, 55, 1, 210, 131, 55, 1, 210, 130, 55, 1, 210, 129, 55, 1, 209, - 184, 55, 1, 209, 183, 55, 1, 209, 182, 55, 1, 209, 181, 55, 1, 209, 180, - 55, 1, 209, 179, 55, 1, 197, 155, 55, 1, 197, 154, 55, 1, 197, 153, 55, - 1, 197, 152, 55, 1, 197, 151, 55, 1, 197, 63, 55, 1, 197, 62, 55, 1, 197, - 61, 55, 1, 197, 60, 55, 1, 197, 59, 55, 1, 197, 100, 55, 1, 197, 99, 55, - 1, 197, 98, 55, 1, 197, 97, 55, 1, 197, 27, 55, 1, 197, 26, 55, 1, 197, - 25, 55, 1, 197, 24, 55, 1, 197, 23, 55, 1, 197, 22, 55, 1, 197, 21, 55, - 1, 217, 222, 55, 1, 217, 221, 42, 246, 118, 42, 246, 117, 42, 246, 116, - 42, 246, 115, 42, 246, 114, 42, 246, 113, 42, 246, 112, 42, 246, 111, 42, - 246, 110, 42, 246, 109, 42, 246, 108, 42, 246, 107, 42, 246, 106, 42, - 246, 105, 42, 246, 104, 42, 246, 103, 42, 246, 102, 42, 246, 101, 42, - 246, 100, 42, 246, 99, 42, 246, 98, 42, 246, 97, 42, 246, 96, 42, 246, - 95, 42, 246, 94, 42, 246, 93, 42, 246, 92, 42, 246, 91, 42, 246, 90, 42, - 246, 89, 42, 246, 88, 42, 246, 87, 42, 246, 86, 42, 246, 85, 42, 246, 84, - 42, 246, 83, 42, 246, 82, 42, 246, 81, 42, 246, 80, 42, 246, 79, 42, 246, - 78, 42, 246, 77, 42, 246, 76, 42, 246, 75, 42, 246, 74, 42, 246, 73, 42, - 246, 72, 42, 246, 71, 42, 246, 70, 42, 246, 69, 42, 246, 68, 42, 246, 67, - 42, 246, 66, 42, 246, 65, 42, 246, 64, 42, 246, 63, 42, 246, 62, 42, 246, - 61, 42, 246, 60, 42, 246, 59, 42, 246, 58, 42, 246, 57, 42, 246, 56, 42, - 246, 55, 42, 246, 54, 42, 246, 53, 42, 246, 52, 42, 246, 51, 42, 246, 50, - 42, 246, 49, 42, 246, 48, 42, 246, 47, 42, 246, 46, 42, 246, 45, 42, 246, - 44, 42, 246, 43, 42, 246, 42, 42, 246, 41, 42, 246, 40, 42, 246, 39, 42, - 246, 38, 42, 246, 37, 42, 246, 36, 42, 246, 35, 42, 246, 34, 42, 246, 33, - 42, 246, 32, 42, 246, 31, 42, 246, 30, 42, 246, 29, 42, 246, 28, 42, 246, - 27, 42, 246, 26, 42, 246, 25, 42, 246, 24, 42, 246, 23, 42, 246, 22, 42, - 246, 21, 42, 246, 20, 42, 246, 19, 42, 246, 18, 42, 246, 17, 42, 246, 16, - 42, 246, 15, 42, 246, 14, 42, 246, 13, 42, 246, 12, 42, 246, 11, 42, 246, - 10, 42, 246, 9, 42, 246, 8, 42, 246, 7, 42, 246, 6, 42, 246, 5, 42, 246, - 4, 42, 246, 3, 42, 246, 2, 42, 246, 1, 42, 246, 0, 42, 245, 255, 42, 245, - 254, 42, 245, 253, 42, 245, 252, 42, 245, 251, 42, 245, 250, 42, 245, - 249, 42, 245, 248, 42, 245, 247, 42, 245, 246, 42, 245, 245, 42, 245, - 244, 42, 245, 243, 42, 245, 242, 42, 245, 241, 42, 245, 240, 42, 245, - 239, 42, 245, 238, 42, 245, 237, 42, 245, 236, 42, 245, 235, 42, 245, - 234, 42, 245, 233, 42, 245, 232, 42, 245, 231, 42, 245, 230, 42, 245, - 229, 42, 245, 228, 42, 245, 227, 42, 245, 226, 42, 245, 225, 42, 245, - 224, 42, 245, 223, 42, 245, 222, 42, 245, 221, 42, 245, 220, 42, 245, - 219, 42, 245, 218, 42, 245, 217, 42, 245, 216, 42, 245, 215, 42, 245, - 214, 42, 245, 213, 42, 245, 212, 42, 245, 211, 42, 245, 210, 42, 245, - 209, 42, 245, 208, 42, 245, 207, 42, 245, 206, 42, 245, 205, 42, 245, - 204, 42, 245, 203, 42, 245, 202, 42, 245, 201, 42, 245, 200, 42, 245, - 199, 42, 245, 198, 42, 245, 197, 42, 245, 196, 42, 245, 195, 42, 245, - 194, 42, 245, 193, 42, 245, 192, 42, 245, 191, 42, 245, 190, 42, 245, - 189, 42, 245, 188, 42, 245, 187, 42, 245, 186, 42, 245, 185, 42, 245, - 184, 42, 245, 183, 42, 245, 182, 42, 245, 181, 42, 245, 180, 42, 245, - 179, 42, 245, 178, 42, 245, 177, 42, 245, 176, 42, 245, 175, 42, 245, - 174, 42, 245, 173, 42, 245, 172, 42, 245, 171, 42, 245, 170, 42, 245, - 169, 42, 245, 168, 42, 245, 167, 42, 245, 166, 42, 245, 165, 42, 245, - 164, 42, 245, 163, 42, 245, 162, 42, 245, 161, 42, 245, 160, 42, 245, - 159, 42, 245, 158, 42, 245, 157, 42, 245, 156, 42, 245, 155, 42, 245, - 154, 42, 245, 153, 42, 245, 152, 42, 245, 151, 42, 245, 150, 42, 245, - 149, 42, 245, 148, 42, 245, 147, 42, 245, 146, 42, 245, 145, 42, 245, - 144, 42, 245, 143, 42, 245, 142, 42, 245, 141, 42, 245, 140, 42, 245, - 139, 42, 245, 138, 42, 245, 137, 42, 245, 136, 42, 245, 135, 42, 245, - 134, 42, 245, 133, 42, 245, 132, 42, 245, 131, 42, 245, 130, 42, 245, - 129, 42, 245, 128, 42, 245, 127, 42, 245, 126, 42, 245, 125, 42, 245, - 124, 42, 245, 123, 42, 245, 122, 42, 245, 121, 42, 245, 120, 42, 245, - 119, 42, 245, 118, 42, 245, 117, 42, 245, 116, 42, 245, 115, 42, 245, - 114, 42, 245, 113, 42, 245, 112, 42, 245, 111, 42, 245, 110, 42, 245, - 109, 42, 245, 108, 42, 245, 107, 42, 245, 106, 42, 245, 105, 42, 245, - 104, 42, 245, 103, 42, 245, 102, 42, 245, 101, 42, 245, 100, 42, 245, 99, - 42, 245, 98, 42, 245, 97, 42, 245, 96, 42, 245, 95, 42, 245, 94, 42, 245, - 93, 42, 245, 92, 42, 245, 91, 42, 245, 90, 42, 245, 89, 42, 245, 88, 42, - 245, 87, 42, 245, 86, 42, 245, 85, 42, 245, 84, 42, 245, 83, 42, 245, 82, - 42, 245, 81, 42, 245, 80, 42, 245, 79, 42, 245, 78, 42, 245, 77, 42, 245, - 76, 42, 245, 75, 42, 245, 74, 42, 245, 73, 42, 245, 72, 42, 245, 71, 42, - 245, 70, 42, 245, 69, 42, 245, 68, 42, 245, 67, 42, 245, 66, 42, 245, 65, - 42, 245, 64, 42, 245, 63, 42, 245, 62, 42, 245, 61, 42, 245, 60, 42, 245, - 59, 42, 245, 58, 42, 245, 57, 42, 245, 56, 42, 245, 55, 42, 245, 54, 42, - 245, 53, 42, 245, 52, 42, 245, 51, 42, 245, 50, 42, 245, 49, 42, 245, 48, - 42, 245, 47, 42, 245, 46, 42, 245, 45, 42, 245, 44, 42, 245, 43, 42, 245, - 42, 42, 245, 41, 42, 245, 40, 42, 245, 39, 42, 245, 38, 42, 245, 37, 42, - 245, 36, 42, 245, 35, 42, 245, 34, 42, 245, 33, 42, 245, 32, 42, 245, 31, - 42, 245, 30, 42, 245, 29, 42, 245, 28, 42, 245, 27, 42, 245, 26, 42, 245, - 25, 42, 245, 24, 42, 245, 23, 42, 245, 22, 42, 245, 21, 42, 245, 20, 42, - 245, 19, 42, 245, 18, 42, 245, 17, 42, 245, 16, 42, 245, 15, 42, 245, 14, - 42, 245, 13, 42, 245, 12, 42, 245, 11, 42, 245, 10, 42, 245, 9, 42, 245, - 8, 42, 245, 7, 42, 245, 6, 42, 245, 5, 42, 245, 4, 42, 245, 3, 42, 245, - 2, 42, 245, 1, 42, 245, 0, 42, 244, 255, 42, 244, 254, 42, 244, 253, 42, - 244, 252, 42, 244, 251, 42, 244, 250, 42, 244, 249, 42, 244, 248, 42, - 244, 247, 42, 244, 246, 42, 244, 245, 42, 244, 244, 42, 244, 243, 42, - 244, 242, 42, 244, 241, 42, 244, 240, 42, 244, 239, 42, 244, 238, 42, - 244, 237, 42, 244, 236, 42, 244, 235, 110, 1, 232, 154, 110, 1, 196, 216, - 110, 1, 213, 195, 110, 1, 203, 185, 110, 1, 235, 184, 110, 1, 224, 227, - 110, 1, 158, 110, 1, 249, 219, 110, 1, 240, 98, 110, 1, 199, 215, 110, 1, - 234, 71, 110, 1, 143, 110, 1, 213, 196, 217, 225, 110, 1, 240, 99, 209, - 35, 110, 1, 235, 185, 217, 225, 110, 1, 224, 228, 221, 40, 110, 1, 210, - 237, 209, 35, 110, 1, 202, 204, 110, 1, 205, 195, 239, 45, 110, 1, 239, - 45, 110, 1, 223, 187, 110, 1, 205, 195, 225, 108, 110, 1, 231, 170, 110, - 1, 222, 25, 110, 1, 210, 29, 110, 1, 221, 40, 110, 1, 217, 225, 110, 1, - 225, 108, 110, 1, 209, 35, 110, 1, 221, 41, 217, 225, 110, 1, 217, 226, - 221, 40, 110, 1, 225, 109, 221, 40, 110, 1, 209, 36, 225, 108, 110, 1, - 221, 41, 3, 238, 123, 110, 1, 217, 226, 3, 238, 123, 110, 1, 225, 109, 3, - 238, 123, 110, 1, 225, 109, 3, 238, 121, 225, 187, 26, 57, 110, 1, 209, - 36, 3, 238, 123, 110, 1, 209, 36, 3, 76, 58, 110, 1, 221, 41, 209, 35, - 110, 1, 217, 226, 209, 35, 110, 1, 225, 109, 209, 35, 110, 1, 209, 36, - 209, 35, 110, 1, 221, 41, 217, 226, 209, 35, 110, 1, 217, 226, 221, 41, - 209, 35, 110, 1, 225, 109, 221, 41, 209, 35, 110, 1, 209, 36, 225, 109, - 209, 35, 110, 1, 225, 109, 209, 36, 3, 238, 123, 110, 1, 225, 109, 217, - 225, 110, 1, 225, 109, 217, 226, 209, 35, 110, 1, 209, 36, 203, 185, 110, - 1, 209, 36, 203, 186, 143, 110, 1, 209, 36, 213, 195, 110, 1, 209, 36, - 213, 196, 143, 110, 1, 203, 186, 209, 35, 110, 1, 203, 186, 210, 237, - 209, 35, 110, 1, 197, 189, 110, 1, 197, 74, 110, 1, 197, 190, 143, 110, - 1, 209, 36, 217, 225, 110, 1, 209, 36, 221, 40, 110, 1, 224, 228, 210, - 237, 209, 35, 110, 1, 234, 72, 210, 237, 209, 35, 110, 1, 209, 36, 224, - 227, 110, 1, 209, 36, 224, 228, 143, 110, 1, 63, 110, 1, 205, 195, 213, - 207, 110, 1, 214, 117, 110, 1, 74, 110, 1, 250, 151, 110, 1, 68, 110, 1, - 70, 110, 1, 226, 35, 110, 1, 206, 139, 68, 110, 1, 200, 73, 110, 1, 236, - 184, 110, 1, 205, 195, 236, 170, 110, 1, 209, 160, 68, 110, 1, 205, 195, - 236, 184, 110, 1, 172, 68, 110, 1, 196, 65, 110, 1, 66, 110, 1, 235, 251, - 110, 1, 196, 166, 110, 1, 115, 217, 225, 110, 1, 172, 66, 110, 1, 209, - 160, 66, 110, 1, 200, 75, 110, 1, 205, 195, 66, 110, 1, 214, 30, 110, 1, - 213, 207, 110, 1, 213, 229, 110, 1, 197, 156, 110, 1, 197, 28, 110, 1, - 197, 64, 110, 1, 197, 88, 110, 1, 196, 251, 110, 1, 217, 124, 66, 110, 1, - 217, 124, 74, 110, 1, 217, 124, 68, 110, 1, 217, 124, 63, 110, 1, 212, - 233, 250, 208, 110, 1, 212, 233, 250, 225, 110, 1, 205, 195, 236, 106, - 110, 1, 205, 195, 250, 208, 110, 1, 205, 195, 214, 48, 110, 1, 111, 221, - 40, 110, 251, 69, 50, 231, 43, 208, 93, 110, 251, 69, 218, 230, 231, 43, - 208, 93, 110, 251, 69, 52, 231, 43, 208, 93, 110, 251, 69, 125, 83, 208, - 93, 110, 251, 69, 218, 230, 83, 208, 93, 110, 251, 69, 128, 83, 208, 93, - 110, 251, 69, 250, 6, 208, 93, 110, 251, 69, 250, 6, 222, 77, 208, 93, - 110, 251, 69, 250, 6, 203, 77, 110, 251, 69, 250, 6, 203, 103, 110, 251, - 69, 250, 6, 237, 10, 124, 110, 251, 69, 250, 6, 230, 137, 124, 110, 251, - 69, 250, 6, 203, 78, 124, 110, 251, 69, 128, 180, 110, 251, 69, 128, 202, - 73, 180, 110, 251, 69, 128, 232, 238, 110, 251, 69, 128, 172, 232, 238, - 110, 251, 69, 128, 238, 123, 110, 251, 69, 128, 244, 113, 110, 251, 69, - 128, 221, 233, 110, 251, 69, 128, 197, 114, 110, 251, 69, 128, 199, 88, - 110, 251, 69, 125, 180, 110, 251, 69, 125, 202, 73, 180, 110, 251, 69, - 125, 232, 238, 110, 251, 69, 125, 172, 232, 238, 110, 251, 69, 125, 238, - 123, 110, 251, 69, 125, 244, 113, 110, 251, 69, 125, 221, 233, 110, 251, - 69, 125, 197, 114, 110, 251, 69, 125, 199, 88, 110, 251, 69, 125, 51, - 110, 2, 169, 3, 240, 182, 110, 202, 162, 1, 208, 70, 110, 54, 78, 110, - 211, 163, 244, 179, 234, 98, 204, 193, 206, 126, 234, 160, 1, 213, 213, - 206, 126, 234, 160, 240, 247, 213, 213, 206, 126, 234, 160, 133, 204, - 207, 206, 126, 234, 160, 120, 204, 207, 65, 33, 16, 211, 179, 65, 33, 16, - 239, 190, 65, 33, 16, 212, 237, 65, 33, 16, 213, 203, 236, 142, 65, 33, - 16, 213, 203, 238, 214, 65, 33, 16, 199, 123, 236, 142, 65, 33, 16, 199, - 123, 238, 214, 65, 33, 16, 224, 122, 65, 33, 16, 203, 202, 65, 33, 16, - 213, 87, 65, 33, 16, 195, 221, 65, 33, 16, 195, 222, 238, 214, 65, 33, - 16, 223, 104, 65, 33, 16, 250, 146, 236, 142, 65, 33, 16, 235, 219, 236, - 142, 65, 33, 16, 203, 3, 65, 33, 16, 224, 70, 65, 33, 16, 250, 135, 65, - 33, 16, 250, 136, 238, 214, 65, 33, 16, 203, 209, 65, 33, 16, 202, 144, - 65, 33, 16, 214, 59, 250, 97, 65, 33, 16, 233, 9, 250, 97, 65, 33, 16, - 211, 178, 65, 33, 16, 246, 127, 65, 33, 16, 199, 112, 65, 33, 16, 225, - 130, 250, 97, 65, 33, 16, 224, 72, 250, 97, 65, 33, 16, 224, 71, 250, 97, - 65, 33, 16, 208, 138, 65, 33, 16, 213, 77, 65, 33, 16, 204, 217, 250, - 139, 65, 33, 16, 213, 202, 250, 97, 65, 33, 16, 199, 122, 250, 97, 65, - 33, 16, 250, 140, 250, 97, 65, 33, 16, 250, 133, 65, 33, 16, 223, 177, - 65, 33, 16, 210, 36, 65, 33, 16, 212, 161, 250, 97, 65, 33, 16, 202, 46, - 65, 33, 16, 250, 205, 65, 33, 16, 208, 73, 65, 33, 16, 203, 213, 250, 97, - 65, 33, 16, 203, 213, 219, 53, 204, 215, 65, 33, 16, 213, 197, 250, 97, - 65, 33, 16, 202, 180, 65, 33, 16, 222, 64, 65, 33, 16, 237, 32, 65, 33, - 16, 201, 162, 65, 33, 16, 202, 229, 65, 33, 16, 223, 107, 65, 33, 16, - 250, 146, 235, 219, 217, 13, 65, 33, 16, 234, 106, 250, 97, 65, 33, 16, - 225, 243, 65, 33, 16, 201, 131, 250, 97, 65, 33, 16, 224, 125, 201, 130, - 65, 33, 16, 213, 10, 65, 33, 16, 211, 183, 65, 33, 16, 223, 142, 65, 33, - 16, 244, 162, 250, 97, 65, 33, 16, 210, 152, 65, 33, 16, 213, 90, 250, - 97, 65, 33, 16, 213, 88, 250, 97, 65, 33, 16, 230, 87, 65, 33, 16, 217, - 134, 65, 33, 16, 212, 215, 65, 33, 16, 223, 143, 250, 243, 65, 33, 16, - 201, 131, 250, 243, 65, 33, 16, 204, 187, 65, 33, 16, 232, 224, 65, 33, - 16, 225, 130, 217, 13, 65, 33, 16, 214, 59, 217, 13, 65, 33, 16, 213, - 203, 217, 13, 65, 33, 16, 212, 214, 65, 33, 16, 223, 127, 65, 33, 16, - 212, 213, 65, 33, 16, 223, 106, 65, 33, 16, 213, 11, 217, 13, 65, 33, 16, - 224, 71, 217, 14, 250, 177, 65, 33, 16, 224, 72, 217, 14, 250, 177, 65, - 33, 16, 195, 219, 65, 33, 16, 250, 136, 217, 13, 65, 33, 16, 250, 137, - 203, 210, 217, 13, 65, 33, 16, 195, 220, 65, 33, 16, 223, 105, 65, 33, - 16, 236, 137, 65, 33, 16, 246, 128, 65, 33, 16, 218, 201, 225, 129, 65, - 33, 16, 199, 123, 217, 13, 65, 33, 16, 212, 161, 217, 13, 65, 33, 16, - 211, 184, 217, 13, 65, 33, 16, 214, 55, 65, 33, 16, 250, 164, 65, 33, 16, - 221, 51, 65, 33, 16, 213, 88, 217, 13, 65, 33, 16, 213, 90, 217, 13, 65, - 33, 16, 236, 1, 213, 89, 65, 33, 16, 223, 5, 65, 33, 16, 250, 165, 65, - 33, 16, 201, 131, 217, 13, 65, 33, 16, 236, 140, 65, 33, 16, 203, 213, - 217, 13, 65, 33, 16, 203, 203, 65, 33, 16, 244, 162, 217, 13, 65, 33, 16, - 236, 57, 65, 33, 16, 208, 74, 217, 13, 65, 33, 16, 196, 182, 223, 177, - 65, 33, 16, 201, 128, 65, 33, 16, 211, 185, 65, 33, 16, 201, 132, 65, 33, - 16, 201, 129, 65, 33, 16, 211, 182, 65, 33, 16, 201, 127, 65, 33, 16, - 211, 181, 65, 33, 16, 233, 8, 65, 33, 16, 250, 89, 65, 33, 16, 236, 1, - 250, 89, 65, 33, 16, 213, 197, 217, 13, 65, 33, 16, 202, 179, 236, 14, - 65, 33, 16, 202, 179, 235, 218, 65, 33, 16, 202, 181, 250, 141, 65, 33, - 16, 202, 173, 224, 180, 250, 132, 65, 33, 16, 224, 124, 65, 33, 16, 236, - 94, 65, 33, 16, 196, 24, 224, 121, 65, 33, 16, 196, 24, 250, 177, 65, 33, - 16, 204, 216, 65, 33, 16, 223, 178, 250, 177, 65, 33, 16, 238, 215, 250, - 97, 65, 33, 16, 223, 108, 250, 97, 65, 33, 16, 223, 108, 250, 243, 65, - 33, 16, 223, 108, 217, 13, 65, 33, 16, 250, 140, 217, 13, 65, 33, 16, - 250, 142, 65, 33, 16, 238, 214, 65, 33, 16, 201, 143, 65, 33, 16, 202, - 219, 65, 33, 16, 223, 131, 65, 33, 16, 222, 69, 236, 87, 244, 152, 65, - 33, 16, 222, 69, 237, 33, 244, 153, 65, 33, 16, 222, 69, 201, 146, 244, - 153, 65, 33, 16, 222, 69, 202, 231, 244, 153, 65, 33, 16, 222, 69, 225, - 238, 244, 152, 65, 33, 16, 233, 9, 217, 14, 250, 177, 65, 33, 16, 233, 9, - 213, 78, 250, 85, 65, 33, 16, 233, 9, 213, 78, 239, 49, 65, 33, 16, 238, - 239, 65, 33, 16, 238, 240, 213, 78, 250, 86, 224, 121, 65, 33, 16, 238, - 240, 213, 78, 250, 86, 250, 177, 65, 33, 16, 238, 240, 213, 78, 239, 49, - 65, 33, 16, 201, 151, 65, 33, 16, 250, 90, 65, 33, 16, 225, 245, 65, 33, - 16, 239, 6, 65, 33, 16, 251, 56, 212, 45, 250, 91, 65, 33, 16, 251, 56, - 250, 88, 65, 33, 16, 251, 56, 250, 91, 65, 33, 16, 251, 56, 219, 47, 65, - 33, 16, 251, 56, 219, 58, 65, 33, 16, 251, 56, 233, 10, 65, 33, 16, 251, - 56, 233, 7, 65, 33, 16, 251, 56, 212, 45, 233, 10, 65, 33, 16, 219, 180, - 211, 191, 230, 85, 65, 33, 16, 219, 180, 250, 245, 211, 191, 230, 85, 65, - 33, 16, 219, 180, 239, 48, 230, 85, 65, 33, 16, 219, 180, 250, 245, 239, - 48, 230, 85, 65, 33, 16, 219, 180, 201, 138, 230, 85, 65, 33, 16, 219, - 180, 201, 152, 65, 33, 16, 219, 180, 202, 224, 230, 85, 65, 33, 16, 219, - 180, 202, 224, 222, 73, 230, 85, 65, 33, 16, 219, 180, 222, 73, 230, 85, - 65, 33, 16, 219, 180, 212, 90, 230, 85, 65, 33, 16, 225, 137, 202, 252, - 230, 86, 65, 33, 16, 250, 137, 202, 252, 230, 86, 65, 33, 16, 235, 89, - 202, 221, 65, 33, 16, 235, 89, 218, 115, 65, 33, 16, 235, 89, 238, 245, - 65, 33, 16, 219, 180, 199, 116, 230, 85, 65, 33, 16, 219, 180, 211, 190, - 230, 85, 65, 33, 16, 219, 180, 212, 90, 202, 224, 230, 85, 65, 33, 16, - 233, 4, 217, 226, 250, 141, 65, 33, 16, 233, 4, 217, 226, 238, 213, 65, - 33, 16, 236, 104, 224, 180, 234, 106, 198, 217, 65, 33, 16, 225, 244, 65, - 33, 16, 225, 242, 65, 33, 16, 234, 106, 250, 98, 239, 47, 230, 84, 65, - 33, 16, 234, 106, 239, 4, 163, 65, 33, 16, 234, 106, 239, 4, 217, 134, - 65, 33, 16, 234, 106, 217, 129, 230, 85, 65, 33, 16, 234, 106, 239, 4, - 239, 20, 65, 33, 16, 234, 106, 205, 216, 239, 3, 239, 20, 65, 33, 16, - 234, 106, 239, 4, 224, 101, 65, 33, 16, 234, 106, 239, 4, 195, 11, 65, - 33, 16, 234, 106, 239, 4, 216, 142, 224, 121, 65, 33, 16, 234, 106, 239, - 4, 216, 142, 250, 177, 65, 33, 16, 234, 106, 219, 228, 244, 154, 238, - 245, 65, 33, 16, 234, 106, 219, 228, 244, 154, 218, 115, 65, 33, 16, 235, - 34, 205, 216, 244, 154, 199, 115, 65, 33, 16, 234, 106, 205, 216, 244, - 154, 203, 214, 65, 33, 16, 234, 106, 217, 16, 65, 33, 16, 244, 155, 194, - 234, 65, 33, 16, 244, 155, 223, 176, 65, 33, 16, 244, 155, 205, 101, 65, - 33, 16, 234, 106, 230, 137, 196, 23, 202, 225, 65, 33, 16, 234, 106, 236, - 105, 250, 166, 65, 33, 16, 196, 23, 201, 139, 65, 33, 16, 238, 253, 201, - 139, 65, 33, 16, 238, 253, 202, 225, 65, 33, 16, 238, 253, 250, 143, 237, - 33, 238, 146, 65, 33, 16, 238, 253, 218, 113, 202, 230, 238, 146, 65, 33, - 16, 238, 253, 238, 236, 235, 231, 238, 146, 65, 33, 16, 238, 253, 201, - 149, 214, 65, 238, 146, 65, 33, 16, 196, 23, 250, 143, 237, 33, 238, 146, - 65, 33, 16, 196, 23, 218, 113, 202, 230, 238, 146, 65, 33, 16, 196, 23, - 238, 236, 235, 231, 238, 146, 65, 33, 16, 196, 23, 201, 149, 214, 65, - 238, 146, 65, 33, 16, 233, 168, 238, 252, 65, 33, 16, 233, 168, 196, 22, - 65, 33, 16, 239, 5, 250, 143, 218, 202, 65, 33, 16, 239, 5, 250, 143, - 219, 88, 65, 33, 16, 239, 5, 238, 214, 65, 33, 16, 239, 5, 202, 171, 65, - 33, 16, 206, 29, 202, 171, 65, 33, 16, 206, 29, 202, 172, 238, 198, 65, - 33, 16, 206, 29, 202, 172, 201, 140, 65, 33, 16, 206, 29, 202, 172, 202, - 217, 65, 33, 16, 206, 29, 250, 61, 65, 33, 16, 206, 29, 250, 62, 238, - 198, 65, 33, 16, 206, 29, 250, 62, 201, 140, 65, 33, 16, 206, 29, 250, - 62, 202, 217, 65, 33, 16, 238, 237, 233, 149, 65, 33, 16, 238, 244, 213, - 229, 65, 33, 16, 204, 203, 65, 33, 16, 250, 82, 163, 65, 33, 16, 250, 82, - 198, 217, 65, 33, 16, 250, 82, 234, 4, 65, 33, 16, 250, 82, 239, 20, 65, - 33, 16, 250, 82, 224, 101, 65, 33, 16, 250, 82, 195, 11, 65, 33, 16, 250, - 82, 216, 141, 65, 33, 16, 224, 71, 217, 14, 219, 57, 65, 33, 16, 224, 72, - 217, 14, 219, 57, 65, 33, 16, 224, 71, 217, 14, 224, 121, 65, 33, 16, - 224, 72, 217, 14, 224, 121, 65, 33, 16, 223, 178, 224, 121, 65, 33, 16, - 233, 9, 217, 14, 224, 121, 33, 16, 206, 19, 248, 185, 33, 16, 54, 248, - 185, 33, 16, 48, 248, 185, 33, 16, 210, 41, 48, 248, 185, 33, 16, 239, - 187, 248, 185, 33, 16, 206, 139, 248, 185, 33, 16, 50, 210, 71, 56, 33, - 16, 52, 210, 71, 56, 33, 16, 210, 71, 238, 120, 33, 16, 239, 231, 208, - 77, 33, 16, 240, 4, 246, 241, 33, 16, 208, 77, 33, 16, 244, 40, 33, 16, - 210, 69, 235, 22, 33, 16, 210, 69, 235, 21, 33, 16, 210, 69, 235, 20, 33, - 16, 235, 44, 33, 16, 235, 45, 58, 33, 16, 247, 163, 78, 33, 16, 247, 26, - 33, 16, 247, 177, 33, 16, 170, 33, 16, 214, 43, 204, 235, 33, 16, 200, - 195, 204, 235, 33, 16, 202, 121, 204, 235, 33, 16, 234, 144, 204, 235, - 33, 16, 234, 236, 204, 235, 33, 16, 205, 241, 204, 235, 33, 16, 205, 239, - 234, 123, 33, 16, 234, 142, 234, 123, 33, 16, 234, 72, 244, 82, 33, 16, - 234, 72, 244, 83, 213, 231, 250, 234, 33, 16, 234, 72, 244, 83, 213, 231, - 248, 168, 33, 16, 247, 70, 244, 82, 33, 16, 235, 185, 244, 82, 33, 16, - 235, 185, 244, 83, 213, 231, 250, 234, 33, 16, 235, 185, 244, 83, 213, - 231, 248, 168, 33, 16, 237, 80, 244, 81, 33, 16, 237, 80, 244, 80, 33, - 16, 218, 32, 219, 110, 210, 52, 33, 16, 54, 206, 224, 33, 16, 54, 234, - 219, 33, 16, 234, 220, 200, 20, 33, 16, 234, 220, 237, 106, 33, 16, 217, - 118, 200, 20, 33, 16, 217, 118, 237, 106, 33, 16, 206, 225, 200, 20, 33, - 16, 206, 225, 237, 106, 33, 16, 211, 37, 154, 206, 224, 33, 16, 211, 37, - 154, 234, 219, 33, 16, 244, 20, 202, 50, 33, 16, 240, 125, 202, 50, 33, - 16, 213, 231, 250, 234, 33, 16, 213, 231, 248, 168, 33, 16, 211, 18, 250, - 234, 33, 16, 211, 18, 248, 168, 33, 16, 218, 35, 210, 52, 33, 16, 197, - 65, 210, 52, 33, 16, 155, 210, 52, 33, 16, 211, 37, 210, 52, 33, 16, 236, - 157, 210, 52, 33, 16, 205, 235, 210, 52, 33, 16, 202, 145, 210, 52, 33, - 16, 205, 227, 210, 52, 33, 16, 106, 230, 202, 200, 212, 210, 52, 33, 16, - 196, 217, 215, 184, 33, 16, 96, 215, 184, 33, 16, 244, 114, 196, 217, - 215, 184, 33, 16, 46, 215, 185, 197, 67, 33, 16, 46, 215, 185, 247, 250, - 33, 16, 201, 161, 215, 185, 120, 197, 67, 33, 16, 201, 161, 215, 185, - 120, 247, 250, 33, 16, 201, 161, 215, 185, 50, 197, 67, 33, 16, 201, 161, - 215, 185, 50, 247, 250, 33, 16, 201, 161, 215, 185, 52, 197, 67, 33, 16, - 201, 161, 215, 185, 52, 247, 250, 33, 16, 201, 161, 215, 185, 133, 197, - 67, 33, 16, 201, 161, 215, 185, 133, 247, 250, 33, 16, 201, 161, 215, - 185, 120, 52, 197, 67, 33, 16, 201, 161, 215, 185, 120, 52, 247, 250, 33, - 16, 218, 99, 215, 185, 197, 67, 33, 16, 218, 99, 215, 185, 247, 250, 33, - 16, 201, 158, 215, 185, 133, 197, 67, 33, 16, 201, 158, 215, 185, 133, - 247, 250, 33, 16, 213, 81, 215, 184, 33, 16, 198, 230, 215, 184, 33, 16, - 215, 185, 247, 250, 33, 16, 215, 72, 215, 184, 33, 16, 244, 51, 215, 185, - 197, 67, 33, 16, 244, 51, 215, 185, 247, 250, 33, 16, 247, 161, 33, 16, - 197, 65, 215, 188, 33, 16, 155, 215, 188, 33, 16, 211, 37, 215, 188, 33, - 16, 236, 157, 215, 188, 33, 16, 205, 235, 215, 188, 33, 16, 202, 145, - 215, 188, 33, 16, 205, 227, 215, 188, 33, 16, 106, 230, 202, 200, 212, - 215, 188, 33, 16, 37, 204, 209, 33, 16, 37, 205, 64, 204, 209, 33, 16, - 37, 201, 169, 33, 16, 37, 201, 168, 33, 16, 37, 201, 167, 33, 16, 235, 5, - 201, 169, 33, 16, 235, 5, 201, 168, 33, 16, 235, 5, 201, 167, 33, 16, 37, - 249, 253, 238, 123, 33, 16, 37, 234, 228, 33, 16, 37, 234, 227, 33, 16, - 37, 234, 226, 33, 16, 37, 234, 225, 33, 16, 37, 234, 224, 33, 16, 248, - 97, 248, 116, 33, 16, 236, 98, 248, 116, 33, 16, 248, 97, 202, 79, 33, - 16, 236, 98, 202, 79, 33, 16, 248, 97, 205, 187, 33, 16, 236, 98, 205, - 187, 33, 16, 248, 97, 212, 170, 33, 16, 236, 98, 212, 170, 33, 16, 37, - 251, 122, 33, 16, 37, 204, 239, 33, 16, 37, 202, 236, 33, 16, 37, 204, - 240, 33, 16, 37, 219, 194, 33, 16, 37, 219, 193, 33, 16, 37, 251, 121, - 33, 16, 37, 221, 114, 33, 16, 250, 73, 200, 20, 33, 16, 250, 73, 237, - 106, 33, 16, 37, 238, 139, 33, 16, 37, 209, 207, 33, 16, 37, 234, 208, - 33, 16, 37, 205, 183, 33, 16, 37, 248, 75, 33, 16, 37, 54, 201, 228, 33, - 16, 37, 201, 145, 201, 228, 33, 16, 209, 212, 33, 16, 204, 121, 33, 16, - 195, 157, 33, 16, 212, 162, 33, 16, 219, 38, 33, 16, 234, 155, 33, 16, - 240, 194, 33, 16, 239, 106, 33, 16, 232, 255, 215, 189, 205, 209, 33, 16, - 232, 255, 215, 189, 215, 226, 205, 209, 33, 16, 201, 197, 33, 16, 200, - 241, 33, 16, 225, 163, 200, 241, 33, 16, 200, 242, 205, 209, 33, 16, 200, - 242, 200, 20, 33, 16, 213, 248, 204, 162, 33, 16, 213, 248, 204, 159, 33, - 16, 213, 248, 204, 158, 33, 16, 213, 248, 204, 157, 33, 16, 213, 248, - 204, 156, 33, 16, 213, 248, 204, 155, 33, 16, 213, 248, 204, 154, 33, 16, - 213, 248, 204, 153, 33, 16, 213, 248, 204, 152, 33, 16, 213, 248, 204, - 161, 33, 16, 213, 248, 204, 160, 33, 16, 232, 42, 33, 16, 217, 26, 33, - 16, 236, 98, 77, 204, 199, 33, 16, 239, 99, 205, 209, 33, 16, 37, 133, - 247, 191, 33, 16, 37, 120, 247, 191, 33, 16, 37, 232, 55, 33, 16, 37, - 205, 173, 212, 95, 33, 16, 213, 27, 78, 33, 16, 213, 27, 120, 78, 33, 16, - 155, 213, 27, 78, 33, 16, 233, 36, 200, 20, 33, 16, 233, 36, 237, 106, - 33, 16, 3, 235, 4, 33, 16, 239, 214, 33, 16, 239, 215, 250, 248, 33, 16, - 219, 160, 33, 16, 221, 135, 33, 16, 247, 158, 33, 16, 207, 65, 197, 67, - 33, 16, 207, 65, 247, 250, 33, 16, 218, 184, 33, 16, 218, 185, 247, 250, - 33, 16, 207, 59, 197, 67, 33, 16, 207, 59, 247, 250, 33, 16, 234, 89, - 197, 67, 33, 16, 234, 89, 247, 250, 33, 16, 221, 136, 212, 242, 210, 52, - 33, 16, 221, 136, 225, 235, 210, 52, 33, 16, 247, 159, 210, 52, 33, 16, - 207, 65, 210, 52, 33, 16, 218, 185, 210, 52, 33, 16, 207, 59, 210, 52, - 33, 16, 202, 250, 212, 240, 240, 155, 211, 201, 212, 241, 33, 16, 202, - 250, 212, 240, 240, 155, 211, 201, 225, 234, 33, 16, 202, 250, 212, 240, - 240, 155, 211, 201, 212, 242, 238, 224, 33, 16, 202, 250, 225, 233, 240, - 155, 211, 201, 212, 241, 33, 16, 202, 250, 225, 233, 240, 155, 211, 201, - 225, 234, 33, 16, 202, 250, 225, 233, 240, 155, 211, 201, 225, 235, 238, - 224, 33, 16, 202, 250, 225, 233, 240, 155, 211, 201, 225, 235, 238, 223, - 33, 16, 202, 250, 225, 233, 240, 155, 211, 201, 225, 235, 238, 222, 33, - 16, 240, 185, 33, 16, 232, 227, 247, 70, 244, 82, 33, 16, 232, 227, 235, - 185, 244, 82, 33, 16, 46, 249, 219, 33, 16, 198, 251, 33, 16, 212, 59, - 33, 16, 244, 72, 33, 16, 208, 128, 33, 16, 244, 77, 33, 16, 201, 215, 33, - 16, 212, 28, 33, 16, 212, 29, 234, 211, 33, 16, 208, 129, 234, 211, 33, - 16, 201, 216, 210, 49, 33, 16, 212, 223, 204, 111, 33, 16, 223, 231, 247, - 70, 244, 82, 33, 16, 223, 231, 236, 98, 77, 212, 155, 33, 16, 223, 231, - 48, 215, 188, 33, 16, 223, 231, 210, 120, 78, 33, 16, 223, 231, 197, 65, - 215, 188, 33, 16, 223, 231, 155, 215, 188, 33, 16, 223, 231, 211, 37, - 215, 189, 204, 210, 237, 106, 33, 16, 223, 231, 211, 37, 215, 189, 204, - 210, 200, 20, 33, 16, 223, 231, 236, 157, 215, 189, 204, 210, 237, 106, - 33, 16, 223, 231, 236, 157, 215, 189, 204, 210, 200, 20, 33, 16, 223, - 231, 234, 220, 56, 31, 198, 236, 215, 192, 204, 9, 31, 198, 236, 215, - 192, 203, 254, 31, 198, 236, 215, 192, 203, 244, 31, 198, 236, 215, 192, - 203, 237, 31, 198, 236, 215, 192, 203, 229, 31, 198, 236, 215, 192, 203, - 223, 31, 198, 236, 215, 192, 203, 222, 31, 198, 236, 215, 192, 203, 221, - 31, 198, 236, 215, 192, 203, 220, 31, 198, 236, 215, 192, 204, 8, 31, - 198, 236, 215, 192, 204, 7, 31, 198, 236, 215, 192, 204, 6, 31, 198, 236, - 215, 192, 204, 5, 31, 198, 236, 215, 192, 204, 4, 31, 198, 236, 215, 192, - 204, 3, 31, 198, 236, 215, 192, 204, 2, 31, 198, 236, 215, 192, 204, 1, - 31, 198, 236, 215, 192, 204, 0, 31, 198, 236, 215, 192, 203, 255, 31, - 198, 236, 215, 192, 203, 253, 31, 198, 236, 215, 192, 203, 252, 31, 198, - 236, 215, 192, 203, 251, 31, 198, 236, 215, 192, 203, 250, 31, 198, 236, - 215, 192, 203, 249, 31, 198, 236, 215, 192, 203, 228, 31, 198, 236, 215, - 192, 203, 227, 31, 198, 236, 215, 192, 203, 226, 31, 198, 236, 215, 192, - 203, 225, 31, 198, 236, 215, 192, 203, 224, 31, 225, 185, 215, 192, 204, - 9, 31, 225, 185, 215, 192, 203, 254, 31, 225, 185, 215, 192, 203, 237, - 31, 225, 185, 215, 192, 203, 229, 31, 225, 185, 215, 192, 203, 222, 31, - 225, 185, 215, 192, 203, 221, 31, 225, 185, 215, 192, 204, 7, 31, 225, - 185, 215, 192, 204, 6, 31, 225, 185, 215, 192, 204, 5, 31, 225, 185, 215, - 192, 204, 4, 31, 225, 185, 215, 192, 204, 1, 31, 225, 185, 215, 192, 204, - 0, 31, 225, 185, 215, 192, 203, 255, 31, 225, 185, 215, 192, 203, 250, - 31, 225, 185, 215, 192, 203, 249, 31, 225, 185, 215, 192, 203, 248, 31, - 225, 185, 215, 192, 203, 247, 31, 225, 185, 215, 192, 203, 246, 31, 225, - 185, 215, 192, 203, 245, 31, 225, 185, 215, 192, 203, 243, 31, 225, 185, - 215, 192, 203, 242, 31, 225, 185, 215, 192, 203, 241, 31, 225, 185, 215, - 192, 203, 240, 31, 225, 185, 215, 192, 203, 239, 31, 225, 185, 215, 192, - 203, 238, 31, 225, 185, 215, 192, 203, 236, 31, 225, 185, 215, 192, 203, - 235, 31, 225, 185, 215, 192, 203, 234, 31, 225, 185, 215, 192, 203, 233, - 31, 225, 185, 215, 192, 203, 232, 31, 225, 185, 215, 192, 203, 231, 31, - 225, 185, 215, 192, 203, 230, 31, 225, 185, 215, 192, 203, 228, 31, 225, - 185, 215, 192, 203, 227, 31, 225, 185, 215, 192, 203, 226, 31, 225, 185, - 215, 192, 203, 225, 31, 225, 185, 215, 192, 203, 224, 37, 31, 33, 201, - 141, 37, 31, 33, 202, 218, 37, 31, 33, 212, 252, 31, 33, 222, 68, 219, - 157, 215, 67, 195, 79, 219, 157, 215, 67, 98, 219, 157, 215, 67, 103, - 219, 157, 215, 67, 135, 219, 157, 215, 67, 136, 219, 157, 215, 67, 150, - 219, 157, 215, 67, 174, 219, 157, 215, 67, 182, 219, 157, 215, 67, 178, - 219, 157, 215, 67, 184, 219, 157, 215, 67, 202, 248, 219, 157, 215, 67, - 236, 127, 219, 157, 215, 67, 200, 219, 219, 157, 215, 67, 202, 149, 219, - 157, 215, 67, 234, 139, 219, 157, 215, 67, 235, 29, 219, 157, 215, 67, - 205, 236, 219, 157, 215, 67, 207, 24, 219, 157, 215, 67, 236, 158, 219, - 157, 215, 67, 216, 94, 218, 114, 38, 236, 202, 238, 238, 38, 232, 7, 236, - 202, 238, 238, 38, 230, 206, 236, 202, 238, 238, 38, 236, 201, 232, 8, - 238, 238, 38, 236, 201, 230, 205, 238, 238, 38, 236, 202, 202, 220, 38, - 246, 155, 202, 220, 38, 234, 98, 244, 113, 202, 220, 38, 218, 176, 202, - 220, 38, 248, 180, 202, 220, 38, 224, 89, 205, 186, 202, 220, 38, 240, - 242, 202, 220, 38, 250, 47, 202, 220, 38, 214, 9, 202, 220, 38, 247, 169, - 213, 224, 202, 220, 38, 239, 101, 214, 4, 238, 190, 202, 220, 38, 238, - 187, 202, 220, 38, 195, 227, 202, 220, 38, 225, 221, 202, 220, 38, 213, - 6, 202, 220, 38, 210, 128, 202, 220, 38, 240, 254, 202, 220, 38, 231, 64, - 248, 245, 202, 220, 38, 197, 143, 202, 220, 38, 234, 183, 202, 220, 38, - 251, 93, 202, 220, 38, 210, 84, 202, 220, 38, 210, 56, 202, 220, 38, 236, - 200, 202, 220, 38, 225, 4, 202, 220, 38, 240, 249, 202, 220, 38, 236, 97, - 202, 220, 38, 237, 45, 202, 220, 38, 246, 123, 202, 220, 38, 239, 111, - 202, 220, 38, 27, 210, 55, 202, 220, 38, 213, 171, 202, 220, 38, 222, 72, - 202, 220, 38, 244, 65, 202, 220, 38, 223, 220, 202, 220, 38, 233, 210, - 202, 220, 38, 204, 174, 202, 220, 38, 211, 151, 202, 220, 38, 234, 97, - 202, 220, 38, 210, 57, 202, 220, 38, 222, 112, 214, 4, 218, 150, 202, - 220, 38, 210, 53, 202, 220, 38, 233, 19, 202, 2, 219, 92, 202, 220, 38, - 236, 99, 202, 220, 38, 204, 188, 202, 220, 38, 232, 230, 202, 220, 38, - 236, 90, 202, 220, 38, 213, 51, 202, 220, 38, 209, 200, 202, 220, 38, - 234, 209, 202, 220, 38, 199, 114, 214, 4, 197, 123, 202, 220, 38, 241, 3, - 202, 220, 38, 219, 109, 202, 220, 38, 236, 2, 202, 220, 38, 200, 30, 202, - 220, 38, 238, 225, 202, 220, 38, 244, 67, 218, 74, 202, 220, 38, 232, - 206, 202, 220, 38, 233, 211, 225, 230, 202, 220, 38, 219, 168, 202, 220, - 38, 251, 117, 202, 220, 38, 236, 115, 202, 220, 38, 237, 110, 202, 220, - 38, 197, 121, 202, 220, 38, 206, 14, 202, 220, 38, 225, 194, 202, 220, - 38, 239, 68, 202, 220, 38, 239, 192, 202, 220, 38, 238, 221, 202, 220, - 38, 235, 222, 202, 220, 38, 207, 20, 202, 220, 38, 204, 192, 202, 220, - 38, 232, 57, 202, 220, 38, 244, 15, 202, 220, 38, 244, 62, 202, 220, 38, - 235, 97, 202, 220, 38, 251, 57, 202, 220, 38, 244, 14, 202, 220, 38, 214, - 49, 202, 187, 199, 91, 202, 220, 38, 238, 247, 202, 220, 38, 222, 227, - 202, 220, 38, 234, 148, 240, 209, 209, 169, 200, 33, 17, 98, 240, 209, - 209, 169, 200, 33, 17, 103, 240, 209, 209, 169, 200, 33, 17, 135, 240, - 209, 209, 169, 200, 33, 17, 136, 240, 209, 209, 169, 200, 33, 17, 150, - 240, 209, 209, 169, 200, 33, 17, 174, 240, 209, 209, 169, 200, 33, 17, - 182, 240, 209, 209, 169, 200, 33, 17, 178, 240, 209, 209, 169, 200, 33, - 17, 184, 240, 209, 209, 169, 202, 244, 17, 98, 240, 209, 209, 169, 202, - 244, 17, 103, 240, 209, 209, 169, 202, 244, 17, 135, 240, 209, 209, 169, - 202, 244, 17, 136, 240, 209, 209, 169, 202, 244, 17, 150, 240, 209, 209, - 169, 202, 244, 17, 174, 240, 209, 209, 169, 202, 244, 17, 182, 240, 209, - 209, 169, 202, 244, 17, 178, 240, 209, 209, 169, 202, 244, 17, 184, 141, - 203, 86, 113, 98, 141, 203, 86, 113, 103, 141, 203, 86, 113, 135, 141, - 203, 86, 113, 136, 141, 203, 86, 113, 150, 203, 86, 113, 98, 203, 86, - 113, 150, 13, 27, 6, 63, 13, 27, 6, 249, 219, 13, 27, 6, 247, 69, 13, 27, - 6, 240, 98, 13, 27, 6, 70, 13, 27, 6, 235, 184, 13, 27, 6, 234, 71, 13, - 27, 6, 232, 154, 13, 27, 6, 68, 13, 27, 6, 225, 108, 13, 27, 6, 224, 227, - 13, 27, 6, 158, 13, 27, 6, 221, 40, 13, 27, 6, 217, 225, 13, 27, 6, 74, - 13, 27, 6, 213, 195, 13, 27, 6, 211, 116, 13, 27, 6, 143, 13, 27, 6, 209, - 35, 13, 27, 6, 203, 185, 13, 27, 6, 66, 13, 27, 6, 199, 215, 13, 27, 6, - 197, 189, 13, 27, 6, 196, 216, 13, 27, 6, 196, 143, 13, 27, 6, 195, 157, - 13, 27, 4, 63, 13, 27, 4, 249, 219, 13, 27, 4, 247, 69, 13, 27, 4, 240, - 98, 13, 27, 4, 70, 13, 27, 4, 235, 184, 13, 27, 4, 234, 71, 13, 27, 4, - 232, 154, 13, 27, 4, 68, 13, 27, 4, 225, 108, 13, 27, 4, 224, 227, 13, - 27, 4, 158, 13, 27, 4, 221, 40, 13, 27, 4, 217, 225, 13, 27, 4, 74, 13, - 27, 4, 213, 195, 13, 27, 4, 211, 116, 13, 27, 4, 143, 13, 27, 4, 209, 35, - 13, 27, 4, 203, 185, 13, 27, 4, 66, 13, 27, 4, 199, 215, 13, 27, 4, 197, - 189, 13, 27, 4, 196, 216, 13, 27, 4, 196, 143, 13, 27, 4, 195, 157, 13, - 41, 6, 63, 13, 41, 6, 249, 219, 13, 41, 6, 247, 69, 13, 41, 6, 240, 98, - 13, 41, 6, 70, 13, 41, 6, 235, 184, 13, 41, 6, 234, 71, 13, 41, 6, 232, - 154, 13, 41, 6, 68, 13, 41, 6, 225, 108, 13, 41, 6, 224, 227, 13, 41, 6, - 158, 13, 41, 6, 221, 40, 13, 41, 6, 217, 225, 13, 41, 6, 74, 13, 41, 6, - 213, 195, 13, 41, 6, 211, 116, 13, 41, 6, 143, 13, 41, 6, 209, 35, 13, - 41, 6, 203, 185, 13, 41, 6, 66, 13, 41, 6, 199, 215, 13, 41, 6, 197, 189, - 13, 41, 6, 196, 216, 13, 41, 6, 196, 143, 13, 41, 6, 195, 157, 13, 41, 4, - 63, 13, 41, 4, 249, 219, 13, 41, 4, 247, 69, 13, 41, 4, 240, 98, 13, 41, - 4, 70, 13, 41, 4, 235, 184, 13, 41, 4, 234, 71, 13, 41, 4, 68, 13, 41, 4, - 225, 108, 13, 41, 4, 224, 227, 13, 41, 4, 158, 13, 41, 4, 221, 40, 13, - 41, 4, 217, 225, 13, 41, 4, 74, 13, 41, 4, 213, 195, 13, 41, 4, 211, 116, - 13, 41, 4, 143, 13, 41, 4, 209, 35, 13, 41, 4, 203, 185, 13, 41, 4, 66, - 13, 41, 4, 199, 215, 13, 41, 4, 197, 189, 13, 41, 4, 196, 216, 13, 41, 4, - 196, 143, 13, 41, 4, 195, 157, 13, 27, 41, 6, 63, 13, 27, 41, 6, 249, - 219, 13, 27, 41, 6, 247, 69, 13, 27, 41, 6, 240, 98, 13, 27, 41, 6, 70, - 13, 27, 41, 6, 235, 184, 13, 27, 41, 6, 234, 71, 13, 27, 41, 6, 232, 154, - 13, 27, 41, 6, 68, 13, 27, 41, 6, 225, 108, 13, 27, 41, 6, 224, 227, 13, - 27, 41, 6, 158, 13, 27, 41, 6, 221, 40, 13, 27, 41, 6, 217, 225, 13, 27, - 41, 6, 74, 13, 27, 41, 6, 213, 195, 13, 27, 41, 6, 211, 116, 13, 27, 41, - 6, 143, 13, 27, 41, 6, 209, 35, 13, 27, 41, 6, 203, 185, 13, 27, 41, 6, - 66, 13, 27, 41, 6, 199, 215, 13, 27, 41, 6, 197, 189, 13, 27, 41, 6, 196, - 216, 13, 27, 41, 6, 196, 143, 13, 27, 41, 6, 195, 157, 13, 27, 41, 4, 63, - 13, 27, 41, 4, 249, 219, 13, 27, 41, 4, 247, 69, 13, 27, 41, 4, 240, 98, - 13, 27, 41, 4, 70, 13, 27, 41, 4, 235, 184, 13, 27, 41, 4, 234, 71, 13, - 27, 41, 4, 232, 154, 13, 27, 41, 4, 68, 13, 27, 41, 4, 225, 108, 13, 27, - 41, 4, 224, 227, 13, 27, 41, 4, 158, 13, 27, 41, 4, 221, 40, 13, 27, 41, - 4, 217, 225, 13, 27, 41, 4, 74, 13, 27, 41, 4, 213, 195, 13, 27, 41, 4, - 211, 116, 13, 27, 41, 4, 143, 13, 27, 41, 4, 209, 35, 13, 27, 41, 4, 203, - 185, 13, 27, 41, 4, 66, 13, 27, 41, 4, 199, 215, 13, 27, 41, 4, 197, 189, - 13, 27, 41, 4, 196, 216, 13, 27, 41, 4, 196, 143, 13, 27, 41, 4, 195, - 157, 13, 144, 6, 63, 13, 144, 6, 247, 69, 13, 144, 6, 240, 98, 13, 144, - 6, 234, 71, 13, 144, 6, 225, 108, 13, 144, 6, 224, 227, 13, 144, 6, 217, - 225, 13, 144, 6, 74, 13, 144, 6, 213, 195, 13, 144, 6, 211, 116, 13, 144, - 6, 209, 35, 13, 144, 6, 203, 185, 13, 144, 6, 66, 13, 144, 6, 199, 215, - 13, 144, 6, 197, 189, 13, 144, 6, 196, 216, 13, 144, 6, 196, 143, 13, - 144, 6, 195, 157, 13, 144, 4, 63, 13, 144, 4, 249, 219, 13, 144, 4, 247, - 69, 13, 144, 4, 240, 98, 13, 144, 4, 235, 184, 13, 144, 4, 232, 154, 13, - 144, 4, 68, 13, 144, 4, 225, 108, 13, 144, 4, 224, 227, 13, 144, 4, 158, - 13, 144, 4, 221, 40, 13, 144, 4, 217, 225, 13, 144, 4, 213, 195, 13, 144, - 4, 211, 116, 13, 144, 4, 143, 13, 144, 4, 209, 35, 13, 144, 4, 203, 185, - 13, 144, 4, 66, 13, 144, 4, 199, 215, 13, 144, 4, 197, 189, 13, 144, 4, - 196, 216, 13, 144, 4, 196, 143, 13, 144, 4, 195, 157, 13, 27, 144, 6, 63, - 13, 27, 144, 6, 249, 219, 13, 27, 144, 6, 247, 69, 13, 27, 144, 6, 240, - 98, 13, 27, 144, 6, 70, 13, 27, 144, 6, 235, 184, 13, 27, 144, 6, 234, - 71, 13, 27, 144, 6, 232, 154, 13, 27, 144, 6, 68, 13, 27, 144, 6, 225, - 108, 13, 27, 144, 6, 224, 227, 13, 27, 144, 6, 158, 13, 27, 144, 6, 221, - 40, 13, 27, 144, 6, 217, 225, 13, 27, 144, 6, 74, 13, 27, 144, 6, 213, - 195, 13, 27, 144, 6, 211, 116, 13, 27, 144, 6, 143, 13, 27, 144, 6, 209, - 35, 13, 27, 144, 6, 203, 185, 13, 27, 144, 6, 66, 13, 27, 144, 6, 199, - 215, 13, 27, 144, 6, 197, 189, 13, 27, 144, 6, 196, 216, 13, 27, 144, 6, - 196, 143, 13, 27, 144, 6, 195, 157, 13, 27, 144, 4, 63, 13, 27, 144, 4, - 249, 219, 13, 27, 144, 4, 247, 69, 13, 27, 144, 4, 240, 98, 13, 27, 144, - 4, 70, 13, 27, 144, 4, 235, 184, 13, 27, 144, 4, 234, 71, 13, 27, 144, 4, - 232, 154, 13, 27, 144, 4, 68, 13, 27, 144, 4, 225, 108, 13, 27, 144, 4, - 224, 227, 13, 27, 144, 4, 158, 13, 27, 144, 4, 221, 40, 13, 27, 144, 4, - 217, 225, 13, 27, 144, 4, 74, 13, 27, 144, 4, 213, 195, 13, 27, 144, 4, - 211, 116, 13, 27, 144, 4, 143, 13, 27, 144, 4, 209, 35, 13, 27, 144, 4, - 203, 185, 13, 27, 144, 4, 66, 13, 27, 144, 4, 199, 215, 13, 27, 144, 4, - 197, 189, 13, 27, 144, 4, 196, 216, 13, 27, 144, 4, 196, 143, 13, 27, - 144, 4, 195, 157, 13, 181, 6, 63, 13, 181, 6, 249, 219, 13, 181, 6, 240, - 98, 13, 181, 6, 70, 13, 181, 6, 235, 184, 13, 181, 6, 234, 71, 13, 181, - 6, 225, 108, 13, 181, 6, 224, 227, 13, 181, 6, 158, 13, 181, 6, 221, 40, - 13, 181, 6, 217, 225, 13, 181, 6, 74, 13, 181, 6, 213, 195, 13, 181, 6, - 211, 116, 13, 181, 6, 209, 35, 13, 181, 6, 203, 185, 13, 181, 6, 66, 13, - 181, 6, 199, 215, 13, 181, 6, 197, 189, 13, 181, 6, 196, 216, 13, 181, 6, - 196, 143, 13, 181, 4, 63, 13, 181, 4, 249, 219, 13, 181, 4, 247, 69, 13, - 181, 4, 240, 98, 13, 181, 4, 70, 13, 181, 4, 235, 184, 13, 181, 4, 234, - 71, 13, 181, 4, 232, 154, 13, 181, 4, 68, 13, 181, 4, 225, 108, 13, 181, - 4, 224, 227, 13, 181, 4, 158, 13, 181, 4, 221, 40, 13, 181, 4, 217, 225, - 13, 181, 4, 74, 13, 181, 4, 213, 195, 13, 181, 4, 211, 116, 13, 181, 4, - 143, 13, 181, 4, 209, 35, 13, 181, 4, 203, 185, 13, 181, 4, 66, 13, 181, - 4, 199, 215, 13, 181, 4, 197, 189, 13, 181, 4, 196, 216, 13, 181, 4, 196, - 143, 13, 181, 4, 195, 157, 13, 190, 6, 63, 13, 190, 6, 249, 219, 13, 190, - 6, 240, 98, 13, 190, 6, 70, 13, 190, 6, 235, 184, 13, 190, 6, 234, 71, - 13, 190, 6, 68, 13, 190, 6, 225, 108, 13, 190, 6, 224, 227, 13, 190, 6, - 158, 13, 190, 6, 221, 40, 13, 190, 6, 74, 13, 190, 6, 209, 35, 13, 190, - 6, 203, 185, 13, 190, 6, 66, 13, 190, 6, 199, 215, 13, 190, 6, 197, 189, - 13, 190, 6, 196, 216, 13, 190, 6, 196, 143, 13, 190, 4, 63, 13, 190, 4, - 249, 219, 13, 190, 4, 247, 69, 13, 190, 4, 240, 98, 13, 190, 4, 70, 13, - 190, 4, 235, 184, 13, 190, 4, 234, 71, 13, 190, 4, 232, 154, 13, 190, 4, - 68, 13, 190, 4, 225, 108, 13, 190, 4, 224, 227, 13, 190, 4, 158, 13, 190, - 4, 221, 40, 13, 190, 4, 217, 225, 13, 190, 4, 74, 13, 190, 4, 213, 195, - 13, 190, 4, 211, 116, 13, 190, 4, 143, 13, 190, 4, 209, 35, 13, 190, 4, - 203, 185, 13, 190, 4, 66, 13, 190, 4, 199, 215, 13, 190, 4, 197, 189, 13, - 190, 4, 196, 216, 13, 190, 4, 196, 143, 13, 190, 4, 195, 157, 13, 27, - 181, 6, 63, 13, 27, 181, 6, 249, 219, 13, 27, 181, 6, 247, 69, 13, 27, - 181, 6, 240, 98, 13, 27, 181, 6, 70, 13, 27, 181, 6, 235, 184, 13, 27, - 181, 6, 234, 71, 13, 27, 181, 6, 232, 154, 13, 27, 181, 6, 68, 13, 27, - 181, 6, 225, 108, 13, 27, 181, 6, 224, 227, 13, 27, 181, 6, 158, 13, 27, - 181, 6, 221, 40, 13, 27, 181, 6, 217, 225, 13, 27, 181, 6, 74, 13, 27, - 181, 6, 213, 195, 13, 27, 181, 6, 211, 116, 13, 27, 181, 6, 143, 13, 27, - 181, 6, 209, 35, 13, 27, 181, 6, 203, 185, 13, 27, 181, 6, 66, 13, 27, - 181, 6, 199, 215, 13, 27, 181, 6, 197, 189, 13, 27, 181, 6, 196, 216, 13, - 27, 181, 6, 196, 143, 13, 27, 181, 6, 195, 157, 13, 27, 181, 4, 63, 13, - 27, 181, 4, 249, 219, 13, 27, 181, 4, 247, 69, 13, 27, 181, 4, 240, 98, - 13, 27, 181, 4, 70, 13, 27, 181, 4, 235, 184, 13, 27, 181, 4, 234, 71, - 13, 27, 181, 4, 232, 154, 13, 27, 181, 4, 68, 13, 27, 181, 4, 225, 108, - 13, 27, 181, 4, 224, 227, 13, 27, 181, 4, 158, 13, 27, 181, 4, 221, 40, - 13, 27, 181, 4, 217, 225, 13, 27, 181, 4, 74, 13, 27, 181, 4, 213, 195, - 13, 27, 181, 4, 211, 116, 13, 27, 181, 4, 143, 13, 27, 181, 4, 209, 35, - 13, 27, 181, 4, 203, 185, 13, 27, 181, 4, 66, 13, 27, 181, 4, 199, 215, - 13, 27, 181, 4, 197, 189, 13, 27, 181, 4, 196, 216, 13, 27, 181, 4, 196, - 143, 13, 27, 181, 4, 195, 157, 13, 44, 6, 63, 13, 44, 6, 249, 219, 13, - 44, 6, 247, 69, 13, 44, 6, 240, 98, 13, 44, 6, 70, 13, 44, 6, 235, 184, - 13, 44, 6, 234, 71, 13, 44, 6, 232, 154, 13, 44, 6, 68, 13, 44, 6, 225, - 108, 13, 44, 6, 224, 227, 13, 44, 6, 158, 13, 44, 6, 221, 40, 13, 44, 6, - 217, 225, 13, 44, 6, 74, 13, 44, 6, 213, 195, 13, 44, 6, 211, 116, 13, - 44, 6, 143, 13, 44, 6, 209, 35, 13, 44, 6, 203, 185, 13, 44, 6, 66, 13, - 44, 6, 199, 215, 13, 44, 6, 197, 189, 13, 44, 6, 196, 216, 13, 44, 6, - 196, 143, 13, 44, 6, 195, 157, 13, 44, 4, 63, 13, 44, 4, 249, 219, 13, - 44, 4, 247, 69, 13, 44, 4, 240, 98, 13, 44, 4, 70, 13, 44, 4, 235, 184, - 13, 44, 4, 234, 71, 13, 44, 4, 232, 154, 13, 44, 4, 68, 13, 44, 4, 225, - 108, 13, 44, 4, 224, 227, 13, 44, 4, 158, 13, 44, 4, 221, 40, 13, 44, 4, - 217, 225, 13, 44, 4, 74, 13, 44, 4, 213, 195, 13, 44, 4, 211, 116, 13, - 44, 4, 143, 13, 44, 4, 209, 35, 13, 44, 4, 203, 185, 13, 44, 4, 66, 13, - 44, 4, 199, 215, 13, 44, 4, 197, 189, 13, 44, 4, 196, 216, 13, 44, 4, - 196, 143, 13, 44, 4, 195, 157, 13, 44, 27, 6, 63, 13, 44, 27, 6, 249, - 219, 13, 44, 27, 6, 247, 69, 13, 44, 27, 6, 240, 98, 13, 44, 27, 6, 70, - 13, 44, 27, 6, 235, 184, 13, 44, 27, 6, 234, 71, 13, 44, 27, 6, 232, 154, - 13, 44, 27, 6, 68, 13, 44, 27, 6, 225, 108, 13, 44, 27, 6, 224, 227, 13, - 44, 27, 6, 158, 13, 44, 27, 6, 221, 40, 13, 44, 27, 6, 217, 225, 13, 44, - 27, 6, 74, 13, 44, 27, 6, 213, 195, 13, 44, 27, 6, 211, 116, 13, 44, 27, - 6, 143, 13, 44, 27, 6, 209, 35, 13, 44, 27, 6, 203, 185, 13, 44, 27, 6, - 66, 13, 44, 27, 6, 199, 215, 13, 44, 27, 6, 197, 189, 13, 44, 27, 6, 196, - 216, 13, 44, 27, 6, 196, 143, 13, 44, 27, 6, 195, 157, 13, 44, 27, 4, 63, - 13, 44, 27, 4, 249, 219, 13, 44, 27, 4, 247, 69, 13, 44, 27, 4, 240, 98, - 13, 44, 27, 4, 70, 13, 44, 27, 4, 235, 184, 13, 44, 27, 4, 234, 71, 13, - 44, 27, 4, 232, 154, 13, 44, 27, 4, 68, 13, 44, 27, 4, 225, 108, 13, 44, - 27, 4, 224, 227, 13, 44, 27, 4, 158, 13, 44, 27, 4, 221, 40, 13, 44, 27, - 4, 217, 225, 13, 44, 27, 4, 74, 13, 44, 27, 4, 213, 195, 13, 44, 27, 4, - 211, 116, 13, 44, 27, 4, 143, 13, 44, 27, 4, 209, 35, 13, 44, 27, 4, 203, - 185, 13, 44, 27, 4, 66, 13, 44, 27, 4, 199, 215, 13, 44, 27, 4, 197, 189, - 13, 44, 27, 4, 196, 216, 13, 44, 27, 4, 196, 143, 13, 44, 27, 4, 195, - 157, 13, 44, 41, 6, 63, 13, 44, 41, 6, 249, 219, 13, 44, 41, 6, 247, 69, - 13, 44, 41, 6, 240, 98, 13, 44, 41, 6, 70, 13, 44, 41, 6, 235, 184, 13, - 44, 41, 6, 234, 71, 13, 44, 41, 6, 232, 154, 13, 44, 41, 6, 68, 13, 44, - 41, 6, 225, 108, 13, 44, 41, 6, 224, 227, 13, 44, 41, 6, 158, 13, 44, 41, - 6, 221, 40, 13, 44, 41, 6, 217, 225, 13, 44, 41, 6, 74, 13, 44, 41, 6, - 213, 195, 13, 44, 41, 6, 211, 116, 13, 44, 41, 6, 143, 13, 44, 41, 6, - 209, 35, 13, 44, 41, 6, 203, 185, 13, 44, 41, 6, 66, 13, 44, 41, 6, 199, - 215, 13, 44, 41, 6, 197, 189, 13, 44, 41, 6, 196, 216, 13, 44, 41, 6, - 196, 143, 13, 44, 41, 6, 195, 157, 13, 44, 41, 4, 63, 13, 44, 41, 4, 249, - 219, 13, 44, 41, 4, 247, 69, 13, 44, 41, 4, 240, 98, 13, 44, 41, 4, 70, - 13, 44, 41, 4, 235, 184, 13, 44, 41, 4, 234, 71, 13, 44, 41, 4, 232, 154, - 13, 44, 41, 4, 68, 13, 44, 41, 4, 225, 108, 13, 44, 41, 4, 224, 227, 13, - 44, 41, 4, 158, 13, 44, 41, 4, 221, 40, 13, 44, 41, 4, 217, 225, 13, 44, - 41, 4, 74, 13, 44, 41, 4, 213, 195, 13, 44, 41, 4, 211, 116, 13, 44, 41, - 4, 143, 13, 44, 41, 4, 209, 35, 13, 44, 41, 4, 203, 185, 13, 44, 41, 4, - 66, 13, 44, 41, 4, 199, 215, 13, 44, 41, 4, 197, 189, 13, 44, 41, 4, 196, - 216, 13, 44, 41, 4, 196, 143, 13, 44, 41, 4, 195, 157, 13, 44, 27, 41, 6, - 63, 13, 44, 27, 41, 6, 249, 219, 13, 44, 27, 41, 6, 247, 69, 13, 44, 27, - 41, 6, 240, 98, 13, 44, 27, 41, 6, 70, 13, 44, 27, 41, 6, 235, 184, 13, - 44, 27, 41, 6, 234, 71, 13, 44, 27, 41, 6, 232, 154, 13, 44, 27, 41, 6, - 68, 13, 44, 27, 41, 6, 225, 108, 13, 44, 27, 41, 6, 224, 227, 13, 44, 27, - 41, 6, 158, 13, 44, 27, 41, 6, 221, 40, 13, 44, 27, 41, 6, 217, 225, 13, - 44, 27, 41, 6, 74, 13, 44, 27, 41, 6, 213, 195, 13, 44, 27, 41, 6, 211, - 116, 13, 44, 27, 41, 6, 143, 13, 44, 27, 41, 6, 209, 35, 13, 44, 27, 41, - 6, 203, 185, 13, 44, 27, 41, 6, 66, 13, 44, 27, 41, 6, 199, 215, 13, 44, - 27, 41, 6, 197, 189, 13, 44, 27, 41, 6, 196, 216, 13, 44, 27, 41, 6, 196, - 143, 13, 44, 27, 41, 6, 195, 157, 13, 44, 27, 41, 4, 63, 13, 44, 27, 41, - 4, 249, 219, 13, 44, 27, 41, 4, 247, 69, 13, 44, 27, 41, 4, 240, 98, 13, - 44, 27, 41, 4, 70, 13, 44, 27, 41, 4, 235, 184, 13, 44, 27, 41, 4, 234, - 71, 13, 44, 27, 41, 4, 232, 154, 13, 44, 27, 41, 4, 68, 13, 44, 27, 41, - 4, 225, 108, 13, 44, 27, 41, 4, 224, 227, 13, 44, 27, 41, 4, 158, 13, 44, - 27, 41, 4, 221, 40, 13, 44, 27, 41, 4, 217, 225, 13, 44, 27, 41, 4, 74, - 13, 44, 27, 41, 4, 213, 195, 13, 44, 27, 41, 4, 211, 116, 13, 44, 27, 41, - 4, 143, 13, 44, 27, 41, 4, 209, 35, 13, 44, 27, 41, 4, 203, 185, 13, 44, - 27, 41, 4, 66, 13, 44, 27, 41, 4, 199, 215, 13, 44, 27, 41, 4, 197, 189, - 13, 44, 27, 41, 4, 196, 216, 13, 44, 27, 41, 4, 196, 143, 13, 44, 27, 41, - 4, 195, 157, 13, 218, 110, 6, 63, 13, 218, 110, 6, 249, 219, 13, 218, - 110, 6, 247, 69, 13, 218, 110, 6, 240, 98, 13, 218, 110, 6, 70, 13, 218, - 110, 6, 235, 184, 13, 218, 110, 6, 234, 71, 13, 218, 110, 6, 232, 154, - 13, 218, 110, 6, 68, 13, 218, 110, 6, 225, 108, 13, 218, 110, 6, 224, - 227, 13, 218, 110, 6, 158, 13, 218, 110, 6, 221, 40, 13, 218, 110, 6, - 217, 225, 13, 218, 110, 6, 74, 13, 218, 110, 6, 213, 195, 13, 218, 110, - 6, 211, 116, 13, 218, 110, 6, 143, 13, 218, 110, 6, 209, 35, 13, 218, - 110, 6, 203, 185, 13, 218, 110, 6, 66, 13, 218, 110, 6, 199, 215, 13, - 218, 110, 6, 197, 189, 13, 218, 110, 6, 196, 216, 13, 218, 110, 6, 196, - 143, 13, 218, 110, 6, 195, 157, 13, 218, 110, 4, 63, 13, 218, 110, 4, - 249, 219, 13, 218, 110, 4, 247, 69, 13, 218, 110, 4, 240, 98, 13, 218, - 110, 4, 70, 13, 218, 110, 4, 235, 184, 13, 218, 110, 4, 234, 71, 13, 218, - 110, 4, 232, 154, 13, 218, 110, 4, 68, 13, 218, 110, 4, 225, 108, 13, - 218, 110, 4, 224, 227, 13, 218, 110, 4, 158, 13, 218, 110, 4, 221, 40, - 13, 218, 110, 4, 217, 225, 13, 218, 110, 4, 74, 13, 218, 110, 4, 213, - 195, 13, 218, 110, 4, 211, 116, 13, 218, 110, 4, 143, 13, 218, 110, 4, - 209, 35, 13, 218, 110, 4, 203, 185, 13, 218, 110, 4, 66, 13, 218, 110, 4, - 199, 215, 13, 218, 110, 4, 197, 189, 13, 218, 110, 4, 196, 216, 13, 218, - 110, 4, 196, 143, 13, 218, 110, 4, 195, 157, 13, 41, 4, 238, 122, 68, 13, - 41, 4, 238, 122, 225, 108, 13, 27, 6, 250, 236, 13, 27, 6, 248, 61, 13, - 27, 6, 233, 231, 13, 27, 6, 239, 80, 13, 27, 6, 236, 51, 13, 27, 6, 195, - 78, 13, 27, 6, 236, 5, 13, 27, 6, 202, 168, 13, 27, 6, 225, 154, 13, 27, - 6, 224, 150, 13, 27, 6, 222, 146, 13, 27, 6, 218, 56, 13, 27, 6, 215, - 111, 13, 27, 6, 196, 190, 13, 27, 6, 214, 51, 13, 27, 6, 212, 163, 13, - 27, 6, 210, 25, 13, 27, 6, 202, 169, 102, 13, 27, 6, 206, 43, 13, 27, 6, - 203, 57, 13, 27, 6, 200, 12, 13, 27, 6, 212, 189, 13, 27, 6, 244, 195, - 13, 27, 6, 211, 186, 13, 27, 6, 214, 53, 13, 27, 217, 153, 13, 27, 4, - 250, 236, 13, 27, 4, 248, 61, 13, 27, 4, 233, 231, 13, 27, 4, 239, 80, - 13, 27, 4, 236, 51, 13, 27, 4, 195, 78, 13, 27, 4, 236, 5, 13, 27, 4, - 202, 168, 13, 27, 4, 225, 154, 13, 27, 4, 224, 150, 13, 27, 4, 222, 146, - 13, 27, 4, 218, 56, 13, 27, 4, 215, 111, 13, 27, 4, 196, 190, 13, 27, 4, - 214, 51, 13, 27, 4, 212, 163, 13, 27, 4, 210, 25, 13, 27, 4, 48, 206, 43, - 13, 27, 4, 206, 43, 13, 27, 4, 203, 57, 13, 27, 4, 200, 12, 13, 27, 4, - 212, 189, 13, 27, 4, 244, 195, 13, 27, 4, 211, 186, 13, 27, 4, 214, 53, - 13, 27, 213, 72, 238, 248, 13, 27, 236, 52, 102, 13, 27, 202, 169, 102, - 13, 27, 224, 151, 102, 13, 27, 212, 190, 102, 13, 27, 210, 26, 102, 13, - 27, 212, 164, 102, 13, 41, 6, 250, 236, 13, 41, 6, 248, 61, 13, 41, 6, - 233, 231, 13, 41, 6, 239, 80, 13, 41, 6, 236, 51, 13, 41, 6, 195, 78, 13, - 41, 6, 236, 5, 13, 41, 6, 202, 168, 13, 41, 6, 225, 154, 13, 41, 6, 224, - 150, 13, 41, 6, 222, 146, 13, 41, 6, 218, 56, 13, 41, 6, 215, 111, 13, - 41, 6, 196, 190, 13, 41, 6, 214, 51, 13, 41, 6, 212, 163, 13, 41, 6, 210, - 25, 13, 41, 6, 202, 169, 102, 13, 41, 6, 206, 43, 13, 41, 6, 203, 57, 13, - 41, 6, 200, 12, 13, 41, 6, 212, 189, 13, 41, 6, 244, 195, 13, 41, 6, 211, - 186, 13, 41, 6, 214, 53, 13, 41, 217, 153, 13, 41, 4, 250, 236, 13, 41, - 4, 248, 61, 13, 41, 4, 233, 231, 13, 41, 4, 239, 80, 13, 41, 4, 236, 51, - 13, 41, 4, 195, 78, 13, 41, 4, 236, 5, 13, 41, 4, 202, 168, 13, 41, 4, - 225, 154, 13, 41, 4, 224, 150, 13, 41, 4, 222, 146, 13, 41, 4, 218, 56, - 13, 41, 4, 215, 111, 13, 41, 4, 196, 190, 13, 41, 4, 214, 51, 13, 41, 4, - 212, 163, 13, 41, 4, 210, 25, 13, 41, 4, 48, 206, 43, 13, 41, 4, 206, 43, - 13, 41, 4, 203, 57, 13, 41, 4, 200, 12, 13, 41, 4, 212, 189, 13, 41, 4, - 244, 195, 13, 41, 4, 211, 186, 13, 41, 4, 214, 53, 13, 41, 213, 72, 238, - 248, 13, 41, 236, 52, 102, 13, 41, 202, 169, 102, 13, 41, 224, 151, 102, - 13, 41, 212, 190, 102, 13, 41, 210, 26, 102, 13, 41, 212, 164, 102, 13, - 27, 41, 6, 250, 236, 13, 27, 41, 6, 248, 61, 13, 27, 41, 6, 233, 231, 13, - 27, 41, 6, 239, 80, 13, 27, 41, 6, 236, 51, 13, 27, 41, 6, 195, 78, 13, - 27, 41, 6, 236, 5, 13, 27, 41, 6, 202, 168, 13, 27, 41, 6, 225, 154, 13, - 27, 41, 6, 224, 150, 13, 27, 41, 6, 222, 146, 13, 27, 41, 6, 218, 56, 13, - 27, 41, 6, 215, 111, 13, 27, 41, 6, 196, 190, 13, 27, 41, 6, 214, 51, 13, - 27, 41, 6, 212, 163, 13, 27, 41, 6, 210, 25, 13, 27, 41, 6, 202, 169, - 102, 13, 27, 41, 6, 206, 43, 13, 27, 41, 6, 203, 57, 13, 27, 41, 6, 200, - 12, 13, 27, 41, 6, 212, 189, 13, 27, 41, 6, 244, 195, 13, 27, 41, 6, 211, - 186, 13, 27, 41, 6, 214, 53, 13, 27, 41, 217, 153, 13, 27, 41, 4, 250, - 236, 13, 27, 41, 4, 248, 61, 13, 27, 41, 4, 233, 231, 13, 27, 41, 4, 239, - 80, 13, 27, 41, 4, 236, 51, 13, 27, 41, 4, 195, 78, 13, 27, 41, 4, 236, - 5, 13, 27, 41, 4, 202, 168, 13, 27, 41, 4, 225, 154, 13, 27, 41, 4, 224, - 150, 13, 27, 41, 4, 222, 146, 13, 27, 41, 4, 218, 56, 13, 27, 41, 4, 215, - 111, 13, 27, 41, 4, 196, 190, 13, 27, 41, 4, 214, 51, 13, 27, 41, 4, 212, - 163, 13, 27, 41, 4, 210, 25, 13, 27, 41, 4, 48, 206, 43, 13, 27, 41, 4, - 206, 43, 13, 27, 41, 4, 203, 57, 13, 27, 41, 4, 200, 12, 13, 27, 41, 4, - 212, 189, 13, 27, 41, 4, 244, 195, 13, 27, 41, 4, 211, 186, 13, 27, 41, - 4, 214, 53, 13, 27, 41, 213, 72, 238, 248, 13, 27, 41, 236, 52, 102, 13, - 27, 41, 202, 169, 102, 13, 27, 41, 224, 151, 102, 13, 27, 41, 212, 190, - 102, 13, 27, 41, 210, 26, 102, 13, 27, 41, 212, 164, 102, 13, 44, 27, 6, - 250, 236, 13, 44, 27, 6, 248, 61, 13, 44, 27, 6, 233, 231, 13, 44, 27, 6, - 239, 80, 13, 44, 27, 6, 236, 51, 13, 44, 27, 6, 195, 78, 13, 44, 27, 6, - 236, 5, 13, 44, 27, 6, 202, 168, 13, 44, 27, 6, 225, 154, 13, 44, 27, 6, - 224, 150, 13, 44, 27, 6, 222, 146, 13, 44, 27, 6, 218, 56, 13, 44, 27, 6, - 215, 111, 13, 44, 27, 6, 196, 190, 13, 44, 27, 6, 214, 51, 13, 44, 27, 6, - 212, 163, 13, 44, 27, 6, 210, 25, 13, 44, 27, 6, 202, 169, 102, 13, 44, - 27, 6, 206, 43, 13, 44, 27, 6, 203, 57, 13, 44, 27, 6, 200, 12, 13, 44, - 27, 6, 212, 189, 13, 44, 27, 6, 244, 195, 13, 44, 27, 6, 211, 186, 13, - 44, 27, 6, 214, 53, 13, 44, 27, 217, 153, 13, 44, 27, 4, 250, 236, 13, - 44, 27, 4, 248, 61, 13, 44, 27, 4, 233, 231, 13, 44, 27, 4, 239, 80, 13, - 44, 27, 4, 236, 51, 13, 44, 27, 4, 195, 78, 13, 44, 27, 4, 236, 5, 13, - 44, 27, 4, 202, 168, 13, 44, 27, 4, 225, 154, 13, 44, 27, 4, 224, 150, - 13, 44, 27, 4, 222, 146, 13, 44, 27, 4, 218, 56, 13, 44, 27, 4, 215, 111, - 13, 44, 27, 4, 196, 190, 13, 44, 27, 4, 214, 51, 13, 44, 27, 4, 212, 163, - 13, 44, 27, 4, 210, 25, 13, 44, 27, 4, 48, 206, 43, 13, 44, 27, 4, 206, - 43, 13, 44, 27, 4, 203, 57, 13, 44, 27, 4, 200, 12, 13, 44, 27, 4, 212, - 189, 13, 44, 27, 4, 244, 195, 13, 44, 27, 4, 211, 186, 13, 44, 27, 4, - 214, 53, 13, 44, 27, 213, 72, 238, 248, 13, 44, 27, 236, 52, 102, 13, 44, - 27, 202, 169, 102, 13, 44, 27, 224, 151, 102, 13, 44, 27, 212, 190, 102, - 13, 44, 27, 210, 26, 102, 13, 44, 27, 212, 164, 102, 13, 44, 27, 41, 6, - 250, 236, 13, 44, 27, 41, 6, 248, 61, 13, 44, 27, 41, 6, 233, 231, 13, - 44, 27, 41, 6, 239, 80, 13, 44, 27, 41, 6, 236, 51, 13, 44, 27, 41, 6, - 195, 78, 13, 44, 27, 41, 6, 236, 5, 13, 44, 27, 41, 6, 202, 168, 13, 44, - 27, 41, 6, 225, 154, 13, 44, 27, 41, 6, 224, 150, 13, 44, 27, 41, 6, 222, - 146, 13, 44, 27, 41, 6, 218, 56, 13, 44, 27, 41, 6, 215, 111, 13, 44, 27, - 41, 6, 196, 190, 13, 44, 27, 41, 6, 214, 51, 13, 44, 27, 41, 6, 212, 163, - 13, 44, 27, 41, 6, 210, 25, 13, 44, 27, 41, 6, 202, 169, 102, 13, 44, 27, - 41, 6, 206, 43, 13, 44, 27, 41, 6, 203, 57, 13, 44, 27, 41, 6, 200, 12, - 13, 44, 27, 41, 6, 212, 189, 13, 44, 27, 41, 6, 244, 195, 13, 44, 27, 41, - 6, 211, 186, 13, 44, 27, 41, 6, 214, 53, 13, 44, 27, 41, 217, 153, 13, - 44, 27, 41, 4, 250, 236, 13, 44, 27, 41, 4, 248, 61, 13, 44, 27, 41, 4, - 233, 231, 13, 44, 27, 41, 4, 239, 80, 13, 44, 27, 41, 4, 236, 51, 13, 44, - 27, 41, 4, 195, 78, 13, 44, 27, 41, 4, 236, 5, 13, 44, 27, 41, 4, 202, - 168, 13, 44, 27, 41, 4, 225, 154, 13, 44, 27, 41, 4, 224, 150, 13, 44, - 27, 41, 4, 222, 146, 13, 44, 27, 41, 4, 218, 56, 13, 44, 27, 41, 4, 215, - 111, 13, 44, 27, 41, 4, 196, 190, 13, 44, 27, 41, 4, 214, 51, 13, 44, 27, - 41, 4, 212, 163, 13, 44, 27, 41, 4, 210, 25, 13, 44, 27, 41, 4, 48, 206, - 43, 13, 44, 27, 41, 4, 206, 43, 13, 44, 27, 41, 4, 203, 57, 13, 44, 27, - 41, 4, 200, 12, 13, 44, 27, 41, 4, 212, 189, 13, 44, 27, 41, 4, 244, 195, - 13, 44, 27, 41, 4, 211, 186, 13, 44, 27, 41, 4, 214, 53, 13, 44, 27, 41, - 213, 72, 238, 248, 13, 44, 27, 41, 236, 52, 102, 13, 44, 27, 41, 202, - 169, 102, 13, 44, 27, 41, 224, 151, 102, 13, 44, 27, 41, 212, 190, 102, - 13, 44, 27, 41, 210, 26, 102, 13, 44, 27, 41, 212, 164, 102, 13, 27, 6, - 238, 242, 13, 27, 4, 238, 242, 13, 27, 17, 195, 79, 13, 27, 17, 98, 13, - 27, 17, 103, 13, 27, 17, 135, 13, 27, 17, 136, 13, 27, 17, 150, 13, 27, - 17, 174, 13, 27, 17, 182, 13, 27, 17, 178, 13, 27, 17, 184, 13, 190, 17, - 195, 79, 13, 190, 17, 98, 13, 190, 17, 103, 13, 190, 17, 135, 13, 190, - 17, 136, 13, 190, 17, 150, 13, 190, 17, 174, 13, 190, 17, 182, 13, 190, - 17, 178, 13, 190, 17, 184, 13, 44, 17, 195, 79, 13, 44, 17, 98, 13, 44, - 17, 103, 13, 44, 17, 135, 13, 44, 17, 136, 13, 44, 17, 150, 13, 44, 17, - 174, 13, 44, 17, 182, 13, 44, 17, 178, 13, 44, 17, 184, 13, 44, 27, 17, - 195, 79, 13, 44, 27, 17, 98, 13, 44, 27, 17, 103, 13, 44, 27, 17, 135, - 13, 44, 27, 17, 136, 13, 44, 27, 17, 150, 13, 44, 27, 17, 174, 13, 44, - 27, 17, 182, 13, 44, 27, 17, 178, 13, 44, 27, 17, 184, 13, 218, 110, 17, - 195, 79, 13, 218, 110, 17, 98, 13, 218, 110, 17, 103, 13, 218, 110, 17, - 135, 13, 218, 110, 17, 136, 13, 218, 110, 17, 150, 13, 218, 110, 17, 174, - 13, 218, 110, 17, 182, 13, 218, 110, 17, 178, 13, 218, 110, 17, 184, 23, - 138, 225, 216, 23, 232, 91, 225, 216, 23, 232, 87, 225, 216, 23, 232, 76, - 225, 216, 23, 232, 80, 225, 216, 23, 232, 93, 225, 216, 23, 138, 131, - 248, 72, 23, 232, 91, 131, 248, 72, 23, 138, 160, 200, 47, 131, 248, 72, - 23, 138, 131, 210, 164, 223, 168, 23, 138, 131, 240, 146, 23, 138, 131, - 231, 181, 23, 138, 131, 231, 182, 221, 112, 23, 232, 91, 131, 231, 183, - 23, 138, 131, 218, 228, 23, 232, 91, 131, 218, 228, 23, 138, 131, 108, - 248, 72, 23, 138, 131, 108, 210, 164, 223, 167, 23, 138, 131, 108, 231, - 181, 23, 138, 131, 120, 108, 231, 181, 23, 138, 131, 231, 182, 108, 200, - 20, 23, 138, 131, 108, 241, 8, 23, 138, 131, 108, 241, 9, 131, 248, 72, - 23, 138, 131, 108, 241, 9, 108, 248, 72, 23, 138, 131, 108, 241, 9, 240, - 146, 23, 138, 131, 108, 241, 9, 231, 181, 23, 138, 131, 108, 240, 179, - 23, 232, 91, 131, 108, 240, 179, 23, 138, 108, 248, 73, 126, 225, 216, - 23, 138, 131, 248, 73, 126, 218, 228, 23, 138, 131, 108, 202, 113, 23, - 232, 91, 131, 108, 202, 113, 23, 138, 131, 108, 204, 185, 160, 248, 72, - 23, 138, 131, 108, 248, 73, 160, 204, 184, 23, 138, 131, 108, 160, 248, - 72, 23, 138, 131, 108, 231, 182, 205, 66, 160, 206, 54, 23, 138, 131, - 120, 108, 231, 182, 160, 206, 54, 23, 138, 131, 120, 108, 231, 182, 160, - 241, 8, 23, 138, 131, 231, 182, 108, 120, 160, 206, 54, 23, 138, 131, - 108, 120, 205, 66, 160, 234, 149, 23, 138, 131, 108, 160, 240, 146, 23, - 138, 131, 108, 160, 244, 112, 23, 138, 131, 108, 160, 231, 51, 23, 138, - 131, 108, 160, 231, 181, 23, 138, 160, 248, 59, 131, 108, 204, 184, 23, - 138, 131, 108, 241, 9, 160, 206, 54, 23, 138, 131, 108, 241, 9, 160, 206, - 55, 241, 8, 23, 138, 131, 108, 241, 9, 160, 206, 55, 248, 72, 23, 138, - 108, 160, 231, 52, 131, 200, 20, 23, 138, 131, 160, 231, 52, 108, 200, - 20, 23, 138, 131, 108, 241, 9, 231, 182, 160, 206, 54, 23, 138, 131, 108, - 240, 180, 160, 206, 54, 23, 138, 131, 108, 241, 9, 160, 234, 149, 23, - 138, 131, 108, 241, 9, 240, 147, 160, 234, 149, 23, 138, 108, 160, 240, - 147, 131, 200, 20, 23, 138, 131, 160, 240, 147, 108, 200, 20, 23, 138, - 108, 160, 45, 131, 200, 20, 23, 138, 108, 160, 45, 131, 231, 181, 23, - 138, 131, 160, 250, 191, 213, 225, 108, 200, 20, 23, 138, 131, 160, 250, - 191, 225, 231, 108, 200, 20, 23, 138, 131, 160, 45, 108, 200, 20, 23, - 138, 131, 108, 160, 241, 9, 231, 181, 23, 138, 131, 108, 160, 250, 191, - 213, 224, 23, 138, 131, 108, 160, 250, 190, 23, 138, 108, 160, 250, 191, - 213, 225, 131, 200, 20, 23, 138, 108, 160, 250, 191, 213, 225, 131, 240, - 179, 23, 138, 108, 160, 250, 191, 131, 200, 20, 23, 138, 131, 160, 231, - 52, 108, 231, 181, 23, 232, 82, 234, 145, 235, 2, 23, 232, 82, 234, 145, - 235, 3, 248, 72, 23, 232, 82, 234, 145, 235, 3, 231, 181, 23, 232, 82, - 234, 145, 235, 3, 241, 8, 23, 232, 82, 234, 145, 235, 3, 241, 9, 205, 75, - 23, 232, 89, 234, 145, 235, 3, 241, 8, 23, 138, 234, 145, 235, 3, 241, 9, - 248, 72, 23, 232, 80, 234, 145, 235, 3, 241, 8, 23, 232, 82, 234, 237, - 235, 3, 205, 65, 23, 232, 82, 232, 2, 234, 237, 235, 3, 205, 65, 23, 232, - 82, 234, 237, 235, 3, 205, 66, 234, 145, 248, 72, 23, 232, 82, 232, 2, - 234, 237, 235, 3, 205, 66, 234, 145, 248, 72, 23, 232, 82, 234, 237, 235, - 3, 205, 66, 248, 72, 23, 232, 82, 232, 2, 234, 237, 235, 3, 205, 66, 248, - 72, 23, 232, 82, 234, 237, 235, 3, 205, 66, 160, 234, 149, 23, 232, 87, - 234, 237, 235, 3, 205, 65, 23, 232, 87, 234, 237, 235, 3, 205, 66, 214, - 23, 23, 232, 80, 234, 237, 235, 3, 205, 66, 214, 23, 23, 232, 76, 234, - 237, 235, 3, 205, 65, 23, 232, 82, 234, 237, 235, 3, 205, 66, 231, 181, - 23, 232, 82, 234, 237, 235, 3, 205, 66, 231, 182, 160, 206, 54, 23, 232, - 82, 234, 237, 235, 3, 205, 66, 231, 182, 215, 226, 202, 113, 23, 232, 81, - 23, 232, 82, 248, 59, 213, 145, 235, 104, 23, 232, 82, 232, 1, 23, 232, - 82, 160, 206, 54, 23, 232, 82, 232, 2, 160, 206, 54, 23, 232, 82, 160, - 248, 72, 23, 232, 82, 160, 234, 149, 23, 232, 82, 205, 76, 131, 160, 206, - 54, 23, 232, 82, 205, 76, 246, 155, 23, 232, 82, 205, 76, 246, 156, 160, - 206, 54, 23, 232, 82, 205, 76, 246, 156, 160, 206, 55, 248, 72, 23, 232, - 82, 205, 76, 221, 204, 23, 232, 88, 23, 232, 89, 160, 206, 54, 23, 232, - 89, 215, 226, 202, 113, 23, 232, 89, 160, 234, 149, 23, 232, 78, 240, - 143, 23, 232, 77, 23, 232, 87, 214, 23, 23, 232, 86, 23, 232, 87, 185, - 160, 206, 54, 23, 232, 87, 160, 206, 54, 23, 232, 87, 185, 215, 226, 202, - 113, 23, 232, 87, 215, 226, 202, 113, 23, 232, 87, 185, 160, 234, 149, - 23, 232, 87, 160, 234, 149, 23, 232, 85, 214, 23, 23, 232, 84, 23, 232, - 90, 23, 232, 75, 23, 232, 76, 160, 206, 54, 23, 232, 76, 215, 226, 202, - 113, 23, 232, 76, 160, 234, 149, 23, 232, 80, 214, 23, 23, 232, 80, 185, - 160, 234, 149, 23, 232, 79, 23, 232, 80, 205, 186, 23, 232, 80, 185, 160, - 206, 54, 23, 232, 80, 160, 206, 54, 23, 232, 80, 185, 215, 226, 202, 113, - 23, 232, 80, 215, 226, 202, 113, 23, 232, 80, 160, 206, 55, 201, 204, - 225, 216, 23, 232, 80, 160, 248, 59, 108, 209, 210, 23, 232, 92, 23, 138, - 131, 108, 209, 210, 23, 232, 91, 131, 108, 209, 210, 23, 232, 80, 131, - 108, 209, 210, 23, 232, 93, 131, 108, 209, 210, 23, 232, 80, 221, 204, - 23, 138, 131, 108, 209, 211, 248, 72, 23, 138, 131, 108, 209, 211, 241, - 8, 23, 232, 80, 131, 108, 209, 211, 241, 8, 23, 138, 221, 205, 237, 106, - 23, 138, 221, 205, 133, 209, 206, 204, 184, 23, 138, 221, 205, 133, 209, - 206, 240, 132, 23, 138, 221, 205, 133, 213, 233, 244, 112, 23, 138, 221, - 205, 200, 20, 23, 138, 160, 200, 47, 221, 205, 200, 20, 23, 232, 91, 221, - 205, 200, 20, 23, 232, 76, 221, 205, 200, 20, 23, 232, 93, 221, 205, 200, - 20, 23, 138, 221, 205, 210, 164, 223, 168, 23, 138, 221, 205, 248, 72, - 23, 138, 221, 205, 201, 205, 202, 113, 23, 138, 221, 205, 202, 113, 23, - 232, 80, 221, 205, 202, 113, 23, 138, 221, 205, 131, 202, 113, 23, 232, - 80, 221, 205, 131, 202, 113, 23, 232, 93, 221, 205, 131, 160, 131, 160, - 213, 224, 23, 232, 93, 221, 205, 131, 160, 131, 202, 113, 23, 138, 221, - 205, 225, 216, 23, 232, 91, 221, 205, 225, 216, 23, 232, 80, 221, 205, - 225, 216, 23, 232, 93, 221, 205, 225, 216, 23, 138, 131, 108, 221, 204, - 23, 232, 91, 131, 108, 221, 204, 23, 232, 80, 131, 108, 221, 204, 23, - 232, 80, 209, 210, 23, 232, 93, 131, 108, 221, 204, 23, 138, 131, 108, - 240, 183, 221, 204, 23, 232, 91, 131, 108, 240, 183, 221, 204, 23, 138, - 209, 211, 237, 106, 23, 232, 80, 209, 211, 133, 131, 160, 231, 53, 218, - 228, 23, 232, 93, 209, 211, 133, 108, 160, 131, 240, 182, 23, 138, 209, - 211, 200, 20, 23, 138, 209, 211, 210, 164, 223, 168, 23, 138, 209, 211, - 221, 204, 23, 232, 91, 209, 211, 221, 204, 23, 232, 76, 209, 211, 221, - 204, 23, 232, 93, 209, 211, 221, 204, 23, 138, 209, 211, 218, 228, 23, - 138, 209, 211, 108, 241, 8, 23, 138, 209, 211, 108, 210, 164, 223, 167, - 23, 138, 209, 211, 225, 216, 23, 138, 209, 211, 202, 113, 23, 232, 78, - 209, 211, 202, 113, 23, 138, 131, 209, 211, 221, 204, 23, 232, 91, 131, - 209, 211, 221, 204, 23, 232, 85, 131, 209, 211, 221, 205, 214, 48, 23, - 232, 78, 131, 209, 211, 221, 205, 213, 224, 23, 232, 78, 131, 209, 211, - 221, 205, 225, 230, 23, 232, 78, 131, 209, 211, 221, 205, 200, 46, 23, - 232, 87, 131, 209, 211, 221, 204, 23, 232, 80, 131, 209, 211, 221, 204, - 23, 232, 93, 131, 209, 211, 221, 205, 213, 224, 23, 232, 93, 131, 209, - 211, 221, 204, 23, 138, 108, 237, 106, 23, 232, 80, 218, 228, 23, 138, - 108, 200, 20, 23, 232, 91, 108, 200, 20, 23, 138, 108, 210, 164, 223, - 168, 23, 138, 108, 120, 160, 206, 54, 23, 232, 78, 108, 202, 113, 23, - 138, 108, 160, 221, 204, 23, 138, 108, 221, 204, 23, 138, 108, 209, 211, - 221, 204, 23, 232, 91, 108, 209, 211, 221, 204, 23, 232, 85, 108, 209, - 211, 221, 205, 214, 48, 23, 232, 87, 108, 209, 211, 221, 204, 23, 232, - 80, 108, 209, 211, 221, 204, 23, 232, 93, 108, 209, 211, 221, 205, 213, - 224, 23, 232, 93, 108, 209, 211, 221, 205, 225, 230, 23, 232, 93, 108, - 209, 211, 221, 204, 23, 232, 91, 108, 209, 211, 221, 205, 248, 72, 23, - 232, 89, 108, 209, 211, 221, 205, 241, 8, 23, 232, 89, 108, 209, 211, - 221, 205, 241, 9, 206, 54, 23, 232, 78, 108, 209, 211, 221, 205, 241, 9, - 213, 224, 23, 232, 78, 108, 209, 211, 221, 205, 241, 9, 225, 230, 23, - 232, 78, 108, 209, 211, 221, 205, 241, 8, 23, 232, 80, 131, 231, 181, 23, - 138, 131, 160, 206, 54, 23, 232, 80, 131, 160, 206, 54, 23, 138, 131, - 160, 206, 55, 160, 239, 14, 23, 138, 131, 160, 206, 55, 160, 241, 8, 23, - 138, 131, 160, 206, 55, 160, 248, 72, 23, 138, 131, 160, 206, 55, 131, - 248, 72, 23, 138, 131, 160, 206, 55, 247, 202, 248, 72, 23, 138, 131, - 160, 206, 55, 131, 231, 183, 23, 138, 131, 160, 234, 150, 131, 204, 184, - 23, 138, 131, 160, 234, 150, 131, 248, 72, 23, 138, 131, 160, 124, 23, - 138, 131, 160, 240, 143, 23, 138, 131, 160, 240, 135, 160, 225, 186, 23, - 232, 89, 131, 160, 240, 135, 160, 225, 186, 23, 138, 131, 160, 240, 135, - 160, 200, 46, 23, 138, 131, 160, 244, 113, 23, 232, 87, 131, 202, 113, - 23, 232, 87, 131, 160, 214, 23, 23, 232, 80, 131, 160, 214, 23, 23, 232, - 80, 131, 160, 222, 129, 23, 232, 80, 131, 202, 113, 23, 232, 80, 131, - 160, 205, 186, 23, 232, 93, 131, 160, 213, 224, 23, 232, 93, 131, 160, - 225, 230, 23, 232, 93, 131, 202, 113, 23, 138, 202, 113, 23, 138, 160, - 232, 1, 23, 138, 160, 206, 55, 239, 14, 23, 138, 160, 206, 55, 241, 8, - 23, 138, 160, 206, 55, 248, 72, 23, 138, 160, 234, 149, 23, 138, 160, - 248, 59, 131, 218, 228, 23, 138, 160, 248, 59, 108, 209, 210, 23, 138, - 160, 248, 59, 209, 211, 221, 204, 23, 138, 160, 200, 47, 114, 235, 2, 23, - 138, 160, 126, 114, 235, 2, 23, 138, 160, 200, 47, 122, 235, 2, 23, 138, - 160, 200, 47, 234, 145, 235, 2, 23, 138, 160, 126, 234, 145, 210, 164, - 223, 167, 23, 232, 83, 23, 138, 232, 1, 23, 201, 206, 206, 18, 23, 201, - 206, 218, 31, 23, 201, 206, 248, 58, 23, 232, 243, 206, 18, 23, 232, 243, - 218, 31, 23, 232, 243, 248, 58, 23, 204, 168, 206, 18, 23, 204, 168, 218, - 31, 23, 204, 168, 248, 58, 23, 247, 146, 206, 18, 23, 247, 146, 218, 31, - 23, 247, 146, 248, 58, 23, 209, 87, 206, 18, 23, 209, 87, 218, 31, 23, - 209, 87, 248, 58, 23, 204, 51, 203, 218, 23, 204, 51, 248, 58, 23, 205, - 53, 222, 130, 206, 18, 23, 205, 53, 4, 206, 18, 23, 205, 53, 222, 130, - 218, 31, 23, 205, 53, 4, 218, 31, 23, 205, 53, 207, 42, 23, 234, 210, - 222, 130, 206, 18, 23, 234, 210, 4, 206, 18, 23, 234, 210, 222, 130, 218, - 31, 23, 234, 210, 4, 218, 31, 23, 234, 210, 207, 42, 23, 205, 53, 234, - 210, 250, 230, 23, 218, 67, 120, 133, 222, 129, 23, 218, 67, 120, 133, - 205, 186, 23, 218, 67, 120, 207, 42, 23, 218, 67, 133, 207, 42, 23, 218, - 67, 120, 133, 250, 231, 222, 129, 23, 218, 67, 120, 133, 250, 231, 205, - 186, 23, 218, 67, 206, 55, 202, 2, 206, 55, 208, 117, 23, 218, 66, 235, - 8, 240, 254, 23, 218, 68, 235, 8, 240, 254, 23, 218, 66, 206, 19, 204, - 185, 205, 186, 23, 218, 66, 206, 19, 204, 185, 219, 98, 23, 218, 66, 206, - 19, 204, 185, 222, 129, 23, 218, 66, 206, 19, 204, 185, 222, 127, 23, - 218, 66, 206, 19, 196, 241, 234, 213, 23, 218, 66, 54, 204, 184, 23, 218, - 66, 54, 196, 241, 234, 213, 23, 218, 66, 54, 250, 230, 23, 218, 66, 54, - 250, 231, 196, 241, 234, 213, 23, 218, 66, 240, 182, 23, 218, 66, 201, - 145, 204, 185, 218, 70, 23, 218, 66, 201, 145, 196, 241, 234, 213, 23, - 218, 66, 201, 145, 250, 230, 23, 218, 66, 201, 145, 250, 231, 196, 241, - 234, 213, 23, 218, 66, 248, 76, 205, 186, 23, 218, 66, 248, 76, 219, 98, - 23, 218, 66, 248, 76, 222, 129, 23, 218, 66, 240, 222, 205, 186, 23, 218, - 66, 240, 222, 219, 98, 23, 218, 66, 240, 222, 222, 129, 23, 218, 66, 240, - 222, 209, 146, 23, 218, 66, 244, 222, 205, 186, 23, 218, 66, 244, 222, - 219, 98, 23, 218, 66, 244, 222, 222, 129, 23, 218, 66, 107, 205, 186, 23, - 218, 66, 107, 219, 98, 23, 218, 66, 107, 222, 129, 23, 218, 66, 195, 24, - 205, 186, 23, 218, 66, 195, 24, 219, 98, 23, 218, 66, 195, 24, 222, 129, - 23, 218, 66, 213, 30, 205, 186, 23, 218, 66, 213, 30, 219, 98, 23, 218, - 66, 213, 30, 222, 129, 23, 201, 175, 209, 144, 206, 18, 23, 201, 175, - 209, 144, 237, 115, 23, 201, 175, 209, 144, 250, 230, 23, 201, 175, 209, - 145, 206, 18, 23, 201, 175, 209, 145, 237, 115, 23, 201, 175, 209, 145, - 250, 230, 23, 201, 175, 206, 242, 23, 201, 175, 250, 80, 205, 84, 206, - 18, 23, 201, 175, 250, 80, 205, 84, 237, 115, 23, 201, 175, 250, 80, 205, - 84, 201, 144, 23, 218, 69, 249, 233, 205, 186, 23, 218, 69, 249, 233, - 219, 98, 23, 218, 69, 249, 233, 222, 129, 23, 218, 69, 249, 233, 222, - 127, 23, 218, 69, 201, 200, 205, 186, 23, 218, 69, 201, 200, 219, 98, 23, - 218, 69, 201, 200, 222, 129, 23, 218, 69, 201, 200, 222, 127, 23, 218, - 69, 248, 59, 249, 233, 205, 186, 23, 218, 69, 248, 59, 249, 233, 219, 98, - 23, 218, 69, 248, 59, 249, 233, 222, 129, 23, 218, 69, 248, 59, 249, 233, - 222, 127, 23, 218, 69, 248, 59, 201, 200, 205, 186, 23, 218, 69, 248, 59, - 201, 200, 219, 98, 23, 218, 69, 248, 59, 201, 200, 222, 129, 23, 218, 69, - 248, 59, 201, 200, 222, 127, 23, 218, 68, 206, 19, 204, 185, 205, 186, - 23, 218, 68, 206, 19, 204, 185, 219, 98, 23, 218, 68, 206, 19, 204, 185, - 222, 129, 23, 218, 68, 206, 19, 204, 185, 222, 127, 23, 218, 68, 206, 19, - 196, 241, 234, 213, 23, 218, 68, 54, 204, 184, 23, 218, 68, 54, 196, 241, - 234, 213, 23, 218, 68, 54, 250, 230, 23, 218, 68, 54, 250, 231, 196, 241, - 234, 213, 23, 218, 68, 240, 182, 23, 218, 68, 201, 145, 204, 185, 218, - 70, 23, 218, 68, 201, 145, 196, 241, 234, 213, 23, 218, 68, 201, 145, - 250, 231, 218, 70, 23, 218, 68, 201, 145, 250, 231, 196, 241, 234, 213, - 23, 218, 68, 248, 75, 23, 218, 68, 240, 222, 205, 186, 23, 218, 68, 240, - 222, 219, 98, 23, 218, 68, 240, 222, 222, 129, 23, 218, 68, 244, 221, 23, - 218, 68, 107, 205, 186, 23, 218, 68, 107, 219, 98, 23, 218, 68, 107, 222, - 129, 23, 218, 68, 195, 24, 205, 186, 23, 218, 68, 195, 24, 219, 98, 23, - 218, 68, 195, 24, 222, 129, 23, 218, 68, 213, 30, 205, 186, 23, 218, 68, - 213, 30, 219, 98, 23, 218, 68, 213, 30, 222, 129, 23, 201, 176, 209, 145, - 206, 18, 23, 201, 176, 209, 145, 237, 115, 23, 201, 176, 209, 145, 250, - 230, 23, 201, 176, 209, 144, 206, 18, 23, 201, 176, 209, 144, 237, 115, - 23, 201, 176, 209, 144, 250, 230, 23, 201, 176, 206, 242, 23, 218, 66, - 240, 135, 211, 37, 205, 186, 23, 218, 66, 240, 135, 211, 37, 219, 98, 23, - 218, 66, 240, 135, 211, 37, 222, 129, 23, 218, 66, 240, 135, 211, 37, - 222, 127, 23, 218, 66, 240, 135, 232, 107, 205, 186, 23, 218, 66, 240, - 135, 232, 107, 219, 98, 23, 218, 66, 240, 135, 232, 107, 222, 129, 23, - 218, 66, 240, 135, 232, 107, 222, 127, 23, 218, 66, 240, 135, 202, 119, - 244, 114, 205, 186, 23, 218, 66, 240, 135, 202, 119, 244, 114, 219, 98, - 23, 218, 66, 230, 204, 205, 186, 23, 218, 66, 230, 204, 219, 98, 23, 218, - 66, 230, 204, 222, 129, 23, 218, 66, 221, 130, 205, 186, 23, 218, 66, - 221, 130, 219, 98, 23, 218, 66, 221, 130, 222, 129, 23, 218, 66, 221, - 130, 4, 237, 115, 23, 218, 66, 197, 115, 240, 135, 54, 205, 186, 23, 218, - 66, 197, 115, 240, 135, 54, 219, 98, 23, 218, 66, 197, 115, 240, 135, 54, - 222, 129, 23, 218, 66, 197, 115, 240, 135, 201, 145, 205, 186, 23, 218, - 66, 197, 115, 240, 135, 201, 145, 219, 98, 23, 218, 66, 197, 115, 240, - 135, 201, 145, 222, 129, 23, 218, 66, 240, 135, 202, 178, 204, 184, 23, - 218, 66, 240, 133, 240, 183, 205, 186, 23, 218, 66, 240, 133, 240, 183, - 219, 98, 23, 209, 144, 206, 18, 23, 209, 144, 237, 115, 23, 209, 144, - 250, 232, 23, 218, 66, 206, 242, 23, 218, 66, 240, 135, 231, 174, 234, - 115, 197, 139, 23, 218, 66, 230, 204, 231, 174, 234, 115, 197, 139, 23, - 218, 66, 221, 130, 231, 174, 234, 115, 197, 139, 23, 218, 66, 197, 115, - 231, 174, 234, 115, 197, 139, 23, 209, 144, 206, 19, 231, 174, 234, 115, - 197, 139, 23, 209, 144, 54, 231, 174, 234, 115, 197, 139, 23, 209, 144, - 250, 231, 231, 174, 234, 115, 197, 139, 23, 218, 66, 240, 135, 231, 174, - 244, 202, 23, 218, 66, 230, 204, 231, 174, 244, 202, 23, 218, 66, 221, - 130, 231, 174, 244, 202, 23, 218, 66, 197, 115, 231, 174, 244, 202, 23, - 209, 144, 206, 19, 231, 174, 244, 202, 23, 209, 144, 54, 231, 174, 244, - 202, 23, 209, 144, 250, 231, 231, 174, 244, 202, 23, 218, 66, 197, 115, - 239, 15, 213, 53, 205, 186, 23, 218, 66, 197, 115, 239, 15, 213, 53, 219, - 98, 23, 218, 66, 197, 115, 239, 15, 213, 53, 222, 129, 23, 218, 68, 240, - 135, 231, 174, 246, 165, 205, 186, 23, 218, 68, 240, 135, 231, 174, 246, - 165, 222, 129, 23, 218, 68, 230, 204, 231, 174, 246, 165, 4, 237, 115, - 23, 218, 68, 230, 204, 231, 174, 246, 165, 222, 130, 237, 115, 23, 218, - 68, 230, 204, 231, 174, 246, 165, 4, 201, 144, 23, 218, 68, 230, 204, - 231, 174, 246, 165, 222, 130, 201, 144, 23, 218, 68, 221, 130, 231, 174, - 246, 165, 4, 206, 18, 23, 218, 68, 221, 130, 231, 174, 246, 165, 222, - 130, 206, 18, 23, 218, 68, 221, 130, 231, 174, 246, 165, 4, 237, 115, 23, - 218, 68, 221, 130, 231, 174, 246, 165, 222, 130, 237, 115, 23, 218, 68, - 197, 115, 231, 174, 246, 165, 205, 186, 23, 218, 68, 197, 115, 231, 174, - 246, 165, 222, 129, 23, 209, 145, 206, 19, 231, 174, 246, 164, 23, 209, - 145, 54, 231, 174, 246, 164, 23, 209, 145, 250, 231, 231, 174, 246, 164, - 23, 218, 68, 240, 135, 231, 174, 234, 207, 205, 186, 23, 218, 68, 240, - 135, 231, 174, 234, 207, 222, 129, 23, 218, 68, 230, 204, 231, 174, 234, - 207, 4, 237, 115, 23, 218, 68, 230, 204, 231, 174, 234, 207, 222, 130, - 237, 115, 23, 218, 68, 230, 204, 231, 174, 234, 207, 201, 145, 4, 201, - 144, 23, 218, 68, 230, 204, 231, 174, 234, 207, 201, 145, 222, 130, 201, - 144, 23, 218, 68, 221, 130, 231, 174, 234, 207, 4, 206, 18, 23, 218, 68, - 221, 130, 231, 174, 234, 207, 222, 130, 206, 18, 23, 218, 68, 221, 130, - 231, 174, 234, 207, 4, 237, 115, 23, 218, 68, 221, 130, 231, 174, 234, - 207, 222, 130, 237, 115, 23, 218, 68, 197, 115, 231, 174, 234, 207, 205, - 186, 23, 218, 68, 197, 115, 231, 174, 234, 207, 222, 129, 23, 209, 145, - 206, 19, 231, 174, 234, 206, 23, 209, 145, 54, 231, 174, 234, 206, 23, - 209, 145, 250, 231, 231, 174, 234, 206, 23, 218, 68, 240, 135, 205, 186, - 23, 218, 68, 240, 135, 219, 98, 23, 218, 68, 240, 135, 222, 129, 23, 218, - 68, 240, 135, 222, 127, 23, 218, 68, 240, 135, 244, 27, 23, 218, 68, 230, - 204, 205, 186, 23, 218, 68, 221, 130, 205, 186, 23, 218, 68, 197, 115, - 205, 174, 23, 218, 68, 197, 115, 205, 186, 23, 218, 68, 197, 115, 222, - 129, 23, 209, 145, 206, 18, 23, 209, 145, 237, 115, 23, 209, 145, 250, - 230, 23, 218, 68, 206, 243, 213, 85, 23, 218, 66, 250, 80, 244, 114, 4, - 206, 18, 23, 218, 66, 250, 80, 244, 114, 219, 99, 206, 18, 23, 218, 66, - 250, 80, 244, 114, 4, 237, 115, 23, 218, 66, 250, 80, 244, 114, 219, 99, - 237, 115, 23, 218, 68, 250, 80, 244, 114, 231, 174, 197, 140, 4, 206, 18, - 23, 218, 68, 250, 80, 244, 114, 231, 174, 197, 140, 219, 99, 206, 18, 23, - 218, 68, 250, 80, 244, 114, 231, 174, 197, 140, 222, 130, 206, 18, 23, - 218, 68, 250, 80, 244, 114, 231, 174, 197, 140, 4, 237, 115, 23, 218, 68, - 250, 80, 244, 114, 231, 174, 197, 140, 219, 99, 237, 115, 23, 218, 68, - 250, 80, 244, 114, 231, 174, 197, 140, 222, 130, 237, 115, 23, 218, 66, - 196, 241, 244, 114, 234, 115, 206, 18, 23, 218, 66, 196, 241, 244, 114, - 234, 115, 237, 115, 23, 218, 68, 196, 241, 244, 114, 231, 174, 197, 140, - 206, 18, 23, 218, 68, 196, 241, 244, 114, 231, 174, 197, 140, 237, 115, - 23, 218, 66, 235, 8, 244, 111, 206, 18, 23, 218, 66, 235, 8, 244, 111, - 237, 115, 23, 218, 68, 235, 8, 244, 111, 231, 174, 197, 140, 206, 18, 23, - 218, 68, 235, 8, 244, 111, 231, 174, 197, 140, 237, 115, 23, 237, 34, - 250, 68, 205, 186, 23, 237, 34, 250, 68, 222, 129, 23, 237, 34, 235, 83, - 23, 237, 34, 205, 189, 23, 237, 34, 202, 241, 23, 237, 34, 210, 85, 23, - 237, 34, 206, 24, 23, 237, 34, 206, 25, 250, 230, 23, 237, 34, 235, 234, - 213, 234, 202, 50, 23, 237, 34, 232, 253, 23, 232, 22, 23, 232, 23, 209, - 215, 23, 232, 23, 218, 66, 204, 184, 23, 232, 23, 218, 66, 202, 53, 23, - 232, 23, 218, 68, 204, 184, 23, 232, 23, 218, 66, 240, 134, 23, 232, 23, - 218, 68, 240, 134, 23, 232, 23, 218, 71, 244, 113, 23, 235, 113, 238, - 209, 212, 25, 215, 196, 234, 150, 202, 51, 23, 235, 113, 238, 209, 212, - 25, 215, 196, 120, 214, 4, 237, 106, 23, 235, 113, 238, 209, 212, 25, - 215, 196, 120, 214, 4, 133, 202, 51, 23, 235, 200, 204, 185, 200, 20, 23, - 235, 200, 204, 185, 217, 1, 23, 235, 200, 204, 185, 237, 106, 23, 237, - 91, 235, 200, 217, 2, 237, 106, 23, 237, 91, 235, 200, 133, 217, 1, 23, - 237, 91, 235, 200, 120, 217, 1, 23, 237, 91, 235, 200, 217, 2, 200, 20, - 23, 234, 166, 217, 1, 23, 234, 166, 240, 254, 23, 234, 166, 196, 244, 23, - 235, 195, 214, 23, 23, 235, 195, 205, 52, 23, 235, 195, 244, 66, 23, 235, - 203, 247, 241, 206, 18, 23, 235, 203, 247, 241, 218, 31, 23, 235, 195, - 155, 214, 23, 23, 235, 195, 197, 56, 214, 23, 23, 235, 195, 155, 244, 66, - 23, 235, 195, 197, 54, 218, 70, 23, 235, 203, 197, 37, 23, 235, 196, 200, - 20, 23, 235, 196, 237, 106, 23, 235, 196, 234, 193, 23, 235, 198, 204, - 184, 23, 235, 198, 204, 185, 237, 115, 23, 235, 198, 204, 185, 250, 230, - 23, 235, 199, 204, 184, 23, 235, 199, 204, 185, 237, 115, 23, 235, 199, - 204, 185, 250, 230, 23, 235, 198, 240, 132, 23, 235, 199, 240, 132, 23, - 235, 198, 244, 108, 23, 244, 217, 211, 166, 23, 244, 217, 217, 1, 23, - 244, 217, 204, 98, 23, 202, 242, 244, 217, 231, 191, 23, 202, 242, 244, - 217, 218, 228, 23, 202, 242, 244, 217, 221, 112, 23, 236, 204, 23, 215, - 196, 217, 1, 23, 215, 196, 240, 254, 23, 215, 196, 196, 242, 23, 215, - 196, 197, 51, 23, 251, 36, 247, 234, 213, 224, 23, 251, 36, 204, 97, 225, - 230, 23, 251, 36, 247, 236, 4, 209, 143, 23, 251, 36, 204, 99, 4, 209, - 143, 23, 247, 163, 225, 202, 23, 247, 163, 235, 223, 23, 218, 75, 244, - 67, 217, 1, 23, 218, 75, 244, 67, 234, 149, 23, 218, 75, 244, 67, 240, - 254, 23, 218, 75, 205, 181, 23, 218, 75, 205, 182, 196, 244, 23, 218, 75, - 205, 182, 214, 23, 23, 218, 75, 234, 111, 23, 218, 75, 234, 112, 196, - 244, 23, 218, 75, 234, 112, 214, 23, 23, 218, 75, 185, 244, 113, 23, 218, - 75, 185, 234, 149, 23, 218, 75, 185, 196, 244, 23, 218, 75, 185, 213, - 217, 23, 218, 75, 185, 213, 218, 196, 244, 23, 218, 75, 185, 213, 218, - 196, 72, 23, 218, 75, 185, 210, 113, 23, 218, 75, 185, 210, 114, 196, - 244, 23, 218, 75, 185, 210, 114, 196, 72, 23, 218, 75, 223, 206, 23, 218, - 75, 223, 207, 234, 149, 23, 218, 75, 223, 207, 196, 244, 23, 218, 75, - 202, 241, 23, 218, 75, 202, 242, 234, 149, 23, 218, 75, 202, 242, 204, - 98, 23, 221, 218, 211, 226, 201, 247, 23, 221, 220, 221, 107, 126, 200, - 16, 23, 221, 220, 200, 17, 126, 221, 106, 23, 218, 75, 240, 220, 23, 218, - 75, 196, 243, 206, 18, 23, 218, 75, 196, 243, 237, 115, 23, 201, 229, - 204, 204, 213, 225, 235, 85, 23, 201, 229, 222, 7, 221, 217, 23, 201, - 229, 202, 40, 248, 59, 221, 217, 23, 201, 229, 202, 40, 201, 204, 225, - 187, 218, 74, 23, 201, 229, 225, 187, 218, 75, 210, 85, 23, 201, 229, - 218, 65, 251, 60, 244, 218, 23, 201, 229, 246, 156, 204, 204, 213, 224, - 23, 201, 229, 246, 156, 225, 187, 218, 74, 23, 203, 12, 23, 203, 13, 218, - 70, 23, 203, 13, 214, 49, 201, 228, 23, 203, 13, 214, 49, 201, 229, 218, - 70, 23, 203, 13, 214, 49, 221, 217, 23, 203, 13, 214, 49, 221, 218, 218, - 70, 23, 203, 13, 248, 1, 221, 217, 23, 218, 66, 225, 88, 23, 218, 68, - 225, 88, 23, 217, 25, 23, 232, 116, 23, 235, 226, 23, 206, 121, 231, 180, - 205, 85, 23, 206, 121, 231, 180, 212, 23, 23, 197, 138, 206, 121, 231, - 180, 218, 73, 23, 234, 205, 206, 121, 231, 180, 218, 73, 23, 206, 121, - 202, 52, 234, 116, 197, 144, 23, 201, 211, 204, 185, 204, 172, 23, 201, - 211, 240, 133, 248, 75, 23, 201, 212, 200, 199, 23, 200, 17, 247, 225, - 202, 52, 234, 116, 231, 180, 225, 14, 23, 221, 245, 244, 28, 23, 221, - 245, 222, 59, 23, 221, 245, 222, 58, 23, 221, 245, 222, 57, 23, 221, 245, - 222, 56, 23, 221, 245, 222, 55, 23, 221, 245, 222, 54, 23, 221, 245, 222, - 53, 23, 235, 7, 23, 221, 161, 205, 110, 23, 221, 162, 205, 110, 23, 221, - 163, 231, 253, 23, 221, 163, 197, 52, 23, 221, 163, 239, 67, 23, 221, - 163, 232, 23, 217, 25, 23, 221, 163, 201, 213, 23, 221, 163, 221, 244, - 238, 241, 23, 244, 23, 23, 234, 98, 204, 193, 23, 207, 61, 23, 244, 32, - 23, 213, 80, 23, 235, 17, 218, 136, 23, 235, 17, 218, 135, 23, 235, 17, - 218, 134, 23, 235, 17, 218, 133, 23, 235, 17, 218, 132, 23, 209, 147, - 218, 136, 23, 209, 147, 218, 135, 23, 209, 147, 218, 134, 23, 209, 147, - 218, 133, 23, 209, 147, 218, 132, 23, 209, 147, 218, 131, 23, 209, 147, - 218, 130, 23, 209, 147, 218, 129, 23, 209, 147, 218, 143, 23, 209, 147, - 218, 142, 23, 209, 147, 218, 141, 23, 209, 147, 218, 140, 23, 209, 147, - 218, 139, 23, 209, 147, 218, 138, 23, 209, 147, 218, 137, 37, 123, 1, - 249, 220, 37, 123, 1, 247, 126, 37, 123, 1, 199, 103, 37, 123, 1, 233, - 41, 37, 123, 1, 238, 149, 37, 123, 1, 196, 34, 37, 123, 1, 195, 58, 37, - 123, 1, 195, 84, 37, 123, 1, 225, 112, 37, 123, 1, 84, 225, 112, 37, 123, - 1, 68, 37, 123, 1, 238, 170, 37, 123, 1, 224, 171, 37, 123, 1, 221, 197, - 37, 123, 1, 217, 229, 37, 123, 1, 217, 121, 37, 123, 1, 214, 35, 37, 123, - 1, 212, 49, 37, 123, 1, 209, 202, 37, 123, 1, 205, 191, 37, 123, 1, 200, - 226, 37, 123, 1, 200, 66, 37, 123, 1, 234, 119, 37, 123, 1, 231, 234, 37, - 123, 1, 206, 111, 37, 123, 1, 201, 72, 37, 123, 1, 244, 156, 37, 123, 1, - 207, 6, 37, 123, 1, 196, 43, 37, 123, 1, 196, 45, 37, 123, 1, 196, 77, - 37, 123, 1, 195, 215, 37, 123, 1, 4, 195, 181, 37, 123, 1, 196, 0, 37, - 123, 1, 225, 153, 4, 195, 181, 37, 123, 1, 248, 28, 195, 181, 37, 123, 1, - 225, 153, 248, 28, 195, 181, 37, 123, 1, 234, 239, 81, 80, 5, 221, 39, - 223, 249, 81, 80, 5, 221, 35, 157, 81, 80, 5, 221, 33, 223, 86, 81, 80, - 5, 220, 165, 224, 92, 81, 80, 5, 220, 135, 224, 101, 81, 80, 5, 220, 154, - 223, 141, 81, 80, 5, 220, 182, 223, 165, 81, 80, 5, 220, 51, 223, 73, 81, - 80, 5, 221, 30, 197, 64, 81, 80, 5, 221, 28, 197, 156, 81, 80, 5, 221, - 26, 196, 237, 81, 80, 5, 220, 104, 197, 90, 81, 80, 5, 220, 112, 197, - 101, 81, 80, 5, 220, 116, 197, 9, 81, 80, 5, 220, 185, 197, 28, 81, 80, - 5, 220, 36, 196, 233, 81, 80, 5, 220, 87, 197, 88, 81, 80, 5, 220, 169, - 196, 221, 81, 80, 5, 220, 181, 196, 223, 81, 80, 5, 220, 91, 196, 222, - 81, 80, 5, 221, 24, 218, 188, 81, 80, 5, 221, 22, 219, 222, 81, 80, 5, - 221, 20, 218, 25, 81, 80, 5, 220, 171, 219, 73, 81, 80, 5, 220, 136, 218, - 124, 81, 80, 5, 220, 76, 218, 49, 81, 80, 5, 220, 41, 218, 43, 81, 80, 5, - 221, 18, 248, 41, 81, 80, 5, 221, 15, 248, 252, 81, 80, 5, 221, 13, 247, - 138, 81, 80, 5, 220, 80, 248, 105, 81, 80, 5, 220, 133, 248, 119, 81, 80, - 5, 220, 127, 247, 217, 81, 80, 5, 220, 92, 247, 230, 81, 80, 5, 221, 3, - 68, 81, 80, 5, 221, 1, 63, 81, 80, 5, 220, 255, 66, 81, 80, 5, 220, 67, - 236, 184, 81, 80, 5, 220, 130, 70, 81, 80, 5, 220, 65, 214, 33, 81, 80, - 5, 220, 83, 74, 81, 80, 5, 220, 93, 236, 163, 81, 80, 5, 220, 99, 225, - 230, 81, 80, 5, 220, 95, 225, 230, 81, 80, 5, 220, 35, 250, 208, 81, 80, - 5, 220, 52, 236, 106, 81, 80, 5, 220, 244, 206, 69, 81, 80, 5, 220, 242, - 187, 81, 80, 5, 220, 240, 204, 139, 81, 80, 5, 220, 68, 208, 85, 81, 80, - 5, 220, 114, 208, 103, 81, 80, 5, 220, 94, 205, 133, 81, 80, 5, 220, 151, - 205, 162, 81, 80, 5, 220, 34, 206, 62, 81, 80, 5, 220, 230, 222, 11, 81, - 80, 5, 220, 228, 175, 81, 80, 5, 220, 226, 221, 95, 81, 80, 5, 220, 146, - 222, 90, 81, 80, 5, 220, 157, 222, 99, 81, 80, 5, 220, 176, 221, 133, 81, - 80, 5, 220, 77, 221, 166, 81, 80, 5, 220, 120, 172, 222, 99, 81, 80, 5, - 220, 252, 239, 20, 81, 80, 5, 220, 249, 240, 3, 81, 80, 5, 220, 246, 237, - 74, 81, 80, 5, 220, 141, 239, 105, 81, 80, 5, 220, 50, 238, 129, 81, 80, - 5, 220, 49, 238, 154, 81, 80, 5, 220, 238, 202, 94, 81, 80, 5, 220, 235, - 203, 137, 81, 80, 5, 220, 233, 201, 20, 81, 80, 5, 220, 139, 203, 16, 81, - 80, 5, 220, 175, 203, 36, 81, 80, 5, 220, 126, 201, 226, 81, 80, 5, 220, - 161, 147, 81, 80, 5, 220, 224, 225, 63, 81, 80, 5, 220, 221, 225, 105, - 81, 80, 5, 220, 219, 225, 1, 81, 80, 5, 220, 73, 225, 82, 81, 80, 5, 220, - 117, 225, 84, 81, 80, 5, 220, 70, 225, 10, 81, 80, 5, 220, 167, 225, 20, - 81, 80, 5, 220, 55, 172, 225, 20, 81, 80, 5, 220, 217, 196, 20, 81, 80, - 5, 220, 214, 165, 81, 80, 5, 220, 212, 195, 215, 81, 80, 5, 220, 121, - 196, 62, 81, 80, 5, 220, 150, 196, 65, 81, 80, 5, 220, 89, 195, 235, 81, - 80, 5, 220, 109, 196, 0, 81, 80, 5, 220, 208, 235, 33, 81, 80, 5, 220, - 206, 235, 118, 81, 80, 5, 220, 204, 234, 104, 81, 80, 5, 220, 152, 235, - 62, 81, 80, 5, 220, 155, 235, 69, 81, 80, 5, 220, 97, 234, 177, 81, 80, - 5, 220, 142, 234, 188, 81, 80, 5, 220, 33, 234, 103, 81, 80, 5, 220, 129, - 235, 90, 81, 80, 5, 220, 202, 216, 101, 81, 80, 5, 220, 200, 217, 135, - 81, 80, 5, 220, 198, 215, 63, 81, 80, 5, 220, 113, 217, 17, 81, 80, 5, - 220, 61, 215, 213, 81, 80, 5, 220, 54, 231, 214, 81, 80, 5, 220, 193, - 142, 81, 80, 5, 220, 44, 230, 219, 81, 80, 5, 220, 196, 232, 4, 81, 80, - 5, 220, 134, 232, 32, 81, 80, 5, 220, 191, 231, 54, 81, 80, 5, 220, 90, - 231, 81, 81, 80, 5, 220, 147, 232, 3, 81, 80, 5, 220, 102, 231, 47, 81, - 80, 5, 220, 177, 231, 184, 81, 80, 5, 220, 100, 232, 97, 81, 80, 5, 220, - 143, 230, 203, 81, 80, 5, 220, 178, 231, 244, 81, 80, 5, 220, 37, 231, - 57, 81, 80, 5, 220, 184, 230, 215, 81, 80, 5, 220, 140, 216, 209, 81, 80, - 5, 220, 189, 216, 223, 81, 80, 5, 220, 148, 216, 206, 81, 80, 5, 220, - 115, 216, 217, 81, 80, 5, 220, 84, 216, 218, 81, 80, 5, 220, 74, 216, - 207, 81, 80, 5, 220, 110, 216, 208, 81, 80, 5, 220, 71, 216, 222, 81, 80, - 5, 220, 103, 216, 205, 81, 80, 5, 220, 144, 172, 216, 218, 81, 80, 5, - 220, 124, 172, 216, 207, 81, 80, 5, 220, 47, 172, 216, 208, 81, 80, 5, - 220, 75, 233, 74, 81, 80, 5, 220, 119, 234, 4, 81, 80, 5, 220, 62, 232, - 214, 81, 80, 5, 220, 40, 233, 178, 81, 80, 5, 220, 64, 232, 200, 81, 80, - 5, 220, 63, 232, 210, 81, 80, 5, 220, 46, 216, 228, 81, 80, 5, 220, 173, - 216, 165, 81, 80, 5, 220, 53, 216, 154, 81, 80, 5, 220, 162, 212, 163, - 81, 80, 5, 220, 131, 163, 81, 80, 5, 220, 180, 211, 175, 81, 80, 5, 220, - 149, 213, 22, 81, 80, 5, 220, 179, 213, 35, 81, 80, 5, 220, 128, 212, 37, - 81, 80, 5, 220, 164, 212, 62, 81, 80, 5, 220, 85, 219, 133, 81, 80, 5, - 220, 168, 219, 148, 81, 80, 5, 220, 108, 219, 127, 81, 80, 5, 220, 183, - 219, 140, 81, 80, 5, 220, 42, 219, 140, 81, 80, 5, 220, 158, 219, 141, - 81, 80, 5, 220, 58, 219, 128, 81, 80, 5, 220, 56, 219, 129, 81, 80, 5, - 220, 43, 219, 121, 81, 80, 5, 220, 69, 172, 219, 141, 81, 80, 5, 220, - 125, 172, 219, 128, 81, 80, 5, 220, 88, 172, 219, 129, 81, 80, 5, 220, - 98, 223, 114, 81, 80, 5, 220, 138, 223, 122, 81, 80, 5, 220, 156, 223, - 110, 81, 80, 5, 220, 187, 223, 117, 81, 80, 5, 220, 122, 223, 118, 81, - 80, 5, 220, 118, 223, 112, 81, 80, 5, 220, 72, 223, 113, 81, 80, 5, 220, - 106, 233, 195, 81, 80, 5, 220, 174, 233, 203, 81, 80, 5, 220, 82, 233, - 190, 81, 80, 5, 220, 137, 233, 199, 81, 80, 5, 220, 123, 233, 200, 81, - 80, 5, 220, 159, 233, 191, 81, 80, 5, 220, 160, 233, 193, 81, 80, 5, 220, - 59, 173, 81, 80, 5, 220, 107, 217, 60, 81, 80, 5, 220, 101, 217, 75, 81, - 80, 5, 220, 105, 217, 42, 81, 80, 5, 220, 39, 217, 66, 81, 80, 5, 220, - 111, 217, 67, 81, 80, 5, 220, 163, 217, 47, 81, 80, 5, 220, 166, 217, 51, - 81, 80, 5, 220, 78, 216, 82, 81, 80, 5, 220, 38, 216, 52, 81, 80, 5, 220, - 81, 216, 73, 81, 80, 5, 220, 96, 216, 56, 81, 80, 5, 220, 48, 199, 23, - 81, 80, 5, 220, 45, 199, 137, 81, 80, 5, 220, 79, 197, 209, 81, 80, 5, - 220, 57, 199, 100, 81, 80, 5, 220, 145, 199, 105, 81, 80, 5, 220, 86, - 198, 222, 81, 80, 5, 220, 153, 198, 237, 81, 80, 5, 220, 66, 215, 9, 81, - 80, 5, 220, 172, 215, 28, 81, 80, 5, 220, 60, 214, 247, 81, 80, 5, 220, - 132, 215, 20, 81, 80, 5, 220, 170, 214, 254, 81, 80, 17, 98, 81, 80, 17, - 103, 81, 80, 17, 135, 81, 80, 17, 136, 81, 80, 17, 150, 81, 80, 17, 174, - 81, 80, 17, 182, 81, 80, 17, 178, 81, 80, 17, 184, 81, 80, 37, 35, 203, - 14, 81, 80, 37, 35, 202, 243, 81, 80, 37, 35, 230, 199, 81, 80, 37, 35, - 202, 128, 81, 80, 37, 35, 202, 249, 202, 128, 81, 80, 37, 35, 230, 202, - 202, 128, 81, 80, 37, 35, 218, 191, 251, 98, 6, 1, 250, 254, 251, 98, 6, - 1, 240, 0, 251, 98, 6, 1, 222, 237, 251, 98, 6, 1, 218, 204, 251, 98, 6, - 1, 248, 252, 251, 98, 6, 1, 206, 13, 251, 98, 6, 1, 213, 35, 251, 98, 6, - 1, 248, 49, 251, 98, 6, 1, 173, 251, 98, 6, 1, 70, 251, 98, 6, 1, 235, - 118, 251, 98, 6, 1, 68, 251, 98, 6, 1, 74, 251, 98, 6, 1, 239, 44, 251, - 98, 6, 1, 196, 21, 251, 98, 6, 1, 197, 109, 251, 98, 6, 1, 215, 63, 251, - 98, 6, 1, 224, 183, 251, 98, 6, 1, 165, 251, 98, 6, 1, 66, 251, 98, 6, 1, - 225, 54, 251, 98, 6, 1, 244, 195, 251, 98, 6, 1, 142, 251, 98, 6, 1, 211, - 106, 251, 98, 6, 1, 234, 4, 251, 98, 6, 1, 215, 34, 251, 98, 6, 1, 201, - 20, 251, 98, 6, 1, 216, 145, 251, 98, 6, 1, 199, 137, 251, 98, 6, 1, 224, - 38, 251, 98, 6, 1, 233, 200, 251, 98, 6, 1, 195, 103, 251, 98, 6, 1, 223, - 113, 251, 98, 6, 1, 207, 6, 251, 98, 4, 1, 250, 254, 251, 98, 4, 1, 240, - 0, 251, 98, 4, 1, 222, 237, 251, 98, 4, 1, 218, 204, 251, 98, 4, 1, 248, - 252, 251, 98, 4, 1, 206, 13, 251, 98, 4, 1, 213, 35, 251, 98, 4, 1, 248, - 49, 251, 98, 4, 1, 173, 251, 98, 4, 1, 70, 251, 98, 4, 1, 235, 118, 251, - 98, 4, 1, 68, 251, 98, 4, 1, 74, 251, 98, 4, 1, 239, 44, 251, 98, 4, 1, - 196, 21, 251, 98, 4, 1, 197, 109, 251, 98, 4, 1, 215, 63, 251, 98, 4, 1, - 224, 183, 251, 98, 4, 1, 165, 251, 98, 4, 1, 66, 251, 98, 4, 1, 225, 54, - 251, 98, 4, 1, 244, 195, 251, 98, 4, 1, 142, 251, 98, 4, 1, 211, 106, - 251, 98, 4, 1, 234, 4, 251, 98, 4, 1, 215, 34, 251, 98, 4, 1, 201, 20, - 251, 98, 4, 1, 216, 145, 251, 98, 4, 1, 199, 137, 251, 98, 4, 1, 224, 38, - 251, 98, 4, 1, 233, 200, 251, 98, 4, 1, 195, 103, 251, 98, 4, 1, 223, - 113, 251, 98, 4, 1, 207, 6, 251, 98, 250, 255, 222, 52, 251, 98, 18, 222, - 52, 251, 98, 233, 174, 78, 251, 98, 232, 98, 251, 98, 105, 218, 144, 251, - 98, 233, 175, 105, 218, 144, 251, 98, 215, 74, 251, 98, 17, 195, 79, 251, - 98, 17, 98, 251, 98, 17, 103, 251, 98, 17, 135, 251, 98, 17, 136, 251, - 98, 17, 150, 251, 98, 17, 174, 251, 98, 17, 182, 251, 98, 17, 178, 251, - 98, 17, 184, 251, 98, 84, 235, 225, 78, 251, 98, 84, 211, 28, 78, 225, - 214, 205, 226, 35, 98, 225, 214, 205, 226, 35, 103, 225, 214, 205, 226, - 35, 135, 225, 214, 205, 226, 35, 136, 225, 214, 205, 226, 35, 150, 225, - 214, 205, 226, 35, 174, 225, 214, 205, 226, 35, 182, 225, 214, 205, 226, - 35, 178, 225, 214, 205, 226, 35, 184, 225, 214, 205, 226, 35, 202, 248, - 225, 214, 205, 226, 35, 200, 214, 225, 214, 205, 226, 35, 202, 147, 225, - 214, 205, 226, 35, 234, 151, 225, 214, 205, 226, 35, 235, 25, 225, 214, - 205, 226, 35, 205, 228, 225, 214, 205, 226, 35, 207, 21, 225, 214, 205, - 226, 35, 236, 151, 225, 214, 205, 226, 35, 216, 92, 225, 214, 205, 226, - 35, 106, 230, 201, 225, 214, 205, 226, 35, 114, 230, 201, 225, 214, 205, - 226, 35, 122, 230, 201, 225, 214, 205, 226, 35, 234, 145, 230, 201, 225, - 214, 205, 226, 35, 234, 237, 230, 201, 225, 214, 205, 226, 35, 205, 242, - 230, 201, 225, 214, 205, 226, 35, 207, 27, 230, 201, 225, 214, 205, 226, - 35, 236, 161, 230, 201, 225, 214, 205, 226, 35, 216, 97, 230, 201, 225, - 214, 205, 226, 35, 106, 202, 130, 225, 214, 205, 226, 35, 114, 202, 130, - 225, 214, 205, 226, 35, 122, 202, 130, 225, 214, 205, 226, 35, 234, 145, - 202, 130, 225, 214, 205, 226, 35, 234, 237, 202, 130, 225, 214, 205, 226, - 35, 205, 242, 202, 130, 225, 214, 205, 226, 35, 207, 27, 202, 130, 225, - 214, 205, 226, 35, 236, 161, 202, 130, 225, 214, 205, 226, 35, 216, 97, - 202, 130, 225, 214, 205, 226, 35, 202, 249, 202, 130, 225, 214, 205, 226, - 35, 200, 215, 202, 130, 225, 214, 205, 226, 35, 202, 148, 202, 130, 225, - 214, 205, 226, 35, 234, 152, 202, 130, 225, 214, 205, 226, 35, 235, 26, - 202, 130, 225, 214, 205, 226, 35, 205, 229, 202, 130, 225, 214, 205, 226, - 35, 207, 22, 202, 130, 225, 214, 205, 226, 35, 236, 152, 202, 130, 225, - 214, 205, 226, 35, 216, 93, 202, 130, 225, 214, 205, 226, 35, 222, 156, - 225, 214, 205, 226, 35, 222, 155, 225, 214, 205, 226, 222, 157, 78, 225, - 214, 205, 226, 35, 224, 138, 225, 214, 205, 226, 35, 224, 137, 225, 214, - 205, 226, 35, 211, 234, 98, 225, 214, 205, 226, 35, 211, 234, 103, 225, - 214, 205, 226, 35, 211, 234, 135, 225, 214, 205, 226, 35, 211, 234, 136, - 225, 214, 205, 226, 35, 211, 234, 150, 225, 214, 205, 226, 35, 211, 234, - 174, 225, 214, 205, 226, 35, 211, 234, 182, 225, 214, 205, 226, 35, 211, - 234, 178, 225, 214, 205, 226, 35, 211, 234, 184, 225, 214, 205, 226, 212, - 91, 225, 214, 205, 226, 234, 135, 106, 211, 36, 225, 214, 205, 226, 234, - 135, 106, 232, 108, 225, 214, 205, 226, 234, 135, 122, 211, 34, 225, 214, - 205, 226, 209, 63, 78, 225, 214, 205, 226, 35, 250, 233, 98, 225, 214, - 205, 226, 35, 250, 233, 103, 225, 214, 205, 226, 35, 250, 233, 202, 249, - 202, 130, 225, 214, 205, 226, 250, 233, 222, 157, 78, 9, 13, 251, 10, 9, - 13, 248, 93, 9, 13, 225, 80, 9, 13, 239, 230, 9, 13, 197, 109, 9, 13, - 195, 105, 9, 13, 232, 119, 9, 13, 203, 107, 9, 13, 196, 60, 9, 13, 224, - 183, 9, 13, 222, 150, 9, 13, 219, 94, 9, 13, 215, 206, 9, 13, 208, 81, 9, - 13, 251, 40, 9, 13, 235, 56, 9, 13, 208, 219, 9, 13, 211, 101, 9, 13, - 210, 92, 9, 13, 206, 207, 9, 13, 203, 9, 9, 13, 202, 182, 9, 13, 224, 34, - 9, 13, 202, 194, 9, 13, 239, 253, 9, 13, 195, 108, 9, 13, 233, 107, 9, - 13, 238, 122, 248, 93, 9, 13, 238, 122, 215, 206, 9, 13, 238, 122, 235, - 56, 9, 13, 238, 122, 211, 101, 9, 13, 84, 248, 93, 9, 13, 84, 225, 80, 9, - 13, 84, 231, 255, 9, 13, 84, 232, 119, 9, 13, 84, 196, 60, 9, 13, 84, - 224, 183, 9, 13, 84, 222, 150, 9, 13, 84, 219, 94, 9, 13, 84, 215, 206, - 9, 13, 84, 208, 81, 9, 13, 84, 251, 40, 9, 13, 84, 235, 56, 9, 13, 84, - 208, 219, 9, 13, 84, 211, 101, 9, 13, 84, 206, 207, 9, 13, 84, 203, 9, 9, - 13, 84, 202, 182, 9, 13, 84, 224, 34, 9, 13, 84, 239, 253, 9, 13, 84, - 233, 107, 9, 13, 203, 102, 225, 80, 9, 13, 203, 102, 232, 119, 9, 13, - 203, 102, 196, 60, 9, 13, 203, 102, 222, 150, 9, 13, 203, 102, 215, 206, - 9, 13, 203, 102, 208, 81, 9, 13, 203, 102, 251, 40, 9, 13, 203, 102, 208, - 219, 9, 13, 203, 102, 211, 101, 9, 13, 203, 102, 206, 207, 9, 13, 203, - 102, 224, 34, 9, 13, 203, 102, 239, 253, 9, 13, 203, 102, 233, 107, 9, - 13, 203, 102, 238, 122, 215, 206, 9, 13, 203, 102, 238, 122, 211, 101, 9, - 13, 204, 171, 248, 93, 9, 13, 204, 171, 225, 80, 9, 13, 204, 171, 231, - 255, 9, 13, 204, 171, 232, 119, 9, 13, 204, 171, 203, 107, 9, 13, 204, - 171, 196, 60, 9, 13, 204, 171, 224, 183, 9, 13, 204, 171, 219, 94, 9, 13, - 204, 171, 215, 206, 9, 13, 204, 171, 208, 81, 9, 13, 204, 171, 251, 40, - 9, 13, 204, 171, 235, 56, 9, 13, 204, 171, 208, 219, 9, 13, 204, 171, - 211, 101, 9, 13, 204, 171, 206, 207, 9, 13, 204, 171, 203, 9, 9, 13, 204, - 171, 202, 182, 9, 13, 204, 171, 224, 34, 9, 13, 204, 171, 239, 253, 9, - 13, 204, 171, 195, 108, 9, 13, 204, 171, 233, 107, 9, 13, 204, 171, 238, - 122, 248, 93, 9, 13, 204, 171, 238, 122, 235, 56, 9, 13, 221, 128, 251, - 10, 9, 13, 221, 128, 248, 93, 9, 13, 221, 128, 225, 80, 9, 13, 221, 128, - 239, 230, 9, 13, 221, 128, 231, 255, 9, 13, 221, 128, 197, 109, 9, 13, - 221, 128, 195, 105, 9, 13, 221, 128, 232, 119, 9, 13, 221, 128, 203, 107, - 9, 13, 221, 128, 196, 60, 9, 13, 221, 128, 222, 150, 9, 13, 221, 128, - 219, 94, 9, 13, 221, 128, 215, 206, 9, 13, 221, 128, 208, 81, 9, 13, 221, - 128, 251, 40, 9, 13, 221, 128, 235, 56, 9, 13, 221, 128, 208, 219, 9, 13, - 221, 128, 211, 101, 9, 13, 221, 128, 210, 92, 9, 13, 221, 128, 206, 207, - 9, 13, 221, 128, 203, 9, 9, 13, 221, 128, 202, 182, 9, 13, 221, 128, 224, - 34, 9, 13, 221, 128, 202, 194, 9, 13, 221, 128, 239, 253, 9, 13, 221, - 128, 195, 108, 9, 13, 221, 128, 233, 107, 9, 13, 190, 248, 93, 9, 13, - 190, 225, 80, 9, 13, 190, 239, 230, 9, 13, 190, 197, 109, 9, 13, 190, - 195, 105, 9, 13, 190, 232, 119, 9, 13, 190, 203, 107, 9, 13, 190, 196, - 60, 9, 13, 190, 222, 150, 9, 13, 190, 219, 94, 9, 13, 190, 215, 206, 9, - 13, 190, 208, 81, 9, 13, 190, 251, 40, 9, 13, 190, 235, 56, 9, 13, 190, - 208, 219, 9, 13, 190, 211, 101, 9, 13, 190, 210, 92, 9, 13, 190, 206, - 207, 9, 13, 190, 203, 9, 9, 13, 190, 202, 182, 9, 13, 190, 224, 34, 9, - 13, 190, 202, 194, 9, 13, 190, 239, 253, 9, 13, 190, 195, 108, 9, 13, - 190, 233, 107, 9, 13, 214, 14, 86, 3, 162, 3, 203, 59, 9, 13, 214, 14, - 162, 3, 239, 230, 219, 243, 109, 236, 199, 197, 44, 219, 243, 109, 205, - 121, 197, 44, 219, 243, 109, 197, 81, 197, 44, 219, 243, 109, 164, 197, - 44, 219, 243, 109, 210, 108, 237, 95, 219, 243, 109, 232, 229, 237, 95, - 219, 243, 109, 67, 237, 95, 219, 243, 109, 106, 77, 244, 234, 219, 243, - 109, 114, 77, 244, 234, 219, 243, 109, 122, 77, 244, 234, 219, 243, 109, - 234, 145, 77, 244, 234, 219, 243, 109, 234, 237, 77, 244, 234, 219, 243, - 109, 205, 242, 77, 244, 234, 219, 243, 109, 207, 27, 77, 244, 234, 219, - 243, 109, 236, 161, 77, 244, 234, 219, 243, 109, 216, 97, 77, 244, 234, - 219, 243, 109, 106, 77, 248, 202, 219, 243, 109, 114, 77, 248, 202, 219, - 243, 109, 122, 77, 248, 202, 219, 243, 109, 234, 145, 77, 248, 202, 219, - 243, 109, 234, 237, 77, 248, 202, 219, 243, 109, 205, 242, 77, 248, 202, - 219, 243, 109, 207, 27, 77, 248, 202, 219, 243, 109, 236, 161, 77, 248, - 202, 219, 243, 109, 216, 97, 77, 248, 202, 219, 243, 109, 106, 77, 244, - 110, 219, 243, 109, 114, 77, 244, 110, 219, 243, 109, 122, 77, 244, 110, - 219, 243, 109, 234, 145, 77, 244, 110, 219, 243, 109, 234, 237, 77, 244, - 110, 219, 243, 109, 205, 242, 77, 244, 110, 219, 243, 109, 207, 27, 77, - 244, 110, 219, 243, 109, 236, 161, 77, 244, 110, 219, 243, 109, 216, 97, - 77, 244, 110, 219, 243, 109, 212, 73, 219, 243, 109, 214, 1, 219, 243, - 109, 248, 203, 219, 243, 109, 244, 151, 219, 243, 109, 205, 63, 219, 243, - 109, 204, 80, 219, 243, 109, 249, 243, 219, 243, 109, 197, 35, 219, 243, - 109, 225, 13, 219, 243, 109, 248, 245, 177, 109, 231, 43, 248, 245, 177, - 109, 231, 41, 177, 109, 231, 40, 177, 109, 231, 39, 177, 109, 231, 38, - 177, 109, 231, 37, 177, 109, 231, 36, 177, 109, 231, 35, 177, 109, 231, - 34, 177, 109, 231, 33, 177, 109, 231, 32, 177, 109, 231, 31, 177, 109, - 231, 30, 177, 109, 231, 29, 177, 109, 231, 28, 177, 109, 231, 27, 177, - 109, 231, 26, 177, 109, 231, 25, 177, 109, 231, 24, 177, 109, 231, 23, - 177, 109, 231, 22, 177, 109, 231, 21, 177, 109, 231, 20, 177, 109, 231, - 19, 177, 109, 231, 18, 177, 109, 231, 17, 177, 109, 231, 16, 177, 109, - 231, 15, 177, 109, 231, 14, 177, 109, 231, 13, 177, 109, 231, 12, 177, - 109, 231, 11, 177, 109, 231, 10, 177, 109, 231, 9, 177, 109, 231, 8, 177, - 109, 231, 7, 177, 109, 231, 6, 177, 109, 231, 5, 177, 109, 231, 4, 177, - 109, 231, 3, 177, 109, 231, 2, 177, 109, 231, 1, 177, 109, 231, 0, 177, - 109, 230, 255, 177, 109, 230, 254, 177, 109, 230, 253, 177, 109, 230, - 252, 177, 109, 230, 251, 177, 109, 230, 250, 177, 109, 230, 249, 177, - 109, 83, 248, 245, 177, 109, 199, 87, 177, 109, 199, 86, 177, 109, 199, - 85, 177, 109, 199, 84, 177, 109, 199, 83, 177, 109, 199, 82, 177, 109, - 199, 81, 177, 109, 199, 80, 177, 109, 199, 79, 177, 109, 199, 78, 177, - 109, 199, 77, 177, 109, 199, 76, 177, 109, 199, 75, 177, 109, 199, 74, - 177, 109, 199, 73, 177, 109, 199, 72, 177, 109, 199, 71, 177, 109, 199, - 70, 177, 109, 199, 69, 177, 109, 199, 68, 177, 109, 199, 67, 177, 109, - 199, 66, 177, 109, 199, 65, 177, 109, 199, 64, 177, 109, 199, 63, 177, - 109, 199, 62, 177, 109, 199, 61, 177, 109, 199, 60, 177, 109, 199, 59, - 177, 109, 199, 58, 177, 109, 199, 57, 177, 109, 199, 56, 177, 109, 199, - 55, 177, 109, 199, 54, 177, 109, 199, 53, 177, 109, 199, 52, 177, 109, - 199, 51, 177, 109, 199, 50, 177, 109, 199, 49, 177, 109, 199, 48, 177, - 109, 199, 47, 177, 109, 199, 46, 177, 109, 199, 45, 177, 109, 199, 44, - 177, 109, 199, 43, 177, 109, 199, 42, 177, 109, 199, 41, 177, 109, 199, - 40, 177, 109, 199, 39, 212, 83, 246, 234, 248, 245, 212, 83, 246, 234, - 251, 116, 77, 205, 107, 212, 83, 246, 234, 114, 77, 205, 107, 212, 83, - 246, 234, 122, 77, 205, 107, 212, 83, 246, 234, 234, 145, 77, 205, 107, - 212, 83, 246, 234, 234, 237, 77, 205, 107, 212, 83, 246, 234, 205, 242, - 77, 205, 107, 212, 83, 246, 234, 207, 27, 77, 205, 107, 212, 83, 246, - 234, 236, 161, 77, 205, 107, 212, 83, 246, 234, 216, 97, 77, 205, 107, - 212, 83, 246, 234, 202, 249, 77, 205, 107, 212, 83, 246, 234, 225, 103, - 77, 205, 107, 212, 83, 246, 234, 223, 171, 77, 205, 107, 212, 83, 246, - 234, 211, 30, 77, 205, 107, 212, 83, 246, 234, 223, 223, 77, 205, 107, - 212, 83, 246, 234, 251, 116, 77, 232, 10, 212, 83, 246, 234, 114, 77, - 232, 10, 212, 83, 246, 234, 122, 77, 232, 10, 212, 83, 246, 234, 234, - 145, 77, 232, 10, 212, 83, 246, 234, 234, 237, 77, 232, 10, 212, 83, 246, - 234, 205, 242, 77, 232, 10, 212, 83, 246, 234, 207, 27, 77, 232, 10, 212, - 83, 246, 234, 236, 161, 77, 232, 10, 212, 83, 246, 234, 216, 97, 77, 232, - 10, 212, 83, 246, 234, 202, 249, 77, 232, 10, 212, 83, 246, 234, 225, - 103, 77, 232, 10, 212, 83, 246, 234, 223, 171, 77, 232, 10, 212, 83, 246, - 234, 211, 30, 77, 232, 10, 212, 83, 246, 234, 223, 223, 77, 232, 10, 212, - 83, 246, 234, 210, 108, 225, 13, 212, 83, 246, 234, 251, 116, 77, 239, 7, - 212, 83, 246, 234, 114, 77, 239, 7, 212, 83, 246, 234, 122, 77, 239, 7, - 212, 83, 246, 234, 234, 145, 77, 239, 7, 212, 83, 246, 234, 234, 237, 77, - 239, 7, 212, 83, 246, 234, 205, 242, 77, 239, 7, 212, 83, 246, 234, 207, - 27, 77, 239, 7, 212, 83, 246, 234, 236, 161, 77, 239, 7, 212, 83, 246, - 234, 216, 97, 77, 239, 7, 212, 83, 246, 234, 202, 249, 77, 239, 7, 212, - 83, 246, 234, 225, 103, 77, 239, 7, 212, 83, 246, 234, 223, 171, 77, 239, - 7, 212, 83, 246, 234, 211, 30, 77, 239, 7, 212, 83, 246, 234, 223, 223, - 77, 239, 7, 212, 83, 246, 234, 64, 225, 13, 212, 83, 246, 234, 251, 116, - 77, 244, 52, 212, 83, 246, 234, 114, 77, 244, 52, 212, 83, 246, 234, 122, - 77, 244, 52, 212, 83, 246, 234, 234, 145, 77, 244, 52, 212, 83, 246, 234, - 234, 237, 77, 244, 52, 212, 83, 246, 234, 205, 242, 77, 244, 52, 212, 83, - 246, 234, 207, 27, 77, 244, 52, 212, 83, 246, 234, 236, 161, 77, 244, 52, - 212, 83, 246, 234, 216, 97, 77, 244, 52, 212, 83, 246, 234, 202, 249, 77, - 244, 52, 212, 83, 246, 234, 225, 103, 77, 244, 52, 212, 83, 246, 234, - 223, 171, 77, 244, 52, 212, 83, 246, 234, 211, 30, 77, 244, 52, 212, 83, - 246, 234, 223, 223, 77, 244, 52, 212, 83, 246, 234, 67, 225, 13, 212, 83, - 246, 234, 234, 175, 212, 83, 246, 234, 201, 121, 212, 83, 246, 234, 201, - 110, 212, 83, 246, 234, 201, 107, 212, 83, 246, 234, 201, 106, 212, 83, - 246, 234, 201, 105, 212, 83, 246, 234, 201, 104, 212, 83, 246, 234, 201, - 103, 212, 83, 246, 234, 201, 102, 212, 83, 246, 234, 201, 101, 212, 83, - 246, 234, 201, 120, 212, 83, 246, 234, 201, 119, 212, 83, 246, 234, 201, - 118, 212, 83, 246, 234, 201, 117, 212, 83, 246, 234, 201, 116, 212, 83, - 246, 234, 201, 115, 212, 83, 246, 234, 201, 114, 212, 83, 246, 234, 201, - 113, 212, 83, 246, 234, 201, 112, 212, 83, 246, 234, 201, 111, 212, 83, - 246, 234, 201, 109, 212, 83, 246, 234, 201, 108, 17, 195, 80, 234, 98, - 204, 193, 17, 195, 80, 244, 23, 17, 106, 244, 23, 17, 114, 244, 23, 17, - 122, 244, 23, 17, 234, 145, 244, 23, 17, 234, 237, 244, 23, 17, 205, 242, - 244, 23, 17, 207, 27, 244, 23, 17, 236, 161, 244, 23, 17, 216, 97, 244, - 23, 238, 217, 45, 44, 17, 195, 79, 238, 217, 217, 20, 45, 44, 17, 195, - 79, 116, 8, 6, 1, 63, 116, 8, 6, 1, 249, 219, 116, 8, 6, 1, 247, 69, 116, - 8, 6, 1, 240, 98, 116, 8, 6, 1, 70, 116, 8, 6, 1, 235, 184, 116, 8, 6, 1, - 234, 71, 116, 8, 6, 1, 232, 154, 116, 8, 6, 1, 68, 116, 8, 6, 1, 225, - 108, 116, 8, 6, 1, 224, 227, 116, 8, 6, 1, 158, 116, 8, 6, 1, 221, 40, - 116, 8, 6, 1, 217, 225, 116, 8, 6, 1, 74, 116, 8, 6, 1, 213, 195, 116, 8, - 6, 1, 211, 116, 116, 8, 6, 1, 143, 116, 8, 6, 1, 209, 35, 116, 8, 6, 1, - 203, 185, 116, 8, 6, 1, 66, 116, 8, 6, 1, 199, 215, 116, 8, 6, 1, 197, - 189, 116, 8, 6, 1, 196, 216, 116, 8, 6, 1, 196, 143, 116, 8, 6, 1, 195, - 157, 201, 210, 206, 201, 247, 175, 8, 6, 1, 209, 35, 45, 41, 8, 6, 1, - 247, 69, 45, 41, 8, 6, 1, 143, 45, 246, 177, 45, 196, 218, 240, 226, 102, - 99, 8, 6, 1, 63, 99, 8, 6, 1, 249, 219, 99, 8, 6, 1, 247, 69, 99, 8, 6, - 1, 240, 98, 99, 8, 6, 1, 70, 99, 8, 6, 1, 235, 184, 99, 8, 6, 1, 234, 71, - 99, 8, 6, 1, 232, 154, 99, 8, 6, 1, 68, 99, 8, 6, 1, 225, 108, 99, 8, 6, - 1, 224, 227, 99, 8, 6, 1, 158, 99, 8, 6, 1, 221, 40, 99, 8, 6, 1, 217, - 225, 99, 8, 6, 1, 74, 99, 8, 6, 1, 213, 195, 99, 8, 6, 1, 211, 116, 99, - 8, 6, 1, 143, 99, 8, 6, 1, 209, 35, 99, 8, 6, 1, 203, 185, 99, 8, 6, 1, - 66, 99, 8, 6, 1, 199, 215, 99, 8, 6, 1, 197, 189, 99, 8, 6, 1, 196, 216, - 99, 8, 6, 1, 196, 143, 99, 8, 6, 1, 195, 157, 99, 230, 188, 99, 217, 249, - 99, 208, 105, 99, 205, 46, 99, 211, 255, 99, 197, 102, 217, 20, 45, 8, 6, - 1, 63, 217, 20, 45, 8, 6, 1, 249, 219, 217, 20, 45, 8, 6, 1, 247, 69, - 217, 20, 45, 8, 6, 1, 240, 98, 217, 20, 45, 8, 6, 1, 70, 217, 20, 45, 8, - 6, 1, 235, 184, 217, 20, 45, 8, 6, 1, 234, 71, 217, 20, 45, 8, 6, 1, 232, - 154, 217, 20, 45, 8, 6, 1, 68, 217, 20, 45, 8, 6, 1, 225, 108, 217, 20, - 45, 8, 6, 1, 224, 227, 217, 20, 45, 8, 6, 1, 158, 217, 20, 45, 8, 6, 1, - 221, 40, 217, 20, 45, 8, 6, 1, 217, 225, 217, 20, 45, 8, 6, 1, 74, 217, - 20, 45, 8, 6, 1, 213, 195, 217, 20, 45, 8, 6, 1, 211, 116, 217, 20, 45, - 8, 6, 1, 143, 217, 20, 45, 8, 6, 1, 209, 35, 217, 20, 45, 8, 6, 1, 203, - 185, 217, 20, 45, 8, 6, 1, 66, 217, 20, 45, 8, 6, 1, 199, 215, 217, 20, - 45, 8, 6, 1, 197, 189, 217, 20, 45, 8, 6, 1, 196, 216, 217, 20, 45, 8, 6, - 1, 196, 143, 217, 20, 45, 8, 6, 1, 195, 157, 210, 164, 219, 120, 56, 210, - 164, 219, 117, 56, 217, 20, 99, 8, 6, 1, 63, 217, 20, 99, 8, 6, 1, 249, - 219, 217, 20, 99, 8, 6, 1, 247, 69, 217, 20, 99, 8, 6, 1, 240, 98, 217, - 20, 99, 8, 6, 1, 70, 217, 20, 99, 8, 6, 1, 235, 184, 217, 20, 99, 8, 6, - 1, 234, 71, 217, 20, 99, 8, 6, 1, 232, 154, 217, 20, 99, 8, 6, 1, 68, - 217, 20, 99, 8, 6, 1, 225, 108, 217, 20, 99, 8, 6, 1, 224, 227, 217, 20, - 99, 8, 6, 1, 158, 217, 20, 99, 8, 6, 1, 221, 40, 217, 20, 99, 8, 6, 1, - 217, 225, 217, 20, 99, 8, 6, 1, 74, 217, 20, 99, 8, 6, 1, 213, 195, 217, - 20, 99, 8, 6, 1, 211, 116, 217, 20, 99, 8, 6, 1, 143, 217, 20, 99, 8, 6, - 1, 209, 35, 217, 20, 99, 8, 6, 1, 203, 185, 217, 20, 99, 8, 6, 1, 66, - 217, 20, 99, 8, 6, 1, 199, 215, 217, 20, 99, 8, 6, 1, 197, 189, 217, 20, - 99, 8, 6, 1, 196, 216, 217, 20, 99, 8, 6, 1, 196, 143, 217, 20, 99, 8, 6, - 1, 195, 157, 240, 180, 217, 20, 99, 8, 6, 1, 213, 195, 217, 20, 99, 230, - 91, 217, 20, 99, 163, 217, 20, 99, 187, 217, 20, 99, 251, 217, 217, 20, - 99, 197, 102, 46, 238, 174, 99, 244, 94, 99, 240, 233, 99, 234, 126, 99, - 230, 82, 99, 216, 255, 99, 216, 246, 99, 214, 68, 99, 205, 128, 99, 120, - 3, 235, 225, 78, 99, 198, 212, 99, 122, 240, 98, 99, 208, 92, 208, 110, - 99, 114, 224, 227, 99, 234, 145, 224, 227, 99, 236, 161, 224, 227, 99, - 234, 237, 212, 56, 98, 99, 207, 27, 212, 56, 98, 99, 200, 204, 212, 56, - 103, 99, 205, 229, 213, 195, 99, 106, 230, 202, 200, 215, 213, 195, 99, - 8, 4, 1, 240, 98, 99, 232, 35, 99, 232, 34, 99, 231, 206, 99, 221, 121, - 99, 206, 88, 99, 200, 74, 99, 198, 234, 210, 100, 225, 213, 16, 1, 63, - 210, 100, 225, 213, 16, 1, 249, 219, 210, 100, 225, 213, 16, 1, 247, 69, - 210, 100, 225, 213, 16, 1, 240, 98, 210, 100, 225, 213, 16, 1, 70, 210, - 100, 225, 213, 16, 1, 235, 184, 210, 100, 225, 213, 16, 1, 234, 71, 210, - 100, 225, 213, 16, 1, 232, 154, 210, 100, 225, 213, 16, 1, 68, 210, 100, - 225, 213, 16, 1, 225, 108, 210, 100, 225, 213, 16, 1, 224, 227, 210, 100, - 225, 213, 16, 1, 158, 210, 100, 225, 213, 16, 1, 221, 40, 210, 100, 225, - 213, 16, 1, 217, 225, 210, 100, 225, 213, 16, 1, 74, 210, 100, 225, 213, - 16, 1, 213, 195, 210, 100, 225, 213, 16, 1, 211, 116, 210, 100, 225, 213, - 16, 1, 143, 210, 100, 225, 213, 16, 1, 209, 35, 210, 100, 225, 213, 16, - 1, 203, 185, 210, 100, 225, 213, 16, 1, 66, 210, 100, 225, 213, 16, 1, - 199, 215, 210, 100, 225, 213, 16, 1, 197, 189, 210, 100, 225, 213, 16, 1, - 196, 216, 210, 100, 225, 213, 16, 1, 196, 143, 210, 100, 225, 213, 16, 1, - 195, 157, 46, 193, 231, 67, 99, 73, 223, 149, 99, 73, 187, 99, 12, 200, - 37, 228, 26, 99, 12, 200, 37, 228, 30, 99, 12, 200, 37, 228, 38, 99, 73, - 239, 119, 99, 12, 200, 37, 228, 45, 99, 12, 200, 37, 228, 32, 99, 12, - 200, 37, 228, 4, 99, 12, 200, 37, 228, 31, 99, 12, 200, 37, 228, 44, 99, - 12, 200, 37, 228, 18, 99, 12, 200, 37, 228, 11, 99, 12, 200, 37, 228, 20, - 99, 12, 200, 37, 228, 41, 99, 12, 200, 37, 228, 27, 99, 12, 200, 37, 228, - 43, 99, 12, 200, 37, 228, 19, 99, 12, 200, 37, 228, 42, 99, 12, 200, 37, - 228, 5, 99, 12, 200, 37, 228, 10, 99, 12, 200, 37, 228, 3, 99, 12, 200, - 37, 228, 33, 99, 12, 200, 37, 228, 35, 99, 12, 200, 37, 228, 13, 99, 12, - 200, 37, 228, 24, 99, 12, 200, 37, 228, 22, 99, 12, 200, 37, 228, 48, 99, - 12, 200, 37, 228, 47, 99, 12, 200, 37, 228, 1, 99, 12, 200, 37, 228, 28, - 99, 12, 200, 37, 228, 46, 99, 12, 200, 37, 228, 37, 99, 12, 200, 37, 228, - 23, 99, 12, 200, 37, 228, 2, 99, 12, 200, 37, 228, 25, 99, 12, 200, 37, - 228, 7, 99, 12, 200, 37, 228, 6, 99, 12, 200, 37, 228, 36, 99, 12, 200, - 37, 228, 14, 99, 12, 200, 37, 228, 16, 99, 12, 200, 37, 228, 17, 99, 12, - 200, 37, 228, 9, 99, 12, 200, 37, 228, 40, 99, 12, 200, 37, 228, 34, 99, - 12, 200, 37, 228, 0, 201, 210, 206, 201, 247, 175, 12, 200, 37, 228, 15, - 201, 210, 206, 201, 247, 175, 12, 200, 37, 228, 47, 201, 210, 206, 201, - 247, 175, 12, 200, 37, 228, 45, 201, 210, 206, 201, 247, 175, 12, 200, - 37, 228, 29, 201, 210, 206, 201, 247, 175, 12, 200, 37, 228, 12, 201, - 210, 206, 201, 247, 175, 12, 200, 37, 228, 25, 201, 210, 206, 201, 247, - 175, 12, 200, 37, 228, 8, 201, 210, 206, 201, 247, 175, 12, 200, 37, 228, - 39, 201, 210, 206, 201, 247, 175, 12, 200, 37, 228, 21, 45, 230, 79, 251, - 92, 45, 230, 79, 251, 120, 209, 139, 16, 38, 234, 104, 209, 139, 16, 38, - 221, 95, 209, 139, 16, 38, 206, 122, 209, 139, 16, 38, 196, 190, 209, - 139, 16, 38, 206, 105, 209, 139, 16, 38, 247, 24, 240, 109, 234, 186, - 244, 67, 200, 59, 216, 113, 3, 204, 224, 204, 73, 126, 218, 78, 204, 72, - 244, 98, 250, 19, 237, 47, 204, 71, 126, 247, 127, 210, 165, 247, 155, - 250, 19, 216, 112, 197, 120, 197, 114, 198, 228, 218, 196, 197, 104, 236, - 203, 233, 35, 235, 241, 236, 203, 233, 35, 250, 216, 236, 203, 233, 35, - 250, 38, 233, 35, 3, 219, 64, 217, 0, 218, 99, 102, 197, 106, 240, 193, - 218, 99, 102, 234, 249, 211, 37, 218, 99, 102, 197, 106, 233, 70, 218, - 99, 102, 234, 98, 218, 99, 102, 197, 134, 233, 70, 218, 99, 102, 222, - 123, 211, 37, 218, 99, 102, 197, 134, 240, 193, 218, 99, 102, 240, 193, - 218, 98, 217, 0, 218, 99, 3, 235, 112, 234, 249, 211, 37, 218, 99, 3, - 235, 112, 222, 123, 211, 37, 218, 99, 3, 235, 112, 234, 98, 218, 99, 3, - 235, 112, 204, 79, 3, 235, 112, 233, 31, 204, 227, 206, 144, 204, 227, - 202, 174, 64, 237, 82, 67, 204, 78, 67, 204, 79, 3, 4, 244, 58, 67, 204, - 79, 248, 90, 244, 58, 67, 204, 79, 248, 90, 244, 59, 3, 210, 166, 244, - 59, 3, 210, 166, 244, 59, 3, 205, 168, 244, 59, 3, 221, 250, 244, 59, 3, - 201, 214, 234, 187, 197, 45, 247, 234, 235, 112, 230, 240, 238, 143, 203, - 114, 247, 103, 244, 201, 208, 83, 235, 235, 201, 170, 239, 113, 201, 170, - 213, 145, 201, 170, 247, 29, 230, 240, 212, 246, 201, 4, 244, 205, 247, - 237, 209, 152, 231, 205, 204, 76, 247, 237, 236, 207, 77, 219, 232, 236, - 207, 77, 210, 11, 231, 239, 234, 145, 222, 95, 244, 57, 219, 202, 222, - 94, 235, 94, 222, 94, 222, 95, 234, 194, 225, 231, 197, 44, 218, 2, 201, - 243, 249, 255, 232, 246, 219, 82, 197, 118, 203, 76, 222, 63, 248, 198, - 212, 116, 210, 108, 250, 131, 232, 229, 250, 131, 213, 28, 213, 32, 244, - 206, 204, 176, 232, 103, 205, 201, 77, 212, 96, 219, 107, 214, 49, 247, - 218, 212, 11, 222, 74, 210, 12, 240, 199, 210, 12, 248, 210, 240, 236, - 210, 11, 240, 137, 26, 210, 11, 204, 212, 247, 188, 205, 106, 247, 167, - 234, 124, 234, 120, 209, 175, 204, 26, 212, 13, 239, 208, 214, 93, 204, - 45, 234, 121, 206, 114, 234, 248, 247, 23, 3, 204, 19, 239, 56, 205, 148, - 230, 90, 240, 197, 206, 219, 230, 89, 230, 90, 240, 197, 237, 109, 240, - 235, 244, 167, 153, 246, 250, 221, 148, 240, 128, 231, 56, 212, 15, 206, - 128, 248, 71, 247, 184, 212, 16, 77, 234, 176, 240, 234, 234, 165, 26, - 223, 172, 203, 25, 197, 31, 232, 72, 208, 203, 247, 201, 26, 240, 150, - 197, 41, 233, 39, 244, 42, 233, 39, 201, 125, 237, 88, 248, 101, 218, 41, - 244, 74, 248, 101, 218, 40, 248, 248, 247, 200, 234, 165, 26, 223, 173, - 3, 212, 84, 247, 201, 3, 212, 30, 240, 223, 212, 32, 210, 13, 196, 248, - 211, 229, 248, 10, 247, 22, 225, 102, 244, 158, 201, 170, 235, 77, 244, - 157, 234, 251, 234, 252, 205, 104, 248, 209, 213, 69, 212, 31, 241, 16, - 248, 210, 203, 80, 201, 170, 240, 180, 234, 223, 212, 117, 239, 110, 225, - 93, 238, 135, 246, 223, 204, 175, 197, 45, 244, 183, 218, 99, 199, 10, - 246, 142, 208, 123, 208, 153, 232, 252, 246, 244, 232, 13, 3, 202, 40, - 214, 49, 202, 187, 222, 86, 247, 194, 77, 234, 198, 218, 198, 219, 104, - 210, 80, 210, 13, 33, 224, 44, 3, 225, 101, 204, 146, 218, 232, 222, 30, - 205, 199, 240, 241, 223, 169, 248, 115, 250, 48, 33, 215, 183, 248, 115, - 239, 62, 33, 215, 183, 235, 11, 234, 130, 251, 96, 202, 81, 246, 224, - 230, 242, 235, 43, 197, 70, 209, 164, 244, 44, 234, 243, 212, 47, 26, - 234, 247, 218, 232, 218, 64, 247, 8, 244, 117, 232, 18, 250, 57, 213, - 148, 201, 222, 232, 50, 244, 103, 202, 240, 202, 82, 244, 89, 247, 227, - 212, 239, 250, 55, 199, 19, 233, 234, 238, 210, 231, 175, 205, 192, 220, - 20, 248, 23, 233, 235, 239, 0, 247, 187, 234, 200, 212, 83, 246, 232, 33, - 215, 188, 218, 32, 33, 215, 183, 208, 137, 232, 198, 33, 224, 43, 201, - 100, 198, 254, 33, 208, 115, 209, 69, 206, 158, 3, 208, 156, 202, 245, - 210, 185, 26, 248, 210, 205, 219, 26, 205, 219, 247, 211, 248, 170, 26, - 231, 49, 244, 207, 234, 229, 205, 167, 209, 70, 204, 50, 205, 69, 219, - 104, 201, 126, 230, 243, 210, 186, 250, 217, 234, 173, 209, 83, 234, 173, - 204, 21, 197, 86, 221, 255, 233, 16, 210, 187, 218, 85, 210, 187, 246, - 235, 240, 190, 248, 167, 26, 248, 210, 198, 227, 235, 32, 231, 70, 204, - 205, 26, 248, 210, 230, 90, 231, 70, 204, 205, 26, 211, 168, 203, 121, - 202, 245, 213, 167, 26, 248, 210, 205, 169, 246, 240, 218, 79, 247, 6, - 248, 118, 3, 200, 59, 247, 129, 240, 255, 230, 232, 247, 127, 244, 97, - 239, 66, 230, 232, 247, 128, 244, 87, 247, 128, 239, 58, 239, 59, 225, - 132, 217, 119, 213, 76, 204, 237, 230, 232, 247, 128, 230, 232, 3, 233, - 218, 214, 85, 247, 128, 225, 93, 212, 21, 214, 84, 235, 240, 212, 21, - 214, 84, 230, 241, 248, 194, 249, 245, 202, 253, 220, 20, 230, 237, 221, - 113, 230, 237, 240, 239, 204, 189, 208, 122, 239, 69, 204, 189, 235, 101, - 225, 113, 222, 135, 225, 93, 246, 213, 235, 240, 246, 213, 67, 213, 2, - 64, 213, 2, 197, 112, 67, 234, 229, 197, 112, 64, 234, 229, 209, 151, 64, - 209, 151, 222, 231, 248, 231, 210, 185, 26, 206, 91, 247, 192, 26, 51, - 250, 212, 236, 112, 71, 234, 238, 200, 181, 236, 112, 71, 234, 238, 200, - 178, 236, 112, 71, 234, 238, 200, 176, 236, 112, 71, 234, 238, 200, 174, - 236, 112, 71, 234, 238, 200, 172, 210, 147, 218, 76, 213, 204, 197, 120, - 247, 133, 240, 204, 202, 74, 222, 47, 210, 189, 246, 211, 237, 95, 240, - 188, 197, 73, 205, 176, 205, 174, 230, 242, 210, 159, 233, 22, 206, 205, - 218, 118, 209, 155, 244, 193, 238, 143, 212, 127, 247, 228, 236, 130, - 214, 96, 205, 84, 206, 200, 247, 132, 250, 173, 231, 55, 222, 223, 248, - 99, 234, 247, 201, 125, 234, 247, 247, 235, 200, 237, 232, 48, 244, 194, - 248, 248, 244, 194, 234, 114, 248, 248, 244, 194, 248, 13, 213, 4, 223, - 159, 212, 36, 237, 85, 247, 10, 248, 236, 247, 10, 238, 134, 218, 77, - 235, 112, 240, 205, 235, 112, 202, 75, 235, 112, 210, 190, 235, 112, 246, - 212, 235, 112, 237, 96, 235, 112, 205, 67, 197, 73, 230, 243, 235, 112, - 218, 119, 235, 112, 238, 144, 235, 112, 212, 128, 235, 112, 234, 118, - 235, 112, 232, 100, 235, 112, 197, 18, 235, 112, 248, 113, 235, 112, 213, - 126, 235, 112, 212, 128, 215, 195, 213, 47, 211, 215, 244, 178, 235, 194, - 235, 202, 236, 206, 215, 195, 218, 74, 201, 228, 67, 120, 212, 52, 248, - 243, 225, 216, 67, 133, 212, 52, 248, 243, 225, 216, 67, 50, 212, 52, - 248, 243, 225, 216, 67, 52, 212, 52, 248, 243, 225, 216, 234, 241, 232, - 95, 56, 197, 112, 232, 95, 56, 214, 69, 232, 95, 56, 202, 112, 120, 56, - 202, 112, 133, 56, 244, 88, 232, 70, 56, 185, 232, 70, 56, 240, 174, 197, - 14, 232, 50, 235, 197, 217, 24, 203, 183, 225, 83, 237, 90, 223, 226, - 248, 26, 197, 14, 244, 60, 211, 148, 232, 74, 212, 12, 219, 210, 206, - 150, 250, 14, 206, 150, 231, 190, 206, 150, 197, 14, 208, 171, 197, 14, - 247, 210, 234, 171, 247, 95, 225, 231, 206, 35, 247, 94, 225, 231, 206, - 35, 247, 182, 233, 51, 219, 222, 197, 15, 235, 91, 219, 223, 26, 197, 16, - 231, 64, 232, 69, 114, 219, 74, 231, 64, 232, 69, 114, 197, 13, 231, 64, - 232, 69, 212, 44, 214, 83, 197, 16, 3, 247, 113, 236, 204, 247, 156, 3, - 199, 96, 212, 228, 3, 247, 239, 232, 116, 219, 223, 3, 232, 211, 212, - 164, 219, 206, 219, 223, 3, 200, 246, 214, 61, 219, 222, 214, 61, 197, - 15, 248, 247, 241, 0, 196, 255, 211, 220, 225, 93, 214, 79, 225, 93, 233, - 21, 233, 82, 248, 248, 250, 197, 235, 207, 251, 0, 251, 1, 218, 108, 225, - 236, 205, 214, 225, 205, 239, 55, 212, 227, 232, 205, 239, 213, 221, 216, - 217, 143, 212, 43, 235, 113, 219, 169, 232, 115, 248, 188, 212, 46, 203, - 204, 212, 120, 223, 207, 78, 221, 113, 222, 37, 209, 210, 233, 176, 204, - 195, 223, 206, 247, 193, 240, 208, 3, 232, 12, 197, 93, 248, 109, 232, - 12, 247, 149, 232, 12, 114, 232, 10, 205, 102, 232, 12, 232, 221, 232, - 12, 232, 13, 3, 51, 247, 233, 232, 12, 232, 229, 232, 12, 196, 58, 232, - 12, 211, 149, 232, 12, 232, 13, 3, 210, 13, 210, 34, 232, 10, 232, 13, - 239, 110, 239, 9, 206, 233, 3, 39, 76, 225, 186, 236, 133, 167, 247, 125, - 250, 196, 102, 247, 219, 205, 204, 102, 244, 34, 102, 205, 78, 204, 28, - 102, 237, 82, 239, 189, 102, 212, 121, 77, 212, 37, 234, 212, 248, 38, - 238, 175, 102, 205, 94, 248, 209, 202, 132, 248, 209, 67, 234, 199, 230, - 202, 212, 50, 102, 218, 123, 248, 229, 240, 140, 235, 227, 85, 238, 136, - 56, 240, 195, 246, 233, 248, 193, 3, 196, 56, 56, 248, 193, 3, 238, 136, - 56, 248, 193, 3, 235, 243, 56, 248, 193, 3, 212, 10, 56, 218, 123, 3, - 197, 39, 244, 231, 3, 200, 8, 201, 166, 26, 196, 56, 56, 208, 95, 212, - 226, 241, 21, 247, 154, 218, 186, 234, 204, 238, 197, 214, 7, 238, 202, - 237, 42, 235, 18, 234, 184, 185, 235, 18, 234, 184, 213, 165, 3, 240, - 144, 213, 165, 235, 105, 200, 20, 247, 16, 203, 24, 247, 16, 246, 234, - 225, 216, 244, 231, 3, 200, 8, 201, 165, 244, 231, 3, 237, 103, 201, 165, - 248, 190, 244, 230, 244, 73, 211, 144, 209, 141, 211, 144, 213, 99, 204, - 185, 209, 77, 201, 157, 209, 77, 247, 215, 203, 119, 222, 91, 215, 186, - 215, 187, 3, 239, 109, 240, 207, 244, 67, 247, 216, 185, 247, 216, 232, - 229, 247, 216, 247, 233, 247, 216, 214, 2, 247, 216, 247, 213, 217, 137, - 248, 233, 208, 108, 219, 75, 203, 2, 210, 122, 213, 163, 235, 74, 220, - 20, 208, 152, 250, 170, 211, 169, 251, 103, 221, 115, 244, 215, 219, 87, - 213, 223, 201, 174, 225, 227, 201, 174, 213, 172, 237, 3, 102, 225, 224, - 236, 71, 236, 72, 3, 237, 103, 59, 57, 244, 67, 219, 238, 3, 221, 105, - 234, 229, 244, 67, 219, 238, 3, 210, 164, 234, 229, 185, 219, 238, 3, - 210, 164, 234, 229, 185, 219, 238, 3, 221, 105, 234, 229, 212, 18, 212, - 19, 230, 246, 216, 251, 218, 152, 212, 172, 218, 152, 212, 173, 3, 90, - 59, 250, 19, 222, 86, 199, 22, 218, 151, 218, 152, 212, 173, 214, 86, - 215, 226, 218, 152, 212, 171, 250, 171, 3, 248, 178, 247, 8, 247, 9, 3, - 234, 221, 199, 19, 247, 8, 202, 255, 210, 180, 199, 18, 235, 11, 211, - 202, 212, 27, 204, 206, 211, 243, 248, 117, 200, 200, 90, 250, 64, 244, - 69, 90, 26, 104, 185, 244, 114, 250, 64, 244, 69, 90, 26, 104, 185, 244, - 114, 250, 65, 3, 45, 106, 213, 211, 244, 69, 237, 103, 26, 200, 8, 185, - 244, 114, 250, 64, 250, 169, 237, 103, 26, 200, 8, 185, 244, 114, 250, - 64, 125, 247, 153, 102, 128, 247, 153, 102, 205, 99, 3, 247, 1, 101, 205, - 98, 205, 99, 3, 106, 205, 124, 197, 114, 205, 99, 3, 122, 205, 124, 197, - 113, 248, 160, 236, 133, 212, 75, 222, 81, 219, 250, 233, 39, 209, 225, - 219, 250, 233, 39, 221, 159, 3, 225, 197, 213, 8, 244, 67, 221, 159, 3, - 224, 45, 224, 45, 221, 158, 185, 221, 158, 248, 83, 248, 84, 3, 247, 1, - 101, 247, 214, 221, 224, 102, 210, 181, 247, 89, 248, 246, 3, 104, 59, - 57, 236, 98, 3, 104, 59, 57, 214, 49, 3, 235, 225, 113, 3, 50, 52, 59, - 57, 205, 132, 3, 90, 59, 57, 201, 222, 3, 200, 8, 59, 57, 215, 226, 106, - 200, 47, 236, 159, 102, 224, 42, 202, 248, 225, 191, 16, 38, 8, 6, 222, - 36, 225, 191, 16, 38, 8, 4, 222, 36, 225, 191, 16, 38, 215, 68, 225, 191, - 16, 38, 203, 218, 225, 191, 16, 38, 8, 222, 36, 234, 254, 236, 133, 201, - 217, 196, 246, 232, 101, 215, 51, 26, 247, 221, 231, 71, 212, 102, 218, - 231, 203, 0, 240, 164, 248, 210, 205, 242, 212, 54, 204, 228, 3, 108, - 238, 123, 225, 93, 16, 38, 248, 96, 201, 155, 236, 114, 64, 46, 247, 89, - 67, 46, 247, 89, 222, 130, 210, 108, 244, 113, 222, 130, 247, 233, 244, - 113, 222, 130, 214, 2, 239, 8, 222, 130, 247, 233, 239, 8, 4, 214, 2, - 239, 8, 4, 247, 233, 239, 8, 200, 19, 210, 108, 201, 160, 237, 105, 210, - 108, 201, 160, 200, 19, 4, 210, 108, 201, 160, 237, 105, 4, 210, 108, - 201, 160, 221, 107, 52, 206, 249, 67, 244, 113, 200, 17, 52, 206, 249, - 67, 244, 113, 45, 240, 183, 212, 40, 240, 183, 212, 41, 3, 232, 107, 58, - 240, 183, 212, 40, 215, 190, 50, 207, 64, 3, 122, 238, 120, 215, 190, 52, - 207, 64, 3, 122, 238, 120, 16, 38, 219, 184, 246, 121, 67, 8, 240, 182, - 85, 8, 240, 182, 246, 160, 240, 182, 214, 57, 102, 237, 108, 77, 213, 33, - 224, 200, 218, 91, 203, 212, 219, 70, 3, 216, 97, 247, 170, 247, 189, 77, - 230, 153, 244, 71, 235, 113, 106, 214, 102, 244, 71, 235, 113, 114, 214, - 102, 244, 71, 235, 113, 122, 214, 102, 244, 71, 235, 113, 234, 145, 214, - 102, 244, 71, 235, 113, 234, 237, 214, 102, 244, 71, 235, 113, 205, 242, - 214, 102, 244, 71, 235, 113, 207, 27, 214, 102, 244, 71, 235, 113, 236, - 161, 214, 102, 244, 71, 235, 113, 216, 97, 214, 102, 244, 71, 235, 113, - 202, 249, 214, 102, 244, 71, 235, 113, 236, 128, 214, 102, 244, 71, 235, - 113, 200, 220, 214, 102, 244, 71, 235, 113, 214, 42, 244, 71, 235, 113, - 200, 194, 244, 71, 235, 113, 202, 118, 244, 71, 235, 113, 234, 141, 244, - 71, 235, 113, 234, 235, 244, 71, 235, 113, 205, 238, 244, 71, 235, 113, - 207, 26, 244, 71, 235, 113, 236, 160, 244, 71, 235, 113, 216, 96, 244, - 71, 235, 113, 202, 247, 244, 71, 235, 113, 236, 126, 244, 71, 235, 113, - 200, 218, 52, 205, 98, 52, 205, 99, 3, 106, 205, 124, 197, 114, 52, 205, - 99, 3, 122, 205, 124, 197, 113, 247, 120, 247, 121, 3, 205, 124, 197, - 113, 209, 209, 248, 83, 247, 216, 246, 255, 219, 207, 244, 70, 64, 205, - 215, 26, 240, 181, 215, 226, 212, 108, 231, 63, 219, 223, 225, 231, 247, - 97, 204, 92, 222, 29, 205, 202, 214, 4, 205, 58, 239, 194, 204, 74, 205, - 87, 205, 88, 197, 94, 225, 2, 219, 223, 239, 212, 50, 232, 95, 203, 2, - 210, 122, 203, 2, 210, 123, 3, 213, 164, 52, 232, 95, 203, 2, 210, 122, - 67, 201, 203, 203, 1, 64, 201, 203, 203, 1, 203, 2, 214, 49, 201, 222, - 77, 218, 148, 244, 92, 218, 152, 212, 172, 248, 246, 77, 236, 71, 204, - 233, 236, 71, 236, 72, 3, 221, 250, 234, 191, 236, 71, 213, 9, 126, 204, - 233, 236, 71, 221, 223, 213, 98, 64, 211, 144, 221, 107, 50, 213, 7, 221, - 107, 50, 248, 205, 213, 8, 221, 107, 50, 234, 147, 213, 8, 221, 107, 50, - 213, 157, 221, 107, 50, 240, 198, 50, 196, 240, 232, 94, 200, 240, 214, - 69, 232, 95, 56, 210, 164, 232, 95, 3, 235, 3, 205, 77, 210, 40, 210, - 164, 232, 95, 3, 235, 3, 205, 77, 210, 40, 202, 112, 120, 56, 210, 40, - 202, 112, 133, 56, 210, 40, 199, 21, 232, 94, 210, 40, 232, 95, 3, 108, - 235, 8, 235, 213, 210, 164, 232, 95, 3, 213, 74, 248, 59, 108, 26, 209, - 211, 235, 2, 67, 133, 212, 52, 50, 232, 95, 225, 216, 206, 53, 67, 50, - 212, 52, 225, 216, 206, 53, 67, 52, 212, 52, 225, 216, 206, 53, 64, 50, - 212, 52, 225, 216, 206, 53, 64, 52, 212, 52, 225, 216, 64, 50, 212, 52, - 248, 243, 225, 216, 64, 52, 212, 52, 248, 243, 225, 216, 206, 53, 67, - 120, 212, 52, 225, 216, 206, 53, 67, 133, 212, 52, 225, 216, 206, 53, 64, - 120, 212, 52, 225, 216, 206, 53, 64, 133, 212, 52, 225, 216, 64, 120, - 212, 52, 248, 243, 225, 216, 64, 133, 212, 52, 248, 243, 225, 216, 64, - 232, 12, 239, 54, 241, 21, 224, 44, 26, 218, 76, 122, 217, 4, 241, 20, - 211, 216, 212, 60, 247, 18, 64, 232, 58, 206, 201, 234, 204, 238, 197, - 67, 232, 58, 206, 201, 234, 204, 238, 197, 205, 148, 206, 201, 234, 204, - 238, 197, 203, 72, 246, 217, 197, 34, 224, 43, 106, 247, 90, 218, 76, - 114, 247, 90, 218, 76, 122, 247, 90, 218, 76, 201, 194, 36, 212, 226, - 241, 21, 232, 58, 238, 197, 208, 110, 211, 217, 230, 83, 235, 74, 230, - 83, 214, 7, 238, 203, 230, 83, 238, 148, 3, 202, 206, 238, 148, 3, 202, - 207, 26, 212, 157, 238, 148, 3, 212, 157, 234, 132, 3, 212, 157, 234, - 132, 3, 202, 54, 234, 132, 3, 250, 209, 196, 216, 64, 234, 184, 234, 184, - 185, 234, 184, 246, 234, 131, 238, 182, 246, 234, 235, 18, 247, 184, 235, - 18, 247, 31, 236, 108, 215, 188, 236, 108, 215, 189, 213, 164, 236, 108, - 215, 189, 213, 170, 215, 188, 215, 189, 213, 164, 215, 189, 213, 170, - 236, 108, 238, 147, 236, 108, 213, 164, 236, 108, 213, 162, 238, 147, - 213, 164, 213, 162, 197, 124, 205, 84, 215, 189, 213, 170, 205, 84, 247, - 17, 213, 170, 239, 54, 197, 43, 218, 183, 219, 159, 213, 213, 244, 69, - 52, 26, 50, 207, 64, 250, 64, 247, 1, 196, 216, 225, 222, 234, 178, 205, - 225, 102, 239, 108, 234, 178, 205, 225, 102, 241, 22, 36, 224, 45, 209, - 165, 216, 251, 213, 165, 3, 45, 202, 206, 204, 197, 244, 230, 239, 242, - 223, 172, 221, 217, 205, 97, 232, 23, 225, 231, 206, 35, 122, 210, 138, - 57, 122, 210, 138, 58, 122, 210, 138, 222, 86, 122, 210, 138, 209, 230, - 50, 205, 94, 247, 137, 52, 205, 94, 247, 137, 114, 205, 94, 247, 136, - 122, 205, 94, 247, 136, 50, 202, 132, 247, 137, 52, 202, 132, 247, 137, - 50, 250, 196, 247, 137, 52, 250, 196, 247, 137, 218, 103, 247, 137, 221, - 251, 218, 103, 247, 137, 221, 251, 218, 102, 248, 207, 107, 3, 248, 206, - 248, 207, 144, 196, 216, 248, 207, 107, 3, 144, 196, 216, 248, 207, 27, - 144, 196, 216, 248, 207, 107, 3, 27, 144, 196, 216, 167, 244, 222, 78, - 248, 207, 107, 3, 27, 244, 221, 196, 254, 219, 204, 218, 81, 234, 99, - 201, 245, 201, 199, 204, 219, 77, 222, 9, 206, 36, 77, 225, 94, 218, 62, - 232, 225, 235, 112, 232, 225, 235, 113, 3, 205, 180, 235, 194, 235, 113, - 3, 203, 20, 77, 225, 4, 205, 180, 235, 113, 3, 185, 218, 74, 205, 180, - 235, 113, 3, 185, 218, 75, 26, 205, 180, 235, 194, 205, 180, 235, 113, 3, - 185, 218, 75, 26, 244, 36, 204, 27, 205, 180, 235, 113, 3, 185, 218, 75, - 26, 202, 72, 235, 194, 205, 180, 235, 113, 3, 232, 106, 205, 180, 235, - 113, 3, 230, 245, 197, 36, 235, 112, 205, 180, 235, 113, 3, 205, 180, - 235, 194, 235, 113, 208, 142, 239, 88, 234, 176, 210, 83, 235, 112, 205, - 180, 235, 113, 3, 232, 11, 235, 194, 205, 180, 235, 113, 3, 204, 74, 205, - 179, 235, 112, 217, 2, 235, 112, 235, 215, 235, 112, 200, 53, 235, 112, - 235, 113, 3, 244, 36, 204, 27, 213, 0, 235, 112, 241, 13, 235, 112, 241, - 14, 235, 112, 223, 205, 235, 112, 235, 113, 202, 115, 39, 223, 206, 223, - 205, 235, 113, 3, 205, 180, 235, 194, 223, 205, 235, 113, 3, 244, 67, - 235, 194, 235, 113, 3, 204, 147, 201, 228, 235, 113, 3, 204, 147, 201, - 229, 26, 197, 36, 235, 202, 235, 113, 3, 204, 147, 201, 229, 26, 202, 72, - 235, 194, 238, 204, 235, 112, 196, 253, 235, 112, 250, 189, 235, 112, - 212, 9, 235, 112, 240, 166, 235, 112, 212, 230, 235, 112, 235, 113, 3, - 221, 132, 77, 201, 137, 238, 204, 247, 93, 210, 83, 235, 112, 234, 110, - 235, 113, 3, 185, 218, 74, 250, 187, 235, 112, 235, 67, 235, 112, 197, - 95, 235, 112, 205, 203, 235, 112, 202, 34, 235, 112, 232, 226, 235, 112, - 221, 116, 240, 166, 235, 112, 235, 113, 3, 185, 218, 74, 230, 191, 235, - 112, 235, 113, 3, 185, 218, 75, 26, 244, 36, 204, 27, 235, 113, 208, 112, - 225, 231, 235, 68, 250, 26, 235, 112, 234, 196, 235, 112, 205, 204, 235, - 112, 238, 175, 235, 112, 235, 113, 197, 31, 218, 74, 235, 113, 3, 219, - 102, 219, 171, 232, 225, 246, 212, 235, 113, 3, 205, 180, 235, 194, 246, - 212, 235, 113, 3, 203, 20, 77, 225, 4, 205, 180, 246, 212, 235, 113, 3, - 185, 218, 74, 205, 180, 246, 212, 235, 113, 3, 232, 11, 235, 194, 246, - 212, 235, 113, 3, 196, 238, 205, 181, 223, 205, 246, 212, 235, 113, 3, - 244, 67, 235, 194, 212, 9, 246, 212, 235, 112, 240, 166, 246, 212, 235, - 112, 197, 95, 246, 212, 235, 112, 205, 197, 234, 110, 235, 112, 205, 197, - 205, 180, 235, 112, 200, 14, 235, 112, 235, 113, 3, 209, 163, 235, 194, - 235, 113, 3, 215, 226, 233, 13, 233, 153, 235, 113, 3, 214, 69, 233, 153, - 212, 228, 247, 190, 239, 103, 208, 84, 218, 118, 232, 14, 218, 118, 205, - 100, 218, 118, 232, 61, 212, 228, 210, 162, 106, 232, 94, 212, 228, 210, - 162, 247, 202, 232, 70, 225, 231, 246, 162, 212, 228, 234, 109, 212, 228, - 3, 212, 9, 235, 112, 212, 228, 3, 234, 185, 232, 69, 164, 197, 81, 212, - 52, 222, 94, 205, 121, 197, 81, 212, 52, 222, 94, 164, 236, 199, 212, 52, - 222, 94, 205, 121, 236, 199, 212, 52, 222, 94, 200, 240, 164, 197, 81, - 212, 52, 222, 94, 200, 240, 205, 121, 197, 81, 212, 52, 222, 94, 200, - 240, 164, 236, 199, 212, 52, 222, 94, 200, 240, 205, 121, 236, 199, 212, - 52, 222, 94, 164, 197, 81, 212, 52, 199, 4, 222, 94, 205, 121, 197, 81, - 212, 52, 199, 4, 222, 94, 164, 236, 199, 212, 52, 199, 4, 222, 94, 205, - 121, 236, 199, 212, 52, 199, 4, 222, 94, 85, 164, 197, 81, 212, 52, 199, - 4, 222, 94, 85, 205, 121, 197, 81, 212, 52, 199, 4, 222, 94, 85, 164, - 236, 199, 212, 52, 199, 4, 222, 94, 85, 205, 121, 236, 199, 212, 52, 199, - 4, 222, 94, 164, 197, 81, 212, 52, 247, 134, 205, 121, 197, 81, 212, 52, - 247, 134, 164, 236, 199, 212, 52, 247, 134, 205, 121, 236, 199, 212, 52, - 247, 134, 85, 164, 197, 81, 212, 52, 247, 134, 85, 205, 121, 197, 81, - 212, 52, 247, 134, 85, 164, 236, 199, 212, 52, 247, 134, 85, 205, 121, - 236, 199, 212, 52, 247, 134, 231, 62, 211, 21, 46, 213, 247, 231, 62, - 211, 21, 46, 213, 248, 225, 231, 64, 205, 57, 205, 141, 211, 21, 46, 213, - 247, 205, 141, 211, 21, 46, 213, 248, 225, 231, 64, 205, 57, 104, 209, - 170, 200, 8, 209, 170, 90, 209, 170, 237, 103, 209, 170, 144, 32, 236, 8, - 213, 247, 85, 144, 32, 236, 8, 213, 247, 32, 185, 236, 8, 213, 247, 85, - 32, 185, 236, 8, 213, 247, 85, 250, 214, 213, 247, 204, 30, 250, 214, - 213, 247, 44, 85, 54, 200, 240, 244, 24, 211, 11, 113, 213, 247, 44, 85, - 54, 244, 24, 211, 11, 113, 213, 247, 44, 85, 125, 54, 244, 24, 211, 11, - 113, 213, 247, 85, 225, 172, 213, 247, 44, 225, 172, 213, 247, 85, 44, - 225, 172, 213, 247, 199, 36, 85, 205, 139, 199, 36, 85, 210, 41, 205, - 139, 244, 220, 247, 227, 210, 41, 244, 220, 247, 227, 209, 170, 231, 250, - 204, 214, 221, 156, 210, 169, 246, 235, 231, 187, 201, 187, 231, 187, - 201, 188, 3, 247, 123, 215, 195, 201, 187, 219, 45, 167, 210, 170, 204, - 220, 201, 185, 201, 186, 246, 235, 247, 98, 214, 45, 247, 98, 201, 133, - 247, 99, 204, 193, 218, 187, 250, 218, 234, 255, 236, 91, 212, 44, 246, - 235, 214, 45, 212, 44, 246, 235, 203, 46, 214, 45, 203, 46, 249, 244, - 214, 45, 249, 244, 210, 115, 199, 97, 239, 84, 201, 124, 250, 58, 221, - 123, 201, 193, 218, 111, 218, 80, 210, 168, 204, 44, 210, 168, 218, 80, - 247, 30, 251, 76, 201, 184, 206, 163, 209, 138, 205, 92, 231, 43, 201, - 191, 221, 253, 83, 201, 191, 221, 253, 241, 0, 56, 212, 44, 246, 219, - 210, 34, 221, 253, 201, 157, 234, 230, 214, 49, 212, 20, 238, 127, 215, - 226, 236, 77, 56, 205, 178, 102, 215, 226, 205, 178, 102, 211, 143, 221, - 206, 225, 231, 225, 122, 212, 93, 102, 238, 155, 215, 194, 221, 206, 102, - 212, 14, 197, 120, 102, 215, 210, 197, 120, 102, 248, 37, 215, 226, 248, - 36, 248, 35, 218, 80, 248, 35, 213, 24, 215, 226, 213, 23, 244, 185, 240, - 175, 219, 69, 102, 197, 12, 102, 210, 50, 248, 248, 102, 201, 246, 197, - 120, 244, 64, 206, 119, 248, 163, 248, 161, 213, 58, 240, 240, 240, 126, - 248, 225, 244, 93, 50, 221, 85, 201, 161, 3, 209, 139, 240, 220, 211, - 205, 56, 45, 225, 205, 205, 122, 247, 181, 102, 233, 50, 102, 240, 213, - 26, 222, 140, 205, 204, 251, 119, 206, 142, 248, 224, 248, 82, 248, 83, - 248, 106, 212, 93, 77, 196, 252, 214, 99, 56, 206, 142, 201, 134, 204, - 143, 213, 161, 232, 102, 26, 196, 246, 206, 176, 214, 74, 237, 79, 218, - 84, 210, 169, 201, 195, 218, 86, 247, 226, 200, 19, 218, 198, 251, 33, - 200, 19, 251, 33, 200, 19, 4, 251, 33, 4, 251, 33, 215, 199, 251, 33, - 251, 34, 239, 68, 251, 34, 250, 70, 208, 151, 214, 45, 234, 255, 236, 91, - 238, 254, 221, 156, 213, 62, 206, 163, 208, 116, 218, 86, 208, 116, 246, - 246, 205, 206, 234, 191, 208, 146, 205, 221, 148, 16, 38, 211, 17, 148, - 16, 38, 251, 35, 148, 16, 38, 234, 254, 148, 16, 38, 236, 202, 148, 16, - 38, 197, 119, 148, 16, 38, 250, 120, 148, 16, 38, 250, 121, 210, 102, - 148, 16, 38, 250, 121, 210, 101, 148, 16, 38, 250, 121, 198, 243, 148, - 16, 38, 250, 121, 198, 242, 148, 16, 38, 199, 1, 148, 16, 38, 199, 0, - 148, 16, 38, 198, 255, 148, 16, 38, 204, 85, 148, 16, 38, 212, 181, 204, - 85, 148, 16, 38, 64, 204, 85, 148, 16, 38, 219, 68, 204, 116, 148, 16, - 38, 219, 68, 204, 115, 148, 16, 38, 219, 68, 204, 114, 148, 16, 38, 244, - 116, 148, 16, 38, 208, 188, 148, 16, 38, 216, 85, 148, 16, 38, 198, 241, - 148, 16, 38, 198, 240, 148, 16, 38, 209, 171, 208, 188, 148, 16, 38, 209, - 171, 208, 187, 148, 16, 38, 233, 17, 148, 16, 38, 206, 32, 148, 16, 38, - 225, 145, 213, 254, 148, 16, 38, 225, 145, 213, 253, 148, 16, 38, 240, - 187, 77, 225, 144, 148, 16, 38, 210, 98, 77, 225, 144, 148, 16, 38, 240, - 231, 213, 254, 148, 16, 38, 225, 143, 213, 254, 148, 16, 38, 204, 117, - 77, 240, 230, 148, 16, 38, 240, 187, 77, 240, 230, 148, 16, 38, 240, 187, - 77, 240, 229, 148, 16, 38, 240, 231, 250, 163, 148, 16, 38, 208, 189, 77, - 240, 231, 250, 163, 148, 16, 38, 204, 117, 77, 208, 189, 77, 240, 230, - 148, 16, 38, 199, 92, 148, 16, 38, 202, 47, 213, 254, 148, 16, 38, 222, - 98, 213, 254, 148, 16, 38, 250, 162, 213, 254, 148, 16, 38, 204, 117, 77, - 250, 161, 148, 16, 38, 208, 189, 77, 250, 161, 148, 16, 38, 204, 117, 77, - 208, 189, 77, 250, 161, 148, 16, 38, 199, 2, 77, 250, 161, 148, 16, 38, - 210, 98, 77, 250, 161, 148, 16, 38, 210, 98, 77, 250, 160, 148, 16, 38, - 210, 97, 148, 16, 38, 210, 96, 148, 16, 38, 210, 95, 148, 16, 38, 210, - 94, 148, 16, 38, 250, 251, 148, 16, 38, 250, 250, 148, 16, 38, 219, 195, - 148, 16, 38, 208, 195, 148, 16, 38, 250, 63, 148, 16, 38, 210, 126, 148, - 16, 38, 210, 125, 148, 16, 38, 249, 247, 148, 16, 38, 248, 4, 213, 254, - 148, 16, 38, 203, 67, 148, 16, 38, 203, 66, 148, 16, 38, 211, 23, 221, - 242, 148, 16, 38, 247, 207, 148, 16, 38, 247, 206, 148, 16, 38, 247, 205, - 148, 16, 38, 250, 227, 148, 16, 38, 214, 73, 148, 16, 38, 205, 80, 148, - 16, 38, 202, 45, 148, 16, 38, 232, 194, 148, 16, 38, 197, 107, 148, 16, - 38, 212, 8, 148, 16, 38, 247, 13, 148, 16, 38, 200, 232, 148, 16, 38, - 246, 237, 218, 92, 148, 16, 38, 208, 126, 77, 225, 6, 148, 16, 38, 247, - 27, 148, 16, 38, 201, 154, 148, 16, 38, 204, 225, 201, 154, 148, 16, 38, - 221, 155, 148, 16, 38, 205, 153, 148, 16, 38, 199, 253, 148, 16, 38, 230, - 243, 237, 57, 148, 16, 38, 250, 40, 148, 16, 38, 212, 16, 250, 40, 148, - 16, 38, 247, 157, 148, 16, 38, 212, 7, 247, 157, 148, 16, 38, 250, 224, - 148, 16, 38, 204, 180, 204, 66, 204, 179, 148, 16, 38, 204, 180, 204, 66, - 204, 178, 148, 16, 38, 204, 113, 148, 16, 38, 211, 236, 148, 16, 38, 238, - 192, 148, 16, 38, 238, 194, 148, 16, 38, 238, 193, 148, 16, 38, 211, 152, - 148, 16, 38, 211, 141, 148, 16, 38, 240, 173, 148, 16, 38, 240, 172, 148, - 16, 38, 240, 171, 148, 16, 38, 240, 170, 148, 16, 38, 240, 169, 148, 16, - 38, 251, 9, 148, 16, 38, 248, 164, 77, 219, 177, 148, 16, 38, 248, 164, - 77, 199, 124, 148, 16, 38, 210, 48, 148, 16, 38, 230, 235, 148, 16, 38, - 216, 112, 148, 16, 38, 239, 176, 148, 16, 38, 218, 106, 148, 16, 38, 155, - 237, 93, 148, 16, 38, 155, 213, 227, 64, 222, 81, 225, 128, 52, 201, 160, - 64, 200, 19, 225, 128, 52, 201, 160, 64, 209, 225, 225, 128, 52, 201, - 160, 64, 237, 105, 225, 128, 52, 201, 160, 64, 205, 197, 4, 244, 113, - 219, 99, 27, 67, 244, 113, 27, 67, 244, 113, 85, 67, 244, 113, 199, 36, - 85, 67, 244, 113, 235, 206, 85, 67, 244, 113, 67, 244, 114, 240, 252, 64, - 4, 244, 113, 209, 141, 203, 68, 64, 202, 42, 205, 57, 64, 205, 197, 4, - 205, 57, 167, 67, 205, 57, 219, 99, 67, 205, 57, 27, 67, 205, 57, 85, 67, - 205, 57, 199, 36, 85, 67, 205, 57, 235, 206, 85, 67, 205, 57, 67, 46, - 240, 252, 64, 199, 36, 4, 205, 57, 67, 46, 240, 252, 64, 219, 99, 205, - 57, 46, 203, 68, 64, 202, 42, 239, 8, 64, 199, 36, 4, 239, 8, 64, 219, - 99, 4, 239, 8, 67, 239, 9, 240, 252, 64, 199, 36, 4, 239, 8, 67, 239, 9, - 240, 252, 64, 219, 99, 239, 8, 239, 9, 203, 68, 64, 202, 42, 221, 102, - 64, 199, 36, 4, 221, 102, 64, 219, 99, 4, 221, 102, 67, 221, 103, 240, - 252, 64, 4, 221, 102, 202, 157, 31, 240, 182, 167, 31, 240, 182, 219, 99, - 31, 240, 182, 27, 31, 240, 182, 199, 36, 27, 31, 240, 182, 199, 36, 85, - 31, 240, 182, 235, 206, 85, 31, 240, 182, 202, 157, 208, 185, 167, 208, - 185, 219, 99, 208, 185, 27, 208, 185, 85, 208, 185, 199, 36, 85, 208, - 185, 235, 206, 85, 208, 185, 167, 234, 237, 205, 73, 250, 29, 219, 99, - 234, 237, 205, 73, 250, 29, 27, 234, 237, 205, 73, 250, 29, 85, 234, 237, - 205, 73, 250, 29, 199, 36, 85, 234, 237, 205, 73, 250, 29, 235, 206, 85, - 234, 237, 205, 73, 250, 29, 167, 205, 242, 205, 73, 250, 29, 219, 99, - 205, 242, 205, 73, 250, 29, 27, 205, 242, 205, 73, 250, 29, 85, 205, 242, - 205, 73, 250, 29, 199, 36, 85, 205, 242, 205, 73, 250, 29, 235, 206, 85, - 205, 242, 205, 73, 250, 29, 167, 236, 161, 205, 73, 250, 29, 219, 99, - 236, 161, 205, 73, 250, 29, 27, 236, 161, 205, 73, 250, 29, 85, 236, 161, - 205, 73, 250, 29, 199, 36, 85, 236, 161, 205, 73, 250, 29, 167, 122, 212, - 54, 64, 204, 227, 219, 99, 122, 212, 54, 64, 204, 227, 122, 212, 54, 64, - 204, 227, 219, 99, 122, 212, 54, 212, 114, 204, 227, 167, 234, 145, 212, - 54, 64, 204, 227, 219, 99, 234, 145, 212, 54, 64, 204, 227, 234, 145, - 212, 54, 64, 204, 227, 219, 99, 234, 145, 212, 54, 212, 114, 204, 227, - 210, 41, 167, 234, 145, 212, 54, 212, 114, 204, 227, 167, 234, 237, 212, - 54, 64, 204, 227, 85, 234, 237, 212, 54, 64, 204, 227, 219, 99, 205, 242, - 212, 54, 64, 204, 227, 85, 205, 242, 212, 54, 64, 204, 227, 205, 242, - 212, 54, 212, 114, 204, 227, 219, 99, 236, 161, 212, 54, 64, 204, 227, - 85, 236, 161, 212, 54, 64, 204, 227, 199, 36, 85, 236, 161, 212, 54, 64, - 204, 227, 85, 236, 161, 212, 54, 212, 114, 204, 227, 167, 200, 220, 212, - 54, 64, 204, 227, 85, 200, 220, 212, 54, 64, 204, 227, 85, 200, 220, 212, - 54, 212, 114, 204, 227, 45, 201, 160, 217, 20, 45, 201, 160, 45, 205, 57, - 217, 20, 45, 205, 57, 104, 59, 3, 4, 201, 161, 250, 67, 200, 8, 59, 3, 4, - 201, 161, 250, 67, 90, 59, 3, 4, 201, 161, 250, 67, 237, 103, 59, 3, 4, - 201, 161, 250, 67, 104, 59, 3, 219, 99, 201, 161, 250, 67, 200, 8, 59, 3, - 219, 99, 201, 161, 250, 67, 90, 59, 3, 219, 99, 201, 161, 250, 67, 237, - 103, 59, 3, 219, 99, 201, 161, 250, 67, 104, 59, 3, 222, 130, 201, 161, - 250, 67, 200, 8, 59, 3, 222, 130, 201, 161, 250, 67, 90, 59, 3, 222, 130, - 201, 161, 250, 67, 237, 103, 59, 3, 222, 130, 201, 161, 250, 67, 104, 59, - 3, 4, 236, 45, 250, 67, 200, 8, 59, 3, 4, 236, 45, 250, 67, 90, 59, 3, 4, - 236, 45, 250, 67, 237, 103, 59, 3, 4, 236, 45, 250, 67, 104, 59, 3, 236, - 45, 250, 67, 200, 8, 59, 3, 236, 45, 250, 67, 90, 59, 3, 236, 45, 250, - 67, 237, 103, 59, 3, 236, 45, 250, 67, 85, 104, 59, 3, 236, 45, 250, 67, - 85, 200, 8, 59, 3, 236, 45, 250, 67, 85, 90, 59, 3, 236, 45, 250, 67, 85, - 237, 103, 59, 3, 236, 45, 250, 67, 85, 104, 59, 3, 222, 130, 236, 45, - 250, 67, 85, 200, 8, 59, 3, 222, 130, 236, 45, 250, 67, 85, 90, 59, 3, - 222, 130, 236, 45, 250, 67, 85, 237, 103, 59, 3, 222, 130, 236, 45, 250, - 67, 104, 201, 159, 59, 3, 217, 125, 206, 247, 200, 8, 201, 159, 59, 3, - 217, 125, 206, 247, 90, 201, 159, 59, 3, 217, 125, 206, 247, 237, 103, - 201, 159, 59, 3, 217, 125, 206, 247, 104, 201, 159, 59, 3, 219, 99, 206, - 247, 200, 8, 201, 159, 59, 3, 219, 99, 206, 247, 90, 201, 159, 59, 3, - 219, 99, 206, 247, 237, 103, 201, 159, 59, 3, 219, 99, 206, 247, 104, - 201, 159, 59, 3, 27, 206, 247, 200, 8, 201, 159, 59, 3, 27, 206, 247, 90, - 201, 159, 59, 3, 27, 206, 247, 237, 103, 201, 159, 59, 3, 27, 206, 247, - 104, 201, 159, 59, 3, 85, 206, 247, 200, 8, 201, 159, 59, 3, 85, 206, - 247, 90, 201, 159, 59, 3, 85, 206, 247, 237, 103, 201, 159, 59, 3, 85, - 206, 247, 104, 201, 159, 59, 3, 199, 36, 85, 206, 247, 200, 8, 201, 159, - 59, 3, 199, 36, 85, 206, 247, 90, 201, 159, 59, 3, 199, 36, 85, 206, 247, - 237, 103, 201, 159, 59, 3, 199, 36, 85, 206, 247, 104, 235, 6, 51, 200, - 8, 235, 6, 51, 90, 235, 6, 51, 237, 103, 235, 6, 51, 104, 99, 51, 200, 8, - 99, 51, 90, 99, 51, 237, 103, 99, 51, 104, 241, 23, 51, 200, 8, 241, 23, - 51, 90, 241, 23, 51, 237, 103, 241, 23, 51, 104, 85, 241, 23, 51, 200, 8, - 85, 241, 23, 51, 90, 85, 241, 23, 51, 237, 103, 85, 241, 23, 51, 104, 85, - 51, 200, 8, 85, 51, 90, 85, 51, 237, 103, 85, 51, 104, 44, 51, 200, 8, - 44, 51, 90, 44, 51, 237, 103, 44, 51, 164, 197, 81, 44, 51, 164, 236, - 199, 44, 51, 205, 121, 236, 199, 44, 51, 205, 121, 197, 81, 44, 51, 50, - 52, 44, 51, 120, 133, 44, 51, 197, 55, 104, 167, 161, 51, 197, 55, 200, - 8, 167, 161, 51, 197, 55, 90, 167, 161, 51, 197, 55, 237, 103, 167, 161, - 51, 197, 55, 164, 197, 81, 167, 161, 51, 197, 55, 164, 236, 199, 167, - 161, 51, 197, 55, 205, 121, 236, 199, 167, 161, 51, 197, 55, 205, 121, - 197, 81, 167, 161, 51, 197, 55, 104, 161, 51, 197, 55, 200, 8, 161, 51, - 197, 55, 90, 161, 51, 197, 55, 237, 103, 161, 51, 197, 55, 164, 197, 81, - 161, 51, 197, 55, 164, 236, 199, 161, 51, 197, 55, 205, 121, 236, 199, - 161, 51, 197, 55, 205, 121, 197, 81, 161, 51, 197, 55, 104, 219, 99, 161, - 51, 197, 55, 200, 8, 219, 99, 161, 51, 197, 55, 90, 219, 99, 161, 51, - 197, 55, 237, 103, 219, 99, 161, 51, 197, 55, 164, 197, 81, 219, 99, 161, - 51, 197, 55, 164, 236, 199, 219, 99, 161, 51, 197, 55, 205, 121, 236, - 199, 219, 99, 161, 51, 197, 55, 205, 121, 197, 81, 219, 99, 161, 51, 197, - 55, 104, 85, 161, 51, 197, 55, 200, 8, 85, 161, 51, 197, 55, 90, 85, 161, - 51, 197, 55, 237, 103, 85, 161, 51, 197, 55, 164, 197, 81, 85, 161, 51, - 197, 55, 164, 236, 199, 85, 161, 51, 197, 55, 205, 121, 236, 199, 85, - 161, 51, 197, 55, 205, 121, 197, 81, 85, 161, 51, 197, 55, 104, 199, 36, - 85, 161, 51, 197, 55, 200, 8, 199, 36, 85, 161, 51, 197, 55, 90, 199, 36, - 85, 161, 51, 197, 55, 237, 103, 199, 36, 85, 161, 51, 197, 55, 164, 197, - 81, 199, 36, 85, 161, 51, 197, 55, 164, 236, 199, 199, 36, 85, 161, 51, - 197, 55, 205, 121, 236, 199, 199, 36, 85, 161, 51, 197, 55, 205, 121, - 197, 81, 199, 36, 85, 161, 51, 104, 201, 161, 250, 67, 200, 8, 201, 161, - 250, 67, 90, 201, 161, 250, 67, 237, 103, 201, 161, 250, 67, 104, 67, 59, - 197, 33, 201, 161, 250, 67, 200, 8, 67, 59, 197, 33, 201, 161, 250, 67, - 90, 67, 59, 197, 33, 201, 161, 250, 67, 237, 103, 67, 59, 197, 33, 201, - 161, 250, 67, 104, 59, 3, 215, 190, 203, 103, 200, 8, 59, 3, 215, 190, - 203, 103, 90, 59, 3, 215, 190, 203, 103, 237, 103, 59, 3, 215, 190, 203, - 103, 85, 59, 206, 248, 197, 53, 98, 85, 59, 206, 248, 197, 53, 114, 202, - 151, 85, 59, 206, 248, 197, 53, 106, 232, 108, 85, 59, 206, 248, 197, 53, - 106, 202, 154, 104, 247, 196, 67, 51, 90, 247, 199, 206, 250, 67, 51, - 104, 201, 222, 206, 250, 67, 51, 90, 201, 222, 206, 250, 67, 51, 104, - 222, 80, 67, 51, 90, 209, 224, 67, 51, 104, 209, 224, 67, 51, 90, 222, - 80, 67, 51, 104, 248, 244, 206, 249, 67, 51, 90, 248, 244, 206, 249, 67, - 51, 104, 234, 113, 206, 249, 67, 51, 90, 234, 113, 206, 249, 67, 51, 67, - 59, 206, 248, 197, 53, 98, 67, 59, 206, 248, 197, 53, 114, 202, 151, 45, - 240, 183, 234, 158, 3, 234, 145, 238, 120, 45, 240, 183, 234, 158, 3, - 114, 238, 120, 45, 240, 183, 234, 157, 50, 155, 244, 114, 3, 234, 145, - 238, 120, 50, 155, 244, 114, 3, 122, 238, 120, 50, 155, 244, 114, 3, 114, - 238, 120, 50, 155, 244, 114, 3, 238, 123, 50, 155, 244, 113, 237, 104, - 235, 105, 124, 237, 104, 235, 105, 215, 190, 124, 237, 104, 235, 105, - 231, 53, 3, 238, 123, 237, 104, 235, 105, 215, 190, 231, 53, 3, 238, 123, - 195, 20, 235, 112, 218, 122, 235, 112, 235, 113, 3, 202, 174, 217, 9, - 235, 112, 202, 156, 235, 112, 235, 113, 3, 232, 21, 209, 173, 235, 112, - 230, 210, 235, 112, 2, 77, 202, 187, 230, 245, 247, 15, 219, 115, 232, - 94, 210, 164, 248, 246, 77, 232, 94, 222, 85, 234, 242, 209, 229, 234, - 242, 232, 68, 232, 95, 3, 131, 26, 108, 235, 3, 240, 179, 230, 137, 221, - 113, 195, 229, 232, 95, 56, 235, 113, 3, 240, 203, 232, 50, 244, 56, 235, - 112, 217, 114, 235, 112, 209, 163, 214, 49, 202, 187, 234, 207, 222, 116, - 237, 84, 235, 112, 221, 50, 235, 112, 235, 113, 213, 144, 205, 172, 235, - 112, 235, 113, 3, 106, 235, 201, 210, 163, 232, 225, 235, 113, 3, 204, - 228, 235, 194, 232, 225, 235, 113, 3, 106, 222, 130, 26, 106, 4, 235, - 202, 235, 113, 3, 235, 8, 240, 206, 244, 67, 221, 217, 207, 38, 235, 113, - 3, 203, 219, 240, 206, 218, 74, 205, 180, 235, 113, 3, 205, 180, 235, - 195, 26, 232, 95, 240, 206, 218, 74, 235, 113, 3, 185, 218, 75, 198, 223, - 206, 152, 235, 113, 3, 235, 217, 232, 22, 211, 233, 197, 15, 247, 164, - 213, 143, 120, 201, 247, 207, 67, 211, 221, 219, 223, 225, 231, 200, 228, - 218, 88, 244, 157, 206, 112, 212, 228, 238, 140, 246, 216, 224, 252, 235, - 48, 218, 147, 212, 251, 196, 245, 197, 120, 212, 42, 232, 73, 197, 47, - 234, 199, 237, 80, 3, 237, 78, 244, 74, 233, 38, 201, 0, 233, 39, 205, - 70, 233, 24, 217, 5, 209, 231, 234, 249, 212, 93, 219, 104, 208, 92, 212, - 93, 219, 104, 202, 155, 212, 93, 219, 104, 247, 183, 233, 33, 219, 181, - 250, 56, 200, 36, 240, 142, 204, 195, 222, 224, 204, 205, 26, 248, 210, - 205, 147, 234, 191, 238, 202, 240, 186, 249, 235, 240, 156, 248, 237, - 212, 13, 246, 220, 248, 223, 247, 167, 232, 229, 208, 193, 206, 240, 213, - 130, 77, 234, 176, 204, 144, 234, 218, 236, 175, 233, 40, 77, 218, 197, - 213, 29, 223, 201, 213, 127, 237, 62, 234, 153, 240, 235, 203, 95, 247, - 184, 244, 163, 247, 189, 3, 205, 70, 240, 151, 3, 204, 177, 244, 41, 247, - 150, 212, 156, 211, 225, 240, 125, 77, 219, 106, 208, 169, 246, 248, 234, - 176, 222, 93, 232, 228, 219, 214, 218, 99, 247, 22, 248, 226, 205, 180, - 235, 113, 3, 205, 180, 235, 195, 26, 122, 232, 10, 235, 113, 3, 213, 69, - 230, 247, 26, 213, 69, 232, 50, 235, 113, 3, 200, 40, 235, 195, 26, 197, - 111, 218, 74, 213, 215, 235, 112, 234, 125, 235, 112, 235, 113, 3, 212, - 81, 235, 194, 222, 233, 244, 43, 233, 20, 231, 185, 247, 211, 234, 220, - 206, 150, 240, 200, 221, 221, 235, 112, 208, 114, 200, 245, 200, 38, 235, - 112, 236, 209, 237, 70, 248, 166, 206, 226, 213, 206, 234, 137, 235, 112, - 247, 91, 239, 102, 233, 6, 221, 200, 210, 27, 206, 114, 205, 51, 233, 52, - 235, 112, 195, 86, 235, 112, 232, 5, 208, 143, 203, 184, 240, 189, 224, - 160, 221, 192, 213, 31, 231, 178, 213, 75, 210, 188, 221, 164, 218, 90, - 218, 233, 248, 232, 204, 32, 236, 112, 244, 13, 210, 108, 232, 116, 236, - 112, 244, 13, 240, 141, 232, 116, 236, 112, 244, 13, 248, 212, 236, 112, - 244, 13, 67, 232, 116, 247, 218, 222, 74, 234, 174, 201, 223, 204, 64, - 204, 59, 244, 214, 197, 92, 240, 149, 208, 189, 206, 244, 235, 113, 3, - 218, 117, 251, 94, 244, 186, 214, 61, 251, 94, 248, 111, 212, 227, 212, - 228, 3, 232, 17, 212, 228, 225, 231, 204, 211, 209, 156, 212, 228, 244, - 76, 212, 228, 225, 231, 221, 118, 212, 24, 219, 252, 235, 96, 199, 127, - 219, 61, 236, 125, 233, 169, 195, 9, 247, 174, 214, 2, 232, 12, 248, 24, - 246, 244, 208, 127, 233, 32, 244, 43, 205, 150, 210, 108, 233, 64, 236, - 71, 234, 253, 225, 57, 211, 137, 212, 155, 202, 228, 201, 10, 212, 212, - 238, 199, 238, 156, 54, 231, 249, 244, 18, 251, 133, 234, 255, 235, 211, - 201, 225, 247, 157, 219, 251, 221, 85, 221, 119, 247, 200, 205, 71, 77, - 202, 127, 248, 211, 77, 196, 84, 208, 215, 212, 119, 203, 19, 248, 112, - 247, 147, 248, 171, 209, 166, 77, 213, 100, 248, 190, 77, 205, 153, 205, - 72, 210, 124, 217, 108, 250, 210, 196, 188, 210, 108, 233, 171, 196, 188, - 210, 108, 219, 216, 196, 188, 210, 108, 236, 130, 196, 188, 210, 108, - 230, 242, 196, 188, 210, 108, 244, 232, 196, 188, 210, 108, 246, 247, - 196, 188, 210, 108, 205, 142, 196, 188, 64, 233, 171, 196, 188, 64, 219, - 216, 196, 188, 64, 236, 130, 196, 188, 64, 230, 242, 196, 188, 64, 244, - 232, 196, 188, 64, 246, 247, 196, 188, 64, 205, 142, 12, 15, 230, 78, 12, - 15, 230, 77, 12, 15, 230, 76, 12, 15, 230, 75, 12, 15, 230, 74, 12, 15, - 230, 73, 12, 15, 230, 72, 12, 15, 230, 71, 12, 15, 230, 70, 12, 15, 230, - 69, 12, 15, 230, 68, 12, 15, 230, 67, 12, 15, 230, 66, 12, 15, 230, 65, - 12, 15, 230, 64, 12, 15, 230, 63, 12, 15, 230, 62, 12, 15, 230, 61, 12, - 15, 230, 60, 12, 15, 230, 59, 12, 15, 230, 58, 12, 15, 230, 57, 12, 15, - 230, 56, 12, 15, 230, 55, 12, 15, 230, 54, 12, 15, 230, 53, 12, 15, 230, - 52, 12, 15, 230, 51, 12, 15, 230, 50, 12, 15, 230, 49, 12, 15, 230, 48, - 12, 15, 230, 47, 12, 15, 230, 46, 12, 15, 230, 45, 12, 15, 230, 44, 12, - 15, 230, 43, 12, 15, 230, 42, 12, 15, 230, 41, 12, 15, 230, 40, 12, 15, - 230, 39, 12, 15, 230, 38, 12, 15, 230, 37, 12, 15, 230, 36, 12, 15, 230, - 35, 12, 15, 230, 34, 12, 15, 230, 33, 12, 15, 230, 32, 12, 15, 230, 31, - 12, 15, 230, 30, 12, 15, 230, 29, 12, 15, 230, 28, 12, 15, 230, 27, 12, - 15, 230, 26, 12, 15, 230, 25, 12, 15, 230, 24, 12, 15, 230, 23, 12, 15, - 230, 22, 12, 15, 230, 21, 12, 15, 230, 20, 12, 15, 230, 19, 12, 15, 230, - 18, 12, 15, 230, 17, 12, 15, 230, 16, 12, 15, 230, 15, 12, 15, 230, 14, - 12, 15, 230, 13, 12, 15, 230, 12, 12, 15, 230, 11, 12, 15, 230, 10, 12, - 15, 230, 9, 12, 15, 230, 8, 12, 15, 230, 7, 12, 15, 230, 6, 12, 15, 230, - 5, 12, 15, 230, 4, 12, 15, 230, 3, 12, 15, 230, 2, 12, 15, 230, 1, 12, - 15, 230, 0, 12, 15, 229, 255, 12, 15, 229, 254, 12, 15, 229, 253, 12, 15, - 229, 252, 12, 15, 229, 251, 12, 15, 229, 250, 12, 15, 229, 249, 12, 15, - 229, 248, 12, 15, 229, 247, 12, 15, 229, 246, 12, 15, 229, 245, 12, 15, - 229, 244, 12, 15, 229, 243, 12, 15, 229, 242, 12, 15, 229, 241, 12, 15, - 229, 240, 12, 15, 229, 239, 12, 15, 229, 238, 12, 15, 229, 237, 12, 15, - 229, 236, 12, 15, 229, 235, 12, 15, 229, 234, 12, 15, 229, 233, 12, 15, - 229, 232, 12, 15, 229, 231, 12, 15, 229, 230, 12, 15, 229, 229, 12, 15, - 229, 228, 12, 15, 229, 227, 12, 15, 229, 226, 12, 15, 229, 225, 12, 15, - 229, 224, 12, 15, 229, 223, 12, 15, 229, 222, 12, 15, 229, 221, 12, 15, - 229, 220, 12, 15, 229, 219, 12, 15, 229, 218, 12, 15, 229, 217, 12, 15, - 229, 216, 12, 15, 229, 215, 12, 15, 229, 214, 12, 15, 229, 213, 12, 15, - 229, 212, 12, 15, 229, 211, 12, 15, 229, 210, 12, 15, 229, 209, 12, 15, - 229, 208, 12, 15, 229, 207, 12, 15, 229, 206, 12, 15, 229, 205, 12, 15, - 229, 204, 12, 15, 229, 203, 12, 15, 229, 202, 12, 15, 229, 201, 12, 15, - 229, 200, 12, 15, 229, 199, 12, 15, 229, 198, 12, 15, 229, 197, 12, 15, - 229, 196, 12, 15, 229, 195, 12, 15, 229, 194, 12, 15, 229, 193, 12, 15, - 229, 192, 12, 15, 229, 191, 12, 15, 229, 190, 12, 15, 229, 189, 12, 15, - 229, 188, 12, 15, 229, 187, 12, 15, 229, 186, 12, 15, 229, 185, 12, 15, - 229, 184, 12, 15, 229, 183, 12, 15, 229, 182, 12, 15, 229, 181, 12, 15, - 229, 180, 12, 15, 229, 179, 12, 15, 229, 178, 12, 15, 229, 177, 12, 15, - 229, 176, 12, 15, 229, 175, 12, 15, 229, 174, 12, 15, 229, 173, 12, 15, - 229, 172, 12, 15, 229, 171, 12, 15, 229, 170, 12, 15, 229, 169, 12, 15, - 229, 168, 12, 15, 229, 167, 12, 15, 229, 166, 12, 15, 229, 165, 12, 15, - 229, 164, 12, 15, 229, 163, 12, 15, 229, 162, 12, 15, 229, 161, 12, 15, - 229, 160, 12, 15, 229, 159, 12, 15, 229, 158, 12, 15, 229, 157, 12, 15, - 229, 156, 12, 15, 229, 155, 12, 15, 229, 154, 12, 15, 229, 153, 12, 15, - 229, 152, 12, 15, 229, 151, 12, 15, 229, 150, 12, 15, 229, 149, 12, 15, - 229, 148, 12, 15, 229, 147, 12, 15, 229, 146, 12, 15, 229, 145, 12, 15, - 229, 144, 12, 15, 229, 143, 12, 15, 229, 142, 12, 15, 229, 141, 12, 15, - 229, 140, 12, 15, 229, 139, 12, 15, 229, 138, 12, 15, 229, 137, 12, 15, - 229, 136, 12, 15, 229, 135, 12, 15, 229, 134, 12, 15, 229, 133, 12, 15, - 229, 132, 12, 15, 229, 131, 12, 15, 229, 130, 12, 15, 229, 129, 12, 15, - 229, 128, 12, 15, 229, 127, 12, 15, 229, 126, 12, 15, 229, 125, 12, 15, - 229, 124, 12, 15, 229, 123, 12, 15, 229, 122, 12, 15, 229, 121, 12, 15, - 229, 120, 12, 15, 229, 119, 12, 15, 229, 118, 12, 15, 229, 117, 12, 15, - 229, 116, 12, 15, 229, 115, 12, 15, 229, 114, 12, 15, 229, 113, 12, 15, - 229, 112, 12, 15, 229, 111, 12, 15, 229, 110, 12, 15, 229, 109, 12, 15, - 229, 108, 12, 15, 229, 107, 12, 15, 229, 106, 12, 15, 229, 105, 12, 15, - 229, 104, 12, 15, 229, 103, 12, 15, 229, 102, 12, 15, 229, 101, 12, 15, - 229, 100, 12, 15, 229, 99, 12, 15, 229, 98, 12, 15, 229, 97, 12, 15, 229, - 96, 12, 15, 229, 95, 12, 15, 229, 94, 12, 15, 229, 93, 12, 15, 229, 92, - 12, 15, 229, 91, 12, 15, 229, 90, 12, 15, 229, 89, 12, 15, 229, 88, 12, - 15, 229, 87, 12, 15, 229, 86, 12, 15, 229, 85, 12, 15, 229, 84, 12, 15, - 229, 83, 12, 15, 229, 82, 12, 15, 229, 81, 12, 15, 229, 80, 12, 15, 229, - 79, 12, 15, 229, 78, 12, 15, 229, 77, 12, 15, 229, 76, 12, 15, 229, 75, - 12, 15, 229, 74, 12, 15, 229, 73, 12, 15, 229, 72, 12, 15, 229, 71, 12, - 15, 229, 70, 12, 15, 229, 69, 12, 15, 229, 68, 12, 15, 229, 67, 12, 15, - 229, 66, 12, 15, 229, 65, 12, 15, 229, 64, 12, 15, 229, 63, 12, 15, 229, - 62, 12, 15, 229, 61, 12, 15, 229, 60, 12, 15, 229, 59, 12, 15, 229, 58, - 12, 15, 229, 57, 12, 15, 229, 56, 12, 15, 229, 55, 12, 15, 229, 54, 12, - 15, 229, 53, 12, 15, 229, 52, 12, 15, 229, 51, 12, 15, 229, 50, 12, 15, - 229, 49, 12, 15, 229, 48, 12, 15, 229, 47, 12, 15, 229, 46, 12, 15, 229, - 45, 12, 15, 229, 44, 12, 15, 229, 43, 12, 15, 229, 42, 12, 15, 229, 41, - 12, 15, 229, 40, 12, 15, 229, 39, 12, 15, 229, 38, 12, 15, 229, 37, 12, - 15, 229, 36, 12, 15, 229, 35, 12, 15, 229, 34, 12, 15, 229, 33, 12, 15, - 229, 32, 12, 15, 229, 31, 12, 15, 229, 30, 12, 15, 229, 29, 12, 15, 229, - 28, 12, 15, 229, 27, 12, 15, 229, 26, 12, 15, 229, 25, 12, 15, 229, 24, - 12, 15, 229, 23, 12, 15, 229, 22, 12, 15, 229, 21, 12, 15, 229, 20, 12, - 15, 229, 19, 12, 15, 229, 18, 12, 15, 229, 17, 12, 15, 229, 16, 12, 15, - 229, 15, 12, 15, 229, 14, 12, 15, 229, 13, 12, 15, 229, 12, 12, 15, 229, - 11, 12, 15, 229, 10, 12, 15, 229, 9, 12, 15, 229, 8, 12, 15, 229, 7, 12, - 15, 229, 6, 12, 15, 229, 5, 12, 15, 229, 4, 12, 15, 229, 3, 12, 15, 229, - 2, 12, 15, 229, 1, 12, 15, 229, 0, 12, 15, 228, 255, 12, 15, 228, 254, - 12, 15, 228, 253, 12, 15, 228, 252, 12, 15, 228, 251, 12, 15, 228, 250, - 12, 15, 228, 249, 12, 15, 228, 248, 12, 15, 228, 247, 12, 15, 228, 246, - 12, 15, 228, 245, 12, 15, 228, 244, 12, 15, 228, 243, 12, 15, 228, 242, - 12, 15, 228, 241, 12, 15, 228, 240, 12, 15, 228, 239, 12, 15, 228, 238, - 12, 15, 228, 237, 12, 15, 228, 236, 12, 15, 228, 235, 12, 15, 228, 234, - 12, 15, 228, 233, 12, 15, 228, 232, 12, 15, 228, 231, 12, 15, 228, 230, - 12, 15, 228, 229, 12, 15, 228, 228, 12, 15, 228, 227, 12, 15, 228, 226, - 12, 15, 228, 225, 12, 15, 228, 224, 12, 15, 228, 223, 12, 15, 228, 222, - 12, 15, 228, 221, 12, 15, 228, 220, 12, 15, 228, 219, 12, 15, 228, 218, - 12, 15, 228, 217, 12, 15, 228, 216, 12, 15, 228, 215, 12, 15, 228, 214, - 12, 15, 228, 213, 12, 15, 228, 212, 12, 15, 228, 211, 12, 15, 228, 210, - 12, 15, 228, 209, 12, 15, 228, 208, 12, 15, 228, 207, 12, 15, 228, 206, - 12, 15, 228, 205, 12, 15, 228, 204, 12, 15, 228, 203, 12, 15, 228, 202, - 12, 15, 228, 201, 12, 15, 228, 200, 12, 15, 228, 199, 12, 15, 228, 198, - 12, 15, 228, 197, 12, 15, 228, 196, 12, 15, 228, 195, 12, 15, 228, 194, - 12, 15, 228, 193, 12, 15, 228, 192, 12, 15, 228, 191, 12, 15, 228, 190, - 12, 15, 228, 189, 12, 15, 228, 188, 12, 15, 228, 187, 12, 15, 228, 186, - 12, 15, 228, 185, 12, 15, 228, 184, 12, 15, 228, 183, 12, 15, 228, 182, - 12, 15, 228, 181, 12, 15, 228, 180, 12, 15, 228, 179, 12, 15, 228, 178, - 12, 15, 228, 177, 12, 15, 228, 176, 12, 15, 228, 175, 12, 15, 228, 174, - 12, 15, 228, 173, 12, 15, 228, 172, 12, 15, 228, 171, 12, 15, 228, 170, - 12, 15, 228, 169, 12, 15, 228, 168, 12, 15, 228, 167, 12, 15, 228, 166, - 12, 15, 228, 165, 12, 15, 228, 164, 12, 15, 228, 163, 12, 15, 228, 162, - 12, 15, 228, 161, 12, 15, 228, 160, 12, 15, 228, 159, 12, 15, 228, 158, - 12, 15, 228, 157, 12, 15, 228, 156, 12, 15, 228, 155, 12, 15, 228, 154, - 12, 15, 228, 153, 12, 15, 228, 152, 12, 15, 228, 151, 12, 15, 228, 150, - 12, 15, 228, 149, 12, 15, 228, 148, 12, 15, 228, 147, 12, 15, 228, 146, - 12, 15, 228, 145, 12, 15, 228, 144, 12, 15, 228, 143, 12, 15, 228, 142, - 12, 15, 228, 141, 12, 15, 228, 140, 12, 15, 228, 139, 12, 15, 228, 138, - 12, 15, 228, 137, 12, 15, 228, 136, 12, 15, 228, 135, 12, 15, 228, 134, - 12, 15, 228, 133, 12, 15, 228, 132, 12, 15, 228, 131, 12, 15, 228, 130, - 12, 15, 228, 129, 12, 15, 228, 128, 12, 15, 228, 127, 12, 15, 228, 126, - 12, 15, 228, 125, 12, 15, 228, 124, 12, 15, 228, 123, 12, 15, 228, 122, - 12, 15, 228, 121, 12, 15, 228, 120, 12, 15, 228, 119, 12, 15, 228, 118, - 12, 15, 228, 117, 12, 15, 228, 116, 12, 15, 228, 115, 12, 15, 228, 114, - 12, 15, 228, 113, 12, 15, 228, 112, 12, 15, 228, 111, 12, 15, 228, 110, - 12, 15, 228, 109, 12, 15, 228, 108, 12, 15, 228, 107, 12, 15, 228, 106, - 12, 15, 228, 105, 12, 15, 228, 104, 12, 15, 228, 103, 12, 15, 228, 102, - 12, 15, 228, 101, 12, 15, 228, 100, 12, 15, 228, 99, 12, 15, 228, 98, 12, - 15, 228, 97, 12, 15, 228, 96, 12, 15, 228, 95, 12, 15, 228, 94, 12, 15, - 228, 93, 12, 15, 228, 92, 12, 15, 228, 91, 12, 15, 228, 90, 12, 15, 228, - 89, 12, 15, 228, 88, 12, 15, 228, 87, 12, 15, 228, 86, 12, 15, 228, 85, - 12, 15, 228, 84, 12, 15, 228, 83, 12, 15, 228, 82, 12, 15, 228, 81, 12, - 15, 228, 80, 12, 15, 228, 79, 12, 15, 228, 78, 12, 15, 228, 77, 12, 15, - 228, 76, 12, 15, 228, 75, 12, 15, 228, 74, 12, 15, 228, 73, 12, 15, 228, - 72, 12, 15, 228, 71, 12, 15, 228, 70, 12, 15, 228, 69, 12, 15, 228, 68, - 12, 15, 228, 67, 12, 15, 228, 66, 12, 15, 228, 65, 12, 15, 228, 64, 12, - 15, 228, 63, 12, 15, 228, 62, 12, 15, 228, 61, 12, 15, 228, 60, 12, 15, - 228, 59, 12, 15, 228, 58, 12, 15, 228, 57, 12, 15, 228, 56, 12, 15, 228, - 55, 12, 15, 228, 54, 12, 15, 228, 53, 12, 15, 228, 52, 12, 15, 228, 51, - 12, 15, 228, 50, 12, 15, 228, 49, 222, 136, 203, 111, 176, 205, 110, 176, - 235, 225, 78, 176, 211, 11, 78, 176, 35, 56, 176, 238, 136, 56, 176, 212, - 244, 56, 176, 250, 213, 176, 250, 134, 176, 50, 213, 80, 176, 52, 213, - 80, 176, 250, 29, 176, 96, 56, 176, 244, 23, 176, 230, 150, 176, 234, 98, - 204, 193, 176, 205, 139, 176, 17, 195, 79, 176, 17, 98, 176, 17, 103, - 176, 17, 135, 176, 17, 136, 176, 17, 150, 176, 17, 174, 176, 17, 182, - 176, 17, 178, 176, 17, 184, 176, 244, 32, 176, 207, 61, 176, 222, 42, 56, - 176, 236, 49, 56, 176, 232, 232, 56, 176, 211, 28, 78, 176, 244, 21, 250, - 18, 176, 8, 6, 1, 63, 176, 8, 6, 1, 249, 219, 176, 8, 6, 1, 247, 69, 176, - 8, 6, 1, 240, 98, 176, 8, 6, 1, 70, 176, 8, 6, 1, 235, 184, 176, 8, 6, 1, - 234, 71, 176, 8, 6, 1, 232, 154, 176, 8, 6, 1, 68, 176, 8, 6, 1, 225, - 108, 176, 8, 6, 1, 224, 227, 176, 8, 6, 1, 158, 176, 8, 6, 1, 221, 40, - 176, 8, 6, 1, 217, 225, 176, 8, 6, 1, 74, 176, 8, 6, 1, 213, 195, 176, 8, - 6, 1, 211, 116, 176, 8, 6, 1, 143, 176, 8, 6, 1, 209, 35, 176, 8, 6, 1, - 203, 185, 176, 8, 6, 1, 66, 176, 8, 6, 1, 199, 215, 176, 8, 6, 1, 197, - 189, 176, 8, 6, 1, 196, 216, 176, 8, 6, 1, 196, 143, 176, 8, 6, 1, 195, - 157, 176, 50, 46, 170, 176, 210, 41, 205, 139, 176, 52, 46, 170, 176, - 244, 105, 251, 122, 176, 125, 221, 233, 176, 232, 239, 251, 122, 176, 8, - 4, 1, 63, 176, 8, 4, 1, 249, 219, 176, 8, 4, 1, 247, 69, 176, 8, 4, 1, - 240, 98, 176, 8, 4, 1, 70, 176, 8, 4, 1, 235, 184, 176, 8, 4, 1, 234, 71, - 176, 8, 4, 1, 232, 154, 176, 8, 4, 1, 68, 176, 8, 4, 1, 225, 108, 176, 8, - 4, 1, 224, 227, 176, 8, 4, 1, 158, 176, 8, 4, 1, 221, 40, 176, 8, 4, 1, - 217, 225, 176, 8, 4, 1, 74, 176, 8, 4, 1, 213, 195, 176, 8, 4, 1, 211, - 116, 176, 8, 4, 1, 143, 176, 8, 4, 1, 209, 35, 176, 8, 4, 1, 203, 185, - 176, 8, 4, 1, 66, 176, 8, 4, 1, 199, 215, 176, 8, 4, 1, 197, 189, 176, 8, - 4, 1, 196, 216, 176, 8, 4, 1, 196, 143, 176, 8, 4, 1, 195, 157, 176, 50, - 240, 141, 170, 176, 83, 221, 233, 176, 52, 240, 141, 170, 176, 202, 56, - 247, 3, 203, 111, 60, 207, 247, 60, 207, 236, 60, 207, 225, 60, 207, 213, - 60, 207, 202, 60, 207, 191, 60, 207, 180, 60, 207, 169, 60, 207, 158, 60, - 207, 150, 60, 207, 149, 60, 207, 148, 60, 207, 147, 60, 207, 145, 60, - 207, 144, 60, 207, 143, 60, 207, 142, 60, 207, 141, 60, 207, 140, 60, - 207, 139, 60, 207, 138, 60, 207, 137, 60, 207, 136, 60, 207, 134, 60, - 207, 133, 60, 207, 132, 60, 207, 131, 60, 207, 130, 60, 207, 129, 60, - 207, 128, 60, 207, 127, 60, 207, 126, 60, 207, 125, 60, 207, 123, 60, - 207, 122, 60, 207, 121, 60, 207, 120, 60, 207, 119, 60, 207, 118, 60, - 207, 117, 60, 207, 116, 60, 207, 115, 60, 207, 114, 60, 207, 112, 60, - 207, 111, 60, 207, 110, 60, 207, 109, 60, 207, 108, 60, 207, 107, 60, - 207, 106, 60, 207, 105, 60, 207, 104, 60, 207, 103, 60, 207, 101, 60, - 207, 100, 60, 207, 99, 60, 207, 98, 60, 207, 97, 60, 207, 96, 60, 207, - 95, 60, 207, 94, 60, 207, 93, 60, 207, 92, 60, 207, 90, 60, 207, 89, 60, - 207, 88, 60, 207, 87, 60, 207, 86, 60, 207, 85, 60, 207, 84, 60, 207, 83, - 60, 207, 82, 60, 207, 81, 60, 207, 79, 60, 207, 78, 60, 207, 77, 60, 207, - 76, 60, 207, 75, 60, 207, 74, 60, 207, 73, 60, 207, 72, 60, 207, 71, 60, - 207, 70, 60, 208, 67, 60, 208, 66, 60, 208, 65, 60, 208, 64, 60, 208, 63, - 60, 208, 62, 60, 208, 61, 60, 208, 60, 60, 208, 59, 60, 208, 58, 60, 208, - 56, 60, 208, 55, 60, 208, 54, 60, 208, 53, 60, 208, 52, 60, 208, 51, 60, - 208, 50, 60, 208, 49, 60, 208, 48, 60, 208, 47, 60, 208, 45, 60, 208, 44, - 60, 208, 43, 60, 208, 42, 60, 208, 41, 60, 208, 40, 60, 208, 39, 60, 208, - 38, 60, 208, 37, 60, 208, 36, 60, 208, 34, 60, 208, 33, 60, 208, 32, 60, - 208, 31, 60, 208, 30, 60, 208, 29, 60, 208, 28, 60, 208, 27, 60, 208, 26, - 60, 208, 25, 60, 208, 23, 60, 208, 22, 60, 208, 21, 60, 208, 20, 60, 208, - 19, 60, 208, 18, 60, 208, 17, 60, 208, 16, 60, 208, 15, 60, 208, 14, 60, - 208, 12, 60, 208, 11, 60, 208, 10, 60, 208, 9, 60, 208, 8, 60, 208, 7, - 60, 208, 6, 60, 208, 5, 60, 208, 4, 60, 208, 3, 60, 208, 1, 60, 208, 0, - 60, 207, 255, 60, 207, 254, 60, 207, 253, 60, 207, 252, 60, 207, 251, 60, - 207, 250, 60, 207, 249, 60, 207, 248, 60, 207, 246, 60, 207, 245, 60, - 207, 244, 60, 207, 243, 60, 207, 242, 60, 207, 241, 60, 207, 240, 60, - 207, 239, 60, 207, 238, 60, 207, 237, 60, 207, 235, 60, 207, 234, 60, - 207, 233, 60, 207, 232, 60, 207, 231, 60, 207, 230, 60, 207, 229, 60, - 207, 228, 60, 207, 227, 60, 207, 226, 60, 207, 224, 60, 207, 223, 60, - 207, 222, 60, 207, 221, 60, 207, 220, 60, 207, 219, 60, 207, 218, 60, - 207, 217, 60, 207, 216, 60, 207, 215, 60, 207, 212, 60, 207, 211, 60, - 207, 210, 60, 207, 209, 60, 207, 208, 60, 207, 207, 60, 207, 206, 60, - 207, 205, 60, 207, 204, 60, 207, 203, 60, 207, 201, 60, 207, 200, 60, - 207, 199, 60, 207, 198, 60, 207, 197, 60, 207, 196, 60, 207, 195, 60, - 207, 194, 60, 207, 193, 60, 207, 192, 60, 207, 190, 60, 207, 189, 60, - 207, 188, 60, 207, 187, 60, 207, 186, 60, 207, 185, 60, 207, 184, 60, - 207, 183, 60, 207, 182, 60, 207, 181, 60, 207, 179, 60, 207, 178, 60, - 207, 177, 60, 207, 176, 60, 207, 175, 60, 207, 174, 60, 207, 173, 60, - 207, 172, 60, 207, 171, 60, 207, 170, 60, 207, 168, 60, 207, 167, 60, - 207, 166, 60, 207, 165, 60, 207, 164, 60, 207, 163, 60, 207, 162, 60, - 207, 161, 60, 207, 160, 60, 207, 159, 60, 207, 157, 60, 207, 156, 60, - 207, 155, 60, 207, 154, 60, 207, 153, 60, 207, 152, 60, 207, 151, 215, - 71, 215, 73, 204, 223, 77, 232, 19, 205, 143, 204, 223, 77, 202, 206, - 204, 141, 236, 98, 77, 202, 206, 235, 253, 236, 98, 77, 201, 182, 236, - 61, 236, 85, 236, 86, 251, 114, 251, 115, 251, 7, 248, 86, 248, 239, 247, - 144, 183, 203, 117, 231, 43, 203, 117, 230, 224, 203, 122, 221, 234, 235, - 60, 217, 0, 221, 233, 236, 98, 77, 221, 233, 222, 26, 216, 31, 236, 64, - 221, 234, 203, 117, 83, 203, 117, 197, 211, 234, 161, 235, 60, 235, 37, - 246, 221, 210, 44, 240, 201, 206, 175, 213, 224, 221, 157, 98, 205, 162, - 206, 175, 225, 230, 221, 157, 195, 79, 206, 69, 239, 183, 221, 224, 236, - 22, 238, 165, 239, 51, 240, 241, 98, 239, 172, 239, 51, 240, 241, 103, - 239, 171, 239, 51, 240, 241, 135, 239, 170, 239, 51, 240, 241, 136, 239, - 169, 217, 20, 251, 114, 217, 141, 203, 211, 226, 37, 203, 215, 236, 98, - 77, 201, 183, 247, 240, 236, 4, 247, 2, 247, 4, 236, 98, 77, 219, 98, - 236, 62, 204, 106, 204, 124, 236, 22, 236, 23, 225, 205, 207, 47, 136, - 235, 18, 207, 46, 234, 108, 225, 205, 207, 47, 135, 232, 222, 207, 46, - 232, 219, 225, 205, 207, 47, 103, 210, 119, 207, 46, 209, 100, 225, 205, - 207, 47, 98, 200, 33, 207, 46, 199, 244, 205, 113, 239, 90, 239, 92, 213, - 168, 246, 119, 213, 170, 128, 214, 98, 211, 227, 231, 46, 247, 166, 212, - 234, 231, 238, 247, 180, 215, 226, 247, 166, 231, 238, 217, 103, 225, - 216, 225, 218, 216, 249, 221, 233, 217, 18, 204, 223, 77, 208, 72, 250, - 93, 205, 43, 236, 98, 77, 208, 72, 250, 93, 236, 25, 183, 203, 118, 207, - 32, 231, 43, 203, 118, 207, 32, 230, 221, 183, 203, 118, 3, 224, 239, - 231, 43, 203, 118, 3, 224, 239, 230, 222, 221, 234, 203, 118, 207, 32, - 83, 203, 118, 207, 32, 197, 210, 213, 72, 221, 234, 234, 149, 213, 72, - 221, 234, 237, 106, 212, 82, 213, 72, 221, 234, 248, 238, 213, 72, 221, - 234, 200, 20, 212, 76, 210, 41, 221, 234, 235, 60, 210, 41, 225, 216, - 210, 23, 206, 19, 206, 175, 103, 206, 16, 205, 45, 206, 19, 206, 175, - 135, 206, 15, 205, 44, 239, 51, 240, 241, 204, 165, 239, 167, 211, 212, - 199, 243, 98, 211, 212, 199, 241, 211, 174, 211, 212, 199, 243, 103, 211, - 212, 199, 240, 211, 173, 207, 33, 201, 181, 204, 222, 204, 148, 247, 3, - 246, 119, 246, 195, 219, 56, 197, 143, 217, 243, 204, 223, 77, 232, 207, - 250, 93, 204, 223, 77, 211, 192, 250, 93, 205, 112, 236, 98, 77, 232, - 207, 250, 93, 236, 98, 77, 211, 192, 250, 93, 236, 59, 204, 223, 77, 204, - 165, 205, 128, 206, 19, 232, 244, 183, 225, 165, 207, 11, 206, 19, 183, - 225, 165, 208, 118, 240, 241, 207, 43, 225, 165, 240, 163, 204, 166, 202, - 233, 204, 242, 214, 15, 203, 200, 244, 22, 213, 239, 211, 213, 219, 55, - 212, 65, 250, 130, 211, 207, 244, 22, 250, 147, 217, 91, 206, 78, 8, 6, - 1, 233, 112, 8, 4, 1, 233, 112, 246, 139, 250, 242, 203, 205, 204, 112, - 244, 33, 205, 220, 222, 86, 224, 159, 1, 221, 185, 222, 134, 1, 234, 189, - 234, 180, 222, 134, 1, 234, 189, 235, 72, 222, 134, 1, 209, 185, 222, - 134, 1, 221, 166, 82, 113, 247, 252, 206, 149, 233, 75, 219, 5, 210, 31, - 29, 112, 196, 39, 29, 112, 196, 35, 29, 112, 205, 21, 29, 112, 196, 40, - 234, 85, 234, 84, 234, 83, 217, 245, 194, 236, 194, 237, 194, 239, 221, - 99, 209, 193, 221, 101, 209, 195, 213, 38, 221, 98, 209, 192, 216, 1, - 218, 164, 197, 30, 221, 100, 209, 194, 234, 107, 213, 37, 197, 87, 236, - 121, 234, 95, 218, 235, 214, 49, 199, 245, 102, 218, 235, 239, 189, 102, - 104, 201, 159, 59, 3, 54, 83, 101, 90, 201, 159, 59, 3, 54, 83, 101, 11, - 5, 225, 123, 78, 198, 211, 198, 100, 198, 32, 198, 21, 198, 10, 197, 255, - 197, 244, 197, 233, 197, 222, 198, 210, 198, 199, 198, 188, 198, 177, - 198, 166, 198, 155, 198, 144, 211, 228, 234, 161, 38, 83, 52, 67, 222, - 49, 170, 247, 74, 214, 0, 78, 247, 220, 194, 238, 10, 2, 215, 81, 202, - 237, 10, 2, 215, 81, 126, 215, 81, 247, 106, 126, 247, 105, 219, 103, 6, - 1, 232, 154, 219, 103, 6, 1, 216, 246, 219, 103, 4, 1, 232, 154, 219, - 103, 4, 1, 216, 246, 55, 1, 237, 9, 65, 33, 16, 234, 106, 205, 216, 244, - 154, 199, 115, 198, 133, 198, 122, 198, 111, 198, 99, 198, 88, 198, 77, - 198, 66, 198, 55, 198, 44, 198, 36, 198, 35, 198, 34, 198, 33, 198, 31, - 198, 30, 198, 29, 198, 28, 198, 27, 198, 26, 198, 25, 198, 24, 198, 23, - 198, 22, 198, 20, 198, 19, 198, 18, 198, 17, 198, 16, 198, 15, 198, 14, - 198, 13, 198, 12, 198, 11, 198, 9, 198, 8, 198, 7, 198, 6, 198, 5, 198, - 4, 198, 3, 198, 2, 198, 1, 198, 0, 197, 254, 197, 253, 197, 252, 197, - 251, 197, 250, 197, 249, 197, 248, 197, 247, 197, 246, 197, 245, 197, - 243, 197, 242, 197, 241, 197, 240, 197, 239, 197, 238, 197, 237, 197, - 236, 197, 235, 197, 234, 197, 232, 197, 231, 197, 230, 197, 229, 197, - 228, 197, 227, 197, 226, 197, 225, 197, 224, 197, 223, 197, 221, 197, - 220, 197, 219, 197, 218, 197, 217, 197, 216, 197, 215, 197, 214, 197, - 213, 197, 212, 198, 209, 198, 208, 198, 207, 198, 206, 198, 205, 198, - 204, 198, 203, 198, 202, 198, 201, 198, 200, 198, 198, 198, 197, 198, - 196, 198, 195, 198, 194, 198, 193, 198, 192, 198, 191, 198, 190, 198, - 189, 198, 187, 198, 186, 198, 185, 198, 184, 198, 183, 198, 182, 198, - 181, 198, 180, 198, 179, 198, 178, 198, 176, 198, 175, 198, 174, 198, - 173, 198, 172, 198, 171, 198, 170, 198, 169, 198, 168, 198, 167, 198, - 165, 198, 164, 198, 163, 198, 162, 198, 161, 198, 160, 198, 159, 198, - 158, 198, 157, 198, 156, 198, 154, 198, 153, 198, 152, 198, 151, 198, - 150, 198, 149, 198, 148, 198, 147, 198, 146, 198, 145, 198, 143, 198, - 142, 198, 141, 198, 140, 198, 139, 198, 138, 198, 137, 198, 136, 198, - 135, 198, 134, 198, 132, 198, 131, 198, 130, 198, 129, 198, 128, 198, - 127, 198, 126, 198, 125, 198, 124, 198, 123, 198, 121, 198, 120, 198, - 119, 198, 118, 198, 117, 198, 116, 198, 115, 198, 114, 198, 113, 198, - 112, 198, 110, 198, 109, 198, 108, 198, 107, 198, 106, 198, 105, 198, - 104, 198, 103, 198, 102, 198, 101, 198, 98, 198, 97, 198, 96, 198, 95, - 198, 94, 198, 93, 198, 92, 198, 91, 198, 90, 198, 89, 198, 87, 198, 86, - 198, 85, 198, 84, 198, 83, 198, 82, 198, 81, 198, 80, 198, 79, 198, 78, - 198, 76, 198, 75, 198, 74, 198, 73, 198, 72, 198, 71, 198, 70, 198, 69, - 198, 68, 198, 67, 198, 65, 198, 64, 198, 63, 198, 62, 198, 61, 198, 60, - 198, 59, 198, 58, 198, 57, 198, 56, 198, 54, 198, 53, 198, 52, 198, 51, - 198, 50, 198, 49, 198, 48, 198, 47, 198, 46, 198, 45, 198, 43, 198, 42, - 198, 41, 198, 40, 198, 39, 198, 38, 198, 37, 224, 42, 35, 56, 224, 42, - 250, 29, 224, 42, 17, 195, 79, 224, 42, 17, 98, 224, 42, 17, 103, 224, - 42, 17, 135, 224, 42, 17, 136, 224, 42, 17, 150, 224, 42, 17, 174, 224, - 42, 17, 182, 224, 42, 17, 178, 224, 42, 17, 184, 8, 6, 1, 39, 3, 220, 19, - 26, 232, 238, 8, 4, 1, 39, 3, 220, 19, 26, 232, 238, 8, 6, 1, 237, 10, 3, - 83, 221, 234, 58, 8, 4, 1, 237, 10, 3, 83, 221, 234, 58, 8, 6, 1, 237, - 10, 3, 83, 221, 234, 248, 81, 26, 232, 238, 8, 4, 1, 237, 10, 3, 83, 221, - 234, 248, 81, 26, 232, 238, 8, 6, 1, 237, 10, 3, 83, 221, 234, 248, 81, - 26, 180, 8, 4, 1, 237, 10, 3, 83, 221, 234, 248, 81, 26, 180, 8, 6, 1, - 237, 10, 3, 244, 105, 26, 220, 18, 8, 4, 1, 237, 10, 3, 244, 105, 26, - 220, 18, 8, 6, 1, 237, 10, 3, 244, 105, 26, 246, 225, 8, 4, 1, 237, 10, - 3, 244, 105, 26, 246, 225, 8, 6, 1, 230, 137, 3, 220, 19, 26, 232, 238, - 8, 4, 1, 230, 137, 3, 220, 19, 26, 232, 238, 8, 4, 1, 230, 137, 3, 76, - 89, 26, 180, 8, 4, 1, 216, 247, 3, 202, 57, 57, 8, 6, 1, 169, 3, 83, 221, - 234, 58, 8, 4, 1, 169, 3, 83, 221, 234, 58, 8, 6, 1, 169, 3, 83, 221, - 234, 248, 81, 26, 232, 238, 8, 4, 1, 169, 3, 83, 221, 234, 248, 81, 26, - 232, 238, 8, 6, 1, 169, 3, 83, 221, 234, 248, 81, 26, 180, 8, 4, 1, 169, - 3, 83, 221, 234, 248, 81, 26, 180, 8, 6, 1, 209, 36, 3, 83, 221, 234, 58, - 8, 4, 1, 209, 36, 3, 83, 221, 234, 58, 8, 6, 1, 115, 3, 220, 19, 26, 232, - 238, 8, 4, 1, 115, 3, 220, 19, 26, 232, 238, 8, 6, 1, 39, 3, 214, 81, 26, - 180, 8, 4, 1, 39, 3, 214, 81, 26, 180, 8, 6, 1, 39, 3, 214, 81, 26, 202, - 56, 8, 4, 1, 39, 3, 214, 81, 26, 202, 56, 8, 6, 1, 237, 10, 3, 214, 81, - 26, 180, 8, 4, 1, 237, 10, 3, 214, 81, 26, 180, 8, 6, 1, 237, 10, 3, 214, - 81, 26, 202, 56, 8, 4, 1, 237, 10, 3, 214, 81, 26, 202, 56, 8, 6, 1, 237, - 10, 3, 76, 89, 26, 180, 8, 4, 1, 237, 10, 3, 76, 89, 26, 180, 8, 6, 1, - 237, 10, 3, 76, 89, 26, 202, 56, 8, 4, 1, 237, 10, 3, 76, 89, 26, 202, - 56, 8, 4, 1, 230, 137, 3, 76, 89, 26, 232, 238, 8, 4, 1, 230, 137, 3, 76, - 89, 26, 202, 56, 8, 6, 1, 230, 137, 3, 214, 81, 26, 180, 8, 4, 1, 230, - 137, 3, 214, 81, 26, 76, 89, 26, 180, 8, 6, 1, 230, 137, 3, 214, 81, 26, - 202, 56, 8, 4, 1, 230, 137, 3, 214, 81, 26, 76, 89, 26, 202, 56, 8, 6, 1, - 225, 109, 3, 202, 56, 8, 4, 1, 225, 109, 3, 76, 89, 26, 202, 56, 8, 6, 1, - 223, 1, 3, 202, 56, 8, 4, 1, 223, 1, 3, 202, 56, 8, 6, 1, 221, 41, 3, - 202, 56, 8, 4, 1, 221, 41, 3, 202, 56, 8, 6, 1, 210, 237, 3, 202, 56, 8, - 4, 1, 210, 237, 3, 202, 56, 8, 6, 1, 115, 3, 214, 81, 26, 180, 8, 4, 1, - 115, 3, 214, 81, 26, 180, 8, 6, 1, 115, 3, 214, 81, 26, 202, 56, 8, 4, 1, - 115, 3, 214, 81, 26, 202, 56, 8, 6, 1, 115, 3, 220, 19, 26, 180, 8, 4, 1, - 115, 3, 220, 19, 26, 180, 8, 6, 1, 115, 3, 220, 19, 26, 202, 56, 8, 4, 1, - 115, 3, 220, 19, 26, 202, 56, 8, 4, 1, 251, 91, 3, 232, 238, 8, 4, 1, - 185, 169, 3, 232, 238, 8, 4, 1, 185, 169, 3, 180, 8, 4, 1, 200, 240, 199, - 216, 3, 232, 238, 8, 4, 1, 200, 240, 199, 216, 3, 180, 8, 4, 1, 208, 120, - 3, 232, 238, 8, 4, 1, 208, 120, 3, 180, 8, 4, 1, 231, 52, 208, 120, 3, - 232, 238, 8, 4, 1, 231, 52, 208, 120, 3, 180, 9, 207, 43, 92, 3, 232, 99, - 89, 3, 251, 10, 9, 207, 43, 92, 3, 232, 99, 89, 3, 197, 109, 9, 207, 43, - 92, 3, 232, 99, 89, 3, 149, 219, 229, 9, 207, 43, 92, 3, 232, 99, 89, 3, - 214, 91, 9, 207, 43, 92, 3, 232, 99, 89, 3, 66, 9, 207, 43, 92, 3, 232, - 99, 89, 3, 195, 215, 9, 207, 43, 92, 3, 232, 99, 89, 3, 70, 9, 207, 43, - 92, 3, 232, 99, 89, 3, 251, 90, 9, 207, 43, 215, 207, 3, 224, 83, 188, 1, - 224, 13, 47, 105, 224, 227, 47, 105, 216, 246, 47, 105, 247, 69, 47, 105, - 215, 36, 47, 105, 201, 61, 47, 105, 216, 6, 47, 105, 203, 185, 47, 105, - 217, 225, 47, 105, 213, 195, 47, 105, 221, 40, 47, 105, 196, 143, 47, - 105, 143, 47, 105, 158, 47, 105, 199, 215, 47, 105, 221, 186, 47, 105, - 221, 196, 47, 105, 209, 136, 47, 105, 215, 244, 47, 105, 225, 108, 47, - 105, 207, 8, 47, 105, 205, 46, 47, 105, 209, 35, 47, 105, 232, 154, 47, - 105, 223, 101, 47, 5, 224, 202, 47, 5, 223, 249, 47, 5, 223, 228, 47, 5, - 223, 86, 47, 5, 223, 44, 47, 5, 224, 101, 47, 5, 224, 92, 47, 5, 224, - 179, 47, 5, 223, 165, 47, 5, 223, 141, 47, 5, 224, 120, 47, 5, 216, 243, - 47, 5, 216, 192, 47, 5, 216, 188, 47, 5, 216, 157, 47, 5, 216, 149, 47, - 5, 216, 231, 47, 5, 216, 229, 47, 5, 216, 240, 47, 5, 216, 169, 47, 5, - 216, 164, 47, 5, 216, 233, 47, 5, 247, 35, 47, 5, 244, 131, 47, 5, 244, - 121, 47, 5, 240, 162, 47, 5, 240, 123, 47, 5, 246, 176, 47, 5, 246, 168, - 47, 5, 247, 24, 47, 5, 244, 46, 47, 5, 240, 237, 47, 5, 246, 209, 47, 5, - 215, 33, 47, 5, 215, 15, 47, 5, 215, 10, 47, 5, 214, 249, 47, 5, 214, - 241, 47, 5, 215, 24, 47, 5, 215, 23, 47, 5, 215, 30, 47, 5, 215, 0, 47, - 5, 214, 253, 47, 5, 215, 27, 47, 5, 201, 57, 47, 5, 201, 37, 47, 5, 201, - 36, 47, 5, 201, 25, 47, 5, 201, 22, 47, 5, 201, 53, 47, 5, 201, 52, 47, - 5, 201, 56, 47, 5, 201, 35, 47, 5, 201, 34, 47, 5, 201, 55, 47, 5, 216, - 4, 47, 5, 215, 246, 47, 5, 215, 245, 47, 5, 215, 229, 47, 5, 215, 228, - 47, 5, 216, 0, 47, 5, 215, 255, 47, 5, 216, 3, 47, 5, 215, 231, 47, 5, - 215, 230, 47, 5, 216, 2, 47, 5, 203, 130, 47, 5, 202, 94, 47, 5, 202, 71, - 47, 5, 201, 20, 47, 5, 200, 231, 47, 5, 203, 36, 47, 5, 203, 16, 47, 5, - 203, 105, 47, 5, 147, 47, 5, 201, 226, 47, 5, 203, 57, 47, 5, 217, 158, - 47, 5, 216, 141, 47, 5, 216, 108, 47, 5, 215, 111, 47, 5, 215, 48, 47, 5, - 217, 34, 47, 5, 217, 23, 47, 5, 217, 144, 47, 5, 215, 225, 47, 5, 215, - 208, 47, 5, 217, 117, 47, 5, 213, 179, 47, 5, 212, 163, 47, 5, 212, 125, - 47, 5, 211, 175, 47, 5, 211, 140, 47, 5, 213, 35, 47, 5, 213, 22, 47, 5, - 213, 158, 47, 5, 212, 62, 47, 5, 212, 37, 47, 5, 213, 49, 47, 5, 220, 23, - 47, 5, 218, 243, 47, 5, 218, 205, 47, 5, 218, 56, 47, 5, 217, 254, 47, 5, - 219, 114, 47, 5, 219, 97, 47, 5, 219, 241, 47, 5, 218, 160, 47, 5, 218, - 104, 47, 5, 219, 162, 47, 5, 196, 124, 47, 5, 196, 20, 47, 5, 196, 11, - 47, 5, 195, 215, 47, 5, 195, 179, 47, 5, 196, 65, 47, 5, 196, 62, 47, 5, - 196, 103, 47, 5, 196, 0, 47, 5, 195, 235, 47, 5, 196, 75, 47, 5, 210, - 193, 47, 5, 210, 23, 47, 5, 209, 217, 47, 5, 209, 95, 47, 5, 209, 56, 47, - 5, 210, 133, 47, 5, 210, 105, 47, 5, 210, 173, 47, 5, 209, 185, 47, 5, - 209, 159, 47, 5, 210, 142, 47, 5, 222, 239, 47, 5, 222, 11, 47, 5, 221, - 249, 47, 5, 221, 95, 47, 5, 221, 66, 47, 5, 222, 99, 47, 5, 222, 90, 47, - 5, 222, 211, 47, 5, 221, 166, 47, 5, 221, 133, 47, 5, 222, 117, 47, 5, - 199, 136, 47, 5, 199, 23, 47, 5, 199, 7, 47, 5, 197, 209, 47, 5, 197, - 201, 47, 5, 199, 105, 47, 5, 199, 100, 47, 5, 199, 132, 47, 5, 198, 237, - 47, 5, 198, 222, 47, 5, 199, 111, 47, 5, 221, 184, 47, 5, 221, 179, 47, - 5, 221, 178, 47, 5, 221, 175, 47, 5, 221, 174, 47, 5, 221, 181, 47, 5, - 221, 180, 47, 5, 221, 183, 47, 5, 221, 177, 47, 5, 221, 176, 47, 5, 221, - 182, 47, 5, 221, 194, 47, 5, 221, 188, 47, 5, 221, 187, 47, 5, 221, 171, - 47, 5, 221, 170, 47, 5, 221, 190, 47, 5, 221, 189, 47, 5, 221, 193, 47, - 5, 221, 173, 47, 5, 221, 172, 47, 5, 221, 191, 47, 5, 209, 134, 47, 5, - 209, 123, 47, 5, 209, 122, 47, 5, 209, 115, 47, 5, 209, 108, 47, 5, 209, - 130, 47, 5, 209, 129, 47, 5, 209, 133, 47, 5, 209, 121, 47, 5, 209, 120, - 47, 5, 209, 132, 47, 5, 215, 242, 47, 5, 215, 237, 47, 5, 215, 236, 47, - 5, 215, 233, 47, 5, 215, 232, 47, 5, 215, 239, 47, 5, 215, 238, 47, 5, - 215, 241, 47, 5, 215, 235, 47, 5, 215, 234, 47, 5, 215, 240, 47, 5, 225, - 104, 47, 5, 225, 63, 47, 5, 225, 55, 47, 5, 225, 1, 47, 5, 224, 237, 47, - 5, 225, 84, 47, 5, 225, 82, 47, 5, 225, 98, 47, 5, 225, 20, 47, 5, 225, - 10, 47, 5, 225, 91, 47, 5, 207, 1, 47, 5, 206, 179, 47, 5, 206, 174, 47, - 5, 206, 108, 47, 5, 206, 90, 47, 5, 206, 211, 47, 5, 206, 209, 47, 5, - 206, 246, 47, 5, 206, 154, 47, 5, 206, 147, 47, 5, 206, 220, 47, 5, 205, - 42, 47, 5, 205, 10, 47, 5, 205, 6, 47, 5, 204, 253, 47, 5, 204, 250, 47, - 5, 205, 16, 47, 5, 205, 15, 47, 5, 205, 41, 47, 5, 205, 2, 47, 5, 205, 1, - 47, 5, 205, 18, 47, 5, 208, 224, 47, 5, 206, 69, 47, 5, 206, 41, 47, 5, - 204, 139, 47, 5, 204, 41, 47, 5, 208, 103, 47, 5, 208, 85, 47, 5, 208, - 208, 47, 5, 205, 162, 47, 5, 205, 133, 47, 5, 208, 147, 47, 5, 232, 129, - 47, 5, 231, 214, 47, 5, 231, 186, 47, 5, 230, 219, 47, 5, 230, 190, 47, - 5, 232, 32, 47, 5, 232, 4, 47, 5, 232, 118, 47, 5, 231, 81, 47, 5, 231, - 54, 47, 5, 232, 43, 47, 5, 223, 100, 47, 5, 223, 99, 47, 5, 223, 94, 47, - 5, 223, 93, 47, 5, 223, 90, 47, 5, 223, 89, 47, 5, 223, 96, 47, 5, 223, - 95, 47, 5, 223, 98, 47, 5, 223, 92, 47, 5, 223, 91, 47, 5, 223, 97, 47, - 5, 206, 115, 151, 105, 2, 196, 89, 151, 105, 2, 210, 161, 151, 105, 2, - 210, 72, 93, 1, 200, 152, 88, 105, 2, 244, 39, 157, 88, 105, 2, 244, 39, - 224, 38, 88, 105, 2, 244, 39, 223, 165, 88, 105, 2, 244, 39, 224, 9, 88, - 105, 2, 244, 39, 216, 169, 88, 105, 2, 244, 39, 247, 36, 88, 105, 2, 244, - 39, 246, 136, 88, 105, 2, 244, 39, 244, 46, 88, 105, 2, 244, 39, 244, - 169, 88, 105, 2, 244, 39, 215, 0, 88, 105, 2, 244, 39, 240, 3, 88, 105, - 2, 244, 39, 201, 46, 88, 105, 2, 244, 39, 238, 154, 88, 105, 2, 244, 39, - 201, 41, 88, 105, 2, 244, 39, 179, 88, 105, 2, 244, 39, 203, 137, 88, - 105, 2, 244, 39, 202, 202, 88, 105, 2, 244, 39, 147, 88, 105, 2, 244, 39, - 202, 141, 88, 105, 2, 244, 39, 215, 225, 88, 105, 2, 244, 39, 248, 252, - 88, 105, 2, 244, 39, 212, 205, 88, 105, 2, 244, 39, 212, 62, 88, 105, 2, - 244, 39, 212, 177, 88, 105, 2, 244, 39, 218, 160, 88, 105, 2, 244, 39, - 196, 0, 88, 105, 2, 244, 39, 209, 185, 88, 105, 2, 244, 39, 221, 166, 88, - 105, 2, 244, 39, 198, 237, 88, 105, 2, 244, 39, 207, 6, 88, 105, 2, 244, - 39, 205, 43, 88, 105, 2, 244, 39, 187, 88, 105, 2, 244, 39, 142, 88, 105, - 2, 244, 39, 175, 88, 18, 2, 244, 39, 211, 108, 88, 225, 217, 18, 2, 244, - 39, 211, 46, 88, 225, 217, 18, 2, 244, 39, 209, 44, 88, 225, 217, 18, 2, - 244, 39, 209, 37, 88, 225, 217, 18, 2, 244, 39, 211, 88, 88, 18, 2, 214, - 56, 88, 18, 2, 251, 227, 193, 1, 248, 34, 216, 244, 193, 1, 248, 34, 216, - 192, 193, 1, 248, 34, 216, 157, 193, 1, 248, 34, 216, 231, 193, 1, 248, - 34, 216, 169, 73, 1, 248, 34, 216, 244, 73, 1, 248, 34, 216, 192, 73, 1, - 248, 34, 216, 157, 73, 1, 248, 34, 216, 231, 73, 1, 248, 34, 216, 169, - 73, 1, 251, 38, 246, 176, 73, 1, 251, 38, 201, 20, 73, 1, 251, 38, 147, - 73, 1, 251, 38, 213, 195, 71, 1, 235, 209, 235, 208, 240, 245, 154, 153, - 71, 1, 235, 208, 235, 209, 240, 245, 154, 153, + 255, 38, 30, 39, 2, 252, 45, 30, 39, 2, 252, 44, 30, 39, 2, 255, 3, 30, + 39, 2, 252, 43, 30, 39, 2, 252, 42, 30, 39, 2, 252, 41, 30, 39, 2, 252, + 40, 30, 39, 2, 254, 246, 30, 39, 2, 252, 39, 30, 39, 2, 252, 38, 30, 39, + 2, 252, 37, 30, 39, 2, 252, 36, 30, 39, 2, 252, 35, 30, 39, 2, 254, 62, + 30, 39, 2, 254, 61, 30, 39, 2, 254, 60, 30, 39, 2, 254, 59, 30, 39, 2, + 254, 58, 30, 39, 2, 254, 57, 30, 39, 2, 254, 56, 30, 39, 2, 254, 55, 30, + 39, 2, 254, 53, 30, 39, 2, 254, 52, 30, 39, 2, 254, 51, 30, 39, 2, 254, + 50, 30, 39, 2, 254, 49, 30, 39, 2, 254, 48, 30, 39, 2, 254, 46, 30, 39, + 2, 254, 45, 30, 39, 2, 254, 44, 30, 39, 2, 254, 43, 30, 39, 2, 254, 42, + 30, 39, 2, 254, 41, 30, 39, 2, 254, 40, 30, 39, 2, 254, 39, 30, 39, 2, + 254, 38, 30, 39, 2, 254, 37, 30, 39, 2, 254, 36, 30, 39, 2, 254, 35, 30, + 39, 2, 254, 34, 30, 39, 2, 254, 33, 30, 39, 2, 254, 32, 30, 39, 2, 254, + 31, 30, 39, 2, 254, 30, 30, 39, 2, 254, 29, 30, 39, 2, 254, 28, 30, 39, + 2, 254, 26, 30, 39, 2, 254, 25, 30, 39, 2, 254, 24, 30, 39, 2, 254, 20, + 30, 39, 2, 254, 19, 30, 39, 2, 254, 18, 30, 39, 2, 254, 17, 30, 39, 2, + 254, 13, 30, 39, 2, 254, 12, 30, 39, 2, 254, 11, 30, 39, 2, 254, 10, 30, + 39, 2, 254, 9, 30, 39, 2, 254, 8, 30, 39, 2, 254, 7, 30, 39, 2, 254, 6, + 30, 39, 2, 254, 5, 30, 39, 2, 254, 4, 30, 39, 2, 254, 3, 30, 39, 2, 254, + 2, 30, 39, 2, 254, 1, 30, 39, 2, 254, 0, 30, 39, 2, 253, 255, 30, 39, 2, + 253, 254, 30, 39, 2, 253, 253, 30, 39, 2, 253, 252, 30, 39, 2, 253, 251, + 30, 39, 2, 253, 250, 30, 39, 2, 253, 249, 30, 39, 2, 253, 248, 30, 39, 2, + 253, 247, 30, 39, 2, 253, 245, 30, 39, 2, 253, 244, 30, 39, 2, 253, 243, + 30, 39, 2, 253, 242, 30, 39, 2, 253, 241, 30, 39, 2, 253, 239, 30, 39, 2, + 253, 238, 30, 39, 2, 253, 237, 30, 39, 2, 253, 236, 30, 39, 2, 253, 234, + 30, 39, 2, 253, 233, 30, 39, 2, 253, 232, 30, 39, 2, 253, 198, 30, 39, 2, + 253, 196, 30, 39, 2, 253, 194, 30, 39, 2, 253, 192, 30, 39, 2, 253, 190, + 30, 39, 2, 253, 188, 30, 39, 2, 253, 186, 30, 39, 2, 253, 184, 30, 39, 2, + 253, 182, 30, 39, 2, 253, 180, 30, 39, 2, 253, 178, 30, 39, 2, 253, 175, + 30, 39, 2, 253, 173, 30, 39, 2, 253, 171, 30, 39, 2, 253, 169, 30, 39, 2, + 253, 167, 30, 39, 2, 253, 165, 30, 39, 2, 253, 163, 30, 39, 2, 253, 161, + 30, 39, 2, 253, 79, 30, 39, 2, 253, 78, 30, 39, 2, 253, 77, 30, 39, 2, + 253, 76, 30, 39, 2, 253, 75, 30, 39, 2, 253, 74, 30, 39, 2, 253, 72, 30, + 39, 2, 253, 71, 30, 39, 2, 253, 70, 30, 39, 2, 253, 69, 30, 39, 2, 253, + 68, 30, 39, 2, 253, 67, 30, 39, 2, 253, 65, 30, 39, 2, 253, 64, 30, 39, + 2, 253, 60, 30, 39, 2, 253, 59, 30, 39, 2, 253, 57, 30, 39, 2, 253, 56, + 30, 39, 2, 253, 55, 30, 39, 2, 253, 54, 30, 39, 2, 253, 53, 30, 39, 2, + 253, 52, 30, 39, 2, 253, 51, 30, 39, 2, 253, 50, 30, 39, 2, 253, 49, 30, + 39, 2, 253, 48, 30, 39, 2, 253, 47, 30, 39, 2, 253, 46, 30, 39, 2, 253, + 45, 30, 39, 2, 253, 44, 30, 39, 2, 253, 43, 30, 39, 2, 253, 42, 30, 39, + 2, 253, 41, 30, 39, 2, 253, 40, 30, 39, 2, 253, 39, 30, 39, 2, 253, 38, + 30, 39, 2, 253, 37, 30, 39, 2, 253, 36, 30, 39, 2, 253, 35, 30, 39, 2, + 253, 34, 30, 39, 2, 253, 33, 30, 39, 2, 253, 32, 30, 39, 2, 253, 31, 30, + 39, 2, 253, 30, 30, 39, 2, 253, 29, 30, 39, 2, 253, 28, 30, 39, 2, 253, + 27, 30, 39, 2, 253, 26, 30, 39, 2, 253, 25, 30, 39, 2, 253, 24, 30, 39, + 2, 253, 23, 30, 39, 2, 253, 22, 30, 39, 2, 253, 21, 30, 39, 2, 253, 20, + 30, 39, 2, 253, 19, 30, 39, 2, 253, 18, 30, 39, 2, 253, 17, 30, 39, 2, + 253, 16, 30, 39, 2, 253, 15, 30, 39, 2, 253, 14, 30, 39, 2, 253, 13, 30, + 39, 2, 253, 12, 30, 39, 2, 253, 11, 30, 39, 2, 253, 10, 30, 39, 2, 253, + 9, 30, 39, 2, 253, 8, 30, 39, 2, 253, 7, 30, 39, 2, 253, 6, 30, 39, 2, + 253, 5, 30, 39, 2, 253, 4, 30, 39, 2, 253, 3, 30, 39, 2, 253, 2, 30, 39, + 2, 253, 1, 30, 39, 2, 253, 0, 30, 39, 2, 252, 255, 30, 39, 2, 252, 254, + 30, 39, 2, 252, 253, 30, 39, 2, 252, 252, 30, 39, 2, 252, 251, 30, 39, 2, + 252, 250, 30, 39, 2, 252, 249, 30, 39, 2, 252, 248, 30, 39, 2, 252, 247, + 30, 39, 2, 252, 246, 30, 39, 2, 252, 245, 30, 39, 2, 252, 244, 30, 39, 2, + 252, 243, 30, 39, 2, 252, 242, 30, 39, 2, 252, 241, 30, 39, 2, 252, 240, + 30, 39, 2, 252, 239, 30, 39, 2, 252, 238, 30, 39, 2, 252, 237, 30, 39, 2, + 252, 236, 30, 39, 2, 252, 235, 30, 39, 2, 252, 234, 30, 39, 2, 252, 233, + 30, 39, 2, 252, 232, 30, 39, 2, 252, 231, 30, 39, 2, 252, 230, 30, 39, 2, + 252, 229, 30, 39, 2, 252, 228, 30, 39, 2, 252, 227, 30, 39, 2, 252, 226, + 30, 39, 2, 252, 225, 30, 39, 2, 252, 224, 30, 39, 2, 252, 223, 30, 39, 2, + 252, 222, 30, 39, 2, 252, 221, 30, 39, 2, 252, 220, 30, 39, 2, 252, 219, + 30, 39, 2, 252, 218, 30, 39, 2, 252, 217, 30, 39, 2, 252, 216, 30, 39, 2, + 252, 215, 30, 39, 2, 252, 214, 30, 39, 2, 252, 213, 30, 39, 2, 252, 212, + 30, 39, 2, 252, 211, 30, 39, 2, 252, 210, 30, 39, 2, 252, 209, 30, 39, 2, + 252, 208, 30, 39, 2, 252, 207, 30, 39, 2, 252, 206, 30, 39, 2, 252, 205, + 30, 39, 2, 252, 204, 30, 39, 2, 252, 203, 30, 39, 2, 252, 202, 30, 39, 2, + 252, 201, 30, 39, 2, 252, 200, 30, 39, 2, 252, 199, 30, 39, 2, 252, 198, + 30, 39, 2, 252, 197, 63, 30, 39, 2, 252, 196, 250, 111, 30, 39, 2, 252, + 195, 240, 230, 30, 39, 2, 252, 194, 69, 30, 39, 2, 252, 193, 236, 48, 30, + 39, 2, 252, 192, 233, 14, 30, 39, 2, 252, 191, 225, 216, 30, 39, 2, 252, + 190, 225, 79, 30, 39, 2, 252, 189, 159, 30, 39, 2, 252, 188, 223, 86, 30, + 39, 2, 252, 187, 223, 85, 30, 39, 2, 252, 186, 223, 84, 30, 39, 2, 252, + 185, 223, 83, 30, 39, 2, 252, 184, 197, 199, 30, 39, 2, 252, 183, 196, + 222, 30, 39, 2, 252, 182, 196, 148, 30, 39, 2, 252, 181, 214, 123, 30, + 39, 2, 252, 180, 252, 30, 30, 39, 2, 252, 179, 249, 45, 30, 39, 2, 252, + 178, 240, 42, 30, 39, 2, 252, 177, 236, 56, 30, 39, 2, 252, 176, 225, + 192, 30, 39, 2, 252, 175, 30, 39, 2, 252, 174, 30, 39, 2, 252, 173, 30, + 39, 2, 252, 172, 30, 39, 2, 252, 171, 30, 39, 2, 252, 170, 30, 39, 2, + 252, 169, 30, 39, 2, 252, 168, 240, 237, 5, 63, 240, 237, 5, 69, 240, + 237, 5, 68, 240, 237, 5, 72, 240, 237, 5, 66, 240, 237, 5, 225, 213, 240, + 237, 5, 225, 128, 240, 237, 5, 155, 240, 237, 5, 224, 208, 240, 237, 5, + 224, 100, 240, 237, 5, 224, 10, 240, 237, 5, 223, 186, 240, 237, 5, 172, + 240, 237, 5, 222, 196, 240, 237, 5, 222, 108, 240, 237, 5, 222, 6, 240, + 237, 5, 221, 190, 240, 237, 5, 166, 240, 237, 5, 219, 206, 240, 237, 5, + 219, 77, 240, 237, 5, 218, 250, 240, 237, 5, 218, 144, 240, 237, 5, 176, + 240, 237, 5, 217, 117, 240, 237, 5, 216, 222, 240, 237, 5, 216, 49, 240, + 237, 5, 215, 185, 240, 237, 5, 161, 240, 237, 5, 213, 91, 240, 237, 5, + 212, 219, 240, 237, 5, 212, 116, 240, 237, 5, 211, 226, 240, 237, 5, 169, + 240, 237, 5, 210, 182, 240, 237, 5, 210, 72, 240, 237, 5, 209, 232, 240, + 237, 5, 209, 140, 240, 237, 5, 183, 240, 237, 5, 208, 147, 240, 237, 5, + 206, 112, 240, 237, 5, 205, 200, 240, 237, 5, 204, 172, 240, 237, 5, 189, + 240, 237, 5, 203, 68, 240, 237, 5, 202, 122, 240, 237, 5, 149, 240, 237, + 5, 201, 40, 240, 237, 5, 197, 166, 240, 237, 5, 197, 109, 240, 237, 5, + 197, 70, 240, 237, 5, 197, 34, 240, 237, 5, 196, 208, 240, 237, 5, 196, + 202, 240, 237, 5, 195, 115, 240, 237, 5, 195, 11, 226, 87, 250, 254, 1, + 251, 161, 226, 87, 250, 254, 1, 248, 204, 226, 87, 250, 254, 1, 233, 176, + 226, 87, 250, 254, 1, 240, 99, 226, 87, 250, 254, 1, 232, 146, 226, 87, + 250, 254, 1, 197, 117, 226, 87, 250, 254, 1, 195, 92, 226, 87, 250, 254, + 1, 232, 86, 226, 87, 250, 254, 1, 202, 253, 226, 87, 250, 254, 1, 195, + 240, 226, 87, 250, 254, 1, 225, 4, 226, 87, 250, 254, 1, 222, 239, 226, + 87, 250, 254, 1, 219, 170, 226, 87, 250, 254, 1, 215, 137, 226, 87, 250, + 254, 1, 208, 225, 226, 87, 250, 254, 1, 250, 116, 226, 87, 250, 254, 1, + 213, 91, 226, 87, 250, 254, 1, 209, 5, 226, 87, 250, 254, 1, 211, 100, + 226, 87, 250, 254, 1, 210, 109, 226, 87, 250, 254, 1, 206, 211, 226, 87, + 250, 254, 1, 203, 82, 226, 87, 250, 254, 208, 133, 55, 226, 87, 250, 254, + 31, 100, 226, 87, 250, 254, 31, 102, 226, 87, 250, 254, 31, 134, 226, 87, + 250, 254, 31, 203, 23, 226, 87, 250, 254, 31, 200, 234, 226, 87, 250, + 254, 31, 97, 231, 56, 226, 87, 250, 254, 31, 97, 170, 226, 87, 250, 254, + 31, 203, 24, 170, 213, 203, 1, 251, 161, 213, 203, 1, 248, 204, 213, 203, + 1, 233, 176, 213, 203, 1, 240, 99, 213, 203, 1, 232, 146, 213, 203, 1, + 197, 117, 213, 203, 1, 195, 92, 213, 203, 1, 232, 86, 213, 203, 1, 202, + 253, 213, 203, 1, 195, 240, 213, 203, 1, 225, 4, 213, 203, 1, 222, 239, + 213, 203, 1, 219, 170, 213, 203, 1, 48, 215, 137, 213, 203, 1, 215, 137, + 213, 203, 1, 208, 225, 213, 203, 1, 250, 116, 213, 203, 1, 213, 91, 213, + 203, 1, 209, 5, 213, 203, 1, 211, 100, 213, 203, 1, 210, 109, 213, 203, + 1, 206, 211, 213, 203, 1, 203, 82, 213, 203, 222, 178, 235, 76, 213, 203, + 210, 17, 235, 76, 213, 203, 31, 100, 213, 203, 31, 102, 213, 203, 31, + 134, 213, 203, 31, 136, 213, 203, 31, 146, 213, 203, 31, 203, 23, 213, + 203, 31, 200, 234, 217, 239, 1, 48, 251, 161, 217, 239, 1, 251, 161, 217, + 239, 1, 48, 248, 204, 217, 239, 1, 248, 204, 217, 239, 1, 233, 176, 217, + 239, 1, 240, 99, 217, 239, 1, 48, 232, 146, 217, 239, 1, 232, 146, 217, + 239, 1, 197, 117, 217, 239, 1, 195, 92, 217, 239, 1, 232, 86, 217, 239, + 1, 202, 253, 217, 239, 1, 48, 195, 240, 217, 239, 1, 195, 240, 217, 239, + 1, 48, 225, 4, 217, 239, 1, 225, 4, 217, 239, 1, 48, 222, 239, 217, 239, + 1, 222, 239, 217, 239, 1, 48, 219, 170, 217, 239, 1, 219, 170, 217, 239, + 1, 48, 215, 137, 217, 239, 1, 215, 137, 217, 239, 1, 208, 225, 217, 239, + 1, 250, 116, 217, 239, 1, 213, 91, 217, 239, 1, 209, 5, 217, 239, 1, 211, + 100, 217, 239, 1, 210, 109, 217, 239, 1, 48, 206, 211, 217, 239, 1, 206, + 211, 217, 239, 1, 203, 82, 217, 239, 31, 100, 217, 239, 31, 102, 217, + 239, 31, 134, 217, 239, 31, 136, 217, 239, 241, 46, 31, 136, 217, 239, + 31, 146, 217, 239, 31, 203, 23, 217, 239, 31, 200, 234, 217, 239, 31, 97, + 231, 56, 232, 159, 1, 251, 161, 232, 159, 1, 248, 204, 232, 159, 1, 233, + 176, 232, 159, 1, 240, 98, 232, 159, 1, 232, 146, 232, 159, 1, 197, 117, + 232, 159, 1, 195, 90, 232, 159, 1, 232, 86, 232, 159, 1, 202, 253, 232, + 159, 1, 195, 240, 232, 159, 1, 225, 4, 232, 159, 1, 222, 239, 232, 159, + 1, 219, 170, 232, 159, 1, 215, 137, 232, 159, 1, 208, 225, 232, 159, 1, + 250, 114, 232, 159, 1, 213, 91, 232, 159, 1, 209, 5, 232, 159, 1, 211, + 100, 232, 159, 1, 206, 211, 232, 159, 1, 203, 82, 232, 159, 31, 100, 232, + 159, 31, 146, 232, 159, 31, 203, 23, 232, 159, 31, 200, 234, 232, 159, + 31, 97, 231, 56, 212, 231, 1, 251, 158, 212, 231, 1, 248, 207, 212, 231, + 1, 234, 95, 212, 231, 1, 239, 213, 212, 231, 1, 232, 146, 212, 231, 1, + 197, 124, 212, 231, 1, 195, 108, 212, 231, 1, 232, 88, 212, 231, 1, 203, + 1, 212, 231, 1, 195, 241, 212, 231, 1, 225, 34, 212, 231, 1, 222, 245, + 212, 231, 1, 219, 170, 212, 231, 1, 215, 137, 212, 231, 1, 207, 99, 212, + 231, 1, 251, 193, 212, 231, 1, 213, 91, 212, 231, 1, 209, 7, 212, 231, 1, + 211, 105, 212, 231, 1, 209, 196, 212, 231, 1, 206, 211, 212, 231, 1, 203, + 89, 212, 231, 31, 100, 212, 231, 31, 203, 23, 212, 231, 31, 200, 234, + 212, 231, 31, 97, 231, 56, 212, 231, 31, 102, 212, 231, 31, 134, 212, + 231, 197, 9, 207, 90, 221, 147, 1, 63, 221, 147, 1, 250, 111, 221, 147, + 1, 234, 189, 221, 147, 1, 240, 230, 221, 147, 1, 69, 221, 147, 1, 199, + 230, 221, 147, 1, 68, 221, 147, 1, 196, 148, 221, 147, 1, 225, 79, 221, + 147, 1, 159, 221, 147, 1, 221, 135, 221, 147, 1, 218, 54, 221, 147, 1, + 72, 221, 147, 1, 144, 221, 147, 1, 205, 83, 221, 147, 1, 203, 216, 221, + 147, 1, 66, 221, 147, 1, 236, 48, 221, 147, 1, 211, 166, 221, 147, 1, + 209, 80, 221, 147, 1, 201, 81, 221, 147, 1, 251, 105, 221, 147, 1, 236, + 229, 221, 147, 1, 221, 150, 221, 147, 1, 216, 86, 221, 147, 1, 247, 206, + 221, 147, 201, 177, 78, 140, 232, 56, 1, 63, 140, 232, 56, 1, 69, 140, + 232, 56, 1, 68, 140, 232, 56, 1, 72, 140, 232, 56, 1, 164, 140, 232, 56, + 1, 197, 166, 140, 232, 56, 1, 249, 144, 140, 232, 56, 1, 249, 143, 140, + 232, 56, 1, 161, 140, 232, 56, 1, 166, 140, 232, 56, 1, 176, 140, 232, + 56, 1, 217, 254, 140, 232, 56, 1, 217, 117, 140, 232, 56, 1, 217, 115, + 140, 232, 56, 1, 169, 140, 232, 56, 1, 210, 249, 140, 232, 56, 1, 172, + 140, 232, 56, 1, 224, 145, 140, 232, 56, 1, 232, 79, 140, 232, 56, 1, + 183, 140, 232, 56, 1, 209, 21, 140, 232, 56, 1, 208, 147, 140, 232, 56, + 1, 155, 140, 232, 56, 1, 211, 158, 140, 232, 56, 1, 189, 140, 232, 56, 1, + 203, 167, 140, 232, 56, 1, 203, 68, 140, 232, 56, 1, 203, 66, 140, 232, + 56, 1, 149, 140, 232, 56, 1, 240, 135, 140, 232, 56, 16, 199, 28, 140, + 232, 56, 16, 199, 27, 140, 241, 12, 1, 63, 140, 241, 12, 1, 69, 140, 241, + 12, 1, 68, 140, 241, 12, 1, 72, 140, 241, 12, 1, 164, 140, 241, 12, 1, + 197, 166, 140, 241, 12, 1, 249, 144, 140, 241, 12, 1, 161, 140, 241, 12, + 1, 166, 140, 241, 12, 1, 176, 140, 241, 12, 1, 217, 117, 140, 241, 12, 1, + 169, 140, 241, 12, 1, 172, 140, 241, 12, 1, 224, 145, 140, 241, 12, 1, + 232, 79, 140, 241, 12, 1, 183, 140, 241, 12, 1, 250, 250, 183, 140, 241, + 12, 1, 208, 147, 140, 241, 12, 1, 155, 140, 241, 12, 1, 211, 158, 140, + 241, 12, 1, 189, 140, 241, 12, 1, 203, 68, 140, 241, 12, 1, 149, 140, + 241, 12, 1, 240, 135, 140, 241, 12, 191, 236, 252, 200, 241, 140, 241, + 12, 191, 97, 232, 224, 140, 241, 12, 221, 247, 209, 238, 140, 241, 12, + 221, 247, 226, 92, 140, 241, 12, 31, 100, 140, 241, 12, 31, 102, 140, + 241, 12, 31, 134, 140, 241, 12, 31, 136, 140, 241, 12, 31, 146, 140, 241, + 12, 31, 167, 140, 241, 12, 31, 178, 140, 241, 12, 31, 171, 140, 241, 12, + 31, 182, 140, 241, 12, 31, 203, 23, 140, 241, 12, 31, 200, 234, 140, 241, + 12, 31, 202, 177, 140, 241, 12, 31, 235, 13, 140, 241, 12, 31, 235, 144, + 140, 241, 12, 31, 206, 13, 140, 241, 12, 31, 207, 65, 140, 241, 12, 31, + 97, 231, 56, 140, 241, 12, 31, 99, 231, 56, 140, 241, 12, 31, 115, 231, + 56, 140, 241, 12, 31, 235, 6, 231, 56, 140, 241, 12, 31, 235, 100, 231, + 56, 140, 241, 12, 31, 206, 29, 231, 56, 140, 241, 12, 31, 207, 71, 231, + 56, 140, 241, 12, 31, 237, 30, 231, 56, 140, 241, 12, 31, 216, 178, 231, + 56, 140, 241, 12, 31, 97, 170, 140, 241, 12, 31, 99, 170, 140, 241, 12, + 31, 115, 170, 140, 241, 12, 31, 235, 6, 170, 140, 241, 12, 31, 235, 100, + 170, 140, 241, 12, 31, 206, 29, 170, 140, 241, 12, 31, 207, 71, 170, 140, + 241, 12, 31, 237, 30, 170, 140, 241, 12, 31, 216, 178, 170, 140, 241, 12, + 31, 203, 24, 170, 140, 241, 12, 31, 200, 235, 170, 140, 241, 12, 31, 202, + 178, 170, 140, 241, 12, 31, 235, 14, 170, 140, 241, 12, 31, 235, 145, + 170, 140, 241, 12, 31, 206, 14, 170, 140, 241, 12, 31, 207, 66, 170, 140, + 241, 12, 31, 237, 20, 170, 140, 241, 12, 31, 216, 174, 170, 140, 241, 12, + 31, 97, 231, 57, 170, 140, 241, 12, 31, 99, 231, 57, 170, 140, 241, 12, + 31, 115, 231, 57, 170, 140, 241, 12, 31, 235, 6, 231, 57, 170, 140, 241, + 12, 31, 235, 100, 231, 57, 170, 140, 241, 12, 31, 206, 29, 231, 57, 170, + 140, 241, 12, 31, 207, 71, 231, 57, 170, 140, 241, 12, 31, 237, 30, 231, + 57, 170, 140, 241, 12, 31, 216, 178, 231, 57, 170, 140, 241, 12, 191, 97, + 200, 242, 140, 241, 12, 191, 99, 200, 241, 140, 241, 12, 191, 115, 200, + 241, 140, 241, 12, 191, 235, 6, 200, 241, 140, 241, 12, 191, 235, 100, + 200, 241, 140, 241, 12, 191, 206, 29, 200, 241, 140, 241, 12, 191, 207, + 71, 200, 241, 140, 241, 12, 191, 237, 30, 200, 241, 140, 241, 12, 191, + 216, 178, 200, 241, 140, 241, 12, 191, 203, 24, 200, 241, 224, 132, 1, + 63, 224, 132, 18, 2, 68, 224, 132, 18, 2, 66, 224, 132, 18, 2, 110, 144, + 224, 132, 18, 2, 69, 224, 132, 18, 2, 72, 224, 132, 18, 222, 157, 78, + 224, 132, 2, 52, 210, 3, 60, 224, 132, 2, 251, 50, 224, 132, 2, 199, 2, + 224, 132, 1, 155, 224, 132, 1, 224, 145, 224, 132, 1, 234, 122, 224, 132, + 1, 233, 229, 224, 132, 1, 247, 173, 224, 132, 1, 247, 15, 224, 132, 1, + 225, 213, 224, 132, 1, 215, 108, 224, 132, 1, 201, 78, 224, 132, 1, 201, + 66, 224, 132, 1, 240, 40, 224, 132, 1, 240, 24, 224, 132, 1, 216, 85, + 224, 132, 1, 189, 224, 132, 1, 202, 233, 224, 132, 1, 240, 135, 224, 132, + 1, 239, 175, 224, 132, 1, 176, 224, 132, 1, 161, 224, 132, 1, 213, 5, + 224, 132, 1, 249, 144, 224, 132, 1, 248, 196, 224, 132, 1, 166, 224, 132, + 1, 164, 224, 132, 1, 169, 224, 132, 1, 172, 224, 132, 1, 199, 152, 224, + 132, 1, 207, 50, 224, 132, 1, 205, 80, 224, 132, 1, 183, 224, 132, 1, + 195, 115, 224, 132, 1, 142, 224, 132, 1, 224, 35, 224, 132, 1, 201, 46, + 224, 132, 1, 201, 47, 224, 132, 1, 199, 35, 224, 132, 2, 249, 79, 57, + 224, 132, 2, 247, 87, 224, 132, 2, 76, 60, 224, 132, 199, 7, 224, 132, + 17, 100, 224, 132, 17, 102, 224, 132, 17, 134, 224, 132, 17, 136, 224, + 132, 31, 203, 23, 224, 132, 31, 200, 234, 224, 132, 31, 97, 231, 56, 224, + 132, 31, 97, 170, 224, 132, 191, 97, 232, 224, 224, 132, 211, 213, 238, + 252, 224, 132, 211, 213, 4, 244, 248, 224, 132, 211, 213, 244, 248, 224, + 132, 211, 213, 241, 71, 154, 224, 132, 211, 213, 220, 54, 224, 132, 211, + 213, 221, 212, 224, 132, 211, 213, 240, 87, 224, 132, 211, 213, 52, 240, + 87, 224, 132, 211, 213, 222, 68, 37, 205, 159, 251, 9, 1, 232, 146, 37, + 205, 159, 251, 9, 1, 222, 239, 37, 205, 159, 251, 9, 1, 232, 86, 37, 205, + 159, 251, 9, 1, 219, 170, 37, 205, 159, 251, 9, 1, 211, 100, 37, 205, + 159, 251, 9, 1, 197, 117, 37, 205, 159, 251, 9, 1, 206, 211, 37, 205, + 159, 251, 9, 1, 210, 109, 37, 205, 159, 251, 9, 1, 248, 204, 37, 205, + 159, 251, 9, 1, 203, 82, 37, 205, 159, 251, 9, 1, 208, 199, 37, 205, 159, + 251, 9, 1, 225, 4, 37, 205, 159, 251, 9, 1, 215, 137, 37, 205, 159, 251, + 9, 1, 224, 127, 37, 205, 159, 251, 9, 1, 209, 5, 37, 205, 159, 251, 9, 1, + 208, 225, 37, 205, 159, 251, 9, 1, 235, 188, 37, 205, 159, 251, 9, 1, + 251, 163, 37, 205, 159, 251, 9, 1, 250, 114, 37, 205, 159, 251, 9, 1, + 239, 172, 37, 205, 159, 251, 9, 1, 233, 176, 37, 205, 159, 251, 9, 1, + 240, 99, 37, 205, 159, 251, 9, 1, 233, 217, 37, 205, 159, 251, 9, 1, 202, + 253, 37, 205, 159, 251, 9, 1, 195, 90, 37, 205, 159, 251, 9, 1, 239, 169, + 37, 205, 159, 251, 9, 1, 195, 240, 37, 205, 159, 251, 9, 1, 202, 219, 37, + 205, 159, 251, 9, 1, 202, 198, 37, 205, 159, 251, 9, 31, 100, 37, 205, + 159, 251, 9, 31, 235, 144, 37, 205, 159, 251, 9, 156, 226, 67, 37, 173, + 251, 9, 1, 232, 112, 37, 173, 251, 9, 1, 222, 248, 37, 173, 251, 9, 1, + 232, 235, 37, 173, 251, 9, 1, 219, 184, 37, 173, 251, 9, 1, 211, 151, 37, + 173, 251, 9, 1, 197, 117, 37, 173, 251, 9, 1, 236, 148, 37, 173, 251, 9, + 1, 210, 141, 37, 173, 251, 9, 1, 248, 238, 37, 173, 251, 9, 1, 203, 41, + 37, 173, 251, 9, 1, 236, 149, 37, 173, 251, 9, 1, 225, 34, 37, 173, 251, + 9, 1, 216, 30, 37, 173, 251, 9, 1, 224, 141, 37, 173, 251, 9, 1, 209, 8, + 37, 173, 251, 9, 1, 236, 147, 37, 173, 251, 9, 1, 235, 175, 37, 173, 251, + 9, 1, 251, 163, 37, 173, 251, 9, 1, 251, 193, 37, 173, 251, 9, 1, 240, + 129, 37, 173, 251, 9, 1, 234, 38, 37, 173, 251, 9, 1, 240, 106, 37, 173, + 251, 9, 1, 233, 224, 37, 173, 251, 9, 1, 203, 139, 37, 173, 251, 9, 1, + 195, 106, 37, 173, 251, 9, 1, 202, 225, 37, 173, 251, 9, 1, 196, 64, 37, + 173, 251, 9, 1, 202, 213, 37, 173, 251, 9, 1, 195, 109, 37, 173, 251, 9, + 31, 100, 37, 173, 251, 9, 31, 203, 23, 37, 173, 251, 9, 31, 200, 234, + 220, 52, 1, 251, 161, 220, 52, 1, 248, 204, 220, 52, 1, 248, 189, 220, + 52, 1, 233, 176, 220, 52, 1, 233, 202, 220, 52, 1, 240, 99, 220, 52, 1, + 232, 146, 220, 52, 1, 197, 117, 220, 52, 2, 200, 104, 220, 52, 1, 195, + 92, 220, 52, 1, 195, 67, 220, 52, 1, 225, 194, 220, 52, 1, 225, 175, 220, + 52, 1, 232, 86, 220, 52, 1, 202, 253, 220, 52, 1, 195, 240, 220, 52, 1, + 225, 4, 220, 52, 1, 196, 205, 220, 52, 1, 224, 134, 220, 52, 1, 222, 239, + 220, 52, 1, 239, 168, 220, 52, 1, 202, 224, 220, 52, 1, 219, 170, 220, + 52, 1, 215, 137, 220, 52, 1, 208, 225, 220, 52, 1, 250, 116, 220, 52, 1, + 252, 119, 220, 52, 1, 213, 91, 220, 52, 1, 235, 188, 220, 52, 1, 209, 5, + 220, 52, 1, 211, 100, 220, 52, 1, 196, 182, 220, 52, 1, 211, 127, 220, + 52, 1, 210, 109, 220, 52, 1, 206, 211, 220, 52, 1, 205, 48, 220, 52, 1, + 203, 82, 220, 52, 252, 29, 117, 57, 220, 52, 252, 29, 117, 60, 220, 52, + 31, 100, 220, 52, 31, 146, 220, 52, 31, 203, 23, 220, 52, 31, 200, 234, + 220, 52, 31, 97, 231, 56, 220, 52, 211, 213, 205, 7, 220, 52, 211, 213, + 235, 76, 220, 52, 211, 213, 52, 76, 197, 39, 238, 252, 220, 52, 211, 213, + 76, 197, 39, 238, 252, 220, 52, 211, 213, 238, 252, 220, 52, 211, 213, + 99, 238, 249, 220, 52, 211, 213, 222, 75, 235, 133, 250, 128, 1, 63, 250, + 128, 1, 252, 167, 250, 128, 1, 251, 48, 250, 128, 1, 252, 125, 250, 128, + 1, 251, 105, 250, 128, 1, 252, 127, 250, 128, 1, 251, 244, 250, 128, 1, + 251, 240, 250, 128, 1, 69, 250, 128, 1, 237, 53, 250, 128, 1, 72, 250, + 128, 1, 214, 101, 250, 128, 1, 68, 250, 128, 1, 226, 119, 250, 128, 1, + 66, 250, 128, 1, 199, 245, 250, 128, 1, 224, 208, 250, 128, 1, 196, 202, + 250, 128, 1, 196, 162, 250, 128, 1, 196, 173, 250, 128, 1, 234, 47, 250, + 128, 1, 234, 4, 250, 128, 1, 233, 215, 250, 128, 1, 247, 56, 250, 128, 1, + 225, 192, 250, 128, 1, 203, 68, 250, 128, 1, 202, 217, 250, 128, 1, 239, + 251, 250, 128, 1, 239, 166, 250, 128, 1, 201, 73, 250, 128, 1, 213, 91, + 250, 128, 1, 235, 188, 250, 128, 1, 249, 8, 250, 128, 1, 248, 191, 250, + 128, 1, 217, 57, 250, 128, 1, 216, 228, 250, 128, 1, 216, 229, 250, 128, + 1, 217, 117, 250, 128, 1, 215, 97, 250, 128, 1, 216, 80, 250, 128, 1, + 219, 206, 250, 128, 1, 231, 242, 250, 128, 1, 195, 165, 250, 128, 1, 196, + 69, 250, 128, 1, 199, 118, 250, 128, 1, 210, 182, 250, 128, 1, 222, 196, + 250, 128, 1, 208, 147, 250, 128, 1, 195, 88, 250, 128, 1, 206, 255, 250, + 128, 1, 195, 65, 250, 128, 1, 206, 119, 250, 128, 1, 205, 49, 250, 128, + 1, 232, 146, 250, 128, 252, 29, 78, 202, 70, 99, 238, 250, 127, 97, 76, + 211, 212, 4, 99, 238, 250, 127, 97, 76, 211, 212, 222, 227, 99, 238, 250, + 127, 97, 76, 211, 212, 222, 227, 97, 76, 127, 99, 238, 250, 211, 212, + 222, 227, 99, 209, 255, 127, 97, 210, 3, 211, 212, 222, 227, 97, 210, 3, + 127, 99, 209, 255, 211, 212, 226, 45, 213, 132, 1, 251, 161, 226, 45, + 213, 132, 1, 248, 204, 226, 45, 213, 132, 1, 233, 176, 226, 45, 213, 132, + 1, 240, 99, 226, 45, 213, 132, 1, 232, 146, 226, 45, 213, 132, 1, 197, + 117, 226, 45, 213, 132, 1, 195, 92, 226, 45, 213, 132, 1, 232, 86, 226, + 45, 213, 132, 1, 202, 253, 226, 45, 213, 132, 1, 195, 240, 226, 45, 213, + 132, 1, 225, 4, 226, 45, 213, 132, 1, 222, 239, 226, 45, 213, 132, 1, + 219, 170, 226, 45, 213, 132, 1, 215, 137, 226, 45, 213, 132, 1, 208, 225, + 226, 45, 213, 132, 1, 250, 116, 226, 45, 213, 132, 1, 213, 91, 226, 45, + 213, 132, 1, 209, 5, 226, 45, 213, 132, 1, 211, 100, 226, 45, 213, 132, + 1, 210, 109, 226, 45, 213, 132, 1, 206, 211, 226, 45, 213, 132, 1, 203, + 82, 226, 45, 213, 132, 31, 100, 226, 45, 213, 132, 31, 102, 226, 45, 213, + 132, 31, 134, 226, 45, 213, 132, 31, 136, 226, 45, 213, 132, 31, 203, 23, + 226, 45, 213, 132, 31, 200, 234, 226, 45, 213, 132, 31, 97, 231, 56, 226, + 45, 213, 132, 31, 97, 170, 226, 45, 213, 221, 1, 251, 161, 226, 45, 213, + 221, 1, 248, 204, 226, 45, 213, 221, 1, 233, 176, 226, 45, 213, 221, 1, + 240, 99, 226, 45, 213, 221, 1, 232, 146, 226, 45, 213, 221, 1, 197, 116, + 226, 45, 213, 221, 1, 195, 92, 226, 45, 213, 221, 1, 232, 86, 226, 45, + 213, 221, 1, 202, 253, 226, 45, 213, 221, 1, 195, 240, 226, 45, 213, 221, + 1, 225, 4, 226, 45, 213, 221, 1, 222, 239, 226, 45, 213, 221, 1, 219, + 169, 226, 45, 213, 221, 1, 215, 137, 226, 45, 213, 221, 1, 208, 225, 226, + 45, 213, 221, 1, 213, 91, 226, 45, 213, 221, 1, 209, 5, 226, 45, 213, + 221, 1, 206, 211, 226, 45, 213, 221, 1, 203, 82, 226, 45, 213, 221, 31, + 100, 226, 45, 213, 221, 31, 102, 226, 45, 213, 221, 31, 134, 226, 45, + 213, 221, 31, 136, 226, 45, 213, 221, 31, 203, 23, 226, 45, 213, 221, 31, + 200, 234, 226, 45, 213, 221, 31, 97, 231, 56, 226, 45, 213, 221, 31, 97, + 170, 211, 238, 213, 221, 1, 251, 161, 211, 238, 213, 221, 1, 248, 204, + 211, 238, 213, 221, 1, 233, 176, 211, 238, 213, 221, 1, 240, 99, 211, + 238, 213, 221, 1, 232, 146, 211, 238, 213, 221, 1, 197, 116, 211, 238, + 213, 221, 1, 195, 92, 211, 238, 213, 221, 1, 232, 86, 211, 238, 213, 221, + 1, 195, 240, 211, 238, 213, 221, 1, 225, 4, 211, 238, 213, 221, 1, 222, + 239, 211, 238, 213, 221, 1, 219, 169, 211, 238, 213, 221, 1, 215, 137, + 211, 238, 213, 221, 1, 208, 225, 211, 238, 213, 221, 1, 213, 91, 211, + 238, 213, 221, 1, 209, 5, 211, 238, 213, 221, 1, 206, 211, 211, 238, 213, + 221, 1, 203, 82, 211, 238, 213, 221, 208, 133, 78, 211, 238, 213, 221, + 163, 208, 133, 78, 211, 238, 213, 221, 235, 6, 238, 250, 3, 241, 60, 211, + 238, 213, 221, 235, 6, 238, 250, 3, 238, 252, 211, 238, 213, 221, 31, + 100, 211, 238, 213, 221, 31, 102, 211, 238, 213, 221, 31, 134, 211, 238, + 213, 221, 31, 136, 211, 238, 213, 221, 31, 203, 23, 211, 238, 213, 221, + 31, 200, 234, 211, 238, 213, 221, 31, 97, 231, 56, 37, 201, 7, 1, 214, + 60, 63, 37, 201, 7, 1, 196, 57, 63, 37, 201, 7, 1, 196, 57, 251, 244, 37, + 201, 7, 1, 214, 60, 68, 37, 201, 7, 1, 196, 57, 68, 37, 201, 7, 1, 196, + 57, 69, 37, 201, 7, 1, 214, 60, 72, 37, 201, 7, 1, 214, 60, 214, 163, 37, + 201, 7, 1, 196, 57, 214, 163, 37, 201, 7, 1, 214, 60, 252, 116, 37, 201, + 7, 1, 196, 57, 252, 116, 37, 201, 7, 1, 214, 60, 251, 243, 37, 201, 7, 1, + 196, 57, 251, 243, 37, 201, 7, 1, 214, 60, 251, 216, 37, 201, 7, 1, 196, + 57, 251, 216, 37, 201, 7, 1, 214, 60, 251, 238, 37, 201, 7, 1, 196, 57, + 251, 238, 37, 201, 7, 1, 214, 60, 252, 5, 37, 201, 7, 1, 196, 57, 252, 5, + 37, 201, 7, 1, 214, 60, 251, 242, 37, 201, 7, 1, 214, 60, 236, 55, 37, + 201, 7, 1, 196, 57, 236, 55, 37, 201, 7, 1, 214, 60, 250, 121, 37, 201, + 7, 1, 196, 57, 250, 121, 37, 201, 7, 1, 214, 60, 251, 225, 37, 201, 7, 1, + 196, 57, 251, 225, 37, 201, 7, 1, 214, 60, 251, 236, 37, 201, 7, 1, 196, + 57, 251, 236, 37, 201, 7, 1, 214, 60, 214, 161, 37, 201, 7, 1, 196, 57, + 214, 161, 37, 201, 7, 1, 214, 60, 251, 172, 37, 201, 7, 1, 196, 57, 251, + 172, 37, 201, 7, 1, 214, 60, 251, 235, 37, 201, 7, 1, 214, 60, 236, 244, + 37, 201, 7, 1, 214, 60, 236, 240, 37, 201, 7, 1, 214, 60, 251, 105, 37, + 201, 7, 1, 214, 60, 251, 233, 37, 201, 7, 1, 196, 57, 251, 233, 37, 201, + 7, 1, 214, 60, 236, 206, 37, 201, 7, 1, 196, 57, 236, 206, 37, 201, 7, 1, + 214, 60, 236, 226, 37, 201, 7, 1, 196, 57, 236, 226, 37, 201, 7, 1, 214, + 60, 236, 192, 37, 201, 7, 1, 196, 57, 236, 192, 37, 201, 7, 1, 196, 57, + 251, 96, 37, 201, 7, 1, 214, 60, 236, 214, 37, 201, 7, 1, 196, 57, 251, + 232, 37, 201, 7, 1, 214, 60, 236, 182, 37, 201, 7, 1, 214, 60, 214, 92, + 37, 201, 7, 1, 214, 60, 230, 202, 37, 201, 7, 1, 214, 60, 237, 61, 37, + 201, 7, 1, 196, 57, 237, 61, 37, 201, 7, 1, 214, 60, 251, 17, 37, 201, 7, + 1, 196, 57, 251, 17, 37, 201, 7, 1, 214, 60, 226, 2, 37, 201, 7, 1, 196, + 57, 226, 2, 37, 201, 7, 1, 214, 60, 214, 73, 37, 201, 7, 1, 196, 57, 214, + 73, 37, 201, 7, 1, 214, 60, 251, 13, 37, 201, 7, 1, 196, 57, 251, 13, 37, + 201, 7, 1, 214, 60, 251, 231, 37, 201, 7, 1, 214, 60, 250, 201, 37, 201, + 7, 1, 214, 60, 251, 229, 37, 201, 7, 1, 214, 60, 250, 194, 37, 201, 7, 1, + 196, 57, 250, 194, 37, 201, 7, 1, 214, 60, 236, 140, 37, 201, 7, 1, 196, + 57, 236, 140, 37, 201, 7, 1, 214, 60, 250, 167, 37, 201, 7, 1, 196, 57, + 250, 167, 37, 201, 7, 1, 214, 60, 251, 226, 37, 201, 7, 1, 196, 57, 251, + 226, 37, 201, 7, 1, 214, 60, 214, 48, 37, 201, 7, 1, 214, 60, 249, 62, + 37, 160, 6, 1, 63, 37, 160, 6, 1, 252, 167, 37, 160, 6, 1, 237, 63, 37, + 160, 6, 1, 251, 117, 37, 160, 6, 1, 237, 61, 37, 160, 6, 1, 236, 226, 37, + 160, 6, 1, 237, 58, 37, 160, 6, 1, 237, 57, 37, 160, 6, 1, 251, 99, 37, + 160, 6, 1, 69, 37, 160, 6, 1, 244, 203, 69, 37, 160, 6, 1, 237, 53, 37, + 160, 6, 1, 237, 46, 37, 160, 6, 1, 237, 45, 37, 160, 6, 1, 237, 42, 37, + 160, 6, 1, 237, 39, 37, 160, 6, 1, 68, 37, 160, 6, 1, 226, 119, 37, 160, + 6, 1, 237, 16, 37, 160, 6, 1, 237, 13, 37, 160, 6, 1, 251, 180, 37, 160, + 6, 1, 200, 45, 37, 160, 6, 1, 237, 6, 37, 160, 6, 1, 236, 243, 37, 160, + 6, 1, 236, 240, 37, 160, 6, 1, 236, 229, 37, 160, 6, 1, 236, 192, 37, + 160, 6, 1, 72, 37, 160, 6, 1, 214, 101, 37, 160, 6, 1, 216, 185, 214, + 163, 37, 160, 6, 1, 209, 130, 214, 163, 37, 160, 6, 1, 214, 162, 37, 160, + 6, 1, 236, 182, 37, 160, 6, 1, 236, 234, 37, 160, 6, 1, 236, 162, 37, + 160, 6, 1, 206, 182, 236, 162, 37, 160, 6, 1, 236, 150, 37, 160, 6, 1, + 236, 129, 37, 160, 6, 1, 236, 127, 37, 160, 6, 1, 236, 206, 37, 160, 6, + 1, 236, 116, 37, 160, 6, 1, 237, 59, 37, 160, 6, 1, 66, 37, 160, 6, 1, + 199, 245, 37, 160, 6, 1, 216, 185, 200, 99, 37, 160, 6, 1, 209, 130, 200, + 99, 37, 160, 6, 1, 236, 103, 37, 160, 6, 1, 236, 55, 37, 160, 6, 1, 236, + 50, 37, 160, 6, 1, 236, 205, 55, 37, 160, 6, 1, 200, 4, 37, 160, 4, 1, + 63, 37, 160, 4, 1, 252, 167, 37, 160, 4, 1, 237, 63, 37, 160, 4, 1, 251, + 117, 37, 160, 4, 1, 237, 61, 37, 160, 4, 1, 236, 226, 37, 160, 4, 1, 237, + 58, 37, 160, 4, 1, 237, 57, 37, 160, 4, 1, 251, 99, 37, 160, 4, 1, 69, + 37, 160, 4, 1, 244, 203, 69, 37, 160, 4, 1, 237, 53, 37, 160, 4, 1, 237, + 46, 37, 160, 4, 1, 237, 45, 37, 160, 4, 1, 237, 42, 37, 160, 4, 1, 237, + 39, 37, 160, 4, 1, 68, 37, 160, 4, 1, 226, 119, 37, 160, 4, 1, 237, 16, + 37, 160, 4, 1, 237, 13, 37, 160, 4, 1, 251, 180, 37, 160, 4, 1, 200, 45, + 37, 160, 4, 1, 237, 6, 37, 160, 4, 1, 236, 243, 37, 160, 4, 1, 236, 240, + 37, 160, 4, 1, 236, 229, 37, 160, 4, 1, 236, 192, 37, 160, 4, 1, 72, 37, + 160, 4, 1, 214, 101, 37, 160, 4, 1, 216, 185, 214, 163, 37, 160, 4, 1, + 209, 130, 214, 163, 37, 160, 4, 1, 214, 162, 37, 160, 4, 1, 236, 182, 37, + 160, 4, 1, 236, 234, 37, 160, 4, 1, 236, 162, 37, 160, 4, 1, 206, 182, + 236, 162, 37, 160, 4, 1, 236, 150, 37, 160, 4, 1, 236, 129, 37, 160, 4, + 1, 236, 127, 37, 160, 4, 1, 236, 206, 37, 160, 4, 1, 236, 116, 37, 160, + 4, 1, 237, 59, 37, 160, 4, 1, 66, 37, 160, 4, 1, 199, 245, 37, 160, 4, 1, + 216, 185, 200, 99, 37, 160, 4, 1, 209, 130, 200, 99, 37, 160, 4, 1, 236, + 103, 37, 160, 4, 1, 236, 55, 37, 160, 4, 1, 236, 50, 37, 160, 4, 1, 236, + 205, 55, 37, 160, 4, 1, 200, 4, 37, 160, 31, 100, 37, 160, 31, 146, 37, + 160, 31, 203, 23, 37, 160, 31, 235, 144, 37, 160, 31, 97, 231, 56, 37, + 160, 31, 97, 170, 232, 179, 209, 214, 1, 63, 232, 179, 209, 214, 1, 249, + 144, 232, 179, 209, 214, 1, 161, 232, 179, 209, 214, 1, 189, 232, 179, + 209, 214, 1, 201, 78, 232, 179, 209, 214, 1, 225, 213, 232, 179, 209, + 214, 1, 247, 173, 232, 179, 209, 214, 1, 142, 232, 179, 209, 214, 1, 224, + 145, 232, 179, 209, 214, 1, 235, 238, 232, 179, 209, 214, 1, 240, 135, + 232, 179, 209, 214, 1, 240, 40, 232, 179, 209, 214, 1, 169, 232, 179, + 209, 214, 1, 209, 181, 232, 179, 209, 214, 1, 195, 115, 232, 179, 209, + 214, 1, 183, 232, 179, 209, 214, 1, 207, 50, 232, 179, 209, 214, 1, 155, + 232, 179, 209, 214, 1, 234, 122, 232, 179, 209, 214, 1, 172, 232, 179, + 209, 214, 1, 166, 232, 179, 209, 214, 1, 176, 232, 179, 209, 214, 1, 197, + 166, 232, 179, 209, 214, 1, 224, 71, 197, 166, 232, 179, 209, 214, 1, + 164, 232, 179, 209, 214, 1, 224, 71, 164, 232, 179, 209, 214, 1, 217, 70, + 232, 179, 209, 214, 1, 215, 108, 232, 179, 209, 214, 1, 199, 152, 232, + 179, 209, 214, 18, 63, 232, 179, 209, 214, 18, 68, 232, 179, 209, 214, + 18, 66, 232, 179, 209, 214, 18, 69, 232, 179, 209, 214, 18, 72, 232, 179, + 209, 214, 117, 208, 245, 232, 179, 209, 214, 117, 218, 0, 224, 112, 232, + 179, 209, 214, 2, 232, 173, 232, 179, 209, 214, 2, 203, 138, 232, 179, + 209, 214, 2, 203, 113, 232, 179, 209, 214, 2, 203, 95, 232, 179, 209, + 214, 17, 195, 79, 232, 179, 209, 214, 17, 100, 232, 179, 209, 214, 17, + 102, 232, 179, 209, 214, 17, 134, 232, 179, 209, 214, 17, 136, 232, 179, + 209, 214, 17, 146, 232, 179, 209, 214, 17, 167, 232, 179, 209, 214, 17, + 178, 232, 179, 209, 214, 17, 171, 232, 179, 209, 214, 17, 182, 209, 118, + 17, 100, 209, 118, 17, 102, 209, 118, 17, 134, 209, 118, 17, 136, 209, + 118, 17, 146, 209, 118, 17, 167, 209, 118, 17, 178, 209, 118, 17, 171, + 209, 118, 17, 182, 209, 118, 31, 203, 23, 209, 118, 31, 200, 234, 209, + 118, 31, 202, 177, 209, 118, 31, 235, 13, 209, 118, 31, 235, 144, 209, + 118, 31, 206, 13, 209, 118, 31, 207, 65, 209, 118, 31, 237, 19, 209, 118, + 31, 216, 173, 209, 118, 31, 97, 231, 56, 209, 118, 31, 99, 231, 56, 209, + 118, 31, 115, 231, 56, 209, 118, 31, 235, 6, 231, 56, 209, 118, 31, 235, + 100, 231, 56, 209, 118, 31, 206, 29, 231, 56, 209, 118, 31, 207, 71, 231, + 56, 209, 118, 31, 237, 30, 231, 56, 209, 118, 31, 216, 178, 231, 56, 209, + 118, 191, 97, 232, 224, 209, 118, 191, 97, 211, 86, 209, 118, 191, 97, + 202, 184, 209, 118, 191, 99, 202, 181, 37, 205, 182, 1, 251, 161, 37, + 205, 182, 1, 48, 251, 161, 37, 205, 182, 1, 248, 204, 37, 205, 182, 1, + 48, 248, 204, 37, 205, 182, 1, 233, 176, 37, 205, 182, 1, 232, 146, 37, + 205, 182, 1, 48, 232, 146, 37, 205, 182, 1, 197, 117, 37, 205, 182, 1, + 195, 92, 37, 205, 182, 1, 232, 86, 37, 205, 182, 1, 195, 240, 37, 205, + 182, 1, 225, 4, 37, 205, 182, 1, 222, 239, 37, 205, 182, 1, 219, 170, 37, + 205, 182, 1, 215, 137, 37, 205, 182, 1, 48, 215, 137, 37, 205, 182, 1, + 48, 215, 138, 3, 83, 203, 135, 37, 205, 182, 1, 208, 225, 37, 205, 182, + 1, 250, 116, 37, 205, 182, 1, 251, 130, 250, 116, 37, 205, 182, 1, 213, + 91, 37, 205, 182, 1, 209, 5, 37, 205, 182, 1, 48, 209, 5, 37, 205, 182, + 1, 48, 209, 6, 3, 83, 203, 135, 37, 205, 182, 1, 210, 107, 37, 205, 182, + 1, 206, 211, 37, 205, 182, 1, 203, 82, 37, 205, 182, 1, 48, 203, 82, 37, + 205, 182, 1, 48, 203, 83, 3, 83, 203, 135, 37, 205, 182, 31, 100, 37, + 205, 182, 31, 102, 37, 205, 182, 31, 134, 37, 205, 182, 31, 136, 37, 205, + 182, 31, 146, 37, 205, 182, 31, 203, 23, 37, 205, 182, 31, 200, 234, 37, + 205, 182, 31, 202, 177, 37, 205, 182, 31, 97, 231, 56, 37, 205, 182, 191, + 97, 232, 224, 37, 205, 182, 33, 250, 115, 205, 182, 1, 251, 161, 205, + 182, 1, 248, 204, 205, 182, 1, 233, 176, 205, 182, 1, 232, 146, 205, 182, + 1, 197, 117, 205, 182, 1, 195, 92, 205, 182, 1, 232, 86, 205, 182, 1, + 195, 240, 205, 182, 1, 225, 4, 205, 182, 1, 222, 239, 205, 182, 1, 219, + 170, 205, 182, 1, 215, 137, 205, 182, 1, 208, 225, 205, 182, 1, 250, 116, + 205, 182, 1, 213, 91, 205, 182, 1, 209, 5, 205, 182, 1, 210, 108, 205, + 182, 1, 206, 211, 205, 182, 1, 203, 82, 205, 182, 1, 235, 159, 205, 182, + 1, 222, 141, 205, 182, 226, 72, 206, 211, 205, 182, 38, 76, 60, 205, 182, + 38, 99, 238, 250, 60, 205, 182, 38, 76, 57, 205, 182, 38, 99, 238, 250, + 57, 205, 182, 38, 241, 11, 57, 205, 182, 38, 241, 11, 60, 205, 182, 38, + 231, 164, 57, 205, 182, 38, 231, 164, 60, 205, 182, 38, 181, 231, 164, + 60, 205, 182, 38, 210, 110, 60, 205, 182, 38, 204, 196, 60, 205, 182, 31, + 100, 205, 182, 31, 203, 23, 205, 182, 31, 200, 234, 205, 182, 31, 97, + 231, 56, 205, 182, 211, 213, 99, 83, 249, 67, 205, 182, 211, 213, 99, 83, + 249, 68, 3, 238, 249, 205, 182, 211, 213, 244, 249, 3, 238, 252, 205, + 182, 211, 213, 99, 244, 246, 3, 238, 249, 205, 182, 211, 213, 157, 244, + 249, 3, 238, 252, 236, 242, 1, 251, 161, 236, 242, 1, 248, 204, 236, 242, + 1, 233, 176, 236, 242, 1, 240, 99, 236, 242, 1, 232, 146, 236, 242, 1, + 197, 117, 236, 242, 1, 195, 92, 236, 242, 1, 232, 86, 236, 242, 1, 202, + 253, 236, 242, 1, 195, 240, 236, 242, 1, 225, 4, 236, 242, 1, 222, 239, + 236, 242, 1, 219, 170, 236, 242, 1, 215, 137, 236, 242, 1, 208, 225, 236, + 242, 1, 250, 116, 236, 242, 1, 213, 91, 236, 242, 1, 209, 5, 236, 242, 1, + 211, 100, 236, 242, 1, 210, 109, 236, 242, 1, 206, 211, 236, 242, 1, 203, + 82, 236, 242, 33, 195, 91, 158, 2, 247, 132, 158, 2, 251, 50, 158, 2, + 199, 2, 158, 2, 225, 164, 158, 2, 200, 34, 158, 1, 63, 158, 1, 252, 167, + 158, 1, 68, 158, 1, 226, 119, 158, 1, 66, 158, 1, 199, 245, 158, 1, 110, + 144, 158, 1, 110, 209, 182, 158, 1, 110, 159, 158, 1, 110, 222, 37, 158, + 1, 69, 158, 1, 251, 199, 158, 1, 72, 158, 1, 250, 149, 158, 1, 155, 158, + 1, 224, 145, 158, 1, 234, 122, 158, 1, 233, 229, 158, 1, 217, 70, 158, 1, + 247, 173, 158, 1, 247, 15, 158, 1, 225, 213, 158, 1, 225, 179, 158, 1, + 215, 108, 158, 1, 201, 78, 158, 1, 201, 66, 158, 1, 240, 40, 158, 1, 240, + 24, 158, 1, 216, 85, 158, 1, 189, 158, 1, 202, 233, 158, 1, 240, 135, + 158, 1, 239, 175, 158, 1, 176, 158, 1, 161, 158, 1, 213, 5, 158, 1, 249, + 144, 158, 1, 248, 196, 158, 1, 166, 158, 1, 164, 158, 1, 169, 158, 1, + 172, 158, 1, 199, 152, 158, 1, 207, 50, 158, 1, 205, 80, 158, 1, 183, + 158, 1, 142, 158, 1, 222, 36, 158, 1, 37, 42, 222, 25, 158, 1, 37, 42, + 209, 181, 158, 1, 37, 42, 216, 67, 158, 18, 2, 252, 167, 158, 18, 2, 248, + 192, 252, 167, 158, 18, 2, 68, 158, 18, 2, 226, 119, 158, 18, 2, 66, 158, + 18, 2, 199, 245, 158, 18, 2, 110, 144, 158, 18, 2, 110, 209, 182, 158, + 18, 2, 110, 159, 158, 18, 2, 110, 222, 37, 158, 18, 2, 69, 158, 18, 2, + 251, 199, 158, 18, 2, 72, 158, 18, 2, 250, 149, 158, 199, 7, 158, 240, + 87, 158, 52, 240, 87, 158, 211, 213, 238, 252, 158, 211, 213, 52, 238, + 252, 158, 211, 213, 222, 74, 158, 211, 213, 241, 71, 154, 158, 211, 213, + 221, 212, 158, 31, 100, 158, 31, 102, 158, 31, 134, 158, 31, 136, 158, + 31, 146, 158, 31, 167, 158, 31, 178, 158, 31, 171, 158, 31, 182, 158, 31, + 203, 23, 158, 31, 200, 234, 158, 31, 202, 177, 158, 31, 235, 13, 158, 31, + 235, 144, 158, 31, 206, 13, 158, 31, 207, 65, 158, 31, 237, 19, 158, 31, + 216, 173, 158, 31, 97, 231, 56, 158, 31, 97, 170, 158, 17, 195, 79, 158, + 17, 100, 158, 17, 102, 158, 17, 134, 158, 17, 136, 158, 17, 146, 158, 17, + 167, 158, 17, 178, 158, 17, 171, 158, 17, 182, 158, 31, 225, 123, 225, + 27, 2, 247, 132, 225, 27, 2, 251, 50, 225, 27, 2, 199, 2, 225, 27, 1, 63, + 225, 27, 1, 252, 167, 225, 27, 1, 68, 225, 27, 1, 226, 119, 225, 27, 1, + 66, 225, 27, 1, 199, 245, 225, 27, 1, 69, 225, 27, 1, 251, 199, 225, 27, + 1, 72, 225, 27, 1, 250, 149, 225, 27, 1, 155, 225, 27, 1, 224, 145, 225, + 27, 1, 234, 122, 225, 27, 1, 233, 229, 225, 27, 1, 217, 70, 225, 27, 1, + 247, 173, 225, 27, 1, 247, 15, 225, 27, 1, 225, 213, 225, 27, 1, 225, + 179, 225, 27, 1, 215, 108, 225, 27, 1, 201, 78, 225, 27, 1, 201, 66, 225, + 27, 1, 240, 40, 225, 27, 1, 240, 29, 225, 27, 1, 240, 24, 225, 27, 1, + 210, 77, 225, 27, 1, 216, 85, 225, 27, 1, 189, 225, 27, 1, 202, 233, 225, + 27, 1, 240, 135, 225, 27, 1, 239, 175, 225, 27, 1, 176, 225, 27, 1, 161, + 225, 27, 1, 213, 5, 225, 27, 1, 249, 144, 225, 27, 1, 248, 196, 225, 27, + 1, 166, 225, 27, 1, 164, 225, 27, 1, 169, 225, 27, 1, 172, 225, 27, 1, + 199, 152, 225, 27, 1, 207, 50, 225, 27, 1, 205, 80, 225, 27, 1, 183, 225, + 27, 1, 142, 225, 27, 18, 2, 252, 167, 225, 27, 18, 2, 68, 225, 27, 18, 2, + 226, 119, 225, 27, 18, 2, 66, 225, 27, 18, 2, 199, 245, 225, 27, 18, 2, + 69, 225, 27, 18, 2, 251, 199, 225, 27, 18, 2, 72, 225, 27, 18, 2, 250, + 149, 225, 27, 2, 199, 7, 225, 27, 2, 215, 148, 225, 27, 252, 29, 55, 225, + 27, 236, 195, 55, 225, 27, 31, 55, 225, 27, 208, 133, 78, 225, 27, 52, + 208, 133, 78, 225, 27, 240, 87, 225, 27, 52, 240, 87, 225, 27, 31, 2, 57, + 205, 167, 205, 175, 1, 208, 254, 205, 167, 205, 175, 1, 203, 139, 205, + 167, 205, 175, 1, 249, 114, 205, 167, 205, 175, 1, 247, 162, 205, 167, + 205, 175, 1, 240, 115, 205, 167, 205, 175, 1, 234, 107, 205, 167, 205, + 175, 1, 220, 88, 205, 167, 205, 175, 1, 217, 67, 205, 167, 205, 175, 1, + 223, 56, 205, 167, 205, 175, 1, 217, 230, 205, 167, 205, 175, 1, 199, + 148, 205, 167, 205, 175, 1, 213, 222, 205, 167, 205, 175, 1, 196, 110, + 205, 167, 205, 175, 1, 210, 225, 205, 167, 205, 175, 1, 232, 235, 205, + 167, 205, 175, 1, 225, 32, 205, 167, 205, 175, 1, 225, 207, 205, 167, + 205, 175, 1, 215, 105, 205, 167, 205, 175, 1, 251, 208, 205, 167, 205, + 175, 1, 237, 51, 205, 167, 205, 175, 1, 226, 120, 205, 167, 205, 175, 1, + 200, 92, 205, 167, 205, 175, 1, 214, 148, 205, 167, 205, 175, 1, 237, 39, + 205, 167, 205, 175, 1, 220, 103, 205, 167, 205, 175, 17, 195, 79, 205, + 167, 205, 175, 17, 100, 205, 167, 205, 175, 17, 102, 205, 167, 205, 175, + 17, 134, 205, 167, 205, 175, 17, 136, 205, 167, 205, 175, 17, 146, 205, + 167, 205, 175, 17, 167, 205, 167, 205, 175, 17, 178, 205, 167, 205, 175, + 17, 171, 205, 167, 205, 175, 17, 182, 247, 9, 2, 247, 132, 247, 9, 2, + 251, 50, 247, 9, 2, 199, 2, 247, 9, 1, 252, 167, 247, 9, 1, 68, 247, 9, + 1, 66, 247, 9, 1, 69, 247, 9, 1, 225, 54, 247, 9, 1, 224, 144, 247, 9, 1, + 234, 119, 247, 9, 1, 233, 228, 247, 9, 1, 217, 69, 247, 9, 1, 247, 172, + 247, 9, 1, 247, 14, 247, 9, 1, 225, 212, 247, 9, 1, 225, 178, 247, 9, 1, + 215, 107, 247, 9, 1, 201, 77, 247, 9, 1, 201, 65, 247, 9, 1, 240, 39, + 247, 9, 1, 240, 23, 247, 9, 1, 216, 84, 247, 9, 1, 203, 162, 247, 9, 1, + 202, 232, 247, 9, 1, 240, 134, 247, 9, 1, 239, 174, 247, 9, 1, 217, 243, + 247, 9, 1, 213, 242, 247, 9, 1, 213, 4, 247, 9, 1, 249, 142, 247, 9, 1, + 248, 195, 247, 9, 1, 220, 118, 247, 9, 1, 195, 166, 247, 9, 1, 196, 129, + 247, 9, 1, 210, 243, 247, 9, 1, 223, 81, 247, 9, 1, 197, 160, 247, 9, 1, + 209, 13, 247, 9, 1, 232, 245, 247, 9, 18, 2, 63, 247, 9, 18, 2, 68, 247, + 9, 18, 2, 226, 119, 247, 9, 18, 2, 66, 247, 9, 18, 2, 199, 245, 247, 9, + 18, 2, 69, 247, 9, 18, 2, 251, 199, 247, 9, 18, 2, 72, 247, 9, 18, 2, + 250, 149, 247, 9, 18, 2, 214, 145, 247, 9, 177, 78, 247, 9, 250, 150, 78, + 247, 9, 199, 7, 247, 9, 220, 116, 247, 9, 17, 195, 79, 247, 9, 17, 100, + 247, 9, 17, 102, 247, 9, 17, 134, 247, 9, 17, 136, 247, 9, 17, 146, 247, + 9, 17, 167, 247, 9, 17, 178, 247, 9, 17, 171, 247, 9, 17, 182, 247, 9, + 208, 133, 78, 247, 9, 240, 87, 247, 9, 52, 240, 87, 247, 9, 211, 78, 78, + 247, 9, 1, 222, 120, 247, 9, 18, 2, 252, 167, 247, 9, 18, 2, 237, 32, + 220, 86, 1, 63, 220, 86, 1, 68, 220, 86, 1, 66, 220, 86, 1, 69, 220, 86, + 1, 72, 220, 86, 1, 155, 220, 86, 1, 224, 145, 220, 86, 1, 234, 122, 220, + 86, 1, 233, 229, 220, 86, 1, 247, 173, 220, 86, 1, 247, 15, 220, 86, 1, + 225, 213, 220, 86, 1, 225, 179, 220, 86, 1, 215, 108, 220, 86, 1, 201, + 78, 220, 86, 1, 201, 66, 220, 86, 1, 240, 40, 220, 86, 1, 240, 24, 220, + 86, 1, 216, 85, 220, 86, 1, 189, 220, 86, 1, 202, 233, 220, 86, 1, 240, + 135, 220, 86, 1, 239, 175, 220, 86, 1, 176, 220, 86, 1, 161, 220, 86, 1, + 213, 5, 220, 86, 1, 249, 144, 220, 86, 1, 248, 196, 220, 86, 1, 166, 220, + 86, 1, 169, 220, 86, 1, 172, 220, 86, 1, 199, 152, 220, 86, 1, 183, 220, + 86, 1, 142, 220, 86, 1, 209, 181, 220, 86, 2, 215, 148, 220, 86, 252, 29, + 55, 220, 86, 208, 133, 78, 220, 86, 33, 206, 159, 207, 15, 2, 247, 132, + 207, 15, 2, 251, 50, 207, 15, 2, 199, 2, 207, 15, 1, 63, 207, 15, 1, 252, + 167, 207, 15, 1, 68, 207, 15, 1, 226, 119, 207, 15, 1, 66, 207, 15, 1, + 199, 245, 207, 15, 1, 110, 144, 207, 15, 1, 110, 209, 182, 207, 15, 1, + 110, 159, 207, 15, 1, 110, 222, 37, 207, 15, 1, 69, 207, 15, 1, 251, 199, + 207, 15, 1, 72, 207, 15, 1, 250, 149, 207, 15, 1, 155, 207, 15, 1, 224, + 145, 207, 15, 1, 234, 122, 207, 15, 1, 233, 229, 207, 15, 1, 217, 70, + 207, 15, 1, 247, 173, 207, 15, 1, 247, 15, 207, 15, 1, 225, 213, 207, 15, + 1, 225, 179, 207, 15, 1, 215, 108, 207, 15, 1, 201, 78, 207, 15, 1, 201, + 66, 207, 15, 1, 240, 40, 207, 15, 1, 240, 24, 207, 15, 1, 216, 85, 207, + 15, 1, 189, 207, 15, 1, 202, 233, 207, 15, 1, 240, 135, 207, 15, 1, 239, + 175, 207, 15, 1, 176, 207, 15, 1, 161, 207, 15, 1, 213, 5, 207, 15, 1, + 249, 144, 207, 15, 1, 248, 196, 207, 15, 1, 166, 207, 15, 1, 164, 207, + 15, 1, 169, 207, 15, 1, 172, 207, 15, 1, 222, 36, 207, 15, 1, 199, 152, + 207, 15, 1, 207, 50, 207, 15, 1, 205, 80, 207, 15, 1, 183, 207, 15, 1, + 142, 207, 15, 18, 2, 252, 167, 207, 15, 18, 2, 68, 207, 15, 18, 2, 226, + 119, 207, 15, 18, 2, 66, 207, 15, 18, 2, 199, 245, 207, 15, 18, 2, 110, + 144, 207, 15, 18, 2, 110, 209, 182, 207, 15, 18, 2, 110, 159, 207, 15, + 18, 2, 110, 222, 37, 207, 15, 18, 2, 69, 207, 15, 18, 2, 251, 199, 207, + 15, 18, 2, 72, 207, 15, 18, 2, 250, 149, 207, 15, 2, 199, 7, 207, 15, 2, + 250, 131, 207, 15, 2, 225, 164, 207, 15, 2, 200, 34, 207, 15, 214, 126, + 207, 15, 240, 87, 207, 15, 52, 240, 87, 207, 15, 252, 29, 55, 207, 15, + 207, 90, 207, 15, 208, 215, 78, 207, 15, 2, 215, 148, 207, 15, 18, 73, + 78, 207, 15, 236, 74, 206, 182, 18, 78, 207, 15, 204, 75, 78, 207, 15, + 17, 195, 79, 207, 15, 17, 100, 207, 15, 17, 102, 207, 15, 17, 134, 207, + 15, 17, 136, 207, 15, 17, 146, 207, 15, 17, 167, 207, 15, 17, 178, 207, + 15, 17, 171, 207, 15, 17, 182, 207, 15, 237, 12, 207, 15, 2, 206, 100, + 207, 15, 232, 129, 207, 15, 241, 127, 55, 207, 15, 208, 133, 220, 27, + 207, 15, 208, 133, 220, 26, 153, 250, 250, 17, 100, 153, 250, 250, 17, + 102, 153, 250, 250, 17, 134, 153, 250, 250, 17, 136, 153, 250, 250, 17, + 146, 153, 250, 250, 17, 167, 153, 250, 250, 17, 178, 153, 250, 250, 17, + 171, 153, 250, 250, 17, 182, 153, 250, 250, 31, 203, 23, 153, 250, 250, + 31, 200, 234, 153, 250, 250, 31, 202, 177, 153, 250, 250, 31, 235, 13, + 153, 250, 250, 31, 235, 144, 153, 250, 250, 31, 206, 13, 153, 250, 250, + 31, 207, 65, 153, 250, 250, 31, 237, 19, 153, 250, 250, 31, 216, 173, + 153, 250, 250, 31, 97, 231, 56, 153, 250, 250, 31, 97, 170, 224, 115, 1, + 63, 224, 115, 1, 252, 167, 224, 115, 1, 68, 224, 115, 1, 66, 224, 115, 1, + 69, 224, 115, 1, 251, 199, 224, 115, 1, 72, 224, 115, 1, 250, 149, 224, + 115, 1, 155, 224, 115, 1, 224, 145, 224, 115, 1, 234, 122, 224, 115, 1, + 234, 9, 224, 115, 1, 233, 229, 224, 115, 1, 217, 70, 224, 115, 1, 247, + 173, 224, 115, 1, 247, 15, 224, 115, 1, 225, 213, 224, 115, 1, 225, 157, + 224, 115, 1, 215, 108, 224, 115, 1, 201, 78, 224, 115, 1, 201, 66, 224, + 115, 1, 240, 40, 224, 115, 1, 240, 24, 224, 115, 1, 216, 85, 224, 115, 1, + 189, 224, 115, 1, 202, 233, 224, 115, 1, 240, 135, 224, 115, 1, 240, 30, + 224, 115, 1, 239, 175, 224, 115, 1, 176, 224, 115, 1, 161, 224, 115, 1, + 213, 5, 224, 115, 1, 249, 144, 224, 115, 1, 249, 44, 224, 115, 1, 248, + 196, 224, 115, 1, 166, 224, 115, 1, 164, 224, 115, 1, 169, 224, 115, 1, + 172, 224, 115, 1, 199, 152, 224, 115, 1, 183, 224, 115, 1, 142, 224, 115, + 1, 222, 36, 224, 115, 18, 2, 252, 167, 224, 115, 18, 2, 68, 224, 115, 18, + 2, 226, 119, 224, 115, 18, 2, 66, 224, 115, 18, 2, 69, 224, 115, 18, 2, + 251, 199, 224, 115, 18, 2, 72, 224, 115, 18, 2, 250, 149, 224, 115, 2, + 251, 50, 224, 115, 2, 199, 7, 224, 115, 2, 215, 148, 224, 115, 2, 207, + 40, 224, 115, 240, 87, 224, 115, 52, 240, 87, 224, 115, 197, 9, 207, 90, + 224, 115, 208, 133, 78, 224, 115, 52, 208, 133, 78, 224, 115, 252, 29, + 55, 224, 115, 2, 204, 119, 218, 123, 1, 63, 218, 123, 1, 68, 218, 123, 1, + 66, 218, 123, 1, 69, 218, 123, 1, 155, 218, 123, 1, 224, 145, 218, 123, + 1, 234, 122, 218, 123, 1, 233, 229, 218, 123, 1, 247, 173, 218, 123, 1, + 247, 15, 218, 123, 1, 225, 213, 218, 123, 1, 225, 157, 218, 123, 1, 215, + 108, 218, 123, 1, 201, 78, 218, 123, 1, 201, 66, 218, 123, 1, 240, 40, + 218, 123, 1, 240, 30, 218, 123, 1, 240, 24, 218, 123, 1, 216, 85, 218, + 123, 1, 189, 218, 123, 1, 202, 233, 218, 123, 1, 240, 135, 218, 123, 1, + 239, 175, 218, 123, 1, 176, 218, 123, 1, 161, 218, 123, 1, 213, 5, 218, + 123, 1, 249, 144, 218, 123, 1, 248, 196, 218, 123, 1, 166, 218, 123, 1, + 164, 218, 123, 1, 169, 218, 123, 1, 172, 218, 123, 1, 199, 152, 218, 123, + 1, 183, 218, 123, 1, 142, 218, 123, 1, 209, 181, 218, 123, 1, 210, 77, + 218, 123, 208, 133, 78, 224, 106, 1, 63, 224, 106, 1, 252, 167, 224, 106, + 1, 68, 224, 106, 1, 226, 119, 224, 106, 1, 66, 224, 106, 1, 199, 245, + 224, 106, 1, 69, 224, 106, 1, 251, 199, 224, 106, 1, 72, 224, 106, 1, + 250, 149, 224, 106, 1, 155, 224, 106, 1, 224, 145, 224, 106, 1, 234, 122, + 224, 106, 1, 234, 9, 224, 106, 1, 233, 229, 224, 106, 1, 217, 70, 224, + 106, 1, 247, 173, 224, 106, 1, 247, 15, 224, 106, 1, 225, 213, 224, 106, + 1, 225, 157, 224, 106, 1, 225, 179, 224, 106, 1, 215, 108, 224, 106, 1, + 201, 78, 224, 106, 1, 201, 66, 224, 106, 1, 240, 40, 224, 106, 1, 240, + 30, 224, 106, 1, 209, 181, 224, 106, 1, 240, 24, 224, 106, 1, 216, 85, + 224, 106, 1, 189, 224, 106, 1, 202, 233, 224, 106, 1, 240, 135, 224, 106, + 1, 239, 175, 224, 106, 1, 176, 224, 106, 1, 161, 224, 106, 1, 213, 5, + 224, 106, 1, 249, 144, 224, 106, 1, 249, 44, 224, 106, 1, 248, 196, 224, + 106, 1, 166, 224, 106, 1, 164, 224, 106, 1, 169, 224, 106, 1, 172, 224, + 106, 1, 199, 152, 224, 106, 1, 207, 50, 224, 106, 1, 183, 224, 106, 1, + 142, 224, 106, 2, 251, 50, 224, 106, 18, 2, 252, 167, 224, 106, 18, 2, + 68, 224, 106, 18, 2, 226, 119, 224, 106, 18, 2, 66, 224, 106, 18, 2, 199, + 245, 224, 106, 18, 2, 69, 224, 106, 18, 2, 251, 199, 224, 106, 18, 2, 72, + 224, 106, 18, 2, 250, 149, 224, 106, 2, 215, 148, 224, 106, 2, 199, 7, + 224, 106, 17, 195, 79, 224, 106, 17, 100, 224, 106, 17, 102, 224, 106, + 17, 134, 224, 106, 17, 136, 224, 106, 17, 146, 224, 106, 17, 167, 224, + 106, 17, 178, 224, 106, 17, 171, 224, 106, 17, 182, 233, 108, 2, 38, 251, + 51, 57, 233, 108, 2, 247, 132, 233, 108, 2, 251, 50, 233, 108, 2, 199, 2, + 233, 108, 1, 63, 233, 108, 1, 252, 167, 233, 108, 1, 68, 233, 108, 1, + 226, 119, 233, 108, 1, 66, 233, 108, 1, 199, 245, 233, 108, 1, 110, 144, + 233, 108, 1, 110, 159, 233, 108, 1, 237, 53, 233, 108, 1, 251, 199, 233, + 108, 1, 214, 101, 233, 108, 1, 250, 149, 233, 108, 1, 155, 233, 108, 1, + 224, 145, 233, 108, 1, 234, 122, 233, 108, 1, 233, 229, 233, 108, 1, 217, + 70, 233, 108, 1, 247, 173, 233, 108, 1, 247, 15, 233, 108, 1, 225, 213, + 233, 108, 1, 225, 179, 233, 108, 1, 215, 108, 233, 108, 1, 201, 78, 233, + 108, 1, 201, 66, 233, 108, 1, 240, 40, 233, 108, 1, 240, 24, 233, 108, 1, + 216, 85, 233, 108, 1, 189, 233, 108, 1, 202, 233, 233, 108, 1, 240, 135, + 233, 108, 1, 239, 175, 233, 108, 1, 176, 233, 108, 1, 161, 233, 108, 1, + 213, 5, 233, 108, 1, 249, 144, 233, 108, 1, 248, 196, 233, 108, 1, 166, + 233, 108, 1, 164, 233, 108, 1, 169, 233, 108, 1, 172, 233, 108, 1, 222, + 36, 233, 108, 1, 199, 152, 233, 108, 1, 207, 50, 233, 108, 1, 205, 80, + 233, 108, 1, 183, 233, 108, 1, 142, 38, 248, 160, 60, 233, 108, 2, 215, + 148, 233, 108, 2, 250, 131, 233, 108, 18, 2, 252, 167, 233, 108, 18, 2, + 68, 233, 108, 18, 2, 226, 119, 233, 108, 18, 2, 66, 233, 108, 18, 2, 199, + 245, 233, 108, 18, 2, 110, 144, 233, 108, 18, 2, 110, 209, 182, 233, 108, + 18, 2, 237, 53, 233, 108, 18, 2, 251, 199, 233, 108, 18, 2, 214, 101, + 233, 108, 18, 2, 250, 149, 233, 108, 2, 199, 7, 233, 108, 214, 126, 233, + 108, 250, 150, 222, 157, 78, 233, 108, 2, 212, 122, 233, 108, 1, 199, + 115, 251, 50, 233, 108, 1, 199, 115, 52, 251, 50, 233, 108, 1, 110, 209, + 182, 233, 108, 1, 110, 222, 37, 233, 108, 18, 2, 110, 159, 233, 108, 18, + 2, 110, 222, 37, 38, 233, 108, 17, 195, 79, 38, 233, 108, 17, 100, 38, + 233, 108, 17, 102, 38, 233, 108, 17, 134, 38, 233, 108, 17, 136, 38, 233, + 108, 17, 146, 38, 233, 108, 17, 167, 38, 233, 108, 1, 63, 38, 233, 108, + 1, 155, 38, 233, 108, 1, 176, 38, 233, 108, 1, 199, 34, 38, 233, 108, 1, + 161, 217, 80, 1, 63, 217, 80, 1, 252, 167, 217, 80, 1, 68, 217, 80, 1, + 226, 119, 217, 80, 1, 66, 217, 80, 1, 199, 245, 217, 80, 1, 110, 144, + 217, 80, 1, 110, 209, 182, 217, 80, 1, 110, 159, 217, 80, 1, 110, 222, + 37, 217, 80, 1, 69, 217, 80, 1, 251, 199, 217, 80, 1, 72, 217, 80, 1, + 250, 149, 217, 80, 1, 155, 217, 80, 1, 224, 145, 217, 80, 1, 234, 122, + 217, 80, 1, 233, 229, 217, 80, 1, 217, 70, 217, 80, 1, 217, 19, 217, 80, + 1, 247, 173, 217, 80, 1, 247, 15, 217, 80, 1, 225, 213, 217, 80, 1, 225, + 179, 217, 80, 1, 215, 108, 217, 80, 1, 215, 90, 217, 80, 1, 201, 78, 217, + 80, 1, 201, 66, 217, 80, 1, 240, 40, 217, 80, 1, 240, 24, 217, 80, 1, + 216, 85, 217, 80, 1, 189, 217, 80, 1, 202, 233, 217, 80, 1, 240, 135, + 217, 80, 1, 239, 175, 217, 80, 1, 176, 217, 80, 1, 216, 226, 217, 80, 1, + 161, 217, 80, 1, 213, 5, 217, 80, 1, 249, 144, 217, 80, 1, 248, 196, 217, + 80, 1, 166, 217, 80, 1, 219, 80, 217, 80, 1, 164, 217, 80, 1, 169, 217, + 80, 1, 210, 77, 217, 80, 1, 172, 217, 80, 1, 222, 121, 217, 80, 1, 197, + 166, 217, 80, 1, 207, 50, 217, 80, 1, 205, 80, 217, 80, 1, 183, 217, 80, + 1, 142, 217, 80, 18, 2, 252, 167, 217, 80, 18, 2, 68, 217, 80, 18, 2, + 226, 119, 217, 80, 18, 2, 66, 217, 80, 18, 2, 199, 245, 217, 80, 18, 2, + 110, 144, 217, 80, 18, 2, 110, 209, 182, 217, 80, 18, 2, 110, 159, 217, + 80, 18, 2, 110, 222, 37, 217, 80, 18, 2, 69, 217, 80, 18, 2, 251, 199, + 217, 80, 18, 2, 72, 217, 80, 18, 2, 250, 149, 217, 80, 2, 199, 7, 217, + 80, 2, 247, 132, 217, 80, 2, 251, 50, 217, 80, 2, 199, 2, 217, 80, 2, + 215, 148, 217, 80, 2, 250, 131, 217, 80, 2, 48, 251, 50, 217, 80, 214, + 126, 217, 80, 206, 99, 217, 80, 240, 87, 217, 80, 52, 240, 87, 217, 80, + 244, 158, 217, 80, 234, 86, 235, 133, 217, 80, 252, 29, 55, 217, 80, 17, + 195, 79, 217, 80, 17, 100, 217, 80, 17, 102, 217, 80, 17, 134, 217, 80, + 17, 136, 217, 80, 17, 146, 217, 80, 17, 167, 217, 80, 17, 178, 217, 80, + 17, 171, 217, 80, 17, 182, 217, 80, 212, 147, 78, 217, 80, 226, 42, 55, + 217, 80, 208, 215, 78, 217, 80, 1, 199, 115, 251, 50, 202, 61, 251, 79, + 202, 61, 1, 63, 202, 61, 1, 252, 167, 202, 61, 1, 68, 202, 61, 1, 226, + 119, 202, 61, 1, 66, 202, 61, 1, 199, 245, 202, 61, 1, 110, 144, 202, 61, + 1, 110, 209, 182, 202, 61, 1, 110, 159, 202, 61, 1, 110, 222, 37, 202, + 61, 1, 69, 202, 61, 1, 251, 199, 202, 61, 1, 72, 202, 61, 1, 250, 149, + 202, 61, 1, 155, 202, 61, 1, 224, 145, 202, 61, 1, 234, 122, 202, 61, 1, + 233, 229, 202, 61, 1, 217, 70, 202, 61, 1, 247, 173, 202, 61, 1, 247, 15, + 202, 61, 1, 225, 213, 202, 61, 1, 225, 179, 202, 61, 1, 215, 108, 202, + 61, 1, 201, 78, 202, 61, 1, 201, 66, 202, 61, 1, 240, 40, 202, 61, 1, + 240, 24, 202, 61, 1, 216, 85, 202, 61, 1, 189, 202, 61, 1, 202, 233, 202, + 61, 1, 240, 135, 202, 61, 1, 239, 175, 202, 61, 1, 176, 202, 61, 1, 161, + 202, 61, 1, 213, 5, 202, 61, 1, 249, 144, 202, 61, 1, 248, 196, 202, 61, + 1, 166, 202, 61, 1, 164, 202, 61, 1, 169, 202, 61, 1, 172, 202, 61, 1, + 199, 152, 202, 61, 1, 207, 50, 202, 61, 1, 205, 80, 202, 61, 1, 183, 202, + 61, 1, 142, 202, 61, 18, 2, 252, 167, 202, 61, 18, 2, 68, 202, 61, 18, 2, + 226, 119, 202, 61, 18, 2, 66, 202, 61, 18, 2, 199, 245, 202, 61, 18, 2, + 110, 144, 202, 61, 18, 2, 110, 209, 182, 202, 61, 18, 2, 110, 159, 202, + 61, 18, 2, 110, 222, 37, 202, 61, 18, 2, 69, 202, 61, 18, 2, 206, 182, + 69, 202, 61, 18, 2, 251, 199, 202, 61, 18, 2, 72, 202, 61, 18, 2, 206, + 182, 72, 202, 61, 18, 2, 250, 149, 202, 61, 2, 247, 132, 202, 61, 2, 251, + 50, 202, 61, 2, 199, 2, 202, 61, 2, 199, 7, 202, 61, 2, 215, 148, 202, + 61, 2, 250, 131, 202, 61, 233, 34, 202, 61, 252, 29, 55, 202, 61, 214, + 126, 202, 61, 17, 195, 79, 202, 61, 17, 100, 202, 61, 17, 102, 202, 61, + 17, 134, 202, 61, 17, 136, 202, 61, 17, 146, 202, 61, 17, 167, 202, 61, + 17, 178, 202, 61, 17, 171, 202, 61, 17, 182, 206, 101, 1, 63, 206, 101, + 1, 252, 167, 206, 101, 1, 68, 206, 101, 1, 226, 119, 206, 101, 1, 66, + 206, 101, 1, 199, 245, 206, 101, 1, 110, 144, 206, 101, 1, 110, 209, 182, + 206, 101, 1, 110, 159, 206, 101, 1, 110, 222, 37, 206, 101, 1, 69, 206, + 101, 1, 251, 199, 206, 101, 1, 72, 206, 101, 1, 250, 149, 206, 101, 1, + 155, 206, 101, 1, 224, 145, 206, 101, 1, 234, 122, 206, 101, 1, 233, 229, + 206, 101, 1, 217, 70, 206, 101, 1, 247, 173, 206, 101, 1, 247, 15, 206, + 101, 1, 225, 213, 206, 101, 1, 225, 179, 206, 101, 1, 215, 108, 206, 101, + 1, 201, 78, 206, 101, 1, 201, 66, 206, 101, 1, 240, 40, 206, 101, 1, 240, + 24, 206, 101, 1, 216, 85, 206, 101, 1, 189, 206, 101, 1, 202, 233, 206, + 101, 1, 240, 135, 206, 101, 1, 239, 175, 206, 101, 1, 176, 206, 101, 1, + 161, 206, 101, 1, 213, 5, 206, 101, 1, 249, 144, 206, 101, 1, 248, 196, + 206, 101, 1, 166, 206, 101, 1, 164, 206, 101, 1, 169, 206, 101, 1, 172, + 206, 101, 1, 199, 152, 206, 101, 1, 207, 50, 206, 101, 1, 205, 80, 206, + 101, 1, 183, 206, 101, 1, 142, 206, 101, 18, 2, 252, 167, 206, 101, 18, + 2, 68, 206, 101, 18, 2, 226, 119, 206, 101, 18, 2, 66, 206, 101, 18, 2, + 199, 245, 206, 101, 18, 2, 110, 144, 206, 101, 18, 2, 110, 209, 182, 206, + 101, 18, 2, 69, 206, 101, 18, 2, 251, 199, 206, 101, 18, 2, 72, 206, 101, + 18, 2, 250, 149, 206, 101, 2, 247, 132, 206, 101, 2, 251, 50, 206, 101, + 2, 199, 2, 206, 101, 2, 199, 7, 206, 101, 2, 215, 148, 206, 101, 2, 206, + 100, 206, 101, 240, 87, 206, 101, 52, 240, 87, 206, 101, 207, 91, 238, + 252, 206, 101, 207, 91, 154, 206, 101, 210, 117, 220, 27, 206, 101, 210, + 117, 220, 26, 206, 101, 210, 117, 220, 25, 206, 101, 236, 221, 77, 202, + 238, 78, 206, 101, 208, 133, 117, 3, 201, 175, 26, 200, 167, 214, 57, + 206, 101, 208, 133, 117, 3, 201, 175, 26, 237, 249, 241, 69, 206, 101, + 208, 133, 117, 3, 210, 188, 26, 237, 249, 241, 69, 206, 101, 208, 133, + 117, 3, 210, 188, 26, 237, 249, 52, 241, 69, 206, 101, 208, 133, 117, 3, + 210, 188, 26, 237, 249, 201, 165, 241, 69, 206, 101, 208, 133, 117, 52, + 210, 2, 206, 101, 208, 133, 117, 52, 210, 3, 3, 210, 187, 206, 101, 208, + 133, 117, 3, 52, 241, 69, 206, 101, 208, 133, 117, 3, 201, 165, 241, 69, + 206, 101, 208, 133, 117, 3, 211, 89, 241, 69, 206, 101, 208, 133, 117, 3, + 207, 88, 241, 69, 206, 101, 208, 133, 117, 3, 244, 246, 26, 210, 187, + 206, 101, 208, 133, 117, 3, 244, 246, 26, 99, 236, 223, 206, 101, 208, + 133, 117, 3, 244, 246, 26, 235, 6, 236, 223, 206, 101, 1, 202, 155, 251, + 130, 68, 206, 101, 1, 200, 217, 251, 130, 68, 206, 101, 1, 200, 217, 251, + 130, 226, 119, 206, 101, 1, 251, 130, 66, 206, 101, 18, 2, 251, 130, 66, + 206, 101, 18, 2, 251, 130, 199, 245, 218, 235, 1, 63, 218, 235, 1, 252, + 167, 218, 235, 1, 68, 218, 235, 1, 226, 119, 218, 235, 1, 66, 218, 235, + 1, 199, 245, 218, 235, 1, 110, 144, 218, 235, 1, 110, 209, 182, 218, 235, + 1, 110, 159, 218, 235, 1, 110, 222, 37, 218, 235, 1, 69, 218, 235, 1, + 251, 199, 218, 235, 1, 72, 218, 235, 1, 250, 149, 218, 235, 1, 155, 218, + 235, 1, 224, 145, 218, 235, 1, 234, 122, 218, 235, 1, 233, 229, 218, 235, + 1, 217, 70, 218, 235, 1, 247, 173, 218, 235, 1, 247, 15, 218, 235, 1, + 225, 213, 218, 235, 1, 225, 179, 218, 235, 1, 215, 108, 218, 235, 1, 201, + 78, 218, 235, 1, 201, 66, 218, 235, 1, 240, 40, 218, 235, 1, 240, 24, + 218, 235, 1, 216, 85, 218, 235, 1, 189, 218, 235, 1, 202, 233, 218, 235, + 1, 240, 135, 218, 235, 1, 239, 175, 218, 235, 1, 176, 218, 235, 1, 161, + 218, 235, 1, 213, 5, 218, 235, 1, 249, 144, 218, 235, 1, 248, 196, 218, + 235, 1, 166, 218, 235, 1, 164, 218, 235, 1, 169, 218, 235, 1, 172, 218, + 235, 1, 199, 152, 218, 235, 1, 207, 50, 218, 235, 1, 205, 80, 218, 235, + 1, 183, 218, 235, 1, 142, 218, 235, 1, 222, 36, 218, 235, 18, 2, 252, + 167, 218, 235, 18, 2, 68, 218, 235, 18, 2, 226, 119, 218, 235, 18, 2, 66, + 218, 235, 18, 2, 199, 245, 218, 235, 18, 2, 110, 144, 218, 235, 18, 2, + 110, 209, 182, 218, 235, 18, 2, 110, 159, 218, 235, 18, 2, 110, 222, 37, + 218, 235, 18, 2, 69, 218, 235, 18, 2, 251, 199, 218, 235, 18, 2, 72, 218, + 235, 18, 2, 250, 149, 218, 235, 2, 251, 50, 218, 235, 2, 199, 2, 218, + 235, 2, 199, 7, 218, 235, 2, 250, 247, 218, 235, 240, 87, 218, 235, 52, + 240, 87, 218, 235, 252, 29, 55, 218, 235, 2, 231, 44, 218, 235, 17, 195, + 79, 218, 235, 17, 100, 218, 235, 17, 102, 218, 235, 17, 134, 218, 235, + 17, 136, 218, 235, 17, 146, 218, 235, 17, 167, 218, 235, 17, 178, 218, + 235, 17, 171, 218, 235, 17, 182, 96, 248, 154, 3, 214, 58, 96, 209, 194, + 248, 153, 96, 52, 248, 154, 3, 214, 58, 96, 201, 165, 248, 154, 3, 214, + 58, 96, 248, 154, 3, 52, 214, 58, 96, 209, 194, 248, 154, 3, 214, 58, 96, + 209, 194, 248, 154, 3, 52, 214, 58, 96, 226, 16, 248, 153, 96, 226, 16, + 248, 154, 3, 52, 214, 58, 96, 204, 51, 248, 153, 96, 204, 51, 248, 154, + 3, 214, 58, 96, 204, 51, 248, 154, 3, 52, 214, 58, 96, 163, 204, 51, 248, + 154, 3, 52, 214, 58, 203, 125, 1, 63, 203, 125, 1, 252, 167, 203, 125, 1, + 68, 203, 125, 1, 226, 119, 203, 125, 1, 66, 203, 125, 1, 199, 245, 203, + 125, 1, 69, 203, 125, 1, 251, 199, 203, 125, 1, 72, 203, 125, 1, 250, + 149, 203, 125, 1, 155, 203, 125, 1, 224, 145, 203, 125, 1, 234, 122, 203, + 125, 1, 233, 229, 203, 125, 1, 217, 70, 203, 125, 1, 247, 173, 203, 125, + 1, 247, 15, 203, 125, 1, 225, 213, 203, 125, 1, 225, 179, 203, 125, 1, + 215, 108, 203, 125, 1, 201, 78, 203, 125, 1, 201, 66, 203, 125, 1, 240, + 40, 203, 125, 1, 240, 24, 203, 125, 1, 216, 85, 203, 125, 1, 189, 203, + 125, 1, 202, 233, 203, 125, 1, 240, 135, 203, 125, 1, 239, 175, 203, 125, + 1, 176, 203, 125, 1, 161, 203, 125, 1, 213, 5, 203, 125, 1, 249, 144, + 203, 125, 1, 248, 196, 203, 125, 1, 166, 203, 125, 1, 164, 203, 125, 1, + 169, 203, 125, 1, 172, 203, 125, 1, 199, 152, 203, 125, 1, 207, 50, 203, + 125, 1, 183, 203, 125, 1, 142, 203, 125, 1, 209, 181, 203, 125, 2, 251, + 50, 203, 125, 2, 199, 2, 203, 125, 18, 2, 252, 167, 203, 125, 18, 2, 68, + 203, 125, 18, 2, 226, 119, 203, 125, 18, 2, 66, 203, 125, 18, 2, 199, + 245, 203, 125, 18, 2, 69, 203, 125, 18, 2, 251, 199, 203, 125, 18, 2, 72, + 203, 125, 18, 2, 250, 149, 203, 125, 2, 199, 7, 203, 125, 2, 215, 148, + 203, 125, 1, 250, 250, 224, 145, 203, 125, 17, 195, 79, 203, 125, 17, + 100, 203, 125, 17, 102, 203, 125, 17, 134, 203, 125, 17, 136, 203, 125, + 17, 146, 203, 125, 17, 167, 203, 125, 17, 178, 203, 125, 17, 171, 203, + 125, 17, 182, 251, 203, 1, 155, 251, 203, 1, 224, 145, 251, 203, 1, 217, + 70, 251, 203, 1, 176, 251, 203, 1, 189, 251, 203, 1, 251, 130, 189, 251, + 203, 1, 161, 251, 203, 1, 213, 5, 251, 203, 1, 249, 144, 251, 203, 1, + 166, 251, 203, 1, 225, 213, 251, 203, 1, 247, 15, 251, 203, 1, 202, 233, + 251, 203, 1, 169, 251, 203, 1, 172, 251, 203, 1, 183, 251, 203, 1, 215, + 108, 251, 203, 1, 142, 251, 203, 1, 63, 251, 203, 1, 240, 135, 251, 203, + 1, 239, 175, 251, 203, 1, 234, 122, 251, 203, 1, 251, 130, 234, 122, 251, + 203, 1, 233, 229, 251, 203, 1, 248, 196, 251, 203, 1, 225, 179, 251, 203, + 1, 251, 130, 249, 144, 251, 203, 108, 2, 219, 193, 172, 251, 203, 108, 2, + 219, 193, 169, 251, 203, 108, 2, 219, 193, 222, 95, 169, 251, 203, 18, 2, + 63, 251, 203, 18, 2, 252, 167, 251, 203, 18, 2, 68, 251, 203, 18, 2, 226, + 119, 251, 203, 18, 2, 66, 251, 203, 18, 2, 199, 245, 251, 203, 18, 2, 69, + 251, 203, 18, 2, 250, 126, 251, 203, 18, 2, 72, 251, 203, 18, 2, 251, + 199, 251, 203, 18, 2, 251, 122, 251, 203, 2, 224, 77, 251, 203, 17, 195, + 79, 251, 203, 17, 100, 251, 203, 17, 102, 251, 203, 17, 134, 251, 203, + 17, 136, 251, 203, 17, 146, 251, 203, 17, 167, 251, 203, 17, 178, 251, + 203, 17, 171, 251, 203, 17, 182, 251, 203, 31, 203, 23, 251, 203, 31, + 200, 234, 251, 203, 2, 4, 208, 132, 251, 203, 2, 208, 132, 251, 203, 2, + 209, 125, 251, 203, 16, 199, 34, 239, 15, 1, 63, 239, 15, 1, 252, 167, + 239, 15, 1, 68, 239, 15, 1, 226, 119, 239, 15, 1, 66, 239, 15, 1, 199, + 245, 239, 15, 1, 69, 239, 15, 1, 251, 199, 239, 15, 1, 72, 239, 15, 1, + 250, 149, 239, 15, 1, 155, 239, 15, 1, 224, 145, 239, 15, 1, 234, 122, + 239, 15, 1, 233, 229, 239, 15, 1, 217, 70, 239, 15, 1, 247, 173, 239, 15, + 1, 247, 15, 239, 15, 1, 225, 213, 239, 15, 1, 225, 179, 239, 15, 1, 215, + 108, 239, 15, 1, 201, 78, 239, 15, 1, 201, 66, 239, 15, 1, 240, 40, 239, + 15, 1, 240, 24, 239, 15, 1, 216, 85, 239, 15, 1, 189, 239, 15, 1, 202, + 233, 239, 15, 1, 240, 135, 239, 15, 1, 239, 175, 239, 15, 1, 176, 239, + 15, 1, 161, 239, 15, 1, 213, 5, 239, 15, 1, 249, 144, 239, 15, 1, 248, + 196, 239, 15, 1, 166, 239, 15, 1, 164, 239, 15, 1, 169, 239, 15, 1, 172, + 239, 15, 1, 199, 152, 239, 15, 1, 207, 50, 239, 15, 1, 205, 80, 239, 15, + 1, 183, 239, 15, 1, 142, 239, 15, 1, 209, 181, 239, 15, 18, 2, 252, 167, + 239, 15, 18, 2, 68, 239, 15, 18, 2, 226, 119, 239, 15, 18, 2, 66, 239, + 15, 18, 2, 199, 245, 239, 15, 18, 2, 110, 144, 239, 15, 18, 2, 110, 209, + 182, 239, 15, 18, 2, 69, 239, 15, 18, 2, 251, 199, 239, 15, 18, 2, 72, + 239, 15, 18, 2, 250, 149, 239, 15, 2, 251, 50, 239, 15, 2, 199, 2, 239, + 15, 2, 199, 7, 239, 15, 2, 215, 148, 239, 15, 252, 29, 55, 197, 139, 244, + 235, 6, 1, 217, 69, 197, 139, 244, 235, 6, 1, 63, 197, 139, 244, 235, 6, + 1, 197, 70, 197, 139, 244, 235, 6, 1, 195, 217, 197, 139, 244, 235, 6, 1, + 164, 197, 139, 244, 235, 6, 1, 196, 3, 197, 139, 244, 235, 6, 1, 226, + 119, 197, 139, 244, 235, 6, 1, 199, 245, 197, 139, 244, 235, 6, 1, 69, + 197, 139, 244, 235, 6, 1, 72, 197, 139, 244, 235, 6, 1, 251, 96, 197, + 139, 244, 235, 6, 1, 234, 122, 197, 139, 244, 235, 6, 1, 224, 10, 197, + 139, 244, 235, 6, 1, 236, 192, 197, 139, 244, 235, 6, 1, 195, 196, 197, + 139, 244, 235, 6, 1, 200, 106, 197, 139, 244, 235, 6, 1, 236, 211, 197, + 139, 244, 235, 6, 1, 214, 166, 197, 139, 244, 235, 6, 1, 201, 73, 197, + 139, 244, 235, 6, 1, 215, 134, 197, 139, 244, 235, 6, 1, 240, 135, 197, + 139, 244, 235, 6, 1, 250, 167, 197, 139, 244, 235, 6, 1, 251, 122, 197, + 139, 244, 235, 6, 1, 248, 20, 197, 139, 244, 235, 6, 1, 211, 226, 197, + 139, 244, 235, 6, 1, 232, 28, 197, 139, 244, 235, 6, 1, 231, 172, 197, + 139, 244, 235, 6, 1, 231, 99, 197, 139, 244, 235, 6, 1, 232, 174, 197, + 139, 244, 235, 6, 1, 205, 31, 197, 139, 244, 235, 6, 1, 206, 84, 197, + 139, 244, 235, 6, 1, 198, 249, 197, 139, 244, 235, 4, 1, 217, 69, 197, + 139, 244, 235, 4, 1, 63, 197, 139, 244, 235, 4, 1, 197, 70, 197, 139, + 244, 235, 4, 1, 195, 217, 197, 139, 244, 235, 4, 1, 164, 197, 139, 244, + 235, 4, 1, 196, 3, 197, 139, 244, 235, 4, 1, 226, 119, 197, 139, 244, + 235, 4, 1, 199, 245, 197, 139, 244, 235, 4, 1, 69, 197, 139, 244, 235, 4, + 1, 72, 197, 139, 244, 235, 4, 1, 251, 96, 197, 139, 244, 235, 4, 1, 234, + 122, 197, 139, 244, 235, 4, 1, 224, 10, 197, 139, 244, 235, 4, 1, 236, + 192, 197, 139, 244, 235, 4, 1, 195, 196, 197, 139, 244, 235, 4, 1, 200, + 106, 197, 139, 244, 235, 4, 1, 236, 211, 197, 139, 244, 235, 4, 1, 214, + 166, 197, 139, 244, 235, 4, 1, 201, 73, 197, 139, 244, 235, 4, 1, 215, + 134, 197, 139, 244, 235, 4, 1, 240, 135, 197, 139, 244, 235, 4, 1, 250, + 167, 197, 139, 244, 235, 4, 1, 251, 122, 197, 139, 244, 235, 4, 1, 248, + 20, 197, 139, 244, 235, 4, 1, 211, 226, 197, 139, 244, 235, 4, 1, 232, + 28, 197, 139, 244, 235, 4, 1, 231, 172, 197, 139, 244, 235, 4, 1, 231, + 99, 197, 139, 244, 235, 4, 1, 232, 174, 197, 139, 244, 235, 4, 1, 205, + 31, 197, 139, 244, 235, 4, 1, 206, 84, 197, 139, 244, 235, 4, 1, 198, + 249, 197, 139, 244, 235, 17, 195, 79, 197, 139, 244, 235, 17, 100, 197, + 139, 244, 235, 17, 102, 197, 139, 244, 235, 17, 134, 197, 139, 244, 235, + 17, 136, 197, 139, 244, 235, 17, 146, 197, 139, 244, 235, 17, 167, 197, + 139, 244, 235, 17, 178, 197, 139, 244, 235, 17, 171, 197, 139, 244, 235, + 17, 182, 197, 139, 244, 235, 31, 203, 23, 197, 139, 244, 235, 31, 200, + 234, 197, 139, 244, 235, 31, 202, 177, 197, 139, 244, 235, 31, 235, 13, + 197, 139, 244, 235, 31, 235, 144, 197, 139, 244, 235, 31, 206, 13, 197, + 139, 244, 235, 31, 207, 65, 197, 139, 244, 235, 31, 237, 19, 197, 139, + 244, 235, 31, 216, 173, 197, 139, 244, 235, 214, 126, 217, 217, 1, 63, + 217, 217, 1, 252, 167, 217, 217, 1, 68, 217, 217, 1, 226, 119, 217, 217, + 1, 66, 217, 217, 1, 199, 245, 217, 217, 1, 110, 144, 217, 217, 1, 110, + 209, 182, 217, 217, 1, 69, 217, 217, 1, 251, 199, 217, 217, 1, 72, 217, + 217, 1, 250, 149, 217, 217, 1, 155, 217, 217, 1, 224, 145, 217, 217, 1, + 234, 122, 217, 217, 1, 233, 229, 217, 217, 1, 217, 70, 217, 217, 1, 247, + 173, 217, 217, 1, 247, 15, 217, 217, 1, 225, 213, 217, 217, 1, 225, 179, + 217, 217, 1, 215, 108, 217, 217, 1, 201, 78, 217, 217, 1, 201, 66, 217, + 217, 1, 240, 40, 217, 217, 1, 240, 24, 217, 217, 1, 216, 85, 217, 217, 1, + 189, 217, 217, 1, 202, 233, 217, 217, 1, 240, 135, 217, 217, 1, 239, 175, + 217, 217, 1, 176, 217, 217, 1, 161, 217, 217, 1, 213, 5, 217, 217, 1, + 249, 144, 217, 217, 1, 248, 196, 217, 217, 1, 166, 217, 217, 1, 164, 217, + 217, 1, 169, 217, 217, 1, 172, 217, 217, 1, 199, 152, 217, 217, 1, 207, + 50, 217, 217, 1, 205, 80, 217, 217, 1, 183, 217, 217, 1, 142, 217, 217, + 1, 222, 36, 217, 217, 1, 209, 181, 217, 217, 18, 2, 252, 167, 217, 217, + 18, 2, 68, 217, 217, 18, 2, 226, 119, 217, 217, 18, 2, 66, 217, 217, 18, + 2, 199, 245, 217, 217, 18, 2, 110, 144, 217, 217, 18, 2, 110, 209, 182, + 217, 217, 18, 2, 69, 217, 217, 18, 2, 251, 199, 217, 217, 18, 2, 72, 217, + 217, 18, 2, 250, 149, 217, 217, 2, 251, 50, 217, 217, 2, 199, 2, 217, + 217, 2, 199, 7, 217, 217, 2, 250, 131, 217, 217, 2, 206, 100, 217, 217, + 232, 129, 217, 217, 18, 2, 212, 10, 69, 195, 102, 47, 1, 63, 195, 102, + 47, 18, 2, 68, 195, 102, 47, 18, 2, 200, 99, 195, 102, 47, 18, 2, 66, + 195, 102, 47, 18, 2, 69, 195, 102, 47, 18, 2, 214, 163, 195, 102, 47, 18, + 2, 72, 195, 102, 47, 18, 2, 251, 199, 195, 102, 47, 18, 2, 250, 149, 195, + 102, 47, 18, 2, 210, 89, 68, 195, 102, 47, 18, 222, 157, 78, 195, 102, + 47, 1, 155, 195, 102, 47, 1, 224, 145, 195, 102, 47, 1, 234, 122, 195, + 102, 47, 1, 233, 229, 195, 102, 47, 1, 217, 70, 195, 102, 47, 1, 247, + 173, 195, 102, 47, 1, 247, 15, 195, 102, 47, 1, 225, 213, 195, 102, 47, + 1, 215, 108, 195, 102, 47, 1, 201, 78, 195, 102, 47, 1, 201, 66, 195, + 102, 47, 1, 240, 40, 195, 102, 47, 1, 240, 24, 195, 102, 47, 1, 216, 85, + 195, 102, 47, 1, 189, 195, 102, 47, 1, 202, 233, 195, 102, 47, 1, 240, + 135, 195, 102, 47, 1, 239, 175, 195, 102, 47, 1, 176, 195, 102, 47, 1, + 161, 195, 102, 47, 1, 213, 5, 195, 102, 47, 1, 249, 144, 195, 102, 47, 1, + 248, 196, 195, 102, 47, 1, 166, 195, 102, 47, 1, 201, 113, 195, 102, 47, + 1, 201, 103, 195, 102, 47, 1, 237, 155, 195, 102, 47, 1, 237, 149, 195, + 102, 47, 1, 195, 74, 195, 102, 47, 1, 195, 115, 195, 102, 47, 1, 255, + 175, 195, 102, 47, 1, 164, 195, 102, 47, 1, 169, 195, 102, 47, 1, 172, + 195, 102, 47, 1, 199, 152, 195, 102, 47, 1, 207, 50, 195, 102, 47, 1, + 205, 80, 195, 102, 47, 1, 183, 195, 102, 47, 1, 142, 195, 102, 47, 1, + 223, 200, 195, 102, 47, 48, 108, 78, 195, 102, 47, 2, 199, 7, 195, 102, + 47, 2, 247, 132, 195, 102, 47, 2, 247, 133, 3, 214, 58, 195, 102, 47, 2, + 247, 135, 3, 214, 58, 195, 102, 47, 2, 251, 50, 195, 102, 47, 2, 199, 2, + 195, 102, 47, 244, 184, 1, 169, 195, 102, 47, 244, 185, 1, 164, 195, 102, + 47, 244, 185, 1, 169, 195, 102, 47, 244, 185, 1, 172, 195, 102, 47, 244, + 185, 1, 199, 152, 195, 102, 47, 84, 232, 137, 78, 195, 102, 47, 244, 198, + 232, 137, 78, 195, 102, 47, 117, 201, 98, 195, 102, 47, 117, 207, 42, + 195, 102, 47, 117, 52, 207, 42, 195, 102, 47, 117, 181, 201, 98, 195, + 102, 47, 84, 237, 241, 232, 137, 78, 195, 102, 47, 244, 198, 237, 241, + 232, 137, 78, 195, 102, 47, 204, 151, 205, 152, 1, 63, 205, 152, 18, 2, + 68, 205, 152, 18, 2, 200, 99, 205, 152, 18, 2, 66, 205, 152, 18, 2, 69, + 205, 152, 18, 2, 72, 205, 152, 18, 2, 214, 163, 205, 152, 18, 2, 251, + 199, 205, 152, 18, 2, 250, 149, 205, 152, 18, 2, 110, 144, 205, 152, 18, + 2, 110, 159, 205, 152, 18, 222, 157, 78, 205, 152, 1, 155, 205, 152, 1, + 224, 145, 205, 152, 1, 234, 122, 205, 152, 1, 233, 229, 205, 152, 1, 217, + 70, 205, 152, 1, 247, 173, 205, 152, 1, 247, 15, 205, 152, 1, 225, 213, + 205, 152, 1, 225, 179, 205, 152, 1, 215, 108, 205, 152, 1, 201, 78, 205, + 152, 1, 201, 66, 205, 152, 1, 240, 40, 205, 152, 1, 240, 24, 205, 152, 1, + 216, 85, 205, 152, 1, 189, 205, 152, 1, 202, 233, 205, 152, 1, 240, 135, + 205, 152, 1, 239, 175, 205, 152, 1, 176, 205, 152, 1, 161, 205, 152, 1, + 213, 5, 205, 152, 1, 249, 144, 205, 152, 1, 248, 196, 205, 152, 1, 166, + 205, 152, 1, 201, 113, 205, 152, 1, 201, 103, 205, 152, 1, 237, 155, 205, + 152, 1, 195, 74, 205, 152, 1, 195, 115, 205, 152, 1, 255, 175, 205, 152, + 1, 164, 205, 152, 1, 169, 205, 152, 1, 172, 205, 152, 1, 199, 152, 205, + 152, 1, 207, 50, 205, 152, 1, 205, 80, 205, 152, 1, 183, 205, 152, 1, + 142, 205, 152, 1, 223, 200, 205, 152, 2, 225, 164, 205, 152, 2, 200, 34, + 205, 152, 244, 184, 1, 169, 205, 152, 244, 184, 1, 172, 205, 152, 244, + 184, 1, 207, 50, 205, 152, 244, 184, 1, 183, 205, 152, 48, 108, 2, 234, + 189, 205, 152, 48, 108, 2, 225, 79, 205, 152, 48, 108, 2, 217, 72, 205, + 152, 48, 108, 2, 240, 230, 205, 152, 48, 108, 2, 218, 54, 205, 152, 48, + 108, 2, 250, 111, 205, 152, 48, 108, 2, 221, 135, 205, 152, 48, 108, 2, + 144, 205, 152, 48, 108, 2, 159, 205, 152, 48, 108, 2, 207, 52, 205, 152, + 48, 108, 2, 209, 80, 205, 152, 48, 108, 2, 255, 175, 205, 152, 2, 251, + 50, 205, 152, 2, 199, 2, 205, 152, 234, 35, 78, 205, 152, 204, 151, 205, + 152, 117, 201, 98, 205, 152, 117, 207, 42, 205, 152, 117, 52, 207, 42, + 205, 152, 117, 212, 122, 205, 152, 232, 137, 117, 3, 218, 189, 26, 204, + 112, 26, 201, 165, 235, 85, 205, 152, 232, 137, 117, 3, 218, 189, 26, + 204, 112, 26, 235, 85, 205, 152, 232, 137, 117, 3, 218, 189, 26, 204, + 111, 205, 152, 203, 9, 220, 27, 205, 152, 203, 9, 220, 26, 213, 108, 244, + 253, 232, 158, 1, 161, 213, 108, 244, 253, 232, 158, 1, 155, 213, 108, + 244, 253, 232, 158, 1, 172, 213, 108, 244, 253, 232, 158, 1, 166, 213, + 108, 244, 253, 232, 158, 1, 240, 135, 213, 108, 244, 253, 232, 158, 1, + 195, 115, 213, 108, 244, 253, 232, 158, 1, 199, 152, 213, 108, 244, 253, + 232, 158, 1, 217, 70, 213, 108, 244, 253, 232, 158, 1, 142, 213, 108, + 244, 253, 232, 158, 1, 234, 122, 213, 108, 244, 253, 232, 158, 1, 224, + 145, 213, 108, 244, 253, 232, 158, 1, 183, 213, 108, 244, 253, 232, 158, + 1, 249, 144, 213, 108, 244, 253, 232, 158, 1, 247, 173, 213, 108, 244, + 253, 232, 158, 1, 189, 213, 108, 244, 253, 232, 158, 1, 202, 233, 213, + 108, 244, 253, 232, 158, 1, 176, 213, 108, 244, 253, 232, 158, 1, 213, 5, + 213, 108, 244, 253, 232, 158, 1, 169, 213, 108, 244, 253, 232, 158, 1, + 235, 238, 213, 108, 244, 253, 232, 158, 1, 247, 15, 213, 108, 244, 253, + 232, 158, 1, 63, 213, 108, 244, 253, 232, 158, 1, 69, 213, 108, 244, 253, + 232, 158, 1, 68, 213, 108, 244, 253, 232, 158, 1, 72, 213, 108, 244, 253, + 232, 158, 1, 66, 213, 108, 244, 253, 232, 158, 1, 200, 114, 213, 108, + 244, 253, 232, 158, 1, 230, 209, 213, 108, 244, 253, 232, 158, 1, 48, + 214, 2, 213, 108, 244, 253, 232, 158, 1, 48, 225, 79, 213, 108, 244, 253, + 232, 158, 1, 48, 203, 216, 213, 108, 244, 253, 232, 158, 1, 48, 221, 135, + 213, 108, 244, 253, 232, 158, 1, 48, 218, 54, 213, 108, 244, 253, 232, + 158, 1, 48, 159, 213, 108, 244, 253, 232, 158, 1, 48, 197, 199, 213, 108, + 244, 253, 232, 158, 1, 48, 217, 72, 213, 108, 244, 253, 232, 158, 1, 48, + 196, 148, 213, 108, 244, 253, 232, 158, 209, 250, 152, 221, 239, 213, + 108, 244, 253, 232, 158, 209, 250, 202, 11, 213, 108, 244, 253, 232, 158, + 208, 215, 233, 151, 204, 226, 213, 108, 244, 253, 232, 158, 209, 250, + 152, 181, 235, 129, 213, 108, 244, 253, 232, 158, 209, 250, 152, 235, + 129, 213, 108, 244, 253, 232, 158, 208, 215, 233, 151, 204, 227, 235, + 129, 213, 108, 244, 253, 232, 158, 208, 215, 152, 221, 239, 213, 108, + 244, 253, 232, 158, 208, 215, 202, 11, 213, 108, 244, 253, 232, 158, 208, + 215, 152, 181, 235, 129, 213, 108, 244, 253, 232, 158, 208, 215, 152, + 235, 129, 213, 108, 244, 253, 232, 158, 219, 63, 202, 11, 213, 108, 244, + 253, 232, 158, 233, 151, 204, 227, 199, 131, 213, 108, 244, 253, 232, + 158, 219, 63, 152, 181, 235, 129, 213, 108, 244, 253, 232, 158, 219, 63, + 152, 235, 129, 213, 108, 244, 253, 232, 158, 221, 205, 152, 221, 239, + 213, 108, 244, 253, 232, 158, 221, 205, 202, 11, 213, 108, 244, 253, 232, + 158, 233, 151, 204, 226, 213, 108, 244, 253, 232, 158, 221, 205, 152, + 181, 235, 129, 213, 108, 244, 253, 232, 158, 221, 205, 152, 235, 129, + 213, 108, 244, 253, 232, 158, 233, 151, 204, 227, 235, 129, 248, 194, 1, + 63, 248, 194, 1, 252, 167, 248, 194, 1, 68, 248, 194, 1, 226, 119, 248, + 194, 1, 66, 248, 194, 1, 199, 245, 248, 194, 1, 110, 144, 248, 194, 1, + 110, 209, 182, 248, 194, 1, 110, 159, 248, 194, 1, 69, 248, 194, 1, 251, + 199, 248, 194, 1, 72, 248, 194, 1, 250, 149, 248, 194, 1, 155, 248, 194, + 1, 224, 145, 248, 194, 1, 234, 122, 248, 194, 1, 233, 229, 248, 194, 1, + 217, 70, 248, 194, 1, 247, 173, 248, 194, 1, 247, 15, 248, 194, 1, 225, + 213, 248, 194, 1, 225, 179, 248, 194, 1, 215, 108, 248, 194, 1, 201, 78, + 248, 194, 1, 201, 66, 248, 194, 1, 240, 40, 248, 194, 1, 240, 24, 248, + 194, 1, 216, 85, 248, 194, 1, 189, 248, 194, 1, 202, 233, 248, 194, 1, + 240, 135, 248, 194, 1, 239, 175, 248, 194, 1, 176, 248, 194, 1, 161, 248, + 194, 1, 213, 5, 248, 194, 1, 249, 144, 248, 194, 1, 248, 196, 248, 194, + 1, 166, 248, 194, 1, 164, 248, 194, 1, 169, 248, 194, 1, 172, 248, 194, + 1, 199, 152, 248, 194, 1, 207, 50, 248, 194, 1, 205, 80, 248, 194, 1, + 183, 248, 194, 1, 142, 248, 194, 18, 2, 252, 167, 248, 194, 18, 2, 68, + 248, 194, 18, 2, 226, 119, 248, 194, 18, 2, 66, 248, 194, 18, 2, 199, + 245, 248, 194, 18, 2, 110, 144, 248, 194, 18, 2, 110, 209, 182, 248, 194, + 18, 2, 110, 159, 248, 194, 18, 2, 69, 248, 194, 18, 2, 251, 199, 248, + 194, 18, 2, 72, 248, 194, 18, 2, 250, 149, 248, 194, 2, 247, 132, 248, + 194, 2, 251, 50, 248, 194, 2, 199, 2, 248, 194, 2, 199, 7, 248, 194, 2, + 250, 131, 248, 194, 240, 87, 248, 194, 52, 240, 87, 248, 194, 197, 9, + 207, 90, 248, 194, 234, 86, 235, 132, 248, 194, 234, 86, 235, 131, 248, + 194, 17, 195, 79, 248, 194, 17, 100, 248, 194, 17, 102, 248, 194, 17, + 134, 248, 194, 17, 136, 248, 194, 17, 146, 248, 194, 17, 167, 248, 194, + 17, 178, 248, 194, 17, 171, 248, 194, 17, 182, 248, 194, 31, 100, 248, + 194, 31, 102, 248, 194, 31, 134, 248, 194, 31, 136, 248, 194, 31, 146, + 248, 194, 31, 167, 248, 194, 31, 178, 248, 194, 31, 171, 248, 194, 31, + 182, 248, 194, 31, 203, 23, 248, 194, 31, 200, 234, 248, 194, 31, 202, + 177, 248, 194, 31, 235, 13, 248, 194, 31, 235, 144, 248, 194, 31, 206, + 13, 248, 194, 31, 207, 65, 248, 194, 31, 237, 19, 248, 194, 31, 216, 173, + 248, 194, 231, 55, 200, 50, 78, 220, 29, 232, 137, 78, 220, 29, 117, 207, + 42, 220, 29, 1, 155, 220, 29, 1, 224, 145, 220, 29, 1, 234, 122, 220, 29, + 1, 217, 70, 220, 29, 1, 247, 173, 220, 29, 1, 247, 15, 220, 29, 1, 225, + 213, 220, 29, 1, 215, 108, 220, 29, 1, 189, 220, 29, 1, 202, 233, 220, + 29, 1, 240, 135, 220, 29, 1, 176, 220, 29, 1, 161, 220, 29, 1, 213, 5, + 220, 29, 1, 249, 144, 220, 29, 1, 166, 220, 29, 1, 201, 113, 220, 29, 1, + 201, 103, 220, 29, 1, 237, 155, 220, 29, 1, 197, 166, 220, 29, 1, 195, + 74, 220, 29, 1, 195, 115, 220, 29, 1, 255, 175, 220, 29, 1, 164, 220, 29, + 1, 169, 220, 29, 1, 172, 220, 29, 1, 207, 50, 220, 29, 1, 183, 220, 29, + 1, 142, 220, 29, 1, 63, 220, 29, 204, 152, 1, 155, 220, 29, 204, 152, 1, + 224, 145, 220, 29, 204, 152, 1, 234, 122, 220, 29, 204, 152, 1, 217, 70, + 220, 29, 204, 152, 1, 247, 173, 220, 29, 204, 152, 1, 247, 15, 220, 29, + 204, 152, 1, 225, 213, 220, 29, 204, 152, 1, 215, 108, 220, 29, 204, 152, + 1, 189, 220, 29, 204, 152, 1, 202, 233, 220, 29, 204, 152, 1, 240, 135, + 220, 29, 204, 152, 1, 176, 220, 29, 204, 152, 1, 161, 220, 29, 204, 152, + 1, 213, 5, 220, 29, 204, 152, 1, 249, 144, 220, 29, 204, 152, 1, 166, + 220, 29, 204, 152, 1, 201, 113, 220, 29, 204, 152, 1, 201, 103, 220, 29, + 204, 152, 1, 237, 155, 220, 29, 204, 152, 1, 197, 166, 220, 29, 204, 152, + 1, 195, 74, 220, 29, 204, 152, 1, 195, 115, 220, 29, 204, 152, 1, 164, + 220, 29, 204, 152, 1, 169, 220, 29, 204, 152, 1, 172, 220, 29, 204, 152, + 1, 207, 50, 220, 29, 204, 152, 1, 183, 220, 29, 204, 152, 1, 142, 220, + 29, 204, 152, 1, 63, 220, 29, 18, 2, 252, 167, 220, 29, 18, 2, 68, 220, + 29, 18, 2, 66, 220, 29, 18, 2, 69, 220, 29, 18, 2, 72, 220, 29, 2, 251, + 50, 220, 29, 2, 247, 132, 220, 13, 121, 1, 63, 220, 13, 121, 1, 252, 167, + 220, 13, 121, 1, 68, 220, 13, 121, 1, 226, 119, 220, 13, 121, 1, 66, 220, + 13, 121, 1, 199, 245, 220, 13, 121, 1, 69, 220, 13, 121, 1, 251, 199, + 220, 13, 121, 1, 72, 220, 13, 121, 1, 250, 149, 220, 13, 121, 1, 155, + 220, 13, 121, 1, 224, 145, 220, 13, 121, 1, 234, 122, 220, 13, 121, 1, + 233, 229, 220, 13, 121, 1, 217, 70, 220, 13, 121, 1, 247, 173, 220, 13, + 121, 1, 247, 15, 220, 13, 121, 1, 225, 213, 220, 13, 121, 1, 225, 179, + 220, 13, 121, 1, 215, 108, 220, 13, 121, 1, 201, 78, 220, 13, 121, 1, + 201, 66, 220, 13, 121, 1, 240, 40, 220, 13, 121, 1, 240, 24, 220, 13, + 121, 1, 216, 85, 220, 13, 121, 1, 189, 220, 13, 121, 1, 202, 233, 220, + 13, 121, 1, 240, 135, 220, 13, 121, 1, 239, 175, 220, 13, 121, 1, 176, + 220, 13, 121, 1, 161, 220, 13, 121, 1, 213, 5, 220, 13, 121, 1, 249, 144, + 220, 13, 121, 1, 248, 196, 220, 13, 121, 1, 166, 220, 13, 121, 1, 164, + 220, 13, 121, 1, 169, 220, 13, 121, 1, 172, 220, 13, 121, 1, 199, 152, + 220, 13, 121, 1, 207, 50, 220, 13, 121, 1, 205, 80, 220, 13, 121, 1, 183, + 220, 13, 121, 1, 142, 220, 13, 121, 1, 222, 36, 220, 13, 121, 1, 223, + 200, 220, 13, 121, 1, 225, 129, 220, 13, 121, 1, 201, 217, 220, 13, 121, + 18, 2, 252, 167, 220, 13, 121, 18, 2, 68, 220, 13, 121, 18, 2, 226, 119, + 220, 13, 121, 18, 2, 66, 220, 13, 121, 18, 2, 199, 245, 220, 13, 121, 18, + 2, 110, 144, 220, 13, 121, 18, 2, 69, 220, 13, 121, 18, 2, 251, 199, 220, + 13, 121, 18, 2, 72, 220, 13, 121, 18, 2, 250, 149, 220, 13, 121, 2, 251, + 50, 220, 13, 121, 2, 199, 2, 220, 13, 121, 2, 215, 148, 220, 13, 121, 2, + 247, 134, 220, 13, 121, 2, 232, 226, 220, 13, 121, 199, 7, 220, 13, 121, + 210, 115, 220, 13, 121, 210, 246, 220, 13, 121, 17, 195, 79, 220, 13, + 121, 17, 100, 220, 13, 121, 17, 102, 220, 13, 121, 17, 134, 220, 13, 121, + 17, 136, 220, 13, 121, 17, 146, 220, 13, 121, 17, 167, 220, 13, 121, 17, + 178, 220, 13, 121, 17, 171, 220, 13, 121, 17, 182, 233, 53, 121, 1, 63, + 233, 53, 121, 1, 252, 167, 233, 53, 121, 1, 68, 233, 53, 121, 1, 226, + 119, 233, 53, 121, 1, 66, 233, 53, 121, 1, 199, 245, 233, 53, 121, 1, + 237, 53, 233, 53, 121, 1, 251, 199, 233, 53, 121, 1, 214, 101, 233, 53, + 121, 1, 250, 149, 233, 53, 121, 1, 164, 233, 53, 121, 1, 199, 152, 233, + 53, 121, 1, 249, 144, 233, 53, 121, 1, 248, 196, 233, 53, 121, 1, 166, + 233, 53, 121, 1, 155, 233, 53, 121, 1, 224, 145, 233, 53, 121, 1, 189, + 233, 53, 121, 1, 202, 233, 233, 53, 121, 1, 172, 233, 53, 121, 1, 234, + 122, 233, 53, 121, 1, 233, 229, 233, 53, 121, 1, 240, 135, 233, 53, 121, + 1, 239, 175, 233, 53, 121, 1, 176, 233, 53, 121, 1, 247, 173, 233, 53, + 121, 1, 247, 15, 233, 53, 121, 1, 201, 78, 233, 53, 121, 1, 201, 66, 233, + 53, 121, 1, 222, 36, 233, 53, 121, 1, 225, 213, 233, 53, 121, 1, 225, + 179, 233, 53, 121, 1, 240, 40, 233, 53, 121, 1, 240, 24, 233, 53, 121, 1, + 217, 70, 233, 53, 121, 1, 161, 233, 53, 121, 1, 213, 5, 233, 53, 121, 1, + 142, 233, 53, 121, 1, 169, 233, 53, 121, 1, 183, 233, 53, 121, 18, 2, + 252, 167, 233, 53, 121, 18, 2, 68, 233, 53, 121, 18, 2, 226, 119, 233, + 53, 121, 18, 2, 66, 233, 53, 121, 18, 2, 199, 245, 233, 53, 121, 18, 2, + 237, 53, 233, 53, 121, 18, 2, 251, 199, 233, 53, 121, 18, 2, 214, 101, + 233, 53, 121, 18, 2, 250, 149, 233, 53, 121, 2, 251, 50, 233, 53, 121, 2, + 199, 2, 233, 53, 121, 199, 7, 233, 53, 121, 214, 126, 233, 53, 121, 17, + 195, 79, 233, 53, 121, 17, 100, 233, 53, 121, 17, 102, 233, 53, 121, 17, + 134, 233, 53, 121, 17, 136, 233, 53, 121, 17, 146, 233, 53, 121, 17, 167, + 233, 53, 121, 17, 178, 233, 53, 121, 17, 171, 233, 53, 121, 17, 182, 220, + 70, 1, 155, 220, 70, 1, 234, 122, 220, 70, 1, 217, 70, 220, 70, 1, 161, + 220, 70, 1, 249, 144, 220, 70, 1, 166, 220, 70, 1, 189, 220, 70, 1, 240, + 135, 220, 70, 1, 176, 220, 70, 1, 247, 173, 220, 70, 1, 225, 213, 220, + 70, 1, 215, 108, 220, 70, 1, 164, 220, 70, 1, 169, 220, 70, 1, 172, 220, + 70, 1, 199, 152, 220, 70, 1, 183, 220, 70, 1, 63, 220, 70, 251, 92, 220, + 70, 18, 2, 68, 220, 70, 18, 2, 66, 220, 70, 18, 2, 69, 220, 70, 18, 2, + 72, 220, 70, 213, 120, 220, 70, 236, 221, 77, 208, 132, 42, 191, 97, 202, + 151, 42, 191, 97, 214, 114, 42, 191, 97, 237, 22, 42, 191, 97, 206, 11, + 42, 191, 97, 235, 16, 42, 191, 97, 202, 173, 42, 191, 115, 237, 21, 42, + 191, 115, 206, 10, 42, 191, 97, 200, 237, 42, 191, 97, 206, 20, 42, 191, + 97, 206, 19, 42, 191, 97, 203, 14, 42, 191, 97, 237, 25, 42, 191, 115, + 200, 236, 42, 191, 115, 206, 18, 42, 191, 97, 235, 147, 42, 191, 97, 211, + 86, 42, 191, 97, 232, 223, 42, 191, 97, 232, 222, 42, 191, 115, 211, 84, + 42, 191, 237, 232, 235, 222, 224, 78, 42, 2, 217, 101, 42, 2, 247, 20, + 42, 2, 252, 118, 42, 2, 199, 233, 42, 2, 218, 81, 42, 2, 223, 150, 42, 2, + 213, 111, 42, 2, 218, 125, 42, 2, 225, 51, 42, 2, 213, 188, 42, 2, 212, + 92, 42, 2, 199, 137, 42, 2, 213, 237, 42, 2, 223, 139, 42, 2, 199, 108, + 42, 197, 85, 241, 32, 55, 42, 237, 203, 241, 32, 55, 42, 222, 236, 55, + 42, 208, 234, 213, 191, 55, 42, 201, 212, 241, 73, 55, 42, 201, 212, 31, + 55, 42, 241, 15, 55, 42, 26, 214, 167, 55, 42, 205, 129, 55, 42, 201, + 228, 55, 42, 226, 86, 212, 75, 55, 42, 205, 1, 234, 234, 55, 42, 2, 218, + 85, 42, 2, 199, 145, 42, 211, 213, 236, 221, 77, 202, 237, 10, 2, 63, 10, + 2, 39, 24, 63, 10, 2, 39, 24, 249, 126, 10, 2, 39, 24, 234, 91, 203, 12, + 10, 2, 39, 24, 142, 10, 2, 39, 24, 226, 121, 10, 2, 39, 24, 223, 60, 233, + 51, 10, 2, 39, 24, 218, 92, 10, 2, 39, 24, 209, 1, 10, 2, 254, 176, 10, + 2, 252, 116, 10, 2, 252, 117, 24, 250, 192, 10, 2, 252, 117, 24, 237, + 186, 233, 51, 10, 2, 252, 117, 24, 234, 104, 10, 2, 252, 117, 24, 234, + 91, 203, 12, 10, 2, 252, 117, 24, 142, 10, 2, 252, 117, 24, 226, 122, + 233, 51, 10, 2, 252, 117, 24, 226, 95, 10, 2, 252, 117, 24, 223, 61, 10, + 2, 252, 117, 24, 206, 239, 10, 2, 252, 117, 24, 118, 98, 118, 98, 66, 10, + 2, 252, 117, 233, 51, 10, 2, 252, 33, 10, 2, 252, 34, 24, 249, 105, 10, + 2, 252, 34, 24, 234, 91, 203, 12, 10, 2, 252, 34, 24, 219, 207, 98, 236, + 229, 10, 2, 252, 34, 24, 207, 48, 10, 2, 252, 34, 24, 203, 129, 10, 2, + 252, 5, 10, 2, 251, 180, 10, 2, 251, 181, 24, 236, 156, 10, 2, 251, 181, + 24, 206, 201, 98, 233, 163, 10, 2, 251, 172, 10, 2, 251, 173, 24, 251, + 172, 10, 2, 251, 173, 24, 239, 104, 10, 2, 251, 173, 24, 233, 163, 10, 2, + 251, 173, 24, 142, 10, 2, 251, 173, 24, 225, 39, 10, 2, 251, 173, 24, + 224, 100, 10, 2, 251, 173, 24, 206, 255, 10, 2, 251, 173, 24, 199, 253, + 10, 2, 251, 169, 10, 2, 251, 161, 10, 2, 251, 118, 10, 2, 251, 119, 24, + 206, 255, 10, 2, 251, 105, 10, 2, 251, 106, 127, 251, 105, 10, 2, 251, + 106, 115, 202, 76, 10, 2, 251, 106, 98, 217, 234, 214, 78, 251, 106, 98, + 217, 233, 10, 2, 251, 106, 98, 217, 234, 205, 93, 10, 2, 251, 70, 10, 2, + 251, 40, 10, 2, 251, 6, 10, 2, 251, 7, 24, 223, 153, 10, 2, 250, 234, 10, + 2, 250, 199, 10, 2, 250, 194, 10, 2, 250, 195, 195, 29, 203, 12, 10, 2, + 250, 195, 225, 43, 203, 12, 10, 2, 250, 195, 127, 250, 195, 201, 29, 127, + 201, 29, 201, 29, 127, 201, 29, 213, 162, 10, 2, 250, 195, 127, 250, 195, + 127, 250, 194, 10, 2, 250, 195, 127, 250, 195, 127, 250, 195, 241, 54, + 250, 195, 127, 250, 195, 127, 250, 194, 10, 2, 250, 192, 10, 2, 250, 188, + 10, 2, 249, 144, 10, 2, 249, 126, 10, 2, 249, 120, 10, 2, 249, 112, 10, + 2, 249, 106, 10, 2, 249, 107, 127, 249, 106, 10, 2, 249, 105, 10, 2, 154, + 10, 2, 249, 78, 10, 2, 248, 183, 10, 2, 248, 184, 24, 63, 10, 2, 248, + 184, 24, 234, 82, 10, 2, 248, 184, 24, 226, 122, 233, 51, 10, 2, 248, 20, + 10, 2, 248, 21, 127, 248, 21, 252, 116, 10, 2, 248, 21, 127, 248, 21, + 200, 72, 10, 2, 248, 21, 241, 54, 248, 20, 10, 2, 247, 254, 10, 2, 247, + 255, 127, 247, 254, 10, 2, 247, 243, 10, 2, 247, 242, 10, 2, 240, 135, + 10, 2, 240, 125, 10, 2, 240, 126, 224, 59, 24, 39, 98, 220, 11, 10, 2, + 240, 126, 224, 59, 24, 251, 118, 10, 2, 240, 126, 224, 59, 24, 249, 105, + 10, 2, 240, 126, 224, 59, 24, 248, 183, 10, 2, 240, 126, 224, 59, 24, + 234, 122, 10, 2, 240, 126, 224, 59, 24, 234, 123, 98, 220, 11, 10, 2, + 240, 126, 224, 59, 24, 233, 191, 10, 2, 240, 126, 224, 59, 24, 233, 172, + 10, 2, 240, 126, 224, 59, 24, 233, 64, 10, 2, 240, 126, 224, 59, 24, 142, + 10, 2, 240, 126, 224, 59, 24, 226, 0, 10, 2, 240, 126, 224, 59, 24, 226, + 1, 98, 221, 190, 10, 2, 240, 126, 224, 59, 24, 225, 24, 10, 2, 240, 126, + 224, 59, 24, 172, 10, 2, 240, 126, 224, 59, 24, 221, 190, 10, 2, 240, + 126, 224, 59, 24, 221, 191, 98, 220, 10, 10, 2, 240, 126, 224, 59, 24, + 221, 173, 10, 2, 240, 126, 224, 59, 24, 217, 117, 10, 2, 240, 126, 224, + 59, 24, 213, 163, 98, 213, 162, 10, 2, 240, 126, 224, 59, 24, 206, 112, + 10, 2, 240, 126, 224, 59, 24, 203, 129, 10, 2, 240, 126, 224, 59, 24, + 200, 116, 98, 233, 172, 10, 2, 240, 126, 224, 59, 24, 199, 253, 10, 2, + 240, 97, 10, 2, 240, 74, 10, 2, 240, 73, 10, 2, 240, 72, 10, 2, 239, 151, + 10, 2, 239, 133, 10, 2, 239, 106, 10, 2, 239, 107, 24, 206, 255, 10, 2, + 239, 104, 10, 2, 239, 94, 10, 2, 239, 95, 224, 240, 118, 233, 52, 239, + 74, 10, 2, 239, 74, 10, 2, 237, 200, 10, 2, 237, 201, 127, 237, 200, 10, + 2, 237, 201, 233, 51, 10, 2, 237, 201, 206, 236, 10, 2, 237, 198, 10, 2, + 237, 199, 24, 236, 137, 10, 2, 237, 197, 10, 2, 237, 194, 10, 2, 237, + 193, 10, 2, 237, 192, 10, 2, 237, 187, 10, 2, 237, 185, 10, 2, 237, 186, + 233, 51, 10, 2, 237, 186, 233, 52, 233, 51, 10, 2, 237, 184, 10, 2, 237, + 177, 10, 2, 69, 10, 2, 237, 135, 24, 213, 162, 10, 2, 237, 135, 127, 237, + 135, 215, 138, 127, 215, 137, 10, 2, 237, 82, 10, 2, 237, 83, 24, 39, 98, + 233, 3, 98, 240, 135, 10, 2, 237, 83, 24, 234, 82, 10, 2, 237, 83, 24, + 219, 77, 10, 2, 237, 83, 24, 208, 241, 10, 2, 237, 83, 24, 206, 255, 10, + 2, 237, 83, 24, 66, 10, 2, 237, 55, 10, 2, 237, 43, 10, 2, 237, 6, 10, 2, + 236, 229, 10, 2, 236, 230, 24, 234, 90, 10, 2, 236, 230, 24, 234, 91, + 203, 12, 10, 2, 236, 230, 24, 219, 206, 10, 2, 236, 230, 241, 54, 236, + 229, 10, 2, 236, 230, 214, 78, 236, 229, 10, 2, 236, 230, 205, 93, 10, 2, + 236, 159, 10, 2, 236, 156, 10, 2, 236, 137, 10, 2, 236, 53, 10, 2, 236, + 54, 24, 63, 10, 2, 236, 54, 24, 39, 98, 222, 250, 10, 2, 236, 54, 24, 39, + 98, 222, 251, 24, 222, 250, 10, 2, 236, 54, 24, 251, 105, 10, 2, 236, 54, + 24, 249, 126, 10, 2, 236, 54, 24, 237, 186, 233, 51, 10, 2, 236, 54, 24, + 237, 186, 233, 52, 233, 51, 10, 2, 236, 54, 24, 142, 10, 2, 236, 54, 24, + 233, 3, 233, 51, 10, 2, 236, 54, 24, 226, 122, 233, 51, 10, 2, 236, 54, + 24, 224, 239, 10, 2, 236, 54, 24, 224, 240, 205, 93, 10, 2, 236, 54, 24, + 223, 177, 10, 2, 236, 54, 24, 172, 10, 2, 236, 54, 24, 222, 251, 24, 222, + 250, 10, 2, 236, 54, 24, 222, 108, 10, 2, 236, 54, 24, 221, 190, 10, 2, + 236, 54, 24, 200, 115, 10, 2, 236, 54, 24, 200, 104, 10, 2, 234, 122, 10, + 2, 234, 123, 233, 51, 10, 2, 234, 120, 10, 2, 234, 121, 24, 39, 98, 240, + 136, 98, 142, 10, 2, 234, 121, 24, 39, 98, 142, 10, 2, 234, 121, 24, 39, + 98, 226, 121, 10, 2, 234, 121, 24, 252, 34, 203, 13, 98, 203, 154, 10, 2, + 234, 121, 24, 251, 105, 10, 2, 234, 121, 24, 250, 194, 10, 2, 234, 121, + 24, 250, 193, 98, 234, 104, 10, 2, 234, 121, 24, 249, 126, 10, 2, 234, + 121, 24, 249, 79, 98, 169, 10, 2, 234, 121, 24, 247, 243, 10, 2, 234, + 121, 24, 247, 244, 98, 169, 10, 2, 234, 121, 24, 240, 135, 10, 2, 234, + 121, 24, 239, 151, 10, 2, 234, 121, 24, 239, 107, 24, 206, 255, 10, 2, + 234, 121, 24, 237, 198, 10, 2, 234, 121, 24, 237, 6, 10, 2, 234, 121, 24, + 237, 7, 98, 172, 10, 2, 234, 121, 24, 236, 229, 10, 2, 234, 121, 24, 236, + 230, 24, 234, 91, 203, 12, 10, 2, 234, 121, 24, 234, 91, 203, 12, 10, 2, + 234, 121, 24, 234, 82, 10, 2, 234, 121, 24, 233, 191, 10, 2, 234, 121, + 24, 233, 189, 10, 2, 234, 121, 24, 233, 190, 98, 63, 10, 2, 234, 121, 24, + 233, 173, 98, 204, 172, 10, 2, 234, 121, 24, 233, 3, 98, 221, 191, 98, + 236, 137, 10, 2, 234, 121, 24, 232, 227, 10, 2, 234, 121, 24, 232, 228, + 98, 172, 10, 2, 234, 121, 24, 232, 71, 98, 222, 108, 10, 2, 234, 121, 24, + 231, 66, 10, 2, 234, 121, 24, 226, 122, 233, 51, 10, 2, 234, 121, 24, + 225, 242, 98, 231, 75, 98, 250, 194, 10, 2, 234, 121, 24, 225, 24, 10, 2, + 234, 121, 24, 224, 239, 10, 2, 234, 121, 24, 224, 86, 10, 2, 234, 121, + 24, 224, 87, 98, 222, 250, 10, 2, 234, 121, 24, 223, 178, 98, 251, 105, + 10, 2, 234, 121, 24, 172, 10, 2, 234, 121, 24, 219, 207, 98, 236, 229, + 10, 2, 234, 121, 24, 219, 77, 10, 2, 234, 121, 24, 215, 137, 10, 2, 234, + 121, 24, 215, 138, 127, 215, 137, 10, 2, 234, 121, 24, 161, 10, 2, 234, + 121, 24, 208, 241, 10, 2, 234, 121, 24, 208, 204, 10, 2, 234, 121, 24, + 206, 255, 10, 2, 234, 121, 24, 207, 0, 98, 201, 10, 10, 2, 234, 121, 24, + 206, 221, 10, 2, 234, 121, 24, 204, 117, 10, 2, 234, 121, 24, 203, 129, + 10, 2, 234, 121, 24, 66, 10, 2, 234, 121, 24, 200, 104, 10, 2, 234, 121, + 24, 200, 105, 98, 237, 200, 10, 2, 234, 121, 127, 234, 120, 10, 2, 234, + 115, 10, 2, 234, 116, 241, 54, 234, 115, 10, 2, 234, 113, 10, 2, 234, + 114, 127, 234, 114, 234, 83, 127, 234, 82, 10, 2, 234, 104, 10, 2, 234, + 105, 234, 114, 127, 234, 114, 234, 83, 127, 234, 82, 10, 2, 234, 103, 10, + 2, 234, 101, 10, 2, 234, 92, 10, 2, 234, 90, 10, 2, 234, 91, 203, 12, 10, + 2, 234, 91, 127, 234, 90, 10, 2, 234, 91, 241, 54, 234, 90, 10, 2, 234, + 82, 10, 2, 234, 81, 10, 2, 234, 75, 10, 2, 234, 16, 10, 2, 234, 17, 24, + 223, 153, 10, 2, 233, 191, 10, 2, 233, 192, 24, 69, 10, 2, 233, 192, 24, + 66, 10, 2, 233, 192, 241, 54, 233, 191, 10, 2, 233, 189, 10, 2, 233, 190, + 127, 233, 189, 10, 2, 233, 190, 241, 54, 233, 189, 10, 2, 233, 186, 10, + 2, 233, 172, 10, 2, 233, 173, 233, 51, 10, 2, 233, 170, 10, 2, 233, 171, + 24, 39, 98, 226, 121, 10, 2, 233, 171, 24, 234, 91, 203, 12, 10, 2, 233, + 171, 24, 226, 121, 10, 2, 233, 171, 24, 221, 191, 98, 226, 121, 10, 2, + 233, 171, 24, 161, 10, 2, 233, 165, 10, 2, 233, 163, 10, 2, 233, 164, + 241, 54, 233, 163, 10, 2, 233, 164, 24, 249, 126, 10, 2, 233, 164, 24, + 203, 129, 10, 2, 233, 164, 203, 12, 10, 2, 233, 75, 10, 2, 233, 76, 241, + 54, 233, 75, 10, 2, 233, 73, 10, 2, 233, 74, 24, 225, 24, 10, 2, 233, 74, + 24, 225, 25, 24, 226, 122, 233, 51, 10, 2, 233, 74, 24, 215, 137, 10, 2, + 233, 74, 24, 208, 242, 98, 201, 28, 10, 2, 233, 74, 233, 51, 10, 2, 233, + 64, 10, 2, 233, 65, 24, 39, 98, 223, 153, 10, 2, 233, 65, 24, 223, 153, + 10, 2, 233, 65, 127, 233, 65, 221, 181, 10, 2, 233, 56, 10, 2, 233, 54, + 10, 2, 233, 55, 24, 206, 255, 10, 2, 233, 45, 10, 2, 233, 44, 10, 2, 233, + 40, 10, 2, 233, 39, 10, 2, 142, 10, 2, 233, 3, 203, 12, 10, 2, 233, 3, + 233, 51, 10, 2, 232, 227, 10, 2, 232, 70, 10, 2, 232, 71, 24, 250, 194, + 10, 2, 232, 71, 24, 250, 192, 10, 2, 232, 71, 24, 249, 126, 10, 2, 232, + 71, 24, 239, 74, 10, 2, 232, 71, 24, 234, 113, 10, 2, 232, 71, 24, 224, + 75, 10, 2, 232, 71, 24, 215, 137, 10, 2, 232, 71, 24, 206, 255, 10, 2, + 232, 71, 24, 66, 10, 2, 231, 74, 10, 2, 231, 66, 10, 2, 231, 67, 24, 251, + 105, 10, 2, 231, 67, 24, 232, 227, 10, 2, 231, 67, 24, 224, 239, 10, 2, + 231, 67, 24, 222, 52, 10, 2, 231, 67, 24, 200, 104, 10, 2, 231, 62, 10, + 2, 68, 10, 2, 230, 248, 63, 10, 2, 230, 204, 10, 2, 226, 149, 10, 2, 226, + 150, 127, 226, 150, 247, 243, 10, 2, 226, 150, 127, 226, 150, 205, 93, + 10, 2, 226, 124, 10, 2, 226, 121, 10, 2, 226, 122, 239, 133, 10, 2, 226, + 122, 210, 72, 10, 2, 226, 122, 127, 226, 122, 206, 205, 127, 206, 205, + 200, 105, 127, 200, 104, 10, 2, 226, 122, 233, 51, 10, 2, 226, 113, 10, + 2, 226, 114, 24, 234, 91, 203, 12, 10, 2, 226, 112, 10, 2, 226, 102, 10, + 2, 226, 103, 24, 203, 129, 10, 2, 226, 103, 241, 54, 226, 102, 10, 2, + 226, 103, 214, 78, 226, 102, 10, 2, 226, 103, 205, 93, 10, 2, 226, 95, + 10, 2, 226, 85, 10, 2, 226, 0, 10, 2, 225, 241, 10, 2, 155, 10, 2, 225, + 69, 24, 63, 10, 2, 225, 69, 24, 252, 5, 10, 2, 225, 69, 24, 252, 6, 98, + 223, 177, 10, 2, 225, 69, 24, 250, 192, 10, 2, 225, 69, 24, 249, 126, 10, + 2, 225, 69, 24, 249, 105, 10, 2, 225, 69, 24, 154, 10, 2, 225, 69, 24, + 248, 183, 10, 2, 225, 69, 24, 236, 156, 10, 2, 225, 69, 24, 236, 137, 10, + 2, 225, 69, 24, 234, 122, 10, 2, 225, 69, 24, 234, 104, 10, 2, 225, 69, + 24, 234, 91, 203, 12, 10, 2, 225, 69, 24, 234, 82, 10, 2, 225, 69, 24, + 234, 83, 98, 207, 49, 98, 63, 10, 2, 225, 69, 24, 233, 191, 10, 2, 225, + 69, 24, 233, 172, 10, 2, 225, 69, 24, 233, 164, 98, 208, 204, 10, 2, 225, + 69, 24, 233, 164, 241, 54, 233, 163, 10, 2, 225, 69, 24, 233, 75, 10, 2, + 225, 69, 24, 233, 44, 10, 2, 225, 69, 24, 226, 121, 10, 2, 225, 69, 24, + 226, 102, 10, 2, 225, 69, 24, 225, 24, 10, 2, 225, 69, 24, 224, 100, 10, + 2, 225, 69, 24, 224, 86, 10, 2, 225, 69, 24, 222, 108, 10, 2, 225, 69, + 24, 221, 190, 10, 2, 225, 69, 24, 219, 206, 10, 2, 225, 69, 24, 219, 207, + 98, 237, 200, 10, 2, 225, 69, 24, 219, 207, 98, 233, 191, 10, 2, 225, 69, + 24, 219, 207, 98, 203, 68, 10, 2, 225, 69, 24, 219, 77, 10, 2, 225, 69, + 24, 219, 78, 98, 215, 132, 10, 2, 225, 69, 24, 217, 117, 10, 2, 225, 69, + 24, 215, 137, 10, 2, 225, 69, 24, 212, 219, 10, 2, 225, 69, 24, 209, 140, + 10, 2, 225, 69, 24, 183, 10, 2, 225, 69, 24, 208, 204, 10, 2, 225, 69, + 24, 207, 50, 10, 2, 225, 69, 24, 206, 255, 10, 2, 225, 69, 24, 206, 221, + 10, 2, 225, 69, 24, 206, 151, 10, 2, 225, 69, 24, 206, 91, 10, 2, 225, + 69, 24, 204, 126, 10, 2, 225, 69, 24, 203, 101, 10, 2, 225, 69, 24, 66, + 10, 2, 225, 69, 24, 200, 115, 10, 2, 225, 69, 24, 200, 104, 10, 2, 225, + 69, 24, 200, 75, 24, 161, 10, 2, 225, 69, 24, 199, 253, 10, 2, 225, 69, + 24, 195, 33, 10, 2, 225, 55, 10, 2, 225, 56, 241, 54, 225, 55, 10, 2, + 225, 44, 10, 2, 225, 41, 10, 2, 225, 39, 10, 2, 225, 38, 10, 2, 225, 36, + 10, 2, 225, 37, 127, 225, 36, 10, 2, 225, 24, 10, 2, 225, 25, 24, 226, + 122, 233, 51, 10, 2, 225, 20, 10, 2, 225, 21, 24, 249, 126, 10, 2, 225, + 21, 241, 54, 225, 20, 10, 2, 225, 18, 10, 2, 225, 17, 10, 2, 224, 239, + 10, 2, 224, 240, 223, 62, 24, 118, 127, 223, 62, 24, 66, 10, 2, 224, 240, + 127, 224, 240, 223, 62, 24, 118, 127, 223, 62, 24, 66, 10, 2, 224, 172, + 10, 2, 224, 100, 10, 2, 224, 101, 24, 249, 126, 10, 2, 224, 101, 24, 66, + 10, 2, 224, 101, 24, 200, 104, 10, 2, 224, 86, 10, 2, 224, 75, 10, 2, + 224, 61, 10, 2, 224, 60, 10, 2, 224, 58, 10, 2, 224, 59, 127, 224, 58, + 10, 2, 223, 186, 10, 2, 223, 187, 127, 232, 71, 24, 250, 193, 223, 187, + 127, 232, 71, 24, 250, 192, 10, 2, 223, 177, 10, 2, 223, 175, 10, 2, 223, + 176, 199, 132, 20, 10, 2, 223, 174, 10, 2, 223, 166, 10, 2, 223, 167, + 233, 51, 10, 2, 223, 165, 10, 2, 223, 153, 10, 2, 223, 154, 214, 78, 223, + 153, 10, 2, 223, 146, 10, 2, 223, 123, 10, 2, 172, 10, 2, 223, 61, 10, 2, + 223, 62, 24, 63, 10, 2, 223, 62, 24, 39, 98, 240, 136, 98, 142, 10, 2, + 223, 62, 24, 39, 98, 234, 82, 10, 2, 223, 62, 24, 39, 98, 222, 250, 10, + 2, 223, 62, 24, 251, 172, 10, 2, 223, 62, 24, 251, 105, 10, 2, 223, 62, + 24, 250, 195, 195, 29, 203, 12, 10, 2, 223, 62, 24, 249, 126, 10, 2, 223, + 62, 24, 248, 183, 10, 2, 223, 62, 24, 240, 74, 10, 2, 223, 62, 24, 236, + 229, 10, 2, 223, 62, 24, 234, 122, 10, 2, 223, 62, 24, 234, 82, 10, 2, + 223, 62, 24, 233, 64, 10, 2, 223, 62, 24, 233, 65, 98, 233, 64, 10, 2, + 223, 62, 24, 142, 10, 2, 223, 62, 24, 232, 227, 10, 2, 223, 62, 24, 232, + 71, 24, 215, 137, 10, 2, 223, 62, 24, 226, 122, 233, 51, 10, 2, 223, 62, + 24, 226, 102, 10, 2, 223, 62, 24, 226, 103, 98, 142, 10, 2, 223, 62, 24, + 226, 103, 98, 221, 190, 10, 2, 223, 62, 24, 224, 100, 10, 2, 223, 62, 24, + 224, 75, 10, 2, 223, 62, 24, 223, 177, 10, 2, 223, 62, 24, 223, 166, 10, + 2, 223, 62, 24, 223, 167, 98, 232, 71, 98, 63, 10, 2, 223, 62, 24, 223, + 61, 10, 2, 223, 62, 24, 222, 52, 10, 2, 223, 62, 24, 221, 190, 10, 2, + 223, 62, 24, 221, 175, 10, 2, 223, 62, 24, 219, 206, 10, 2, 223, 62, 24, + 219, 207, 98, 236, 229, 10, 2, 223, 62, 24, 218, 92, 10, 2, 223, 62, 24, + 217, 117, 10, 2, 223, 62, 24, 207, 0, 98, 204, 117, 10, 2, 223, 62, 24, + 206, 201, 98, 233, 164, 98, 236, 156, 10, 2, 223, 62, 24, 206, 201, 98, + 233, 164, 203, 12, 10, 2, 223, 62, 24, 206, 149, 10, 2, 223, 62, 24, 206, + 150, 98, 206, 149, 10, 2, 223, 62, 24, 204, 117, 10, 2, 223, 62, 24, 203, + 143, 10, 2, 223, 62, 24, 203, 129, 10, 2, 223, 62, 24, 203, 69, 98, 39, + 98, 204, 173, 98, 176, 10, 2, 223, 62, 24, 66, 10, 2, 223, 62, 24, 118, + 98, 63, 10, 2, 223, 62, 24, 118, 98, 118, 98, 66, 10, 2, 223, 62, 24, + 200, 116, 98, 250, 194, 10, 2, 223, 62, 24, 200, 104, 10, 2, 223, 62, 24, + 199, 253, 10, 2, 223, 62, 205, 93, 10, 2, 223, 59, 10, 2, 223, 60, 24, + 206, 255, 10, 2, 223, 60, 24, 207, 0, 98, 204, 117, 10, 2, 223, 60, 233, + 51, 10, 2, 223, 60, 233, 52, 127, 223, 60, 233, 52, 206, 255, 10, 2, 223, + 55, 10, 2, 222, 250, 10, 2, 222, 251, 24, 222, 250, 10, 2, 222, 248, 10, + 2, 222, 249, 24, 223, 153, 10, 2, 222, 249, 24, 223, 154, 98, 209, 140, + 10, 2, 222, 108, 10, 2, 222, 89, 10, 2, 222, 77, 10, 2, 222, 52, 10, 2, + 221, 190, 10, 2, 221, 191, 24, 249, 126, 10, 2, 221, 188, 10, 2, 221, + 189, 24, 251, 172, 10, 2, 221, 189, 24, 249, 126, 10, 2, 221, 189, 24, + 236, 137, 10, 2, 221, 189, 24, 236, 138, 203, 12, 10, 2, 221, 189, 24, + 234, 91, 203, 12, 10, 2, 221, 189, 24, 232, 71, 24, 249, 126, 10, 2, 221, + 189, 24, 226, 102, 10, 2, 221, 189, 24, 225, 41, 10, 2, 221, 189, 24, + 225, 39, 10, 2, 221, 189, 24, 225, 40, 98, 250, 194, 10, 2, 221, 189, 24, + 224, 100, 10, 2, 221, 189, 24, 223, 82, 98, 250, 194, 10, 2, 221, 189, + 24, 223, 61, 10, 2, 221, 189, 24, 219, 207, 98, 236, 229, 10, 2, 221, + 189, 24, 217, 117, 10, 2, 221, 189, 24, 215, 185, 10, 2, 221, 189, 24, + 206, 113, 98, 250, 194, 10, 2, 221, 189, 24, 206, 83, 98, 248, 20, 10, 2, + 221, 189, 24, 201, 28, 10, 2, 221, 189, 203, 12, 10, 2, 221, 189, 241, + 54, 221, 188, 10, 2, 221, 189, 214, 78, 221, 188, 10, 2, 221, 189, 205, + 93, 10, 2, 221, 189, 206, 236, 10, 2, 221, 187, 10, 2, 221, 181, 10, 2, + 221, 182, 127, 221, 181, 10, 2, 221, 182, 214, 78, 221, 181, 10, 2, 221, + 182, 206, 236, 10, 2, 221, 178, 10, 2, 221, 175, 10, 2, 221, 173, 10, 2, + 221, 174, 127, 221, 173, 10, 2, 221, 174, 127, 221, 174, 234, 83, 127, + 234, 82, 10, 2, 166, 10, 2, 220, 127, 24, 203, 129, 10, 2, 220, 127, 233, + 51, 10, 2, 220, 119, 10, 2, 220, 88, 10, 2, 220, 36, 10, 2, 220, 11, 10, + 2, 220, 10, 10, 2, 219, 206, 10, 2, 219, 150, 10, 2, 219, 77, 10, 2, 219, + 22, 10, 2, 218, 144, 10, 2, 218, 145, 127, 218, 144, 10, 2, 218, 129, 10, + 2, 218, 130, 233, 51, 10, 2, 218, 110, 10, 2, 218, 96, 10, 2, 218, 92, + 10, 2, 218, 93, 24, 63, 10, 2, 218, 93, 24, 223, 153, 10, 2, 218, 93, 24, + 195, 115, 10, 2, 218, 93, 127, 218, 92, 10, 2, 218, 93, 127, 218, 93, 24, + 39, 98, 176, 10, 2, 218, 93, 241, 54, 218, 92, 10, 2, 218, 90, 10, 2, + 218, 91, 24, 63, 10, 2, 218, 91, 24, 39, 98, 239, 151, 10, 2, 218, 91, + 24, 239, 151, 10, 2, 218, 91, 233, 51, 10, 2, 176, 10, 2, 217, 246, 10, + 2, 217, 233, 10, 2, 217, 234, 226, 15, 10, 2, 217, 234, 24, 206, 152, + 203, 12, 10, 2, 217, 234, 214, 78, 217, 233, 10, 2, 217, 232, 10, 2, 217, + 225, 215, 123, 10, 2, 217, 224, 10, 2, 217, 223, 10, 2, 217, 117, 10, 2, + 217, 118, 24, 63, 10, 2, 217, 118, 24, 200, 104, 10, 2, 217, 118, 206, + 236, 10, 2, 216, 222, 10, 2, 216, 223, 24, 69, 10, 2, 216, 213, 10, 2, + 216, 183, 10, 2, 216, 184, 24, 234, 91, 203, 12, 10, 2, 216, 184, 24, + 234, 83, 98, 234, 91, 203, 12, 10, 2, 216, 179, 10, 2, 216, 180, 24, 251, + 105, 10, 2, 216, 180, 24, 250, 194, 10, 2, 216, 180, 24, 250, 195, 98, + 250, 194, 10, 2, 216, 180, 24, 233, 64, 10, 2, 216, 180, 24, 219, 207, + 98, 234, 91, 203, 12, 10, 2, 216, 180, 24, 217, 117, 10, 2, 216, 180, 24, + 215, 137, 10, 2, 216, 180, 24, 206, 255, 10, 2, 216, 180, 24, 207, 0, 98, + 39, 251, 105, 10, 2, 216, 180, 24, 207, 0, 98, 250, 194, 10, 2, 216, 180, + 24, 207, 0, 98, 250, 195, 98, 250, 194, 10, 2, 216, 180, 24, 200, 116, + 98, 250, 194, 10, 2, 216, 180, 24, 199, 253, 10, 2, 216, 168, 10, 2, 215, + 185, 10, 2, 215, 154, 10, 2, 215, 137, 10, 2, 215, 138, 223, 60, 24, 234, + 82, 10, 2, 215, 138, 223, 60, 24, 220, 11, 10, 2, 215, 138, 223, 60, 24, + 208, 241, 10, 2, 215, 138, 223, 60, 24, 208, 242, 127, 215, 138, 223, 60, + 24, 208, 241, 10, 2, 215, 138, 223, 60, 24, 199, 253, 10, 2, 215, 138, + 203, 12, 10, 2, 215, 138, 127, 215, 137, 10, 2, 215, 138, 241, 54, 215, + 137, 10, 2, 215, 138, 241, 54, 215, 138, 223, 60, 127, 223, 59, 10, 2, + 215, 132, 10, 2, 215, 133, 252, 34, 24, 250, 188, 10, 2, 215, 133, 252, + 34, 24, 248, 183, 10, 2, 215, 133, 252, 34, 24, 237, 194, 10, 2, 215, + 133, 252, 34, 24, 233, 64, 10, 2, 215, 133, 252, 34, 24, 226, 122, 233, + 51, 10, 2, 215, 133, 252, 34, 24, 225, 39, 10, 2, 215, 133, 252, 34, 24, + 172, 10, 2, 215, 133, 252, 34, 24, 217, 117, 10, 2, 215, 133, 252, 34, + 24, 206, 80, 10, 2, 215, 133, 252, 34, 24, 200, 115, 10, 2, 215, 133, + 224, 59, 24, 248, 183, 10, 2, 215, 133, 224, 59, 24, 248, 184, 66, 10, 2, + 161, 10, 2, 213, 232, 10, 2, 213, 190, 10, 2, 213, 162, 10, 2, 213, 20, + 10, 2, 212, 219, 10, 2, 212, 220, 24, 63, 10, 2, 212, 220, 24, 252, 116, + 10, 2, 212, 220, 24, 248, 183, 10, 2, 212, 220, 24, 248, 20, 10, 2, 212, + 220, 24, 69, 10, 2, 212, 220, 24, 68, 10, 2, 212, 220, 24, 230, 204, 10, + 2, 212, 220, 24, 66, 10, 2, 212, 220, 24, 200, 115, 10, 2, 212, 220, 241, + 54, 212, 219, 10, 2, 212, 160, 10, 2, 212, 161, 24, 225, 20, 10, 2, 212, + 161, 24, 200, 104, 10, 2, 212, 161, 24, 195, 115, 10, 2, 212, 161, 214, + 78, 212, 160, 10, 2, 169, 10, 2, 210, 241, 10, 2, 210, 72, 10, 2, 209, + 140, 10, 2, 183, 10, 2, 209, 2, 215, 123, 10, 2, 209, 1, 10, 2, 209, 2, + 24, 63, 10, 2, 209, 2, 24, 237, 200, 10, 2, 209, 2, 24, 237, 198, 10, 2, + 209, 2, 24, 142, 10, 2, 209, 2, 24, 225, 24, 10, 2, 209, 2, 24, 223, 153, + 10, 2, 209, 2, 24, 221, 173, 10, 2, 209, 2, 24, 219, 77, 10, 2, 209, 2, + 24, 215, 137, 10, 2, 209, 2, 24, 208, 241, 10, 2, 209, 2, 24, 206, 221, + 10, 2, 209, 2, 24, 203, 154, 10, 2, 209, 2, 24, 200, 115, 10, 2, 209, 2, + 24, 200, 110, 10, 2, 209, 2, 24, 200, 79, 10, 2, 209, 2, 24, 200, 21, 10, + 2, 209, 2, 24, 199, 253, 10, 2, 209, 2, 127, 209, 1, 10, 2, 209, 2, 233, + 51, 10, 2, 208, 241, 10, 2, 208, 242, 223, 62, 24, 250, 192, 10, 2, 208, + 213, 10, 2, 208, 204, 10, 2, 207, 50, 10, 2, 207, 48, 10, 2, 207, 49, 24, + 63, 10, 2, 207, 49, 24, 249, 126, 10, 2, 207, 49, 24, 233, 163, 10, 2, + 207, 49, 24, 217, 117, 10, 2, 207, 49, 24, 206, 149, 10, 2, 207, 49, 24, + 201, 10, 10, 2, 207, 49, 24, 66, 10, 2, 207, 49, 24, 118, 98, 63, 10, 2, + 207, 46, 10, 2, 207, 44, 10, 2, 207, 17, 10, 2, 206, 255, 10, 2, 207, 0, + 231, 74, 10, 2, 207, 0, 127, 207, 0, 234, 114, 127, 234, 114, 234, 83, + 127, 234, 82, 10, 2, 207, 0, 127, 207, 0, 203, 155, 127, 203, 155, 234, + 83, 127, 234, 82, 10, 2, 206, 248, 10, 2, 206, 243, 10, 2, 206, 239, 10, + 2, 206, 238, 10, 2, 206, 235, 10, 2, 206, 221, 10, 2, 206, 222, 24, 63, + 10, 2, 206, 222, 24, 226, 102, 10, 2, 206, 215, 10, 2, 206, 216, 24, 63, + 10, 2, 206, 216, 24, 249, 106, 10, 2, 206, 216, 24, 247, 254, 10, 2, 206, + 216, 24, 239, 94, 10, 2, 206, 216, 24, 234, 82, 10, 2, 206, 216, 24, 226, + 121, 10, 2, 206, 216, 24, 226, 122, 233, 51, 10, 2, 206, 216, 24, 223, + 146, 10, 2, 206, 216, 24, 221, 175, 10, 2, 206, 216, 24, 218, 129, 10, 2, + 206, 216, 24, 208, 241, 10, 2, 206, 209, 10, 2, 206, 204, 10, 2, 206, + 205, 203, 12, 10, 2, 206, 205, 127, 206, 205, 247, 244, 127, 247, 243, + 10, 2, 206, 200, 10, 2, 206, 151, 10, 2, 206, 152, 127, 226, 16, 206, + 151, 10, 2, 206, 149, 10, 2, 206, 147, 10, 2, 206, 112, 10, 2, 206, 113, + 233, 51, 10, 2, 206, 91, 10, 2, 206, 89, 10, 2, 206, 90, 127, 206, 90, + 206, 149, 10, 2, 206, 82, 10, 2, 206, 80, 10, 2, 204, 172, 10, 2, 204, + 173, 127, 204, 172, 10, 2, 204, 129, 10, 2, 204, 128, 10, 2, 204, 126, + 10, 2, 204, 117, 10, 2, 204, 116, 10, 2, 204, 88, 10, 2, 204, 87, 10, 2, + 189, 10, 2, 203, 169, 250, 178, 10, 2, 203, 169, 24, 232, 70, 10, 2, 203, + 169, 24, 219, 77, 10, 2, 203, 169, 233, 51, 10, 2, 203, 154, 10, 2, 203, + 155, 127, 203, 155, 216, 223, 127, 216, 223, 239, 75, 127, 239, 74, 10, + 2, 203, 155, 205, 93, 10, 2, 203, 143, 10, 2, 184, 24, 248, 183, 10, 2, + 184, 24, 233, 64, 10, 2, 184, 24, 206, 255, 10, 2, 184, 24, 206, 151, 10, + 2, 184, 24, 201, 28, 10, 2, 184, 24, 200, 104, 10, 2, 203, 129, 10, 2, + 203, 101, 10, 2, 203, 68, 10, 2, 203, 69, 233, 51, 10, 2, 202, 122, 10, + 2, 202, 123, 203, 12, 10, 2, 202, 86, 10, 2, 202, 63, 10, 2, 202, 64, 24, + 203, 129, 10, 2, 202, 64, 127, 202, 63, 10, 2, 202, 64, 127, 202, 64, + 234, 114, 127, 234, 114, 234, 83, 127, 234, 82, 10, 2, 201, 40, 10, 2, + 201, 28, 10, 2, 201, 26, 10, 2, 201, 22, 10, 2, 201, 10, 10, 2, 201, 11, + 127, 201, 11, 195, 116, 127, 195, 115, 10, 2, 66, 10, 2, 118, 233, 64, + 10, 2, 118, 118, 66, 10, 2, 118, 127, 118, 213, 243, 127, 213, 243, 234, + 83, 127, 234, 82, 10, 2, 118, 127, 118, 204, 89, 127, 204, 88, 10, 2, + 118, 127, 118, 118, 210, 89, 127, 118, 210, 88, 10, 2, 200, 115, 10, 2, + 200, 110, 10, 2, 200, 104, 10, 2, 200, 105, 223, 146, 10, 2, 200, 105, + 24, 249, 126, 10, 2, 200, 105, 24, 219, 77, 10, 2, 200, 105, 24, 118, 98, + 118, 98, 66, 10, 2, 200, 105, 24, 118, 98, 118, 98, 118, 233, 51, 10, 2, + 200, 105, 233, 51, 10, 2, 200, 105, 206, 236, 10, 2, 200, 105, 206, 237, + 24, 249, 126, 10, 2, 200, 100, 10, 2, 200, 79, 10, 2, 200, 80, 24, 223, + 61, 10, 2, 200, 80, 24, 219, 207, 98, 240, 135, 10, 2, 200, 80, 24, 207, + 48, 10, 2, 200, 80, 24, 66, 10, 2, 200, 78, 10, 2, 200, 74, 10, 2, 200, + 75, 24, 224, 239, 10, 2, 200, 75, 24, 161, 10, 2, 200, 72, 10, 2, 200, + 73, 233, 51, 10, 2, 200, 21, 10, 2, 200, 22, 241, 54, 200, 21, 10, 2, + 200, 22, 206, 236, 10, 2, 200, 19, 10, 2, 200, 20, 24, 39, 98, 142, 10, + 2, 200, 20, 24, 39, 98, 176, 10, 2, 200, 20, 24, 251, 172, 10, 2, 200, + 20, 24, 142, 10, 2, 200, 20, 24, 215, 137, 10, 2, 200, 20, 24, 200, 115, + 10, 2, 200, 20, 24, 200, 116, 98, 250, 194, 10, 2, 200, 20, 24, 200, 116, + 98, 248, 183, 10, 2, 200, 18, 10, 2, 200, 15, 10, 2, 200, 14, 10, 2, 200, + 10, 10, 2, 200, 11, 24, 63, 10, 2, 200, 11, 24, 250, 188, 10, 2, 200, 11, + 24, 154, 10, 2, 200, 11, 24, 237, 187, 10, 2, 200, 11, 24, 234, 122, 10, + 2, 200, 11, 24, 234, 104, 10, 2, 200, 11, 24, 234, 91, 203, 12, 10, 2, + 200, 11, 24, 234, 82, 10, 2, 200, 11, 24, 233, 75, 10, 2, 200, 11, 24, + 142, 10, 2, 200, 11, 24, 226, 121, 10, 2, 200, 11, 24, 226, 102, 10, 2, + 200, 11, 24, 225, 241, 10, 2, 200, 11, 24, 224, 100, 10, 2, 200, 11, 24, + 221, 173, 10, 2, 200, 11, 24, 219, 22, 10, 2, 200, 11, 24, 161, 10, 2, + 200, 11, 24, 206, 255, 10, 2, 200, 11, 24, 206, 89, 10, 2, 200, 11, 24, + 201, 40, 10, 2, 200, 11, 24, 118, 98, 233, 64, 10, 2, 200, 11, 24, 200, + 104, 10, 2, 200, 11, 24, 200, 8, 10, 2, 200, 8, 10, 2, 200, 9, 24, 66, + 10, 2, 199, 253, 10, 2, 199, 254, 24, 63, 10, 2, 199, 254, 24, 223, 186, + 10, 2, 199, 254, 24, 223, 153, 10, 2, 199, 254, 24, 203, 129, 10, 2, 199, + 249, 10, 2, 199, 252, 10, 2, 199, 250, 10, 2, 199, 246, 10, 2, 199, 234, + 10, 2, 199, 235, 24, 224, 239, 10, 2, 199, 232, 10, 2, 195, 115, 10, 2, + 195, 116, 203, 12, 10, 2, 195, 116, 103, 24, 223, 153, 10, 2, 195, 111, + 10, 2, 195, 103, 10, 2, 195, 87, 10, 2, 195, 33, 10, 2, 195, 34, 127, + 195, 33, 10, 2, 195, 32, 10, 2, 195, 30, 10, 2, 195, 31, 225, 43, 203, + 12, 10, 2, 195, 25, 10, 2, 195, 16, 10, 2, 194, 255, 10, 2, 194, 253, 10, + 2, 194, 254, 24, 63, 10, 2, 194, 252, 10, 2, 194, 251, 10, 2, 225, 8, + 237, 3, 10, 2, 252, 117, 24, 215, 137, 10, 2, 252, 34, 24, 63, 10, 2, + 251, 119, 24, 223, 168, 10, 2, 240, 126, 224, 59, 24, 200, 116, 98, 220, + 11, 10, 2, 240, 124, 10, 2, 239, 75, 98, 206, 151, 10, 2, 237, 199, 24, + 206, 255, 10, 2, 236, 54, 24, 233, 64, 10, 2, 236, 54, 24, 206, 255, 10, + 2, 234, 121, 24, 251, 106, 98, 225, 25, 98, 63, 10, 2, 234, 121, 24, 250, + 192, 10, 2, 234, 46, 10, 2, 233, 180, 10, 2, 231, 47, 10, 2, 225, 69, 24, + 251, 70, 10, 2, 225, 69, 24, 250, 191, 10, 2, 225, 69, 24, 233, 163, 10, + 2, 225, 69, 24, 233, 64, 10, 2, 225, 69, 24, 232, 71, 24, 250, 192, 10, + 2, 225, 69, 24, 221, 173, 10, 2, 225, 69, 24, 161, 10, 2, 225, 69, 24, + 206, 143, 10, 2, 225, 69, 24, 201, 40, 10, 2, 225, 69, 24, 200, 19, 10, + 2, 223, 62, 24, 233, 191, 10, 2, 221, 189, 206, 237, 24, 249, 126, 10, 2, + 221, 189, 24, 236, 138, 98, 222, 250, 10, 2, 221, 189, 24, 206, 151, 10, + 2, 219, 149, 10, 2, 218, 91, 24, 195, 115, 10, 2, 217, 245, 10, 2, 216, + 182, 10, 2, 216, 181, 10, 2, 216, 180, 24, 249, 106, 10, 2, 216, 180, 24, + 233, 191, 10, 2, 215, 155, 209, 194, 216, 174, 239, 229, 10, 2, 213, 21, + 250, 178, 10, 2, 212, 164, 10, 2, 209, 2, 24, 226, 122, 233, 51, 10, 2, + 202, 114, 10, 2, 200, 80, 24, 219, 206, 10, 2, 118, 66, 10, 156, 2, 99, + 250, 194, 10, 156, 2, 115, 250, 194, 10, 156, 2, 235, 6, 250, 194, 10, + 156, 2, 235, 100, 250, 194, 10, 156, 2, 206, 29, 250, 194, 10, 156, 2, + 207, 71, 250, 194, 10, 156, 2, 237, 30, 250, 194, 10, 156, 2, 216, 178, + 250, 194, 10, 156, 2, 115, 239, 74, 10, 156, 2, 235, 6, 239, 74, 10, 156, + 2, 235, 100, 239, 74, 10, 156, 2, 206, 29, 239, 74, 10, 156, 2, 207, 71, + 239, 74, 10, 156, 2, 237, 30, 239, 74, 10, 156, 2, 216, 178, 239, 74, 10, + 156, 2, 235, 6, 66, 10, 156, 2, 235, 100, 66, 10, 156, 2, 206, 29, 66, + 10, 156, 2, 207, 71, 66, 10, 156, 2, 237, 30, 66, 10, 156, 2, 216, 178, + 66, 10, 156, 2, 97, 234, 18, 10, 156, 2, 99, 234, 18, 10, 156, 2, 115, + 234, 18, 10, 156, 2, 235, 6, 234, 18, 10, 156, 2, 235, 100, 234, 18, 10, + 156, 2, 206, 29, 234, 18, 10, 156, 2, 207, 71, 234, 18, 10, 156, 2, 237, + 30, 234, 18, 10, 156, 2, 216, 178, 234, 18, 10, 156, 2, 97, 234, 15, 10, + 156, 2, 99, 234, 15, 10, 156, 2, 115, 234, 15, 10, 156, 2, 235, 6, 234, + 15, 10, 156, 2, 235, 100, 234, 15, 10, 156, 2, 99, 207, 17, 10, 156, 2, + 115, 207, 17, 10, 156, 2, 115, 207, 18, 199, 132, 20, 10, 156, 2, 235, 6, + 207, 17, 10, 156, 2, 235, 100, 207, 17, 10, 156, 2, 206, 29, 207, 17, 10, + 156, 2, 207, 71, 207, 17, 10, 156, 2, 237, 30, 207, 17, 10, 156, 2, 216, + 178, 207, 17, 10, 156, 2, 97, 207, 10, 10, 156, 2, 99, 207, 10, 10, 156, + 2, 115, 207, 10, 10, 156, 2, 115, 207, 11, 199, 132, 20, 10, 156, 2, 235, + 6, 207, 10, 10, 156, 2, 235, 100, 207, 10, 10, 156, 2, 207, 18, 24, 234, + 105, 98, 239, 74, 10, 156, 2, 207, 18, 24, 234, 105, 98, 219, 22, 10, + 156, 2, 97, 247, 239, 10, 156, 2, 99, 247, 239, 10, 156, 2, 115, 247, + 239, 10, 156, 2, 115, 247, 240, 199, 132, 20, 10, 156, 2, 235, 6, 247, + 239, 10, 156, 2, 235, 100, 247, 239, 10, 156, 2, 115, 199, 132, 235, 23, + 236, 139, 10, 156, 2, 115, 199, 132, 235, 23, 236, 136, 10, 156, 2, 235, + 6, 199, 132, 235, 23, 222, 78, 10, 156, 2, 235, 6, 199, 132, 235, 23, + 222, 76, 10, 156, 2, 235, 6, 199, 132, 235, 23, 222, 79, 63, 10, 156, 2, + 235, 6, 199, 132, 235, 23, 222, 79, 250, 111, 10, 156, 2, 206, 29, 199, + 132, 235, 23, 250, 190, 10, 156, 2, 207, 71, 199, 132, 235, 23, 226, 94, + 10, 156, 2, 207, 71, 199, 132, 235, 23, 226, 96, 63, 10, 156, 2, 207, 71, + 199, 132, 235, 23, 226, 96, 250, 111, 10, 156, 2, 237, 30, 199, 132, 235, + 23, 199, 248, 10, 156, 2, 237, 30, 199, 132, 235, 23, 199, 247, 10, 156, + 2, 216, 178, 199, 132, 235, 23, 226, 110, 10, 156, 2, 216, 178, 199, 132, + 235, 23, 226, 109, 10, 156, 2, 216, 178, 199, 132, 235, 23, 226, 108, 10, + 156, 2, 216, 178, 199, 132, 235, 23, 226, 111, 63, 10, 156, 2, 99, 250, + 195, 203, 12, 10, 156, 2, 115, 250, 195, 203, 12, 10, 156, 2, 235, 6, + 250, 195, 203, 12, 10, 156, 2, 235, 100, 250, 195, 203, 12, 10, 156, 2, + 206, 29, 250, 195, 203, 12, 10, 156, 2, 97, 249, 90, 10, 156, 2, 99, 249, + 90, 10, 156, 2, 115, 249, 90, 10, 156, 2, 235, 6, 249, 90, 10, 156, 2, + 235, 6, 249, 91, 199, 132, 20, 10, 156, 2, 235, 100, 249, 90, 10, 156, 2, + 235, 100, 249, 91, 199, 132, 20, 10, 156, 2, 216, 191, 10, 156, 2, 216, + 192, 10, 156, 2, 97, 236, 135, 10, 156, 2, 99, 236, 135, 10, 156, 2, 97, + 202, 185, 239, 74, 10, 156, 2, 99, 202, 182, 239, 74, 10, 156, 2, 235, + 100, 206, 16, 239, 74, 10, 156, 2, 97, 202, 185, 199, 132, 235, 23, 63, + 10, 156, 2, 99, 202, 182, 199, 132, 235, 23, 63, 10, 156, 2, 97, 237, 26, + 250, 194, 10, 156, 2, 97, 211, 87, 250, 194, 10, 156, 2, 37, 250, 181, + 97, 206, 17, 10, 156, 2, 37, 250, 181, 97, 211, 86, 10, 156, 2, 97, 211, + 87, 233, 45, 10, 156, 2, 97, 157, 233, 45, 10, 156, 2, 237, 4, 97, 202, + 184, 10, 156, 2, 237, 4, 99, 202, 181, 10, 156, 2, 237, 4, 235, 13, 10, + 156, 2, 237, 4, 235, 144, 10, 156, 2, 235, 6, 118, 199, 132, 20, 10, 156, + 2, 235, 100, 118, 199, 132, 20, 10, 156, 2, 206, 29, 118, 199, 132, 20, + 10, 156, 2, 207, 71, 118, 199, 132, 20, 10, 156, 2, 237, 30, 118, 199, + 132, 20, 10, 156, 2, 216, 178, 118, 199, 132, 20, 10, 211, 213, 2, 37, + 250, 181, 197, 9, 239, 58, 10, 211, 213, 2, 83, 244, 167, 10, 211, 213, + 2, 239, 146, 244, 167, 10, 211, 213, 2, 239, 146, 201, 176, 10, 211, 213, + 2, 239, 146, 211, 92, 10, 2, 252, 117, 24, 215, 138, 203, 12, 10, 2, 252, + 117, 24, 206, 149, 10, 2, 252, 6, 24, 236, 137, 10, 2, 249, 127, 24, 239, + 75, 203, 12, 10, 2, 249, 113, 24, 252, 33, 10, 2, 249, 113, 24, 216, 222, + 10, 2, 249, 113, 24, 195, 115, 10, 2, 248, 21, 127, 248, 21, 24, 217, + 246, 10, 2, 240, 136, 24, 203, 129, 10, 2, 240, 126, 24, 223, 153, 10, 2, + 239, 107, 24, 226, 121, 10, 2, 239, 107, 24, 118, 118, 66, 10, 2, 239, + 105, 24, 200, 104, 10, 2, 237, 195, 24, 251, 70, 10, 2, 237, 195, 24, + 250, 194, 10, 2, 237, 195, 24, 250, 195, 250, 168, 222, 183, 10, 2, 237, + 195, 24, 239, 94, 10, 2, 237, 195, 24, 237, 187, 10, 2, 237, 195, 24, + 236, 156, 10, 2, 237, 195, 24, 234, 122, 10, 2, 237, 195, 24, 233, 191, + 10, 2, 237, 195, 24, 233, 173, 233, 51, 10, 2, 237, 195, 24, 233, 163, + 10, 2, 237, 195, 24, 142, 10, 2, 237, 195, 24, 232, 70, 10, 2, 237, 195, + 24, 226, 122, 233, 51, 10, 2, 237, 195, 24, 224, 239, 10, 2, 237, 195, + 24, 223, 153, 10, 2, 237, 195, 24, 223, 146, 10, 2, 237, 195, 24, 223, + 147, 98, 224, 239, 10, 2, 237, 195, 24, 223, 49, 10, 2, 237, 195, 24, + 222, 248, 10, 2, 237, 195, 24, 222, 249, 24, 223, 153, 10, 2, 237, 195, + 24, 221, 179, 98, 233, 163, 10, 2, 237, 195, 24, 220, 11, 10, 2, 237, + 195, 24, 219, 150, 10, 2, 237, 195, 24, 219, 77, 10, 2, 237, 195, 24, + 216, 222, 10, 2, 237, 195, 24, 212, 219, 10, 2, 237, 195, 24, 206, 255, + 10, 2, 237, 195, 24, 206, 113, 233, 51, 10, 2, 237, 83, 24, 223, 153, 10, + 2, 237, 83, 24, 213, 162, 10, 2, 236, 157, 196, 222, 10, 2, 236, 138, + 241, 54, 236, 137, 10, 2, 236, 54, 206, 237, 24, 250, 194, 10, 2, 236, + 54, 206, 237, 24, 232, 70, 10, 2, 236, 54, 206, 237, 24, 226, 122, 233, + 51, 10, 2, 236, 54, 206, 237, 24, 172, 10, 2, 236, 54, 206, 237, 24, 222, + 250, 10, 2, 236, 54, 206, 237, 24, 219, 206, 10, 2, 236, 54, 206, 237, + 24, 219, 150, 10, 2, 236, 54, 206, 237, 24, 204, 172, 10, 2, 236, 54, 24, + 204, 172, 10, 2, 234, 121, 24, 249, 112, 10, 2, 234, 121, 24, 239, 107, + 233, 51, 10, 2, 234, 121, 24, 237, 195, 24, 226, 122, 233, 51, 10, 2, + 234, 121, 24, 237, 195, 24, 224, 239, 10, 2, 234, 121, 24, 236, 159, 10, + 2, 234, 121, 24, 234, 122, 10, 2, 234, 121, 24, 234, 83, 98, 239, 151, + 10, 2, 234, 121, 24, 234, 83, 98, 217, 117, 10, 2, 234, 121, 24, 233, 3, + 98, 63, 10, 2, 234, 121, 24, 223, 147, 98, 224, 239, 10, 2, 234, 121, 24, + 222, 248, 10, 2, 234, 121, 24, 222, 249, 24, 223, 153, 10, 2, 234, 121, + 24, 221, 178, 10, 2, 234, 121, 24, 218, 92, 10, 2, 234, 121, 24, 217, + 117, 10, 2, 234, 121, 24, 217, 118, 98, 237, 82, 10, 2, 234, 121, 24, + 217, 118, 98, 233, 191, 10, 2, 234, 121, 24, 206, 215, 10, 2, 234, 121, + 24, 195, 16, 10, 2, 234, 116, 209, 194, 216, 174, 239, 229, 10, 2, 234, + 17, 24, 66, 10, 2, 233, 164, 24, 233, 164, 241, 54, 233, 163, 10, 2, 233, + 74, 24, 226, 122, 233, 51, 10, 2, 233, 65, 98, 233, 164, 24, 203, 129, + 10, 2, 233, 3, 203, 13, 233, 51, 10, 2, 232, 71, 24, 250, 195, 127, 232, + 71, 24, 250, 194, 10, 2, 225, 69, 24, 248, 20, 10, 2, 225, 69, 24, 155, + 10, 2, 225, 69, 24, 118, 118, 66, 10, 2, 225, 69, 24, 200, 21, 10, 2, + 223, 62, 24, 195, 0, 127, 194, 255, 10, 2, 223, 50, 10, 2, 223, 48, 10, + 2, 223, 47, 10, 2, 223, 46, 10, 2, 223, 45, 10, 2, 223, 44, 10, 2, 223, + 43, 10, 2, 223, 42, 127, 223, 42, 233, 51, 10, 2, 223, 41, 10, 2, 223, + 40, 127, 223, 39, 10, 2, 223, 38, 10, 2, 223, 37, 10, 2, 223, 36, 10, 2, + 223, 35, 10, 2, 223, 34, 10, 2, 223, 33, 10, 2, 223, 32, 10, 2, 223, 31, + 10, 2, 223, 30, 10, 2, 223, 29, 10, 2, 223, 28, 10, 2, 223, 27, 10, 2, + 223, 26, 10, 2, 223, 25, 10, 2, 223, 24, 10, 2, 223, 23, 10, 2, 223, 22, + 10, 2, 223, 21, 10, 2, 223, 19, 10, 2, 223, 20, 24, 233, 75, 10, 2, 223, + 20, 24, 226, 121, 10, 2, 223, 20, 24, 213, 163, 98, 221, 187, 10, 2, 223, + 20, 24, 213, 163, 98, 213, 163, 98, 221, 187, 10, 2, 223, 20, 24, 200, + 116, 98, 249, 144, 10, 2, 223, 18, 10, 2, 223, 17, 10, 2, 223, 16, 10, 2, + 223, 15, 10, 2, 223, 14, 10, 2, 223, 13, 10, 2, 223, 12, 10, 2, 223, 11, + 10, 2, 223, 10, 10, 2, 223, 9, 10, 2, 223, 7, 10, 2, 223, 8, 24, 250, + 194, 10, 2, 223, 8, 24, 249, 126, 10, 2, 223, 8, 24, 237, 186, 233, 52, + 233, 51, 10, 2, 223, 8, 24, 223, 177, 10, 2, 223, 8, 24, 172, 10, 2, 223, + 8, 24, 203, 101, 10, 2, 223, 8, 24, 203, 68, 10, 2, 223, 8, 24, 200, 115, + 10, 2, 223, 8, 24, 200, 104, 10, 2, 223, 8, 24, 200, 8, 10, 2, 223, 6, + 10, 2, 223, 4, 10, 2, 223, 5, 24, 237, 198, 10, 2, 223, 5, 24, 234, 122, + 10, 2, 223, 5, 24, 226, 121, 10, 2, 223, 5, 24, 226, 122, 233, 51, 10, 2, + 223, 5, 24, 216, 222, 10, 2, 223, 5, 24, 213, 163, 98, 213, 163, 98, 221, + 187, 10, 2, 223, 5, 24, 206, 240, 98, 224, 100, 10, 2, 223, 5, 24, 200, + 104, 10, 2, 223, 5, 24, 200, 8, 10, 2, 223, 2, 10, 2, 223, 1, 10, 2, 221, + 189, 233, 52, 24, 250, 194, 10, 2, 221, 189, 24, 239, 74, 10, 2, 221, + 189, 24, 232, 227, 10, 2, 221, 189, 24, 213, 162, 10, 2, 221, 189, 24, + 213, 163, 98, 213, 163, 98, 221, 187, 10, 2, 221, 189, 24, 203, 129, 10, + 2, 219, 78, 98, 195, 114, 10, 2, 218, 93, 127, 218, 93, 24, 234, 122, 10, + 2, 218, 93, 127, 218, 93, 24, 225, 24, 10, 2, 216, 180, 24, 239, 107, + 233, 51, 10, 2, 216, 180, 24, 233, 163, 10, 2, 216, 180, 24, 233, 56, 10, + 2, 216, 180, 24, 232, 70, 10, 2, 216, 180, 24, 224, 172, 10, 2, 216, 180, + 24, 223, 45, 10, 2, 216, 180, 24, 220, 11, 10, 2, 216, 180, 24, 213, 163, + 98, 213, 162, 10, 2, 216, 180, 24, 66, 10, 2, 216, 180, 24, 118, 98, 66, + 10, 2, 216, 180, 24, 200, 8, 10, 2, 209, 2, 233, 52, 24, 142, 10, 2, 209, + 2, 24, 236, 229, 10, 2, 209, 2, 24, 207, 0, 250, 168, 222, 183, 10, 2, + 209, 2, 24, 203, 129, 10, 2, 207, 47, 203, 12, 10, 2, 207, 0, 127, 206, + 255, 10, 2, 207, 0, 98, 231, 66, 10, 2, 207, 0, 98, 217, 223, 10, 2, 207, + 0, 98, 208, 204, 10, 2, 206, 150, 98, 237, 195, 24, 216, 222, 10, 2, 206, + 150, 98, 237, 83, 24, 251, 105, 10, 2, 206, 113, 24, 203, 129, 10, 2, + 203, 130, 98, 209, 1, 10, 2, 201, 23, 24, 234, 91, 203, 12, 10, 2, 201, + 23, 24, 115, 239, 74, 10, 2, 200, 20, 226, 15, 10, 2, 200, 20, 24, 200, + 104, 10, 2, 200, 11, 24, 240, 73, 10, 2, 200, 11, 24, 223, 3, 10, 2, 200, + 11, 24, 221, 187, 10, 2, 195, 114, 10, 2, 195, 0, 127, 195, 0, 98, 208, + 204, 10, 2, 194, 254, 24, 115, 239, 75, 203, 12, 14, 7, 255, 160, 14, 7, + 255, 159, 14, 7, 255, 158, 14, 7, 255, 157, 14, 7, 255, 156, 14, 7, 255, + 155, 14, 7, 255, 154, 14, 7, 255, 153, 14, 7, 255, 152, 14, 7, 255, 151, + 14, 7, 255, 150, 14, 7, 255, 149, 14, 7, 255, 148, 14, 7, 255, 146, 14, + 7, 255, 145, 14, 7, 255, 144, 14, 7, 255, 143, 14, 7, 255, 142, 14, 7, + 255, 141, 14, 7, 255, 140, 14, 7, 255, 139, 14, 7, 255, 138, 14, 7, 255, + 137, 14, 7, 255, 136, 14, 7, 255, 135, 14, 7, 255, 134, 14, 7, 255, 133, + 14, 7, 255, 132, 14, 7, 255, 131, 14, 7, 255, 130, 14, 7, 255, 129, 14, + 7, 255, 127, 14, 7, 255, 126, 14, 7, 255, 124, 14, 7, 255, 123, 14, 7, + 255, 122, 14, 7, 255, 121, 14, 7, 255, 120, 14, 7, 255, 119, 14, 7, 255, + 118, 14, 7, 255, 117, 14, 7, 255, 116, 14, 7, 255, 115, 14, 7, 255, 114, + 14, 7, 255, 113, 14, 7, 255, 111, 14, 7, 255, 110, 14, 7, 255, 109, 14, + 7, 255, 107, 14, 7, 255, 106, 14, 7, 255, 105, 14, 7, 255, 104, 14, 7, + 255, 103, 14, 7, 255, 102, 14, 7, 255, 101, 14, 7, 255, 100, 14, 7, 255, + 97, 14, 7, 255, 96, 14, 7, 255, 95, 14, 7, 255, 94, 14, 7, 255, 93, 14, + 7, 255, 92, 14, 7, 255, 91, 14, 7, 255, 90, 14, 7, 255, 89, 14, 7, 255, + 88, 14, 7, 255, 87, 14, 7, 255, 86, 14, 7, 255, 85, 14, 7, 255, 84, 14, + 7, 255, 83, 14, 7, 255, 82, 14, 7, 255, 81, 14, 7, 255, 80, 14, 7, 255, + 79, 14, 7, 255, 78, 14, 7, 255, 74, 14, 7, 255, 73, 14, 7, 255, 72, 14, + 7, 255, 71, 14, 7, 250, 109, 14, 7, 250, 107, 14, 7, 250, 105, 14, 7, + 250, 103, 14, 7, 250, 101, 14, 7, 250, 100, 14, 7, 250, 98, 14, 7, 250, + 96, 14, 7, 250, 94, 14, 7, 250, 92, 14, 7, 247, 202, 14, 7, 247, 201, 14, + 7, 247, 200, 14, 7, 247, 199, 14, 7, 247, 198, 14, 7, 247, 197, 14, 7, + 247, 196, 14, 7, 247, 195, 14, 7, 247, 194, 14, 7, 247, 193, 14, 7, 247, + 192, 14, 7, 247, 191, 14, 7, 247, 190, 14, 7, 247, 189, 14, 7, 247, 188, + 14, 7, 247, 187, 14, 7, 247, 186, 14, 7, 247, 185, 14, 7, 247, 184, 14, + 7, 247, 183, 14, 7, 247, 182, 14, 7, 247, 181, 14, 7, 247, 180, 14, 7, + 247, 179, 14, 7, 247, 178, 14, 7, 247, 177, 14, 7, 247, 176, 14, 7, 247, + 175, 14, 7, 240, 229, 14, 7, 240, 228, 14, 7, 240, 227, 14, 7, 240, 226, + 14, 7, 240, 225, 14, 7, 240, 224, 14, 7, 240, 223, 14, 7, 240, 222, 14, + 7, 240, 221, 14, 7, 240, 220, 14, 7, 240, 219, 14, 7, 240, 218, 14, 7, + 240, 217, 14, 7, 240, 216, 14, 7, 240, 215, 14, 7, 240, 214, 14, 7, 240, + 213, 14, 7, 240, 212, 14, 7, 240, 211, 14, 7, 240, 210, 14, 7, 240, 209, + 14, 7, 240, 208, 14, 7, 240, 207, 14, 7, 240, 206, 14, 7, 240, 205, 14, + 7, 240, 204, 14, 7, 240, 203, 14, 7, 240, 202, 14, 7, 240, 201, 14, 7, + 240, 200, 14, 7, 240, 199, 14, 7, 240, 198, 14, 7, 240, 197, 14, 7, 240, + 196, 14, 7, 240, 195, 14, 7, 240, 194, 14, 7, 240, 193, 14, 7, 240, 192, + 14, 7, 240, 191, 14, 7, 240, 190, 14, 7, 240, 189, 14, 7, 240, 188, 14, + 7, 240, 187, 14, 7, 240, 186, 14, 7, 240, 185, 14, 7, 240, 184, 14, 7, + 240, 183, 14, 7, 240, 182, 14, 7, 240, 181, 14, 7, 240, 180, 14, 7, 240, + 179, 14, 7, 240, 178, 14, 7, 240, 177, 14, 7, 240, 176, 14, 7, 240, 175, + 14, 7, 240, 174, 14, 7, 240, 173, 14, 7, 240, 172, 14, 7, 240, 171, 14, + 7, 240, 170, 14, 7, 240, 169, 14, 7, 240, 168, 14, 7, 240, 167, 14, 7, + 240, 166, 14, 7, 240, 165, 14, 7, 240, 164, 14, 7, 240, 163, 14, 7, 240, + 162, 14, 7, 240, 161, 14, 7, 240, 160, 14, 7, 240, 159, 14, 7, 240, 158, + 14, 7, 240, 157, 14, 7, 240, 156, 14, 7, 240, 155, 14, 7, 240, 154, 14, + 7, 240, 153, 14, 7, 240, 152, 14, 7, 240, 151, 14, 7, 240, 150, 14, 7, + 240, 149, 14, 7, 240, 148, 14, 7, 240, 147, 14, 7, 240, 146, 14, 7, 240, + 145, 14, 7, 240, 144, 14, 7, 240, 143, 14, 7, 240, 142, 14, 7, 240, 141, + 14, 7, 240, 140, 14, 7, 240, 139, 14, 7, 240, 138, 14, 7, 237, 127, 14, + 7, 237, 126, 14, 7, 237, 125, 14, 7, 237, 124, 14, 7, 237, 123, 14, 7, + 237, 122, 14, 7, 237, 121, 14, 7, 237, 120, 14, 7, 237, 119, 14, 7, 237, + 118, 14, 7, 237, 117, 14, 7, 237, 116, 14, 7, 237, 115, 14, 7, 237, 114, + 14, 7, 237, 113, 14, 7, 237, 112, 14, 7, 237, 111, 14, 7, 237, 110, 14, + 7, 237, 109, 14, 7, 237, 108, 14, 7, 237, 107, 14, 7, 237, 106, 14, 7, + 237, 105, 14, 7, 237, 104, 14, 7, 237, 103, 14, 7, 237, 102, 14, 7, 237, + 101, 14, 7, 237, 100, 14, 7, 237, 99, 14, 7, 237, 98, 14, 7, 237, 97, 14, + 7, 237, 96, 14, 7, 237, 95, 14, 7, 237, 94, 14, 7, 237, 93, 14, 7, 237, + 92, 14, 7, 237, 91, 14, 7, 237, 90, 14, 7, 237, 89, 14, 7, 237, 88, 14, + 7, 237, 87, 14, 7, 237, 86, 14, 7, 237, 85, 14, 7, 237, 84, 14, 7, 236, + 47, 14, 7, 236, 46, 14, 7, 236, 45, 14, 7, 236, 44, 14, 7, 236, 43, 14, + 7, 236, 42, 14, 7, 236, 41, 14, 7, 236, 40, 14, 7, 236, 39, 14, 7, 236, + 38, 14, 7, 236, 37, 14, 7, 236, 36, 14, 7, 236, 35, 14, 7, 236, 34, 14, + 7, 236, 33, 14, 7, 236, 32, 14, 7, 236, 31, 14, 7, 236, 30, 14, 7, 236, + 29, 14, 7, 236, 28, 14, 7, 236, 27, 14, 7, 236, 26, 14, 7, 236, 25, 14, + 7, 236, 24, 14, 7, 236, 23, 14, 7, 236, 22, 14, 7, 236, 21, 14, 7, 236, + 20, 14, 7, 236, 19, 14, 7, 236, 18, 14, 7, 236, 17, 14, 7, 236, 16, 14, + 7, 236, 15, 14, 7, 236, 14, 14, 7, 236, 13, 14, 7, 236, 12, 14, 7, 236, + 11, 14, 7, 236, 10, 14, 7, 236, 9, 14, 7, 236, 8, 14, 7, 236, 7, 14, 7, + 236, 6, 14, 7, 236, 5, 14, 7, 236, 4, 14, 7, 236, 3, 14, 7, 236, 2, 14, + 7, 236, 1, 14, 7, 236, 0, 14, 7, 235, 255, 14, 7, 235, 254, 14, 7, 235, + 253, 14, 7, 235, 252, 14, 7, 235, 251, 14, 7, 235, 250, 14, 7, 235, 249, + 14, 7, 235, 248, 14, 7, 235, 247, 14, 7, 235, 246, 14, 7, 235, 245, 14, + 7, 235, 244, 14, 7, 235, 243, 14, 7, 235, 242, 14, 7, 235, 241, 14, 7, + 235, 240, 14, 7, 235, 239, 14, 7, 234, 188, 14, 7, 234, 187, 14, 7, 234, + 186, 14, 7, 234, 185, 14, 7, 234, 184, 14, 7, 234, 183, 14, 7, 234, 182, + 14, 7, 234, 181, 14, 7, 234, 180, 14, 7, 234, 179, 14, 7, 234, 178, 14, + 7, 234, 177, 14, 7, 234, 176, 14, 7, 234, 175, 14, 7, 234, 174, 14, 7, + 234, 173, 14, 7, 234, 172, 14, 7, 234, 171, 14, 7, 234, 170, 14, 7, 234, + 169, 14, 7, 234, 168, 14, 7, 234, 167, 14, 7, 234, 166, 14, 7, 234, 165, + 14, 7, 234, 164, 14, 7, 234, 163, 14, 7, 234, 162, 14, 7, 234, 161, 14, + 7, 234, 160, 14, 7, 234, 159, 14, 7, 234, 158, 14, 7, 234, 157, 14, 7, + 234, 156, 14, 7, 234, 155, 14, 7, 234, 154, 14, 7, 234, 153, 14, 7, 234, + 152, 14, 7, 234, 151, 14, 7, 234, 150, 14, 7, 234, 149, 14, 7, 234, 148, + 14, 7, 234, 147, 14, 7, 234, 146, 14, 7, 234, 145, 14, 7, 234, 144, 14, + 7, 234, 143, 14, 7, 234, 142, 14, 7, 234, 141, 14, 7, 234, 140, 14, 7, + 234, 139, 14, 7, 234, 138, 14, 7, 234, 137, 14, 7, 234, 136, 14, 7, 234, + 135, 14, 7, 234, 134, 14, 7, 234, 133, 14, 7, 234, 132, 14, 7, 234, 131, + 14, 7, 234, 130, 14, 7, 234, 129, 14, 7, 234, 128, 14, 7, 234, 127, 14, + 7, 234, 126, 14, 7, 234, 125, 14, 7, 233, 12, 14, 7, 233, 11, 14, 7, 233, + 10, 14, 7, 233, 9, 14, 7, 233, 8, 14, 7, 233, 7, 14, 7, 233, 6, 14, 7, + 233, 5, 14, 7, 233, 4, 14, 7, 230, 228, 14, 7, 230, 227, 14, 7, 230, 226, + 14, 7, 230, 225, 14, 7, 230, 224, 14, 7, 230, 223, 14, 7, 230, 222, 14, + 7, 230, 221, 14, 7, 230, 220, 14, 7, 230, 219, 14, 7, 230, 218, 14, 7, + 230, 217, 14, 7, 230, 216, 14, 7, 230, 215, 14, 7, 230, 214, 14, 7, 230, + 213, 14, 7, 230, 212, 14, 7, 230, 211, 14, 7, 230, 210, 14, 7, 225, 78, + 14, 7, 225, 77, 14, 7, 225, 76, 14, 7, 225, 75, 14, 7, 225, 74, 14, 7, + 225, 73, 14, 7, 225, 72, 14, 7, 225, 71, 14, 7, 223, 96, 14, 7, 223, 95, + 14, 7, 223, 94, 14, 7, 223, 93, 14, 7, 223, 92, 14, 7, 223, 91, 14, 7, + 223, 90, 14, 7, 223, 89, 14, 7, 223, 88, 14, 7, 223, 87, 14, 7, 221, 133, + 14, 7, 221, 132, 14, 7, 221, 131, 14, 7, 221, 129, 14, 7, 221, 127, 14, + 7, 221, 126, 14, 7, 221, 124, 14, 7, 221, 122, 14, 7, 221, 120, 14, 7, + 221, 118, 14, 7, 221, 116, 14, 7, 221, 114, 14, 7, 221, 112, 14, 7, 221, + 111, 14, 7, 221, 109, 14, 7, 221, 107, 14, 7, 221, 106, 14, 7, 221, 105, + 14, 7, 221, 104, 14, 7, 221, 103, 14, 7, 221, 102, 14, 7, 221, 101, 14, + 7, 221, 100, 14, 7, 221, 99, 14, 7, 221, 97, 14, 7, 221, 95, 14, 7, 221, + 93, 14, 7, 221, 92, 14, 7, 221, 90, 14, 7, 221, 89, 14, 7, 221, 87, 14, + 7, 221, 86, 14, 7, 221, 84, 14, 7, 221, 82, 14, 7, 221, 80, 14, 7, 221, + 78, 14, 7, 221, 76, 14, 7, 221, 75, 14, 7, 221, 73, 14, 7, 221, 71, 14, + 7, 221, 70, 14, 7, 221, 68, 14, 7, 221, 66, 14, 7, 221, 64, 14, 7, 221, + 62, 14, 7, 221, 61, 14, 7, 221, 59, 14, 7, 221, 57, 14, 7, 221, 55, 14, + 7, 221, 54, 14, 7, 221, 52, 14, 7, 221, 50, 14, 7, 221, 49, 14, 7, 221, + 48, 14, 7, 221, 46, 14, 7, 221, 44, 14, 7, 221, 42, 14, 7, 221, 40, 14, + 7, 221, 38, 14, 7, 221, 36, 14, 7, 221, 34, 14, 7, 221, 33, 14, 7, 221, + 31, 14, 7, 221, 29, 14, 7, 221, 27, 14, 7, 221, 25, 14, 7, 218, 49, 14, + 7, 218, 48, 14, 7, 218, 47, 14, 7, 218, 46, 14, 7, 218, 45, 14, 7, 218, + 44, 14, 7, 218, 43, 14, 7, 218, 42, 14, 7, 218, 41, 14, 7, 218, 40, 14, + 7, 218, 39, 14, 7, 218, 38, 14, 7, 218, 37, 14, 7, 218, 36, 14, 7, 218, + 35, 14, 7, 218, 34, 14, 7, 218, 33, 14, 7, 218, 32, 14, 7, 218, 31, 14, + 7, 218, 30, 14, 7, 218, 29, 14, 7, 218, 28, 14, 7, 218, 27, 14, 7, 218, + 26, 14, 7, 218, 25, 14, 7, 218, 24, 14, 7, 218, 23, 14, 7, 218, 22, 14, + 7, 218, 21, 14, 7, 218, 20, 14, 7, 218, 19, 14, 7, 218, 18, 14, 7, 218, + 17, 14, 7, 218, 16, 14, 7, 218, 15, 14, 7, 218, 14, 14, 7, 218, 13, 14, + 7, 218, 12, 14, 7, 218, 11, 14, 7, 218, 10, 14, 7, 218, 9, 14, 7, 218, 8, + 14, 7, 218, 7, 14, 7, 218, 6, 14, 7, 218, 5, 14, 7, 218, 4, 14, 7, 218, + 3, 14, 7, 218, 2, 14, 7, 218, 1, 14, 7, 216, 110, 14, 7, 216, 109, 14, 7, + 216, 108, 14, 7, 216, 107, 14, 7, 216, 106, 14, 7, 216, 105, 14, 7, 216, + 104, 14, 7, 216, 103, 14, 7, 216, 102, 14, 7, 216, 101, 14, 7, 216, 100, + 14, 7, 216, 99, 14, 7, 216, 98, 14, 7, 216, 97, 14, 7, 216, 96, 14, 7, + 216, 95, 14, 7, 216, 94, 14, 7, 216, 93, 14, 7, 216, 92, 14, 7, 216, 91, + 14, 7, 216, 90, 14, 7, 216, 89, 14, 7, 215, 181, 14, 7, 215, 180, 14, 7, + 215, 179, 14, 7, 215, 178, 14, 7, 215, 177, 14, 7, 215, 176, 14, 7, 215, + 175, 14, 7, 215, 174, 14, 7, 215, 173, 14, 7, 215, 172, 14, 7, 215, 171, + 14, 7, 215, 170, 14, 7, 215, 169, 14, 7, 215, 168, 14, 7, 215, 167, 14, + 7, 215, 166, 14, 7, 215, 165, 14, 7, 215, 164, 14, 7, 215, 163, 14, 7, + 215, 162, 14, 7, 215, 161, 14, 7, 215, 160, 14, 7, 215, 159, 14, 7, 215, + 158, 14, 7, 215, 157, 14, 7, 215, 156, 14, 7, 215, 9, 14, 7, 215, 8, 14, + 7, 215, 7, 14, 7, 215, 6, 14, 7, 215, 5, 14, 7, 215, 4, 14, 7, 215, 3, + 14, 7, 215, 2, 14, 7, 215, 1, 14, 7, 215, 0, 14, 7, 214, 255, 14, 7, 214, + 254, 14, 7, 214, 253, 14, 7, 214, 252, 14, 7, 214, 251, 14, 7, 214, 250, + 14, 7, 214, 249, 14, 7, 214, 248, 14, 7, 214, 247, 14, 7, 214, 246, 14, + 7, 214, 245, 14, 7, 214, 244, 14, 7, 214, 243, 14, 7, 214, 242, 14, 7, + 214, 241, 14, 7, 214, 240, 14, 7, 214, 239, 14, 7, 214, 238, 14, 7, 214, + 237, 14, 7, 214, 236, 14, 7, 214, 235, 14, 7, 214, 234, 14, 7, 214, 233, + 14, 7, 214, 232, 14, 7, 214, 231, 14, 7, 214, 230, 14, 7, 214, 229, 14, + 7, 214, 228, 14, 7, 214, 227, 14, 7, 214, 226, 14, 7, 214, 225, 14, 7, + 214, 224, 14, 7, 214, 223, 14, 7, 214, 222, 14, 7, 214, 221, 14, 7, 214, + 220, 14, 7, 214, 219, 14, 7, 214, 218, 14, 7, 214, 217, 14, 7, 214, 216, + 14, 7, 214, 215, 14, 7, 214, 214, 14, 7, 214, 213, 14, 7, 214, 212, 14, + 7, 214, 211, 14, 7, 214, 210, 14, 7, 214, 209, 14, 7, 214, 208, 14, 7, + 214, 207, 14, 7, 214, 206, 14, 7, 214, 205, 14, 7, 214, 204, 14, 7, 214, + 203, 14, 7, 214, 202, 14, 7, 214, 201, 14, 7, 214, 200, 14, 7, 214, 199, + 14, 7, 214, 198, 14, 7, 214, 197, 14, 7, 214, 196, 14, 7, 214, 195, 14, + 7, 214, 194, 14, 7, 214, 193, 14, 7, 214, 192, 14, 7, 214, 191, 14, 7, + 214, 1, 14, 7, 214, 0, 14, 7, 213, 255, 14, 7, 213, 254, 14, 7, 213, 253, + 14, 7, 213, 252, 14, 7, 213, 251, 14, 7, 213, 250, 14, 7, 213, 249, 14, + 7, 213, 248, 14, 7, 213, 247, 14, 7, 213, 246, 14, 7, 213, 245, 14, 7, + 211, 165, 14, 7, 211, 164, 14, 7, 211, 163, 14, 7, 211, 162, 14, 7, 211, + 161, 14, 7, 211, 160, 14, 7, 211, 159, 14, 7, 211, 29, 14, 7, 211, 28, + 14, 7, 211, 27, 14, 7, 211, 26, 14, 7, 211, 25, 14, 7, 211, 24, 14, 7, + 211, 23, 14, 7, 211, 22, 14, 7, 211, 21, 14, 7, 211, 20, 14, 7, 211, 19, + 14, 7, 211, 18, 14, 7, 211, 17, 14, 7, 211, 16, 14, 7, 211, 15, 14, 7, + 211, 14, 14, 7, 211, 13, 14, 7, 211, 12, 14, 7, 211, 11, 14, 7, 211, 10, + 14, 7, 211, 9, 14, 7, 211, 8, 14, 7, 211, 7, 14, 7, 211, 6, 14, 7, 211, + 5, 14, 7, 211, 4, 14, 7, 211, 3, 14, 7, 211, 2, 14, 7, 211, 1, 14, 7, + 211, 0, 14, 7, 210, 255, 14, 7, 210, 254, 14, 7, 210, 253, 14, 7, 210, + 252, 14, 7, 209, 77, 14, 7, 209, 76, 14, 7, 209, 75, 14, 7, 209, 74, 14, + 7, 209, 73, 14, 7, 209, 72, 14, 7, 209, 71, 14, 7, 209, 70, 14, 7, 209, + 69, 14, 7, 209, 68, 14, 7, 209, 67, 14, 7, 209, 66, 14, 7, 209, 65, 14, + 7, 209, 64, 14, 7, 209, 63, 14, 7, 209, 62, 14, 7, 209, 61, 14, 7, 209, + 60, 14, 7, 209, 59, 14, 7, 209, 58, 14, 7, 209, 57, 14, 7, 209, 56, 14, + 7, 209, 55, 14, 7, 209, 54, 14, 7, 209, 53, 14, 7, 209, 52, 14, 7, 209, + 51, 14, 7, 209, 50, 14, 7, 209, 49, 14, 7, 209, 48, 14, 7, 209, 47, 14, + 7, 209, 46, 14, 7, 209, 45, 14, 7, 209, 44, 14, 7, 209, 43, 14, 7, 209, + 42, 14, 7, 209, 41, 14, 7, 209, 40, 14, 7, 209, 39, 14, 7, 209, 38, 14, + 7, 209, 37, 14, 7, 209, 36, 14, 7, 209, 35, 14, 7, 209, 34, 14, 7, 209, + 33, 14, 7, 209, 32, 14, 7, 209, 31, 14, 7, 209, 30, 14, 7, 209, 29, 14, + 7, 209, 28, 14, 7, 209, 27, 14, 7, 209, 26, 14, 7, 209, 25, 14, 7, 209, + 24, 14, 7, 203, 213, 14, 7, 203, 212, 14, 7, 203, 211, 14, 7, 203, 210, + 14, 7, 203, 209, 14, 7, 203, 208, 14, 7, 203, 207, 14, 7, 203, 206, 14, + 7, 203, 205, 14, 7, 203, 204, 14, 7, 203, 203, 14, 7, 203, 202, 14, 7, + 203, 201, 14, 7, 203, 200, 14, 7, 203, 199, 14, 7, 203, 198, 14, 7, 203, + 197, 14, 7, 203, 196, 14, 7, 203, 195, 14, 7, 203, 194, 14, 7, 203, 193, + 14, 7, 203, 192, 14, 7, 203, 191, 14, 7, 203, 190, 14, 7, 203, 189, 14, + 7, 203, 188, 14, 7, 203, 187, 14, 7, 203, 186, 14, 7, 203, 185, 14, 7, + 203, 184, 14, 7, 203, 183, 14, 7, 203, 182, 14, 7, 203, 181, 14, 7, 203, + 180, 14, 7, 203, 179, 14, 7, 203, 178, 14, 7, 203, 177, 14, 7, 203, 176, + 14, 7, 203, 175, 14, 7, 203, 174, 14, 7, 203, 173, 14, 7, 203, 172, 14, + 7, 203, 171, 14, 7, 203, 170, 14, 7, 200, 163, 14, 7, 200, 162, 14, 7, + 200, 161, 14, 7, 200, 160, 14, 7, 200, 159, 14, 7, 200, 158, 14, 7, 200, + 157, 14, 7, 200, 156, 14, 7, 200, 155, 14, 7, 200, 154, 14, 7, 200, 153, + 14, 7, 200, 152, 14, 7, 200, 151, 14, 7, 200, 150, 14, 7, 200, 149, 14, + 7, 200, 148, 14, 7, 200, 147, 14, 7, 200, 146, 14, 7, 200, 145, 14, 7, + 200, 144, 14, 7, 200, 143, 14, 7, 200, 142, 14, 7, 200, 141, 14, 7, 200, + 140, 14, 7, 200, 139, 14, 7, 200, 138, 14, 7, 200, 137, 14, 7, 200, 136, + 14, 7, 200, 135, 14, 7, 200, 134, 14, 7, 200, 133, 14, 7, 200, 132, 14, + 7, 200, 131, 14, 7, 200, 130, 14, 7, 200, 129, 14, 7, 200, 128, 14, 7, + 200, 127, 14, 7, 200, 126, 14, 7, 200, 125, 14, 7, 200, 124, 14, 7, 200, + 123, 14, 7, 200, 122, 14, 7, 200, 121, 14, 7, 200, 120, 14, 7, 200, 119, + 14, 7, 200, 118, 14, 7, 200, 117, 14, 7, 199, 229, 14, 7, 199, 228, 14, + 7, 199, 227, 14, 7, 199, 226, 14, 7, 199, 225, 14, 7, 199, 224, 14, 7, + 199, 223, 14, 7, 199, 222, 14, 7, 199, 221, 14, 7, 199, 220, 14, 7, 199, + 219, 14, 7, 199, 218, 14, 7, 199, 217, 14, 7, 199, 216, 14, 7, 199, 215, + 14, 7, 199, 214, 14, 7, 199, 213, 14, 7, 199, 212, 14, 7, 199, 211, 14, + 7, 199, 210, 14, 7, 199, 209, 14, 7, 199, 208, 14, 7, 199, 207, 14, 7, + 199, 206, 14, 7, 199, 205, 14, 7, 199, 204, 14, 7, 199, 203, 14, 7, 199, + 202, 14, 7, 199, 201, 14, 7, 199, 200, 14, 7, 199, 199, 14, 7, 199, 198, + 14, 7, 199, 197, 14, 7, 199, 196, 14, 7, 199, 195, 14, 7, 199, 194, 14, + 7, 199, 193, 14, 7, 199, 192, 14, 7, 199, 191, 14, 7, 199, 190, 14, 7, + 199, 189, 14, 7, 199, 188, 14, 7, 199, 187, 14, 7, 199, 186, 14, 7, 199, + 185, 14, 7, 199, 184, 14, 7, 199, 183, 14, 7, 199, 182, 14, 7, 199, 181, + 14, 7, 199, 180, 14, 7, 199, 179, 14, 7, 199, 178, 14, 7, 199, 177, 14, + 7, 199, 176, 14, 7, 199, 175, 14, 7, 199, 174, 14, 7, 199, 173, 14, 7, + 199, 172, 14, 7, 199, 171, 14, 7, 199, 170, 14, 7, 199, 169, 14, 7, 199, + 168, 14, 7, 199, 167, 14, 7, 199, 166, 14, 7, 199, 165, 14, 7, 199, 164, + 14, 7, 199, 163, 14, 7, 199, 162, 14, 7, 199, 161, 14, 7, 199, 160, 14, + 7, 199, 159, 14, 7, 199, 158, 14, 7, 199, 157, 14, 7, 199, 156, 14, 7, + 199, 155, 14, 7, 199, 154, 14, 7, 199, 153, 14, 7, 197, 198, 14, 7, 197, + 197, 14, 7, 197, 196, 14, 7, 197, 195, 14, 7, 197, 194, 14, 7, 197, 193, + 14, 7, 197, 192, 14, 7, 197, 191, 14, 7, 197, 190, 14, 7, 197, 189, 14, + 7, 197, 188, 14, 7, 197, 187, 14, 7, 197, 186, 14, 7, 197, 185, 14, 7, + 197, 184, 14, 7, 197, 183, 14, 7, 197, 182, 14, 7, 197, 181, 14, 7, 197, + 180, 14, 7, 197, 179, 14, 7, 197, 178, 14, 7, 197, 177, 14, 7, 197, 176, + 14, 7, 197, 175, 14, 7, 197, 174, 14, 7, 197, 173, 14, 7, 197, 172, 14, + 7, 197, 171, 14, 7, 197, 170, 14, 7, 197, 169, 14, 7, 197, 168, 14, 7, + 197, 167, 14, 7, 196, 220, 14, 7, 196, 219, 14, 7, 196, 218, 14, 7, 196, + 217, 14, 7, 196, 216, 14, 7, 196, 215, 14, 7, 196, 214, 14, 7, 196, 213, + 14, 7, 196, 212, 14, 7, 196, 211, 14, 7, 196, 210, 14, 7, 196, 209, 14, + 7, 196, 146, 14, 7, 196, 145, 14, 7, 196, 144, 14, 7, 196, 143, 14, 7, + 196, 142, 14, 7, 196, 141, 14, 7, 196, 140, 14, 7, 196, 139, 14, 7, 196, + 138, 14, 7, 195, 157, 14, 7, 195, 156, 14, 7, 195, 155, 14, 7, 195, 154, + 14, 7, 195, 153, 14, 7, 195, 152, 14, 7, 195, 151, 14, 7, 195, 150, 14, + 7, 195, 149, 14, 7, 195, 148, 14, 7, 195, 147, 14, 7, 195, 146, 14, 7, + 195, 145, 14, 7, 195, 144, 14, 7, 195, 143, 14, 7, 195, 142, 14, 7, 195, + 141, 14, 7, 195, 140, 14, 7, 195, 139, 14, 7, 195, 138, 14, 7, 195, 137, + 14, 7, 195, 136, 14, 7, 195, 135, 14, 7, 195, 134, 14, 7, 195, 133, 14, + 7, 195, 132, 14, 7, 195, 131, 14, 7, 195, 130, 14, 7, 195, 129, 14, 7, + 195, 128, 14, 7, 195, 127, 14, 7, 195, 126, 14, 7, 195, 125, 14, 7, 195, + 124, 14, 7, 195, 123, 14, 7, 195, 122, 14, 7, 195, 121, 14, 7, 195, 120, + 14, 7, 195, 119, 14, 7, 195, 118, 14, 7, 195, 117, 14, 7, 252, 166, 14, + 7, 252, 165, 14, 7, 252, 164, 14, 7, 252, 163, 14, 7, 252, 162, 14, 7, + 252, 161, 14, 7, 252, 160, 14, 7, 252, 159, 14, 7, 252, 158, 14, 7, 252, + 157, 14, 7, 252, 156, 14, 7, 252, 155, 14, 7, 252, 154, 14, 7, 252, 153, + 14, 7, 252, 152, 14, 7, 252, 151, 14, 7, 252, 150, 14, 7, 252, 149, 14, + 7, 252, 148, 14, 7, 252, 147, 14, 7, 252, 146, 14, 7, 252, 145, 14, 7, + 252, 144, 14, 7, 252, 143, 14, 7, 252, 142, 14, 7, 252, 141, 14, 7, 252, + 140, 14, 7, 252, 139, 14, 7, 252, 138, 14, 7, 252, 137, 14, 7, 252, 136, + 14, 7, 252, 135, 14, 7, 252, 134, 14, 7, 252, 133, 14, 7, 83, 225, 123, + 14, 7, 231, 154, 225, 123, 14, 7, 226, 43, 250, 168, 201, 243, 205, 2, + 14, 7, 226, 43, 250, 168, 248, 84, 205, 2, 14, 7, 226, 43, 250, 168, 201, + 243, 236, 220, 14, 7, 226, 43, 250, 168, 248, 84, 236, 220, 14, 7, 214, + 20, 219, 62, 14, 7, 248, 242, 208, 122, 14, 7, 236, 221, 208, 122, 28, 7, + 255, 160, 28, 7, 255, 159, 28, 7, 255, 158, 28, 7, 255, 157, 28, 7, 255, + 156, 28, 7, 255, 154, 28, 7, 255, 151, 28, 7, 255, 150, 28, 7, 255, 149, + 28, 7, 255, 148, 28, 7, 255, 147, 28, 7, 255, 146, 28, 7, 255, 145, 28, + 7, 255, 144, 28, 7, 255, 143, 28, 7, 255, 141, 28, 7, 255, 140, 28, 7, + 255, 139, 28, 7, 255, 137, 28, 7, 255, 136, 28, 7, 255, 135, 28, 7, 255, + 134, 28, 7, 255, 133, 28, 7, 255, 132, 28, 7, 255, 131, 28, 7, 255, 130, + 28, 7, 255, 129, 28, 7, 255, 128, 28, 7, 255, 127, 28, 7, 255, 126, 28, + 7, 255, 124, 28, 7, 255, 123, 28, 7, 255, 122, 28, 7, 255, 121, 28, 7, + 255, 119, 28, 7, 255, 118, 28, 7, 255, 117, 28, 7, 255, 116, 28, 7, 255, + 115, 28, 7, 255, 114, 28, 7, 255, 113, 28, 7, 255, 112, 28, 7, 255, 111, + 28, 7, 255, 109, 28, 7, 255, 108, 28, 7, 255, 107, 28, 7, 255, 105, 28, + 7, 255, 103, 28, 7, 255, 102, 28, 7, 255, 101, 28, 7, 255, 100, 28, 7, + 255, 99, 28, 7, 255, 98, 28, 7, 255, 97, 28, 7, 255, 96, 28, 7, 255, 95, + 28, 7, 255, 94, 28, 7, 255, 93, 28, 7, 255, 92, 28, 7, 255, 91, 28, 7, + 255, 90, 28, 7, 255, 89, 28, 7, 255, 88, 28, 7, 255, 87, 28, 7, 255, 86, + 28, 7, 255, 85, 28, 7, 255, 84, 28, 7, 255, 83, 28, 7, 255, 82, 28, 7, + 255, 81, 28, 7, 255, 80, 28, 7, 255, 79, 28, 7, 255, 78, 28, 7, 255, 77, + 28, 7, 255, 76, 28, 7, 255, 75, 28, 7, 255, 74, 28, 7, 255, 73, 28, 7, + 255, 72, 28, 7, 255, 71, 28, 7, 255, 70, 28, 7, 255, 69, 28, 7, 255, 68, + 28, 7, 255, 67, 28, 7, 255, 66, 28, 7, 255, 65, 28, 7, 255, 64, 28, 7, + 255, 63, 28, 7, 255, 62, 28, 7, 255, 61, 28, 7, 255, 60, 28, 7, 255, 59, + 28, 7, 255, 58, 28, 7, 255, 57, 28, 7, 255, 56, 28, 7, 255, 55, 28, 7, + 255, 54, 28, 7, 255, 53, 28, 7, 255, 52, 28, 7, 255, 51, 28, 7, 255, 50, + 28, 7, 255, 49, 28, 7, 255, 48, 28, 7, 255, 47, 28, 7, 255, 46, 28, 7, + 255, 45, 28, 7, 255, 44, 28, 7, 255, 43, 28, 7, 255, 42, 28, 7, 255, 41, + 28, 7, 255, 40, 28, 7, 255, 39, 28, 7, 255, 37, 28, 7, 255, 36, 28, 7, + 255, 35, 28, 7, 255, 34, 28, 7, 255, 33, 28, 7, 255, 32, 28, 7, 255, 31, + 28, 7, 255, 30, 28, 7, 255, 29, 28, 7, 255, 28, 28, 7, 255, 27, 28, 7, + 255, 26, 28, 7, 255, 25, 28, 7, 255, 24, 28, 7, 255, 23, 28, 7, 255, 22, + 28, 7, 255, 21, 28, 7, 255, 20, 28, 7, 255, 19, 28, 7, 255, 18, 28, 7, + 255, 17, 28, 7, 255, 16, 28, 7, 255, 15, 28, 7, 255, 14, 28, 7, 255, 13, + 28, 7, 255, 12, 28, 7, 255, 11, 28, 7, 255, 10, 28, 7, 255, 9, 28, 7, + 255, 8, 28, 7, 255, 7, 28, 7, 255, 6, 28, 7, 255, 5, 28, 7, 255, 4, 28, + 7, 255, 2, 28, 7, 255, 1, 28, 7, 255, 0, 28, 7, 254, 255, 28, 7, 254, + 254, 28, 7, 254, 253, 28, 7, 254, 252, 28, 7, 254, 251, 28, 7, 254, 250, + 28, 7, 254, 249, 28, 7, 254, 248, 28, 7, 254, 247, 28, 7, 254, 245, 28, + 7, 254, 244, 28, 7, 254, 243, 28, 7, 254, 242, 28, 7, 254, 241, 28, 7, + 254, 240, 28, 7, 254, 239, 28, 7, 254, 238, 28, 7, 254, 237, 28, 7, 254, + 236, 28, 7, 254, 235, 28, 7, 254, 234, 28, 7, 254, 233, 28, 7, 254, 232, + 28, 7, 254, 231, 28, 7, 254, 230, 28, 7, 254, 229, 28, 7, 254, 228, 28, + 7, 254, 227, 28, 7, 254, 226, 28, 7, 254, 225, 28, 7, 254, 224, 28, 7, + 254, 223, 28, 7, 254, 222, 28, 7, 254, 221, 28, 7, 254, 220, 28, 7, 254, + 219, 28, 7, 254, 218, 28, 7, 254, 217, 28, 7, 254, 216, 28, 7, 254, 215, + 28, 7, 254, 214, 28, 7, 254, 213, 28, 7, 254, 212, 28, 7, 254, 211, 28, + 7, 254, 210, 28, 7, 254, 209, 28, 7, 254, 208, 28, 7, 254, 207, 28, 7, + 254, 206, 28, 7, 254, 205, 28, 7, 254, 204, 28, 7, 254, 203, 28, 7, 254, + 202, 28, 7, 254, 201, 28, 7, 254, 200, 28, 7, 254, 199, 28, 7, 254, 198, + 28, 7, 254, 197, 28, 7, 254, 196, 28, 7, 254, 195, 28, 7, 254, 194, 28, + 7, 254, 193, 28, 7, 254, 192, 28, 7, 254, 191, 28, 7, 254, 190, 28, 7, + 254, 189, 28, 7, 254, 188, 28, 7, 254, 187, 28, 7, 254, 186, 28, 7, 254, + 185, 28, 7, 254, 184, 28, 7, 254, 183, 28, 7, 254, 182, 28, 7, 254, 181, + 28, 7, 254, 180, 28, 7, 254, 179, 28, 7, 254, 178, 28, 7, 254, 177, 28, + 7, 254, 175, 28, 7, 254, 174, 28, 7, 254, 173, 28, 7, 254, 172, 28, 7, + 254, 171, 28, 7, 254, 170, 28, 7, 254, 169, 28, 7, 254, 168, 28, 7, 254, + 167, 28, 7, 254, 166, 28, 7, 254, 165, 28, 7, 254, 164, 28, 7, 254, 163, + 28, 7, 254, 162, 28, 7, 254, 161, 28, 7, 254, 160, 28, 7, 254, 159, 28, + 7, 254, 158, 28, 7, 254, 157, 28, 7, 254, 156, 28, 7, 254, 155, 28, 7, + 254, 154, 28, 7, 254, 153, 28, 7, 254, 152, 28, 7, 254, 151, 28, 7, 254, + 150, 28, 7, 254, 149, 28, 7, 254, 148, 28, 7, 254, 147, 28, 7, 254, 146, + 28, 7, 254, 145, 28, 7, 254, 144, 28, 7, 254, 143, 28, 7, 254, 142, 28, + 7, 254, 141, 28, 7, 254, 140, 28, 7, 254, 139, 28, 7, 254, 138, 28, 7, + 254, 137, 28, 7, 254, 136, 28, 7, 254, 135, 28, 7, 254, 134, 28, 7, 254, + 133, 28, 7, 254, 132, 28, 7, 254, 131, 28, 7, 254, 130, 28, 7, 254, 129, + 28, 7, 254, 128, 28, 7, 254, 127, 28, 7, 254, 126, 28, 7, 254, 125, 28, + 7, 254, 124, 28, 7, 254, 123, 28, 7, 254, 122, 28, 7, 254, 121, 28, 7, + 254, 120, 28, 7, 254, 119, 28, 7, 254, 118, 28, 7, 254, 117, 28, 7, 254, + 116, 28, 7, 254, 115, 28, 7, 254, 114, 28, 7, 254, 113, 28, 7, 254, 112, + 28, 7, 254, 111, 28, 7, 254, 110, 28, 7, 254, 109, 28, 7, 254, 108, 28, + 7, 254, 107, 28, 7, 254, 106, 28, 7, 254, 105, 28, 7, 254, 104, 28, 7, + 254, 103, 28, 7, 254, 102, 28, 7, 254, 101, 28, 7, 254, 100, 28, 7, 254, + 99, 28, 7, 254, 98, 28, 7, 254, 97, 28, 7, 254, 96, 28, 7, 254, 95, 28, + 7, 254, 94, 28, 7, 254, 93, 28, 7, 254, 92, 28, 7, 254, 91, 28, 7, 254, + 90, 28, 7, 254, 89, 28, 7, 254, 88, 28, 7, 254, 87, 28, 7, 254, 86, 28, + 7, 254, 85, 28, 7, 254, 84, 28, 7, 254, 83, 28, 7, 254, 82, 28, 7, 254, + 81, 28, 7, 254, 80, 28, 7, 254, 79, 28, 7, 254, 78, 28, 7, 254, 77, 28, + 7, 254, 76, 28, 7, 254, 75, 28, 7, 254, 74, 28, 7, 254, 73, 28, 7, 254, + 72, 28, 7, 254, 71, 28, 7, 254, 70, 28, 7, 254, 69, 28, 7, 254, 68, 28, + 7, 254, 67, 28, 7, 254, 66, 28, 7, 254, 65, 28, 7, 254, 63, 28, 7, 254, + 62, 28, 7, 254, 61, 28, 7, 254, 60, 28, 7, 254, 59, 28, 7, 254, 58, 28, + 7, 254, 57, 28, 7, 254, 56, 28, 7, 254, 55, 28, 7, 254, 54, 28, 7, 254, + 53, 28, 7, 254, 50, 28, 7, 254, 49, 28, 7, 254, 48, 28, 7, 254, 47, 28, + 7, 254, 43, 28, 7, 254, 42, 28, 7, 254, 41, 28, 7, 254, 40, 28, 7, 254, + 39, 28, 7, 254, 38, 28, 7, 254, 37, 28, 7, 254, 36, 28, 7, 254, 35, 28, + 7, 254, 34, 28, 7, 254, 33, 28, 7, 254, 32, 28, 7, 254, 31, 28, 7, 254, + 30, 28, 7, 254, 29, 28, 7, 254, 28, 28, 7, 254, 27, 28, 7, 254, 26, 28, + 7, 254, 25, 28, 7, 254, 23, 28, 7, 254, 22, 28, 7, 254, 21, 28, 7, 254, + 20, 28, 7, 254, 19, 28, 7, 254, 18, 28, 7, 254, 17, 28, 7, 254, 16, 28, + 7, 254, 15, 28, 7, 254, 14, 28, 7, 254, 13, 28, 7, 254, 12, 28, 7, 254, + 11, 28, 7, 254, 10, 28, 7, 254, 9, 28, 7, 254, 8, 28, 7, 254, 7, 28, 7, + 254, 6, 28, 7, 254, 5, 28, 7, 254, 4, 28, 7, 254, 3, 28, 7, 254, 2, 28, + 7, 254, 1, 28, 7, 254, 0, 28, 7, 253, 255, 28, 7, 253, 254, 28, 7, 253, + 253, 28, 7, 253, 252, 28, 7, 253, 251, 28, 7, 253, 250, 28, 7, 253, 249, + 28, 7, 253, 248, 28, 7, 253, 247, 28, 7, 253, 246, 28, 7, 253, 245, 28, + 7, 253, 244, 28, 7, 253, 243, 28, 7, 253, 242, 28, 7, 253, 241, 28, 7, + 253, 240, 28, 7, 253, 239, 28, 7, 253, 238, 28, 7, 253, 237, 28, 7, 253, + 236, 28, 7, 253, 235, 28, 7, 253, 234, 28, 7, 253, 233, 28, 7, 253, 232, + 28, 7, 253, 231, 28, 7, 253, 230, 28, 7, 253, 229, 28, 7, 253, 228, 28, + 7, 253, 227, 28, 7, 253, 226, 28, 7, 253, 225, 28, 7, 253, 224, 28, 7, + 253, 223, 28, 7, 253, 222, 28, 7, 253, 221, 28, 7, 253, 220, 28, 7, 253, + 219, 28, 7, 253, 218, 210, 251, 214, 72, 210, 72, 28, 7, 253, 217, 28, 7, + 253, 216, 28, 7, 253, 215, 28, 7, 253, 214, 28, 7, 253, 213, 28, 7, 253, + 212, 28, 7, 253, 211, 28, 7, 253, 210, 28, 7, 253, 209, 28, 7, 253, 208, + 28, 7, 253, 207, 28, 7, 253, 206, 171, 28, 7, 253, 205, 28, 7, 253, 204, + 28, 7, 253, 203, 28, 7, 253, 202, 28, 7, 253, 201, 28, 7, 253, 200, 28, + 7, 253, 199, 28, 7, 253, 197, 28, 7, 253, 195, 28, 7, 253, 193, 28, 7, + 253, 191, 28, 7, 253, 189, 28, 7, 253, 187, 28, 7, 253, 185, 28, 7, 253, + 183, 28, 7, 253, 181, 28, 7, 253, 179, 248, 242, 221, 247, 78, 28, 7, + 253, 177, 236, 221, 221, 247, 78, 28, 7, 253, 176, 28, 7, 253, 174, 28, + 7, 253, 172, 28, 7, 253, 170, 28, 7, 253, 168, 28, 7, 253, 166, 28, 7, + 253, 164, 28, 7, 253, 162, 28, 7, 253, 160, 28, 7, 253, 159, 28, 7, 253, + 158, 28, 7, 253, 157, 28, 7, 253, 156, 28, 7, 253, 155, 28, 7, 253, 154, + 28, 7, 253, 153, 28, 7, 253, 152, 28, 7, 253, 151, 28, 7, 253, 150, 28, + 7, 253, 149, 28, 7, 253, 148, 28, 7, 253, 147, 28, 7, 253, 146, 28, 7, + 253, 145, 28, 7, 253, 144, 28, 7, 253, 143, 28, 7, 253, 142, 28, 7, 253, + 141, 28, 7, 253, 140, 28, 7, 253, 139, 28, 7, 253, 138, 28, 7, 253, 137, + 28, 7, 253, 136, 28, 7, 253, 135, 28, 7, 253, 134, 28, 7, 253, 133, 28, + 7, 253, 132, 28, 7, 253, 131, 28, 7, 253, 130, 28, 7, 253, 129, 28, 7, + 253, 128, 28, 7, 253, 127, 28, 7, 253, 126, 28, 7, 253, 125, 28, 7, 253, + 124, 28, 7, 253, 123, 28, 7, 253, 122, 28, 7, 253, 121, 28, 7, 253, 120, + 28, 7, 253, 119, 28, 7, 253, 118, 28, 7, 253, 117, 28, 7, 253, 116, 28, + 7, 253, 115, 28, 7, 253, 114, 28, 7, 253, 113, 28, 7, 253, 112, 28, 7, + 253, 111, 28, 7, 253, 110, 28, 7, 253, 109, 28, 7, 253, 108, 28, 7, 253, + 107, 28, 7, 253, 106, 28, 7, 253, 105, 28, 7, 253, 104, 28, 7, 253, 103, + 28, 7, 253, 102, 28, 7, 253, 101, 28, 7, 253, 100, 28, 7, 253, 99, 28, 7, + 253, 98, 28, 7, 253, 97, 28, 7, 253, 96, 28, 7, 253, 95, 28, 7, 253, 94, + 28, 7, 253, 93, 28, 7, 253, 92, 28, 7, 253, 91, 28, 7, 253, 90, 28, 7, + 253, 89, 28, 7, 253, 88, 28, 7, 253, 87, 28, 7, 253, 86, 28, 7, 253, 85, + 28, 7, 253, 84, 28, 7, 253, 83, 28, 7, 253, 82, 28, 7, 253, 81, 28, 7, + 253, 80, 28, 7, 253, 79, 28, 7, 253, 78, 28, 7, 253, 77, 28, 7, 253, 76, + 28, 7, 253, 75, 28, 7, 253, 74, 28, 7, 253, 73, 28, 7, 253, 72, 28, 7, + 253, 71, 28, 7, 253, 70, 28, 7, 253, 69, 28, 7, 253, 68, 28, 7, 253, 67, + 28, 7, 253, 66, 28, 7, 253, 65, 28, 7, 253, 64, 28, 7, 253, 63, 28, 7, + 253, 62, 28, 7, 253, 61, 28, 7, 253, 60, 28, 7, 253, 59, 28, 7, 253, 58, + 28, 7, 253, 57, 28, 7, 253, 56, 28, 7, 253, 55, 28, 7, 253, 54, 28, 7, + 253, 53, 28, 7, 253, 52, 28, 7, 253, 51, 28, 7, 253, 50, 25, 1, 212, 251, + 217, 3, 219, 119, 25, 1, 212, 251, 234, 55, 235, 42, 25, 1, 212, 251, + 212, 93, 219, 120, 212, 166, 25, 1, 212, 251, 212, 93, 219, 120, 212, + 167, 25, 1, 212, 251, 217, 244, 219, 119, 25, 1, 212, 251, 206, 146, 25, + 1, 212, 251, 202, 56, 219, 119, 25, 1, 212, 251, 215, 54, 219, 119, 25, + 1, 212, 251, 206, 210, 213, 243, 216, 147, 25, 1, 212, 251, 212, 93, 213, + 243, 216, 148, 212, 166, 25, 1, 212, 251, 212, 93, 213, 243, 216, 148, + 212, 167, 25, 1, 212, 251, 220, 98, 25, 1, 212, 251, 201, 41, 220, 99, + 25, 1, 212, 251, 217, 64, 25, 1, 212, 251, 220, 95, 25, 1, 212, 251, 220, + 48, 25, 1, 212, 251, 218, 77, 25, 1, 212, 251, 207, 73, 25, 1, 212, 251, + 215, 194, 25, 1, 212, 251, 224, 164, 25, 1, 212, 251, 216, 114, 25, 1, + 212, 251, 204, 74, 25, 1, 212, 251, 217, 2, 25, 1, 212, 251, 222, 229, + 25, 1, 212, 251, 222, 136, 223, 144, 25, 1, 212, 251, 215, 204, 219, 127, + 25, 1, 212, 251, 220, 102, 25, 1, 212, 251, 213, 124, 25, 1, 212, 251, + 233, 210, 25, 1, 212, 251, 213, 194, 25, 1, 212, 251, 218, 215, 217, 37, + 25, 1, 212, 251, 215, 35, 219, 130, 25, 1, 212, 251, 118, 195, 187, 217, + 237, 25, 1, 212, 251, 233, 211, 25, 1, 212, 251, 215, 204, 215, 205, 25, + 1, 212, 251, 206, 32, 25, 1, 212, 251, 219, 112, 25, 1, 212, 251, 219, + 133, 25, 1, 212, 251, 218, 190, 25, 1, 212, 251, 225, 33, 25, 1, 212, + 251, 213, 243, 222, 184, 25, 1, 212, 251, 217, 159, 222, 184, 25, 1, 212, + 251, 213, 17, 25, 1, 212, 251, 220, 96, 25, 1, 212, 251, 216, 188, 25, 1, + 212, 251, 211, 205, 25, 1, 212, 251, 201, 33, 25, 1, 212, 251, 221, 186, + 25, 1, 212, 251, 205, 172, 25, 1, 212, 251, 202, 242, 25, 1, 212, 251, + 220, 93, 25, 1, 212, 251, 224, 171, 25, 1, 212, 251, 217, 155, 25, 1, + 212, 251, 223, 158, 25, 1, 212, 251, 218, 191, 25, 1, 212, 251, 206, 142, + 25, 1, 212, 251, 221, 240, 25, 1, 212, 251, 235, 113, 25, 1, 212, 251, + 209, 209, 25, 1, 212, 251, 223, 211, 25, 1, 212, 251, 205, 168, 25, 1, + 212, 251, 220, 43, 212, 209, 25, 1, 212, 251, 206, 203, 25, 1, 212, 251, + 215, 203, 25, 1, 212, 251, 206, 184, 215, 215, 195, 195, 25, 1, 212, 251, + 215, 76, 218, 211, 25, 1, 212, 251, 213, 238, 25, 1, 212, 251, 216, 116, + 25, 1, 212, 251, 200, 44, 25, 1, 212, 251, 217, 40, 25, 1, 212, 251, 220, + 92, 25, 1, 212, 251, 216, 159, 25, 1, 212, 251, 219, 235, 25, 1, 212, + 251, 215, 91, 25, 1, 212, 251, 202, 246, 25, 1, 212, 251, 205, 165, 25, + 1, 212, 251, 213, 239, 25, 1, 212, 251, 215, 219, 25, 1, 212, 251, 220, + 100, 25, 1, 212, 251, 215, 88, 25, 1, 212, 251, 224, 251, 25, 1, 212, + 251, 215, 222, 25, 1, 212, 251, 199, 113, 25, 1, 212, 251, 221, 190, 25, + 1, 212, 251, 217, 100, 25, 1, 212, 251, 217, 211, 25, 1, 212, 251, 219, + 234, 25, 1, 212, 250, 215, 217, 25, 1, 212, 250, 201, 41, 220, 97, 25, 1, + 212, 250, 206, 94, 25, 1, 212, 250, 207, 77, 201, 40, 25, 1, 212, 250, + 221, 242, 215, 200, 25, 1, 212, 250, 219, 241, 220, 101, 25, 1, 212, 250, + 224, 84, 25, 1, 212, 250, 196, 32, 25, 1, 212, 250, 219, 236, 25, 1, 212, + 250, 225, 19, 25, 1, 212, 250, 213, 74, 25, 1, 212, 250, 196, 115, 222, + 184, 25, 1, 212, 250, 222, 249, 215, 215, 215, 102, 25, 1, 212, 250, 215, + 197, 206, 229, 25, 1, 212, 250, 217, 126, 216, 162, 25, 1, 212, 250, 233, + 208, 25, 1, 212, 250, 212, 156, 25, 1, 212, 250, 201, 41, 215, 213, 25, + 1, 212, 250, 206, 234, 216, 157, 25, 1, 212, 250, 206, 230, 25, 1, 212, + 250, 219, 120, 202, 245, 25, 1, 212, 250, 219, 223, 219, 237, 25, 1, 212, + 250, 215, 89, 215, 200, 25, 1, 212, 250, 224, 160, 25, 1, 212, 250, 233, + 209, 25, 1, 212, 250, 224, 156, 25, 1, 212, 250, 223, 76, 25, 1, 212, + 250, 213, 127, 25, 1, 212, 250, 199, 42, 25, 1, 212, 250, 217, 4, 218, + 75, 25, 1, 212, 250, 217, 39, 219, 219, 25, 1, 212, 250, 196, 241, 25, 1, + 212, 250, 208, 247, 25, 1, 212, 250, 203, 158, 25, 1, 212, 250, 219, 132, + 25, 1, 212, 250, 217, 23, 25, 1, 212, 250, 217, 24, 222, 226, 25, 1, 212, + 250, 219, 122, 25, 1, 212, 250, 204, 127, 25, 1, 212, 250, 219, 227, 25, + 1, 212, 250, 218, 195, 25, 1, 212, 250, 215, 106, 25, 1, 212, 250, 211, + 209, 25, 1, 212, 250, 219, 131, 217, 41, 25, 1, 212, 250, 235, 157, 25, + 1, 212, 250, 219, 214, 25, 1, 212, 250, 235, 181, 25, 1, 212, 250, 224, + 168, 25, 1, 212, 250, 220, 127, 216, 151, 25, 1, 212, 250, 220, 127, 216, + 127, 25, 1, 212, 250, 222, 135, 25, 1, 212, 250, 217, 47, 25, 1, 212, + 250, 215, 224, 25, 1, 212, 250, 166, 25, 1, 212, 250, 224, 67, 25, 1, + 212, 250, 216, 248, 25, 1, 193, 217, 3, 220, 99, 25, 1, 193, 215, 53, 25, + 1, 193, 195, 195, 25, 1, 193, 197, 143, 25, 1, 193, 217, 40, 25, 1, 193, + 217, 147, 25, 1, 193, 217, 10, 25, 1, 193, 233, 218, 25, 1, 193, 219, + 231, 25, 1, 193, 234, 62, 25, 1, 193, 215, 78, 219, 3, 219, 134, 25, 1, + 193, 215, 191, 219, 222, 25, 1, 193, 219, 228, 25, 1, 193, 212, 162, 25, + 1, 193, 217, 132, 25, 1, 193, 219, 239, 247, 169, 25, 1, 193, 224, 158, + 25, 1, 193, 233, 219, 25, 1, 193, 224, 165, 25, 1, 193, 195, 218, 218, + 108, 25, 1, 193, 215, 47, 25, 1, 193, 219, 216, 25, 1, 193, 215, 223, 25, + 1, 193, 219, 222, 25, 1, 193, 196, 33, 25, 1, 193, 223, 219, 25, 1, 193, + 225, 54, 25, 1, 193, 207, 72, 25, 1, 193, 217, 141, 25, 1, 193, 203, 156, + 25, 1, 193, 216, 131, 25, 1, 193, 202, 56, 195, 199, 25, 1, 193, 204, + 159, 25, 1, 193, 217, 30, 215, 102, 25, 1, 193, 199, 41, 25, 1, 193, 217, + 214, 25, 1, 193, 220, 127, 224, 167, 25, 1, 193, 215, 205, 25, 1, 193, + 217, 25, 25, 1, 193, 222, 230, 25, 1, 193, 219, 224, 25, 1, 193, 219, + 111, 25, 1, 193, 215, 199, 25, 1, 193, 202, 241, 25, 1, 193, 217, 27, 25, + 1, 193, 234, 220, 25, 1, 193, 217, 146, 25, 1, 193, 215, 225, 25, 1, 193, + 215, 221, 25, 1, 193, 247, 252, 25, 1, 193, 199, 43, 25, 1, 193, 219, + 229, 25, 1, 193, 209, 140, 25, 1, 193, 216, 161, 25, 1, 193, 222, 248, + 25, 1, 193, 202, 53, 25, 1, 193, 215, 207, 216, 248, 25, 1, 193, 216, + 153, 25, 1, 193, 224, 171, 25, 1, 193, 217, 32, 25, 1, 193, 220, 92, 25, + 1, 193, 219, 217, 25, 1, 193, 221, 190, 25, 1, 193, 223, 144, 25, 1, 193, + 216, 159, 25, 1, 193, 216, 248, 25, 1, 193, 196, 231, 25, 1, 193, 217, + 28, 25, 1, 193, 215, 210, 25, 1, 193, 215, 201, 25, 1, 193, 223, 160, + 216, 116, 25, 1, 193, 215, 208, 25, 1, 193, 217, 154, 25, 1, 193, 220, + 127, 215, 213, 25, 1, 193, 196, 129, 25, 1, 193, 217, 153, 25, 1, 193, + 206, 145, 25, 1, 193, 207, 75, 25, 1, 193, 219, 225, 25, 1, 193, 220, 99, + 25, 1, 193, 219, 235, 25, 1, 193, 224, 159, 25, 1, 193, 219, 226, 25, 1, + 193, 224, 163, 25, 1, 193, 219, 239, 212, 214, 25, 1, 193, 195, 178, 25, + 1, 193, 216, 149, 25, 1, 193, 219, 58, 25, 1, 193, 218, 138, 25, 1, 193, + 206, 206, 25, 1, 193, 224, 182, 222, 208, 25, 1, 193, 224, 182, 235, 194, + 25, 1, 193, 217, 62, 25, 1, 193, 217, 211, 25, 1, 193, 222, 56, 25, 1, + 193, 212, 175, 25, 1, 193, 213, 64, 25, 1, 193, 203, 1, 25, 1, 148, 219, + 215, 25, 1, 148, 197, 141, 25, 1, 148, 216, 147, 25, 1, 148, 219, 119, + 25, 1, 148, 216, 145, 25, 1, 148, 222, 101, 25, 1, 148, 216, 150, 25, 1, + 148, 215, 220, 25, 1, 148, 217, 46, 25, 1, 148, 215, 102, 25, 1, 148, + 196, 242, 25, 1, 148, 217, 0, 25, 1, 148, 206, 253, 25, 1, 148, 217, 11, + 25, 1, 148, 224, 166, 25, 1, 148, 202, 243, 25, 1, 148, 206, 232, 25, 1, + 148, 216, 158, 25, 1, 148, 204, 127, 25, 1, 148, 224, 171, 25, 1, 148, + 196, 117, 25, 1, 148, 223, 161, 25, 1, 148, 208, 207, 25, 1, 148, 219, + 124, 25, 1, 148, 217, 145, 25, 1, 148, 220, 64, 25, 1, 148, 219, 130, 25, + 1, 148, 207, 74, 25, 1, 148, 196, 59, 25, 1, 148, 216, 152, 25, 1, 148, + 224, 162, 219, 218, 25, 1, 148, 217, 7, 25, 1, 148, 201, 40, 25, 1, 148, + 233, 228, 25, 1, 148, 216, 253, 25, 1, 148, 235, 158, 25, 1, 148, 217, + 149, 25, 1, 148, 219, 103, 25, 1, 148, 222, 129, 25, 1, 148, 217, 131, + 25, 1, 148, 218, 210, 25, 1, 148, 219, 107, 25, 1, 148, 211, 189, 25, 1, + 148, 219, 105, 25, 1, 148, 219, 121, 25, 1, 148, 221, 173, 25, 1, 148, + 215, 212, 25, 1, 148, 219, 238, 25, 1, 148, 223, 133, 25, 1, 148, 215, + 91, 25, 1, 148, 202, 246, 25, 1, 148, 205, 165, 25, 1, 148, 195, 178, 25, + 1, 148, 224, 163, 25, 1, 148, 210, 227, 25, 1, 148, 203, 47, 25, 1, 148, + 217, 8, 25, 1, 148, 219, 126, 25, 1, 148, 215, 211, 25, 1, 148, 224, 161, + 25, 1, 148, 212, 168, 25, 1, 148, 213, 10, 25, 1, 148, 215, 64, 25, 1, + 148, 222, 135, 25, 1, 148, 217, 47, 25, 1, 148, 219, 123, 25, 1, 148, + 217, 20, 25, 1, 148, 195, 192, 25, 1, 148, 213, 162, 25, 1, 148, 195, + 191, 25, 1, 148, 217, 154, 25, 1, 148, 215, 200, 25, 1, 148, 204, 161, + 25, 1, 148, 223, 165, 25, 1, 148, 217, 36, 25, 1, 148, 217, 5, 25, 1, + 148, 201, 15, 25, 1, 148, 219, 134, 25, 1, 148, 223, 155, 25, 1, 148, + 215, 209, 25, 1, 148, 202, 244, 25, 1, 148, 220, 94, 25, 1, 148, 217, 45, + 25, 1, 148, 222, 128, 25, 1, 148, 217, 26, 25, 1, 148, 215, 214, 25, 1, + 148, 216, 131, 25, 1, 148, 233, 212, 25, 1, 148, 223, 186, 25, 1, 148, + 210, 127, 214, 132, 25, 1, 148, 203, 145, 25, 1, 148, 201, 239, 25, 1, + 148, 215, 88, 25, 1, 148, 210, 9, 25, 1, 148, 222, 186, 25, 1, 148, 219, + 186, 25, 1, 148, 221, 135, 25, 1, 148, 204, 74, 25, 1, 148, 218, 144, 25, + 1, 148, 206, 218, 25, 1, 148, 206, 228, 25, 1, 148, 223, 105, 25, 1, 148, + 215, 185, 25, 1, 148, 206, 151, 25, 1, 148, 215, 202, 25, 1, 148, 213, + 78, 25, 1, 148, 216, 222, 25, 1, 148, 206, 183, 25, 1, 148, 211, 204, 25, + 1, 148, 218, 75, 25, 1, 148, 221, 220, 25, 1, 148, 210, 127, 218, 133, + 25, 1, 148, 202, 122, 25, 1, 148, 215, 188, 25, 1, 148, 219, 239, 178, + 25, 1, 148, 208, 205, 25, 1, 148, 235, 237, 25, 1, 104, 217, 153, 25, 1, + 104, 201, 245, 25, 1, 104, 219, 228, 25, 1, 104, 222, 230, 25, 1, 104, + 198, 235, 25, 1, 104, 221, 226, 25, 1, 104, 213, 242, 25, 1, 104, 205, + 176, 25, 1, 104, 210, 201, 25, 1, 104, 215, 216, 25, 1, 104, 217, 124, + 25, 1, 104, 211, 222, 25, 1, 104, 203, 117, 25, 1, 104, 217, 13, 25, 1, + 104, 223, 215, 25, 1, 104, 196, 234, 25, 1, 104, 208, 129, 25, 1, 104, + 217, 37, 25, 1, 104, 213, 239, 25, 1, 104, 201, 247, 25, 1, 104, 223, + 159, 25, 1, 104, 221, 241, 25, 1, 104, 215, 219, 25, 1, 104, 216, 245, + 25, 1, 104, 220, 100, 25, 1, 104, 217, 6, 25, 1, 104, 216, 244, 25, 1, + 104, 215, 218, 25, 1, 104, 210, 6, 25, 1, 104, 216, 149, 25, 1, 104, 213, + 76, 25, 1, 104, 209, 13, 25, 1, 104, 217, 21, 25, 1, 104, 219, 113, 25, + 1, 104, 233, 206, 25, 1, 104, 217, 9, 25, 1, 104, 216, 160, 25, 1, 104, + 220, 42, 25, 1, 104, 221, 222, 25, 1, 104, 217, 42, 25, 1, 104, 217, 137, + 25, 1, 104, 203, 144, 215, 200, 25, 1, 104, 207, 76, 25, 1, 104, 211, + 215, 25, 1, 104, 217, 157, 205, 184, 25, 1, 104, 217, 29, 215, 102, 25, + 1, 104, 196, 20, 25, 1, 104, 233, 207, 25, 1, 104, 201, 34, 25, 1, 104, + 196, 36, 25, 1, 104, 212, 116, 25, 1, 104, 201, 21, 25, 1, 104, 224, 169, + 25, 1, 104, 204, 160, 25, 1, 104, 202, 245, 25, 1, 104, 199, 44, 25, 1, + 104, 197, 84, 25, 1, 104, 223, 79, 25, 1, 104, 211, 226, 25, 1, 104, 203, + 157, 25, 1, 104, 233, 227, 25, 1, 104, 217, 52, 25, 1, 104, 206, 231, 25, + 1, 104, 219, 108, 25, 1, 104, 219, 232, 25, 1, 104, 215, 51, 25, 1, 104, + 216, 112, 25, 1, 104, 234, 58, 25, 1, 104, 201, 22, 25, 1, 104, 223, 169, + 25, 1, 104, 196, 93, 25, 1, 104, 215, 89, 244, 219, 25, 1, 104, 196, 9, + 25, 1, 104, 219, 125, 25, 1, 104, 217, 142, 25, 1, 104, 212, 210, 25, 1, + 104, 195, 198, 25, 1, 104, 222, 130, 25, 1, 104, 234, 220, 25, 1, 104, + 234, 57, 25, 1, 104, 216, 255, 25, 1, 104, 224, 171, 25, 1, 104, 220, + 103, 25, 1, 104, 217, 12, 25, 1, 104, 233, 213, 25, 1, 104, 235, 238, 25, + 1, 104, 215, 189, 25, 1, 104, 213, 11, 25, 1, 104, 196, 34, 25, 1, 104, + 217, 38, 25, 1, 104, 215, 89, 248, 202, 25, 1, 104, 215, 31, 25, 1, 104, + 212, 88, 25, 1, 104, 219, 58, 25, 1, 104, 234, 218, 25, 1, 104, 217, 237, + 25, 1, 104, 218, 138, 25, 1, 104, 233, 212, 25, 1, 104, 234, 223, 68, 25, + 1, 104, 218, 76, 25, 1, 104, 211, 221, 25, 1, 104, 217, 1, 25, 1, 104, + 223, 144, 25, 1, 104, 212, 207, 25, 1, 104, 215, 203, 25, 1, 104, 196, + 35, 25, 1, 104, 217, 22, 25, 1, 104, 213, 243, 213, 50, 25, 1, 104, 234, + 223, 247, 151, 25, 1, 104, 235, 43, 25, 1, 104, 216, 154, 25, 1, 104, 63, + 25, 1, 104, 201, 239, 25, 1, 104, 72, 25, 1, 104, 68, 25, 1, 104, 222, + 228, 25, 1, 104, 213, 243, 212, 125, 25, 1, 104, 203, 162, 25, 1, 104, + 203, 102, 25, 1, 104, 217, 157, 218, 63, 231, 86, 25, 1, 104, 206, 206, + 25, 1, 104, 196, 31, 25, 1, 104, 216, 238, 25, 1, 104, 195, 203, 25, 1, + 104, 195, 235, 204, 53, 25, 1, 104, 195, 235, 241, 85, 25, 1, 104, 195, + 186, 25, 1, 104, 195, 194, 25, 1, 104, 224, 157, 25, 1, 104, 213, 9, 25, + 1, 104, 216, 155, 236, 175, 25, 1, 104, 211, 217, 25, 1, 104, 196, 240, + 25, 1, 104, 235, 181, 25, 1, 104, 199, 113, 25, 1, 104, 221, 190, 25, 1, + 104, 219, 77, 25, 1, 104, 210, 91, 25, 1, 104, 210, 228, 25, 1, 104, 216, + 237, 25, 1, 104, 217, 70, 25, 1, 104, 206, 198, 25, 1, 104, 206, 183, 25, + 1, 104, 234, 223, 210, 130, 25, 1, 104, 176, 25, 1, 104, 212, 219, 25, 1, + 104, 221, 220, 25, 1, 104, 224, 10, 25, 1, 104, 219, 163, 25, 1, 104, + 166, 25, 1, 104, 220, 39, 25, 1, 104, 202, 247, 25, 1, 104, 224, 100, 25, + 1, 104, 218, 214, 25, 1, 104, 203, 23, 25, 1, 104, 235, 205, 25, 1, 104, + 233, 200, 25, 1, 212, 249, 155, 25, 1, 212, 249, 66, 25, 1, 212, 249, + 223, 186, 25, 1, 212, 249, 237, 53, 25, 1, 212, 249, 210, 154, 25, 1, + 212, 249, 203, 145, 25, 1, 212, 249, 215, 88, 25, 1, 212, 249, 172, 25, + 1, 212, 249, 210, 9, 25, 1, 212, 249, 210, 57, 25, 1, 212, 249, 219, 186, + 25, 1, 212, 249, 203, 162, 25, 1, 212, 249, 217, 156, 25, 1, 212, 249, + 216, 161, 25, 1, 212, 249, 221, 135, 25, 1, 212, 249, 204, 74, 25, 1, + 212, 249, 206, 218, 25, 1, 212, 249, 206, 112, 25, 1, 212, 249, 207, 72, + 25, 1, 212, 249, 223, 105, 25, 1, 212, 249, 224, 171, 25, 1, 212, 249, + 215, 153, 25, 1, 212, 249, 215, 185, 25, 1, 212, 249, 216, 132, 25, 1, + 212, 249, 195, 234, 25, 1, 212, 249, 206, 151, 25, 1, 212, 249, 164, 25, + 1, 212, 249, 215, 222, 25, 1, 212, 249, 213, 9, 25, 1, 212, 249, 215, + 202, 25, 1, 212, 249, 196, 240, 25, 1, 212, 249, 213, 78, 25, 1, 212, + 249, 209, 140, 25, 1, 212, 249, 216, 222, 25, 1, 212, 249, 210, 91, 25, + 1, 212, 249, 224, 181, 25, 1, 212, 249, 216, 254, 25, 1, 212, 249, 217, + 49, 25, 1, 212, 249, 206, 198, 25, 1, 212, 249, 211, 222, 25, 1, 212, + 249, 235, 43, 25, 1, 212, 249, 197, 166, 25, 1, 212, 249, 222, 108, 25, + 1, 212, 249, 221, 220, 25, 1, 212, 249, 224, 10, 25, 1, 212, 249, 219, + 230, 25, 1, 212, 249, 210, 126, 25, 1, 212, 249, 166, 25, 1, 212, 249, + 218, 250, 25, 1, 212, 249, 219, 238, 25, 1, 212, 249, 203, 1, 25, 1, 212, + 249, 223, 222, 25, 1, 212, 249, 208, 227, 25, 1, 212, 249, 197, 219, 218, + 148, 1, 189, 218, 148, 1, 217, 18, 218, 148, 1, 196, 3, 218, 148, 1, 219, + 24, 218, 148, 1, 249, 144, 218, 148, 1, 240, 135, 218, 148, 1, 63, 218, + 148, 1, 212, 245, 218, 148, 1, 224, 140, 218, 148, 1, 232, 177, 218, 148, + 1, 240, 110, 218, 148, 1, 245, 29, 218, 148, 1, 224, 201, 218, 148, 1, + 214, 133, 218, 148, 1, 220, 100, 218, 148, 1, 216, 182, 218, 148, 1, 161, + 218, 148, 1, 214, 101, 218, 148, 1, 72, 218, 148, 1, 209, 232, 218, 148, + 1, 206, 223, 218, 148, 1, 202, 216, 218, 148, 1, 237, 81, 218, 148, 1, + 197, 166, 218, 148, 1, 69, 218, 148, 1, 224, 10, 218, 148, 1, 222, 237, + 218, 148, 1, 172, 218, 148, 1, 232, 234, 218, 148, 1, 210, 72, 218, 148, + 1, 203, 37, 218, 148, 17, 195, 79, 218, 148, 17, 100, 218, 148, 17, 102, + 218, 148, 17, 134, 218, 148, 17, 136, 218, 148, 17, 146, 218, 148, 17, + 167, 218, 148, 17, 178, 218, 148, 17, 171, 218, 148, 17, 182, 218, 148, + 240, 87, 218, 148, 52, 240, 87, 249, 58, 199, 149, 1, 236, 210, 249, 58, + 199, 149, 1, 155, 249, 58, 199, 149, 1, 208, 147, 249, 58, 199, 149, 1, + 235, 238, 249, 58, 199, 149, 1, 219, 233, 249, 58, 199, 149, 1, 196, 21, + 249, 58, 199, 149, 1, 234, 107, 249, 58, 199, 149, 1, 239, 156, 249, 58, + 199, 149, 1, 223, 221, 249, 58, 199, 149, 1, 225, 128, 249, 58, 199, 149, + 1, 231, 41, 249, 58, 199, 149, 1, 197, 166, 249, 58, 199, 149, 1, 195, + 11, 249, 58, 199, 149, 1, 234, 51, 249, 58, 199, 149, 1, 239, 27, 249, + 58, 199, 149, 1, 247, 56, 249, 58, 199, 149, 1, 199, 238, 249, 58, 199, + 149, 1, 149, 249, 58, 199, 149, 1, 249, 144, 249, 58, 199, 149, 1, 197, + 220, 249, 58, 199, 149, 1, 196, 63, 249, 58, 199, 149, 1, 161, 249, 58, + 199, 149, 1, 197, 158, 249, 58, 199, 149, 1, 63, 249, 58, 199, 149, 1, + 72, 249, 58, 199, 149, 1, 214, 101, 249, 58, 199, 149, 1, 66, 249, 58, + 199, 149, 1, 237, 53, 249, 58, 199, 149, 1, 69, 249, 58, 199, 149, 1, 68, + 249, 58, 199, 149, 38, 130, 202, 11, 249, 58, 199, 149, 38, 126, 202, 11, + 249, 58, 199, 149, 38, 219, 64, 202, 11, 249, 58, 199, 149, 38, 221, 204, + 202, 11, 249, 58, 199, 149, 38, 232, 45, 202, 11, 249, 58, 199, 149, 234, + 216, 204, 226, 133, 86, 18, 224, 198, 133, 86, 18, 224, 194, 133, 86, 18, + 224, 89, 133, 86, 18, 224, 52, 133, 86, 18, 224, 226, 133, 86, 18, 224, + 223, 133, 86, 18, 223, 170, 133, 86, 18, 223, 141, 133, 86, 18, 224, 200, + 133, 86, 18, 224, 155, 133, 86, 18, 225, 29, 133, 86, 18, 225, 26, 133, + 86, 18, 223, 240, 133, 86, 18, 223, 237, 133, 86, 18, 224, 219, 133, 86, + 18, 224, 217, 133, 86, 18, 223, 172, 133, 86, 18, 223, 171, 133, 86, 18, + 224, 3, 133, 86, 18, 223, 226, 133, 86, 18, 224, 91, 133, 86, 18, 224, + 90, 133, 86, 18, 225, 44, 133, 86, 18, 224, 222, 133, 86, 18, 223, 131, + 133, 86, 18, 223, 122, 133, 86, 18, 225, 53, 133, 86, 18, 225, 45, 133, + 86, 108, 199, 124, 133, 86, 108, 215, 192, 133, 86, 108, 222, 214, 133, + 86, 108, 232, 157, 133, 86, 108, 216, 88, 133, 86, 108, 210, 192, 133, + 86, 108, 216, 115, 133, 86, 108, 211, 132, 133, 86, 108, 196, 80, 133, + 86, 108, 232, 21, 133, 86, 108, 219, 254, 133, 86, 108, 245, 106, 133, + 86, 108, 217, 161, 133, 86, 108, 231, 213, 133, 86, 108, 212, 133, 133, + 86, 108, 215, 198, 133, 86, 108, 217, 201, 133, 86, 108, 250, 149, 133, + 86, 108, 196, 204, 133, 86, 108, 247, 89, 133, 86, 117, 244, 254, 201, + 31, 133, 86, 117, 244, 254, 205, 200, 133, 86, 117, 244, 254, 224, 173, + 133, 86, 117, 244, 254, 224, 131, 133, 86, 117, 244, 254, 204, 158, 133, + 86, 117, 244, 254, 231, 171, 133, 86, 117, 244, 254, 203, 88, 133, 86, 2, + 198, 230, 202, 166, 133, 86, 2, 198, 230, 201, 102, 247, 47, 133, 86, 2, + 244, 254, 245, 95, 133, 86, 2, 198, 230, 202, 194, 133, 86, 2, 198, 230, + 235, 178, 133, 86, 2, 196, 160, 215, 186, 133, 86, 2, 196, 160, 210, 74, + 133, 86, 2, 196, 160, 201, 222, 133, 86, 2, 196, 160, 235, 219, 133, 86, + 2, 198, 230, 208, 123, 133, 86, 2, 219, 185, 204, 162, 133, 86, 2, 198, + 230, 215, 238, 133, 86, 2, 230, 205, 196, 100, 133, 86, 2, 196, 203, 133, + 86, 2, 244, 254, 201, 89, 209, 215, 133, 86, 17, 195, 79, 133, 86, 17, + 100, 133, 86, 17, 102, 133, 86, 17, 134, 133, 86, 17, 136, 133, 86, 17, + 146, 133, 86, 17, 167, 133, 86, 17, 178, 133, 86, 17, 171, 133, 86, 17, + 182, 133, 86, 31, 203, 18, 133, 86, 31, 231, 54, 133, 86, 31, 203, 24, + 202, 157, 133, 86, 31, 219, 25, 133, 86, 31, 231, 57, 219, 25, 133, 86, + 31, 203, 24, 248, 164, 133, 86, 31, 201, 167, 133, 86, 2, 198, 230, 221, + 185, 133, 86, 2, 196, 157, 133, 86, 2, 232, 16, 133, 86, 2, 202, 183, + 232, 16, 133, 86, 2, 194, 240, 202, 227, 133, 86, 2, 231, 197, 133, 86, + 2, 215, 252, 133, 86, 2, 196, 195, 133, 86, 2, 215, 190, 133, 86, 2, 250, + 132, 133, 86, 2, 200, 209, 247, 46, 133, 86, 2, 219, 185, 201, 105, 133, + 86, 2, 203, 89, 133, 86, 2, 221, 217, 133, 86, 2, 218, 94, 133, 86, 2, + 244, 254, 232, 230, 221, 163, 215, 196, 215, 195, 133, 86, 2, 244, 254, + 241, 39, 201, 96, 133, 86, 2, 244, 254, 200, 207, 133, 86, 2, 244, 254, + 200, 208, 245, 17, 133, 86, 2, 244, 254, 211, 220, 240, 55, 133, 86, 2, + 244, 254, 215, 245, 201, 230, 133, 86, 244, 226, 2, 201, 100, 133, 86, + 244, 226, 2, 196, 65, 133, 86, 244, 226, 2, 222, 53, 133, 86, 244, 226, + 2, 222, 212, 133, 86, 244, 226, 2, 196, 156, 133, 86, 244, 226, 2, 223, + 241, 133, 86, 244, 226, 2, 232, 154, 133, 86, 244, 226, 2, 218, 136, 133, + 86, 244, 226, 2, 202, 167, 133, 86, 244, 226, 2, 201, 110, 133, 86, 244, + 226, 2, 213, 2, 133, 86, 244, 226, 2, 224, 143, 133, 86, 244, 226, 2, + 232, 218, 133, 86, 244, 226, 2, 199, 146, 133, 86, 244, 226, 2, 235, 215, + 133, 86, 244, 226, 2, 196, 107, 133, 86, 244, 226, 2, 201, 83, 133, 86, + 244, 226, 2, 223, 126, 133, 86, 244, 226, 2, 197, 208, 219, 194, 6, 1, + 221, 135, 219, 194, 6, 1, 209, 80, 219, 194, 6, 1, 199, 230, 219, 194, 6, + 1, 197, 199, 219, 194, 6, 1, 250, 161, 219, 194, 6, 1, 195, 158, 219, + 194, 6, 1, 223, 223, 219, 194, 6, 1, 214, 2, 219, 194, 6, 1, 203, 216, + 219, 194, 6, 1, 234, 189, 219, 194, 6, 1, 236, 48, 219, 194, 6, 1, 68, + 219, 194, 6, 1, 225, 79, 219, 194, 6, 1, 63, 219, 194, 6, 1, 225, 216, + 219, 194, 6, 1, 69, 219, 194, 6, 1, 250, 111, 219, 194, 6, 1, 247, 206, + 219, 194, 6, 1, 66, 219, 194, 6, 1, 195, 217, 219, 194, 6, 1, 159, 219, + 194, 6, 1, 211, 166, 219, 194, 6, 1, 231, 83, 219, 194, 6, 1, 215, 110, + 219, 194, 6, 1, 196, 222, 219, 194, 6, 1, 240, 230, 219, 194, 6, 1, 214, + 163, 219, 194, 6, 1, 218, 54, 219, 194, 6, 1, 144, 219, 194, 6, 1, 72, + 219, 194, 6, 1, 251, 199, 219, 194, 6, 1, 196, 148, 219, 194, 4, 1, 221, + 135, 219, 194, 4, 1, 209, 80, 219, 194, 4, 1, 199, 230, 219, 194, 4, 1, + 197, 199, 219, 194, 4, 1, 250, 161, 219, 194, 4, 1, 195, 158, 219, 194, + 4, 1, 223, 223, 219, 194, 4, 1, 214, 2, 219, 194, 4, 1, 203, 216, 219, + 194, 4, 1, 234, 189, 219, 194, 4, 1, 236, 48, 219, 194, 4, 1, 68, 219, + 194, 4, 1, 225, 79, 219, 194, 4, 1, 63, 219, 194, 4, 1, 225, 216, 219, + 194, 4, 1, 69, 219, 194, 4, 1, 250, 111, 219, 194, 4, 1, 247, 206, 219, + 194, 4, 1, 66, 219, 194, 4, 1, 195, 217, 219, 194, 4, 1, 159, 219, 194, + 4, 1, 211, 166, 219, 194, 4, 1, 231, 83, 219, 194, 4, 1, 215, 110, 219, + 194, 4, 1, 196, 222, 219, 194, 4, 1, 240, 230, 219, 194, 4, 1, 214, 163, + 219, 194, 4, 1, 218, 54, 219, 194, 4, 1, 144, 219, 194, 4, 1, 72, 219, + 194, 4, 1, 251, 199, 219, 194, 4, 1, 196, 148, 219, 194, 17, 195, 79, + 219, 194, 17, 100, 219, 194, 17, 102, 219, 194, 17, 134, 219, 194, 17, + 136, 219, 194, 17, 146, 219, 194, 17, 167, 219, 194, 17, 178, 219, 194, + 17, 171, 219, 194, 17, 182, 219, 194, 31, 203, 23, 219, 194, 31, 236, + 251, 219, 194, 31, 200, 239, 219, 194, 31, 202, 179, 219, 194, 31, 235, + 0, 219, 194, 31, 235, 148, 219, 194, 31, 206, 23, 219, 194, 31, 207, 68, + 219, 194, 31, 237, 27, 219, 194, 31, 216, 175, 219, 194, 17, 97, 251, + 130, 20, 219, 194, 17, 99, 251, 130, 20, 219, 194, 17, 115, 251, 130, 20, + 219, 194, 244, 158, 219, 194, 234, 216, 204, 226, 219, 194, 16, 251, 184, + 219, 194, 236, 89, 214, 148, 109, 1, 161, 109, 1, 249, 144, 109, 1, 11, + 161, 109, 1, 212, 149, 109, 1, 166, 109, 1, 219, 80, 109, 1, 250, 250, + 166, 109, 1, 235, 238, 109, 1, 199, 152, 109, 1, 199, 36, 109, 1, 189, + 109, 1, 240, 135, 109, 1, 11, 201, 78, 109, 1, 11, 189, 109, 1, 201, 78, + 109, 1, 240, 40, 109, 1, 176, 109, 1, 216, 226, 109, 1, 11, 216, 85, 109, + 1, 250, 250, 176, 109, 1, 216, 85, 109, 1, 216, 71, 109, 1, 172, 109, 1, + 221, 149, 109, 1, 222, 121, 109, 1, 222, 110, 109, 1, 202, 44, 109, 1, + 239, 36, 109, 1, 202, 36, 109, 1, 239, 35, 109, 1, 155, 109, 1, 234, 122, + 109, 1, 11, 155, 109, 1, 211, 158, 109, 1, 211, 135, 109, 1, 217, 70, + 109, 1, 217, 19, 109, 1, 250, 250, 217, 70, 109, 1, 142, 109, 1, 196, + 208, 109, 1, 233, 229, 109, 1, 233, 204, 109, 1, 201, 88, 109, 1, 237, + 138, 109, 1, 215, 108, 109, 1, 215, 90, 109, 1, 201, 103, 109, 1, 237, + 149, 109, 1, 11, 201, 103, 109, 1, 11, 237, 149, 109, 1, 210, 152, 201, + 103, 109, 1, 207, 50, 109, 1, 205, 80, 109, 1, 195, 74, 109, 1, 195, 1, + 109, 1, 201, 113, 109, 1, 237, 155, 109, 1, 11, 201, 113, 109, 1, 183, + 109, 1, 195, 115, 109, 1, 195, 2, 109, 1, 194, 228, 109, 1, 194, 208, + 109, 1, 250, 250, 194, 228, 109, 1, 194, 200, 109, 1, 194, 207, 109, 1, + 197, 166, 109, 1, 251, 208, 109, 1, 232, 79, 109, 1, 248, 42, 109, 1, + 204, 42, 109, 1, 237, 139, 109, 1, 203, 68, 109, 1, 201, 107, 109, 1, + 209, 143, 109, 2, 108, 73, 154, 109, 1, 217, 206, 109, 2, 250, 184, 109, + 2, 210, 152, 198, 242, 109, 2, 210, 152, 250, 184, 109, 18, 2, 63, 109, + 18, 2, 252, 167, 109, 18, 2, 251, 204, 109, 18, 2, 251, 105, 109, 18, 2, + 251, 96, 109, 18, 2, 72, 109, 18, 2, 214, 101, 109, 18, 2, 197, 34, 109, + 18, 2, 197, 199, 109, 18, 2, 69, 109, 18, 2, 236, 229, 109, 18, 2, 236, + 214, 109, 18, 2, 214, 159, 109, 18, 2, 68, 109, 18, 2, 230, 209, 109, 18, + 2, 230, 208, 109, 18, 2, 230, 207, 109, 18, 2, 226, 11, 109, 18, 2, 226, + 146, 109, 18, 2, 226, 119, 109, 18, 2, 225, 229, 109, 18, 2, 226, 59, + 109, 18, 2, 66, 109, 18, 2, 200, 114, 109, 18, 2, 200, 113, 109, 18, 2, + 200, 112, 109, 18, 2, 199, 245, 109, 18, 2, 200, 96, 109, 18, 2, 200, 56, + 109, 18, 2, 196, 148, 109, 18, 2, 196, 24, 109, 18, 2, 251, 244, 109, 18, + 2, 251, 240, 109, 18, 2, 236, 154, 109, 18, 2, 209, 185, 236, 154, 109, + 18, 2, 236, 162, 109, 18, 2, 209, 185, 236, 162, 109, 18, 2, 251, 199, + 109, 18, 2, 237, 32, 109, 18, 2, 250, 149, 109, 18, 2, 214, 38, 109, 18, + 2, 218, 54, 109, 18, 2, 217, 72, 109, 18, 2, 200, 40, 109, 18, 2, 195, + 197, 109, 18, 2, 214, 153, 109, 18, 2, 214, 160, 109, 18, 2, 197, 210, + 109, 18, 2, 226, 124, 109, 18, 2, 237, 81, 109, 18, 2, 226, 9, 109, 18, + 2, 200, 90, 109, 152, 210, 22, 109, 152, 201, 243, 210, 22, 109, 152, 57, + 109, 152, 60, 109, 1, 202, 9, 109, 1, 202, 8, 109, 1, 202, 7, 109, 1, + 202, 6, 109, 1, 202, 5, 109, 1, 202, 4, 109, 1, 202, 3, 109, 1, 210, 152, + 202, 10, 109, 1, 210, 152, 202, 9, 109, 1, 210, 152, 202, 7, 109, 1, 210, + 152, 202, 6, 109, 1, 210, 152, 202, 5, 109, 1, 210, 152, 202, 3, 19, 225, + 231, 78, 43, 225, 231, 78, 37, 245, 60, 231, 164, 78, 37, 245, 60, 225, + 231, 78, 19, 244, 147, 19, 244, 146, 19, 244, 145, 19, 244, 144, 19, 244, + 143, 19, 244, 142, 19, 244, 141, 19, 244, 140, 19, 244, 139, 19, 244, + 138, 19, 244, 137, 19, 244, 136, 19, 244, 135, 19, 244, 134, 19, 244, + 133, 19, 244, 132, 19, 244, 131, 19, 244, 130, 19, 244, 129, 19, 244, + 128, 19, 244, 127, 19, 244, 126, 19, 244, 125, 19, 244, 124, 19, 244, + 123, 19, 244, 122, 19, 244, 121, 19, 244, 120, 19, 244, 119, 19, 244, + 118, 19, 244, 117, 19, 244, 116, 19, 244, 115, 19, 244, 114, 19, 244, + 113, 19, 244, 112, 19, 244, 111, 19, 244, 110, 19, 244, 109, 19, 244, + 108, 19, 244, 107, 19, 244, 106, 19, 244, 105, 19, 244, 104, 19, 244, + 103, 19, 244, 102, 19, 244, 101, 19, 244, 100, 19, 244, 99, 19, 244, 98, + 19, 244, 97, 19, 244, 96, 19, 244, 95, 19, 244, 94, 19, 244, 93, 19, 244, + 92, 19, 244, 91, 19, 244, 90, 19, 244, 89, 19, 244, 88, 19, 244, 87, 19, + 244, 86, 19, 244, 85, 19, 244, 84, 19, 244, 83, 19, 244, 82, 19, 244, 81, + 19, 244, 80, 19, 244, 79, 19, 244, 78, 19, 244, 77, 19, 244, 76, 19, 244, + 75, 19, 244, 74, 19, 244, 73, 19, 244, 72, 19, 244, 71, 19, 244, 70, 19, + 244, 69, 19, 244, 68, 19, 244, 67, 19, 244, 66, 19, 244, 65, 19, 244, 64, + 19, 244, 63, 19, 244, 62, 19, 244, 61, 19, 244, 60, 19, 244, 59, 19, 244, + 58, 19, 244, 57, 19, 244, 56, 19, 244, 55, 19, 244, 54, 19, 244, 53, 19, + 244, 52, 19, 244, 51, 19, 244, 50, 19, 244, 49, 19, 244, 48, 19, 244, 47, + 19, 244, 46, 19, 244, 45, 19, 244, 44, 19, 244, 43, 19, 244, 42, 19, 244, + 41, 19, 244, 40, 19, 244, 39, 19, 244, 38, 19, 244, 37, 19, 244, 36, 19, + 244, 35, 19, 244, 34, 19, 244, 33, 19, 244, 32, 19, 244, 31, 19, 244, 30, + 19, 244, 29, 19, 244, 28, 19, 244, 27, 19, 244, 26, 19, 244, 25, 19, 244, + 24, 19, 244, 23, 19, 244, 22, 19, 244, 21, 19, 244, 20, 19, 244, 19, 19, + 244, 18, 19, 244, 17, 19, 244, 16, 19, 244, 15, 19, 244, 14, 19, 244, 13, + 19, 244, 12, 19, 244, 11, 19, 244, 10, 19, 244, 9, 19, 244, 8, 19, 244, + 7, 19, 244, 6, 19, 244, 5, 19, 244, 4, 19, 244, 3, 19, 244, 2, 19, 244, + 1, 19, 244, 0, 19, 243, 255, 19, 243, 254, 19, 243, 253, 19, 243, 252, + 19, 243, 251, 19, 243, 250, 19, 243, 249, 19, 243, 248, 19, 243, 247, 19, + 243, 246, 19, 243, 245, 19, 243, 244, 19, 243, 243, 19, 243, 242, 19, + 243, 241, 19, 243, 240, 19, 243, 239, 19, 243, 238, 19, 243, 237, 19, + 243, 236, 19, 243, 235, 19, 243, 234, 19, 243, 233, 19, 243, 232, 19, + 243, 231, 19, 243, 230, 19, 243, 229, 19, 243, 228, 19, 243, 227, 19, + 243, 226, 19, 243, 225, 19, 243, 224, 19, 243, 223, 19, 243, 222, 19, + 243, 221, 19, 243, 220, 19, 243, 219, 19, 243, 218, 19, 243, 217, 19, + 243, 216, 19, 243, 215, 19, 243, 214, 19, 243, 213, 19, 243, 212, 19, + 243, 211, 19, 243, 210, 19, 243, 209, 19, 243, 208, 19, 243, 207, 19, + 243, 206, 19, 243, 205, 19, 243, 204, 19, 243, 203, 19, 243, 202, 19, + 243, 201, 19, 243, 200, 19, 243, 199, 19, 243, 198, 19, 243, 197, 19, + 243, 196, 19, 243, 195, 19, 243, 194, 19, 243, 193, 19, 243, 192, 19, + 243, 191, 19, 243, 190, 19, 243, 189, 19, 243, 188, 19, 243, 187, 19, + 243, 186, 19, 243, 185, 19, 243, 184, 19, 243, 183, 19, 243, 182, 19, + 243, 181, 19, 243, 180, 19, 243, 179, 19, 243, 178, 19, 243, 177, 19, + 243, 176, 19, 243, 175, 19, 243, 174, 19, 243, 173, 19, 243, 172, 19, + 243, 171, 19, 243, 170, 19, 243, 169, 19, 243, 168, 19, 243, 167, 19, + 243, 166, 19, 243, 165, 19, 243, 164, 19, 243, 163, 19, 243, 162, 19, + 243, 161, 19, 243, 160, 19, 243, 159, 19, 243, 158, 19, 243, 157, 19, + 243, 156, 19, 243, 155, 19, 243, 154, 19, 243, 153, 19, 243, 152, 19, + 243, 151, 19, 243, 150, 19, 243, 149, 19, 243, 148, 19, 243, 147, 19, + 243, 146, 19, 243, 145, 19, 243, 144, 19, 243, 143, 19, 243, 142, 19, + 243, 141, 19, 243, 140, 19, 243, 139, 19, 243, 138, 19, 243, 137, 19, + 243, 136, 19, 243, 135, 19, 243, 134, 19, 243, 133, 19, 243, 132, 19, + 243, 131, 19, 243, 130, 19, 243, 129, 19, 243, 128, 19, 243, 127, 19, + 243, 126, 19, 243, 125, 19, 243, 124, 19, 243, 123, 19, 243, 122, 19, + 243, 121, 19, 243, 120, 19, 243, 119, 19, 243, 118, 19, 243, 117, 19, + 243, 116, 19, 243, 115, 19, 243, 114, 19, 243, 113, 19, 243, 112, 19, + 243, 111, 19, 243, 110, 19, 243, 109, 19, 243, 108, 19, 243, 107, 19, + 243, 106, 19, 243, 105, 19, 243, 104, 19, 243, 103, 19, 243, 102, 19, + 243, 101, 19, 243, 100, 19, 243, 99, 19, 243, 98, 19, 243, 97, 19, 243, + 96, 19, 243, 95, 19, 243, 94, 19, 243, 93, 19, 243, 92, 19, 243, 91, 19, + 243, 90, 19, 243, 89, 19, 243, 88, 19, 243, 87, 19, 243, 86, 19, 243, 85, + 19, 243, 84, 19, 243, 83, 19, 243, 82, 19, 243, 81, 19, 243, 80, 19, 243, + 79, 19, 243, 78, 19, 243, 77, 19, 243, 76, 19, 243, 75, 19, 243, 74, 19, + 243, 73, 19, 243, 72, 19, 243, 71, 19, 243, 70, 19, 243, 69, 19, 243, 68, + 19, 243, 67, 19, 243, 66, 19, 243, 65, 19, 243, 64, 19, 243, 63, 19, 243, + 62, 19, 243, 61, 19, 243, 60, 19, 243, 59, 19, 243, 58, 19, 243, 57, 19, + 243, 56, 19, 243, 55, 19, 243, 54, 19, 243, 53, 19, 243, 52, 19, 243, 51, + 19, 243, 50, 19, 243, 49, 19, 243, 48, 19, 243, 47, 19, 243, 46, 19, 243, + 45, 19, 243, 44, 19, 243, 43, 19, 243, 42, 19, 243, 41, 19, 243, 40, 19, + 243, 39, 19, 243, 38, 19, 243, 37, 19, 243, 36, 19, 243, 35, 19, 243, 34, + 19, 243, 33, 19, 243, 32, 19, 243, 31, 19, 243, 30, 19, 243, 29, 19, 243, + 28, 19, 243, 27, 19, 243, 26, 19, 243, 25, 19, 243, 24, 19, 243, 23, 19, + 243, 22, 19, 243, 21, 19, 243, 20, 19, 243, 19, 19, 243, 18, 19, 243, 17, + 19, 243, 16, 19, 243, 15, 19, 243, 14, 19, 243, 13, 19, 243, 12, 19, 243, + 11, 19, 243, 10, 19, 243, 9, 19, 243, 8, 19, 243, 7, 19, 243, 6, 19, 243, + 5, 19, 243, 4, 19, 243, 3, 19, 243, 2, 19, 243, 1, 19, 243, 0, 19, 242, + 255, 19, 242, 254, 19, 242, 253, 19, 242, 252, 19, 242, 251, 19, 242, + 250, 19, 242, 249, 19, 242, 248, 19, 242, 247, 19, 242, 246, 19, 242, + 245, 19, 242, 244, 19, 242, 243, 19, 242, 242, 19, 242, 241, 19, 242, + 240, 19, 242, 239, 19, 242, 238, 19, 242, 237, 19, 242, 236, 19, 242, + 235, 19, 242, 234, 19, 242, 233, 19, 242, 232, 19, 242, 231, 19, 242, + 230, 19, 242, 229, 19, 242, 228, 19, 242, 227, 19, 242, 226, 19, 242, + 225, 19, 242, 224, 19, 242, 223, 19, 242, 222, 19, 242, 221, 19, 242, + 220, 19, 242, 219, 19, 242, 218, 19, 242, 217, 19, 242, 216, 19, 242, + 215, 19, 242, 214, 19, 242, 213, 19, 242, 212, 19, 242, 211, 19, 242, + 210, 19, 242, 209, 19, 242, 208, 19, 242, 207, 19, 242, 206, 19, 242, + 205, 19, 242, 204, 19, 242, 203, 19, 242, 202, 19, 242, 201, 19, 242, + 200, 19, 242, 199, 19, 242, 198, 19, 242, 197, 19, 242, 196, 19, 242, + 195, 19, 242, 194, 19, 242, 193, 19, 242, 192, 19, 242, 191, 19, 242, + 190, 19, 242, 189, 19, 242, 188, 19, 242, 187, 19, 242, 186, 19, 242, + 185, 19, 242, 184, 19, 242, 183, 19, 242, 182, 19, 242, 181, 19, 242, + 180, 19, 242, 179, 19, 242, 178, 19, 242, 177, 19, 242, 176, 19, 242, + 175, 19, 242, 174, 19, 242, 173, 19, 242, 172, 19, 242, 171, 19, 242, + 170, 19, 242, 169, 19, 242, 168, 19, 242, 167, 19, 242, 166, 19, 242, + 165, 19, 242, 164, 19, 242, 163, 19, 242, 162, 19, 242, 161, 19, 242, + 160, 19, 242, 159, 19, 242, 158, 19, 242, 157, 19, 242, 156, 19, 242, + 155, 19, 242, 154, 19, 242, 153, 19, 242, 152, 19, 242, 151, 19, 242, + 150, 19, 242, 149, 19, 242, 148, 19, 242, 147, 19, 242, 146, 19, 242, + 145, 19, 242, 144, 19, 242, 143, 19, 242, 142, 19, 242, 141, 19, 242, + 140, 19, 242, 139, 19, 242, 138, 19, 242, 137, 19, 242, 136, 19, 242, + 135, 19, 242, 134, 19, 242, 133, 19, 242, 132, 19, 242, 131, 19, 242, + 130, 19, 242, 129, 19, 242, 128, 19, 242, 127, 19, 242, 126, 19, 242, + 125, 19, 242, 124, 19, 242, 123, 19, 242, 122, 19, 242, 121, 19, 242, + 120, 19, 242, 119, 19, 242, 118, 19, 242, 117, 19, 242, 116, 19, 242, + 115, 19, 242, 114, 19, 242, 113, 19, 242, 112, 19, 242, 111, 19, 242, + 110, 19, 242, 109, 19, 242, 108, 19, 242, 107, 19, 242, 106, 19, 242, + 105, 19, 242, 104, 19, 242, 103, 19, 242, 102, 19, 242, 101, 19, 242, + 100, 19, 242, 99, 19, 242, 98, 19, 242, 97, 19, 242, 96, 19, 242, 95, 19, + 242, 94, 19, 242, 93, 19, 242, 92, 19, 242, 91, 19, 242, 90, 19, 242, 89, + 19, 242, 88, 19, 242, 87, 19, 242, 86, 19, 242, 85, 19, 242, 84, 19, 242, + 83, 19, 242, 82, 19, 242, 81, 19, 242, 80, 19, 242, 79, 19, 242, 78, 19, + 242, 77, 19, 242, 76, 19, 242, 75, 19, 242, 74, 19, 242, 73, 19, 242, 72, + 19, 242, 71, 19, 242, 70, 19, 242, 69, 19, 242, 68, 19, 242, 67, 19, 242, + 66, 19, 242, 65, 19, 242, 64, 19, 242, 63, 19, 242, 62, 19, 242, 61, 19, + 242, 60, 19, 242, 59, 19, 242, 58, 19, 242, 57, 19, 242, 56, 19, 242, 55, + 19, 242, 54, 19, 242, 53, 19, 242, 52, 19, 242, 51, 19, 242, 50, 19, 242, + 49, 19, 242, 48, 19, 242, 47, 19, 242, 46, 19, 242, 45, 19, 242, 44, 19, + 242, 43, 19, 242, 42, 19, 242, 41, 19, 242, 40, 19, 242, 39, 19, 242, 38, + 19, 242, 37, 19, 242, 36, 19, 242, 35, 19, 242, 34, 19, 242, 33, 19, 242, + 32, 19, 242, 31, 19, 242, 30, 19, 242, 29, 19, 242, 28, 19, 242, 27, 19, + 242, 26, 19, 242, 25, 19, 242, 24, 19, 242, 23, 19, 242, 22, 19, 242, 21, + 19, 242, 20, 19, 242, 19, 19, 242, 18, 19, 242, 17, 19, 242, 16, 19, 242, + 15, 19, 242, 14, 19, 242, 13, 19, 242, 12, 19, 242, 11, 19, 242, 10, 19, + 242, 9, 19, 242, 8, 19, 242, 7, 19, 242, 6, 19, 242, 5, 19, 242, 4, 19, + 242, 3, 19, 242, 2, 19, 242, 1, 19, 242, 0, 19, 241, 255, 19, 241, 254, + 19, 241, 253, 19, 241, 252, 19, 241, 251, 19, 241, 250, 19, 241, 249, 19, + 241, 248, 19, 241, 247, 19, 241, 246, 19, 241, 245, 19, 241, 244, 19, + 241, 243, 19, 241, 242, 19, 241, 241, 19, 241, 240, 19, 241, 239, 19, + 241, 238, 19, 241, 237, 19, 241, 236, 19, 241, 235, 19, 241, 234, 19, + 241, 233, 19, 241, 232, 19, 241, 231, 19, 241, 230, 19, 241, 229, 19, + 241, 228, 19, 241, 227, 19, 241, 226, 19, 241, 225, 19, 241, 224, 19, + 241, 223, 19, 241, 222, 19, 241, 221, 19, 241, 220, 19, 241, 219, 19, + 241, 218, 19, 241, 217, 19, 241, 216, 19, 241, 215, 19, 241, 214, 19, + 241, 213, 19, 241, 212, 19, 241, 211, 19, 241, 210, 19, 241, 209, 19, + 241, 208, 19, 241, 207, 19, 241, 206, 19, 241, 205, 19, 241, 204, 19, + 241, 203, 19, 241, 202, 19, 241, 201, 19, 241, 200, 19, 241, 199, 19, + 241, 198, 19, 241, 197, 19, 241, 196, 19, 241, 195, 19, 241, 194, 19, + 241, 193, 19, 241, 192, 19, 241, 191, 19, 241, 190, 19, 241, 189, 19, + 241, 188, 19, 241, 187, 19, 241, 186, 19, 241, 185, 19, 241, 184, 19, + 241, 183, 19, 241, 182, 19, 241, 181, 19, 241, 180, 19, 241, 179, 19, + 241, 178, 19, 241, 177, 19, 241, 176, 19, 241, 175, 19, 241, 174, 19, + 241, 173, 19, 241, 172, 19, 241, 171, 19, 241, 170, 19, 241, 169, 19, + 241, 168, 19, 241, 167, 19, 241, 166, 19, 241, 165, 19, 241, 164, 19, + 241, 163, 19, 241, 162, 19, 241, 161, 71, 1, 250, 250, 69, 188, 1, 250, + 250, 196, 69, 56, 1, 255, 167, 56, 1, 255, 166, 56, 1, 255, 165, 56, 1, + 255, 161, 56, 1, 230, 247, 56, 1, 230, 246, 56, 1, 230, 245, 56, 1, 230, + 244, 56, 1, 200, 177, 56, 1, 200, 176, 56, 1, 200, 175, 56, 1, 200, 174, + 56, 1, 200, 173, 56, 1, 237, 133, 56, 1, 237, 132, 56, 1, 237, 131, 56, + 1, 237, 130, 56, 1, 237, 129, 56, 1, 215, 21, 56, 1, 215, 20, 56, 1, 215, + 19, 56, 1, 225, 68, 56, 1, 225, 65, 56, 1, 225, 64, 56, 1, 225, 63, 56, + 1, 225, 62, 56, 1, 225, 61, 56, 1, 225, 60, 56, 1, 225, 59, 56, 1, 225, + 58, 56, 1, 225, 67, 56, 1, 225, 66, 56, 1, 225, 57, 56, 1, 224, 99, 56, + 1, 224, 98, 56, 1, 224, 97, 56, 1, 224, 96, 56, 1, 224, 95, 56, 1, 224, + 94, 56, 1, 224, 93, 56, 1, 224, 92, 56, 1, 223, 185, 56, 1, 223, 184, 56, + 1, 223, 183, 56, 1, 223, 182, 56, 1, 223, 181, 56, 1, 223, 180, 56, 1, + 223, 179, 56, 1, 224, 207, 56, 1, 224, 206, 56, 1, 224, 205, 56, 1, 224, + 204, 56, 1, 224, 203, 56, 1, 224, 202, 56, 1, 224, 9, 56, 1, 224, 8, 56, + 1, 224, 7, 56, 1, 224, 6, 56, 1, 209, 22, 56, 1, 209, 21, 56, 1, 209, 20, + 56, 1, 209, 19, 56, 1, 209, 18, 56, 1, 209, 17, 56, 1, 209, 16, 56, 1, + 209, 15, 56, 1, 206, 111, 56, 1, 206, 110, 56, 1, 206, 109, 56, 1, 206, + 108, 56, 1, 206, 107, 56, 1, 206, 106, 56, 1, 204, 171, 56, 1, 204, 170, + 56, 1, 204, 169, 56, 1, 204, 168, 56, 1, 204, 167, 56, 1, 204, 166, 56, + 1, 204, 165, 56, 1, 204, 164, 56, 1, 208, 146, 56, 1, 208, 145, 56, 1, + 208, 144, 56, 1, 208, 143, 56, 1, 208, 142, 56, 1, 205, 199, 56, 1, 205, + 198, 56, 1, 205, 197, 56, 1, 205, 196, 56, 1, 205, 195, 56, 1, 205, 194, + 56, 1, 205, 193, 56, 1, 203, 168, 56, 1, 203, 167, 56, 1, 203, 166, 56, + 1, 203, 165, 56, 1, 202, 121, 56, 1, 202, 120, 56, 1, 202, 119, 56, 1, + 202, 118, 56, 1, 202, 117, 56, 1, 202, 116, 56, 1, 202, 115, 56, 1, 201, + 39, 56, 1, 201, 38, 56, 1, 201, 37, 56, 1, 201, 36, 56, 1, 201, 35, 56, + 1, 203, 67, 56, 1, 203, 66, 56, 1, 203, 65, 56, 1, 203, 64, 56, 1, 203, + 63, 56, 1, 203, 62, 56, 1, 203, 61, 56, 1, 203, 60, 56, 1, 203, 59, 56, + 1, 202, 29, 56, 1, 202, 28, 56, 1, 202, 27, 56, 1, 202, 26, 56, 1, 202, + 25, 56, 1, 202, 24, 56, 1, 202, 23, 56, 1, 217, 255, 56, 1, 217, 254, 56, + 1, 217, 253, 56, 1, 217, 252, 56, 1, 217, 251, 56, 1, 217, 250, 56, 1, + 217, 249, 56, 1, 217, 248, 56, 1, 217, 247, 56, 1, 216, 221, 56, 1, 216, + 220, 56, 1, 216, 219, 56, 1, 216, 218, 56, 1, 216, 217, 56, 1, 216, 216, + 56, 1, 216, 215, 56, 1, 216, 214, 56, 1, 215, 184, 56, 1, 215, 183, 56, + 1, 215, 182, 56, 1, 217, 116, 56, 1, 217, 115, 56, 1, 217, 114, 56, 1, + 217, 113, 56, 1, 217, 112, 56, 1, 217, 111, 56, 1, 217, 110, 56, 1, 216, + 48, 56, 1, 216, 47, 56, 1, 216, 46, 56, 1, 216, 45, 56, 1, 216, 44, 56, + 1, 233, 2, 56, 1, 232, 255, 56, 1, 232, 254, 56, 1, 232, 253, 56, 1, 232, + 252, 56, 1, 232, 251, 56, 1, 232, 250, 56, 1, 232, 249, 56, 1, 232, 248, + 56, 1, 233, 1, 56, 1, 233, 0, 56, 1, 232, 69, 56, 1, 232, 68, 56, 1, 232, + 67, 56, 1, 232, 66, 56, 1, 232, 65, 56, 1, 232, 64, 56, 1, 232, 63, 56, + 1, 231, 73, 56, 1, 231, 72, 56, 1, 231, 71, 56, 1, 232, 145, 56, 1, 232, + 144, 56, 1, 232, 143, 56, 1, 232, 142, 56, 1, 232, 141, 56, 1, 232, 140, + 56, 1, 232, 139, 56, 1, 231, 191, 56, 1, 231, 190, 56, 1, 231, 189, 56, + 1, 231, 188, 56, 1, 231, 187, 56, 1, 231, 186, 56, 1, 231, 185, 56, 1, + 231, 184, 56, 1, 220, 126, 56, 1, 220, 125, 56, 1, 220, 124, 56, 1, 220, + 123, 56, 1, 220, 122, 56, 1, 220, 121, 56, 1, 220, 120, 56, 1, 219, 76, + 56, 1, 219, 75, 56, 1, 219, 74, 56, 1, 219, 73, 56, 1, 219, 72, 56, 1, + 219, 71, 56, 1, 219, 70, 56, 1, 218, 143, 56, 1, 218, 142, 56, 1, 218, + 141, 56, 1, 218, 140, 56, 1, 219, 205, 56, 1, 219, 204, 56, 1, 219, 203, + 56, 1, 218, 249, 56, 1, 218, 248, 56, 1, 218, 247, 56, 1, 218, 246, 56, + 1, 218, 245, 56, 1, 218, 244, 56, 1, 196, 137, 56, 1, 196, 136, 56, 1, + 196, 135, 56, 1, 196, 134, 56, 1, 196, 133, 56, 1, 196, 130, 56, 1, 195, + 216, 56, 1, 195, 215, 56, 1, 195, 214, 56, 1, 195, 213, 56, 1, 196, 2, + 56, 1, 196, 1, 56, 1, 196, 0, 56, 1, 195, 255, 56, 1, 195, 254, 56, 1, + 195, 253, 56, 1, 210, 250, 56, 1, 210, 249, 56, 1, 210, 248, 56, 1, 210, + 247, 56, 1, 210, 71, 56, 1, 210, 70, 56, 1, 210, 69, 56, 1, 210, 68, 56, + 1, 210, 67, 56, 1, 210, 66, 56, 1, 210, 65, 56, 1, 209, 139, 56, 1, 209, + 138, 56, 1, 209, 137, 56, 1, 209, 136, 56, 1, 209, 135, 56, 1, 209, 134, + 56, 1, 210, 181, 56, 1, 210, 180, 56, 1, 210, 179, 56, 1, 210, 178, 56, + 1, 209, 231, 56, 1, 209, 230, 56, 1, 209, 229, 56, 1, 209, 228, 56, 1, + 209, 227, 56, 1, 209, 226, 56, 1, 197, 165, 56, 1, 197, 164, 56, 1, 197, + 163, 56, 1, 197, 162, 56, 1, 197, 161, 56, 1, 197, 69, 56, 1, 197, 68, + 56, 1, 197, 67, 56, 1, 197, 66, 56, 1, 197, 65, 56, 1, 197, 108, 56, 1, + 197, 107, 56, 1, 197, 106, 56, 1, 197, 105, 56, 1, 197, 33, 56, 1, 197, + 32, 56, 1, 197, 31, 56, 1, 197, 30, 56, 1, 197, 29, 56, 1, 197, 28, 56, + 1, 197, 27, 56, 1, 218, 51, 56, 1, 218, 50, 188, 1, 4, 197, 70, 188, 1, + 4, 197, 109, 188, 1, 4, 197, 34, 71, 1, 4, 197, 70, 71, 1, 4, 197, 109, + 71, 1, 4, 197, 34, 71, 1, 4, 218, 54, 43, 246, 253, 43, 246, 252, 43, + 246, 251, 43, 246, 250, 43, 246, 249, 43, 246, 248, 43, 246, 247, 43, + 246, 246, 43, 246, 245, 43, 246, 244, 43, 246, 243, 43, 246, 242, 43, + 246, 241, 43, 246, 240, 43, 246, 239, 43, 246, 238, 43, 246, 237, 43, + 246, 236, 43, 246, 235, 43, 246, 234, 43, 246, 233, 43, 246, 232, 43, + 246, 231, 43, 246, 230, 43, 246, 229, 43, 246, 228, 43, 246, 227, 43, + 246, 226, 43, 246, 225, 43, 246, 224, 43, 246, 223, 43, 246, 222, 43, + 246, 221, 43, 246, 220, 43, 246, 219, 43, 246, 218, 43, 246, 217, 43, + 246, 216, 43, 246, 215, 43, 246, 214, 43, 246, 213, 43, 246, 212, 43, + 246, 211, 43, 246, 210, 43, 246, 209, 43, 246, 208, 43, 246, 207, 43, + 246, 206, 43, 246, 205, 43, 246, 204, 43, 246, 203, 43, 246, 202, 43, + 246, 201, 43, 246, 200, 43, 246, 199, 43, 246, 198, 43, 246, 197, 43, + 246, 196, 43, 246, 195, 43, 246, 194, 43, 246, 193, 43, 246, 192, 43, + 246, 191, 43, 246, 190, 43, 246, 189, 43, 246, 188, 43, 246, 187, 43, + 246, 186, 43, 246, 185, 43, 246, 184, 43, 246, 183, 43, 246, 182, 43, + 246, 181, 43, 246, 180, 43, 246, 179, 43, 246, 178, 43, 246, 177, 43, + 246, 176, 43, 246, 175, 43, 246, 174, 43, 246, 173, 43, 246, 172, 43, + 246, 171, 43, 246, 170, 43, 246, 169, 43, 246, 168, 43, 246, 167, 43, + 246, 166, 43, 246, 165, 43, 246, 164, 43, 246, 163, 43, 246, 162, 43, + 246, 161, 43, 246, 160, 43, 246, 159, 43, 246, 158, 43, 246, 157, 43, + 246, 156, 43, 246, 155, 43, 246, 154, 43, 246, 153, 43, 246, 152, 43, + 246, 151, 43, 246, 150, 43, 246, 149, 43, 246, 148, 43, 246, 147, 43, + 246, 146, 43, 246, 145, 43, 246, 144, 43, 246, 143, 43, 246, 142, 43, + 246, 141, 43, 246, 140, 43, 246, 139, 43, 246, 138, 43, 246, 137, 43, + 246, 136, 43, 246, 135, 43, 246, 134, 43, 246, 133, 43, 246, 132, 43, + 246, 131, 43, 246, 130, 43, 246, 129, 43, 246, 128, 43, 246, 127, 43, + 246, 126, 43, 246, 125, 43, 246, 124, 43, 246, 123, 43, 246, 122, 43, + 246, 121, 43, 246, 120, 43, 246, 119, 43, 246, 118, 43, 246, 117, 43, + 246, 116, 43, 246, 115, 43, 246, 114, 43, 246, 113, 43, 246, 112, 43, + 246, 111, 43, 246, 110, 43, 246, 109, 43, 246, 108, 43, 246, 107, 43, + 246, 106, 43, 246, 105, 43, 246, 104, 43, 246, 103, 43, 246, 102, 43, + 246, 101, 43, 246, 100, 43, 246, 99, 43, 246, 98, 43, 246, 97, 43, 246, + 96, 43, 246, 95, 43, 246, 94, 43, 246, 93, 43, 246, 92, 43, 246, 91, 43, + 246, 90, 43, 246, 89, 43, 246, 88, 43, 246, 87, 43, 246, 86, 43, 246, 85, + 43, 246, 84, 43, 246, 83, 43, 246, 82, 43, 246, 81, 43, 246, 80, 43, 246, + 79, 43, 246, 78, 43, 246, 77, 43, 246, 76, 43, 246, 75, 43, 246, 74, 43, + 246, 73, 43, 246, 72, 43, 246, 71, 43, 246, 70, 43, 246, 69, 43, 246, 68, + 43, 246, 67, 43, 246, 66, 43, 246, 65, 43, 246, 64, 43, 246, 63, 43, 246, + 62, 43, 246, 61, 43, 246, 60, 43, 246, 59, 43, 246, 58, 43, 246, 57, 43, + 246, 56, 43, 246, 55, 43, 246, 54, 43, 246, 53, 43, 246, 52, 43, 246, 51, + 43, 246, 50, 43, 246, 49, 43, 246, 48, 43, 246, 47, 43, 246, 46, 43, 246, + 45, 43, 246, 44, 43, 246, 43, 43, 246, 42, 43, 246, 41, 43, 246, 40, 43, + 246, 39, 43, 246, 38, 43, 246, 37, 43, 246, 36, 43, 246, 35, 43, 246, 34, + 43, 246, 33, 43, 246, 32, 43, 246, 31, 43, 246, 30, 43, 246, 29, 43, 246, + 28, 43, 246, 27, 43, 246, 26, 43, 246, 25, 43, 246, 24, 43, 246, 23, 43, + 246, 22, 43, 246, 21, 43, 246, 20, 43, 246, 19, 43, 246, 18, 43, 246, 17, + 43, 246, 16, 43, 246, 15, 43, 246, 14, 43, 246, 13, 43, 246, 12, 43, 246, + 11, 43, 246, 10, 43, 246, 9, 43, 246, 8, 43, 246, 7, 43, 246, 6, 43, 246, + 5, 43, 246, 4, 43, 246, 3, 43, 246, 2, 43, 246, 1, 43, 246, 0, 43, 245, + 255, 43, 245, 254, 43, 245, 253, 43, 245, 252, 43, 245, 251, 43, 245, + 250, 43, 245, 249, 43, 245, 248, 43, 245, 247, 43, 245, 246, 43, 245, + 245, 43, 245, 244, 43, 245, 243, 43, 245, 242, 43, 245, 241, 43, 245, + 240, 43, 245, 239, 43, 245, 238, 43, 245, 237, 43, 245, 236, 43, 245, + 235, 43, 245, 234, 43, 245, 233, 43, 245, 232, 43, 245, 231, 43, 245, + 230, 43, 245, 229, 43, 245, 228, 43, 245, 227, 43, 245, 226, 43, 245, + 225, 43, 245, 224, 43, 245, 223, 43, 245, 222, 43, 245, 221, 43, 245, + 220, 43, 245, 219, 43, 245, 218, 43, 245, 217, 43, 245, 216, 43, 245, + 215, 43, 245, 214, 43, 245, 213, 43, 245, 212, 43, 245, 211, 43, 245, + 210, 43, 245, 209, 43, 245, 208, 43, 245, 207, 43, 245, 206, 43, 245, + 205, 43, 245, 204, 43, 245, 203, 43, 245, 202, 43, 245, 201, 43, 245, + 200, 43, 245, 199, 43, 245, 198, 43, 245, 197, 43, 245, 196, 43, 245, + 195, 43, 245, 194, 43, 245, 193, 43, 245, 192, 43, 245, 191, 43, 245, + 190, 43, 245, 189, 43, 245, 188, 43, 245, 187, 43, 245, 186, 43, 245, + 185, 43, 245, 184, 43, 245, 183, 43, 245, 182, 43, 245, 181, 43, 245, + 180, 43, 245, 179, 43, 245, 178, 43, 245, 177, 43, 245, 176, 43, 245, + 175, 43, 245, 174, 43, 245, 173, 43, 245, 172, 43, 245, 171, 43, 245, + 170, 43, 245, 169, 43, 245, 168, 43, 245, 167, 43, 245, 166, 43, 245, + 165, 43, 245, 164, 43, 245, 163, 43, 245, 162, 43, 245, 161, 43, 245, + 160, 43, 245, 159, 43, 245, 158, 43, 245, 157, 43, 245, 156, 43, 245, + 155, 43, 245, 154, 43, 245, 153, 43, 245, 152, 43, 245, 151, 43, 245, + 150, 43, 245, 149, 43, 245, 148, 43, 245, 147, 43, 245, 146, 43, 245, + 145, 43, 245, 144, 43, 245, 143, 43, 245, 142, 43, 245, 141, 43, 245, + 140, 43, 245, 139, 43, 245, 138, 43, 245, 137, 43, 245, 136, 43, 245, + 135, 43, 245, 134, 43, 245, 133, 43, 245, 132, 43, 245, 131, 43, 245, + 130, 43, 245, 129, 43, 245, 128, 43, 245, 127, 43, 245, 126, 43, 245, + 125, 43, 245, 124, 43, 245, 123, 43, 245, 122, 43, 245, 121, 43, 245, + 120, 43, 245, 119, 43, 245, 118, 43, 245, 117, 43, 245, 116, 43, 245, + 115, 43, 245, 114, 114, 1, 233, 14, 114, 1, 196, 222, 114, 1, 214, 2, + 114, 1, 203, 216, 114, 1, 236, 48, 114, 1, 225, 79, 114, 1, 159, 114, 1, + 250, 111, 114, 1, 240, 230, 114, 1, 199, 230, 114, 1, 234, 189, 114, 1, + 144, 114, 1, 214, 3, 218, 54, 114, 1, 240, 231, 209, 80, 114, 1, 236, 49, + 218, 54, 114, 1, 225, 80, 221, 135, 114, 1, 211, 31, 209, 80, 114, 1, + 202, 235, 114, 1, 205, 234, 239, 176, 114, 1, 239, 176, 114, 1, 224, 36, + 114, 1, 205, 234, 225, 216, 114, 1, 232, 25, 114, 1, 222, 122, 114, 1, + 210, 78, 114, 1, 221, 135, 114, 1, 218, 54, 114, 1, 225, 216, 114, 1, + 209, 80, 114, 1, 221, 136, 218, 54, 114, 1, 218, 55, 221, 135, 114, 1, + 225, 217, 221, 135, 114, 1, 209, 81, 225, 216, 114, 1, 221, 136, 3, 238, + 252, 114, 1, 218, 55, 3, 238, 252, 114, 1, 225, 217, 3, 238, 252, 114, 1, + 225, 217, 3, 238, 250, 226, 41, 26, 57, 114, 1, 209, 81, 3, 238, 252, + 114, 1, 209, 81, 3, 76, 60, 114, 1, 221, 136, 209, 80, 114, 1, 218, 55, + 209, 80, 114, 1, 225, 217, 209, 80, 114, 1, 209, 81, 209, 80, 114, 1, + 221, 136, 218, 55, 209, 80, 114, 1, 218, 55, 221, 136, 209, 80, 114, 1, + 225, 217, 221, 136, 209, 80, 114, 1, 209, 81, 225, 217, 209, 80, 114, 1, + 225, 217, 209, 81, 3, 238, 252, 114, 1, 225, 217, 218, 54, 114, 1, 225, + 217, 218, 55, 209, 80, 114, 1, 209, 81, 203, 216, 114, 1, 209, 81, 203, + 217, 144, 114, 1, 209, 81, 214, 2, 114, 1, 209, 81, 214, 3, 144, 114, 1, + 203, 217, 209, 80, 114, 1, 203, 217, 211, 31, 209, 80, 114, 1, 197, 199, + 114, 1, 197, 81, 114, 1, 197, 200, 144, 114, 1, 209, 81, 218, 54, 114, 1, + 209, 81, 221, 135, 114, 1, 225, 80, 211, 31, 209, 80, 114, 1, 234, 190, + 211, 31, 209, 80, 114, 1, 209, 81, 225, 79, 114, 1, 209, 81, 225, 80, + 144, 114, 1, 63, 114, 1, 205, 234, 214, 15, 114, 1, 214, 189, 114, 1, 72, + 114, 1, 251, 46, 114, 1, 68, 114, 1, 69, 114, 1, 226, 146, 114, 1, 206, + 182, 68, 114, 1, 200, 90, 114, 1, 237, 53, 114, 1, 205, 234, 237, 39, + 114, 1, 209, 207, 68, 114, 1, 205, 234, 237, 53, 114, 1, 181, 68, 114, 1, + 196, 69, 114, 1, 66, 114, 1, 236, 115, 114, 1, 196, 171, 114, 1, 118, + 218, 54, 114, 1, 181, 66, 114, 1, 209, 207, 66, 114, 1, 200, 92, 114, 1, + 205, 234, 66, 114, 1, 214, 98, 114, 1, 214, 15, 114, 1, 214, 38, 114, 1, + 197, 166, 114, 1, 197, 34, 114, 1, 197, 70, 114, 1, 197, 96, 114, 1, 197, + 1, 114, 1, 217, 208, 66, 114, 1, 217, 208, 72, 114, 1, 217, 208, 68, 114, + 1, 217, 208, 63, 114, 1, 213, 33, 251, 105, 114, 1, 213, 33, 251, 122, + 114, 1, 205, 234, 236, 229, 114, 1, 205, 234, 251, 105, 114, 1, 205, 234, + 214, 118, 114, 1, 110, 221, 135, 114, 251, 223, 50, 231, 154, 208, 137, + 114, 251, 223, 219, 64, 231, 154, 208, 137, 114, 251, 223, 53, 231, 154, + 208, 137, 114, 251, 223, 126, 83, 208, 137, 114, 251, 223, 219, 64, 83, + 208, 137, 114, 251, 223, 130, 83, 208, 137, 114, 251, 223, 250, 155, 208, + 137, 114, 251, 223, 250, 155, 222, 174, 208, 137, 114, 251, 223, 250, + 155, 203, 109, 114, 251, 223, 250, 155, 203, 135, 114, 251, 223, 250, + 155, 237, 135, 122, 114, 251, 223, 250, 155, 230, 248, 122, 114, 251, + 223, 250, 155, 203, 110, 122, 114, 251, 223, 130, 186, 114, 251, 223, + 130, 202, 101, 186, 114, 251, 223, 130, 233, 99, 114, 251, 223, 130, 181, + 233, 99, 114, 251, 223, 130, 238, 252, 114, 251, 223, 130, 244, 248, 114, + 251, 223, 130, 222, 74, 114, 251, 223, 130, 197, 122, 114, 251, 223, 130, + 199, 100, 114, 251, 223, 126, 186, 114, 251, 223, 126, 202, 101, 186, + 114, 251, 223, 126, 233, 99, 114, 251, 223, 126, 181, 233, 99, 114, 251, + 223, 126, 238, 252, 114, 251, 223, 126, 244, 248, 114, 251, 223, 126, + 222, 74, 114, 251, 223, 126, 197, 122, 114, 251, 223, 126, 199, 100, 114, + 251, 223, 126, 51, 114, 2, 177, 3, 241, 60, 114, 202, 193, 1, 208, 114, + 114, 52, 78, 114, 211, 213, 245, 58, 234, 216, 204, 226, 206, 169, 235, + 22, 1, 214, 22, 206, 169, 235, 22, 241, 126, 214, 22, 206, 169, 235, 22, + 135, 204, 241, 206, 169, 235, 22, 124, 204, 241, 67, 34, 16, 211, 230, + 67, 34, 16, 240, 66, 67, 34, 16, 213, 37, 67, 34, 16, 214, 11, 237, 10, + 67, 34, 16, 214, 11, 239, 89, 67, 34, 16, 199, 136, 237, 10, 67, 34, 16, + 199, 136, 239, 89, 67, 34, 16, 224, 229, 67, 34, 16, 203, 233, 67, 34, + 16, 213, 146, 67, 34, 16, 195, 223, 67, 34, 16, 195, 224, 239, 89, 67, + 34, 16, 223, 204, 67, 34, 16, 251, 41, 237, 10, 67, 34, 16, 236, 83, 237, + 10, 67, 34, 16, 203, 35, 67, 34, 16, 224, 177, 67, 34, 16, 251, 30, 67, + 34, 16, 251, 31, 239, 89, 67, 34, 16, 203, 240, 67, 34, 16, 202, 172, 67, + 34, 16, 214, 129, 250, 248, 67, 34, 16, 233, 126, 250, 248, 67, 34, 16, + 211, 229, 67, 34, 16, 247, 6, 67, 34, 16, 199, 125, 67, 34, 16, 225, 238, + 250, 248, 67, 34, 16, 224, 179, 250, 248, 67, 34, 16, 224, 178, 250, 248, + 67, 34, 16, 208, 182, 67, 34, 16, 213, 136, 67, 34, 16, 204, 251, 251, + 34, 67, 34, 16, 214, 10, 250, 248, 67, 34, 16, 199, 135, 250, 248, 67, + 34, 16, 251, 35, 250, 248, 67, 34, 16, 251, 28, 67, 34, 16, 224, 26, 67, + 34, 16, 210, 85, 67, 34, 16, 212, 217, 250, 248, 67, 34, 16, 202, 74, 67, + 34, 16, 251, 102, 67, 34, 16, 208, 117, 67, 34, 16, 203, 244, 250, 248, + 67, 34, 16, 203, 244, 219, 143, 204, 249, 67, 34, 16, 214, 5, 250, 248, + 67, 34, 16, 202, 211, 67, 34, 16, 222, 161, 67, 34, 16, 237, 158, 67, 34, + 16, 201, 182, 67, 34, 16, 203, 4, 67, 34, 16, 223, 207, 67, 34, 16, 251, + 41, 236, 83, 217, 96, 67, 34, 16, 234, 224, 250, 248, 67, 34, 16, 226, + 98, 67, 34, 16, 201, 151, 250, 248, 67, 34, 16, 224, 232, 201, 150, 67, + 34, 16, 213, 66, 67, 34, 16, 211, 234, 67, 34, 16, 223, 242, 67, 34, 16, + 245, 41, 250, 248, 67, 34, 16, 210, 202, 67, 34, 16, 213, 149, 250, 248, + 67, 34, 16, 213, 147, 250, 248, 67, 34, 16, 230, 198, 67, 34, 16, 217, + 219, 67, 34, 16, 213, 15, 67, 34, 16, 223, 243, 251, 140, 67, 34, 16, + 201, 151, 251, 140, 67, 34, 16, 204, 220, 67, 34, 16, 233, 85, 67, 34, + 16, 225, 238, 217, 96, 67, 34, 16, 214, 129, 217, 96, 67, 34, 16, 214, + 11, 217, 96, 67, 34, 16, 213, 14, 67, 34, 16, 223, 227, 67, 34, 16, 213, + 13, 67, 34, 16, 223, 206, 67, 34, 16, 213, 67, 217, 96, 67, 34, 16, 224, + 178, 217, 97, 251, 72, 67, 34, 16, 224, 179, 217, 97, 251, 72, 67, 34, + 16, 195, 221, 67, 34, 16, 251, 31, 217, 96, 67, 34, 16, 251, 32, 203, + 241, 217, 96, 67, 34, 16, 195, 222, 67, 34, 16, 223, 205, 67, 34, 16, + 237, 5, 67, 34, 16, 247, 7, 67, 34, 16, 219, 35, 225, 237, 67, 34, 16, + 199, 136, 217, 96, 67, 34, 16, 212, 217, 217, 96, 67, 34, 16, 211, 235, + 217, 96, 67, 34, 16, 214, 125, 67, 34, 16, 251, 59, 67, 34, 16, 221, 146, + 67, 34, 16, 213, 147, 217, 96, 67, 34, 16, 213, 149, 217, 96, 67, 34, 16, + 236, 121, 213, 148, 67, 34, 16, 223, 103, 67, 34, 16, 251, 60, 67, 34, + 16, 201, 151, 217, 96, 67, 34, 16, 237, 8, 67, 34, 16, 203, 244, 217, 96, + 67, 34, 16, 203, 234, 67, 34, 16, 245, 41, 217, 96, 67, 34, 16, 236, 179, + 67, 34, 16, 208, 118, 217, 96, 67, 34, 16, 196, 188, 224, 26, 67, 34, 16, + 201, 148, 67, 34, 16, 211, 236, 67, 34, 16, 201, 152, 67, 34, 16, 201, + 149, 67, 34, 16, 211, 233, 67, 34, 16, 201, 147, 67, 34, 16, 211, 232, + 67, 34, 16, 233, 125, 67, 34, 16, 250, 240, 67, 34, 16, 236, 121, 250, + 240, 67, 34, 16, 214, 5, 217, 96, 67, 34, 16, 202, 210, 236, 134, 67, 34, + 16, 202, 210, 236, 82, 67, 34, 16, 202, 212, 251, 36, 67, 34, 16, 202, + 204, 225, 31, 251, 27, 67, 34, 16, 224, 231, 67, 34, 16, 236, 216, 67, + 34, 16, 196, 28, 224, 228, 67, 34, 16, 196, 28, 251, 72, 67, 34, 16, 204, + 250, 67, 34, 16, 224, 27, 251, 72, 67, 34, 16, 239, 90, 250, 248, 67, 34, + 16, 223, 208, 250, 248, 67, 34, 16, 223, 208, 251, 140, 67, 34, 16, 223, + 208, 217, 96, 67, 34, 16, 251, 35, 217, 96, 67, 34, 16, 251, 37, 67, 34, + 16, 239, 89, 67, 34, 16, 201, 163, 67, 34, 16, 202, 250, 67, 34, 16, 223, + 231, 67, 34, 16, 222, 166, 236, 209, 245, 31, 67, 34, 16, 222, 166, 237, + 159, 245, 32, 67, 34, 16, 222, 166, 201, 166, 245, 32, 67, 34, 16, 222, + 166, 203, 6, 245, 32, 67, 34, 16, 222, 166, 226, 93, 245, 31, 67, 34, 16, + 233, 126, 217, 97, 251, 72, 67, 34, 16, 233, 126, 213, 137, 250, 236, 67, + 34, 16, 233, 126, 213, 137, 239, 180, 67, 34, 16, 239, 114, 67, 34, 16, + 239, 115, 213, 137, 250, 237, 224, 228, 67, 34, 16, 239, 115, 213, 137, + 250, 237, 251, 72, 67, 34, 16, 239, 115, 213, 137, 239, 180, 67, 34, 16, + 201, 171, 67, 34, 16, 250, 241, 67, 34, 16, 226, 100, 67, 34, 16, 239, + 137, 67, 34, 16, 251, 210, 212, 99, 250, 242, 67, 34, 16, 251, 210, 250, + 239, 67, 34, 16, 251, 210, 250, 242, 67, 34, 16, 251, 210, 219, 137, 67, + 34, 16, 251, 210, 219, 148, 67, 34, 16, 251, 210, 233, 127, 67, 34, 16, + 251, 210, 233, 124, 67, 34, 16, 251, 210, 212, 99, 233, 127, 67, 34, 16, + 220, 17, 211, 242, 230, 196, 67, 34, 16, 220, 17, 251, 142, 211, 242, + 230, 196, 67, 34, 16, 220, 17, 239, 179, 230, 196, 67, 34, 16, 220, 17, + 251, 142, 239, 179, 230, 196, 67, 34, 16, 220, 17, 201, 158, 230, 196, + 67, 34, 16, 220, 17, 201, 172, 67, 34, 16, 220, 17, 202, 255, 230, 196, + 67, 34, 16, 220, 17, 202, 255, 222, 170, 230, 196, 67, 34, 16, 220, 17, + 222, 170, 230, 196, 67, 34, 16, 220, 17, 212, 145, 230, 196, 67, 34, 16, + 225, 245, 203, 28, 230, 197, 67, 34, 16, 251, 32, 203, 28, 230, 197, 67, + 34, 16, 235, 208, 202, 252, 67, 34, 16, 235, 208, 218, 205, 67, 34, 16, + 235, 208, 239, 120, 67, 34, 16, 220, 17, 199, 129, 230, 196, 67, 34, 16, + 220, 17, 211, 241, 230, 196, 67, 34, 16, 220, 17, 212, 145, 202, 255, + 230, 196, 67, 34, 16, 233, 121, 218, 55, 251, 36, 67, 34, 16, 233, 121, + 218, 55, 239, 88, 67, 34, 16, 236, 227, 225, 31, 234, 224, 198, 228, 67, + 34, 16, 226, 99, 67, 34, 16, 226, 97, 67, 34, 16, 234, 224, 250, 249, + 239, 178, 230, 195, 67, 34, 16, 234, 224, 239, 135, 161, 67, 34, 16, 234, + 224, 239, 135, 217, 219, 67, 34, 16, 234, 224, 217, 213, 230, 196, 67, + 34, 16, 234, 224, 239, 135, 239, 151, 67, 34, 16, 234, 224, 206, 0, 239, + 134, 239, 151, 67, 34, 16, 234, 224, 239, 135, 224, 208, 67, 34, 16, 234, + 224, 239, 135, 195, 11, 67, 34, 16, 234, 224, 239, 135, 216, 223, 224, + 228, 67, 34, 16, 234, 224, 239, 135, 216, 223, 251, 72, 67, 34, 16, 234, + 224, 220, 67, 245, 33, 239, 120, 67, 34, 16, 234, 224, 220, 67, 245, 33, + 218, 205, 67, 34, 16, 235, 153, 206, 0, 245, 33, 199, 128, 67, 34, 16, + 234, 224, 206, 0, 245, 33, 203, 245, 67, 34, 16, 234, 224, 217, 99, 67, + 34, 16, 245, 34, 194, 234, 67, 34, 16, 245, 34, 224, 25, 67, 34, 16, 245, + 34, 205, 139, 67, 34, 16, 234, 224, 230, 248, 196, 27, 203, 0, 67, 34, + 16, 234, 224, 236, 228, 251, 61, 67, 34, 16, 196, 27, 201, 159, 67, 34, + 16, 239, 128, 201, 159, 67, 34, 16, 239, 128, 203, 0, 67, 34, 16, 239, + 128, 251, 38, 237, 159, 239, 19, 67, 34, 16, 239, 128, 218, 203, 203, 5, + 239, 19, 67, 34, 16, 239, 128, 239, 111, 236, 95, 239, 19, 67, 34, 16, + 239, 128, 201, 169, 214, 135, 239, 19, 67, 34, 16, 196, 27, 251, 38, 237, + 159, 239, 19, 67, 34, 16, 196, 27, 218, 203, 203, 5, 239, 19, 67, 34, 16, + 196, 27, 239, 111, 236, 95, 239, 19, 67, 34, 16, 196, 27, 201, 169, 214, + 135, 239, 19, 67, 34, 16, 234, 29, 239, 127, 67, 34, 16, 234, 29, 196, + 26, 67, 34, 16, 239, 136, 251, 38, 219, 36, 67, 34, 16, 239, 136, 251, + 38, 219, 178, 67, 34, 16, 239, 136, 239, 89, 67, 34, 16, 239, 136, 202, + 202, 67, 34, 16, 206, 72, 202, 202, 67, 34, 16, 206, 72, 202, 203, 239, + 73, 67, 34, 16, 206, 72, 202, 203, 201, 160, 67, 34, 16, 206, 72, 202, + 203, 202, 248, 67, 34, 16, 206, 72, 250, 210, 67, 34, 16, 206, 72, 250, + 211, 239, 73, 67, 34, 16, 206, 72, 250, 211, 201, 160, 67, 34, 16, 206, + 72, 250, 211, 202, 248, 67, 34, 16, 239, 112, 234, 10, 67, 34, 16, 239, + 119, 214, 38, 67, 34, 16, 204, 236, 67, 34, 16, 250, 233, 161, 67, 34, + 16, 250, 233, 198, 228, 67, 34, 16, 250, 233, 234, 122, 67, 34, 16, 250, + 233, 239, 151, 67, 34, 16, 250, 233, 224, 208, 67, 34, 16, 250, 233, 195, + 11, 67, 34, 16, 250, 233, 216, 222, 67, 34, 16, 224, 178, 217, 97, 219, + 147, 67, 34, 16, 224, 179, 217, 97, 219, 147, 67, 34, 16, 224, 178, 217, + 97, 224, 228, 67, 34, 16, 224, 179, 217, 97, 224, 228, 67, 34, 16, 224, + 27, 224, 228, 67, 34, 16, 233, 126, 217, 97, 224, 228, 34, 16, 206, 62, + 249, 74, 34, 16, 52, 249, 74, 34, 16, 48, 249, 74, 34, 16, 210, 90, 48, + 249, 74, 34, 16, 240, 63, 249, 74, 34, 16, 206, 182, 249, 74, 34, 16, 50, + 210, 120, 55, 34, 16, 53, 210, 120, 55, 34, 16, 210, 120, 238, 249, 34, + 16, 240, 107, 208, 121, 34, 16, 240, 136, 247, 121, 34, 16, 208, 121, 34, + 16, 244, 175, 34, 16, 210, 118, 235, 141, 34, 16, 210, 118, 235, 140, 34, + 16, 210, 118, 235, 139, 34, 16, 235, 163, 34, 16, 235, 164, 60, 34, 16, + 248, 48, 78, 34, 16, 247, 163, 34, 16, 248, 62, 34, 16, 179, 34, 16, 214, + 113, 205, 16, 34, 16, 200, 214, 205, 16, 34, 16, 202, 149, 205, 16, 34, + 16, 235, 5, 205, 16, 34, 16, 235, 99, 205, 16, 34, 16, 206, 28, 205, 16, + 34, 16, 206, 26, 234, 241, 34, 16, 235, 3, 234, 241, 34, 16, 234, 190, + 244, 217, 34, 16, 234, 190, 244, 218, 214, 42, 251, 131, 34, 16, 234, + 190, 244, 218, 214, 42, 249, 57, 34, 16, 247, 207, 244, 217, 34, 16, 236, + 49, 244, 217, 34, 16, 236, 49, 244, 218, 214, 42, 251, 131, 34, 16, 236, + 49, 244, 218, 214, 42, 249, 57, 34, 16, 237, 206, 244, 216, 34, 16, 237, + 206, 244, 215, 34, 16, 218, 119, 219, 202, 210, 101, 34, 16, 52, 207, 12, + 34, 16, 52, 235, 81, 34, 16, 235, 82, 200, 36, 34, 16, 235, 82, 237, 234, + 34, 16, 217, 202, 200, 36, 34, 16, 217, 202, 237, 234, 34, 16, 207, 13, + 200, 36, 34, 16, 207, 13, 237, 234, 34, 16, 211, 87, 152, 207, 12, 34, + 16, 211, 87, 152, 235, 81, 34, 16, 244, 155, 202, 78, 34, 16, 241, 1, + 202, 78, 34, 16, 214, 42, 251, 131, 34, 16, 214, 42, 249, 57, 34, 16, + 211, 68, 251, 131, 34, 16, 211, 68, 249, 57, 34, 16, 218, 122, 210, 101, + 34, 16, 197, 71, 210, 101, 34, 16, 157, 210, 101, 34, 16, 211, 87, 210, + 101, 34, 16, 237, 26, 210, 101, 34, 16, 206, 22, 210, 101, 34, 16, 202, + 174, 210, 101, 34, 16, 206, 12, 210, 101, 34, 16, 97, 231, 57, 200, 232, + 210, 101, 34, 16, 196, 223, 216, 8, 34, 16, 98, 216, 8, 34, 16, 244, 249, + 196, 223, 216, 8, 34, 16, 47, 216, 9, 197, 73, 34, 16, 47, 216, 9, 248, + 135, 34, 16, 201, 181, 216, 9, 124, 197, 73, 34, 16, 201, 181, 216, 9, + 124, 248, 135, 34, 16, 201, 181, 216, 9, 50, 197, 73, 34, 16, 201, 181, + 216, 9, 50, 248, 135, 34, 16, 201, 181, 216, 9, 53, 197, 73, 34, 16, 201, + 181, 216, 9, 53, 248, 135, 34, 16, 201, 181, 216, 9, 135, 197, 73, 34, + 16, 201, 181, 216, 9, 135, 248, 135, 34, 16, 201, 181, 216, 9, 124, 53, + 197, 73, 34, 16, 201, 181, 216, 9, 124, 53, 248, 135, 34, 16, 218, 189, + 216, 9, 197, 73, 34, 16, 218, 189, 216, 9, 248, 135, 34, 16, 201, 178, + 216, 9, 135, 197, 73, 34, 16, 201, 178, 216, 9, 135, 248, 135, 34, 16, + 213, 140, 216, 8, 34, 16, 198, 241, 216, 8, 34, 16, 216, 9, 248, 135, 34, + 16, 215, 146, 216, 8, 34, 16, 244, 186, 216, 9, 197, 73, 34, 16, 244, + 186, 216, 9, 248, 135, 34, 16, 248, 46, 34, 16, 197, 71, 216, 12, 34, 16, + 157, 216, 12, 34, 16, 211, 87, 216, 12, 34, 16, 237, 26, 216, 12, 34, 16, + 206, 22, 216, 12, 34, 16, 202, 174, 216, 12, 34, 16, 206, 12, 216, 12, + 34, 16, 97, 231, 57, 200, 232, 216, 12, 34, 16, 38, 204, 243, 34, 16, 38, + 205, 101, 204, 243, 34, 16, 38, 201, 189, 34, 16, 38, 201, 188, 34, 16, + 38, 201, 187, 34, 16, 235, 124, 201, 189, 34, 16, 235, 124, 201, 188, 34, + 16, 235, 124, 201, 187, 34, 16, 38, 250, 146, 238, 252, 34, 16, 38, 235, + 91, 34, 16, 38, 235, 90, 34, 16, 38, 235, 89, 34, 16, 38, 235, 88, 34, + 16, 38, 235, 87, 34, 16, 248, 242, 249, 5, 34, 16, 236, 221, 249, 5, 34, + 16, 248, 242, 202, 107, 34, 16, 236, 221, 202, 107, 34, 16, 248, 242, + 205, 225, 34, 16, 236, 221, 205, 225, 34, 16, 248, 242, 212, 226, 34, 16, + 236, 221, 212, 226, 34, 16, 38, 252, 21, 34, 16, 38, 205, 20, 34, 16, 38, + 203, 11, 34, 16, 38, 205, 21, 34, 16, 38, 220, 32, 34, 16, 38, 220, 31, + 34, 16, 38, 252, 20, 34, 16, 38, 221, 209, 34, 16, 250, 222, 200, 36, 34, + 16, 250, 222, 237, 234, 34, 16, 38, 239, 12, 34, 16, 38, 209, 254, 34, + 16, 38, 235, 70, 34, 16, 38, 205, 221, 34, 16, 38, 248, 220, 34, 16, 38, + 52, 201, 249, 34, 16, 38, 201, 165, 201, 249, 34, 16, 210, 4, 34, 16, + 204, 154, 34, 16, 195, 158, 34, 16, 212, 218, 34, 16, 219, 128, 34, 16, + 235, 17, 34, 16, 241, 72, 34, 16, 239, 237, 34, 16, 233, 116, 216, 13, + 205, 248, 34, 16, 233, 116, 216, 13, 216, 50, 205, 248, 34, 16, 201, 218, + 34, 16, 201, 4, 34, 16, 226, 16, 201, 4, 34, 16, 201, 5, 205, 248, 34, + 16, 201, 5, 200, 36, 34, 16, 214, 59, 204, 195, 34, 16, 214, 59, 204, + 192, 34, 16, 214, 59, 204, 191, 34, 16, 214, 59, 204, 190, 34, 16, 214, + 59, 204, 189, 34, 16, 214, 59, 204, 188, 34, 16, 214, 59, 204, 187, 34, + 16, 214, 59, 204, 186, 34, 16, 214, 59, 204, 185, 34, 16, 214, 59, 204, + 194, 34, 16, 214, 59, 204, 193, 34, 16, 232, 156, 34, 16, 217, 109, 34, + 16, 236, 221, 77, 204, 232, 34, 16, 239, 230, 205, 248, 34, 16, 38, 135, + 248, 76, 34, 16, 38, 124, 248, 76, 34, 16, 38, 232, 169, 34, 16, 38, 205, + 211, 212, 150, 34, 16, 213, 83, 78, 34, 16, 213, 83, 124, 78, 34, 16, + 157, 213, 83, 78, 34, 16, 233, 153, 200, 36, 34, 16, 233, 153, 237, 234, + 34, 16, 3, 235, 123, 34, 16, 240, 90, 34, 16, 240, 91, 251, 145, 34, 16, + 219, 252, 34, 16, 221, 230, 34, 16, 248, 43, 34, 16, 207, 109, 197, 73, + 34, 16, 207, 109, 248, 135, 34, 16, 219, 18, 34, 16, 219, 19, 248, 135, + 34, 16, 207, 103, 197, 73, 34, 16, 207, 103, 248, 135, 34, 16, 234, 207, + 197, 73, 34, 16, 234, 207, 248, 135, 34, 16, 221, 231, 213, 42, 210, 101, + 34, 16, 221, 231, 226, 90, 210, 101, 34, 16, 248, 44, 210, 101, 34, 16, + 207, 109, 210, 101, 34, 16, 219, 19, 210, 101, 34, 16, 207, 103, 210, + 101, 34, 16, 203, 25, 213, 40, 241, 31, 211, 252, 213, 41, 34, 16, 203, + 25, 213, 40, 241, 31, 211, 252, 226, 89, 34, 16, 203, 25, 213, 40, 241, + 31, 211, 252, 213, 42, 239, 99, 34, 16, 203, 25, 226, 88, 241, 31, 211, + 252, 213, 41, 34, 16, 203, 25, 226, 88, 241, 31, 211, 252, 226, 89, 34, + 16, 203, 25, 226, 88, 241, 31, 211, 252, 226, 90, 239, 99, 34, 16, 203, + 25, 226, 88, 241, 31, 211, 252, 226, 90, 239, 98, 34, 16, 203, 25, 226, + 88, 241, 31, 211, 252, 226, 90, 239, 97, 34, 16, 241, 63, 34, 16, 233, + 88, 247, 207, 244, 217, 34, 16, 233, 88, 236, 49, 244, 217, 34, 16, 47, + 250, 111, 34, 16, 199, 6, 34, 16, 212, 113, 34, 16, 244, 207, 34, 16, + 208, 172, 34, 16, 244, 212, 34, 16, 201, 236, 34, 16, 212, 81, 34, 16, + 212, 82, 235, 73, 34, 16, 208, 173, 235, 73, 34, 16, 201, 237, 210, 98, + 34, 16, 213, 23, 204, 144, 34, 16, 224, 82, 247, 207, 244, 217, 34, 16, + 224, 82, 236, 221, 77, 212, 211, 34, 16, 224, 82, 48, 216, 12, 34, 16, + 224, 82, 210, 169, 78, 34, 16, 224, 82, 197, 71, 216, 12, 34, 16, 224, + 82, 157, 216, 12, 34, 16, 224, 82, 211, 87, 216, 13, 204, 244, 237, 234, + 34, 16, 224, 82, 211, 87, 216, 13, 204, 244, 200, 36, 34, 16, 224, 82, + 237, 26, 216, 13, 204, 244, 237, 234, 34, 16, 224, 82, 237, 26, 216, 13, + 204, 244, 200, 36, 34, 16, 224, 82, 235, 82, 55, 32, 198, 247, 216, 16, + 204, 40, 32, 198, 247, 216, 16, 204, 29, 32, 198, 247, 216, 16, 204, 19, + 32, 198, 247, 216, 16, 204, 12, 32, 198, 247, 216, 16, 204, 4, 32, 198, + 247, 216, 16, 203, 254, 32, 198, 247, 216, 16, 203, 253, 32, 198, 247, + 216, 16, 203, 252, 32, 198, 247, 216, 16, 203, 251, 32, 198, 247, 216, + 16, 204, 39, 32, 198, 247, 216, 16, 204, 38, 32, 198, 247, 216, 16, 204, + 37, 32, 198, 247, 216, 16, 204, 36, 32, 198, 247, 216, 16, 204, 35, 32, + 198, 247, 216, 16, 204, 34, 32, 198, 247, 216, 16, 204, 33, 32, 198, 247, + 216, 16, 204, 32, 32, 198, 247, 216, 16, 204, 31, 32, 198, 247, 216, 16, + 204, 30, 32, 198, 247, 216, 16, 204, 28, 32, 198, 247, 216, 16, 204, 27, + 32, 198, 247, 216, 16, 204, 26, 32, 198, 247, 216, 16, 204, 25, 32, 198, + 247, 216, 16, 204, 24, 32, 198, 247, 216, 16, 204, 3, 32, 198, 247, 216, + 16, 204, 2, 32, 198, 247, 216, 16, 204, 1, 32, 198, 247, 216, 16, 204, 0, + 32, 198, 247, 216, 16, 203, 255, 32, 226, 39, 216, 16, 204, 40, 32, 226, + 39, 216, 16, 204, 29, 32, 226, 39, 216, 16, 204, 12, 32, 226, 39, 216, + 16, 204, 4, 32, 226, 39, 216, 16, 203, 253, 32, 226, 39, 216, 16, 203, + 252, 32, 226, 39, 216, 16, 204, 38, 32, 226, 39, 216, 16, 204, 37, 32, + 226, 39, 216, 16, 204, 36, 32, 226, 39, 216, 16, 204, 35, 32, 226, 39, + 216, 16, 204, 32, 32, 226, 39, 216, 16, 204, 31, 32, 226, 39, 216, 16, + 204, 30, 32, 226, 39, 216, 16, 204, 25, 32, 226, 39, 216, 16, 204, 24, + 32, 226, 39, 216, 16, 204, 23, 32, 226, 39, 216, 16, 204, 22, 32, 226, + 39, 216, 16, 204, 21, 32, 226, 39, 216, 16, 204, 20, 32, 226, 39, 216, + 16, 204, 18, 32, 226, 39, 216, 16, 204, 17, 32, 226, 39, 216, 16, 204, + 16, 32, 226, 39, 216, 16, 204, 15, 32, 226, 39, 216, 16, 204, 14, 32, + 226, 39, 216, 16, 204, 13, 32, 226, 39, 216, 16, 204, 11, 32, 226, 39, + 216, 16, 204, 10, 32, 226, 39, 216, 16, 204, 9, 32, 226, 39, 216, 16, + 204, 8, 32, 226, 39, 216, 16, 204, 7, 32, 226, 39, 216, 16, 204, 6, 32, + 226, 39, 216, 16, 204, 5, 32, 226, 39, 216, 16, 204, 3, 32, 226, 39, 216, + 16, 204, 2, 32, 226, 39, 216, 16, 204, 1, 32, 226, 39, 216, 16, 204, 0, + 32, 226, 39, 216, 16, 203, 255, 38, 32, 34, 201, 161, 38, 32, 34, 202, + 249, 38, 32, 34, 213, 52, 32, 34, 222, 165, 219, 249, 215, 141, 195, 79, + 219, 249, 215, 141, 100, 219, 249, 215, 141, 102, 219, 249, 215, 141, + 134, 219, 249, 215, 141, 136, 219, 249, 215, 141, 146, 219, 249, 215, + 141, 167, 219, 249, 215, 141, 178, 219, 249, 215, 141, 171, 219, 249, + 215, 141, 182, 219, 249, 215, 141, 203, 23, 219, 249, 215, 141, 236, 251, + 219, 249, 215, 141, 200, 239, 219, 249, 215, 141, 202, 179, 219, 249, + 215, 141, 235, 0, 219, 249, 215, 141, 235, 148, 219, 249, 215, 141, 206, + 23, 219, 249, 215, 141, 207, 68, 219, 249, 215, 141, 237, 27, 219, 249, + 215, 141, 216, 175, 218, 204, 36, 237, 71, 239, 113, 36, 232, 120, 237, + 71, 239, 113, 36, 231, 61, 237, 71, 239, 113, 36, 237, 70, 232, 121, 239, + 113, 36, 237, 70, 231, 60, 239, 113, 36, 237, 71, 202, 251, 36, 247, 35, + 202, 251, 36, 234, 216, 244, 248, 202, 251, 36, 219, 10, 202, 251, 36, + 249, 69, 202, 251, 36, 224, 196, 205, 224, 202, 251, 36, 241, 121, 202, + 251, 36, 250, 196, 202, 251, 36, 214, 77, 202, 251, 36, 248, 54, 214, 33, + 202, 251, 36, 239, 232, 214, 72, 239, 65, 202, 251, 36, 239, 62, 202, + 251, 36, 195, 229, 202, 251, 36, 226, 76, 202, 251, 36, 213, 62, 202, + 251, 36, 210, 177, 202, 251, 36, 241, 133, 202, 251, 36, 231, 175, 249, + 137, 202, 251, 36, 197, 152, 202, 251, 36, 235, 45, 202, 251, 36, 251, + 247, 202, 251, 36, 210, 133, 202, 251, 36, 210, 105, 202, 251, 36, 237, + 69, 202, 251, 36, 225, 112, 202, 251, 36, 241, 128, 202, 251, 36, 236, + 219, 202, 251, 36, 237, 171, 202, 251, 36, 247, 2, 202, 251, 36, 239, + 242, 202, 251, 36, 27, 210, 104, 202, 251, 36, 213, 233, 202, 251, 36, + 222, 169, 202, 251, 36, 244, 200, 202, 251, 36, 224, 70, 202, 251, 36, + 234, 71, 202, 251, 36, 204, 207, 202, 251, 36, 211, 201, 202, 251, 36, + 234, 215, 202, 251, 36, 210, 106, 202, 251, 36, 222, 209, 214, 72, 218, + 240, 202, 251, 36, 210, 102, 202, 251, 36, 233, 136, 202, 30, 219, 182, + 202, 251, 36, 236, 222, 202, 251, 36, 204, 221, 202, 251, 36, 233, 91, + 202, 251, 36, 236, 212, 202, 251, 36, 213, 109, 202, 251, 36, 209, 247, + 202, 251, 36, 235, 71, 202, 251, 36, 199, 127, 214, 72, 197, 131, 202, + 251, 36, 241, 138, 202, 251, 36, 219, 201, 202, 251, 36, 236, 122, 202, + 251, 36, 200, 47, 202, 251, 36, 239, 100, 202, 251, 36, 244, 202, 218, + 163, 202, 251, 36, 233, 67, 202, 251, 36, 234, 72, 226, 85, 202, 251, 36, + 220, 5, 202, 251, 36, 252, 16, 202, 251, 36, 236, 238, 202, 251, 36, 237, + 238, 202, 251, 36, 197, 129, 202, 251, 36, 206, 57, 202, 251, 36, 226, + 49, 202, 251, 36, 239, 199, 202, 251, 36, 240, 68, 202, 251, 36, 239, 96, + 202, 251, 36, 236, 86, 202, 251, 36, 207, 64, 202, 251, 36, 204, 225, + 202, 251, 36, 232, 171, 202, 251, 36, 244, 150, 202, 251, 36, 244, 197, + 202, 251, 36, 235, 217, 202, 251, 36, 251, 211, 202, 251, 36, 244, 149, + 202, 251, 36, 214, 119, 202, 218, 199, 103, 202, 251, 36, 239, 122, 202, + 251, 36, 223, 69, 202, 251, 36, 235, 9, 241, 87, 209, 216, 200, 50, 17, + 100, 241, 87, 209, 216, 200, 50, 17, 102, 241, 87, 209, 216, 200, 50, 17, + 134, 241, 87, 209, 216, 200, 50, 17, 136, 241, 87, 209, 216, 200, 50, 17, + 146, 241, 87, 209, 216, 200, 50, 17, 167, 241, 87, 209, 216, 200, 50, 17, + 178, 241, 87, 209, 216, 200, 50, 17, 171, 241, 87, 209, 216, 200, 50, 17, + 182, 241, 87, 209, 216, 203, 19, 17, 100, 241, 87, 209, 216, 203, 19, 17, + 102, 241, 87, 209, 216, 203, 19, 17, 134, 241, 87, 209, 216, 203, 19, 17, + 136, 241, 87, 209, 216, 203, 19, 17, 146, 241, 87, 209, 216, 203, 19, 17, + 167, 241, 87, 209, 216, 203, 19, 17, 178, 241, 87, 209, 216, 203, 19, 17, + 171, 241, 87, 209, 216, 203, 19, 17, 182, 143, 203, 118, 117, 100, 143, + 203, 118, 117, 102, 143, 203, 118, 117, 134, 143, 203, 118, 117, 136, + 143, 203, 118, 117, 146, 203, 118, 117, 100, 203, 118, 117, 146, 13, 27, + 6, 63, 13, 27, 6, 250, 111, 13, 27, 6, 247, 206, 13, 27, 6, 240, 230, 13, + 27, 6, 69, 13, 27, 6, 236, 48, 13, 27, 6, 234, 189, 13, 27, 6, 233, 14, + 13, 27, 6, 68, 13, 27, 6, 225, 216, 13, 27, 6, 225, 79, 13, 27, 6, 159, + 13, 27, 6, 221, 135, 13, 27, 6, 218, 54, 13, 27, 6, 72, 13, 27, 6, 214, + 2, 13, 27, 6, 211, 166, 13, 27, 6, 144, 13, 27, 6, 209, 80, 13, 27, 6, + 203, 216, 13, 27, 6, 66, 13, 27, 6, 199, 230, 13, 27, 6, 197, 199, 13, + 27, 6, 196, 222, 13, 27, 6, 196, 148, 13, 27, 6, 195, 158, 13, 27, 4, 63, + 13, 27, 4, 250, 111, 13, 27, 4, 247, 206, 13, 27, 4, 240, 230, 13, 27, 4, + 69, 13, 27, 4, 236, 48, 13, 27, 4, 234, 189, 13, 27, 4, 233, 14, 13, 27, + 4, 68, 13, 27, 4, 225, 216, 13, 27, 4, 225, 79, 13, 27, 4, 159, 13, 27, + 4, 221, 135, 13, 27, 4, 218, 54, 13, 27, 4, 72, 13, 27, 4, 214, 2, 13, + 27, 4, 211, 166, 13, 27, 4, 144, 13, 27, 4, 209, 80, 13, 27, 4, 203, 216, + 13, 27, 4, 66, 13, 27, 4, 199, 230, 13, 27, 4, 197, 199, 13, 27, 4, 196, + 222, 13, 27, 4, 196, 148, 13, 27, 4, 195, 158, 13, 41, 6, 63, 13, 41, 6, + 250, 111, 13, 41, 6, 247, 206, 13, 41, 6, 240, 230, 13, 41, 6, 69, 13, + 41, 6, 236, 48, 13, 41, 6, 234, 189, 13, 41, 6, 233, 14, 13, 41, 6, 68, + 13, 41, 6, 225, 216, 13, 41, 6, 225, 79, 13, 41, 6, 159, 13, 41, 6, 221, + 135, 13, 41, 6, 218, 54, 13, 41, 6, 72, 13, 41, 6, 214, 2, 13, 41, 6, + 211, 166, 13, 41, 6, 144, 13, 41, 6, 209, 80, 13, 41, 6, 203, 216, 13, + 41, 6, 66, 13, 41, 6, 199, 230, 13, 41, 6, 197, 199, 13, 41, 6, 196, 222, + 13, 41, 6, 196, 148, 13, 41, 6, 195, 158, 13, 41, 4, 63, 13, 41, 4, 250, + 111, 13, 41, 4, 247, 206, 13, 41, 4, 240, 230, 13, 41, 4, 69, 13, 41, 4, + 236, 48, 13, 41, 4, 234, 189, 13, 41, 4, 68, 13, 41, 4, 225, 216, 13, 41, + 4, 225, 79, 13, 41, 4, 159, 13, 41, 4, 221, 135, 13, 41, 4, 218, 54, 13, + 41, 4, 72, 13, 41, 4, 214, 2, 13, 41, 4, 211, 166, 13, 41, 4, 144, 13, + 41, 4, 209, 80, 13, 41, 4, 203, 216, 13, 41, 4, 66, 13, 41, 4, 199, 230, + 13, 41, 4, 197, 199, 13, 41, 4, 196, 222, 13, 41, 4, 196, 148, 13, 41, 4, + 195, 158, 13, 27, 41, 6, 63, 13, 27, 41, 6, 250, 111, 13, 27, 41, 6, 247, + 206, 13, 27, 41, 6, 240, 230, 13, 27, 41, 6, 69, 13, 27, 41, 6, 236, 48, + 13, 27, 41, 6, 234, 189, 13, 27, 41, 6, 233, 14, 13, 27, 41, 6, 68, 13, + 27, 41, 6, 225, 216, 13, 27, 41, 6, 225, 79, 13, 27, 41, 6, 159, 13, 27, + 41, 6, 221, 135, 13, 27, 41, 6, 218, 54, 13, 27, 41, 6, 72, 13, 27, 41, + 6, 214, 2, 13, 27, 41, 6, 211, 166, 13, 27, 41, 6, 144, 13, 27, 41, 6, + 209, 80, 13, 27, 41, 6, 203, 216, 13, 27, 41, 6, 66, 13, 27, 41, 6, 199, + 230, 13, 27, 41, 6, 197, 199, 13, 27, 41, 6, 196, 222, 13, 27, 41, 6, + 196, 148, 13, 27, 41, 6, 195, 158, 13, 27, 41, 4, 63, 13, 27, 41, 4, 250, + 111, 13, 27, 41, 4, 247, 206, 13, 27, 41, 4, 240, 230, 13, 27, 41, 4, 69, + 13, 27, 41, 4, 236, 48, 13, 27, 41, 4, 234, 189, 13, 27, 41, 4, 233, 14, + 13, 27, 41, 4, 68, 13, 27, 41, 4, 225, 216, 13, 27, 41, 4, 225, 79, 13, + 27, 41, 4, 159, 13, 27, 41, 4, 221, 135, 13, 27, 41, 4, 218, 54, 13, 27, + 41, 4, 72, 13, 27, 41, 4, 214, 2, 13, 27, 41, 4, 211, 166, 13, 27, 41, 4, + 144, 13, 27, 41, 4, 209, 80, 13, 27, 41, 4, 203, 216, 13, 27, 41, 4, 66, + 13, 27, 41, 4, 199, 230, 13, 27, 41, 4, 197, 199, 13, 27, 41, 4, 196, + 222, 13, 27, 41, 4, 196, 148, 13, 27, 41, 4, 195, 158, 13, 145, 6, 63, + 13, 145, 6, 247, 206, 13, 145, 6, 240, 230, 13, 145, 6, 234, 189, 13, + 145, 6, 225, 216, 13, 145, 6, 225, 79, 13, 145, 6, 218, 54, 13, 145, 6, + 72, 13, 145, 6, 214, 2, 13, 145, 6, 211, 166, 13, 145, 6, 209, 80, 13, + 145, 6, 203, 216, 13, 145, 6, 66, 13, 145, 6, 199, 230, 13, 145, 6, 197, + 199, 13, 145, 6, 196, 222, 13, 145, 6, 196, 148, 13, 145, 6, 195, 158, + 13, 145, 4, 63, 13, 145, 4, 250, 111, 13, 145, 4, 247, 206, 13, 145, 4, + 240, 230, 13, 145, 4, 236, 48, 13, 145, 4, 233, 14, 13, 145, 4, 68, 13, + 145, 4, 225, 216, 13, 145, 4, 225, 79, 13, 145, 4, 159, 13, 145, 4, 221, + 135, 13, 145, 4, 218, 54, 13, 145, 4, 214, 2, 13, 145, 4, 211, 166, 13, + 145, 4, 144, 13, 145, 4, 209, 80, 13, 145, 4, 203, 216, 13, 145, 4, 66, + 13, 145, 4, 199, 230, 13, 145, 4, 197, 199, 13, 145, 4, 196, 222, 13, + 145, 4, 196, 148, 13, 145, 4, 195, 158, 13, 27, 145, 6, 63, 13, 27, 145, + 6, 250, 111, 13, 27, 145, 6, 247, 206, 13, 27, 145, 6, 240, 230, 13, 27, + 145, 6, 69, 13, 27, 145, 6, 236, 48, 13, 27, 145, 6, 234, 189, 13, 27, + 145, 6, 233, 14, 13, 27, 145, 6, 68, 13, 27, 145, 6, 225, 216, 13, 27, + 145, 6, 225, 79, 13, 27, 145, 6, 159, 13, 27, 145, 6, 221, 135, 13, 27, + 145, 6, 218, 54, 13, 27, 145, 6, 72, 13, 27, 145, 6, 214, 2, 13, 27, 145, + 6, 211, 166, 13, 27, 145, 6, 144, 13, 27, 145, 6, 209, 80, 13, 27, 145, + 6, 203, 216, 13, 27, 145, 6, 66, 13, 27, 145, 6, 199, 230, 13, 27, 145, + 6, 197, 199, 13, 27, 145, 6, 196, 222, 13, 27, 145, 6, 196, 148, 13, 27, + 145, 6, 195, 158, 13, 27, 145, 4, 63, 13, 27, 145, 4, 250, 111, 13, 27, + 145, 4, 247, 206, 13, 27, 145, 4, 240, 230, 13, 27, 145, 4, 69, 13, 27, + 145, 4, 236, 48, 13, 27, 145, 4, 234, 189, 13, 27, 145, 4, 233, 14, 13, + 27, 145, 4, 68, 13, 27, 145, 4, 225, 216, 13, 27, 145, 4, 225, 79, 13, + 27, 145, 4, 159, 13, 27, 145, 4, 221, 135, 13, 27, 145, 4, 218, 54, 13, + 27, 145, 4, 72, 13, 27, 145, 4, 214, 2, 13, 27, 145, 4, 211, 166, 13, 27, + 145, 4, 144, 13, 27, 145, 4, 209, 80, 13, 27, 145, 4, 203, 216, 13, 27, + 145, 4, 66, 13, 27, 145, 4, 199, 230, 13, 27, 145, 4, 197, 199, 13, 27, + 145, 4, 196, 222, 13, 27, 145, 4, 196, 148, 13, 27, 145, 4, 195, 158, 13, + 187, 6, 63, 13, 187, 6, 250, 111, 13, 187, 6, 240, 230, 13, 187, 6, 69, + 13, 187, 6, 236, 48, 13, 187, 6, 234, 189, 13, 187, 6, 225, 216, 13, 187, + 6, 225, 79, 13, 187, 6, 159, 13, 187, 6, 221, 135, 13, 187, 6, 218, 54, + 13, 187, 6, 72, 13, 187, 6, 214, 2, 13, 187, 6, 211, 166, 13, 187, 6, + 209, 80, 13, 187, 6, 203, 216, 13, 187, 6, 66, 13, 187, 6, 199, 230, 13, + 187, 6, 197, 199, 13, 187, 6, 196, 222, 13, 187, 6, 196, 148, 13, 187, 4, + 63, 13, 187, 4, 250, 111, 13, 187, 4, 247, 206, 13, 187, 4, 240, 230, 13, + 187, 4, 69, 13, 187, 4, 236, 48, 13, 187, 4, 234, 189, 13, 187, 4, 233, + 14, 13, 187, 4, 68, 13, 187, 4, 225, 216, 13, 187, 4, 225, 79, 13, 187, + 4, 159, 13, 187, 4, 221, 135, 13, 187, 4, 218, 54, 13, 187, 4, 72, 13, + 187, 4, 214, 2, 13, 187, 4, 211, 166, 13, 187, 4, 144, 13, 187, 4, 209, + 80, 13, 187, 4, 203, 216, 13, 187, 4, 66, 13, 187, 4, 199, 230, 13, 187, + 4, 197, 199, 13, 187, 4, 196, 222, 13, 187, 4, 196, 148, 13, 187, 4, 195, + 158, 13, 237, 240, 6, 63, 13, 237, 240, 6, 250, 111, 13, 237, 240, 6, + 240, 230, 13, 237, 240, 6, 69, 13, 237, 240, 6, 236, 48, 13, 237, 240, 6, + 234, 189, 13, 237, 240, 6, 68, 13, 237, 240, 6, 225, 216, 13, 237, 240, + 6, 225, 79, 13, 237, 240, 6, 159, 13, 237, 240, 6, 221, 135, 13, 237, + 240, 6, 72, 13, 237, 240, 6, 209, 80, 13, 237, 240, 6, 203, 216, 13, 237, + 240, 6, 66, 13, 237, 240, 6, 199, 230, 13, 237, 240, 6, 197, 199, 13, + 237, 240, 6, 196, 222, 13, 237, 240, 6, 196, 148, 13, 237, 240, 4, 63, + 13, 237, 240, 4, 250, 111, 13, 237, 240, 4, 247, 206, 13, 237, 240, 4, + 240, 230, 13, 237, 240, 4, 69, 13, 237, 240, 4, 236, 48, 13, 237, 240, 4, + 234, 189, 13, 237, 240, 4, 233, 14, 13, 237, 240, 4, 68, 13, 237, 240, 4, + 225, 216, 13, 237, 240, 4, 225, 79, 13, 237, 240, 4, 159, 13, 237, 240, + 4, 221, 135, 13, 237, 240, 4, 218, 54, 13, 237, 240, 4, 72, 13, 237, 240, + 4, 214, 2, 13, 237, 240, 4, 211, 166, 13, 237, 240, 4, 144, 13, 237, 240, + 4, 209, 80, 13, 237, 240, 4, 203, 216, 13, 237, 240, 4, 66, 13, 237, 240, + 4, 199, 230, 13, 237, 240, 4, 197, 199, 13, 237, 240, 4, 196, 222, 13, + 237, 240, 4, 196, 148, 13, 237, 240, 4, 195, 158, 13, 27, 187, 6, 63, 13, + 27, 187, 6, 250, 111, 13, 27, 187, 6, 247, 206, 13, 27, 187, 6, 240, 230, + 13, 27, 187, 6, 69, 13, 27, 187, 6, 236, 48, 13, 27, 187, 6, 234, 189, + 13, 27, 187, 6, 233, 14, 13, 27, 187, 6, 68, 13, 27, 187, 6, 225, 216, + 13, 27, 187, 6, 225, 79, 13, 27, 187, 6, 159, 13, 27, 187, 6, 221, 135, + 13, 27, 187, 6, 218, 54, 13, 27, 187, 6, 72, 13, 27, 187, 6, 214, 2, 13, + 27, 187, 6, 211, 166, 13, 27, 187, 6, 144, 13, 27, 187, 6, 209, 80, 13, + 27, 187, 6, 203, 216, 13, 27, 187, 6, 66, 13, 27, 187, 6, 199, 230, 13, + 27, 187, 6, 197, 199, 13, 27, 187, 6, 196, 222, 13, 27, 187, 6, 196, 148, + 13, 27, 187, 6, 195, 158, 13, 27, 187, 4, 63, 13, 27, 187, 4, 250, 111, + 13, 27, 187, 4, 247, 206, 13, 27, 187, 4, 240, 230, 13, 27, 187, 4, 69, + 13, 27, 187, 4, 236, 48, 13, 27, 187, 4, 234, 189, 13, 27, 187, 4, 233, + 14, 13, 27, 187, 4, 68, 13, 27, 187, 4, 225, 216, 13, 27, 187, 4, 225, + 79, 13, 27, 187, 4, 159, 13, 27, 187, 4, 221, 135, 13, 27, 187, 4, 218, + 54, 13, 27, 187, 4, 72, 13, 27, 187, 4, 214, 2, 13, 27, 187, 4, 211, 166, + 13, 27, 187, 4, 144, 13, 27, 187, 4, 209, 80, 13, 27, 187, 4, 203, 216, + 13, 27, 187, 4, 66, 13, 27, 187, 4, 199, 230, 13, 27, 187, 4, 197, 199, + 13, 27, 187, 4, 196, 222, 13, 27, 187, 4, 196, 148, 13, 27, 187, 4, 195, + 158, 13, 45, 6, 63, 13, 45, 6, 250, 111, 13, 45, 6, 247, 206, 13, 45, 6, + 240, 230, 13, 45, 6, 69, 13, 45, 6, 236, 48, 13, 45, 6, 234, 189, 13, 45, + 6, 233, 14, 13, 45, 6, 68, 13, 45, 6, 225, 216, 13, 45, 6, 225, 79, 13, + 45, 6, 159, 13, 45, 6, 221, 135, 13, 45, 6, 218, 54, 13, 45, 6, 72, 13, + 45, 6, 214, 2, 13, 45, 6, 211, 166, 13, 45, 6, 144, 13, 45, 6, 209, 80, + 13, 45, 6, 203, 216, 13, 45, 6, 66, 13, 45, 6, 199, 230, 13, 45, 6, 197, + 199, 13, 45, 6, 196, 222, 13, 45, 6, 196, 148, 13, 45, 6, 195, 158, 13, + 45, 4, 63, 13, 45, 4, 250, 111, 13, 45, 4, 247, 206, 13, 45, 4, 240, 230, + 13, 45, 4, 69, 13, 45, 4, 236, 48, 13, 45, 4, 234, 189, 13, 45, 4, 233, + 14, 13, 45, 4, 68, 13, 45, 4, 225, 216, 13, 45, 4, 225, 79, 13, 45, 4, + 159, 13, 45, 4, 221, 135, 13, 45, 4, 218, 54, 13, 45, 4, 72, 13, 45, 4, + 214, 2, 13, 45, 4, 211, 166, 13, 45, 4, 144, 13, 45, 4, 209, 80, 13, 45, + 4, 203, 216, 13, 45, 4, 66, 13, 45, 4, 199, 230, 13, 45, 4, 197, 199, 13, + 45, 4, 196, 222, 13, 45, 4, 196, 148, 13, 45, 4, 195, 158, 13, 45, 27, 6, + 63, 13, 45, 27, 6, 250, 111, 13, 45, 27, 6, 247, 206, 13, 45, 27, 6, 240, + 230, 13, 45, 27, 6, 69, 13, 45, 27, 6, 236, 48, 13, 45, 27, 6, 234, 189, + 13, 45, 27, 6, 233, 14, 13, 45, 27, 6, 68, 13, 45, 27, 6, 225, 216, 13, + 45, 27, 6, 225, 79, 13, 45, 27, 6, 159, 13, 45, 27, 6, 221, 135, 13, 45, + 27, 6, 218, 54, 13, 45, 27, 6, 72, 13, 45, 27, 6, 214, 2, 13, 45, 27, 6, + 211, 166, 13, 45, 27, 6, 144, 13, 45, 27, 6, 209, 80, 13, 45, 27, 6, 203, + 216, 13, 45, 27, 6, 66, 13, 45, 27, 6, 199, 230, 13, 45, 27, 6, 197, 199, + 13, 45, 27, 6, 196, 222, 13, 45, 27, 6, 196, 148, 13, 45, 27, 6, 195, + 158, 13, 45, 27, 4, 63, 13, 45, 27, 4, 250, 111, 13, 45, 27, 4, 247, 206, + 13, 45, 27, 4, 240, 230, 13, 45, 27, 4, 69, 13, 45, 27, 4, 236, 48, 13, + 45, 27, 4, 234, 189, 13, 45, 27, 4, 233, 14, 13, 45, 27, 4, 68, 13, 45, + 27, 4, 225, 216, 13, 45, 27, 4, 225, 79, 13, 45, 27, 4, 159, 13, 45, 27, + 4, 221, 135, 13, 45, 27, 4, 218, 54, 13, 45, 27, 4, 72, 13, 45, 27, 4, + 214, 2, 13, 45, 27, 4, 211, 166, 13, 45, 27, 4, 144, 13, 45, 27, 4, 209, + 80, 13, 45, 27, 4, 203, 216, 13, 45, 27, 4, 66, 13, 45, 27, 4, 199, 230, + 13, 45, 27, 4, 197, 199, 13, 45, 27, 4, 196, 222, 13, 45, 27, 4, 196, + 148, 13, 45, 27, 4, 195, 158, 13, 45, 41, 6, 63, 13, 45, 41, 6, 250, 111, + 13, 45, 41, 6, 247, 206, 13, 45, 41, 6, 240, 230, 13, 45, 41, 6, 69, 13, + 45, 41, 6, 236, 48, 13, 45, 41, 6, 234, 189, 13, 45, 41, 6, 233, 14, 13, + 45, 41, 6, 68, 13, 45, 41, 6, 225, 216, 13, 45, 41, 6, 225, 79, 13, 45, + 41, 6, 159, 13, 45, 41, 6, 221, 135, 13, 45, 41, 6, 218, 54, 13, 45, 41, + 6, 72, 13, 45, 41, 6, 214, 2, 13, 45, 41, 6, 211, 166, 13, 45, 41, 6, + 144, 13, 45, 41, 6, 209, 80, 13, 45, 41, 6, 203, 216, 13, 45, 41, 6, 66, + 13, 45, 41, 6, 199, 230, 13, 45, 41, 6, 197, 199, 13, 45, 41, 6, 196, + 222, 13, 45, 41, 6, 196, 148, 13, 45, 41, 6, 195, 158, 13, 45, 41, 4, 63, + 13, 45, 41, 4, 250, 111, 13, 45, 41, 4, 247, 206, 13, 45, 41, 4, 240, + 230, 13, 45, 41, 4, 69, 13, 45, 41, 4, 236, 48, 13, 45, 41, 4, 234, 189, + 13, 45, 41, 4, 233, 14, 13, 45, 41, 4, 68, 13, 45, 41, 4, 225, 216, 13, + 45, 41, 4, 225, 79, 13, 45, 41, 4, 159, 13, 45, 41, 4, 221, 135, 13, 45, + 41, 4, 218, 54, 13, 45, 41, 4, 72, 13, 45, 41, 4, 214, 2, 13, 45, 41, 4, + 211, 166, 13, 45, 41, 4, 144, 13, 45, 41, 4, 209, 80, 13, 45, 41, 4, 203, + 216, 13, 45, 41, 4, 66, 13, 45, 41, 4, 199, 230, 13, 45, 41, 4, 197, 199, + 13, 45, 41, 4, 196, 222, 13, 45, 41, 4, 196, 148, 13, 45, 41, 4, 195, + 158, 13, 45, 27, 41, 6, 63, 13, 45, 27, 41, 6, 250, 111, 13, 45, 27, 41, + 6, 247, 206, 13, 45, 27, 41, 6, 240, 230, 13, 45, 27, 41, 6, 69, 13, 45, + 27, 41, 6, 236, 48, 13, 45, 27, 41, 6, 234, 189, 13, 45, 27, 41, 6, 233, + 14, 13, 45, 27, 41, 6, 68, 13, 45, 27, 41, 6, 225, 216, 13, 45, 27, 41, + 6, 225, 79, 13, 45, 27, 41, 6, 159, 13, 45, 27, 41, 6, 221, 135, 13, 45, + 27, 41, 6, 218, 54, 13, 45, 27, 41, 6, 72, 13, 45, 27, 41, 6, 214, 2, 13, + 45, 27, 41, 6, 211, 166, 13, 45, 27, 41, 6, 144, 13, 45, 27, 41, 6, 209, + 80, 13, 45, 27, 41, 6, 203, 216, 13, 45, 27, 41, 6, 66, 13, 45, 27, 41, + 6, 199, 230, 13, 45, 27, 41, 6, 197, 199, 13, 45, 27, 41, 6, 196, 222, + 13, 45, 27, 41, 6, 196, 148, 13, 45, 27, 41, 6, 195, 158, 13, 45, 27, 41, + 4, 63, 13, 45, 27, 41, 4, 250, 111, 13, 45, 27, 41, 4, 247, 206, 13, 45, + 27, 41, 4, 240, 230, 13, 45, 27, 41, 4, 69, 13, 45, 27, 41, 4, 236, 48, + 13, 45, 27, 41, 4, 234, 189, 13, 45, 27, 41, 4, 233, 14, 13, 45, 27, 41, + 4, 68, 13, 45, 27, 41, 4, 225, 216, 13, 45, 27, 41, 4, 225, 79, 13, 45, + 27, 41, 4, 159, 13, 45, 27, 41, 4, 221, 135, 13, 45, 27, 41, 4, 218, 54, + 13, 45, 27, 41, 4, 72, 13, 45, 27, 41, 4, 214, 2, 13, 45, 27, 41, 4, 211, + 166, 13, 45, 27, 41, 4, 144, 13, 45, 27, 41, 4, 209, 80, 13, 45, 27, 41, + 4, 203, 216, 13, 45, 27, 41, 4, 66, 13, 45, 27, 41, 4, 199, 230, 13, 45, + 27, 41, 4, 197, 199, 13, 45, 27, 41, 4, 196, 222, 13, 45, 27, 41, 4, 196, + 148, 13, 45, 27, 41, 4, 195, 158, 13, 218, 200, 6, 63, 13, 218, 200, 6, + 250, 111, 13, 218, 200, 6, 247, 206, 13, 218, 200, 6, 240, 230, 13, 218, + 200, 6, 69, 13, 218, 200, 6, 236, 48, 13, 218, 200, 6, 234, 189, 13, 218, + 200, 6, 233, 14, 13, 218, 200, 6, 68, 13, 218, 200, 6, 225, 216, 13, 218, + 200, 6, 225, 79, 13, 218, 200, 6, 159, 13, 218, 200, 6, 221, 135, 13, + 218, 200, 6, 218, 54, 13, 218, 200, 6, 72, 13, 218, 200, 6, 214, 2, 13, + 218, 200, 6, 211, 166, 13, 218, 200, 6, 144, 13, 218, 200, 6, 209, 80, + 13, 218, 200, 6, 203, 216, 13, 218, 200, 6, 66, 13, 218, 200, 6, 199, + 230, 13, 218, 200, 6, 197, 199, 13, 218, 200, 6, 196, 222, 13, 218, 200, + 6, 196, 148, 13, 218, 200, 6, 195, 158, 13, 218, 200, 4, 63, 13, 218, + 200, 4, 250, 111, 13, 218, 200, 4, 247, 206, 13, 218, 200, 4, 240, 230, + 13, 218, 200, 4, 69, 13, 218, 200, 4, 236, 48, 13, 218, 200, 4, 234, 189, + 13, 218, 200, 4, 233, 14, 13, 218, 200, 4, 68, 13, 218, 200, 4, 225, 216, + 13, 218, 200, 4, 225, 79, 13, 218, 200, 4, 159, 13, 218, 200, 4, 221, + 135, 13, 218, 200, 4, 218, 54, 13, 218, 200, 4, 72, 13, 218, 200, 4, 214, + 2, 13, 218, 200, 4, 211, 166, 13, 218, 200, 4, 144, 13, 218, 200, 4, 209, + 80, 13, 218, 200, 4, 203, 216, 13, 218, 200, 4, 66, 13, 218, 200, 4, 199, + 230, 13, 218, 200, 4, 197, 199, 13, 218, 200, 4, 196, 222, 13, 218, 200, + 4, 196, 148, 13, 218, 200, 4, 195, 158, 13, 41, 4, 238, 251, 68, 13, 41, + 4, 238, 251, 225, 216, 13, 27, 6, 251, 133, 13, 27, 6, 248, 205, 13, 27, + 6, 234, 93, 13, 27, 6, 239, 211, 13, 27, 6, 236, 173, 13, 27, 6, 195, 78, + 13, 27, 6, 236, 125, 13, 27, 6, 202, 199, 13, 27, 6, 226, 6, 13, 27, 6, + 225, 1, 13, 27, 6, 222, 244, 13, 27, 6, 218, 144, 13, 27, 6, 215, 185, + 13, 27, 6, 196, 196, 13, 27, 6, 214, 121, 13, 27, 6, 212, 219, 13, 27, 6, + 210, 74, 13, 27, 6, 202, 200, 105, 13, 27, 6, 206, 86, 13, 27, 6, 203, + 89, 13, 27, 6, 200, 28, 13, 27, 6, 212, 245, 13, 27, 6, 245, 74, 13, 27, + 6, 211, 237, 13, 27, 6, 214, 123, 13, 27, 217, 238, 13, 27, 4, 251, 133, + 13, 27, 4, 248, 205, 13, 27, 4, 234, 93, 13, 27, 4, 239, 211, 13, 27, 4, + 236, 173, 13, 27, 4, 195, 78, 13, 27, 4, 236, 125, 13, 27, 4, 202, 199, + 13, 27, 4, 226, 6, 13, 27, 4, 225, 1, 13, 27, 4, 222, 244, 13, 27, 4, + 218, 144, 13, 27, 4, 215, 185, 13, 27, 4, 196, 196, 13, 27, 4, 214, 121, + 13, 27, 4, 212, 219, 13, 27, 4, 210, 74, 13, 27, 4, 48, 206, 86, 13, 27, + 4, 206, 86, 13, 27, 4, 203, 89, 13, 27, 4, 200, 28, 13, 27, 4, 212, 245, + 13, 27, 4, 245, 74, 13, 27, 4, 211, 237, 13, 27, 4, 214, 123, 13, 27, + 213, 131, 239, 123, 13, 27, 236, 174, 105, 13, 27, 202, 200, 105, 13, 27, + 225, 2, 105, 13, 27, 212, 246, 105, 13, 27, 210, 75, 105, 13, 27, 212, + 220, 105, 13, 41, 6, 251, 133, 13, 41, 6, 248, 205, 13, 41, 6, 234, 93, + 13, 41, 6, 239, 211, 13, 41, 6, 236, 173, 13, 41, 6, 195, 78, 13, 41, 6, + 236, 125, 13, 41, 6, 202, 199, 13, 41, 6, 226, 6, 13, 41, 6, 225, 1, 13, + 41, 6, 222, 244, 13, 41, 6, 218, 144, 13, 41, 6, 215, 185, 13, 41, 6, + 196, 196, 13, 41, 6, 214, 121, 13, 41, 6, 212, 219, 13, 41, 6, 210, 74, + 13, 41, 6, 202, 200, 105, 13, 41, 6, 206, 86, 13, 41, 6, 203, 89, 13, 41, + 6, 200, 28, 13, 41, 6, 212, 245, 13, 41, 6, 245, 74, 13, 41, 6, 211, 237, + 13, 41, 6, 214, 123, 13, 41, 217, 238, 13, 41, 4, 251, 133, 13, 41, 4, + 248, 205, 13, 41, 4, 234, 93, 13, 41, 4, 239, 211, 13, 41, 4, 236, 173, + 13, 41, 4, 195, 78, 13, 41, 4, 236, 125, 13, 41, 4, 202, 199, 13, 41, 4, + 226, 6, 13, 41, 4, 225, 1, 13, 41, 4, 222, 244, 13, 41, 4, 218, 144, 13, + 41, 4, 215, 185, 13, 41, 4, 196, 196, 13, 41, 4, 214, 121, 13, 41, 4, + 212, 219, 13, 41, 4, 210, 74, 13, 41, 4, 48, 206, 86, 13, 41, 4, 206, 86, + 13, 41, 4, 203, 89, 13, 41, 4, 200, 28, 13, 41, 4, 212, 245, 13, 41, 4, + 245, 74, 13, 41, 4, 211, 237, 13, 41, 4, 214, 123, 13, 41, 213, 131, 239, + 123, 13, 41, 236, 174, 105, 13, 41, 202, 200, 105, 13, 41, 225, 2, 105, + 13, 41, 212, 246, 105, 13, 41, 210, 75, 105, 13, 41, 212, 220, 105, 13, + 27, 41, 6, 251, 133, 13, 27, 41, 6, 248, 205, 13, 27, 41, 6, 234, 93, 13, + 27, 41, 6, 239, 211, 13, 27, 41, 6, 236, 173, 13, 27, 41, 6, 195, 78, 13, + 27, 41, 6, 236, 125, 13, 27, 41, 6, 202, 199, 13, 27, 41, 6, 226, 6, 13, + 27, 41, 6, 225, 1, 13, 27, 41, 6, 222, 244, 13, 27, 41, 6, 218, 144, 13, + 27, 41, 6, 215, 185, 13, 27, 41, 6, 196, 196, 13, 27, 41, 6, 214, 121, + 13, 27, 41, 6, 212, 219, 13, 27, 41, 6, 210, 74, 13, 27, 41, 6, 202, 200, + 105, 13, 27, 41, 6, 206, 86, 13, 27, 41, 6, 203, 89, 13, 27, 41, 6, 200, + 28, 13, 27, 41, 6, 212, 245, 13, 27, 41, 6, 245, 74, 13, 27, 41, 6, 211, + 237, 13, 27, 41, 6, 214, 123, 13, 27, 41, 217, 238, 13, 27, 41, 4, 251, + 133, 13, 27, 41, 4, 248, 205, 13, 27, 41, 4, 234, 93, 13, 27, 41, 4, 239, + 211, 13, 27, 41, 4, 236, 173, 13, 27, 41, 4, 195, 78, 13, 27, 41, 4, 236, + 125, 13, 27, 41, 4, 202, 199, 13, 27, 41, 4, 226, 6, 13, 27, 41, 4, 225, + 1, 13, 27, 41, 4, 222, 244, 13, 27, 41, 4, 218, 144, 13, 27, 41, 4, 215, + 185, 13, 27, 41, 4, 196, 196, 13, 27, 41, 4, 214, 121, 13, 27, 41, 4, + 212, 219, 13, 27, 41, 4, 210, 74, 13, 27, 41, 4, 48, 206, 86, 13, 27, 41, + 4, 206, 86, 13, 27, 41, 4, 203, 89, 13, 27, 41, 4, 200, 28, 13, 27, 41, + 4, 212, 245, 13, 27, 41, 4, 245, 74, 13, 27, 41, 4, 211, 237, 13, 27, 41, + 4, 214, 123, 13, 27, 41, 213, 131, 239, 123, 13, 27, 41, 236, 174, 105, + 13, 27, 41, 202, 200, 105, 13, 27, 41, 225, 2, 105, 13, 27, 41, 212, 246, + 105, 13, 27, 41, 210, 75, 105, 13, 27, 41, 212, 220, 105, 13, 45, 27, 6, + 251, 133, 13, 45, 27, 6, 248, 205, 13, 45, 27, 6, 234, 93, 13, 45, 27, 6, + 239, 211, 13, 45, 27, 6, 236, 173, 13, 45, 27, 6, 195, 78, 13, 45, 27, 6, + 236, 125, 13, 45, 27, 6, 202, 199, 13, 45, 27, 6, 226, 6, 13, 45, 27, 6, + 225, 1, 13, 45, 27, 6, 222, 244, 13, 45, 27, 6, 218, 144, 13, 45, 27, 6, + 215, 185, 13, 45, 27, 6, 196, 196, 13, 45, 27, 6, 214, 121, 13, 45, 27, + 6, 212, 219, 13, 45, 27, 6, 210, 74, 13, 45, 27, 6, 202, 200, 105, 13, + 45, 27, 6, 206, 86, 13, 45, 27, 6, 203, 89, 13, 45, 27, 6, 200, 28, 13, + 45, 27, 6, 212, 245, 13, 45, 27, 6, 245, 74, 13, 45, 27, 6, 211, 237, 13, + 45, 27, 6, 214, 123, 13, 45, 27, 217, 238, 13, 45, 27, 4, 251, 133, 13, + 45, 27, 4, 248, 205, 13, 45, 27, 4, 234, 93, 13, 45, 27, 4, 239, 211, 13, + 45, 27, 4, 236, 173, 13, 45, 27, 4, 195, 78, 13, 45, 27, 4, 236, 125, 13, + 45, 27, 4, 202, 199, 13, 45, 27, 4, 226, 6, 13, 45, 27, 4, 225, 1, 13, + 45, 27, 4, 222, 244, 13, 45, 27, 4, 218, 144, 13, 45, 27, 4, 215, 185, + 13, 45, 27, 4, 196, 196, 13, 45, 27, 4, 214, 121, 13, 45, 27, 4, 212, + 219, 13, 45, 27, 4, 210, 74, 13, 45, 27, 4, 48, 206, 86, 13, 45, 27, 4, + 206, 86, 13, 45, 27, 4, 203, 89, 13, 45, 27, 4, 200, 28, 13, 45, 27, 4, + 212, 245, 13, 45, 27, 4, 245, 74, 13, 45, 27, 4, 211, 237, 13, 45, 27, 4, + 214, 123, 13, 45, 27, 213, 131, 239, 123, 13, 45, 27, 236, 174, 105, 13, + 45, 27, 202, 200, 105, 13, 45, 27, 225, 2, 105, 13, 45, 27, 212, 246, + 105, 13, 45, 27, 210, 75, 105, 13, 45, 27, 212, 220, 105, 13, 45, 27, 41, + 6, 251, 133, 13, 45, 27, 41, 6, 248, 205, 13, 45, 27, 41, 6, 234, 93, 13, + 45, 27, 41, 6, 239, 211, 13, 45, 27, 41, 6, 236, 173, 13, 45, 27, 41, 6, + 195, 78, 13, 45, 27, 41, 6, 236, 125, 13, 45, 27, 41, 6, 202, 199, 13, + 45, 27, 41, 6, 226, 6, 13, 45, 27, 41, 6, 225, 1, 13, 45, 27, 41, 6, 222, + 244, 13, 45, 27, 41, 6, 218, 144, 13, 45, 27, 41, 6, 215, 185, 13, 45, + 27, 41, 6, 196, 196, 13, 45, 27, 41, 6, 214, 121, 13, 45, 27, 41, 6, 212, + 219, 13, 45, 27, 41, 6, 210, 74, 13, 45, 27, 41, 6, 202, 200, 105, 13, + 45, 27, 41, 6, 206, 86, 13, 45, 27, 41, 6, 203, 89, 13, 45, 27, 41, 6, + 200, 28, 13, 45, 27, 41, 6, 212, 245, 13, 45, 27, 41, 6, 245, 74, 13, 45, + 27, 41, 6, 211, 237, 13, 45, 27, 41, 6, 214, 123, 13, 45, 27, 41, 217, + 238, 13, 45, 27, 41, 4, 251, 133, 13, 45, 27, 41, 4, 248, 205, 13, 45, + 27, 41, 4, 234, 93, 13, 45, 27, 41, 4, 239, 211, 13, 45, 27, 41, 4, 236, + 173, 13, 45, 27, 41, 4, 195, 78, 13, 45, 27, 41, 4, 236, 125, 13, 45, 27, + 41, 4, 202, 199, 13, 45, 27, 41, 4, 226, 6, 13, 45, 27, 41, 4, 225, 1, + 13, 45, 27, 41, 4, 222, 244, 13, 45, 27, 41, 4, 218, 144, 13, 45, 27, 41, + 4, 215, 185, 13, 45, 27, 41, 4, 196, 196, 13, 45, 27, 41, 4, 214, 121, + 13, 45, 27, 41, 4, 212, 219, 13, 45, 27, 41, 4, 210, 74, 13, 45, 27, 41, + 4, 48, 206, 86, 13, 45, 27, 41, 4, 206, 86, 13, 45, 27, 41, 4, 203, 89, + 13, 45, 27, 41, 4, 200, 28, 13, 45, 27, 41, 4, 212, 245, 13, 45, 27, 41, + 4, 245, 74, 13, 45, 27, 41, 4, 211, 237, 13, 45, 27, 41, 4, 214, 123, 13, + 45, 27, 41, 213, 131, 239, 123, 13, 45, 27, 41, 236, 174, 105, 13, 45, + 27, 41, 202, 200, 105, 13, 45, 27, 41, 225, 2, 105, 13, 45, 27, 41, 212, + 246, 105, 13, 45, 27, 41, 210, 75, 105, 13, 45, 27, 41, 212, 220, 105, + 13, 27, 6, 239, 117, 13, 27, 4, 239, 117, 13, 27, 17, 195, 79, 13, 27, + 17, 100, 13, 27, 17, 102, 13, 27, 17, 134, 13, 27, 17, 136, 13, 27, 17, + 146, 13, 27, 17, 167, 13, 27, 17, 178, 13, 27, 17, 171, 13, 27, 17, 182, + 13, 237, 240, 17, 195, 79, 13, 237, 240, 17, 100, 13, 237, 240, 17, 102, + 13, 237, 240, 17, 134, 13, 237, 240, 17, 136, 13, 237, 240, 17, 146, 13, + 237, 240, 17, 167, 13, 237, 240, 17, 178, 13, 237, 240, 17, 171, 13, 237, + 240, 17, 182, 13, 45, 17, 195, 79, 13, 45, 17, 100, 13, 45, 17, 102, 13, + 45, 17, 134, 13, 45, 17, 136, 13, 45, 17, 146, 13, 45, 17, 167, 13, 45, + 17, 178, 13, 45, 17, 171, 13, 45, 17, 182, 13, 45, 27, 17, 195, 79, 13, + 45, 27, 17, 100, 13, 45, 27, 17, 102, 13, 45, 27, 17, 134, 13, 45, 27, + 17, 136, 13, 45, 27, 17, 146, 13, 45, 27, 17, 167, 13, 45, 27, 17, 178, + 13, 45, 27, 17, 171, 13, 45, 27, 17, 182, 13, 218, 200, 17, 195, 79, 13, + 218, 200, 17, 100, 13, 218, 200, 17, 102, 13, 218, 200, 17, 134, 13, 218, + 200, 17, 136, 13, 218, 200, 17, 146, 13, 218, 200, 17, 167, 13, 218, 200, + 17, 178, 13, 218, 200, 17, 171, 13, 218, 200, 17, 182, 23, 139, 226, 71, + 23, 232, 205, 226, 71, 23, 232, 201, 226, 71, 23, 232, 190, 226, 71, 23, + 232, 194, 226, 71, 23, 232, 207, 226, 71, 23, 139, 132, 248, 216, 23, + 232, 205, 132, 248, 216, 23, 139, 162, 200, 64, 132, 248, 216, 23, 139, + 132, 210, 214, 224, 13, 23, 139, 132, 241, 22, 23, 139, 132, 232, 36, 23, + 139, 132, 232, 37, 221, 207, 23, 232, 205, 132, 232, 38, 23, 139, 132, + 219, 62, 23, 232, 205, 132, 219, 62, 23, 139, 132, 112, 248, 216, 23, + 139, 132, 112, 210, 214, 224, 12, 23, 139, 132, 112, 232, 36, 23, 139, + 132, 124, 112, 232, 36, 23, 139, 132, 232, 37, 112, 200, 36, 23, 139, + 132, 112, 241, 143, 23, 139, 132, 112, 241, 144, 132, 248, 216, 23, 139, + 132, 112, 241, 144, 112, 248, 216, 23, 139, 132, 112, 241, 144, 241, 22, + 23, 139, 132, 112, 241, 144, 232, 36, 23, 139, 132, 112, 241, 57, 23, + 232, 205, 132, 112, 241, 57, 23, 139, 112, 248, 217, 127, 226, 71, 23, + 139, 132, 248, 217, 127, 219, 62, 23, 139, 132, 112, 202, 141, 23, 232, + 205, 132, 112, 202, 141, 23, 139, 132, 112, 204, 218, 162, 248, 216, 23, + 139, 132, 112, 248, 217, 162, 204, 217, 23, 139, 132, 112, 162, 248, 216, + 23, 139, 132, 112, 232, 37, 205, 103, 162, 206, 97, 23, 139, 132, 124, + 112, 232, 37, 162, 206, 97, 23, 139, 132, 124, 112, 232, 37, 162, 241, + 143, 23, 139, 132, 232, 37, 112, 124, 162, 206, 97, 23, 139, 132, 112, + 124, 205, 103, 162, 235, 10, 23, 139, 132, 112, 162, 241, 22, 23, 139, + 132, 112, 162, 244, 247, 23, 139, 132, 112, 162, 231, 162, 23, 139, 132, + 112, 162, 232, 36, 23, 139, 162, 248, 203, 132, 112, 204, 217, 23, 139, + 132, 112, 241, 144, 162, 206, 97, 23, 139, 132, 112, 241, 144, 162, 206, + 98, 241, 143, 23, 139, 132, 112, 241, 144, 162, 206, 98, 248, 216, 23, + 139, 112, 162, 231, 163, 132, 200, 36, 23, 139, 132, 162, 231, 163, 112, + 200, 36, 23, 139, 132, 112, 241, 144, 232, 37, 162, 206, 97, 23, 139, + 132, 112, 241, 58, 162, 206, 97, 23, 139, 132, 112, 241, 144, 162, 235, + 10, 23, 139, 132, 112, 241, 144, 241, 23, 162, 235, 10, 23, 139, 112, + 162, 241, 23, 132, 200, 36, 23, 139, 132, 162, 241, 23, 112, 200, 36, 23, + 139, 112, 162, 46, 132, 200, 36, 23, 139, 112, 162, 46, 132, 232, 36, 23, + 139, 132, 162, 251, 88, 214, 34, 112, 200, 36, 23, 139, 132, 162, 251, + 88, 226, 86, 112, 200, 36, 23, 139, 132, 162, 46, 112, 200, 36, 23, 139, + 132, 112, 162, 241, 144, 232, 36, 23, 139, 132, 112, 162, 251, 88, 214, + 33, 23, 139, 132, 112, 162, 251, 87, 23, 139, 112, 162, 251, 88, 214, 34, + 132, 200, 36, 23, 139, 112, 162, 251, 88, 214, 34, 132, 241, 57, 23, 139, + 112, 162, 251, 88, 132, 200, 36, 23, 139, 132, 162, 231, 163, 112, 232, + 36, 23, 232, 196, 235, 6, 235, 121, 23, 232, 196, 235, 6, 235, 122, 248, + 216, 23, 232, 196, 235, 6, 235, 122, 232, 36, 23, 232, 196, 235, 6, 235, + 122, 241, 143, 23, 232, 196, 235, 6, 235, 122, 241, 144, 205, 112, 23, + 232, 203, 235, 6, 235, 122, 241, 143, 23, 139, 235, 6, 235, 122, 241, + 144, 248, 216, 23, 232, 194, 235, 6, 235, 122, 241, 143, 23, 232, 196, + 235, 100, 235, 122, 205, 102, 23, 232, 196, 232, 115, 235, 100, 235, 122, + 205, 102, 23, 232, 196, 235, 100, 235, 122, 205, 103, 235, 6, 248, 216, + 23, 232, 196, 232, 115, 235, 100, 235, 122, 205, 103, 235, 6, 248, 216, + 23, 232, 196, 235, 100, 235, 122, 205, 103, 248, 216, 23, 232, 196, 232, + 115, 235, 100, 235, 122, 205, 103, 248, 216, 23, 232, 196, 235, 100, 235, + 122, 205, 103, 162, 235, 10, 23, 232, 201, 235, 100, 235, 122, 205, 102, + 23, 232, 201, 235, 100, 235, 122, 205, 103, 214, 91, 23, 232, 194, 235, + 100, 235, 122, 205, 103, 214, 91, 23, 232, 190, 235, 100, 235, 122, 205, + 102, 23, 232, 196, 235, 100, 235, 122, 205, 103, 232, 36, 23, 232, 196, + 235, 100, 235, 122, 205, 103, 232, 37, 162, 206, 97, 23, 232, 196, 235, + 100, 235, 122, 205, 103, 232, 37, 216, 50, 202, 141, 23, 232, 195, 23, + 232, 196, 248, 203, 213, 206, 235, 224, 23, 232, 196, 232, 114, 23, 232, + 196, 162, 206, 97, 23, 232, 196, 232, 115, 162, 206, 97, 23, 232, 196, + 162, 248, 216, 23, 232, 196, 162, 235, 10, 23, 232, 196, 205, 113, 132, + 162, 206, 97, 23, 232, 196, 205, 113, 247, 35, 23, 232, 196, 205, 113, + 247, 36, 162, 206, 97, 23, 232, 196, 205, 113, 247, 36, 162, 206, 98, + 248, 216, 23, 232, 196, 205, 113, 222, 45, 23, 232, 202, 23, 232, 203, + 162, 206, 97, 23, 232, 203, 216, 50, 202, 141, 23, 232, 203, 162, 235, + 10, 23, 232, 192, 241, 19, 23, 232, 191, 23, 232, 201, 214, 91, 23, 232, + 200, 23, 232, 201, 192, 162, 206, 97, 23, 232, 201, 162, 206, 97, 23, + 232, 201, 192, 216, 50, 202, 141, 23, 232, 201, 216, 50, 202, 141, 23, + 232, 201, 192, 162, 235, 10, 23, 232, 201, 162, 235, 10, 23, 232, 199, + 214, 91, 23, 232, 198, 23, 232, 204, 23, 232, 189, 23, 232, 190, 162, + 206, 97, 23, 232, 190, 216, 50, 202, 141, 23, 232, 190, 162, 235, 10, 23, + 232, 194, 214, 91, 23, 232, 194, 192, 162, 235, 10, 23, 232, 193, 23, + 232, 194, 205, 224, 23, 232, 194, 192, 162, 206, 97, 23, 232, 194, 162, + 206, 97, 23, 232, 194, 192, 216, 50, 202, 141, 23, 232, 194, 216, 50, + 202, 141, 23, 232, 194, 162, 206, 98, 201, 225, 226, 71, 23, 232, 194, + 162, 248, 203, 112, 210, 2, 23, 232, 206, 23, 139, 132, 112, 210, 2, 23, + 232, 205, 132, 112, 210, 2, 23, 232, 194, 132, 112, 210, 2, 23, 232, 207, + 132, 112, 210, 2, 23, 232, 194, 222, 45, 23, 139, 132, 112, 210, 3, 248, + 216, 23, 139, 132, 112, 210, 3, 241, 143, 23, 232, 194, 132, 112, 210, 3, + 241, 143, 23, 139, 222, 46, 237, 234, 23, 139, 222, 46, 135, 209, 253, + 204, 217, 23, 139, 222, 46, 135, 209, 253, 241, 8, 23, 139, 222, 46, 135, + 214, 44, 244, 247, 23, 139, 222, 46, 200, 36, 23, 139, 162, 200, 64, 222, + 46, 200, 36, 23, 232, 205, 222, 46, 200, 36, 23, 232, 190, 222, 46, 200, + 36, 23, 232, 207, 222, 46, 200, 36, 23, 139, 222, 46, 210, 214, 224, 13, + 23, 139, 222, 46, 248, 216, 23, 139, 222, 46, 201, 226, 202, 141, 23, + 139, 222, 46, 202, 141, 23, 232, 194, 222, 46, 202, 141, 23, 139, 222, + 46, 132, 202, 141, 23, 232, 194, 222, 46, 132, 202, 141, 23, 232, 207, + 222, 46, 132, 162, 132, 162, 214, 33, 23, 232, 207, 222, 46, 132, 162, + 132, 202, 141, 23, 139, 222, 46, 226, 71, 23, 232, 205, 222, 46, 226, 71, + 23, 232, 194, 222, 46, 226, 71, 23, 232, 207, 222, 46, 226, 71, 23, 139, + 132, 112, 222, 45, 23, 232, 205, 132, 112, 222, 45, 23, 232, 194, 132, + 112, 222, 45, 23, 232, 194, 210, 2, 23, 232, 207, 132, 112, 222, 45, 23, + 139, 132, 112, 241, 61, 222, 45, 23, 232, 205, 132, 112, 241, 61, 222, + 45, 23, 139, 210, 3, 237, 234, 23, 232, 194, 210, 3, 135, 132, 162, 231, + 164, 219, 62, 23, 232, 207, 210, 3, 135, 112, 162, 132, 241, 60, 23, 139, + 210, 3, 200, 36, 23, 139, 210, 3, 210, 214, 224, 13, 23, 139, 210, 3, + 222, 45, 23, 232, 205, 210, 3, 222, 45, 23, 232, 190, 210, 3, 222, 45, + 23, 232, 207, 210, 3, 222, 45, 23, 139, 210, 3, 219, 62, 23, 139, 210, 3, + 112, 241, 143, 23, 139, 210, 3, 112, 210, 214, 224, 12, 23, 139, 210, 3, + 226, 71, 23, 139, 210, 3, 202, 141, 23, 232, 192, 210, 3, 202, 141, 23, + 139, 132, 210, 3, 222, 45, 23, 232, 205, 132, 210, 3, 222, 45, 23, 232, + 199, 132, 210, 3, 222, 46, 214, 118, 23, 232, 192, 132, 210, 3, 222, 46, + 214, 33, 23, 232, 192, 132, 210, 3, 222, 46, 226, 85, 23, 232, 192, 132, + 210, 3, 222, 46, 200, 63, 23, 232, 201, 132, 210, 3, 222, 45, 23, 232, + 194, 132, 210, 3, 222, 45, 23, 232, 207, 132, 210, 3, 222, 46, 214, 33, + 23, 232, 207, 132, 210, 3, 222, 45, 23, 139, 112, 237, 234, 23, 232, 194, + 219, 62, 23, 139, 112, 200, 36, 23, 232, 205, 112, 200, 36, 23, 139, 112, + 210, 214, 224, 13, 23, 139, 112, 124, 162, 206, 97, 23, 232, 192, 112, + 202, 141, 23, 139, 112, 162, 222, 45, 23, 139, 112, 222, 45, 23, 139, + 112, 210, 3, 222, 45, 23, 232, 205, 112, 210, 3, 222, 45, 23, 232, 199, + 112, 210, 3, 222, 46, 214, 118, 23, 232, 201, 112, 210, 3, 222, 45, 23, + 232, 194, 112, 210, 3, 222, 45, 23, 232, 207, 112, 210, 3, 222, 46, 214, + 33, 23, 232, 207, 112, 210, 3, 222, 46, 226, 85, 23, 232, 207, 112, 210, + 3, 222, 45, 23, 232, 205, 112, 210, 3, 222, 46, 248, 216, 23, 232, 203, + 112, 210, 3, 222, 46, 241, 143, 23, 232, 203, 112, 210, 3, 222, 46, 241, + 144, 206, 97, 23, 232, 192, 112, 210, 3, 222, 46, 241, 144, 214, 33, 23, + 232, 192, 112, 210, 3, 222, 46, 241, 144, 226, 85, 23, 232, 192, 112, + 210, 3, 222, 46, 241, 143, 23, 232, 194, 132, 232, 36, 23, 139, 132, 162, + 206, 97, 23, 232, 194, 132, 162, 206, 97, 23, 139, 132, 162, 206, 98, + 162, 239, 145, 23, 139, 132, 162, 206, 98, 162, 241, 143, 23, 139, 132, + 162, 206, 98, 162, 248, 216, 23, 139, 132, 162, 206, 98, 132, 248, 216, + 23, 139, 132, 162, 206, 98, 248, 87, 248, 216, 23, 139, 132, 162, 206, + 98, 132, 232, 38, 23, 139, 132, 162, 235, 11, 132, 204, 217, 23, 139, + 132, 162, 235, 11, 132, 248, 216, 23, 139, 132, 162, 122, 23, 139, 132, + 162, 241, 19, 23, 139, 132, 162, 241, 11, 162, 226, 40, 23, 232, 203, + 132, 162, 241, 11, 162, 226, 40, 23, 139, 132, 162, 241, 11, 162, 200, + 63, 23, 139, 132, 162, 244, 248, 23, 232, 201, 132, 202, 141, 23, 232, + 201, 132, 162, 214, 91, 23, 232, 194, 132, 162, 214, 91, 23, 232, 194, + 132, 162, 222, 226, 23, 232, 194, 132, 202, 141, 23, 232, 194, 132, 162, + 205, 224, 23, 232, 207, 132, 162, 214, 33, 23, 232, 207, 132, 162, 226, + 85, 23, 232, 207, 132, 202, 141, 23, 139, 202, 141, 23, 139, 162, 232, + 114, 23, 139, 162, 206, 98, 239, 145, 23, 139, 162, 206, 98, 241, 143, + 23, 139, 162, 206, 98, 248, 216, 23, 139, 162, 235, 10, 23, 139, 162, + 248, 203, 132, 219, 62, 23, 139, 162, 248, 203, 112, 210, 2, 23, 139, + 162, 248, 203, 210, 3, 222, 45, 23, 139, 162, 200, 64, 99, 235, 121, 23, + 139, 162, 127, 99, 235, 121, 23, 139, 162, 200, 64, 115, 235, 121, 23, + 139, 162, 200, 64, 235, 6, 235, 121, 23, 139, 162, 127, 235, 6, 210, 214, + 224, 12, 23, 232, 197, 23, 139, 232, 114, 23, 201, 227, 206, 61, 23, 201, + 227, 218, 118, 23, 201, 227, 248, 202, 23, 233, 104, 206, 61, 23, 233, + 104, 218, 118, 23, 233, 104, 248, 202, 23, 204, 201, 206, 61, 23, 204, + 201, 218, 118, 23, 204, 201, 248, 202, 23, 248, 28, 206, 61, 23, 248, 28, + 218, 118, 23, 248, 28, 248, 202, 23, 209, 132, 206, 61, 23, 209, 132, + 218, 118, 23, 209, 132, 248, 202, 23, 204, 84, 203, 249, 23, 204, 84, + 248, 202, 23, 205, 90, 222, 227, 206, 61, 23, 205, 90, 4, 206, 61, 23, + 205, 90, 222, 227, 218, 118, 23, 205, 90, 4, 218, 118, 23, 205, 90, 207, + 86, 23, 235, 72, 222, 227, 206, 61, 23, 235, 72, 4, 206, 61, 23, 235, 72, + 222, 227, 218, 118, 23, 235, 72, 4, 218, 118, 23, 235, 72, 207, 86, 23, + 205, 90, 235, 72, 251, 127, 23, 218, 156, 124, 135, 222, 226, 23, 218, + 156, 124, 135, 205, 224, 23, 218, 156, 124, 207, 86, 23, 218, 156, 135, + 207, 86, 23, 218, 156, 124, 135, 251, 128, 222, 226, 23, 218, 156, 124, + 135, 251, 128, 205, 224, 23, 218, 156, 206, 98, 202, 30, 206, 98, 208, + 161, 23, 218, 155, 235, 127, 241, 133, 23, 218, 157, 235, 127, 241, 133, + 23, 218, 155, 206, 62, 204, 218, 205, 224, 23, 218, 155, 206, 62, 204, + 218, 219, 188, 23, 218, 155, 206, 62, 204, 218, 222, 226, 23, 218, 155, + 206, 62, 204, 218, 222, 224, 23, 218, 155, 206, 62, 196, 247, 235, 75, + 23, 218, 155, 52, 204, 217, 23, 218, 155, 52, 196, 247, 235, 75, 23, 218, + 155, 52, 251, 127, 23, 218, 155, 52, 251, 128, 196, 247, 235, 75, 23, + 218, 155, 241, 60, 23, 218, 155, 201, 165, 204, 218, 218, 159, 23, 218, + 155, 201, 165, 196, 247, 235, 75, 23, 218, 155, 201, 165, 251, 127, 23, + 218, 155, 201, 165, 251, 128, 196, 247, 235, 75, 23, 218, 155, 248, 221, + 205, 224, 23, 218, 155, 248, 221, 219, 188, 23, 218, 155, 248, 221, 222, + 226, 23, 218, 155, 241, 101, 205, 224, 23, 218, 155, 241, 101, 219, 188, + 23, 218, 155, 241, 101, 222, 226, 23, 218, 155, 241, 101, 209, 192, 23, + 218, 155, 245, 101, 205, 224, 23, 218, 155, 245, 101, 219, 188, 23, 218, + 155, 245, 101, 222, 226, 23, 218, 155, 111, 205, 224, 23, 218, 155, 111, + 219, 188, 23, 218, 155, 111, 222, 226, 23, 218, 155, 195, 24, 205, 224, + 23, 218, 155, 195, 24, 219, 188, 23, 218, 155, 195, 24, 222, 226, 23, + 218, 155, 213, 86, 205, 224, 23, 218, 155, 213, 86, 219, 188, 23, 218, + 155, 213, 86, 222, 226, 23, 201, 195, 209, 190, 206, 61, 23, 201, 195, + 209, 190, 237, 244, 23, 201, 195, 209, 190, 251, 127, 23, 201, 195, 209, + 191, 206, 61, 23, 201, 195, 209, 191, 237, 244, 23, 201, 195, 209, 191, + 251, 127, 23, 201, 195, 207, 30, 23, 201, 195, 250, 231, 205, 121, 206, + 61, 23, 201, 195, 250, 231, 205, 121, 237, 244, 23, 201, 195, 250, 231, + 205, 121, 201, 164, 23, 218, 158, 250, 125, 205, 224, 23, 218, 158, 250, + 125, 219, 188, 23, 218, 158, 250, 125, 222, 226, 23, 218, 158, 250, 125, + 222, 224, 23, 218, 158, 201, 221, 205, 224, 23, 218, 158, 201, 221, 219, + 188, 23, 218, 158, 201, 221, 222, 226, 23, 218, 158, 201, 221, 222, 224, + 23, 218, 158, 248, 203, 250, 125, 205, 224, 23, 218, 158, 248, 203, 250, + 125, 219, 188, 23, 218, 158, 248, 203, 250, 125, 222, 226, 23, 218, 158, + 248, 203, 250, 125, 222, 224, 23, 218, 158, 248, 203, 201, 221, 205, 224, + 23, 218, 158, 248, 203, 201, 221, 219, 188, 23, 218, 158, 248, 203, 201, + 221, 222, 226, 23, 218, 158, 248, 203, 201, 221, 222, 224, 23, 218, 157, + 206, 62, 204, 218, 205, 224, 23, 218, 157, 206, 62, 204, 218, 219, 188, + 23, 218, 157, 206, 62, 204, 218, 222, 226, 23, 218, 157, 206, 62, 204, + 218, 222, 224, 23, 218, 157, 206, 62, 196, 247, 235, 75, 23, 218, 157, + 52, 204, 217, 23, 218, 157, 52, 196, 247, 235, 75, 23, 218, 157, 52, 251, + 127, 23, 218, 157, 52, 251, 128, 196, 247, 235, 75, 23, 218, 157, 241, + 60, 23, 218, 157, 201, 165, 204, 218, 218, 159, 23, 218, 157, 201, 165, + 196, 247, 235, 75, 23, 218, 157, 201, 165, 251, 128, 218, 159, 23, 218, + 157, 201, 165, 251, 128, 196, 247, 235, 75, 23, 218, 157, 248, 220, 23, + 218, 157, 241, 101, 205, 224, 23, 218, 157, 241, 101, 219, 188, 23, 218, + 157, 241, 101, 222, 226, 23, 218, 157, 245, 100, 23, 218, 157, 111, 205, + 224, 23, 218, 157, 111, 219, 188, 23, 218, 157, 111, 222, 226, 23, 218, + 157, 195, 24, 205, 224, 23, 218, 157, 195, 24, 219, 188, 23, 218, 157, + 195, 24, 222, 226, 23, 218, 157, 213, 86, 205, 224, 23, 218, 157, 213, + 86, 219, 188, 23, 218, 157, 213, 86, 222, 226, 23, 201, 196, 209, 191, + 206, 61, 23, 201, 196, 209, 191, 237, 244, 23, 201, 196, 209, 191, 251, + 127, 23, 201, 196, 209, 190, 206, 61, 23, 201, 196, 209, 190, 237, 244, + 23, 201, 196, 209, 190, 251, 127, 23, 201, 196, 207, 30, 23, 218, 155, + 241, 11, 211, 87, 205, 224, 23, 218, 155, 241, 11, 211, 87, 219, 188, 23, + 218, 155, 241, 11, 211, 87, 222, 226, 23, 218, 155, 241, 11, 211, 87, + 222, 224, 23, 218, 155, 241, 11, 232, 221, 205, 224, 23, 218, 155, 241, + 11, 232, 221, 219, 188, 23, 218, 155, 241, 11, 232, 221, 222, 226, 23, + 218, 155, 241, 11, 232, 221, 222, 224, 23, 218, 155, 241, 11, 202, 147, + 244, 249, 205, 224, 23, 218, 155, 241, 11, 202, 147, 244, 249, 219, 188, + 23, 218, 155, 231, 59, 205, 224, 23, 218, 155, 231, 59, 219, 188, 23, + 218, 155, 231, 59, 222, 226, 23, 218, 155, 221, 225, 205, 224, 23, 218, + 155, 221, 225, 219, 188, 23, 218, 155, 221, 225, 222, 226, 23, 218, 155, + 221, 225, 4, 237, 244, 23, 218, 155, 197, 123, 241, 11, 52, 205, 224, 23, + 218, 155, 197, 123, 241, 11, 52, 219, 188, 23, 218, 155, 197, 123, 241, + 11, 52, 222, 226, 23, 218, 155, 197, 123, 241, 11, 201, 165, 205, 224, + 23, 218, 155, 197, 123, 241, 11, 201, 165, 219, 188, 23, 218, 155, 197, + 123, 241, 11, 201, 165, 222, 226, 23, 218, 155, 241, 11, 202, 209, 204, + 217, 23, 218, 155, 241, 9, 241, 61, 205, 224, 23, 218, 155, 241, 9, 241, + 61, 219, 188, 23, 209, 190, 206, 61, 23, 209, 190, 237, 244, 23, 209, + 190, 251, 129, 23, 218, 155, 207, 30, 23, 218, 155, 241, 11, 232, 29, + 234, 233, 197, 148, 23, 218, 155, 231, 59, 232, 29, 234, 233, 197, 148, + 23, 218, 155, 221, 225, 232, 29, 234, 233, 197, 148, 23, 218, 155, 197, + 123, 232, 29, 234, 233, 197, 148, 23, 209, 190, 206, 62, 232, 29, 234, + 233, 197, 148, 23, 209, 190, 52, 232, 29, 234, 233, 197, 148, 23, 209, + 190, 251, 128, 232, 29, 234, 233, 197, 148, 23, 218, 155, 241, 11, 232, + 29, 245, 81, 23, 218, 155, 231, 59, 232, 29, 245, 81, 23, 218, 155, 221, + 225, 232, 29, 245, 81, 23, 218, 155, 197, 123, 232, 29, 245, 81, 23, 209, + 190, 206, 62, 232, 29, 245, 81, 23, 209, 190, 52, 232, 29, 245, 81, 23, + 209, 190, 251, 128, 232, 29, 245, 81, 23, 218, 155, 197, 123, 239, 146, + 213, 112, 205, 224, 23, 218, 155, 197, 123, 239, 146, 213, 112, 219, 188, + 23, 218, 155, 197, 123, 239, 146, 213, 112, 222, 226, 23, 218, 157, 241, + 11, 232, 29, 247, 45, 205, 224, 23, 218, 157, 241, 11, 232, 29, 247, 45, + 222, 226, 23, 218, 157, 231, 59, 232, 29, 247, 45, 4, 237, 244, 23, 218, + 157, 231, 59, 232, 29, 247, 45, 222, 227, 237, 244, 23, 218, 157, 231, + 59, 232, 29, 247, 45, 4, 201, 164, 23, 218, 157, 231, 59, 232, 29, 247, + 45, 222, 227, 201, 164, 23, 218, 157, 221, 225, 232, 29, 247, 45, 4, 206, + 61, 23, 218, 157, 221, 225, 232, 29, 247, 45, 222, 227, 206, 61, 23, 218, + 157, 221, 225, 232, 29, 247, 45, 4, 237, 244, 23, 218, 157, 221, 225, + 232, 29, 247, 45, 222, 227, 237, 244, 23, 218, 157, 197, 123, 232, 29, + 247, 45, 205, 224, 23, 218, 157, 197, 123, 232, 29, 247, 45, 222, 226, + 23, 209, 191, 206, 62, 232, 29, 247, 44, 23, 209, 191, 52, 232, 29, 247, + 44, 23, 209, 191, 251, 128, 232, 29, 247, 44, 23, 218, 157, 241, 11, 232, + 29, 235, 69, 205, 224, 23, 218, 157, 241, 11, 232, 29, 235, 69, 222, 226, + 23, 218, 157, 231, 59, 232, 29, 235, 69, 4, 237, 244, 23, 218, 157, 231, + 59, 232, 29, 235, 69, 222, 227, 237, 244, 23, 218, 157, 231, 59, 232, 29, + 235, 69, 201, 165, 4, 201, 164, 23, 218, 157, 231, 59, 232, 29, 235, 69, + 201, 165, 222, 227, 201, 164, 23, 218, 157, 221, 225, 232, 29, 235, 69, + 4, 206, 61, 23, 218, 157, 221, 225, 232, 29, 235, 69, 222, 227, 206, 61, + 23, 218, 157, 221, 225, 232, 29, 235, 69, 4, 237, 244, 23, 218, 157, 221, + 225, 232, 29, 235, 69, 222, 227, 237, 244, 23, 218, 157, 197, 123, 232, + 29, 235, 69, 205, 224, 23, 218, 157, 197, 123, 232, 29, 235, 69, 222, + 226, 23, 209, 191, 206, 62, 232, 29, 235, 68, 23, 209, 191, 52, 232, 29, + 235, 68, 23, 209, 191, 251, 128, 232, 29, 235, 68, 23, 218, 157, 241, 11, + 205, 224, 23, 218, 157, 241, 11, 219, 188, 23, 218, 157, 241, 11, 222, + 226, 23, 218, 157, 241, 11, 222, 224, 23, 218, 157, 241, 11, 244, 162, + 23, 218, 157, 231, 59, 205, 224, 23, 218, 157, 221, 225, 205, 224, 23, + 218, 157, 197, 123, 205, 212, 23, 218, 157, 197, 123, 205, 224, 23, 218, + 157, 197, 123, 222, 226, 23, 209, 191, 206, 61, 23, 209, 191, 237, 244, + 23, 209, 191, 251, 127, 23, 218, 157, 207, 31, 213, 144, 23, 218, 155, + 250, 231, 244, 249, 4, 206, 61, 23, 218, 155, 250, 231, 244, 249, 219, + 189, 206, 61, 23, 218, 155, 250, 231, 244, 249, 4, 237, 244, 23, 218, + 155, 250, 231, 244, 249, 219, 189, 237, 244, 23, 218, 157, 250, 231, 244, + 249, 232, 29, 197, 149, 4, 206, 61, 23, 218, 157, 250, 231, 244, 249, + 232, 29, 197, 149, 219, 189, 206, 61, 23, 218, 157, 250, 231, 244, 249, + 232, 29, 197, 149, 222, 227, 206, 61, 23, 218, 157, 250, 231, 244, 249, + 232, 29, 197, 149, 4, 237, 244, 23, 218, 157, 250, 231, 244, 249, 232, + 29, 197, 149, 219, 189, 237, 244, 23, 218, 157, 250, 231, 244, 249, 232, + 29, 197, 149, 222, 227, 237, 244, 23, 218, 155, 196, 247, 244, 249, 234, + 233, 206, 61, 23, 218, 155, 196, 247, 244, 249, 234, 233, 237, 244, 23, + 218, 157, 196, 247, 244, 249, 232, 29, 197, 149, 206, 61, 23, 218, 157, + 196, 247, 244, 249, 232, 29, 197, 149, 237, 244, 23, 218, 155, 235, 127, + 244, 246, 206, 61, 23, 218, 155, 235, 127, 244, 246, 237, 244, 23, 218, + 157, 235, 127, 244, 246, 232, 29, 197, 149, 206, 61, 23, 218, 157, 235, + 127, 244, 246, 232, 29, 197, 149, 237, 244, 23, 237, 160, 250, 217, 205, + 224, 23, 237, 160, 250, 217, 222, 226, 23, 237, 160, 235, 202, 23, 237, + 160, 205, 227, 23, 237, 160, 203, 16, 23, 237, 160, 210, 134, 23, 237, + 160, 206, 67, 23, 237, 160, 206, 68, 251, 127, 23, 237, 160, 236, 98, + 214, 45, 202, 78, 23, 237, 160, 233, 114, 23, 232, 136, 23, 232, 137, + 210, 7, 23, 232, 137, 218, 155, 204, 217, 23, 232, 137, 218, 155, 202, + 81, 23, 232, 137, 218, 157, 204, 217, 23, 232, 137, 218, 155, 241, 10, + 23, 232, 137, 218, 157, 241, 10, 23, 232, 137, 218, 160, 244, 248, 23, + 235, 233, 239, 84, 212, 78, 216, 20, 235, 11, 202, 79, 23, 235, 233, 239, + 84, 212, 78, 216, 20, 124, 214, 72, 237, 234, 23, 235, 233, 239, 84, 212, + 78, 216, 20, 124, 214, 72, 135, 202, 79, 23, 236, 64, 204, 218, 200, 36, + 23, 236, 64, 204, 218, 217, 83, 23, 236, 64, 204, 218, 237, 234, 23, 237, + 218, 236, 64, 217, 84, 237, 234, 23, 237, 218, 236, 64, 135, 217, 83, 23, + 237, 218, 236, 64, 124, 217, 83, 23, 237, 218, 236, 64, 217, 84, 200, 36, + 23, 235, 28, 217, 83, 23, 235, 28, 241, 133, 23, 235, 28, 196, 250, 23, + 236, 59, 214, 91, 23, 236, 59, 205, 89, 23, 236, 59, 244, 201, 23, 236, + 67, 248, 126, 206, 61, 23, 236, 67, 248, 126, 218, 118, 23, 236, 59, 157, + 214, 91, 23, 236, 59, 197, 62, 214, 91, 23, 236, 59, 157, 244, 201, 23, + 236, 59, 197, 60, 218, 159, 23, 236, 67, 197, 43, 23, 236, 60, 200, 36, + 23, 236, 60, 237, 234, 23, 236, 60, 235, 55, 23, 236, 62, 204, 217, 23, + 236, 62, 204, 218, 237, 244, 23, 236, 62, 204, 218, 251, 127, 23, 236, + 63, 204, 217, 23, 236, 63, 204, 218, 237, 244, 23, 236, 63, 204, 218, + 251, 127, 23, 236, 62, 241, 8, 23, 236, 63, 241, 8, 23, 236, 62, 244, + 243, 23, 245, 96, 211, 216, 23, 245, 96, 217, 83, 23, 245, 96, 204, 131, + 23, 203, 17, 245, 96, 232, 47, 23, 203, 17, 245, 96, 219, 62, 23, 203, + 17, 245, 96, 221, 207, 23, 237, 73, 23, 216, 20, 217, 83, 23, 216, 20, + 241, 133, 23, 216, 20, 196, 248, 23, 216, 20, 197, 57, 23, 251, 189, 248, + 119, 214, 33, 23, 251, 189, 204, 130, 226, 85, 23, 251, 189, 248, 121, 4, + 209, 189, 23, 251, 189, 204, 132, 4, 209, 189, 23, 248, 48, 226, 57, 23, + 248, 48, 236, 87, 23, 218, 164, 244, 202, 217, 83, 23, 218, 164, 244, + 202, 235, 10, 23, 218, 164, 244, 202, 241, 133, 23, 218, 164, 205, 219, + 23, 218, 164, 205, 220, 196, 250, 23, 218, 164, 205, 220, 214, 91, 23, + 218, 164, 234, 229, 23, 218, 164, 234, 230, 196, 250, 23, 218, 164, 234, + 230, 214, 91, 23, 218, 164, 192, 244, 248, 23, 218, 164, 192, 235, 10, + 23, 218, 164, 192, 196, 250, 23, 218, 164, 192, 214, 26, 23, 218, 164, + 192, 214, 27, 196, 250, 23, 218, 164, 192, 214, 27, 196, 77, 23, 218, + 164, 192, 210, 162, 23, 218, 164, 192, 210, 163, 196, 250, 23, 218, 164, + 192, 210, 163, 196, 77, 23, 218, 164, 224, 56, 23, 218, 164, 224, 57, + 235, 10, 23, 218, 164, 224, 57, 196, 250, 23, 218, 164, 203, 16, 23, 218, + 164, 203, 17, 235, 10, 23, 218, 164, 203, 17, 204, 131, 23, 222, 59, 212, + 22, 202, 19, 23, 222, 61, 221, 202, 127, 200, 32, 23, 222, 61, 200, 33, + 127, 221, 201, 23, 218, 164, 241, 99, 23, 218, 164, 196, 249, 206, 61, + 23, 218, 164, 196, 249, 237, 244, 23, 201, 250, 204, 237, 214, 34, 235, + 204, 23, 201, 250, 222, 104, 222, 58, 23, 201, 250, 202, 68, 248, 203, + 222, 58, 23, 201, 250, 202, 68, 201, 225, 226, 41, 218, 163, 23, 201, + 250, 226, 41, 218, 164, 210, 134, 23, 201, 250, 218, 154, 251, 214, 245, + 97, 23, 201, 250, 247, 36, 204, 237, 214, 33, 23, 201, 250, 247, 36, 226, + 41, 218, 163, 23, 203, 44, 23, 203, 45, 218, 159, 23, 203, 45, 214, 119, + 201, 249, 23, 203, 45, 214, 119, 201, 250, 218, 159, 23, 203, 45, 214, + 119, 222, 58, 23, 203, 45, 214, 119, 222, 59, 218, 159, 23, 203, 45, 248, + 142, 222, 58, 23, 218, 155, 225, 196, 23, 218, 157, 225, 196, 23, 217, + 108, 23, 232, 232, 23, 236, 90, 23, 206, 164, 232, 35, 205, 122, 23, 206, + 164, 232, 35, 212, 76, 23, 197, 147, 206, 164, 232, 35, 218, 162, 23, + 235, 67, 206, 164, 232, 35, 218, 162, 23, 206, 164, 202, 80, 234, 234, + 197, 153, 23, 201, 232, 204, 218, 204, 205, 23, 201, 232, 241, 9, 248, + 220, 23, 201, 233, 200, 218, 23, 200, 33, 248, 110, 202, 80, 234, 234, + 232, 35, 225, 122, 23, 222, 86, 244, 163, 23, 222, 86, 222, 156, 23, 222, + 86, 222, 155, 23, 222, 86, 222, 154, 23, 222, 86, 222, 153, 23, 222, 86, + 222, 152, 23, 222, 86, 222, 151, 23, 222, 86, 222, 150, 23, 235, 126, 23, + 222, 0, 205, 148, 23, 222, 1, 205, 148, 23, 222, 3, 232, 110, 23, 222, 3, + 197, 58, 23, 222, 3, 239, 198, 23, 222, 3, 232, 137, 217, 108, 23, 222, + 3, 201, 234, 23, 222, 3, 222, 85, 239, 116, 23, 244, 158, 23, 234, 216, + 204, 226, 23, 207, 105, 23, 244, 167, 23, 213, 139, 23, 235, 136, 218, + 226, 23, 235, 136, 218, 225, 23, 235, 136, 218, 224, 23, 235, 136, 218, + 223, 23, 235, 136, 218, 222, 23, 209, 193, 218, 226, 23, 209, 193, 218, + 225, 23, 209, 193, 218, 224, 23, 209, 193, 218, 223, 23, 209, 193, 218, + 222, 23, 209, 193, 218, 221, 23, 209, 193, 218, 220, 23, 209, 193, 218, + 219, 23, 209, 193, 218, 233, 23, 209, 193, 218, 232, 23, 209, 193, 218, + 231, 23, 209, 193, 218, 230, 23, 209, 193, 218, 229, 23, 209, 193, 218, + 228, 23, 209, 193, 218, 227, 38, 125, 1, 250, 112, 38, 125, 1, 248, 8, + 38, 125, 1, 199, 116, 38, 125, 1, 233, 158, 38, 125, 1, 239, 22, 38, 125, + 1, 196, 38, 38, 125, 1, 195, 58, 38, 125, 1, 195, 84, 38, 125, 1, 225, + 220, 38, 125, 1, 84, 225, 220, 38, 125, 1, 68, 38, 125, 1, 239, 43, 38, + 125, 1, 225, 22, 38, 125, 1, 222, 38, 38, 125, 1, 218, 58, 38, 125, 1, + 217, 205, 38, 125, 1, 214, 103, 38, 125, 1, 212, 103, 38, 125, 1, 209, + 249, 38, 125, 1, 205, 229, 38, 125, 1, 200, 246, 38, 125, 1, 200, 83, 38, + 125, 1, 234, 237, 38, 125, 1, 232, 90, 38, 125, 1, 206, 154, 38, 125, 1, + 201, 92, 38, 125, 1, 245, 35, 38, 125, 1, 207, 50, 38, 125, 1, 196, 47, + 38, 125, 1, 196, 49, 38, 125, 1, 196, 82, 38, 125, 1, 195, 217, 38, 125, + 1, 4, 195, 182, 38, 125, 1, 196, 3, 38, 125, 1, 226, 5, 4, 195, 182, 38, + 125, 1, 248, 170, 195, 182, 38, 125, 1, 226, 5, 248, 170, 195, 182, 38, + 125, 1, 235, 102, 215, 87, 211, 223, 86, 1, 166, 215, 87, 211, 223, 86, + 1, 201, 113, 215, 87, 211, 223, 86, 1, 215, 206, 215, 87, 211, 223, 86, + 1, 189, 215, 87, 211, 223, 86, 1, 142, 215, 87, 211, 223, 86, 1, 176, + 215, 87, 211, 223, 86, 1, 196, 208, 215, 87, 211, 223, 86, 1, 216, 117, + 215, 87, 211, 223, 86, 1, 247, 173, 215, 87, 211, 223, 86, 1, 172, 215, + 87, 211, 223, 86, 1, 183, 215, 87, 211, 223, 86, 1, 195, 115, 215, 87, + 211, 223, 86, 1, 217, 162, 215, 87, 211, 223, 86, 1, 215, 193, 215, 87, + 211, 223, 86, 1, 155, 215, 87, 211, 223, 86, 1, 240, 135, 215, 87, 211, + 223, 86, 1, 215, 108, 215, 87, 211, 223, 86, 1, 215, 251, 215, 87, 211, + 223, 86, 1, 199, 152, 215, 87, 211, 223, 86, 1, 215, 187, 215, 87, 211, + 223, 86, 1, 200, 210, 215, 87, 211, 223, 86, 1, 235, 238, 215, 87, 211, + 223, 86, 1, 169, 215, 87, 211, 223, 86, 1, 211, 158, 215, 87, 211, 223, + 86, 1, 164, 215, 87, 211, 223, 86, 1, 215, 253, 215, 87, 211, 223, 86, 1, + 161, 215, 87, 211, 223, 86, 1, 196, 164, 215, 87, 211, 223, 86, 1, 215, + 255, 215, 87, 211, 223, 86, 1, 239, 39, 215, 87, 211, 223, 86, 1, 215, + 254, 215, 87, 211, 223, 86, 1, 232, 235, 215, 87, 211, 223, 86, 1, 219, + 1, 215, 87, 211, 223, 86, 1, 212, 149, 215, 87, 211, 223, 86, 1, 234, + 122, 215, 87, 211, 223, 86, 1, 209, 181, 215, 87, 211, 223, 86, 1, 63, + 215, 87, 211, 223, 86, 1, 252, 167, 215, 87, 211, 223, 86, 1, 68, 215, + 87, 211, 223, 86, 1, 66, 215, 87, 211, 223, 86, 1, 72, 215, 87, 211, 223, + 86, 1, 214, 101, 215, 87, 211, 223, 86, 1, 69, 215, 87, 211, 223, 86, 1, + 237, 53, 215, 87, 211, 223, 86, 1, 197, 199, 215, 87, 211, 223, 86, 202, + 2, 215, 87, 211, 223, 86, 201, 254, 215, 87, 211, 223, 86, 201, 255, 215, + 87, 211, 223, 86, 201, 252, 215, 87, 211, 223, 86, 201, 253, 215, 87, + 211, 223, 86, 202, 0, 215, 87, 211, 223, 86, 202, 1, 215, 87, 211, 223, + 86, 2, 36, 213, 27, 215, 87, 211, 223, 86, 2, 36, 202, 187, 215, 87, 211, + 223, 86, 2, 36, 222, 2, 215, 87, 211, 223, 86, 2, 36, 251, 80, 215, 87, + 211, 223, 86, 2, 36, 226, 17, 215, 87, 211, 223, 86, 2, 196, 172, 196, + 171, 215, 87, 211, 223, 86, 5, 222, 149, 215, 87, 211, 223, 86, 17, 195, + 79, 215, 87, 211, 223, 86, 17, 100, 215, 87, 211, 223, 86, 17, 102, 215, + 87, 211, 223, 86, 17, 134, 215, 87, 211, 223, 86, 17, 136, 215, 87, 211, + 223, 86, 17, 146, 215, 87, 211, 223, 86, 17, 167, 215, 87, 211, 223, 86, + 17, 178, 215, 87, 211, 223, 86, 17, 171, 215, 87, 211, 223, 86, 17, 182, + 215, 87, 211, 223, 86, 221, 247, 215, 103, 215, 87, 211, 223, 86, 46, + 247, 173, 197, 145, 1, 252, 167, 197, 145, 1, 63, 197, 145, 1, 249, 144, + 197, 145, 1, 247, 173, 197, 145, 1, 240, 135, 197, 145, 1, 234, 122, 197, + 145, 1, 164, 197, 145, 1, 213, 5, 197, 145, 1, 172, 197, 145, 1, 176, + 197, 145, 1, 161, 197, 145, 1, 189, 197, 145, 1, 202, 233, 197, 145, 1, + 235, 238, 197, 145, 1, 183, 197, 145, 1, 207, 50, 197, 145, 1, 225, 213, + 197, 145, 1, 195, 115, 197, 145, 1, 197, 166, 197, 145, 1, 199, 152, 197, + 145, 1, 155, 197, 145, 1, 72, 197, 145, 1, 250, 149, 197, 145, 1, 169, + 197, 145, 1, 166, 197, 145, 1, 224, 145, 197, 145, 1, 142, 197, 145, 1, + 69, 197, 145, 1, 68, 197, 145, 1, 217, 70, 197, 145, 1, 66, 197, 145, 1, + 222, 29, 197, 145, 1, 201, 113, 197, 145, 1, 201, 217, 197, 145, 1, 214, + 108, 197, 145, 1, 252, 126, 197, 145, 1, 251, 96, 197, 145, 1, 226, 59, + 197, 145, 1, 214, 118, 197, 145, 1, 236, 229, 197, 145, 1, 252, 127, 197, + 145, 1, 215, 108, 197, 145, 1, 200, 95, 197, 145, 1, 196, 15, 197, 145, + 152, 201, 13, 197, 145, 152, 201, 12, 197, 145, 152, 223, 254, 197, 145, + 152, 223, 253, 197, 145, 17, 195, 79, 197, 145, 17, 100, 197, 145, 17, + 102, 197, 145, 17, 134, 197, 145, 17, 136, 197, 145, 17, 146, 197, 145, + 17, 167, 197, 145, 17, 178, 197, 145, 17, 171, 197, 145, 17, 182, 197, + 145, 216, 234, 55, 81, 80, 5, 221, 134, 224, 100, 81, 80, 5, 221, 130, + 155, 81, 80, 5, 221, 128, 223, 186, 81, 80, 5, 221, 4, 224, 199, 81, 80, + 5, 220, 230, 224, 208, 81, 80, 5, 220, 249, 223, 241, 81, 80, 5, 221, 21, + 224, 10, 81, 80, 5, 220, 146, 223, 173, 81, 80, 5, 221, 125, 197, 70, 81, + 80, 5, 221, 123, 197, 166, 81, 80, 5, 221, 121, 196, 243, 81, 80, 5, 220, + 199, 197, 98, 81, 80, 5, 220, 207, 197, 109, 81, 80, 5, 220, 211, 197, + 15, 81, 80, 5, 221, 24, 197, 34, 81, 80, 5, 220, 131, 196, 239, 81, 80, + 5, 220, 182, 197, 96, 81, 80, 5, 221, 8, 196, 227, 81, 80, 5, 221, 20, + 196, 229, 81, 80, 5, 220, 186, 196, 228, 81, 80, 5, 221, 119, 219, 22, + 81, 80, 5, 221, 117, 220, 61, 81, 80, 5, 221, 115, 218, 112, 81, 80, 5, + 221, 10, 219, 163, 81, 80, 5, 220, 231, 218, 214, 81, 80, 5, 220, 171, + 218, 137, 81, 80, 5, 220, 136, 218, 131, 81, 80, 5, 221, 113, 248, 183, + 81, 80, 5, 221, 110, 249, 144, 81, 80, 5, 221, 108, 248, 20, 81, 80, 5, + 220, 175, 248, 250, 81, 80, 5, 220, 228, 249, 8, 81, 80, 5, 220, 222, + 248, 102, 81, 80, 5, 220, 187, 248, 115, 81, 80, 5, 221, 98, 68, 81, 80, + 5, 221, 96, 63, 81, 80, 5, 221, 94, 66, 81, 80, 5, 220, 162, 237, 53, 81, + 80, 5, 220, 225, 69, 81, 80, 5, 220, 160, 214, 101, 81, 80, 5, 220, 178, + 72, 81, 80, 5, 220, 188, 237, 32, 81, 80, 5, 220, 194, 226, 85, 81, 80, + 5, 220, 190, 226, 85, 81, 80, 5, 220, 130, 251, 105, 81, 80, 5, 220, 147, + 236, 229, 81, 80, 5, 221, 83, 206, 112, 81, 80, 5, 221, 81, 183, 81, 80, + 5, 221, 79, 204, 172, 81, 80, 5, 220, 163, 208, 129, 81, 80, 5, 220, 209, + 208, 147, 81, 80, 5, 220, 189, 205, 171, 81, 80, 5, 220, 246, 205, 200, + 81, 80, 5, 220, 129, 206, 105, 81, 80, 5, 221, 69, 222, 108, 81, 80, 5, + 221, 67, 172, 81, 80, 5, 221, 65, 221, 190, 81, 80, 5, 220, 241, 222, + 187, 81, 80, 5, 220, 252, 222, 196, 81, 80, 5, 221, 15, 221, 228, 81, 80, + 5, 220, 172, 222, 6, 81, 80, 5, 220, 215, 181, 222, 196, 81, 80, 5, 221, + 91, 239, 151, 81, 80, 5, 221, 88, 240, 135, 81, 80, 5, 221, 85, 237, 200, + 81, 80, 5, 220, 236, 239, 236, 81, 80, 5, 220, 145, 239, 2, 81, 80, 5, + 220, 144, 239, 27, 81, 80, 5, 221, 77, 202, 122, 81, 80, 5, 221, 74, 189, + 81, 80, 5, 221, 72, 201, 40, 81, 80, 5, 220, 234, 203, 48, 81, 80, 5, + 221, 14, 203, 68, 81, 80, 5, 220, 221, 201, 247, 81, 80, 5, 221, 0, 149, + 81, 80, 5, 221, 63, 225, 171, 81, 80, 5, 221, 60, 225, 213, 81, 80, 5, + 221, 58, 225, 109, 81, 80, 5, 220, 168, 225, 190, 81, 80, 5, 220, 212, + 225, 192, 81, 80, 5, 220, 165, 225, 118, 81, 80, 5, 221, 6, 225, 128, 81, + 80, 5, 220, 150, 181, 225, 128, 81, 80, 5, 221, 56, 196, 24, 81, 80, 5, + 221, 53, 164, 81, 80, 5, 221, 51, 195, 217, 81, 80, 5, 220, 216, 196, 66, + 81, 80, 5, 220, 245, 196, 69, 81, 80, 5, 220, 184, 195, 237, 81, 80, 5, + 220, 204, 196, 3, 81, 80, 5, 221, 47, 235, 152, 81, 80, 5, 221, 45, 235, + 238, 81, 80, 5, 221, 43, 234, 222, 81, 80, 5, 220, 247, 235, 181, 81, 80, + 5, 220, 250, 235, 188, 81, 80, 5, 220, 192, 235, 39, 81, 80, 5, 220, 237, + 235, 50, 81, 80, 5, 220, 128, 234, 221, 81, 80, 5, 220, 224, 235, 209, + 81, 80, 5, 221, 41, 216, 182, 81, 80, 5, 221, 39, 217, 220, 81, 80, 5, + 221, 37, 215, 137, 81, 80, 5, 220, 208, 217, 100, 81, 80, 5, 220, 156, + 216, 37, 81, 80, 5, 220, 149, 232, 70, 81, 80, 5, 221, 32, 142, 81, 80, + 5, 220, 139, 231, 74, 81, 80, 5, 221, 35, 232, 117, 81, 80, 5, 220, 229, + 232, 146, 81, 80, 5, 221, 30, 231, 165, 81, 80, 5, 220, 185, 231, 192, + 81, 80, 5, 220, 242, 232, 116, 81, 80, 5, 220, 197, 231, 158, 81, 80, 5, + 221, 16, 232, 40, 81, 80, 5, 220, 195, 232, 211, 81, 80, 5, 220, 238, + 231, 58, 81, 80, 5, 221, 17, 232, 100, 81, 80, 5, 220, 132, 231, 168, 81, + 80, 5, 221, 23, 231, 70, 81, 80, 5, 220, 235, 217, 35, 81, 80, 5, 221, + 28, 217, 49, 81, 80, 5, 220, 243, 217, 32, 81, 80, 5, 220, 210, 217, 43, + 81, 80, 5, 220, 179, 217, 44, 81, 80, 5, 220, 169, 217, 33, 81, 80, 5, + 220, 205, 217, 34, 81, 80, 5, 220, 166, 217, 48, 81, 80, 5, 220, 198, + 217, 31, 81, 80, 5, 220, 239, 181, 217, 44, 81, 80, 5, 220, 219, 181, + 217, 33, 81, 80, 5, 220, 142, 181, 217, 34, 81, 80, 5, 220, 170, 233, + 191, 81, 80, 5, 220, 214, 234, 122, 81, 80, 5, 220, 157, 233, 75, 81, 80, + 5, 220, 135, 234, 39, 81, 80, 5, 220, 159, 233, 61, 81, 80, 5, 220, 158, + 233, 71, 81, 80, 5, 220, 141, 217, 54, 81, 80, 5, 221, 12, 216, 247, 81, + 80, 5, 220, 148, 216, 236, 81, 80, 5, 221, 1, 212, 219, 81, 80, 5, 220, + 226, 161, 81, 80, 5, 221, 19, 211, 226, 81, 80, 5, 220, 244, 213, 78, 81, + 80, 5, 221, 18, 213, 91, 81, 80, 5, 220, 223, 212, 90, 81, 80, 5, 221, 3, + 212, 116, 81, 80, 5, 220, 180, 219, 225, 81, 80, 5, 221, 7, 219, 240, 81, + 80, 5, 220, 203, 219, 219, 81, 80, 5, 221, 22, 219, 232, 81, 80, 5, 220, + 137, 219, 232, 81, 80, 5, 220, 253, 219, 233, 81, 80, 5, 220, 153, 219, + 220, 81, 80, 5, 220, 151, 219, 221, 81, 80, 5, 220, 138, 219, 213, 81, + 80, 5, 220, 164, 181, 219, 233, 81, 80, 5, 220, 220, 181, 219, 220, 81, + 80, 5, 220, 183, 181, 219, 221, 81, 80, 5, 220, 193, 223, 214, 81, 80, 5, + 220, 233, 223, 222, 81, 80, 5, 220, 251, 223, 210, 81, 80, 5, 221, 26, + 223, 217, 81, 80, 5, 220, 217, 223, 218, 81, 80, 5, 220, 213, 223, 212, + 81, 80, 5, 220, 167, 223, 213, 81, 80, 5, 220, 201, 234, 56, 81, 80, 5, + 221, 13, 234, 64, 81, 80, 5, 220, 177, 234, 51, 81, 80, 5, 220, 232, 234, + 60, 81, 80, 5, 220, 218, 234, 61, 81, 80, 5, 220, 254, 234, 52, 81, 80, + 5, 220, 255, 234, 54, 81, 80, 5, 220, 154, 169, 81, 80, 5, 220, 202, 217, + 143, 81, 80, 5, 220, 196, 217, 158, 81, 80, 5, 220, 200, 217, 125, 81, + 80, 5, 220, 134, 217, 149, 81, 80, 5, 220, 206, 217, 150, 81, 80, 5, 221, + 2, 217, 130, 81, 80, 5, 221, 5, 217, 134, 81, 80, 5, 220, 173, 216, 163, + 81, 80, 5, 220, 133, 216, 133, 81, 80, 5, 220, 176, 216, 154, 81, 80, 5, + 220, 191, 216, 137, 81, 80, 5, 220, 143, 199, 34, 81, 80, 5, 220, 140, + 199, 152, 81, 80, 5, 220, 174, 197, 220, 81, 80, 5, 220, 152, 199, 113, + 81, 80, 5, 220, 240, 199, 118, 81, 80, 5, 220, 181, 198, 233, 81, 80, 5, + 220, 248, 198, 248, 81, 80, 5, 220, 161, 215, 81, 81, 80, 5, 221, 11, + 215, 101, 81, 80, 5, 220, 155, 215, 63, 81, 80, 5, 220, 227, 215, 93, 81, + 80, 5, 221, 9, 215, 70, 81, 80, 17, 100, 81, 80, 17, 102, 81, 80, 17, + 134, 81, 80, 17, 136, 81, 80, 17, 146, 81, 80, 17, 167, 81, 80, 17, 178, + 81, 80, 17, 171, 81, 80, 17, 182, 81, 80, 38, 31, 203, 46, 81, 80, 38, + 31, 203, 18, 81, 80, 38, 31, 231, 54, 81, 80, 38, 31, 202, 157, 81, 80, + 38, 31, 203, 24, 202, 157, 81, 80, 38, 31, 231, 57, 202, 157, 81, 80, 38, + 31, 219, 25, 251, 252, 6, 1, 251, 151, 251, 252, 6, 1, 240, 132, 251, + 252, 6, 1, 223, 79, 251, 252, 6, 1, 219, 38, 251, 252, 6, 1, 249, 144, + 251, 252, 6, 1, 206, 56, 251, 252, 6, 1, 213, 91, 251, 252, 6, 1, 248, + 191, 251, 252, 6, 1, 169, 251, 252, 6, 1, 69, 251, 252, 6, 1, 235, 238, + 251, 252, 6, 1, 68, 251, 252, 6, 1, 72, 251, 252, 6, 1, 239, 175, 251, + 252, 6, 1, 196, 25, 251, 252, 6, 1, 197, 117, 251, 252, 6, 1, 215, 137, + 251, 252, 6, 1, 225, 34, 251, 252, 6, 1, 164, 251, 252, 6, 1, 66, 251, + 252, 6, 1, 225, 162, 251, 252, 6, 1, 245, 74, 251, 252, 6, 1, 142, 251, + 252, 6, 1, 211, 156, 251, 252, 6, 1, 234, 122, 251, 252, 6, 1, 215, 108, + 251, 252, 6, 1, 201, 40, 251, 252, 6, 1, 216, 226, 251, 252, 6, 1, 199, + 152, 251, 252, 6, 1, 224, 145, 251, 252, 6, 1, 234, 61, 251, 252, 6, 1, + 195, 104, 251, 252, 6, 1, 223, 213, 251, 252, 6, 1, 207, 50, 251, 252, 4, + 1, 251, 151, 251, 252, 4, 1, 240, 132, 251, 252, 4, 1, 223, 79, 251, 252, + 4, 1, 219, 38, 251, 252, 4, 1, 249, 144, 251, 252, 4, 1, 206, 56, 251, + 252, 4, 1, 213, 91, 251, 252, 4, 1, 248, 191, 251, 252, 4, 1, 169, 251, + 252, 4, 1, 69, 251, 252, 4, 1, 235, 238, 251, 252, 4, 1, 68, 251, 252, 4, + 1, 72, 251, 252, 4, 1, 239, 175, 251, 252, 4, 1, 196, 25, 251, 252, 4, 1, + 197, 117, 251, 252, 4, 1, 215, 137, 251, 252, 4, 1, 225, 34, 251, 252, 4, + 1, 164, 251, 252, 4, 1, 66, 251, 252, 4, 1, 225, 162, 251, 252, 4, 1, + 245, 74, 251, 252, 4, 1, 142, 251, 252, 4, 1, 211, 156, 251, 252, 4, 1, + 234, 122, 251, 252, 4, 1, 215, 108, 251, 252, 4, 1, 201, 40, 251, 252, 4, + 1, 216, 226, 251, 252, 4, 1, 199, 152, 251, 252, 4, 1, 224, 145, 251, + 252, 4, 1, 234, 61, 251, 252, 4, 1, 195, 104, 251, 252, 4, 1, 223, 213, + 251, 252, 4, 1, 207, 50, 251, 252, 251, 152, 222, 149, 251, 252, 18, 222, + 149, 251, 252, 234, 35, 78, 251, 252, 232, 212, 251, 252, 108, 218, 234, + 251, 252, 234, 36, 108, 218, 234, 251, 252, 215, 148, 251, 252, 217, 207, + 78, 251, 252, 17, 195, 79, 251, 252, 17, 100, 251, 252, 17, 102, 251, + 252, 17, 134, 251, 252, 17, 136, 251, 252, 17, 146, 251, 252, 17, 167, + 251, 252, 17, 178, 251, 252, 17, 171, 251, 252, 17, 182, 251, 252, 84, + 236, 89, 78, 251, 252, 84, 211, 78, 78, 226, 69, 128, 31, 100, 226, 69, + 128, 31, 102, 226, 69, 128, 31, 134, 226, 69, 128, 31, 136, 226, 69, 128, + 31, 146, 226, 69, 128, 31, 167, 226, 69, 128, 31, 178, 226, 69, 128, 31, + 171, 226, 69, 128, 31, 182, 226, 69, 128, 31, 203, 23, 226, 69, 128, 31, + 200, 234, 226, 69, 128, 31, 202, 177, 226, 69, 128, 31, 235, 13, 226, 69, + 128, 31, 235, 144, 226, 69, 128, 31, 206, 13, 226, 69, 128, 31, 207, 65, + 226, 69, 128, 31, 237, 19, 226, 69, 128, 31, 216, 173, 226, 69, 128, 31, + 97, 231, 56, 226, 69, 128, 31, 99, 231, 56, 226, 69, 128, 31, 115, 231, + 56, 226, 69, 128, 31, 235, 6, 231, 56, 226, 69, 128, 31, 235, 100, 231, + 56, 226, 69, 128, 31, 206, 29, 231, 56, 226, 69, 128, 31, 207, 71, 231, + 56, 226, 69, 128, 31, 237, 30, 231, 56, 226, 69, 128, 31, 216, 178, 231, + 56, 226, 69, 128, 31, 97, 170, 226, 69, 128, 31, 99, 170, 226, 69, 128, + 31, 115, 170, 226, 69, 128, 31, 235, 6, 170, 226, 69, 128, 31, 235, 100, + 170, 226, 69, 128, 31, 206, 29, 170, 226, 69, 128, 31, 207, 71, 170, 226, + 69, 128, 31, 237, 30, 170, 226, 69, 128, 31, 216, 178, 170, 226, 69, 128, + 31, 203, 24, 170, 226, 69, 128, 31, 200, 235, 170, 226, 69, 128, 31, 202, + 178, 170, 226, 69, 128, 31, 235, 14, 170, 226, 69, 128, 31, 235, 145, + 170, 226, 69, 128, 31, 206, 14, 170, 226, 69, 128, 31, 207, 66, 170, 226, + 69, 128, 31, 237, 20, 170, 226, 69, 128, 31, 216, 174, 170, 226, 69, 128, + 31, 222, 254, 226, 69, 128, 31, 222, 253, 226, 69, 128, 222, 255, 78, + 226, 69, 128, 31, 224, 245, 226, 69, 128, 31, 224, 244, 226, 69, 128, 31, + 212, 30, 100, 226, 69, 128, 31, 212, 30, 102, 226, 69, 128, 31, 212, 30, + 134, 226, 69, 128, 31, 212, 30, 136, 226, 69, 128, 31, 212, 30, 146, 226, + 69, 128, 31, 212, 30, 167, 226, 69, 128, 31, 212, 30, 178, 226, 69, 128, + 31, 212, 30, 171, 226, 69, 128, 31, 212, 30, 182, 226, 69, 128, 212, 146, + 226, 69, 128, 191, 97, 211, 86, 226, 69, 128, 191, 97, 232, 224, 226, 69, + 128, 191, 115, 211, 84, 226, 69, 128, 209, 108, 78, 226, 69, 128, 31, + 251, 130, 100, 226, 69, 128, 31, 251, 130, 102, 226, 69, 128, 31, 251, + 130, 203, 24, 170, 226, 69, 128, 251, 130, 222, 255, 78, 214, 40, 128, + 31, 100, 214, 40, 128, 31, 102, 214, 40, 128, 31, 134, 214, 40, 128, 31, + 136, 214, 40, 128, 31, 146, 214, 40, 128, 31, 167, 214, 40, 128, 31, 178, + 214, 40, 128, 31, 171, 214, 40, 128, 31, 182, 214, 40, 128, 31, 203, 23, + 214, 40, 128, 31, 200, 234, 214, 40, 128, 31, 202, 177, 214, 40, 128, 31, + 235, 13, 214, 40, 128, 31, 235, 144, 214, 40, 128, 31, 206, 13, 214, 40, + 128, 31, 207, 65, 214, 40, 128, 31, 237, 19, 214, 40, 128, 31, 216, 173, + 214, 40, 128, 31, 97, 231, 56, 214, 40, 128, 31, 99, 231, 56, 214, 40, + 128, 31, 115, 231, 56, 214, 40, 128, 31, 235, 6, 231, 56, 214, 40, 128, + 31, 235, 100, 231, 56, 214, 40, 128, 31, 206, 29, 231, 56, 214, 40, 128, + 31, 207, 71, 231, 56, 214, 40, 128, 31, 237, 30, 231, 56, 214, 40, 128, + 31, 216, 178, 231, 56, 214, 40, 128, 31, 97, 170, 214, 40, 128, 31, 99, + 170, 214, 40, 128, 31, 115, 170, 214, 40, 128, 31, 235, 6, 170, 214, 40, + 128, 31, 235, 100, 170, 214, 40, 128, 31, 206, 29, 170, 214, 40, 128, 31, + 207, 71, 170, 214, 40, 128, 31, 237, 30, 170, 214, 40, 128, 31, 216, 178, + 170, 214, 40, 128, 31, 203, 24, 170, 214, 40, 128, 31, 200, 235, 170, + 214, 40, 128, 31, 202, 178, 170, 214, 40, 128, 31, 235, 14, 170, 214, 40, + 128, 31, 235, 145, 170, 214, 40, 128, 31, 206, 14, 170, 214, 40, 128, 31, + 207, 66, 170, 214, 40, 128, 31, 237, 20, 170, 214, 40, 128, 31, 216, 174, + 170, 214, 40, 128, 220, 21, 214, 40, 128, 251, 130, 31, 102, 214, 40, + 128, 251, 130, 31, 134, 214, 40, 128, 251, 130, 31, 136, 214, 40, 128, + 251, 130, 31, 146, 214, 40, 128, 251, 130, 31, 167, 214, 40, 128, 251, + 130, 31, 178, 214, 40, 128, 251, 130, 31, 171, 214, 40, 128, 251, 130, + 31, 182, 214, 40, 128, 251, 130, 31, 203, 23, 214, 40, 128, 251, 130, 31, + 235, 6, 231, 56, 214, 40, 128, 251, 130, 31, 206, 29, 231, 56, 214, 40, + 128, 251, 130, 31, 99, 170, 214, 40, 128, 251, 130, 31, 203, 24, 170, + 214, 40, 128, 191, 97, 232, 224, 214, 40, 128, 191, 97, 206, 17, 9, 13, + 251, 163, 9, 13, 248, 238, 9, 13, 225, 188, 9, 13, 240, 106, 9, 13, 197, + 117, 9, 13, 195, 106, 9, 13, 232, 235, 9, 13, 203, 139, 9, 13, 196, 64, + 9, 13, 225, 34, 9, 13, 222, 248, 9, 13, 219, 184, 9, 13, 216, 30, 9, 13, + 208, 125, 9, 13, 251, 193, 9, 13, 235, 175, 9, 13, 209, 8, 9, 13, 211, + 151, 9, 13, 210, 141, 9, 13, 206, 251, 9, 13, 203, 41, 9, 13, 202, 213, + 9, 13, 224, 141, 9, 13, 202, 225, 9, 13, 240, 129, 9, 13, 195, 109, 9, + 13, 233, 224, 9, 13, 238, 251, 248, 238, 9, 13, 238, 251, 216, 30, 9, 13, + 238, 251, 235, 175, 9, 13, 238, 251, 211, 151, 9, 13, 84, 248, 238, 9, + 13, 84, 225, 188, 9, 13, 84, 232, 112, 9, 13, 84, 232, 235, 9, 13, 84, + 196, 64, 9, 13, 84, 225, 34, 9, 13, 84, 222, 248, 9, 13, 84, 219, 184, 9, + 13, 84, 216, 30, 9, 13, 84, 208, 125, 9, 13, 84, 251, 193, 9, 13, 84, + 235, 175, 9, 13, 84, 209, 8, 9, 13, 84, 211, 151, 9, 13, 84, 206, 251, 9, + 13, 84, 203, 41, 9, 13, 84, 202, 213, 9, 13, 84, 224, 141, 9, 13, 84, + 240, 129, 9, 13, 84, 233, 224, 9, 13, 203, 134, 225, 188, 9, 13, 203, + 134, 232, 235, 9, 13, 203, 134, 196, 64, 9, 13, 203, 134, 222, 248, 9, + 13, 203, 134, 216, 30, 9, 13, 203, 134, 208, 125, 9, 13, 203, 134, 251, + 193, 9, 13, 203, 134, 209, 8, 9, 13, 203, 134, 211, 151, 9, 13, 203, 134, + 206, 251, 9, 13, 203, 134, 224, 141, 9, 13, 203, 134, 240, 129, 9, 13, + 203, 134, 233, 224, 9, 13, 203, 134, 238, 251, 216, 30, 9, 13, 203, 134, + 238, 251, 211, 151, 9, 13, 204, 204, 248, 238, 9, 13, 204, 204, 225, 188, + 9, 13, 204, 204, 232, 112, 9, 13, 204, 204, 232, 235, 9, 13, 204, 204, + 203, 139, 9, 13, 204, 204, 196, 64, 9, 13, 204, 204, 225, 34, 9, 13, 204, + 204, 219, 184, 9, 13, 204, 204, 216, 30, 9, 13, 204, 204, 208, 125, 9, + 13, 204, 204, 251, 193, 9, 13, 204, 204, 235, 175, 9, 13, 204, 204, 209, + 8, 9, 13, 204, 204, 211, 151, 9, 13, 204, 204, 206, 251, 9, 13, 204, 204, + 203, 41, 9, 13, 204, 204, 202, 213, 9, 13, 204, 204, 224, 141, 9, 13, + 204, 204, 240, 129, 9, 13, 204, 204, 195, 109, 9, 13, 204, 204, 233, 224, + 9, 13, 204, 204, 238, 251, 248, 238, 9, 13, 204, 204, 238, 251, 235, 175, + 9, 13, 221, 223, 251, 163, 9, 13, 221, 223, 248, 238, 9, 13, 221, 223, + 225, 188, 9, 13, 221, 223, 240, 106, 9, 13, 221, 223, 232, 112, 9, 13, + 221, 223, 197, 117, 9, 13, 221, 223, 195, 106, 9, 13, 221, 223, 232, 235, + 9, 13, 221, 223, 203, 139, 9, 13, 221, 223, 196, 64, 9, 13, 221, 223, + 222, 248, 9, 13, 221, 223, 219, 184, 9, 13, 221, 223, 216, 30, 9, 13, + 221, 223, 208, 125, 9, 13, 221, 223, 251, 193, 9, 13, 221, 223, 235, 175, + 9, 13, 221, 223, 209, 8, 9, 13, 221, 223, 211, 151, 9, 13, 221, 223, 210, + 141, 9, 13, 221, 223, 206, 251, 9, 13, 221, 223, 203, 41, 9, 13, 221, + 223, 202, 213, 9, 13, 221, 223, 224, 141, 9, 13, 221, 223, 202, 225, 9, + 13, 221, 223, 240, 129, 9, 13, 221, 223, 195, 109, 9, 13, 221, 223, 233, + 224, 9, 13, 237, 240, 248, 238, 9, 13, 237, 240, 225, 188, 9, 13, 237, + 240, 240, 106, 9, 13, 237, 240, 197, 117, 9, 13, 237, 240, 195, 106, 9, + 13, 237, 240, 232, 235, 9, 13, 237, 240, 203, 139, 9, 13, 237, 240, 196, + 64, 9, 13, 237, 240, 222, 248, 9, 13, 237, 240, 219, 184, 9, 13, 237, + 240, 216, 30, 9, 13, 237, 240, 208, 125, 9, 13, 237, 240, 251, 193, 9, + 13, 237, 240, 235, 175, 9, 13, 237, 240, 209, 8, 9, 13, 237, 240, 211, + 151, 9, 13, 237, 240, 210, 141, 9, 13, 237, 240, 206, 251, 9, 13, 237, + 240, 203, 41, 9, 13, 237, 240, 202, 213, 9, 13, 237, 240, 224, 141, 9, + 13, 237, 240, 202, 225, 9, 13, 237, 240, 240, 129, 9, 13, 237, 240, 195, + 109, 9, 13, 237, 240, 233, 224, 9, 13, 214, 82, 87, 3, 168, 3, 203, 91, + 9, 13, 214, 82, 168, 3, 240, 106, 220, 82, 113, 237, 68, 197, 50, 220, + 82, 113, 205, 159, 197, 50, 220, 82, 113, 197, 89, 197, 50, 220, 82, 113, + 173, 197, 50, 220, 82, 113, 210, 157, 237, 222, 220, 82, 113, 233, 90, + 237, 222, 220, 82, 113, 59, 237, 222, 220, 82, 113, 97, 77, 245, 113, + 220, 82, 113, 99, 77, 245, 113, 220, 82, 113, 115, 77, 245, 113, 220, 82, + 113, 235, 6, 77, 245, 113, 220, 82, 113, 235, 100, 77, 245, 113, 220, 82, + 113, 206, 29, 77, 245, 113, 220, 82, 113, 207, 71, 77, 245, 113, 220, 82, + 113, 237, 30, 77, 245, 113, 220, 82, 113, 216, 178, 77, 245, 113, 220, + 82, 113, 97, 77, 249, 93, 220, 82, 113, 99, 77, 249, 93, 220, 82, 113, + 115, 77, 249, 93, 220, 82, 113, 235, 6, 77, 249, 93, 220, 82, 113, 235, + 100, 77, 249, 93, 220, 82, 113, 206, 29, 77, 249, 93, 220, 82, 113, 207, + 71, 77, 249, 93, 220, 82, 113, 237, 30, 77, 249, 93, 220, 82, 113, 216, + 178, 77, 249, 93, 220, 82, 113, 97, 77, 244, 245, 220, 82, 113, 99, 77, + 244, 245, 220, 82, 113, 115, 77, 244, 245, 220, 82, 113, 235, 6, 77, 244, + 245, 220, 82, 113, 235, 100, 77, 244, 245, 220, 82, 113, 206, 29, 77, + 244, 245, 220, 82, 113, 207, 71, 77, 244, 245, 220, 82, 113, 237, 30, 77, + 244, 245, 220, 82, 113, 216, 178, 77, 244, 245, 220, 82, 113, 212, 127, + 220, 82, 113, 214, 68, 220, 82, 113, 249, 94, 220, 82, 113, 245, 30, 220, + 82, 113, 205, 100, 220, 82, 113, 204, 113, 220, 82, 113, 250, 135, 220, + 82, 113, 197, 41, 220, 82, 113, 225, 121, 220, 82, 113, 249, 137, 185, + 113, 231, 154, 249, 137, 185, 113, 231, 152, 185, 113, 231, 151, 185, + 113, 231, 150, 185, 113, 231, 149, 185, 113, 231, 148, 185, 113, 231, + 147, 185, 113, 231, 146, 185, 113, 231, 145, 185, 113, 231, 144, 185, + 113, 231, 143, 185, 113, 231, 142, 185, 113, 231, 141, 185, 113, 231, + 140, 185, 113, 231, 139, 185, 113, 231, 138, 185, 113, 231, 137, 185, + 113, 231, 136, 185, 113, 231, 135, 185, 113, 231, 134, 185, 113, 231, + 133, 185, 113, 231, 132, 185, 113, 231, 131, 185, 113, 231, 130, 185, + 113, 231, 129, 185, 113, 231, 128, 185, 113, 231, 127, 185, 113, 231, + 126, 185, 113, 231, 125, 185, 113, 231, 124, 185, 113, 231, 123, 185, + 113, 231, 122, 185, 113, 231, 121, 185, 113, 231, 120, 185, 113, 231, + 119, 185, 113, 231, 118, 185, 113, 231, 117, 185, 113, 231, 116, 185, + 113, 231, 115, 185, 113, 231, 114, 185, 113, 231, 113, 185, 113, 231, + 112, 185, 113, 231, 111, 185, 113, 231, 110, 185, 113, 231, 109, 185, + 113, 231, 108, 185, 113, 231, 107, 185, 113, 231, 106, 185, 113, 231, + 105, 185, 113, 231, 104, 185, 113, 83, 249, 137, 185, 113, 199, 99, 185, + 113, 199, 98, 185, 113, 199, 97, 185, 113, 199, 96, 185, 113, 199, 95, + 185, 113, 199, 94, 185, 113, 199, 93, 185, 113, 199, 92, 185, 113, 199, + 91, 185, 113, 199, 90, 185, 113, 199, 89, 185, 113, 199, 88, 185, 113, + 199, 87, 185, 113, 199, 86, 185, 113, 199, 85, 185, 113, 199, 84, 185, + 113, 199, 83, 185, 113, 199, 82, 185, 113, 199, 81, 185, 113, 199, 80, + 185, 113, 199, 79, 185, 113, 199, 78, 185, 113, 199, 77, 185, 113, 199, + 76, 185, 113, 199, 75, 185, 113, 199, 74, 185, 113, 199, 73, 185, 113, + 199, 72, 185, 113, 199, 71, 185, 113, 199, 70, 185, 113, 199, 69, 185, + 113, 199, 68, 185, 113, 199, 67, 185, 113, 199, 66, 185, 113, 199, 65, + 185, 113, 199, 64, 185, 113, 199, 63, 185, 113, 199, 62, 185, 113, 199, + 61, 185, 113, 199, 60, 185, 113, 199, 59, 185, 113, 199, 58, 185, 113, + 199, 57, 185, 113, 199, 56, 185, 113, 199, 55, 185, 113, 199, 54, 185, + 113, 199, 53, 185, 113, 199, 52, 185, 113, 199, 51, 212, 137, 247, 114, + 249, 137, 212, 137, 247, 114, 252, 15, 77, 205, 145, 212, 137, 247, 114, + 99, 77, 205, 145, 212, 137, 247, 114, 115, 77, 205, 145, 212, 137, 247, + 114, 235, 6, 77, 205, 145, 212, 137, 247, 114, 235, 100, 77, 205, 145, + 212, 137, 247, 114, 206, 29, 77, 205, 145, 212, 137, 247, 114, 207, 71, + 77, 205, 145, 212, 137, 247, 114, 237, 30, 77, 205, 145, 212, 137, 247, + 114, 216, 178, 77, 205, 145, 212, 137, 247, 114, 203, 24, 77, 205, 145, + 212, 137, 247, 114, 225, 211, 77, 205, 145, 212, 137, 247, 114, 224, 19, + 77, 205, 145, 212, 137, 247, 114, 211, 80, 77, 205, 145, 212, 137, 247, + 114, 224, 73, 77, 205, 145, 212, 137, 247, 114, 252, 15, 77, 232, 123, + 212, 137, 247, 114, 99, 77, 232, 123, 212, 137, 247, 114, 115, 77, 232, + 123, 212, 137, 247, 114, 235, 6, 77, 232, 123, 212, 137, 247, 114, 235, + 100, 77, 232, 123, 212, 137, 247, 114, 206, 29, 77, 232, 123, 212, 137, + 247, 114, 207, 71, 77, 232, 123, 212, 137, 247, 114, 237, 30, 77, 232, + 123, 212, 137, 247, 114, 216, 178, 77, 232, 123, 212, 137, 247, 114, 203, + 24, 77, 232, 123, 212, 137, 247, 114, 225, 211, 77, 232, 123, 212, 137, + 247, 114, 224, 19, 77, 232, 123, 212, 137, 247, 114, 211, 80, 77, 232, + 123, 212, 137, 247, 114, 224, 73, 77, 232, 123, 212, 137, 247, 114, 210, + 157, 225, 121, 212, 137, 247, 114, 252, 15, 77, 239, 138, 212, 137, 247, + 114, 99, 77, 239, 138, 212, 137, 247, 114, 115, 77, 239, 138, 212, 137, + 247, 114, 235, 6, 77, 239, 138, 212, 137, 247, 114, 235, 100, 77, 239, + 138, 212, 137, 247, 114, 206, 29, 77, 239, 138, 212, 137, 247, 114, 207, + 71, 77, 239, 138, 212, 137, 247, 114, 237, 30, 77, 239, 138, 212, 137, + 247, 114, 216, 178, 77, 239, 138, 212, 137, 247, 114, 203, 24, 77, 239, + 138, 212, 137, 247, 114, 225, 211, 77, 239, 138, 212, 137, 247, 114, 224, + 19, 77, 239, 138, 212, 137, 247, 114, 211, 80, 77, 239, 138, 212, 137, + 247, 114, 224, 73, 77, 239, 138, 212, 137, 247, 114, 58, 225, 121, 212, + 137, 247, 114, 252, 15, 77, 244, 187, 212, 137, 247, 114, 99, 77, 244, + 187, 212, 137, 247, 114, 115, 77, 244, 187, 212, 137, 247, 114, 235, 6, + 77, 244, 187, 212, 137, 247, 114, 235, 100, 77, 244, 187, 212, 137, 247, + 114, 206, 29, 77, 244, 187, 212, 137, 247, 114, 207, 71, 77, 244, 187, + 212, 137, 247, 114, 237, 30, 77, 244, 187, 212, 137, 247, 114, 216, 178, + 77, 244, 187, 212, 137, 247, 114, 203, 24, 77, 244, 187, 212, 137, 247, + 114, 225, 211, 77, 244, 187, 212, 137, 247, 114, 224, 19, 77, 244, 187, + 212, 137, 247, 114, 211, 80, 77, 244, 187, 212, 137, 247, 114, 224, 73, + 77, 244, 187, 212, 137, 247, 114, 59, 225, 121, 212, 137, 247, 114, 235, + 37, 212, 137, 247, 114, 201, 141, 212, 137, 247, 114, 201, 130, 212, 137, + 247, 114, 201, 127, 212, 137, 247, 114, 201, 126, 212, 137, 247, 114, + 201, 125, 212, 137, 247, 114, 201, 124, 212, 137, 247, 114, 201, 123, + 212, 137, 247, 114, 201, 122, 212, 137, 247, 114, 201, 121, 212, 137, + 247, 114, 201, 140, 212, 137, 247, 114, 201, 139, 212, 137, 247, 114, + 201, 138, 212, 137, 247, 114, 201, 137, 212, 137, 247, 114, 201, 136, + 212, 137, 247, 114, 201, 135, 212, 137, 247, 114, 201, 134, 212, 137, + 247, 114, 201, 133, 212, 137, 247, 114, 201, 132, 212, 137, 247, 114, + 201, 131, 212, 137, 247, 114, 201, 129, 212, 137, 247, 114, 201, 128, 17, + 195, 80, 234, 216, 204, 226, 17, 195, 80, 244, 158, 17, 97, 244, 158, 17, + 99, 244, 158, 17, 115, 244, 158, 17, 235, 6, 244, 158, 17, 235, 100, 244, + 158, 17, 206, 29, 244, 158, 17, 207, 71, 244, 158, 17, 237, 30, 244, 158, + 17, 216, 178, 244, 158, 239, 92, 46, 45, 17, 195, 79, 239, 92, 217, 103, + 46, 45, 17, 195, 79, 119, 8, 6, 1, 63, 119, 8, 6, 1, 250, 111, 119, 8, 6, + 1, 247, 206, 119, 8, 6, 1, 240, 230, 119, 8, 6, 1, 69, 119, 8, 6, 1, 236, + 48, 119, 8, 6, 1, 234, 189, 119, 8, 6, 1, 233, 14, 119, 8, 6, 1, 68, 119, + 8, 6, 1, 225, 216, 119, 8, 6, 1, 225, 79, 119, 8, 6, 1, 159, 119, 8, 6, + 1, 221, 135, 119, 8, 6, 1, 218, 54, 119, 8, 6, 1, 72, 119, 8, 6, 1, 214, + 2, 119, 8, 6, 1, 211, 166, 119, 8, 6, 1, 144, 119, 8, 6, 1, 209, 80, 119, + 8, 6, 1, 203, 216, 119, 8, 6, 1, 66, 119, 8, 6, 1, 199, 230, 119, 8, 6, + 1, 197, 199, 119, 8, 6, 1, 196, 222, 119, 8, 6, 1, 196, 148, 119, 8, 6, + 1, 195, 158, 201, 231, 206, 245, 248, 60, 8, 6, 1, 209, 80, 46, 41, 8, 6, + 1, 247, 206, 46, 41, 8, 6, 1, 144, 46, 247, 57, 46, 196, 224, 241, 105, + 105, 103, 8, 6, 1, 63, 103, 8, 6, 1, 250, 111, 103, 8, 6, 1, 247, 206, + 103, 8, 6, 1, 240, 230, 103, 8, 6, 1, 69, 103, 8, 6, 1, 236, 48, 103, 8, + 6, 1, 234, 189, 103, 8, 6, 1, 233, 14, 103, 8, 6, 1, 68, 103, 8, 6, 1, + 225, 216, 103, 8, 6, 1, 225, 79, 103, 8, 6, 1, 159, 103, 8, 6, 1, 221, + 135, 103, 8, 6, 1, 218, 54, 103, 8, 6, 1, 72, 103, 8, 6, 1, 214, 2, 103, + 8, 6, 1, 211, 166, 103, 8, 6, 1, 144, 103, 8, 6, 1, 209, 80, 103, 8, 6, + 1, 203, 216, 103, 8, 6, 1, 66, 103, 8, 6, 1, 199, 230, 103, 8, 6, 1, 197, + 199, 103, 8, 6, 1, 196, 222, 103, 8, 6, 1, 196, 148, 103, 8, 6, 1, 195, + 158, 103, 231, 43, 103, 218, 78, 103, 208, 149, 103, 205, 83, 103, 212, + 51, 103, 197, 110, 217, 103, 46, 8, 6, 1, 63, 217, 103, 46, 8, 6, 1, 250, + 111, 217, 103, 46, 8, 6, 1, 247, 206, 217, 103, 46, 8, 6, 1, 240, 230, + 217, 103, 46, 8, 6, 1, 69, 217, 103, 46, 8, 6, 1, 236, 48, 217, 103, 46, + 8, 6, 1, 234, 189, 217, 103, 46, 8, 6, 1, 233, 14, 217, 103, 46, 8, 6, 1, + 68, 217, 103, 46, 8, 6, 1, 225, 216, 217, 103, 46, 8, 6, 1, 225, 79, 217, + 103, 46, 8, 6, 1, 159, 217, 103, 46, 8, 6, 1, 221, 135, 217, 103, 46, 8, + 6, 1, 218, 54, 217, 103, 46, 8, 6, 1, 72, 217, 103, 46, 8, 6, 1, 214, 2, + 217, 103, 46, 8, 6, 1, 211, 166, 217, 103, 46, 8, 6, 1, 144, 217, 103, + 46, 8, 6, 1, 209, 80, 217, 103, 46, 8, 6, 1, 203, 216, 217, 103, 46, 8, + 6, 1, 66, 217, 103, 46, 8, 6, 1, 199, 230, 217, 103, 46, 8, 6, 1, 197, + 199, 217, 103, 46, 8, 6, 1, 196, 222, 217, 103, 46, 8, 6, 1, 196, 148, + 217, 103, 46, 8, 6, 1, 195, 158, 210, 214, 219, 212, 55, 210, 214, 219, + 209, 55, 210, 214, 218, 149, 55, 217, 103, 103, 8, 6, 1, 63, 217, 103, + 103, 8, 6, 1, 250, 111, 217, 103, 103, 8, 6, 1, 247, 206, 217, 103, 103, + 8, 6, 1, 240, 230, 217, 103, 103, 8, 6, 1, 69, 217, 103, 103, 8, 6, 1, + 236, 48, 217, 103, 103, 8, 6, 1, 234, 189, 217, 103, 103, 8, 6, 1, 233, + 14, 217, 103, 103, 8, 6, 1, 68, 217, 103, 103, 8, 6, 1, 225, 216, 217, + 103, 103, 8, 6, 1, 225, 79, 217, 103, 103, 8, 6, 1, 159, 217, 103, 103, + 8, 6, 1, 221, 135, 217, 103, 103, 8, 6, 1, 218, 54, 217, 103, 103, 8, 6, + 1, 72, 217, 103, 103, 8, 6, 1, 214, 2, 217, 103, 103, 8, 6, 1, 211, 166, + 217, 103, 103, 8, 6, 1, 144, 217, 103, 103, 8, 6, 1, 209, 80, 217, 103, + 103, 8, 6, 1, 203, 216, 217, 103, 103, 8, 6, 1, 66, 217, 103, 103, 8, 6, + 1, 199, 230, 217, 103, 103, 8, 6, 1, 197, 199, 217, 103, 103, 8, 6, 1, + 196, 222, 217, 103, 103, 8, 6, 1, 196, 148, 217, 103, 103, 8, 6, 1, 195, + 158, 241, 58, 217, 103, 103, 8, 6, 1, 214, 2, 217, 103, 103, 230, 202, + 217, 103, 103, 161, 217, 103, 103, 183, 217, 103, 103, 252, 116, 217, + 103, 103, 197, 110, 47, 239, 47, 103, 244, 229, 103, 241, 112, 103, 234, + 244, 103, 230, 193, 103, 217, 81, 103, 217, 72, 103, 214, 138, 103, 205, + 166, 103, 124, 3, 236, 89, 78, 103, 198, 223, 103, 115, 240, 230, 103, + 208, 136, 208, 154, 103, 99, 225, 79, 103, 235, 6, 225, 79, 103, 237, 30, + 225, 79, 103, 235, 100, 212, 110, 100, 103, 207, 71, 212, 110, 100, 103, + 200, 223, 212, 110, 102, 103, 206, 14, 214, 2, 103, 97, 231, 57, 200, + 235, 214, 2, 103, 8, 4, 1, 240, 230, 103, 232, 149, 103, 232, 148, 103, + 232, 62, 103, 221, 216, 103, 206, 131, 103, 200, 91, 103, 198, 245, 210, + 149, 226, 68, 16, 1, 63, 210, 149, 226, 68, 16, 1, 250, 111, 210, 149, + 226, 68, 16, 1, 247, 206, 210, 149, 226, 68, 16, 1, 240, 230, 210, 149, + 226, 68, 16, 1, 69, 210, 149, 226, 68, 16, 1, 236, 48, 210, 149, 226, 68, + 16, 1, 234, 189, 210, 149, 226, 68, 16, 1, 233, 14, 210, 149, 226, 68, + 16, 1, 68, 210, 149, 226, 68, 16, 1, 225, 216, 210, 149, 226, 68, 16, 1, + 225, 79, 210, 149, 226, 68, 16, 1, 159, 210, 149, 226, 68, 16, 1, 221, + 135, 210, 149, 226, 68, 16, 1, 218, 54, 210, 149, 226, 68, 16, 1, 72, + 210, 149, 226, 68, 16, 1, 214, 2, 210, 149, 226, 68, 16, 1, 211, 166, + 210, 149, 226, 68, 16, 1, 144, 210, 149, 226, 68, 16, 1, 209, 80, 210, + 149, 226, 68, 16, 1, 203, 216, 210, 149, 226, 68, 16, 1, 66, 210, 149, + 226, 68, 16, 1, 199, 230, 210, 149, 226, 68, 16, 1, 197, 199, 210, 149, + 226, 68, 16, 1, 196, 222, 210, 149, 226, 68, 16, 1, 196, 148, 210, 149, + 226, 68, 16, 1, 195, 158, 47, 188, 231, 178, 103, 71, 223, 249, 103, 71, + 183, 103, 12, 200, 54, 228, 137, 103, 12, 200, 54, 228, 141, 103, 12, + 200, 54, 228, 149, 103, 71, 239, 251, 103, 12, 200, 54, 228, 156, 103, + 12, 200, 54, 228, 143, 103, 12, 200, 54, 228, 115, 103, 12, 200, 54, 228, + 142, 103, 12, 200, 54, 228, 155, 103, 12, 200, 54, 228, 129, 103, 12, + 200, 54, 228, 122, 103, 12, 200, 54, 228, 131, 103, 12, 200, 54, 228, + 152, 103, 12, 200, 54, 228, 138, 103, 12, 200, 54, 228, 154, 103, 12, + 200, 54, 228, 130, 103, 12, 200, 54, 228, 153, 103, 12, 200, 54, 228, + 116, 103, 12, 200, 54, 228, 121, 103, 12, 200, 54, 228, 114, 103, 12, + 200, 54, 228, 144, 103, 12, 200, 54, 228, 146, 103, 12, 200, 54, 228, + 124, 103, 12, 200, 54, 228, 135, 103, 12, 200, 54, 228, 133, 103, 12, + 200, 54, 228, 159, 103, 12, 200, 54, 228, 158, 103, 12, 200, 54, 228, + 112, 103, 12, 200, 54, 228, 139, 103, 12, 200, 54, 228, 157, 103, 12, + 200, 54, 228, 148, 103, 12, 200, 54, 228, 134, 103, 12, 200, 54, 228, + 113, 103, 12, 200, 54, 228, 136, 103, 12, 200, 54, 228, 118, 103, 12, + 200, 54, 228, 117, 103, 12, 200, 54, 228, 147, 103, 12, 200, 54, 228, + 125, 103, 12, 200, 54, 228, 127, 103, 12, 200, 54, 228, 128, 103, 12, + 200, 54, 228, 120, 103, 12, 200, 54, 228, 151, 103, 12, 200, 54, 228, + 145, 103, 12, 200, 54, 228, 111, 201, 231, 206, 245, 248, 60, 12, 200, + 54, 228, 126, 201, 231, 206, 245, 248, 60, 12, 200, 54, 228, 158, 201, + 231, 206, 245, 248, 60, 12, 200, 54, 228, 156, 201, 231, 206, 245, 248, + 60, 12, 200, 54, 228, 140, 201, 231, 206, 245, 248, 60, 12, 200, 54, 228, + 123, 201, 231, 206, 245, 248, 60, 12, 200, 54, 228, 136, 201, 231, 206, + 245, 248, 60, 12, 200, 54, 228, 119, 201, 231, 206, 245, 248, 60, 12, + 200, 54, 228, 150, 201, 231, 206, 245, 248, 60, 12, 200, 54, 228, 132, + 46, 230, 190, 251, 246, 46, 230, 190, 252, 19, 209, 185, 16, 36, 234, + 222, 209, 185, 16, 36, 221, 190, 209, 185, 16, 36, 206, 165, 209, 185, + 16, 36, 196, 196, 209, 185, 16, 36, 206, 148, 209, 185, 16, 36, 247, 161, + 240, 241, 235, 48, 244, 202, 200, 76, 216, 194, 3, 205, 4, 204, 106, 127, + 218, 167, 204, 105, 244, 233, 250, 168, 237, 173, 204, 104, 127, 248, 9, + 210, 215, 248, 39, 250, 168, 216, 193, 197, 128, 197, 122, 198, 239, 219, + 30, 197, 112, 237, 72, 233, 152, 236, 105, 237, 72, 233, 152, 251, 113, + 237, 72, 233, 152, 250, 187, 233, 152, 3, 219, 154, 217, 82, 218, 189, + 105, 197, 114, 241, 71, 218, 189, 105, 235, 112, 211, 87, 218, 189, 105, + 197, 114, 233, 187, 218, 189, 105, 234, 216, 218, 189, 105, 197, 142, + 233, 187, 218, 189, 105, 222, 220, 211, 87, 218, 189, 105, 197, 142, 241, + 71, 218, 189, 105, 241, 71, 218, 188, 217, 82, 218, 189, 3, 235, 232, + 235, 112, 211, 87, 218, 189, 3, 235, 232, 222, 220, 211, 87, 218, 189, 3, + 235, 232, 234, 216, 218, 189, 3, 235, 232, 204, 112, 3, 235, 232, 233, + 148, 205, 7, 206, 187, 205, 7, 202, 205, 58, 237, 208, 59, 204, 111, 59, + 204, 112, 3, 4, 244, 193, 59, 204, 112, 248, 235, 244, 193, 59, 204, 112, + 248, 235, 244, 194, 3, 210, 216, 244, 194, 3, 210, 216, 244, 194, 3, 205, + 206, 244, 194, 3, 222, 91, 244, 194, 3, 201, 235, 235, 49, 197, 51, 248, + 119, 235, 232, 231, 95, 239, 16, 203, 146, 247, 241, 245, 80, 208, 127, + 236, 99, 201, 190, 239, 244, 201, 190, 213, 206, 201, 190, 247, 166, 231, + 95, 213, 46, 201, 24, 245, 84, 248, 122, 209, 198, 232, 61, 204, 109, + 248, 122, 237, 76, 77, 220, 71, 237, 76, 77, 210, 60, 232, 95, 235, 6, + 222, 192, 244, 192, 220, 40, 222, 191, 235, 213, 222, 191, 222, 192, 235, + 56, 226, 86, 197, 50, 218, 89, 202, 15, 250, 148, 233, 107, 219, 172, + 197, 126, 203, 108, 222, 160, 249, 89, 212, 171, 210, 157, 251, 26, 233, + 90, 251, 26, 213, 84, 213, 88, 245, 85, 204, 209, 232, 217, 205, 240, 77, + 212, 151, 219, 199, 214, 119, 248, 103, 212, 63, 222, 171, 210, 61, 241, + 77, 210, 61, 249, 102, 241, 115, 210, 60, 241, 13, 26, 210, 60, 204, 246, + 248, 73, 205, 144, 248, 52, 234, 242, 234, 238, 209, 222, 204, 59, 212, + 65, 240, 84, 214, 165, 204, 78, 234, 239, 206, 157, 235, 111, 247, 160, + 3, 204, 51, 239, 187, 205, 186, 230, 201, 241, 75, 207, 7, 230, 200, 230, + 201, 241, 75, 237, 237, 241, 114, 245, 46, 154, 247, 131, 221, 243, 241, + 4, 231, 167, 212, 67, 206, 171, 248, 215, 248, 69, 212, 68, 77, 235, 38, + 241, 113, 235, 27, 26, 224, 20, 203, 57, 197, 37, 232, 186, 208, 248, + 248, 86, 26, 241, 26, 197, 47, 233, 156, 244, 177, 233, 156, 201, 145, + 237, 215, 248, 246, 218, 129, 244, 209, 248, 246, 218, 128, 249, 140, + 248, 85, 235, 27, 26, 224, 21, 3, 212, 138, 248, 86, 3, 212, 83, 241, + 102, 212, 85, 210, 62, 196, 254, 212, 25, 248, 152, 247, 159, 225, 210, + 245, 37, 201, 190, 235, 196, 245, 36, 235, 114, 235, 115, 205, 142, 249, + 100, 213, 128, 212, 84, 241, 151, 249, 102, 203, 112, 201, 190, 241, 58, + 235, 86, 212, 172, 239, 241, 225, 201, 239, 8, 247, 103, 204, 208, 197, + 51, 245, 62, 218, 189, 199, 21, 247, 22, 208, 167, 208, 197, 233, 113, + 247, 124, 232, 126, 3, 202, 68, 214, 119, 202, 218, 222, 183, 248, 79, + 77, 235, 60, 219, 32, 219, 195, 210, 129, 210, 62, 34, 224, 151, 3, 225, + 209, 204, 179, 219, 66, 222, 127, 205, 238, 241, 120, 224, 14, 249, 4, + 250, 197, 34, 216, 7, 249, 4, 239, 193, 34, 216, 7, 235, 130, 234, 248, + 251, 250, 202, 109, 247, 104, 231, 97, 235, 162, 197, 77, 209, 211, 244, + 179, 235, 106, 212, 101, 26, 235, 110, 219, 66, 218, 153, 247, 145, 244, + 252, 232, 132, 250, 206, 213, 210, 201, 243, 232, 164, 244, 238, 203, 15, + 202, 110, 244, 224, 248, 112, 213, 39, 250, 204, 199, 30, 234, 96, 239, + 85, 232, 30, 205, 231, 220, 115, 248, 165, 234, 97, 239, 131, 248, 72, + 235, 62, 212, 137, 247, 112, 34, 216, 12, 218, 119, 34, 216, 7, 208, 181, + 233, 58, 34, 224, 150, 201, 120, 199, 9, 34, 208, 159, 209, 114, 206, + 202, 3, 208, 200, 203, 20, 210, 235, 26, 249, 102, 206, 3, 26, 206, 3, + 248, 96, 249, 59, 26, 231, 160, 245, 86, 235, 92, 205, 205, 209, 115, + 204, 83, 205, 106, 219, 195, 201, 146, 231, 98, 210, 236, 251, 114, 235, + 35, 209, 128, 235, 35, 204, 54, 197, 94, 222, 96, 233, 133, 210, 237, + 218, 175, 210, 237, 247, 115, 241, 68, 249, 56, 26, 249, 102, 198, 238, + 235, 151, 231, 181, 204, 238, 26, 249, 102, 230, 201, 231, 181, 204, 238, + 26, 211, 218, 203, 153, 203, 20, 213, 229, 26, 249, 102, 205, 207, 247, + 120, 218, 168, 247, 143, 249, 7, 3, 200, 76, 248, 11, 241, 134, 231, 87, + 248, 9, 244, 232, 239, 197, 231, 87, 248, 10, 244, 222, 248, 10, 239, + 189, 239, 190, 225, 240, 217, 203, 213, 135, 205, 18, 231, 87, 248, 10, + 231, 87, 3, 234, 80, 214, 156, 248, 10, 225, 201, 212, 73, 214, 155, 236, + 104, 212, 73, 214, 155, 231, 96, 249, 83, 250, 137, 203, 29, 220, 115, + 231, 92, 221, 208, 231, 92, 241, 118, 204, 222, 208, 166, 239, 200, 204, + 222, 235, 221, 225, 221, 222, 232, 225, 201, 247, 93, 236, 104, 247, 93, + 59, 213, 58, 58, 213, 58, 197, 120, 59, 235, 92, 197, 120, 58, 235, 92, + 209, 197, 58, 209, 197, 223, 73, 249, 123, 210, 235, 26, 206, 134, 248, + 77, 26, 51, 251, 109, 236, 235, 73, 235, 101, 200, 199, 236, 235, 73, + 235, 101, 200, 196, 236, 235, 73, 235, 101, 200, 194, 236, 235, 73, 235, + 101, 200, 192, 236, 235, 73, 235, 101, 200, 190, 210, 197, 218, 165, 214, + 12, 197, 128, 248, 15, 241, 82, 202, 102, 222, 144, 210, 239, 247, 91, + 237, 222, 241, 66, 197, 80, 205, 214, 205, 212, 231, 97, 210, 209, 233, + 139, 206, 249, 218, 208, 209, 201, 245, 72, 239, 16, 212, 183, 248, 113, + 236, 254, 214, 168, 205, 121, 206, 244, 248, 14, 251, 68, 231, 166, 223, + 65, 248, 244, 235, 110, 201, 145, 235, 110, 248, 120, 201, 1, 232, 162, + 245, 73, 249, 140, 245, 73, 234, 232, 249, 140, 245, 73, 248, 155, 213, + 60, 224, 4, 212, 89, 237, 212, 247, 147, 249, 128, 247, 147, 239, 7, 218, + 166, 235, 232, 241, 83, 235, 232, 202, 103, 235, 232, 210, 240, 235, 232, + 247, 92, 235, 232, 237, 223, 235, 232, 205, 104, 197, 80, 231, 98, 235, + 232, 218, 209, 235, 232, 239, 17, 235, 232, 212, 184, 235, 232, 234, 236, + 235, 232, 232, 214, 235, 232, 197, 24, 235, 232, 249, 2, 235, 232, 213, + 186, 235, 232, 212, 184, 216, 19, 213, 104, 212, 11, 245, 57, 236, 58, + 236, 66, 237, 75, 216, 19, 218, 163, 201, 249, 59, 124, 212, 106, 249, + 135, 226, 71, 59, 135, 212, 106, 249, 135, 226, 71, 59, 50, 212, 106, + 249, 135, 226, 71, 59, 53, 212, 106, 249, 135, 226, 71, 235, 104, 232, + 209, 55, 197, 120, 232, 209, 55, 214, 139, 232, 209, 55, 202, 140, 124, + 55, 202, 140, 135, 55, 244, 223, 232, 184, 55, 192, 232, 184, 55, 241, + 52, 197, 20, 232, 164, 236, 61, 217, 107, 203, 214, 225, 191, 237, 217, + 224, 76, 248, 168, 197, 20, 244, 195, 211, 198, 232, 188, 212, 64, 220, + 49, 206, 194, 250, 163, 206, 194, 232, 46, 206, 194, 197, 20, 208, 216, + 197, 20, 248, 95, 235, 33, 247, 233, 226, 86, 206, 78, 247, 232, 226, 86, + 206, 78, 248, 67, 233, 168, 220, 61, 197, 21, 235, 210, 220, 62, 26, 197, + 22, 231, 175, 232, 183, 99, 219, 164, 231, 175, 232, 183, 99, 197, 19, + 231, 175, 232, 183, 212, 98, 214, 154, 197, 22, 3, 247, 251, 237, 73, + 248, 40, 3, 199, 109, 213, 28, 3, 248, 124, 232, 232, 220, 62, 3, 233, + 72, 212, 220, 220, 44, 220, 62, 3, 201, 9, 214, 131, 220, 61, 214, 131, + 197, 21, 249, 139, 241, 135, 197, 5, 212, 16, 225, 201, 214, 149, 225, + 201, 233, 138, 233, 199, 249, 140, 251, 94, 236, 71, 251, 153, 251, 154, + 218, 198, 226, 91, 205, 254, 226, 60, 239, 186, 213, 27, 233, 66, 240, + 89, 222, 57, 217, 228, 212, 97, 235, 233, 220, 6, 232, 231, 249, 77, 212, + 100, 203, 235, 212, 176, 224, 57, 78, 221, 208, 222, 134, 210, 2, 234, + 37, 204, 228, 224, 56, 248, 78, 241, 86, 3, 232, 125, 197, 101, 248, 254, + 232, 125, 248, 32, 232, 125, 99, 232, 123, 205, 140, 232, 125, 233, 82, + 232, 125, 232, 126, 3, 51, 248, 118, 232, 125, 233, 90, 232, 125, 196, + 62, 232, 125, 211, 199, 232, 125, 232, 126, 3, 210, 62, 210, 83, 232, + 123, 232, 126, 239, 241, 239, 140, 207, 21, 3, 39, 76, 226, 40, 237, 1, + 175, 248, 7, 251, 93, 105, 248, 104, 205, 243, 105, 244, 169, 105, 205, + 115, 204, 61, 105, 237, 208, 240, 65, 105, 212, 177, 77, 212, 90, 235, + 74, 248, 180, 239, 48, 105, 205, 132, 249, 100, 202, 160, 249, 100, 59, + 235, 61, 231, 57, 212, 104, 105, 218, 213, 249, 121, 241, 16, 236, 91, + 85, 239, 9, 55, 241, 73, 247, 113, 249, 82, 3, 196, 60, 55, 249, 82, 3, + 239, 9, 55, 249, 82, 3, 236, 107, 55, 249, 82, 3, 212, 62, 55, 218, 213, + 3, 197, 45, 245, 110, 3, 200, 24, 201, 186, 26, 196, 60, 55, 208, 139, + 213, 26, 241, 156, 248, 38, 219, 20, 235, 66, 239, 72, 214, 75, 239, 77, + 237, 168, 235, 137, 235, 46, 192, 235, 137, 235, 46, 213, 227, 3, 241, + 20, 213, 227, 235, 225, 200, 36, 247, 153, 203, 56, 247, 153, 247, 114, + 226, 71, 245, 110, 3, 200, 24, 201, 185, 245, 110, 3, 237, 230, 201, 185, + 249, 79, 245, 109, 244, 208, 211, 194, 209, 187, 211, 194, 213, 159, 204, + 218, 209, 122, 201, 177, 209, 122, 248, 100, 203, 151, 222, 188, 216, 10, + 216, 11, 3, 239, 240, 241, 85, 244, 202, 248, 101, 192, 248, 101, 233, + 90, 248, 101, 248, 118, 248, 101, 214, 70, 248, 101, 248, 98, 217, 222, + 249, 125, 208, 152, 219, 165, 203, 34, 210, 171, 213, 225, 235, 193, 220, + 115, 208, 196, 251, 65, 211, 219, 252, 2, 221, 210, 245, 94, 219, 177, + 214, 32, 201, 194, 226, 82, 201, 194, 213, 234, 237, 128, 105, 226, 79, + 236, 193, 236, 194, 3, 237, 230, 61, 57, 244, 202, 220, 77, 3, 221, 200, + 235, 92, 244, 202, 220, 77, 3, 210, 214, 235, 92, 192, 220, 77, 3, 210, + 214, 235, 92, 192, 220, 77, 3, 221, 200, 235, 92, 212, 70, 212, 71, 231, + 101, 217, 77, 218, 242, 212, 228, 218, 242, 212, 229, 3, 91, 61, 250, + 168, 222, 183, 199, 33, 218, 241, 218, 242, 212, 229, 214, 157, 216, 50, + 218, 242, 212, 227, 251, 66, 3, 249, 67, 247, 145, 247, 146, 3, 235, 83, + 199, 30, 247, 145, 203, 31, 210, 230, 199, 29, 235, 130, 211, 253, 212, + 80, 204, 240, 212, 39, 249, 6, 200, 219, 91, 250, 213, 244, 204, 91, 26, + 107, 192, 244, 249, 250, 213, 244, 204, 91, 26, 107, 192, 244, 249, 250, + 214, 3, 46, 97, 214, 19, 244, 204, 237, 230, 26, 200, 24, 192, 244, 249, + 250, 213, 251, 64, 237, 230, 26, 200, 24, 192, 244, 249, 250, 213, 126, + 248, 36, 105, 130, 248, 36, 105, 205, 137, 3, 247, 138, 106, 205, 136, + 205, 137, 3, 97, 205, 162, 197, 122, 205, 137, 3, 115, 205, 162, 197, + 121, 249, 49, 237, 1, 212, 129, 222, 178, 220, 89, 233, 156, 210, 17, + 220, 89, 233, 156, 221, 254, 3, 226, 52, 213, 64, 244, 202, 221, 254, 3, + 224, 152, 224, 152, 221, 253, 192, 221, 253, 248, 228, 248, 229, 3, 247, + 138, 106, 248, 99, 222, 65, 105, 210, 231, 247, 226, 249, 138, 3, 107, + 61, 57, 236, 221, 3, 107, 61, 57, 214, 119, 3, 236, 89, 117, 3, 50, 53, + 61, 57, 205, 170, 3, 91, 61, 57, 201, 243, 3, 200, 24, 61, 57, 216, 50, + 97, 200, 64, 237, 28, 105, 224, 149, 203, 23, 226, 46, 16, 36, 8, 6, 222, + 133, 226, 46, 16, 36, 8, 4, 222, 133, 226, 46, 16, 36, 215, 142, 226, 46, + 16, 36, 203, 249, 226, 46, 16, 36, 8, 222, 133, 235, 117, 237, 1, 201, + 238, 196, 252, 232, 215, 215, 125, 26, 248, 106, 231, 182, 212, 157, 219, + 65, 203, 32, 241, 42, 249, 102, 206, 29, 212, 108, 205, 8, 3, 112, 238, + 252, 225, 201, 16, 36, 248, 241, 201, 175, 236, 237, 58, 47, 247, 226, + 59, 47, 247, 226, 222, 227, 210, 157, 244, 248, 222, 227, 248, 118, 244, + 248, 222, 227, 214, 70, 239, 139, 222, 227, 248, 118, 239, 139, 4, 214, + 70, 239, 139, 4, 248, 118, 239, 139, 200, 35, 210, 157, 201, 180, 237, + 233, 210, 157, 201, 180, 200, 35, 4, 210, 157, 201, 180, 237, 233, 4, + 210, 157, 201, 180, 221, 202, 53, 207, 37, 59, 244, 248, 200, 33, 53, + 207, 37, 59, 244, 248, 46, 241, 61, 212, 94, 241, 61, 212, 95, 3, 232, + 221, 60, 241, 61, 212, 94, 216, 14, 50, 207, 108, 3, 115, 238, 249, 216, + 14, 53, 207, 108, 3, 115, 238, 249, 16, 36, 220, 22, 247, 0, 59, 8, 241, + 60, 85, 8, 241, 60, 247, 40, 241, 60, 214, 127, 105, 237, 236, 77, 213, + 89, 225, 52, 218, 181, 203, 243, 219, 160, 3, 216, 178, 248, 55, 248, 74, + 77, 231, 8, 244, 206, 235, 233, 97, 214, 174, 244, 206, 235, 233, 99, + 214, 174, 244, 206, 235, 233, 115, 214, 174, 244, 206, 235, 233, 235, 6, + 214, 174, 244, 206, 235, 233, 235, 100, 214, 174, 244, 206, 235, 233, + 206, 29, 214, 174, 244, 206, 235, 233, 207, 71, 214, 174, 244, 206, 235, + 233, 237, 30, 214, 174, 244, 206, 235, 233, 216, 178, 214, 174, 244, 206, + 235, 233, 203, 24, 214, 174, 244, 206, 235, 233, 236, 252, 214, 174, 244, + 206, 235, 233, 200, 240, 214, 174, 244, 206, 235, 233, 214, 111, 244, + 206, 235, 233, 200, 213, 244, 206, 235, 233, 202, 146, 244, 206, 235, + 233, 235, 2, 244, 206, 235, 233, 235, 98, 244, 206, 235, 233, 206, 25, + 244, 206, 235, 233, 207, 70, 244, 206, 235, 233, 237, 29, 244, 206, 235, + 233, 216, 177, 244, 206, 235, 233, 203, 22, 244, 206, 235, 233, 236, 250, + 244, 206, 235, 233, 200, 238, 53, 205, 136, 53, 205, 137, 3, 97, 205, + 162, 197, 122, 53, 205, 137, 3, 115, 205, 162, 197, 121, 248, 2, 248, 3, + 3, 205, 162, 197, 121, 210, 0, 248, 228, 248, 101, 247, 136, 220, 46, + 244, 205, 58, 205, 255, 26, 241, 59, 216, 50, 212, 163, 231, 174, 220, + 62, 226, 86, 247, 235, 204, 125, 222, 126, 205, 241, 214, 72, 205, 95, + 240, 70, 204, 107, 205, 124, 205, 125, 197, 102, 225, 110, 220, 62, 240, + 88, 50, 232, 209, 203, 34, 210, 171, 203, 34, 210, 172, 3, 213, 226, 53, + 232, 209, 203, 34, 210, 171, 59, 201, 224, 203, 33, 58, 201, 224, 203, + 33, 203, 34, 214, 119, 201, 243, 77, 218, 238, 244, 227, 218, 242, 212, + 228, 249, 138, 77, 236, 193, 205, 14, 236, 193, 236, 194, 3, 222, 91, + 235, 53, 236, 193, 213, 65, 127, 205, 14, 236, 193, 222, 64, 213, 158, + 58, 211, 194, 221, 202, 50, 213, 63, 221, 202, 50, 249, 96, 213, 64, 221, + 202, 50, 235, 8, 213, 64, 221, 202, 50, 213, 219, 221, 202, 50, 241, 76, + 50, 196, 246, 232, 208, 163, 214, 139, 232, 209, 55, 210, 214, 232, 209, + 3, 235, 122, 205, 114, 210, 89, 210, 214, 232, 209, 3, 235, 122, 205, + 114, 210, 89, 202, 140, 124, 55, 210, 89, 202, 140, 135, 55, 210, 89, + 199, 32, 232, 208, 210, 89, 232, 209, 3, 112, 235, 127, 236, 77, 210, + 214, 232, 209, 3, 213, 133, 248, 203, 112, 26, 210, 3, 235, 121, 59, 135, + 212, 106, 50, 232, 209, 226, 71, 206, 96, 59, 50, 212, 106, 226, 71, 206, + 96, 59, 53, 212, 106, 226, 71, 206, 96, 58, 50, 212, 106, 226, 71, 206, + 96, 58, 53, 212, 106, 226, 71, 58, 50, 212, 106, 249, 135, 226, 71, 58, + 53, 212, 106, 249, 135, 226, 71, 206, 96, 59, 124, 212, 106, 226, 71, + 206, 96, 59, 135, 212, 106, 226, 71, 206, 96, 58, 124, 212, 106, 226, 71, + 206, 96, 58, 135, 212, 106, 226, 71, 58, 124, 212, 106, 249, 135, 226, + 71, 58, 135, 212, 106, 249, 135, 226, 71, 58, 232, 125, 239, 185, 241, + 156, 224, 151, 26, 218, 165, 115, 217, 86, 241, 155, 212, 12, 212, 114, + 247, 155, 58, 232, 172, 206, 245, 235, 66, 239, 72, 59, 232, 172, 206, + 245, 235, 66, 239, 72, 205, 186, 206, 245, 235, 66, 239, 72, 203, 104, + 247, 97, 197, 40, 224, 150, 97, 247, 227, 218, 165, 99, 247, 227, 218, + 165, 115, 247, 227, 218, 165, 201, 215, 37, 213, 26, 241, 156, 232, 172, + 239, 72, 208, 154, 212, 13, 230, 194, 235, 193, 230, 194, 214, 75, 239, + 78, 230, 194, 239, 21, 3, 202, 237, 239, 21, 3, 202, 238, 26, 212, 213, + 239, 21, 3, 212, 213, 234, 250, 3, 212, 213, 234, 250, 3, 202, 82, 234, + 250, 3, 251, 106, 196, 222, 58, 235, 46, 235, 46, 192, 235, 46, 247, 114, + 132, 239, 57, 247, 114, 235, 137, 248, 69, 235, 137, 247, 168, 236, 231, + 216, 12, 236, 231, 216, 13, 213, 226, 236, 231, 216, 13, 213, 232, 216, + 12, 216, 13, 213, 226, 216, 13, 213, 232, 236, 231, 239, 20, 236, 231, + 213, 226, 236, 231, 213, 224, 239, 20, 213, 226, 213, 224, 197, 132, 205, + 121, 216, 13, 213, 232, 205, 121, 247, 154, 213, 232, 239, 185, 197, 49, + 219, 17, 219, 251, 214, 22, 244, 204, 53, 26, 50, 207, 108, 250, 213, + 247, 138, 196, 222, 226, 77, 235, 40, 206, 9, 105, 239, 239, 235, 40, + 206, 9, 105, 241, 157, 37, 224, 152, 209, 212, 217, 77, 213, 227, 3, 46, + 202, 237, 204, 230, 245, 109, 240, 118, 224, 20, 222, 58, 205, 135, 232, + 137, 226, 86, 206, 78, 115, 210, 188, 57, 115, 210, 188, 60, 115, 210, + 188, 222, 183, 115, 210, 188, 210, 22, 50, 205, 132, 248, 19, 53, 205, + 132, 248, 19, 99, 205, 132, 248, 18, 115, 205, 132, 248, 18, 50, 202, + 160, 248, 19, 53, 202, 160, 248, 19, 50, 251, 93, 248, 19, 53, 251, 93, + 248, 19, 218, 193, 248, 19, 222, 92, 218, 193, 248, 19, 222, 92, 218, + 192, 249, 98, 111, 3, 249, 97, 249, 98, 145, 196, 222, 249, 98, 111, 3, + 145, 196, 222, 249, 98, 27, 145, 196, 222, 249, 98, 111, 3, 27, 145, 196, + 222, 175, 245, 101, 78, 249, 98, 111, 3, 27, 245, 100, 197, 4, 220, 42, + 218, 170, 234, 217, 202, 17, 201, 220, 204, 253, 77, 222, 106, 206, 79, + 77, 225, 202, 218, 151, 233, 86, 235, 232, 233, 86, 235, 233, 3, 205, + 218, 236, 58, 235, 233, 3, 203, 52, 77, 225, 112, 205, 218, 235, 233, 3, + 192, 218, 163, 205, 218, 235, 233, 3, 192, 218, 164, 26, 205, 218, 236, + 58, 205, 218, 235, 233, 3, 192, 218, 164, 26, 244, 171, 204, 60, 205, + 218, 235, 233, 3, 192, 218, 164, 26, 202, 100, 236, 58, 205, 218, 235, + 233, 3, 232, 220, 205, 218, 235, 233, 3, 231, 100, 197, 42, 235, 232, + 205, 218, 235, 233, 3, 205, 218, 236, 58, 235, 233, 208, 186, 239, 219, + 235, 38, 210, 132, 235, 232, 205, 218, 235, 233, 3, 232, 124, 236, 58, + 205, 218, 235, 233, 3, 204, 107, 205, 217, 235, 232, 217, 84, 235, 232, + 236, 79, 235, 232, 200, 70, 235, 232, 235, 233, 3, 244, 171, 204, 60, + 213, 56, 235, 232, 241, 148, 235, 232, 241, 149, 235, 232, 224, 55, 235, + 232, 235, 233, 202, 143, 39, 224, 56, 224, 55, 235, 233, 3, 205, 218, + 236, 58, 224, 55, 235, 233, 3, 244, 202, 236, 58, 235, 233, 3, 204, 180, + 201, 249, 235, 233, 3, 204, 180, 201, 250, 26, 197, 42, 236, 66, 235, + 233, 3, 204, 180, 201, 250, 26, 202, 100, 236, 58, 239, 79, 235, 232, + 197, 3, 235, 232, 251, 85, 235, 232, 212, 61, 235, 232, 241, 44, 235, + 232, 213, 30, 235, 232, 235, 233, 3, 221, 227, 77, 201, 157, 239, 79, + 247, 231, 210, 132, 235, 232, 234, 228, 235, 233, 3, 192, 218, 163, 251, + 83, 235, 232, 235, 186, 235, 232, 197, 103, 235, 232, 205, 242, 235, 232, + 202, 62, 235, 232, 233, 87, 235, 232, 221, 211, 241, 44, 235, 232, 235, + 233, 3, 192, 218, 163, 231, 46, 235, 232, 235, 233, 3, 192, 218, 164, 26, + 244, 171, 204, 60, 235, 233, 208, 156, 226, 86, 235, 187, 250, 175, 235, + 232, 235, 58, 235, 232, 205, 243, 235, 232, 239, 48, 235, 232, 235, 233, + 197, 37, 218, 163, 235, 233, 3, 219, 192, 220, 8, 233, 86, 247, 92, 235, + 233, 3, 205, 218, 236, 58, 247, 92, 235, 233, 3, 203, 52, 77, 225, 112, + 205, 218, 247, 92, 235, 233, 3, 192, 218, 163, 205, 218, 247, 92, 235, + 233, 3, 232, 124, 236, 58, 247, 92, 235, 233, 3, 196, 244, 205, 219, 224, + 55, 247, 92, 235, 233, 3, 244, 202, 236, 58, 212, 61, 247, 92, 235, 232, + 241, 44, 247, 92, 235, 232, 197, 103, 247, 92, 235, 232, 205, 236, 234, + 228, 235, 232, 205, 236, 205, 218, 235, 232, 200, 30, 235, 232, 235, 233, + 3, 209, 210, 236, 58, 235, 233, 3, 216, 50, 233, 130, 234, 14, 235, 233, + 3, 214, 139, 234, 14, 213, 28, 248, 75, 239, 234, 208, 128, 218, 208, + 232, 128, 218, 208, 205, 138, 218, 208, 232, 175, 213, 28, 210, 212, 97, + 232, 208, 213, 28, 210, 212, 248, 87, 232, 184, 226, 86, 247, 42, 213, + 28, 234, 227, 213, 28, 3, 212, 61, 235, 232, 213, 28, 3, 235, 47, 232, + 183, 173, 197, 89, 212, 106, 222, 191, 205, 159, 197, 89, 212, 106, 222, + 191, 173, 237, 68, 212, 106, 222, 191, 205, 159, 237, 68, 212, 106, 222, + 191, 163, 173, 197, 89, 212, 106, 222, 191, 163, 205, 159, 197, 89, 212, + 106, 222, 191, 163, 173, 237, 68, 212, 106, 222, 191, 163, 205, 159, 237, + 68, 212, 106, 222, 191, 173, 197, 89, 212, 106, 199, 15, 222, 191, 205, + 159, 197, 89, 212, 106, 199, 15, 222, 191, 173, 237, 68, 212, 106, 199, + 15, 222, 191, 205, 159, 237, 68, 212, 106, 199, 15, 222, 191, 85, 173, + 197, 89, 212, 106, 199, 15, 222, 191, 85, 205, 159, 197, 89, 212, 106, + 199, 15, 222, 191, 85, 173, 237, 68, 212, 106, 199, 15, 222, 191, 85, + 205, 159, 237, 68, 212, 106, 199, 15, 222, 191, 173, 197, 89, 212, 106, + 248, 16, 205, 159, 197, 89, 212, 106, 248, 16, 173, 237, 68, 212, 106, + 248, 16, 205, 159, 237, 68, 212, 106, 248, 16, 85, 173, 197, 89, 212, + 106, 248, 16, 85, 205, 159, 197, 89, 212, 106, 248, 16, 85, 173, 237, 68, + 212, 106, 248, 16, 85, 205, 159, 237, 68, 212, 106, 248, 16, 231, 173, + 211, 71, 47, 214, 58, 231, 173, 211, 71, 47, 214, 59, 226, 86, 58, 205, + 94, 205, 179, 211, 71, 47, 214, 58, 205, 179, 211, 71, 47, 214, 59, 226, + 86, 58, 205, 94, 107, 209, 217, 200, 24, 209, 217, 91, 209, 217, 237, + 230, 209, 217, 145, 33, 236, 128, 214, 58, 85, 145, 33, 236, 128, 214, + 58, 33, 192, 236, 128, 214, 58, 85, 33, 192, 236, 128, 214, 58, 85, 251, + 111, 214, 58, 204, 63, 251, 111, 214, 58, 45, 85, 52, 163, 244, 159, 211, + 61, 117, 214, 58, 45, 85, 52, 244, 159, 211, 61, 117, 214, 58, 45, 85, + 126, 52, 244, 159, 211, 61, 117, 214, 58, 85, 226, 26, 214, 58, 45, 226, + 26, 214, 58, 85, 45, 226, 26, 214, 58, 199, 48, 85, 205, 177, 199, 48, + 85, 210, 90, 205, 177, 245, 99, 248, 112, 210, 90, 245, 99, 248, 112, + 209, 217, 232, 107, 204, 248, 221, 251, 210, 219, 247, 115, 232, 43, 201, + 207, 232, 43, 201, 208, 3, 248, 5, 216, 19, 201, 207, 219, 135, 175, 210, + 220, 204, 254, 201, 205, 201, 206, 247, 115, 247, 236, 214, 115, 247, + 236, 201, 153, 247, 237, 204, 226, 219, 21, 251, 115, 235, 118, 236, 213, + 212, 98, 247, 115, 214, 115, 212, 98, 247, 115, 203, 78, 214, 115, 203, + 78, 250, 136, 214, 115, 250, 136, 210, 164, 199, 110, 239, 215, 201, 144, + 250, 207, 221, 218, 201, 214, 218, 201, 218, 169, 210, 218, 204, 77, 210, + 218, 218, 169, 247, 167, 251, 230, 201, 204, 206, 207, 209, 184, 205, + 130, 231, 154, 201, 211, 222, 94, 83, 201, 211, 222, 94, 241, 135, 55, + 212, 98, 247, 99, 210, 83, 222, 94, 201, 177, 235, 93, 214, 119, 212, 72, + 239, 0, 216, 50, 236, 199, 55, 205, 216, 105, 216, 50, 205, 216, 105, + 211, 193, 222, 47, 226, 86, 225, 230, 212, 148, 105, 239, 28, 216, 18, + 222, 47, 105, 212, 66, 197, 128, 105, 216, 34, 197, 128, 105, 248, 179, + 216, 50, 248, 178, 248, 177, 218, 169, 248, 177, 213, 80, 216, 50, 213, + 79, 245, 64, 241, 53, 219, 159, 105, 197, 18, 105, 210, 99, 249, 140, + 105, 202, 18, 197, 128, 244, 199, 206, 162, 249, 52, 249, 50, 213, 117, + 241, 119, 241, 2, 249, 117, 244, 228, 50, 221, 180, 201, 181, 3, 209, + 185, 241, 99, 212, 0, 55, 46, 226, 60, 205, 160, 248, 66, 105, 233, 167, + 105, 241, 91, 26, 222, 238, 205, 243, 252, 18, 206, 185, 249, 116, 248, + 227, 248, 228, 248, 251, 212, 148, 77, 197, 2, 214, 171, 55, 206, 185, + 201, 154, 204, 176, 213, 223, 232, 39, 203, 26, 232, 216, 26, 196, 252, + 206, 220, 214, 144, 237, 205, 218, 173, 210, 219, 201, 216, 218, 176, + 248, 111, 200, 35, 219, 32, 251, 186, 200, 35, 251, 186, 200, 35, 4, 251, + 186, 4, 251, 186, 216, 23, 251, 186, 251, 187, 239, 199, 251, 187, 250, + 219, 208, 195, 214, 115, 235, 118, 236, 213, 239, 129, 221, 251, 213, + 121, 206, 207, 208, 160, 218, 176, 208, 160, 247, 126, 205, 245, 235, 53, + 208, 190, 206, 5, 250, 138, 210, 58, 150, 16, 36, 211, 67, 150, 16, 36, + 251, 188, 150, 16, 36, 235, 117, 150, 16, 36, 237, 71, 150, 16, 36, 197, + 127, 150, 16, 36, 251, 15, 150, 16, 36, 251, 16, 210, 151, 150, 16, 36, + 251, 16, 210, 150, 150, 16, 36, 251, 16, 198, 254, 150, 16, 36, 251, 16, + 198, 253, 150, 16, 36, 199, 12, 150, 16, 36, 199, 11, 150, 16, 36, 199, + 10, 150, 16, 36, 204, 118, 150, 16, 36, 212, 237, 204, 118, 150, 16, 36, + 58, 204, 118, 150, 16, 36, 219, 158, 204, 149, 150, 16, 36, 219, 158, + 204, 148, 150, 16, 36, 219, 158, 204, 147, 150, 16, 36, 244, 251, 150, + 16, 36, 208, 233, 150, 16, 36, 216, 166, 150, 16, 36, 198, 252, 150, 16, + 36, 198, 251, 150, 16, 36, 209, 218, 208, 233, 150, 16, 36, 209, 218, + 208, 232, 150, 16, 36, 233, 134, 150, 16, 36, 206, 75, 150, 16, 36, 225, + 253, 214, 65, 150, 16, 36, 225, 253, 214, 64, 150, 16, 36, 241, 65, 77, + 225, 252, 150, 16, 36, 210, 147, 77, 225, 252, 150, 16, 36, 241, 110, + 214, 65, 150, 16, 36, 225, 251, 214, 65, 150, 16, 36, 204, 150, 77, 241, + 109, 150, 16, 36, 241, 65, 77, 241, 109, 150, 16, 36, 241, 65, 77, 241, + 108, 150, 16, 36, 241, 110, 251, 58, 150, 16, 36, 208, 234, 77, 241, 110, + 251, 58, 150, 16, 36, 204, 150, 77, 208, 234, 77, 241, 109, 150, 16, 36, + 199, 104, 150, 16, 36, 202, 75, 214, 65, 150, 16, 36, 222, 195, 214, 65, + 150, 16, 36, 251, 57, 214, 65, 150, 16, 36, 204, 150, 77, 251, 56, 150, + 16, 36, 208, 234, 77, 251, 56, 150, 16, 36, 204, 150, 77, 208, 234, 77, + 251, 56, 150, 16, 36, 199, 13, 77, 251, 56, 150, 16, 36, 210, 147, 77, + 251, 56, 150, 16, 36, 210, 147, 77, 251, 55, 150, 16, 36, 210, 146, 150, + 16, 36, 210, 145, 150, 16, 36, 210, 144, 150, 16, 36, 210, 143, 150, 16, + 36, 251, 148, 150, 16, 36, 251, 147, 150, 16, 36, 220, 33, 150, 16, 36, + 208, 240, 150, 16, 36, 250, 212, 150, 16, 36, 210, 175, 150, 16, 36, 210, + 174, 150, 16, 36, 250, 140, 150, 16, 36, 248, 145, 214, 65, 150, 16, 36, + 203, 99, 150, 16, 36, 203, 98, 150, 16, 36, 211, 73, 222, 83, 150, 16, + 36, 248, 92, 150, 16, 36, 248, 91, 150, 16, 36, 248, 90, 150, 16, 36, + 251, 124, 150, 16, 36, 214, 143, 150, 16, 36, 205, 117, 150, 16, 36, 202, + 73, 150, 16, 36, 233, 54, 150, 16, 36, 197, 115, 150, 16, 36, 212, 60, + 150, 16, 36, 247, 150, 150, 16, 36, 200, 252, 150, 16, 36, 247, 117, 218, + 182, 150, 16, 36, 208, 170, 77, 225, 114, 150, 16, 36, 247, 164, 150, 16, + 36, 201, 174, 150, 16, 36, 205, 5, 201, 174, 150, 16, 36, 221, 250, 150, + 16, 36, 205, 191, 150, 16, 36, 200, 13, 150, 16, 36, 231, 98, 237, 183, + 150, 16, 36, 250, 189, 150, 16, 36, 212, 68, 250, 189, 150, 16, 36, 248, + 41, 150, 16, 36, 212, 59, 248, 41, 150, 16, 36, 251, 121, 150, 16, 36, + 204, 213, 204, 99, 204, 212, 150, 16, 36, 204, 213, 204, 99, 204, 211, + 150, 16, 36, 204, 146, 150, 16, 36, 212, 32, 150, 16, 36, 239, 67, 150, + 16, 36, 239, 69, 150, 16, 36, 239, 68, 150, 16, 36, 211, 202, 150, 16, + 36, 211, 191, 150, 16, 36, 241, 51, 150, 16, 36, 241, 50, 150, 16, 36, + 241, 49, 150, 16, 36, 241, 48, 150, 16, 36, 241, 47, 150, 16, 36, 251, + 162, 150, 16, 36, 249, 53, 77, 220, 14, 150, 16, 36, 249, 53, 77, 199, + 138, 150, 16, 36, 210, 97, 150, 16, 36, 231, 90, 150, 16, 36, 216, 193, + 150, 16, 36, 240, 52, 150, 16, 36, 218, 196, 150, 16, 36, 157, 237, 220, + 150, 16, 36, 157, 214, 36, 58, 222, 178, 225, 236, 53, 201, 180, 58, 200, + 35, 225, 236, 53, 201, 180, 58, 210, 17, 225, 236, 53, 201, 180, 58, 237, + 233, 225, 236, 53, 201, 180, 58, 205, 236, 4, 244, 248, 219, 189, 27, 59, + 244, 248, 27, 59, 244, 248, 85, 59, 244, 248, 199, 48, 85, 59, 244, 248, + 236, 70, 85, 59, 244, 248, 59, 244, 249, 241, 131, 58, 4, 244, 248, 209, + 187, 203, 100, 58, 202, 70, 205, 94, 58, 205, 236, 4, 205, 94, 175, 59, + 205, 94, 219, 189, 59, 205, 94, 27, 59, 205, 94, 85, 59, 205, 94, 199, + 48, 85, 59, 205, 94, 236, 70, 85, 59, 205, 94, 59, 47, 241, 131, 58, 199, + 48, 4, 205, 94, 59, 47, 241, 131, 58, 219, 189, 205, 94, 47, 203, 100, + 58, 202, 70, 239, 139, 58, 199, 48, 4, 239, 139, 58, 219, 189, 4, 239, + 139, 59, 239, 140, 241, 131, 58, 199, 48, 4, 239, 139, 59, 239, 140, 241, + 131, 58, 219, 189, 239, 139, 239, 140, 203, 100, 58, 202, 70, 221, 197, + 58, 199, 48, 4, 221, 197, 58, 219, 189, 4, 221, 197, 59, 221, 198, 241, + 131, 58, 4, 221, 197, 202, 188, 32, 241, 60, 175, 32, 241, 60, 219, 189, + 32, 241, 60, 27, 32, 241, 60, 199, 48, 27, 32, 241, 60, 199, 48, 85, 32, + 241, 60, 236, 70, 85, 32, 241, 60, 202, 188, 208, 230, 175, 208, 230, + 219, 189, 208, 230, 27, 208, 230, 85, 208, 230, 199, 48, 85, 208, 230, + 236, 70, 85, 208, 230, 175, 235, 100, 205, 110, 250, 178, 219, 189, 235, + 100, 205, 110, 250, 178, 27, 235, 100, 205, 110, 250, 178, 85, 235, 100, + 205, 110, 250, 178, 199, 48, 85, 235, 100, 205, 110, 250, 178, 236, 70, + 85, 235, 100, 205, 110, 250, 178, 175, 206, 29, 205, 110, 250, 178, 219, + 189, 206, 29, 205, 110, 250, 178, 27, 206, 29, 205, 110, 250, 178, 85, + 206, 29, 205, 110, 250, 178, 199, 48, 85, 206, 29, 205, 110, 250, 178, + 236, 70, 85, 206, 29, 205, 110, 250, 178, 175, 237, 30, 205, 110, 250, + 178, 219, 189, 237, 30, 205, 110, 250, 178, 27, 237, 30, 205, 110, 250, + 178, 85, 237, 30, 205, 110, 250, 178, 199, 48, 85, 237, 30, 205, 110, + 250, 178, 175, 115, 212, 108, 58, 205, 7, 219, 189, 115, 212, 108, 58, + 205, 7, 115, 212, 108, 58, 205, 7, 219, 189, 115, 212, 108, 212, 169, + 205, 7, 175, 235, 6, 212, 108, 58, 205, 7, 219, 189, 235, 6, 212, 108, + 58, 205, 7, 235, 6, 212, 108, 58, 205, 7, 219, 189, 235, 6, 212, 108, + 212, 169, 205, 7, 210, 90, 175, 235, 6, 212, 108, 212, 169, 205, 7, 175, + 235, 100, 212, 108, 58, 205, 7, 85, 235, 100, 212, 108, 58, 205, 7, 219, + 189, 206, 29, 212, 108, 58, 205, 7, 85, 206, 29, 212, 108, 58, 205, 7, + 206, 29, 212, 108, 212, 169, 205, 7, 219, 189, 237, 30, 212, 108, 58, + 205, 7, 85, 237, 30, 212, 108, 58, 205, 7, 199, 48, 85, 237, 30, 212, + 108, 58, 205, 7, 85, 237, 30, 212, 108, 212, 169, 205, 7, 175, 200, 240, + 212, 108, 58, 205, 7, 85, 200, 240, 212, 108, 58, 205, 7, 85, 200, 240, + 212, 108, 212, 169, 205, 7, 46, 201, 180, 217, 103, 46, 201, 180, 46, + 205, 94, 217, 103, 46, 205, 94, 222, 227, 214, 70, 244, 248, 222, 227, + 196, 62, 244, 248, 222, 227, 233, 90, 244, 248, 222, 227, 211, 199, 244, + 248, 222, 227, 248, 29, 244, 248, 222, 227, 210, 157, 205, 94, 222, 227, + 248, 118, 205, 94, 222, 227, 214, 70, 205, 94, 222, 227, 196, 62, 205, + 94, 222, 227, 233, 90, 205, 94, 222, 227, 211, 199, 205, 94, 222, 227, + 248, 29, 205, 94, 107, 61, 3, 4, 201, 181, 250, 216, 200, 24, 61, 3, 4, + 201, 181, 250, 216, 91, 61, 3, 4, 201, 181, 250, 216, 237, 230, 61, 3, 4, + 201, 181, 250, 216, 107, 61, 3, 219, 189, 201, 181, 250, 216, 200, 24, + 61, 3, 219, 189, 201, 181, 250, 216, 91, 61, 3, 219, 189, 201, 181, 250, + 216, 237, 230, 61, 3, 219, 189, 201, 181, 250, 216, 107, 61, 3, 222, 227, + 201, 181, 250, 216, 200, 24, 61, 3, 222, 227, 201, 181, 250, 216, 91, 61, + 3, 222, 227, 201, 181, 250, 216, 237, 230, 61, 3, 222, 227, 201, 181, + 250, 216, 107, 61, 3, 4, 236, 165, 250, 216, 200, 24, 61, 3, 4, 236, 165, + 250, 216, 91, 61, 3, 4, 236, 165, 250, 216, 237, 230, 61, 3, 4, 236, 165, + 250, 216, 107, 61, 3, 236, 165, 250, 216, 200, 24, 61, 3, 236, 165, 250, + 216, 91, 61, 3, 236, 165, 250, 216, 237, 230, 61, 3, 236, 165, 250, 216, + 85, 107, 61, 3, 236, 165, 250, 216, 85, 200, 24, 61, 3, 236, 165, 250, + 216, 85, 91, 61, 3, 236, 165, 250, 216, 85, 237, 230, 61, 3, 236, 165, + 250, 216, 85, 107, 61, 3, 222, 227, 236, 165, 250, 216, 85, 200, 24, 61, + 3, 222, 227, 236, 165, 250, 216, 85, 91, 61, 3, 222, 227, 236, 165, 250, + 216, 85, 237, 230, 61, 3, 222, 227, 236, 165, 250, 216, 107, 201, 179, + 61, 3, 217, 209, 207, 35, 200, 24, 201, 179, 61, 3, 217, 209, 207, 35, + 91, 201, 179, 61, 3, 217, 209, 207, 35, 237, 230, 201, 179, 61, 3, 217, + 209, 207, 35, 107, 201, 179, 61, 3, 219, 189, 207, 35, 200, 24, 201, 179, + 61, 3, 219, 189, 207, 35, 91, 201, 179, 61, 3, 219, 189, 207, 35, 237, + 230, 201, 179, 61, 3, 219, 189, 207, 35, 107, 201, 179, 61, 3, 27, 207, + 35, 200, 24, 201, 179, 61, 3, 27, 207, 35, 91, 201, 179, 61, 3, 27, 207, + 35, 237, 230, 201, 179, 61, 3, 27, 207, 35, 107, 201, 179, 61, 3, 85, + 207, 35, 200, 24, 201, 179, 61, 3, 85, 207, 35, 91, 201, 179, 61, 3, 85, + 207, 35, 237, 230, 201, 179, 61, 3, 85, 207, 35, 107, 201, 179, 61, 3, + 199, 48, 85, 207, 35, 200, 24, 201, 179, 61, 3, 199, 48, 85, 207, 35, 91, + 201, 179, 61, 3, 199, 48, 85, 207, 35, 237, 230, 201, 179, 61, 3, 199, + 48, 85, 207, 35, 107, 235, 125, 51, 200, 24, 235, 125, 51, 91, 235, 125, + 51, 237, 230, 235, 125, 51, 107, 103, 51, 200, 24, 103, 51, 91, 103, 51, + 237, 230, 103, 51, 107, 241, 158, 51, 200, 24, 241, 158, 51, 91, 241, + 158, 51, 237, 230, 241, 158, 51, 107, 85, 241, 158, 51, 200, 24, 85, 241, + 158, 51, 91, 85, 241, 158, 51, 237, 230, 85, 241, 158, 51, 107, 85, 51, + 200, 24, 85, 51, 91, 85, 51, 237, 230, 85, 51, 107, 45, 51, 200, 24, 45, + 51, 91, 45, 51, 237, 230, 45, 51, 173, 197, 89, 45, 51, 173, 237, 68, 45, + 51, 205, 159, 237, 68, 45, 51, 205, 159, 197, 89, 45, 51, 50, 53, 45, 51, + 124, 135, 45, 51, 197, 61, 107, 175, 165, 51, 197, 61, 200, 24, 175, 165, + 51, 197, 61, 91, 175, 165, 51, 197, 61, 237, 230, 175, 165, 51, 197, 61, + 173, 197, 89, 175, 165, 51, 197, 61, 173, 237, 68, 175, 165, 51, 197, 61, + 205, 159, 237, 68, 175, 165, 51, 197, 61, 205, 159, 197, 89, 175, 165, + 51, 197, 61, 107, 165, 51, 197, 61, 200, 24, 165, 51, 197, 61, 91, 165, + 51, 197, 61, 237, 230, 165, 51, 197, 61, 173, 197, 89, 165, 51, 197, 61, + 173, 237, 68, 165, 51, 197, 61, 205, 159, 237, 68, 165, 51, 197, 61, 205, + 159, 197, 89, 165, 51, 197, 61, 107, 219, 189, 165, 51, 197, 61, 200, 24, + 219, 189, 165, 51, 197, 61, 91, 219, 189, 165, 51, 197, 61, 237, 230, + 219, 189, 165, 51, 197, 61, 173, 197, 89, 219, 189, 165, 51, 197, 61, + 173, 237, 68, 219, 189, 165, 51, 197, 61, 205, 159, 237, 68, 219, 189, + 165, 51, 197, 61, 205, 159, 197, 89, 219, 189, 165, 51, 197, 61, 107, 85, + 165, 51, 197, 61, 200, 24, 85, 165, 51, 197, 61, 91, 85, 165, 51, 197, + 61, 237, 230, 85, 165, 51, 197, 61, 173, 197, 89, 85, 165, 51, 197, 61, + 173, 237, 68, 85, 165, 51, 197, 61, 205, 159, 237, 68, 85, 165, 51, 197, + 61, 205, 159, 197, 89, 85, 165, 51, 197, 61, 107, 199, 48, 85, 165, 51, + 197, 61, 200, 24, 199, 48, 85, 165, 51, 197, 61, 91, 199, 48, 85, 165, + 51, 197, 61, 237, 230, 199, 48, 85, 165, 51, 197, 61, 173, 197, 89, 199, + 48, 85, 165, 51, 197, 61, 173, 237, 68, 199, 48, 85, 165, 51, 197, 61, + 205, 159, 237, 68, 199, 48, 85, 165, 51, 197, 61, 205, 159, 197, 89, 199, + 48, 85, 165, 51, 107, 201, 181, 250, 216, 200, 24, 201, 181, 250, 216, + 91, 201, 181, 250, 216, 237, 230, 201, 181, 250, 216, 107, 59, 61, 197, + 39, 201, 181, 250, 216, 200, 24, 59, 61, 197, 39, 201, 181, 250, 216, 91, + 59, 61, 197, 39, 201, 181, 250, 216, 237, 230, 59, 61, 197, 39, 201, 181, + 250, 216, 107, 61, 3, 216, 14, 203, 135, 200, 24, 61, 3, 216, 14, 203, + 135, 91, 61, 3, 216, 14, 203, 135, 237, 230, 61, 3, 216, 14, 203, 135, + 85, 61, 207, 36, 197, 59, 100, 85, 61, 207, 36, 197, 59, 99, 202, 181, + 85, 61, 207, 36, 197, 59, 97, 232, 224, 85, 61, 207, 36, 197, 59, 97, + 202, 184, 107, 248, 81, 59, 51, 91, 248, 84, 207, 38, 59, 51, 107, 201, + 243, 207, 38, 59, 51, 91, 201, 243, 207, 38, 59, 51, 107, 222, 177, 59, + 51, 91, 210, 16, 59, 51, 107, 210, 16, 59, 51, 91, 222, 177, 59, 51, 107, + 249, 136, 207, 37, 59, 51, 91, 249, 136, 207, 37, 59, 51, 107, 234, 231, + 207, 37, 59, 51, 91, 234, 231, 207, 37, 59, 51, 59, 61, 207, 36, 197, 59, + 100, 59, 61, 207, 36, 197, 59, 99, 202, 181, 46, 241, 61, 235, 20, 3, + 235, 6, 238, 249, 46, 241, 61, 235, 20, 3, 99, 238, 249, 46, 241, 61, + 235, 19, 50, 157, 244, 249, 3, 235, 6, 238, 249, 50, 157, 244, 249, 3, + 115, 238, 249, 50, 157, 244, 249, 3, 99, 238, 249, 50, 157, 244, 249, 3, + 238, 252, 50, 157, 244, 248, 237, 231, 235, 225, 122, 237, 231, 235, 225, + 216, 14, 122, 237, 231, 235, 225, 231, 164, 3, 238, 252, 237, 231, 235, + 225, 216, 14, 231, 164, 3, 238, 252, 59, 232, 125, 248, 29, 232, 125, + 212, 173, 232, 208, 195, 20, 235, 232, 218, 212, 235, 232, 235, 233, 3, + 202, 205, 217, 91, 235, 232, 202, 186, 235, 232, 235, 233, 3, 232, 135, + 209, 220, 235, 232, 231, 65, 235, 232, 2, 77, 202, 218, 231, 100, 247, + 152, 219, 207, 232, 208, 210, 214, 249, 138, 77, 232, 208, 222, 182, 235, + 105, 210, 21, 235, 105, 232, 182, 232, 209, 3, 132, 26, 112, 235, 122, + 241, 57, 230, 248, 221, 208, 195, 231, 232, 209, 55, 235, 233, 3, 241, + 81, 232, 164, 244, 191, 235, 232, 217, 198, 235, 232, 209, 210, 214, 119, + 202, 218, 235, 69, 222, 213, 237, 211, 235, 232, 221, 145, 235, 232, 235, + 233, 213, 205, 205, 210, 235, 232, 235, 233, 3, 97, 236, 65, 210, 213, + 233, 86, 235, 233, 3, 205, 8, 236, 58, 233, 86, 235, 233, 3, 97, 222, + 227, 26, 97, 4, 236, 66, 235, 233, 3, 235, 127, 241, 84, 244, 202, 222, + 58, 207, 82, 235, 233, 3, 203, 250, 241, 84, 218, 163, 205, 218, 235, + 233, 3, 205, 218, 236, 59, 26, 232, 209, 241, 84, 218, 163, 235, 233, 3, + 192, 218, 164, 198, 234, 206, 196, 235, 233, 3, 236, 81, 232, 136, 212, + 29, 197, 21, 248, 49, 213, 204, 124, 202, 19, 207, 111, 212, 17, 220, 62, + 226, 86, 200, 248, 218, 178, 245, 36, 206, 155, 213, 28, 239, 13, 247, + 96, 225, 104, 235, 167, 218, 237, 213, 51, 196, 251, 197, 128, 212, 96, + 232, 187, 239, 54, 220, 8, 197, 53, 235, 61, 237, 206, 3, 237, 204, 244, + 209, 233, 155, 201, 20, 233, 156, 205, 107, 233, 141, 217, 87, 210, 23, + 235, 112, 212, 148, 219, 195, 208, 136, 212, 148, 219, 195, 202, 185, + 212, 148, 219, 195, 248, 68, 233, 150, 220, 18, 250, 205, 200, 53, 241, + 18, 204, 228, 223, 66, 204, 238, 26, 249, 102, 205, 185, 235, 53, 239, + 77, 241, 64, 250, 127, 241, 33, 249, 129, 212, 65, 247, 100, 249, 115, + 248, 52, 233, 90, 208, 238, 207, 28, 213, 191, 77, 235, 38, 204, 177, + 235, 80, 237, 44, 233, 157, 77, 219, 31, 213, 85, 224, 50, 213, 187, 237, + 188, 235, 15, 241, 114, 203, 127, 248, 69, 245, 42, 248, 74, 3, 205, 107, + 241, 27, 3, 204, 210, 244, 176, 248, 33, 212, 212, 212, 21, 241, 1, 77, + 219, 198, 208, 214, 247, 128, 235, 38, 222, 190, 233, 89, 220, 53, 218, + 189, 247, 159, 249, 118, 205, 218, 235, 233, 3, 205, 218, 236, 59, 26, + 115, 232, 123, 196, 76, 235, 232, 235, 233, 3, 213, 128, 231, 102, 26, + 213, 128, 232, 164, 235, 233, 3, 200, 57, 236, 59, 26, 197, 119, 218, + 163, 214, 24, 235, 232, 234, 243, 235, 232, 235, 233, 3, 212, 135, 236, + 58, 208, 202, 223, 75, 244, 178, 233, 137, 232, 41, 248, 96, 235, 82, + 206, 194, 241, 78, 222, 62, 235, 232, 208, 158, 201, 8, 200, 55, 235, + 232, 237, 78, 237, 196, 249, 55, 207, 14, 214, 14, 234, 254, 235, 232, + 247, 228, 239, 233, 233, 123, 222, 41, 210, 76, 206, 157, 205, 88, 233, + 169, 235, 232, 195, 86, 235, 232, 232, 118, 208, 187, 203, 215, 241, 67, + 225, 11, 222, 33, 213, 87, 232, 33, 213, 134, 210, 238, 222, 4, 218, 180, + 219, 67, 249, 124, 204, 65, 205, 230, 214, 41, 214, 69, 205, 253, 235, + 84, 214, 4, 233, 59, 239, 16, 212, 6, 247, 130, 236, 235, 244, 148, 210, + 157, 232, 232, 236, 235, 244, 148, 241, 17, 232, 232, 236, 235, 244, 148, + 249, 104, 236, 235, 244, 148, 59, 232, 232, 248, 103, 222, 171, 235, 36, + 201, 244, 204, 97, 204, 92, 209, 4, 199, 46, 237, 76, 3, 232, 127, 251, + 198, 218, 174, 197, 75, 220, 45, 197, 75, 219, 197, 250, 230, 219, 197, + 222, 171, 245, 93, 197, 100, 241, 25, 208, 234, 207, 32, 248, 201, 248, + 69, 234, 79, 214, 107, 235, 214, 197, 155, 247, 229, 220, 2, 237, 215, + 230, 201, 241, 35, 205, 10, 213, 27, 224, 22, 213, 27, 239, 249, 213, 27, + 235, 233, 3, 218, 207, 251, 248, 245, 65, 214, 131, 251, 248, 249, 0, + 213, 27, 213, 28, 3, 232, 131, 213, 28, 226, 86, 204, 245, 209, 202, 213, + 28, 244, 211, 213, 28, 226, 86, 221, 213, 212, 77, 220, 91, 235, 216, + 199, 141, 219, 151, 236, 249, 234, 30, 195, 9, 248, 59, 214, 70, 232, + 125, 248, 166, 247, 124, 208, 171, 233, 149, 244, 178, 205, 188, 210, + 157, 233, 181, 236, 193, 235, 116, 225, 165, 211, 187, 212, 211, 203, 3, + 201, 30, 213, 12, 239, 74, 239, 29, 52, 232, 106, 244, 153, 252, 32, 235, + 118, 236, 75, 201, 246, 248, 41, 220, 90, 221, 180, 221, 214, 248, 85, + 205, 108, 77, 202, 156, 249, 103, 77, 196, 89, 209, 4, 212, 175, 203, 51, + 249, 1, 248, 30, 249, 60, 209, 213, 77, 213, 160, 249, 79, 77, 205, 191, + 205, 109, 210, 173, 217, 192, 251, 107, 217, 84, 245, 82, 224, 72, 217, + 84, 245, 82, 211, 79, 217, 84, 245, 82, 209, 203, 217, 84, 245, 82, 248, + 147, 217, 84, 245, 82, 224, 18, 217, 84, 245, 82, 213, 102, 59, 245, 82, + 224, 19, 209, 194, 235, 12, 239, 229, 58, 245, 82, 224, 19, 209, 194, + 235, 12, 239, 229, 217, 84, 245, 82, 224, 19, 209, 194, 235, 12, 239, + 229, 59, 245, 82, 224, 73, 209, 194, 216, 174, 239, 229, 59, 245, 82, + 211, 80, 209, 194, 216, 174, 239, 229, 59, 245, 82, 209, 204, 209, 194, + 216, 174, 239, 229, 59, 245, 82, 248, 148, 209, 194, 216, 174, 239, 229, + 59, 245, 82, 224, 19, 209, 194, 216, 174, 239, 229, 59, 245, 82, 213, + 103, 209, 194, 216, 174, 239, 229, 58, 245, 82, 224, 73, 209, 194, 216, + 174, 239, 229, 58, 245, 82, 211, 80, 209, 194, 216, 174, 239, 229, 58, + 245, 82, 209, 204, 209, 194, 216, 174, 239, 229, 58, 245, 82, 248, 148, + 209, 194, 216, 174, 239, 229, 58, 245, 82, 224, 19, 209, 194, 216, 174, + 239, 229, 58, 245, 82, 213, 103, 209, 194, 216, 174, 239, 229, 217, 84, + 245, 82, 224, 73, 209, 194, 216, 174, 239, 229, 217, 84, 245, 82, 211, + 80, 209, 194, 216, 174, 239, 229, 217, 84, 245, 82, 209, 204, 209, 194, + 216, 174, 239, 229, 217, 84, 245, 82, 248, 148, 209, 194, 216, 174, 239, + 229, 217, 84, 245, 82, 224, 19, 209, 194, 216, 174, 239, 229, 217, 84, + 245, 82, 213, 103, 209, 194, 216, 174, 239, 229, 59, 245, 82, 224, 19, + 209, 194, 97, 231, 57, 202, 176, 239, 229, 58, 245, 82, 224, 19, 209, + 194, 97, 231, 57, 202, 176, 239, 229, 217, 84, 245, 82, 224, 19, 209, + 194, 97, 231, 57, 202, 176, 239, 229, 59, 245, 82, 163, 224, 72, 59, 245, + 82, 163, 211, 79, 59, 245, 82, 163, 209, 203, 59, 245, 82, 163, 248, 147, + 59, 245, 82, 163, 224, 18, 59, 245, 82, 163, 213, 102, 58, 245, 82, 163, + 224, 72, 58, 245, 82, 163, 211, 79, 58, 245, 82, 163, 209, 203, 58, 245, + 82, 163, 248, 147, 58, 245, 82, 163, 224, 18, 58, 245, 82, 163, 213, 102, + 217, 84, 245, 82, 163, 224, 72, 217, 84, 245, 82, 163, 211, 79, 217, 84, + 245, 82, 163, 209, 203, 217, 84, 245, 82, 163, 248, 147, 217, 84, 245, + 82, 163, 224, 18, 217, 84, 245, 82, 163, 213, 102, 59, 245, 82, 224, 19, + 209, 194, 99, 231, 57, 200, 231, 239, 229, 58, 245, 82, 224, 19, 209, + 194, 99, 231, 57, 200, 231, 239, 229, 217, 84, 245, 82, 224, 19, 209, + 194, 99, 231, 57, 200, 231, 239, 229, 59, 245, 82, 224, 73, 209, 194, 99, + 231, 57, 207, 66, 239, 229, 59, 245, 82, 211, 80, 209, 194, 99, 231, 57, + 207, 66, 239, 229, 59, 245, 82, 209, 204, 209, 194, 99, 231, 57, 207, 66, + 239, 229, 59, 245, 82, 248, 148, 209, 194, 99, 231, 57, 207, 66, 239, + 229, 59, 245, 82, 224, 19, 209, 194, 99, 231, 57, 207, 66, 239, 229, 59, + 245, 82, 213, 103, 209, 194, 99, 231, 57, 207, 66, 239, 229, 58, 245, 82, + 224, 73, 209, 194, 99, 231, 57, 207, 66, 239, 229, 58, 245, 82, 211, 80, + 209, 194, 99, 231, 57, 207, 66, 239, 229, 58, 245, 82, 209, 204, 209, + 194, 99, 231, 57, 207, 66, 239, 229, 58, 245, 82, 248, 148, 209, 194, 99, + 231, 57, 207, 66, 239, 229, 58, 245, 82, 224, 19, 209, 194, 99, 231, 57, + 207, 66, 239, 229, 58, 245, 82, 213, 103, 209, 194, 99, 231, 57, 207, 66, + 239, 229, 217, 84, 245, 82, 224, 73, 209, 194, 99, 231, 57, 207, 66, 239, + 229, 217, 84, 245, 82, 211, 80, 209, 194, 99, 231, 57, 207, 66, 239, 229, + 217, 84, 245, 82, 209, 204, 209, 194, 99, 231, 57, 207, 66, 239, 229, + 217, 84, 245, 82, 248, 148, 209, 194, 99, 231, 57, 207, 66, 239, 229, + 217, 84, 245, 82, 224, 19, 209, 194, 99, 231, 57, 207, 66, 239, 229, 217, + 84, 245, 82, 213, 103, 209, 194, 99, 231, 57, 207, 66, 239, 229, 59, 245, + 82, 224, 19, 209, 194, 115, 231, 57, 235, 149, 239, 229, 58, 245, 82, + 224, 19, 209, 194, 115, 231, 57, 235, 149, 239, 229, 217, 84, 245, 82, + 224, 19, 209, 194, 115, 231, 57, 235, 149, 239, 229, 59, 245, 82, 236, + 166, 58, 245, 82, 236, 166, 217, 84, 245, 82, 236, 166, 59, 245, 82, 236, + 167, 209, 194, 216, 174, 239, 229, 58, 245, 82, 236, 167, 209, 194, 216, + 174, 239, 229, 217, 84, 245, 82, 236, 167, 209, 194, 216, 174, 239, 229, + 59, 245, 82, 224, 16, 59, 245, 82, 224, 15, 59, 245, 82, 224, 17, 58, + 245, 82, 224, 16, 58, 245, 82, 224, 15, 58, 245, 82, 224, 17, 196, 194, + 210, 157, 234, 32, 196, 194, 210, 157, 220, 55, 196, 194, 210, 157, 236, + 254, 196, 194, 210, 157, 231, 97, 196, 194, 210, 157, 245, 111, 196, 194, + 210, 157, 247, 127, 196, 194, 210, 157, 205, 180, 196, 194, 58, 234, 32, + 196, 194, 58, 220, 55, 196, 194, 58, 236, 254, 196, 194, 58, 231, 97, + 196, 194, 58, 245, 111, 196, 194, 58, 247, 127, 196, 194, 58, 205, 180, + 249, 101, 206, 193, 214, 112, 204, 52, 248, 37, 206, 167, 237, 210, 77, + 248, 123, 251, 254, 249, 87, 204, 239, 195, 244, 224, 53, 213, 154, 210, + 1, 212, 140, 247, 10, 210, 186, 250, 122, 239, 49, 222, 238, 249, 85, 12, + 15, 230, 189, 12, 15, 230, 188, 12, 15, 230, 187, 12, 15, 230, 186, 12, + 15, 230, 185, 12, 15, 230, 184, 12, 15, 230, 183, 12, 15, 230, 182, 12, + 15, 230, 181, 12, 15, 230, 180, 12, 15, 230, 179, 12, 15, 230, 178, 12, + 15, 230, 177, 12, 15, 230, 176, 12, 15, 230, 175, 12, 15, 230, 174, 12, + 15, 230, 173, 12, 15, 230, 172, 12, 15, 230, 171, 12, 15, 230, 170, 12, + 15, 230, 169, 12, 15, 230, 168, 12, 15, 230, 167, 12, 15, 230, 166, 12, + 15, 230, 165, 12, 15, 230, 164, 12, 15, 230, 163, 12, 15, 230, 162, 12, + 15, 230, 161, 12, 15, 230, 160, 12, 15, 230, 159, 12, 15, 230, 158, 12, + 15, 230, 157, 12, 15, 230, 156, 12, 15, 230, 155, 12, 15, 230, 154, 12, + 15, 230, 153, 12, 15, 230, 152, 12, 15, 230, 151, 12, 15, 230, 150, 12, + 15, 230, 149, 12, 15, 230, 148, 12, 15, 230, 147, 12, 15, 230, 146, 12, + 15, 230, 145, 12, 15, 230, 144, 12, 15, 230, 143, 12, 15, 230, 142, 12, + 15, 230, 141, 12, 15, 230, 140, 12, 15, 230, 139, 12, 15, 230, 138, 12, + 15, 230, 137, 12, 15, 230, 136, 12, 15, 230, 135, 12, 15, 230, 134, 12, + 15, 230, 133, 12, 15, 230, 132, 12, 15, 230, 131, 12, 15, 230, 130, 12, + 15, 230, 129, 12, 15, 230, 128, 12, 15, 230, 127, 12, 15, 230, 126, 12, + 15, 230, 125, 12, 15, 230, 124, 12, 15, 230, 123, 12, 15, 230, 122, 12, + 15, 230, 121, 12, 15, 230, 120, 12, 15, 230, 119, 12, 15, 230, 118, 12, + 15, 230, 117, 12, 15, 230, 116, 12, 15, 230, 115, 12, 15, 230, 114, 12, + 15, 230, 113, 12, 15, 230, 112, 12, 15, 230, 111, 12, 15, 230, 110, 12, + 15, 230, 109, 12, 15, 230, 108, 12, 15, 230, 107, 12, 15, 230, 106, 12, + 15, 230, 105, 12, 15, 230, 104, 12, 15, 230, 103, 12, 15, 230, 102, 12, + 15, 230, 101, 12, 15, 230, 100, 12, 15, 230, 99, 12, 15, 230, 98, 12, 15, + 230, 97, 12, 15, 230, 96, 12, 15, 230, 95, 12, 15, 230, 94, 12, 15, 230, + 93, 12, 15, 230, 92, 12, 15, 230, 91, 12, 15, 230, 90, 12, 15, 230, 89, + 12, 15, 230, 88, 12, 15, 230, 87, 12, 15, 230, 86, 12, 15, 230, 85, 12, + 15, 230, 84, 12, 15, 230, 83, 12, 15, 230, 82, 12, 15, 230, 81, 12, 15, + 230, 80, 12, 15, 230, 79, 12, 15, 230, 78, 12, 15, 230, 77, 12, 15, 230, + 76, 12, 15, 230, 75, 12, 15, 230, 74, 12, 15, 230, 73, 12, 15, 230, 72, + 12, 15, 230, 71, 12, 15, 230, 70, 12, 15, 230, 69, 12, 15, 230, 68, 12, + 15, 230, 67, 12, 15, 230, 66, 12, 15, 230, 65, 12, 15, 230, 64, 12, 15, + 230, 63, 12, 15, 230, 62, 12, 15, 230, 61, 12, 15, 230, 60, 12, 15, 230, + 59, 12, 15, 230, 58, 12, 15, 230, 57, 12, 15, 230, 56, 12, 15, 230, 55, + 12, 15, 230, 54, 12, 15, 230, 53, 12, 15, 230, 52, 12, 15, 230, 51, 12, + 15, 230, 50, 12, 15, 230, 49, 12, 15, 230, 48, 12, 15, 230, 47, 12, 15, + 230, 46, 12, 15, 230, 45, 12, 15, 230, 44, 12, 15, 230, 43, 12, 15, 230, + 42, 12, 15, 230, 41, 12, 15, 230, 40, 12, 15, 230, 39, 12, 15, 230, 38, + 12, 15, 230, 37, 12, 15, 230, 36, 12, 15, 230, 35, 12, 15, 230, 34, 12, + 15, 230, 33, 12, 15, 230, 32, 12, 15, 230, 31, 12, 15, 230, 30, 12, 15, + 230, 29, 12, 15, 230, 28, 12, 15, 230, 27, 12, 15, 230, 26, 12, 15, 230, + 25, 12, 15, 230, 24, 12, 15, 230, 23, 12, 15, 230, 22, 12, 15, 230, 21, + 12, 15, 230, 20, 12, 15, 230, 19, 12, 15, 230, 18, 12, 15, 230, 17, 12, + 15, 230, 16, 12, 15, 230, 15, 12, 15, 230, 14, 12, 15, 230, 13, 12, 15, + 230, 12, 12, 15, 230, 11, 12, 15, 230, 10, 12, 15, 230, 9, 12, 15, 230, + 8, 12, 15, 230, 7, 12, 15, 230, 6, 12, 15, 230, 5, 12, 15, 230, 4, 12, + 15, 230, 3, 12, 15, 230, 2, 12, 15, 230, 1, 12, 15, 230, 0, 12, 15, 229, + 255, 12, 15, 229, 254, 12, 15, 229, 253, 12, 15, 229, 252, 12, 15, 229, + 251, 12, 15, 229, 250, 12, 15, 229, 249, 12, 15, 229, 248, 12, 15, 229, + 247, 12, 15, 229, 246, 12, 15, 229, 245, 12, 15, 229, 244, 12, 15, 229, + 243, 12, 15, 229, 242, 12, 15, 229, 241, 12, 15, 229, 240, 12, 15, 229, + 239, 12, 15, 229, 238, 12, 15, 229, 237, 12, 15, 229, 236, 12, 15, 229, + 235, 12, 15, 229, 234, 12, 15, 229, 233, 12, 15, 229, 232, 12, 15, 229, + 231, 12, 15, 229, 230, 12, 15, 229, 229, 12, 15, 229, 228, 12, 15, 229, + 227, 12, 15, 229, 226, 12, 15, 229, 225, 12, 15, 229, 224, 12, 15, 229, + 223, 12, 15, 229, 222, 12, 15, 229, 221, 12, 15, 229, 220, 12, 15, 229, + 219, 12, 15, 229, 218, 12, 15, 229, 217, 12, 15, 229, 216, 12, 15, 229, + 215, 12, 15, 229, 214, 12, 15, 229, 213, 12, 15, 229, 212, 12, 15, 229, + 211, 12, 15, 229, 210, 12, 15, 229, 209, 12, 15, 229, 208, 12, 15, 229, + 207, 12, 15, 229, 206, 12, 15, 229, 205, 12, 15, 229, 204, 12, 15, 229, + 203, 12, 15, 229, 202, 12, 15, 229, 201, 12, 15, 229, 200, 12, 15, 229, + 199, 12, 15, 229, 198, 12, 15, 229, 197, 12, 15, 229, 196, 12, 15, 229, + 195, 12, 15, 229, 194, 12, 15, 229, 193, 12, 15, 229, 192, 12, 15, 229, + 191, 12, 15, 229, 190, 12, 15, 229, 189, 12, 15, 229, 188, 12, 15, 229, + 187, 12, 15, 229, 186, 12, 15, 229, 185, 12, 15, 229, 184, 12, 15, 229, + 183, 12, 15, 229, 182, 12, 15, 229, 181, 12, 15, 229, 180, 12, 15, 229, + 179, 12, 15, 229, 178, 12, 15, 229, 177, 12, 15, 229, 176, 12, 15, 229, + 175, 12, 15, 229, 174, 12, 15, 229, 173, 12, 15, 229, 172, 12, 15, 229, + 171, 12, 15, 229, 170, 12, 15, 229, 169, 12, 15, 229, 168, 12, 15, 229, + 167, 12, 15, 229, 166, 12, 15, 229, 165, 12, 15, 229, 164, 12, 15, 229, + 163, 12, 15, 229, 162, 12, 15, 229, 161, 12, 15, 229, 160, 12, 15, 229, + 159, 12, 15, 229, 158, 12, 15, 229, 157, 12, 15, 229, 156, 12, 15, 229, + 155, 12, 15, 229, 154, 12, 15, 229, 153, 12, 15, 229, 152, 12, 15, 229, + 151, 12, 15, 229, 150, 12, 15, 229, 149, 12, 15, 229, 148, 12, 15, 229, + 147, 12, 15, 229, 146, 12, 15, 229, 145, 12, 15, 229, 144, 12, 15, 229, + 143, 12, 15, 229, 142, 12, 15, 229, 141, 12, 15, 229, 140, 12, 15, 229, + 139, 12, 15, 229, 138, 12, 15, 229, 137, 12, 15, 229, 136, 12, 15, 229, + 135, 12, 15, 229, 134, 12, 15, 229, 133, 12, 15, 229, 132, 12, 15, 229, + 131, 12, 15, 229, 130, 12, 15, 229, 129, 12, 15, 229, 128, 12, 15, 229, + 127, 12, 15, 229, 126, 12, 15, 229, 125, 12, 15, 229, 124, 12, 15, 229, + 123, 12, 15, 229, 122, 12, 15, 229, 121, 12, 15, 229, 120, 12, 15, 229, + 119, 12, 15, 229, 118, 12, 15, 229, 117, 12, 15, 229, 116, 12, 15, 229, + 115, 12, 15, 229, 114, 12, 15, 229, 113, 12, 15, 229, 112, 12, 15, 229, + 111, 12, 15, 229, 110, 12, 15, 229, 109, 12, 15, 229, 108, 12, 15, 229, + 107, 12, 15, 229, 106, 12, 15, 229, 105, 12, 15, 229, 104, 12, 15, 229, + 103, 12, 15, 229, 102, 12, 15, 229, 101, 12, 15, 229, 100, 12, 15, 229, + 99, 12, 15, 229, 98, 12, 15, 229, 97, 12, 15, 229, 96, 12, 15, 229, 95, + 12, 15, 229, 94, 12, 15, 229, 93, 12, 15, 229, 92, 12, 15, 229, 91, 12, + 15, 229, 90, 12, 15, 229, 89, 12, 15, 229, 88, 12, 15, 229, 87, 12, 15, + 229, 86, 12, 15, 229, 85, 12, 15, 229, 84, 12, 15, 229, 83, 12, 15, 229, + 82, 12, 15, 229, 81, 12, 15, 229, 80, 12, 15, 229, 79, 12, 15, 229, 78, + 12, 15, 229, 77, 12, 15, 229, 76, 12, 15, 229, 75, 12, 15, 229, 74, 12, + 15, 229, 73, 12, 15, 229, 72, 12, 15, 229, 71, 12, 15, 229, 70, 12, 15, + 229, 69, 12, 15, 229, 68, 12, 15, 229, 67, 12, 15, 229, 66, 12, 15, 229, + 65, 12, 15, 229, 64, 12, 15, 229, 63, 12, 15, 229, 62, 12, 15, 229, 61, + 12, 15, 229, 60, 12, 15, 229, 59, 12, 15, 229, 58, 12, 15, 229, 57, 12, + 15, 229, 56, 12, 15, 229, 55, 12, 15, 229, 54, 12, 15, 229, 53, 12, 15, + 229, 52, 12, 15, 229, 51, 12, 15, 229, 50, 12, 15, 229, 49, 12, 15, 229, + 48, 12, 15, 229, 47, 12, 15, 229, 46, 12, 15, 229, 45, 12, 15, 229, 44, + 12, 15, 229, 43, 12, 15, 229, 42, 12, 15, 229, 41, 12, 15, 229, 40, 12, + 15, 229, 39, 12, 15, 229, 38, 12, 15, 229, 37, 12, 15, 229, 36, 12, 15, + 229, 35, 12, 15, 229, 34, 12, 15, 229, 33, 12, 15, 229, 32, 12, 15, 229, + 31, 12, 15, 229, 30, 12, 15, 229, 29, 12, 15, 229, 28, 12, 15, 229, 27, + 12, 15, 229, 26, 12, 15, 229, 25, 12, 15, 229, 24, 12, 15, 229, 23, 12, + 15, 229, 22, 12, 15, 229, 21, 12, 15, 229, 20, 12, 15, 229, 19, 12, 15, + 229, 18, 12, 15, 229, 17, 12, 15, 229, 16, 12, 15, 229, 15, 12, 15, 229, + 14, 12, 15, 229, 13, 12, 15, 229, 12, 12, 15, 229, 11, 12, 15, 229, 10, + 12, 15, 229, 9, 12, 15, 229, 8, 12, 15, 229, 7, 12, 15, 229, 6, 12, 15, + 229, 5, 12, 15, 229, 4, 12, 15, 229, 3, 12, 15, 229, 2, 12, 15, 229, 1, + 12, 15, 229, 0, 12, 15, 228, 255, 12, 15, 228, 254, 12, 15, 228, 253, 12, + 15, 228, 252, 12, 15, 228, 251, 12, 15, 228, 250, 12, 15, 228, 249, 12, + 15, 228, 248, 12, 15, 228, 247, 12, 15, 228, 246, 12, 15, 228, 245, 12, + 15, 228, 244, 12, 15, 228, 243, 12, 15, 228, 242, 12, 15, 228, 241, 12, + 15, 228, 240, 12, 15, 228, 239, 12, 15, 228, 238, 12, 15, 228, 237, 12, + 15, 228, 236, 12, 15, 228, 235, 12, 15, 228, 234, 12, 15, 228, 233, 12, + 15, 228, 232, 12, 15, 228, 231, 12, 15, 228, 230, 12, 15, 228, 229, 12, + 15, 228, 228, 12, 15, 228, 227, 12, 15, 228, 226, 12, 15, 228, 225, 12, + 15, 228, 224, 12, 15, 228, 223, 12, 15, 228, 222, 12, 15, 228, 221, 12, + 15, 228, 220, 12, 15, 228, 219, 12, 15, 228, 218, 12, 15, 228, 217, 12, + 15, 228, 216, 12, 15, 228, 215, 12, 15, 228, 214, 12, 15, 228, 213, 12, + 15, 228, 212, 12, 15, 228, 211, 12, 15, 228, 210, 12, 15, 228, 209, 12, + 15, 228, 208, 12, 15, 228, 207, 12, 15, 228, 206, 12, 15, 228, 205, 12, + 15, 228, 204, 12, 15, 228, 203, 12, 15, 228, 202, 12, 15, 228, 201, 12, + 15, 228, 200, 12, 15, 228, 199, 12, 15, 228, 198, 12, 15, 228, 197, 12, + 15, 228, 196, 12, 15, 228, 195, 12, 15, 228, 194, 12, 15, 228, 193, 12, + 15, 228, 192, 12, 15, 228, 191, 12, 15, 228, 190, 12, 15, 228, 189, 12, + 15, 228, 188, 12, 15, 228, 187, 12, 15, 228, 186, 12, 15, 228, 185, 12, + 15, 228, 184, 12, 15, 228, 183, 12, 15, 228, 182, 12, 15, 228, 181, 12, + 15, 228, 180, 12, 15, 228, 179, 12, 15, 228, 178, 12, 15, 228, 177, 12, + 15, 228, 176, 12, 15, 228, 175, 12, 15, 228, 174, 12, 15, 228, 173, 12, + 15, 228, 172, 12, 15, 228, 171, 12, 15, 228, 170, 12, 15, 228, 169, 12, + 15, 228, 168, 12, 15, 228, 167, 12, 15, 228, 166, 12, 15, 228, 165, 12, + 15, 228, 164, 12, 15, 228, 163, 12, 15, 228, 162, 12, 15, 228, 161, 12, + 15, 228, 160, 222, 233, 203, 143, 184, 205, 148, 184, 236, 89, 78, 184, + 211, 61, 78, 184, 31, 55, 184, 239, 9, 55, 184, 213, 44, 55, 184, 251, + 110, 184, 251, 29, 184, 50, 213, 139, 184, 53, 213, 139, 184, 250, 178, + 184, 98, 55, 184, 244, 158, 184, 231, 5, 184, 234, 216, 204, 226, 184, + 205, 177, 184, 17, 195, 79, 184, 17, 100, 184, 17, 102, 184, 17, 134, + 184, 17, 136, 184, 17, 146, 184, 17, 167, 184, 17, 178, 184, 17, 171, + 184, 17, 182, 184, 244, 167, 184, 207, 105, 184, 222, 139, 55, 184, 236, + 171, 55, 184, 233, 93, 55, 184, 211, 78, 78, 184, 244, 156, 250, 167, + 184, 8, 6, 1, 63, 184, 8, 6, 1, 250, 111, 184, 8, 6, 1, 247, 206, 184, 8, + 6, 1, 240, 230, 184, 8, 6, 1, 69, 184, 8, 6, 1, 236, 48, 184, 8, 6, 1, + 234, 189, 184, 8, 6, 1, 233, 14, 184, 8, 6, 1, 68, 184, 8, 6, 1, 225, + 216, 184, 8, 6, 1, 225, 79, 184, 8, 6, 1, 159, 184, 8, 6, 1, 221, 135, + 184, 8, 6, 1, 218, 54, 184, 8, 6, 1, 72, 184, 8, 6, 1, 214, 2, 184, 8, 6, + 1, 211, 166, 184, 8, 6, 1, 144, 184, 8, 6, 1, 209, 80, 184, 8, 6, 1, 203, + 216, 184, 8, 6, 1, 66, 184, 8, 6, 1, 199, 230, 184, 8, 6, 1, 197, 199, + 184, 8, 6, 1, 196, 222, 184, 8, 6, 1, 196, 148, 184, 8, 6, 1, 195, 158, + 184, 50, 47, 179, 184, 210, 90, 205, 177, 184, 53, 47, 179, 184, 244, + 240, 252, 21, 184, 126, 222, 74, 184, 233, 100, 252, 21, 184, 8, 4, 1, + 63, 184, 8, 4, 1, 250, 111, 184, 8, 4, 1, 247, 206, 184, 8, 4, 1, 240, + 230, 184, 8, 4, 1, 69, 184, 8, 4, 1, 236, 48, 184, 8, 4, 1, 234, 189, + 184, 8, 4, 1, 233, 14, 184, 8, 4, 1, 68, 184, 8, 4, 1, 225, 216, 184, 8, + 4, 1, 225, 79, 184, 8, 4, 1, 159, 184, 8, 4, 1, 221, 135, 184, 8, 4, 1, + 218, 54, 184, 8, 4, 1, 72, 184, 8, 4, 1, 214, 2, 184, 8, 4, 1, 211, 166, + 184, 8, 4, 1, 144, 184, 8, 4, 1, 209, 80, 184, 8, 4, 1, 203, 216, 184, 8, + 4, 1, 66, 184, 8, 4, 1, 199, 230, 184, 8, 4, 1, 197, 199, 184, 8, 4, 1, + 196, 222, 184, 8, 4, 1, 196, 148, 184, 8, 4, 1, 195, 158, 184, 50, 241, + 17, 179, 184, 83, 222, 74, 184, 53, 241, 17, 179, 184, 202, 84, 247, 140, + 203, 143, 62, 208, 35, 62, 208, 24, 62, 208, 13, 62, 208, 1, 62, 207, + 246, 62, 207, 235, 62, 207, 224, 62, 207, 213, 62, 207, 202, 62, 207, + 194, 62, 207, 193, 62, 207, 192, 62, 207, 191, 62, 207, 189, 62, 207, + 188, 62, 207, 187, 62, 207, 186, 62, 207, 185, 62, 207, 184, 62, 207, + 183, 62, 207, 182, 62, 207, 181, 62, 207, 180, 62, 207, 178, 62, 207, + 177, 62, 207, 176, 62, 207, 175, 62, 207, 174, 62, 207, 173, 62, 207, + 172, 62, 207, 171, 62, 207, 170, 62, 207, 169, 62, 207, 167, 62, 207, + 166, 62, 207, 165, 62, 207, 164, 62, 207, 163, 62, 207, 162, 62, 207, + 161, 62, 207, 160, 62, 207, 159, 62, 207, 158, 62, 207, 156, 62, 207, + 155, 62, 207, 154, 62, 207, 153, 62, 207, 152, 62, 207, 151, 62, 207, + 150, 62, 207, 149, 62, 207, 148, 62, 207, 147, 62, 207, 145, 62, 207, + 144, 62, 207, 143, 62, 207, 142, 62, 207, 141, 62, 207, 140, 62, 207, + 139, 62, 207, 138, 62, 207, 137, 62, 207, 136, 62, 207, 134, 62, 207, + 133, 62, 207, 132, 62, 207, 131, 62, 207, 130, 62, 207, 129, 62, 207, + 128, 62, 207, 127, 62, 207, 126, 62, 207, 125, 62, 207, 123, 62, 207, + 122, 62, 207, 121, 62, 207, 120, 62, 207, 119, 62, 207, 118, 62, 207, + 117, 62, 207, 116, 62, 207, 115, 62, 207, 114, 62, 208, 111, 62, 208, + 110, 62, 208, 109, 62, 208, 108, 62, 208, 107, 62, 208, 106, 62, 208, + 105, 62, 208, 104, 62, 208, 103, 62, 208, 102, 62, 208, 100, 62, 208, 99, + 62, 208, 98, 62, 208, 97, 62, 208, 96, 62, 208, 95, 62, 208, 94, 62, 208, + 93, 62, 208, 92, 62, 208, 91, 62, 208, 89, 62, 208, 88, 62, 208, 87, 62, + 208, 86, 62, 208, 85, 62, 208, 84, 62, 208, 83, 62, 208, 82, 62, 208, 81, + 62, 208, 80, 62, 208, 78, 62, 208, 77, 62, 208, 76, 62, 208, 75, 62, 208, + 74, 62, 208, 73, 62, 208, 72, 62, 208, 71, 62, 208, 70, 62, 208, 69, 62, + 208, 67, 62, 208, 66, 62, 208, 65, 62, 208, 64, 62, 208, 63, 62, 208, 62, + 62, 208, 61, 62, 208, 60, 62, 208, 59, 62, 208, 58, 62, 208, 56, 62, 208, + 55, 62, 208, 54, 62, 208, 53, 62, 208, 52, 62, 208, 51, 62, 208, 50, 62, + 208, 49, 62, 208, 48, 62, 208, 47, 62, 208, 45, 62, 208, 44, 62, 208, 43, + 62, 208, 42, 62, 208, 41, 62, 208, 40, 62, 208, 39, 62, 208, 38, 62, 208, + 37, 62, 208, 36, 62, 208, 34, 62, 208, 33, 62, 208, 32, 62, 208, 31, 62, + 208, 30, 62, 208, 29, 62, 208, 28, 62, 208, 27, 62, 208, 26, 62, 208, 25, + 62, 208, 23, 62, 208, 22, 62, 208, 21, 62, 208, 20, 62, 208, 19, 62, 208, + 18, 62, 208, 17, 62, 208, 16, 62, 208, 15, 62, 208, 14, 62, 208, 12, 62, + 208, 11, 62, 208, 10, 62, 208, 9, 62, 208, 8, 62, 208, 7, 62, 208, 6, 62, + 208, 5, 62, 208, 4, 62, 208, 3, 62, 208, 0, 62, 207, 255, 62, 207, 254, + 62, 207, 253, 62, 207, 252, 62, 207, 251, 62, 207, 250, 62, 207, 249, 62, + 207, 248, 62, 207, 247, 62, 207, 245, 62, 207, 244, 62, 207, 243, 62, + 207, 242, 62, 207, 241, 62, 207, 240, 62, 207, 239, 62, 207, 238, 62, + 207, 237, 62, 207, 236, 62, 207, 234, 62, 207, 233, 62, 207, 232, 62, + 207, 231, 62, 207, 230, 62, 207, 229, 62, 207, 228, 62, 207, 227, 62, + 207, 226, 62, 207, 225, 62, 207, 223, 62, 207, 222, 62, 207, 221, 62, + 207, 220, 62, 207, 219, 62, 207, 218, 62, 207, 217, 62, 207, 216, 62, + 207, 215, 62, 207, 214, 62, 207, 212, 62, 207, 211, 62, 207, 210, 62, + 207, 209, 62, 207, 208, 62, 207, 207, 62, 207, 206, 62, 207, 205, 62, + 207, 204, 62, 207, 203, 62, 207, 201, 62, 207, 200, 62, 207, 199, 62, + 207, 198, 62, 207, 197, 62, 207, 196, 62, 207, 195, 215, 145, 215, 147, + 205, 3, 77, 232, 133, 205, 181, 205, 3, 77, 202, 237, 204, 174, 236, 221, + 77, 202, 237, 236, 117, 236, 221, 77, 201, 202, 236, 183, 236, 207, 236, + 208, 252, 13, 252, 14, 251, 160, 248, 231, 249, 131, 248, 26, 190, 203, + 149, 231, 154, 203, 149, 231, 79, 203, 154, 222, 75, 235, 179, 217, 82, + 222, 74, 236, 221, 77, 222, 74, 222, 123, 216, 111, 236, 186, 222, 75, + 203, 149, 83, 203, 149, 197, 222, 235, 23, 235, 179, 235, 156, 247, 101, + 210, 93, 241, 79, 206, 219, 214, 33, 221, 252, 100, 205, 200, 206, 219, + 226, 85, 221, 252, 195, 79, 206, 112, 240, 59, 222, 65, 236, 142, 239, + 38, 239, 182, 241, 120, 100, 240, 48, 239, 182, 241, 120, 102, 240, 47, + 239, 182, 241, 120, 134, 240, 46, 239, 182, 241, 120, 136, 240, 45, 217, + 103, 252, 13, 217, 226, 203, 242, 226, 148, 203, 246, 236, 221, 77, 201, + 203, 248, 125, 236, 124, 247, 139, 247, 141, 236, 221, 77, 219, 188, 236, + 184, 204, 139, 204, 157, 236, 142, 236, 143, 226, 60, 207, 91, 136, 235, + 137, 207, 90, 234, 226, 226, 60, 207, 91, 134, 233, 83, 207, 90, 233, 80, + 226, 60, 207, 91, 102, 210, 168, 207, 90, 209, 146, 226, 60, 207, 91, + 100, 200, 50, 207, 90, 200, 4, 205, 151, 239, 221, 239, 223, 213, 230, + 246, 254, 213, 232, 130, 214, 170, 212, 23, 231, 157, 248, 51, 213, 34, + 232, 94, 248, 65, 216, 50, 248, 51, 232, 94, 217, 187, 226, 71, 226, 73, + 217, 75, 222, 74, 217, 101, 205, 3, 77, 208, 116, 250, 244, 205, 80, 236, + 221, 77, 208, 116, 250, 244, 236, 145, 190, 203, 150, 207, 76, 231, 154, + 203, 150, 207, 76, 231, 76, 190, 203, 150, 3, 225, 91, 231, 154, 203, + 150, 3, 225, 91, 231, 77, 222, 75, 203, 150, 207, 76, 83, 203, 150, 207, + 76, 197, 221, 213, 131, 222, 75, 235, 10, 213, 131, 222, 75, 237, 234, + 212, 136, 213, 131, 222, 75, 249, 130, 213, 131, 222, 75, 200, 36, 212, + 130, 210, 90, 222, 75, 235, 179, 210, 90, 226, 71, 210, 72, 206, 62, 206, + 219, 102, 206, 59, 205, 82, 206, 62, 206, 219, 134, 206, 58, 205, 81, + 239, 182, 241, 120, 204, 198, 240, 43, 212, 8, 200, 3, 100, 212, 8, 200, + 1, 211, 225, 212, 8, 200, 3, 102, 212, 8, 200, 0, 211, 224, 207, 77, 201, + 201, 205, 0, 204, 181, 247, 140, 246, 254, 247, 75, 219, 146, 197, 152, + 218, 72, 205, 3, 77, 233, 68, 250, 244, 205, 3, 77, 211, 243, 250, 244, + 205, 150, 236, 221, 77, 233, 68, 250, 244, 236, 221, 77, 211, 243, 250, + 244, 236, 181, 205, 3, 77, 204, 198, 205, 166, 206, 62, 233, 105, 190, + 226, 19, 207, 55, 206, 62, 190, 226, 19, 208, 162, 241, 120, 207, 87, + 226, 19, 241, 41, 204, 199, 203, 8, 205, 23, 214, 83, 203, 231, 244, 157, + 214, 50, 212, 9, 219, 145, 212, 119, 251, 25, 212, 2, 244, 157, 251, 42, + 217, 175, 206, 121, 8, 6, 1, 233, 229, 8, 4, 1, 233, 229, 247, 18, 251, + 139, 203, 236, 204, 145, 244, 168, 206, 4, 222, 183, 225, 10, 1, 222, 25, + 222, 231, 1, 235, 51, 235, 42, 222, 231, 1, 235, 51, 235, 191, 222, 231, + 1, 209, 232, 222, 231, 1, 222, 6, 82, 117, 248, 137, 206, 192, 233, 192, + 219, 95, 210, 80, 29, 116, 196, 43, 29, 116, 196, 39, 29, 116, 205, 58, + 29, 116, 196, 44, 234, 203, 234, 202, 234, 201, 218, 74, 194, 236, 194, + 237, 194, 239, 221, 194, 209, 240, 221, 196, 209, 242, 213, 94, 221, 193, + 209, 239, 216, 81, 218, 254, 197, 36, 221, 195, 209, 241, 234, 225, 213, + 93, 197, 95, 236, 245, 234, 213, 219, 69, 214, 119, 200, 5, 105, 219, 69, + 240, 65, 105, 107, 201, 179, 61, 3, 52, 83, 106, 91, 201, 179, 61, 3, 52, + 83, 106, 11, 5, 225, 231, 78, 198, 222, 198, 111, 198, 43, 198, 32, 198, + 21, 198, 10, 197, 255, 197, 244, 197, 233, 198, 221, 198, 210, 198, 199, + 198, 188, 198, 177, 198, 166, 198, 155, 212, 24, 235, 23, 36, 83, 53, 59, + 222, 146, 179, 247, 211, 214, 67, 78, 248, 105, 194, 238, 10, 2, 215, + 155, 203, 12, 10, 2, 215, 155, 127, 215, 155, 247, 244, 127, 247, 243, + 219, 194, 6, 1, 233, 14, 219, 194, 6, 1, 217, 72, 219, 194, 4, 1, 233, + 14, 219, 194, 4, 1, 217, 72, 56, 1, 237, 134, 67, 34, 16, 234, 224, 206, + 0, 245, 33, 199, 128, 198, 144, 198, 133, 198, 122, 198, 110, 198, 99, + 198, 88, 198, 77, 198, 66, 198, 55, 198, 47, 198, 46, 198, 45, 198, 44, + 198, 42, 198, 41, 198, 40, 198, 39, 198, 38, 198, 37, 198, 36, 198, 35, + 198, 34, 198, 33, 198, 31, 198, 30, 198, 29, 198, 28, 198, 27, 198, 26, + 198, 25, 198, 24, 198, 23, 198, 22, 198, 20, 198, 19, 198, 18, 198, 17, + 198, 16, 198, 15, 198, 14, 198, 13, 198, 12, 198, 11, 198, 9, 198, 8, + 198, 7, 198, 6, 198, 5, 198, 4, 198, 3, 198, 2, 198, 1, 198, 0, 197, 254, + 197, 253, 197, 252, 197, 251, 197, 250, 197, 249, 197, 248, 197, 247, + 197, 246, 197, 245, 197, 243, 197, 242, 197, 241, 197, 240, 197, 239, + 197, 238, 197, 237, 197, 236, 197, 235, 197, 234, 197, 232, 197, 231, + 197, 230, 197, 229, 197, 228, 197, 227, 197, 226, 197, 225, 197, 224, + 197, 223, 198, 220, 198, 219, 198, 218, 198, 217, 198, 216, 198, 215, + 198, 214, 198, 213, 198, 212, 198, 211, 198, 209, 198, 208, 198, 207, + 198, 206, 198, 205, 198, 204, 198, 203, 198, 202, 198, 201, 198, 200, + 198, 198, 198, 197, 198, 196, 198, 195, 198, 194, 198, 193, 198, 192, + 198, 191, 198, 190, 198, 189, 198, 187, 198, 186, 198, 185, 198, 184, + 198, 183, 198, 182, 198, 181, 198, 180, 198, 179, 198, 178, 198, 176, + 198, 175, 198, 174, 198, 173, 198, 172, 198, 171, 198, 170, 198, 169, + 198, 168, 198, 167, 198, 165, 198, 164, 198, 163, 198, 162, 198, 161, + 198, 160, 198, 159, 198, 158, 198, 157, 198, 156, 198, 154, 198, 153, + 198, 152, 198, 151, 198, 150, 198, 149, 198, 148, 198, 147, 198, 146, + 198, 145, 198, 143, 198, 142, 198, 141, 198, 140, 198, 139, 198, 138, + 198, 137, 198, 136, 198, 135, 198, 134, 198, 132, 198, 131, 198, 130, + 198, 129, 198, 128, 198, 127, 198, 126, 198, 125, 198, 124, 198, 123, + 198, 121, 198, 120, 198, 119, 198, 118, 198, 117, 198, 116, 198, 115, + 198, 114, 198, 113, 198, 112, 198, 109, 198, 108, 198, 107, 198, 106, + 198, 105, 198, 104, 198, 103, 198, 102, 198, 101, 198, 100, 198, 98, 198, + 97, 198, 96, 198, 95, 198, 94, 198, 93, 198, 92, 198, 91, 198, 90, 198, + 89, 198, 87, 198, 86, 198, 85, 198, 84, 198, 83, 198, 82, 198, 81, 198, + 80, 198, 79, 198, 78, 198, 76, 198, 75, 198, 74, 198, 73, 198, 72, 198, + 71, 198, 70, 198, 69, 198, 68, 198, 67, 198, 65, 198, 64, 198, 63, 198, + 62, 198, 61, 198, 60, 198, 59, 198, 58, 198, 57, 198, 56, 198, 54, 198, + 53, 198, 52, 198, 51, 198, 50, 198, 49, 198, 48, 224, 149, 31, 55, 224, + 149, 250, 178, 224, 149, 17, 195, 79, 224, 149, 17, 100, 224, 149, 17, + 102, 224, 149, 17, 134, 224, 149, 17, 136, 224, 149, 17, 146, 224, 149, + 17, 167, 224, 149, 17, 178, 224, 149, 17, 171, 224, 149, 17, 182, 8, 6, + 1, 39, 3, 220, 114, 26, 233, 99, 8, 4, 1, 39, 3, 220, 114, 26, 233, 99, + 8, 6, 1, 237, 135, 3, 83, 222, 75, 60, 8, 4, 1, 237, 135, 3, 83, 222, 75, + 60, 8, 6, 1, 237, 135, 3, 83, 222, 75, 248, 226, 26, 233, 99, 8, 4, 1, + 237, 135, 3, 83, 222, 75, 248, 226, 26, 233, 99, 8, 6, 1, 237, 135, 3, + 83, 222, 75, 248, 226, 26, 186, 8, 4, 1, 237, 135, 3, 83, 222, 75, 248, + 226, 26, 186, 8, 6, 1, 237, 135, 3, 244, 240, 26, 220, 113, 8, 4, 1, 237, + 135, 3, 244, 240, 26, 220, 113, 8, 6, 1, 237, 135, 3, 244, 240, 26, 247, + 105, 8, 4, 1, 237, 135, 3, 244, 240, 26, 247, 105, 8, 6, 1, 230, 248, 3, + 220, 114, 26, 233, 99, 8, 4, 1, 230, 248, 3, 220, 114, 26, 233, 99, 8, 4, + 1, 230, 248, 3, 76, 90, 26, 186, 8, 4, 1, 217, 73, 3, 202, 85, 57, 8, 6, + 1, 177, 3, 83, 222, 75, 60, 8, 4, 1, 177, 3, 83, 222, 75, 60, 8, 6, 1, + 177, 3, 83, 222, 75, 248, 226, 26, 233, 99, 8, 4, 1, 177, 3, 83, 222, 75, + 248, 226, 26, 233, 99, 8, 6, 1, 177, 3, 83, 222, 75, 248, 226, 26, 186, + 8, 4, 1, 177, 3, 83, 222, 75, 248, 226, 26, 186, 8, 6, 1, 209, 81, 3, 83, + 222, 75, 60, 8, 4, 1, 209, 81, 3, 83, 222, 75, 60, 8, 6, 1, 118, 3, 220, + 114, 26, 233, 99, 8, 4, 1, 118, 3, 220, 114, 26, 233, 99, 8, 6, 1, 39, 3, + 214, 151, 26, 186, 8, 4, 1, 39, 3, 214, 151, 26, 186, 8, 6, 1, 39, 3, + 214, 151, 26, 202, 84, 8, 4, 1, 39, 3, 214, 151, 26, 202, 84, 8, 6, 1, + 237, 135, 3, 214, 151, 26, 186, 8, 4, 1, 237, 135, 3, 214, 151, 26, 186, + 8, 6, 1, 237, 135, 3, 214, 151, 26, 202, 84, 8, 4, 1, 237, 135, 3, 214, + 151, 26, 202, 84, 8, 6, 1, 237, 135, 3, 76, 90, 26, 186, 8, 4, 1, 237, + 135, 3, 76, 90, 26, 186, 8, 6, 1, 237, 135, 3, 76, 90, 26, 202, 84, 8, 4, + 1, 237, 135, 3, 76, 90, 26, 202, 84, 8, 4, 1, 230, 248, 3, 76, 90, 26, + 233, 99, 8, 4, 1, 230, 248, 3, 76, 90, 26, 202, 84, 8, 6, 1, 230, 248, 3, + 214, 151, 26, 186, 8, 4, 1, 230, 248, 3, 214, 151, 26, 76, 90, 26, 186, + 8, 6, 1, 230, 248, 3, 214, 151, 26, 202, 84, 8, 4, 1, 230, 248, 3, 214, + 151, 26, 76, 90, 26, 202, 84, 8, 6, 1, 225, 217, 3, 202, 84, 8, 4, 1, + 225, 217, 3, 76, 90, 26, 202, 84, 8, 6, 1, 223, 99, 3, 202, 84, 8, 4, 1, + 223, 99, 3, 202, 84, 8, 6, 1, 221, 136, 3, 202, 84, 8, 4, 1, 221, 136, 3, + 202, 84, 8, 6, 1, 211, 31, 3, 202, 84, 8, 4, 1, 211, 31, 3, 202, 84, 8, + 6, 1, 118, 3, 214, 151, 26, 186, 8, 4, 1, 118, 3, 214, 151, 26, 186, 8, + 6, 1, 118, 3, 214, 151, 26, 202, 84, 8, 4, 1, 118, 3, 214, 151, 26, 202, + 84, 8, 6, 1, 118, 3, 220, 114, 26, 186, 8, 4, 1, 118, 3, 220, 114, 26, + 186, 8, 6, 1, 118, 3, 220, 114, 26, 202, 84, 8, 4, 1, 118, 3, 220, 114, + 26, 202, 84, 8, 4, 1, 251, 245, 3, 233, 99, 8, 4, 1, 192, 177, 3, 233, + 99, 8, 4, 1, 192, 177, 3, 186, 8, 4, 1, 163, 199, 231, 3, 233, 99, 8, 4, + 1, 163, 199, 231, 3, 186, 8, 4, 1, 208, 164, 3, 233, 99, 8, 4, 1, 208, + 164, 3, 186, 8, 4, 1, 231, 163, 208, 164, 3, 233, 99, 8, 4, 1, 231, 163, + 208, 164, 3, 186, 9, 207, 87, 93, 3, 232, 213, 90, 3, 251, 163, 9, 207, + 87, 93, 3, 232, 213, 90, 3, 197, 117, 9, 207, 87, 93, 3, 232, 213, 90, 3, + 151, 220, 68, 9, 207, 87, 93, 3, 232, 213, 90, 3, 214, 163, 9, 207, 87, + 93, 3, 232, 213, 90, 3, 66, 9, 207, 87, 93, 3, 232, 213, 90, 3, 195, 217, + 9, 207, 87, 93, 3, 232, 213, 90, 3, 69, 9, 207, 87, 93, 3, 232, 213, 90, + 3, 251, 244, 9, 207, 87, 216, 31, 3, 224, 190, 248, 218, 1, 224, 120, 42, + 108, 225, 79, 42, 108, 217, 72, 42, 108, 247, 206, 42, 108, 215, 110, 42, + 108, 201, 81, 42, 108, 216, 86, 42, 108, 203, 216, 42, 108, 218, 54, 42, + 108, 214, 2, 42, 108, 221, 135, 42, 108, 196, 148, 42, 108, 144, 42, 108, + 159, 42, 108, 199, 230, 42, 108, 222, 26, 42, 108, 222, 37, 42, 108, 209, + 182, 42, 108, 216, 68, 42, 108, 225, 216, 42, 108, 207, 52, 42, 108, 205, + 83, 42, 108, 209, 80, 42, 108, 233, 14, 42, 108, 223, 201, 42, 5, 225, + 54, 42, 5, 224, 100, 42, 5, 224, 79, 42, 5, 223, 186, 42, 5, 223, 143, + 42, 5, 224, 208, 42, 5, 224, 199, 42, 5, 225, 30, 42, 5, 224, 10, 42, 5, + 223, 241, 42, 5, 224, 227, 42, 5, 217, 69, 42, 5, 217, 18, 42, 5, 217, + 14, 42, 5, 216, 239, 42, 5, 216, 230, 42, 5, 217, 57, 42, 5, 217, 55, 42, + 5, 217, 66, 42, 5, 216, 251, 42, 5, 216, 246, 42, 5, 217, 59, 42, 5, 247, + 172, 42, 5, 245, 10, 42, 5, 245, 0, 42, 5, 241, 40, 42, 5, 240, 255, 42, + 5, 247, 56, 42, 5, 247, 48, 42, 5, 247, 161, 42, 5, 244, 181, 42, 5, 241, + 116, 42, 5, 247, 89, 42, 5, 215, 107, 42, 5, 215, 88, 42, 5, 215, 82, 42, + 5, 215, 65, 42, 5, 215, 57, 42, 5, 215, 97, 42, 5, 215, 96, 42, 5, 215, + 104, 42, 5, 215, 72, 42, 5, 215, 69, 42, 5, 215, 100, 42, 5, 201, 77, 42, + 5, 201, 57, 42, 5, 201, 56, 42, 5, 201, 45, 42, 5, 201, 42, 42, 5, 201, + 73, 42, 5, 201, 72, 42, 5, 201, 76, 42, 5, 201, 55, 42, 5, 201, 54, 42, + 5, 201, 75, 42, 5, 216, 84, 42, 5, 216, 70, 42, 5, 216, 69, 42, 5, 216, + 53, 42, 5, 216, 52, 42, 5, 216, 80, 42, 5, 216, 79, 42, 5, 216, 83, 42, + 5, 216, 55, 42, 5, 216, 54, 42, 5, 216, 82, 42, 5, 203, 162, 42, 5, 202, + 122, 42, 5, 202, 99, 42, 5, 201, 40, 42, 5, 200, 251, 42, 5, 203, 68, 42, + 5, 203, 48, 42, 5, 203, 137, 42, 5, 149, 42, 5, 201, 247, 42, 5, 203, 89, + 42, 5, 217, 243, 42, 5, 216, 222, 42, 5, 216, 189, 42, 5, 215, 185, 42, + 5, 215, 122, 42, 5, 217, 117, 42, 5, 217, 106, 42, 5, 217, 229, 42, 5, + 216, 49, 42, 5, 216, 32, 42, 5, 217, 201, 42, 5, 213, 242, 42, 5, 212, + 219, 42, 5, 212, 181, 42, 5, 211, 226, 42, 5, 211, 190, 42, 5, 213, 91, + 42, 5, 213, 78, 42, 5, 213, 220, 42, 5, 212, 116, 42, 5, 212, 90, 42, 5, + 213, 107, 42, 5, 220, 118, 42, 5, 219, 77, 42, 5, 219, 39, 42, 5, 218, + 144, 42, 5, 218, 84, 42, 5, 219, 206, 42, 5, 219, 187, 42, 5, 220, 80, + 42, 5, 218, 250, 42, 5, 218, 194, 42, 5, 219, 254, 42, 5, 196, 129, 42, + 5, 196, 24, 42, 5, 196, 14, 42, 5, 195, 217, 42, 5, 195, 180, 42, 5, 196, + 69, 42, 5, 196, 66, 42, 5, 196, 108, 42, 5, 196, 3, 42, 5, 195, 237, 42, + 5, 196, 80, 42, 5, 210, 243, 42, 5, 210, 72, 42, 5, 210, 9, 42, 5, 209, + 140, 42, 5, 209, 101, 42, 5, 210, 182, 42, 5, 210, 154, 42, 5, 210, 223, + 42, 5, 209, 232, 42, 5, 209, 206, 42, 5, 210, 192, 42, 5, 223, 81, 42, 5, + 222, 108, 42, 5, 222, 90, 42, 5, 221, 190, 42, 5, 221, 161, 42, 5, 222, + 196, 42, 5, 222, 187, 42, 5, 223, 53, 42, 5, 222, 6, 42, 5, 221, 228, 42, + 5, 222, 214, 42, 5, 199, 151, 42, 5, 199, 34, 42, 5, 199, 18, 42, 5, 197, + 220, 42, 5, 197, 212, 42, 5, 199, 118, 42, 5, 199, 113, 42, 5, 199, 147, + 42, 5, 198, 248, 42, 5, 198, 233, 42, 5, 199, 124, 42, 5, 222, 24, 42, 5, + 222, 19, 42, 5, 222, 18, 42, 5, 222, 15, 42, 5, 222, 14, 42, 5, 222, 21, + 42, 5, 222, 20, 42, 5, 222, 23, 42, 5, 222, 17, 42, 5, 222, 16, 42, 5, + 222, 22, 42, 5, 222, 35, 42, 5, 222, 28, 42, 5, 222, 27, 42, 5, 222, 11, + 42, 5, 222, 10, 42, 5, 222, 31, 42, 5, 222, 30, 42, 5, 222, 34, 42, 5, + 222, 13, 42, 5, 222, 12, 42, 5, 222, 32, 42, 5, 209, 180, 42, 5, 209, + 169, 42, 5, 209, 168, 42, 5, 209, 161, 42, 5, 209, 154, 42, 5, 209, 176, + 42, 5, 209, 175, 42, 5, 209, 179, 42, 5, 209, 167, 42, 5, 209, 166, 42, + 5, 209, 178, 42, 5, 216, 66, 42, 5, 216, 61, 42, 5, 216, 60, 42, 5, 216, + 57, 42, 5, 216, 56, 42, 5, 216, 63, 42, 5, 216, 62, 42, 5, 216, 65, 42, + 5, 216, 59, 42, 5, 216, 58, 42, 5, 216, 64, 42, 5, 225, 212, 42, 5, 225, + 171, 42, 5, 225, 163, 42, 5, 225, 109, 42, 5, 225, 89, 42, 5, 225, 192, + 42, 5, 225, 190, 42, 5, 225, 206, 42, 5, 225, 128, 42, 5, 225, 118, 42, + 5, 225, 199, 42, 5, 207, 45, 42, 5, 206, 223, 42, 5, 206, 218, 42, 5, + 206, 151, 42, 5, 206, 133, 42, 5, 206, 255, 42, 5, 206, 253, 42, 5, 207, + 34, 42, 5, 206, 198, 42, 5, 206, 190, 42, 5, 207, 8, 42, 5, 205, 79, 42, + 5, 205, 47, 42, 5, 205, 43, 42, 5, 205, 34, 42, 5, 205, 31, 42, 5, 205, + 53, 42, 5, 205, 52, 42, 5, 205, 78, 42, 5, 205, 39, 42, 5, 205, 38, 42, + 5, 205, 55, 42, 5, 209, 13, 42, 5, 206, 112, 42, 5, 206, 84, 42, 5, 204, + 172, 42, 5, 204, 74, 42, 5, 208, 147, 42, 5, 208, 129, 42, 5, 208, 253, + 42, 5, 205, 200, 42, 5, 205, 171, 42, 5, 208, 191, 42, 5, 232, 245, 42, + 5, 232, 70, 42, 5, 232, 42, 42, 5, 231, 74, 42, 5, 231, 45, 42, 5, 232, + 146, 42, 5, 232, 117, 42, 5, 232, 234, 42, 5, 231, 192, 42, 5, 231, 165, + 42, 5, 232, 157, 42, 5, 223, 200, 42, 5, 223, 199, 42, 5, 223, 194, 42, + 5, 223, 193, 42, 5, 223, 190, 42, 5, 223, 189, 42, 5, 223, 196, 42, 5, + 223, 195, 42, 5, 223, 198, 42, 5, 223, 192, 42, 5, 223, 191, 42, 5, 223, + 197, 42, 5, 206, 158, 153, 108, 2, 196, 94, 153, 108, 2, 210, 211, 153, + 108, 2, 210, 121, 94, 1, 200, 170, 89, 108, 2, 244, 174, 155, 89, 108, 2, + 244, 174, 224, 145, 89, 108, 2, 244, 174, 224, 10, 89, 108, 2, 244, 174, + 224, 116, 89, 108, 2, 244, 174, 216, 251, 89, 108, 2, 244, 174, 247, 173, + 89, 108, 2, 244, 174, 247, 15, 89, 108, 2, 244, 174, 244, 181, 89, 108, + 2, 244, 174, 245, 48, 89, 108, 2, 244, 174, 215, 72, 89, 108, 2, 244, + 174, 240, 135, 89, 108, 2, 244, 174, 201, 66, 89, 108, 2, 244, 174, 239, + 27, 89, 108, 2, 244, 174, 201, 61, 89, 108, 2, 244, 174, 176, 89, 108, 2, + 244, 174, 189, 89, 108, 2, 244, 174, 202, 233, 89, 108, 2, 244, 174, 149, + 89, 108, 2, 244, 174, 202, 169, 89, 108, 2, 244, 174, 216, 49, 89, 108, + 2, 244, 174, 249, 144, 89, 108, 2, 244, 174, 213, 5, 89, 108, 2, 244, + 174, 212, 116, 89, 108, 2, 244, 174, 212, 233, 89, 108, 2, 244, 174, 218, + 250, 89, 108, 2, 244, 174, 196, 3, 89, 108, 2, 244, 174, 209, 232, 89, + 108, 2, 244, 174, 222, 6, 89, 108, 2, 244, 174, 198, 248, 89, 108, 2, + 244, 174, 207, 50, 89, 108, 2, 244, 174, 205, 80, 89, 108, 2, 244, 174, + 183, 89, 108, 2, 244, 174, 142, 89, 108, 2, 244, 174, 172, 89, 18, 2, + 244, 174, 211, 158, 89, 226, 72, 18, 2, 244, 174, 211, 96, 89, 226, 72, + 18, 2, 244, 174, 209, 89, 89, 226, 72, 18, 2, 244, 174, 209, 82, 89, 226, + 72, 18, 2, 244, 174, 211, 138, 89, 18, 2, 214, 126, 89, 18, 2, 252, 128, + 188, 1, 248, 176, 217, 70, 188, 1, 248, 176, 217, 18, 188, 1, 248, 176, + 216, 239, 188, 1, 248, 176, 217, 57, 188, 1, 248, 176, 216, 251, 71, 1, + 248, 176, 217, 70, 71, 1, 248, 176, 217, 18, 71, 1, 248, 176, 216, 239, + 71, 1, 248, 176, 217, 57, 71, 1, 248, 176, 216, 251, 71, 1, 251, 191, + 247, 56, 71, 1, 251, 191, 201, 40, 71, 1, 251, 191, 149, 71, 1, 251, 191, + 214, 2, 73, 1, 236, 73, 236, 72, 241, 124, 152, 154, 73, 1, 236, 72, 236, + 73, 241, 124, 152, 154, }; -static unsigned char phrasebook_offset1[] = { +static unsigned short phrasebook_offset1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 53, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 66, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 52, 99, 52, 100, 101, 102, 52, 103, 104, - 105, 106, 107, 108, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 109, 110, - 111, 112, 113, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 114, 115, 116, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 117, 118, 119, 120, 52, 52, 121, 122, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 123, - 124, 125, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 126, 127, 128, 52, 52, 52, 52, 52, 52, 52, 52, 52, 129, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 52, 52, 52, 52, - 52, 141, 52, 52, 52, 52, 52, 52, 52, 142, 143, 52, 52, 144, 52, 145, 52, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 157, 158, - 159, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 160, 161, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 162, 163, 164, 165, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 105, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 130, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 104, 149, 150, 151, 152, 153, 154, 104, 155, 156, 157, 104, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 104, 169, 104, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 104, 179, 180, 104, 181, 182, + 183, 184, 104, 185, 186, 104, 187, 188, 189, 104, 104, 190, 191, 192, + 193, 104, 194, 104, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 216, 217, 218, 219, 220, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 221, 222, 223, 224, 225, + 226, 227, 228, 104, 104, 104, 104, 229, 230, 231, 232, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 233, 234, 235, 236, 237, 238, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 239, + 240, 241, 242, 243, 244, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 245, 246, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 247, 248, 249, 250, 251, 252, 253, + 104, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 268, 104, 269, + 104, 104, 270, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 271, + 272, 273, 104, 104, 104, 104, 104, 274, 275, 276, 104, 277, 278, 104, + 104, 279, 280, 281, 282, 283, 104, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 300, 301, 302, + 303, 304, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 305, 104, 306, 307, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 308, 309, 310, + 311, 312, 313, 314, 315, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, }; static unsigned int phrasebook_offset2[] = { @@ -19028,1220 +19707,1221 @@ static unsigned int phrasebook_offset2[] = { 339, 344, 349, 353, 356, 360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 366, 371, 374, 377, 380, 383, 386, 389, 391, 394, 400, 408, 411, 415, 418, 420, - 423, 426, 429, 432, 436, 439, 442, 445, 447, 450, 456, 464, 471, 478, - 485, 490, 497, 503, 510, 517, 524, 532, 537, 545, 553, 560, 568, 576, - 584, 591, 599, 607, 612, 620, 627, 633, 640, 647, 654, 657, 663, 670, - 676, 683, 690, 697, 702, 709, 716, 722, 729, 736, 743, 751, 756, 764, - 772, 779, 787, 795, 803, 810, 818, 826, 831, 839, 846, 852, 859, 866, - 873, 876, 882, 889, 895, 902, 909, 916, 921, 929, 936, 943, 950, 957, - 964, 971, 978, 985, 993, 1001, 1009, 1017, 1025, 1033, 1041, 1049, 1056, - 1063, 1071, 1079, 1087, 1095, 1103, 1111, 1119, 1127, 1135, 1143, 1151, - 1159, 1167, 1175, 1183, 1191, 1199, 1207, 1215, 1223, 1230, 1237, 1245, - 1253, 1261, 1269, 1277, 1285, 1293, 1301, 1309, 1315, 1320, 1325, 1333, - 1341, 1349, 1357, 1362, 1369, 1376, 1384, 1392, 1400, 1408, 1417, 1426, - 1433, 1440, 1447, 1454, 1462, 1470, 1478, 1486, 1497, 1502, 1507, 1514, - 1521, 1528, 1535, 1542, 1549, 1554, 1559, 1566, 1573, 1581, 1589, 1597, - 1605, 1612, 1619, 1627, 1635, 1643, 1651, 1659, 1667, 1675, 1683, 1691, - 1699, 1706, 1713, 1720, 1727, 1734, 1741, 1748, 1755, 1763, 1771, 1778, - 1785, 1792, 1799, 1807, 1815, 1823, 1831, 1839, 1846, 1853, 1861, 1869, - 1877, 1885, 1891, 1897, 1903, 1910, 1917, 1922, 1927, 1932, 1939, 1946, - 1953, 1960, 1968, 1976, 1983, 1989, 1994, 1999, 2006, 2013, 2020, 2025, - 2030, 2035, 2042, 2049, 2056, 2063, 2070, 2077, 2085, 2095, 2103, 2110, - 2117, 2122, 2127, 2134, 2141, 2145, 2150, 2155, 2160, 2168, 2177, 2184, - 2191, 2200, 2207, 2214, 2219, 2226, 2233, 2240, 2247, 2254, 2259, 2266, - 2273, 2281, 2286, 2291, 2296, 2306, 2310, 2316, 2322, 2328, 2334, 2342, - 2355, 2363, 2368, 2378, 2383, 2388, 2398, 2403, 2410, 2417, 2425, 2433, - 2440, 2447, 2454, 2461, 2471, 2481, 2490, 2499, 2509, 2519, 2529, 2539, - 2545, 2555, 2565, 2575, 2585, 2593, 2601, 2608, 2615, 2623, 2631, 2639, - 2647, 2654, 2661, 2671, 2681, 2689, 2697, 2705, 2710, 2720, 2725, 2732, - 2739, 2744, 2749, 2757, 2765, 2775, 2785, 2792, 2799, 2808, 2817, 2825, - 2833, 2842, 2851, 2860, 2869, 2879, 2889, 2898, 2907, 2917, 2927, 2935, - 2943, 2952, 2961, 2970, 2979, 2989, 2999, 3007, 3015, 3024, 3033, 3042, - 3051, 3060, 3069, 3074, 3079, 3087, 3095, 3105, 3113, 3118, 3123, 3130, - 3137, 3144, 3151, 3159, 3167, 3177, 3187, 3197, 3207, 3214, 3221, 3231, - 3241, 3249, 3257, 3265, 3273, 3281, 3288, 3295, 3302, 3308, 3315, 3322, - 3329, 3338, 3348, 3358, 3365, 3372, 3378, 3383, 3390, 3397, 3404, 3411, - 3418, 3429, 3439, 3446, 3453, 3460, 3467, 3473, 3478, 3485, 3491, 3496, - 3504, 3512, 3519, 3525, 3530, 3537, 3542, 3549, 3559, 3568, 3577, 3584, - 3590, 3596, 3601, 3608, 3615, 3622, 3629, 3636, 3641, 3646, 3655, 3663, - 3672, 3677, 3684, 3695, 3702, 3710, 3719, 3725, 3731, 3737, 3744, 3749, - 3755, 3766, 3775, 3784, 3792, 3800, 3810, 3815, 3822, 3829, 3834, 3846, - 3855, 3863, 3870, 3879, 3884, 3889, 3896, 3903, 3910, 3917, 3923, 3932, - 3940, 3945, 3953, 3959, 3967, 3975, 3981, 3987, 3993, 4000, 4008, 4014, - 4022, 4029, 4034, 4041, 4049, 4059, 4066, 4073, 4083, 4090, 4097, 4107, - 4114, 4121, 4128, 4134, 4140, 4150, 4163, 4168, 4175, 4180, 4184, 4190, - 4199, 4206, 4211, 4216, 4220, 4225, 4231, 4235, 4241, 4247, 4253, 4259, - 4267, 4272, 4277, 4282, 4287, 4293, 4295, 4300, 4304, 4310, 4316, 4322, - 4327, 4334, 4341, 4347, 4354, 4362, 4370, 4375, 4380, 4384, 4389, 4391, - 4393, 4396, 4398, 4401, 4406, 4411, 4417, 4422, 4426, 4431, 4436, 4445, - 4451, 4456, 4462, 4467, 4473, 4481, 4489, 4493, 4497, 4502, 4508, 4514, - 4520, 4526, 4531, 4538, 4546, 4554, 4559, 4565, 4572, 4579, 4586, 4593, - 4597, 4602, 4607, 4612, 4617, 4622, 4625, 4628, 4631, 4634, 4637, 4640, - 4644, 4648, 4654, 4657, 4662, 4668, 4674, 4677, 4682, 4688, 4692, 4698, - 4704, 4710, 4716, 4721, 4726, 4731, 4734, 4740, 4745, 4750, 4754, 4759, - 4765, 4771, 4774, 4778, 4782, 4786, 4789, 4792, 4797, 4801, 4808, 4812, - 4818, 4822, 4828, 4832, 4836, 4840, 4845, 4850, 4857, 4863, 4870, 4876, - 4882, 4888, 4891, 4895, 4899, 4903, 4907, 4912, 4917, 4921, 4925, 4931, - 4935, 4939, 4944, 4950, 4955, 4961, 4965, 4972, 4977, 4982, 4987, 4992, - 4998, 5001, 5005, 5010, 5015, 5024, 5030, 5035, 5039, 5044, 5048, 5053, - 5057, 5061, 5066, 5070, 5076, 5081, 5086, 5091, 5096, 5101, 5106, 5112, - 5118, 5124, 5130, 5135, 5141, 5147, 5153, 5158, 5163, 5170, 5177, 5181, - 5187, 5194, 0, 0, 5201, 5204, 5213, 5222, 5233, 5237, 0, 0, 0, 0, 5242, - 5245, 5250, 5258, 5263, 5271, 5279, 0, 5287, 0, 5295, 5303, 5311, 5322, - 5327, 5332, 5337, 5342, 5347, 5352, 5357, 5362, 5367, 5372, 5377, 5382, - 5387, 5392, 5397, 5402, 0, 5407, 5412, 5417, 5422, 5427, 5432, 5437, - 5442, 5450, 5458, 5466, 5474, 5482, 5490, 5501, 5506, 5511, 5516, 5521, - 5526, 5531, 5536, 5541, 5546, 5551, 5556, 5561, 5566, 5571, 5576, 5581, - 5586, 5592, 5597, 5602, 5607, 5612, 5617, 5622, 5627, 5635, 5643, 5651, - 5659, 5667, 5672, 5676, 5680, 5687, 5697, 5707, 5711, 5715, 5719, 5725, - 5732, 5736, 5741, 5745, 5750, 5754, 5759, 5763, 5768, 5773, 5778, 5783, - 5788, 5793, 5798, 5803, 5808, 5813, 5818, 5823, 5828, 5833, 5838, 5842, - 5846, 5852, 5856, 5861, 5867, 5875, 5880, 5885, 5892, 5897, 5902, 5909, - 5918, 5927, 5938, 5946, 5951, 5956, 5961, 5968, 5973, 5979, 5984, 5989, - 5994, 5999, 6004, 6009, 6017, 6023, 6028, 6032, 6037, 6042, 6047, 6052, - 6057, 6062, 6067, 6071, 6077, 6081, 6086, 6091, 6096, 6100, 6105, 6110, - 6115, 6120, 6124, 6129, 6133, 6138, 6143, 6148, 6153, 6159, 6164, 6170, - 6174, 6179, 6183, 6187, 6192, 6197, 6202, 6207, 6212, 6217, 6222, 6226, - 6232, 6236, 6241, 6246, 6251, 6255, 6260, 6265, 6270, 6275, 6279, 6284, - 6288, 6293, 6298, 6303, 6308, 6314, 6319, 6325, 6329, 6334, 6338, 6346, - 6351, 6356, 6361, 6368, 6373, 6379, 6384, 6389, 6394, 6399, 6404, 6409, - 6417, 6423, 6428, 6433, 6438, 6443, 6448, 6454, 6460, 6467, 6474, 6483, - 6492, 6499, 6506, 6515, 6524, 6529, 6534, 6539, 6544, 6549, 6554, 6559, - 6564, 6575, 6586, 6591, 6596, 6603, 6610, 6618, 6626, 6631, 6636, 6641, - 6646, 6650, 6654, 6658, 6664, 6670, 6674, 6681, 6686, 6696, 6706, 6712, - 6718, 6726, 6734, 6742, 6750, 6757, 6764, 6772, 6780, 6788, 6796, 6804, - 6812, 6820, 6828, 6836, 6844, 6851, 6858, 6864, 6870, 6878, 6886, 6893, - 6900, 6908, 6916, 6922, 6928, 6936, 6944, 6952, 6960, 6966, 6972, 6980, - 6988, 6996, 7004, 7011, 7018, 7026, 7034, 7042, 7050, 7055, 7060, 7067, - 7074, 7084, 7094, 7098, 7106, 7114, 7121, 7128, 7136, 7144, 7151, 7158, - 7166, 7174, 7181, 7188, 7196, 7204, 7209, 7216, 7223, 7230, 7237, 7243, - 7249, 7257, 7265, 7270, 7275, 7283, 7291, 7299, 7307, 7315, 7323, 7330, - 7337, 7345, 7353, 7361, 7369, 7376, 7383, 7389, 7395, 7404, 7413, 7421, - 7429, 7436, 7443, 7450, 7457, 7464, 7471, 7479, 7487, 7495, 7503, 7511, - 7519, 7529, 7539, 7546, 7553, 7560, 7567, 7574, 7581, 7588, 7595, 7602, - 7609, 7616, 7623, 7630, 7637, 7644, 7651, 7658, 7665, 7672, 7679, 7686, - 7693, 7700, 7707, 7712, 7717, 7722, 7727, 7732, 7737, 7742, 7747, 7752, - 7757, 7763, 7769, 7777, 7785, 7793, 7801, 7809, 7817, 7825, 7833, 7841, - 7849, 7854, 7859, 7864, 7869, 7877, 0, 7885, 7890, 7895, 7900, 7905, - 7910, 7915, 7920, 7925, 7929, 7934, 7939, 7944, 7949, 7954, 7959, 7964, - 7969, 7974, 7979, 7984, 7989, 7994, 7999, 8004, 8009, 8014, 8019, 8023, - 8028, 8033, 8038, 8043, 8048, 8053, 8058, 8063, 8068, 0, 0, 8073, 8080, - 8083, 8087, 8091, 8094, 8098, 8102, 8109, 8114, 8119, 8124, 8129, 8134, - 8139, 8144, 8149, 8153, 8158, 8163, 8168, 8173, 8178, 8183, 8188, 8193, - 8198, 8203, 8208, 8213, 8218, 8223, 8228, 8233, 8238, 8243, 8247, 8252, - 8257, 8262, 8267, 8272, 8277, 8282, 8287, 8292, 8297, 8304, 8310, 8315, - 0, 0, 8318, 8324, 8330, 0, 8334, 8339, 8344, 8349, 8356, 8363, 8368, - 8373, 8378, 8383, 8388, 8393, 8398, 8405, 8410, 8417, 8424, 8429, 8436, - 8441, 8446, 8451, 8458, 8463, 8468, 8475, 8484, 8489, 8494, 8499, 8504, - 8510, 8515, 8522, 8529, 8536, 8541, 8546, 8551, 8556, 8561, 8566, 8576, - 8581, 8590, 8595, 8600, 8605, 8610, 8617, 8624, 8631, 8637, 8643, 8650, - 0, 0, 0, 0, 0, 0, 0, 0, 8657, 8661, 8665, 8669, 8673, 8677, 8681, 8685, - 8689, 8693, 8697, 8702, 8706, 8710, 8715, 8719, 8724, 8728, 8732, 8736, - 8741, 8745, 8750, 8754, 8758, 8762, 8766, 0, 0, 0, 0, 8770, 8775, 8782, - 8790, 8797, 8802, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8807, 8810, 8814, - 8819, 8823, 8827, 8831, 8837, 8843, 8846, 8853, 8862, 8865, 8868, 8873, - 8879, 8883, 8891, 8897, 8903, 8911, 8915, 8920, 8931, 8936, 8940, 8944, - 8948, 8951, 0, 8954, 8961, 8965, 8971, 8975, 8982, 8989, 8997, 9004, - 9011, 9015, 9019, 9025, 9029, 9033, 9037, 9041, 9045, 9049, 9053, 9057, - 9061, 9065, 9069, 9073, 9077, 9081, 9085, 9089, 9093, 9102, 9111, 9121, - 9131, 9141, 9144, 9148, 9152, 9156, 9160, 9164, 9168, 9172, 9176, 9181, - 9185, 9188, 9191, 9194, 9197, 9200, 9203, 9206, 9209, 9213, 9217, 9221, - 9226, 9231, 9237, 9240, 9247, 9256, 9261, 9266, 9273, 9279, 9284, 9288, - 9292, 9296, 9300, 9304, 9308, 9312, 9316, 9320, 9324, 9329, 9334, 9341, - 9347, 9353, 9359, 9364, 9373, 9382, 9387, 9394, 9401, 9408, 9415, 9419, - 9423, 9427, 9434, 9445, 9449, 9453, 9457, 9464, 9473, 9477, 9481, 9489, - 9493, 9497, 9501, 9508, 9515, 9527, 9531, 9535, 9539, 9550, 9560, 9564, - 9572, 9579, 9586, 9595, 9606, 9615, 9619, 9629, 9640, 9649, 9664, 9673, - 9682, 9691, 9700, 9706, 9715, 9722, 9726, 9735, 9739, 9746, 9755, 9759, - 9765, 9772, 9779, 9783, 9792, 9796, 9803, 9807, 9816, 9820, 9829, 9837, - 9844, 9853, 9862, 9869, 9875, 9879, 9886, 9895, 9901, 9908, 9915, 9921, - 9931, 9939, 9946, 9952, 9956, 9959, 9963, 9969, 9978, 9982, 9988, 9994, - 10001, 10008, 10011, 10019, 10024, 10033, 10038, 10042, 10055, 10068, - 10074, 10081, 10086, 10092, 10097, 10103, 10113, 10120, 10129, 10139, - 10145, 10150, 10155, 10159, 10163, 10168, 10173, 10179, 10187, 10195, - 10206, 10211, 10220, 10229, 10236, 10242, 10248, 10254, 10260, 10266, - 10272, 10278, 10284, 10290, 10297, 10304, 10311, 10317, 10325, 10334, - 10341, 10349, 10357, 10363, 10369, 10375, 10383, 10391, 10401, 10411, - 10415, 10421, 10427, 0, 10433, 10438, 10443, 10450, 10455, 10460, 10467, - 10472, 10481, 10486, 10491, 10496, 10501, 10506, 10513, 10518, 10525, - 10530, 10535, 10540, 10545, 10550, 10556, 10560, 10565, 10572, 10577, - 10582, 10587, 10592, 10597, 10604, 10611, 10618, 10623, 10628, 10634, - 10639, 10644, 10650, 10655, 10660, 10668, 10676, 10681, 10686, 10692, - 10697, 10702, 10706, 10712, 10716, 10720, 10727, 10734, 10740, 10746, - 10753, 10760, 10764, 0, 0, 10768, 10775, 10782, 10789, 10800, 10813, - 10826, 10845, 10858, 10869, 10877, 10885, 10897, 10913, 10924, 10930, - 10940, 10949, 10962, 10973, 10982, 10995, 11002, 11011, 11024, 11030, - 11036, 11045, 11053, 11061, 11067, 11078, 11086, 11097, 11107, 11120, - 11134, 11148, 11158, 11169, 11180, 11193, 11206, 11220, 11232, 11244, - 11257, 11270, 11282, 11295, 11304, 11313, 11318, 11323, 11328, 11333, - 11338, 11343, 11348, 11353, 11358, 11363, 11368, 11373, 11378, 11383, - 11388, 11393, 11398, 11403, 11408, 11413, 11418, 11423, 11428, 11433, - 11438, 11443, 11448, 11453, 11458, 11463, 11468, 11473, 11477, 11482, - 11487, 11492, 11497, 11502, 11506, 11510, 11514, 11518, 11522, 11526, - 11530, 11534, 11538, 11542, 11546, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 11551, 11556, 11560, 11564, 11568, 11572, 11576, 11580, 11584, 11588, - 11592, 11596, 11601, 11605, 11609, 11613, 11618, 11622, 11627, 11632, - 11637, 11641, 11646, 11651, 11656, 11661, 11665, 11670, 11674, 11679, - 11684, 11688, 11692, 11699, 11703, 11708, 11712, 11716, 11721, 11725, - 11732, 11739, 11746, 11752, 11760, 11768, 11777, 11785, 11792, 11799, - 11807, 11813, 11819, 11825, 11831, 11838, 11843, 11847, 11852, 0, 0, - 11856, 11860, 11865, 11870, 11875, 11880, 11885, 11890, 11895, 11900, - 11905, 11910, 11915, 11920, 11925, 11930, 11935, 11940, 11945, 11950, - 11955, 11960, 11965, 11970, 11975, 11980, 11985, 11990, 11995, 12000, - 12008, 12015, 12021, 12026, 12034, 12041, 12047, 12054, 12060, 12065, - 12072, 12079, 12085, 12090, 12095, 12101, 12106, 12111, 12117, 0, 0, - 12122, 12128, 12134, 12140, 12146, 12152, 12158, 12163, 12171, 12177, - 12183, 12189, 12195, 12201, 12209, 0, 12215, 12220, 12225, 12230, 12235, - 12240, 12245, 12250, 12255, 12260, 12265, 12270, 12275, 12280, 12285, - 12290, 12295, 12300, 12305, 12310, 12315, 12320, 12325, 12330, 12335, - 12340, 12345, 12350, 0, 0, 12355, 0, 12359, 12365, 12371, 12377, 12383, - 12389, 12395, 12401, 12406, 12412, 12418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 423, 426, 429, 432, 436, 439, 442, 445, 447, 450, 456, 464, 470, 476, + 482, 487, 494, 500, 507, 514, 521, 529, 534, 542, 550, 557, 565, 573, + 581, 588, 596, 604, 609, 617, 624, 630, 637, 644, 651, 654, 660, 667, + 673, 680, 687, 694, 699, 706, 713, 719, 726, 733, 740, 748, 753, 761, + 769, 776, 784, 792, 800, 807, 815, 823, 828, 836, 843, 849, 856, 863, + 870, 873, 879, 886, 892, 899, 906, 913, 918, 926, 933, 940, 947, 954, + 961, 968, 975, 982, 990, 998, 1006, 1014, 1022, 1030, 1038, 1046, 1053, + 1060, 1068, 1076, 1084, 1092, 1100, 1108, 1116, 1124, 1132, 1140, 1148, + 1156, 1164, 1172, 1180, 1188, 1196, 1204, 1212, 1220, 1227, 1234, 1242, + 1250, 1258, 1266, 1274, 1282, 1290, 1298, 1306, 1312, 1317, 1322, 1330, + 1338, 1346, 1354, 1359, 1366, 1373, 1381, 1389, 1397, 1405, 1414, 1423, + 1430, 1437, 1444, 1451, 1459, 1467, 1475, 1483, 1494, 1499, 1504, 1511, + 1518, 1525, 1532, 1539, 1546, 1551, 1556, 1563, 1570, 1578, 1586, 1594, + 1602, 1609, 1616, 1624, 1632, 1640, 1648, 1656, 1664, 1672, 1680, 1688, + 1696, 1703, 1710, 1717, 1724, 1731, 1738, 1745, 1752, 1760, 1768, 1775, + 1782, 1789, 1796, 1804, 1812, 1820, 1828, 1836, 1843, 1850, 1858, 1866, + 1874, 1882, 1888, 1894, 1900, 1907, 1914, 1919, 1924, 1929, 1936, 1943, + 1950, 1957, 1965, 1973, 1979, 1985, 1990, 1995, 2002, 2009, 2016, 2021, + 2026, 2031, 2038, 2045, 2052, 2059, 2066, 2072, 2080, 2090, 2098, 2105, + 2112, 2117, 2122, 2129, 2136, 2140, 2145, 2150, 2155, 2163, 2172, 2179, + 2186, 2195, 2202, 2209, 2214, 2221, 2228, 2235, 2242, 2249, 2254, 2261, + 2268, 2276, 2281, 2286, 2291, 2301, 2305, 2311, 2317, 2323, 2329, 2337, + 2350, 2358, 2363, 2373, 2378, 2383, 2393, 2398, 2405, 2412, 2420, 2428, + 2435, 2442, 2449, 2456, 2466, 2476, 2485, 2494, 2504, 2514, 2524, 2534, + 2539, 2549, 2559, 2569, 2579, 2587, 2595, 2602, 2609, 2617, 2625, 2633, + 2641, 2648, 2655, 2665, 2675, 2683, 2691, 2699, 2704, 2714, 2719, 2726, + 2733, 2738, 2743, 2751, 2759, 2769, 2779, 2786, 2793, 2802, 2811, 2819, + 2827, 2836, 2845, 2854, 2863, 2873, 2883, 2892, 2901, 2911, 2921, 2929, + 2937, 2946, 2955, 2964, 2973, 2983, 2993, 3001, 3009, 3018, 3027, 3036, + 3045, 3054, 3063, 3068, 3073, 3081, 3089, 3099, 3107, 3112, 3117, 3124, + 3131, 3138, 3145, 3153, 3161, 3171, 3181, 3191, 3201, 3208, 3215, 3225, + 3235, 3243, 3251, 3259, 3267, 3275, 3282, 3289, 3296, 3302, 3309, 3316, + 3323, 3332, 3342, 3352, 3359, 3366, 3372, 3377, 3383, 3390, 3397, 3404, + 3411, 3422, 3432, 3439, 3446, 3453, 3460, 3465, 3470, 3476, 3482, 3487, + 3495, 3503, 3510, 3516, 3521, 3528, 3533, 3540, 3550, 3559, 3568, 3575, + 3581, 3587, 3592, 3599, 3605, 3612, 3619, 3626, 3631, 3636, 3645, 3653, + 3662, 3667, 3673, 3683, 3690, 3698, 3707, 3713, 3719, 3725, 3732, 3737, + 3742, 3752, 3760, 3769, 3777, 3785, 3795, 3800, 3807, 3814, 3819, 3831, + 3840, 3848, 3854, 3863, 3868, 3873, 3880, 3886, 3892, 3898, 3904, 3913, + 3921, 3926, 3934, 3940, 3948, 3956, 3962, 3968, 3974, 3981, 3989, 3995, + 4003, 4009, 4014, 4021, 4029, 4039, 4046, 4053, 4063, 4070, 4077, 4087, + 4094, 4101, 4108, 4114, 4120, 4129, 4141, 4146, 4153, 4158, 4162, 4167, + 4175, 4182, 4187, 4192, 4196, 4201, 4206, 4210, 4216, 4222, 4228, 4234, + 4242, 4247, 4252, 4257, 4262, 4268, 4270, 4275, 4279, 4285, 4291, 4297, + 4302, 4309, 4316, 4322, 4329, 4337, 4345, 4350, 4355, 4359, 4364, 4366, + 4368, 4371, 4373, 4376, 4381, 4386, 4392, 4397, 4401, 4406, 4411, 4420, + 4426, 4431, 4437, 4442, 4448, 4456, 4464, 4468, 4472, 4477, 4483, 4489, + 4495, 4501, 4506, 4513, 4521, 4529, 4534, 4540, 4547, 4554, 4561, 4568, + 4572, 4577, 4582, 4587, 4592, 4597, 4600, 4603, 4606, 4609, 4612, 4615, + 4619, 4623, 4629, 4632, 4637, 4643, 4649, 4652, 4657, 4662, 4666, 4672, + 4678, 4684, 4690, 4695, 4700, 4705, 4708, 4714, 4719, 4724, 4728, 4733, + 4739, 4745, 4748, 4752, 4756, 4760, 4763, 4766, 4771, 4775, 4782, 4786, + 4792, 4796, 4802, 4806, 4810, 4814, 4819, 4824, 4831, 4837, 4844, 4850, + 4856, 4862, 4865, 4869, 4873, 4877, 4881, 4886, 4891, 4895, 4899, 4905, + 4909, 4913, 4918, 4924, 4929, 4935, 4939, 4946, 4951, 4956, 4961, 4966, + 4972, 4975, 4979, 4984, 4989, 4998, 5004, 5009, 5013, 5018, 5022, 5027, + 5031, 5035, 5040, 5044, 5050, 5055, 5060, 5065, 5070, 5075, 5080, 5086, + 5092, 5098, 5104, 5109, 5115, 5121, 5127, 5132, 5137, 5144, 5151, 5155, + 5161, 5168, 0, 0, 5175, 5178, 5187, 5196, 5207, 5211, 0, 0, 0, 0, 5216, + 5219, 5224, 5232, 5237, 5245, 5253, 0, 5261, 0, 5269, 5277, 5285, 5296, + 5301, 5306, 5311, 5316, 5321, 5326, 5331, 5336, 5341, 5346, 5351, 5356, + 5361, 5366, 5371, 5376, 0, 5381, 5386, 5391, 5396, 5401, 5406, 5411, + 5416, 5424, 5432, 5440, 5448, 5456, 5464, 5475, 5480, 5485, 5490, 5495, + 5500, 5505, 5510, 5515, 5520, 5525, 5530, 5535, 5540, 5545, 5550, 5555, + 5560, 5566, 5571, 5576, 5581, 5586, 5591, 5596, 5601, 5609, 5617, 5625, + 5633, 5641, 5646, 5650, 5654, 5661, 5671, 5681, 5685, 5689, 5693, 5699, + 5706, 5710, 5715, 5719, 5724, 5728, 5733, 5737, 5742, 5747, 5752, 5757, + 5762, 5767, 5772, 5777, 5782, 5787, 5792, 5797, 5802, 5807, 5812, 5816, + 5820, 5826, 5830, 5835, 5841, 5849, 5854, 5859, 5866, 5871, 5876, 5883, + 5892, 5901, 5912, 5920, 5925, 5930, 5935, 5942, 5947, 5953, 5958, 5963, + 5968, 5973, 5978, 5983, 5991, 5997, 6002, 6006, 6011, 6016, 6021, 6026, + 6031, 6036, 6041, 6045, 6051, 6055, 6060, 6065, 6070, 6074, 6079, 6084, + 6089, 6094, 6098, 6103, 6107, 6112, 6117, 6122, 6127, 6133, 6138, 6144, + 6148, 6153, 6157, 6161, 6166, 6171, 6176, 6181, 6186, 6191, 6196, 6200, + 6206, 6210, 6215, 6220, 6225, 6229, 6234, 6239, 6244, 6249, 6253, 6258, + 6262, 6267, 6272, 6277, 6282, 6288, 6293, 6299, 6303, 6308, 6312, 6320, + 6325, 6330, 6335, 6342, 6347, 6353, 6358, 6363, 6368, 6373, 6378, 6383, + 6391, 6397, 6402, 6407, 6412, 6417, 6422, 6428, 6434, 6441, 6448, 6457, + 6466, 6473, 6480, 6489, 6498, 6503, 6508, 6513, 6518, 6523, 6528, 6533, + 6538, 6549, 6560, 6565, 6570, 6577, 6584, 6592, 6600, 6605, 6610, 6615, + 6620, 6624, 6628, 6632, 6638, 6644, 6648, 6655, 6660, 6670, 6680, 6686, + 6692, 6700, 6708, 6716, 6724, 6731, 6738, 6746, 6754, 6762, 6770, 6778, + 6786, 6794, 6802, 6810, 6818, 6825, 6832, 6838, 6844, 6852, 6860, 6867, + 6874, 6882, 6890, 6896, 6902, 6910, 6918, 6926, 6934, 6940, 6946, 6954, + 6962, 6970, 6978, 6985, 6992, 7000, 7008, 7016, 7024, 7029, 7034, 7041, + 7048, 7058, 7068, 7072, 7080, 7088, 7095, 7102, 7110, 7118, 7125, 7132, + 7140, 7148, 7155, 7162, 7170, 7178, 7183, 7190, 7197, 7204, 7211, 7217, + 7223, 7231, 7239, 7244, 7249, 7257, 7265, 7273, 7281, 7289, 7297, 7304, + 7311, 7319, 7327, 7335, 7343, 7350, 7357, 7363, 7369, 7378, 7387, 7395, + 7403, 7410, 7417, 7424, 7431, 7438, 7445, 7453, 7461, 7469, 7477, 7485, + 7493, 7503, 7513, 7520, 7527, 7534, 7541, 7548, 7555, 7562, 7569, 7576, + 7583, 7590, 7597, 7604, 7611, 7618, 7625, 7632, 7639, 7646, 7653, 7660, + 7667, 7674, 7681, 7686, 7691, 7696, 7701, 7706, 7711, 7716, 7721, 7726, + 7731, 7737, 7743, 7751, 7759, 7767, 7775, 7783, 7791, 7799, 7807, 7815, + 7823, 7828, 7833, 7838, 7843, 7851, 0, 7859, 7865, 7871, 7877, 7883, + 7889, 7895, 7901, 7907, 7912, 7918, 7924, 7930, 7936, 7942, 7948, 7954, + 7960, 7966, 7972, 7978, 7984, 7990, 7996, 8002, 8008, 8014, 8020, 8025, + 8031, 8037, 8043, 8049, 8055, 8061, 8067, 8073, 8079, 0, 0, 8085, 8093, + 8097, 8102, 8107, 8111, 8116, 8121, 8128, 8134, 8140, 8146, 8152, 8158, + 8164, 8170, 8176, 8181, 8187, 8193, 8199, 8205, 8211, 8217, 8223, 8229, + 8235, 8241, 8247, 8253, 8259, 8265, 8271, 8277, 8283, 8289, 8294, 8300, + 8306, 8312, 8318, 8324, 8330, 8336, 8342, 8348, 8354, 8362, 8369, 8375, + 0, 0, 8379, 8386, 8393, 0, 8398, 8403, 8408, 8413, 8420, 8427, 8432, + 8437, 8442, 8447, 8452, 8457, 8462, 8469, 8474, 8481, 8488, 8493, 8500, + 8505, 8510, 8515, 8522, 8527, 8532, 8539, 8548, 8553, 8558, 8563, 8568, + 8574, 8579, 8586, 8593, 8600, 8605, 8610, 8615, 8620, 8625, 8630, 8640, + 8645, 8654, 8659, 8664, 8669, 8674, 8681, 8688, 8695, 8701, 8707, 8714, + 0, 0, 0, 0, 0, 0, 0, 0, 8721, 8725, 8729, 8733, 8737, 8741, 8745, 8749, + 8753, 8757, 8761, 8766, 8770, 8774, 8779, 8783, 8788, 8792, 8796, 8800, + 8805, 8809, 8814, 8818, 8822, 8826, 8830, 0, 0, 0, 0, 8834, 8839, 8846, + 8854, 8861, 8866, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8871, 8874, 8878, + 8883, 8887, 8891, 8895, 8901, 8907, 8910, 8917, 8926, 8929, 8932, 8937, + 8943, 8947, 8955, 8961, 8967, 8975, 8979, 8984, 8995, 9000, 9004, 9008, + 9012, 9015, 0, 9018, 9025, 9029, 9035, 9039, 9046, 9053, 9061, 9068, + 9075, 9079, 9083, 9089, 9093, 9097, 9101, 9105, 9109, 9113, 9117, 9121, + 9125, 9129, 9133, 9137, 9141, 9145, 9149, 9153, 9157, 9166, 9175, 9185, + 9195, 9205, 9208, 9212, 9216, 9220, 9224, 9228, 9232, 9236, 9240, 9245, + 9249, 9252, 9255, 9258, 9261, 9264, 9267, 9270, 9273, 9277, 9281, 9285, + 9290, 9295, 9301, 9304, 9311, 9320, 9325, 9330, 9337, 9343, 9348, 9352, + 9356, 9360, 9364, 9368, 9372, 9376, 9380, 9384, 9388, 9393, 9398, 9405, + 9411, 9417, 9423, 9428, 9437, 9446, 9451, 9458, 9465, 9472, 9479, 9483, + 9487, 9491, 9498, 9509, 9513, 9517, 9521, 9528, 9537, 9541, 9545, 9553, + 9557, 9561, 9565, 9572, 9579, 9591, 9595, 9599, 9603, 9614, 9624, 9628, + 9636, 9643, 9650, 9659, 9670, 9679, 9683, 9693, 9704, 9713, 9728, 9737, + 9746, 9755, 9764, 9770, 9779, 9786, 9790, 9799, 9803, 9810, 9819, 9823, + 9829, 9836, 9843, 9847, 9856, 9860, 9867, 9871, 9880, 9884, 9893, 9901, + 9908, 9917, 9926, 9933, 9939, 9943, 9950, 9959, 9965, 9972, 9979, 9985, + 9995, 10003, 10010, 10016, 10020, 10023, 10027, 10033, 10042, 10046, + 10052, 10058, 10065, 10072, 10075, 10083, 10088, 10097, 10102, 10106, + 10119, 10132, 10138, 10145, 10150, 10156, 10161, 10167, 10177, 10184, + 10193, 10203, 10209, 10214, 10219, 10223, 10227, 10232, 10237, 10243, + 10251, 10259, 10270, 10275, 10284, 10293, 10300, 10306, 10312, 10318, + 10324, 10330, 10336, 10342, 10348, 10354, 10361, 10368, 10375, 10381, + 10389, 10398, 10405, 10413, 10421, 10427, 10433, 10439, 10447, 10455, + 10465, 10475, 10479, 10485, 10491, 0, 10497, 10502, 10507, 10514, 10519, + 10524, 10531, 10536, 10545, 10550, 10555, 10560, 10565, 10570, 10577, + 10582, 10589, 10594, 10599, 10604, 10609, 10614, 10620, 10624, 10629, + 10636, 10641, 10646, 10651, 10656, 10661, 10668, 10675, 10682, 10687, + 10692, 10698, 10703, 10708, 10714, 10719, 10724, 10732, 10740, 10745, + 10750, 10756, 10761, 10766, 10770, 10776, 10780, 10784, 10791, 10798, + 10804, 10810, 10817, 10824, 10828, 0, 0, 10832, 10839, 10846, 10853, + 10864, 10877, 10890, 10909, 10922, 10933, 10941, 10949, 10961, 10977, + 10988, 10994, 11004, 11013, 11026, 11037, 11046, 11059, 11066, 11075, + 11088, 11094, 11100, 11109, 11117, 11125, 11131, 11142, 11150, 11161, + 11171, 11184, 11198, 11212, 11222, 11233, 11244, 11257, 11270, 11284, + 11296, 11308, 11321, 11334, 11346, 11359, 11368, 11377, 11382, 11387, + 11392, 11397, 11402, 11407, 11412, 11417, 11422, 11427, 11432, 11437, + 11442, 11447, 11452, 11457, 11462, 11467, 11472, 11477, 11482, 11487, + 11492, 11497, 11502, 11507, 11512, 11517, 11522, 11527, 11532, 11537, + 11541, 11546, 11551, 11556, 11561, 11566, 11570, 11574, 11578, 11582, + 11586, 11590, 11594, 11598, 11602, 11606, 11610, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 11615, 11620, 11624, 11628, 11632, 11636, 11640, 11644, + 11648, 11652, 11656, 11660, 11665, 11669, 11673, 11677, 11682, 11686, + 11691, 11696, 11701, 11705, 11709, 11714, 11719, 11724, 11728, 11733, + 11737, 11742, 11747, 11751, 11755, 11762, 11766, 11771, 11775, 11779, + 11784, 11788, 11795, 11802, 11809, 11815, 11823, 11831, 11840, 11848, + 11855, 11862, 11870, 11876, 11882, 11888, 11894, 11901, 11906, 11910, + 11915, 0, 0, 11919, 11923, 11928, 11933, 11938, 11943, 11948, 11953, + 11958, 11963, 11968, 11973, 11978, 11983, 11988, 11993, 11998, 12003, + 12008, 12013, 12018, 12023, 12028, 12033, 12038, 12043, 12048, 12053, + 12058, 12063, 12071, 12078, 12084, 12089, 12097, 12104, 12110, 12117, + 12123, 12128, 12135, 12142, 12148, 12153, 12158, 12164, 12169, 12174, + 12180, 0, 0, 12185, 12191, 12197, 12203, 12209, 12215, 12221, 12226, + 12234, 12240, 12246, 12252, 12258, 12264, 12272, 0, 12278, 12283, 12288, + 12293, 12298, 12303, 12308, 12313, 12318, 12323, 12328, 12333, 12338, + 12343, 12348, 12353, 12358, 12363, 12368, 12373, 12378, 12383, 12388, + 12393, 12398, 12403, 12408, 12413, 0, 0, 12418, 0, 12422, 12428, 12434, + 12440, 12446, 12452, 12458, 12464, 12469, 12475, 12481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12424, 12433, - 12441, 12450, 12459, 12472, 12479, 12486, 12494, 12507, 12519, 12526, - 12534, 12540, 12545, 12554, 12563, 12571, 12577, 12587, 12596, 0, 12603, - 12611, 12619, 12628, 12637, 12651, 12657, 12663, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12669, 12674, 12681, 12686, 12691, - 12696, 12704, 12712, 12719, 12726, 12733, 12740, 12747, 12754, 12761, - 12767, 12775, 12781, 12786, 12791, 12796, 12801, 12806, 12811, 12816, - 12822, 12827, 12832, 12838, 12843, 12847, 12851, 12855, 12860, 12866, - 12872, 12878, 12883, 12888, 12893, 12898, 12904, 12913, 12921, 12927, - 12935, 12941, 12945, 12949, 12953, 12958, 12961, 12965, 12968, 12972, - 12975, 12979, 12983, 12987, 12992, 12997, 13000, 13004, 13009, 13014, - 13017, 13021, 13024, 13028, 13032, 13036, 13040, 13044, 13048, 13052, - 13056, 13060, 13064, 13068, 13072, 13076, 13080, 13084, 13088, 13092, - 13096, 13099, 13103, 13106, 13110, 13114, 13118, 13121, 13124, 13127, - 13131, 13134, 13138, 13142, 13146, 13150, 13154, 13157, 13160, 13165, - 13170, 13174, 13178, 13183, 13187, 13192, 13196, 13201, 13206, 13212, - 13218, 13224, 13228, 13233, 13239, 13245, 13249, 13254, 13258, 13264, - 13269, 13272, 13278, 13284, 13289, 13294, 13301, 13306, 13311, 13315, - 13319, 13323, 13327, 13331, 13335, 13339, 13343, 13348, 13353, 13358, - 13364, 13367, 13371, 13375, 13378, 13381, 13384, 13387, 13390, 13393, - 13396, 13399, 13402, 13406, 13413, 13418, 13422, 13426, 13430, 13434, - 13438, 13444, 13448, 13452, 13456, 13460, 13466, 13470, 13474, 13477, - 13481, 13485, 0, 13489, 13492, 13496, 13499, 13503, 13506, 13510, 13514, - 0, 0, 13518, 13521, 0, 0, 13525, 13528, 13532, 13535, 13539, 13543, - 13547, 13551, 13555, 13559, 13563, 13567, 13571, 13575, 13579, 13583, - 13587, 13591, 13595, 13599, 13603, 13607, 0, 13610, 13613, 13617, 13621, - 13625, 13628, 13631, 0, 13634, 0, 0, 0, 13637, 13641, 13645, 13648, 0, 0, - 13651, 13655, 13659, 13664, 13668, 13673, 13677, 13682, 13687, 0, 0, - 13693, 13697, 0, 0, 13702, 13706, 13711, 13715, 0, 0, 0, 0, 0, 0, 0, 0, - 13721, 0, 0, 0, 0, 13727, 13731, 0, 13735, 13739, 13744, 13749, 13754, 0, - 0, 13760, 13764, 13767, 13770, 13773, 13776, 13779, 13782, 13785, 13788, - 13791, 13799, 13808, 13812, 13816, 13822, 13828, 13834, 13840, 13854, - 13861, 13864, 13868, 13874, 13878, 0, 0, 13882, 13889, 13894, 0, 13899, - 13903, 13908, 13912, 13917, 13921, 0, 0, 0, 0, 13926, 13931, 0, 0, 13936, - 13941, 13946, 13950, 13955, 13960, 13965, 13970, 13975, 13980, 13985, - 13990, 13995, 14000, 14005, 14010, 14015, 14020, 14025, 14030, 14035, - 14040, 0, 14044, 14048, 14053, 14058, 14063, 14067, 14071, 0, 14075, - 14079, 0, 14084, 14089, 0, 14094, 14098, 0, 0, 14102, 0, 14107, 14113, - 14118, 14124, 14129, 0, 0, 0, 0, 14135, 14141, 0, 0, 14147, 14153, 14159, - 0, 0, 0, 14164, 0, 0, 0, 0, 0, 0, 0, 14169, 14174, 14179, 14184, 0, - 14189, 0, 0, 0, 0, 0, 0, 0, 14194, 14199, 14203, 14207, 14211, 14215, - 14219, 14223, 14227, 14231, 14235, 14239, 14243, 14247, 14251, 14257, - 14262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14267, 14272, 14277, 0, 14282, - 14286, 14291, 14295, 14300, 14304, 14309, 14314, 14319, 0, 14325, 14329, - 14334, 0, 14340, 14344, 14349, 14353, 14358, 14363, 14368, 14373, 14378, - 14383, 14388, 14393, 14398, 14403, 14408, 14413, 14418, 14423, 14428, - 14433, 14438, 14443, 0, 14447, 14451, 14456, 14461, 14466, 14470, 14474, - 0, 14478, 14482, 0, 14487, 14492, 14497, 14502, 14506, 0, 0, 14510, - 14515, 14520, 14526, 14531, 14537, 14542, 14548, 14554, 14561, 0, 14568, - 14573, 14579, 0, 14586, 14591, 14597, 0, 0, 14602, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 14606, 14612, 14618, 14624, 0, 0, 14631, 14636, - 14640, 14644, 14648, 14652, 14656, 14660, 14664, 14668, 14672, 14677, 0, - 0, 0, 0, 0, 0, 0, 14682, 14687, 14692, 14697, 14702, 14710, 14718, 0, - 14726, 14731, 14736, 0, 14741, 14745, 14750, 14754, 14759, 14763, 14768, - 14773, 0, 0, 14778, 14782, 0, 0, 14787, 14791, 14796, 14800, 14805, - 14810, 14815, 14820, 14825, 14830, 14835, 14840, 14845, 14850, 14855, - 14860, 14865, 14870, 14875, 14880, 14885, 14890, 0, 14894, 14898, 14903, - 14908, 14913, 14917, 14921, 0, 14925, 14929, 0, 14934, 14939, 14944, - 14949, 14953, 0, 0, 14957, 14962, 14967, 14973, 14978, 14984, 14989, - 14995, 15001, 0, 0, 15008, 15013, 0, 0, 15019, 15024, 15030, 0, 0, 0, 0, - 0, 0, 0, 0, 15035, 15042, 0, 0, 0, 0, 15049, 15054, 0, 15059, 15064, - 15070, 15076, 15082, 0, 0, 15089, 15094, 15098, 15102, 15106, 15110, - 15114, 15118, 15122, 15126, 15130, 15134, 15139, 15146, 15153, 15160, - 15167, 15174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15181, 15185, 0, 15189, - 15192, 15196, 15199, 15203, 15206, 0, 0, 0, 15210, 15213, 15217, 0, - 15221, 15224, 15228, 15232, 0, 0, 0, 15235, 15239, 0, 15243, 0, 15247, - 15251, 0, 0, 0, 15255, 15259, 0, 0, 0, 15263, 15266, 15270, 0, 0, 0, - 15273, 15276, 15279, 15282, 15286, 15289, 15293, 15297, 15301, 15305, - 15309, 15312, 0, 0, 0, 0, 15315, 15320, 15324, 15329, 15333, 0, 0, 0, - 15338, 15342, 15347, 0, 15352, 15356, 15361, 15366, 0, 0, 15370, 0, 0, 0, - 0, 0, 0, 15373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15379, 15383, - 15386, 15389, 15392, 15395, 15398, 15401, 15404, 15407, 15410, 15414, - 15419, 15424, 15428, 15432, 15436, 15440, 15444, 15449, 15453, 0, 0, 0, - 0, 0, 15456, 15462, 15466, 15470, 15474, 15480, 15483, 15487, 15490, - 15494, 15497, 15501, 15505, 0, 15509, 15512, 15516, 0, 15520, 15523, - 15527, 15531, 15534, 15538, 15542, 15546, 15550, 15554, 15558, 15562, - 15566, 15570, 15574, 15578, 15582, 15586, 15590, 15594, 15598, 15602, - 15606, 0, 15609, 15612, 15616, 15620, 15624, 15627, 15630, 15633, 15637, - 15640, 15644, 15648, 15652, 15656, 15660, 15663, 0, 0, 0, 15666, 15670, - 15675, 15679, 15684, 15688, 15693, 15698, 0, 15704, 15708, 15713, 0, - 15718, 15722, 15727, 15732, 0, 0, 0, 0, 0, 0, 0, 15736, 15740, 0, 15746, - 15750, 15754, 0, 0, 0, 0, 0, 15758, 15763, 15768, 15773, 0, 0, 15779, - 15783, 15786, 15789, 15792, 15795, 15798, 15801, 15804, 15807, 0, 0, 0, - 0, 0, 0, 0, 0, 15810, 15823, 15835, 15847, 15859, 15871, 15883, 15895, - 15899, 15906, 15911, 15916, 15921, 15926, 15930, 15935, 15939, 15944, - 15948, 15953, 15958, 0, 15963, 15967, 15972, 0, 15977, 15981, 15986, - 15991, 15995, 16000, 16005, 16010, 16015, 16020, 16025, 16030, 16035, - 16040, 16045, 16050, 16055, 16060, 16065, 16070, 16075, 16080, 16085, 0, - 16089, 16093, 16098, 16103, 16108, 16112, 16116, 16120, 16125, 16129, 0, - 16134, 16139, 16144, 16149, 16153, 0, 0, 16157, 16162, 16167, 16173, - 16178, 16184, 16189, 16195, 16201, 0, 16208, 16213, 16219, 0, 16225, - 16230, 16236, 16242, 0, 0, 0, 0, 0, 0, 0, 16247, 16252, 0, 0, 0, 0, 0, 0, - 0, 16259, 0, 16264, 16270, 16276, 16282, 0, 0, 16289, 16294, 16298, - 16302, 16306, 16310, 16314, 16318, 16322, 16326, 0, 16330, 16335, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16340, 16346, 16350, 16354, 0, 16358, - 16361, 16365, 16368, 16372, 16375, 16379, 16383, 0, 16387, 16390, 16394, - 0, 16398, 16401, 16405, 16409, 16412, 16416, 16420, 16424, 16428, 16432, - 16436, 16440, 16444, 16448, 16452, 16456, 16460, 16464, 16468, 16472, - 16476, 16480, 16484, 16487, 16491, 16494, 16498, 16502, 16506, 16509, - 16512, 16515, 16519, 16522, 16526, 16530, 16534, 16538, 16542, 16545, - 16548, 16552, 16559, 16565, 16569, 16574, 16578, 16583, 16587, 16592, - 16597, 0, 16603, 16607, 16612, 0, 16617, 16621, 16626, 16631, 16635, - 16640, 0, 0, 0, 0, 16644, 16650, 16656, 16662, 16668, 16674, 16680, - 16686, 16692, 16698, 16704, 16710, 16716, 16721, 16726, 16731, 0, 0, - 16737, 16741, 16744, 16747, 16750, 16753, 16756, 16759, 16762, 16765, - 16768, 16772, 16777, 16782, 16788, 16794, 16800, 16806, 16812, 16818, - 16822, 16828, 16834, 16840, 16845, 16851, 0, 0, 16857, 16861, 0, 16865, - 16869, 16873, 16877, 16881, 16885, 16889, 16893, 16897, 16901, 16905, - 16909, 16913, 16917, 16921, 16925, 16929, 16933, 0, 0, 0, 16937, 16943, - 16949, 16955, 16961, 16967, 16973, 16979, 16985, 16991, 16997, 17003, - 17011, 17017, 17023, 17029, 17035, 17041, 17047, 17053, 17059, 17065, - 17071, 17077, 0, 17083, 17089, 17095, 17101, 17107, 17113, 17117, 17123, - 17127, 0, 17131, 0, 0, 17137, 17141, 17147, 17153, 17159, 17163, 17169, - 0, 0, 0, 17173, 0, 0, 0, 0, 17177, 17182, 17189, 17196, 17203, 17210, 0, - 17217, 0, 17224, 17229, 17234, 17241, 17248, 17257, 17268, 17277, 0, 0, - 0, 0, 0, 0, 17282, 17288, 17293, 17298, 17303, 17308, 17313, 17318, - 17323, 17328, 0, 0, 17333, 17340, 17347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 17352, 17359, 17366, 17373, 17380, 17387, 17394, 17401, 17408, 17415, - 17422, 17429, 17436, 17443, 17450, 17457, 17464, 17471, 17478, 17485, - 17492, 17499, 17506, 17513, 17520, 17527, 17534, 17541, 17548, 17555, - 17562, 17569, 17576, 17582, 17589, 17596, 17601, 17608, 17613, 17620, - 17627, 17634, 17641, 17648, 17655, 17661, 17668, 17673, 17679, 17686, - 17693, 17700, 17706, 17713, 17720, 17727, 17733, 17740, 0, 0, 0, 0, - 17745, 17752, 17758, 17765, 17771, 17780, 17789, 17794, 17799, 17804, - 17811, 17818, 17825, 17832, 17837, 17842, 17847, 17852, 17857, 17861, - 17865, 17869, 17873, 17877, 17881, 17885, 17889, 17893, 17898, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 12487, 12496, 12504, 12513, 12522, 12535, 12542, 12549, 12557, 12570, + 12582, 12589, 12597, 12603, 12608, 12617, 12626, 12634, 12640, 12650, + 12659, 0, 12666, 12674, 12682, 12691, 12700, 12714, 12720, 12726, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12732, 12737, + 12744, 12749, 12754, 12759, 12767, 12775, 12782, 12789, 12796, 12803, + 12810, 12817, 12824, 12830, 12838, 12843, 12848, 12853, 12858, 12863, + 12868, 12873, 12878, 12884, 12889, 12894, 12900, 12905, 12909, 12913, + 12917, 12922, 12928, 12934, 12940, 12945, 12950, 12955, 12960, 12966, + 12975, 12983, 12989, 12997, 13003, 13007, 13011, 13015, 13020, 13023, + 13027, 13030, 13034, 13037, 13041, 13045, 13049, 13054, 13059, 13062, + 13066, 13071, 13076, 13079, 13083, 13086, 13090, 13094, 13098, 13102, + 13106, 13110, 13114, 13118, 13122, 13126, 13130, 13134, 13138, 13142, + 13145, 13149, 13153, 13157, 13160, 13164, 13167, 13171, 13175, 13179, + 13182, 13185, 13188, 13192, 13195, 13199, 13203, 13207, 13211, 13215, + 13218, 13221, 13226, 13231, 13235, 13239, 13244, 13248, 13253, 13257, + 13262, 13267, 13273, 13279, 13285, 13289, 13294, 13300, 13306, 13310, + 13315, 13319, 13325, 13330, 13333, 13339, 13345, 13350, 13355, 13362, + 13367, 13372, 13376, 13380, 13384, 13388, 13392, 13396, 13400, 13404, + 13409, 13414, 13419, 13425, 13428, 13432, 13436, 13439, 13442, 13445, + 13448, 13451, 13454, 13457, 13460, 13463, 13467, 13474, 13479, 13483, + 13487, 13491, 13495, 13499, 13505, 13509, 13513, 13517, 13521, 13527, + 13531, 13535, 13539, 13544, 13549, 0, 13554, 13558, 13563, 13567, 13572, + 13576, 13581, 13586, 0, 0, 13591, 13595, 0, 0, 13600, 13604, 13609, + 13613, 13618, 13623, 13628, 13633, 13638, 13643, 13648, 13653, 13658, + 13663, 13668, 13673, 13678, 13683, 13687, 13692, 13697, 13702, 0, 13706, + 13710, 13715, 13720, 13725, 13729, 13733, 0, 13737, 0, 0, 0, 13741, + 13746, 13751, 13755, 0, 0, 13759, 13764, 13769, 13775, 13780, 13786, + 13791, 13797, 13803, 0, 0, 13810, 13815, 0, 0, 13821, 13826, 13832, + 13837, 0, 0, 0, 0, 0, 0, 0, 0, 13843, 0, 0, 0, 0, 13850, 13855, 0, 13860, + 13865, 13871, 13877, 13883, 0, 0, 13890, 13895, 13899, 13903, 13907, + 13911, 13915, 13919, 13923, 13927, 13931, 13940, 13950, 13955, 13960, + 13967, 13974, 13981, 13988, 14003, 14011, 14015, 14020, 14027, 14032, 0, + 0, 14037, 14044, 14049, 0, 14054, 14058, 14063, 14067, 14072, 14076, 0, + 0, 0, 0, 14081, 14086, 0, 0, 14091, 14096, 14101, 14105, 14110, 14115, + 14120, 14125, 14130, 14135, 14140, 14145, 14150, 14155, 14160, 14165, + 14170, 14175, 14179, 14184, 14189, 14194, 0, 14198, 14202, 14207, 14212, + 14217, 14221, 14225, 0, 14229, 14233, 0, 14238, 14243, 0, 14248, 14252, + 0, 0, 14256, 0, 14261, 14267, 14272, 14278, 14283, 0, 0, 0, 0, 14289, + 14295, 0, 0, 14301, 14307, 14313, 0, 0, 0, 14318, 0, 0, 0, 0, 0, 0, 0, + 14323, 14328, 14333, 14338, 0, 14343, 0, 0, 0, 0, 0, 0, 0, 14348, 14353, + 14357, 14361, 14365, 14369, 14373, 14377, 14381, 14385, 14389, 14393, + 14397, 14401, 14405, 14411, 14416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14421, + 14426, 14431, 0, 14436, 14440, 14445, 14449, 14454, 14458, 14463, 14468, + 14473, 0, 14479, 14483, 14488, 0, 14494, 14498, 14503, 14507, 14512, + 14517, 14522, 14527, 14532, 14537, 14542, 14547, 14552, 14557, 14562, + 14567, 14572, 14577, 14581, 14586, 14591, 14596, 0, 14600, 14604, 14609, + 14614, 14619, 14623, 14627, 0, 14631, 14635, 0, 14640, 14645, 14650, + 14655, 14659, 0, 0, 14663, 14668, 14673, 14679, 14684, 14690, 14695, + 14701, 14707, 14714, 0, 14721, 14726, 14732, 0, 14739, 14744, 14750, 0, + 0, 14755, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14759, 14765, + 14771, 14777, 0, 0, 14784, 14789, 14793, 14797, 14801, 14805, 14809, + 14813, 14817, 14821, 14825, 14830, 0, 0, 0, 0, 0, 0, 0, 14835, 14840, + 14845, 14850, 14855, 14863, 14871, 0, 14879, 14884, 14889, 0, 14894, + 14898, 14903, 14907, 14912, 14916, 14921, 14926, 0, 0, 14931, 14935, 0, + 0, 14940, 14944, 14949, 14953, 14958, 14963, 14968, 14973, 14978, 14983, + 14988, 14993, 14998, 15003, 15008, 15013, 15018, 15023, 15027, 15032, + 15037, 15042, 0, 15046, 15050, 15055, 15060, 15065, 15069, 15073, 0, + 15077, 15081, 0, 15086, 15091, 15096, 15101, 15105, 0, 0, 15109, 15114, + 15119, 15125, 15130, 15136, 15141, 15147, 15153, 0, 0, 15160, 15165, 0, + 0, 15171, 15176, 15182, 0, 0, 0, 0, 0, 0, 0, 0, 15187, 15194, 0, 0, 0, 0, + 15201, 15206, 0, 15211, 15216, 15222, 15228, 15234, 0, 0, 15241, 15246, + 15250, 15254, 15258, 15262, 15266, 15270, 15274, 15278, 15282, 15286, + 15291, 15297, 15303, 15309, 15315, 15321, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15327, 15331, 0, 15335, 15338, 15342, 15345, 15349, 15352, 0, 0, 0, + 15356, 15359, 15363, 0, 15367, 15370, 15374, 15378, 0, 0, 0, 15381, + 15385, 0, 15389, 0, 15393, 15397, 0, 0, 0, 15401, 15405, 0, 0, 0, 15408, + 15411, 15415, 0, 0, 0, 15418, 15421, 15424, 15427, 15431, 15434, 15438, + 15442, 15446, 15450, 15454, 15457, 0, 0, 0, 0, 15460, 15465, 15469, + 15474, 15478, 0, 0, 0, 15483, 15487, 15492, 0, 15497, 15501, 15506, + 15511, 0, 0, 15515, 0, 0, 0, 0, 0, 0, 15518, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 15524, 15528, 15531, 15534, 15537, 15540, 15543, 15546, + 15549, 15552, 15555, 15559, 15564, 15568, 15572, 15576, 15580, 15584, + 15588, 15593, 15597, 0, 0, 0, 0, 0, 15600, 15607, 15612, 15617, 15622, + 15629, 15633, 15638, 15642, 15647, 15651, 15656, 15661, 0, 15666, 15670, + 15675, 0, 15680, 15684, 15689, 15694, 15698, 15703, 15708, 15713, 15718, + 15723, 15728, 15733, 15738, 15743, 15748, 15753, 15758, 15763, 15768, + 15772, 15777, 15782, 15787, 0, 15791, 15795, 15800, 15805, 15810, 15814, + 15818, 15822, 15827, 15831, 15836, 15841, 15846, 15851, 15856, 15860, 0, + 0, 0, 15864, 15869, 15875, 15880, 15886, 15891, 15897, 15903, 0, 15910, + 15915, 15921, 0, 15927, 15932, 15938, 15944, 0, 0, 0, 0, 0, 0, 0, 15949, + 15954, 0, 15961, 15966, 15971, 0, 0, 0, 0, 0, 15976, 15982, 15988, 15994, + 0, 0, 16001, 16006, 16010, 16014, 16018, 16022, 16026, 16030, 16034, + 16038, 0, 0, 0, 0, 0, 0, 0, 16042, 16047, 16060, 16072, 16084, 16096, + 16108, 16120, 16132, 16137, 16144, 16149, 16154, 16159, 16164, 16168, + 16173, 16177, 16182, 16186, 16191, 16196, 0, 16201, 16205, 16210, 0, + 16215, 16219, 16224, 16229, 16233, 16238, 16243, 16248, 16253, 16258, + 16263, 16268, 16273, 16278, 16283, 16288, 16293, 16298, 16303, 16307, + 16312, 16317, 16322, 0, 16326, 16330, 16335, 16340, 16345, 16349, 16353, + 16357, 16362, 16366, 0, 16371, 16376, 16381, 16386, 16390, 0, 0, 16394, + 16399, 16404, 16410, 16415, 16421, 16426, 16432, 16438, 0, 16445, 16450, + 16456, 0, 16462, 16467, 16473, 16479, 0, 0, 0, 0, 0, 0, 0, 16484, 16489, + 0, 0, 0, 0, 0, 0, 0, 16496, 0, 16501, 16507, 16513, 16519, 0, 0, 16526, + 16531, 16535, 16539, 16543, 16547, 16551, 16555, 16559, 16563, 0, 16567, + 16572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16577, 16583, 16587, 16591, + 0, 16595, 16598, 16602, 16605, 16609, 16612, 16616, 16620, 0, 16624, + 16627, 16631, 0, 16635, 16638, 16642, 16646, 16649, 16653, 16657, 16661, + 16665, 16669, 16673, 16677, 16681, 16685, 16689, 16693, 16697, 16701, + 16705, 16708, 16712, 16716, 16720, 16723, 16727, 16730, 16734, 16738, + 16742, 16745, 16748, 16751, 16755, 16758, 16762, 16766, 16770, 16774, + 16778, 16781, 16784, 16788, 16795, 16801, 16805, 16810, 16814, 16819, + 16823, 16828, 16833, 0, 16839, 16843, 16848, 0, 16853, 16857, 16862, + 16867, 16871, 16876, 0, 0, 0, 0, 16880, 16886, 16892, 16898, 16904, + 16909, 16914, 16919, 16924, 16929, 16934, 16939, 16945, 16950, 16955, + 16960, 0, 0, 16966, 16970, 16973, 16976, 16979, 16982, 16985, 16988, + 16991, 16994, 16997, 17001, 17006, 17010, 17015, 17020, 17025, 17030, + 17035, 17040, 17044, 17050, 17056, 17062, 17067, 17073, 0, 0, 17079, + 17083, 0, 17087, 17091, 17095, 17099, 17103, 17107, 17111, 17115, 17119, + 17123, 17127, 17131, 17135, 17139, 17143, 17147, 17151, 17155, 0, 0, 0, + 17159, 17165, 17171, 17177, 17183, 17189, 17195, 17201, 17207, 17213, + 17219, 17225, 17233, 17239, 17245, 17251, 17257, 17263, 17269, 17275, + 17281, 17287, 17293, 17299, 0, 17305, 17311, 17317, 17323, 17329, 17335, + 17339, 17345, 17349, 0, 17353, 0, 0, 17359, 17363, 17369, 17375, 17381, + 17385, 17391, 0, 0, 0, 17395, 0, 0, 0, 0, 17399, 17404, 17411, 17418, + 17425, 17432, 0, 17439, 0, 17446, 17451, 17456, 17463, 17470, 17479, + 17490, 17499, 0, 0, 0, 0, 0, 0, 17504, 17510, 17515, 17520, 17525, 17530, + 17535, 17540, 17545, 17550, 0, 0, 17555, 17562, 17569, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 17574, 17581, 17588, 17595, 17602, 17609, 17616, 17623, + 17630, 17637, 17644, 17651, 17658, 17665, 17672, 17679, 17686, 17693, + 17700, 17707, 17714, 17721, 17728, 17735, 17742, 17749, 17756, 17763, + 17770, 17777, 17784, 17791, 17798, 17804, 17811, 17818, 17823, 17830, + 17835, 17842, 17849, 17856, 17863, 17870, 17877, 17883, 17890, 17895, + 17901, 17908, 17915, 17922, 17928, 17935, 17942, 17949, 17955, 17962, 0, + 0, 0, 0, 17967, 17974, 17980, 17987, 17993, 18002, 18011, 18016, 18021, + 18026, 18033, 18040, 18047, 18054, 18059, 18064, 18069, 18074, 18079, + 18083, 18087, 18091, 18095, 18099, 18103, 18107, 18111, 18115, 18120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17903, 17908, 0, 17915, 0, 0, 17922, 17927, - 0, 17932, 0, 0, 17939, 0, 0, 0, 0, 0, 0, 17944, 17949, 17953, 17960, 0, - 17967, 17972, 17977, 17982, 17989, 17996, 18003, 0, 18010, 18015, 18020, - 0, 18027, 0, 18034, 0, 0, 18039, 18046, 0, 18053, 18057, 18064, 18068, - 18073, 18081, 18087, 18093, 18098, 18104, 18110, 18116, 18121, 0, 18127, - 18135, 18142, 0, 0, 18149, 18154, 18160, 18165, 18171, 0, 18177, 0, - 18182, 18189, 18196, 18203, 18210, 18215, 0, 0, 18219, 18224, 18228, - 18232, 18236, 18240, 18244, 18248, 18252, 18256, 0, 0, 18260, 18266, - 18272, 18279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18286, 18290, 18301, 18316, 18331, - 18341, 18352, 18365, 18376, 18382, 18390, 18400, 18406, 18414, 18418, - 18424, 18430, 18438, 18448, 18456, 18469, 18475, 18483, 18491, 18503, - 18510, 18518, 18526, 18534, 18542, 18550, 18558, 18568, 18572, 18575, - 18578, 18581, 18584, 18587, 18590, 18593, 18596, 18599, 18603, 18607, - 18611, 18615, 18619, 18623, 18627, 18631, 18635, 18640, 18646, 18656, - 18670, 18680, 18686, 18692, 18700, 18708, 18716, 18724, 18730, 18736, - 18739, 18743, 18747, 18751, 18755, 18759, 18763, 0, 18767, 18771, 18775, - 18779, 18783, 18787, 18791, 18795, 18799, 18803, 18807, 18810, 18813, - 18817, 18821, 18825, 18828, 18832, 18836, 18840, 18844, 18848, 18852, - 18856, 18860, 18863, 18866, 18869, 18873, 18877, 18880, 18883, 18886, - 18890, 18895, 18899, 0, 0, 0, 0, 18903, 18908, 18912, 18917, 18921, - 18926, 18931, 18937, 18942, 18948, 18952, 18957, 18961, 18966, 18976, - 18982, 18988, 18995, 19005, 19011, 19015, 19019, 19025, 19031, 19039, - 19045, 19053, 19061, 19069, 19079, 19087, 19097, 19102, 19108, 19114, - 19120, 19126, 19132, 19138, 0, 19144, 19150, 19156, 19162, 19168, 19174, - 19180, 19186, 19192, 19198, 19204, 19209, 19214, 19220, 19226, 19232, - 19237, 19243, 19249, 19255, 19261, 19267, 19273, 19279, 19285, 19290, - 19295, 19300, 19306, 19312, 19317, 19322, 19327, 19333, 19341, 19348, 0, - 19355, 19362, 19375, 19382, 19389, 19397, 19405, 19411, 19417, 19423, - 19433, 19438, 19444, 19454, 19464, 0, 19474, 19484, 19492, 19504, 19516, - 19522, 19536, 19551, 19556, 19561, 19569, 19577, 19585, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18125, 18130, 0, 18137, 0, 18144, + 18151, 18156, 18161, 18168, 0, 18175, 18182, 18187, 18194, 18201, 18208, + 18215, 18222, 18229, 18234, 18238, 18245, 18252, 18259, 18264, 18269, + 18274, 18281, 18288, 18295, 18302, 18309, 18314, 18319, 0, 18326, 0, + 18333, 18338, 18345, 18352, 18359, 18366, 18373, 18377, 18384, 18388, + 18393, 18401, 18407, 18413, 18418, 18424, 18430, 18436, 18441, 18447, + 18454, 18462, 18469, 0, 0, 18476, 18481, 18487, 18492, 18498, 0, 18504, + 0, 18509, 18516, 18523, 18530, 18537, 18542, 0, 0, 18546, 18551, 18555, + 18559, 18563, 18567, 18571, 18575, 18579, 18583, 0, 0, 18587, 18593, + 18599, 18606, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18613, 18617, 18628, 18643, 18658, + 18668, 18679, 18692, 18703, 18709, 18717, 18727, 18733, 18741, 18745, + 18751, 18757, 18765, 18775, 18783, 18796, 18802, 18810, 18818, 18830, + 18837, 18845, 18853, 18861, 18869, 18877, 18885, 18895, 18899, 18902, + 18905, 18908, 18911, 18914, 18917, 18920, 18923, 18926, 18930, 18934, + 18938, 18942, 18946, 18950, 18954, 18958, 18962, 18967, 18973, 18983, + 18997, 19007, 19013, 19019, 19027, 19035, 19043, 19051, 19057, 19063, + 19066, 19070, 19074, 19078, 19082, 19086, 19090, 0, 19094, 19098, 19102, + 19106, 19110, 19114, 19118, 19121, 19125, 19129, 19133, 19136, 19139, + 19143, 19147, 19151, 19154, 19158, 19162, 19166, 19170, 19174, 19178, + 19182, 19186, 19189, 19192, 19195, 19199, 19203, 19206, 19209, 19212, + 19216, 19221, 19225, 0, 0, 0, 0, 19229, 19234, 19238, 19243, 19247, + 19252, 19257, 19263, 19268, 19274, 19278, 19283, 19287, 19292, 19302, + 19308, 19314, 19321, 19331, 19337, 19341, 19345, 19351, 19357, 19365, + 19371, 19379, 19387, 19395, 19405, 19413, 19423, 19428, 19434, 19440, + 19446, 19452, 19458, 19464, 0, 19470, 19476, 19482, 19488, 19494, 19500, + 19506, 19511, 19517, 19523, 19529, 19534, 19539, 19545, 19551, 19557, + 19562, 19568, 19574, 19580, 19586, 19592, 19598, 19604, 19610, 19615, + 19620, 19625, 19631, 19637, 19642, 19647, 19652, 19658, 19666, 19673, 0, + 19680, 19687, 19700, 19707, 19714, 19722, 19730, 19736, 19742, 19748, + 19758, 19763, 19769, 19779, 19789, 0, 19799, 19809, 19817, 19829, 19841, + 19847, 19861, 19876, 19881, 19886, 19894, 19902, 19910, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 19593, 19596, 19600, 19604, 19608, 19612, 19616, - 19620, 19624, 19628, 19632, 19636, 19640, 19644, 19648, 19652, 19656, - 19660, 19664, 19668, 19672, 19675, 19678, 19682, 19686, 19690, 19693, - 19696, 19699, 19702, 19706, 19709, 19712, 19716, 19719, 19724, 19727, - 19731, 19734, 19738, 19741, 19746, 19749, 19753, 19760, 19765, 19769, - 19774, 19778, 19783, 19787, 19792, 19799, 19805, 19811, 19815, 19819, - 19823, 19827, 19831, 19837, 19843, 19850, 19856, 19861, 19865, 19868, - 19871, 19874, 19877, 19880, 19883, 19886, 19889, 19892, 19898, 19902, - 19906, 19910, 19914, 19918, 19922, 19926, 19930, 19935, 19939, 19944, - 19949, 19955, 19960, 19966, 19972, 19978, 19984, 19990, 19998, 20006, - 20014, 20022, 20031, 20040, 20051, 20061, 20071, 20082, 20093, 20103, - 20113, 20123, 20133, 20143, 20153, 20163, 20173, 20181, 20188, 20194, - 20201, 20206, 20212, 20218, 20224, 20230, 20236, 20242, 20247, 20253, - 20259, 20265, 20271, 20276, 20285, 20292, 20298, 20306, 20314, 20320, - 20326, 20332, 20338, 20346, 20354, 20364, 20372, 20380, 20386, 20391, - 20396, 20401, 20406, 20411, 20416, 20421, 20426, 20431, 20437, 20443, - 20449, 20456, 20461, 20467, 20472, 20477, 20482, 20487, 20492, 20497, - 20502, 20507, 20512, 20517, 20522, 20527, 20532, 20537, 20542, 20547, - 20552, 20557, 20562, 20567, 20572, 20577, 20582, 20587, 20592, 20597, - 20602, 20607, 20612, 20617, 20622, 20627, 20632, 20637, 20642, 20647, - 20652, 0, 20657, 0, 0, 0, 0, 0, 20662, 0, 0, 20667, 20671, 20675, 20679, - 20683, 20687, 20691, 20695, 20699, 20703, 20707, 20711, 20715, 20719, - 20723, 20727, 20731, 20735, 20739, 20743, 20747, 20751, 20755, 20759, - 20763, 20767, 20771, 20775, 20779, 20783, 20787, 20791, 20795, 20799, - 20803, 20807, 20811, 20815, 20819, 20823, 20827, 20831, 20837, 20841, - 20846, 20851, 20855, 20860, 20865, 20869, 20873, 20877, 20881, 20885, - 20889, 20893, 20897, 20901, 20905, 20909, 20913, 20917, 20921, 20925, - 20929, 20933, 20937, 20941, 20945, 20949, 20953, 20957, 20961, 20965, - 20969, 20973, 20977, 20981, 20985, 20989, 20993, 20997, 21001, 21005, - 21009, 21013, 21017, 21021, 21025, 21029, 21033, 21037, 21041, 21045, - 21049, 21053, 21057, 21061, 21065, 21069, 21073, 21077, 21081, 21085, - 21089, 21093, 21097, 21101, 21105, 21109, 21113, 21117, 21121, 21125, - 21129, 21133, 21137, 21141, 21145, 21149, 21153, 21157, 21161, 21165, - 21169, 21173, 21177, 21181, 21185, 21189, 21193, 21197, 21201, 21205, - 21209, 21213, 21217, 21221, 21225, 21229, 21233, 21237, 21241, 21245, - 21249, 21254, 21258, 21263, 21267, 21272, 21277, 21281, 21286, 21291, - 21295, 21300, 21305, 21310, 21315, 21319, 21324, 21329, 21334, 21339, - 21344, 21349, 21353, 21358, 21363, 21368, 21373, 21378, 21383, 21388, - 21393, 21398, 21403, 21408, 21413, 21418, 21423, 21428, 21433, 21438, - 21443, 21448, 21453, 21458, 21463, 21468, 21473, 21478, 21483, 21488, - 21493, 21498, 21503, 21508, 21513, 21518, 21523, 21528, 21533, 21538, - 21543, 21548, 21553, 21558, 21563, 21568, 21573, 21578, 21583, 21588, - 21593, 21598, 21603, 21607, 21611, 21615, 21619, 21623, 21627, 21631, - 21635, 21639, 21643, 21647, 21651, 21655, 21659, 21663, 21667, 21671, - 21675, 21679, 21683, 21687, 21691, 21695, 21699, 21703, 21707, 21711, - 21715, 21719, 21723, 21727, 21731, 21735, 21739, 21743, 21747, 21751, - 21755, 21759, 21763, 21767, 21771, 21775, 21779, 21783, 21787, 21791, - 21795, 21799, 21803, 21807, 21811, 21815, 21819, 21823, 21827, 21831, - 21835, 21839, 21843, 21847, 21851, 21855, 21859, 21863, 21867, 21871, - 21875, 21879, 21883, 21887, 21891, 21895, 21899, 21903, 21907, 21911, - 21915, 21919, 21923, 21927, 21931, 21935, 21939, 21943, 21947, 21951, - 21955, 21958, 21962, 21966, 21970, 21974, 21978, 21982, 21986, 21989, - 21993, 21997, 22001, 22005, 22009, 22013, 22017, 22021, 22025, 22029, - 22033, 22037, 22041, 22045, 22049, 22052, 22056, 22060, 22064, 22068, - 22072, 22076, 22080, 22084, 22088, 22092, 22096, 22100, 22104, 22108, - 22112, 22115, 22119, 22123, 22127, 22131, 22135, 22139, 22143, 22146, - 22150, 22154, 22158, 22162, 22166, 22170, 22174, 22178, 22182, 22186, - 22190, 22194, 22198, 22202, 22206, 22210, 22214, 22218, 22222, 22226, - 22230, 22234, 22238, 0, 22242, 22246, 22250, 22254, 0, 0, 22258, 22262, - 22266, 22270, 22274, 22278, 22282, 0, 22286, 0, 22290, 22294, 22298, - 22302, 0, 0, 22306, 22310, 22314, 22318, 22322, 22326, 22330, 22334, - 22338, 22342, 22346, 22350, 22354, 22358, 22362, 22366, 22370, 22374, - 22378, 22382, 22386, 22390, 22394, 22397, 22401, 22405, 22409, 22413, - 22417, 22421, 22425, 22429, 22433, 22437, 22441, 22445, 22449, 22453, - 22457, 22461, 22465, 0, 22469, 22473, 22477, 22481, 0, 0, 22485, 22488, - 22492, 22496, 22500, 22504, 22508, 22512, 22516, 22520, 22524, 22528, - 22532, 22536, 22540, 22544, 22548, 22553, 22558, 22563, 22569, 22575, - 22580, 22585, 22591, 22594, 22598, 22602, 22606, 22610, 22614, 22618, - 22622, 0, 22626, 22630, 22634, 22638, 0, 0, 22642, 22646, 22650, 22654, - 22658, 22662, 22666, 0, 22670, 0, 22674, 22678, 22682, 22686, 0, 0, - 22690, 22694, 22698, 22702, 22706, 22710, 22714, 22718, 22722, 22727, - 22732, 22737, 22743, 22749, 22754, 0, 22759, 22763, 22767, 22771, 22775, - 22779, 22783, 22787, 22791, 22795, 22799, 22803, 22807, 22811, 22815, - 22819, 22823, 22826, 22830, 22834, 22838, 22842, 22846, 22850, 22854, - 22858, 22862, 22866, 22870, 22874, 22878, 22882, 22886, 22890, 22894, - 22898, 22902, 22906, 22910, 22914, 22918, 22922, 22926, 22930, 22934, - 22938, 22942, 22946, 22950, 22954, 22958, 22962, 22966, 22970, 22974, - 22978, 22982, 0, 22986, 22990, 22994, 22998, 0, 0, 23002, 23006, 23010, - 23014, 23018, 23022, 23026, 23030, 23034, 23038, 23042, 23046, 23050, - 23054, 23058, 23062, 23066, 23070, 23074, 23078, 23082, 23086, 23090, - 23094, 23098, 23102, 23106, 23110, 23114, 23118, 23122, 23126, 23130, - 23134, 23138, 23142, 23146, 23150, 23154, 23158, 23162, 23166, 23170, - 23174, 23178, 23182, 23186, 23190, 23194, 23198, 23202, 23206, 23210, - 23214, 23218, 23222, 23226, 23229, 23233, 23237, 23241, 23245, 23249, - 23253, 23257, 23261, 23265, 0, 0, 23269, 23278, 23284, 23289, 23293, - 23296, 23301, 23304, 23307, 23310, 23315, 23319, 23324, 23327, 23330, - 23333, 23336, 23339, 23342, 23345, 23348, 23351, 23355, 23359, 23363, - 23367, 23371, 23375, 23379, 23383, 23387, 23391, 0, 0, 0, 23397, 23403, - 23407, 23411, 23415, 23421, 23425, 23429, 23433, 23439, 23443, 23447, - 23451, 23457, 23461, 23465, 23469, 23475, 23481, 23487, 23495, 23501, - 23507, 23513, 23519, 23525, 0, 0, 0, 0, 0, 0, 23531, 23534, 23537, 23540, - 23543, 23546, 23550, 23554, 23557, 23561, 23565, 23569, 23573, 23577, - 23580, 23584, 23588, 23592, 23596, 23600, 23603, 23607, 23611, 23615, - 23619, 23623, 23626, 23630, 23634, 23638, 23642, 23645, 23649, 23653, - 23657, 23661, 23665, 23669, 23673, 23677, 23681, 23685, 23689, 23693, - 23697, 23700, 23704, 23708, 23712, 23716, 23720, 23724, 23728, 23732, - 23736, 23740, 23744, 23748, 23752, 23756, 23760, 23764, 23768, 23772, - 23776, 23780, 23784, 23788, 23792, 23796, 23800, 23804, 23808, 23812, - 23816, 23820, 23824, 23828, 23832, 23836, 23839, 23843, 23847, 23851, - 23855, 23859, 0, 0, 23863, 23868, 23873, 23878, 23883, 23888, 0, 0, - 23893, 23897, 23900, 23904, 23907, 23911, 23914, 23918, 23924, 23929, - 23933, 23936, 23940, 23944, 23950, 23954, 23960, 23964, 23970, 23974, - 23980, 23984, 23990, 23996, 24000, 24006, 24010, 24016, 24022, 24026, - 24032, 24038, 24042, 24047, 24055, 24063, 24070, 24075, 24080, 24089, - 24095, 24103, 24108, 24114, 24118, 24122, 24126, 24130, 24134, 24138, - 24142, 24146, 24150, 24154, 24160, 24165, 24170, 24173, 24177, 24181, - 24187, 24191, 24197, 24201, 24207, 24211, 24217, 24221, 24227, 24231, - 24237, 24241, 24247, 24253, 24257, 24263, 24268, 24272, 24276, 24280, - 24284, 24287, 24291, 24297, 24302, 24307, 24311, 24315, 24319, 24325, - 24329, 24335, 24339, 24345, 24348, 24353, 24357, 24363, 24367, 24373, - 24377, 24383, 24389, 24393, 24397, 24401, 24405, 24409, 24413, 24417, - 24421, 24425, 24429, 24433, 24439, 24442, 24446, 24450, 24456, 24460, - 24466, 24470, 24476, 24480, 24486, 24490, 24496, 24500, 24506, 24510, - 24516, 24522, 24526, 24530, 24536, 24542, 24548, 24554, 24558, 24562, - 24566, 24570, 24574, 24578, 24584, 24588, 24592, 24596, 24602, 24606, - 24612, 24616, 24622, 24626, 24632, 24636, 24642, 24646, 24652, 24656, - 24662, 24668, 24672, 24678, 24682, 24686, 24690, 24694, 24698, 24702, - 24708, 24711, 24715, 24719, 24725, 24729, 24735, 24739, 24745, 24749, - 24755, 24759, 24765, 24769, 24775, 24779, 24785, 24791, 24795, 24801, - 24805, 24811, 24817, 24821, 24825, 24829, 24833, 24837, 24841, 24847, - 24850, 24854, 24858, 24864, 24868, 24874, 24878, 24884, 24890, 24894, - 24899, 24903, 24907, 24911, 24915, 24919, 24923, 24927, 24933, 24936, - 24940, 24944, 24950, 24954, 24960, 24964, 24970, 24974, 24980, 24984, - 24990, 24994, 25000, 25004, 25010, 25013, 25018, 25023, 25027, 25031, - 25035, 25039, 25043, 25047, 25053, 25056, 25060, 25064, 25070, 25074, - 25080, 25084, 25090, 25094, 25100, 25104, 25110, 25114, 25120, 25124, - 25130, 25136, 25140, 25146, 25150, 25156, 25162, 25168, 25174, 25180, - 25186, 25192, 25198, 25202, 25206, 25210, 25214, 25218, 25222, 25226, - 25230, 25236, 25240, 25246, 25250, 25256, 25260, 25266, 25270, 25276, - 25280, 25286, 25290, 25296, 25300, 25304, 25308, 25312, 25316, 25320, - 25324, 25330, 25333, 25337, 25341, 25347, 25351, 25357, 25361, 25367, - 25371, 25377, 25381, 25387, 25391, 25397, 25401, 25407, 25413, 25417, - 25423, 25429, 25435, 25439, 25445, 25451, 25455, 25459, 25463, 25467, - 25471, 25477, 25480, 25484, 25489, 25493, 25499, 25502, 25507, 25512, - 25516, 25520, 25524, 25528, 25532, 25536, 25540, 25544, 25548, 25554, - 25558, 25562, 25568, 25572, 25578, 25582, 25588, 25592, 25596, 25600, - 25604, 25608, 25614, 25618, 25622, 25626, 25630, 25634, 25638, 25642, - 25646, 25650, 25654, 25660, 25666, 25672, 25678, 25684, 25689, 25695, - 25701, 25707, 25711, 25715, 25719, 25723, 25727, 25731, 25735, 25739, - 25743, 25747, 25751, 25755, 25759, 25765, 25771, 25777, 25782, 25786, - 25790, 25794, 25798, 25802, 25806, 25810, 25814, 25818, 25824, 25830, - 25836, 25842, 25848, 25854, 25860, 25866, 25872, 25876, 25880, 25884, - 25888, 25892, 25896, 25900, 25906, 25912, 25918, 25924, 25930, 25936, - 25942, 25948, 25954, 25959, 25964, 25969, 25974, 25980, 25986, 25992, - 25998, 26004, 26010, 26016, 26021, 26027, 26033, 26039, 26044, 26050, - 26056, 26062, 26067, 26072, 26077, 26082, 26087, 26092, 26097, 26102, - 26107, 26112, 26117, 26122, 26126, 26131, 26136, 26141, 26146, 26151, - 26156, 26161, 26166, 26171, 26176, 26181, 26186, 26191, 26196, 26201, - 26206, 26211, 26216, 26221, 26226, 26231, 26236, 26241, 26246, 26251, - 26256, 26261, 26266, 26271, 26275, 26280, 26285, 26290, 26295, 26300, - 26305, 26310, 26315, 26320, 26325, 26330, 26335, 26340, 26345, 26350, - 26355, 26360, 26365, 26370, 26375, 26380, 26385, 26390, 26395, 26400, - 26404, 26409, 26414, 26419, 26424, 26429, 26433, 26438, 26443, 26448, - 26453, 26458, 26462, 26467, 26473, 26478, 26483, 26488, 26493, 26499, - 26504, 26509, 26514, 26519, 26524, 26529, 26534, 26539, 26544, 26549, - 26554, 26559, 26563, 26568, 26573, 26578, 26583, 26588, 26593, 26598, - 26603, 26608, 26613, 26618, 26623, 26628, 26633, 26638, 26643, 26648, - 26653, 26658, 26663, 26668, 26673, 26678, 26683, 26688, 26693, 26698, - 26703, 26708, 26713, 26718, 26724, 26729, 26734, 26739, 26744, 26749, - 26754, 26759, 26764, 26769, 26774, 26779, 26783, 26788, 26793, 26798, - 26803, 26808, 26813, 26818, 26823, 26828, 26833, 26838, 26843, 26848, - 26853, 26858, 26863, 26868, 26873, 26878, 26883, 26888, 26893, 26898, - 26903, 26908, 26913, 26919, 26923, 26927, 26931, 26935, 26939, 26943, - 26947, 26951, 26957, 26963, 26969, 26975, 26981, 26987, 26993, 27000, - 27006, 27011, 27016, 27021, 27026, 27031, 27036, 27041, 27046, 27051, - 27056, 27061, 27066, 27071, 27076, 27081, 27086, 27091, 27096, 27101, - 27106, 27111, 27116, 27121, 27126, 27131, 27136, 27141, 27146, 0, 0, 0, - 27153, 27164, 27169, 27177, 27182, 27187, 27192, 27201, 27206, 27212, - 27218, 27224, 27229, 27235, 27241, 27245, 27250, 27255, 27265, 27270, - 27275, 27282, 27287, 27292, 27301, 27306, 27315, 27322, 27329, 27336, - 27343, 27354, 27361, 27366, 27376, 27380, 27387, 27392, 27399, 27405, - 27412, 27421, 27428, 27435, 27444, 27451, 27456, 27461, 27472, 27479, - 27484, 27495, 27502, 27507, 27512, 27520, 27529, 27536, 27543, 27553, - 27558, 27563, 27568, 27577, 27585, 27590, 27595, 27600, 27605, 27610, - 27615, 27620, 27625, 27630, 27635, 27640, 27646, 27652, 27658, 27663, - 27668, 27673, 27678, 27683, 27688, 27697, 27706, 27715, 27724, 0, 0, 0, - 0, 0, 0, 0, 27733, 27737, 27741, 27745, 27749, 27754, 27759, 27764, - 27769, 27773, 27777, 27782, 27786, 0, 27790, 27794, 27799, 27803, 27807, - 27812, 27817, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27822, 27826, 27830, - 27834, 27838, 27843, 27848, 27853, 27858, 27862, 27866, 27871, 27875, - 27879, 27883, 27887, 27892, 27896, 27900, 27905, 27910, 27915, 27921, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 27926, 27930, 27934, 27938, 27942, 27947, 27952, - 27957, 27962, 27966, 27970, 27975, 27979, 27983, 27987, 27991, 27996, - 28000, 28004, 28009, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28014, 28018, - 28022, 28026, 28030, 28035, 28040, 28045, 28050, 28054, 28058, 28063, - 28067, 0, 28071, 28075, 28080, 0, 28084, 28089, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 28094, 28097, 28101, 28105, 28109, 28113, 28117, 28121, - 28125, 28129, 28133, 28137, 28141, 28145, 28149, 28153, 28157, 28161, - 28164, 28168, 28172, 28176, 28180, 28184, 28188, 28192, 28196, 28200, - 28204, 28208, 28212, 28216, 28219, 28222, 28225, 28229, 28235, 28241, - 28247, 28253, 28259, 28265, 28271, 28277, 28283, 28289, 28295, 28301, - 28307, 28313, 28322, 28331, 28337, 28343, 28349, 28354, 28358, 28363, - 28368, 28373, 28377, 28382, 28387, 28392, 28396, 28401, 28405, 28410, - 28415, 28420, 28425, 28429, 28433, 28437, 28441, 28445, 28449, 28453, - 28457, 28461, 28465, 28471, 28475, 28479, 28483, 28487, 28491, 28499, - 28505, 28509, 28515, 28519, 28525, 28529, 0, 0, 28533, 28537, 28540, - 28543, 28546, 28549, 28552, 28555, 28558, 28561, 0, 0, 0, 0, 0, 0, 28564, - 28572, 28580, 28588, 28596, 28604, 28612, 28620, 28628, 28636, 0, 0, 0, - 0, 0, 0, 28644, 28647, 28650, 28653, 28658, 28661, 28666, 28673, 28681, - 28686, 28693, 28696, 28703, 28710, 28717, 0, 28721, 28725, 28728, 28731, - 28734, 28737, 28740, 28743, 28746, 28749, 0, 0, 0, 0, 0, 0, 28752, 28755, - 28758, 28761, 28764, 28767, 28771, 28775, 28779, 28782, 28786, 28790, - 28793, 28797, 28801, 28804, 28807, 28810, 28814, 28818, 28822, 28826, - 28830, 28833, 28836, 28840, 28844, 28847, 28851, 28855, 28859, 28863, - 28867, 28871, 28875, 28879, 28886, 28891, 28896, 28901, 28906, 28912, - 28918, 28924, 28930, 28935, 28941, 28947, 28952, 28958, 28964, 28970, - 28976, 28982, 28987, 28993, 28998, 29004, 29010, 29016, 29022, 29028, - 29033, 29038, 29044, 29050, 29055, 29061, 29066, 29072, 29077, 29082, - 29088, 29094, 29100, 29106, 29112, 29118, 29124, 29130, 29136, 29142, - 29148, 29154, 29159, 29164, 29169, 29175, 29181, 0, 0, 0, 0, 0, 0, 0, - 29189, 29198, 29207, 29215, 29223, 29233, 29241, 29250, 29257, 29264, - 29271, 29279, 29287, 29295, 29303, 29311, 29319, 29327, 29335, 29342, - 29350, 29358, 29366, 29374, 29382, 29392, 29402, 29412, 29422, 29432, - 29442, 29452, 29462, 29472, 29482, 29492, 29502, 29512, 29522, 29530, - 29538, 29548, 29556, 0, 0, 0, 0, 0, 29566, 29570, 29574, 29578, 29582, - 29586, 29590, 29594, 29598, 29602, 29606, 29610, 29614, 29618, 29622, - 29626, 29630, 29634, 29638, 29642, 29646, 29650, 29654, 29658, 29664, - 29668, 29674, 29678, 29684, 29688, 29694, 29698, 29702, 29706, 29710, - 29714, 29718, 29724, 29730, 29736, 29742, 29748, 29754, 29760, 29766, - 29772, 29778, 29784, 29791, 29797, 29803, 29809, 29813, 29817, 29821, - 29825, 29829, 29833, 29837, 29843, 29849, 29855, 29860, 29867, 29872, - 29877, 29883, 29888, 29895, 29902, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29909, - 29915, 29919, 29924, 29929, 29934, 29939, 29944, 29949, 29954, 29959, - 29964, 29969, 29974, 29979, 29984, 29988, 29992, 29997, 30002, 30007, - 30011, 30015, 30019, 30023, 30028, 30033, 30038, 30042, 30046, 30051, 0, - 30056, 30061, 30066, 30071, 30077, 30083, 30089, 30095, 30100, 30105, - 30111, 30117, 0, 0, 0, 0, 30124, 30129, 30135, 30141, 30147, 30152, - 30157, 30162, 30167, 30172, 30177, 30182, 0, 0, 0, 0, 30187, 0, 0, 0, - 30192, 30197, 30202, 30207, 30211, 30215, 30219, 30223, 30227, 30231, - 30235, 30239, 30243, 30248, 30254, 30260, 30266, 30271, 30276, 30282, - 30288, 30293, 30298, 30304, 30309, 30315, 30321, 30326, 30332, 30338, - 30344, 30349, 30354, 30359, 30365, 30371, 30376, 30382, 30387, 30393, - 30398, 30404, 0, 0, 30410, 30416, 30422, 30428, 30434, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 30440, 30449, 30458, 30466, 30475, 30484, 30492, 30501, - 30510, 30519, 30527, 30535, 30544, 30552, 30560, 30569, 30578, 30586, - 30595, 30604, 30612, 30620, 30629, 30637, 30645, 30654, 30662, 30671, - 30680, 30688, 30697, 30706, 30714, 30722, 30731, 30740, 30748, 30757, - 30766, 30775, 30784, 30793, 30802, 30811, 0, 0, 0, 0, 30820, 30830, - 30839, 30848, 30856, 30865, 30873, 30882, 30890, 30899, 30908, 30917, - 30926, 30935, 30944, 30953, 30962, 30971, 30980, 30989, 30998, 31007, - 31016, 31025, 31034, 31042, 0, 0, 0, 0, 0, 0, 31050, 31058, 31065, 31072, - 31079, 31086, 31093, 31100, 31107, 31114, 31121, 0, 0, 0, 31129, 31137, - 31145, 31149, 31155, 31161, 31167, 31173, 31179, 31185, 31191, 31197, - 31203, 31209, 31215, 31221, 31227, 31233, 31239, 31243, 31249, 31255, - 31261, 31267, 31273, 31279, 31285, 31291, 31297, 31303, 31309, 31315, - 31321, 31327, 31333, 31337, 31342, 31347, 31352, 31356, 31361, 31365, - 31370, 31375, 31380, 31384, 31389, 31394, 31399, 31404, 31409, 31413, - 31417, 31421, 31426, 31430, 31434, 31438, 31443, 31448, 31453, 31458, 0, - 0, 31464, 31468, 31475, 31480, 31486, 31492, 31497, 31503, 31509, 31514, - 31520, 31526, 31532, 31537, 31543, 31548, 31553, 31559, 31564, 31570, - 31575, 31581, 31587, 31593, 31599, 31603, 31608, 31613, 31619, 31625, - 31630, 31636, 31642, 31646, 31651, 31656, 31660, 31665, 31669, 31674, - 31679, 31685, 31691, 31696, 31701, 31706, 31710, 31715, 31719, 31724, - 31728, 31733, 31738, 31743, 31748, 31754, 31761, 31768, 31778, 31787, - 31794, 31800, 31811, 31816, 31822, 0, 31827, 31832, 31837, 31845, 31851, - 31859, 31864, 31870, 31876, 31882, 31887, 31893, 31898, 31905, 31911, - 31916, 31922, 31928, 31934, 31941, 31948, 31955, 31960, 31965, 31972, - 31979, 31986, 31993, 32000, 0, 0, 32007, 32014, 32021, 32027, 32033, - 32039, 32045, 32051, 32057, 32063, 32069, 0, 0, 0, 0, 0, 0, 32075, 32081, - 32086, 32091, 32096, 32101, 32106, 32111, 32116, 32121, 0, 0, 0, 0, 0, 0, - 32126, 32131, 32136, 32141, 32146, 32151, 32156, 32165, 32172, 32177, - 32182, 32187, 32192, 32197, 0, 0, 32202, 32209, 32212, 32215, 32219, - 32224, 32228, 32234, 32238, 32243, 32250, 32258, 32262, 32267, 32271, 0, + 0, 0, 0, 0, 0, 0, 0, 19918, 19921, 19925, 19929, 19933, 19937, 19941, + 19945, 19949, 19953, 19957, 19961, 19965, 19969, 19973, 19977, 19981, + 19984, 19988, 19992, 19996, 19999, 20002, 20006, 20010, 20014, 20017, + 20020, 20023, 20026, 20030, 20033, 20036, 20040, 20043, 20048, 20051, + 20055, 20058, 20062, 20065, 20070, 20073, 20077, 20084, 20089, 20093, + 20098, 20102, 20107, 20111, 20116, 20123, 20129, 20135, 20139, 20143, + 20147, 20151, 20155, 20161, 20167, 20174, 20180, 20185, 20189, 20192, + 20195, 20198, 20201, 20204, 20207, 20210, 20213, 20216, 20222, 20226, + 20230, 20234, 20238, 20242, 20246, 20250, 20254, 20259, 20263, 20268, + 20273, 20279, 20284, 20290, 20296, 20302, 20308, 20314, 20322, 20330, + 20338, 20346, 20355, 20364, 20375, 20385, 20395, 20406, 20417, 20427, + 20437, 20447, 20457, 20467, 20477, 20487, 20497, 20505, 20512, 20518, + 20525, 20530, 20536, 20542, 20548, 20554, 20560, 20566, 20571, 20577, + 20583, 20589, 20595, 20600, 20609, 20616, 20622, 20630, 20638, 20644, + 20650, 20656, 20662, 20670, 20678, 20688, 20696, 20704, 20710, 20715, + 20720, 20725, 20730, 20735, 20740, 20745, 20750, 20755, 20761, 20767, + 20773, 20780, 20785, 20791, 20796, 20801, 20806, 20811, 20816, 20821, + 20826, 20831, 20836, 20841, 20846, 20851, 20856, 20861, 20866, 20871, + 20876, 20881, 20886, 20891, 20896, 20901, 20906, 20911, 20916, 20921, + 20926, 20931, 20936, 20941, 20946, 20951, 20956, 20961, 20966, 20971, + 20976, 0, 20981, 0, 0, 0, 0, 0, 20986, 0, 0, 20991, 20995, 20999, 21003, + 21007, 21011, 21015, 21019, 21023, 21027, 21031, 21035, 21039, 21043, + 21047, 21051, 21055, 21059, 21063, 21067, 21071, 21075, 21079, 21083, + 21087, 21091, 21095, 21099, 21103, 21107, 21111, 21115, 21119, 21123, + 21127, 21131, 21135, 21139, 21143, 21147, 21151, 21155, 21160, 21164, + 21169, 21174, 21178, 21183, 21188, 21192, 21196, 21200, 21204, 21208, + 21212, 21216, 21220, 21224, 21228, 21232, 21236, 21240, 21244, 21248, + 21252, 21256, 21260, 21264, 21268, 21272, 21276, 21280, 21284, 21288, + 21292, 21296, 21300, 21304, 21308, 21312, 21316, 21320, 21324, 21328, + 21332, 21336, 21340, 21344, 21348, 21352, 21356, 21360, 21364, 21368, + 21372, 21376, 21380, 21384, 21388, 21392, 21396, 21400, 21404, 21408, + 21412, 21416, 21420, 21424, 21428, 21432, 21436, 21440, 21444, 21448, + 21452, 21456, 21460, 21464, 21468, 21472, 21476, 21480, 21484, 21488, + 21492, 21496, 21500, 21504, 21508, 21512, 21516, 21520, 21524, 21528, + 21532, 21536, 21540, 21544, 21548, 21552, 21556, 21560, 21564, 21568, + 21572, 21577, 21581, 21586, 21590, 21595, 21600, 21604, 21609, 21614, + 21618, 21623, 21628, 21633, 21638, 21642, 21647, 21652, 21657, 21662, + 21667, 21672, 21676, 21681, 21686, 21691, 21696, 21701, 21706, 21711, + 21716, 21721, 21726, 21731, 21736, 21741, 21746, 21751, 21756, 21761, + 21766, 21771, 21776, 21781, 21786, 21791, 21796, 21801, 21806, 21811, + 21816, 21821, 21826, 21831, 21836, 21841, 21846, 21851, 21856, 21861, + 21866, 21871, 21876, 21881, 21886, 21891, 21896, 21901, 21906, 21911, + 21916, 21921, 21926, 21930, 21934, 21938, 21942, 21946, 21950, 21954, + 21958, 21962, 21966, 21970, 21974, 21978, 21982, 21986, 21990, 21994, + 21998, 22002, 22006, 22010, 22014, 22018, 22022, 22026, 22030, 22034, + 22038, 22042, 22046, 22050, 22054, 22058, 22062, 22066, 22070, 22074, + 22078, 22082, 22086, 22090, 22094, 22098, 22102, 22106, 22110, 22114, + 22118, 22122, 22126, 22130, 22134, 22138, 22142, 22146, 22150, 22154, + 22158, 22162, 22166, 22170, 22174, 22178, 22182, 22186, 22190, 22194, + 22198, 22202, 22206, 22210, 22214, 22218, 22222, 22226, 22230, 22234, + 22238, 22242, 22246, 22250, 22254, 22258, 22262, 22266, 22270, 22274, + 22278, 22281, 22285, 22289, 22293, 22297, 22301, 22305, 22309, 22312, + 22316, 22320, 22324, 22328, 22332, 22336, 22340, 22344, 22348, 22352, + 22356, 22360, 22364, 22368, 22372, 22375, 22379, 22383, 22387, 22391, + 22395, 22399, 22403, 22407, 22411, 22415, 22419, 22423, 22427, 22431, + 22435, 22438, 22442, 22446, 22450, 22454, 22458, 22462, 22466, 22469, + 22473, 22477, 22481, 22485, 22489, 22493, 22497, 22501, 22505, 22509, + 22513, 22517, 22521, 22525, 22529, 22533, 22537, 22541, 22545, 22549, + 22553, 22557, 22561, 0, 22565, 22569, 22573, 22577, 0, 0, 22581, 22585, + 22589, 22593, 22597, 22601, 22605, 0, 22609, 0, 22613, 22617, 22621, + 22625, 0, 0, 22629, 22633, 22637, 22641, 22645, 22649, 22653, 22657, + 22661, 22665, 22669, 22673, 22677, 22681, 22685, 22689, 22693, 22696, + 22700, 22704, 22708, 22712, 22716, 22719, 22723, 22727, 22731, 22735, + 22739, 22743, 22747, 22751, 22755, 22759, 22763, 22767, 22771, 22775, + 22779, 22783, 22787, 0, 22791, 22795, 22799, 22803, 0, 0, 22807, 22810, + 22814, 22818, 22822, 22826, 22830, 22834, 22838, 22842, 22846, 22850, + 22854, 22858, 22862, 22866, 22870, 22875, 22880, 22885, 22891, 22897, + 22902, 22907, 22913, 22916, 22920, 22924, 22928, 22932, 22936, 22940, + 22944, 0, 22948, 22952, 22956, 22960, 0, 0, 22964, 22968, 22972, 22976, + 22980, 22984, 22988, 0, 22992, 0, 22996, 23000, 23004, 23008, 0, 0, + 23012, 23016, 23020, 23024, 23028, 23032, 23036, 23040, 23044, 23049, + 23054, 23059, 23065, 23071, 23076, 0, 23081, 23085, 23089, 23093, 23097, + 23101, 23105, 23109, 23113, 23117, 23121, 23125, 23129, 23133, 23137, + 23141, 23145, 23148, 23152, 23156, 23160, 23164, 23168, 23172, 23176, + 23180, 23184, 23188, 23192, 23196, 23200, 23204, 23208, 23212, 23216, + 23220, 23224, 23228, 23232, 23236, 23240, 23244, 23248, 23252, 23256, + 23260, 23264, 23268, 23272, 23276, 23280, 23284, 23288, 23292, 23296, + 23300, 23304, 0, 23308, 23312, 23316, 23320, 0, 0, 23324, 23328, 23332, + 23336, 23340, 23344, 23348, 23352, 23356, 23360, 23364, 23368, 23372, + 23376, 23380, 23384, 23388, 23392, 23396, 23400, 23404, 23408, 23412, + 23416, 23420, 23424, 23428, 23432, 23436, 23440, 23444, 23448, 23452, + 23456, 23460, 23464, 23468, 23472, 23476, 23480, 23484, 23488, 23492, + 23496, 23500, 23504, 23508, 23512, 23516, 23520, 23524, 23528, 23532, + 23536, 23540, 23544, 23548, 23551, 23555, 23559, 23563, 23567, 23571, + 23575, 23579, 23583, 23587, 0, 0, 23591, 23600, 23606, 23611, 23615, + 23618, 23623, 23626, 23629, 23632, 23637, 23641, 23646, 23649, 23652, + 23655, 23658, 23661, 23664, 23667, 23670, 23673, 23677, 23681, 23685, + 23689, 23693, 23697, 23701, 23705, 23709, 23713, 0, 0, 0, 23718, 23724, + 23728, 23732, 23736, 23742, 23746, 23750, 23754, 23760, 23764, 23768, + 23772, 23778, 23782, 23786, 23790, 23796, 23802, 23808, 23816, 23822, + 23828, 23834, 23840, 23846, 0, 0, 0, 0, 0, 0, 23852, 23855, 23858, 23861, + 23864, 23867, 23871, 23875, 23878, 23882, 23886, 23890, 23894, 23898, + 23901, 23905, 23909, 23913, 23917, 23921, 23924, 23928, 23932, 23936, + 23940, 23944, 23947, 23951, 23955, 23959, 23963, 23966, 23970, 23974, + 23978, 23982, 23986, 23990, 23994, 23998, 24002, 24006, 24010, 24014, + 24018, 24021, 24025, 24029, 24033, 24037, 24041, 24045, 24049, 24052, + 24056, 24060, 24064, 24068, 24072, 24076, 24080, 24084, 24088, 24092, + 24096, 24100, 24104, 24108, 24112, 24116, 24120, 24124, 24128, 24132, + 24136, 24140, 24144, 24148, 24152, 24156, 24159, 24163, 24167, 24171, + 24175, 24179, 0, 0, 24183, 24188, 24193, 24198, 24203, 24208, 0, 0, + 24213, 24217, 24220, 24224, 24227, 24231, 24234, 24238, 24244, 24249, + 24253, 24256, 24260, 24264, 24270, 24274, 24280, 24284, 24290, 24294, + 24300, 24304, 24310, 24316, 24320, 24326, 24330, 24336, 24342, 24346, + 24352, 24358, 24362, 24367, 24375, 24383, 24390, 24395, 24400, 24409, + 24415, 24423, 24428, 24434, 24438, 24442, 24446, 24450, 24454, 24458, + 24462, 24466, 24470, 24474, 24480, 24485, 24490, 24493, 24497, 24501, + 24507, 24511, 24517, 24521, 24527, 24531, 24537, 24541, 24547, 24551, + 24557, 24561, 24567, 24573, 24577, 24583, 24588, 24592, 24596, 24600, + 24604, 24607, 24611, 24617, 24622, 24627, 24630, 24634, 24638, 24644, + 24648, 24654, 24658, 24664, 24667, 24672, 24676, 24682, 24686, 24692, + 24696, 24702, 24708, 24712, 24716, 24720, 24724, 24728, 24732, 24736, + 24740, 24744, 24748, 24752, 24758, 24761, 24765, 24769, 24775, 24779, + 24785, 24789, 24795, 24799, 24805, 24809, 24815, 24819, 24825, 24829, + 24835, 24841, 24845, 24849, 24855, 24861, 24867, 24873, 24877, 24881, + 24885, 24889, 24893, 24897, 24903, 24907, 24911, 24915, 24921, 24925, + 24931, 24935, 24941, 24945, 24951, 24955, 24961, 24965, 24971, 24975, + 24981, 24987, 24991, 24997, 25001, 25005, 25009, 25013, 25017, 25021, + 25027, 25030, 25034, 25038, 25044, 25048, 25054, 25058, 25064, 25068, + 25074, 25078, 25084, 25088, 25094, 25098, 25104, 25110, 25114, 25120, + 25124, 25130, 25136, 25140, 25144, 25148, 25152, 25156, 25160, 25166, + 25169, 25173, 25177, 25183, 25187, 25193, 25197, 25203, 25209, 25213, + 25218, 25222, 25226, 25230, 25234, 25238, 25242, 25246, 25252, 25255, + 25259, 25263, 25269, 25273, 25279, 25283, 25289, 25293, 25299, 25303, + 25309, 25313, 25319, 25323, 25329, 25332, 25337, 25342, 25346, 25350, + 25354, 25358, 25362, 25366, 25372, 25375, 25379, 25383, 25389, 25393, + 25399, 25403, 25409, 25413, 25419, 25423, 25429, 25433, 25439, 25443, + 25449, 25455, 25459, 25465, 25469, 25475, 25481, 25487, 25493, 25499, + 25505, 25511, 25517, 25521, 25525, 25529, 25533, 25537, 25541, 25545, + 25549, 25555, 25559, 25565, 25569, 25575, 25579, 25585, 25589, 25595, + 25599, 25605, 25609, 25615, 25619, 25623, 25627, 25631, 25635, 25639, + 25643, 25649, 25652, 25656, 25660, 25666, 25670, 25676, 25680, 25686, + 25690, 25696, 25700, 25706, 25710, 25716, 25720, 25726, 25732, 25736, + 25742, 25748, 25754, 25758, 25764, 25770, 25774, 25778, 25782, 25786, + 25790, 25796, 25799, 25803, 25808, 25812, 25818, 25821, 25826, 25831, + 25835, 25839, 25843, 25847, 25851, 25855, 25859, 25863, 25867, 25873, + 25877, 25881, 25887, 25891, 25897, 25901, 25907, 25911, 25915, 25919, + 25923, 25927, 25933, 25937, 25941, 25945, 25949, 25953, 25957, 25961, + 25965, 25969, 25973, 25979, 25985, 25991, 25997, 26003, 26008, 26014, + 26020, 26026, 26030, 26034, 26038, 26042, 26046, 26050, 26054, 26058, + 26062, 26066, 26070, 26074, 26078, 26084, 26090, 26096, 26101, 26105, + 26109, 26113, 26117, 26121, 26125, 26129, 26133, 26137, 26143, 26149, + 26155, 26161, 26167, 26173, 26179, 26185, 26191, 26195, 26199, 26203, + 26207, 26211, 26215, 26219, 26225, 26231, 26237, 26243, 26249, 26255, + 26261, 26267, 26273, 26278, 26283, 26288, 26293, 26299, 26305, 26311, + 26317, 26323, 26329, 26335, 26340, 26346, 26352, 26358, 26363, 26369, + 26375, 26381, 26386, 26391, 26396, 26401, 26406, 26411, 26416, 26421, + 26426, 26431, 26436, 26441, 26445, 26450, 26455, 26460, 26465, 26470, + 26475, 26480, 26485, 26490, 26495, 26500, 26505, 26510, 26515, 26520, + 26525, 26530, 26535, 26540, 26545, 26550, 26555, 26560, 26565, 26570, + 26575, 26580, 26585, 26590, 26594, 26599, 26604, 26609, 26614, 26619, + 26624, 26629, 26634, 26639, 26644, 26649, 26654, 26659, 26664, 26669, + 26674, 26679, 26684, 26689, 26694, 26699, 26704, 26709, 26714, 26719, + 26723, 26728, 26733, 26738, 26743, 26748, 26752, 26757, 26762, 26767, + 26772, 26777, 26781, 26786, 26792, 26797, 26802, 26807, 26812, 26818, + 26823, 26828, 26833, 26838, 26843, 26848, 26853, 26858, 26863, 26868, + 26873, 26878, 26882, 26887, 26892, 26897, 26902, 26907, 26912, 26917, + 26922, 26927, 26932, 26937, 26942, 26947, 26952, 26957, 26962, 26967, + 26972, 26977, 26982, 26987, 26992, 26997, 27002, 27007, 27012, 27017, + 27022, 27027, 27032, 27037, 27043, 27048, 27053, 27058, 27063, 27068, + 27073, 27078, 27083, 27088, 27093, 27098, 27102, 27107, 27112, 27117, + 27122, 27127, 27132, 27137, 27142, 27147, 27152, 27157, 27162, 27167, + 27172, 27177, 27182, 27187, 27192, 27197, 27202, 27207, 27212, 27217, + 27222, 27227, 27232, 27238, 27242, 27246, 27250, 27254, 27258, 27262, + 27266, 27270, 27276, 27282, 27288, 27294, 27300, 27306, 27312, 27319, + 27325, 27330, 27335, 27340, 27345, 27350, 27355, 27360, 27365, 27370, + 27375, 27380, 27385, 27390, 27395, 27400, 27405, 27410, 27415, 27420, + 27425, 27430, 27435, 27440, 27445, 27450, 27455, 27460, 27465, 0, 0, 0, + 27472, 27483, 27488, 27496, 27501, 27506, 27511, 27520, 27525, 27531, + 27537, 27543, 27548, 27554, 27560, 27564, 27569, 27574, 27584, 27589, + 27594, 27601, 27606, 27611, 27620, 27625, 27634, 27641, 27648, 27655, + 27662, 27673, 27680, 27685, 27695, 27699, 27706, 27711, 27718, 27724, + 27731, 27740, 27747, 27754, 27763, 27770, 27775, 27780, 27791, 27798, + 27803, 27814, 27821, 27826, 27831, 27839, 27848, 27855, 27862, 27872, + 27877, 27882, 27887, 27896, 27904, 27909, 27914, 27919, 27924, 27929, + 27934, 27939, 27944, 27949, 27954, 27959, 27965, 27971, 27977, 27982, + 27987, 27992, 27997, 28002, 28007, 28016, 28025, 28034, 28043, 0, 0, 0, + 0, 0, 0, 0, 28052, 28056, 28060, 28064, 28068, 28073, 28078, 28082, + 28087, 28091, 28095, 28100, 28104, 0, 28108, 28112, 28117, 28121, 28125, + 28130, 28135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28140, 28144, 28148, + 28152, 28156, 28161, 28166, 28170, 28175, 28179, 28183, 28188, 28192, + 28196, 28200, 28204, 28209, 28213, 28217, 28222, 28227, 28232, 28238, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 28243, 28247, 28251, 28255, 28259, 28264, 28269, + 28273, 28278, 28282, 28286, 28291, 28295, 28299, 28303, 28307, 28312, + 28316, 28320, 28325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28330, 28334, + 28338, 28342, 28346, 28351, 28356, 28360, 28365, 28369, 28373, 28378, + 28382, 0, 28386, 28390, 28395, 0, 28399, 28404, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 28409, 28412, 28416, 28420, 28424, 28428, 28432, 28436, + 28440, 28444, 28448, 28452, 28456, 28460, 28464, 28468, 28471, 28475, + 28478, 28482, 28486, 28490, 28494, 28498, 28502, 28506, 28510, 28514, + 28518, 28522, 28526, 28530, 28533, 28536, 28539, 28543, 28549, 28555, + 28561, 28567, 28573, 28579, 28585, 28591, 28597, 28603, 28609, 28615, + 28621, 28627, 28636, 28645, 28651, 28657, 28663, 28668, 28672, 28677, + 28682, 28687, 28691, 28696, 28701, 28706, 28710, 28715, 28719, 28724, + 28729, 28734, 28739, 28743, 28747, 28751, 28755, 28759, 28763, 28767, + 28771, 28775, 28779, 28785, 28789, 28793, 28797, 28801, 28805, 28813, + 28819, 28823, 28829, 28833, 28839, 28843, 0, 0, 28847, 28851, 28854, + 28857, 28860, 28863, 28866, 28869, 28872, 28875, 0, 0, 0, 0, 0, 0, 28878, + 28886, 28894, 28902, 28910, 28918, 28926, 28934, 28942, 28950, 0, 0, 0, + 0, 0, 0, 28958, 28961, 28964, 28967, 28972, 28975, 28980, 28987, 28995, + 29000, 29007, 29010, 29017, 29024, 29031, 0, 29035, 29039, 29042, 29045, + 29048, 29051, 29054, 29057, 29060, 29063, 0, 0, 0, 0, 0, 0, 29066, 29069, + 29072, 29075, 29078, 29081, 29085, 29089, 29093, 29096, 29100, 29104, + 29107, 29111, 29115, 29118, 29121, 29124, 29128, 29131, 29135, 29139, + 29143, 29146, 29149, 29153, 29157, 29160, 29164, 29168, 29172, 29176, + 29180, 29184, 29188, 29192, 29199, 29204, 29209, 29214, 29219, 29225, + 29231, 29237, 29243, 29248, 29254, 29260, 29265, 29270, 29276, 29282, + 29288, 29294, 29299, 29305, 29310, 29316, 29322, 29328, 29334, 29340, + 29345, 29350, 29356, 29362, 29367, 29373, 29378, 29384, 29389, 29394, + 29400, 29405, 29411, 29417, 29423, 29429, 29435, 29441, 29447, 29453, + 29459, 29465, 29470, 29475, 29480, 29486, 29492, 0, 0, 0, 0, 0, 0, 0, + 29500, 29509, 29518, 29526, 29534, 29544, 29552, 29561, 29568, 29575, + 29582, 29590, 29598, 29606, 29614, 29622, 29630, 29637, 29645, 29652, + 29660, 29668, 29676, 29684, 29692, 29701, 29711, 29721, 29731, 29741, + 29751, 29761, 29771, 29780, 29790, 29800, 29810, 29820, 29830, 29838, + 29846, 29856, 29864, 0, 0, 0, 0, 0, 29874, 29878, 29882, 29886, 29890, + 29894, 29898, 29902, 29906, 29910, 29914, 29918, 29922, 29926, 29930, + 29934, 29938, 29942, 29946, 29950, 29954, 29958, 29962, 29966, 29972, + 29976, 29982, 29986, 29992, 29996, 30002, 30006, 30010, 30014, 30018, + 30022, 30026, 30032, 30038, 30044, 30050, 30056, 30062, 30068, 30074, + 30080, 30086, 30092, 30099, 30105, 30111, 30117, 30121, 30125, 30129, + 30133, 30137, 30141, 30145, 30151, 30157, 30163, 30168, 30175, 30180, + 30185, 30191, 30196, 30203, 30210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30217, + 30223, 30227, 30232, 30237, 30242, 30247, 30252, 30257, 30262, 30267, + 30272, 30276, 30281, 30286, 30291, 30295, 30299, 30304, 30309, 30314, + 30318, 30322, 30326, 30330, 30335, 30340, 30345, 30349, 30353, 30358, 0, + 30363, 30368, 30373, 30378, 30384, 30390, 30396, 30402, 30407, 30412, + 30418, 30424, 0, 0, 0, 0, 30431, 30436, 30442, 30448, 30453, 30458, + 30463, 30468, 30473, 30478, 30483, 30488, 0, 0, 0, 0, 30493, 0, 0, 0, + 30498, 30503, 30508, 30513, 30517, 30521, 30525, 30529, 30533, 30537, + 30541, 30545, 30549, 30554, 30560, 30566, 30572, 30577, 30582, 30587, + 30593, 30598, 30603, 30609, 30614, 30620, 30626, 30631, 30637, 30643, + 30649, 30654, 30659, 30664, 30670, 30676, 30681, 30687, 30692, 30698, + 30703, 30709, 0, 0, 30715, 30721, 30727, 30733, 30739, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 30745, 30754, 30763, 30771, 30780, 30789, 30797, 30806, + 30815, 30824, 30832, 30840, 30849, 30857, 30865, 30873, 30882, 30890, + 30898, 30907, 30915, 30923, 30932, 30940, 30948, 30957, 30965, 30974, + 30983, 30991, 31000, 31009, 31017, 31025, 31034, 31043, 31051, 31060, + 31069, 31078, 31087, 31096, 31105, 31114, 0, 0, 0, 0, 31123, 31133, + 31142, 31151, 31159, 31168, 31176, 31185, 31193, 31202, 31211, 31220, + 31229, 31238, 31247, 31256, 31265, 31274, 31283, 31292, 31301, 31310, + 31319, 31328, 31337, 31345, 0, 0, 0, 0, 0, 0, 31353, 31361, 31368, 31375, + 31382, 31389, 31396, 31403, 31410, 31417, 31424, 0, 0, 0, 31432, 31440, + 31448, 31452, 31458, 31464, 31470, 31476, 31482, 31488, 31494, 31500, + 31506, 31512, 31518, 31524, 31530, 31536, 31542, 31546, 31552, 31558, + 31564, 31570, 31576, 31582, 31588, 31594, 31600, 31606, 31612, 31618, + 31624, 31630, 31636, 31640, 31645, 31650, 31655, 31659, 31664, 31668, + 31673, 31677, 31682, 31686, 31691, 31696, 31701, 31706, 31711, 31715, + 31719, 31723, 31728, 31732, 31736, 31740, 31745, 31750, 31755, 31760, 0, + 0, 31766, 31770, 31777, 31782, 31788, 31794, 31799, 31805, 31811, 31816, + 31822, 31828, 31834, 31839, 31845, 31850, 31855, 31861, 31866, 31872, + 31877, 31882, 31888, 31893, 31899, 31903, 31908, 31913, 31919, 31925, + 31930, 31936, 31942, 31946, 31951, 31956, 31960, 31965, 31969, 31974, + 31979, 31985, 31991, 31996, 32001, 32006, 32010, 32015, 32019, 32024, + 32028, 32033, 32038, 32043, 32048, 32054, 32061, 32068, 32078, 32087, + 32094, 32100, 32111, 32116, 32122, 0, 32127, 32132, 32137, 32145, 32151, + 32159, 32164, 32170, 32176, 32182, 32187, 32193, 32198, 32205, 32211, + 32216, 32222, 32228, 32234, 32241, 32248, 32255, 32260, 32265, 32272, + 32279, 32286, 32293, 32300, 0, 0, 32307, 32314, 32321, 32327, 32333, + 32339, 32345, 32351, 32357, 32363, 32369, 0, 0, 0, 0, 0, 0, 32375, 32381, + 32386, 32391, 32396, 32401, 32406, 32411, 32416, 32421, 0, 0, 0, 0, 0, 0, + 32426, 32431, 32436, 32441, 32446, 32451, 32456, 32465, 32472, 32477, + 32482, 32487, 32492, 32497, 0, 0, 32502, 32509, 32512, 32515, 32519, + 32524, 32528, 32534, 32538, 32543, 32550, 32558, 32562, 32567, 32571, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32276, 32282, 32288, - 32292, 32296, 32300, 32304, 32310, 32314, 32320, 32324, 32330, 32336, - 32344, 32350, 32358, 32362, 32366, 32370, 32376, 32379, 32385, 32389, - 32395, 32399, 32403, 32409, 32413, 32419, 32423, 32429, 32437, 32445, - 32453, 32459, 32463, 32469, 32473, 32479, 32482, 32485, 32491, 32495, - 32501, 32504, 32507, 32510, 32513, 32517, 32523, 32529, 32532, 32535, - 32539, 32544, 32549, 32556, 32561, 32568, 32575, 32584, 32591, 32600, - 32605, 32612, 32619, 32628, 32633, 32640, 32645, 32651, 32657, 32663, - 32669, 32675, 32681, 0, 0, 0, 0, 32687, 32691, 32694, 32697, 32700, - 32703, 32706, 32709, 32712, 32715, 32718, 32721, 32724, 32727, 32732, - 32737, 32742, 32745, 32750, 32755, 32760, 32765, 32772, 32777, 32782, - 32787, 32792, 32799, 32805, 32811, 32817, 32823, 32829, 32838, 32847, - 32853, 32859, 32867, 32875, 32884, 32893, 32901, 32909, 32918, 32927, 0, - 0, 0, 32935, 32940, 32945, 32950, 32954, 32958, 32962, 32967, 32971, - 32975, 32980, 32984, 32989, 32994, 32999, 33004, 33009, 33014, 33019, - 33024, 33029, 33033, 33037, 33042, 33047, 33052, 33056, 33060, 33064, - 33068, 33073, 33077, 33082, 33086, 33092, 33098, 33104, 33110, 33116, - 33122, 33128, 33134, 33140, 33145, 33150, 33157, 33165, 33170, 33175, - 33180, 33184, 33188, 33192, 33196, 33200, 33204, 33208, 33212, 33216, - 33220, 33225, 33230, 33235, 33241, 33247, 33251, 33257, 33261, 33267, - 33273, 33278, 33285, 33289, 33295, 33299, 33305, 33310, 33317, 33324, - 33329, 33336, 33341, 33346, 33350, 33356, 33360, 33366, 33373, 33380, - 33384, 33390, 33396, 33400, 33406, 33411, 33415, 33421, 33426, 33431, - 33436, 33441, 33445, 33449, 33454, 33459, 33466, 33472, 33477, 33484, - 33489, 33496, 33501, 33510, 33516, 33522, 33526, 0, 0, 0, 0, 0, 0, 0, 0, - 33530, 33539, 33546, 33553, 33560, 33564, 33569, 33574, 33579, 33584, - 33589, 33594, 33599, 33604, 33609, 33614, 33619, 33624, 33628, 33632, - 33637, 33642, 33647, 33652, 33657, 33662, 33666, 33671, 33676, 33681, - 33686, 33690, 33694, 33698, 33702, 33707, 33712, 33716, 33721, 33726, - 33730, 33736, 33742, 33748, 33753, 33758, 33764, 33769, 33775, 33780, - 33786, 33792, 33797, 33803, 33809, 33814, 33820, 33826, 33832, 33837, 0, - 0, 0, 33842, 33848, 33858, 33864, 33872, 33878, 33883, 33887, 33891, - 33895, 33899, 33903, 33907, 33911, 33915, 0, 0, 0, 33919, 33924, 33929, - 33934, 33941, 33947, 33953, 33959, 33965, 33971, 33977, 33983, 33989, - 33995, 34001, 34008, 34015, 34022, 34029, 34036, 34043, 34050, 34057, - 34064, 34071, 34078, 34085, 34092, 34099, 34106, 34113, 34120, 34127, - 34134, 34141, 34148, 34155, 34162, 34169, 34176, 34183, 34190, 34197, - 34204, 34212, 34220, 34228, 34234, 34240, 34246, 34254, 34263, 34270, - 34277, 34283, 34290, 34297, 34304, 34312, 34319, 0, 0, 0, 0, 0, 0, 0, - 34326, 34333, 34340, 34347, 34354, 34361, 34368, 34375, 34382, 34389, - 34396, 34403, 34410, 34417, 34424, 34431, 34438, 34445, 34452, 34459, - 34466, 34473, 34480, 34487, 34494, 34501, 34508, 34515, 34522, 34529, - 34536, 34543, 34550, 34557, 34564, 34571, 34578, 34585, 34592, 34599, - 34606, 34613, 34622, 0, 0, 34629, 34636, 34644, 34652, 34660, 34668, - 34676, 34684, 34694, 34704, 34714, 0, 0, 0, 0, 0, 0, 0, 0, 34724, 34729, - 34734, 34739, 34744, 34753, 34764, 34773, 34784, 34790, 34803, 34809, - 34816, 34823, 34828, 34835, 34842, 34853, 34862, 34869, 34876, 34885, - 34892, 34901, 34911, 34921, 34928, 34935, 34942, 34952, 34957, 34965, - 34971, 34979, 34988, 34993, 35000, 35006, 35011, 35016, 35021, 35027, 0, - 0, 0, 0, 0, 0, 35034, 35039, 35045, 35052, 35060, 35066, 35072, 35078, - 35083, 35090, 35096, 35102, 35108, 35116, 35122, 35130, 35135, 35141, - 35147, 35154, 35162, 35169, 35175, 35182, 35189, 35195, 35202, 35209, - 35215, 35220, 35226, 35234, 35243, 35249, 35255, 35261, 35267, 35275, - 35279, 35285, 35291, 35297, 35303, 35309, 35315, 35319, 35324, 35329, - 35336, 35341, 35345, 35351, 35356, 35361, 35365, 35370, 35375, 35379, - 35384, 35389, 35396, 35400, 35405, 35410, 35414, 35419, 35423, 35428, - 35432, 35438, 35443, 35450, 35455, 35460, 35464, 35469, 35474, 35481, - 35486, 35492, 35497, 35502, 35507, 35511, 35516, 35523, 35530, 35535, - 35540, 35544, 35550, 35557, 35562, 35567, 35572, 35578, 35583, 35589, - 35594, 35600, 35606, 35612, 35619, 35626, 35633, 35640, 35647, 35654, - 35659, 35667, 35676, 35685, 35694, 35703, 35712, 35721, 35733, 35742, - 35751, 35760, 35767, 35772, 35779, 35787, 35795, 35802, 35809, 35816, - 35823, 35831, 35840, 35849, 35858, 35867, 35876, 35885, 35894, 35903, - 35912, 35921, 35930, 35939, 35948, 35957, 35965, 35974, 35985, 35994, - 36004, 36016, 36025, 36034, 36043, 36052, 36060, 36069, 36076, 36081, - 36089, 36094, 36101, 36106, 36115, 36121, 36128, 36135, 36140, 36145, - 36153, 36161, 36170, 36179, 36184, 36191, 36202, 36210, 36219, 36225, - 36231, 36236, 36243, 36248, 36257, 36262, 36267, 36272, 36279, 36286, - 36291, 36300, 36308, 36313, 36318, 36325, 36332, 36336, 36340, 36343, - 36346, 36349, 36352, 36355, 36358, 36365, 36368, 36371, 36376, 36380, - 36384, 36388, 36392, 36396, 36405, 36411, 36417, 36423, 36431, 36439, - 36445, 36451, 36458, 36464, 36469, 36475, 36482, 36488, 36495, 36501, - 36509, 36515, 36522, 36528, 36534, 36540, 36546, 36552, 36558, 36569, - 36579, 36585, 36591, 36601, 36607, 36615, 36623, 36631, 36636, 36642, - 36648, 36653, 0, 36661, 36665, 36672, 36679, 36684, 36693, 36701, 36709, - 36716, 36723, 36730, 36737, 36745, 36753, 36763, 36773, 36781, 36789, - 36797, 36805, 36814, 36823, 36831, 36839, 36848, 36857, 36868, 36879, - 36889, 36899, 36908, 36917, 36926, 36935, 36946, 36957, 36965, 36973, - 36981, 36989, 36997, 37005, 37013, 37021, 37029, 37037, 37045, 37053, - 37062, 37071, 37080, 37089, 37099, 37109, 37116, 37123, 37131, 37139, - 37148, 37157, 37165, 37173, 37185, 37197, 37206, 37215, 37224, 37233, - 37240, 37247, 37255, 37263, 37271, 37279, 37287, 37295, 37303, 37311, - 37320, 37329, 37338, 37347, 37356, 37365, 37375, 37385, 37395, 37405, - 37414, 37423, 37430, 37437, 37445, 37453, 37461, 37469, 37477, 37485, - 37497, 37509, 37518, 37527, 37535, 37543, 37551, 37559, 37570, 37581, - 37592, 37603, 37615, 37627, 37635, 37643, 37651, 37659, 37668, 37677, - 37686, 37695, 37703, 37711, 37719, 37727, 37735, 37743, 37752, 37761, - 37771, 37781, 37789, 37797, 37805, 37813, 37821, 37829, 37836, 37843, - 37851, 37859, 37867, 37875, 37883, 37891, 37899, 37907, 37915, 37923, - 37931, 37939, 37947, 37955, 37963, 37971, 37980, 37989, 37998, 38006, - 38015, 38024, 38033, 38042, 38052, 38061, 38068, 38073, 38080, 38087, - 38095, 38103, 38112, 38121, 38131, 38141, 38152, 38163, 38173, 38183, - 38193, 38203, 38212, 38221, 38231, 38241, 38252, 38263, 38273, 38283, - 38293, 38303, 38311, 38319, 38328, 38337, 38345, 38353, 38363, 38373, - 38384, 38395, 38407, 38419, 38430, 38441, 38452, 38463, 38472, 38481, - 38489, 38497, 38504, 38511, 38519, 38527, 38536, 38545, 38555, 38565, - 38576, 38587, 38597, 38607, 38617, 38627, 38636, 38645, 38655, 38665, - 38676, 38687, 38697, 38707, 38717, 38727, 38734, 38741, 38749, 38757, - 38766, 38775, 38785, 38795, 38806, 38817, 38827, 38837, 38847, 38857, - 38865, 38873, 38881, 38889, 38898, 38907, 38915, 38923, 38930, 38937, - 38944, 38951, 38959, 38967, 38975, 38983, 38994, 39005, 39016, 39027, - 39038, 39049, 39057, 39065, 39076, 39087, 39098, 39109, 39120, 39131, - 39139, 39147, 39158, 39169, 39180, 0, 0, 39191, 39199, 39207, 39218, - 39229, 39240, 0, 0, 39251, 39259, 39267, 39278, 39289, 39300, 39311, - 39322, 39333, 39341, 39349, 39360, 39371, 39382, 39393, 39404, 39415, - 39423, 39431, 39442, 39453, 39464, 39475, 39486, 39497, 39505, 39513, - 39524, 39535, 39546, 39557, 39568, 39579, 39587, 39595, 39606, 39617, - 39628, 0, 0, 39639, 39647, 39655, 39666, 39677, 39688, 0, 0, 39699, - 39707, 39715, 39726, 39737, 39748, 39759, 39770, 0, 39781, 0, 39789, 0, - 39800, 0, 39811, 39822, 39830, 39838, 39849, 39860, 39871, 39882, 39893, - 39904, 39912, 39920, 39931, 39942, 39953, 39964, 39975, 39986, 39994, - 40002, 40010, 40018, 40026, 40034, 40042, 40050, 40058, 40066, 40074, - 40082, 40090, 0, 0, 40098, 40109, 40120, 40134, 40148, 40162, 40176, - 40190, 40204, 40215, 40226, 40240, 40254, 40268, 40282, 40296, 40310, - 40321, 40332, 40346, 40360, 40374, 40388, 40402, 40416, 40427, 40438, - 40452, 40466, 40480, 40494, 40508, 40522, 40533, 40544, 40558, 40572, - 40586, 40600, 40614, 40628, 40639, 40650, 40664, 40678, 40692, 40706, - 40720, 40734, 40742, 40750, 40761, 40769, 0, 40780, 40788, 40799, 40807, - 40815, 40823, 40831, 40839, 40842, 40845, 40848, 40851, 40857, 40868, - 40876, 0, 40887, 40895, 40906, 40914, 40922, 40930, 40938, 40946, 40952, - 40958, 40964, 40972, 40980, 40991, 0, 0, 41002, 41010, 41021, 41029, - 41037, 41045, 0, 41053, 41059, 41065, 41071, 41079, 41087, 41098, 41109, - 41117, 41125, 41133, 41144, 41152, 41160, 41168, 41176, 41184, 41190, - 41196, 0, 0, 41199, 41210, 41218, 0, 41229, 41237, 41248, 41256, 41264, - 41272, 41280, 41288, 41291, 0, 41294, 41298, 41302, 41306, 41310, 41314, - 41318, 41322, 41326, 41330, 41334, 41338, 41344, 41350, 41356, 41359, - 41362, 41364, 41368, 41372, 41376, 41380, 41383, 41387, 41391, 41397, - 41403, 41410, 41417, 41422, 41427, 41433, 41439, 41441, 41444, 41446, - 41450, 41454, 41458, 41462, 41466, 41470, 41474, 41478, 41482, 41488, - 41492, 41496, 41502, 41507, 41514, 41516, 41519, 41523, 41527, 41532, - 41538, 41540, 41549, 41558, 41561, 41565, 41567, 41569, 41571, 41574, - 41580, 41582, 41586, 41590, 41597, 41604, 41608, 41613, 41618, 41623, - 41628, 41632, 41636, 41639, 41643, 41647, 41654, 41659, 41663, 41667, - 41672, 41676, 41680, 41685, 41690, 41694, 41698, 41702, 41704, 41709, - 41714, 41718, 41722, 41726, 41730, 0, 41734, 41738, 41742, 41748, 41754, - 41760, 41766, 41773, 41780, 41785, 41790, 41794, 0, 0, 41800, 41803, - 41806, 41809, 41812, 41815, 41818, 41822, 41826, 41831, 41836, 41841, - 41848, 41852, 41855, 41858, 41861, 41864, 41867, 41870, 41873, 41876, - 41879, 41883, 41887, 41892, 41897, 0, 41902, 41908, 41914, 41920, 41927, - 41934, 41941, 41948, 41954, 41961, 41968, 41975, 41982, 0, 0, 0, 41989, - 41992, 41995, 41998, 42003, 42006, 42009, 42012, 42015, 42018, 42021, - 42026, 42029, 42032, 42035, 42038, 42041, 42046, 42049, 42052, 42055, - 42058, 42061, 42066, 42069, 42072, 42077, 42082, 42086, 42089, 42092, - 42095, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42098, 42103, - 42108, 42115, 42123, 42128, 42133, 42137, 42141, 42146, 42153, 42160, - 42165, 42171, 42176, 42181, 42186, 42193, 42198, 42203, 42208, 42217, - 42224, 42231, 42235, 42240, 42246, 42251, 42258, 42266, 42274, 42278, - 42282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42286, 42290, 42298, - 42302, 42306, 42311, 42315, 42319, 42323, 42325, 42329, 42333, 42337, - 42342, 42346, 42350, 42358, 42361, 42365, 42368, 42371, 42377, 42381, - 42384, 42390, 42394, 42398, 42402, 42405, 42409, 42412, 42416, 42418, - 42421, 42424, 42428, 42430, 42434, 42437, 42440, 42445, 42450, 42457, - 42460, 42463, 42467, 42472, 42475, 42478, 42481, 42485, 42490, 42494, - 42497, 42499, 42502, 42505, 42508, 42512, 42517, 42520, 42524, 42528, - 42532, 42536, 42541, 42547, 42552, 42557, 42563, 42568, 42573, 42577, - 42581, 42586, 42590, 42594, 42597, 42599, 42604, 42610, 42617, 42624, - 42631, 42638, 42645, 42652, 42659, 42666, 42674, 42681, 42689, 42696, - 42703, 42711, 42719, 42724, 42729, 42734, 42739, 42744, 42749, 42754, - 42759, 42764, 42769, 42775, 42781, 42787, 42793, 42800, 42808, 42815, - 42821, 42827, 42833, 42839, 42845, 42851, 42857, 42863, 42869, 42876, - 42883, 42890, 42897, 42905, 42914, 42922, 42933, 42941, 42949, 42958, - 42965, 42974, 42983, 42991, 43000, 43008, 43012, 0, 0, 0, 0, 43016, - 43018, 43021, 43023, 43026, 43029, 43032, 43036, 43040, 43045, 43050, - 43054, 43058, 43062, 43066, 43071, 43077, 43082, 43088, 43093, 43098, - 43103, 43109, 43114, 43120, 43126, 43130, 43134, 43139, 43144, 43149, - 43154, 43159, 43167, 43175, 43183, 43191, 43198, 43206, 43213, 43220, - 43228, 43240, 43246, 43252, 43259, 43266, 43274, 43282, 43289, 43296, - 43304, 43312, 43317, 43325, 43330, 43335, 43341, 43346, 43352, 43359, - 43366, 43371, 43377, 43382, 43385, 43389, 43392, 43396, 43400, 43404, - 43409, 43414, 43420, 43426, 43430, 43434, 43438, 43442, 43448, 43454, - 43458, 43463, 43467, 43472, 43477, 43482, 43485, 43489, 43492, 43496, - 43503, 43511, 43523, 43534, 43539, 43548, 43555, 43563, 43572, 43576, - 43582, 43590, 43594, 43599, 43604, 43610, 43616, 43622, 43629, 43633, - 43637, 43642, 43645, 43647, 43651, 43655, 43663, 43667, 43669, 43671, - 43675, 43683, 43688, 43694, 43704, 43711, 43716, 43720, 43724, 43728, - 43731, 43734, 43737, 43741, 43745, 43749, 43753, 43757, 43760, 43764, - 43768, 43771, 43773, 43776, 43778, 43782, 43786, 43788, 43794, 43797, - 43802, 43806, 43810, 43812, 43814, 43816, 43819, 43823, 43827, 43831, - 43835, 43839, 43845, 43851, 43853, 43855, 43857, 43859, 43862, 43864, - 43868, 43870, 43874, 43878, 43884, 43888, 43892, 43896, 43900, 43904, - 43910, 43914, 43924, 43934, 43938, 43944, 43951, 43955, 43959, 43962, - 43967, 43971, 43977, 43981, 43994, 44003, 44007, 44011, 44017, 44021, - 44024, 44026, 44029, 44033, 44037, 44044, 44048, 44052, 44056, 44059, - 44064, 44069, 44075, 44081, 44086, 44091, 44099, 44107, 44111, 44115, - 44117, 44122, 44126, 44130, 44138, 44146, 44153, 44160, 44169, 44178, - 44184, 44190, 44198, 44206, 44208, 44210, 44216, 44222, 44229, 44236, - 44242, 44248, 44252, 44256, 44263, 44270, 44277, 44284, 44294, 44304, - 44312, 44320, 44322, 44326, 44330, 44335, 44340, 44348, 44356, 44359, - 44362, 44365, 44368, 44371, 44376, 44380, 44385, 44390, 44393, 44396, - 44399, 44402, 44405, 44409, 44412, 44415, 44418, 44421, 44423, 44425, - 44427, 44429, 44437, 44445, 44451, 44455, 44461, 44471, 44477, 44483, - 44489, 44497, 44506, 44518, 44522, 44526, 44528, 44534, 44536, 44538, - 44540, 44542, 44548, 44551, 44557, 44563, 44567, 44571, 44575, 44578, - 44582, 44586, 44588, 44597, 44606, 44611, 44616, 44622, 44628, 44634, - 44637, 44640, 44643, 44646, 44648, 44653, 44658, 44663, 44669, 44675, - 44684, 44693, 44700, 44707, 44714, 44721, 44731, 44741, 44751, 44761, - 44771, 44781, 44790, 44799, 44808, 44817, 44825, 44837, 44848, 44864, - 44867, 44873, 44879, 44885, 44893, 44908, 44924, 44930, 44936, 44943, - 44949, 44958, 44965, 44979, 44994, 44999, 45005, 45013, 45016, 45019, - 45021, 45024, 45027, 45029, 45031, 45035, 45038, 45041, 45044, 45047, - 45052, 45057, 45062, 45067, 45072, 45075, 45077, 45079, 45081, 45085, - 45089, 45093, 45099, 45104, 45106, 45108, 45113, 45118, 45123, 45128, - 45133, 45138, 45140, 45142, 45152, 45156, 45164, 45173, 45175, 45180, - 45185, 45193, 45197, 45199, 45203, 45205, 45209, 45213, 45217, 45219, - 45221, 45223, 45230, 45239, 45248, 45257, 45266, 45275, 45284, 45293, - 45302, 45310, 45318, 45327, 45336, 45345, 45354, 45362, 45370, 45379, - 45388, 45397, 45407, 45416, 45426, 45435, 45445, 45454, 45464, 45474, - 45483, 45493, 45502, 45512, 45521, 45531, 45540, 45549, 45558, 45567, - 45576, 45586, 45595, 45604, 45613, 45623, 45632, 45641, 45650, 45659, - 45669, 45679, 45688, 45697, 45705, 45714, 45721, 45730, 45739, 45750, - 45759, 45769, 45779, 45786, 45793, 45800, 45809, 45818, 45827, 45836, - 45843, 45848, 45857, 45862, 45865, 45872, 45875, 45880, 45885, 45888, - 45891, 45899, 45902, 45907, 45910, 45918, 45923, 45931, 45934, 45937, - 45940, 45945, 45950, 45953, 45956, 45964, 45967, 45974, 45981, 45985, - 45989, 45994, 45999, 46005, 46010, 46016, 46022, 46027, 46033, 46041, - 46047, 46055, 46063, 46069, 46077, 46085, 46093, 46101, 46107, 46115, - 46123, 46131, 46135, 46141, 46155, 46169, 46173, 46177, 46181, 46185, - 46195, 46199, 46204, 46209, 46215, 46221, 46227, 46233, 46243, 46253, - 46261, 46272, 46283, 46291, 46302, 46313, 46321, 46332, 46343, 46351, - 46359, 46369, 46379, 46382, 46385, 46388, 46393, 46397, 46403, 46410, - 46417, 46425, 46432, 46436, 46440, 46444, 46448, 46450, 46454, 46458, - 46463, 46468, 46475, 46482, 46485, 46492, 46494, 46496, 46500, 46504, - 46509, 46515, 46521, 46527, 46533, 46542, 46551, 46560, 46564, 46566, - 46570, 46577, 46584, 46591, 46598, 46605, 46608, 46613, 46619, 46622, - 46627, 46632, 46637, 46642, 46646, 46653, 46660, 46667, 46674, 46678, - 46682, 46686, 46690, 46696, 46702, 46707, 46713, 46719, 46725, 46731, - 46739, 46746, 46753, 46760, 46767, 46773, 46779, 46788, 46792, 46799, - 46803, 46807, 46813, 46819, 46825, 46831, 46835, 46839, 46842, 46845, - 46849, 46856, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 46863, 46866, 46870, 46874, 46880, 46886, 46892, 46900, - 46907, 46911, 46919, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 46924, 46927, 46930, 46933, 46936, 46939, 46942, 46945, - 46948, 46951, 46955, 46959, 46963, 46967, 46971, 46975, 46979, 46983, - 46987, 46991, 46995, 46998, 47001, 47004, 47007, 47010, 47013, 47016, - 47019, 47022, 47026, 47030, 47034, 47038, 47042, 47046, 47050, 47054, - 47058, 47062, 47066, 47072, 47078, 47084, 47091, 47098, 47105, 47112, - 47119, 47126, 47133, 47140, 47147, 47154, 47161, 47168, 47175, 47182, - 47189, 47196, 47203, 47208, 47214, 47220, 47226, 47231, 47237, 47243, - 47249, 47254, 47260, 47266, 47271, 47277, 47283, 47288, 47294, 47300, - 47305, 47311, 47317, 47322, 47328, 47334, 47340, 47346, 47352, 47357, - 47363, 47369, 47375, 47380, 47386, 47392, 47398, 47403, 47409, 47415, - 47420, 47426, 47432, 47437, 47443, 47449, 47454, 47460, 47466, 47471, - 47477, 47483, 47489, 47495, 47501, 47506, 47512, 47518, 47524, 47529, - 47535, 47541, 47547, 47552, 47558, 47564, 47569, 47575, 47581, 47586, - 47592, 47598, 47603, 47609, 47615, 47620, 47626, 47632, 47638, 47644, - 47650, 47654, 47660, 47666, 47672, 47678, 47684, 47690, 47696, 47702, - 47708, 47714, 47718, 47722, 47726, 47730, 47734, 47738, 47742, 47746, - 47750, 47755, 47761, 47766, 47771, 47776, 47781, 47790, 47799, 47808, - 47817, 47826, 47835, 47844, 47853, 47860, 47868, 47876, 47883, 47890, - 47898, 47906, 47913, 47920, 47928, 47936, 47943, 47950, 47958, 47966, - 47973, 47980, 47988, 47997, 48006, 48014, 48023, 48032, 48039, 48046, - 48054, 48063, 48072, 48080, 48089, 48098, 48105, 48112, 48121, 48130, - 48139, 48148, 48157, 48166, 48173, 48180, 48189, 48198, 48207, 48216, - 48225, 48234, 48241, 48248, 48257, 48266, 48275, 48285, 48295, 48304, - 48314, 48324, 48334, 48344, 48354, 48364, 48373, 48382, 48389, 48397, - 48405, 48413, 48421, 48426, 48431, 48440, 48448, 48455, 48464, 48472, - 48479, 48488, 48496, 48503, 48512, 48520, 48527, 48536, 48544, 48551, - 48560, 48568, 48575, 48585, 48594, 48601, 48611, 48620, 48627, 48637, - 48646, 48653, 48662, 48671, 48680, 48689, 48703, 48717, 48724, 48729, - 48734, 48739, 48744, 48749, 48754, 48759, 48764, 48772, 48780, 48788, - 48796, 48801, 48808, 48815, 48822, 48827, 48835, 48842, 48850, 48854, - 48861, 48867, 48874, 48878, 48884, 48890, 48896, 48900, 48903, 48907, - 48911, 48918, 48924, 48930, 48936, 48942, 48956, 48966, 48980, 48994, - 49000, 49010, 49024, 49027, 49030, 49037, 49045, 49051, 49056, 49064, - 49076, 49088, 49096, 49100, 49104, 49107, 49110, 49114, 49118, 49121, - 49124, 49129, 49134, 49140, 49146, 49151, 49156, 49162, 49168, 49173, - 49178, 49183, 49188, 49194, 49200, 49205, 49210, 49216, 49222, 49227, - 49232, 49235, 49238, 49247, 49249, 49251, 49254, 49258, 49264, 49266, - 49269, 49276, 49283, 49291, 49299, 49309, 49323, 49328, 49333, 49337, - 49342, 49350, 49358, 49367, 49376, 49385, 49394, 49399, 49404, 49410, - 49416, 49422, 49428, 49431, 49437, 49443, 49453, 49463, 49471, 49479, - 49488, 49497, 49501, 49509, 49517, 49525, 49533, 49542, 49551, 49560, - 49569, 49574, 49579, 49584, 49589, 49594, 49600, 49606, 49611, 49617, - 49619, 49621, 49623, 49625, 49628, 49631, 49633, 49635, 49637, 49641, - 49645, 49647, 49649, 49652, 49655, 49659, 49665, 49671, 49673, 49680, - 49684, 49689, 49694, 49696, 49706, 49712, 49718, 49724, 49730, 49736, - 49742, 49747, 49750, 49753, 49756, 49758, 49760, 49764, 49768, 49773, - 49778, 49783, 49786, 49790, 49795, 49798, 49802, 49807, 49812, 49817, - 49822, 49827, 49832, 49837, 49842, 49847, 49852, 49857, 49862, 49868, - 49874, 49880, 49882, 49885, 49887, 49890, 49892, 49894, 49896, 49898, - 49900, 49902, 49904, 49906, 49908, 49910, 49912, 49914, 49916, 49918, - 49920, 49922, 49924, 49929, 49934, 49939, 49944, 49949, 49954, 49959, - 49964, 49969, 49974, 49979, 49984, 49989, 49994, 49999, 50004, 50009, - 50014, 50019, 50024, 50028, 50032, 50036, 50042, 50048, 50053, 50058, - 50063, 50069, 50075, 50080, 50088, 50096, 50104, 50112, 50120, 50128, - 50136, 50144, 50150, 50155, 50160, 50165, 50168, 50172, 50176, 50180, - 50184, 50188, 50192, 50199, 50206, 50214, 50222, 50227, 50232, 50239, - 50246, 50253, 50260, 50263, 50266, 50271, 50273, 50277, 50282, 50284, - 50286, 50288, 50290, 50295, 50298, 50300, 50305, 50312, 50319, 50322, - 50326, 50331, 50336, 50344, 50350, 50356, 50368, 50375, 50383, 50388, - 50393, 50399, 50402, 50405, 50410, 50412, 50416, 50418, 50420, 50422, - 50424, 50426, 50428, 50433, 50435, 50437, 50439, 50441, 50445, 50447, - 50450, 50455, 50460, 50465, 50470, 50476, 50482, 50484, 50487, 50494, - 50501, 50508, 50515, 50519, 50523, 50525, 50527, 50531, 50537, 50542, - 50544, 50548, 50557, 50565, 50573, 50579, 50585, 50590, 50596, 50601, - 50604, 50618, 50621, 50626, 50631, 50637, 50648, 50650, 50656, 50662, - 50666, 50673, 50677, 50679, 50681, 50685, 50691, 50696, 50702, 50704, - 50710, 50712, 50718, 50720, 50722, 50727, 50729, 50733, 50738, 50740, - 50745, 50750, 50754, 50761, 50771, 50776, 50782, 50785, 50791, 50794, - 50799, 50804, 50808, 50810, 50812, 50816, 50820, 50824, 50828, 50833, - 50835, 50840, 50843, 50846, 50849, 50853, 50857, 50862, 50866, 50871, - 50876, 50880, 50885, 50891, 50894, 50900, 50905, 50909, 50914, 50920, - 50926, 50933, 50939, 50946, 50953, 50955, 50962, 50966, 50972, 50978, - 50983, 50989, 50993, 50998, 51001, 51006, 51012, 51019, 51027, 51034, - 51043, 51053, 51060, 51066, 51070, 51077, 51082, 51091, 51094, 51097, - 51106, 51116, 51123, 51125, 51131, 51136, 51138, 51141, 51145, 51153, - 51162, 51165, 51170, 51176, 51184, 51192, 51200, 51208, 51214, 51220, - 51226, 51234, 51239, 51242, 51246, 51249, 51261, 51271, 51282, 51291, - 51302, 51312, 51321, 51327, 51335, 51339, 51347, 51351, 51359, 51366, - 51373, 51382, 51391, 51401, 51411, 51421, 51431, 51440, 51449, 51459, - 51469, 51478, 51487, 51494, 51501, 51508, 51515, 51522, 51529, 51536, - 51543, 51550, 51558, 51564, 51570, 51576, 51582, 51588, 51594, 51600, - 51606, 51612, 51619, 51627, 51635, 51643, 51651, 51659, 51667, 51675, - 51683, 51691, 51700, 51705, 51708, 51712, 51716, 51722, 51725, 51730, - 51736, 51741, 51745, 51750, 51756, 51763, 51766, 51773, 51780, 51784, - 51793, 51802, 51807, 51813, 51818, 51823, 51830, 51837, 51845, 51853, - 51862, 51866, 51875, 51880, 51884, 51891, 51895, 51901, 51909, 51914, - 51921, 51925, 51930, 51934, 51939, 51943, 51948, 51953, 51962, 51964, - 51967, 51970, 51977, 51984, 51990, 51998, 52004, 52011, 52016, 52019, - 52024, 52029, 52034, 52042, 52046, 52053, 52061, 52069, 52074, 52079, - 52085, 52090, 52095, 52101, 52106, 52109, 52113, 52117, 52124, 52134, - 52139, 52148, 52157, 52163, 52169, 52174, 52179, 52184, 52189, 52195, - 52201, 52209, 52217, 52223, 52229, 52234, 52239, 52246, 52253, 52259, - 52262, 52265, 52269, 52273, 52277, 52282, 52288, 52294, 52301, 52308, - 52313, 52317, 52321, 52325, 52329, 52333, 52337, 52341, 52345, 52349, - 52353, 52357, 52361, 52365, 52369, 52373, 52377, 52381, 52385, 52389, - 52393, 52397, 52401, 52405, 52409, 52413, 52417, 52421, 52425, 52429, - 52433, 52437, 52441, 52445, 52449, 52453, 52457, 52461, 52465, 52469, - 52473, 52477, 52481, 52485, 52489, 52493, 52497, 52501, 52505, 52509, - 52513, 52517, 52521, 52525, 52529, 52533, 52537, 52541, 52545, 52549, - 52553, 52557, 52561, 52565, 52569, 52573, 52577, 52581, 52585, 52589, - 52593, 52597, 52601, 52605, 52609, 52613, 52617, 52621, 52625, 52629, - 52633, 52637, 52641, 52645, 52649, 52653, 52657, 52661, 52665, 52669, - 52673, 52677, 52681, 52685, 52689, 52693, 52697, 52701, 52705, 52709, - 52713, 52717, 52721, 52725, 52729, 52733, 52737, 52741, 52745, 52749, - 52753, 52757, 52761, 52765, 52769, 52773, 52777, 52781, 52785, 52789, - 52793, 52797, 52801, 52805, 52809, 52813, 52817, 52821, 52825, 52829, - 52833, 52837, 52841, 52845, 52849, 52853, 52857, 52861, 52865, 52869, - 52873, 52877, 52881, 52885, 52889, 52893, 52897, 52901, 52905, 52909, - 52913, 52917, 52921, 52925, 52929, 52933, 52937, 52941, 52945, 52949, - 52953, 52957, 52961, 52965, 52969, 52973, 52977, 52981, 52985, 52989, - 52993, 52997, 53001, 53005, 53009, 53013, 53017, 53021, 53025, 53029, - 53033, 53037, 53041, 53045, 53049, 53053, 53057, 53061, 53065, 53069, - 53073, 53077, 53081, 53085, 53089, 53093, 53097, 53101, 53105, 53109, - 53113, 53117, 53121, 53125, 53129, 53133, 53137, 53141, 53145, 53149, - 53153, 53157, 53161, 53165, 53169, 53173, 53177, 53181, 53185, 53189, - 53193, 53197, 53201, 53205, 53209, 53213, 53217, 53221, 53225, 53229, - 53233, 53237, 53241, 53245, 53249, 53253, 53257, 53261, 53265, 53269, - 53273, 53277, 53281, 53285, 53289, 53293, 53297, 53301, 53305, 53309, - 53313, 53317, 53321, 53325, 53329, 53333, 53337, 53344, 53352, 53358, - 53364, 53371, 53378, 53384, 53390, 53397, 53404, 53409, 53414, 53419, - 53424, 53430, 53436, 53444, 53451, 53457, 53463, 53471, 53480, 53487, - 53497, 53508, 53511, 53514, 53518, 53522, 53529, 53536, 53547, 53558, - 53567, 53576, 53582, 53588, 53595, 53602, 53611, 53621, 53632, 53642, - 53652, 53662, 53673, 53684, 53694, 53705, 53715, 53725, 53734, 53744, - 53754, 53765, 53776, 53783, 53790, 53797, 53804, 53814, 53824, 53832, - 53840, 53847, 53854, 53861, 53868, 53875, 53880, 53885, 53891, 53899, - 53909, 53917, 53925, 53933, 53941, 53949, 53957, 53965, 53973, 53982, - 53991, 54001, 54011, 54020, 54029, 54039, 54049, 54058, 54067, 54077, - 54087, 54096, 54105, 54115, 54125, 54139, 54156, 54170, 54187, 54201, - 54215, 54229, 54243, 54253, 54264, 54274, 54285, 54302, 54319, 54327, - 54333, 54340, 54347, 54354, 54361, 54366, 54372, 54377, 54382, 54388, - 54393, 54398, 54403, 54408, 54413, 54420, 54426, 54434, 54439, 54444, - 54448, 54452, 54460, 54468, 54476, 54484, 54491, 54498, 54511, 54524, - 54537, 54550, 54558, 54566, 54572, 54578, 54585, 54592, 54599, 54606, - 54610, 54615, 54623, 54631, 54639, 54646, 54650, 54658, 54666, 54670, - 54674, 54679, 54686, 54694, 54702, 54721, 54740, 54759, 54778, 54797, - 54816, 54835, 54854, 54860, 54867, 54876, 54884, 54892, 54898, 54901, - 54904, 54909, 54912, 54932, 54939, 54945, 54951, 54955, 54958, 54961, - 54964, 54976, 54990, 54997, 55004, 55007, 55011, 55014, 55019, 55024, - 55029, 55035, 55044, 55051, 55058, 55066, 55073, 55080, 55083, 55089, - 55095, 55098, 55101, 55106, 55111, 55117, 55123, 55127, 55132, 55139, - 55143, 55149, 55153, 55157, 55165, 55177, 55186, 55190, 55192, 55201, - 55210, 55216, 55219, 55225, 55231, 55236, 55241, 55246, 55251, 55256, - 55261, 55263, 55269, 55274, 55282, 55286, 55292, 55295, 55299, 55306, - 55313, 55315, 55317, 55323, 55329, 55335, 55344, 55353, 55360, 55367, - 55373, 55380, 55385, 55390, 55395, 55401, 55407, 55412, 55419, 55423, - 55427, 55440, 55453, 55465, 55474, 55480, 55487, 55492, 55497, 55502, - 55507, 55512, 55514, 55521, 55529, 55537, 55545, 55552, 55560, 55566, - 55571, 55577, 55583, 55589, 55596, 55602, 55610, 55618, 55626, 55634, - 55642, 55648, 55654, 55663, 55667, 55676, 55685, 55694, 55702, 55706, - 55712, 55719, 55726, 55730, 55736, 55744, 55750, 55755, 55761, 55766, - 55771, 55778, 55785, 55790, 55795, 55803, 55811, 55821, 55831, 55838, - 55845, 55849, 55853, 55865, 55871, 55878, 55883, 55888, 55895, 55902, - 55908, 55914, 55924, 55931, 55939, 55947, 55956, 55963, 55969, 55976, - 55982, 55990, 55998, 56006, 56014, 56020, 56025, 56035, 56046, 56053, - 56062, 56068, 56073, 56078, 56088, 56095, 56101, 56107, 56115, 56120, - 56127, 56134, 56147, 56155, 56162, 56169, 56176, 56183, 56191, 56199, - 56212, 56225, 56237, 56249, 56263, 56277, 56283, 56289, 56298, 56307, - 56314, 56321, 56330, 56339, 56348, 56357, 56365, 56373, 56383, 56393, - 56407, 56421, 56430, 56439, 56452, 56465, 56474, 56483, 56494, 56505, - 56511, 56517, 56526, 56535, 56540, 56545, 56553, 56559, 56565, 56573, - 56581, 56594, 56607, 56611, 56615, 56623, 56631, 56638, 56646, 56654, - 56663, 56672, 56678, 56684, 56691, 56698, 56705, 56712, 56721, 56730, - 56733, 56736, 56741, 56746, 56752, 56758, 56765, 56772, 56783, 56794, - 56801, 56808, 56816, 56824, 56832, 56840, 56848, 56856, 56862, 56868, - 56872, 56876, 56884, 56892, 56897, 56902, 56907, 56912, 56918, 56932, - 56939, 56946, 56950, 56952, 56954, 56959, 56964, 56969, 56974, 56982, - 56989, 56996, 57004, 57016, 57024, 57032, 57043, 57047, 57051, 57057, - 57065, 57078, 57085, 57092, 57099, 57105, 57112, 57121, 57130, 57136, - 57142, 57148, 57158, 57168, 57176, 57185, 57190, 57193, 57198, 57203, - 57208, 57214, 57220, 57224, 57227, 57231, 57235, 57240, 57245, 57251, - 57257, 57261, 57265, 57272, 57279, 57286, 57293, 57300, 57307, 57317, - 57327, 57334, 57341, 57349, 57357, 57361, 57366, 57371, 57377, 57383, - 57386, 57389, 57392, 57395, 57400, 57405, 57410, 57415, 57420, 57425, - 57429, 57433, 57437, 57442, 57447, 57451, 57455, 57461, 57465, 57471, - 57476, 57483, 57491, 57498, 57506, 57513, 57521, 57530, 57537, 57547, - 57558, 57564, 57573, 57579, 57588, 57597, 57603, 57609, 57613, 57617, - 57626, 57635, 57642, 57649, 57658, 57667, 57674, 57680, 57687, 57692, - 57696, 57700, 57705, 57710, 57715, 57723, 57731, 57734, 57738, 57747, - 57757, 57766, 57776, 57788, 57802, 57806, 57811, 57815, 57820, 57825, - 57830, 57836, 57842, 57849, 57856, 57862, 57869, 57875, 57882, 57890, - 57898, 57905, 57913, 57920, 0, 0, 57928, 57937, 57946, 57956, 57966, - 57975, 57985, 57994, 58004, 58010, 58015, 58024, 58036, 58045, 58057, - 58064, 58072, 58079, 58087, 58092, 58098, 58103, 58109, 58117, 58126, - 58134, 58143, 58147, 58151, 58155, 58159, 58169, 0, 0, 58172, 58181, - 58191, 58200, 58210, 58216, 58223, 58229, 58236, 58247, 58258, 58269, - 58280, 58290, 58300, 58310, 58320, 58328, 58336, 58344, 58352, 58360, - 58368, 58376, 58384, 58390, 58396, 58402, 58408, 58414, 58420, 58426, - 58432, 58444, 58454, 58459, 58466, 58471, 58478, 58481, 58485, 58489, - 58494, 58499, 58504, 58507, 58516, 58525, 58534, 0, 58543, 58549, 58555, - 58563, 58573, 58580, 58589, 58594, 58597, 58600, 58605, 58610, 58615, - 58620, 58622, 58624, 58626, 58628, 58630, 58632, 58637, 58644, 58651, - 58653, 58655, 58657, 58659, 58661, 58663, 58665, 58667, 58672, 58677, - 58684, 58691, 58700, 58710, 58719, 58729, 58734, 58739, 58741, 58748, - 58755, 58762, 58769, 58776, 58783, 58790, 58793, 58796, 58799, 58802, 0, - 58807, 58812, 58817, 58822, 58827, 58832, 58837, 58842, 58847, 58852, - 58857, 58863, 58867, 58872, 58877, 58882, 58887, 58892, 58897, 58902, - 58907, 58912, 58917, 58922, 58927, 58932, 58937, 58942, 58947, 58952, - 58957, 58962, 58967, 58972, 58977, 58983, 58988, 58994, 59003, 59008, - 59016, 59023, 59032, 59037, 59042, 59047, 59053, 0, 59060, 59065, 59070, - 59075, 59080, 59085, 59090, 59095, 59100, 59105, 59110, 59116, 59120, - 59125, 59130, 59135, 59140, 59145, 59150, 59155, 59160, 59165, 59170, - 59175, 59180, 59185, 59190, 59195, 59200, 59205, 59210, 59215, 59220, - 59225, 59230, 59236, 59241, 59247, 59256, 59261, 59269, 59276, 59285, - 59290, 59295, 59300, 59306, 0, 59313, 59321, 59329, 59338, 59345, 59353, - 59359, 59368, 59376, 59384, 59392, 59400, 59408, 59416, 59421, 59428, - 59434, 59441, 59449, 59456, 59463, 59471, 59477, 59483, 59490, 59498, - 59508, 59518, 59525, 59532, 59537, 59547, 59557, 59562, 59567, 59572, - 59577, 59582, 59587, 59592, 59597, 59602, 59607, 59612, 59617, 59622, - 59627, 59632, 59637, 59642, 59647, 59652, 59657, 59662, 59667, 59672, - 59677, 59682, 59687, 59692, 59697, 59702, 59707, 59711, 59715, 59720, - 59725, 59730, 59735, 59740, 59745, 59750, 59755, 59760, 59765, 59770, - 59775, 59780, 59785, 59790, 59795, 59800, 59805, 59812, 59819, 59826, - 59833, 59840, 59847, 59854, 59861, 59868, 59875, 59882, 59889, 59896, - 59903, 59908, 59913, 59920, 59927, 59934, 59941, 59948, 59955, 59962, - 59969, 59976, 59983, 59990, 59997, 60003, 60009, 60015, 60021, 60028, - 60035, 60042, 60049, 60056, 60063, 60070, 60077, 60084, 60091, 60099, - 60107, 60115, 60123, 60131, 60139, 60147, 60155, 60159, 60165, 60171, - 60175, 60181, 60187, 60193, 60200, 60207, 60214, 60221, 60226, 60232, - 60238, 60245, 0, 0, 0, 0, 0, 60252, 60260, 60269, 60278, 60286, 60292, - 60297, 60302, 60307, 60312, 60317, 60322, 60327, 60332, 60337, 60342, - 60347, 60352, 60357, 60362, 60367, 60372, 60377, 60382, 60387, 60392, - 60397, 60402, 60407, 60412, 60417, 60422, 60427, 60432, 60437, 60442, - 60447, 60452, 60457, 60462, 60467, 60472, 60477, 60482, 60487, 0, 60492, - 0, 0, 0, 0, 0, 60497, 0, 0, 60502, 60506, 60511, 60516, 60521, 60526, - 60535, 60540, 60545, 60550, 60555, 60560, 60565, 60570, 60575, 60582, - 60587, 60592, 60601, 60608, 60613, 60618, 60623, 60630, 60635, 60642, - 60647, 60652, 60659, 60666, 60671, 60676, 60681, 60688, 60695, 60700, - 60705, 60710, 60715, 60720, 60727, 60734, 60739, 60744, 60749, 60754, - 60759, 60764, 60769, 60774, 60779, 60784, 60789, 60796, 60801, 60806, 0, - 0, 0, 0, 0, 0, 0, 60811, 60818, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 60823, 60828, 60832, 60836, 60840, 60844, 60848, 60852, 60856, 60860, - 60864, 60868, 60874, 60878, 60882, 60886, 60890, 60894, 60898, 60902, - 60906, 60910, 60914, 60918, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60922, 60926, - 60930, 60934, 60938, 60942, 60946, 0, 60950, 60954, 60958, 60962, 60966, - 60970, 60974, 0, 60978, 60982, 60986, 60990, 60994, 60998, 61002, 0, - 61006, 61010, 61014, 61018, 61022, 61026, 61030, 0, 61034, 61038, 61042, - 61046, 61050, 61054, 61058, 0, 61062, 61066, 61070, 61074, 61078, 61082, - 61086, 0, 61090, 61094, 61098, 61102, 61106, 61110, 61114, 0, 61118, - 61122, 61126, 61130, 61134, 61138, 61142, 0, 61146, 61151, 61156, 61161, - 61166, 61171, 61176, 61180, 61185, 61190, 61195, 61199, 61204, 61209, - 61214, 61219, 61223, 61228, 61233, 61238, 61243, 61248, 61253, 61257, - 61262, 61267, 61274, 61279, 61284, 61290, 61297, 61304, 61313, 61320, - 61329, 61333, 61337, 61343, 61349, 61355, 61363, 61369, 61373, 61377, - 61381, 61387, 61393, 61397, 61399, 61403, 61409, 61411, 61415, 61419, - 61423, 61429, 61434, 61438, 61442, 61447, 61453, 61458, 61463, 61468, - 61473, 61480, 61487, 61492, 61497, 61502, 61507, 61512, 61517, 61521, - 61525, 61533, 61541, 61547, 61551, 61556, 61559, 61563, 61570, 61574, - 61578, 61582, 61586, 61592, 61598, 61602, 61608, 61612, 61616, 61622, - 61627, 61632, 61634, 61637, 61641, 61647, 61653, 61657, 61662, 61671, - 61674, 61680, 61685, 61689, 61693, 61697, 61700, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32576, 32582, 32588, + 32592, 32596, 32600, 32604, 32610, 32614, 32620, 32624, 32630, 32636, + 32644, 32650, 32658, 32662, 32666, 32670, 32676, 32679, 32685, 32689, + 32695, 32699, 32703, 32709, 32713, 32719, 32723, 32729, 32737, 32745, + 32753, 32759, 32762, 32768, 32772, 32778, 32781, 32784, 32790, 32794, + 32800, 32803, 32806, 32809, 32812, 32816, 32822, 32828, 32831, 32834, + 32838, 32843, 32848, 32855, 32860, 32867, 32874, 32883, 32890, 32899, + 32904, 32911, 32918, 32927, 32932, 32939, 32944, 32950, 32956, 32962, + 32968, 32974, 32980, 0, 0, 0, 0, 32986, 32990, 32993, 32996, 32999, + 33002, 33005, 33008, 33011, 33014, 33017, 33020, 33023, 33026, 33031, + 33036, 33041, 33044, 33049, 33054, 33059, 33064, 33071, 33076, 33081, + 33086, 33091, 33098, 33104, 33110, 33116, 33122, 33128, 33137, 33146, + 33152, 33158, 33166, 33174, 33183, 33192, 33200, 33208, 33217, 33226, 0, + 0, 0, 33234, 33239, 33244, 33249, 33253, 33257, 33261, 33266, 33270, + 33274, 33279, 33283, 33288, 33293, 33298, 33303, 33308, 33313, 33318, + 33322, 33327, 33331, 33335, 33340, 33345, 33350, 33354, 33358, 33362, + 33366, 33371, 33375, 33380, 33384, 33390, 33396, 33402, 33408, 33414, + 33420, 33426, 33432, 33438, 33443, 33448, 33455, 33463, 33468, 33473, + 33478, 33482, 33486, 33490, 33494, 33498, 33502, 33506, 33510, 33514, + 33518, 33523, 33528, 33533, 33539, 33545, 33549, 33555, 33559, 33565, + 33571, 33576, 33583, 33587, 33593, 33597, 33603, 33608, 33615, 33622, + 33627, 33634, 33639, 33644, 33648, 33654, 33658, 33664, 33670, 33676, + 33680, 33686, 33692, 33696, 33702, 33707, 33711, 33717, 33722, 33727, + 33732, 33737, 33741, 33745, 33750, 33755, 33762, 33768, 33773, 33780, + 33785, 33792, 33797, 33806, 33812, 33818, 33822, 0, 0, 0, 0, 0, 0, 0, 0, + 33826, 33835, 33842, 33849, 33856, 33860, 33865, 33870, 33875, 33880, + 33885, 33890, 33895, 33900, 33905, 33909, 33914, 33919, 33923, 33927, + 33932, 33937, 33942, 33947, 33952, 33957, 33961, 33966, 33971, 33976, + 33981, 33985, 33989, 33993, 33997, 34002, 34007, 34011, 34016, 34021, + 34025, 34031, 34037, 34043, 34048, 34053, 34059, 34064, 34070, 34075, + 34081, 34087, 34092, 34098, 34104, 34109, 34115, 34121, 34127, 34132, 0, + 0, 0, 34137, 34143, 34153, 34159, 34167, 34173, 34178, 34182, 34186, + 34190, 34194, 34198, 34202, 34206, 34210, 0, 0, 0, 34214, 34219, 34224, + 34229, 34236, 34242, 34248, 34254, 34260, 34266, 34272, 34278, 34284, + 34290, 34296, 34303, 34310, 34317, 34324, 34331, 34338, 34345, 34352, + 34359, 34366, 34373, 34380, 34387, 34394, 34401, 34408, 34415, 34422, + 34429, 34436, 34443, 34450, 34457, 34464, 34471, 34478, 34485, 34492, + 34499, 34507, 34515, 34523, 34529, 34535, 34541, 34549, 34558, 34565, + 34572, 34578, 34585, 34592, 34599, 34607, 34614, 0, 0, 0, 0, 0, 0, 0, + 34621, 34628, 34635, 34642, 34649, 34656, 34663, 34670, 34677, 34684, + 34691, 34698, 34705, 34712, 34719, 34726, 34733, 34740, 34747, 34754, + 34761, 34768, 34775, 34782, 34789, 34796, 34803, 34810, 34817, 34824, + 34831, 34838, 34845, 34852, 34859, 34866, 34873, 34880, 34887, 34894, + 34901, 34908, 34916, 0, 0, 34923, 34930, 34938, 34946, 34954, 34962, + 34970, 34978, 34988, 34998, 35008, 0, 0, 0, 0, 0, 0, 0, 0, 35018, 35023, + 35028, 35033, 35038, 35047, 35058, 35067, 35078, 35084, 35097, 35103, + 35110, 35117, 35122, 35129, 35136, 35147, 35156, 35163, 35170, 35179, + 35186, 35195, 35205, 35215, 35222, 35229, 35236, 35246, 35251, 35259, + 35265, 35273, 35282, 35287, 35294, 35300, 35305, 35310, 35315, 35321, + 35328, 0, 0, 0, 0, 0, 35336, 35341, 35347, 35353, 35361, 35367, 35373, + 35379, 35384, 35390, 35395, 35401, 35407, 35415, 35421, 35429, 35434, + 35440, 35446, 35453, 35461, 35467, 35473, 35480, 35487, 35493, 35500, + 35506, 35512, 35517, 35523, 35531, 35539, 35545, 35551, 35557, 35563, + 35571, 35575, 35581, 35587, 35593, 35599, 35605, 35611, 35615, 35620, + 35625, 35632, 35637, 35641, 35647, 35652, 35657, 35661, 35666, 35671, + 35675, 35680, 35685, 35692, 35696, 35701, 35706, 35710, 35715, 35719, + 35724, 35728, 35733, 35738, 35744, 35749, 35754, 35758, 35763, 35768, + 35774, 35779, 35784, 35789, 35794, 35799, 35803, 35808, 35815, 35822, + 35827, 35832, 35836, 35842, 35848, 35853, 35858, 35863, 35869, 35874, + 35880, 35885, 35891, 35897, 35903, 35910, 35917, 35924, 35931, 35938, + 35945, 35950, 35958, 35967, 35976, 35985, 35994, 36003, 36012, 36024, + 36033, 36042, 36051, 36057, 36062, 36069, 36077, 36085, 36092, 36099, + 36106, 36113, 36121, 36130, 36139, 36148, 36157, 36166, 36175, 36184, + 36193, 36202, 36211, 36220, 36229, 36238, 36247, 36255, 36264, 36275, + 36284, 36294, 36306, 36315, 36324, 36333, 36342, 36350, 36359, 36365, + 36370, 36378, 36383, 36390, 36395, 36404, 36410, 36416, 36423, 36428, + 36433, 36441, 36449, 36458, 36467, 36472, 36479, 36489, 36497, 36506, + 36512, 36518, 36523, 36530, 36535, 36544, 36549, 36554, 36559, 36566, + 36572, 36577, 36586, 36594, 36599, 36604, 36611, 36618, 36622, 36626, + 36629, 36632, 36635, 36638, 36641, 36644, 36651, 36654, 36657, 36662, + 36666, 36670, 36674, 36678, 36682, 36691, 36697, 36703, 36709, 36717, + 36725, 36731, 36737, 36744, 36750, 36755, 36761, 36768, 36774, 36781, + 36787, 36795, 36801, 36808, 36814, 36820, 36826, 36832, 36838, 36844, + 36855, 36865, 36871, 36877, 36887, 36893, 36901, 36909, 36917, 36922, + 36928, 36934, 36939, 0, 36947, 36951, 36958, 36965, 36970, 36979, 36987, + 36995, 37002, 37009, 37016, 37023, 37031, 37039, 37049, 37059, 37067, + 37075, 37083, 37091, 37100, 37109, 37117, 37125, 37134, 37143, 37154, + 37165, 37175, 37185, 37194, 37203, 37212, 37221, 37232, 37243, 37251, + 37259, 37267, 37275, 37283, 37291, 37299, 37307, 37315, 37323, 37331, + 37339, 37348, 37357, 37366, 37375, 37385, 37395, 37402, 37409, 37417, + 37425, 37434, 37443, 37451, 37459, 37471, 37483, 37492, 37501, 37510, + 37519, 37526, 37533, 37541, 37549, 37557, 37565, 37573, 37581, 37589, + 37597, 37606, 37615, 37624, 37633, 37642, 37651, 37661, 37671, 37681, + 37691, 37700, 37709, 37716, 37723, 37731, 37739, 37747, 37755, 37763, + 37771, 37783, 37795, 37804, 37813, 37821, 37829, 37837, 37845, 37856, + 37867, 37878, 37889, 37901, 37913, 37921, 37929, 37937, 37945, 37954, + 37963, 37972, 37981, 37989, 37997, 38005, 38013, 38021, 38029, 38038, + 38047, 38057, 38067, 38075, 38083, 38091, 38099, 38107, 38115, 38122, + 38129, 38137, 38145, 38153, 38161, 38169, 38177, 38185, 38193, 38201, + 38209, 38217, 38225, 38233, 38241, 38249, 38257, 38266, 38275, 38284, + 38292, 38301, 38310, 38319, 38328, 38338, 38347, 38354, 38359, 38366, + 38373, 38381, 38389, 38398, 38407, 38417, 38427, 38438, 38449, 38459, + 38469, 38479, 38489, 38498, 38507, 38517, 38527, 38538, 38549, 38559, + 38569, 38579, 38589, 38597, 38605, 38614, 38623, 38631, 38639, 38649, + 38659, 38670, 38681, 38693, 38705, 38716, 38727, 38738, 38749, 38758, + 38767, 38775, 38783, 38790, 38797, 38805, 38813, 38822, 38831, 38841, + 38851, 38862, 38873, 38883, 38893, 38903, 38913, 38922, 38931, 38941, + 38951, 38962, 38973, 38983, 38993, 39003, 39013, 39020, 39027, 39035, + 39043, 39052, 39061, 39071, 39081, 39092, 39103, 39113, 39123, 39133, + 39143, 39151, 39159, 39167, 39175, 39184, 39193, 39201, 39209, 39216, + 39223, 39230, 39237, 39245, 39253, 39261, 39269, 39280, 39291, 39302, + 39313, 39324, 39335, 39343, 39351, 39362, 39373, 39384, 39395, 39406, + 39417, 39425, 39433, 39444, 39455, 39466, 0, 0, 39477, 39485, 39493, + 39504, 39515, 39526, 0, 0, 39537, 39545, 39553, 39564, 39575, 39586, + 39597, 39608, 39619, 39627, 39635, 39646, 39657, 39668, 39679, 39690, + 39701, 39709, 39717, 39728, 39739, 39750, 39761, 39772, 39783, 39791, + 39799, 39810, 39821, 39832, 39843, 39854, 39865, 39873, 39881, 39892, + 39903, 39914, 0, 0, 39925, 39933, 39941, 39952, 39963, 39974, 0, 0, + 39985, 39993, 40001, 40012, 40023, 40034, 40045, 40056, 0, 40067, 0, + 40075, 0, 40086, 0, 40097, 40108, 40116, 40124, 40135, 40146, 40157, + 40168, 40179, 40190, 40198, 40206, 40217, 40228, 40239, 40250, 40261, + 40272, 40280, 40288, 40296, 40304, 40312, 40320, 40328, 40336, 40344, + 40352, 40360, 40368, 40376, 0, 0, 40384, 40395, 40406, 40420, 40434, + 40448, 40462, 40476, 40490, 40501, 40512, 40526, 40540, 40554, 40568, + 40582, 40596, 40607, 40618, 40632, 40646, 40660, 40674, 40688, 40702, + 40713, 40724, 40738, 40752, 40766, 40780, 40794, 40808, 40819, 40830, + 40844, 40858, 40872, 40886, 40900, 40914, 40925, 40936, 40950, 40964, + 40978, 40992, 41006, 41020, 41028, 41036, 41047, 41055, 0, 41066, 41074, + 41085, 41093, 41101, 41109, 41117, 41125, 41128, 41131, 41134, 41137, + 41143, 41154, 41162, 0, 41173, 41181, 41192, 41200, 41208, 41216, 41224, + 41232, 41238, 41244, 41250, 41258, 41266, 41277, 0, 0, 41288, 41296, + 41307, 41315, 41323, 41331, 0, 41339, 41345, 41351, 41357, 41365, 41373, + 41384, 41395, 41403, 41411, 41419, 41430, 41438, 41446, 41454, 41462, + 41470, 41476, 41482, 0, 0, 41485, 41496, 41504, 0, 41515, 41523, 41534, + 41542, 41550, 41558, 41566, 41574, 41577, 0, 41580, 41584, 41588, 41592, + 41596, 41600, 41604, 41608, 41612, 41616, 41620, 41624, 41630, 41636, + 41642, 41645, 41648, 41650, 41654, 41658, 41662, 41666, 41669, 41673, + 41677, 41683, 41689, 41696, 41703, 41708, 41713, 41719, 41725, 41727, + 41730, 41732, 41736, 41740, 41744, 41748, 41752, 41756, 41760, 41764, + 41768, 41774, 41778, 41782, 41788, 41793, 41800, 41802, 41805, 41809, + 41813, 41818, 41824, 41826, 41835, 41844, 41847, 41851, 41853, 41855, + 41857, 41860, 41866, 41868, 41872, 41875, 41882, 41889, 41893, 41898, + 41903, 41908, 41913, 41917, 41921, 41924, 41928, 41932, 41939, 41944, + 41948, 41952, 41957, 41961, 41965, 41970, 41975, 41979, 41983, 41987, + 41989, 41994, 41999, 42003, 42007, 42011, 42015, 0, 42019, 42023, 42027, + 42033, 42039, 42045, 42051, 42058, 42065, 42070, 42075, 42079, 0, 0, + 42085, 42088, 42091, 42094, 42097, 42100, 42103, 42107, 42111, 42116, + 42121, 42126, 42133, 42137, 42140, 42143, 42146, 42149, 42152, 42155, + 42158, 42161, 42164, 42168, 42172, 42177, 42182, 0, 42187, 42193, 42199, + 42205, 42212, 42219, 42226, 42233, 42239, 42246, 42253, 42260, 42267, 0, + 0, 0, 42274, 42277, 42280, 42283, 42288, 42291, 42294, 42297, 42300, + 42303, 42306, 42311, 42314, 42317, 42320, 42323, 42326, 42331, 42334, + 42337, 42340, 42343, 42346, 42351, 42354, 42357, 42362, 42367, 42371, + 42374, 42377, 42380, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 42383, 42388, 42393, 42400, 42408, 42413, 42418, 42422, 42426, 42431, + 42438, 42445, 42450, 42456, 42461, 42466, 42471, 42478, 42483, 42488, + 42493, 42502, 42509, 42516, 42520, 42525, 42531, 42536, 42543, 42551, + 42559, 42563, 42567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42571, + 42575, 42583, 42588, 42592, 42597, 42601, 42605, 42609, 42611, 42615, + 42619, 42623, 42628, 42633, 42637, 42645, 42648, 42652, 42655, 42658, + 42664, 42669, 42672, 42678, 42682, 42687, 42692, 42695, 42699, 42703, + 42707, 42709, 42712, 42715, 42719, 42721, 42726, 42729, 42732, 42737, + 42742, 42748, 42751, 42754, 42758, 42763, 42766, 42769, 42772, 42776, + 42780, 42784, 42787, 42789, 42792, 42795, 42798, 42802, 42807, 42810, + 42815, 42820, 42825, 42830, 42836, 42841, 42845, 42850, 42855, 42861, + 42867, 42872, 42877, 42883, 42887, 42890, 42893, 42895, 42899, 42905, + 42911, 42917, 42923, 42929, 42935, 42941, 42947, 42953, 42960, 42966, + 42973, 42979, 42985, 42992, 42999, 43003, 43008, 43013, 43018, 43023, + 43028, 43033, 43038, 43043, 43048, 43054, 43060, 43066, 43072, 43079, + 43087, 43093, 43099, 43105, 43111, 43117, 43123, 43129, 43135, 43141, + 43147, 43154, 43161, 43168, 43175, 43183, 43192, 43199, 43210, 43217, + 43224, 43233, 43240, 43249, 43258, 43265, 43273, 43280, 43283, 0, 0, 0, + 0, 43286, 43288, 43291, 43293, 43296, 43299, 43302, 43306, 43310, 43315, + 43320, 43324, 43328, 43332, 43336, 43341, 43347, 43352, 43358, 43363, + 43368, 43373, 43379, 43384, 43390, 43396, 43400, 43404, 43409, 43414, + 43419, 43424, 43429, 43437, 43445, 43453, 43461, 43468, 43476, 43483, + 43490, 43498, 43510, 43516, 43522, 43529, 43536, 43544, 43552, 43559, + 43566, 43574, 43582, 43587, 43595, 43600, 43605, 43611, 43616, 43622, + 43629, 43636, 43641, 43647, 43652, 43655, 43659, 43662, 43666, 43670, + 43674, 43679, 43684, 43690, 43696, 43700, 43704, 43708, 43712, 43718, + 43724, 43728, 43733, 43737, 43742, 43747, 43752, 43755, 43759, 43762, + 43766, 43773, 43781, 43793, 43804, 43809, 43818, 43825, 43833, 43842, + 43846, 43852, 43860, 43864, 43869, 43874, 43880, 43886, 43892, 43899, + 43903, 43907, 43912, 43915, 43917, 43921, 43925, 43933, 43937, 43939, + 43941, 43945, 43953, 43958, 43964, 43974, 43981, 43986, 43990, 43994, + 43998, 44001, 44004, 44007, 44011, 44015, 44019, 44023, 44027, 44030, + 44034, 44038, 44041, 44043, 44046, 44048, 44052, 44056, 44058, 44064, + 44067, 44072, 44076, 44080, 44082, 44084, 44086, 44089, 44093, 44097, + 44101, 44105, 44109, 44115, 44121, 44123, 44125, 44127, 44129, 44132, + 44134, 44138, 44140, 44144, 44148, 44154, 44158, 44162, 44166, 44170, + 44174, 44180, 44184, 44194, 44204, 44208, 44214, 44221, 44225, 44229, + 44232, 44237, 44241, 44247, 44251, 44264, 44273, 44277, 44281, 44287, + 44291, 44294, 44296, 44299, 44303, 44307, 44314, 44318, 44322, 44326, + 44329, 44334, 44339, 44345, 44351, 44356, 44361, 44369, 44377, 44381, + 44385, 44387, 44392, 44396, 44400, 44408, 44416, 44423, 44430, 44439, + 44448, 44454, 44460, 44468, 44476, 44478, 44480, 44486, 44492, 44499, + 44506, 44512, 44518, 44522, 44526, 44533, 44540, 44547, 44554, 44564, + 44574, 44582, 44590, 44592, 44596, 44600, 44605, 44610, 44618, 44626, + 44629, 44632, 44635, 44638, 44641, 44646, 44650, 44655, 44660, 44663, + 44666, 44669, 44672, 44675, 44679, 44682, 44685, 44688, 44691, 44693, + 44695, 44697, 44699, 44707, 44715, 44721, 44725, 44731, 44741, 44747, + 44753, 44759, 44767, 44776, 44788, 44792, 44796, 44798, 44804, 44806, + 44808, 44810, 44812, 44818, 44821, 44827, 44833, 44837, 44841, 44845, + 44848, 44852, 44856, 44858, 44867, 44876, 44881, 44886, 44892, 44898, + 44904, 44907, 44910, 44913, 44916, 44918, 44923, 44928, 44933, 44939, + 44945, 44954, 44963, 44970, 44977, 44984, 44991, 45001, 45011, 45021, + 45031, 45041, 45051, 45060, 45069, 45078, 45087, 45095, 45107, 45118, + 45134, 45137, 45143, 45149, 45155, 45163, 45178, 45194, 45200, 45206, + 45213, 45219, 45228, 45235, 45249, 45264, 45269, 45275, 45283, 45286, + 45289, 45291, 45294, 45297, 45299, 45301, 45305, 45308, 45311, 45314, + 45317, 45322, 45327, 45332, 45337, 45342, 45345, 45347, 45349, 45351, + 45355, 45359, 45363, 45369, 45373, 45375, 45377, 45382, 45387, 45392, + 45397, 45402, 45407, 45409, 45411, 45421, 45425, 45433, 45442, 45444, + 45449, 45454, 45462, 45466, 45468, 45472, 45474, 45478, 45482, 45486, + 45488, 45490, 45492, 45499, 45508, 45517, 45526, 45535, 45544, 45553, + 45562, 45571, 45579, 45587, 45596, 45605, 45614, 45623, 45631, 45639, + 45648, 45657, 45666, 45676, 45685, 45695, 45704, 45714, 45723, 45733, + 45743, 45752, 45762, 45771, 45781, 45790, 45800, 45809, 45818, 45827, + 45836, 45845, 45855, 45864, 45873, 45882, 45892, 45901, 45910, 45919, + 45928, 45938, 45948, 45957, 45966, 45974, 45983, 45990, 45999, 46008, + 46019, 46028, 46038, 46048, 46055, 46062, 46069, 46078, 46087, 46096, + 46105, 46112, 46117, 46126, 46131, 46134, 46141, 46144, 46149, 46154, + 46157, 46160, 46168, 46171, 46176, 46179, 46187, 46192, 46200, 46203, + 46206, 46209, 46214, 46219, 46222, 46225, 46233, 46236, 46243, 46250, + 46254, 46258, 46263, 46268, 46274, 46279, 46285, 46291, 46296, 46302, + 46310, 46316, 46324, 46332, 46338, 46346, 46354, 46362, 46370, 46376, + 46384, 46392, 46400, 46404, 46410, 46424, 46438, 46442, 46446, 46450, + 46454, 46464, 46468, 46473, 46478, 46484, 46490, 46496, 46502, 46512, + 46522, 46530, 46541, 46552, 46560, 46571, 46582, 46590, 46601, 46612, + 46620, 46628, 46638, 46648, 46651, 46654, 46657, 46662, 46666, 46672, + 46679, 46686, 46694, 46701, 46705, 46709, 46713, 46717, 46719, 46723, + 46727, 46732, 46737, 46744, 46751, 46754, 46761, 46763, 46765, 46769, + 46773, 46778, 46784, 46790, 46796, 46802, 46811, 46820, 46829, 46833, + 46835, 46839, 46846, 46853, 46860, 46867, 46874, 46877, 46882, 46888, + 46891, 46896, 46901, 46906, 46911, 46915, 46922, 46929, 46936, 46943, + 46947, 46951, 46955, 46959, 46965, 46971, 46976, 46982, 46988, 46994, + 47000, 47008, 47015, 47022, 47029, 47036, 47042, 47048, 47057, 47061, + 47068, 47072, 47076, 47082, 47088, 47094, 47100, 47104, 47108, 47111, + 47114, 47118, 47125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 47132, 47135, 47139, 47143, 47149, 47155, 47161, + 47169, 47176, 47180, 47188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 47193, 47196, 47199, 47202, 47205, 47208, 47211, 47214, + 47217, 47220, 47224, 47228, 47232, 47236, 47240, 47244, 47248, 47252, + 47256, 47260, 47264, 47267, 47270, 47273, 47276, 47279, 47282, 47285, + 47288, 47291, 47295, 47299, 47303, 47307, 47311, 47315, 47319, 47323, + 47327, 47331, 47335, 47341, 47347, 47353, 47360, 47367, 47374, 47381, + 47388, 47395, 47402, 47409, 47416, 47423, 47430, 47437, 47444, 47451, + 47458, 47465, 47472, 47477, 47483, 47489, 47495, 47500, 47506, 47512, + 47518, 47523, 47529, 47535, 47540, 47546, 47552, 47557, 47563, 47569, + 47574, 47580, 47586, 47591, 47597, 47603, 47609, 47615, 47621, 47626, + 47632, 47638, 47644, 47649, 47655, 47661, 47667, 47672, 47678, 47684, + 47689, 47695, 47701, 47706, 47712, 47718, 47723, 47729, 47735, 47740, + 47746, 47752, 47758, 47764, 47770, 47775, 47781, 47787, 47793, 47798, + 47804, 47810, 47816, 47821, 47827, 47833, 47838, 47844, 47850, 47855, + 47861, 47867, 47872, 47878, 47884, 47889, 47895, 47901, 47907, 47913, + 47919, 47923, 47929, 47935, 47941, 47947, 47953, 47959, 47965, 47971, + 47977, 47983, 47987, 47991, 47995, 47999, 48003, 48007, 48011, 48015, + 48019, 48024, 48030, 48035, 48040, 48045, 48050, 48059, 48068, 48077, + 48086, 48095, 48104, 48113, 48122, 48129, 48137, 48145, 48152, 48159, + 48167, 48175, 48182, 48189, 48197, 48205, 48212, 48219, 48227, 48235, + 48242, 48249, 48257, 48266, 48275, 48283, 48292, 48301, 48308, 48315, + 48323, 48332, 48341, 48349, 48358, 48367, 48374, 48381, 48390, 48399, + 48408, 48417, 48426, 48435, 48442, 48449, 48458, 48467, 48476, 48485, + 48494, 48503, 48510, 48517, 48526, 48535, 48544, 48554, 48564, 48573, + 48583, 48593, 48603, 48613, 48623, 48633, 48642, 48651, 48658, 48666, + 48674, 48682, 48690, 48695, 48700, 48709, 48717, 48724, 48733, 48741, + 48748, 48757, 48765, 48772, 48781, 48789, 48796, 48805, 48813, 48820, + 48829, 48837, 48844, 48854, 48863, 48870, 48880, 48889, 48896, 48906, + 48915, 48922, 48931, 48940, 48949, 48958, 48972, 48986, 48993, 48998, + 49003, 49008, 49013, 49018, 49023, 49028, 49033, 49041, 49049, 49057, + 49065, 49070, 49077, 49084, 49091, 49096, 49104, 49111, 49119, 49123, + 49130, 49136, 49143, 49147, 49153, 49159, 49165, 49169, 49172, 49176, + 49180, 49187, 49193, 49199, 49205, 49211, 49225, 49235, 49249, 49263, + 49269, 49279, 49293, 49296, 49299, 49306, 49314, 49320, 49325, 49333, + 49345, 49357, 49365, 49369, 49373, 49376, 49379, 49383, 49387, 49390, + 49393, 49398, 49403, 49409, 49415, 49420, 49425, 49431, 49437, 49442, + 49447, 49452, 49457, 49463, 49469, 49474, 49479, 49485, 49491, 49496, + 49501, 49504, 49507, 49516, 49518, 49520, 49523, 49527, 49533, 49535, + 49538, 49545, 49552, 49560, 49568, 49578, 49592, 49597, 49602, 49606, + 49611, 49619, 49627, 49636, 49645, 49654, 49663, 49668, 49673, 49679, + 49685, 49691, 49697, 49700, 49706, 49712, 49722, 49732, 49740, 49748, + 49757, 49766, 49770, 49778, 49786, 49794, 49802, 49811, 49820, 49829, + 49838, 49843, 49848, 49853, 49858, 49863, 49869, 49875, 49880, 49886, + 49888, 49890, 49892, 49894, 49897, 49900, 49902, 49904, 49906, 49910, + 49914, 49916, 49918, 49921, 49924, 49928, 49934, 49940, 49942, 49949, + 49953, 49958, 49963, 49965, 49975, 49981, 49987, 49993, 49999, 50005, + 50011, 50016, 50019, 50022, 50025, 50027, 50029, 50033, 50037, 50042, + 50047, 50052, 50055, 50059, 50064, 50067, 50071, 50076, 50081, 50086, + 50091, 50096, 50101, 50106, 50111, 50116, 50121, 50126, 50131, 50137, + 50143, 50149, 50151, 50154, 50156, 50159, 50161, 50163, 50165, 50167, + 50169, 50171, 50173, 50175, 50177, 50179, 50181, 50183, 50185, 50187, + 50189, 50191, 50193, 50198, 50203, 50208, 50213, 50218, 50223, 50228, + 50233, 50238, 50243, 50248, 50253, 50258, 50263, 50268, 50273, 50278, + 50283, 50288, 50293, 50297, 50301, 50305, 50311, 50317, 50322, 50327, + 50332, 50338, 50344, 50349, 50357, 50365, 50373, 50381, 50389, 50397, + 50405, 50413, 50419, 50424, 50429, 50434, 50437, 50441, 50445, 50449, + 50453, 50457, 50461, 50468, 50475, 50483, 50491, 50496, 50501, 50508, + 50515, 50522, 50529, 50532, 50535, 50540, 50542, 50546, 50551, 50553, + 50555, 50557, 50559, 50564, 50567, 50569, 50574, 50581, 50588, 50591, + 50595, 50600, 50605, 50613, 50619, 50625, 50637, 50644, 50652, 50657, + 50662, 50668, 50671, 50674, 50679, 50681, 50685, 50687, 50689, 50691, + 50693, 50695, 50697, 50702, 50704, 50706, 50708, 50710, 50714, 50716, + 50719, 50724, 50729, 50734, 50739, 50745, 50751, 50753, 50756, 50763, + 50769, 50775, 50782, 50786, 50790, 50792, 50794, 50798, 50804, 50809, + 50811, 50815, 50824, 50832, 50840, 50846, 50852, 50857, 50863, 50868, + 50871, 50885, 50888, 50893, 50898, 50904, 50915, 50917, 50923, 50929, + 50933, 50940, 50944, 50946, 50948, 50952, 50958, 50963, 50969, 50971, + 50977, 50979, 50985, 50987, 50989, 50994, 50996, 51000, 51005, 51007, + 51012, 51017, 51021, 51028, 51038, 51043, 51049, 51052, 51058, 51061, + 51066, 51071, 51075, 51077, 51079, 51083, 51087, 51091, 51095, 51100, + 51102, 51107, 51110, 51113, 51116, 51120, 51124, 51129, 51133, 51138, + 51143, 51147, 51152, 51158, 51161, 51167, 51172, 51176, 51181, 51187, + 51193, 51200, 51206, 51213, 51220, 51222, 51229, 51233, 51239, 51245, + 51250, 51256, 51260, 51265, 51268, 51273, 51279, 51286, 51294, 51301, + 51310, 51320, 51327, 51333, 51337, 51344, 51349, 51358, 51361, 51364, + 51373, 51383, 51390, 51392, 51398, 51403, 51405, 51408, 51412, 51420, + 51429, 51432, 51437, 51443, 51451, 51459, 51467, 51475, 51481, 51487, + 51493, 51501, 51506, 51509, 51513, 51516, 51527, 51537, 51547, 51556, + 51567, 51577, 51586, 51592, 51600, 51604, 51612, 51616, 51624, 51631, + 51638, 51647, 51656, 51666, 51676, 51686, 51696, 51705, 51714, 51724, + 51734, 51743, 51752, 51759, 51766, 51773, 51780, 51787, 51794, 51801, + 51808, 51815, 51823, 51829, 51835, 51841, 51847, 51853, 51859, 51865, + 51871, 51877, 51884, 51892, 51900, 51908, 51916, 51924, 51932, 51940, + 51948, 51956, 51965, 51970, 51973, 51977, 51981, 51987, 51990, 51995, + 52001, 52006, 52010, 52015, 52021, 52028, 52031, 52038, 52045, 52049, + 52058, 52067, 52072, 52078, 52083, 52088, 52095, 52102, 52110, 52118, + 52127, 52131, 52140, 52145, 52149, 52156, 52160, 52166, 52174, 52179, + 52186, 52190, 52195, 52199, 52204, 52208, 52213, 52218, 52227, 52229, + 52232, 52235, 52242, 52249, 52255, 52263, 52269, 52276, 52281, 52284, + 52289, 52294, 52299, 52307, 52311, 52318, 52326, 52334, 52339, 52344, + 52350, 52355, 52360, 52366, 52371, 52374, 52378, 52382, 52389, 52399, + 52404, 52413, 52422, 52428, 52434, 52439, 52444, 52449, 52454, 52460, + 52466, 52474, 52482, 52488, 52494, 52499, 52504, 52511, 52518, 52524, + 52527, 52530, 52534, 52538, 52542, 52547, 52553, 52559, 52566, 52573, + 52578, 52582, 52586, 52590, 52594, 52598, 52602, 52606, 52610, 52614, + 52618, 52622, 52626, 52630, 52634, 52638, 52642, 52646, 52650, 52654, + 52658, 52662, 52666, 52670, 52674, 52678, 52682, 52686, 52690, 52694, + 52698, 52702, 52706, 52710, 52714, 52718, 52722, 52726, 52730, 52734, + 52738, 52742, 52746, 52750, 52754, 52758, 52762, 52766, 52770, 52774, + 52778, 52782, 52786, 52790, 52794, 52798, 52802, 52806, 52810, 52814, + 52818, 52822, 52826, 52830, 52834, 52838, 52842, 52846, 52850, 52854, + 52858, 52862, 52866, 52870, 52874, 52878, 52882, 52886, 52890, 52894, + 52898, 52902, 52906, 52910, 52914, 52918, 52922, 52926, 52930, 52934, + 52938, 52942, 52946, 52950, 52954, 52958, 52962, 52966, 52970, 52974, + 52978, 52982, 52986, 52990, 52994, 52998, 53002, 53006, 53010, 53014, + 53018, 53022, 53026, 53030, 53034, 53038, 53042, 53046, 53050, 53054, + 53058, 53062, 53066, 53070, 53074, 53078, 53082, 53086, 53090, 53094, + 53098, 53102, 53106, 53110, 53114, 53118, 53122, 53126, 53130, 53134, + 53138, 53142, 53146, 53150, 53154, 53158, 53162, 53166, 53170, 53174, + 53178, 53182, 53186, 53190, 53194, 53198, 53202, 53206, 53210, 53214, + 53218, 53222, 53226, 53230, 53234, 53238, 53242, 53246, 53250, 53254, + 53258, 53262, 53266, 53270, 53274, 53278, 53282, 53286, 53290, 53294, + 53298, 53302, 53306, 53310, 53314, 53318, 53322, 53326, 53330, 53334, + 53338, 53342, 53346, 53350, 53354, 53358, 53362, 53366, 53370, 53374, + 53378, 53382, 53386, 53390, 53394, 53398, 53402, 53406, 53410, 53414, + 53418, 53422, 53426, 53430, 53434, 53438, 53442, 53446, 53450, 53454, + 53458, 53462, 53466, 53470, 53474, 53478, 53482, 53486, 53490, 53494, + 53498, 53502, 53506, 53510, 53514, 53518, 53522, 53526, 53530, 53534, + 53538, 53542, 53546, 53550, 53554, 53558, 53562, 53566, 53570, 53574, + 53578, 53582, 53586, 53590, 53594, 53598, 53602, 53609, 53617, 53623, + 53629, 53636, 53643, 53649, 53655, 53662, 53669, 53674, 53679, 53684, + 53689, 53695, 53701, 53709, 53716, 53722, 53728, 53736, 53745, 53752, + 53762, 53773, 53776, 53779, 53783, 53787, 53794, 53801, 53812, 53823, + 53832, 53841, 53847, 53853, 53860, 53867, 53876, 53886, 53897, 53907, + 53917, 53927, 53938, 53949, 53959, 53970, 53980, 53990, 53999, 54009, + 54019, 54030, 54041, 54048, 54055, 54062, 54069, 54079, 54089, 54097, + 54105, 54112, 54119, 54126, 54133, 54140, 54145, 54150, 54156, 54164, + 54174, 54182, 54190, 54198, 54206, 54214, 54222, 54230, 54238, 54247, + 54256, 54266, 54276, 54285, 54294, 54304, 54314, 54323, 54332, 54342, + 54352, 54361, 54370, 54380, 54390, 54404, 54421, 54435, 54452, 54466, + 54480, 54494, 54508, 54518, 54529, 54539, 54550, 54567, 54584, 54592, + 54598, 54605, 54612, 54619, 54626, 54631, 54637, 54642, 54647, 54653, + 54658, 54663, 54668, 54673, 54678, 54685, 54691, 54699, 54704, 54709, + 54713, 54717, 54725, 54733, 54741, 54749, 54756, 54763, 54776, 54789, + 54802, 54815, 54823, 54831, 54837, 54843, 54850, 54857, 54864, 54871, + 54875, 54880, 54888, 54896, 54904, 54911, 54915, 54923, 54931, 54934, + 54938, 54943, 54950, 54958, 54966, 54985, 55004, 55023, 55042, 55061, + 55080, 55099, 55118, 55124, 55131, 55140, 55148, 55156, 55162, 55165, + 55168, 55173, 55176, 55196, 55203, 55209, 55215, 55219, 55222, 55225, + 55228, 55240, 55254, 55261, 55268, 55271, 55275, 55278, 55283, 55288, + 55293, 55299, 55308, 55315, 55322, 55330, 55337, 55344, 55347, 55353, + 55359, 55362, 55365, 55370, 55375, 55381, 55387, 55391, 55396, 55403, + 55407, 55413, 55417, 55421, 55429, 55441, 55450, 55454, 55456, 55465, + 55474, 55480, 55483, 55489, 55495, 55500, 55505, 55510, 55515, 55520, + 55525, 55527, 55533, 55538, 55546, 55550, 55556, 55559, 55563, 55570, + 55577, 55579, 55581, 55587, 55593, 55599, 55608, 55617, 55624, 55631, + 55637, 55644, 55649, 55654, 55659, 55665, 55671, 55676, 55683, 55687, + 55691, 55704, 55717, 55729, 55738, 55744, 55751, 55756, 55761, 55766, + 55771, 55776, 55778, 55785, 55793, 55801, 55809, 55816, 55824, 55830, + 55835, 55841, 55847, 55853, 55860, 55866, 55874, 55882, 55890, 55898, + 55906, 55912, 55918, 55927, 55931, 55940, 55949, 55958, 55966, 55970, + 55976, 55983, 55990, 55994, 56000, 56008, 56014, 56019, 56025, 56030, + 56035, 56042, 56049, 56054, 56059, 56067, 56075, 56085, 56095, 56102, + 56109, 56113, 56117, 56129, 56135, 56142, 56147, 56152, 56159, 56166, + 56172, 56178, 56188, 56195, 56203, 56211, 56220, 56227, 56233, 56240, + 56246, 56254, 56262, 56270, 56278, 56284, 56289, 56299, 56310, 56317, + 56326, 56332, 56337, 56342, 56352, 56359, 56365, 56371, 56379, 56384, + 56391, 56398, 56411, 56419, 56426, 56433, 56440, 56447, 56455, 56463, + 56476, 56489, 56501, 56513, 56527, 56541, 56547, 56553, 56562, 56571, + 56578, 56585, 56594, 56603, 56612, 56621, 56629, 56637, 56647, 56657, + 56671, 56685, 56694, 56703, 56716, 56729, 56738, 56747, 56758, 56769, + 56775, 56781, 56790, 56799, 56804, 56809, 56817, 56823, 56829, 56837, + 56845, 56858, 56871, 56875, 56879, 56887, 56895, 56902, 56910, 56918, + 56927, 56936, 56942, 56948, 56955, 56962, 56969, 56976, 56985, 56994, + 56997, 57000, 57005, 57010, 57016, 57022, 57029, 57036, 57047, 57058, + 57065, 57072, 57080, 57088, 57096, 57104, 57112, 57120, 57126, 57132, + 57136, 57140, 57148, 57156, 57161, 57166, 57171, 57176, 57182, 57196, + 57203, 57210, 57214, 57216, 57218, 57223, 57228, 57233, 57238, 57246, + 57253, 57260, 57268, 57280, 57288, 57296, 57307, 57311, 57315, 57321, + 57329, 57342, 57349, 57356, 57363, 57369, 57376, 57385, 57394, 57400, + 57406, 57412, 57422, 57432, 57440, 57449, 57454, 57457, 57462, 57467, + 57472, 57478, 57484, 57488, 57491, 57495, 57499, 57504, 57509, 57515, + 57521, 57525, 57529, 57536, 57543, 57550, 57557, 57564, 57571, 57581, + 57591, 57598, 57605, 57613, 57621, 57625, 57630, 57635, 57641, 57647, + 57650, 57653, 57656, 57659, 57664, 57669, 57674, 57679, 57684, 57689, + 57693, 57697, 57701, 57706, 57711, 57715, 57719, 57725, 57729, 57735, + 57740, 57747, 57755, 57762, 57770, 57777, 57785, 57794, 57801, 57811, + 57822, 57828, 57837, 57843, 57852, 57861, 57867, 57873, 57877, 57881, + 57890, 57899, 57906, 57913, 57922, 57931, 57938, 57944, 57951, 57956, + 57960, 57964, 57969, 57974, 57979, 57987, 57995, 57998, 58002, 58011, + 58021, 58030, 58040, 58052, 58066, 58070, 58075, 58079, 58084, 58089, + 58094, 58100, 58106, 58113, 58120, 58126, 58133, 58139, 58146, 58154, + 58162, 58169, 58177, 58184, 0, 0, 58192, 58201, 58210, 58220, 58230, + 58239, 58249, 58258, 58268, 58274, 58279, 58288, 58300, 58309, 58321, + 58328, 58336, 58343, 58351, 58356, 58362, 58367, 58373, 58381, 58390, + 58398, 58407, 58411, 58415, 58419, 58423, 58433, 0, 0, 58436, 58445, + 58455, 58464, 58474, 58480, 58487, 58493, 58500, 58511, 58522, 58533, + 58544, 58554, 58564, 58574, 58584, 58592, 58600, 58608, 58616, 58624, + 58632, 58640, 58648, 58654, 58660, 58666, 58672, 58678, 58684, 58690, + 58696, 58708, 58718, 58723, 58730, 58735, 58742, 58745, 58749, 58753, + 58758, 58762, 58767, 58770, 58779, 58788, 58797, 58806, 58811, 58817, + 58823, 58831, 58841, 58848, 58857, 58862, 58865, 58868, 58873, 58878, + 58883, 58888, 58890, 58892, 58894, 58896, 58898, 58900, 58905, 58912, + 58919, 58921, 58923, 58925, 58927, 58929, 58931, 58933, 58935, 58940, + 58945, 58952, 58959, 58968, 58978, 58987, 58997, 59002, 59007, 59009, + 59016, 59023, 59030, 59037, 59044, 59051, 59058, 59061, 59064, 59067, + 59070, 59075, 59080, 59085, 59090, 59095, 59100, 59105, 59110, 59115, + 59120, 59125, 59130, 59136, 59140, 59145, 59150, 59155, 59160, 59165, + 59170, 59175, 59180, 59185, 59190, 59195, 59200, 59205, 59210, 59215, + 59220, 59225, 59230, 59235, 59240, 59245, 59250, 59256, 59261, 59267, + 59276, 59281, 59289, 59296, 59305, 59310, 59315, 59320, 59326, 0, 59333, + 59338, 59343, 59348, 59353, 59358, 59363, 59368, 59373, 59378, 59383, + 59389, 59393, 59398, 59403, 59408, 59413, 59418, 59423, 59428, 59433, + 59438, 59443, 59448, 59453, 59458, 59463, 59468, 59473, 59478, 59483, + 59488, 59493, 59498, 59503, 59509, 59514, 59520, 59529, 59534, 59542, + 59549, 59558, 59563, 59568, 59573, 59579, 0, 59586, 59594, 59602, 59611, + 59618, 59626, 59632, 59641, 59649, 59657, 59665, 59673, 59681, 59689, + 59694, 59701, 59706, 59712, 59720, 59727, 59734, 59742, 59748, 59754, + 59761, 59769, 59778, 59788, 59794, 59801, 59806, 59816, 59826, 59831, + 59836, 59841, 59846, 59851, 59856, 59861, 59866, 59871, 59876, 59881, + 59886, 59891, 59896, 59901, 59906, 59911, 59916, 59921, 59926, 59931, + 59936, 59941, 59946, 59951, 59956, 59961, 59966, 59971, 59976, 59980, + 59984, 59989, 59994, 59999, 60004, 60009, 60014, 60019, 60024, 60029, + 60034, 60039, 60044, 60049, 60054, 60059, 60064, 60069, 60074, 60081, + 60088, 60095, 60102, 60109, 60116, 60123, 60130, 60137, 60144, 60151, + 60158, 60165, 60172, 60177, 60182, 60189, 60196, 60203, 60210, 60217, + 60224, 60231, 60238, 60245, 60252, 60259, 60266, 60272, 60278, 60284, + 60290, 60297, 60304, 60311, 60318, 60325, 60332, 60339, 60346, 60353, + 60360, 60368, 60376, 60384, 60392, 60400, 60408, 60416, 60424, 60428, + 60434, 60440, 60444, 60450, 60456, 60462, 60469, 60476, 60483, 60490, + 60495, 60501, 60507, 60514, 0, 0, 0, 0, 0, 60521, 60529, 60538, 60547, + 60555, 60560, 60565, 60570, 60575, 60580, 60585, 60590, 60595, 60600, + 60605, 60610, 60615, 60620, 60625, 60630, 60635, 60640, 60645, 60650, + 60655, 60660, 60665, 60670, 60675, 60680, 60685, 60690, 60695, 60700, + 60705, 60710, 60715, 60720, 60725, 60730, 60735, 60740, 60745, 60750, + 60755, 0, 60760, 0, 0, 0, 0, 0, 60765, 0, 0, 60770, 60774, 60779, 60784, + 60789, 60794, 60803, 60808, 60813, 60818, 60823, 60828, 60833, 60838, + 60843, 60850, 60855, 60860, 60869, 60876, 60881, 60886, 60891, 60898, + 60903, 60910, 60915, 60920, 60927, 60934, 60939, 60944, 60949, 60956, + 60963, 60968, 60973, 60978, 60983, 60988, 60995, 61002, 61007, 61012, + 61017, 61022, 61027, 61032, 61037, 61042, 61047, 61052, 61057, 61064, + 61069, 61074, 0, 0, 0, 0, 0, 0, 0, 61079, 61086, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 61091, 61096, 61100, 61104, 61108, 61112, 61116, 61120, + 61124, 61128, 61132, 61136, 61142, 61146, 61150, 61154, 61158, 61162, + 61166, 61170, 61174, 61178, 61182, 61186, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 61190, 61194, 61198, 61202, 61206, 61210, 61214, 0, 61218, 61222, 61226, + 61230, 61234, 61238, 61242, 0, 61246, 61250, 61254, 61258, 61262, 61266, + 61270, 0, 61274, 61278, 61282, 61286, 61290, 61294, 61298, 0, 61302, + 61306, 61310, 61314, 61318, 61322, 61326, 0, 61330, 61334, 61338, 61342, + 61346, 61350, 61354, 0, 61358, 61362, 61366, 61370, 61374, 61378, 61382, + 0, 61386, 61390, 61394, 61398, 61402, 61406, 61410, 0, 61414, 61419, + 61424, 61429, 61434, 61439, 61444, 61448, 61453, 61458, 61463, 61467, + 61472, 61477, 61482, 61487, 61491, 61496, 61501, 61506, 61511, 61516, + 61521, 61525, 61530, 61535, 61542, 61547, 61552, 61558, 61565, 61572, + 61581, 61588, 61597, 61601, 61605, 61611, 61617, 61623, 61631, 61637, + 61641, 61645, 61649, 61655, 61661, 61665, 61667, 61671, 61677, 61679, + 61683, 61687, 61691, 61697, 61702, 61706, 61710, 61715, 61721, 61726, + 61731, 61736, 61741, 61748, 61755, 61760, 61765, 61770, 61775, 61780, + 61785, 61789, 61793, 61801, 61809, 61815, 61819, 61824, 61827, 61831, + 61838, 61841, 61845, 61849, 61852, 61858, 61864, 61867, 61873, 61877, + 61881, 61887, 61892, 61897, 61899, 61902, 61906, 61912, 61918, 61922, + 61927, 61936, 61939, 61945, 61950, 61954, 61958, 61962, 61965, 61970, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61705, 61709, 61713, - 61718, 61723, 61728, 61732, 61736, 61740, 61745, 61750, 61754, 61758, - 61762, 61766, 61771, 61776, 61781, 61786, 61790, 61794, 61799, 61804, - 61809, 61814, 61818, 0, 61822, 61826, 61830, 61834, 61838, 61842, 61846, - 61851, 61856, 61860, 61865, 61870, 61879, 61883, 61887, 61891, 61898, - 61902, 61907, 61912, 61916, 61920, 61926, 61931, 61936, 61941, 61946, - 61950, 61954, 61958, 61962, 61966, 61971, 61976, 61980, 61984, 61989, - 61994, 61999, 62003, 62007, 62012, 62017, 62023, 62029, 62033, 62039, - 62045, 62049, 62055, 62061, 62066, 62071, 62075, 62081, 62085, 62089, - 62095, 62101, 62106, 62111, 62115, 62119, 62127, 62133, 62139, 62145, - 62150, 62155, 62160, 62166, 62170, 62176, 62180, 62184, 62190, 62196, - 62202, 62208, 62214, 62220, 62226, 62232, 62238, 62244, 62250, 62256, - 62260, 62266, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62272, 62275, 62279, - 62283, 62287, 62291, 62294, 62297, 62301, 62305, 62309, 62313, 62316, - 62321, 62325, 62329, 62333, 62338, 62342, 62346, 62350, 62354, 62360, - 62366, 62370, 62374, 62378, 62382, 62386, 62390, 62394, 62398, 62402, - 62406, 62410, 62416, 62420, 62424, 62428, 62432, 62436, 62440, 62444, - 62448, 62452, 62456, 62460, 62464, 62468, 62472, 62476, 62480, 62486, - 62492, 62497, 62502, 62506, 62510, 62514, 62518, 62522, 62526, 62530, - 62534, 62538, 62542, 62546, 62550, 62554, 62558, 62562, 62566, 62570, - 62574, 62578, 62582, 62586, 62590, 62594, 62598, 62604, 62608, 62612, - 62616, 62620, 62624, 62628, 62632, 62636, 62641, 62648, 62652, 62656, - 62660, 62664, 62668, 62672, 62676, 62680, 62684, 62688, 62692, 62696, - 62703, 62707, 62713, 62717, 62721, 62725, 62729, 62733, 62736, 62740, - 62744, 62748, 62752, 62756, 62760, 62764, 62768, 62772, 62776, 62780, - 62784, 62788, 62792, 62796, 62800, 62804, 62808, 62812, 62816, 62820, - 62824, 62828, 62832, 62836, 62840, 62844, 62848, 62852, 62856, 62860, - 62864, 62870, 62874, 62878, 62882, 62886, 62890, 62894, 62898, 62902, - 62906, 62910, 62914, 62918, 62922, 62926, 62930, 62934, 62938, 62942, - 62946, 62950, 62954, 62958, 62962, 62966, 62970, 62974, 62978, 62986, - 62990, 62994, 62998, 63002, 63006, 63012, 63016, 63020, 63024, 63028, - 63032, 63036, 63040, 63044, 63048, 63052, 63056, 63060, 63064, 63070, - 63074, 63078, 63082, 63086, 63090, 63094, 63098, 63102, 63106, 63110, - 63114, 63118, 63122, 63126, 63130, 63134, 63138, 63142, 63146, 63150, - 63154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 63158, 63167, 63175, 63186, 63196, 63204, 63213, 63222, - 63232, 63244, 63256, 63268, 0, 0, 0, 0, 63274, 63277, 63280, 63285, - 63288, 63295, 63299, 63303, 63307, 63311, 63315, 63320, 63325, 63329, - 63333, 63338, 63343, 63348, 63353, 63356, 63359, 63365, 63371, 63376, - 63381, 63388, 63395, 63399, 63403, 63407, 63415, 63421, 63428, 63433, - 63438, 63443, 63448, 63453, 63458, 63463, 63468, 63473, 63478, 63483, - 63488, 63493, 63498, 63504, 63509, 63513, 63519, 63530, 63540, 63555, - 63565, 63569, 63579, 63585, 63591, 63597, 63602, 63605, 63610, 63614, 0, - 63620, 63624, 63627, 63631, 63634, 63638, 63641, 63645, 63648, 63652, - 63655, 63658, 63662, 63666, 63670, 63674, 63678, 63682, 63686, 63690, - 63694, 63697, 63701, 63705, 63709, 63713, 63717, 63721, 63725, 63729, - 63733, 63737, 63741, 63745, 63749, 63754, 63758, 63762, 63766, 63770, - 63773, 63777, 63780, 63784, 63788, 63792, 63796, 63799, 63803, 63806, - 63810, 63814, 63818, 63822, 63826, 63830, 63834, 63838, 63842, 63846, - 63850, 63854, 63857, 63861, 63865, 63869, 63873, 63877, 63880, 63885, - 63889, 63894, 63898, 63901, 63905, 63909, 63913, 63917, 63922, 63926, - 63930, 63934, 63938, 63942, 63946, 63950, 0, 0, 63955, 63963, 63971, - 63978, 63985, 63989, 63995, 64000, 64005, 64009, 64012, 64016, 64019, - 64023, 64026, 64030, 64033, 64037, 64040, 64043, 64047, 64051, 64055, - 64059, 64063, 64067, 64071, 64075, 64079, 64082, 64086, 64090, 64094, - 64098, 64102, 64106, 64110, 64114, 64118, 64122, 64126, 64130, 64134, - 64139, 64143, 64147, 64151, 64155, 64158, 64162, 64165, 64169, 64173, - 64177, 64181, 64184, 64188, 64191, 64195, 64199, 64203, 64207, 64211, - 64215, 64219, 64223, 64227, 64231, 64235, 64239, 64242, 64246, 64250, - 64254, 64258, 64262, 64265, 64270, 64274, 64279, 64283, 64286, 64290, - 64294, 64298, 64302, 64307, 64311, 64315, 64319, 64323, 64327, 64331, - 64335, 64340, 64344, 64348, 64352, 64356, 64360, 64367, 64371, 64377, 0, - 0, 0, 0, 0, 64382, 64387, 64392, 64397, 64402, 64407, 64412, 64417, - 64421, 64426, 64431, 64436, 64441, 64446, 64451, 64456, 64461, 64466, - 64470, 64475, 64480, 64485, 64489, 64493, 64497, 64502, 64507, 64512, - 64517, 64522, 64527, 64532, 64537, 64542, 64547, 64551, 64555, 64560, - 64565, 64570, 64575, 64580, 64587, 0, 64592, 64596, 64600, 64604, 64608, - 64612, 64616, 64620, 64624, 64628, 64632, 64636, 64640, 64644, 64648, - 64652, 64656, 64660, 64664, 64668, 64672, 64676, 64680, 64684, 64688, - 64692, 64696, 64700, 64704, 64708, 64712, 64715, 64719, 64722, 64726, - 64730, 64733, 64737, 64741, 64744, 64748, 64752, 64756, 64760, 64763, - 64767, 64771, 64775, 64779, 64783, 64787, 64790, 64793, 64797, 64801, - 64805, 64809, 64813, 64817, 64821, 64825, 64829, 64833, 64837, 64841, - 64845, 64849, 64853, 64857, 64861, 64865, 64869, 64873, 64877, 64881, - 64885, 64889, 64893, 64897, 64901, 64905, 64909, 64913, 64917, 64921, - 64925, 64929, 64933, 64937, 64941, 64945, 64949, 64953, 64957, 0, 64961, - 64967, 64973, 64978, 64983, 64988, 64994, 65000, 65005, 65011, 65017, - 65023, 65029, 65035, 65041, 65047, 65053, 65058, 65063, 65068, 65073, - 65078, 65083, 65088, 65093, 65098, 65103, 65108, 65113, 65118, 65123, - 65128, 65133, 65138, 65143, 65148, 65153, 65159, 65165, 65171, 65177, - 65182, 65187, 0, 0, 0, 0, 0, 65192, 65197, 65202, 65207, 65212, 65217, - 65222, 65227, 65232, 65237, 65242, 65247, 65252, 65257, 65262, 65267, - 65272, 65277, 65282, 65287, 65292, 65297, 65302, 65307, 65312, 65317, - 65322, 65327, 65332, 65337, 65342, 65347, 65352, 65357, 65362, 65367, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65372, 65377, 65382, 65387, 65391, - 65396, 65400, 65405, 65410, 65415, 65420, 65425, 65429, 65434, 65439, - 65444, 65449, 65453, 65457, 65461, 65465, 65469, 65473, 65477, 65481, - 65485, 65489, 65493, 65497, 65501, 65505, 65510, 65515, 65520, 65525, - 65530, 65535, 65540, 65545, 65550, 65555, 65560, 65565, 65570, 65575, - 65580, 65586, 0, 65593, 65597, 65601, 65605, 65609, 65613, 65617, 65621, - 65625, 65629, 65634, 65639, 65644, 65649, 65654, 65659, 65664, 65669, - 65674, 65679, 65684, 65689, 65694, 65699, 65704, 65709, 65714, 65719, - 65724, 65729, 65734, 65739, 65744, 65749, 65754, 65759, 65764, 65769, - 65774, 65779, 65784, 65793, 65802, 65811, 65820, 65829, 65838, 65847, - 65856, 65859, 65864, 65869, 65874, 65879, 65884, 65889, 65894, 65899, - 65904, 65908, 65913, 65918, 65923, 65928, 65933, 65937, 65941, 65945, - 65949, 65953, 65957, 65961, 65965, 65969, 65973, 65977, 65981, 65985, - 65989, 65994, 65999, 66004, 66009, 66014, 66019, 66024, 66029, 66034, - 66039, 66044, 66049, 66054, 66059, 66065, 66071, 66076, 66081, 66085, - 66089, 66093, 66097, 66101, 66105, 66109, 66113, 66117, 66122, 66127, - 66132, 66137, 66142, 66147, 66152, 66157, 66162, 66167, 66172, 66177, - 66182, 66187, 66192, 66197, 66202, 66207, 66212, 66217, 66222, 66227, - 66232, 66237, 66242, 66247, 66252, 66257, 66262, 66267, 66272, 66277, - 66282, 66287, 66292, 66297, 66302, 66307, 66312, 66317, 66322, 66327, - 66332, 66337, 66341, 66346, 66351, 66356, 66361, 66366, 66371, 66376, - 66381, 66386, 66390, 66397, 66404, 66411, 66418, 66425, 66432, 66439, - 66446, 66453, 66460, 66467, 66474, 66477, 66480, 66483, 66488, 66491, - 66494, 66497, 66500, 66503, 66506, 66510, 66514, 66518, 66522, 66525, - 66529, 66533, 66537, 66541, 66545, 66549, 66553, 66557, 66560, 66563, - 66567, 66571, 66575, 66579, 66582, 66586, 66590, 66594, 66598, 66601, - 66605, 66609, 66613, 66617, 66620, 66624, 66628, 66631, 66635, 66639, - 66643, 66647, 66651, 66655, 66659, 0, 66663, 66666, 66669, 66672, 66675, - 66678, 66681, 66684, 66687, 66690, 66693, 66696, 66699, 66702, 66705, - 66708, 66711, 66714, 66717, 66720, 66723, 66726, 66729, 66732, 66735, - 66738, 66741, 66744, 66747, 66750, 66753, 66756, 66759, 66762, 66765, - 66768, 66771, 66774, 66777, 66780, 66783, 66786, 66789, 66792, 66795, - 66798, 66801, 66804, 66807, 66810, 66813, 66816, 66819, 66822, 66825, - 66828, 66831, 66834, 66837, 66840, 66843, 66846, 66849, 66852, 66855, - 66858, 66861, 66864, 66867, 66870, 66873, 66876, 66879, 66882, 66885, - 66888, 66891, 66894, 66897, 66900, 66903, 66906, 66909, 66912, 66915, - 66918, 66921, 66924, 66927, 66936, 66944, 66952, 66960, 66968, 66976, - 66984, 66992, 67000, 67008, 67017, 67026, 67035, 67044, 67053, 67062, - 67071, 67080, 67089, 67098, 67107, 67116, 67125, 67134, 67143, 67146, - 67149, 67152, 67154, 67157, 67160, 67163, 67168, 67173, 67176, 67183, - 67190, 67197, 67204, 67207, 67212, 67214, 67218, 67220, 67222, 67225, - 67228, 67231, 67234, 67237, 67240, 67243, 67248, 67253, 67256, 67259, - 67262, 67265, 67268, 67271, 67274, 67278, 67281, 67284, 67287, 67290, - 67293, 67298, 67301, 67304, 67307, 67312, 67317, 67322, 67327, 67332, - 67337, 67342, 67347, 67353, 67361, 67363, 67366, 67369, 67372, 67375, - 67381, 67389, 67392, 67395, 67400, 67403, 67406, 67409, 67414, 67417, - 67420, 67425, 67428, 67431, 67436, 67439, 67442, 67447, 67452, 67457, - 67460, 67463, 67466, 67469, 67475, 67478, 67481, 67484, 67486, 67489, - 67492, 67495, 67500, 67503, 67506, 67509, 67512, 67515, 67520, 67523, - 67526, 67529, 67532, 67535, 67538, 67541, 67544, 67547, 67553, 67558, - 67566, 67574, 67582, 67590, 67598, 67606, 67614, 67622, 67630, 67639, - 67648, 67657, 67666, 67675, 67684, 67693, 67702, 67711, 67720, 67729, - 67738, 67747, 67756, 67765, 67774, 67783, 67792, 67801, 67810, 67819, - 67828, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 61976, 61980, 61984, 61989, 61994, 61999, 62003, 62007, 62011, 62016, + 62021, 62025, 62029, 62033, 62037, 62042, 62047, 62052, 62057, 62061, + 62065, 62070, 62075, 62080, 62085, 62089, 0, 62093, 62097, 62101, 62105, + 62109, 62113, 62117, 62122, 62127, 62131, 62136, 62141, 62150, 62154, + 62158, 62162, 62169, 62173, 62178, 62183, 62187, 62191, 62197, 62202, + 62207, 62212, 62217, 62221, 62225, 62229, 62233, 62237, 62242, 62247, + 62251, 62255, 62260, 62265, 62270, 62274, 62278, 62283, 62288, 62294, + 62300, 62304, 62310, 62316, 62320, 62326, 62332, 62337, 62342, 62346, + 62352, 62356, 62360, 62366, 62372, 62377, 62382, 62386, 62390, 62398, + 62404, 62410, 62416, 62421, 62426, 62431, 62437, 62441, 62447, 62451, + 62455, 62461, 62467, 62473, 62479, 62485, 62491, 62497, 62503, 62509, + 62515, 62521, 62527, 62531, 62537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 62543, 62546, 62550, 62554, 62558, 62562, 62565, 62568, 62572, 62576, + 62580, 62584, 62587, 62592, 62596, 62600, 62604, 62609, 62613, 62617, + 62621, 62625, 62631, 62637, 62641, 62645, 62649, 62653, 62657, 62661, + 62665, 62669, 62673, 62677, 62681, 62687, 62691, 62695, 62699, 62703, + 62707, 62711, 62715, 62719, 62723, 62727, 62731, 62735, 62739, 62743, + 62747, 62751, 62757, 62763, 62768, 62773, 62777, 62781, 62785, 62789, + 62793, 62797, 62801, 62805, 62809, 62813, 62817, 62821, 62825, 62829, + 62833, 62837, 62841, 62845, 62849, 62853, 62857, 62861, 62865, 62869, + 62875, 62879, 62883, 62887, 62891, 62895, 62899, 62903, 62907, 62912, + 62919, 62923, 62927, 62931, 62935, 62939, 62943, 62947, 62951, 62955, + 62959, 62963, 62967, 62974, 62978, 62984, 62988, 62992, 62996, 63000, + 63004, 63007, 63011, 63015, 63019, 63023, 63027, 63031, 63035, 63039, + 63043, 63047, 63051, 63055, 63059, 63063, 63067, 63071, 63075, 63079, + 63083, 63087, 63091, 63095, 63099, 63103, 63107, 63111, 63115, 63119, + 63123, 63127, 63131, 63135, 63141, 63145, 63149, 63153, 63157, 63161, + 63165, 63169, 63173, 63177, 63181, 63185, 63189, 63193, 63197, 63201, + 63205, 63209, 63213, 63217, 63221, 63225, 63229, 63233, 63237, 63241, + 63245, 63249, 63257, 63261, 63265, 63269, 63273, 63277, 63283, 63287, + 63291, 63295, 63299, 63303, 63307, 63311, 63315, 63319, 63323, 63327, + 63331, 63335, 63341, 63345, 63349, 63353, 63357, 63361, 63365, 63369, + 63373, 63377, 63381, 63385, 63389, 63393, 63397, 63401, 63405, 63409, + 63413, 63417, 63421, 63425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63429, 63438, 63446, 63457, 63467, + 63475, 63484, 63493, 63503, 63515, 63527, 63539, 0, 0, 0, 0, 63545, + 63548, 63551, 63556, 63559, 63566, 63570, 63574, 63578, 63582, 63586, + 63591, 63596, 63600, 63604, 63609, 63614, 63619, 63624, 63627, 63630, + 63636, 63642, 63647, 63652, 63659, 63666, 63670, 63674, 63678, 63686, + 63692, 63699, 63704, 63709, 63714, 63719, 63724, 63729, 63734, 63739, + 63744, 63749, 63754, 63759, 63764, 63769, 63775, 63780, 63784, 63790, + 63801, 63811, 63826, 63836, 63840, 63850, 63856, 63862, 63868, 63873, + 63876, 63881, 63885, 0, 63891, 63895, 63898, 63902, 63905, 63909, 63912, + 63916, 63919, 63923, 63926, 63929, 63933, 63937, 63941, 63945, 63949, + 63953, 63957, 63961, 63965, 63968, 63972, 63976, 63980, 63984, 63988, + 63992, 63996, 64000, 64004, 64007, 64011, 64015, 64019, 64024, 64028, + 64032, 64036, 64040, 64043, 64047, 64050, 64054, 64058, 64062, 64066, + 64069, 64073, 64076, 64080, 64084, 64088, 64092, 64096, 64100, 64104, + 64108, 64112, 64116, 64120, 64124, 64127, 64131, 64135, 64139, 64143, + 64147, 64150, 64155, 64159, 64164, 64168, 64171, 64175, 64179, 64183, + 64187, 64192, 64196, 64200, 64204, 64208, 64212, 64216, 64220, 0, 0, + 64225, 64233, 64241, 64248, 64255, 64259, 64265, 64270, 64275, 64279, + 64282, 64286, 64289, 64293, 64296, 64300, 64303, 64307, 64310, 64313, + 64317, 64321, 64325, 64329, 64333, 64337, 64341, 64345, 64349, 64352, + 64356, 64360, 64364, 64368, 64372, 64376, 64380, 64384, 64388, 64391, + 64395, 64399, 64403, 64408, 64412, 64416, 64420, 64424, 64427, 64431, + 64434, 64438, 64442, 64446, 64450, 64453, 64457, 64460, 64464, 64468, + 64472, 64476, 64480, 64484, 64488, 64492, 64496, 64500, 64504, 64508, + 64511, 64515, 64519, 64523, 64527, 64531, 64534, 64539, 64543, 64548, + 64552, 64555, 64559, 64563, 64567, 64571, 64576, 64580, 64584, 64588, + 64592, 64596, 64600, 64604, 64609, 64613, 64617, 64621, 64625, 64629, + 64636, 64640, 64646, 0, 0, 0, 0, 0, 64651, 64656, 64661, 64666, 64671, + 64676, 64681, 64686, 64690, 64695, 64700, 64705, 64710, 64715, 64720, + 64725, 64730, 64735, 64739, 64744, 64749, 64754, 64758, 64762, 64766, + 64771, 64776, 64781, 64786, 64791, 64796, 64801, 64806, 64811, 64816, + 64820, 64824, 64829, 64834, 64839, 64844, 64849, 64856, 0, 64861, 64865, + 64869, 64873, 64877, 64881, 64885, 64889, 64893, 64897, 64901, 64905, + 64909, 64913, 64917, 64921, 64925, 64929, 64933, 64937, 64941, 64945, + 64949, 64953, 64957, 64961, 64965, 64969, 64973, 64977, 64981, 64984, + 64988, 64991, 64995, 64999, 65002, 65006, 65010, 65013, 65017, 65021, + 65025, 65029, 65032, 65036, 65040, 65044, 65048, 65052, 65056, 65059, + 65062, 65066, 65070, 65074, 65078, 65082, 65086, 65090, 65094, 65098, + 65102, 65106, 65110, 65114, 65118, 65122, 65126, 65130, 65134, 65138, + 65142, 65146, 65150, 65154, 65158, 65162, 65166, 65170, 65174, 65178, + 65182, 65186, 65190, 65194, 65198, 65202, 65206, 65210, 65214, 65218, + 65222, 65226, 0, 65230, 65236, 65242, 65247, 65252, 65257, 65263, 65269, + 65274, 65280, 65286, 65292, 65298, 65304, 65310, 65316, 65322, 65327, + 65332, 65337, 65342, 65347, 65352, 65357, 65362, 65367, 65372, 65377, + 65382, 65387, 65392, 65397, 65402, 65407, 65412, 65417, 65422, 65428, + 65434, 65440, 65446, 65451, 65456, 0, 0, 0, 0, 0, 65461, 65466, 65471, + 65476, 65481, 65486, 65491, 65496, 65501, 65506, 65511, 65516, 65521, + 65526, 65531, 65536, 65541, 65546, 65551, 65556, 65561, 65566, 65571, + 65576, 65581, 65586, 65591, 65596, 65601, 65606, 65611, 65616, 65621, + 65626, 65631, 65636, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65641, 65646, + 65651, 65656, 65660, 65665, 65669, 65674, 65679, 65684, 65689, 65694, + 65698, 65703, 65708, 65713, 65718, 65722, 65726, 65730, 65734, 65738, + 65742, 65746, 65750, 65754, 65758, 65762, 65766, 65770, 65774, 65779, + 65784, 65789, 65794, 65799, 65804, 65809, 65814, 65819, 65824, 65829, + 65834, 65839, 65844, 65849, 65855, 0, 65862, 65866, 65870, 65874, 65878, + 65882, 65886, 65890, 65894, 65898, 65903, 65908, 65913, 65918, 65923, + 65928, 65933, 65938, 65943, 65948, 65953, 65958, 65963, 65968, 65973, + 65978, 65983, 65988, 65993, 65998, 66003, 66008, 66013, 66018, 66023, + 66028, 66033, 66038, 66043, 66048, 66053, 66062, 66071, 66080, 66089, + 66098, 66107, 66116, 66125, 66128, 66133, 66138, 66143, 66148, 66153, + 66158, 66163, 66168, 66173, 66177, 66182, 66187, 66192, 66197, 66202, + 66206, 66210, 66214, 66218, 66222, 66226, 66230, 66234, 66238, 66242, + 66246, 66250, 66254, 66258, 66263, 66268, 66273, 66278, 66283, 66288, + 66293, 66298, 66303, 66308, 66313, 66318, 66323, 66328, 66334, 66340, + 66345, 66350, 66354, 66358, 66362, 66366, 66370, 66374, 66378, 66382, + 66386, 66391, 66396, 66401, 66406, 66411, 66416, 66421, 66426, 66431, + 66436, 66441, 66446, 66451, 66456, 66461, 66466, 66471, 66476, 66481, + 66486, 66491, 66496, 66501, 66506, 66511, 66516, 66521, 66526, 66531, + 66536, 66541, 66546, 66551, 66556, 66561, 66566, 66571, 66576, 66581, + 66586, 66591, 66596, 66601, 66606, 66610, 66615, 66620, 66625, 66630, + 66635, 66640, 66645, 66650, 66655, 66659, 66666, 66673, 66680, 66687, + 66694, 66701, 66708, 66715, 66722, 66729, 66736, 66743, 66746, 66749, + 66752, 66757, 66760, 66763, 66766, 66769, 66772, 66775, 66779, 66783, + 66787, 66791, 66794, 66798, 66802, 66806, 66810, 66813, 66817, 66821, + 66825, 66828, 66831, 66835, 66839, 66843, 66847, 66850, 66854, 66858, + 66862, 66866, 66869, 66873, 66877, 66881, 66885, 66888, 66892, 66896, + 66899, 66903, 66907, 66911, 66915, 66919, 66923, 66927, 0, 66931, 66934, + 66937, 66940, 66943, 66946, 66949, 66952, 66955, 66958, 66961, 66964, + 66967, 66970, 66973, 66976, 66979, 66982, 66985, 66988, 66991, 66994, + 66997, 67000, 67003, 67006, 67009, 67012, 67015, 67018, 67021, 67024, + 67027, 67030, 67033, 67036, 67039, 67042, 67045, 67048, 67051, 67054, + 67057, 67060, 67063, 67066, 67069, 67072, 67075, 67078, 67081, 67084, + 67087, 67090, 67093, 67096, 67099, 67102, 67105, 67108, 67111, 67114, + 67117, 67120, 67123, 67126, 67129, 67132, 67135, 67138, 67141, 67144, + 67147, 67150, 67153, 67156, 67159, 67162, 67165, 67168, 67171, 67174, + 67177, 67180, 67183, 67186, 67189, 67192, 67195, 67204, 67212, 67220, + 67228, 67236, 67244, 67252, 67260, 67268, 67276, 67285, 67294, 67303, + 67312, 67321, 67330, 67339, 67348, 67357, 67366, 67375, 67384, 67393, + 67402, 67411, 67414, 67417, 67420, 67422, 67425, 67428, 67431, 67436, + 67441, 67444, 67451, 67458, 67465, 67472, 67475, 67480, 67482, 67486, + 67488, 67490, 67493, 67496, 67499, 67502, 67505, 67508, 67511, 67516, + 67521, 67524, 67527, 67530, 67533, 67536, 67539, 67542, 67546, 67549, + 67552, 67555, 67558, 67561, 67566, 67569, 67572, 67575, 67580, 67585, + 67590, 67595, 67600, 67605, 67610, 67615, 67621, 67629, 67631, 67634, + 67637, 67640, 67643, 67649, 67657, 67660, 67663, 67668, 67671, 67674, + 67677, 67682, 67685, 67688, 67693, 67696, 67699, 67704, 67707, 67710, + 67715, 67720, 67725, 67728, 67731, 67734, 67737, 67743, 67746, 67749, + 67752, 67754, 67757, 67760, 67763, 67768, 67771, 67774, 67777, 67780, + 67783, 67788, 67791, 67794, 67797, 67800, 67803, 67806, 67809, 67812, + 67815, 67821, 67826, 67834, 67842, 67850, 67858, 67866, 67874, 67882, + 67890, 67898, 67907, 67916, 67925, 67934, 67943, 67952, 67961, 67970, + 67979, 67988, 67997, 68006, 68015, 68024, 68033, 68042, 68051, 68060, + 68069, 68078, 68087, 68096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -20249,2838 +20929,2792 @@ static unsigned int phrasebook_offset2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 68099, 68108, 68117, 68128, 68135, 68140, + 68145, 68152, 68159, 68165, 68170, 68175, 68180, 68185, 68192, 68197, + 68202, 68207, 68218, 68223, 68228, 68235, 68240, 68247, 68252, 68257, + 68264, 68271, 68278, 68287, 68296, 68301, 68306, 68311, 68318, 68323, + 68333, 68340, 68345, 68350, 68355, 68360, 68365, 68370, 68379, 68386, + 68393, 68398, 68405, 68410, 68417, 68426, 68437, 68442, 68451, 68456, + 68463, 68472, 68481, 68486, 68491, 68498, 68504, 68511, 68518, 68522, + 68526, 68529, 68533, 68537, 68541, 68545, 68549, 68553, 68557, 68560, + 68564, 68568, 68572, 68576, 68580, 68584, 68587, 68591, 68595, 68598, + 68602, 68606, 68610, 68614, 68618, 68622, 68626, 68630, 68634, 68638, + 68642, 68646, 68650, 68654, 68658, 68662, 68666, 68670, 68674, 68678, + 68682, 68686, 68690, 68694, 68698, 68702, 68706, 68710, 68714, 68718, + 68722, 68726, 68730, 68734, 68738, 68742, 68746, 68750, 68754, 68758, + 68762, 68766, 68770, 68774, 68777, 68781, 68785, 68789, 68793, 68797, + 68801, 68805, 68809, 68813, 68817, 68821, 68825, 68829, 68833, 68837, + 68841, 68845, 68849, 68853, 68857, 68861, 68865, 68869, 68873, 68877, + 68881, 68885, 68889, 68893, 68897, 68901, 68905, 68909, 68913, 68917, + 68921, 68925, 68929, 68933, 68937, 68941, 68945, 68949, 68953, 68957, + 68961, 68965, 68969, 68973, 68977, 68981, 68985, 68989, 68993, 68997, + 69001, 69005, 69009, 69013, 69017, 69021, 69025, 69029, 69033, 69037, + 69041, 69045, 69049, 69053, 69057, 69061, 69065, 69069, 69073, 69077, + 69081, 69085, 69089, 69093, 69097, 69101, 69105, 69109, 69113, 69117, + 69121, 69125, 69129, 69133, 69137, 69141, 69145, 69149, 69153, 69157, + 69161, 69165, 69169, 69173, 69177, 69181, 69185, 69189, 69193, 69197, + 69201, 69205, 69209, 69213, 69217, 69221, 69225, 69229, 69233, 69237, + 69241, 69245, 69248, 69252, 69256, 69260, 69264, 69268, 69272, 69276, + 69280, 69284, 69288, 69292, 69296, 69300, 69304, 69308, 69312, 69316, + 69320, 69324, 69328, 69332, 69336, 69340, 69344, 69348, 69352, 69356, + 69360, 69364, 69368, 69372, 69376, 69380, 69384, 69388, 69392, 69396, + 69400, 69404, 69408, 69412, 69416, 69420, 69424, 69428, 69432, 69436, + 69440, 69444, 69448, 69452, 69456, 69460, 69464, 69468, 69472, 69476, + 69480, 69484, 69488, 69492, 69496, 69500, 69504, 69508, 69512, 69516, + 69520, 69524, 69528, 69532, 69536, 69540, 69544, 69548, 69552, 69556, + 69560, 69564, 69568, 69572, 69576, 69580, 69584, 69588, 69592, 69596, + 69600, 69604, 69608, 69612, 69616, 69620, 69624, 69628, 69632, 69636, + 69640, 69644, 69648, 69652, 69656, 69660, 69664, 69668, 69672, 69676, + 69679, 69683, 69687, 69691, 69695, 69699, 69703, 69707, 69710, 69714, + 69718, 69722, 69726, 69730, 69734, 69738, 69742, 69746, 69750, 69754, + 69758, 69762, 69766, 69770, 69774, 69778, 69782, 69786, 69790, 69794, + 69798, 69802, 69806, 69810, 69814, 69818, 69822, 69826, 69830, 69834, + 69838, 69842, 69846, 69850, 69854, 69858, 69862, 69866, 69870, 69874, + 69878, 69882, 69886, 69890, 69894, 69898, 69902, 69906, 69910, 69914, + 69918, 69922, 69926, 69930, 69934, 69938, 69942, 69946, 69950, 69954, + 69958, 69962, 69966, 69970, 69974, 69978, 69982, 69986, 69990, 69994, + 69998, 70002, 70006, 70010, 70014, 70018, 70022, 70026, 70030, 70034, + 70038, 70042, 70046, 70050, 70054, 70058, 70062, 70066, 70069, 70073, + 70077, 70081, 70085, 70089, 70093, 70097, 70101, 70105, 70109, 70113, + 70117, 70121, 70125, 70129, 70133, 70137, 70141, 70145, 70149, 70153, + 70157, 70161, 70165, 70169, 70173, 70177, 70181, 70185, 70189, 70193, + 70197, 70201, 70205, 70209, 70213, 70217, 70221, 70225, 70229, 70233, + 70237, 70241, 70245, 70249, 70253, 70257, 70261, 70265, 70269, 70273, + 70277, 70281, 70285, 70289, 70293, 70297, 70301, 70305, 70308, 70312, + 70316, 70320, 70324, 70328, 70332, 70336, 70340, 70344, 70348, 70352, + 70356, 70360, 70364, 70368, 70372, 70376, 70380, 70384, 70388, 70392, + 70396, 70400, 70404, 70408, 70412, 70416, 70420, 70424, 70428, 70432, + 70436, 70440, 70444, 70448, 70452, 70456, 70460, 70464, 70468, 70472, + 70476, 70480, 70484, 70488, 70492, 70496, 70500, 70504, 70508, 70512, + 70516, 70520, 70524, 70528, 70532, 70536, 70540, 70544, 70548, 70552, + 70556, 70560, 70563, 70567, 70571, 70575, 70579, 70583, 70587, 70591, + 70595, 70599, 70603, 70607, 70611, 70615, 70619, 70623, 70627, 70631, + 70635, 70639, 70643, 70647, 70651, 70655, 70659, 70663, 70667, 70671, + 70675, 70679, 70683, 70687, 70691, 70695, 70699, 70703, 70707, 70711, + 70715, 70719, 70723, 70727, 70731, 70735, 70739, 70743, 70747, 70751, + 70755, 70759, 70763, 70767, 70771, 70775, 70779, 70783, 70787, 70791, + 70795, 70799, 70803, 70807, 70811, 70815, 70819, 70823, 70827, 70831, + 70835, 70839, 70843, 70847, 70851, 70855, 70859, 70863, 70867, 70871, + 70875, 70879, 70883, 70887, 70891, 70895, 70899, 70903, 70907, 70911, + 70915, 70919, 70923, 70927, 70931, 70935, 70939, 70943, 70947, 70951, + 70955, 70959, 70963, 70967, 70971, 70975, 70979, 70983, 70987, 70991, + 70995, 70999, 71003, 71007, 71011, 71015, 71018, 71022, 71026, 71030, + 71034, 71038, 71042, 71046, 71050, 71054, 71058, 71062, 71066, 71070, + 71074, 71078, 71082, 71086, 71090, 71094, 71098, 71102, 71106, 71110, + 71114, 71118, 71122, 71126, 71130, 71134, 71138, 71142, 71146, 71150, + 71154, 71158, 71162, 71166, 71170, 71174, 71178, 71182, 71186, 71190, + 71194, 71198, 71202, 71206, 71210, 71214, 71218, 71222, 71226, 71230, + 71234, 71238, 71242, 71246, 71250, 71254, 71258, 71262, 71266, 71270, + 71274, 71278, 71282, 71286, 71290, 71294, 71298, 71302, 71306, 71310, + 71314, 71318, 71322, 71326, 71330, 71334, 71338, 71342, 71346, 71350, + 71354, 71358, 71362, 71366, 71370, 71374, 71378, 71382, 71386, 71390, + 71394, 71398, 71402, 71406, 71410, 71414, 71418, 71422, 71426, 71430, + 71434, 71438, 71442, 71446, 71450, 71454, 71458, 71462, 71466, 71470, + 71474, 71478, 71482, 71486, 71490, 71494, 71498, 71502, 71506, 71510, + 71514, 71518, 71522, 71526, 71530, 71534, 71538, 71542, 71546, 71550, + 71554, 71558, 71562, 71566, 71570, 71574, 71578, 71582, 71586, 71590, + 71594, 71598, 71602, 71606, 71610, 71614, 71618, 71621, 71625, 71629, + 71633, 71637, 71641, 71645, 71649, 71652, 71656, 71660, 71664, 71668, + 71672, 71676, 71680, 71684, 71688, 71692, 71696, 71700, 71704, 71708, + 71712, 71716, 71720, 71724, 71728, 71732, 71736, 71740, 71744, 71748, + 71752, 71756, 71760, 71764, 71768, 71772, 71776, 71780, 71784, 71788, + 71792, 71796, 71800, 71804, 71808, 71812, 71816, 71820, 71824, 71828, + 71832, 71836, 71840, 71844, 71848, 71852, 71856, 71860, 71864, 71868, + 71872, 71876, 71880, 71884, 71888, 71892, 71896, 71900, 71904, 71908, + 71912, 71916, 71920, 71924, 71928, 71932, 71936, 71940, 71944, 71948, + 71952, 71956, 71960, 71964, 71968, 71972, 71976, 71980, 71984, 71988, + 71992, 71996, 72000, 72004, 72008, 72012, 72016, 72020, 72024, 72028, + 72032, 72036, 72040, 72044, 72048, 72052, 72056, 72060, 72064, 72068, + 72072, 72076, 72080, 72084, 72088, 72092, 72096, 72100, 72104, 72108, + 72112, 72116, 72120, 72124, 72128, 72132, 72136, 72140, 72144, 72148, + 72152, 72156, 72160, 72164, 72168, 72172, 72176, 72180, 72184, 72188, + 72192, 72196, 72200, 72204, 72208, 72212, 72216, 72220, 72224, 72228, + 72232, 72236, 72240, 72244, 72248, 72252, 72256, 72260, 72264, 72268, + 72272, 72276, 72280, 72284, 72288, 72292, 72296, 72300, 72304, 72308, + 72312, 72316, 72320, 72324, 72328, 72332, 72336, 72340, 72344, 72348, + 72352, 72356, 72360, 72364, 72368, 72372, 72376, 72379, 72383, 72387, + 72391, 72395, 72399, 72403, 72407, 72411, 72415, 72419, 72423, 72427, + 72431, 72435, 72439, 72443, 72447, 72451, 72455, 72459, 72463, 72467, + 72471, 72475, 72479, 72483, 72487, 72491, 72495, 72499, 72503, 72507, + 72511, 72515, 72519, 72523, 72527, 72531, 72535, 72539, 72543, 72547, + 72551, 72555, 72559, 72563, 72567, 72571, 72575, 72579, 72583, 72587, + 72591, 72595, 72599, 72603, 72607, 72611, 72615, 72619, 72623, 72627, + 72631, 72635, 72639, 72643, 72647, 72651, 72655, 72659, 72663, 72667, + 72671, 72675, 72679, 72683, 72687, 72691, 72695, 72699, 72703, 72707, + 72711, 72715, 72719, 72723, 72727, 72731, 72735, 72739, 72743, 72747, + 72751, 72755, 72759, 72763, 72767, 72771, 72775, 72779, 72783, 72787, + 72791, 72795, 72799, 72803, 72807, 72811, 72815, 72819, 72823, 72827, + 72831, 72835, 72839, 72843, 72847, 72851, 72855, 72859, 72863, 72867, + 72871, 72875, 72879, 72883, 72887, 72891, 72895, 72899, 72903, 72907, + 72911, 72915, 72919, 72923, 72927, 72931, 72935, 72939, 72943, 72947, + 72951, 72955, 72959, 72963, 72967, 72971, 72975, 72979, 72983, 72987, + 72991, 72995, 72999, 73003, 73007, 73011, 73015, 73019, 73023, 73027, + 73031, 73035, 73039, 73043, 73047, 73051, 73055, 73059, 73063, 73067, + 73071, 73075, 73079, 73083, 73087, 73091, 73095, 73099, 73103, 73107, + 73111, 73115, 73119, 73123, 73127, 73131, 73135, 73139, 73143, 73147, + 73151, 73155, 73159, 0, 0, 0, 73163, 73167, 73171, 73175, 73179, 73183, + 73187, 73191, 73195, 73199, 73203, 73207, 73211, 73215, 73219, 73223, + 73227, 73231, 73235, 73239, 73243, 73247, 73251, 73255, 73259, 73263, + 73267, 73271, 73275, 73279, 73283, 73287, 73291, 73295, 73299, 73303, + 73307, 73311, 73315, 73319, 73323, 73327, 73331, 73335, 73339, 73343, + 73347, 73351, 73355, 73359, 73363, 73367, 73371, 73375, 73379, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 73383, 73388, 73392, 73397, 73402, 73406, 73411, 73416, + 73420, 73425, 73430, 73435, 73440, 73445, 73450, 73455, 73459, 73463, + 73467, 73471, 73476, 73481, 73486, 73490, 73495, 73500, 73505, 73510, + 73515, 73519, 73524, 73528, 73533, 73537, 73542, 73546, 73550, 73554, + 73559, 73564, 73569, 73577, 73585, 73593, 73601, 73608, 73616, 73622, + 73630, 73634, 73638, 73642, 73646, 73650, 73654, 73658, 73662, 73666, + 73670, 73674, 73678, 73682, 73686, 73690, 73694, 73698, 73702, 73706, + 73710, 73714, 73718, 73722, 73726, 73730, 73734, 73738, 73742, 73746, + 73750, 73754, 73758, 73762, 73766, 73770, 73774, 73777, 73781, 73785, + 73789, 73793, 73797, 73801, 73805, 73809, 73813, 73817, 73821, 73825, + 73829, 73833, 73837, 73841, 73845, 73849, 73853, 73857, 73861, 73865, + 73869, 73873, 73877, 73881, 73885, 73889, 73893, 73897, 73901, 73905, + 73909, 73913, 73917, 73921, 73924, 73928, 73932, 73935, 73939, 73943, + 73947, 73950, 73954, 73958, 73962, 73966, 73970, 73974, 73978, 73982, + 73986, 73989, 73993, 73997, 74001, 74004, 74007, 74011, 74015, 74018, + 74022, 74026, 74030, 74034, 74038, 74042, 74045, 74048, 74052, 74056, + 74060, 74063, 74066, 74070, 74074, 74078, 74082, 74086, 74090, 74094, + 74098, 74102, 74106, 74110, 74114, 74118, 74122, 74126, 74130, 74134, + 74138, 74142, 74146, 74150, 74154, 74158, 74162, 74166, 74170, 74174, + 74178, 74182, 74186, 74190, 74194, 74198, 74202, 74206, 74210, 74214, + 74217, 74221, 74225, 74229, 74233, 74237, 74241, 74245, 74249, 74253, + 74257, 74261, 74265, 74269, 74273, 74277, 74281, 74285, 74289, 74293, + 74297, 74301, 74305, 74309, 74313, 74317, 74321, 74325, 74329, 74333, + 74337, 74341, 74345, 74349, 74353, 74357, 74361, 74364, 74368, 74372, + 74376, 74380, 74384, 74388, 74392, 74396, 74400, 74404, 74408, 74412, + 74416, 74420, 74424, 74428, 74431, 74435, 74439, 74443, 74447, 74451, + 74455, 74459, 74463, 74467, 74471, 74475, 74479, 74483, 74487, 74491, + 74495, 74499, 74503, 74507, 74511, 74515, 74518, 74522, 74526, 74530, + 74534, 74538, 74542, 74546, 74550, 74554, 74558, 74562, 74566, 74570, + 74574, 74578, 74582, 74586, 74590, 74594, 74598, 74602, 74606, 74610, + 74614, 74618, 74622, 74626, 74630, 74634, 74638, 74642, 74646, 74650, + 74654, 74658, 74662, 74666, 74670, 74674, 74678, 74682, 74686, 74690, + 74693, 74698, 74702, 74708, 74713, 74719, 74723, 74727, 74731, 74735, + 74739, 74743, 74747, 74751, 74755, 74759, 74763, 74767, 74771, 74775, + 74778, 74781, 74784, 74787, 74790, 74793, 74796, 74799, 74802, 74807, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74813, 74818, + 74823, 74828, 74833, 74840, 74847, 74852, 74857, 74862, 74867, 74874, + 74881, 74888, 74895, 74902, 74909, 74919, 74929, 74936, 74943, 74950, + 74957, 74963, 74969, 74978, 74987, 74994, 75001, 75012, 75023, 75028, + 75033, 75040, 75047, 75054, 75061, 75068, 75075, 75082, 75089, 75095, + 75101, 75107, 75113, 75120, 75127, 75132, 75136, 75143, 75150, 75157, + 75161, 75168, 75172, 75177, 75181, 75187, 75192, 75198, 75203, 75207, + 75211, 75214, 75217, 75222, 75227, 75232, 75237, 75242, 75247, 75252, + 75257, 75262, 75267, 75275, 75283, 75288, 75293, 75298, 75303, 75308, + 75313, 75318, 75323, 75328, 75333, 75338, 75343, 75348, 75353, 75359, + 75365, 75371, 75377, 75382, 75388, 75391, 75394, 75397, 75401, 75405, + 75409, 75413, 75416, 75420, 75423, 75426, 75429, 75433, 75437, 75441, + 75445, 75449, 75453, 75457, 75461, 75465, 75469, 75473, 75477, 75481, + 75485, 75489, 75493, 75497, 75501, 75505, 75509, 75513, 75517, 75520, + 75524, 75528, 75532, 75536, 75540, 75544, 75548, 75552, 75556, 75560, + 75564, 75568, 75572, 75576, 75580, 75584, 75588, 75592, 75596, 75600, + 75604, 75608, 75612, 75616, 75619, 75623, 75627, 75631, 75635, 75639, + 75643, 75647, 75650, 75654, 75658, 75662, 75666, 75670, 75674, 75678, + 75682, 75686, 75690, 75694, 75698, 75703, 75708, 75711, 75716, 75719, + 75722, 75725, 0, 0, 0, 0, 0, 0, 0, 0, 75729, 75738, 75747, 75756, 75765, + 75774, 75783, 75792, 75801, 75809, 75816, 75824, 75831, 75839, 75849, + 75858, 75868, 75877, 75887, 75895, 75902, 75910, 75917, 75925, 75930, + 75935, 75941, 75950, 75956, 75962, 75969, 75978, 75986, 75994, 76002, + 76009, 76016, 76023, 76030, 76035, 76040, 76045, 76050, 76055, 76060, + 76065, 76070, 76078, 76086, 76092, 76098, 76103, 76108, 76113, 76118, + 76123, 76128, 76133, 76138, 76147, 76156, 76161, 76166, 76176, 76186, + 76193, 76200, 76209, 76218, 76230, 76242, 76248, 76254, 76262, 76270, + 76280, 76290, 76297, 76304, 76309, 76314, 76326, 76338, 76346, 76354, + 76364, 76374, 76386, 76398, 76407, 76416, 76423, 76430, 76437, 76444, + 76453, 76462, 76467, 76472, 76479, 76486, 76493, 76500, 76512, 76524, + 76529, 76534, 76539, 76544, 76549, 76554, 76559, 76564, 76568, 76573, + 76578, 76583, 76588, 76593, 76599, 76604, 76609, 76616, 76623, 76630, + 76637, 76644, 76652, 76660, 76665, 76670, 76676, 76682, 76689, 76696, + 76703, 76710, 76717, 76721, 76728, 76733, 76738, 76744, 76757, 76763, + 76771, 76779, 76786, 76793, 76802, 76811, 76818, 76825, 76832, 76839, + 76846, 76853, 76860, 76867, 76874, 76881, 76890, 76899, 76908, 76917, + 76926, 76935, 76944, 76953, 76962, 76971, 76978, 76985, 76991, 76999, + 77005, 77011, 77017, 77023, 77031, 77036, 77041, 77046, 77051, 77056, + 77062, 77068, 77074, 77080, 77086, 77092, 77098, 0, 0, 77104, 77111, + 77118, 77127, 77134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 77143, 77150, 77157, 77163, 77170, 77178, 77186, + 77194, 77202, 77210, 77216, 77222, 77229, 77235, 77241, 77247, 77254, + 77261, 77268, 77275, 77282, 77289, 77296, 77303, 77310, 77317, 77324, + 77331, 77338, 77345, 77351, 77358, 77365, 77372, 77379, 77386, 77393, + 77400, 77407, 77414, 77421, 77428, 77435, 77442, 77449, 77456, 77463, + 77470, 77477, 77485, 77493, 77501, 77509, 0, 0, 0, 0, 77517, 77524, + 77531, 77538, 77545, 77552, 77559, 77565, 77571, 77577, 0, 0, 0, 0, 0, 0, + 77583, 77587, 77592, 77597, 77602, 77607, 77612, 77617, 77622, 77626, + 77631, 77636, 77640, 77644, 77649, 77654, 77658, 77663, 77668, 77673, + 77678, 77683, 77688, 77693, 77697, 77701, 77705, 77710, 77714, 77718, + 77722, 77726, 77730, 77734, 77738, 77743, 77748, 77753, 77758, 77763, + 77770, 77776, 77781, 77786, 77791, 77796, 77802, 77809, 77815, 77822, + 77828, 77834, 77839, 77846, 77852, 77857, 0, 0, 0, 0, 0, 0, 0, 0, 77863, + 77868, 77873, 77877, 77882, 77886, 77891, 77895, 77900, 77905, 77911, + 77916, 77922, 77926, 77931, 77936, 77940, 77945, 77950, 77954, 77959, + 77964, 77969, 77974, 77979, 77984, 77989, 77994, 77999, 78004, 78009, + 78014, 78019, 78024, 78028, 78033, 78038, 78043, 78047, 78051, 78056, + 78061, 78066, 78070, 78074, 78078, 78082, 78087, 78092, 78097, 78101, + 78105, 78110, 78116, 78122, 78127, 78133, 78138, 78144, 78150, 78157, + 78163, 78170, 78175, 78181, 78187, 78192, 78198, 78204, 78209, 0, 0, 0, + 0, 0, 0, 0, 0, 78214, 78218, 78223, 78228, 78232, 78236, 78240, 78244, + 78248, 78252, 78256, 78260, 0, 0, 0, 0, 0, 0, 78264, 78269, 78273, 78277, + 78281, 78285, 78289, 78293, 78297, 78301, 78305, 78309, 78313, 78317, + 78321, 78325, 78329, 78334, 78339, 78345, 78351, 78358, 78363, 78368, + 78374, 78378, 78383, 78386, 78389, 78393, 78398, 78402, 78407, 78414, + 78420, 78426, 78432, 78438, 78444, 78450, 78456, 78462, 78468, 78474, + 78481, 78488, 78495, 78501, 78508, 78515, 78522, 78528, 78535, 78541, + 78547, 78554, 78560, 78567, 78574, 78580, 78586, 78592, 78599, 78606, + 78612, 78619, 78626, 78632, 78639, 78645, 78652, 78659, 78665, 78671, + 78678, 78684, 78691, 78698, 78707, 78714, 78721, 78725, 78730, 78735, + 78739, 78744, 78748, 78752, 78757, 78761, 78766, 78771, 78776, 78780, + 78784, 78788, 78792, 78797, 78801, 78806, 78811, 78816, 78821, 78825, + 78830, 78835, 78840, 78846, 78851, 78857, 78863, 78869, 78875, 78881, + 78886, 78892, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78896, 78901, 78905, + 78909, 78913, 78917, 78921, 78925, 78929, 78933, 78937, 78941, 78945, + 78949, 78953, 78957, 78961, 78965, 78969, 78973, 78977, 78981, 78985, + 78989, 78993, 78997, 79001, 79005, 79009, 79013, 0, 0, 0, 79017, 79022, + 79027, 79032, 79037, 79041, 79048, 79052, 79057, 79061, 79068, 79075, + 79084, 79088, 79093, 79097, 79101, 79108, 79115, 79120, 79127, 79132, + 79137, 79144, 79149, 79156, 79163, 79168, 79173, 79180, 79185, 79192, + 79199, 79203, 79210, 79215, 79222, 79226, 79230, 79237, 79242, 79249, + 79253, 79257, 79261, 79268, 79272, 79277, 79284, 79291, 79295, 79299, + 79306, 79312, 79318, 79324, 79332, 79338, 79346, 79352, 79360, 79366, + 79372, 79378, 79384, 79388, 79393, 79398, 79404, 79410, 79416, 79422, + 79428, 79434, 79440, 79446, 79454, 79460, 0, 79467, 79471, 79476, 79480, + 79484, 79488, 79492, 79496, 79500, 79504, 79508, 0, 0, 0, 0, 79512, + 79520, 79526, 79532, 79538, 79544, 79550, 79556, 79562, 79569, 79576, + 79583, 79590, 79597, 79604, 79611, 79618, 79625, 79632, 79639, 79645, + 79651, 79657, 79663, 79669, 79675, 79681, 79687, 79693, 79700, 79707, + 79714, 79721, 0, 79728, 79732, 79736, 79740, 79744, 79749, 79753, 79757, + 79762, 79767, 79772, 79777, 79782, 79787, 79792, 79797, 79802, 79807, + 79812, 79817, 79821, 79826, 79831, 79836, 79841, 79845, 79850, 79854, + 79859, 79864, 79869, 79874, 79879, 79883, 79888, 79892, 79896, 79900, + 79905, 79910, 79914, 79918, 79924, 79929, 79935, 79941, 79946, 79952, + 79957, 79963, 79969, 79975, 79980, 79985, 79990, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 79996, 80002, 80008, 80014, 80021, 80027, 80033, 80039, 80045, 80051, + 80056, 80061, 80067, 80074, 0, 0, 80081, 80086, 80090, 80094, 80098, + 80102, 80106, 80110, 80114, 80118, 0, 0, 80122, 80128, 80134, 80141, + 80149, 80155, 80161, 80167, 80173, 80179, 80185, 80191, 80197, 80203, + 80209, 80215, 80220, 80225, 80230, 80236, 80242, 80249, 80255, 80261, + 80266, 80273, 80280, 80287, 80293, 80298, 80303, 80308, 80316, 80323, + 80330, 80338, 80346, 80353, 80360, 80367, 80374, 80381, 80388, 80395, + 80402, 80409, 80416, 80423, 80430, 80437, 80444, 80451, 80458, 80465, + 80472, 80479, 80486, 80492, 80498, 80505, 80512, 80519, 80526, 80533, + 80540, 80547, 80554, 80561, 80568, 80575, 80582, 80589, 80596, 80603, + 80610, 80617, 80624, 80631, 80638, 80645, 80652, 80659, 80666, 80672, + 80678, 80685, 80691, 80696, 80702, 80707, 80712, 80717, 80724, 80730, + 80736, 80742, 80748, 80754, 80760, 80766, 80774, 80782, 80790, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80798, + 80804, 80810, 80816, 80824, 80832, 80838, 80844, 80851, 80858, 80865, + 80872, 80879, 80886, 80893, 80900, 80907, 80915, 80923, 80931, 80939, + 80947, 80953, 80961, 80967, 80975, 80984, 80992, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 80998, 81002, 81006, 81010, 81014, 81018, 0, 0, 81022, 81026, + 81030, 81034, 81038, 81042, 0, 0, 81046, 81050, 81054, 81058, 81062, + 81066, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81070, 81074, 81078, 81082, 81086, + 81090, 81094, 0, 81098, 81102, 81106, 81110, 81114, 81118, 81122, 0, + 81126, 81133, 81139, 81145, 81151, 81159, 81166, 81175, 81187, 81197, + 81206, 81214, 81222, 81230, 81236, 81244, 81251, 81258, 81266, 81276, + 81283, 81292, 81298, 81308, 81317, 81322, 81330, 81339, 81344, 81353, + 81360, 81370, 81382, 81387, 81393, 81400, 81405, 81415, 81425, 81435, + 81445, 81460, 81473, 81484, 81492, 81497, 81509, 81518, 81525, 81532, + 81538, 81544, 81549, 81556, 81562, 81573, 0, 0, 0, 0, 0, 0, 0, 0, 81584, + 81588, 81592, 81596, 81600, 81604, 81609, 81614, 81618, 81623, 81628, + 81633, 81638, 81643, 81647, 81652, 81657, 81662, 81667, 81672, 81676, + 81681, 81686, 81691, 81696, 81701, 81705, 81710, 81715, 81720, 81725, + 81729, 81734, 81739, 81744, 81749, 81754, 81759, 81764, 81769, 81774, + 81779, 81784, 81789, 81794, 81798, 81803, 81808, 81813, 81818, 81823, + 81828, 81833, 81837, 81842, 81847, 81852, 81857, 81862, 81867, 81872, + 81877, 81882, 81887, 81892, 81897, 81902, 81907, 81912, 81917, 81922, + 81927, 81932, 81937, 81942, 81947, 81952, 81957, 81962, 81967, 81971, + 81978, 81985, 81992, 81999, 82005, 82011, 82018, 82025, 82032, 82039, + 82046, 82053, 82060, 82067, 82074, 82080, 82087, 82094, 82101, 82108, + 82115, 82122, 82129, 82136, 82143, 82150, 82157, 82166, 82175, 82184, + 82193, 82202, 82211, 82220, 82229, 82237, 82245, 82253, 82261, 82269, + 82277, 82285, 82293, 82299, 82307, 0, 0, 82315, 82322, 82328, 82334, + 82340, 82346, 82352, 82358, 82364, 82370, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82376, 82381, + 82386, 82391, 82396, 82401, 82406, 82411, 82416, 82421, 82426, 82431, + 82436, 82441, 82446, 82451, 82456, 82461, 82466, 82471, 82476, 82481, + 82486, 0, 0, 0, 0, 82491, 82495, 82499, 82503, 82507, 82511, 82515, + 82519, 82523, 82527, 82531, 82535, 82539, 82543, 82547, 82551, 82555, + 82559, 82563, 82567, 82571, 82575, 82579, 82583, 82587, 82591, 82595, + 82599, 82603, 82607, 82611, 82615, 82619, 82623, 82627, 82631, 82635, + 82639, 82643, 82647, 82651, 82655, 82659, 82663, 82667, 82671, 82675, + 82679, 82683, 0, 0, 0, 0, 82687, 82691, 82695, 82699, 82703, 82707, + 82711, 82715, 82719, 82723, 82727, 82731, 82735, 82739, 82743, 82747, + 82751, 82755, 82759, 82763, 82767, 82771, 82775, 82779, 82783, 82787, + 82791, 82795, 82799, 82803, 82807, 82811, 82815, 82819, 82823, 82827, + 82831, 82835, 82839, 82843, 82847, 82851, 82855, 82859, 82863, 82867, + 82871, 82875, 82879, 82883, 82887, 82891, 82895, 82899, 82903, 82907, + 82911, 82915, 82919, 82923, 82927, 82931, 82935, 82939, 82943, 82947, + 82951, 82955, 82959, 82963, 82967, 82971, 82975, 82979, 82983, 82987, + 82991, 82995, 82999, 83003, 83007, 83011, 83015, 83019, 83023, 83027, + 83031, 83035, 83039, 83043, 83047, 83051, 83055, 83059, 83063, 83067, + 83071, 83075, 83079, 83083, 83087, 83091, 83095, 83099, 83103, 83107, + 83111, 83115, 83119, 83123, 83127, 83131, 83135, 83139, 83143, 83147, + 83151, 83155, 83159, 83163, 83167, 83171, 83175, 83179, 83183, 83187, + 83191, 83195, 83199, 83203, 83207, 83211, 83215, 83219, 83223, 83227, + 83231, 83235, 83239, 83243, 83247, 83251, 83255, 83259, 83263, 83267, + 83271, 83275, 83279, 83283, 83287, 83291, 83295, 83299, 83303, 83307, + 83311, 83315, 83319, 83323, 83327, 83331, 83335, 83339, 83343, 83347, + 83351, 83355, 83359, 83363, 83367, 83371, 83375, 83379, 83383, 83387, + 83391, 83395, 83399, 83403, 83407, 83411, 83415, 83419, 83423, 83427, + 83431, 83435, 83439, 83443, 83447, 83451, 83455, 83459, 83463, 83467, + 83471, 83475, 83479, 83483, 83487, 83491, 83495, 83499, 83503, 83507, + 83511, 83515, 83519, 83523, 83527, 83531, 83535, 83539, 83543, 83547, + 83551, 83555, 83559, 83563, 83567, 83571, 83575, 83579, 83583, 83587, + 83591, 83595, 83599, 83603, 83607, 83611, 83615, 83619, 83623, 83627, + 83631, 83635, 83639, 83643, 83647, 83651, 83655, 83659, 83663, 83667, + 83671, 83675, 83679, 83683, 83687, 83691, 83695, 83699, 83703, 83707, + 83711, 83715, 83719, 83723, 83727, 83731, 83735, 83739, 83743, 83747, + 83751, 83755, 83759, 83763, 83767, 83771, 83775, 83779, 83783, 83787, + 83791, 83795, 83799, 83803, 83807, 83811, 83815, 83819, 83823, 83827, + 83831, 83835, 83839, 83843, 83847, 83851, 83855, 83859, 83863, 83867, + 83871, 83875, 83879, 83883, 83887, 83891, 83895, 83899, 83903, 83907, + 83911, 83915, 83919, 83923, 83927, 83931, 83935, 83939, 83943, 83947, + 83951, 83955, 83959, 83963, 83967, 83971, 83975, 83979, 83983, 83987, + 83991, 83995, 83999, 84003, 84007, 84011, 84015, 84019, 84023, 84027, + 84031, 84035, 84039, 84043, 84047, 84051, 84055, 84059, 84063, 84067, + 84071, 84075, 84079, 84083, 84087, 84091, 84095, 84099, 84103, 84107, + 84111, 84115, 84119, 84123, 84127, 84131, 84135, 84139, 84143, 84147, 0, + 0, 84151, 84155, 84159, 84163, 84167, 84171, 84175, 84179, 84183, 84187, + 84191, 84195, 84199, 84203, 84207, 84211, 84215, 84219, 84223, 84227, + 84231, 84235, 84239, 84243, 84247, 84251, 84255, 84259, 84263, 84267, + 84271, 84275, 84279, 84283, 84287, 84291, 84295, 84299, 84303, 84307, + 84311, 84315, 84319, 84323, 84327, 84331, 84335, 84339, 84343, 84347, + 84351, 84355, 84359, 84363, 84367, 84371, 84375, 84379, 84383, 84387, + 84391, 84395, 84399, 84403, 84407, 84411, 84415, 84419, 84423, 84427, + 84431, 84435, 84439, 84443, 84447, 84451, 84455, 84459, 84463, 84467, + 84471, 84475, 84479, 84483, 84487, 84491, 84495, 84499, 84503, 84507, + 84511, 84515, 84519, 84523, 84527, 84531, 84535, 84539, 84543, 84547, + 84551, 84555, 84559, 84563, 84567, 84571, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 84575, 84580, 84585, 84590, 84595, 84600, 84608, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 84613, 84621, 84629, 84637, 84645, 0, 0, 0, 0, 0, + 84653, 84660, 84667, 84677, 84683, 84689, 84695, 84701, 84707, 84713, + 84720, 84726, 84732, 84738, 84747, 84756, 84768, 84780, 84786, 84792, + 84798, 84805, 84812, 84819, 84826, 84833, 0, 84840, 84847, 84854, 84862, + 84869, 0, 84876, 0, 84883, 84890, 0, 84897, 84905, 0, 84912, 84919, + 84926, 84933, 84940, 84947, 84954, 84961, 84968, 84975, 84980, 84987, + 84994, 85000, 85006, 85012, 85019, 85025, 85031, 85037, 85044, 85050, + 85056, 85062, 85069, 85075, 85081, 85087, 85094, 85100, 85106, 85112, + 85119, 85125, 85131, 85137, 85144, 85150, 85156, 85162, 85169, 85175, + 85181, 85187, 85194, 85200, 85206, 85212, 85219, 85225, 85231, 85237, + 85244, 85250, 85256, 85262, 85269, 85275, 85281, 85287, 85294, 85300, + 85306, 85312, 85318, 85324, 85330, 85336, 85342, 85348, 85354, 85360, + 85366, 85372, 85378, 85384, 85391, 85397, 85403, 85409, 85416, 85422, + 85428, 85434, 85441, 85447, 85453, 85459, 85466, 85474, 85482, 85488, + 85494, 85500, 85507, 85516, 85525, 85533, 85541, 85549, 85558, 85566, + 85574, 85582, 85591, 85598, 85605, 85616, 85627, 85631, 85635, 85641, + 85647, 85653, 85659, 85669, 85679, 85686, 85693, 85700, 85708, 85716, + 85720, 85726, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85732, + 85738, 85744, 85750, 85757, 85762, 85767, 85773, 85779, 85785, 85791, + 85800, 85806, 85812, 85820, 85828, 85836, 85844, 85850, 85856, 85862, + 85869, 85882, 85896, 85907, 85918, 85930, 85942, 85954, 85966, 85977, + 85988, 86000, 86012, 86024, 86036, 86048, 86060, 86072, 86089, 86106, + 86123, 86130, 86137, 86144, 86152, 86164, 86175, 86186, 86199, 86210, + 86219, 86227, 86236, 86244, 86254, 86262, 86271, 86279, 86288, 86296, + 86306, 86314, 86323, 86331, 86341, 86349, 86357, 86365, 86373, 86380, + 86389, 86397, 86405, 86414, 86422, 86431, 86439, 86447, 86455, 86464, + 86472, 86481, 86489, 86497, 86505, 86513, 86522, 86530, 86539, 86547, + 86556, 86564, 86573, 86581, 86591, 86599, 86607, 86615, 86625, 86633, + 86641, 86650, 86658, 86667, 86676, 86684, 86694, 86702, 86711, 86719, + 86728, 86736, 86746, 86754, 86762, 86769, 86777, 86784, 86793, 86800, + 86809, 86817, 86826, 86834, 86844, 86852, 86861, 86869, 86879, 86887, + 86895, 86902, 86910, 86917, 86926, 86933, 86943, 86953, 86964, 86973, + 86982, 86991, 87000, 87009, 87019, 87031, 87043, 87054, 87066, 87079, + 87090, 87099, 87108, 87116, 87125, 87135, 87143, 87152, 87161, 87169, + 87178, 87188, 87196, 87205, 87214, 87222, 87231, 87241, 87249, 87259, + 87267, 87277, 87285, 87293, 87302, 87310, 87320, 87328, 87336, 87346, + 87354, 87361, 87368, 87377, 87386, 87394, 87403, 87413, 87421, 87432, + 87440, 87448, 87455, 87463, 87472, 87479, 87491, 87502, 87514, 87525, + 87537, 87546, 87554, 87563, 87571, 87580, 87589, 87597, 87606, 87614, + 87623, 87631, 87639, 87647, 87655, 87662, 87671, 87679, 87688, 87696, + 87705, 87713, 87721, 87730, 87738, 87747, 87755, 87764, 87772, 87780, + 87788, 87797, 87805, 87814, 87822, 87831, 87839, 87848, 87856, 87864, + 87872, 87881, 87889, 87898, 87907, 87915, 87924, 87932, 87941, 87949, + 87958, 87966, 87973, 87981, 87988, 87997, 88005, 88014, 88022, 88031, + 88040, 88048, 88058, 88066, 88073, 88081, 88088, 88096, 88108, 88121, + 88130, 88140, 88149, 88159, 88168, 88178, 88187, 88197, 88206, 88216, + 88226, 88235, 88244, 88253, 88263, 88271, 88280, 88290, 88300, 88310, + 88320, 88328, 88338, 88346, 88356, 88364, 88374, 88382, 88392, 88400, + 88409, 88416, 88426, 88434, 88444, 88452, 88462, 88470, 88480, 88488, + 88497, 88505, 88514, 88522, 88531, 88540, 88549, 88558, 88568, 88576, + 88586, 88594, 88604, 88612, 88622, 88630, 88640, 88648, 88657, 88664, + 88674, 88682, 88692, 88700, 88710, 88718, 88728, 88736, 88745, 88753, + 88762, 88770, 88779, 88788, 88797, 88806, 88815, 88823, 88832, 88840, + 88849, 88858, 88866, 88876, 88885, 88895, 88905, 88914, 88924, 88933, + 88942, 88950, 88958, 88963, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 88968, 88979, 88990, 89001, 89011, 89022, 89033, 89043, 89054, 89064, + 89074, 89083, 89094, 89105, 89116, 89129, 89139, 89149, 89160, 89170, + 89180, 89190, 89200, 89210, 89220, 89230, 89241, 89252, 89263, 89273, + 89283, 89295, 89306, 89317, 89327, 89337, 89347, 89357, 89368, 89378, + 89388, 89400, 89410, 89420, 89432, 89443, 89454, 89464, 89474, 89484, + 89494, 89506, 89518, 89530, 89541, 89552, 89562, 89572, 89582, 89591, + 89600, 89610, 89620, 89631, 0, 0, 89641, 89652, 89663, 89673, 89683, + 89695, 89706, 89717, 89730, 89740, 89752, 89761, 89770, 89781, 89792, + 89805, 89816, 89829, 89839, 89851, 89861, 89873, 89885, 89898, 89908, + 89918, 89928, 89939, 89949, 89958, 89968, 89977, 89986, 89996, 90006, + 90016, 90026, 90036, 90046, 90057, 90067, 90078, 90088, 90099, 90110, + 90120, 90130, 90140, 90150, 90160, 90170, 90181, 90191, 90202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90213, 90228, 90243, 90249, 90255, + 90261, 90267, 90273, 90279, 90285, 90291, 90299, 90303, 90306, 0, 0, + 90314, 90317, 90320, 90323, 90326, 90329, 90332, 90335, 90338, 90341, + 90344, 90347, 90350, 90353, 90356, 90359, 90362, 90370, 90379, 90390, + 90398, 90406, 90415, 90424, 90435, 90447, 0, 0, 0, 0, 0, 0, 90457, 90462, + 90467, 90474, 90481, 90487, 90493, 90498, 90503, 90508, 90514, 90520, + 90526, 90532, 90538, 90545, 90552, 90562, 90572, 90582, 90591, 90602, + 90611, 90620, 90630, 90640, 90652, 90664, 90675, 90686, 90697, 90708, + 90718, 90728, 90738, 90748, 90759, 90770, 90774, 90779, 90788, 90797, + 90801, 90805, 90809, 90814, 90819, 90824, 90829, 90832, 90836, 0, 90841, + 90844, 90847, 90851, 90855, 90860, 90864, 90868, 90873, 90878, 90885, + 90892, 90895, 90898, 90901, 90904, 90907, 90911, 90915, 0, 90919, 90924, + 90928, 90932, 0, 0, 0, 0, 90937, 90942, 90949, 90954, 90959, 0, 90964, + 90969, 90975, 90980, 90986, 90991, 90997, 91002, 91008, 91013, 91019, + 91025, 91034, 91043, 91052, 91061, 91071, 91081, 91091, 91101, 91110, + 91119, 91128, 91138, 91143, 91148, 91154, 91160, 91166, 91173, 91181, + 91189, 91195, 91201, 91207, 91214, 91220, 91226, 91232, 91239, 91245, + 91251, 91257, 91264, 91269, 91274, 91279, 91285, 91291, 91297, 91303, + 91310, 91316, 91322, 91328, 91334, 91340, 91346, 91352, 91358, 91364, + 91370, 91376, 91383, 91389, 91395, 91401, 91408, 91414, 91420, 91426, + 91433, 91439, 91445, 91451, 91458, 91464, 91470, 91476, 91483, 91489, + 91495, 91501, 91508, 91514, 91520, 91526, 91533, 91539, 91545, 91551, + 91558, 91564, 91570, 91576, 91583, 91589, 91595, 91601, 91608, 91614, + 91620, 91626, 91633, 91639, 91645, 91651, 91658, 91663, 91668, 91673, + 91679, 91685, 91691, 91697, 91704, 91710, 91716, 91722, 91729, 91735, + 91741, 91748, 91755, 91760, 91765, 91770, 91776, 91788, 91800, 91812, + 91824, 91837, 91850, 91858, 0, 0, 91866, 0, 91874, 91878, 91882, 91885, + 91889, 91893, 91896, 91899, 91903, 91907, 91910, 91913, 91916, 91919, + 91924, 91927, 91931, 91934, 91937, 91940, 91943, 91946, 91949, 91952, + 91955, 91958, 91961, 91964, 91968, 91972, 91976, 91980, 91985, 91990, + 91996, 92002, 92008, 92013, 92019, 92025, 92031, 92036, 92042, 92048, + 92053, 92059, 92065, 92070, 92076, 92082, 92087, 92093, 92099, 92104, + 92110, 92116, 92122, 92128, 92134, 92138, 92143, 92147, 92152, 92156, + 92161, 92166, 92172, 92178, 92184, 92189, 92195, 92201, 92207, 92212, + 92218, 92224, 92229, 92235, 92241, 92246, 92252, 92258, 92263, 92269, + 92275, 92280, 92286, 92292, 92298, 92304, 92310, 92315, 92319, 92324, + 92327, 92332, 92337, 92343, 92348, 92353, 92357, 92362, 92367, 92372, + 92377, 92382, 92387, 92392, 92397, 92403, 92409, 92415, 92423, 92427, + 92431, 92435, 92439, 92443, 92447, 92452, 92457, 92462, 92467, 92471, + 92476, 92481, 92486, 92491, 92495, 92500, 92505, 92510, 92514, 92518, + 92523, 92528, 92533, 92538, 92542, 92547, 92552, 92557, 92562, 92566, + 92571, 92576, 92581, 92586, 92590, 92595, 92600, 92604, 92609, 92614, + 92619, 92624, 92629, 92634, 92641, 92648, 92652, 92657, 92662, 92667, + 92672, 92677, 92682, 92687, 92692, 92697, 92702, 92707, 92712, 92717, + 92722, 92727, 92732, 92737, 92742, 92747, 92752, 92757, 92762, 92767, + 92772, 92777, 92782, 92787, 92792, 92797, 0, 0, 0, 92802, 92806, 92811, + 92815, 92820, 92825, 0, 0, 92829, 92834, 92839, 92843, 92848, 92853, 0, + 0, 92858, 92863, 92867, 92872, 92877, 92882, 0, 0, 92887, 92892, 92897, + 0, 0, 0, 92901, 92905, 92909, 92913, 92916, 92920, 92924, 0, 92928, + 92934, 92937, 92941, 92944, 92948, 92952, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 92956, 92962, 92968, 92974, 92980, 0, 0, 92984, 92990, 92996, 93002, + 93008, 93014, 93021, 93028, 93035, 93042, 93049, 93056, 0, 93063, 93070, + 93077, 93083, 93090, 93097, 93104, 93111, 93117, 93124, 93131, 93138, + 93145, 93151, 93158, 93165, 93172, 93179, 93185, 93192, 93199, 93206, + 93213, 93220, 93227, 93234, 0, 93241, 93247, 93254, 93261, 93268, 93275, + 93281, 93288, 93295, 93302, 93309, 93315, 93322, 93329, 93335, 93342, + 93349, 93356, 93363, 0, 93370, 93377, 0, 93384, 93391, 93398, 93405, + 93412, 93419, 93426, 93433, 93440, 93447, 93454, 93461, 93468, 93475, + 93482, 0, 0, 93488, 93493, 93498, 93503, 93508, 93513, 93518, 93523, + 93528, 93533, 93538, 93543, 93548, 93553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 93558, 93565, 93572, 93579, 93586, 93593, 93600, 93607, 93614, 93621, + 93628, 93635, 93642, 93649, 93656, 93663, 93670, 93677, 93684, 93691, + 93699, 93707, 93714, 93721, 93726, 93734, 93742, 93749, 93756, 93761, + 93768, 93773, 93778, 93785, 93790, 93795, 93800, 93808, 93813, 93818, + 93825, 93830, 93835, 93842, 93849, 93854, 93859, 93864, 93869, 93874, + 93879, 93884, 93889, 93894, 93901, 93906, 93913, 93918, 93923, 93928, + 93933, 93938, 93943, 93948, 93953, 93958, 93963, 93968, 93975, 93982, + 93989, 93996, 94002, 94007, 94014, 94019, 94024, 94033, 94040, 94049, + 94056, 94061, 94066, 94074, 94079, 94084, 94089, 94094, 94099, 94106, + 94111, 94116, 94121, 94126, 94131, 94138, 94145, 94152, 94159, 94166, + 94173, 94180, 94187, 94194, 94201, 94208, 94215, 94222, 94229, 94236, + 94243, 94250, 94257, 94264, 94271, 94278, 94285, 94292, 94299, 94306, + 94313, 94320, 94327, 0, 0, 0, 0, 0, 94334, 94342, 94350, 0, 0, 0, 0, + 94355, 94359, 94363, 94367, 94371, 94375, 94379, 94383, 94387, 94391, + 94396, 94401, 94406, 94411, 94416, 94421, 94426, 94431, 94436, 94442, + 94448, 94454, 94461, 94468, 94475, 94482, 94489, 94496, 94501, 94506, + 94511, 94517, 94523, 94529, 94535, 94541, 94547, 94553, 94559, 94565, + 94571, 94577, 94583, 94589, 94595, 0, 0, 0, 94601, 94609, 94617, 94625, + 94633, 94641, 94651, 94661, 94669, 94677, 94685, 94693, 94701, 94707, + 94714, 94723, 94731, 94739, 94748, 94757, 94766, 94776, 94787, 94797, + 94808, 94817, 94826, 94835, 94845, 94856, 94866, 94877, 94888, 94897, + 94905, 94911, 94917, 94923, 94929, 94937, 94945, 94951, 94958, 94968, + 94975, 94982, 94989, 94996, 95003, 95013, 95020, 95027, 95035, 95043, + 95052, 95061, 95070, 95079, 95088, 95095, 95103, 95112, 95121, 95125, + 95132, 95137, 95142, 95146, 95150, 95154, 95158, 95163, 95168, 95174, + 95180, 95184, 95190, 95194, 95198, 95202, 95206, 95210, 95214, 95220, + 95224, 95229, 95233, 95237, 0, 95240, 95245, 95250, 95255, 95260, 95267, + 95272, 95277, 95282, 95287, 95292, 95297, 0, 0, 0, 0, 95302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95308, 95315, + 95324, 95333, 95340, 95347, 95354, 95361, 95368, 95375, 95381, 95388, + 95395, 95402, 95409, 95416, 95423, 95430, 95437, 95446, 95453, 95460, + 95467, 95474, 95481, 95488, 95495, 95502, 95511, 95518, 95525, 95532, + 95539, 95546, 95553, 95562, 95569, 95576, 95583, 95590, 95599, 95606, + 95613, 95620, 95628, 95637, 0, 0, 95646, 95650, 95654, 95659, 95664, + 95669, 95674, 95678, 95683, 95688, 95693, 95698, 95703, 95708, 95712, + 95717, 95722, 95727, 95732, 95736, 95741, 95746, 95750, 95755, 95760, + 95765, 95770, 95775, 95780, 0, 0, 0, 95785, 95789, 95794, 95799, 95803, + 95808, 95812, 95817, 95822, 95827, 95832, 95837, 95841, 95846, 95851, + 95856, 95861, 95866, 95871, 95875, 95880, 95885, 95890, 95895, 95900, + 95905, 95909, 95913, 95918, 95923, 95928, 95933, 95938, 95943, 95948, + 95953, 95958, 95963, 95968, 95973, 95978, 95983, 95988, 95993, 95998, + 96003, 96008, 96013, 96018, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96023, 96029, 96034, 96039, 96044, 96049, 96054, 96059, 96064, 96069, + 96074, 96080, 96086, 96092, 96098, 96104, 96110, 96116, 96122, 96128, + 96135, 96142, 96149, 96157, 96165, 96173, 96181, 96189, 0, 0, 0, 0, + 96197, 96201, 96206, 96211, 96216, 96220, 96225, 96230, 96235, 96240, + 96244, 96248, 96253, 96258, 96263, 96268, 96272, 96277, 96282, 96287, + 96292, 96297, 96302, 96306, 96311, 96316, 96321, 96326, 96331, 96336, + 96341, 96346, 96351, 96356, 96361, 96367, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96373, 96378, 96385, 96392, 96397, 96402, 96407, 96412, 96417, 96422, + 96427, 96432, 96437, 96442, 96447, 96452, 96457, 96462, 96467, 96472, + 96477, 96482, 96487, 96492, 96497, 96502, 96507, 96512, 96517, 96522, 0, + 0, 0, 0, 0, 96529, 96535, 96541, 96547, 96553, 96558, 96564, 96570, + 96576, 96582, 96587, 96593, 96599, 96605, 96611, 96617, 96623, 96629, + 96635, 96641, 96646, 96652, 96658, 96664, 96670, 96676, 96681, 96687, + 96693, 96698, 96704, 96710, 96716, 96722, 96728, 96734, 96740, 96745, + 96751, 96758, 96765, 96772, 96779, 0, 0, 0, 0, 0, 96786, 96791, 96796, + 96801, 96806, 96811, 96816, 96821, 96826, 96831, 96836, 96841, 96846, + 96851, 96856, 96861, 96866, 96871, 96876, 96881, 96886, 96891, 96896, + 96901, 96906, 96911, 96916, 96920, 96924, 96928, 0, 96933, 96939, 96944, + 96949, 96954, 96959, 96965, 96971, 96977, 96983, 96989, 96995, 97001, + 97006, 97012, 97018, 97024, 97030, 97036, 97041, 97047, 97053, 97058, + 97064, 97069, 97075, 97081, 97086, 97092, 97098, 97103, 97109, 97114, + 97119, 97125, 97131, 97137, 0, 0, 0, 0, 97142, 97148, 97154, 97160, + 97166, 97172, 97178, 97184, 97190, 97197, 97202, 97207, 97213, 97219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97225, 97231, 97237, + 97243, 97250, 97256, 97263, 97270, 97277, 97284, 97292, 97299, 97307, + 97313, 97319, 97325, 97331, 97337, 97343, 97349, 97355, 97361, 97367, + 97373, 97379, 97385, 97391, 97397, 97403, 97409, 97415, 97421, 97427, + 97433, 97439, 97445, 97451, 97457, 97463, 97469, 97475, 97481, 97487, + 97493, 97500, 97506, 97513, 97520, 97527, 97534, 97542, 97549, 97557, + 97563, 97569, 97575, 97581, 97587, 97593, 97599, 97605, 97611, 97617, + 97623, 97629, 97635, 97641, 97647, 97653, 97659, 97665, 97671, 97677, + 97683, 97689, 97695, 97701, 97707, 97713, 97719, 97725, 97730, 97735, + 97740, 97745, 97750, 97755, 97760, 97765, 97770, 97775, 97780, 97785, + 97790, 97795, 97800, 97805, 97810, 97815, 97820, 97825, 97830, 97835, + 97840, 97845, 97850, 97855, 97860, 97865, 97870, 97875, 97880, 97885, + 97890, 97895, 97900, 97905, 97910, 97915, 97920, 97925, 97930, 97935, + 97940, 97945, 97950, 97955, 97960, 97965, 97970, 97975, 97979, 97984, + 97989, 97994, 97999, 98003, 98007, 98012, 98017, 98022, 98027, 98032, + 98037, 98042, 98047, 98052, 98057, 98062, 98066, 98070, 98074, 98078, + 98082, 98086, 98090, 98095, 98100, 0, 0, 98105, 98110, 98114, 98118, + 98122, 98126, 98130, 98134, 98138, 98142, 0, 0, 0, 0, 0, 0, 98146, 98151, + 98157, 98163, 98169, 98175, 98181, 98187, 98192, 98198, 98203, 98209, + 98214, 98219, 98225, 98231, 98236, 98241, 98246, 98251, 98257, 98262, + 98268, 98273, 98279, 98284, 98290, 98296, 98302, 98308, 98314, 98319, + 98325, 98331, 98337, 98343, 0, 0, 0, 0, 98349, 98354, 98360, 98366, + 98372, 98378, 98384, 98390, 98395, 98401, 98406, 98412, 98417, 98422, + 98428, 98434, 98439, 98444, 98449, 98454, 98460, 98465, 98471, 98476, + 98482, 98487, 98493, 98499, 98505, 98511, 98517, 98522, 98528, 98534, + 98540, 98546, 0, 0, 0, 0, 98552, 98556, 98561, 98566, 98571, 98576, + 98581, 98586, 98591, 98595, 98600, 98605, 98610, 98615, 98619, 98624, + 98629, 98634, 98639, 98644, 98649, 98653, 98658, 98662, 98667, 98672, + 98677, 98682, 98687, 98692, 98697, 98702, 98706, 98711, 98716, 98721, + 98726, 98731, 98736, 98741, 0, 0, 0, 0, 0, 0, 0, 0, 98746, 98753, 98760, + 98767, 98774, 98781, 98788, 98795, 98802, 98809, 98816, 98823, 98830, + 98837, 98844, 98851, 98858, 98865, 98872, 98879, 98886, 98893, 98900, + 98907, 98914, 98921, 98928, 98935, 98942, 98949, 98956, 98963, 98970, + 98977, 98984, 98991, 98998, 99005, 99012, 99019, 99026, 99033, 99040, + 99047, 99054, 99061, 99068, 99075, 99082, 99089, 99096, 99103, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 99110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 99117, 99122, 99127, 99132, 99137, 99142, 99147, 99152, 99157, + 99162, 99167, 99172, 99177, 99182, 99187, 99192, 99197, 99202, 99207, + 99212, 99217, 99222, 99227, 99232, 99237, 99242, 99247, 99252, 99257, + 99262, 99267, 99272, 99277, 99282, 99287, 99292, 99297, 99302, 99307, + 99312, 99317, 99322, 99327, 99332, 99337, 99342, 99347, 99352, 99357, + 99362, 99367, 99372, 99377, 99382, 99387, 99392, 99397, 99402, 99407, + 99412, 99417, 99422, 99427, 99432, 99437, 99442, 99447, 99452, 99457, + 99462, 99467, 99472, 99477, 99482, 99487, 99492, 99497, 99502, 99507, + 99512, 99517, 99522, 99527, 99532, 99537, 99542, 99547, 99552, 99557, + 99562, 99567, 99572, 99577, 99582, 99587, 99592, 99597, 99602, 99607, + 99612, 99617, 99622, 99627, 99632, 99637, 99642, 99647, 99652, 99657, + 99662, 99667, 99672, 99677, 99682, 99687, 99692, 99697, 99702, 99707, + 99712, 99717, 99722, 99727, 99732, 99737, 99742, 99747, 99752, 99757, + 99762, 99767, 99772, 99777, 99782, 99787, 99792, 99797, 99802, 99807, + 99812, 99817, 99822, 99827, 99832, 99837, 99842, 99847, 99852, 99857, + 99862, 99867, 99872, 99877, 99882, 99887, 99892, 99897, 99902, 99907, + 99912, 99917, 99922, 99927, 99932, 99937, 99942, 99947, 99952, 99957, + 99962, 99967, 99972, 99977, 99982, 99987, 99992, 99997, 100002, 100007, + 100012, 100017, 100022, 100027, 100032, 100037, 100042, 100047, 100052, + 100057, 100062, 100067, 100072, 100077, 100082, 100087, 100092, 100097, + 100102, 100107, 100112, 100117, 100122, 100127, 100132, 100137, 100142, + 100147, 100152, 100157, 100162, 100167, 100172, 100177, 100182, 100187, + 100192, 100197, 100202, 100207, 100212, 100217, 100222, 100227, 100232, + 100237, 100242, 100247, 100252, 100257, 100262, 100267, 100272, 100277, + 100282, 100287, 100292, 100297, 100302, 100307, 100312, 100317, 100322, + 100327, 100332, 100337, 100342, 100347, 100352, 100357, 100362, 100367, + 100372, 100377, 100382, 100387, 100392, 100397, 100402, 100407, 100412, + 100417, 100422, 100427, 100432, 100437, 100442, 100447, 100452, 100457, + 100462, 100467, 100472, 100477, 100482, 100487, 100492, 100497, 100502, + 100507, 100512, 100517, 100522, 100527, 100532, 100537, 100542, 100547, + 100552, 100557, 100562, 100567, 100572, 100577, 100582, 100587, 100592, + 100597, 100602, 100607, 100612, 100617, 100622, 100627, 100632, 100637, + 100642, 100647, 100652, 100657, 100662, 100667, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 100672, 100678, 100685, 100692, 100698, 100705, 100712, 100719, + 100726, 100732, 100739, 100746, 100753, 100760, 100767, 100774, 100781, + 100788, 100795, 100802, 100809, 100816, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 100823, 100828, 100833, 100838, 100843, 100848, 100853, 100858, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100863, + 100867, 100871, 100875, 100879, 100883, 0, 0, 100888, 0, 100893, 100897, + 100902, 100907, 100912, 100917, 100921, 100926, 100931, 100936, 100941, + 100945, 100950, 100955, 100960, 100965, 100969, 100974, 100979, 100984, + 100989, 100993, 100998, 101003, 101008, 101013, 101017, 101022, 101027, + 101032, 101037, 101041, 101046, 101051, 101056, 101061, 101065, 101070, + 101075, 101079, 101084, 101089, 101094, 101099, 0, 101104, 101109, 0, 0, + 0, 101114, 0, 0, 101119, 101124, 101131, 101138, 101145, 101152, 101159, + 101166, 101173, 101180, 101187, 101194, 101201, 101208, 101215, 101222, + 101229, 101236, 101243, 101250, 101257, 101264, 101271, 0, 101278, + 101285, 101291, 101297, 101303, 101310, 101317, 101325, 101332, 101340, + 101345, 101350, 101355, 101360, 101365, 101370, 101375, 101380, 101385, + 101390, 101395, 101400, 101405, 101411, 101416, 101421, 101426, 101431, + 101436, 101441, 101446, 101451, 101456, 101462, 101468, 101472, 101476, + 101480, 101484, 101488, 101493, 101498, 101504, 101509, 101515, 101520, + 101525, 101530, 101536, 101541, 101546, 101551, 101556, 101561, 101567, + 101572, 101578, 101583, 101589, 101594, 101600, 101605, 101611, 101616, + 101621, 101626, 101631, 101636, 101641, 101646, 101652, 101657, 0, 0, 0, + 0, 0, 0, 0, 0, 101662, 101666, 101670, 101674, 101678, 101684, 101688, + 101693, 101698, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 101704, 101709, 101714, 101719, 101724, 101729, 101734, + 101739, 101744, 101749, 101754, 101759, 101764, 101769, 101774, 101779, + 101784, 101789, 101794, 0, 101799, 101804, 0, 0, 0, 0, 0, 101809, 101813, + 101817, 101822, 101827, 101833, 101838, 101843, 101848, 101853, 101858, + 101863, 101868, 101873, 101878, 101883, 101888, 101893, 101898, 101903, + 101908, 101913, 101918, 101923, 101928, 101933, 101938, 101943, 101947, + 101952, 101957, 101963, 101967, 0, 0, 0, 101971, 101977, 101981, 101986, + 101991, 101996, 102000, 102005, 102009, 102014, 102019, 102023, 102028, + 102033, 102037, 102041, 102046, 102051, 102055, 102060, 102065, 102070, + 102075, 102080, 102085, 102090, 102095, 0, 0, 0, 0, 0, 102100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67831, 67840, - 67849, 67860, 67867, 67872, 67877, 67884, 67891, 67897, 67902, 67907, - 67912, 67917, 67924, 67929, 67934, 67939, 67950, 67955, 67960, 67967, - 67972, 67979, 67984, 67989, 67996, 68003, 68010, 68019, 68028, 68033, - 68038, 68043, 68050, 68055, 68065, 68072, 68077, 68082, 68087, 68092, - 68097, 68102, 68111, 68118, 68125, 68130, 68137, 68142, 68149, 68158, - 68169, 68174, 68183, 68188, 68195, 68204, 68213, 68218, 68223, 68230, - 68236, 68243, 68250, 68254, 68258, 68261, 68265, 68269, 68273, 68277, - 68281, 68285, 68289, 68292, 68296, 68300, 68304, 68308, 68312, 68316, - 68319, 68323, 68327, 68330, 68334, 68338, 68342, 68346, 68350, 68354, - 68358, 68362, 68366, 68370, 68374, 68378, 68382, 68386, 68390, 68394, - 68398, 68402, 68406, 68410, 68414, 68418, 68422, 68426, 68430, 68434, - 68438, 68442, 68446, 68450, 68454, 68458, 68462, 68466, 68470, 68474, - 68478, 68482, 68486, 68490, 68494, 68498, 68502, 68506, 68509, 68513, - 68517, 68521, 68525, 68529, 68533, 68537, 68541, 68545, 68549, 68553, - 68557, 68561, 68565, 68569, 68573, 68577, 68581, 68585, 68589, 68593, - 68597, 68601, 68605, 68609, 68613, 68617, 68621, 68625, 68629, 68633, - 68637, 68641, 68645, 68649, 68653, 68657, 68661, 68665, 68669, 68673, - 68677, 68681, 68685, 68689, 68693, 68697, 68701, 68705, 68709, 68713, - 68717, 68721, 68725, 68729, 68733, 68737, 68741, 68745, 68749, 68753, - 68757, 68761, 68765, 68769, 68773, 68777, 68781, 68785, 68789, 68793, - 68797, 68801, 68805, 68809, 68813, 68817, 68821, 68825, 68829, 68833, - 68837, 68841, 68845, 68849, 68853, 68857, 68861, 68865, 68869, 68873, - 68877, 68881, 68885, 68889, 68893, 68897, 68901, 68905, 68909, 68913, - 68917, 68921, 68925, 68929, 68933, 68937, 68941, 68945, 68949, 68953, - 68957, 68961, 68965, 68969, 68973, 68977, 68980, 68984, 68988, 68992, - 68996, 69000, 69004, 69008, 69012, 69016, 69020, 69024, 69028, 69032, - 69036, 69040, 69044, 69048, 69052, 69056, 69060, 69064, 69068, 69072, - 69076, 69080, 69084, 69088, 69092, 69096, 69100, 69104, 69108, 69112, - 69116, 69120, 69124, 69128, 69132, 69136, 69140, 69144, 69148, 69152, - 69156, 69160, 69164, 69168, 69172, 69176, 69180, 69184, 69188, 69192, - 69196, 69200, 69204, 69208, 69212, 69216, 69220, 69224, 69228, 69232, - 69236, 69240, 69244, 69248, 69252, 69256, 69260, 69264, 69268, 69272, - 69276, 69280, 69284, 69288, 69292, 69296, 69300, 69304, 69308, 69312, - 69316, 69320, 69324, 69328, 69332, 69336, 69340, 69344, 69348, 69352, - 69356, 69360, 69364, 69368, 69372, 69376, 69380, 69384, 69388, 69392, - 69396, 69400, 69404, 69408, 69412, 69416, 69420, 69424, 69428, 69432, - 69436, 69440, 69443, 69447, 69451, 69455, 69459, 69463, 69467, 69471, - 69475, 69479, 69483, 69487, 69491, 69495, 69499, 69503, 69507, 69511, - 69515, 69519, 69523, 69527, 69531, 69535, 69539, 69543, 69547, 69551, - 69555, 69559, 69563, 69567, 69571, 69575, 69579, 69583, 69587, 69591, - 69595, 69599, 69603, 69607, 69611, 69615, 69619, 69623, 69627, 69631, - 69635, 69639, 69643, 69647, 69651, 69655, 69659, 69663, 69667, 69671, - 69675, 69679, 69683, 69687, 69691, 69695, 69699, 69703, 69707, 69711, - 69715, 69719, 69723, 69727, 69731, 69735, 69739, 69743, 69747, 69751, - 69755, 69759, 69763, 69767, 69771, 69775, 69779, 69783, 69787, 69791, - 69795, 69799, 69802, 69806, 69810, 69814, 69818, 69822, 69826, 69830, - 69834, 69838, 69842, 69846, 69850, 69854, 69858, 69862, 69866, 69870, - 69874, 69878, 69882, 69886, 69890, 69894, 69898, 69902, 69906, 69910, - 69914, 69918, 69922, 69926, 69930, 69934, 69938, 69942, 69946, 69950, - 69954, 69958, 69962, 69966, 69970, 69974, 69978, 69982, 69986, 69990, - 69994, 69998, 70002, 70006, 70010, 70014, 70018, 70022, 70026, 70030, - 70034, 70038, 70041, 70045, 70049, 70053, 70057, 70061, 70065, 70069, - 70073, 70077, 70081, 70085, 70089, 70093, 70097, 70101, 70105, 70109, - 70113, 70117, 70121, 70125, 70129, 70133, 70137, 70141, 70145, 70149, - 70153, 70157, 70161, 70165, 70169, 70173, 70177, 70181, 70185, 70189, - 70193, 70197, 70201, 70205, 70209, 70213, 70217, 70221, 70225, 70229, - 70233, 70237, 70241, 70245, 70249, 70253, 70257, 70261, 70265, 70269, - 70273, 70277, 70281, 70285, 70289, 70293, 70296, 70300, 70304, 70308, - 70312, 70316, 70320, 70324, 70328, 70332, 70336, 70340, 70344, 70348, - 70352, 70356, 70360, 70364, 70368, 70372, 70376, 70380, 70384, 70388, - 70392, 70396, 70400, 70404, 70408, 70412, 70416, 70420, 70424, 70428, - 70432, 70436, 70440, 70444, 70448, 70452, 70456, 70460, 70464, 70468, - 70472, 70476, 70480, 70484, 70488, 70492, 70496, 70500, 70504, 70508, - 70512, 70516, 70520, 70524, 70528, 70532, 70536, 70540, 70544, 70548, - 70552, 70556, 70560, 70564, 70568, 70572, 70576, 70580, 70584, 70588, - 70592, 70596, 70600, 70604, 70608, 70612, 70616, 70620, 70624, 70628, - 70632, 70636, 70640, 70644, 70648, 70652, 70656, 70660, 70664, 70668, - 70672, 70676, 70680, 70684, 70688, 70692, 70696, 70700, 70704, 70708, - 70712, 70716, 70720, 70724, 70728, 70732, 70736, 70740, 70744, 70748, - 70751, 70755, 70759, 70763, 70767, 70771, 70775, 70779, 70783, 70787, - 70791, 70795, 70799, 70803, 70807, 70811, 70815, 70819, 70823, 70827, - 70831, 70835, 70839, 70843, 70847, 70851, 70855, 70859, 70863, 70867, - 70871, 70875, 70879, 70883, 70887, 70891, 70895, 70899, 70903, 70907, - 70911, 70915, 70919, 70923, 70927, 70931, 70935, 70939, 70943, 70947, - 70951, 70955, 70959, 70963, 70967, 70971, 70975, 70979, 70983, 70987, - 70991, 70995, 70999, 71003, 71007, 71011, 71015, 71019, 71023, 71027, - 71031, 71035, 71039, 71043, 71047, 71051, 71055, 71059, 71063, 71067, - 71071, 71075, 71079, 71083, 71087, 71091, 71095, 71099, 71103, 71107, - 71111, 71115, 71119, 71123, 71127, 71131, 71135, 71139, 71143, 71147, - 71151, 71155, 71159, 71163, 71167, 71171, 71175, 71179, 71183, 71187, - 71191, 71195, 71199, 71203, 71207, 71211, 71215, 71219, 71223, 71227, - 71231, 71235, 71239, 71243, 71247, 71251, 71255, 71259, 71263, 71267, - 71271, 71275, 71279, 71283, 71287, 71291, 71295, 71299, 71303, 71307, - 71311, 71315, 71319, 71323, 71327, 71331, 71335, 71339, 71343, 71347, - 71351, 71354, 71358, 71362, 71366, 71370, 71374, 71378, 71382, 71385, - 71389, 71393, 71397, 71401, 71405, 71409, 71413, 71417, 71421, 71425, - 71429, 71433, 71437, 71441, 71445, 71449, 71453, 71457, 71461, 71465, - 71469, 71473, 71477, 71481, 71485, 71489, 71493, 71497, 71501, 71505, - 71509, 71513, 71517, 71521, 71525, 71529, 71533, 71537, 71541, 71545, - 71549, 71553, 71557, 71561, 71565, 71569, 71573, 71577, 71581, 71585, - 71589, 71593, 71597, 71601, 71605, 71609, 71613, 71617, 71621, 71625, - 71629, 71633, 71637, 71641, 71645, 71649, 71653, 71657, 71661, 71665, - 71669, 71673, 71677, 71681, 71685, 71689, 71693, 71697, 71701, 71705, - 71709, 71713, 71717, 71721, 71725, 71729, 71733, 71737, 71741, 71745, - 71749, 71753, 71757, 71761, 71765, 71769, 71773, 71777, 71781, 71785, - 71789, 71793, 71797, 71801, 71805, 71809, 71813, 71817, 71821, 71825, - 71829, 71833, 71837, 71841, 71845, 71849, 71853, 71857, 71861, 71865, - 71869, 71873, 71877, 71881, 71885, 71889, 71893, 71897, 71901, 71905, - 71909, 71913, 71917, 71921, 71925, 71929, 71933, 71937, 71941, 71945, - 71949, 71953, 71957, 71961, 71965, 71969, 71973, 71977, 71981, 71985, - 71989, 71993, 71997, 72001, 72005, 72009, 72013, 72017, 72021, 72025, - 72029, 72033, 72037, 72041, 72045, 72049, 72053, 72057, 72061, 72065, - 72069, 72073, 72077, 72081, 72085, 72089, 72093, 72097, 72101, 72105, - 72109, 72112, 72116, 72120, 72124, 72128, 72132, 72136, 72140, 72144, - 72148, 72152, 72156, 72160, 72164, 72168, 72172, 72176, 72180, 72184, - 72188, 72192, 72196, 72200, 72204, 72208, 72212, 72216, 72220, 72224, - 72228, 72232, 72236, 72240, 72244, 72248, 72252, 72256, 72260, 72264, - 72268, 72272, 72276, 72280, 72284, 72288, 72292, 72296, 72300, 72304, - 72308, 72312, 72316, 72320, 72324, 72328, 72332, 72336, 72340, 72344, - 72348, 72352, 72356, 72360, 72364, 72368, 72372, 72376, 72380, 72384, - 72388, 72392, 72396, 72400, 72404, 72408, 72412, 72416, 72420, 72424, - 72428, 72432, 72436, 72440, 72444, 72448, 72452, 72456, 72460, 72464, - 72468, 72472, 72476, 72480, 72484, 72488, 72492, 72496, 72500, 72504, - 72508, 72512, 72516, 72520, 72524, 72528, 72532, 72536, 72540, 72544, - 72548, 72552, 72556, 72560, 72564, 72568, 72572, 72576, 72580, 72584, - 72588, 72592, 72596, 72600, 72604, 72608, 72612, 72616, 72620, 72624, - 72628, 72632, 72636, 72640, 72644, 72648, 72652, 72656, 72660, 72664, - 72668, 72672, 72676, 72680, 72684, 72688, 72692, 72696, 72700, 72704, - 72708, 72712, 72716, 72720, 72724, 72728, 72732, 72736, 72740, 72744, - 72748, 72752, 72756, 72760, 72764, 72768, 72772, 72776, 72780, 72784, - 72788, 72792, 72796, 72800, 72804, 72808, 72812, 72816, 72820, 72824, - 72828, 72832, 72836, 72840, 72844, 72848, 72852, 72856, 72860, 72864, - 72868, 72872, 72876, 72880, 72884, 72888, 72892, 0, 0, 0, 72896, 72900, - 72904, 72908, 72912, 72916, 72920, 72924, 72928, 72932, 72936, 72940, - 72944, 72948, 72952, 72956, 72960, 72964, 72968, 72972, 72976, 72980, - 72984, 72988, 72992, 72996, 73000, 73004, 73008, 73012, 73016, 73020, - 73024, 73028, 73032, 73036, 73040, 73044, 73048, 73052, 73056, 73060, - 73064, 73068, 73072, 73076, 73080, 73084, 73088, 73092, 73096, 73100, - 73104, 73108, 73112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73116, 73121, 73125, - 73130, 73135, 73140, 73145, 73150, 73154, 73159, 73164, 73169, 73174, - 73179, 73184, 73189, 73193, 73197, 73201, 73205, 73210, 73215, 73220, - 73224, 73229, 73234, 73239, 73244, 73249, 73253, 73258, 73262, 73267, - 73271, 73276, 73280, 73284, 73288, 73293, 73298, 73303, 73311, 73319, - 73327, 73335, 73342, 73350, 73356, 73364, 73368, 73372, 73376, 73380, - 73384, 73388, 73392, 73396, 73400, 73404, 73408, 73412, 73416, 73420, - 73424, 73428, 73432, 73436, 73440, 73444, 73448, 73452, 73456, 73460, - 73464, 73468, 73472, 73476, 73480, 73484, 73488, 73492, 73496, 73500, - 73504, 73508, 73511, 73515, 73519, 73523, 73527, 73531, 73535, 73539, - 73543, 73547, 73551, 73555, 73559, 73563, 73567, 73571, 73575, 73579, - 73583, 73587, 73591, 73595, 73599, 73603, 73607, 73611, 73615, 73619, - 73623, 73627, 73631, 73635, 73639, 73643, 73647, 73651, 73655, 73658, - 73662, 73666, 73669, 73673, 73677, 73681, 73684, 73688, 73692, 73696, - 73700, 73704, 73708, 73712, 73716, 73720, 73724, 73728, 73732, 73736, - 73739, 73742, 73746, 73750, 73753, 73757, 73761, 73765, 73769, 73773, - 73777, 73780, 73783, 73787, 73791, 73795, 73798, 73801, 73805, 73809, - 73813, 73817, 73821, 73825, 73829, 73833, 73837, 73841, 73845, 73849, - 73853, 73857, 73861, 73865, 73869, 73873, 73877, 73881, 73885, 73889, - 73893, 73897, 73901, 73905, 73909, 73913, 73917, 73921, 73925, 73929, - 73933, 73937, 73941, 73945, 73949, 73952, 73956, 73960, 73964, 73968, - 73972, 73976, 73980, 73984, 73988, 73992, 73996, 74000, 74004, 74008, - 74012, 74016, 74020, 74024, 74028, 74032, 74036, 74040, 74044, 74048, - 74052, 74056, 74060, 74064, 74068, 74072, 74076, 74080, 74084, 74088, - 74092, 74096, 74099, 74103, 74107, 74111, 74115, 74119, 74123, 74127, - 74131, 74135, 74139, 74143, 74147, 74151, 74155, 74159, 74163, 74166, - 74170, 74174, 74178, 74182, 74186, 74190, 74194, 74198, 74202, 74206, - 74210, 74214, 74218, 74222, 74226, 74230, 74234, 74238, 74242, 74246, - 74250, 74253, 74257, 74261, 74265, 74269, 74273, 74277, 74281, 74285, - 74289, 74293, 74297, 74301, 74305, 74309, 74313, 74317, 74321, 74325, - 74329, 74333, 74337, 74341, 74345, 74349, 74353, 74357, 74361, 74365, - 74369, 74373, 74377, 74381, 74385, 74389, 74393, 74397, 74401, 74405, - 74409, 74413, 74417, 74421, 74425, 74428, 74433, 74437, 74443, 74448, - 74454, 74458, 74462, 74466, 74470, 74474, 74478, 74482, 74486, 74490, - 74494, 74498, 74502, 74506, 74510, 74513, 74516, 74519, 74522, 74525, - 74528, 74531, 74534, 74537, 74542, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 74548, 74553, 74558, 74563, 74568, 74575, 74582, - 74587, 74592, 74597, 74602, 74609, 74616, 74623, 74630, 74637, 74644, - 74654, 74664, 74671, 74678, 74685, 74692, 74698, 74704, 74713, 74722, - 74729, 74736, 74747, 74758, 74763, 74768, 74775, 74782, 74789, 74796, - 74803, 74810, 74817, 74824, 74830, 74836, 74842, 74848, 74855, 74862, - 74867, 74871, 74878, 74885, 74892, 74896, 74903, 74907, 74912, 74916, - 74922, 74927, 74933, 74938, 74942, 74946, 74949, 74952, 74957, 74962, - 74967, 74972, 74977, 74982, 74987, 74992, 74997, 75002, 75010, 75018, - 75023, 75028, 75033, 75038, 75043, 75048, 75053, 75058, 75063, 75068, - 75073, 75078, 75083, 75088, 75094, 75100, 75106, 75112, 75117, 75123, - 75126, 75129, 75132, 75136, 75140, 75144, 75148, 75151, 75155, 75158, - 75161, 75164, 75168, 75172, 75176, 75180, 75184, 75188, 75192, 75196, - 75200, 75204, 75208, 75212, 75216, 75220, 75224, 75228, 75232, 75236, - 75240, 75244, 75248, 75252, 75255, 75259, 75263, 75267, 75271, 75275, - 75279, 75283, 75287, 75291, 75295, 75299, 75303, 75307, 75311, 75315, - 75319, 75323, 75327, 75331, 75335, 75339, 75343, 75347, 75351, 75354, - 75358, 75362, 75366, 75370, 75374, 75378, 75382, 75385, 75389, 75393, - 75397, 75401, 75405, 75409, 75413, 75417, 75421, 75425, 75429, 75433, - 75438, 75443, 75446, 75451, 75454, 75457, 75460, 0, 0, 0, 0, 0, 0, 0, 0, - 75464, 75473, 75482, 75491, 75500, 75509, 75518, 75527, 75536, 75544, - 75551, 75559, 75566, 75574, 75584, 75593, 75603, 75612, 75622, 75630, - 75637, 75645, 75652, 75660, 75665, 75670, 75676, 75685, 75691, 75697, - 75704, 75713, 75721, 75729, 75737, 75744, 75751, 75758, 75765, 75770, - 75775, 75780, 75785, 75790, 75795, 75800, 75805, 75813, 75821, 75827, - 75833, 75838, 75843, 75848, 75853, 75858, 75863, 75868, 75873, 75882, - 75891, 75896, 75901, 75911, 75921, 75928, 75935, 75944, 75953, 75965, - 75977, 75983, 75989, 75997, 76005, 76015, 76025, 76032, 76039, 76044, - 76049, 76061, 76073, 76081, 76089, 76099, 76109, 76121, 76133, 76142, - 76151, 76158, 76165, 76172, 76179, 76188, 76197, 76202, 76207, 76214, - 76221, 76228, 76235, 76247, 76259, 76264, 76269, 76274, 76279, 76284, - 76289, 76294, 76299, 76303, 76308, 76313, 76318, 76323, 76328, 76334, - 76339, 76344, 76351, 76358, 76365, 76372, 76379, 76388, 76397, 76403, - 76409, 76415, 76421, 76428, 76435, 76442, 76449, 76456, 76460, 76467, - 76472, 76477, 76484, 76497, 76503, 76511, 76519, 76526, 76533, 76542, - 76551, 76558, 76565, 76572, 76579, 76586, 76593, 76600, 76607, 76614, - 76621, 76630, 76639, 76648, 76657, 76666, 76675, 76684, 76693, 76702, - 76711, 76718, 76725, 76731, 76739, 76745, 76751, 76758, 76765, 76773, - 76778, 76783, 76788, 76793, 76798, 76804, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102105, 102110, 102115, 102120, + 102125, 102130, 102136, 102142, 102148, 102153, 102158, 102163, 102169, + 102175, 102181, 102186, 102192, 102197, 102203, 102209, 102214, 102220, + 102226, 102231, 102237, 102242, 102248, 102254, 102260, 102265, 102271, + 102277, 102283, 102288, 102293, 102298, 102303, 102308, 102314, 102320, + 102325, 102330, 102335, 102341, 102346, 102351, 102357, 102363, 102368, + 102375, 102381, 102386, 102392, 102397, 102403, 102408, 0, 0, 0, 0, + 102414, 102422, 102429, 102436, 102443, 102448, 102453, 102458, 102463, + 102468, 102473, 102478, 102483, 102488, 102494, 102500, 102506, 102512, + 102518, 102524, 0, 0, 102530, 102537, 102544, 102551, 102559, 102567, + 102575, 102583, 102591, 102599, 102605, 102611, 102617, 102624, 102631, + 102638, 102645, 102652, 102659, 102666, 102673, 102680, 102687, 102694, + 102701, 102708, 102715, 102722, 102730, 102738, 102746, 102755, 102764, + 102773, 102782, 102791, 102800, 102807, 102814, 102821, 102829, 102837, + 102845, 102853, 102861, 102869, 102877, 102881, 102886, 102891, 0, + 102897, 102902, 0, 0, 0, 0, 0, 102907, 102913, 102920, 102925, 102930, + 102934, 102939, 102944, 0, 102949, 102954, 102959, 0, 102964, 102969, + 102974, 102979, 102984, 102989, 102994, 102998, 103003, 103008, 103013, + 103017, 103021, 103026, 103031, 103036, 103040, 103044, 103048, 103052, + 103057, 103062, 103067, 103071, 103076, 103080, 103085, 103090, 103095, + 0, 0, 103100, 103106, 103111, 0, 0, 0, 0, 103116, 103120, 103124, 103128, + 103132, 103136, 103141, 103146, 103152, 103157, 0, 0, 0, 0, 0, 0, 0, + 103163, 103169, 103176, 103182, 103189, 103195, 103201, 103207, 103214, + 0, 0, 0, 0, 0, 0, 0, 103220, 103228, 103236, 103244, 103252, 103260, + 103268, 103276, 103284, 103292, 103300, 103308, 103316, 103324, 103332, + 103340, 103348, 103356, 103364, 103372, 103380, 103388, 103396, 103404, + 103412, 103420, 103428, 103436, 103444, 103452, 103459, 103467, 103475, + 103482, 103489, 103496, 103503, 103510, 103517, 103524, 103531, 103538, + 103545, 103552, 103559, 103566, 103573, 103580, 103587, 103594, 103601, + 103608, 103615, 103622, 103629, 103636, 103643, 103650, 103657, 103664, + 103671, 103678, 103684, 103691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103698, 103703, + 103708, 103713, 103718, 103723, 103728, 103733, 103738, 103743, 103748, + 103753, 103758, 103763, 103768, 103773, 103778, 103783, 103788, 103793, + 103798, 103803, 103808, 103813, 103818, 103823, 103828, 103833, 103838, + 103843, 103848, 103853, 103858, 103863, 103868, 103873, 103878, 103883, + 103889, 0, 0, 0, 0, 103895, 103899, 103903, 103908, 103913, 103919, + 103925, 103931, 103941, 103950, 103956, 103963, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 103971, 103975, 103980, 103985, 103990, 103995, 104000, 104005, + 104010, 104014, 104019, 104023, 104028, 104032, 104037, 104041, 104046, + 104051, 104056, 104061, 104066, 104071, 104076, 104081, 104086, 104091, + 104096, 104101, 104106, 104111, 104116, 104121, 104126, 104131, 104136, + 104141, 104146, 104151, 104156, 104161, 104166, 104171, 104176, 104181, + 104186, 104191, 104196, 104201, 104206, 104211, 104216, 104221, 104226, + 104231, 0, 0, 0, 104236, 104241, 104251, 104260, 104270, 104280, 104291, + 104302, 104309, 104316, 104323, 104330, 104337, 104344, 104351, 104358, + 104365, 104372, 104379, 104386, 104393, 104400, 104407, 104414, 104421, + 104428, 104435, 104442, 104449, 0, 0, 104456, 104462, 104468, 104474, + 104480, 104487, 104494, 104502, 104509, 104516, 104523, 104530, 104537, + 104544, 104551, 104558, 104565, 104572, 104579, 104586, 104593, 104600, + 104607, 104614, 104621, 104628, 104635, 0, 0, 0, 0, 0, 104642, 104648, + 104654, 104660, 104666, 104673, 104680, 104688, 104695, 104702, 104709, + 104716, 104723, 104730, 104737, 104744, 104751, 104758, 104765, 104772, + 104779, 104786, 104793, 104800, 104807, 104814, 0, 0, 0, 0, 0, 0, 0, + 104821, 104828, 104836, 104847, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 104858, 104864, 104870, 104876, 104882, 104889, 104896, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 76810, 76817, 76824, 76830, 76838, 76846, 76854, 76862, 76870, - 76878, 76884, 76890, 76897, 76903, 76909, 76915, 76922, 76929, 76936, - 76943, 76950, 76957, 76964, 76971, 76978, 76985, 76992, 76999, 77006, - 77013, 77019, 77026, 77033, 77040, 77047, 77054, 77061, 77068, 77075, - 77082, 77089, 77096, 77103, 77110, 77117, 77124, 77131, 77138, 77145, - 77153, 77161, 77169, 77177, 0, 0, 0, 0, 77185, 77193, 77201, 77209, - 77217, 77225, 77233, 77239, 77245, 77251, 0, 0, 0, 0, 0, 0, 77257, 77261, - 77266, 77271, 77276, 77281, 77286, 77291, 77296, 77301, 77306, 77311, - 77315, 77319, 77324, 77329, 77333, 77338, 77343, 77348, 77353, 77358, - 77363, 77368, 77372, 77376, 77380, 77385, 77389, 77393, 77397, 77401, - 77405, 77409, 77413, 77418, 77423, 77428, 77433, 77438, 77445, 77451, - 77456, 77461, 77466, 77471, 77477, 77484, 77490, 77497, 77503, 77509, - 77514, 77521, 77527, 77532, 0, 0, 0, 0, 0, 0, 0, 0, 77538, 77543, 77548, - 77552, 77557, 77561, 77566, 77570, 77575, 77580, 77586, 77591, 77597, - 77601, 77606, 77611, 77615, 77620, 77625, 77629, 77634, 77639, 77644, - 77649, 77654, 77659, 77664, 77669, 77674, 77679, 77684, 77689, 77694, - 77699, 77704, 77709, 77714, 77719, 77723, 77727, 77732, 77737, 77742, - 77746, 77750, 77754, 77758, 77763, 77768, 77773, 77777, 77781, 77786, - 77792, 77798, 77803, 77809, 77814, 77820, 77826, 77833, 77839, 77846, - 77851, 77857, 77863, 77868, 77874, 77880, 77885, 0, 0, 0, 0, 0, 0, 0, 0, - 77890, 77894, 77899, 77904, 77908, 77912, 77916, 77920, 77924, 77928, - 77932, 77936, 0, 0, 0, 0, 0, 0, 77940, 77945, 77949, 77953, 77957, 77961, - 77965, 77969, 77973, 77977, 77981, 77985, 77989, 77993, 77997, 78001, - 78005, 78010, 78015, 78021, 78027, 78034, 78039, 78044, 78050, 78054, - 78059, 78062, 78065, 78069, 78074, 78078, 78083, 78090, 78096, 78102, - 78108, 78114, 78120, 78126, 78132, 78138, 78144, 78150, 78157, 78164, - 78171, 78177, 78184, 78191, 78198, 78205, 78212, 78218, 78224, 78231, - 78237, 78244, 78251, 78257, 78263, 78269, 78276, 78283, 78289, 78296, - 78303, 78309, 78316, 78322, 78329, 78336, 78342, 78348, 78355, 78361, - 78368, 78375, 78384, 78391, 78398, 78402, 78407, 78412, 78417, 78422, - 78426, 78430, 78435, 78439, 78444, 78449, 78454, 78458, 78462, 78466, - 78470, 78475, 78479, 78484, 78489, 78494, 78499, 78503, 78508, 78513, - 78518, 78524, 78529, 78535, 78541, 78547, 78553, 78559, 78564, 78570, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78574, 78579, 78583, 78587, 78591, 78595, - 78599, 78603, 78607, 78611, 78615, 78619, 78623, 78627, 78631, 78635, - 78639, 78643, 78647, 78651, 78655, 78659, 78663, 78667, 78671, 78675, - 78679, 78683, 78687, 78691, 0, 0, 0, 78695, 78700, 78705, 78710, 78715, - 78719, 78726, 78730, 78735, 78739, 78746, 78753, 78762, 78766, 78771, - 78775, 78779, 78786, 78793, 78798, 78805, 78810, 78815, 78822, 78827, - 78834, 78841, 78846, 78851, 78858, 78863, 78870, 78877, 78882, 78889, - 78894, 78901, 78905, 78909, 78916, 78921, 78928, 78932, 78936, 78940, - 78947, 78951, 78956, 78963, 78970, 78974, 78978, 78985, 78991, 78997, - 79003, 79011, 79017, 79025, 79031, 79039, 79045, 79051, 79057, 79063, - 79067, 79072, 79077, 79083, 79089, 79095, 79101, 79107, 79113, 79119, - 79125, 79133, 79139, 0, 79147, 79151, 79156, 79160, 79164, 79168, 79172, - 79176, 79180, 79184, 79188, 0, 0, 0, 0, 79192, 79200, 79206, 79212, - 79218, 79224, 79230, 79236, 79242, 79249, 79256, 79263, 79270, 79277, - 79284, 79291, 79298, 79305, 79312, 79319, 79325, 79331, 79337, 79343, - 79349, 79355, 79361, 79367, 79373, 79380, 79387, 79394, 79401, 0, 79408, - 79412, 79416, 79420, 79424, 79429, 79433, 79437, 79442, 79447, 79452, - 79457, 79462, 79467, 79472, 79477, 79482, 79487, 79492, 79497, 79502, - 79507, 79512, 79517, 79522, 79526, 79531, 79535, 79540, 79545, 79550, - 79555, 79560, 79564, 79569, 79573, 79577, 79581, 79586, 79591, 79595, - 79599, 79605, 79610, 79616, 79622, 79627, 79633, 79638, 79644, 79650, - 79656, 79661, 79666, 79671, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79677, 79683, - 79689, 79695, 79702, 79708, 79714, 79720, 79726, 79732, 79737, 79742, - 79748, 79755, 0, 0, 79762, 79767, 79771, 79775, 79779, 79783, 79787, - 79791, 79795, 79799, 0, 0, 79803, 79809, 79815, 79822, 79830, 79836, - 79842, 79848, 79854, 79860, 79866, 79872, 79878, 79884, 79890, 79896, - 79901, 79906, 79911, 79917, 79923, 79930, 79936, 79942, 79947, 79954, - 79961, 79968, 79974, 79979, 79984, 79989, 79997, 80004, 80011, 80019, - 80027, 80034, 80041, 80048, 80055, 80062, 80069, 80076, 80083, 80090, - 80097, 80104, 80111, 80118, 80125, 80132, 80139, 80146, 80153, 80160, - 80167, 80173, 80179, 80186, 80193, 80200, 80207, 80214, 80221, 80228, - 80235, 80242, 80249, 80256, 80263, 80270, 80277, 80284, 80291, 80298, - 80305, 80312, 80319, 80326, 80333, 80340, 80347, 80353, 80359, 80366, - 80372, 80377, 80383, 80388, 80393, 80398, 80405, 80411, 80417, 80423, - 80429, 80435, 80441, 80447, 80455, 80463, 80471, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80479, 80485, 80491, - 80497, 80505, 80513, 80519, 80525, 80532, 80539, 80546, 80553, 80560, - 80567, 80574, 80581, 80588, 80596, 80604, 80612, 80620, 80628, 80634, - 80642, 80648, 80656, 80665, 80673, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80679, - 80683, 80687, 80691, 80695, 80699, 0, 0, 80703, 80707, 80711, 80715, - 80719, 80723, 0, 0, 80727, 80731, 80735, 80739, 80743, 80747, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 80751, 80755, 80759, 80763, 80767, 80771, 80775, 0, 80779, - 80783, 80787, 80791, 80795, 80799, 80803, 0, 80807, 80814, 80820, 80826, - 80832, 80840, 80847, 80856, 80868, 80878, 80887, 80895, 80903, 80911, - 80917, 80925, 80932, 80939, 80948, 80959, 80967, 80977, 80983, 80993, - 81002, 81007, 81015, 81024, 81029, 81038, 81045, 81055, 81067, 81072, - 81079, 81086, 81091, 81101, 81111, 81121, 81131, 81146, 81159, 81170, - 81178, 81183, 81195, 81204, 81211, 81218, 81224, 81230, 81235, 81242, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 81248, 81252, 81256, 81260, 81264, 81268, - 81273, 81278, 81282, 81287, 81292, 81297, 81302, 81307, 81311, 81316, - 81321, 81326, 81331, 81336, 81340, 81345, 81350, 81355, 81360, 81365, - 81369, 81374, 81379, 81384, 81389, 81393, 81398, 81403, 81408, 81413, - 81418, 81423, 81428, 81433, 81438, 81443, 81448, 81453, 81458, 81462, - 81467, 81472, 81477, 81482, 81487, 81492, 81497, 81502, 81507, 81512, - 81517, 81522, 81527, 81532, 81537, 81542, 81547, 81552, 81557, 81562, - 81567, 81572, 81577, 81582, 81587, 81592, 81597, 81602, 81607, 81612, - 81617, 81622, 81627, 81632, 81636, 81643, 81650, 81657, 81664, 81670, - 81676, 81683, 81690, 81697, 81704, 81711, 81718, 81725, 81732, 81739, - 81745, 81752, 81759, 81766, 81773, 81780, 81787, 81794, 81801, 81808, - 81815, 81822, 81831, 81840, 81849, 81858, 81867, 81876, 81885, 81894, - 81902, 81910, 81918, 81926, 81934, 81942, 81950, 81958, 81964, 81972, 0, - 0, 81980, 81987, 81993, 81999, 82005, 82011, 82017, 82023, 82029, 82035, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 104904, 104911, 104918, 104926, 104933, 104940, 104947, 104954, + 104962, 104970, 104978, 104986, 104994, 105002, 105010, 105018, 105026, + 105034, 105042, 105050, 105058, 105066, 105074, 105082, 105090, 105098, + 105106, 105114, 105122, 105130, 105138, 105146, 105154, 105162, 105170, + 105178, 105186, 105194, 105202, 105210, 105218, 105226, 105234, 105242, + 105250, 105258, 105266, 105274, 105282, 105290, 105298, 105306, 105314, + 105322, 105330, 105338, 105346, 105354, 105362, 105370, 105378, 105386, + 105394, 105402, 105410, 105418, 105426, 105434, 105442, 105450, 105458, + 105466, 105474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105482, 105487, 105493, 105499, + 105505, 105511, 105517, 105523, 105529, 105535, 105540, 105547, 105553, + 105559, 105565, 105571, 105577, 105582, 105588, 105594, 105600, 105606, + 105612, 105618, 105624, 105630, 105636, 105642, 105647, 105653, 105661, + 105669, 105675, 105681, 105687, 105693, 105701, 105707, 105713, 105719, + 105725, 105731, 105737, 105742, 105748, 105756, 105764, 105770, 105776, + 105782, 105789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105795, 105800, + 105806, 105812, 105818, 105824, 105830, 105836, 105842, 105848, 105853, + 105860, 105866, 105872, 105878, 105884, 105890, 105895, 105901, 105907, + 105913, 105919, 105925, 105931, 105937, 105943, 105949, 105955, 105960, + 105966, 105974, 105982, 105988, 105994, 106000, 106006, 106014, 106020, + 106026, 106032, 106038, 106044, 106050, 106055, 106061, 106069, 106077, + 106083, 106089, 106095, 106102, 0, 0, 0, 0, 0, 0, 0, 106108, 106112, + 106116, 106121, 106126, 106132, 106137, 106143, 106150, 106156, 106162, + 106169, 106176, 106183, 106189, 106196, 106203, 106210, 106217, 106223, + 106230, 106237, 106243, 106250, 106256, 106263, 106269, 106275, 106281, + 106288, 106297, 106303, 106311, 106318, 106325, 106332, 106338, 106344, + 106350, 106356, 106362, 106369, 106378, 106385, 106392, 106399, 0, 0, 0, + 0, 0, 0, 0, 0, 106406, 106413, 106419, 106425, 106431, 106437, 106443, + 106449, 106455, 106461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82041, 82046, 82051, 82056, - 82061, 82066, 82071, 82076, 82081, 82086, 82091, 82096, 82101, 82106, - 82111, 82116, 82121, 82126, 82131, 82136, 82141, 82146, 82151, 0, 0, 0, - 0, 82156, 82160, 82164, 82168, 82172, 82176, 82180, 82184, 82188, 82192, - 82196, 82200, 82204, 82208, 82212, 82216, 82220, 82224, 82228, 82232, - 82236, 82240, 82244, 82248, 82252, 82256, 82260, 82264, 82268, 82272, - 82276, 82280, 82284, 82288, 82292, 82296, 82300, 82304, 82308, 82312, - 82316, 82320, 82324, 82328, 82332, 82336, 82340, 82344, 82348, 0, 0, 0, - 0, 82352, 82356, 82360, 82364, 82368, 82372, 82376, 82380, 82384, 82388, - 82392, 82396, 82400, 82404, 82408, 82412, 82416, 82420, 82424, 82428, - 82432, 82436, 82440, 82444, 82448, 82452, 82456, 82460, 82464, 82468, - 82472, 82476, 82480, 82484, 82488, 82492, 82496, 82500, 82504, 82508, - 82512, 82516, 82520, 82524, 82528, 82532, 82536, 82540, 82544, 82548, - 82552, 82556, 82560, 82564, 82568, 82572, 82576, 82580, 82584, 82588, - 82592, 82596, 82600, 82604, 82608, 82612, 82616, 82620, 82624, 82628, - 82632, 82636, 82640, 82644, 82648, 82652, 82656, 82660, 82664, 82668, - 82672, 82676, 82680, 82684, 82688, 82692, 82696, 82700, 82704, 82708, - 82712, 82716, 82720, 82724, 82728, 82732, 82736, 82740, 82744, 82748, - 82752, 82756, 82760, 82764, 82768, 82772, 82776, 82780, 82784, 82788, - 82792, 82796, 82800, 82804, 82808, 82812, 82816, 82820, 82824, 82828, - 82832, 82836, 82840, 82844, 82848, 82852, 82856, 82860, 82864, 82868, - 82872, 82876, 82880, 82884, 82888, 82892, 82896, 82900, 82904, 82908, - 82912, 82916, 82920, 82924, 82928, 82932, 82936, 82940, 82944, 82948, - 82952, 82956, 82960, 82964, 82968, 82972, 82976, 82980, 82984, 82988, - 82992, 82996, 83000, 83004, 83008, 83012, 83016, 83020, 83024, 83028, - 83032, 83036, 83040, 83044, 83048, 83052, 83056, 83060, 83064, 83068, - 83072, 83076, 83080, 83084, 83088, 83092, 83096, 83100, 83104, 83108, - 83112, 83116, 83120, 83124, 83128, 83132, 83136, 83140, 83144, 83148, - 83152, 83156, 83160, 83164, 83168, 83172, 83176, 83180, 83184, 83188, - 83192, 83196, 83200, 83204, 83208, 83212, 83216, 83220, 83224, 83228, - 83232, 83236, 83240, 83244, 83248, 83252, 83256, 83260, 83264, 83268, - 83272, 83276, 83280, 83284, 83288, 83292, 83296, 83300, 83304, 83308, - 83312, 83316, 83320, 83324, 83328, 83332, 83336, 83340, 83344, 83348, - 83352, 83356, 83360, 83364, 83368, 83372, 83376, 83380, 83384, 83388, - 83392, 83396, 83400, 83404, 83408, 83412, 83416, 83420, 83424, 83428, - 83432, 83436, 83440, 83444, 83448, 83452, 83456, 83460, 83464, 83468, - 83472, 83476, 83480, 83484, 83488, 83492, 83496, 83500, 83504, 83508, - 83512, 83516, 83520, 83524, 83528, 83532, 83536, 83540, 83544, 83548, - 83552, 83556, 83560, 83564, 83568, 83572, 83576, 83580, 83584, 83588, - 83592, 83596, 83600, 83604, 83608, 83612, 83616, 83620, 83624, 83628, - 83632, 83636, 83640, 83644, 83648, 83652, 83656, 83660, 83664, 83668, - 83672, 83676, 83680, 83684, 83688, 83692, 83696, 83700, 83704, 83708, - 83712, 83716, 83720, 83724, 83728, 83732, 83736, 83740, 83744, 83748, - 83752, 83756, 83760, 83764, 83768, 83772, 83776, 83780, 83784, 83788, - 83792, 83796, 83800, 83804, 83808, 83812, 0, 0, 83816, 83820, 83824, - 83828, 83832, 83836, 83840, 83844, 83848, 83852, 83856, 83860, 83864, - 83868, 83872, 83876, 83880, 83884, 83888, 83892, 83896, 83900, 83904, - 83908, 83912, 83916, 83920, 83924, 83928, 83932, 83936, 83940, 83944, - 83948, 83952, 83956, 83960, 83964, 83968, 83972, 83976, 83980, 83984, - 83988, 83992, 83996, 84000, 84004, 84008, 84012, 84016, 84020, 84024, - 84028, 84032, 84036, 84040, 84044, 84048, 84052, 84056, 84060, 84064, - 84068, 84072, 84076, 84080, 84084, 84088, 84092, 84096, 84100, 84104, - 84108, 84112, 84116, 84120, 84124, 84128, 84132, 84136, 84140, 84144, - 84148, 84152, 84156, 84160, 84164, 84168, 84172, 84176, 84180, 84184, - 84188, 84192, 84196, 84200, 84204, 84208, 84212, 84216, 84220, 84224, - 84228, 84232, 84236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84240, - 84245, 84250, 84255, 84260, 84265, 84273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 84278, 84285, 84292, 84299, 84306, 0, 0, 0, 0, 0, 84313, 84320, - 84327, 84337, 84343, 84349, 84355, 84361, 84367, 84373, 84380, 84386, - 84392, 84398, 84407, 84416, 84428, 84440, 84446, 84452, 84458, 84465, - 84472, 84479, 84486, 84493, 0, 84500, 84507, 84514, 84522, 84529, 0, - 84536, 0, 84543, 84550, 0, 84557, 84565, 0, 84572, 84579, 84586, 84593, - 84600, 84607, 84614, 84621, 84628, 84635, 84640, 84647, 84654, 84660, - 84666, 84672, 84679, 84685, 84691, 84697, 84704, 84710, 84716, 84722, - 84729, 84735, 84741, 84747, 84754, 84760, 84766, 84772, 84779, 84785, - 84791, 84797, 84804, 84810, 84816, 84822, 84829, 84835, 84841, 84847, - 84854, 84860, 84866, 84872, 84879, 84885, 84891, 84897, 84904, 84910, - 84916, 84922, 84929, 84935, 84941, 84947, 84954, 84960, 84966, 84972, - 84978, 84984, 84990, 84996, 85002, 85008, 85014, 85020, 85026, 85032, - 85038, 85044, 85051, 85057, 85063, 85069, 85076, 85082, 85088, 85094, - 85101, 85107, 85113, 85119, 85126, 85134, 85142, 85148, 85154, 85160, - 85167, 85176, 85185, 85193, 85201, 85209, 85218, 85226, 85234, 85242, - 85251, 85258, 85265, 85276, 85287, 85291, 85295, 85301, 85307, 85313, - 85319, 85329, 85339, 85346, 85353, 85360, 85368, 85376, 85380, 85386, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85392, 85398, 85404, - 85410, 85417, 85422, 85427, 85433, 85439, 85445, 85451, 85460, 85466, - 85472, 85480, 85488, 85496, 85504, 85510, 85516, 85522, 85529, 85542, - 85556, 85567, 85578, 85590, 85602, 85614, 85626, 85637, 85648, 85660, - 85672, 85684, 85696, 85708, 85720, 85732, 85749, 85766, 85783, 85790, - 85797, 85804, 85812, 85824, 85835, 85846, 85859, 85870, 85879, 85887, - 85896, 85904, 85914, 85922, 85931, 85939, 85948, 85956, 85966, 85974, - 85983, 85991, 86001, 86009, 86017, 86025, 86033, 86040, 86049, 86057, - 86065, 86074, 86082, 86091, 86099, 86107, 86115, 86124, 86132, 86141, - 86149, 86157, 86165, 86173, 86182, 86190, 86199, 86207, 86216, 86224, - 86233, 86241, 86251, 86259, 86267, 86275, 86285, 86293, 86301, 86310, - 86318, 86327, 86336, 86344, 86354, 86362, 86371, 86379, 86388, 86396, - 86406, 86414, 86422, 86429, 86437, 86444, 86453, 86460, 86469, 86477, - 86486, 86494, 86504, 86512, 86521, 86529, 86539, 86547, 86555, 86562, - 86570, 86577, 86586, 86593, 86603, 86613, 86624, 86633, 86642, 86651, - 86660, 86669, 86679, 86691, 86703, 86714, 86726, 86739, 86750, 86759, - 86768, 86776, 86785, 86795, 86803, 86812, 86821, 86829, 86838, 86848, - 86856, 86865, 86874, 86882, 86891, 86901, 86909, 86919, 86927, 86937, - 86945, 86953, 86962, 86970, 86980, 86988, 86996, 87006, 87014, 87021, - 87028, 87037, 87046, 87054, 87063, 87073, 87081, 87092, 87100, 87108, - 87115, 87123, 87132, 87139, 87151, 87162, 87174, 87185, 87197, 87206, - 87214, 87223, 87231, 87240, 87249, 87257, 87266, 87274, 87283, 87291, - 87299, 87307, 87315, 87322, 87331, 87339, 87348, 87356, 87365, 87373, - 87381, 87390, 87398, 87407, 87415, 87424, 87432, 87440, 87448, 87457, - 87465, 87474, 87482, 87491, 87499, 87508, 87516, 87524, 87532, 87541, - 87549, 87558, 87567, 87575, 87584, 87592, 87601, 87609, 87618, 87626, - 87633, 87641, 87648, 87657, 87665, 87674, 87682, 87691, 87700, 87708, - 87718, 87726, 87733, 87741, 87748, 87756, 87768, 87781, 87790, 87800, - 87809, 87819, 87828, 87838, 87847, 87857, 87866, 87876, 87886, 87895, - 87904, 87913, 87923, 87931, 87940, 87950, 87960, 87970, 87980, 87988, - 87998, 88006, 88016, 88024, 88034, 88042, 88052, 88060, 88069, 88076, - 88086, 88094, 88104, 88112, 88122, 88130, 88140, 88148, 88157, 88165, - 88174, 88182, 88191, 88200, 88209, 88218, 88228, 88236, 88246, 88254, - 88264, 88272, 88282, 88290, 88300, 88308, 88317, 88324, 88334, 88342, - 88352, 88360, 88370, 88378, 88388, 88396, 88405, 88413, 88422, 88430, - 88439, 88448, 88457, 88466, 88475, 88483, 88492, 88500, 88509, 88518, - 88526, 88536, 88545, 88555, 88565, 88574, 88584, 88593, 88602, 88610, - 88618, 88623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88628, - 88639, 88650, 88661, 88671, 88682, 88693, 88703, 88714, 88724, 88734, - 88743, 88754, 88765, 88776, 88789, 88799, 88809, 88820, 88830, 88840, - 88850, 88860, 88870, 88880, 88890, 88901, 88912, 88923, 88933, 88943, - 88955, 88966, 88977, 88987, 88997, 89007, 89017, 89028, 89038, 89048, - 89060, 89070, 89080, 89092, 89103, 89114, 89124, 89134, 89144, 89154, - 89166, 89178, 89190, 89201, 89212, 89222, 89232, 89242, 89251, 89260, - 89270, 89280, 89291, 0, 0, 89301, 89312, 89323, 89333, 89343, 89355, - 89366, 89377, 89390, 89400, 89412, 89421, 89430, 89441, 89452, 89465, - 89476, 89489, 89499, 89511, 89521, 89533, 89545, 89558, 89568, 89578, - 89588, 89599, 89609, 89618, 89628, 89637, 89646, 89656, 89666, 89676, - 89686, 89696, 89706, 89717, 89727, 89738, 89748, 89759, 89770, 89780, - 89790, 89800, 89810, 89820, 89830, 89841, 89851, 89862, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89873, 89888, 89903, 89909, 89915, 89921, - 89927, 89933, 89939, 89945, 89951, 89959, 89963, 89966, 0, 0, 89974, - 89977, 89980, 89983, 89986, 89989, 89992, 89995, 89998, 90001, 90004, - 90007, 90010, 90013, 90016, 90019, 90022, 90030, 90039, 90050, 90058, - 90066, 90075, 90084, 90095, 90107, 0, 0, 0, 0, 0, 0, 90117, 90122, 90127, - 90134, 90141, 90147, 90153, 90158, 90163, 90168, 90174, 90180, 90186, - 90192, 90198, 90205, 90212, 90222, 90232, 90242, 90251, 90262, 90271, - 90280, 90290, 90300, 90312, 90324, 90335, 90346, 90357, 90368, 90378, - 90388, 90398, 90408, 90419, 90430, 90434, 90439, 90448, 90457, 90461, - 90465, 90469, 90474, 90479, 90484, 90489, 90492, 90496, 0, 90501, 90504, - 90507, 90511, 90515, 90520, 90524, 90528, 90533, 90538, 90545, 90552, - 90555, 90558, 90561, 90564, 90567, 90571, 90575, 0, 90579, 90584, 90588, - 90592, 0, 0, 0, 0, 90597, 90602, 90609, 90614, 90619, 0, 90624, 90629, - 90635, 90640, 90646, 90651, 90657, 90662, 90668, 90673, 90679, 90685, - 90694, 90703, 90712, 90721, 90731, 90741, 90751, 90761, 90770, 90779, - 90788, 90798, 90803, 90808, 90814, 90820, 90826, 90833, 90841, 90849, - 90855, 90861, 90867, 90874, 90880, 90886, 90892, 90899, 90905, 90911, - 90917, 90924, 90929, 90934, 90939, 90945, 90951, 90957, 90963, 90970, - 90976, 90982, 90988, 90994, 91000, 91006, 91012, 91018, 91024, 91030, - 91036, 91043, 91049, 91055, 91061, 91068, 91074, 91080, 91086, 91093, - 91099, 91105, 91111, 91118, 91124, 91130, 91136, 91143, 91149, 91155, - 91161, 91168, 91174, 91180, 91186, 91193, 91199, 91205, 91211, 91218, - 91224, 91230, 91236, 91243, 91249, 91255, 91261, 91268, 91274, 91280, - 91286, 91293, 91299, 91305, 91311, 91318, 91323, 91328, 91333, 91339, - 91345, 91351, 91357, 91364, 91370, 91376, 91382, 91389, 91395, 91401, - 91408, 91415, 91420, 91425, 91430, 91436, 91448, 91460, 91472, 91484, - 91497, 91510, 91518, 0, 0, 91526, 0, 91534, 91538, 91542, 91545, 91549, - 91553, 91556, 91559, 91563, 91567, 91570, 91573, 91576, 91579, 91584, - 91587, 91591, 91594, 91597, 91600, 91603, 91606, 91609, 91612, 91615, - 91618, 91621, 91624, 91628, 91632, 91636, 91640, 91645, 91650, 91656, - 91662, 91668, 91673, 91679, 91685, 91691, 91696, 91702, 91708, 91713, - 91719, 91725, 91730, 91736, 91742, 91747, 91753, 91759, 91764, 91770, - 91776, 91782, 91788, 91794, 91798, 91803, 91807, 91812, 91816, 91821, - 91826, 91832, 91838, 91844, 91849, 91855, 91861, 91867, 91872, 91878, - 91884, 91889, 91895, 91901, 91906, 91912, 91918, 91923, 91929, 91935, - 91940, 91946, 91952, 91958, 91964, 91970, 91975, 91979, 91984, 91987, - 91992, 91997, 92003, 92008, 92013, 92017, 92022, 92027, 92032, 92037, - 92042, 92047, 92052, 92057, 92063, 92069, 92075, 92083, 92087, 92091, - 92095, 92099, 92103, 92107, 92112, 92117, 92122, 92127, 92131, 92136, - 92141, 92146, 92151, 92156, 92161, 92166, 92171, 92175, 92179, 92184, - 92189, 92194, 92199, 92203, 92208, 92213, 92218, 92223, 92227, 92232, - 92237, 92242, 92247, 92251, 92256, 92261, 92265, 92270, 92275, 92280, - 92285, 92290, 92295, 92302, 92309, 92313, 92318, 92323, 92328, 92333, - 92338, 92343, 92348, 92353, 92358, 92363, 92368, 92373, 92378, 92383, - 92388, 92393, 92398, 92403, 92408, 92413, 92418, 92423, 92428, 92433, - 92438, 92443, 92448, 92453, 92458, 0, 0, 0, 92463, 92467, 92472, 92476, - 92481, 92486, 0, 0, 92490, 92495, 92500, 92504, 92509, 92514, 0, 0, - 92519, 92524, 92528, 92533, 92538, 92543, 0, 0, 92548, 92553, 92558, 0, - 0, 0, 92562, 92566, 92570, 92574, 92577, 92581, 92585, 0, 92589, 92595, - 92598, 92602, 92605, 92609, 92613, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92617, - 92623, 92629, 92635, 92641, 0, 0, 92645, 92651, 92657, 92663, 92669, - 92675, 92682, 92689, 92696, 92703, 92710, 92717, 0, 92724, 92731, 92738, - 92744, 92751, 92758, 92765, 92772, 92778, 92785, 92792, 92799, 92806, - 92812, 92819, 92826, 92833, 92840, 92846, 92853, 92860, 92867, 92874, - 92881, 92888, 92895, 0, 92902, 92908, 92915, 92922, 92929, 92936, 92942, - 92949, 92956, 92963, 92970, 92977, 92984, 92991, 92997, 93004, 93011, - 93018, 93025, 0, 93032, 93039, 0, 93046, 93053, 93060, 93067, 93074, - 93081, 93088, 93095, 93102, 93109, 93116, 93123, 93130, 93137, 93144, 0, - 0, 93150, 93155, 93160, 93165, 93170, 93175, 93180, 93185, 93190, 93195, - 93200, 93205, 93210, 93215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93220, 93227, - 93234, 93241, 93248, 93255, 93262, 93269, 93276, 93283, 93290, 93297, - 93304, 93311, 93318, 93325, 93332, 93339, 93346, 93353, 93361, 93369, - 93376, 93383, 93388, 93396, 93404, 93411, 93418, 93423, 93430, 93435, - 93440, 93447, 93452, 93457, 93462, 93470, 93475, 93480, 93487, 93492, - 93497, 93504, 93511, 93516, 93521, 93526, 93531, 93536, 93541, 93546, - 93551, 93556, 93563, 93568, 93575, 93580, 93585, 93590, 93595, 93600, - 93605, 93610, 93615, 93620, 93625, 93630, 93637, 93644, 93651, 93658, - 93664, 93669, 93676, 93681, 93686, 93695, 93702, 93711, 93718, 93723, - 93728, 93736, 93741, 93746, 93751, 93756, 93761, 93768, 93773, 93778, - 93783, 93788, 93793, 93800, 93807, 93814, 93821, 93828, 93835, 93842, - 93849, 93856, 93863, 93870, 93877, 93884, 93891, 93898, 93905, 93912, - 93919, 93926, 93933, 93940, 93947, 93954, 93961, 93968, 93975, 93982, - 93989, 0, 0, 0, 0, 0, 93996, 94004, 94012, 0, 0, 0, 0, 94017, 94021, - 94025, 94029, 94033, 94037, 94041, 94045, 94049, 94053, 94058, 94063, - 94068, 94073, 94078, 94083, 94088, 94093, 94098, 94104, 94110, 94116, - 94123, 94130, 94137, 94144, 94151, 94158, 94164, 94170, 94176, 94183, - 94190, 94197, 94204, 94211, 94218, 94225, 94232, 94239, 94246, 94253, - 94260, 94267, 94274, 0, 0, 0, 94281, 94289, 94297, 94305, 94313, 94321, - 94331, 94341, 94349, 94357, 94365, 94373, 94381, 94387, 94394, 94403, - 94412, 94421, 94430, 94439, 94448, 94458, 94469, 94479, 94490, 94499, - 94508, 94517, 94527, 94538, 94548, 94559, 94570, 94579, 94587, 94593, - 94599, 94605, 94611, 94619, 94627, 94633, 94640, 94650, 94657, 94664, - 94671, 94678, 94685, 94695, 94702, 94709, 94717, 94725, 94734, 94743, - 94752, 94761, 94770, 94778, 94787, 94796, 94805, 94809, 94816, 94821, - 94826, 94830, 94834, 94838, 94842, 94847, 94852, 94858, 94864, 94868, - 94874, 94878, 94882, 94886, 94890, 94894, 94898, 94904, 94908, 94913, - 94917, 94921, 0, 94924, 94929, 94934, 94939, 94944, 94951, 94956, 94961, - 94966, 94971, 94976, 94981, 0, 0, 0, 0, 94986, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 106467, 106471, 106475, 106479, 106483, 106487, 106491, + 106495, 106499, 106503, 106508, 106513, 106518, 106523, 106528, 106533, + 106538, 106543, 106548, 106554, 106560, 106566, 106573, 106580, 106587, + 106594, 106601, 106608, 106614, 106620, 106626, 0, 106632, 106638, + 106645, 106651, 106658, 106664, 106670, 106677, 106683, 106689, 106695, + 106701, 106707, 106713, 106719, 106725, 106732, 106743, 106749, 106755, + 106763, 106769, 106775, 106782, 106793, 106799, 106805, 106811, 106818, + 106829, 106834, 106839, 106844, 106849, 106854, 106860, 106866, 106872, + 106879, 106886, 0, 0, 0, 0, 0, 0, 0, 0, 106892, 106897, 106902, 106907, + 106912, 106917, 106922, 106927, 106932, 106937, 106942, 106947, 106952, + 106957, 106962, 106967, 106972, 106977, 106982, 106987, 106992, 106997, + 107003, 107008, 107015, 107020, 107027, 107033, 107039, 107045, 107051, + 107058, 107064, 107070, 107074, 107079, 107084, 107090, 107098, 107109, + 107118, 107128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94992, 94999, 95008, 95017, - 95024, 95031, 95038, 95045, 95052, 95059, 95065, 95072, 95079, 95086, - 95093, 95100, 95107, 95114, 95121, 95130, 95137, 95144, 95151, 95158, - 95165, 95172, 95179, 95186, 95195, 95202, 95209, 95216, 95223, 95230, - 95237, 95246, 95253, 95260, 95267, 95274, 95283, 95290, 95297, 95304, - 95312, 95321, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107138, 107143, + 107148, 107153, 107158, 107163, 107168, 107173, 107178, 107183, 107188, + 107193, 107198, 107203, 107208, 107213, 107218, 107223, 107228, 107233, + 107238, 107243, 107248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107253, 107257, + 107261, 107265, 107269, 107273, 107276, 107280, 107283, 107287, 107290, + 107294, 107298, 107303, 107307, 107312, 107315, 107319, 107322, 107326, + 107329, 107333, 107337, 107341, 107345, 107349, 107353, 107357, 107361, + 107365, 107369, 107373, 107377, 107381, 107385, 107388, 107392, 107396, + 107400, 107403, 107406, 107410, 107414, 107418, 107421, 107424, 107427, + 107430, 107434, 107438, 107442, 107445, 107448, 107452, 107458, 107464, + 107470, 107475, 107482, 107486, 107491, 107495, 107500, 107505, 107511, + 107516, 107522, 107526, 107531, 107535, 107540, 107543, 107546, 107550, + 107555, 107561, 107566, 107572, 0, 0, 0, 0, 107577, 107580, 107583, + 107586, 107589, 107592, 107595, 107598, 107601, 107604, 107608, 107612, + 107616, 107620, 107624, 107628, 107632, 107636, 107640, 107645, 107649, + 107653, 107656, 107659, 107662, 107665, 107668, 107671, 107674, 107677, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107680, 107684, 107689, + 107694, 107699, 107703, 107708, 107712, 107717, 107721, 107726, 107730, + 107735, 107739, 107744, 107748, 107753, 107758, 107763, 107768, 107773, + 107778, 107783, 107788, 107793, 107798, 107803, 107808, 107813, 107818, + 107823, 107828, 107832, 107837, 107842, 107847, 107851, 107855, 107860, + 107865, 107870, 107874, 107878, 107882, 107886, 107891, 107896, 107901, + 107905, 107909, 107915, 107920, 107926, 107931, 107937, 107942, 107948, + 107953, 107959, 107964, 107969, 107974, 107979, 107983, 107988, 107994, + 107998, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108003, 0, 0, 108008, 108015, + 108022, 108029, 108036, 108043, 108050, 108057, 108064, 108071, 108078, + 108085, 108092, 108099, 108106, 108113, 108120, 108127, 108134, 108141, + 108148, 108155, 108162, 108169, 108176, 0, 0, 0, 0, 0, 0, 0, 108183, + 108190, 108196, 108202, 108208, 108214, 108220, 108226, 108232, 108238, + 0, 0, 0, 0, 0, 0, 108244, 108249, 108254, 108259, 108264, 108268, 108272, + 108276, 108281, 108286, 108291, 108296, 108301, 108306, 108311, 108316, + 108321, 108326, 108331, 108336, 108341, 108346, 108351, 108356, 108361, + 108366, 108371, 108376, 108381, 108386, 108391, 108396, 108401, 108406, + 108411, 108416, 108421, 108426, 108431, 108436, 108441, 108446, 108452, + 108457, 108463, 108468, 108474, 108479, 108485, 108491, 108495, 108500, + 108504, 0, 108508, 108513, 108517, 108521, 108525, 108529, 108533, + 108537, 108541, 108545, 108549, 108554, 108558, 108563, 108568, 108573, + 108579, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108585, 108589, 108593, 108597, + 108601, 108605, 108609, 108614, 108619, 108624, 108629, 108634, 108639, + 108644, 108649, 108654, 108659, 108664, 108669, 108674, 108678, 108683, + 108688, 108693, 108697, 108701, 108706, 108711, 108716, 108720, 108724, + 108728, 108733, 108737, 108741, 108746, 108751, 108756, 108761, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 108766, 108771, 108776, 108781, 108785, 108790, 108794, + 108799, 108803, 108808, 108813, 108819, 108824, 108830, 108834, 108839, + 108843, 108848, 108852, 108857, 108862, 108867, 108872, 108877, 108882, + 108887, 108892, 108897, 108902, 108907, 108912, 108917, 108922, 108926, + 108931, 108936, 108941, 108945, 108949, 108954, 108959, 108964, 108968, + 108972, 108976, 108980, 108985, 108990, 108995, 109000, 109004, 109008, + 109014, 109019, 109025, 109030, 109036, 109042, 109049, 109055, 109062, + 109067, 109073, 109078, 109084, 109089, 109094, 109099, 109104, 109108, + 109112, 109117, 109122, 109126, 109131, 109136, 109141, 109149, 0, 0, + 109154, 109159, 109163, 109167, 109171, 109175, 109179, 109183, 109187, + 109191, 109195, 109199, 109204, 109208, 109213, 109219, 0, 109225, + 109230, 109235, 109240, 109245, 109250, 109255, 109260, 109265, 109270, + 109276, 109282, 109288, 109294, 109300, 109306, 109312, 109318, 109324, + 109331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109337, 109341, 109346, 109350, + 109354, 109358, 109363, 109367, 109372, 109376, 109381, 109386, 109391, + 109396, 109401, 109406, 109411, 109416, 0, 109421, 109426, 109431, + 109436, 109441, 109446, 109451, 109455, 109460, 109465, 109470, 109475, + 109479, 109483, 109488, 109493, 109498, 109503, 109507, 109511, 109515, + 109519, 109524, 109528, 109532, 109537, 109543, 109548, 109554, 109559, + 109564, 109570, 109575, 109581, 109586, 109591, 109596, 109601, 109605, + 109610, 109616, 109621, 109627, 109632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95330, 95334, 95338, 95343, - 95348, 95353, 95358, 95362, 95367, 95372, 95377, 95382, 95387, 95392, - 95396, 95401, 95406, 95411, 95416, 95420, 95425, 95430, 95434, 95439, - 95444, 95449, 95454, 95459, 95464, 0, 0, 0, 95469, 95473, 95478, 95483, - 95487, 95492, 95496, 95501, 95506, 95511, 95516, 95521, 95525, 95530, - 95535, 95540, 95545, 95550, 95555, 95559, 95564, 95569, 95574, 95579, - 95584, 95589, 95593, 95597, 95602, 95607, 95612, 95617, 95622, 95627, - 95632, 95637, 95642, 95647, 95652, 95657, 95662, 95667, 95672, 95677, - 95682, 95687, 95692, 95697, 95702, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 95707, 95713, 95718, 95723, 95728, 95733, 95738, 95743, 95748, - 95753, 95758, 95764, 95770, 95776, 95782, 95788, 95794, 95800, 95806, - 95812, 95819, 95826, 95833, 95841, 95849, 95857, 95865, 95873, 0, 0, 0, - 0, 95881, 95885, 95890, 95895, 95900, 95904, 95909, 95914, 95919, 95924, - 95928, 95932, 95937, 95942, 95947, 95952, 95956, 95961, 95966, 95971, - 95976, 95981, 95986, 95990, 95995, 96000, 96005, 96010, 96015, 96020, - 96025, 96030, 96035, 96040, 96045, 96051, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 96057, 96062, 96069, 96076, 96081, 96086, 96091, 96096, 96101, 96106, - 96111, 96116, 96121, 96126, 96131, 96136, 96141, 96146, 96151, 96156, - 96161, 96166, 96171, 96176, 96181, 96186, 96191, 96196, 96201, 96206, 0, - 0, 0, 0, 0, 96213, 96219, 96225, 96231, 96237, 96242, 96248, 96254, - 96260, 96266, 96271, 96277, 96283, 96289, 96295, 96301, 96307, 96313, - 96319, 96325, 96330, 96336, 96342, 96348, 96354, 96360, 96365, 96371, - 96377, 96382, 96388, 96394, 96400, 96406, 96412, 96418, 96424, 96429, - 96435, 96442, 96449, 96456, 96463, 0, 0, 0, 0, 0, 96470, 96475, 96480, - 96485, 96490, 96495, 96500, 96505, 96510, 96515, 96520, 96525, 96530, - 96535, 96540, 96545, 96550, 96555, 96560, 96565, 96570, 96575, 96580, - 96585, 96590, 96595, 96600, 96604, 96608, 96612, 0, 96617, 96623, 96628, - 96633, 96638, 96643, 96649, 96655, 96661, 96667, 96673, 96679, 96685, - 96691, 96697, 96703, 96709, 96715, 96721, 96726, 96732, 96738, 96743, - 96749, 96754, 96760, 96766, 96771, 96777, 96783, 96788, 96794, 96799, - 96804, 96810, 96816, 96822, 0, 0, 0, 0, 96827, 96833, 96839, 96845, - 96851, 96857, 96863, 96869, 96875, 96882, 96887, 96892, 96898, 96904, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96910, 96916, 96922, - 96928, 96935, 96941, 96948, 96955, 96962, 96969, 96977, 96984, 96992, - 96998, 97004, 97010, 97016, 97022, 97028, 97034, 97040, 97046, 97052, - 97058, 97064, 97070, 97076, 97082, 97088, 97094, 97100, 97106, 97112, - 97118, 97124, 97130, 97136, 97142, 97148, 97154, 97160, 97166, 97172, - 97178, 97185, 97191, 97198, 97205, 97212, 97219, 97227, 97234, 97242, - 97248, 97254, 97260, 97266, 97272, 97278, 97284, 97290, 97296, 97302, - 97308, 97314, 97320, 97326, 97332, 97338, 97344, 97350, 97356, 97362, - 97368, 97374, 97380, 97386, 97392, 97398, 97404, 97410, 97415, 97420, - 97425, 97430, 97435, 97440, 97445, 97450, 97455, 97460, 97465, 97470, - 97475, 97480, 97485, 97490, 97495, 97500, 97505, 97510, 97515, 97520, - 97525, 97530, 97535, 97540, 97545, 97550, 97555, 97560, 97565, 97570, - 97575, 97580, 97585, 97590, 97595, 97600, 97605, 97610, 97615, 97620, - 97625, 97630, 97635, 97640, 97645, 97650, 97655, 97660, 97665, 97670, - 97675, 97680, 97685, 97689, 97693, 97698, 97703, 97708, 97713, 97718, - 97723, 97728, 97733, 97738, 97743, 97748, 97752, 97756, 97760, 97764, - 97768, 97772, 97776, 97781, 97786, 0, 0, 97791, 97796, 97800, 97804, - 97808, 97812, 97816, 97820, 97824, 97828, 0, 0, 0, 0, 0, 0, 97832, 97837, - 97843, 97849, 97855, 97861, 97867, 97873, 97878, 97884, 97889, 97895, - 97900, 97905, 97911, 97917, 97922, 97927, 97932, 97937, 97943, 97948, - 97954, 97959, 97965, 97971, 97977, 97983, 97989, 97995, 98001, 98006, - 98012, 98018, 98024, 98030, 0, 0, 0, 0, 98036, 98041, 98047, 98053, - 98059, 98065, 98071, 98077, 98082, 98088, 98093, 98099, 98104, 98109, - 98115, 98121, 98126, 98131, 98136, 98141, 98147, 98152, 98158, 98163, - 98169, 98175, 98181, 98187, 98193, 98199, 98205, 98210, 98216, 98222, - 98228, 98234, 0, 0, 0, 0, 98240, 98244, 98249, 98254, 98259, 98264, - 98269, 98274, 98279, 98283, 98288, 98293, 98298, 98303, 98307, 98312, - 98317, 98322, 98327, 98332, 98337, 98341, 98346, 98350, 98355, 98360, - 98365, 98370, 98375, 98380, 98385, 98390, 98394, 98399, 98404, 98409, - 98414, 98419, 98424, 98429, 0, 0, 0, 0, 0, 0, 0, 0, 98434, 98441, 98448, - 98455, 98462, 98469, 98476, 98483, 98490, 98497, 98504, 98511, 98518, - 98525, 98532, 98539, 98546, 98553, 98560, 98567, 98574, 98581, 98588, - 98595, 98602, 98609, 98616, 98623, 98630, 98637, 98644, 98651, 98658, - 98665, 98672, 98679, 98686, 98693, 98700, 98707, 98714, 98721, 98728, - 98735, 98742, 98749, 98756, 98763, 98770, 98777, 98784, 98791, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 98798, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 109637, 109641, 109645, 109649, 109653, 109657, 109662, + 0, 109667, 0, 109672, 109677, 109682, 109687, 0, 109692, 109697, 109702, + 109707, 109712, 109717, 109722, 109727, 109731, 109736, 109741, 109746, + 109750, 109754, 109759, 0, 109764, 109769, 109773, 109777, 109781, + 109785, 109790, 109794, 109798, 109803, 109808, 0, 0, 0, 0, 0, 0, 109813, + 109817, 109822, 109826, 109831, 109835, 109840, 109844, 109849, 109853, + 109858, 109862, 109867, 109872, 109877, 109882, 109887, 109892, 109897, + 109902, 109907, 109912, 109917, 109922, 109927, 109932, 109937, 109942, + 109947, 109952, 109956, 109961, 109966, 109971, 109975, 109979, 109984, + 109989, 109994, 109999, 110003, 110007, 110011, 110015, 110020, 110025, + 110029, 110033, 110038, 110044, 110049, 110055, 110060, 110066, 110071, + 110077, 110082, 110088, 110093, 0, 0, 0, 0, 0, 110098, 110103, 110107, + 110111, 110115, 110119, 110123, 110127, 110131, 110135, 0, 0, 0, 0, 0, 0, + 110139, 110146, 110151, 110156, 0, 110161, 110165, 110170, 110174, + 110179, 110183, 110188, 110193, 0, 0, 110198, 110203, 0, 0, 110208, + 110213, 110218, 110222, 110227, 110232, 110237, 110242, 110247, 110252, + 110257, 110262, 110267, 110272, 110277, 110282, 110287, 110292, 110296, + 110301, 110306, 110311, 0, 110315, 110319, 110324, 110329, 110334, + 110338, 110342, 0, 110346, 110350, 0, 110355, 110360, 110365, 110370, + 110374, 0, 110378, 110382, 110387, 110392, 110398, 110403, 110409, + 110414, 110420, 110426, 0, 0, 110433, 110439, 0, 0, 110445, 110451, + 110457, 0, 0, 110462, 0, 0, 0, 0, 0, 0, 110466, 0, 0, 0, 0, 0, 110473, + 110478, 110485, 110493, 110499, 110505, 110511, 0, 0, 110518, 110524, + 110529, 110534, 110539, 110544, 110549, 0, 0, 0, 110554, 110559, 110564, + 110569, 110575, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110580, 110584, 110589, + 110593, 110598, 110602, 110607, 110612, 110618, 110623, 110629, 110633, + 110638, 110642, 110647, 110651, 110656, 110661, 110666, 110671, 110676, + 110681, 110686, 110691, 110696, 110701, 110706, 110711, 110716, 110721, + 110726, 110731, 110735, 110740, 110745, 110750, 110754, 110759, 110763, + 110768, 110773, 110778, 110782, 110787, 110791, 110795, 110800, 110804, + 110809, 110814, 110819, 110824, 110828, 110832, 110838, 110843, 110849, + 110854, 110860, 110866, 110873, 110879, 110886, 110891, 110897, 110902, + 110908, 110913, 110918, 110923, 110928, 110933, 110938, 110944, 110948, + 110952, 110956, 110961, 110965, 110971, 110976, 110981, 110985, 110989, + 110993, 110997, 111001, 111005, 111009, 111013, 0, 111017, 0, 111022, + 111027, 111032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111039, 111043, 111047, 111052, + 111056, 111061, 111065, 111070, 111075, 111081, 111086, 111092, 111096, + 111101, 111105, 111110, 111114, 111119, 111124, 111129, 111134, 111139, + 111144, 111149, 111154, 111159, 111164, 111169, 111174, 111179, 111184, + 111188, 111193, 111198, 111203, 111207, 111211, 111216, 111221, 111226, + 111230, 111234, 111238, 111242, 111247, 111252, 111257, 111261, 111265, + 111271, 111276, 111282, 111287, 111293, 111299, 111306, 111312, 111319, + 111324, 111331, 111337, 111342, 111349, 111355, 111360, 111365, 111370, + 111375, 111380, 111385, 111389, 111394, 0, 0, 0, 0, 0, 0, 0, 0, 111398, + 111403, 111407, 111411, 111415, 111419, 111423, 111427, 111431, 111435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111439, 111443, 111448, 111452, + 111457, 111461, 111466, 111471, 111477, 111482, 111488, 111492, 111497, + 111501, 111506, 111510, 111515, 111520, 111525, 111530, 111535, 111540, + 111545, 111550, 111555, 111560, 111565, 111570, 111575, 111580, 111584, + 111589, 111594, 111599, 111603, 111607, 111612, 111617, 111622, 111626, + 111630, 111634, 111638, 111643, 111648, 111653, 111657, 111661, 111667, + 111672, 111678, 111683, 111689, 111695, 0, 0, 111702, 111707, 111713, + 111718, 111724, 111729, 111734, 111739, 111744, 111749, 111754, 111758, + 111763, 111769, 111774, 111780, 111786, 111792, 111800, 111813, 111826, + 111839, 111853, 111868, 111876, 111887, 111896, 111906, 111916, 111926, + 111937, 111949, 111962, 111970, 111978, 111987, 111993, 112000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 112008, 112012, 112017, 112021, 112026, 112030, + 112035, 112040, 112046, 112051, 112057, 112061, 112066, 112070, 112075, + 112079, 112084, 112089, 112094, 112099, 112104, 112109, 112114, 112119, + 112124, 112129, 112134, 112139, 112144, 112149, 112153, 112158, 112163, + 112168, 112172, 112176, 112181, 112186, 112191, 112195, 112199, 112203, + 112207, 112212, 112217, 112222, 112226, 112230, 112235, 112241, 112246, + 112252, 112257, 112263, 112269, 112276, 112282, 112289, 112294, 112300, + 112305, 112311, 112316, 112321, 112326, 112331, 112335, 112340, 112345, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112350, 112355, 112359, 112363, 112367, + 112371, 112375, 112379, 112383, 112387, 0, 0, 0, 0, 0, 0, 112391, 112397, + 112402, 112409, 112417, 112424, 112432, 112441, 112446, 112455, 112460, + 112468, 112477, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112487, 112491, 112496, 112500, 112505, 112509, 112514, 112518, 112523, + 112527, 112532, 112536, 112541, 112546, 112551, 112556, 112561, 112566, + 112571, 112576, 112581, 112586, 112591, 112596, 112601, 112606, 112610, + 112615, 112620, 112625, 112629, 112633, 112638, 112643, 112648, 112652, + 112656, 112660, 112664, 112669, 112674, 112678, 112682, 112687, 112692, + 112697, 112703, 112708, 112714, 112719, 112725, 112730, 112736, 112741, + 112747, 112752, 112757, 0, 0, 0, 0, 0, 0, 0, 112764, 112769, 112773, + 112777, 112781, 112785, 112789, 112793, 112797, 112801, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112805, 112809, 112814, 112819, 112823, 112827, 112833, 112837, 112842, + 112847, 112851, 112856, 112861, 112866, 112870, 112874, 112878, 112883, + 112887, 112891, 112896, 112901, 112906, 112913, 112918, 112923, 112928, + 0, 0, 112935, 112942, 112949, 112958, 112963, 112969, 112974, 112980, + 112985, 112991, 112996, 113002, 113007, 113013, 113019, 0, 0, 0, 0, + 113024, 113029, 113033, 113037, 113041, 113045, 113049, 113053, 113057, + 113061, 113065, 113070, 113075, 113081, 113086, 113091, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98805, 98810, 98815, 98820, 98825, 98830, - 98835, 98840, 98845, 98850, 98855, 98860, 98865, 98870, 98875, 98880, - 98885, 98890, 98895, 98900, 98905, 98910, 98915, 98920, 98925, 98930, - 98935, 98940, 98945, 98950, 98955, 98960, 98965, 98970, 98975, 98980, - 98985, 98990, 98995, 99000, 99005, 99010, 99015, 99020, 99025, 99030, - 99035, 99040, 99045, 99050, 99055, 99060, 99065, 99070, 99075, 99080, - 99085, 99090, 99095, 99100, 99105, 99110, 99115, 99120, 99125, 99130, - 99135, 99140, 99145, 99150, 99155, 99160, 99165, 99170, 99175, 99180, - 99185, 99190, 99195, 99200, 99205, 99210, 99215, 99220, 99225, 99230, - 99235, 99240, 99245, 99250, 99255, 99260, 99265, 99270, 99275, 99280, - 99285, 99290, 99295, 99300, 99305, 99310, 99315, 99320, 99325, 99330, - 99335, 99340, 99345, 99350, 99355, 99360, 99365, 99370, 99375, 99380, - 99385, 99390, 99395, 99400, 99405, 99410, 99415, 99420, 99425, 99430, - 99435, 99440, 99445, 99450, 99455, 99460, 99465, 99470, 99475, 99480, - 99485, 99490, 99495, 99500, 99505, 99510, 99515, 99520, 99525, 99530, - 99535, 99540, 99545, 99550, 99555, 99560, 99565, 99570, 99575, 99580, - 99585, 99590, 99595, 99600, 99605, 99610, 99615, 99620, 99625, 99630, - 99635, 99640, 99645, 99650, 99655, 99660, 99665, 99670, 99675, 99680, - 99685, 99690, 99695, 99700, 99705, 99710, 99715, 99720, 99725, 99730, - 99735, 99740, 99745, 99750, 99755, 99760, 99765, 99770, 99775, 99780, - 99785, 99790, 99795, 99800, 99805, 99810, 99815, 99820, 99825, 99830, - 99835, 99840, 99845, 99850, 99855, 99860, 99865, 99870, 99875, 99880, - 99885, 99890, 99895, 99900, 99905, 99910, 99915, 99920, 99925, 99930, - 99935, 99940, 99945, 99950, 99955, 99960, 99965, 99970, 99975, 99980, - 99985, 99990, 99995, 100000, 100005, 100010, 100015, 100020, 100025, - 100030, 100035, 100040, 100045, 100050, 100055, 100060, 100065, 100070, - 100075, 100080, 100085, 100090, 100095, 100100, 100105, 100110, 100115, - 100120, 100125, 100130, 100135, 100140, 100145, 100150, 100155, 100160, - 100165, 100170, 100175, 100180, 100185, 100190, 100195, 100200, 100205, - 100210, 100215, 100220, 100225, 100230, 100235, 100240, 100245, 100250, - 100255, 100260, 100265, 100270, 100275, 100280, 100285, 100290, 100295, - 100300, 100305, 100310, 100315, 100320, 100325, 100330, 100335, 100340, - 100345, 100350, 100355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100360, 100366, - 100373, 100380, 100386, 100393, 100400, 100407, 100414, 100420, 100427, - 100434, 100441, 100448, 100455, 100462, 100469, 100476, 100483, 100490, - 100497, 100504, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100511, 100516, 100521, - 100526, 100531, 100536, 100541, 100546, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113096, 113100, 113105, 113109, 113114, + 113118, 113123, 113127, 113132, 113136, 113141, 113145, 113150, 113155, + 113160, 113165, 113170, 113175, 113180, 113185, 113190, 113195, 113200, + 113205, 113210, 113215, 113219, 113224, 113229, 113234, 113238, 113242, + 113247, 113252, 113257, 113261, 113265, 113269, 113273, 113278, 113283, + 113288, 113292, 113296, 113301, 113307, 113312, 113318, 113323, 113329, + 113335, 113342, 113347, 113353, 113358, 113364, 113369, 113374, 113379, + 113384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 113389, 113397, 113404, 113412, 113420, 113427, 113435, + 113443, 113451, 113458, 113465, 113473, 113481, 113489, 113497, 113505, + 113513, 113521, 113529, 113537, 113545, 113553, 113561, 113569, 113577, + 113585, 113593, 113601, 113609, 113617, 113625, 113633, 113641, 113649, + 113656, 113664, 113672, 113679, 113687, 113695, 113703, 113710, 113717, + 113725, 113733, 113741, 113749, 113757, 113765, 113773, 113781, 113789, + 113797, 113805, 113813, 113821, 113829, 113837, 113845, 113853, 113861, + 113869, 113877, 113885, 113893, 113900, 113906, 113912, 113918, 113924, + 113930, 113936, 113942, 113948, 113954, 113961, 113968, 113975, 113982, + 113989, 113996, 114003, 114010, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 114017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114023, 114027, 114032, 114036, 114041, + 114045, 114050, 114055, 0, 0, 114061, 114065, 114070, 114074, 114079, + 114083, 114088, 114093, 114098, 114103, 114108, 114113, 114118, 114123, + 114128, 114133, 114138, 114143, 114148, 114153, 114157, 114162, 114167, + 114172, 114176, 114180, 114185, 114190, 114195, 114199, 114203, 114207, + 114211, 114216, 114221, 114226, 114230, 114234, 114239, 114244, 114250, + 114255, 114261, 114266, 114272, 114278, 0, 0, 114285, 114290, 114296, + 114301, 114307, 114312, 114317, 114322, 114327, 114332, 114336, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100551, - 100555, 100559, 100563, 100567, 100571, 0, 0, 100576, 0, 100581, 100585, - 100590, 100595, 100600, 100605, 100609, 100614, 100619, 100624, 100629, - 100633, 100638, 100643, 100648, 100653, 100657, 100662, 100667, 100672, - 100677, 100681, 100686, 100691, 100696, 100701, 100705, 100710, 100715, - 100720, 100725, 100729, 100734, 100739, 100744, 100749, 100754, 100759, - 100764, 100768, 100773, 100778, 100783, 100788, 0, 100793, 100798, 0, 0, - 0, 100803, 0, 0, 100808, 100813, 100820, 100827, 100834, 100841, 100848, - 100855, 100862, 100869, 100876, 100883, 100890, 100897, 100904, 100911, - 100918, 100925, 100932, 100939, 100946, 100953, 100960, 0, 100967, - 100974, 100980, 100986, 100992, 100999, 101006, 101014, 101022, 101031, - 101036, 101041, 101046, 101051, 101056, 101061, 101066, 101071, 101076, - 101081, 101086, 101091, 101096, 101102, 101107, 101112, 101117, 101122, - 101127, 101132, 101137, 101142, 101147, 101153, 101159, 101163, 101167, - 101171, 101175, 101179, 101184, 101189, 101195, 101200, 101206, 101211, - 101216, 101221, 101227, 101232, 101237, 101242, 101247, 101252, 101258, - 101263, 101269, 101274, 101280, 101285, 101291, 101296, 101302, 101307, - 101312, 101317, 101322, 101327, 101332, 101337, 101343, 101348, 0, 0, 0, - 0, 0, 0, 0, 0, 101353, 101357, 101361, 101365, 101369, 101375, 101379, - 101384, 101389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 114343, 114348, 114354, 114361, 114367, 114373, 114380, 114386, 114393, + 114400, 114408, 114415, 114420, 114426, 114432, 114438, 114444, 114450, + 114456, 114462, 114468, 114474, 114480, 114486, 114492, 114498, 114503, + 114509, 114515, 114521, 114526, 114531, 114537, 114543, 114549, 114554, + 114560, 114566, 114572, 114578, 114584, 114590, 114596, 114601, 114606, + 114611, 114617, 114623, 114629, 114634, 114639, 114645, 114651, 114657, + 114663, 114672, 114681, 114687, 114693, 114700, 114707, 114714, 114721, + 114729, 114736, 114744, 114750, 114756, 114763, 114770, 114779, 114789, + 0, 0, 0, 0, 0, 0, 0, 0, 114794, 114798, 114803, 114809, 114814, 114819, + 114824, 114830, 114836, 114842, 114848, 114854, 114860, 114864, 114869, + 114874, 114879, 114884, 114889, 114894, 114899, 114904, 114909, 114914, + 114919, 114924, 114929, 114934, 114938, 114943, 114948, 114953, 114957, + 114961, 114966, 114971, 114976, 114980, 114985, 114990, 114995, 115000, + 115005, 115010, 115014, 115018, 115022, 115027, 115032, 115037, 115041, + 115045, 115050, 115055, 115060, 115066, 115072, 115079, 115085, 115092, + 115099, 115106, 115113, 115120, 115127, 115134, 115140, 115146, 115153, + 115160, 115167, 115172, 115177, 115182, 115186, 115191, 115196, 115202, + 115207, 115223, 115237, 115248, 115254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115260, 115268, + 115276, 115284, 115292, 115301, 115310, 115319, 115328, 115336, 115345, + 115354, 115362, 115371, 115380, 115388, 115397, 115405, 115414, 115422, + 115431, 115440, 115448, 115456, 115464, 115472, 115480, 115489, 115498, + 115508, 115518, 115528, 115538, 115548, 115557, 115567, 115577, 115587, + 115598, 115608, 115620, 115632, 115643, 115657, 115668, 115678, 115690, + 115701, 115711, 115723, 115735, 115746, 115757, 115767, 115777, 115789, + 115800, 0, 0, 0, 0, 0, 0, 0, 115812, 115816, 115821, 115825, 115830, + 115834, 115839, 115844, 115850, 0, 115855, 115859, 115864, 115868, + 115873, 115877, 115882, 115887, 115892, 115897, 115902, 115907, 115912, + 115917, 115922, 115927, 115932, 115937, 115942, 115947, 115951, 115956, + 115961, 115966, 115970, 115974, 115979, 115984, 115989, 115993, 115997, + 116001, 116005, 116010, 116015, 116020, 116024, 116028, 116034, 116039, + 116045, 116050, 116056, 116062, 116069, 0, 116075, 116080, 116086, + 116091, 116097, 116102, 116107, 116112, 116117, 116122, 116126, 116131, + 116137, 116143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116149, 116154, 116158, + 116162, 116166, 116170, 116174, 116178, 116182, 116186, 116190, 116194, + 116198, 116202, 116206, 116210, 116214, 116218, 116222, 116226, 116231, + 116236, 116241, 116246, 116251, 116256, 116261, 116266, 116271, 0, 0, 0, + 116278, 116283, 116288, 116292, 116297, 116302, 116307, 116312, 116317, + 116322, 116327, 116331, 116336, 116341, 116345, 116349, 116354, 116359, + 116363, 116368, 116373, 116378, 116383, 116388, 116393, 116398, 116402, + 116406, 116410, 116415, 116419, 116423, 0, 0, 116427, 116433, 116440, + 116447, 116454, 116461, 116468, 116475, 116482, 116488, 116495, 116502, + 116508, 116514, 116521, 116528, 116534, 116541, 116548, 116555, 116562, + 116569, 0, 116576, 116582, 116588, 116594, 116601, 116607, 116613, + 116619, 116625, 116630, 116635, 116640, 116645, 116650, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 101395, 101400, 101405, 101410, 101415, 101420, 101425, - 101430, 101435, 101440, 101445, 101450, 101455, 101460, 101465, 101470, - 101475, 101480, 101485, 0, 101490, 101495, 0, 0, 0, 0, 0, 101500, 101504, - 101508, 101513, 101518, 101524, 101529, 101534, 101539, 101544, 101549, - 101554, 101559, 101564, 101569, 101574, 101579, 101584, 101589, 101594, - 101599, 101604, 101609, 101614, 101619, 101624, 101629, 101634, 101638, - 101643, 101648, 101654, 101658, 0, 0, 0, 101662, 101668, 101672, 101677, - 101682, 101687, 101691, 101696, 101700, 101705, 101710, 101714, 101719, - 101724, 101728, 101732, 101737, 101742, 101746, 101751, 101756, 101761, - 101766, 101771, 101776, 101781, 101786, 0, 0, 0, 0, 0, 101791, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116655, 116660, + 116666, 116671, 116677, 116682, 116688, 0, 116693, 116699, 0, 116704, + 116710, 116715, 116721, 116727, 116733, 116739, 116745, 116751, 116757, + 116763, 116769, 116775, 116781, 116787, 116793, 116799, 116804, 116810, + 116816, 116822, 116827, 116832, 116838, 116844, 116850, 116855, 116860, + 116865, 116870, 116876, 116882, 116888, 116893, 116898, 116904, 116910, + 116916, 116922, 116929, 116935, 116942, 116948, 116955, 0, 0, 0, 116962, + 0, 116968, 116975, 0, 116981, 116988, 116994, 117000, 117006, 117012, + 117018, 117023, 117028, 0, 0, 0, 0, 0, 0, 0, 0, 117033, 117039, 117044, + 117049, 117054, 117059, 117064, 117069, 117074, 117079, 0, 0, 0, 0, 0, 0, + 117084, 117089, 117095, 117100, 117106, 117111, 0, 117117, 117123, 0, + 117129, 117135, 117141, 117146, 117152, 117158, 117164, 117169, 117174, + 117180, 117185, 117191, 117196, 117202, 117208, 117214, 117220, 117225, + 117231, 117237, 117243, 117249, 117255, 117261, 117267, 117273, 117279, + 117285, 117290, 117296, 117301, 117306, 117311, 117318, 117324, 117331, + 117337, 0, 117344, 117351, 0, 117358, 117365, 117372, 117378, 117384, + 117389, 0, 0, 0, 0, 0, 0, 0, 117394, 117400, 117405, 117410, 117415, + 117420, 117425, 117430, 117435, 117440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101796, 101801, 101806, 101811, - 101816, 101821, 101827, 101833, 101839, 101844, 101849, 101854, 101860, - 101866, 101872, 101877, 101883, 101888, 101894, 101900, 101905, 101911, - 101917, 101922, 101928, 101934, 101940, 101946, 101952, 101957, 101963, - 101969, 101975, 101980, 101985, 101990, 101995, 102000, 102006, 102012, - 102017, 102022, 102027, 102033, 102038, 102043, 102049, 102055, 102060, - 102067, 102073, 102078, 102084, 102090, 102096, 102101, 0, 0, 0, 0, - 102107, 102116, 102124, 102131, 102138, 102143, 102148, 102153, 102158, - 102163, 102168, 102173, 102178, 102183, 102189, 102195, 102201, 102207, - 102213, 102219, 0, 0, 102225, 102232, 102239, 102246, 102254, 102262, - 102270, 102278, 102286, 102294, 102301, 102308, 102315, 102323, 102331, - 102339, 102347, 102355, 102363, 102371, 102379, 102387, 102395, 102403, - 102411, 102419, 102427, 102435, 102444, 102453, 102462, 102472, 102482, - 102492, 102502, 102512, 102522, 102530, 102538, 102546, 102555, 102564, - 102573, 102582, 102591, 102600, 102609, 102613, 102618, 102623, 0, - 102629, 102634, 0, 0, 0, 0, 0, 102639, 102645, 102652, 102657, 102662, - 102666, 102671, 102676, 0, 102681, 102686, 102691, 0, 102696, 102701, - 102706, 102711, 102716, 102721, 102726, 102731, 102736, 102741, 102746, - 102750, 102754, 102759, 102764, 102769, 102773, 102777, 102781, 102785, - 102790, 102795, 102800, 102804, 102809, 102813, 102818, 102823, 102828, - 0, 0, 102833, 102839, 102844, 0, 0, 0, 0, 102849, 102853, 102857, 102861, - 102865, 102869, 102874, 102879, 102885, 102891, 0, 0, 0, 0, 0, 0, 0, - 102898, 102904, 102911, 102917, 102924, 102930, 102936, 102942, 102949, - 0, 0, 0, 0, 0, 0, 0, 102955, 102963, 102971, 102979, 102987, 102995, - 103003, 103011, 103019, 103027, 103035, 103043, 103051, 103059, 103067, - 103075, 103083, 103091, 103099, 103107, 103115, 103123, 103131, 103139, - 103147, 103155, 103163, 103171, 103179, 103187, 103194, 103202, 103210, - 103217, 103224, 103231, 103238, 103245, 103252, 103259, 103266, 103273, - 103280, 103287, 103294, 103301, 103308, 103315, 103322, 103329, 103336, - 103343, 103350, 103357, 103364, 103371, 103378, 103385, 103392, 103399, - 103406, 103413, 103419, 103426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103433, 103438, - 103443, 103448, 103453, 103458, 103463, 103468, 103473, 103478, 103483, - 103488, 103493, 103498, 103503, 103508, 103513, 103518, 103523, 103528, - 103533, 103538, 103543, 103548, 103553, 103558, 103563, 103568, 103573, - 103578, 103583, 103588, 103593, 103598, 103603, 103608, 103613, 103618, - 103624, 0, 0, 0, 0, 103630, 103634, 103638, 103643, 103648, 103654, - 103660, 103666, 103676, 103685, 103691, 103698, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 103706, 103710, 103715, 103720, 103725, 103730, 103735, 103740, - 103745, 103749, 103754, 103758, 103763, 103767, 103772, 103776, 103781, - 103786, 103791, 103796, 103801, 103806, 103811, 103816, 103821, 103826, - 103831, 103836, 103841, 103846, 103851, 103856, 103861, 103866, 103871, - 103876, 103881, 103886, 103891, 103896, 103901, 103906, 103911, 103916, - 103921, 103926, 103931, 103936, 103941, 103946, 103951, 103956, 103961, - 103966, 0, 0, 0, 103971, 103976, 103986, 103995, 104005, 104015, 104026, - 104037, 104044, 104051, 104058, 104065, 104072, 104079, 104086, 104093, - 104100, 104107, 104114, 104121, 104128, 104135, 104142, 104149, 104156, - 104163, 104170, 104177, 104184, 0, 0, 104191, 104197, 104203, 104209, - 104215, 104222, 104229, 104237, 104245, 104252, 104259, 104266, 104273, - 104280, 104287, 104294, 104301, 104308, 104315, 104322, 104329, 104336, - 104343, 104350, 104357, 104364, 104371, 0, 0, 0, 0, 0, 104378, 104384, - 104390, 104396, 104402, 104409, 104416, 104424, 104432, 104439, 104446, - 104453, 104460, 104467, 104474, 104481, 104488, 104495, 104502, 104509, - 104516, 104523, 104530, 104537, 104544, 104551, 0, 0, 0, 0, 0, 0, 0, - 104558, 104565, 104574, 104585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 104596, 104602, 104608, 104614, 104620, 104627, 104634, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 104642, 104649, 104656, 104664, 104671, 104678, 104685, 104692, - 104700, 104708, 104716, 104724, 104732, 104740, 104748, 104756, 104764, - 104772, 104780, 104788, 104796, 104804, 104812, 104820, 104828, 104836, - 104844, 104852, 104860, 104868, 104876, 104884, 104892, 104900, 104908, - 104916, 104924, 104932, 104940, 104948, 104956, 104964, 104972, 104980, - 104988, 104996, 105004, 105012, 105020, 105028, 105036, 105044, 105052, - 105060, 105068, 105076, 105084, 105092, 105100, 105108, 105116, 105124, - 105132, 105140, 105148, 105156, 105164, 105172, 105180, 105188, 105196, - 105204, 105212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105220, 105225, 105231, 105237, - 105243, 105249, 105255, 105261, 105267, 105273, 105278, 105285, 105291, - 105297, 105303, 105309, 105315, 105320, 105326, 105332, 105338, 105344, - 105350, 105356, 105362, 105368, 105374, 105380, 105385, 105391, 105399, - 105407, 105413, 105419, 105425, 105431, 105439, 105445, 105451, 105457, - 105463, 105469, 105475, 105480, 105486, 105494, 105502, 105508, 105514, - 105520, 105527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105533, 105538, - 105544, 105550, 105556, 105562, 105568, 105574, 105580, 105586, 105591, - 105598, 105604, 105610, 105616, 105622, 105628, 105633, 105639, 105645, - 105651, 105657, 105663, 105669, 105675, 105681, 105687, 105693, 105698, - 105704, 105712, 105720, 105726, 105732, 105738, 105744, 105752, 105758, - 105764, 105770, 105776, 105782, 105788, 105793, 105799, 105807, 105815, - 105821, 105827, 105833, 105840, 0, 0, 0, 0, 0, 0, 0, 105846, 105850, - 105854, 105859, 105864, 105870, 105876, 105882, 105889, 105895, 105902, - 105909, 105916, 105923, 105929, 105936, 105943, 105950, 105957, 105963, - 105970, 105977, 105983, 105990, 105996, 106003, 106009, 106015, 106021, - 106028, 106037, 106043, 106051, 106058, 106065, 106072, 106078, 106084, - 106090, 106096, 106102, 106109, 106118, 106125, 106132, 106139, 0, 0, 0, - 0, 0, 0, 0, 0, 106146, 106153, 106159, 106165, 106171, 106177, 106183, - 106189, 106195, 106201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117445, 117449, 117454, 117459, 117463, 117468, 117472, 117476, + 117481, 117485, 117490, 117495, 117500, 117504, 117508, 117512, 117517, + 117521, 117525, 117529, 117534, 117539, 117544, 117549, 117553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117560, + 117565, 117570, 117575, 117580, 117585, 117590, 117595, 117600, 117605, + 117610, 117615, 117620, 117625, 117630, 117635, 117640, 117645, 117650, + 117655, 117660, 117668, 117672, 117676, 117680, 117684, 117688, 117692, + 117696, 117700, 117704, 117708, 117712, 117716, 117720, 117724, 117728, + 117734, 117740, 117744, 117750, 117756, 117761, 117765, 117770, 117774, + 117778, 117784, 117790, 117794, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 117798, 117806, 117809, 117814, 117820, 117828, 117833, 117839, 117847, + 117853, 117859, 117863, 117867, 117874, 117883, 117890, 117899, 117905, + 117914, 117921, 117928, 117935, 117945, 117951, 117955, 117962, 117971, + 117981, 117988, 117995, 117999, 118003, 118010, 118020, 118024, 118031, + 118038, 118045, 118051, 118058, 118065, 118072, 118079, 118083, 118087, + 118091, 118098, 118102, 118109, 118116, 118130, 118139, 118143, 118147, + 118151, 118158, 118162, 118166, 118170, 118178, 118186, 118205, 118215, + 118235, 118239, 118243, 118247, 118251, 118255, 118259, 118263, 118270, + 118274, 118277, 118281, 118285, 118291, 118298, 118307, 118311, 118320, + 118329, 118337, 118341, 118348, 118352, 118356, 118360, 118364, 118375, + 118384, 118393, 118402, 118411, 118423, 118432, 118441, 118450, 118458, + 118467, 118479, 118488, 118496, 118505, 118517, 118526, 118535, 118547, + 118556, 118565, 118577, 118586, 118590, 118594, 118598, 118602, 118606, + 118610, 118614, 118621, 118625, 118629, 118640, 118644, 118648, 118655, + 118661, 118667, 118671, 118678, 118682, 118686, 118690, 118694, 118698, + 118702, 118708, 118716, 118720, 118724, 118727, 118734, 118746, 118750, + 118762, 118769, 118776, 118783, 118790, 118796, 118800, 118804, 118808, + 118812, 118819, 118828, 118835, 118843, 118851, 118857, 118861, 118865, + 118869, 118873, 118879, 118888, 118900, 118907, 118914, 118923, 118934, + 118940, 118949, 118958, 118965, 118974, 118981, 118987, 118997, 119004, + 119011, 119018, 119025, 119029, 119035, 119039, 119050, 119058, 119067, + 119079, 119086, 119093, 119103, 119110, 119119, 119126, 119135, 119142, + 119149, 119159, 119166, 119173, 119182, 119189, 119201, 119210, 119217, + 119224, 119231, 119240, 119250, 119263, 119270, 119279, 119289, 119296, + 119305, 119318, 119325, 119332, 119339, 119349, 119359, 119365, 119375, + 119382, 119389, 119399, 119405, 119412, 119419, 119426, 119436, 119443, + 119450, 119457, 119463, 119470, 119480, 119487, 119491, 119499, 119503, + 119515, 119519, 119533, 119537, 119541, 119545, 119549, 119555, 119562, + 119570, 119574, 119578, 119582, 119586, 119593, 119597, 119603, 119609, + 119617, 119621, 119628, 119636, 119640, 119644, 119650, 119654, 119663, + 119672, 119679, 119689, 119695, 119699, 119703, 119711, 119718, 119725, + 119731, 119735, 119743, 119747, 119754, 119766, 119773, 119783, 119789, + 119793, 119802, 119809, 119818, 119822, 119826, 119833, 119837, 119841, + 119845, 119849, 119852, 119858, 119864, 119868, 119872, 119879, 119886, + 119893, 119900, 119907, 119914, 119921, 119928, 119934, 119938, 119942, + 119949, 119956, 119963, 119970, 119977, 119981, 119984, 119989, 119993, + 119997, 120006, 120015, 120019, 120023, 120029, 120035, 120052, 120058, + 120062, 120071, 120075, 120079, 120086, 120094, 120102, 120108, 120112, + 120116, 120120, 120124, 120127, 120133, 120140, 120150, 120157, 120164, + 120171, 120177, 120184, 120191, 120198, 120205, 120212, 120221, 120228, + 120240, 120247, 120254, 120264, 120275, 120282, 120289, 120296, 120303, + 120310, 120317, 120324, 120331, 120338, 120345, 120355, 120365, 120375, + 120382, 120392, 120399, 120406, 120413, 120420, 120426, 120433, 120440, + 120447, 120454, 120461, 120468, 120475, 120482, 120488, 120495, 120502, + 120511, 120518, 120525, 120529, 120537, 120541, 120545, 120549, 120553, + 120557, 120564, 120568, 120577, 120581, 120588, 120596, 120600, 120604, + 120608, 120621, 120637, 120641, 120645, 120652, 120658, 120665, 120669, + 120673, 120677, 120681, 120685, 120692, 120696, 120714, 120718, 120722, + 120729, 120733, 120737, 120743, 120747, 120751, 120759, 120763, 120767, + 120770, 120774, 120780, 120791, 120800, 120809, 120816, 120823, 120834, + 120841, 120848, 120855, 120862, 120869, 120876, 120883, 120893, 120899, + 120906, 120916, 120925, 120932, 120941, 120951, 120958, 120965, 120972, + 120979, 120991, 120998, 121005, 121012, 121019, 121026, 121036, 121043, + 121050, 121060, 121073, 121085, 121092, 121102, 121109, 121116, 121123, + 121137, 121143, 121151, 121161, 121171, 121178, 121185, 121191, 121195, + 121202, 121212, 121218, 121231, 121235, 121239, 121246, 121250, 121257, + 121267, 121271, 121275, 121279, 121283, 121287, 121294, 121298, 121305, + 121312, 121319, 121328, 121337, 121347, 121354, 121361, 121368, 121378, + 121385, 121395, 121402, 121412, 121419, 121426, 121436, 121446, 121453, + 121459, 121467, 121475, 121481, 121487, 121491, 121495, 121502, 121510, + 121516, 121520, 121524, 121528, 121535, 121547, 121550, 121557, 121563, + 121567, 121571, 121575, 121579, 121583, 121587, 121591, 121595, 121599, + 121603, 121610, 121614, 121620, 121624, 121628, 121632, 121638, 121645, + 121652, 121659, 121670, 121678, 121682, 121688, 121697, 121704, 121710, + 121713, 121717, 121721, 121727, 121736, 121744, 121748, 121754, 121758, + 121762, 121766, 121772, 121779, 121785, 121789, 121795, 121799, 121803, + 121812, 121824, 121828, 121835, 121842, 121852, 121859, 121871, 121878, + 121885, 121892, 121903, 121913, 121926, 121936, 121943, 121947, 121951, + 121955, 121959, 121968, 121977, 121986, 122003, 122012, 122018, 122025, + 122033, 122046, 122050, 122059, 122068, 122077, 122086, 122097, 122106, + 122114, 122123, 122132, 122141, 122150, 122160, 122163, 122167, 122171, + 122175, 122179, 122183, 122189, 122196, 122203, 122210, 122216, 122222, + 122229, 122235, 122242, 122250, 122254, 122261, 122268, 122275, 122283, + 122286, 122290, 122294, 122298, 122301, 122307, 122311, 122317, 122324, + 122331, 122337, 122344, 122351, 122358, 122365, 122372, 122379, 122386, + 122393, 122400, 122407, 122414, 122421, 122428, 122435, 122441, 122445, + 122454, 122458, 122462, 122466, 122470, 122476, 122483, 122490, 122497, + 122504, 122511, 122517, 122525, 122529, 122533, 122537, 122541, 122547, + 122564, 122581, 122585, 122589, 122593, 122597, 122601, 122605, 122611, + 122618, 122622, 122628, 122635, 122642, 122649, 122656, 122663, 122672, + 122679, 122686, 122693, 122700, 122704, 122708, 122714, 122726, 122730, + 122734, 122743, 122747, 122751, 122755, 122761, 122765, 122769, 122778, + 122782, 122786, 122790, 122797, 122801, 122805, 122809, 122813, 122817, + 122821, 122825, 122828, 122834, 122841, 122848, 122854, 122858, 122875, + 122881, 122885, 122891, 122897, 122903, 122909, 122915, 122921, 122925, + 122929, 122933, 122939, 122943, 122949, 122953, 122957, 122964, 122971, + 122988, 122992, 122996, 123000, 123004, 123008, 123020, 123023, 123028, + 123033, 123048, 123058, 123070, 123074, 123078, 123082, 123088, 123095, + 123102, 123112, 123124, 123130, 123136, 123145, 123149, 123153, 123160, + 123170, 123177, 123183, 123187, 123191, 123198, 123204, 123208, 123214, + 123218, 123226, 123232, 123236, 123244, 123252, 123259, 123265, 123272, + 123279, 123289, 123299, 123303, 123307, 123311, 123315, 123321, 123328, + 123334, 123341, 123348, 123355, 123364, 123371, 123378, 123384, 123391, + 123398, 123405, 123412, 123419, 123426, 123432, 123439, 123446, 123453, + 123462, 123469, 123476, 123480, 123486, 123490, 123496, 123503, 123510, + 123517, 123521, 123525, 123529, 123533, 123537, 123544, 123548, 123552, + 123558, 123566, 123570, 123574, 123578, 123582, 123589, 123593, 123597, + 123605, 123609, 123613, 123617, 123621, 123627, 123631, 123635, 123641, + 123648, 123654, 123661, 123673, 123677, 123684, 123691, 123698, 123705, + 123717, 123724, 123728, 123732, 123736, 123743, 123750, 123757, 123764, + 123774, 123781, 123787, 123794, 123801, 123808, 123815, 123824, 123834, + 123841, 123845, 123852, 123856, 123860, 123864, 123871, 123878, 123888, + 123894, 123898, 123907, 123911, 123918, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123922, 123928, + 123934, 123941, 123948, 123955, 123962, 123969, 123976, 123982, 123989, + 123996, 124003, 124010, 124017, 124024, 124030, 124036, 124042, 124048, + 124054, 124060, 124066, 124072, 124078, 124085, 124092, 124099, 124106, + 124113, 124120, 124126, 124132, 124138, 124145, 124152, 124158, 124164, + 124173, 124180, 124187, 124194, 124201, 124208, 124215, 124221, 124227, + 124233, 124242, 124249, 124256, 124267, 124278, 124284, 124290, 124296, + 124305, 124312, 124319, 124329, 124339, 124350, 124361, 124373, 124386, + 124397, 124408, 124420, 124433, 124444, 124455, 124466, 124477, 124488, + 124500, 124508, 124516, 124525, 124534, 124543, 124549, 124555, 124561, + 124568, 124578, 124585, 124595, 124600, 124605, 124611, 124617, 124625, + 124633, 124642, 124653, 124664, 124672, 124680, 124689, 124698, 124706, + 124713, 124721, 124729, 124736, 124743, 124752, 124761, 124770, 124779, + 124788, 0, 124797, 124808, 124815, 124823, 124831, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 124839, 124848, 124855, 124862, 124871, 124878, 124885, + 124892, 124902, 124909, 124916, 124923, 124931, 124938, 124945, 124952, + 124963, 124970, 124977, 124984, 124991, 124998, 125007, 125014, 125020, + 125027, 125036, 125043, 125050, 125057, 125067, 125074, 125081, 125091, + 125101, 125108, 125115, 125122, 125129, 125136, 125143, 125152, 125159, + 125166, 125172, 125180, 125189, 125198, 125209, 125217, 125226, 125235, + 125244, 125253, 125260, 125267, 125276, 125288, 125298, 125305, 125312, + 125322, 125332, 125341, 125351, 125358, 125368, 125375, 125382, 125389, + 125399, 125409, 125416, 125423, 125433, 125439, 125450, 125459, 125469, + 125477, 125490, 125497, 125503, 125511, 125518, 125528, 125532, 125536, + 125540, 125544, 125548, 125552, 125556, 125565, 125569, 125576, 125580, + 125584, 125588, 125592, 125596, 125600, 125604, 125608, 125612, 125616, + 125620, 125624, 125628, 125632, 125636, 125640, 125644, 125648, 125652, + 125659, 125666, 125676, 125689, 125699, 125703, 125707, 125711, 125715, + 125719, 125723, 125727, 125731, 125735, 125739, 125743, 125750, 125757, + 125768, 125775, 125781, 125788, 125795, 125802, 125809, 125816, 125820, + 125824, 125831, 125838, 125845, 125854, 125861, 125874, 125884, 125891, + 125898, 125902, 125906, 125915, 125922, 125929, 125936, 125949, 125956, + 125963, 125973, 125983, 125992, 125999, 126006, 126013, 126020, 126027, + 126034, 126044, 126050, 126058, 126065, 126073, 126080, 126091, 126098, + 126104, 126111, 126118, 126125, 126132, 126142, 126152, 126159, 126166, + 126175, 126183, 126189, 126196, 126203, 126210, 126217, 126221, 126231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126241, 126245, 126249, 126253, + 126257, 126261, 126265, 126269, 126273, 126277, 126281, 126285, 126289, + 126293, 126297, 126301, 126305, 126309, 126313, 126317, 126321, 126325, + 126329, 126333, 126337, 126341, 126345, 126349, 126353, 126357, 126361, + 126365, 126369, 126373, 126377, 126381, 126385, 126389, 126393, 126397, + 126401, 126405, 126409, 126413, 126417, 126421, 126425, 126429, 126433, + 126437, 126441, 126445, 126449, 126453, 126457, 126461, 126465, 126469, + 126473, 126477, 126481, 126485, 126489, 126493, 126497, 126501, 126505, + 126509, 126513, 126517, 126521, 126525, 126529, 126533, 126537, 126541, + 126545, 126549, 126553, 126557, 126561, 126565, 126569, 126573, 126577, + 126581, 126585, 126589, 126593, 126597, 126601, 126605, 126609, 126613, + 126617, 126621, 126625, 126629, 126633, 126637, 126641, 126645, 126649, + 126653, 126657, 126661, 126665, 126669, 126673, 126677, 126681, 126685, + 126689, 126693, 126697, 126701, 126705, 126709, 126713, 126717, 126721, + 126725, 126729, 126733, 126737, 126741, 126745, 126749, 126753, 126757, + 126761, 126765, 126769, 126773, 126777, 126781, 126785, 126789, 126793, + 126797, 126801, 126805, 126809, 126813, 126817, 126821, 126825, 126829, + 126833, 126837, 126841, 126845, 126849, 126853, 126857, 126861, 126865, + 126869, 126873, 126877, 126881, 126885, 126889, 126893, 126897, 126901, + 126905, 126909, 126913, 126917, 126921, 126925, 126929, 126933, 126937, + 126941, 126945, 126949, 126953, 126957, 126961, 126965, 126969, 126973, + 126977, 126981, 126985, 126989, 126993, 126997, 127001, 127005, 127009, + 127013, 127017, 127021, 127025, 127029, 127033, 127037, 127041, 127045, + 127049, 127053, 127057, 127061, 127065, 127069, 127073, 127077, 127081, + 127085, 127089, 127093, 127097, 127101, 127105, 127109, 127113, 127117, + 127121, 127125, 127129, 127133, 127137, 127141, 127145, 127149, 127153, + 127157, 127161, 127165, 127169, 127173, 127177, 127181, 127185, 127189, + 127193, 127197, 127201, 127205, 127209, 127213, 127217, 127221, 127225, + 127229, 127233, 127237, 127241, 127245, 127249, 127253, 127257, 127261, + 127265, 127269, 127273, 127277, 127281, 127285, 127289, 127293, 127297, + 127301, 127305, 127309, 127313, 127317, 127321, 127325, 127329, 127333, + 127337, 127341, 127345, 127349, 127353, 127357, 127361, 127365, 127369, + 127373, 127377, 127381, 127385, 127389, 127393, 127397, 127401, 127405, + 127409, 127413, 127417, 127421, 127425, 127429, 127433, 127437, 127441, + 127445, 127449, 127453, 127457, 127461, 127465, 127469, 127473, 127477, + 127481, 127485, 127489, 127493, 127497, 127501, 127505, 127509, 127513, + 127517, 127521, 127525, 127529, 127533, 127537, 127541, 127545, 127549, + 127553, 127557, 127561, 127565, 127569, 127573, 127577, 127581, 127585, + 127589, 127593, 127597, 127601, 127605, 127609, 127613, 127617, 127621, + 127625, 127629, 127633, 127637, 127641, 127645, 127649, 127653, 127657, + 127661, 127665, 127669, 127673, 127677, 127681, 127685, 127689, 127693, + 127697, 127701, 127705, 127709, 127713, 127717, 127721, 127725, 127729, + 127733, 127737, 127741, 127745, 127749, 127753, 127757, 127761, 127765, + 127769, 127773, 127777, 127781, 127785, 127789, 127793, 127797, 127801, + 127805, 127809, 127813, 127817, 127821, 127825, 127829, 127833, 127837, + 127841, 127845, 127849, 127853, 127857, 127861, 127865, 127869, 127873, + 127877, 127881, 127885, 127889, 127893, 127897, 127901, 127905, 127909, + 127913, 127917, 127921, 127925, 127929, 127933, 127937, 127941, 127945, + 127949, 127953, 127957, 127961, 127965, 127969, 127973, 127977, 127981, + 127985, 127989, 127993, 127997, 128001, 128005, 128009, 128013, 128017, + 128021, 128025, 128029, 128033, 128037, 128041, 128045, 128049, 128053, + 128057, 128061, 128065, 128069, 128073, 128077, 128081, 128085, 128089, + 128093, 128097, 128101, 128105, 128109, 128113, 128117, 128121, 128125, + 128129, 128133, 128137, 128141, 128145, 128149, 128153, 128157, 128161, + 128165, 128169, 128173, 128177, 128181, 128185, 128189, 128193, 128197, + 128201, 128205, 128209, 128213, 128217, 128221, 128225, 128229, 128233, + 128237, 128241, 128245, 128249, 128253, 128257, 128261, 128265, 128269, + 128273, 128277, 128281, 128285, 128289, 128293, 128297, 128301, 128305, + 128309, 128313, 128317, 128321, 128325, 128329, 128333, 128337, 128341, + 128345, 128349, 128353, 128357, 128361, 128365, 128369, 128373, 128377, + 128381, 128385, 128389, 128393, 128397, 128401, 128405, 128409, 128413, + 128417, 128421, 128425, 128429, 128433, 128437, 128441, 128445, 128449, + 128453, 128457, 128461, 128465, 128469, 128473, 128477, 128481, 128485, + 128489, 128493, 128497, 128501, 128505, 128509, 128513, 128517, 128521, + 128525, 128529, 128533, 128537, 128541, 128545, 128549, 128553, 128557, + 128561, 128565, 128569, 128573, 128577, 128581, 128585, 128589, 128593, + 128597, 128601, 128605, 128609, 128613, 128617, 128621, 128625, 128629, + 128633, 128637, 128641, 128645, 128649, 128653, 128657, 128661, 128665, + 128669, 128673, 128677, 128681, 128685, 128689, 128693, 128697, 128701, + 128705, 128709, 128713, 128717, 128721, 128725, 128729, 128733, 128737, + 128741, 128745, 128749, 128753, 128757, 128761, 128765, 128769, 128773, + 128777, 128781, 128785, 128789, 128793, 128797, 128801, 128805, 128809, + 128813, 128817, 128821, 128825, 128829, 128833, 128837, 128841, 128845, + 128849, 128853, 128857, 128861, 128865, 128869, 128873, 128877, 128881, + 128885, 128889, 128893, 128897, 128901, 128905, 128909, 128913, 128917, + 128921, 128925, 128929, 128933, 128937, 128941, 128945, 128949, 128953, + 128957, 128961, 128965, 128969, 128973, 128977, 128981, 128985, 128989, + 128993, 128997, 129001, 129005, 129009, 129013, 129017, 129021, 129025, + 129029, 129033, 129037, 129041, 129045, 129049, 129053, 129057, 129061, + 129065, 129069, 129073, 129077, 129081, 129085, 129089, 129093, 129097, + 129101, 129105, 129109, 129113, 129117, 129121, 129125, 129129, 129133, + 129137, 129141, 129145, 129149, 129153, 129157, 129161, 129165, 129169, + 129173, 129177, 129181, 129185, 129189, 129193, 129197, 129201, 129205, + 129209, 129213, 129217, 129221, 129225, 129229, 129233, 129237, 129241, + 129245, 129249, 129253, 129257, 129261, 129265, 129269, 129273, 129277, + 129281, 129285, 129289, 129293, 129297, 129301, 129305, 129309, 129313, + 129317, 129321, 129325, 129329, 129333, 129337, 129341, 129345, 129349, + 129353, 129357, 129361, 129365, 129369, 129373, 129377, 129381, 129385, + 129389, 129393, 129397, 129401, 129405, 129409, 129413, 129417, 129421, + 129425, 129429, 129433, 129437, 129441, 129445, 129449, 129453, 129457, + 129461, 129465, 129469, 129473, 129477, 129481, 129485, 129489, 129493, + 129497, 129501, 129505, 129509, 129513, 129517, 129521, 129525, 129529, + 129533, 129537, 129541, 129545, 129549, 129553, 129557, 129561, 129565, + 129569, 129573, 129577, 129581, 129585, 129589, 129593, 129597, 129601, + 129605, 129609, 129613, 129617, 129621, 129625, 129629, 129633, 129637, + 129641, 129645, 129649, 129653, 129657, 129661, 129665, 129669, 129673, + 129677, 129681, 129685, 129689, 129693, 129697, 129701, 129705, 129709, + 129713, 129717, 129721, 129725, 129729, 129733, 129737, 129741, 129745, + 129749, 129753, 129757, 129761, 129765, 129769, 129773, 129777, 129781, + 129785, 129789, 129793, 129797, 129801, 129805, 129809, 129813, 129817, + 129821, 129825, 129829, 129833, 129837, 129841, 129845, 129849, 129853, + 129857, 129861, 129865, 129869, 129873, 129877, 129881, 129885, 129889, + 129893, 129897, 129901, 129905, 129909, 129913, 129917, 129921, 129925, + 129929, 129933, 129937, 129941, 129945, 129949, 129953, 129957, 129961, + 129965, 129969, 129973, 129977, 129981, 129985, 129989, 129993, 129997, + 130001, 130005, 130009, 130013, 130017, 130021, 130025, 130029, 130033, + 130037, 130041, 130045, 130049, 130053, 130057, 130061, 130065, 130069, + 130073, 130077, 130081, 130085, 130089, 130093, 130097, 130101, 130105, + 130109, 130113, 130117, 130121, 130125, 130129, 130133, 130137, 130141, + 130145, 130149, 130153, 130157, 130161, 130165, 130169, 130173, 130177, + 130181, 130185, 130189, 130193, 130197, 130201, 130205, 130209, 130213, + 130217, 130221, 130225, 130229, 130233, 130237, 130241, 130245, 130249, + 130253, 130257, 130261, 130265, 130269, 130273, 130277, 130281, 130285, + 130289, 130293, 130297, 130301, 130305, 130309, 130313, 130317, 130321, + 130325, 130329, 130333, 130337, 130341, 130345, 130349, 130353, 130357, + 130361, 130365, 130369, 130373, 130377, 130381, 130385, 130389, 130393, + 130397, 130401, 130405, 130409, 130413, 130417, 130421, 130425, 130429, + 130433, 130437, 130441, 130445, 130449, 130453, 130457, 130461, 130465, + 130469, 130473, 130477, 130481, 130485, 130489, 130493, 130497, 130501, + 130505, 130509, 130513, 130517, 130521, 0, 130525, 130530, 130536, + 130546, 130556, 130566, 130576, 130582, 130588, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106207, 106211, 106215, 106219, - 106223, 106227, 106231, 106235, 106239, 106243, 106248, 106253, 106258, - 106263, 106268, 106273, 106278, 106283, 106288, 106294, 106300, 106306, - 106313, 106320, 106327, 106334, 106341, 106348, 106355, 106362, 106369, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130594, 130598, 130602, + 130606, 130610, 130614, 130618, 130622, 130626, 130630, 130634, 130638, + 130642, 130646, 130650, 130654, 130658, 130662, 130666, 130670, 130674, + 130678, 130682, 130686, 130690, 130694, 130698, 130702, 130706, 130710, + 130714, 130718, 130722, 130726, 130730, 130734, 130738, 130742, 130746, + 130750, 130754, 130758, 130762, 130766, 130770, 130774, 130778, 130782, + 130786, 130790, 130794, 130798, 130802, 130806, 130810, 130814, 130818, + 130822, 130826, 130830, 130834, 130838, 130842, 130846, 130850, 130854, + 130858, 130862, 130866, 130870, 130874, 130878, 130882, 130886, 130890, + 130894, 130898, 130902, 130906, 130910, 130914, 130918, 130922, 130926, + 130930, 130934, 130938, 130942, 130946, 130950, 130954, 130958, 130962, + 130966, 130970, 130974, 130978, 130982, 130986, 130990, 130994, 130998, + 131002, 131006, 131010, 131014, 131018, 131022, 131026, 131030, 131034, + 131038, 131042, 131046, 131050, 131054, 131058, 131062, 131066, 131070, + 131074, 131078, 131082, 131086, 131090, 131094, 131098, 131102, 131106, + 131110, 131114, 131118, 131122, 131126, 131130, 131134, 131138, 131142, + 131146, 131150, 131154, 131158, 131162, 131166, 131170, 131174, 131178, + 131182, 131186, 131190, 131194, 131198, 131202, 131206, 131210, 131214, + 131218, 131222, 131226, 131230, 131234, 131238, 131242, 131246, 131250, + 131254, 131258, 131262, 131266, 131270, 131274, 131278, 131282, 131286, + 131290, 131294, 131298, 131302, 131306, 131310, 131314, 131318, 131322, + 131326, 131330, 131334, 131338, 131342, 131346, 131350, 131354, 131358, + 131362, 131366, 131370, 131374, 131378, 131382, 131386, 131390, 131394, + 131398, 131402, 131406, 131410, 131414, 131418, 131422, 131426, 131430, + 131434, 131438, 131442, 131446, 131450, 131454, 131458, 131462, 131466, + 131470, 131474, 131478, 131482, 131486, 131490, 131494, 131498, 131502, + 131506, 131510, 131514, 131518, 131522, 131526, 131530, 131534, 131538, + 131542, 131546, 131550, 131554, 131558, 131562, 131566, 131570, 131574, + 131578, 131582, 131586, 131590, 131594, 131598, 131602, 131606, 131610, + 131614, 131618, 131622, 131626, 131630, 131634, 131638, 131642, 131646, + 131650, 131654, 131658, 131662, 131666, 131670, 131674, 131678, 131682, + 131686, 131690, 131694, 131698, 131702, 131706, 131710, 131714, 131718, + 131722, 131726, 131730, 131734, 131738, 131742, 131746, 131750, 131754, + 131758, 131762, 131766, 131770, 131774, 131778, 131782, 131786, 131790, + 131794, 131798, 131802, 131806, 131810, 131814, 131818, 131822, 131826, + 131830, 131834, 131838, 131842, 131846, 131850, 131854, 131858, 131862, + 131866, 131870, 131874, 131878, 131882, 131886, 131890, 131894, 131898, + 131902, 131906, 131910, 131914, 131918, 131922, 131926, 131930, 131934, + 131938, 131942, 131946, 131950, 131954, 131958, 131962, 131966, 131970, + 131974, 131978, 131982, 131986, 131990, 131994, 131998, 132002, 132006, + 132010, 132014, 132018, 132022, 132026, 132030, 132034, 132038, 132042, + 132046, 132050, 132054, 132058, 132062, 132066, 132070, 132074, 132078, + 132082, 132086, 132090, 132094, 132098, 132102, 132106, 132110, 132114, + 132118, 132122, 132126, 132130, 132134, 132138, 132142, 132146, 132150, + 132154, 132158, 132162, 132166, 132170, 132174, 132178, 132182, 132186, + 132190, 132194, 132198, 132202, 132206, 132210, 132214, 132218, 132222, + 132226, 132230, 132234, 132238, 132242, 132246, 132250, 132254, 132258, + 132262, 132266, 132270, 132274, 132278, 132282, 132286, 132290, 132294, + 132298, 132302, 132306, 132310, 132314, 132318, 132322, 132326, 132336, + 132340, 132344, 132348, 132352, 132356, 132360, 132364, 132368, 132372, + 132376, 132380, 132385, 132389, 132393, 132397, 132401, 132405, 132409, + 132413, 132417, 132421, 132425, 132429, 132433, 132437, 132441, 132445, + 132449, 132458, 132467, 132471, 132475, 132479, 132483, 132487, 132491, + 132495, 132499, 132503, 132507, 132511, 132515, 132519, 132523, 132527, + 132531, 132535, 132539, 132543, 132547, 132551, 132555, 132559, 132563, + 132567, 132571, 132575, 132579, 132583, 132587, 132591, 132595, 132599, + 132603, 132607, 132611, 132615, 132619, 132623, 132627, 132631, 132635, + 132639, 132643, 132647, 132651, 132655, 132659, 132663, 132667, 132671, + 132675, 132679, 132683, 132687, 132691, 132695, 132699, 132703, 132707, + 132711, 132715, 132719, 132723, 132727, 132731, 132735, 132739, 132743, + 132747, 132751, 132755, 132759, 132763, 132767, 132771, 132775, 132779, + 132783, 132787, 132791, 132795, 132799, 132803, 132807, 132811, 132815, + 132819, 132823, 132827, 132831, 132835, 132839, 132843, 132847, 132851, + 132855, 132859, 132863, 132867, 132871, 132875, 132879, 132883, 132887, + 132891, 132895, 132899, 132903, 132907, 132911, 132915, 132919, 132923, + 132927, 132931, 132935, 132939, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132943, 132951, + 132959, 132969, 132979, 132987, 132993, 133001, 133009, 133019, 133031, + 133043, 133049, 133057, 133063, 133069, 133075, 133081, 133087, 133093, + 133099, 133105, 133111, 133117, 133123, 133131, 133139, 133145, 133151, + 133157, 133163, 133171, 133179, 133188, 133194, 133202, 133208, 133214, + 133220, 133226, 133232, 133240, 133248, 133254, 133260, 133266, 133272, + 133278, 133284, 133290, 133296, 133302, 133308, 133314, 133320, 133326, + 133332, 133338, 133344, 133350, 133356, 133362, 133370, 133376, 133382, + 133392, 133400, 133406, 133412, 133418, 133424, 133430, 133436, 133442, + 133448, 133454, 133460, 133466, 133472, 133478, 133484, 133490, 133496, + 133502, 133508, 133514, 133520, 133526, 133532, 133540, 133546, 133554, + 133562, 133570, 133576, 133582, 133588, 133594, 133600, 133608, 133618, + 133626, 133634, 133640, 133646, 133654, 133662, 133668, 133676, 133684, + 133692, 133698, 133704, 133710, 133716, 133722, 133728, 133736, 133744, + 133750, 133756, 133762, 133768, 133774, 133782, 133788, 133794, 133800, + 133806, 133812, 133818, 133826, 133832, 133838, 133844, 133850, 133858, + 133866, 133872, 133878, 133884, 133889, 133895, 133901, 133908, 133913, + 133918, 133923, 133928, 133933, 133938, 133943, 133948, 133953, 133962, + 133969, 133974, 133979, 133984, 133991, 133996, 134001, 134006, 134013, + 134018, 134023, 134028, 134033, 134038, 134043, 134048, 134053, 134058, + 134063, 134068, 134075, 134080, 134087, 134092, 134097, 134104, 134109, + 134114, 134119, 134124, 134129, 134134, 134139, 134144, 134149, 134154, + 134159, 134164, 134169, 134174, 134179, 134184, 134189, 134194, 134199, + 134206, 134211, 134216, 134221, 134226, 134231, 134236, 134241, 134246, + 134251, 134256, 134261, 134266, 134271, 134278, 134283, 134288, 134295, + 134300, 134305, 134310, 134315, 134320, 134325, 134330, 134335, 134340, + 134345, 134352, 134357, 134362, 134367, 134372, 134377, 134384, 134391, + 134396, 134401, 134406, 134411, 134416, 134421, 134426, 134431, 134436, + 134441, 134446, 134451, 134456, 134461, 134466, 134471, 134476, 134481, + 134486, 134491, 134496, 134501, 134506, 134511, 134516, 134521, 134526, + 134531, 134536, 134541, 134546, 134551, 134556, 134561, 134566, 134571, + 134578, 134583, 134588, 134593, 134598, 134603, 134608, 134613, 134618, + 134623, 134628, 134633, 134638, 134643, 134648, 134653, 134658, 134663, + 134668, 134673, 134678, 134683, 134688, 134693, 134698, 134703, 134708, + 134713, 134718, 134723, 134728, 134733, 134738, 134743, 134748, 134753, + 134758, 134763, 134768, 134773, 134778, 134783, 134788, 134793, 134798, + 134803, 134808, 134813, 134818, 134823, 134828, 134833, 134838, 134843, + 134848, 134853, 134858, 134863, 134868, 134875, 134880, 134885, 134890, + 134895, 134900, 134905, 134910, 134915, 134920, 134925, 134930, 134935, + 134940, 134945, 134950, 134955, 134960, 134965, 134970, 134975, 134980, + 134987, 134992, 134997, 135003, 135008, 135013, 135018, 135023, 135028, + 135033, 135038, 135043, 135048, 135053, 135058, 135063, 135068, 135073, + 135078, 135083, 135088, 135093, 135098, 135103, 135108, 135113, 135118, + 135123, 135128, 135133, 135138, 135143, 135148, 135153, 135158, 135163, + 135168, 135173, 135178, 135183, 135188, 135193, 135198, 135203, 135208, + 135213, 135218, 135225, 135230, 135235, 135242, 135249, 135254, 135259, + 135264, 135269, 135274, 135279, 135284, 135289, 135294, 135299, 135304, + 135309, 135314, 135319, 135324, 135329, 135334, 135339, 135344, 135349, + 135354, 135359, 135364, 135369, 135374, 135381, 135386, 135391, 135396, + 135401, 135406, 135411, 135416, 135421, 135426, 135431, 135436, 135441, + 135446, 135451, 135456, 135461, 135466, 135471, 135478, 135483, 135488, + 135493, 135498, 135503, 135508, 135513, 135519, 135524, 135529, 135534, + 135539, 135544, 135549, 135554, 135559, 135566, 135573, 135578, 135583, + 135587, 135592, 135596, 135600, 135605, 135612, 135617, 135622, 135631, + 135636, 135641, 135646, 135651, 135658, 135665, 135670, 135675, 135680, + 135685, 135692, 135697, 135702, 135707, 135712, 135717, 135722, 135727, + 135732, 135737, 135742, 135747, 135752, 135759, 135763, 135768, 135773, + 135778, 135783, 135787, 135792, 135797, 135802, 135807, 135812, 135817, + 135822, 135827, 135832, 135838, 135844, 135850, 135856, 135862, 135867, + 135873, 135879, 135885, 135891, 135897, 135903, 135909, 135915, 135921, + 135927, 135933, 135939, 135945, 135951, 135957, 135963, 135969, 135975, + 135980, 135986, 135992, 135998, 136004, 136010, 136016, 136022, 136028, + 136034, 136040, 136046, 136052, 136058, 136064, 136070, 136076, 136082, + 136088, 136094, 136100, 136105, 136111, 136117, 136123, 136129, 136135, + 0, 0, 0, 0, 0, 0, 0, 136141, 136145, 136150, 136155, 136160, 136165, + 136170, 136174, 136179, 136184, 136189, 136194, 136199, 136204, 136209, + 136214, 136219, 136223, 136228, 136232, 136237, 136242, 136247, 136252, + 136257, 136261, 136266, 136271, 136275, 136280, 136285, 0, 136290, + 136295, 136299, 136303, 136307, 136311, 136315, 136319, 136323, 136327, + 0, 0, 0, 0, 136331, 136335, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 136340, 136347, 136353, 136360, 136367, + 136374, 136381, 136388, 136395, 136402, 136409, 136416, 136423, 136430, + 136437, 136444, 136451, 136458, 136464, 136471, 136478, 136485, 136491, + 136498, 136504, 136510, 136517, 136523, 136530, 136536, 0, 0, 136542, + 136550, 136558, 136567, 136576, 136585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 136593, 136598, 136603, 136608, 136613, 136618, 136623, 136628, 136633, + 136638, 136643, 136648, 136653, 136658, 136663, 136668, 136673, 136678, + 136683, 136688, 136693, 136698, 136703, 136708, 136713, 136718, 136723, + 136728, 136733, 136738, 136743, 136748, 136753, 136758, 136763, 136768, + 136773, 136778, 136783, 136788, 136793, 136798, 136803, 136808, 136813, + 136818, 136823, 136828, 136833, 136840, 136847, 136854, 136861, 136868, + 136875, 136882, 136889, 136898, 136905, 136912, 136919, 136926, 136933, + 136940, 136947, 136954, 136961, 136968, 136975, 136980, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 136989, 136994, 136998, 137002, 137006, 137010, 137014, + 137018, 137022, 137026, 0, 137030, 137035, 137040, 137047, 137052, + 137059, 137066, 0, 137071, 137078, 137083, 137088, 137095, 137102, + 137107, 137112, 137117, 137122, 137127, 137134, 137141, 137146, 137151, + 137156, 137169, 137178, 137185, 137194, 137203, 0, 0, 0, 0, 0, 137212, + 137219, 137226, 137233, 137240, 137247, 137254, 137261, 137268, 137275, + 137282, 137289, 137296, 137303, 137310, 137317, 137324, 137331, 137338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 106376, 106382, 106389, 106395, 106402, - 106408, 106414, 106421, 106427, 106433, 106439, 106445, 106451, 106457, - 106463, 106469, 106476, 106487, 106493, 106499, 106507, 106513, 106519, - 106526, 106537, 106543, 106549, 106555, 106562, 106573, 106578, 106583, - 106588, 106593, 106598, 106604, 106610, 106616, 106623, 106631, 0, 0, 0, - 0, 0, 0, 0, 0, 106637, 106642, 106647, 106652, 106657, 106662, 106667, - 106672, 106677, 106682, 106687, 106692, 106697, 106702, 106707, 106712, - 106717, 106722, 106727, 106732, 106737, 106742, 106748, 106753, 106760, - 106765, 106772, 106778, 106784, 106790, 106796, 106803, 106809, 106815, - 106819, 106824, 106829, 106835, 106843, 106854, 106863, 106873, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106883, 106887, - 106891, 106895, 106899, 106903, 106906, 106910, 106913, 106917, 106920, - 106924, 106928, 106933, 106937, 106942, 106945, 106949, 106952, 106956, - 106959, 106963, 106967, 106971, 106975, 106979, 106983, 106987, 106991, - 106995, 106999, 107003, 107007, 107011, 107015, 107019, 107023, 107027, - 107031, 107034, 107037, 107041, 107045, 107049, 107052, 107055, 107058, - 107061, 107065, 107069, 107073, 107076, 107079, 107083, 107089, 107095, - 107101, 107106, 107113, 107117, 107122, 107126, 107131, 107136, 107142, - 107147, 107153, 107157, 107162, 107166, 107171, 107174, 107177, 107181, - 107186, 107192, 107197, 107203, 0, 0, 0, 0, 107208, 107211, 107214, - 107217, 107220, 107223, 107226, 107229, 107232, 107235, 107239, 107243, - 107247, 107251, 107255, 107259, 107263, 107267, 107271, 107276, 107281, - 107285, 107288, 107291, 107294, 107297, 107300, 107303, 107306, 107309, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107312, 107316, 107321, - 107326, 107331, 107335, 107340, 107344, 107349, 107353, 107358, 107362, - 107367, 107371, 107376, 107380, 107385, 107390, 107395, 107400, 107405, - 107410, 107415, 107420, 107425, 107430, 107435, 107440, 107445, 107450, - 107455, 107460, 107465, 107470, 107475, 107480, 107484, 107488, 107493, - 107498, 107503, 107507, 107511, 107515, 107519, 107524, 107529, 107534, - 107538, 107542, 107548, 107553, 107559, 107564, 107570, 107575, 107581, - 107586, 107592, 107597, 107602, 107607, 107612, 107616, 107621, 107627, - 107631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107636, 0, 0, 107641, 107648, - 107655, 107662, 107669, 107676, 107683, 107690, 107697, 107704, 107711, - 107718, 107725, 107732, 107739, 107746, 107753, 107760, 107767, 107774, - 107781, 107788, 107795, 107802, 107809, 0, 0, 0, 0, 0, 0, 0, 107816, - 107823, 107829, 107835, 107841, 107847, 107853, 107859, 107865, 107871, - 0, 0, 0, 0, 0, 0, 107877, 107882, 107887, 107892, 107897, 107901, 107905, - 107909, 107914, 107919, 107924, 107929, 107934, 107939, 107944, 107949, - 107954, 107959, 107964, 107969, 107974, 107979, 107984, 107989, 107994, - 107999, 108004, 108009, 108014, 108019, 108024, 108029, 108034, 108039, - 108044, 108049, 108054, 108059, 108064, 108069, 108074, 108079, 108085, - 108090, 108096, 108101, 108107, 108112, 108118, 108124, 108128, 108133, - 108137, 0, 108141, 108146, 108150, 108154, 108158, 108162, 108166, - 108170, 108174, 108178, 108182, 108187, 108191, 108196, 108201, 108206, - 108212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108218, 108222, 108226, 108230, - 108234, 108238, 108242, 108247, 108252, 108257, 108262, 108267, 108272, - 108277, 108282, 108287, 108292, 108297, 108302, 108307, 108312, 108317, - 108322, 108327, 108331, 108335, 108340, 108345, 108350, 108354, 108358, - 108362, 108367, 108371, 108375, 108380, 108385, 108390, 108395, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 108400, 108405, 108410, 108415, 108419, 108424, 108428, - 108433, 108437, 108442, 108447, 108453, 108458, 108464, 108468, 108473, - 108477, 108482, 108486, 108491, 108496, 108501, 108506, 108511, 108516, - 108521, 108526, 108531, 108536, 108541, 108546, 108551, 108556, 108561, - 108566, 108571, 108576, 108580, 108584, 108589, 108594, 108599, 108603, - 108607, 108611, 108615, 108620, 108625, 108630, 108635, 108639, 108643, - 108649, 108654, 108660, 108665, 108671, 108677, 108684, 108690, 108697, - 108702, 108708, 108713, 108719, 108724, 108729, 108734, 108739, 108743, - 108747, 108752, 108757, 108761, 108766, 108771, 108776, 108784, 0, 0, - 108789, 108794, 108798, 108802, 108806, 108810, 108814, 108818, 108822, - 108826, 108830, 108834, 108839, 108843, 108848, 108854, 0, 108860, - 108865, 108870, 108875, 108880, 108885, 108890, 108895, 108900, 108905, - 108911, 108917, 108923, 108929, 108935, 108941, 108947, 108953, 108959, - 108966, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108973, 108977, 108982, 108986, - 108990, 108994, 108999, 109003, 109008, 109012, 109017, 109022, 109027, - 109032, 109037, 109042, 109047, 109052, 0, 109057, 109062, 109067, - 109072, 109077, 109082, 109087, 109092, 109097, 109102, 109107, 109112, - 109116, 109120, 109125, 109130, 109135, 109140, 109144, 109148, 109152, - 109156, 109161, 109165, 109169, 109174, 109180, 109185, 109191, 109196, - 109201, 109207, 109212, 109218, 109223, 109228, 109233, 109238, 109242, - 109247, 109253, 109258, 109264, 109269, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 137345, 137351, 137357, 137363, 137369, 137375, + 137381, 137387, 137393, 137399, 137405, 137411, 137416, 137422, 137427, + 137433, 137438, 137444, 137450, 137455, 137461, 137466, 137472, 137478, + 137484, 137490, 137496, 137502, 137508, 137513, 137518, 137524, 137530, + 137536, 137542, 137548, 137554, 137560, 137566, 137572, 137578, 137584, + 137590, 137596, 137601, 137607, 137612, 137618, 137623, 137629, 137635, + 137640, 137646, 137651, 137657, 137663, 137669, 137675, 137681, 137687, + 137693, 137698, 137703, 137709, 137715, 137720, 137724, 137728, 137732, + 137736, 137740, 137744, 137748, 137752, 137756, 137761, 137766, 137771, + 137776, 137781, 137786, 137791, 137796, 137801, 137806, 137813, 137820, + 137827, 137831, 137837, 137842, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 109274, 109278, 109282, 109286, 109290, 109294, 109299, - 0, 109304, 0, 109309, 109314, 109319, 109324, 0, 109329, 109334, 109339, - 109344, 109349, 109354, 109359, 109364, 109369, 109374, 109379, 109384, - 109388, 109392, 109397, 0, 109402, 109407, 109411, 109415, 109419, - 109423, 109428, 109432, 109436, 109441, 109446, 0, 0, 0, 0, 0, 0, 109451, - 109455, 109460, 109464, 109469, 109473, 109478, 109482, 109487, 109491, - 109496, 109500, 109505, 109510, 109515, 109520, 109525, 109530, 109535, - 109540, 109545, 109550, 109555, 109560, 109565, 109570, 109575, 109580, - 109585, 109590, 109595, 109600, 109605, 109610, 109614, 109618, 109623, - 109628, 109633, 109638, 109642, 109646, 109650, 109654, 109659, 109664, - 109668, 109672, 109677, 109683, 109688, 109694, 109699, 109705, 109710, - 109716, 109721, 109727, 109732, 0, 0, 0, 0, 0, 109737, 109742, 109746, - 109750, 109754, 109758, 109762, 109766, 109770, 109774, 0, 0, 0, 0, 0, 0, - 109778, 109785, 109790, 109795, 0, 109800, 109804, 109809, 109813, - 109818, 109822, 109827, 109832, 0, 0, 109837, 109842, 0, 0, 109847, - 109852, 109857, 109861, 109866, 109871, 109876, 109881, 109886, 109891, - 109896, 109901, 109906, 109911, 109916, 109921, 109926, 109931, 109936, - 109941, 109946, 109951, 0, 109955, 109959, 109964, 109969, 109974, - 109978, 109982, 0, 109986, 109990, 0, 109995, 110000, 110005, 110010, - 110014, 0, 110018, 110022, 110027, 110032, 110038, 110043, 110049, - 110054, 110060, 110066, 0, 0, 110073, 110079, 0, 0, 110085, 110091, - 110097, 0, 0, 110102, 0, 0, 0, 0, 0, 0, 110106, 0, 0, 0, 0, 0, 110113, - 110118, 110125, 110133, 110139, 110145, 110151, 0, 0, 110158, 110164, - 110169, 110174, 110179, 110184, 110189, 0, 0, 0, 110194, 110199, 110204, - 110209, 110215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137848, 137851, 137855, + 137859, 137863, 137866, 137870, 137875, 137879, 137883, 137887, 137890, + 137894, 137899, 137903, 137907, 137911, 137914, 137918, 137923, 137928, + 137932, 137936, 137939, 137943, 137947, 137951, 137955, 137959, 137963, + 137967, 137970, 137974, 137978, 137982, 137986, 137990, 137994, 138000, + 138003, 138007, 138011, 138015, 138019, 138023, 138027, 138031, 138035, + 138039, 138044, 138049, 138055, 138059, 138063, 138067, 138071, 138075, + 138079, 138084, 138087, 138091, 138095, 138099, 138103, 138109, 138113, + 138117, 138121, 138125, 138129, 138133, 138137, 138141, 138145, 138149, + 0, 0, 0, 0, 138153, 138158, 138162, 138166, 138172, 138178, 138182, + 138187, 138192, 138197, 138202, 138206, 138211, 138216, 138221, 138225, + 138230, 138235, 138240, 138244, 138249, 138254, 138259, 138264, 138269, + 138274, 138279, 138284, 138288, 138293, 138298, 138303, 138308, 138313, + 138318, 138323, 138328, 138333, 138338, 138343, 138350, 138355, 138362, + 138367, 138372, 138377, 138382, 138387, 138392, 138397, 138402, 138407, + 138412, 138417, 138422, 138427, 138432, 0, 0, 0, 0, 0, 0, 0, 138437, + 138441, 138447, 138450, 138453, 138457, 138461, 138465, 138469, 138473, + 138477, 138481, 138487, 138493, 138499, 138505, 138511, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138517, 138521, 138525, 138531, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 138537, 138540, 138543, 138546, 138549, 138552, 138555, 138558, 138561, + 138564, 138567, 138570, 138573, 138576, 138579, 138582, 138585, 138588, + 138591, 138594, 138597, 138600, 138603, 138606, 138609, 138612, 138615, + 138618, 138621, 138624, 138627, 138630, 138633, 138636, 138639, 138642, + 138645, 138648, 138651, 138654, 138657, 138660, 138663, 138666, 138669, + 138672, 138675, 138678, 138681, 138684, 138687, 138690, 138693, 138696, + 138699, 138702, 138705, 138708, 138711, 138714, 138717, 138720, 138723, + 138726, 138729, 138732, 138735, 138738, 138741, 138744, 138747, 138750, + 138753, 138756, 138759, 138762, 138765, 138768, 138771, 138774, 138777, + 138780, 138783, 138786, 138789, 138792, 138795, 138798, 138801, 138804, + 138807, 138810, 138813, 138816, 138819, 138822, 138825, 138828, 138831, + 138834, 138837, 138840, 138843, 138846, 138849, 138852, 138855, 138858, + 138861, 138864, 138867, 138870, 138873, 138876, 138879, 138882, 138885, + 138888, 138891, 138894, 138897, 138900, 138903, 138906, 138909, 138912, + 138915, 138918, 138921, 138924, 138927, 138930, 138933, 138936, 138939, + 138942, 138945, 138948, 138951, 138954, 138957, 138960, 138963, 138966, + 138969, 138972, 138975, 138978, 138981, 138984, 138987, 138990, 138993, + 138996, 138999, 139002, 139005, 139008, 139011, 139014, 139017, 139020, + 139023, 139026, 139029, 139032, 139035, 139038, 139041, 139044, 139047, + 139050, 139053, 139056, 139059, 139062, 139065, 139068, 139071, 139074, + 139077, 139080, 139083, 139086, 139089, 139092, 139095, 139098, 139101, + 139104, 139107, 139110, 139113, 139116, 139119, 139122, 139125, 139128, + 139131, 139134, 139137, 139140, 139143, 139146, 139149, 139152, 139155, + 139158, 139161, 139164, 139167, 139170, 139173, 139176, 139179, 139182, + 139185, 139188, 139191, 139194, 139197, 139200, 139203, 139206, 139209, + 139212, 139215, 139218, 139221, 139224, 139227, 139230, 139233, 139236, + 139239, 139242, 139245, 139248, 139251, 139254, 139257, 139260, 139263, + 139266, 139269, 139272, 139275, 139278, 139281, 139284, 139287, 139290, + 139293, 139296, 139299, 139302, 139305, 139308, 139311, 139314, 139317, + 139320, 139323, 139326, 139329, 139332, 139335, 139338, 139341, 139344, + 139347, 139350, 139353, 139356, 139359, 139362, 139365, 139368, 139371, + 139374, 139377, 139380, 139383, 139386, 139389, 139392, 139395, 139398, + 139401, 139404, 139407, 139410, 139413, 139416, 139419, 139422, 139425, + 139428, 139431, 139434, 139437, 139440, 139443, 139446, 139449, 139452, + 139455, 139458, 139461, 139464, 139467, 139470, 139473, 139476, 139479, + 139482, 139485, 139488, 139491, 139494, 139497, 139500, 139503, 139506, + 139509, 139512, 139515, 139518, 139521, 139524, 139527, 139530, 139533, + 139536, 139539, 139542, 139545, 139548, 139551, 139554, 139557, 139560, + 139563, 139566, 139569, 139572, 139575, 139578, 139581, 139584, 139587, + 139590, 139593, 139596, 139599, 139602, 139605, 139608, 139611, 139614, + 139617, 139620, 139623, 139626, 139629, 139632, 139635, 139638, 139641, + 139644, 139647, 139650, 139653, 139656, 139659, 139662, 139665, 139668, + 139671, 139674, 139677, 139680, 139683, 139686, 139689, 139692, 139695, + 139698, 139701, 139704, 139707, 139710, 139713, 139716, 139719, 139722, + 139725, 139728, 139731, 139734, 139737, 139740, 139743, 139746, 139749, + 139752, 139755, 139758, 139761, 139764, 139767, 139770, 139773, 139776, + 139779, 139782, 139785, 139788, 139791, 139794, 139797, 139800, 139803, + 139806, 139809, 139812, 139815, 139818, 139821, 139824, 139827, 139830, + 139833, 139836, 139839, 139842, 139845, 139848, 139851, 139854, 139857, + 139860, 139863, 139866, 139869, 139872, 139875, 139878, 139881, 139884, + 139887, 139890, 139893, 139896, 139899, 139902, 139905, 139908, 139911, + 139914, 139917, 139920, 139923, 139926, 139929, 139932, 139935, 139938, + 139941, 139944, 139947, 139950, 139953, 139956, 139959, 139962, 139965, + 139968, 139971, 139974, 139977, 139980, 139983, 139986, 139989, 139992, + 139995, 139998, 140001, 140004, 140007, 140010, 140013, 140016, 140019, + 140022, 140025, 140028, 140031, 140034, 140037, 140040, 140043, 140046, + 140049, 140052, 140055, 140058, 140061, 140064, 140067, 140070, 140073, + 140076, 140079, 140082, 140085, 140088, 140091, 140094, 140097, 140100, + 140103, 140106, 140109, 140112, 140115, 140118, 140121, 140124, 140127, + 140130, 140133, 140136, 140139, 140142, 140145, 140148, 140151, 140154, + 140157, 140160, 140163, 140166, 140169, 140172, 140175, 140178, 140181, + 140184, 140187, 140190, 140193, 140196, 140199, 140202, 140205, 140208, + 140211, 140214, 140217, 140220, 140223, 140226, 140229, 140232, 140235, + 140238, 140241, 140244, 140247, 140250, 140253, 140256, 140259, 140262, + 140265, 140268, 140271, 140274, 140277, 140280, 140283, 140286, 140289, + 140292, 140295, 140298, 140301, 140304, 140307, 140310, 140313, 140316, + 140319, 140322, 140325, 140328, 140331, 140334, 140337, 140340, 140343, + 140346, 140349, 140352, 140355, 140358, 140361, 140364, 140367, 140370, + 140373, 140376, 140379, 140382, 140385, 140388, 140391, 140394, 140397, + 140400, 140403, 140406, 140409, 140412, 140415, 140418, 140421, 140424, + 140427, 140430, 140433, 140436, 140439, 140442, 140445, 140448, 140451, + 140454, 140457, 140460, 140463, 140466, 140469, 140472, 140475, 140478, + 140481, 140484, 140487, 140490, 140493, 140496, 140499, 140502, 140505, + 140508, 140511, 140514, 140517, 140520, 140523, 140526, 140529, 140532, + 140535, 140538, 140541, 140544, 140547, 140550, 140553, 140556, 140559, + 140562, 140565, 140568, 140571, 140574, 140577, 140580, 140583, 140586, + 140589, 140592, 140595, 140598, 140601, 140604, 140607, 140610, 140613, + 140616, 140619, 140622, 140625, 140628, 140631, 140634, 140637, 140640, + 140643, 140646, 140649, 140652, 140655, 140658, 140661, 140664, 140667, + 140670, 140673, 140676, 140679, 140682, 140685, 140688, 140691, 140694, + 140697, 140700, 140703, 140706, 140709, 140712, 140715, 140718, 140721, + 140724, 140727, 140730, 140733, 140736, 140739, 140742, 140745, 140748, + 140751, 140754, 140757, 140760, 140763, 140766, 140769, 140772, 140775, + 140778, 140781, 140784, 140787, 140790, 140793, 140796, 140799, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140802, 140807, 140813, 140817, 140821, + 140825, 140829, 140833, 140837, 140841, 140845, 140849, 140853, 140857, + 140861, 140865, 140869, 140873, 140877, 140881, 140885, 140889, 140893, + 140897, 140901, 140905, 140909, 140913, 140917, 140921, 140925, 140929, + 140933, 140937, 140941, 140945, 140949, 140953, 140957, 140961, 140965, + 140969, 140973, 140977, 140981, 140985, 140989, 140993, 140997, 141001, + 141005, 141009, 141013, 141017, 141021, 141025, 141029, 141033, 141037, + 141041, 141045, 141049, 141053, 141057, 141061, 141065, 141069, 141073, + 141077, 141081, 141085, 141089, 141093, 141097, 141101, 141105, 141109, + 141113, 141117, 141121, 141125, 141129, 141133, 141137, 141141, 141145, + 141149, 141153, 141157, 141161, 141165, 141169, 141173, 141177, 141181, + 141185, 141189, 141193, 141197, 141201, 141205, 141209, 141213, 141217, + 141221, 141225, 141229, 141233, 141237, 141241, 141245, 141249, 141253, + 141257, 141261, 141265, 141269, 141273, 141277, 141281, 141285, 141289, + 141293, 141297, 141301, 141305, 141309, 141313, 141317, 141321, 141325, + 141329, 141333, 141337, 141341, 141345, 141349, 141353, 141357, 141361, + 141365, 141369, 141373, 141377, 141381, 141385, 141389, 141393, 141397, + 141401, 141405, 141409, 141413, 141417, 141421, 141425, 141429, 141433, + 141437, 141441, 141445, 141449, 141453, 141457, 141461, 141465, 141469, + 141473, 141477, 141481, 141485, 141489, 141493, 141497, 141501, 141505, + 141509, 141513, 141517, 141521, 141525, 141529, 141533, 141537, 141541, + 141545, 141549, 141553, 141557, 141561, 141565, 141569, 141573, 141577, + 141581, 141585, 141589, 141593, 141597, 141601, 141605, 141609, 141613, + 141617, 141621, 141625, 141629, 141633, 141637, 141641, 141645, 141649, + 141653, 141657, 141661, 141665, 141669, 141673, 141677, 141681, 141685, + 141689, 141693, 141697, 141701, 141705, 141709, 141713, 141717, 141721, + 141725, 141729, 141733, 141737, 141741, 141745, 141749, 141753, 141757, + 141761, 141765, 141769, 141773, 141777, 141781, 141785, 141789, 141793, + 141797, 141801, 141805, 141809, 141813, 141817, 141821, 141825, 141829, + 141833, 141837, 141841, 141845, 141849, 141853, 141857, 141861, 141865, + 141869, 141873, 141877, 141881, 141885, 141889, 141893, 141897, 141901, + 141905, 141909, 141913, 141917, 141921, 141925, 141929, 141933, 141937, + 141941, 141945, 141949, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 110220, 110224, 110229, 110233, 110238, 110242, 110247, 110252, 110258, - 110263, 110269, 110273, 110278, 110282, 110287, 110291, 110296, 110301, - 110306, 110311, 110316, 110321, 110326, 110331, 110336, 110341, 110346, - 110351, 110356, 110361, 110366, 110371, 110376, 110381, 110386, 110391, - 110395, 110400, 110404, 110409, 110414, 110419, 110423, 110428, 110432, - 110436, 110441, 110445, 110450, 110455, 110460, 110465, 110469, 110473, - 110479, 110484, 110490, 110495, 110501, 110507, 110514, 110520, 110527, - 110532, 110538, 110543, 110549, 110554, 110559, 110564, 110569, 110574, - 110579, 110585, 110589, 110593, 110597, 110602, 110606, 110612, 110617, - 110622, 110626, 110630, 110634, 110638, 110642, 110646, 110650, 110654, - 0, 110658, 0, 110663, 110668, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110673, 110677, - 110681, 110686, 110690, 110695, 110699, 110704, 110709, 110715, 110720, - 110726, 110730, 110735, 110739, 110744, 110748, 110753, 110758, 110763, - 110768, 110773, 110778, 110783, 110788, 110793, 110798, 110803, 110808, - 110813, 110818, 110823, 110828, 110833, 110838, 110842, 110846, 110851, - 110856, 110861, 110865, 110869, 110873, 110877, 110882, 110887, 110892, - 110896, 110900, 110906, 110911, 110917, 110922, 110928, 110934, 110941, - 110947, 110954, 110959, 110966, 110972, 110977, 110984, 110990, 110995, - 111000, 111005, 111010, 111015, 111020, 111024, 111029, 0, 0, 0, 0, 0, 0, - 0, 0, 111033, 111038, 111042, 111046, 111050, 111054, 111058, 111062, - 111066, 111070, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 141953, 141958, 141963, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 141968, 141973, 141978, 141983, 0, 0, 0, 0, + 0, 0, 0, 0, 141988, 141991, 141994, 141997, 142000, 142003, 142006, + 142009, 142012, 142015, 142018, 142021, 142024, 142027, 142030, 142033, + 142036, 142039, 142042, 142045, 142048, 142051, 142054, 142057, 142060, + 142063, 142066, 142069, 142072, 142075, 142078, 142081, 142084, 142087, + 142090, 142093, 142096, 142099, 142102, 142105, 142108, 142111, 142114, + 142117, 142120, 142123, 142126, 142129, 142132, 142135, 142138, 142141, + 142144, 142147, 142150, 142153, 142156, 142159, 142162, 142165, 142168, + 142171, 142174, 142177, 142180, 142183, 142186, 142189, 142192, 142195, + 142198, 142201, 142204, 142207, 142210, 142213, 142216, 142219, 142222, + 142225, 142228, 142231, 142234, 142237, 142240, 142243, 142246, 142249, + 142252, 142255, 142258, 142261, 142264, 142267, 142270, 142273, 142276, + 142279, 142282, 142285, 142288, 142291, 142294, 142297, 142300, 142303, + 142306, 142309, 142312, 142315, 142318, 142321, 142324, 142327, 142330, + 142333, 142336, 142339, 142342, 142345, 142348, 142351, 142354, 142357, + 142360, 142363, 142366, 142369, 142372, 142375, 142378, 142381, 142384, + 142387, 142390, 142393, 142396, 142399, 142402, 142405, 142408, 142411, + 142414, 142417, 142420, 142423, 142426, 142429, 142432, 142435, 142438, + 142441, 142444, 142447, 142450, 142453, 142456, 142459, 142462, 142465, + 142468, 142471, 142474, 142477, 142480, 142483, 142486, 142489, 142492, + 142495, 142498, 142501, 142504, 142507, 142510, 142513, 142516, 142519, + 142522, 142525, 142528, 142531, 142534, 142537, 142540, 142543, 142546, + 142549, 142552, 142555, 142558, 142561, 142564, 142567, 142570, 142573, + 142576, 142579, 142582, 142585, 142588, 142591, 142594, 142597, 142600, + 142603, 142606, 142609, 142612, 142615, 142618, 142621, 142624, 142627, + 142630, 142633, 142636, 142639, 142642, 142645, 142648, 142651, 142654, + 142657, 142660, 142663, 142666, 142669, 142672, 142675, 142678, 142681, + 142684, 142687, 142690, 142693, 142696, 142699, 142702, 142705, 142708, + 142711, 142714, 142717, 142720, 142723, 142726, 142729, 142732, 142735, + 142738, 142741, 142744, 142747, 142750, 142753, 142756, 142759, 142762, + 142765, 142768, 142771, 142774, 142777, 142780, 142783, 142786, 142789, + 142792, 142795, 142798, 142801, 142804, 142807, 142810, 142813, 142816, + 142819, 142822, 142825, 142828, 142831, 142834, 142837, 142840, 142843, + 142846, 142849, 142852, 142855, 142858, 142861, 142864, 142867, 142870, + 142873, 142876, 142879, 142882, 142885, 142888, 142891, 142894, 142897, + 142900, 142903, 142906, 142909, 142912, 142915, 142918, 142921, 142924, + 142927, 142930, 142933, 142936, 142939, 142942, 142945, 142948, 142951, + 142954, 142957, 142960, 142963, 142966, 142969, 142972, 142975, 142978, + 142981, 142984, 142987, 142990, 142993, 142996, 142999, 143002, 143005, + 143008, 143011, 143014, 143017, 143020, 143023, 143026, 143029, 143032, + 143035, 143038, 143041, 143044, 143047, 143050, 143053, 143056, 143059, + 143062, 143065, 143068, 143071, 143074, 143077, 143080, 143083, 143086, + 143089, 143092, 143095, 143098, 143101, 143104, 143107, 143110, 143113, + 143116, 143119, 143122, 143125, 143128, 143131, 143134, 143137, 143140, + 143143, 143146, 143149, 143152, 143155, 143158, 143161, 143164, 143167, + 143170, 143173, 0, 0, 0, 0, 143176, 143180, 143184, 143188, 143192, + 143196, 143200, 143203, 143207, 143211, 143215, 143219, 143222, 143228, + 143234, 143240, 143246, 143252, 143256, 143262, 143266, 143270, 143276, + 143280, 143284, 143288, 143292, 143296, 143300, 143304, 143310, 143316, + 143322, 143328, 143335, 143342, 143349, 143360, 143367, 143374, 143380, + 143386, 143392, 143398, 143406, 143414, 143422, 143430, 143439, 143445, + 143453, 143459, 143466, 143472, 143479, 143485, 143493, 143497, 143501, + 143506, 143512, 143518, 143526, 143534, 143540, 143547, 143550, 143556, + 143560, 143563, 143567, 143570, 143573, 143577, 143582, 143586, 143590, + 143596, 143601, 143607, 143611, 143615, 143618, 143622, 143626, 143631, + 143635, 143640, 143644, 143649, 143653, 143657, 143661, 143665, 143669, + 143673, 143677, 143681, 143686, 143691, 143696, 143701, 143707, 143713, + 143719, 143725, 143731, 0, 0, 0, 0, 0, 143736, 143744, 143753, 143761, + 143768, 143776, 143783, 143790, 143799, 143806, 143813, 143821, 143829, + 0, 0, 0, 143837, 143842, 143849, 143855, 143862, 143868, 143874, 143880, + 143886, 0, 0, 0, 0, 0, 0, 0, 143892, 143897, 143904, 143910, 143917, + 143923, 143929, 143935, 143941, 143947, 0, 0, 143952, 143958, 143964, + 143967, 143976, 143983, 143991, 143998, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 144005, 144010, 144015, 144020, 144027, + 144034, 144041, 144048, 144053, 144058, 144063, 144068, 144075, 144080, + 144087, 144094, 144099, 144104, 144109, 144116, 144121, 144126, 144133, + 144140, 144145, 144150, 144155, 144162, 144169, 144176, 144181, 144186, + 144193, 144200, 144207, 144214, 144219, 144224, 144229, 144236, 144241, + 144246, 144251, 144258, 144267, 144274, 144279, 144284, 144289, 144294, + 144299, 144304, 144313, 144320, 144325, 144332, 144339, 144344, 144349, + 144354, 144361, 144366, 144373, 144380, 144385, 144390, 144395, 144402, + 144409, 144414, 144419, 144426, 144433, 144440, 144445, 144450, 144455, + 144460, 144467, 144476, 144485, 144490, 144497, 144506, 144511, 144516, + 144521, 144526, 144533, 144540, 144547, 144554, 144559, 144564, 144569, + 144576, 144583, 144590, 144595, 144600, 144607, 144612, 144619, 144624, + 144631, 144636, 144643, 144650, 144655, 144660, 144665, 144670, 144675, + 144680, 144685, 144690, 144695, 144702, 144709, 144716, 144723, 144730, + 144739, 144744, 144749, 144756, 144763, 144768, 144775, 144782, 144789, + 144796, 144803, 144810, 144815, 144820, 144825, 144830, 144835, 144844, + 144853, 144862, 144871, 144880, 144889, 144898, 144907, 144912, 144923, + 144934, 144943, 144948, 144953, 144958, 144963, 144972, 144979, 144986, + 144993, 145000, 145007, 145014, 145023, 145032, 145043, 145052, 145063, + 145072, 145079, 145088, 145099, 145108, 145117, 145126, 145135, 145142, + 145149, 145156, 145165, 145174, 145185, 145194, 145203, 145214, 145219, + 145224, 145235, 145243, 145252, 145261, 145270, 145281, 145290, 145299, + 145310, 145321, 145332, 145343, 145354, 145365, 145372, 145379, 145386, + 145393, 145404, 145413, 145420, 145427, 145434, 145445, 145456, 145467, + 145478, 145489, 145500, 145511, 145522, 145529, 145536, 145545, 145554, + 145561, 145568, 145575, 145584, 145593, 145602, 145609, 145618, 145627, + 145636, 145643, 145650, 145655, 145661, 145668, 145675, 145682, 145689, + 145696, 145703, 145712, 145721, 145730, 145739, 145746, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 145755, 145761, 145766, 145771, 145778, 145784, 145790, + 145796, 145802, 145808, 145814, 145820, 145824, 145828, 145834, 145840, + 145846, 145850, 145855, 145860, 145864, 145868, 145871, 145877, 145883, + 145889, 145895, 145901, 145907, 145913, 145919, 145925, 145935, 145945, + 145951, 145957, 145967, 145977, 145983, 0, 0, 145989, 145997, 146002, + 146007, 146013, 146019, 146025, 146031, 146037, 146043, 146050, 146057, + 146063, 146069, 146075, 146081, 146087, 146093, 146099, 146105, 146110, + 146116, 146122, 146128, 146134, 146140, 146149, 146155, 146160, 146168, + 146175, 146182, 146191, 146200, 146209, 146218, 146227, 146236, 146245, + 146254, 146264, 146274, 146282, 146290, 146299, 146308, 146314, 146320, + 146326, 146332, 146340, 146348, 146352, 146358, 146363, 146369, 146375, + 146381, 146387, 146393, 146402, 146407, 146414, 146419, 146424, 146429, + 146435, 146441, 146447, 146454, 146459, 146464, 146469, 146474, 146479, + 146485, 146491, 146497, 146503, 146509, 146515, 146521, 146527, 146532, + 146537, 146542, 146547, 146552, 146557, 146562, 146567, 146573, 146579, + 146584, 146589, 146594, 146599, 146604, 146610, 146617, 146621, 146625, + 146629, 146633, 146637, 146641, 146645, 146649, 146657, 146667, 146671, + 146675, 146681, 146687, 146693, 146699, 146705, 146711, 146717, 146723, + 146729, 146735, 146741, 146747, 146753, 146759, 146763, 146767, 146774, + 146780, 146786, 146792, 146797, 146804, 146809, 146815, 146821, 146827, + 146833, 146838, 146842, 146848, 146852, 146856, 146860, 146866, 146872, + 146876, 146882, 146888, 146894, 146900, 146906, 146914, 146922, 146928, + 146934, 146940, 146946, 146958, 146970, 146984, 146996, 147008, 147022, + 147036, 147050, 147054, 147062, 147070, 147075, 147079, 147083, 147087, + 147091, 147095, 147099, 147103, 147109, 147115, 147121, 147127, 147135, + 147144, 147151, 147158, 147166, 147173, 147185, 147197, 147209, 147221, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 147228, 147235, 147242, 147249, 147256, 147263, 147270, 147277, 147284, + 147291, 147298, 147305, 147312, 147319, 147326, 147333, 147340, 147347, + 147354, 147361, 147368, 147375, 147382, 147389, 147396, 147403, 147410, + 147417, 147424, 147431, 147438, 147445, 147452, 147459, 147466, 147473, + 147480, 147487, 147494, 147501, 147508, 147515, 147522, 147529, 147536, + 147543, 147550, 147557, 147564, 147571, 147578, 147585, 147592, 147599, + 147606, 147613, 147620, 147627, 147634, 147641, 147648, 147655, 147662, + 147669, 147676, 147683, 147690, 147695, 147700, 147705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 111074, 111078, 111083, 111087, 111092, 111096, 111101, 111106, - 111112, 111117, 111123, 111127, 111132, 111136, 111141, 111145, 111150, - 111155, 111160, 111165, 111170, 111175, 111180, 111185, 111190, 111195, - 111200, 111205, 111210, 111215, 111220, 111225, 111230, 111235, 111239, - 111243, 111248, 111253, 111258, 111262, 111266, 111270, 111274, 111279, - 111284, 111289, 111293, 111297, 111303, 111308, 111314, 111319, 111325, - 111331, 0, 0, 111338, 111343, 111349, 111354, 111360, 111365, 111370, - 111375, 111380, 111385, 111390, 111394, 111399, 111405, 111410, 111416, - 111422, 111428, 111436, 111449, 111462, 111475, 111489, 111504, 111512, - 111523, 111532, 111542, 111552, 111562, 111573, 111585, 111598, 111606, - 111614, 111623, 111629, 111636, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111644, - 111648, 111653, 111657, 111662, 111666, 111671, 111676, 111682, 111687, - 111693, 111697, 111702, 111706, 111711, 111715, 111720, 111725, 111730, - 111735, 111740, 111745, 111750, 111755, 111760, 111765, 111770, 111775, - 111780, 111785, 111790, 111795, 111800, 111805, 111809, 111813, 111818, - 111823, 111828, 111832, 111836, 111840, 111844, 111849, 111854, 111859, - 111863, 111867, 111872, 111878, 111883, 111889, 111894, 111900, 111906, - 111913, 111919, 111926, 111931, 111937, 111942, 111948, 111953, 111958, - 111963, 111968, 111972, 111977, 111982, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 111987, 111992, 111996, 112000, 112004, 112008, 112012, 112016, 112020, - 112024, 0, 0, 0, 0, 0, 0, 112028, 112034, 112039, 112046, 112054, 112061, - 112069, 112078, 112083, 112092, 112097, 112105, 112114, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112125, 112129, 112134, 112138, - 112143, 112147, 112152, 112156, 112161, 112165, 112170, 112174, 112179, - 112184, 112189, 112194, 112199, 112204, 112209, 112214, 112219, 112224, - 112229, 112234, 112239, 112244, 112249, 112254, 112259, 112264, 112268, - 112272, 112277, 112282, 112287, 112291, 112295, 112299, 112303, 112308, - 112313, 112317, 112321, 112326, 112331, 112336, 112342, 112347, 112353, - 112358, 112364, 112369, 112375, 112380, 112386, 112391, 0, 0, 0, 0, 0, 0, - 0, 0, 112396, 112401, 112405, 112409, 112413, 112417, 112421, 112425, - 112429, 112433, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112437, 112441, 112446, 112451, 112455, - 112460, 112467, 112471, 112476, 112481, 112485, 112490, 112495, 112500, - 112504, 112508, 112512, 112517, 112521, 112525, 112530, 112535, 112540, - 112547, 112552, 112557, 112562, 0, 0, 112569, 112576, 112583, 112592, - 112597, 112603, 112608, 112614, 112619, 112625, 112630, 112636, 112641, - 112647, 112653, 0, 0, 0, 0, 112658, 112663, 112667, 112671, 112675, - 112679, 112683, 112687, 112691, 112695, 112699, 112704, 112709, 112715, - 112720, 112725, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 147709, 147715, 147720, 147725, 147730, 147735, 147740, + 147745, 147750, 147755, 147760, 147766, 147772, 147778, 147784, 147790, + 147796, 147802, 147808, 147814, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 147820, 147825, 147832, 147839, 147846, 147853, 147858, 147863, 147870, + 147875, 147880, 147887, 147892, 147897, 147902, 147909, 147918, 147923, + 147928, 147933, 147938, 147943, 147948, 147955, 147960, 147965, 147970, + 147975, 147980, 147985, 147990, 147995, 148000, 148005, 148010, 148015, + 148021, 148026, 148031, 148036, 148041, 148046, 148051, 148056, 148061, + 148066, 148075, 148080, 148089, 148094, 148099, 148104, 148109, 148114, + 148119, 148124, 148133, 148138, 148143, 148148, 148153, 148158, 148165, + 148170, 148177, 148182, 148187, 148192, 148197, 148202, 148207, 148212, + 148217, 148222, 148227, 148232, 148237, 148242, 148247, 148252, 148257, + 148262, 148267, 148272, 148281, 148286, 148291, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 148296, 148304, 148312, 148320, 148328, 148336, 148344, 148352, + 148360, 148368, 148376, 148384, 148392, 148400, 148408, 148416, 148424, + 148432, 148440, 148445, 148450, 148455, 148460, 148465, 148469, 0, 0, 0, + 0, 0, 0, 0, 148473, 148477, 148482, 148487, 148492, 148496, 148501, + 148506, 148511, 148515, 148520, 148525, 148529, 148534, 148539, 148543, + 148548, 148553, 148557, 148562, 148567, 148571, 148576, 148581, 148586, + 148591, 148596, 148600, 148605, 148610, 148615, 148619, 148624, 148629, + 148634, 148638, 148643, 148648, 148652, 148657, 148662, 148666, 148671, + 148676, 148680, 148685, 148690, 148694, 148699, 148704, 148709, 148714, + 148719, 148723, 148728, 148733, 148738, 148742, 148747, 148752, 148757, + 148761, 148766, 148771, 148775, 148780, 148785, 148789, 148794, 148799, + 148803, 148808, 148813, 148817, 148822, 148827, 148832, 148837, 148842, + 148846, 148851, 148856, 148861, 148865, 148870, 0, 148875, 148879, + 148884, 148889, 148893, 148898, 148903, 148907, 148912, 148917, 148921, + 148926, 148931, 148935, 148940, 148945, 148950, 148955, 148960, 148965, + 148971, 148977, 148983, 148988, 148994, 149000, 149006, 149011, 149017, + 149023, 149028, 149034, 149040, 149045, 149051, 149057, 149062, 149068, + 149074, 149079, 149085, 149091, 149097, 149103, 149109, 149114, 149120, + 149126, 149132, 149137, 149143, 149149, 149155, 149160, 149166, 149172, + 149177, 149183, 149189, 149194, 149200, 149206, 149211, 149217, 149223, + 149228, 149234, 149240, 149246, 149252, 149258, 0, 149262, 149267, 0, 0, + 149272, 0, 0, 149277, 149282, 0, 0, 149287, 149292, 149296, 149301, 0, + 149306, 149311, 149316, 149320, 149325, 149330, 149335, 149340, 149345, + 149349, 149354, 149359, 0, 149364, 0, 149369, 149374, 149378, 149383, + 149388, 149392, 149397, 0, 149402, 149407, 149412, 149416, 149421, + 149426, 149430, 149435, 149440, 149445, 149450, 149455, 149460, 149466, + 149472, 149478, 149483, 149489, 149495, 149501, 149506, 149512, 149518, + 149523, 149529, 149535, 149540, 149546, 149552, 149557, 149563, 149569, + 149574, 149580, 149586, 149592, 149598, 149604, 149609, 149615, 149621, + 149627, 149632, 149638, 149644, 149650, 149655, 149661, 149667, 149672, + 149678, 149684, 149689, 149695, 149701, 149706, 149712, 149718, 149723, + 149729, 149735, 149741, 149747, 149753, 149757, 0, 149762, 149767, + 149771, 149776, 0, 0, 149781, 149786, 149791, 149795, 149800, 149805, + 149809, 149814, 0, 149819, 149824, 149829, 149833, 149838, 149843, + 149848, 0, 149853, 149857, 149862, 149867, 149872, 149876, 149881, + 149886, 149891, 149895, 149900, 149905, 149909, 149914, 149919, 149923, + 149928, 149933, 149937, 149942, 149947, 149951, 149956, 149961, 149966, + 149971, 149976, 149981, 0, 149987, 149993, 149998, 150004, 0, 150010, + 150015, 150021, 150027, 150032, 0, 150038, 0, 0, 0, 150043, 150049, + 150055, 150060, 150066, 150072, 150078, 0, 150084, 150089, 150095, + 150101, 150107, 150112, 150118, 150124, 150130, 150135, 150141, 150147, + 150152, 150158, 150164, 150169, 150175, 150181, 150186, 150192, 150198, + 150203, 150209, 150215, 150221, 150227, 150233, 150238, 150244, 150250, + 150256, 150261, 150267, 150273, 150279, 150284, 150290, 150296, 150301, + 150307, 150313, 150318, 150324, 150330, 150335, 150341, 150347, 150352, + 150358, 150364, 150370, 150376, 150382, 150387, 150393, 150399, 150405, + 150410, 150416, 150422, 150428, 150433, 150439, 150445, 150450, 150456, + 150462, 150467, 150473, 150479, 150484, 150490, 150496, 150501, 150507, + 150513, 150519, 150525, 150531, 150535, 150540, 150545, 150550, 150554, + 150559, 150564, 150569, 150573, 150578, 150583, 150587, 150592, 150597, + 150601, 150606, 150611, 150615, 150620, 150625, 150629, 150634, 150639, + 150644, 150649, 150654, 150658, 150663, 150668, 150673, 150677, 150682, + 150687, 150692, 150696, 150701, 150706, 150710, 150715, 150720, 150724, + 150729, 150734, 150738, 150743, 150748, 150752, 150757, 150762, 150767, + 150772, 150777, 150782, 150788, 150794, 150800, 150805, 150811, 150817, + 150823, 150828, 150834, 150840, 150845, 150851, 150857, 150862, 150868, + 150874, 150879, 150885, 150891, 150896, 150902, 150908, 150914, 150920, + 150926, 150931, 150937, 150943, 150949, 150954, 150960, 150966, 150972, + 150977, 150983, 150989, 150994, 151000, 151006, 151011, 151017, 151023, + 151028, 151034, 151040, 151045, 151051, 151057, 151063, 151069, 151075, + 151080, 151086, 151092, 151098, 151103, 151109, 151115, 151121, 151126, + 151132, 151138, 151143, 151149, 151155, 151160, 151166, 151172, 151177, + 151183, 151189, 151194, 151200, 151206, 151212, 151218, 151224, 151229, + 151235, 151241, 151247, 151252, 151258, 151264, 151270, 151275, 151281, + 151287, 151292, 151298, 151304, 151309, 151315, 151321, 151326, 151332, + 151338, 151343, 151349, 151355, 151361, 151367, 151373, 151379, 151386, + 151393, 151400, 151406, 151413, 151420, 151427, 151433, 151440, 151447, + 151453, 151460, 151467, 151473, 151480, 151487, 151493, 151500, 151507, + 151513, 151520, 151527, 151534, 151541, 151548, 151554, 151561, 151568, + 151575, 151581, 151588, 151595, 151602, 151608, 151615, 151622, 151628, + 151635, 151642, 151648, 151655, 151662, 151668, 151675, 151682, 151688, + 151695, 151702, 151709, 151716, 151723, 151728, 151734, 151740, 151746, + 151751, 151757, 151763, 151769, 151774, 151780, 151786, 151791, 151797, + 151803, 151808, 151814, 151820, 151825, 151831, 151837, 151842, 151848, + 151854, 151860, 151866, 151872, 151877, 151883, 151889, 151895, 151900, + 151906, 151912, 151918, 151923, 151929, 151935, 151940, 151946, 151952, + 151957, 151963, 151969, 151974, 151980, 151986, 151991, 151997, 152003, + 152009, 152015, 152021, 152027, 0, 0, 152034, 152039, 152044, 152049, + 152054, 152059, 152064, 152069, 152074, 152079, 152084, 152089, 152094, + 152099, 152104, 152109, 152114, 152119, 152125, 152130, 152135, 152140, + 152145, 152150, 152155, 152160, 152164, 152169, 152174, 152179, 152184, + 152189, 152194, 152199, 152204, 152209, 152214, 152219, 152224, 152229, + 152234, 152239, 152244, 152249, 152255, 152260, 152265, 152270, 152275, + 152280, 152285, 152290, 152296, 152301, 152306, 152311, 152316, 152321, + 152326, 152331, 152336, 152341, 152346, 152351, 152356, 152361, 152366, + 152371, 152376, 152381, 152386, 152391, 152396, 152401, 152406, 152411, + 152417, 152422, 152427, 152432, 152437, 152442, 152447, 152452, 152456, + 152461, 152466, 152471, 152476, 152481, 152486, 152491, 152496, 152501, + 152506, 152511, 152516, 152521, 152526, 152531, 152536, 152541, 152547, + 152552, 152557, 152562, 152567, 152572, 152577, 152582, 152588, 152593, + 152598, 152603, 152608, 152613, 152618, 152624, 152630, 152636, 152642, + 152648, 152654, 152660, 152666, 152672, 152678, 152684, 152690, 152696, + 152702, 152708, 152714, 152720, 152727, 152733, 152739, 152745, 152751, + 152757, 152763, 152769, 152774, 152780, 152786, 152792, 152798, 152804, + 152810, 152816, 152822, 152828, 152834, 152840, 152846, 152852, 152858, + 152864, 152870, 152876, 152883, 152889, 152895, 152901, 152907, 152913, + 152919, 152925, 152932, 152938, 152944, 152950, 152956, 152962, 152968, + 152974, 152980, 152986, 152992, 152998, 153004, 153010, 153016, 153022, + 153028, 153034, 153040, 153046, 153052, 153058, 153064, 153070, 153077, + 153083, 153089, 153095, 153101, 153107, 153113, 153119, 153124, 153130, + 153136, 153142, 153148, 153154, 153160, 153166, 153172, 153178, 153184, + 153190, 153196, 153202, 153208, 153214, 153220, 153226, 153233, 153239, + 153245, 153251, 153257, 153263, 153269, 153275, 153282, 153288, 153294, + 153300, 153306, 153312, 153318, 153325, 153332, 153339, 153346, 153353, + 153360, 153367, 153374, 153381, 153388, 153395, 153402, 153409, 153416, + 153423, 153430, 153437, 153445, 153452, 153459, 153466, 153473, 153480, + 153487, 153494, 153500, 153507, 153514, 153521, 153528, 153535, 153542, + 153549, 153556, 153563, 153570, 153577, 153584, 153591, 153598, 153605, + 153612, 153619, 153627, 153634, 153641, 153648, 153655, 153662, 153669, + 153676, 153684, 153691, 153698, 153705, 153712, 153719, 153726, 153731, + 0, 0, 153736, 153741, 153745, 153749, 153753, 153757, 153761, 153765, + 153769, 153773, 153777, 153783, 153788, 153793, 153798, 153803, 153808, + 153813, 153818, 153823, 153828, 153833, 153837, 153841, 153845, 153849, + 153853, 153857, 153861, 153865, 153869, 153875, 153880, 153885, 153890, + 153895, 153900, 153905, 153910, 153915, 153920, 153926, 153931, 153936, + 153941, 153946, 153951, 153956, 153961, 153966, 153971, 153975, 153980, + 153985, 153990, 153995, 154000, 154005, 154011, 154019, 154026, 154031, + 154036, 154043, 154049, 154054, 154060, 154066, 154074, 154080, 154087, + 154095, 154101, 154110, 154119, 154127, 154135, 154141, 154148, 154156, + 154164, 154170, 154177, 154186, 154195, 154202, 154213, 154223, 154233, + 154243, 154253, 154260, 154267, 154274, 154281, 154290, 154299, 154310, + 154321, 154330, 154339, 154350, 154359, 154368, 154379, 154388, 154397, + 154405, 154413, 154424, 154435, 154443, 154452, 154461, 154468, 154479, + 154490, 154499, 154508, 154515, 154524, 154533, 154542, 154553, 154562, + 154572, 154581, 154590, 154601, 154614, 154629, 154640, 154653, 154665, + 154674, 154685, 154696, 154705, 154716, 154730, 154745, 154748, 154757, + 154762, 154768, 154776, 154782, 154788, 154797, 154804, 154814, 154826, + 154833, 154836, 154842, 154849, 154855, 154860, 154863, 154868, 154871, + 154878, 154884, 154892, 154899, 154906, 154912, 154917, 154920, 154923, + 154926, 154932, 154939, 154945, 154950, 154957, 154960, 154965, 154972, + 154978, 154986, 154993, 155003, 155012, 155015, 155021, 155028, 155035, + 155042, 155047, 155055, 155063, 155072, 155078, 155087, 155096, 155105, + 155111, 155120, 155127, 155134, 155141, 155149, 155155, 155163, 155169, + 155176, 155183, 155191, 155202, 155212, 155218, 155225, 155232, 155239, + 155245, 155252, 155259, 155264, 155271, 155279, 155288, 155294, 155306, + 155317, 155323, 155331, 155337, 155344, 155351, 155358, 155364, 155371, + 155380, 155386, 155392, 155399, 155406, 155414, 155424, 155434, 155444, + 155454, 155462, 155470, 155480, 155488, 155493, 155498, 155503, 155509, + 155516, 155523, 155529, 155535, 155540, 155547, 155555, 155565, 155573, + 155581, 155591, 155601, 155609, 155619, 155629, 155641, 155653, 155665, + 155675, 155681, 155687, 155694, 155703, 155712, 155721, 155730, 155740, + 155749, 155758, 155767, 155772, 155778, 155787, 155797, 155806, 155812, + 155818, 155825, 155832, 155839, 155845, 155852, 155859, 155866, 155872, + 155876, 155881, 155888, 155895, 155902, 155907, 155915, 155923, 155932, + 155940, 155947, 155955, 155964, 155974, 155977, 155981, 155986, 155991, + 155996, 156001, 156006, 156011, 156016, 156021, 156026, 156031, 156036, + 156041, 156046, 156051, 156056, 156061, 156066, 156073, 156079, 156086, + 156092, 156097, 156104, 156110, 156117, 156123, 156128, 156135, 156142, + 156149, 156155, 156161, 156170, 156179, 156190, 156197, 156204, 156213, + 156222, 156231, 156240, 156249, 156255, 156263, 156269, 156279, 156284, + 156293, 156302, 156309, 156320, 156327, 156334, 156341, 156348, 156355, + 156362, 156369, 156376, 156383, 156390, 156396, 156402, 156408, 156415, + 156422, 156429, 156436, 156443, 156450, 156457, 156464, 156471, 156478, + 156485, 156492, 156497, 156506, 156515, 156524, 156531, 156538, 156545, + 156552, 156559, 156566, 156573, 156580, 156589, 156598, 156607, 156616, + 156625, 156634, 156643, 156652, 156661, 156670, 156679, 156688, 156697, + 156703, 156711, 156717, 156727, 156732, 156741, 156750, 156759, 156770, + 156775, 156782, 156789, 156796, 156801, 156807, 156813, 156819, 156826, + 156833, 156840, 156847, 156854, 156861, 156868, 156875, 156882, 156889, + 156896, 156903, 156908, 156917, 156926, 156935, 156944, 156953, 156962, + 156971, 156980, 156991, 157002, 157009, 157016, 157023, 157030, 157037, + 157044, 157052, 157062, 157072, 157082, 157093, 157104, 157115, 157124, + 157133, 157142, 157147, 157152, 157157, 157162, 157173, 157184, 157195, + 157206, 157217, 157227, 157238, 157247, 157256, 157265, 157274, 157283, + 157291, 157300, 157311, 157322, 157333, 157344, 157355, 157367, 157380, + 157392, 157405, 157417, 157430, 157442, 157455, 157466, 157477, 157486, + 157494, 157503, 157514, 157525, 157537, 157550, 157564, 157579, 157591, + 157604, 157616, 157629, 157640, 157651, 157660, 157668, 157677, 157684, + 157691, 157698, 157705, 157712, 157719, 157726, 157733, 157740, 157747, + 157752, 157757, 157762, 157769, 157779, 157790, 157800, 157811, 157825, + 157840, 157855, 157869, 157884, 157899, 157910, 157921, 157934, 157947, + 157956, 157965, 157978, 157991, 157998, 158005, 158010, 158015, 158020, + 158025, 158030, 158037, 158046, 158051, 158054, 158059, 158066, 158073, + 158080, 158087, 158094, 158101, 158114, 158128, 158143, 158150, 158157, + 158164, 158173, 158181, 158189, 158198, 158203, 158208, 158213, 158218, + 158223, 158228, 158235, 158242, 158248, 158255, 158261, 158268, 158273, + 158278, 158283, 158288, 158293, 158300, 158307, 158312, 158319, 158326, + 158331, 158336, 158341, 158346, 158351, 158356, 158363, 158370, 158377, + 158380, 158385, 158390, 158395, 158400, 158407, 158414, 158422, 158430, + 158435, 158440, 158447, 158454, 158461, 158466, 158473, 158480, 158485, + 158492, 158499, 158505, 158511, 158517, 158523, 158531, 158539, 158545, + 158553, 158561, 158566, 158573, 158580, 158585, 158592, 158599, 158606, + 158614, 158622, 158627, 158634, 158641, 158650, 158657, 158666, 158677, + 158686, 158695, 158704, 158713, 158716, 158721, 158728, 158737, 158744, + 158753, 158760, 158765, 158770, 158773, 158776, 158779, 158786, 158793, + 158802, 158811, 158820, 158827, 158834, 158839, 158852, 158857, 158862, + 158867, 158872, 158877, 158882, 158887, 158892, 158895, 158900, 158905, + 158910, 158915, 158920, 158927, 158932, 158939, 158942, 158947, 158950, + 158953, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 158956, 158961, + 158966, 158971, 158976, 0, 158981, 158986, 158991, 158996, 159001, + 159006, 159011, 159016, 159021, 159026, 159031, 159036, 159041, 159046, + 159051, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159056, 159061, 159066, 159071, 159076, + 159081, 159086, 0, 159091, 159096, 159101, 159107, 159111, 159116, + 159121, 159126, 159131, 159136, 159141, 159146, 159151, 159156, 159161, + 159166, 159171, 0, 0, 159176, 159181, 159186, 159191, 159196, 159201, + 159206, 0, 159211, 159216, 0, 159222, 159227, 159235, 159242, 159251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 112730, 112734, 112739, 112743, 112748, 112752, 112757, - 112761, 112766, 112770, 112775, 112779, 112784, 112789, 112794, 112799, - 112804, 112809, 112814, 112819, 112824, 112829, 112834, 112839, 112844, - 112849, 112854, 112859, 112864, 112869, 112873, 112877, 112882, 112887, - 112892, 112896, 112900, 112904, 112908, 112913, 112918, 112923, 112927, - 112931, 112936, 112942, 112947, 112953, 112958, 112964, 112970, 112977, - 112982, 112988, 112993, 112999, 113004, 113009, 113014, 113019, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159256, 159263, 159271, 159279, + 159286, 159293, 159300, 159308, 159316, 159324, 159331, 159338, 159346, + 159354, 159362, 159369, 159377, 159385, 159393, 159401, 159409, 159417, + 159425, 159432, 159440, 159447, 159455, 159462, 159470, 159478, 159486, + 159494, 159502, 159510, 159518, 159526, 159534, 159541, 159549, 159556, + 159563, 159570, 159578, 159585, 159593, 0, 0, 0, 159601, 159608, 159615, + 159622, 159629, 159636, 159643, 159650, 159659, 159668, 159677, 159686, + 159695, 159705, 0, 0, 159713, 159721, 159728, 159735, 159742, 159749, + 159756, 159763, 159770, 159777, 0, 0, 0, 0, 159784, 159793, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 113024, 113032, 113039, 113047, 113055, 113062, 113070, 113078, - 113086, 113093, 113100, 113108, 113116, 113124, 113132, 113140, 113148, - 113156, 113164, 113172, 113180, 113188, 113196, 113204, 113212, 113220, - 113228, 113236, 113244, 113252, 113260, 113268, 113276, 113284, 113291, - 113299, 113307, 113314, 113322, 113330, 113338, 113345, 113352, 113360, - 113368, 113376, 113384, 113392, 113400, 113408, 113416, 113424, 113432, - 113440, 113448, 113456, 113464, 113472, 113480, 113488, 113496, 113504, - 113512, 113520, 113528, 113535, 113541, 113547, 113553, 113559, 113565, - 113571, 113577, 113583, 113589, 113596, 113603, 113610, 113617, 113624, - 113631, 113638, 113645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113652, - 113658, 113663, 113669, 113676, 113682, 113688, 113695, 113701, 113708, - 113715, 113723, 113730, 113735, 113741, 113747, 113753, 113759, 113765, - 113771, 113777, 113783, 113789, 113795, 113801, 113807, 113813, 113819, - 113825, 113831, 113837, 113842, 113847, 113853, 113859, 113865, 113870, - 113876, 113882, 113888, 113894, 113900, 113906, 113912, 113917, 113922, - 113927, 113933, 113939, 113945, 113950, 113955, 113961, 113967, 113973, - 113979, 113988, 113997, 114003, 114009, 114016, 114023, 114030, 114037, - 114045, 114052, 114060, 114066, 114072, 114079, 114086, 114095, 114105, - 0, 0, 0, 0, 0, 0, 0, 0, 114110, 114114, 114119, 114125, 114130, 114135, - 114140, 114146, 114152, 114158, 114164, 114170, 114176, 114180, 114185, - 114190, 114195, 114200, 114205, 114210, 114215, 114220, 114225, 114230, - 114235, 114240, 114245, 114250, 114255, 114260, 114265, 114270, 114274, - 114278, 114283, 114288, 114293, 114297, 114302, 114307, 114312, 114317, - 114322, 114327, 114331, 114335, 114339, 114344, 114349, 114354, 114358, - 114362, 0, 0, 114367, 114373, 114379, 114386, 114392, 114399, 114406, - 114413, 114420, 114427, 114434, 114441, 114447, 114453, 114460, 114467, - 114474, 114479, 114484, 114489, 114493, 114498, 114503, 114509, 114514, - 114530, 114544, 114555, 114561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114567, 114575, 114583, - 114591, 114599, 114608, 114617, 114626, 114635, 114643, 114652, 114661, - 114669, 114678, 114687, 114696, 114705, 114713, 114722, 114730, 114739, - 114748, 114756, 114764, 114772, 114780, 114788, 114797, 114806, 114816, - 114826, 114836, 114846, 114856, 114865, 114875, 114885, 114895, 114906, - 114916, 114928, 114940, 114951, 114965, 114976, 114986, 114998, 115009, - 115019, 115031, 115043, 115054, 115065, 115075, 115085, 115097, 115108, - 0, 0, 0, 0, 0, 0, 0, 115120, 115123, 115127, 115130, 115134, 115137, - 115141, 115145, 115150, 0, 115154, 115157, 115161, 115164, 115168, - 115171, 115175, 115179, 115183, 115187, 115191, 115195, 115199, 115203, - 115207, 115211, 115215, 115219, 115223, 115227, 115231, 115235, 115239, - 115243, 115246, 115249, 115253, 115257, 115261, 115264, 115267, 115270, - 115273, 115277, 115281, 115285, 115288, 115291, 115296, 115300, 115305, - 115309, 115314, 115319, 115325, 0, 115330, 115334, 115339, 115343, - 115348, 115352, 115356, 115360, 115364, 115368, 115371, 115375, 115380, - 115385, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115390, 115394, 115397, 115400, - 115403, 115406, 115409, 115412, 115415, 115418, 115421, 115424, 115427, - 115430, 115433, 115436, 115439, 115442, 115445, 115448, 115452, 115456, - 115460, 115464, 115468, 115472, 115476, 115480, 115484, 0, 0, 0, 115490, - 115495, 115500, 115504, 115509, 115514, 115519, 115524, 115529, 115534, - 115539, 115544, 115549, 115554, 115558, 115562, 115567, 115572, 115576, - 115581, 115586, 115591, 115596, 115601, 115606, 115611, 115615, 115619, - 115623, 115628, 115632, 115636, 0, 0, 115640, 115646, 115653, 115660, - 115667, 115674, 115681, 115688, 115695, 115702, 115709, 115716, 115722, - 115728, 115735, 115742, 115748, 115755, 115762, 115769, 115776, 115783, - 0, 115790, 115796, 115802, 115808, 115815, 115821, 115827, 115833, - 115839, 115844, 115849, 115854, 115859, 115864, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159801, 159806, 159810, 159815, + 159820, 159825, 159830, 159834, 159839, 159843, 159847, 159851, 159855, + 159860, 159865, 159869, 159874, 159879, 159884, 159889, 159894, 159898, + 159902, 159907, 159911, 159915, 159920, 159924, 159928, 159932, 159937, + 159941, 159946, 159951, 159956, 159961, 159966, 159971, 159976, 159981, + 159986, 159991, 159996, 160001, 160006, 160011, 160016, 160021, 160026, + 160031, 160035, 160039, 160043, 160047, 160051, 160055, 160059, 160063, + 0, 0, 0, 0, 0, 160067, 160072, 160079, 160085, 160092, 160099, 160106, + 160113, 160120, 160127, 160134, 160141, 160148, 160155, 160162, 160169, + 160176, 160183, 160190, 160197, 160204, 160211, 160218, 160225, 160232, + 160239, 160246, 160253, 160260, 160267, 160274, 160281, 160288, 160295, + 160302, 160309, 160315, 160321, 160327, 160334, 160340, 160347, 160353, + 160360, 160367, 160374, 160381, 160388, 160395, 160401, 160408, 160415, + 160422, 160429, 160436, 160443, 160450, 160456, 160463, 160470, 160477, + 160484, 160491, 160499, 160506, 160513, 160520, 160527, 160534, 160541, + 160548, 160554, 160561, 160568, 160575, 160582, 160588, 160595, 160602, + 160609, 160616, 160623, 160630, 160637, 160645, 160652, 160658, 160665, + 160672, 160679, 160686, 160693, 160700, 160707, 160714, 160721, 160728, + 160735, 160742, 160749, 160756, 160763, 160770, 160777, 160784, 160791, + 160798, 160804, 160811, 160818, 160825, 160832, 160839, 160846, 160853, + 160860, 160867, 160874, 160881, 160888, 160895, 160902, 160909, 160916, + 160923, 160930, 160937, 160944, 160951, 160958, 160966, 160974, 160982, + 160989, 160996, 161003, 161010, 161017, 161024, 161031, 161038, 161045, + 161052, 161058, 161065, 161072, 161079, 161086, 161093, 161100, 161107, + 161114, 161121, 161128, 161135, 161142, 161149, 161156, 161164, 161172, + 161180, 161187, 161194, 161201, 161208, 161215, 161222, 161229, 161236, + 161243, 161250, 161257, 161264, 161271, 161278, 161284, 161291, 161298, + 161305, 161312, 161319, 161326, 161333, 161340, 161347, 161354, 161361, + 161368, 161375, 161382, 161389, 161396, 161403, 161410, 161417, 161424, + 161431, 161438, 0, 0, 161445, 161449, 161453, 161457, 161461, 161465, + 161469, 161473, 161477, 161481, 161487, 161493, 161499, 161505, 161513, + 161521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161527, 161533, + 161539, 161545, 161551, 161557, 161563, 161569, 161575, 161580, 161585, + 161591, 161596, 161601, 161607, 161613, 161619, 161625, 161631, 161636, + 161641, 161647, 161653, 161658, 161664, 161670, 161676, 161682, 161688, + 161694, 161700, 161706, 161712, 161718, 161724, 161730, 161736, 161742, + 161748, 161754, 161760, 161766, 161772, 161777, 161782, 161788, 161793, + 161798, 161804, 161810, 161816, 161822, 161828, 161833, 161838, 161844, + 161850, 161855, 161861, 161867, 161873, 161879, 161885, 161891, 161897, + 161903, 161909, 161915, 161921, 161927, 161932, 161937, 161941, 161946, + 161953, 161957, 0, 0, 0, 0, 161962, 161967, 161971, 161975, 161979, + 161983, 161987, 161991, 161995, 161999, 0, 0, 0, 0, 162003, 162009, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115869, 115874, - 115880, 115885, 115891, 115896, 115902, 0, 115907, 115913, 0, 115918, - 115924, 115929, 115935, 115941, 115947, 115953, 115959, 115965, 115971, - 115977, 115983, 115989, 115995, 116001, 116007, 116013, 116019, 116025, - 116031, 116037, 116042, 116047, 116053, 116059, 116065, 116070, 116075, - 116080, 116085, 116091, 116097, 116103, 116108, 116113, 116119, 116125, - 116131, 116137, 116144, 116150, 116157, 116163, 116170, 0, 0, 0, 116177, - 0, 116183, 116190, 0, 116196, 116203, 116209, 116215, 116221, 116227, - 116233, 116238, 116243, 0, 0, 0, 0, 0, 0, 0, 0, 116248, 116254, 116259, - 116264, 116269, 116274, 116279, 116284, 116289, 116294, 0, 0, 0, 0, 0, 0, - 116299, 116304, 116310, 116315, 116321, 116326, 0, 116332, 116338, 0, - 116344, 116350, 116356, 116361, 116367, 116373, 116379, 116384, 116389, - 116395, 116401, 116407, 116412, 116418, 116424, 116430, 116436, 116441, - 116447, 116453, 116459, 116465, 116471, 116477, 116483, 116489, 116495, - 116501, 116506, 116512, 116517, 116522, 116527, 116534, 116540, 116547, - 116553, 0, 116560, 116567, 0, 116574, 116581, 116588, 116594, 116600, - 116605, 0, 0, 0, 0, 0, 0, 0, 116610, 116616, 116621, 116626, 116631, - 116636, 116641, 116646, 116651, 116656, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 162015, 162020, 162025, 162030, 162035, 162040, 162045, 162050, 162055, + 162060, 162066, 162072, 162078, 162084, 162090, 162096, 162102, 162108, + 162114, 162121, 162128, 162135, 162143, 162151, 162159, 162167, 162175, + 162183, 162189, 162195, 162201, 162208, 162215, 162222, 162229, 162236, + 162243, 162250, 162257, 162264, 162271, 162278, 162285, 162292, 162299, + 162306, 162312, 162318, 162324, 162330, 162336, 162343, 162350, 162357, + 162364, 162371, 162378, 162385, 162392, 162399, 162404, 162411, 162418, + 162425, 162431, 162438, 162445, 162454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162462, 162467, + 162472, 162477, 162482, 162487, 162492, 162497, 162502, 162507, 162513, + 162519, 162525, 162531, 162537, 162543, 162549, 162555, 162561, 162568, + 162575, 162582, 162590, 162598, 162606, 162614, 162622, 162630, 162636, + 162642, 162648, 162655, 162662, 162669, 162676, 162683, 162690, 162697, + 162704, 162711, 162718, 162725, 162732, 162739, 162746, 162753, 162758, + 162765, 162772, 162779, 162786, 162793, 162800, 162807, 162814, 162822, + 162832, 162842, 162850, 162859, 162866, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 162873, 162877, 162881, 162885, 0, 162889, 162893, + 162897, 162901, 162905, 162909, 162913, 162917, 162921, 162925, 162929, + 162933, 162937, 162941, 162945, 162949, 162953, 162957, 162961, 162965, + 162969, 162973, 162977, 162981, 162987, 162993, 162999, 0, 163005, + 163010, 0, 163015, 0, 0, 163020, 0, 163025, 163030, 163035, 163040, + 163045, 163050, 163055, 163060, 163065, 163070, 0, 163075, 163080, + 163085, 163090, 0, 163095, 0, 163100, 0, 0, 0, 0, 0, 0, 163105, 0, 0, 0, + 0, 163111, 0, 163117, 0, 163123, 0, 163129, 163135, 163141, 0, 163147, + 163153, 0, 163159, 0, 0, 163165, 0, 163171, 0, 163177, 0, 163183, 0, + 163191, 0, 163199, 163205, 0, 163211, 0, 0, 163217, 163223, 163229, + 163235, 0, 163241, 163247, 163253, 163259, 163265, 163271, 163277, 0, + 163283, 163289, 163295, 163301, 0, 163307, 163313, 163319, 163325, 0, + 163333, 0, 163341, 163347, 163353, 163359, 163365, 163371, 163377, + 163383, 163389, 163395, 0, 163401, 163407, 163413, 163419, 163425, + 163431, 163437, 163443, 163449, 163455, 163461, 163467, 163473, 163479, + 163485, 163491, 163497, 0, 0, 0, 0, 0, 163503, 163509, 163515, 0, 163521, + 163527, 163533, 163539, 163545, 0, 163551, 163557, 163563, 163569, + 163575, 163581, 163587, 163593, 163599, 163605, 163611, 163617, 163623, + 163629, 163635, 163641, 163647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163653, 163663, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 163671, 163678, 163685, 163692, 163698, + 163705, 163712, 163718, 163725, 163732, 163739, 163747, 163755, 163763, + 163771, 163779, 163787, 163794, 163801, 163808, 163816, 163824, 163832, + 163840, 163848, 163856, 163863, 163870, 163877, 163885, 163893, 163901, + 163909, 163917, 163925, 163930, 163935, 163940, 163945, 163950, 163955, + 163960, 163965, 163970, 0, 0, 0, 0, 163975, 163981, 163985, 163989, + 163993, 163997, 164001, 164005, 164009, 164013, 164017, 164021, 164025, + 164029, 164033, 164037, 164041, 164045, 164049, 164053, 164057, 164061, + 164065, 164069, 164073, 164077, 164081, 164085, 164089, 164093, 164097, + 164101, 164105, 164109, 164113, 164117, 164121, 164125, 164129, 164133, + 164137, 164141, 164145, 164149, 164153, 164157, 164161, 164165, 164169, + 164173, 164177, 164182, 164186, 164190, 164194, 164198, 164202, 164206, + 164210, 164214, 164218, 164222, 164226, 164230, 164234, 164238, 164242, + 164246, 164250, 164254, 164258, 164262, 164266, 164270, 164274, 164278, + 164282, 164286, 164290, 164294, 164298, 164302, 164306, 164310, 164314, + 164318, 164322, 164326, 164330, 164334, 164338, 164342, 164346, 164350, + 164354, 164358, 164362, 164366, 164370, 164374, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 164378, 164384, 164393, 164401, 164409, 164418, 164427, + 164436, 164445, 164454, 164463, 164472, 164481, 164490, 164499, 0, 0, + 164508, 164517, 164525, 164533, 164542, 164551, 164560, 164569, 164578, + 164587, 164596, 164605, 164614, 164623, 164632, 0, 164640, 164649, + 164657, 164665, 164674, 164683, 164692, 164701, 164710, 164719, 164728, + 164737, 164746, 164755, 164764, 0, 164771, 164780, 164788, 164796, + 164805, 164814, 164823, 164832, 164841, 164850, 164859, 164868, 164877, + 164886, 164895, 164902, 164908, 164914, 164920, 164926, 164932, 164938, + 164944, 164950, 164956, 164962, 164968, 164974, 164980, 164986, 164992, + 164998, 165004, 165010, 165016, 165022, 165028, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 165034, 165041, 165046, 165050, 165054, 165058, 165063, 165068, + 165073, 165078, 165083, 165088, 165095, 0, 0, 0, 165104, 165109, 165115, + 165121, 165127, 165132, 165138, 165144, 165150, 165155, 165161, 165167, + 165172, 165178, 165184, 165189, 165195, 165201, 165206, 165212, 165218, + 165223, 165229, 165235, 165241, 165247, 165253, 165264, 165271, 165277, + 165280, 165283, 165286, 165291, 165297, 165303, 165309, 165314, 165320, + 165326, 165332, 165337, 165343, 165349, 165354, 165360, 165366, 165371, + 165377, 165383, 165388, 165394, 165400, 165405, 165411, 165417, 165423, + 165429, 165435, 165438, 165441, 165444, 165447, 165450, 165453, 165460, + 165468, 165476, 165484, 165491, 165499, 165507, 165515, 165522, 165530, + 165538, 165545, 165553, 165561, 165568, 165576, 165584, 165591, 165599, + 165607, 165614, 165622, 165630, 165638, 165646, 165654, 165659, 165664, + 0, 0, 0, 165669, 165676, 165684, 165692, 165700, 165707, 165715, 165723, + 165731, 165738, 165746, 165754, 165761, 165769, 165777, 165784, 165792, + 165800, 165807, 165815, 165823, 165830, 165838, 165846, 165854, 165862, + 165870, 165880, 165885, 165889, 165893, 165898, 165903, 165906, 165909, + 165912, 165915, 165918, 165921, 165924, 165927, 165930, 165936, 165939, + 165943, 165948, 165952, 165957, 165962, 165968, 165974, 165980, 165985, + 165993, 165999, 166002, 166005, 166008, 166011, 166014, 166017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 166020, 166027, 166035, 166043, 166051, 166058, 166066, + 166074, 166082, 166089, 166097, 166105, 166112, 166120, 166128, 166135, + 166143, 166151, 166158, 166166, 166174, 166181, 166189, 166197, 166205, + 166213, 166221, 166225, 166229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 166232, 166238, 166244, 166250, 166254, 166260, 166266, 166272, 166278, + 166284, 166290, 166296, 166302, 166308, 166314, 166320, 166326, 166332, + 166338, 166344, 166350, 166356, 166362, 166368, 166374, 166380, 166386, + 166392, 166398, 166404, 166410, 166416, 166422, 166428, 166434, 166440, + 166446, 166452, 166458, 166464, 166470, 166476, 166482, 166488, 0, 0, 0, + 0, 166494, 166505, 166516, 166527, 166538, 166549, 166560, 166571, + 166582, 0, 0, 0, 0, 0, 0, 0, 166593, 166598, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 166603, 166609, 166615, 166621, 166627, 166633, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 166639, 166641, 166643, 166647, 166652, 166657, 166659, 166665, 166670, + 166672, 166678, 166682, 166684, 166688, 166694, 166700, 166706, 166711, + 166716, 166723, 166730, 166737, 166742, 166749, 166756, 166763, 166767, + 166774, 166783, 166792, 166799, 166804, 166808, 166812, 166814, 166817, + 166820, 166827, 166834, 166844, 166849, 166854, 166859, 166864, 166866, + 166872, 166876, 166878, 166880, 166882, 166884, 166888, 166892, 166896, + 166898, 166902, 166904, 166908, 166910, 166912, 166914, 166916, 166921, + 166926, 166928, 166934, 166938, 166942, 166950, 166952, 166954, 166956, + 166958, 166960, 166962, 166964, 166966, 166968, 166970, 166974, 166978, + 166980, 166982, 166984, 166986, 166988, 166993, 166999, 167003, 167007, + 167011, 167015, 167020, 167024, 167026, 167028, 167032, 167038, 167040, + 167042, 167044, 167048, 167057, 167063, 167067, 167071, 167073, 167075, + 167078, 167080, 167082, 167084, 167088, 167090, 167094, 167099, 167101, + 167106, 167112, 167119, 167123, 167127, 167131, 167135, 167141, 167145, + 167153, 167160, 167162, 167164, 167168, 167172, 167174, 167178, 167182, + 167184, 167188, 167190, 167194, 167198, 167202, 167206, 167210, 167214, + 167218, 167222, 167228, 167232, 167236, 167247, 167252, 167256, 167260, + 167266, 167270, 167274, 167278, 167285, 167292, 167296, 167300, 167304, + 167308, 167312, 167319, 167321, 167325, 167327, 167329, 167333, 167337, + 167341, 167343, 167347, 167351, 167355, 167359, 167363, 167365, 167369, + 167371, 167377, 167380, 167385, 167387, 167389, 167392, 167394, 167396, + 167399, 167406, 167413, 167420, 167425, 167429, 167431, 167433, 167435, + 167439, 167441, 167445, 167449, 167453, 167455, 167459, 167461, 167465, + 167469, 167476, 167478, 167487, 167496, 167505, 167511, 167513, 167518, + 167522, 167526, 167528, 167534, 167538, 167540, 167544, 167548, 167550, + 167554, 167559, 167563, 167569, 167575, 167577, 167579, 167585, 167587, + 167591, 167595, 167597, 167601, 167603, 167607, 167611, 167615, 167618, + 167621, 167626, 167631, 167633, 167636, 167638, 167645, 167649, 167651, + 167658, 167665, 167672, 167679, 167686, 167688, 167690, 167692, 167696, + 167698, 167700, 167702, 167704, 167706, 167708, 167710, 167712, 167714, + 167716, 167718, 167720, 167722, 167724, 167726, 167728, 167730, 167732, + 167734, 167736, 167738, 167740, 167744, 167746, 167748, 167750, 167754, + 167756, 167760, 167762, 167764, 167768, 167772, 167778, 167780, 167782, + 167784, 167786, 167790, 167794, 167796, 167800, 167804, 167808, 167812, + 167816, 167820, 167824, 167828, 167832, 167836, 167840, 167844, 167848, + 167852, 167856, 167860, 167864, 167868, 167870, 167872, 167874, 167876, + 167878, 167880, 167882, 167890, 167898, 167906, 167914, 167919, 167924, + 167929, 167933, 167937, 167942, 167946, 167948, 167952, 167954, 167956, + 167958, 167960, 167962, 167964, 167966, 167970, 167972, 167974, 167976, + 167980, 167984, 167988, 167992, 167996, 167998, 168004, 168010, 168012, + 168014, 168016, 168018, 168020, 168029, 168036, 168043, 168047, 168054, + 168059, 168066, 168075, 168080, 168084, 168088, 168090, 168094, 168096, + 168100, 168104, 168106, 168110, 168114, 168118, 168120, 168122, 168128, + 168130, 168132, 168134, 168138, 168142, 168144, 168148, 168150, 168152, + 168155, 168159, 168161, 168165, 168167, 168169, 168174, 168176, 168180, + 168184, 168187, 168191, 168195, 168199, 168203, 168207, 168211, 168215, + 168220, 168224, 168228, 168237, 168242, 168245, 168247, 168250, 168253, + 168258, 168260, 168263, 168268, 168272, 168275, 168279, 168283, 168286, + 168291, 168295, 168299, 168303, 168307, 168313, 168319, 168325, 168331, + 168336, 168347, 168349, 168353, 168355, 168357, 168361, 168365, 168367, + 168371, 168376, 168381, 168387, 168389, 168393, 168397, 168404, 168411, + 168415, 168417, 168419, 168423, 168425, 168429, 168433, 168437, 168439, + 168441, 168448, 168452, 168455, 168459, 168463, 168467, 168469, 168473, + 168475, 168477, 168481, 168483, 168487, 168491, 168497, 168501, 168505, + 168509, 168511, 168514, 168518, 168525, 168534, 168543, 168551, 168559, + 168561, 168565, 168567, 168571, 168582, 168586, 168592, 168598, 168603, + 168605, 168610, 168614, 168616, 168618, 168620, 168624, 168628, 168632, + 168637, 168647, 168662, 168674, 168686, 168690, 168694, 168700, 168702, + 168710, 168718, 168720, 168724, 168730, 168736, 168743, 168750, 168752, + 168754, 168757, 168759, 168765, 168767, 168770, 168774, 168780, 168786, + 168797, 168803, 168810, 168818, 168822, 168830, 168838, 168844, 168850, + 168857, 168859, 168863, 168865, 168867, 168872, 168874, 168876, 168878, + 168880, 168884, 168894, 168900, 168904, 168908, 168912, 168918, 168924, + 168930, 168936, 168941, 168946, 168952, 168958, 168965, 168972, 168980, + 168988, 168993, 169001, 169005, 169014, 169023, 169029, 169033, 169037, + 169041, 169044, 169049, 169051, 169053, 169055, 169062, 169067, 169074, + 169081, 169088, 169096, 169104, 169112, 169120, 169128, 169136, 169144, + 169152, 169160, 169166, 169172, 169178, 169184, 169190, 169196, 169202, + 169208, 169214, 169220, 169226, 169232, 169235, 169244, 169253, 169255, + 169262, 169266, 169268, 169270, 169274, 169280, 169284, 169286, 169296, + 169302, 169306, 169308, 169312, 169314, 169318, 169325, 169332, 169339, + 169344, 169349, 169358, 169364, 169369, 169373, 169378, 169382, 169389, + 169393, 169396, 169401, 169408, 169415, 169420, 169425, 169430, 169436, + 169445, 169456, 169462, 169468, 169474, 169484, 169499, 169508, 169516, + 169524, 169532, 169540, 169548, 169556, 169564, 169572, 169580, 169588, + 169596, 169604, 169607, 169611, 169616, 169621, 169623, 169627, 169636, + 169645, 169653, 169657, 169661, 169666, 169671, 169676, 169678, 169683, + 169687, 169689, 169693, 169697, 169703, 169708, 169716, 169721, 169726, + 169731, 169738, 169741, 169743, 169746, 169751, 169757, 169761, 169765, + 169771, 169777, 169779, 169783, 169787, 169791, 169795, 169799, 169801, + 169803, 169805, 169807, 169813, 169819, 169823, 169825, 169827, 169829, + 169838, 169842, 169849, 169856, 169858, 169861, 169865, 169871, 169875, + 169879, 169881, 169889, 169893, 169897, 169902, 169907, 169912, 169917, + 169922, 169927, 169932, 169937, 169942, 169947, 169951, 169957, 169961, + 169967, 169972, 169979, 169985, 169993, 169997, 170004, 170008, 170012, + 170016, 170021, 170026, 170028, 170032, 170041, 170049, 170057, 170070, + 170083, 170096, 170103, 170110, 170114, 170123, 170131, 170135, 170144, + 170151, 170155, 170159, 170163, 170167, 170174, 170178, 170182, 170186, + 170190, 170197, 170206, 170215, 170222, 170234, 170246, 170250, 170254, + 170258, 170262, 170266, 170270, 170278, 170286, 170294, 170298, 170302, + 170306, 170310, 170314, 170318, 170324, 170330, 170334, 170345, 170353, + 170357, 170361, 170365, 170369, 170375, 170382, 170393, 170403, 170413, + 170424, 170433, 170444, 170450, 170456, 170462, 170468, 170474, 170478, + 170485, 170494, 170501, 170507, 170511, 170515, 170519, 170528, 170540, + 170544, 170551, 170558, 170565, 170573, 170580, 170588, 170596, 170605, + 170613, 170622, 170631, 170641, 170650, 170660, 170670, 170681, 170691, + 170702, 170709, 170717, 170724, 170732, 170740, 170749, 170757, 170766, + 170773, 170785, 170792, 170804, 170807, 170811, 170814, 170818, 170824, + 170831, 170837, 170844, 170849, 170855, 170866, 170876, 170887, 170892, + 170897, 170903, 170908, 170915, 170919, 170925, 170927, 170929, 170933, + 170937, 170941, 170950, 170952, 170954, 170957, 170959, 170961, 170965, + 170967, 170971, 170973, 170977, 170979, 170981, 170985, 170989, 170995, + 170997, 171001, 171003, 171007, 171011, 171015, 171019, 171021, 171023, + 171027, 171031, 171035, 171039, 171041, 171043, 171045, 171051, 171056, + 171059, 171067, 171075, 171077, 171082, 171085, 171090, 171101, 171108, + 171113, 171118, 171120, 171124, 171126, 171130, 171132, 171136, 171140, + 171143, 171146, 171148, 171151, 171153, 171157, 171159, 171161, 171163, + 171167, 171169, 171173, 171176, 171183, 171186, 171191, 171194, 171197, + 171202, 171206, 171210, 171214, 171216, 171221, 171224, 171228, 171230, + 171232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171236, 171241, 171243, 171247, + 171249, 171253, 171257, 171263, 171267, 171272, 171275, 171279, 171283, + 0, 0, 0, 171287, 171289, 171295, 171299, 171303, 171305, 171309, 171311, + 171313, 171317, 171319, 0, 0, 0, 0, 0, 171323, 171328, 171333, 171338, + 171343, 171348, 171353, 171360, 171367, 171374, 171381, 171386, 171391, + 171396, 171401, 171408, 171414, 171421, 171428, 171435, 171440, 171445, + 171450, 171455, 171460, 171467, 171474, 171479, 171484, 171491, 171498, + 171506, 171514, 171521, 171528, 171536, 171544, 171552, 171559, 171569, + 171580, 171585, 171592, 171599, 171606, 171614, 171622, 171633, 171641, + 171649, 171657, 171662, 171667, 171672, 171677, 171682, 171687, 171692, + 171697, 171702, 171707, 171712, 171717, 171724, 171729, 171734, 171741, + 171746, 171751, 171756, 171761, 171766, 171771, 171776, 171781, 171786, + 171791, 171796, 171801, 171808, 171816, 171821, 171826, 171833, 171838, + 171843, 171848, 171855, 171860, 171867, 171872, 171879, 171884, 171893, + 171902, 171907, 171912, 171917, 171922, 171927, 171932, 171937, 171942, + 171947, 171952, 171957, 171962, 171967, 171975, 171983, 171988, 171993, + 171998, 172003, 172008, 172014, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 172020, 172028, 172036, 172044, 172052, 172058, 172064, 172068, 172072, + 172078, 172084, 172093, 172097, 172102, 172108, 172112, 172117, 172121, + 172125, 172131, 172137, 172147, 172156, 172159, 172164, 172170, 172176, + 172187, 172197, 172201, 172206, 172212, 172218, 172227, 172232, 172236, + 172241, 172245, 172251, 172257, 172263, 172267, 172270, 172274, 172277, + 172280, 172285, 172290, 172297, 172305, 172312, 172319, 172328, 172337, + 172344, 172352, 172359, 172366, 172375, 172384, 172391, 172399, 172406, + 172413, 172422, 172429, 172437, 172443, 172452, 172460, 172469, 172476, + 172486, 172497, 172505, 172513, 172522, 172530, 172538, 172547, 172555, + 172565, 172574, 172582, 172590, 172599, 172602, 172607, 172610, 0, 0, 0, + 0, 0, 0, 0, 172615, 172621, 172627, 172633, 172639, 172645, 172651, + 172657, 172663, 172669, 172675, 172681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 172687, 172695, 172704, 172712, 172721, + 172730, 172740, 172749, 172759, 172768, 172778, 172787, 0, 0, 0, 0, + 172797, 172805, 172814, 172822, 172831, 172838, 172846, 172853, 172861, + 172869, 172878, 172886, 172895, 172905, 172916, 172926, 172937, 172946, + 172956, 172965, 172975, 172984, 172994, 173003, 173013, 173021, 173030, + 173038, 173047, 173055, 173064, 173072, 173081, 173091, 173102, 173112, + 173123, 173127, 173132, 173136, 173141, 173144, 173148, 173151, 173155, + 173159, 173164, 173168, 173173, 173178, 173184, 173189, 173195, 173198, + 173202, 173205, 0, 0, 0, 0, 0, 0, 0, 0, 173209, 173212, 173216, 173219, + 173223, 173228, 173233, 173239, 173245, 173249, 0, 0, 0, 0, 0, 0, 173253, + 173259, 173266, 173272, 173279, 173287, 173295, 173304, 173313, 173318, + 173324, 173329, 173335, 173342, 173349, 173357, 173365, 173372, 173380, + 173387, 173395, 173404, 173413, 173423, 173433, 173439, 173446, 173452, + 173459, 173467, 173475, 173484, 173493, 173501, 173510, 173518, 173527, + 173537, 173547, 173558, 0, 0, 0, 0, 0, 0, 0, 0, 173569, 173574, 173580, + 173585, 173591, 173600, 173610, 173619, 173629, 173636, 173644, 173651, + 173659, 173666, 173675, 173684, 173693, 173698, 173705, 173712, 173719, + 173724, 173729, 173734, 173739, 173746, 173753, 173760, 173767, 173774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116661, 116665, 116670, 116675, 116679, - 116684, 116688, 116693, 116698, 116702, 116707, 116712, 116717, 116721, - 116725, 116729, 116734, 116738, 116742, 116746, 116751, 116756, 116761, - 116766, 116770, 0, 0, 0, 0, 0, 0, 0, 116777, 116780, 116785, 116791, - 116799, 116804, 116810, 116818, 116824, 116830, 116834, 116838, 116845, - 116854, 116861, 116870, 116876, 116885, 116892, 116899, 116906, 116916, - 116922, 116926, 116933, 116942, 116952, 116959, 116966, 116970, 116974, - 116981, 116991, 116995, 117002, 117009, 117016, 117022, 117029, 117036, - 117043, 117050, 117054, 117058, 117062, 117069, 117073, 117080, 117087, - 117101, 117110, 117114, 117118, 117122, 117129, 117133, 117137, 117141, - 117149, 117157, 117176, 117186, 117206, 117210, 117214, 117218, 117222, - 117226, 117230, 117234, 117241, 117245, 117248, 117252, 117256, 117262, - 117269, 117278, 117282, 117291, 117300, 117308, 117312, 117319, 117323, - 117327, 117331, 117335, 117346, 117355, 117364, 117373, 117382, 117394, - 117403, 117412, 117421, 117429, 117438, 117450, 117459, 117467, 117476, - 117488, 117497, 117506, 117518, 117527, 117536, 117548, 117557, 117561, - 117565, 117569, 117573, 117577, 117581, 117585, 117592, 117596, 117600, - 117611, 117615, 117619, 117626, 117632, 117638, 117642, 117649, 117653, - 117657, 117661, 117665, 117669, 117673, 117679, 117687, 117691, 117695, - 117698, 117705, 117717, 117721, 117733, 117740, 117747, 117754, 117761, - 117767, 117771, 117775, 117779, 117783, 117790, 117799, 117806, 117814, - 117822, 117828, 117832, 117836, 117840, 117844, 117850, 117859, 117871, - 117878, 117885, 117894, 117905, 117911, 117920, 117929, 117936, 117945, - 117952, 117958, 117968, 117975, 117982, 117989, 117996, 118000, 118006, - 118010, 118021, 118029, 118038, 118050, 118057, 118064, 118074, 118081, - 118090, 118097, 118106, 118113, 118120, 118130, 118137, 118144, 118153, - 118160, 118172, 118181, 118188, 118195, 118202, 118211, 118221, 118234, - 118241, 118250, 118260, 118267, 118276, 118289, 118296, 118303, 118310, - 118320, 118330, 118336, 118346, 118353, 118360, 118370, 118376, 118383, - 118390, 118397, 118407, 118414, 118421, 118428, 118434, 118441, 118451, - 118458, 118462, 118470, 118474, 118486, 118490, 118504, 118508, 118512, - 118516, 118520, 118526, 118533, 118541, 118545, 118549, 118553, 118557, - 118564, 118568, 118574, 118580, 118588, 118592, 118599, 118607, 118611, - 118615, 118621, 118625, 118634, 118643, 118650, 118660, 118666, 118670, - 118674, 118682, 118689, 118696, 118702, 118706, 118714, 118718, 118725, - 118737, 118744, 118754, 118760, 118764, 118773, 118780, 118789, 118793, - 118797, 118804, 118808, 118812, 118816, 118820, 118823, 118829, 118835, - 118839, 118843, 118850, 118857, 118864, 118871, 118878, 118885, 118892, - 118899, 118905, 118909, 118913, 118920, 118927, 118934, 118941, 118948, - 118952, 118955, 118960, 118964, 118968, 118977, 118986, 118990, 118994, - 119000, 119006, 119023, 119029, 119033, 119042, 119046, 119050, 119057, - 119065, 119073, 119079, 119083, 119087, 119091, 119095, 119098, 119104, - 119111, 119121, 119128, 119135, 119142, 119148, 119155, 119162, 119169, - 119176, 119183, 119192, 119199, 119211, 119218, 119225, 119235, 119246, - 119253, 119260, 119267, 119274, 119281, 119288, 119295, 119302, 119309, - 119316, 119326, 119336, 119346, 119353, 119363, 119370, 119377, 119384, - 119391, 119397, 119404, 119411, 119418, 119425, 119432, 119439, 119446, - 119453, 119459, 119466, 119473, 119482, 119489, 119496, 119500, 119508, - 119512, 119516, 119520, 119524, 119528, 119535, 119539, 119548, 119552, - 119559, 119567, 119571, 119575, 119579, 119592, 119608, 119612, 119616, - 119623, 119629, 119636, 119640, 119644, 119648, 119652, 119656, 119663, - 119667, 119685, 119689, 119693, 119700, 119704, 119708, 119714, 119718, - 119722, 119730, 119734, 119738, 119741, 119745, 119751, 119762, 119771, - 119780, 119787, 119794, 119805, 119812, 119819, 119826, 119833, 119840, - 119847, 119854, 119864, 119870, 119877, 119887, 119896, 119903, 119912, - 119922, 119929, 119936, 119943, 119950, 119962, 119969, 119976, 119983, - 119990, 119997, 120007, 120014, 120021, 120031, 120044, 120056, 120063, - 120073, 120080, 120087, 120094, 120108, 120114, 120122, 120132, 120142, - 120149, 120156, 120162, 120166, 120173, 120183, 120189, 120202, 120206, - 120210, 120217, 120221, 120228, 120238, 120242, 120246, 120250, 120254, - 120258, 120265, 120269, 120276, 120283, 120290, 120299, 120308, 120318, - 120325, 120332, 120339, 120349, 120356, 120366, 120373, 120383, 120390, - 120397, 120407, 120417, 120424, 120430, 120438, 120446, 120452, 120458, - 120462, 120466, 120473, 120481, 120487, 120491, 120495, 120499, 120506, - 120518, 120521, 120528, 120534, 120538, 120542, 120546, 120550, 120554, - 120558, 120562, 120566, 120570, 120574, 120581, 120585, 120591, 120595, - 120599, 120603, 120609, 120616, 120623, 120630, 120641, 120649, 120653, - 120659, 120668, 120675, 120681, 120684, 120688, 120692, 120698, 120707, - 120715, 120719, 120725, 120729, 120733, 120737, 120743, 120750, 120756, - 120760, 120766, 120770, 120774, 120783, 120795, 120799, 120806, 120813, - 120823, 120830, 120842, 120849, 120856, 120863, 120874, 120884, 120897, - 120907, 120914, 120918, 120922, 120926, 120930, 120939, 120948, 120957, - 120974, 120983, 120989, 120996, 121004, 121017, 121021, 121030, 121039, - 121048, 121057, 121068, 121077, 121085, 121094, 121103, 121112, 121121, - 121131, 121134, 121138, 121142, 121146, 121150, 121154, 121160, 121167, - 121174, 121181, 121187, 121193, 121200, 121206, 121213, 121221, 121225, - 121232, 121239, 121246, 121254, 121257, 121261, 121265, 121269, 121272, - 121278, 121282, 121288, 121295, 121302, 121308, 121315, 121322, 121329, - 121336, 121343, 121350, 121357, 121364, 121371, 121378, 121385, 121392, - 121399, 121406, 121412, 121416, 121425, 121429, 121433, 121437, 121441, - 121447, 121454, 121461, 121468, 121475, 121482, 121488, 121496, 121500, - 121504, 121508, 121512, 121518, 121535, 121552, 121556, 121560, 121564, - 121568, 121572, 121576, 121582, 121589, 121593, 121599, 121606, 121613, - 121620, 121627, 121634, 121643, 121650, 121657, 121664, 121671, 121675, - 121679, 121685, 121697, 121701, 121705, 121714, 121718, 121722, 121726, - 121732, 121736, 121740, 121749, 121753, 121757, 121761, 121768, 121772, - 121776, 121780, 121784, 121788, 121792, 121796, 121800, 121806, 121813, - 121820, 121826, 121830, 121847, 121853, 121857, 121863, 121869, 121875, - 121881, 121887, 121893, 121897, 121901, 121905, 121911, 121915, 121921, - 121925, 121929, 121936, 121943, 121960, 121964, 121968, 121972, 121976, - 121980, 121992, 121995, 122000, 122005, 122020, 122030, 122042, 122046, - 122050, 122054, 122060, 122067, 122074, 122084, 122096, 122102, 122108, - 122117, 122121, 122125, 122132, 122142, 122149, 122155, 122159, 122163, - 122170, 122176, 122180, 122186, 122190, 122198, 122204, 122208, 122216, - 122224, 122231, 122237, 122244, 122251, 122261, 122271, 122275, 122279, - 122283, 122287, 122293, 122300, 122306, 122313, 122320, 122327, 122336, - 122343, 122350, 122356, 122363, 122370, 122377, 122384, 122391, 122398, - 122404, 122411, 122418, 122425, 122434, 122441, 122448, 122452, 122458, - 122462, 122468, 122475, 122482, 122489, 122493, 122497, 122501, 122505, - 122509, 122516, 122520, 122524, 122530, 122538, 122542, 122546, 122550, - 122554, 122561, 122565, 122569, 122577, 122581, 122585, 122589, 122593, - 122599, 122603, 122607, 122613, 122620, 122626, 122633, 122645, 122649, - 122656, 122663, 122670, 122677, 122689, 122696, 122700, 122704, 122708, - 122715, 122722, 122729, 122736, 122746, 122753, 122759, 122766, 122773, - 122780, 122787, 122796, 122806, 122813, 122817, 122824, 122828, 122832, - 122836, 122843, 122850, 122860, 122866, 122870, 122879, 122883, 122890, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173783, 173793, 173802, 173807, 173816, + 173824, 173832, 173839, 173843, 173848, 173855, 173864, 0, 173875, + 173878, 173882, 173886, 173890, 173894, 173899, 173903, 173907, 173912, + 173916, 173920, 173926, 173932, 173939, 173943, 173947, 173949, 173959, + 173968, 173975, 173979, 173983, 173993, 173997, 174001, 174005, 174009, + 174017, 174026, 174039, 174050, 174061, 174077, 174085, 174094, 174098, + 174100, 174105, 174107, 174109, 174115, 174119, 174121, 174127, 174129, + 174131, 174135, 174137, 174141, 174143, 174147, 174151, 174156, 174160, + 174164, 174166, 174170, 174172, 174178, 174184, 174190, 174194, 174200, + 174204, 174211, 174213, 174217, 174219, 174221, 174223, 174225, 174227, + 174229, 174233, 174237, 174244, 174248, 174250, 174255, 174257, 174259, + 174261, 174263, 174267, 174271, 174273, 174278, 174283, 174285, 174287, + 174289, 174291, 174296, 174298, 174302, 174306, 174308, 174312, 174314, + 174327, 0, 174331, 174343, 174355, 174359, 0, 0, 0, 174363, 174370, + 174372, 174376, 174378, 174382, 174386, 174388, 174392, 174394, 174396, + 174400, 174402, 174404, 174406, 174408, 174410, 174414, 174416, 174418, + 174420, 174422, 174424, 174426, 174428, 174432, 174436, 174438, 174440, + 174442, 174444, 174446, 174448, 174450, 174452, 174454, 174456, 174458, + 174460, 174462, 174464, 0, 0, 174466, 174468, 174470, 174472, 174474, + 174476, 0, 0, 0, 174478, 174482, 174486, 174494, 174502, 174508, 174515, + 174517, 174519, 174521, 174523, 174525, 174527, 174531, 174538, 174542, + 174546, 174550, 174554, 174558, 174560, 174564, 174568, 174570, 174572, + 174574, 174576, 174578, 174582, 0, 0, 174586, 174590, 174594, 174598, + 174603, 174605, 174607, 174611, 174615, 174620, 174628, 174632, 174640, + 174642, 174644, 174646, 174648, 174650, 174652, 174654, 174656, 174660, + 174664, 174666, 174668, 174670, 174672, 174678, 174680, 174686, 174690, + 174694, 174699, 174701, 174703, 174707, 174709, 174711, 174713, 174715, + 174719, 174724, 174729, 174733, 174737, 174739, 174741, 174746, 174751, + 174753, 174755, 174759, 174765, 174771, 174777, 174783, 174789, 174795, + 174806, 174817, 174829, 174840, 174851, 174862, 174873, 174884, 174895, + 174906, 174917, 174928, 174939, 174950, 174961, 174973, 174985, 174997, + 175009, 175021, 175033, 175047, 175061, 175076, 175082, 175088, 175094, + 175100, 175106, 175112, 175118, 175124, 175130, 175136, 175142, 175148, + 175155, 175162, 175169, 175176, 175183, 175190, 175204, 175218, 175233, + 175247, 175261, 175275, 175289, 175303, 175317, 175331, 175345, 175359, + 175373, 175387, 175401, 175416, 175431, 175446, 175461, 175476, 175491, + 175505, 175519, 175534, 175539, 175544, 175550, 175561, 175572, 175584, + 175589, 175594, 175599, 175604, 175609, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 175614, 175620, 175626, 175632, 175638, 175644, 175650, 175656, + 175661, 175666, 175671, 175676, 175681, 175686, 0, 0, 175691, 175695, + 175699, 175701, 0, 0, 0, 0, 175703, 175708, 175712, 0, 0, 0, 0, 0, + 175714, 175716, 175718, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175720, + 175724, 175726, 175728, 175730, 175734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 122894, 122900, 122906, 122913, 122920, 122927, 122934, - 122941, 122948, 122954, 122961, 122968, 122975, 122982, 122989, 122996, - 123002, 123008, 123014, 123020, 123026, 123032, 123038, 123044, 123050, - 123057, 123064, 123071, 123078, 123085, 123092, 123098, 123104, 123110, - 123117, 123124, 123130, 123136, 123145, 123152, 123159, 123166, 123173, - 123180, 123187, 123193, 123199, 123205, 123214, 123221, 123228, 123239, - 123250, 123256, 123262, 123268, 123277, 123284, 123291, 123301, 123311, - 123322, 123333, 123345, 123358, 123369, 123380, 123392, 123405, 123416, - 123427, 123438, 123449, 123460, 123472, 123480, 123488, 123497, 123506, - 123515, 123521, 123527, 123533, 123540, 123550, 123557, 123567, 123572, - 123577, 123583, 123589, 123597, 123605, 123614, 123625, 123636, 123644, - 123652, 123661, 123670, 123678, 123685, 123693, 123701, 123708, 123715, - 123724, 123733, 123742, 123751, 123760, 0, 123769, 123780, 123787, - 123795, 123803, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123811, 123820, 123827, - 123834, 123843, 123850, 123857, 123864, 123874, 123881, 123888, 123895, - 123903, 123910, 123917, 123924, 123935, 123942, 123949, 123956, 123963, - 123970, 123979, 123986, 123992, 123999, 124008, 124015, 124022, 124029, - 124039, 124046, 124053, 124063, 124073, 124080, 124087, 124094, 124101, - 124108, 124115, 124124, 124131, 124138, 124144, 124152, 124161, 124170, - 124181, 124189, 124198, 124207, 124216, 124225, 124232, 124239, 124248, - 124260, 124270, 124277, 124284, 124294, 124304, 124313, 124323, 124330, - 124340, 124347, 124354, 124361, 124371, 124381, 124388, 124395, 124405, - 124411, 124422, 124431, 124441, 124449, 124462, 124469, 124475, 124483, - 124490, 124500, 124504, 124508, 124512, 124516, 124520, 124524, 124528, - 124537, 124541, 124548, 124552, 124556, 124560, 124564, 124568, 124572, - 124576, 124580, 124584, 124588, 124592, 124596, 124600, 124604, 124608, - 124612, 124616, 124620, 124624, 124631, 124638, 124648, 124661, 124671, - 124675, 124679, 124683, 124687, 124691, 124695, 124699, 124703, 124707, - 124711, 124715, 124722, 124729, 124740, 124747, 124753, 124760, 124767, - 124774, 124781, 124788, 124792, 124796, 124803, 124810, 124817, 124826, - 124833, 124846, 124856, 124863, 124870, 124874, 124878, 124887, 124894, - 124901, 124908, 124921, 124928, 124935, 124945, 124955, 124964, 124971, - 124978, 124985, 124992, 124999, 125006, 125016, 125022, 125030, 125037, - 125045, 125052, 125063, 125070, 125076, 125083, 125090, 125097, 125104, - 125114, 125124, 125131, 125138, 125147, 125155, 125161, 125168, 125175, - 125182, 125189, 125193, 125203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 175736, 175740, 175744, 175748, 175752, 175756, 175760, 175764, 175768, + 175772, 175776, 175780, 175784, 175788, 175792, 175796, 175800, 175804, + 175808, 175812, 175816, 175820, 175824, 175828, 175832, 175836, 175840, + 175844, 175848, 175852, 175856, 175860, 175864, 175868, 175872, 175876, + 175880, 175884, 175888, 175892, 175896, 175900, 175904, 175908, 175912, + 175916, 175920, 175924, 175928, 175932, 175936, 175940, 175944, 175948, + 175952, 175956, 175960, 175964, 175968, 175972, 175976, 175980, 175984, + 175988, 175992, 175996, 176000, 176004, 176008, 176012, 176016, 176020, + 176024, 176028, 176032, 176036, 176040, 176044, 176048, 176052, 176056, + 176060, 176064, 176068, 176072, 176076, 176080, 176084, 176088, 176092, + 176096, 176100, 176104, 176108, 176112, 176116, 176120, 176124, 176128, + 176132, 176136, 176140, 176144, 176148, 176152, 176156, 176160, 176164, + 176168, 176172, 176176, 176180, 176184, 176188, 176192, 176196, 176200, + 176204, 176208, 176212, 176216, 176220, 176224, 176228, 176232, 176236, + 176240, 176244, 176248, 176252, 176256, 176260, 176264, 176268, 176272, + 176276, 176280, 176284, 176288, 176292, 176296, 176300, 176304, 176308, + 176312, 176316, 176320, 176324, 176328, 176332, 176336, 176340, 176344, + 176348, 176352, 176356, 176360, 176364, 176368, 176372, 176376, 176380, + 176384, 176388, 176392, 176396, 176400, 176404, 176408, 176412, 176416, + 176420, 176424, 176428, 176432, 176436, 176440, 176444, 176448, 176452, + 176456, 176460, 176464, 176468, 176472, 176476, 176480, 176484, 176488, + 176492, 176496, 176500, 176504, 176508, 176512, 176516, 176520, 176524, + 176528, 176532, 176536, 176540, 176544, 176548, 176552, 176556, 176560, + 176564, 176568, 176572, 176576, 176580, 176584, 176588, 176592, 176596, + 176600, 176604, 176608, 176612, 176616, 176620, 176624, 176628, 176632, + 176636, 176640, 176644, 176648, 176652, 176656, 176660, 176664, 176668, + 176672, 176676, 176680, 176684, 176688, 176692, 176696, 176700, 176704, + 176708, 176712, 176716, 176720, 176724, 176728, 176732, 176736, 176740, + 176744, 176748, 176752, 176756, 176760, 176764, 176768, 176772, 176776, + 176780, 176784, 176788, 176792, 176796, 176800, 176804, 176808, 176812, + 176816, 176820, 176824, 176828, 176832, 176836, 176840, 176844, 176848, + 176852, 176856, 176860, 176864, 176868, 176872, 176876, 176880, 176884, + 176888, 176892, 176896, 176900, 176904, 176908, 176912, 176916, 176920, + 176924, 176928, 176932, 176936, 176940, 176944, 176948, 176952, 176956, + 176960, 176964, 176968, 176972, 176976, 176980, 176984, 176988, 176992, + 176996, 177000, 177004, 177008, 177012, 177016, 177020, 177024, 177028, + 177032, 177036, 177040, 177044, 177048, 177052, 177056, 177060, 177064, + 177068, 177072, 177076, 177080, 177084, 177088, 177092, 177096, 177100, + 177104, 177108, 177112, 177116, 177120, 177124, 177128, 177132, 177136, + 177140, 177144, 177148, 177152, 177156, 177160, 177164, 177168, 177172, + 177176, 177180, 177184, 177188, 177192, 177196, 177200, 177204, 177208, + 177212, 177216, 177220, 177224, 177228, 177232, 177236, 177240, 177244, + 177248, 177252, 177256, 177260, 177264, 177268, 177272, 177276, 177280, + 177284, 177288, 177292, 177296, 177300, 177304, 177308, 177312, 177316, + 177320, 177324, 177328, 177332, 177336, 177340, 177344, 177348, 177352, + 177356, 177360, 177364, 177368, 177372, 177376, 177380, 177384, 177388, + 177392, 177396, 177400, 177404, 177408, 177412, 177416, 177420, 177424, + 177428, 177432, 177436, 177440, 177444, 177448, 177452, 177456, 177460, + 177464, 177468, 177472, 177476, 177480, 177484, 177488, 177492, 177496, + 177500, 177504, 177508, 177512, 177516, 177520, 177524, 177528, 177532, + 177536, 177540, 177544, 177548, 177552, 177556, 177560, 177564, 177568, + 177572, 177576, 177580, 177584, 177588, 177592, 177596, 177600, 177604, + 177608, 177612, 177616, 177620, 177624, 177628, 177632, 177636, 177640, + 177644, 177648, 177652, 177656, 177660, 177664, 177668, 177672, 177676, + 177680, 177684, 177688, 177692, 177696, 177700, 177704, 177708, 177712, + 177716, 177720, 177724, 177728, 177732, 177736, 177740, 177744, 177748, + 177752, 177756, 177760, 177764, 177768, 177772, 177776, 177780, 177784, + 177788, 177792, 177796, 177800, 177804, 177808, 177812, 177816, 177820, + 177824, 177828, 177832, 177836, 177840, 177844, 177848, 177852, 177856, + 177860, 177864, 177868, 177872, 177876, 177880, 177884, 177888, 177892, + 177896, 177900, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 177904, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177908, 177911, 177915, + 177919, 177922, 177926, 177930, 177933, 177936, 177940, 177944, 177947, + 177950, 177953, 177956, 177961, 177964, 177968, 177971, 177974, 177977, + 177980, 177983, 177986, 177989, 177992, 177995, 177998, 178001, 178005, + 178009, 178013, 178017, 178022, 178027, 178033, 178039, 178045, 178050, + 178056, 178062, 178068, 178073, 178079, 178085, 178090, 178096, 178102, + 178107, 178113, 178119, 178124, 178130, 178136, 178141, 178147, 178153, + 178159, 178165, 178171, 178175, 178180, 178184, 178189, 178193, 178198, + 178203, 178209, 178215, 178221, 178226, 178232, 178238, 178244, 178249, + 178255, 178261, 178266, 178272, 178278, 178283, 178289, 178295, 178300, + 178306, 178312, 178317, 178323, 178329, 178335, 178341, 178347, 178352, + 178356, 178361, 178364, 178368, 178371, 178374, 178377, 178380, 178383, + 178386, 178389, 178392, 178395, 178398, 178401, 178404, 178407, 178410, + 178413, 178416, 178419, 178422, 178425, 178428, 178431, 178434, 178437, + 178440, 178443, 178446, 178449, 178452, 178455, 178458, 178461, 178464, + 178467, 178470, 178473, 178476, 178479, 178482, 178485, 178488, 178491, + 178494, 178497, 178500, 178503, 178506, 178509, 178512, 178515, 178518, + 178521, 178524, 178527, 178530, 178533, 178536, 178539, 178542, 178545, + 178548, 178551, 178554, 178557, 178560, 178563, 178566, 178569, 178572, + 178575, 178578, 178581, 178584, 178587, 178590, 178593, 178596, 178599, + 178602, 178605, 178608, 178611, 178614, 178617, 178620, 178623, 178626, + 178629, 178632, 178635, 178638, 178641, 178644, 178647, 178650, 178653, + 178656, 178659, 178662, 178665, 178668, 178671, 178674, 178677, 178680, + 178683, 178686, 178689, 178692, 178695, 178698, 178701, 178704, 178707, + 178710, 178713, 178716, 178719, 178722, 178725, 178728, 178731, 178734, + 178737, 178740, 178743, 178746, 178749, 178752, 178755, 178758, 178761, + 178764, 178767, 178770, 178773, 178776, 178779, 178782, 178785, 178788, + 178791, 178794, 178797, 178800, 178803, 178806, 178809, 178812, 178815, + 178818, 178821, 178824, 178827, 178830, 178833, 178836, 178839, 178842, + 178845, 178848, 178851, 178854, 178857, 178860, 178863, 178866, 178869, + 178872, 178875, 178878, 178881, 178884, 178887, 178890, 178893, 178896, + 178899, 178902, 178905, 178908, 178911, 178914, 178917, 178920, 178923, + 178926, 178929, 178932, 178935, 178938, 178941, 178944, 178947, 178950, + 178953, 178956, 178959, 178962, 178965, 178968, 178971, 178974, 178977, + 178980, 178983, 178986, 178989, 178992, 178995, 178998, 179001, 179004, + 179007, 179010, 179013, 179016, 179019, 179022, 179025, 179028, 179031, + 179034, 179037, 179040, 179043, 179046, 179049, 179052, 179055, 179058, + 179061, 179064, 179067, 179070, 179073, 179076, 179079, 179082, 179085, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 179088, 179090, 179092, + 179097, 179099, 179104, 179106, 179111, 179113, 179118, 179120, 179122, + 179124, 179126, 179128, 179130, 179132, 179134, 179136, 179139, 179143, + 179145, 179147, 179151, 179155, 179160, 179162, 179164, 179166, 179170, + 179173, 179175, 179179, 179181, 179185, 179187, 179191, 179194, 179196, + 179200, 179204, 179206, 179212, 179214, 179219, 179221, 179226, 179228, + 179233, 179235, 179240, 179242, 179246, 179248, 179252, 179254, 179261, + 179263, 179265, 179267, 179272, 179274, 179276, 179278, 179280, 179282, + 179287, 179291, 179293, 179298, 179302, 179304, 179309, 179313, 179315, + 179320, 179324, 179326, 179328, 179330, 179332, 179336, 179338, 179343, + 179345, 179351, 179353, 179359, 179361, 179363, 179365, 179369, 179371, + 179378, 179380, 179387, 179389, 179394, 179400, 179402, 179408, 179415, + 179417, 179423, 179428, 179430, 179436, 179442, 179444, 179450, 179456, + 179458, 179464, 179468, 179470, 179475, 179477, 179479, 179484, 179486, + 179488, 179494, 179496, 179501, 179505, 179507, 179512, 179516, 179518, + 179524, 179526, 179530, 179532, 179536, 179538, 179545, 179552, 179554, + 179561, 179568, 179570, 179575, 179577, 179584, 179586, 179591, 179593, + 179599, 179601, 179605, 179607, 179613, 179615, 179619, 179621, 179627, + 179629, 179631, 179633, 179638, 179643, 179645, 179647, 179657, 179662, + 179669, 179676, 179681, 179686, 179698, 179702, 179706, 179710, 179714, + 179716, 179718, 179720, 179722, 179724, 179726, 179728, 179730, 179732, + 179734, 179736, 179738, 179740, 179742, 179744, 179746, 179748, 179750, + 179752, 179754, 179756, 179762, 179769, 179774, 179782, 179790, 179795, + 179797, 179799, 179801, 179803, 179805, 179807, 179809, 179811, 179813, + 179815, 179817, 179819, 179821, 179823, 179825, 179827, 179838, 179843, + 179845, 179847, 179853, 179865, 179871, 179877, 179883, 179889, 179893, + 179904, 179906, 179908, 179910, 179912, 179914, 179916, 179918, 179920, + 179922, 179924, 179926, 179928, 179930, 179932, 179934, 179936, 179938, + 179940, 179942, 179944, 179946, 179948, 179950, 179952, 179954, 179956, + 179958, 179960, 179962, 179964, 179966, 179968, 179970, 179972, 179974, + 179976, 179978, 179980, 179982, 179984, 179986, 179988, 179990, 179992, + 179994, 179996, 179998, 180000, 180002, 180004, 180006, 180008, 180010, + 180012, 180014, 180016, 180018, 180020, 180022, 180024, 180026, 180028, + 180030, 180032, 180034, 180036, 180038, 180040, 180042, 180044, 180046, + 180048, 180050, 180052, 180054, 180056, 180058, 180060, 180062, 180064, + 180066, 180068, 180070, 180072, 180074, 180076, 180078, 180080, 180082, + 180084, 180086, 180088, 180090, 180092, 180094, 180096, 180098, 180100, + 180102, 180104, 180106, 180108, 180110, 180112, 180114, 180116, 180118, + 180120, 180122, 180124, 180126, 180128, 180130, 180132, 180134, 180136, + 180138, 180140, 180142, 180144, 180146, 180148, 180150, 180152, 180154, + 180156, 180158, 180160, 180162, 180164, 180166, 180168, 180170, 180172, + 180174, 180176, 180178, 180180, 180182, 180184, 180186, 180188, 180190, + 180192, 180194, 180196, 180198, 180200, 180202, 180204, 180206, 180208, + 180210, 180212, 180214, 180216, 180218, 180220, 180222, 180224, 180226, + 180228, 180230, 180232, 180234, 180236, 180238, 180240, 180242, 180244, + 180246, 180248, 180250, 180252, 180254, 180256, 180258, 180260, 180262, + 180264, 180266, 180268, 180270, 180272, 180274, 180276, 180278, 180280, + 180282, 180284, 180286, 180288, 180290, 180292, 180294, 180296, 180298, + 180300, 180302, 180304, 180306, 180308, 180310, 180312, 180314, 180316, + 180318, 180320, 180322, 180324, 180326, 180328, 180330, 180332, 180334, + 180336, 180338, 180340, 180342, 180344, 180346, 180348, 180350, 180352, + 180354, 180356, 180358, 180360, 180362, 180364, 180366, 180368, 180370, + 180372, 180374, 180376, 180378, 180380, 180382, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180384, 180388, 180392, 180397, + 180401, 180405, 180409, 180413, 180417, 180421, 180425, 180429, 180433, + 180443, 180453, 180463, 180473, 180487, 180501, 180514, 180527, 180538, + 180549, 180560, 180571, 180582, 180593, 180603, 180612, 180621, 180630, + 180643, 180656, 180668, 180680, 180690, 180700, 180710, 180720, 180729, + 180738, 180748, 180758, 180768, 180778, 180789, 180800, 180810, 180820, + 180831, 180842, 180853, 180864, 180874, 180887, 180898, 180912, 180920, + 180931, 180939, 180947, 180955, 180963, 180971, 180979, 180988, 180997, + 181007, 181017, 181026, 181035, 181045, 181055, 181063, 181071, 181078, + 181087, 181095, 181103, 181110, 181120, 181129, 181140, 181151, 181163, + 181174, 181184, 181195, 181205, 181216, 181224, 181229, 181233, 181237, + 181241, 181245, 181249, 181253, 181257, 181261, 181265, 181269, 181273, + 181276, 181279, 181283, 181287, 181291, 181295, 181299, 181303, 181307, + 181311, 181315, 181319, 181323, 181327, 181331, 181335, 181339, 181343, + 181347, 181351, 181355, 181359, 181363, 181367, 181371, 181375, 181379, + 181383, 181387, 181391, 181395, 181399, 181403, 181407, 181411, 181415, + 181419, 181423, 181427, 181431, 181435, 181439, 181443, 181447, 181451, + 181455, 181459, 181463, 181467, 181471, 181475, 181479, 181483, 181487, + 181491, 181495, 181499, 181503, 181507, 181511, 181515, 181519, 181523, + 181527, 181531, 181535, 181539, 181543, 181547, 181551, 181555, 181559, + 181563, 181567, 181571, 181575, 181579, 181583, 181587, 181591, 181595, + 181599, 181603, 181607, 181611, 181615, 181619, 181622, 181626, 181630, + 181634, 181638, 181642, 181646, 181650, 181654, 181658, 181662, 181666, + 181670, 181674, 181678, 181682, 181686, 181690, 181694, 181698, 181702, + 181706, 181710, 181714, 181718, 181722, 181726, 181730, 181734, 181738, + 181742, 181746, 181750, 181754, 181758, 181762, 181766, 181770, 181774, + 181778, 181782, 181786, 181790, 181794, 181798, 181802, 181806, 181810, + 181814, 181818, 181822, 181826, 181830, 181834, 181838, 181842, 181846, + 181850, 181854, 181858, 181862, 181866, 181870, 181874, 181878, 181882, + 181886, 181890, 181894, 181898, 181902, 181906, 181910, 181914, 181918, + 181922, 181926, 181930, 181934, 181938, 181942, 181946, 181950, 181954, + 181958, 181962, 181966, 181970, 181974, 181978, 181982, 181986, 181990, + 181994, 181998, 182002, 182006, 182010, 182014, 182018, 182022, 182026, + 182030, 182034, 182038, 182042, 182046, 182050, 182054, 182058, 182062, + 182066, 182070, 182074, 182078, 182082, 182086, 182090, 182094, 182098, + 182102, 182106, 182110, 182114, 182118, 182122, 182126, 182130, 182134, + 182138, 182142, 182146, 182150, 182154, 182158, 182162, 182166, 182170, + 182174, 182178, 182182, 182186, 182190, 182194, 182198, 182202, 182206, + 182210, 182214, 182218, 182222, 182226, 182230, 182234, 182238, 182242, + 182246, 182250, 182254, 182258, 182262, 182266, 182270, 182274, 182278, + 182282, 182286, 182290, 182294, 182298, 182302, 182306, 182310, 182314, + 182318, 182322, 182326, 182330, 182334, 182338, 182342, 182346, 182350, + 182354, 182358, 182362, 182366, 182370, 182374, 182378, 182382, 182386, + 182391, 182396, 182401, 182405, 182411, 182418, 182425, 182432, 182439, + 182446, 182453, 182460, 182467, 182474, 182481, 182488, 182495, 182502, + 182508, 182514, 182521, 182527, 182534, 182541, 182548, 182555, 182562, + 182569, 182576, 182583, 182590, 182597, 182604, 182611, 182618, 182624, + 182630, 182636, 182643, 182652, 182661, 182670, 182679, 182684, 182689, + 182695, 182701, 182707, 182713, 182719, 182725, 182731, 182737, 182743, + 182749, 182755, 182761, 182766, 182772, 182782, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 125213, 125217, 125221, 125225, 125229, 125233, 125237, - 125241, 125245, 125249, 125253, 125257, 125261, 125265, 125269, 125273, - 125277, 125281, 125285, 125289, 125293, 125297, 125301, 125305, 125309, - 125313, 125317, 125321, 125325, 125329, 125333, 125337, 125341, 125345, - 125349, 125353, 125357, 125361, 125365, 125369, 125373, 125377, 125381, - 125385, 125389, 125393, 125397, 125401, 125405, 125409, 125413, 125417, - 125421, 125425, 125429, 125433, 125437, 125441, 125445, 125449, 125453, - 125457, 125461, 125465, 125469, 125473, 125477, 125481, 125485, 125489, - 125493, 125497, 125501, 125505, 125509, 125513, 125517, 125521, 125525, - 125529, 125533, 125537, 125541, 125545, 125549, 125553, 125557, 125561, - 125565, 125569, 125573, 125577, 125581, 125585, 125589, 125593, 125597, - 125601, 125605, 125609, 125613, 125617, 125621, 125625, 125629, 125633, - 125637, 125641, 125645, 125649, 125653, 125657, 125661, 125665, 125669, - 125673, 125677, 125681, 125685, 125689, 125693, 125697, 125701, 125705, - 125709, 125713, 125717, 125721, 125725, 125729, 125733, 125737, 125741, - 125745, 125749, 125753, 125757, 125761, 125765, 125769, 125773, 125777, - 125781, 125785, 125789, 125793, 125797, 125801, 125805, 125809, 125813, - 125817, 125821, 125825, 125829, 125833, 125837, 125841, 125845, 125849, - 125853, 125857, 125861, 125865, 125869, 125873, 125877, 125881, 125885, - 125889, 125893, 125897, 125901, 125905, 125909, 125913, 125917, 125921, - 125925, 125929, 125933, 125937, 125941, 125945, 125949, 125953, 125957, - 125961, 125965, 125969, 125973, 125977, 125981, 125985, 125989, 125993, - 125997, 126001, 126005, 126009, 126013, 126017, 126021, 126025, 126029, - 126033, 126037, 126041, 126045, 126049, 126053, 126057, 126061, 126065, - 126069, 126073, 126077, 126081, 126085, 126089, 126093, 126097, 126101, - 126105, 126109, 126113, 126117, 126121, 126125, 126129, 126133, 126137, - 126141, 126145, 126149, 126153, 126157, 126161, 126165, 126169, 126173, - 126177, 126181, 126185, 126189, 126193, 126197, 126201, 126205, 126209, - 126213, 126217, 126221, 126225, 126229, 126233, 126237, 126241, 126245, - 126249, 126253, 126257, 126261, 126265, 126269, 126273, 126277, 126281, - 126285, 126289, 126293, 126297, 126301, 126305, 126309, 126313, 126317, - 126321, 126325, 126329, 126333, 126337, 126341, 126345, 126349, 126353, - 126357, 126361, 126365, 126369, 126373, 126377, 126381, 126385, 126389, - 126393, 126397, 126401, 126405, 126409, 126413, 126417, 126421, 126425, - 126429, 126433, 126437, 126441, 126445, 126449, 126453, 126457, 126461, - 126465, 126469, 126473, 126477, 126481, 126485, 126489, 126493, 126497, - 126501, 126505, 126509, 126513, 126517, 126521, 126525, 126529, 126533, - 126537, 126541, 126545, 126549, 126553, 126557, 126561, 126565, 126569, - 126573, 126577, 126581, 126585, 126589, 126593, 126597, 126601, 126605, - 126609, 126613, 126617, 126621, 126625, 126629, 126633, 126637, 126641, - 126645, 126649, 126653, 126657, 126661, 126665, 126669, 126673, 126677, - 126681, 126685, 126689, 126693, 126697, 126701, 126705, 126709, 126713, - 126717, 126721, 126725, 126729, 126733, 126737, 126741, 126745, 126749, - 126753, 126757, 126761, 126765, 126769, 126773, 126777, 126781, 126785, - 126789, 126793, 126797, 126801, 126805, 126809, 126813, 126817, 126821, - 126825, 126829, 126833, 126837, 126841, 126845, 126849, 126853, 126857, - 126861, 126865, 126869, 126873, 126877, 126881, 126885, 126889, 126893, - 126897, 126901, 126905, 126909, 126913, 126917, 126921, 126925, 126929, - 126933, 126937, 126941, 126945, 126949, 126953, 126957, 126961, 126965, - 126969, 126973, 126977, 126981, 126985, 126989, 126993, 126997, 127001, - 127005, 127009, 127013, 127017, 127021, 127025, 127029, 127033, 127037, - 127041, 127045, 127049, 127053, 127057, 127061, 127065, 127069, 127073, - 127077, 127081, 127085, 127089, 127093, 127097, 127101, 127105, 127109, - 127113, 127117, 127121, 127125, 127129, 127133, 127137, 127141, 127145, - 127149, 127153, 127157, 127161, 127165, 127169, 127173, 127177, 127181, - 127185, 127189, 127193, 127197, 127201, 127205, 127209, 127213, 127217, - 127221, 127225, 127229, 127233, 127237, 127241, 127245, 127249, 127253, - 127257, 127261, 127265, 127269, 127273, 127277, 127281, 127285, 127289, - 127293, 127297, 127301, 127305, 127309, 127313, 127317, 127321, 127325, - 127329, 127333, 127337, 127341, 127345, 127349, 127353, 127357, 127361, - 127365, 127369, 127373, 127377, 127381, 127385, 127389, 127393, 127397, - 127401, 127405, 127409, 127413, 127417, 127421, 127425, 127429, 127433, - 127437, 127441, 127445, 127449, 127453, 127457, 127461, 127465, 127469, - 127473, 127477, 127481, 127485, 127489, 127493, 127497, 127501, 127505, - 127509, 127513, 127517, 127521, 127525, 127529, 127533, 127537, 127541, - 127545, 127549, 127553, 127557, 127561, 127565, 127569, 127573, 127577, - 127581, 127585, 127589, 127593, 127597, 127601, 127605, 127609, 127613, - 127617, 127621, 127625, 127629, 127633, 127637, 127641, 127645, 127649, - 127653, 127657, 127661, 127665, 127669, 127673, 127677, 127681, 127685, - 127689, 127693, 127697, 127701, 127705, 127709, 127713, 127717, 127721, - 127725, 127729, 127733, 127737, 127741, 127745, 127749, 127753, 127757, - 127761, 127765, 127769, 127773, 127777, 127781, 127785, 127789, 127793, - 127797, 127801, 127805, 127809, 127813, 127817, 127821, 127825, 127829, - 127833, 127837, 127841, 127845, 127849, 127853, 127857, 127861, 127865, - 127869, 127873, 127877, 127881, 127885, 127889, 127893, 127897, 127901, - 127905, 127909, 127913, 127917, 127921, 127925, 127929, 127933, 127937, - 127941, 127945, 127949, 127953, 127957, 127961, 127965, 127969, 127973, - 127977, 127981, 127985, 127989, 127993, 127997, 128001, 128005, 128009, - 128013, 128017, 128021, 128025, 128029, 128033, 128037, 128041, 128045, - 128049, 128053, 128057, 128061, 128065, 128069, 128073, 128077, 128081, - 128085, 128089, 128093, 128097, 128101, 128105, 128109, 128113, 128117, - 128121, 128125, 128129, 128133, 128137, 128141, 128145, 128149, 128153, - 128157, 128161, 128165, 128169, 128173, 128177, 128181, 128185, 128189, - 128193, 128197, 128201, 128205, 128209, 128213, 128217, 128221, 128225, - 128229, 128233, 128237, 128241, 128245, 128249, 128253, 128257, 128261, - 128265, 128269, 128273, 128277, 128281, 128285, 128289, 128293, 128297, - 128301, 128305, 128309, 128313, 128317, 128321, 128325, 128329, 128333, - 128337, 128341, 128345, 128349, 128353, 128357, 128361, 128365, 128369, - 128373, 128377, 128381, 128385, 128389, 128393, 128397, 128401, 128405, - 128409, 128413, 128417, 128421, 128425, 128429, 128433, 128437, 128441, - 128445, 128449, 128453, 128457, 128461, 128465, 128469, 128473, 128477, - 128481, 128485, 128489, 128493, 128497, 128501, 128505, 128509, 128513, - 128517, 128521, 128525, 128529, 128533, 128537, 128541, 128545, 128549, - 128553, 128557, 128561, 128565, 128569, 128573, 128577, 128581, 128585, - 128589, 128593, 128597, 128601, 128605, 128609, 128613, 128617, 128621, - 128625, 128629, 128633, 128637, 128641, 128645, 128649, 128653, 128657, - 128661, 128665, 128669, 128673, 128677, 128681, 128685, 128689, 128693, - 128697, 128701, 128705, 128709, 128713, 128717, 128721, 128725, 128729, - 128733, 128737, 128741, 128745, 128749, 128753, 128757, 128761, 128765, - 128769, 128773, 128777, 128781, 128785, 128789, 128793, 128797, 128801, - 128805, 128809, 128813, 128817, 128821, 128825, 128829, 128833, 128837, - 128841, 128845, 128849, 128853, 128857, 128861, 128865, 128869, 128873, - 128877, 128881, 128885, 128889, 128893, 128897, 128901, 128905, 128909, - 128913, 128917, 128921, 128925, 128929, 128933, 128937, 128941, 128945, - 128949, 128953, 128957, 128961, 128965, 128969, 128973, 128977, 128981, - 128985, 128989, 128993, 128997, 129001, 129005, 129009, 129013, 129017, - 129021, 129025, 129029, 129033, 129037, 129041, 129045, 129049, 129053, - 129057, 129061, 129065, 129069, 129073, 129077, 129081, 129085, 129089, - 129093, 129097, 129101, 129105, 129109, 129113, 129117, 129121, 129125, - 129129, 129133, 129137, 129141, 129145, 129149, 129153, 129157, 129161, - 129165, 129169, 129173, 129177, 129181, 129185, 129189, 129193, 129197, - 129201, 129205, 129209, 129213, 129217, 129221, 129225, 129229, 129233, - 129237, 129241, 129245, 129249, 129253, 129257, 129261, 129265, 129269, - 129273, 129277, 129281, 129285, 129289, 129293, 129297, 129301, 129305, - 129309, 129313, 129317, 129321, 129325, 129329, 129333, 129337, 129341, - 129345, 129349, 129353, 129357, 129361, 129365, 129369, 129373, 129377, - 129381, 129385, 129389, 129393, 129397, 129401, 129405, 129409, 129413, - 129417, 129421, 129425, 129429, 129433, 129437, 129441, 129445, 129449, - 129453, 129457, 129461, 129465, 129469, 129473, 129477, 129481, 129485, - 129489, 129493, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129497, - 129501, 129505, 129509, 129513, 129517, 129521, 129525, 129529, 129533, - 129537, 129541, 129545, 129549, 129553, 129557, 129561, 129565, 129569, - 129573, 129577, 129581, 129585, 129589, 129593, 129597, 129601, 129605, - 129609, 129613, 129617, 129621, 129625, 129629, 129633, 129637, 129641, - 129645, 129649, 129653, 129657, 129661, 129665, 129669, 129673, 129677, - 129681, 129685, 129689, 129693, 129697, 129701, 129705, 129709, 129713, - 129717, 129721, 129725, 129729, 129733, 129737, 129741, 129745, 129749, - 129753, 129757, 129761, 129765, 129769, 129773, 129777, 129781, 129785, - 129789, 129793, 129797, 129801, 129805, 129809, 129813, 129817, 129821, - 129825, 129829, 129833, 129837, 129841, 129845, 129849, 129853, 129857, - 129861, 129865, 129869, 129873, 129877, 129881, 129885, 129889, 129893, - 129897, 129901, 129905, 129909, 129913, 129917, 129921, 129925, 129929, - 129933, 129937, 129941, 129945, 129949, 129953, 129957, 129961, 129965, - 129969, 129973, 129977, 129981, 129985, 129989, 129993, 129997, 130001, - 130005, 130009, 130013, 130017, 130021, 130025, 130029, 130033, 130037, - 130041, 130045, 130049, 130053, 130057, 130061, 130065, 130069, 130073, - 130077, 130081, 130085, 130089, 130093, 130097, 130101, 130105, 130109, - 130113, 130117, 130121, 130125, 130129, 130133, 130137, 130141, 130145, - 130149, 130153, 130157, 130161, 130165, 130169, 130173, 130177, 130181, - 130185, 130189, 130193, 130197, 130201, 130205, 130209, 130213, 130217, - 130221, 130225, 130229, 130233, 130237, 130241, 130245, 130249, 130253, - 130257, 130261, 130265, 130269, 130273, 130277, 130281, 130285, 130289, - 130293, 130297, 130301, 130305, 130309, 130313, 130317, 130321, 130325, - 130329, 130333, 130337, 130341, 130345, 130349, 130353, 130357, 130361, - 130365, 130369, 130373, 130377, 130381, 130385, 130389, 130393, 130397, - 130401, 130405, 130409, 130413, 130417, 130421, 130425, 130429, 130433, - 130437, 130441, 130445, 130449, 130453, 130457, 130461, 130465, 130469, - 130473, 130477, 130481, 130485, 130489, 130493, 130497, 130501, 130505, - 130509, 130513, 130517, 130521, 130525, 130529, 130533, 130537, 130541, - 130545, 130549, 130553, 130557, 130561, 130565, 130569, 130573, 130577, - 130581, 130585, 130589, 130593, 130597, 130601, 130605, 130609, 130613, - 130617, 130621, 130625, 130629, 130633, 130637, 130641, 130645, 130649, - 130653, 130657, 130661, 130665, 130669, 130673, 130677, 130681, 130685, - 130689, 130693, 130697, 130701, 130705, 130709, 130713, 130717, 130721, - 130725, 130729, 130733, 130737, 130741, 130745, 130749, 130753, 130757, - 130761, 130765, 130769, 130773, 130777, 130781, 130785, 130789, 130793, - 130797, 130801, 130805, 130809, 130813, 130817, 130821, 130825, 130829, - 130833, 130837, 130841, 130845, 130849, 130853, 130857, 130861, 130865, - 130869, 130873, 130877, 130881, 130885, 130889, 130893, 130897, 130901, - 130905, 130909, 130913, 130917, 130921, 130925, 130929, 130933, 130937, - 130941, 130945, 130949, 130953, 130957, 130961, 130965, 130969, 130973, - 130977, 130981, 130985, 130989, 130993, 130997, 131001, 131005, 131009, - 131013, 131017, 131021, 131025, 131029, 131033, 131037, 131041, 131045, - 131049, 131053, 131057, 131061, 131065, 131069, 131073, 131077, 131081, - 131085, 131089, 131093, 131097, 131101, 131105, 131109, 131113, 131117, - 131121, 131125, 131129, 131133, 131137, 131141, 131145, 131149, 131153, - 131157, 131161, 131165, 131169, 131173, 131177, 131181, 131185, 131189, - 131193, 131197, 131201, 131205, 131209, 131213, 131217, 131221, 131225, - 131229, 131239, 131243, 131247, 131251, 131255, 131259, 131263, 131267, - 131271, 131275, 131279, 131283, 131288, 131292, 131296, 131300, 131304, - 131308, 131312, 131316, 131320, 131324, 131328, 131332, 131336, 131340, - 131344, 131348, 131352, 131361, 131370, 131374, 131378, 131382, 131386, - 131390, 131394, 131398, 131402, 131406, 131410, 131414, 131418, 131422, - 131426, 131430, 131434, 131438, 131442, 131446, 131450, 131454, 131458, - 131462, 131466, 131470, 131474, 131478, 131482, 131486, 131490, 131494, - 131498, 131502, 131506, 131510, 131514, 131518, 131522, 131526, 131530, - 131534, 131538, 131542, 131546, 131550, 131554, 131558, 131562, 131566, - 131570, 131574, 131578, 131582, 131586, 131590, 131594, 131598, 131602, - 131606, 131610, 131614, 131618, 131622, 131626, 131630, 131634, 131638, - 131642, 131646, 131650, 131654, 131658, 131662, 131666, 131670, 131674, - 131678, 131682, 131686, 131690, 131694, 131698, 131702, 131706, 131710, - 131714, 131718, 131722, 131726, 131730, 131734, 131738, 131742, 131746, - 131750, 131754, 131758, 131762, 131766, 131770, 131774, 131778, 131782, - 131786, 131790, 131794, 131798, 131802, 131806, 131810, 131814, 131818, - 131822, 131826, 131830, 131834, 131838, 131842, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 131846, 131854, 131862, 131872, 131882, - 131890, 131896, 131904, 131912, 131922, 131934, 131946, 131952, 131960, - 131966, 131972, 131978, 131984, 131990, 131996, 132002, 132008, 132014, - 132020, 132026, 132034, 132042, 132048, 132054, 132060, 132066, 132074, - 132082, 132091, 132097, 132105, 132111, 132117, 132123, 132129, 132135, - 132143, 132151, 132157, 132163, 132169, 132175, 132181, 132187, 132193, - 132199, 132205, 132211, 132217, 132223, 132229, 132235, 132241, 132247, - 132253, 132259, 132265, 132273, 132279, 132285, 132295, 132303, 132309, - 132315, 132321, 132327, 132333, 132339, 132345, 132351, 132357, 132363, - 132369, 132375, 132381, 132387, 132393, 132399, 132405, 132411, 132417, - 132423, 132429, 132435, 132443, 132449, 132457, 132465, 132473, 132479, - 132485, 132491, 132497, 132503, 132511, 132521, 132529, 132537, 132543, - 132549, 132557, 132565, 132571, 132579, 132587, 132595, 132601, 132607, - 132613, 132619, 132625, 132631, 132639, 132647, 132653, 132659, 132665, - 132671, 132677, 132685, 132691, 132697, 132703, 132709, 132715, 132721, - 132729, 132735, 132741, 132747, 132753, 132761, 132769, 132775, 132781, - 132787, 132792, 132798, 132804, 132811, 132816, 132821, 132826, 132831, - 132836, 132841, 132846, 132851, 132856, 132865, 132872, 132877, 132882, - 132887, 132894, 132899, 132904, 132909, 132916, 132921, 132926, 132931, - 132936, 132941, 132946, 132951, 132956, 132961, 132966, 132971, 132978, - 132983, 132990, 132995, 133000, 133007, 133012, 133017, 133022, 133027, - 133032, 133037, 133042, 133047, 133052, 133057, 133062, 133067, 133072, - 133077, 133082, 133087, 133092, 133097, 133102, 133109, 133114, 133119, - 133124, 133129, 133134, 133139, 133144, 133149, 133154, 133159, 133164, - 133169, 133174, 133181, 133186, 133191, 133198, 133203, 133208, 133213, - 133218, 133223, 133228, 133233, 133238, 133243, 133248, 133255, 133260, - 133265, 133270, 133275, 133280, 133287, 133294, 133299, 133304, 133309, - 133314, 133319, 133324, 133329, 133334, 133339, 133344, 133349, 133354, - 133359, 133364, 133369, 133374, 133379, 133384, 133389, 133394, 133399, - 133404, 133409, 133414, 133419, 133424, 133429, 133434, 133439, 133444, - 133449, 133454, 133459, 133464, 133469, 133474, 133481, 133486, 133491, - 133496, 133501, 133506, 133511, 133516, 133521, 133526, 133531, 133536, - 133541, 133546, 133551, 133556, 133561, 133566, 133571, 133576, 133581, - 133586, 133591, 133596, 133601, 133606, 133611, 133616, 133621, 133626, - 133631, 133636, 133641, 133646, 133651, 133656, 133661, 133666, 133671, - 133676, 133681, 133686, 133691, 133696, 133701, 133706, 133711, 133716, - 133721, 133726, 133731, 133736, 133741, 133746, 133751, 133756, 133761, - 133766, 133771, 133778, 133783, 133788, 133793, 133798, 133803, 133808, - 133813, 133818, 133823, 133828, 133833, 133838, 133843, 133848, 133853, - 133858, 133863, 133868, 133873, 133878, 133883, 133890, 133895, 133900, - 133906, 133911, 133916, 133921, 133926, 133931, 133936, 133941, 133946, - 133951, 133956, 133961, 133966, 133971, 133976, 133981, 133986, 133991, - 133996, 134001, 134006, 134011, 134016, 134021, 134026, 134031, 134036, - 134041, 134046, 134051, 134056, 134061, 134066, 134071, 134076, 134081, - 134086, 134091, 134096, 134101, 134106, 134111, 134116, 134121, 134128, - 134133, 134138, 134145, 134152, 134157, 134162, 134167, 134172, 134177, - 134182, 134187, 134192, 134197, 134202, 134207, 134212, 134217, 134222, - 134227, 134232, 134237, 134242, 134247, 134252, 134257, 134262, 134267, - 134272, 134277, 134284, 134289, 134294, 134299, 134304, 134309, 134314, - 134319, 134324, 134329, 134334, 134339, 134344, 134349, 134354, 134359, - 134364, 134369, 134374, 134381, 134386, 134391, 134396, 134401, 134406, - 134411, 134416, 134422, 134427, 134432, 134437, 134442, 134447, 134452, - 134457, 134462, 134469, 134476, 134481, 134486, 134490, 134495, 134499, - 134503, 134508, 134515, 134520, 134525, 134534, 134539, 134544, 134549, - 134554, 134561, 134568, 134573, 134578, 134583, 134588, 134595, 134600, - 134605, 134610, 134615, 134620, 134625, 134630, 134635, 134640, 134645, - 134650, 134655, 134662, 134666, 134671, 134676, 134681, 134686, 134690, - 134695, 134700, 134705, 134710, 134715, 134720, 134725, 134730, 134735, - 134741, 134747, 134753, 134759, 134765, 134770, 134776, 134782, 134788, - 134794, 134800, 134806, 134812, 134818, 134824, 134830, 134836, 134842, - 134848, 134854, 134860, 134866, 134872, 134878, 134883, 134889, 134895, - 134901, 134907, 134913, 134919, 134925, 134931, 134937, 134943, 134949, - 134955, 134961, 134967, 134973, 134979, 134985, 134991, 134997, 135003, - 135008, 135014, 135020, 135026, 135032, 135038, 0, 0, 0, 0, 0, 0, 0, - 135044, 135049, 135054, 135059, 135064, 135069, 135074, 135078, 135083, - 135088, 135093, 135098, 135103, 135108, 135113, 135118, 135123, 135127, - 135132, 135136, 135141, 135146, 135151, 135156, 135161, 135165, 135170, - 135175, 135179, 135184, 135189, 0, 135194, 135199, 135203, 135207, - 135211, 135215, 135219, 135223, 135227, 135231, 0, 0, 0, 0, 135235, - 135239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 135244, 135251, 135257, 135264, 135271, 135278, 135285, 135292, - 135299, 135306, 135313, 135320, 135327, 135334, 135341, 135348, 135355, - 135362, 135368, 135375, 135382, 135389, 135395, 135402, 135408, 135414, - 135421, 135427, 135434, 135440, 0, 0, 135446, 135454, 135462, 135471, - 135480, 135489, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135497, 135502, 135507, - 135512, 135517, 135522, 135527, 135532, 135537, 135542, 135547, 135552, - 135557, 135562, 135567, 135572, 135577, 135582, 135587, 135592, 135597, - 135602, 135607, 135612, 135617, 135622, 135627, 135632, 135637, 135642, - 135647, 135652, 135657, 135662, 135667, 135672, 135677, 135682, 135687, - 135692, 135697, 135702, 135707, 135712, 135717, 135722, 135727, 135732, - 135737, 135744, 135751, 135758, 135765, 135772, 135779, 135786, 135793, - 135802, 135809, 135816, 135823, 135830, 135837, 135844, 135851, 135858, - 135865, 135872, 135879, 135884, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135893, - 135898, 135902, 135906, 135910, 135914, 135918, 135922, 135926, 135930, - 0, 135934, 135939, 135944, 135951, 135956, 135963, 135970, 0, 135975, - 135982, 135987, 135992, 135999, 136006, 136011, 136016, 136021, 136026, - 136031, 136038, 136045, 136050, 136055, 136060, 136073, 136082, 136089, - 136098, 136107, 0, 0, 0, 0, 0, 136116, 136123, 136130, 136137, 136144, - 136151, 136158, 136165, 136172, 136179, 136186, 136193, 136200, 136207, - 136214, 136221, 136228, 136235, 136242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136249, - 136255, 136261, 136267, 136273, 136279, 136285, 136291, 136297, 136303, - 136309, 136315, 136320, 136326, 136331, 136337, 136342, 136348, 136354, - 136359, 136365, 136370, 136376, 136382, 136388, 136394, 136400, 136406, - 136412, 136417, 136422, 136428, 136434, 136440, 136446, 136452, 136458, - 136464, 136470, 136476, 136482, 136488, 136494, 136500, 136505, 136511, - 136516, 136522, 136527, 136533, 136539, 136544, 136550, 136555, 136561, - 136567, 136573, 136579, 136585, 136591, 136597, 136602, 136607, 136613, - 136619, 136624, 136628, 136632, 136636, 136640, 136644, 136648, 136652, - 136656, 136660, 136665, 136670, 136675, 136680, 136685, 136690, 136695, - 136700, 136705, 136710, 136717, 136724, 136731, 136735, 136741, 136746, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 136752, 136755, 136759, 136763, 136767, 136770, 136774, - 136779, 136783, 136787, 136791, 136795, 136799, 136804, 136809, 136813, - 136817, 136820, 136824, 136829, 136834, 136838, 136842, 136845, 136849, - 136853, 136857, 136861, 136865, 136869, 136873, 136876, 136880, 136884, - 136888, 136892, 136896, 136900, 136906, 136909, 136913, 136917, 136921, - 136925, 136929, 136933, 136937, 136941, 136945, 136950, 136955, 136961, - 136965, 136969, 136973, 136977, 136981, 136985, 136990, 136993, 136997, - 137001, 137005, 137009, 137015, 137019, 137023, 137027, 137031, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 137035, 137039, 137043, 137049, 137055, 137059, - 137064, 137069, 137074, 137079, 137083, 137088, 137093, 137098, 137102, - 137107, 137112, 137117, 137121, 137126, 137131, 137136, 137141, 137146, - 137151, 137156, 137161, 137165, 137170, 137175, 137180, 137185, 137190, - 137195, 137200, 137205, 137210, 137215, 137220, 137227, 137232, 137239, - 137244, 137249, 137254, 137259, 137264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 137269, 137273, 137279, 137282, 137285, 137289, 137293, - 137297, 137301, 137305, 137309, 137313, 137319, 137325, 137331, 137337, - 137343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137349, 137353, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 137357, 137360, 137363, 137366, 137369, 137372, 137375, - 137378, 137381, 137384, 137387, 137390, 137393, 137396, 137399, 137402, - 137405, 137408, 137411, 137414, 137417, 137420, 137423, 137426, 137429, - 137432, 137435, 137438, 137441, 137444, 137447, 137450, 137453, 137456, - 137459, 137462, 137465, 137468, 137471, 137474, 137477, 137480, 137483, - 137486, 137489, 137492, 137495, 137498, 137501, 137504, 137507, 137510, - 137513, 137516, 137519, 137522, 137525, 137528, 137531, 137534, 137537, - 137540, 137543, 137546, 137549, 137552, 137555, 137558, 137561, 137564, - 137567, 137570, 137573, 137576, 137579, 137582, 137585, 137588, 137591, - 137594, 137597, 137600, 137603, 137606, 137609, 137612, 137615, 137618, - 137621, 137624, 137627, 137630, 137633, 137636, 137639, 137642, 137645, - 137648, 137651, 137654, 137657, 137660, 137663, 137666, 137669, 137672, - 137675, 137678, 137681, 137684, 137687, 137690, 137693, 137696, 137699, - 137702, 137705, 137708, 137711, 137714, 137717, 137720, 137723, 137726, - 137729, 137732, 137735, 137738, 137741, 137744, 137747, 137750, 137753, - 137756, 137759, 137762, 137765, 137768, 137771, 137774, 137777, 137780, - 137783, 137786, 137789, 137792, 137795, 137798, 137801, 137804, 137807, - 137810, 137813, 137816, 137819, 137822, 137825, 137828, 137831, 137834, - 137837, 137840, 137843, 137846, 137849, 137852, 137855, 137858, 137861, - 137864, 137867, 137870, 137873, 137876, 137879, 137882, 137885, 137888, - 137891, 137894, 137897, 137900, 137903, 137906, 137909, 137912, 137915, - 137918, 137921, 137924, 137927, 137930, 137933, 137936, 137939, 137942, - 137945, 137948, 137951, 137954, 137957, 137960, 137963, 137966, 137969, - 137972, 137975, 137978, 137981, 137984, 137987, 137990, 137993, 137996, - 137999, 138002, 138005, 138008, 138011, 138014, 138017, 138020, 138023, - 138026, 138029, 138032, 138035, 138038, 138041, 138044, 138047, 138050, - 138053, 138056, 138059, 138062, 138065, 138068, 138071, 138074, 138077, - 138080, 138083, 138086, 138089, 138092, 138095, 138098, 138101, 138104, - 138107, 138110, 138113, 138116, 138119, 138122, 138125, 138128, 138131, - 138134, 138137, 138140, 138143, 138146, 138149, 138152, 138155, 138158, - 138161, 138164, 138167, 138170, 138173, 138176, 138179, 138182, 138185, - 138188, 138191, 138194, 138197, 138200, 138203, 138206, 138209, 138212, - 138215, 138218, 138221, 138224, 138227, 138230, 138233, 138236, 138239, - 138242, 138245, 138248, 138251, 138254, 138257, 138260, 138263, 138266, - 138269, 138272, 138275, 138278, 138281, 138284, 138287, 138290, 138293, - 138296, 138299, 138302, 138305, 138308, 138311, 138314, 138317, 138320, - 138323, 138326, 138329, 138332, 138335, 138338, 138341, 138344, 138347, - 138350, 138353, 138356, 138359, 138362, 138365, 138368, 138371, 138374, - 138377, 138380, 138383, 138386, 138389, 138392, 138395, 138398, 138401, - 138404, 138407, 138410, 138413, 138416, 138419, 138422, 138425, 138428, - 138431, 138434, 138437, 138440, 138443, 138446, 138449, 138452, 138455, - 138458, 138461, 138464, 138467, 138470, 138473, 138476, 138479, 138482, - 138485, 138488, 138491, 138494, 138497, 138500, 138503, 138506, 138509, - 138512, 138515, 138518, 138521, 138524, 138527, 138530, 138533, 138536, - 138539, 138542, 138545, 138548, 138551, 138554, 138557, 138560, 138563, - 138566, 138569, 138572, 138575, 138578, 138581, 138584, 138587, 138590, - 138593, 138596, 138599, 138602, 138605, 138608, 138611, 138614, 138617, - 138620, 138623, 138626, 138629, 138632, 138635, 138638, 138641, 138644, - 138647, 138650, 138653, 138656, 138659, 138662, 138665, 138668, 138671, - 138674, 138677, 138680, 138683, 138686, 138689, 138692, 138695, 138698, - 138701, 138704, 138707, 138710, 138713, 138716, 138719, 138722, 138725, - 138728, 138731, 138734, 138737, 138740, 138743, 138746, 138749, 138752, - 138755, 138758, 138761, 138764, 138767, 138770, 138773, 138776, 138779, - 138782, 138785, 138788, 138791, 138794, 138797, 138800, 138803, 138806, - 138809, 138812, 138815, 138818, 138821, 138824, 138827, 138830, 138833, - 138836, 138839, 138842, 138845, 138848, 138851, 138854, 138857, 138860, - 138863, 138866, 138869, 138872, 138875, 138878, 138881, 138884, 138887, - 138890, 138893, 138896, 138899, 138902, 138905, 138908, 138911, 138914, - 138917, 138920, 138923, 138926, 138929, 138932, 138935, 138938, 138941, - 138944, 138947, 138950, 138953, 138956, 138959, 138962, 138965, 138968, - 138971, 138974, 138977, 138980, 138983, 138986, 138989, 138992, 138995, - 138998, 139001, 139004, 139007, 139010, 139013, 139016, 139019, 139022, - 139025, 139028, 139031, 139034, 139037, 139040, 139043, 139046, 139049, - 139052, 139055, 139058, 139061, 139064, 139067, 139070, 139073, 139076, - 139079, 139082, 139085, 139088, 139091, 139094, 139097, 139100, 139103, - 139106, 139109, 139112, 139115, 139118, 139121, 139124, 139127, 139130, - 139133, 139136, 139139, 139142, 139145, 139148, 139151, 139154, 139157, - 139160, 139163, 139166, 139169, 139172, 139175, 139178, 139181, 139184, - 139187, 139190, 139193, 139196, 139199, 139202, 139205, 139208, 139211, - 139214, 139217, 139220, 139223, 139226, 139229, 139232, 139235, 139238, - 139241, 139244, 139247, 139250, 139253, 139256, 139259, 139262, 139265, - 139268, 139271, 139274, 139277, 139280, 139283, 139286, 139289, 139292, - 139295, 139298, 139301, 139304, 139307, 139310, 139313, 139316, 139319, - 139322, 139325, 139328, 139331, 139334, 139337, 139340, 139343, 139346, - 139349, 139352, 139355, 139358, 139361, 139364, 139367, 139370, 139373, - 139376, 139379, 139382, 139385, 139388, 139391, 139394, 139397, 139400, - 139403, 139406, 139409, 139412, 139415, 139418, 139421, 139424, 139427, - 139430, 139433, 139436, 139439, 139442, 139445, 139448, 139451, 139454, - 139457, 139460, 139463, 139466, 139469, 139472, 139475, 139478, 139481, - 139484, 139487, 139490, 139493, 139496, 139499, 139502, 139505, 139508, - 139511, 139514, 139517, 139520, 139523, 139526, 139529, 139532, 139535, - 139538, 139541, 139544, 139547, 139550, 139553, 139556, 139559, 139562, - 139565, 139568, 139571, 139574, 139577, 139580, 139583, 139586, 139589, - 139592, 139595, 139598, 139601, 139604, 139607, 139610, 139613, 139616, - 139619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139622, 139627, 139633, - 139637, 139641, 139645, 139649, 139653, 139657, 139661, 139665, 139669, - 139673, 139677, 139681, 139685, 139689, 139693, 139697, 139701, 139705, - 139709, 139713, 139717, 139721, 139725, 139729, 139733, 139737, 139741, - 139745, 139749, 139753, 139757, 139761, 139765, 139769, 139773, 139777, - 139781, 139785, 139789, 139793, 139797, 139801, 139805, 139809, 139813, - 139817, 139821, 139825, 139829, 139833, 139837, 139841, 139845, 139849, - 139853, 139857, 139861, 139865, 139869, 139873, 139877, 139881, 139885, - 139889, 139893, 139897, 139901, 139905, 139909, 139913, 139917, 139921, - 139925, 139929, 139933, 139937, 139941, 139945, 139949, 139953, 139957, - 139961, 139965, 139969, 139973, 139977, 139981, 139985, 139989, 139993, - 139997, 140001, 140005, 140009, 140013, 140017, 140021, 140025, 140029, - 140033, 140037, 140041, 140045, 140049, 140053, 140057, 140061, 140065, - 140069, 140073, 140077, 140081, 140085, 140089, 140093, 140097, 140101, - 140105, 140109, 140113, 140117, 140121, 140125, 140129, 140133, 140137, - 140141, 140145, 140149, 140153, 140157, 140161, 140165, 140169, 140173, - 140177, 140181, 140185, 140189, 140193, 140197, 140201, 140205, 140209, - 140213, 140217, 140221, 140225, 140229, 140233, 140237, 140241, 140245, - 140249, 140253, 140257, 140261, 140265, 140269, 140273, 140277, 140281, - 140285, 140289, 140293, 140297, 140301, 140305, 140309, 140313, 140317, - 140321, 140325, 140329, 140333, 140337, 140341, 140345, 140349, 140353, - 140357, 140361, 140365, 140369, 140373, 140377, 140381, 140385, 140389, - 140393, 140397, 140401, 140405, 140409, 140413, 140417, 140421, 140425, - 140429, 140433, 140437, 140441, 140445, 140449, 140453, 140457, 140461, - 140465, 140469, 140473, 140477, 140481, 140485, 140489, 140493, 140497, - 140501, 140505, 140509, 140513, 140517, 140521, 140525, 140529, 140533, - 140537, 140541, 140545, 140549, 140553, 140557, 140561, 140565, 140569, - 140573, 140577, 140581, 140585, 140589, 140593, 140597, 140601, 140605, - 140609, 140613, 140617, 140621, 140625, 140629, 140633, 140637, 140641, - 140645, 140649, 140653, 140657, 140661, 140665, 140669, 140673, 140677, - 140681, 140685, 140689, 140693, 140697, 140701, 140705, 140709, 140713, - 140717, 140721, 140725, 140729, 140733, 140737, 140741, 140745, 140749, - 140753, 140757, 140761, 140765, 140769, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140773, - 140776, 140779, 140782, 140785, 140788, 140791, 140794, 140797, 140800, - 140803, 140806, 140809, 140812, 140815, 140818, 140821, 140824, 140827, - 140830, 140833, 140836, 140839, 140842, 140845, 140848, 140851, 140854, - 140857, 140860, 140863, 140866, 140869, 140872, 140875, 140878, 140881, - 140884, 140887, 140890, 140893, 140896, 140899, 140902, 140905, 140908, - 140911, 140914, 140917, 140920, 140923, 140926, 140929, 140932, 140935, - 140938, 140941, 140944, 140947, 140950, 140953, 140956, 140959, 140962, - 140965, 140968, 140971, 140974, 140977, 140980, 140983, 140986, 140989, - 140992, 140995, 140998, 141001, 141004, 141007, 141010, 141013, 141016, - 141019, 141022, 141025, 141028, 141031, 141034, 141037, 141040, 141043, - 141046, 141049, 141052, 141055, 141058, 141061, 141064, 141067, 141070, - 141073, 141076, 141079, 141082, 141085, 141088, 141091, 141094, 141097, - 141100, 141103, 141106, 141109, 141112, 141115, 141118, 141121, 141124, - 141127, 141130, 141133, 141136, 141139, 141142, 141145, 141148, 141151, - 141154, 141157, 141160, 141163, 141166, 141169, 141172, 141175, 141178, - 141181, 141184, 141187, 141190, 141193, 141196, 141199, 141202, 141205, - 141208, 141211, 141214, 141217, 141220, 141223, 141226, 141229, 141232, - 141235, 141238, 141241, 141244, 141247, 141250, 141253, 141256, 141259, - 141262, 141265, 141268, 141271, 141274, 141277, 141280, 141283, 141286, - 141289, 141292, 141295, 141298, 141301, 141304, 141307, 141310, 141313, - 141316, 141319, 141322, 141325, 141328, 141331, 141334, 141337, 141340, - 141343, 141346, 141349, 141352, 141355, 141358, 141361, 141364, 141367, - 141370, 141373, 141376, 141379, 141382, 141385, 141388, 141391, 141394, - 141397, 141400, 141403, 141406, 141409, 141412, 141415, 141418, 141421, - 141424, 141427, 141430, 141433, 141436, 141439, 141442, 141445, 141448, - 141451, 141454, 141457, 141460, 141463, 141466, 141469, 141472, 141475, - 141478, 141481, 141484, 141487, 141490, 141493, 141496, 141499, 141502, - 141505, 141508, 141511, 141514, 141517, 141520, 141523, 141526, 141529, - 141532, 141535, 141538, 141541, 141544, 141547, 141550, 141553, 141556, - 141559, 141562, 141565, 141568, 141571, 141574, 141577, 141580, 141583, - 141586, 141589, 141592, 141595, 141598, 141601, 141604, 141607, 141610, - 141613, 141616, 141619, 141622, 141625, 141628, 141631, 141634, 141637, - 141640, 141643, 141646, 141649, 141652, 141655, 141658, 141661, 141664, - 141667, 141670, 141673, 141676, 141679, 141682, 141685, 141688, 141691, - 141694, 141697, 141700, 141703, 141706, 141709, 141712, 141715, 141718, - 141721, 141724, 141727, 141730, 141733, 141736, 141739, 141742, 141745, - 141748, 141751, 141754, 141757, 141760, 141763, 141766, 141769, 141772, - 141775, 141778, 141781, 141784, 141787, 141790, 141793, 141796, 141799, - 141802, 141805, 141808, 141811, 141814, 141817, 141820, 141823, 141826, - 141829, 141832, 141835, 141838, 141841, 141844, 141847, 141850, 141853, - 141856, 141859, 141862, 141865, 141868, 141871, 141874, 141877, 141880, - 141883, 141886, 141889, 141892, 141895, 141898, 141901, 141904, 141907, - 141910, 141913, 141916, 141919, 141922, 141925, 141928, 141931, 141934, - 141937, 141940, 141943, 141946, 141949, 141952, 141955, 141958, 0, 0, 0, - 0, 141961, 141965, 141969, 141973, 141977, 141981, 141985, 141988, - 141992, 141996, 142000, 142004, 142007, 142013, 142019, 142025, 142031, - 142037, 142041, 142047, 142051, 142055, 142061, 142065, 142069, 142073, - 142077, 142081, 142085, 142089, 142095, 142101, 142107, 142113, 142120, - 142127, 142134, 142145, 142152, 142159, 142165, 142171, 142177, 142183, - 142191, 142199, 142207, 142215, 142224, 142230, 142238, 142244, 142251, - 142257, 142264, 142270, 142278, 142282, 142286, 142291, 142297, 142303, - 142311, 142319, 142325, 142332, 142335, 142341, 142345, 142348, 142352, - 142355, 142358, 142362, 142367, 142371, 142375, 142381, 142386, 142392, - 142396, 142400, 142403, 142407, 142411, 142416, 142420, 142425, 142429, - 142434, 142438, 142442, 142446, 142450, 142454, 142458, 142462, 142466, - 142471, 142476, 142481, 142486, 142492, 142498, 142504, 142510, 142516, - 0, 0, 0, 0, 0, 142521, 142529, 142538, 142546, 142553, 142561, 142568, - 142575, 142584, 142591, 142598, 142606, 142614, 0, 0, 0, 142622, 142627, - 142634, 142640, 142647, 142653, 142659, 142665, 142671, 0, 0, 0, 0, 0, 0, - 0, 142677, 142682, 142689, 142695, 142702, 142708, 142714, 142720, - 142726, 142732, 0, 0, 142737, 142743, 142749, 142752, 142761, 142768, - 142776, 142783, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 142790, 142795, 142800, 142805, 142812, 142819, 142826, 142833, - 142838, 142843, 142848, 142853, 142860, 142865, 142872, 142879, 142884, - 142889, 142894, 142901, 142906, 142911, 142918, 142925, 142930, 142935, - 142940, 142947, 142954, 142961, 142966, 142971, 142978, 142985, 142992, - 142999, 143004, 143009, 143014, 143021, 143026, 143031, 143036, 143043, - 143052, 143059, 143064, 143069, 143074, 143079, 143084, 143089, 143098, - 143105, 143110, 143117, 143124, 143129, 143134, 143139, 143146, 143151, - 143158, 143165, 143170, 143175, 143180, 143187, 143194, 143199, 143204, - 143211, 143218, 143225, 143230, 143235, 143240, 143245, 143252, 143261, - 143270, 143275, 143282, 143291, 143296, 143301, 143306, 143311, 143318, - 143325, 143332, 143339, 143344, 143349, 143354, 143361, 143368, 143375, - 143380, 143385, 143392, 143397, 143404, 143409, 143416, 143421, 143428, - 143435, 143440, 143445, 143450, 143455, 143460, 143465, 143470, 143475, - 143480, 143487, 143494, 143501, 143508, 143515, 143524, 143529, 143534, - 143541, 143548, 143553, 143560, 143567, 143574, 143581, 143588, 143595, - 143600, 143605, 143610, 143615, 143620, 143629, 143638, 143647, 143656, - 143665, 143674, 143683, 143692, 143697, 143708, 143719, 143728, 143733, - 143738, 143743, 143748, 143757, 143764, 143771, 143778, 143785, 143792, - 143799, 143808, 143817, 143828, 143837, 143848, 143857, 143864, 143873, - 143884, 143893, 143902, 143911, 143920, 143927, 143934, 143941, 143950, - 143959, 143970, 143979, 143988, 143999, 144004, 144009, 144020, 144028, - 144037, 144046, 144055, 144066, 144075, 144084, 144095, 144106, 144117, - 144128, 144139, 144150, 144157, 144164, 144171, 144178, 144189, 144198, - 144205, 144212, 144219, 144230, 144241, 144252, 144263, 144274, 144285, - 144296, 144307, 144314, 144321, 144330, 144339, 144346, 144353, 144360, - 144369, 144378, 144387, 144394, 144403, 144412, 144421, 144428, 144435, - 144440, 144446, 144453, 144460, 144467, 144474, 144481, 144488, 144497, - 144506, 144515, 144524, 144531, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144540, - 144546, 144551, 144556, 144563, 144569, 144575, 144581, 144587, 144593, - 144599, 144605, 144609, 144613, 144619, 144625, 144631, 144635, 144640, - 144645, 144649, 144653, 144656, 144662, 144668, 144674, 144680, 144686, - 144692, 144698, 144704, 144710, 144720, 144730, 144736, 144742, 144752, - 144762, 144768, 0, 0, 144774, 144782, 144787, 144792, 144798, 144804, - 144810, 144816, 144822, 144828, 144835, 144842, 144848, 144854, 144860, - 144866, 144872, 144878, 144884, 144890, 144895, 144901, 144907, 144913, - 144919, 144925, 144934, 144940, 144945, 144953, 144960, 144967, 144976, - 144985, 144994, 145003, 145012, 145021, 145030, 145039, 145049, 145059, - 145067, 145075, 145084, 145093, 145099, 145105, 145111, 145117, 145125, - 145133, 145137, 145143, 145148, 145154, 145160, 145166, 145172, 145178, - 145187, 145192, 145199, 145204, 145209, 145214, 145220, 145226, 145232, - 145239, 145244, 145249, 145254, 145259, 145264, 145270, 145276, 145282, - 145288, 145294, 145300, 145306, 145312, 145317, 145322, 145327, 145332, - 145337, 145342, 145347, 145352, 145358, 145364, 145369, 145374, 145379, - 145384, 145389, 145395, 145402, 145406, 145410, 145414, 145418, 145422, - 145426, 145430, 145434, 145442, 145452, 145456, 145460, 145466, 145472, - 145478, 145484, 145490, 145496, 145502, 145508, 145514, 145520, 145526, - 145532, 145538, 145544, 145548, 145552, 145559, 145565, 145571, 145577, - 145582, 145589, 145594, 145600, 145606, 145612, 145618, 145623, 145627, - 145633, 145637, 145641, 145645, 145651, 145657, 145661, 145667, 145673, - 145679, 145685, 145691, 145699, 145707, 145713, 145719, 145725, 145731, - 145743, 145755, 145769, 145781, 145793, 145807, 145821, 145835, 145839, - 145847, 145855, 145860, 145864, 145868, 145872, 145876, 145880, 145884, - 145888, 145894, 145900, 145906, 145912, 145920, 145929, 145936, 145943, - 145951, 145958, 145970, 145982, 145994, 146006, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 146013, 146020, 146027, - 146034, 146041, 146048, 146055, 146062, 146069, 146076, 146083, 146090, - 146097, 146104, 146111, 146118, 146125, 146132, 146139, 146146, 146153, - 146160, 146167, 146174, 146181, 146188, 146195, 146202, 146209, 146216, - 146223, 146230, 146237, 146244, 146251, 146258, 146265, 146272, 146279, - 146286, 146293, 146300, 146307, 146314, 146321, 146328, 146335, 146342, - 146349, 146356, 146363, 146370, 146377, 146384, 146391, 146398, 146405, - 146412, 146419, 146426, 146433, 146440, 146447, 146454, 146461, 146468, - 146475, 146480, 146485, 146490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 146494, - 146500, 146505, 146510, 146515, 146520, 146525, 146530, 146535, 146540, - 146545, 146551, 146557, 146563, 146569, 146575, 146581, 146587, 146593, - 146599, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 146605, 146610, 146617, - 146624, 146631, 146638, 146643, 146648, 146655, 146660, 146665, 146672, - 146677, 146682, 146687, 146694, 146703, 146708, 146713, 146718, 146723, - 146728, 146733, 146740, 146745, 146750, 146755, 146760, 146765, 146770, - 146775, 146780, 146785, 146790, 146795, 146800, 146806, 146811, 146816, - 146821, 146826, 146831, 146836, 146841, 146846, 146851, 146860, 146865, - 146874, 146879, 146884, 146889, 146894, 146899, 146904, 146909, 146918, - 146923, 146928, 146933, 146938, 146943, 146950, 146955, 146962, 146967, - 146972, 146977, 146982, 146987, 146992, 146997, 147002, 147007, 147012, - 147017, 147022, 147027, 147032, 147037, 147042, 147047, 147052, 147057, - 147066, 147071, 147076, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147081, 147089, - 147097, 147105, 147113, 147121, 147129, 147137, 147145, 147153, 147161, - 147169, 147177, 147185, 147193, 147201, 147209, 147217, 147225, 147230, - 147235, 147240, 147245, 147250, 147254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 147258, 147262, 147267, 147272, 147277, 147281, 147286, - 147291, 147296, 147300, 147305, 147310, 147314, 147319, 147324, 147328, - 147333, 147338, 147342, 147347, 147352, 147356, 147361, 147366, 147371, - 147376, 147381, 147385, 147390, 147395, 147400, 147404, 147409, 147414, - 147419, 147423, 147428, 147433, 147437, 147442, 147447, 147451, 147456, - 147461, 147465, 147470, 147475, 147479, 147484, 147489, 147494, 147499, - 147504, 147508, 147513, 147518, 147523, 147527, 147532, 147537, 147542, - 147546, 147551, 147556, 147560, 147565, 147570, 147574, 147579, 147584, - 147588, 147593, 147598, 147602, 147607, 147612, 147617, 147622, 147627, - 147631, 147636, 147641, 147646, 147650, 147655, 0, 147660, 147664, - 147669, 147674, 147678, 147683, 147688, 147692, 147697, 147702, 147706, - 147711, 147716, 147720, 147725, 147730, 147735, 147740, 147745, 147750, - 147756, 147762, 147768, 147773, 147779, 147785, 147791, 147796, 147802, - 147808, 147813, 147819, 147825, 147830, 147836, 147842, 147847, 147853, - 147859, 147864, 147870, 147876, 147882, 147888, 147894, 147899, 147905, - 147911, 147917, 147922, 147928, 147934, 147940, 147945, 147951, 147957, - 147962, 147968, 147974, 147979, 147985, 147991, 147996, 148002, 148008, - 148013, 148019, 148025, 148031, 148037, 148043, 0, 148047, 148052, 0, 0, - 148057, 0, 0, 148062, 148067, 0, 0, 148072, 148077, 148081, 148086, 0, - 148091, 148096, 148101, 148105, 148110, 148115, 148120, 148125, 148130, - 148134, 148139, 148144, 0, 148149, 0, 148154, 148159, 148163, 148168, - 148173, 148177, 148182, 0, 148187, 148192, 148197, 148201, 148206, - 148211, 148215, 148220, 148225, 148230, 148235, 148240, 148245, 148251, - 148257, 148263, 148268, 148274, 148280, 148286, 148291, 148297, 148303, - 148308, 148314, 148320, 148325, 148331, 148337, 148342, 148348, 148354, - 148359, 148365, 148371, 148377, 148383, 148389, 148394, 148400, 148406, - 148412, 148417, 148423, 148429, 148435, 148440, 148446, 148452, 148457, - 148463, 148469, 148474, 148480, 148486, 148491, 148497, 148503, 148508, - 148514, 148520, 148526, 148532, 148538, 148542, 0, 148547, 148552, - 148556, 148561, 0, 0, 148566, 148571, 148576, 148580, 148585, 148590, - 148594, 148599, 0, 148604, 148609, 148614, 148618, 148623, 148628, - 148633, 0, 148638, 148642, 148647, 148652, 148657, 148661, 148666, - 148671, 148676, 148680, 148685, 148690, 148694, 148699, 148704, 148708, - 148713, 148718, 148722, 148727, 148732, 148736, 148741, 148746, 148751, - 148756, 148761, 148765, 0, 148770, 148775, 148779, 148784, 0, 148789, - 148793, 148798, 148803, 148807, 0, 148812, 0, 0, 0, 148816, 148821, - 148826, 148830, 148835, 148840, 148845, 0, 148850, 148854, 148859, - 148864, 148869, 148873, 148878, 148883, 148888, 148892, 148897, 148902, - 148906, 148911, 148916, 148920, 148925, 148930, 148934, 148939, 148944, - 148948, 148953, 148958, 148963, 148968, 148973, 148978, 148984, 148990, - 148996, 149001, 149007, 149013, 149019, 149024, 149030, 149036, 149041, - 149047, 149053, 149058, 149064, 149070, 149075, 149081, 149087, 149092, - 149098, 149104, 149110, 149116, 149122, 149127, 149133, 149139, 149145, - 149150, 149156, 149162, 149168, 149173, 149179, 149185, 149190, 149196, - 149202, 149207, 149213, 149219, 149224, 149230, 149236, 149241, 149247, - 149253, 149259, 149265, 149271, 149275, 149280, 149285, 149290, 149294, - 149299, 149304, 149309, 149313, 149318, 149323, 149327, 149332, 149337, - 149341, 149346, 149351, 149355, 149360, 149365, 149369, 149374, 149379, - 149384, 149389, 149394, 149398, 149403, 149408, 149413, 149417, 149422, - 149427, 149432, 149436, 149441, 149446, 149450, 149455, 149460, 149464, - 149469, 149474, 149478, 149483, 149488, 149492, 149497, 149502, 149507, - 149512, 149517, 149522, 149528, 149534, 149540, 149545, 149551, 149557, - 149563, 149568, 149574, 149580, 149585, 149591, 149597, 149602, 149608, - 149614, 149619, 149625, 149631, 149636, 149642, 149648, 149654, 149660, - 149666, 149671, 149677, 149683, 149689, 149694, 149700, 149706, 149712, - 149717, 149723, 149729, 149734, 149740, 149746, 149751, 149757, 149763, - 149768, 149774, 149780, 149785, 149791, 149797, 149803, 149809, 149815, - 149820, 149826, 149832, 149838, 149843, 149849, 149855, 149861, 149866, - 149872, 149878, 149883, 149889, 149895, 149900, 149906, 149912, 149917, - 149923, 149929, 149934, 149940, 149946, 149952, 149958, 149964, 149969, - 149975, 149981, 149987, 149992, 149998, 150004, 150010, 150015, 150021, - 150027, 150032, 150038, 150044, 150049, 150055, 150061, 150066, 150072, - 150078, 150083, 150089, 150095, 150101, 150107, 150113, 150119, 150126, - 150133, 150140, 150146, 150153, 150160, 150167, 150173, 150180, 150187, - 150193, 150200, 150207, 150213, 150220, 150227, 150233, 150240, 150247, - 150253, 150260, 150267, 150274, 150281, 150288, 150294, 150301, 150308, - 150315, 150321, 150328, 150335, 150342, 150348, 150355, 150362, 150368, - 150375, 150382, 150388, 150395, 150402, 150408, 150415, 150422, 150428, - 150435, 150442, 150449, 150456, 150463, 150468, 150474, 150480, 150486, - 150491, 150497, 150503, 150509, 150514, 150520, 150526, 150531, 150537, - 150543, 150548, 150554, 150560, 150565, 150571, 150577, 150582, 150588, - 150594, 150600, 150606, 150612, 150617, 150623, 150629, 150635, 150640, - 150646, 150652, 150658, 150663, 150669, 150675, 150680, 150686, 150692, - 150697, 150703, 150709, 150714, 150720, 150726, 150731, 150737, 150743, - 150749, 150755, 150761, 150767, 0, 0, 150774, 150779, 150784, 150789, - 150794, 150799, 150804, 150809, 150814, 150819, 150824, 150829, 150834, - 150839, 150844, 150849, 150854, 150859, 150865, 150870, 150875, 150880, - 150885, 150890, 150895, 150900, 150904, 150909, 150914, 150919, 150924, - 150929, 150934, 150939, 150944, 150949, 150954, 150959, 150964, 150969, - 150974, 150979, 150984, 150989, 150995, 151000, 151005, 151010, 151015, - 151020, 151025, 151030, 151036, 151041, 151046, 151051, 151056, 151061, - 151066, 151071, 151076, 151081, 151086, 151091, 151096, 151101, 151106, - 151111, 151116, 151121, 151126, 151131, 151136, 151141, 151146, 151151, - 151157, 151162, 151167, 151172, 151177, 151182, 151187, 151192, 151196, - 151201, 151206, 151211, 151216, 151221, 151226, 151231, 151236, 151241, - 151246, 151251, 151256, 151261, 151266, 151271, 151276, 151281, 151287, - 151292, 151297, 151302, 151307, 151312, 151317, 151322, 151328, 151333, - 151338, 151343, 151348, 151353, 151358, 151364, 151370, 151376, 151382, - 151388, 151394, 151400, 151406, 151412, 151418, 151424, 151430, 151436, - 151442, 151448, 151454, 151460, 151467, 151473, 151479, 151485, 151491, - 151497, 151503, 151509, 151514, 151520, 151526, 151532, 151538, 151544, - 151550, 151556, 151562, 151568, 151574, 151580, 151586, 151592, 151598, - 151604, 151610, 151616, 151623, 151629, 151635, 151641, 151647, 151653, - 151659, 151665, 151672, 151678, 151684, 151690, 151696, 151702, 151708, - 151714, 151720, 151726, 151732, 151738, 151744, 151750, 151756, 151762, - 151768, 151774, 151780, 151786, 151792, 151798, 151804, 151810, 151817, - 151823, 151829, 151835, 151841, 151847, 151853, 151859, 151864, 151870, - 151876, 151882, 151888, 151894, 151900, 151906, 151912, 151918, 151924, - 151930, 151936, 151942, 151948, 151954, 151960, 151966, 151973, 151979, - 151985, 151991, 151997, 152003, 152009, 152015, 152022, 152028, 152034, - 152040, 152046, 152052, 152058, 152065, 152072, 152079, 152086, 152093, - 152100, 152107, 152114, 152121, 152128, 152135, 152142, 152149, 152156, - 152163, 152170, 152177, 152185, 152192, 152199, 152206, 152213, 152220, - 152227, 152234, 152240, 152247, 152254, 152261, 152268, 152275, 152282, - 152289, 152296, 152303, 152310, 152317, 152324, 152331, 152338, 152345, - 152352, 152359, 152367, 152374, 152381, 152388, 152395, 152402, 152409, - 152416, 152424, 152431, 152438, 152445, 152452, 152459, 152466, 152471, - 0, 0, 152476, 152481, 152485, 152489, 152493, 152497, 152501, 152505, - 152509, 152513, 152517, 152522, 152526, 152530, 152534, 152538, 152542, - 152546, 152550, 152554, 152558, 152563, 152567, 152571, 152575, 152579, - 152583, 152587, 152591, 152595, 152599, 152605, 152610, 152615, 152620, - 152625, 152630, 152635, 152640, 152645, 152650, 152656, 152661, 152666, - 152671, 152676, 152681, 152686, 152691, 152696, 152701, 152705, 152710, - 152715, 152720, 152725, 152730, 152735, 152741, 152749, 152756, 152761, - 152766, 152773, 152779, 152784, 152790, 152796, 152804, 152810, 152817, - 152825, 152831, 152840, 152849, 152857, 152865, 152871, 152878, 152886, - 152894, 152900, 152907, 152916, 152925, 152932, 152943, 152953, 152963, - 152973, 152983, 152990, 152997, 153004, 153011, 153020, 153029, 153040, - 153051, 153060, 153069, 153080, 153089, 153098, 153109, 153118, 153127, - 153135, 153143, 153154, 153165, 153173, 153182, 153191, 153198, 153209, - 153220, 153229, 153238, 153245, 153254, 153263, 153272, 153283, 153292, - 153302, 153311, 153320, 153331, 153344, 153359, 153370, 153383, 153395, - 153404, 153415, 153426, 153435, 153446, 153460, 153475, 153478, 153487, - 153492, 153498, 153506, 153512, 153518, 153527, 153534, 153544, 153556, - 153563, 153566, 153572, 153579, 153585, 153590, 153593, 153598, 153601, - 153608, 153614, 153622, 153629, 153636, 153642, 153647, 153650, 153653, - 153656, 153662, 153669, 153675, 153680, 153687, 153690, 153695, 153702, - 153708, 153716, 153723, 153733, 153742, 153745, 153751, 153758, 153765, - 153772, 153777, 153785, 153793, 153802, 153808, 153817, 153826, 153835, - 153841, 153850, 153857, 153864, 153871, 153879, 153885, 153893, 153899, - 153906, 153913, 153921, 153932, 153942, 153948, 153955, 153962, 153969, - 153975, 153982, 153989, 153994, 154001, 154009, 154018, 154024, 154036, - 154047, 154053, 154061, 154067, 154074, 154081, 154088, 154094, 154101, - 154110, 154116, 154122, 154129, 154136, 154144, 154154, 154164, 154174, - 154184, 154192, 154200, 154210, 154218, 154223, 154228, 154233, 154239, - 154246, 154253, 154259, 154265, 154270, 154277, 154285, 154295, 154303, - 154311, 154321, 154331, 154339, 154349, 154359, 154371, 154383, 154395, - 154405, 154411, 154417, 154424, 154433, 154442, 154451, 154460, 154470, - 154479, 154488, 154497, 154502, 154508, 154517, 154527, 154536, 154542, - 154548, 154555, 154562, 154569, 154575, 154582, 154589, 154596, 154602, - 154606, 154611, 154618, 154625, 154632, 154637, 154645, 154653, 154662, - 154670, 154677, 154685, 154694, 154704, 154707, 154711, 154716, 154721, - 154726, 154731, 154736, 154741, 154746, 154751, 154756, 154761, 154766, - 154771, 154776, 154781, 154786, 154791, 154796, 154803, 154809, 154816, - 154822, 154827, 154834, 154840, 154847, 154853, 154858, 154865, 154872, - 154879, 154885, 154891, 154900, 154909, 154920, 154927, 154934, 154943, - 154952, 154961, 154970, 154979, 154985, 154993, 154999, 155009, 155014, - 155023, 155032, 155039, 155050, 155057, 155064, 155071, 155078, 155085, - 155092, 155099, 155106, 155113, 155120, 155126, 155132, 155138, 155145, - 155152, 155159, 155166, 155173, 155180, 155187, 155194, 155201, 155208, - 155215, 155222, 155227, 155236, 155245, 155254, 155261, 155268, 155275, - 155282, 155289, 155296, 155303, 155310, 155319, 155328, 155337, 155346, - 155355, 155364, 155373, 155382, 155391, 155400, 155409, 155418, 155427, - 155433, 155441, 155447, 155457, 155462, 155471, 155480, 155489, 155500, - 155505, 155512, 155519, 155526, 155531, 155537, 155543, 155549, 155556, - 155563, 155570, 155577, 155584, 155591, 155598, 155605, 155612, 155619, - 155626, 155633, 155638, 155647, 155656, 155665, 155674, 155683, 155692, - 155701, 155710, 155721, 155732, 155739, 155746, 155753, 155760, 155767, - 155774, 155782, 155792, 155802, 155812, 155823, 155834, 155845, 155854, - 155863, 155872, 155877, 155882, 155887, 155892, 155903, 155914, 155925, - 155936, 155947, 155957, 155968, 155977, 155986, 155995, 156004, 156013, - 156021, 156030, 156041, 156052, 156063, 156074, 156085, 156097, 156110, - 156122, 156135, 156147, 156160, 156172, 156185, 156196, 156207, 156216, - 156224, 156233, 156244, 156255, 156267, 156280, 156294, 156309, 156321, - 156334, 156346, 156359, 156370, 156381, 156390, 156398, 156407, 156414, - 156421, 156428, 156435, 156442, 156449, 156456, 156463, 156470, 156477, - 156482, 156487, 156492, 156499, 156509, 156520, 156530, 156541, 156555, - 156570, 156585, 156599, 156614, 156629, 156640, 156651, 156664, 156677, - 156686, 156695, 156708, 156721, 156728, 156735, 156740, 156745, 156750, - 156755, 156760, 156767, 156776, 156781, 156784, 156789, 156796, 156803, - 156810, 156817, 156824, 156831, 156844, 156858, 156873, 156880, 156887, - 156894, 156903, 156911, 156919, 156928, 156933, 156938, 156943, 156948, - 156953, 156958, 156965, 156972, 156978, 156985, 156991, 156998, 157003, - 157008, 157013, 157018, 157023, 157030, 157037, 157042, 157049, 157056, - 157061, 157066, 157071, 157076, 157081, 157086, 157093, 157100, 157107, - 157110, 157115, 157120, 157125, 157130, 157137, 157144, 157152, 157160, - 157165, 157170, 157177, 157184, 157191, 157196, 157203, 157210, 157215, - 157222, 157229, 157235, 157241, 157247, 157253, 157261, 157269, 157275, - 157283, 157291, 157296, 157303, 157310, 157315, 157322, 157329, 157336, - 157344, 157352, 157357, 157364, 157371, 157380, 157387, 157396, 157407, - 157416, 157425, 157434, 157443, 157446, 157451, 157458, 157467, 157474, - 157483, 157490, 157495, 157500, 157503, 157506, 157509, 157516, 157523, - 157532, 157541, 157550, 157557, 157564, 157569, 157582, 157587, 157592, - 157597, 157602, 157607, 157612, 157617, 157622, 157625, 157630, 157635, - 157640, 157645, 157650, 157657, 157662, 157669, 157672, 157677, 157680, - 157683, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 157686, 157691, - 157696, 157701, 157706, 0, 157711, 157716, 157721, 157726, 157731, - 157736, 157741, 157746, 157751, 157756, 157761, 157766, 157771, 157776, - 157781, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 157786, 157791, 157796, 157801, 157806, - 157811, 157816, 0, 157821, 157826, 157831, 157837, 157841, 157846, - 157851, 157856, 157861, 157866, 157871, 157876, 157881, 157886, 157891, - 157896, 157901, 0, 0, 157906, 157911, 157916, 157921, 157926, 157931, - 157936, 0, 157941, 157946, 0, 157952, 157957, 157965, 157972, 157981, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 157986, - 157993, 157999, 158006, 158013, 158020, 158027, 158034, 158041, 158048, - 158055, 158062, 158069, 158076, 158083, 158090, 158097, 158104, 158111, - 158118, 158125, 158132, 158139, 158146, 158153, 158160, 158167, 158174, - 158181, 158188, 158195, 158202, 158209, 158216, 158223, 158229, 158235, - 158241, 158248, 158254, 158261, 158267, 158274, 158281, 158288, 158295, - 158302, 158309, 158315, 158322, 158329, 158336, 158343, 158350, 158357, - 158364, 158370, 158377, 158384, 158391, 158398, 158405, 158413, 158420, - 158427, 158434, 158441, 158448, 158455, 158462, 158469, 158476, 158483, - 158490, 158497, 158503, 158510, 158517, 158524, 158531, 158538, 158545, - 158552, 158560, 158567, 158573, 158580, 158587, 158594, 158601, 158608, - 158615, 158622, 158629, 158636, 158643, 158650, 158657, 158664, 158671, - 158678, 158685, 158692, 158699, 158706, 158713, 158719, 158726, 158733, - 158740, 158747, 158754, 158761, 158768, 158775, 158782, 158789, 158796, - 158803, 158810, 158817, 158824, 158831, 158838, 158845, 158852, 158859, - 158866, 158873, 158881, 158889, 158897, 158904, 158911, 158918, 158925, - 158932, 158939, 158946, 158953, 158960, 158967, 158973, 158980, 158987, - 158994, 159001, 159008, 159015, 159022, 159029, 159036, 159043, 159050, - 159057, 159064, 159071, 159079, 159087, 159095, 159102, 159109, 159116, - 159123, 159130, 159137, 159144, 159151, 159158, 159165, 159172, 159179, - 159186, 159193, 159199, 159206, 159213, 159220, 159227, 159234, 159241, - 159248, 159255, 159262, 159269, 159276, 159283, 159290, 159297, 159304, - 159311, 159318, 159325, 159332, 159339, 159346, 159353, 0, 0, 159360, - 159364, 159368, 159372, 159376, 159380, 159384, 159388, 159392, 159396, - 159402, 159408, 159414, 159420, 159428, 159436, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 159442, 159448, 159454, 159460, 159466, - 159472, 159478, 159484, 159490, 159495, 159500, 159506, 159511, 159516, - 159522, 159528, 159534, 159540, 159546, 159551, 159556, 159562, 159568, - 159573, 159579, 159585, 159591, 159597, 159603, 159609, 159615, 159621, - 159627, 159633, 159639, 159645, 159651, 159657, 159663, 159669, 159675, - 159681, 159687, 159692, 159697, 159703, 159708, 159713, 159719, 159725, - 159731, 159737, 159743, 159748, 159753, 159759, 159765, 159770, 159776, - 159782, 159788, 159794, 159800, 159806, 159812, 159818, 159824, 159830, - 159836, 159842, 159847, 159852, 159856, 159861, 159868, 0, 0, 0, 0, 0, - 159872, 159877, 159881, 159885, 159889, 159893, 159897, 159901, 159905, - 159909, 0, 0, 0, 0, 159913, 159919, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159925, - 159931, 159937, 159943, 159949, 159955, 159961, 159967, 159973, 159979, - 159986, 159993, 160000, 160007, 160014, 160021, 160028, 160035, 160042, - 160050, 160058, 160066, 160075, 160084, 160093, 160102, 160111, 160120, - 160128, 160136, 160144, 160153, 160162, 160171, 160180, 160189, 160198, - 160207, 160216, 160225, 160234, 160243, 160252, 160261, 160270, 160279, - 160286, 160293, 160300, 160307, 160314, 160322, 160330, 160338, 160346, - 160354, 160362, 160370, 160378, 160386, 160392, 160401, 160410, 160419, - 160426, 160434, 160442, 160453, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160462, 160466, 160470, 160474, 0, - 160478, 160482, 160486, 160490, 160494, 160498, 160502, 160506, 160510, - 160514, 160518, 160522, 160526, 160530, 160534, 160538, 160542, 160546, - 160550, 160554, 160558, 160562, 160566, 160570, 160576, 160582, 160588, - 0, 160594, 160599, 0, 160604, 0, 0, 160609, 0, 160614, 160619, 160624, - 160629, 160634, 160639, 160644, 160649, 160654, 160659, 0, 160664, - 160669, 160674, 160679, 0, 160684, 0, 160689, 0, 0, 0, 0, 0, 0, 160694, - 0, 0, 0, 0, 160700, 0, 160706, 0, 160712, 0, 160718, 160724, 160730, 0, - 160736, 160742, 0, 160748, 0, 0, 160754, 0, 160760, 0, 160766, 0, 160772, - 0, 160780, 0, 160788, 160794, 0, 160800, 0, 0, 160806, 160812, 160818, - 160824, 0, 160830, 160836, 160842, 160848, 160854, 160860, 160866, 0, - 160872, 160878, 160884, 160890, 0, 160896, 160902, 160908, 160914, 0, - 160922, 0, 160930, 160936, 160942, 160948, 160954, 160960, 160966, - 160972, 160978, 160984, 0, 160990, 160996, 161002, 161008, 161014, - 161020, 161026, 161032, 161038, 161044, 161050, 161056, 161062, 161068, - 161074, 161080, 161086, 0, 0, 0, 0, 0, 161092, 161097, 161102, 0, 161107, - 161112, 161117, 161122, 161127, 0, 161132, 161137, 161142, 161147, - 161152, 161157, 161162, 161167, 161172, 161177, 161182, 161187, 161192, - 161197, 161202, 161207, 161212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161217, 161227, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 161235, 161242, 161249, 161256, 161262, - 161269, 161276, 161282, 161289, 161296, 161303, 161311, 161319, 161327, - 161335, 161343, 161351, 161358, 161365, 161372, 161380, 161388, 161396, - 161404, 161412, 161420, 161427, 161434, 161441, 161449, 161457, 161465, - 161473, 161481, 161489, 161494, 161499, 161504, 161509, 161514, 161519, - 161524, 161529, 161534, 0, 0, 0, 0, 161539, 161545, 161549, 161553, - 161557, 161561, 161565, 161569, 161573, 161577, 161581, 161585, 161589, - 161593, 161597, 161601, 161605, 161609, 161613, 161617, 161621, 161625, - 161629, 161633, 161637, 161641, 161645, 161649, 161653, 161657, 161661, - 161665, 161669, 161673, 161677, 161681, 161685, 161689, 161693, 161697, - 161701, 161705, 161709, 161713, 161717, 161721, 161725, 161729, 161733, - 161737, 161741, 161746, 161750, 161754, 161758, 161762, 161766, 161770, - 161774, 161778, 161782, 161786, 161790, 161794, 161798, 161802, 161806, - 161810, 161814, 161818, 161822, 161826, 161830, 161834, 161838, 161842, - 161846, 161850, 161854, 161858, 161862, 161866, 161870, 161874, 161878, - 161882, 161886, 161890, 161894, 161898, 161902, 161906, 161910, 161914, - 161918, 161922, 161926, 161930, 161934, 161938, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 161942, 161948, 161957, 161965, 161973, 161982, 161991, - 162000, 162009, 162018, 162027, 162036, 162045, 162054, 162063, 0, 0, - 162072, 162081, 162089, 162097, 162106, 162115, 162124, 162133, 162142, - 162151, 162160, 162169, 162178, 162187, 162196, 0, 162204, 162213, - 162221, 162229, 162238, 162247, 162256, 162265, 162274, 162283, 162292, - 162301, 162310, 162319, 162328, 0, 162335, 162344, 162352, 162360, - 162369, 162378, 162387, 162396, 162405, 162414, 162423, 162432, 162441, - 162450, 162459, 162466, 162472, 162478, 162484, 162490, 162496, 162502, - 162508, 162514, 162520, 162526, 162532, 162538, 162544, 162550, 162556, - 162562, 162568, 162574, 162580, 162586, 162592, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 162598, 162605, 162610, 162614, 162618, 162622, 162627, 162632, - 162637, 162642, 162647, 162652, 162659, 0, 0, 0, 162668, 162673, 162679, - 162685, 162691, 162696, 162702, 162708, 162714, 162719, 162725, 162731, - 162736, 162742, 162748, 162753, 162759, 162765, 162770, 162776, 162782, - 162787, 162793, 162799, 162805, 162811, 162817, 162828, 162835, 162841, - 162844, 162847, 162850, 162855, 162861, 162867, 162873, 162878, 162884, - 162890, 162896, 162901, 162907, 162913, 162918, 162924, 162930, 162935, - 162941, 162947, 162952, 162958, 162964, 162969, 162975, 162981, 162987, - 162993, 162999, 163002, 163005, 163008, 163011, 163014, 163017, 163024, - 163032, 163040, 163048, 163055, 163063, 163071, 163079, 163086, 163094, - 163102, 163109, 163117, 163125, 163132, 163140, 163148, 163155, 163163, - 163171, 163178, 163186, 163194, 163202, 163210, 163218, 163223, 0, 0, 0, - 0, 163228, 163235, 163243, 163251, 163259, 163266, 163274, 163282, - 163290, 163297, 163305, 163313, 163320, 163328, 163336, 163343, 163351, - 163359, 163366, 163374, 163382, 163389, 163397, 163405, 163413, 163421, - 163429, 163439, 163444, 163448, 163452, 163457, 163462, 163465, 163468, - 163471, 163474, 163477, 163480, 163483, 163486, 163489, 163495, 163498, - 163502, 163507, 163511, 163516, 163521, 163527, 163533, 163539, 163544, - 163552, 163558, 163561, 163564, 163567, 163570, 163573, 163576, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 163579, 163586, 163594, 163602, 163610, 163617, 163625, - 163633, 163641, 163648, 163656, 163664, 163671, 163679, 163687, 163694, - 163702, 163710, 163717, 163725, 163733, 163740, 163748, 163756, 163764, - 163772, 163780, 163784, 163788, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 163791, 163797, 163803, 163809, 163813, 163819, 163825, 163831, 163837, - 163843, 163849, 163855, 163861, 163867, 163873, 163879, 163885, 163891, - 163897, 163903, 163909, 163915, 163921, 163927, 163933, 163939, 163945, - 163951, 163957, 163963, 163969, 163975, 163981, 163987, 163993, 163999, - 164005, 164011, 164017, 164023, 164029, 164035, 164041, 164047, 0, 0, 0, - 0, 164053, 164064, 164075, 164086, 164097, 164108, 164119, 164130, - 164141, 0, 0, 0, 0, 0, 0, 0, 164152, 164157, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 164162, 164168, 164174, 164180, 164186, 164192, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 164198, 164200, 164202, 164206, 164211, 164216, - 164218, 164224, 164229, 164231, 164237, 164241, 164243, 164247, 164253, - 164259, 164265, 164270, 164275, 164282, 164289, 164296, 164301, 164308, - 164315, 164322, 164326, 164333, 164342, 164351, 164358, 164363, 164367, - 164371, 164373, 164376, 164379, 164386, 164393, 164403, 164408, 164413, - 164418, 164423, 164425, 164431, 164435, 164437, 164439, 164441, 164443, - 164447, 164451, 164455, 164457, 164461, 164463, 164467, 164469, 164471, - 164473, 164475, 164480, 164485, 164487, 164493, 164497, 164501, 164509, - 164511, 164513, 164515, 164517, 164519, 164521, 164523, 164525, 164527, - 164529, 164533, 164537, 164539, 164541, 164543, 164545, 164547, 164552, - 164558, 164562, 164566, 164570, 164574, 164579, 164583, 164585, 164587, - 164591, 164597, 164599, 164601, 164603, 164607, 164616, 164622, 164626, - 164630, 164632, 164634, 164637, 164639, 164641, 164643, 164647, 164649, - 164653, 164658, 164660, 164665, 164671, 164678, 164682, 164686, 164690, - 164694, 164700, 164704, 164712, 164719, 164721, 164723, 164727, 164731, - 164733, 164737, 164741, 164743, 164747, 164749, 164753, 164757, 164761, - 164765, 164769, 164773, 164777, 164781, 164787, 164791, 164795, 164806, - 164811, 164815, 164819, 164825, 164829, 164833, 164837, 164844, 164851, - 164855, 164859, 164863, 164867, 164871, 164878, 164880, 164884, 164886, - 164888, 164892, 164896, 164900, 164902, 164906, 164910, 164914, 164918, - 164922, 164924, 164928, 164930, 164936, 164939, 164944, 164946, 164948, - 164951, 164953, 164955, 164958, 164965, 164972, 164979, 164984, 164988, - 164990, 164992, 164994, 164998, 165000, 165004, 165008, 165012, 165014, - 165018, 165020, 165024, 165028, 165035, 165037, 165046, 165055, 165064, - 165070, 165072, 165077, 165081, 165085, 165087, 165093, 165097, 165099, - 165103, 165107, 165109, 165113, 165118, 165122, 165128, 165134, 165136, - 165138, 165144, 165146, 165150, 165154, 165156, 165160, 165162, 165166, - 165170, 165174, 165177, 165180, 165185, 165190, 165192, 165195, 165197, - 165204, 165208, 165210, 165217, 165224, 165231, 165238, 165245, 165247, - 165249, 165251, 165255, 165257, 165259, 165261, 165263, 165265, 165267, - 165269, 165271, 165273, 165275, 165277, 165279, 165281, 165283, 165285, - 165287, 165289, 165291, 165293, 165295, 165297, 165299, 165303, 165305, - 165307, 165309, 165313, 165315, 165319, 165321, 165323, 165327, 165331, - 165337, 165339, 165341, 165343, 165345, 165349, 165353, 165355, 165359, - 165363, 165367, 165371, 165375, 165379, 165383, 165387, 165391, 165395, - 165399, 165403, 165407, 165411, 165415, 165419, 165423, 165427, 165429, - 165431, 165433, 165435, 165437, 165439, 165441, 165449, 165457, 165465, - 165473, 165478, 165483, 165488, 165492, 165496, 165501, 165505, 165507, - 165511, 165513, 165515, 165517, 165519, 165521, 165523, 165525, 165529, - 165531, 165533, 165535, 165539, 165543, 165547, 165551, 165555, 165557, - 165563, 165569, 165571, 165573, 165575, 165577, 165579, 165588, 165595, - 165602, 165606, 165613, 165618, 165625, 165634, 165639, 165643, 165647, - 165649, 165653, 165655, 165659, 165663, 165665, 165669, 165673, 165677, - 165679, 165681, 165687, 165689, 165691, 165693, 165697, 165701, 165703, - 165707, 165709, 165711, 165714, 165718, 165720, 165724, 165726, 165728, - 165733, 165735, 165739, 165743, 165746, 165750, 165754, 165758, 165762, - 165766, 165770, 165774, 165779, 165783, 165787, 165796, 165801, 165804, - 165806, 165809, 165812, 165817, 165819, 165822, 165827, 165831, 165834, - 165838, 165842, 165845, 165850, 165854, 165858, 165862, 165866, 165872, - 165878, 165884, 165890, 165895, 165906, 165908, 165912, 165914, 165916, - 165920, 165924, 165926, 165930, 165935, 165940, 165946, 165948, 165952, - 165956, 165963, 165970, 165974, 165976, 165978, 165982, 165984, 165988, - 165992, 165996, 165998, 166000, 166007, 166011, 166014, 166018, 166022, - 166026, 166028, 166032, 166034, 166036, 166040, 166042, 166046, 166050, - 166056, 166060, 166064, 166068, 166070, 166073, 166077, 166084, 166093, - 166102, 166110, 166118, 166120, 166124, 166126, 166130, 166141, 166145, - 166151, 166157, 166162, 166164, 166169, 166173, 166175, 166177, 166179, - 166183, 166187, 166191, 166196, 166206, 166221, 166233, 166245, 166249, - 166253, 166259, 166261, 166269, 166277, 166279, 166283, 166289, 166295, - 166302, 166309, 166311, 166313, 166316, 166318, 166324, 166326, 166329, - 166333, 166339, 166345, 166356, 166362, 166369, 166377, 166381, 166389, - 166397, 166403, 166409, 166416, 166418, 166422, 166424, 166426, 166431, - 166433, 166435, 166437, 166439, 166443, 166453, 166459, 166463, 166467, - 166471, 166477, 166483, 166489, 166495, 166500, 166505, 166511, 166517, - 166524, 166531, 166539, 166547, 166552, 166560, 166564, 166573, 166582, - 166588, 166592, 166596, 166600, 166603, 166608, 166610, 166612, 166614, - 166621, 166626, 166633, 166640, 166647, 166655, 166663, 166671, 166679, - 166687, 166695, 166703, 166711, 166719, 166725, 166731, 166737, 166743, - 166749, 166755, 166761, 166767, 166773, 166779, 166785, 166791, 166794, - 166803, 166812, 166814, 166821, 166825, 166827, 166829, 166833, 166839, - 166843, 166845, 166855, 166861, 166865, 166867, 166871, 166873, 166877, - 166884, 166891, 166898, 166903, 166908, 166917, 166923, 166928, 166932, - 166937, 166941, 166948, 166952, 166955, 166960, 166967, 166974, 166979, - 166984, 166989, 166996, 167005, 167016, 167022, 167028, 167034, 167044, - 167059, 167068, 167076, 167084, 167092, 167100, 167108, 167116, 167124, - 167132, 167140, 167148, 167156, 167164, 167167, 167171, 167176, 167181, - 167183, 167187, 167196, 167205, 167213, 167217, 167221, 167226, 167231, - 167236, 167238, 167243, 167247, 167249, 167253, 167257, 167263, 167268, - 167276, 167281, 167286, 167291, 167298, 167301, 167303, 167306, 167311, - 167317, 167321, 167325, 167331, 167337, 167339, 167343, 167347, 167351, - 167355, 167359, 167361, 167363, 167365, 167367, 167373, 167379, 167383, - 167385, 167387, 167389, 167398, 167402, 167409, 167416, 167418, 167421, - 167425, 167431, 167435, 167439, 167441, 167449, 167453, 167457, 167462, - 167467, 167472, 167477, 167482, 167487, 167492, 167497, 167502, 167507, - 167511, 167517, 167521, 167527, 167532, 167539, 167545, 167553, 167557, - 167564, 167568, 167572, 167576, 167581, 167586, 167588, 167592, 167601, - 167609, 167617, 167630, 167643, 167656, 167663, 167670, 167674, 167683, - 167691, 167695, 167704, 167711, 167715, 167719, 167723, 167727, 167734, - 167738, 167742, 167746, 167750, 167757, 167766, 167775, 167782, 167794, - 167806, 167810, 167814, 167818, 167822, 167826, 167830, 167838, 167846, - 167854, 167858, 167862, 167866, 167870, 167874, 167878, 167884, 167890, - 167894, 167905, 167913, 167917, 167921, 167925, 167929, 167935, 167942, - 167953, 167963, 167973, 167984, 167993, 168004, 168010, 168016, 168022, - 168028, 168034, 168038, 168045, 168054, 168061, 168067, 168071, 168075, - 168079, 168088, 168100, 168104, 168111, 168118, 168125, 168133, 168140, - 168148, 168157, 168167, 168176, 168186, 168195, 168205, 168214, 168224, - 168234, 168245, 168255, 168266, 168273, 168281, 168288, 168296, 168304, - 168313, 168321, 168330, 168337, 168349, 168356, 168368, 168371, 168375, - 168378, 168382, 168388, 168395, 168401, 168408, 168413, 168419, 168431, - 168441, 168452, 168457, 168462, 168468, 168473, 168480, 168484, 168490, - 168492, 168494, 168498, 168502, 168506, 168515, 168517, 168519, 168522, - 168524, 168526, 168530, 168532, 168536, 168538, 168542, 168544, 168546, - 168550, 168554, 168560, 168562, 168566, 168568, 168572, 168576, 168580, - 168584, 168586, 168588, 168592, 168596, 168600, 168604, 168606, 168608, - 168610, 168616, 168621, 168624, 168632, 168640, 168642, 168647, 168650, - 168655, 168666, 168673, 168678, 168683, 168685, 168689, 168691, 168695, - 168697, 168701, 168705, 168708, 168711, 168713, 168716, 168718, 168722, - 168724, 168726, 168728, 168732, 168734, 168738, 168741, 168748, 168751, - 168756, 168759, 168762, 168767, 168771, 168775, 168779, 168781, 168786, - 168789, 168793, 168795, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168797, 168802, - 168804, 168808, 168810, 168814, 168818, 168824, 168828, 168833, 168836, - 168840, 168844, 0, 0, 0, 168848, 168850, 168856, 168860, 168864, 168866, - 168870, 168872, 168874, 168878, 0, 0, 0, 0, 0, 0, 168880, 168885, 168890, - 168895, 168900, 168905, 168910, 168917, 168924, 168931, 168938, 168943, - 168948, 168953, 168958, 168965, 168971, 168978, 168985, 168992, 168997, - 169002, 169007, 169012, 169017, 169024, 169031, 169036, 169041, 169048, - 169055, 169063, 169071, 169078, 169085, 169093, 169101, 169109, 169116, - 169126, 169137, 169142, 169149, 169156, 169163, 169171, 169179, 169190, - 169198, 169206, 169214, 169219, 169224, 169229, 169234, 169239, 169244, - 169249, 169254, 169259, 169264, 169269, 169274, 169281, 169286, 169291, - 169298, 169303, 169308, 169313, 169318, 169323, 169328, 169333, 169338, - 169343, 169348, 169353, 169358, 169365, 169373, 169378, 169383, 169390, - 169395, 169400, 169405, 169412, 169417, 169424, 169429, 169436, 169441, - 169450, 169459, 169464, 169469, 169474, 169479, 169484, 169489, 169494, - 169499, 169504, 169509, 169514, 169519, 169524, 169532, 169540, 169545, - 169550, 169555, 169560, 169565, 169571, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 169577, 169585, 169593, 169601, 169609, 169615, 169621, 169625, - 169629, 169635, 169641, 169650, 169654, 169659, 169665, 169669, 169674, - 169678, 169682, 169688, 169694, 169704, 169713, 169716, 169721, 169727, - 169733, 169744, 169754, 169758, 169763, 169769, 169775, 169784, 169789, - 169793, 169798, 169802, 169808, 169814, 169820, 169824, 169827, 169831, - 169834, 169837, 169842, 169847, 169854, 169862, 169869, 169876, 169885, - 169894, 169901, 169909, 169916, 169923, 169932, 169941, 169948, 169956, - 169963, 169970, 169979, 169986, 169994, 170000, 170009, 170017, 170026, - 170033, 170043, 170054, 170062, 170070, 170079, 170087, 170095, 170104, - 170112, 170122, 170131, 170139, 170147, 170156, 170159, 170164, 170167, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170172, 170180, 170189, - 170197, 170206, 170215, 170225, 170234, 170244, 170253, 170263, 170272, - 0, 0, 0, 0, 170282, 170290, 170299, 170307, 170316, 170323, 170331, - 170338, 170346, 170354, 170363, 170371, 170380, 170390, 170401, 170411, - 170422, 170431, 170441, 170450, 170460, 170469, 170479, 170488, 170498, - 170506, 170515, 170523, 170532, 170540, 170549, 170557, 170566, 170576, - 170587, 170597, 170608, 170612, 170617, 170621, 170626, 170629, 170633, - 170636, 170640, 170644, 170649, 170653, 170658, 170663, 170669, 170674, - 170680, 170683, 170687, 170690, 0, 0, 0, 0, 0, 0, 0, 0, 170694, 170697, - 170701, 170704, 170708, 170713, 170718, 170724, 170730, 170734, 0, 0, 0, - 0, 0, 0, 170738, 170744, 170751, 170757, 170764, 170772, 170780, 170789, - 170798, 170803, 170809, 170814, 170820, 170827, 170834, 170842, 170850, - 170857, 170865, 170872, 170880, 170889, 170898, 170908, 170918, 170924, - 170931, 170937, 170944, 170952, 170960, 170969, 170978, 170986, 170995, - 171003, 171012, 171022, 171032, 171043, 0, 0, 0, 0, 0, 0, 0, 0, 171054, - 171059, 171065, 171070, 171076, 171085, 171095, 171104, 171114, 171121, - 171129, 171136, 171144, 171151, 171160, 171169, 171178, 171183, 171190, - 171197, 171204, 171209, 171214, 171219, 171224, 171231, 171238, 171245, - 171252, 171259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171268, 171278, 171287, - 171292, 171301, 171309, 171317, 171324, 171328, 171333, 171340, 171349, - 0, 0, 0, 0, 171360, 171364, 171368, 171373, 171377, 171381, 171386, - 171390, 171394, 171400, 171406, 171413, 171417, 171421, 171423, 171433, - 171442, 171449, 171453, 171457, 171467, 171471, 171475, 171479, 171483, - 171491, 171500, 171513, 171524, 171535, 171551, 171559, 171568, 171572, - 171574, 171579, 171581, 171583, 171589, 171593, 171595, 171601, 171603, - 171605, 171609, 171611, 171615, 0, 171617, 171621, 171626, 171630, - 171634, 171636, 171640, 171642, 171648, 171654, 171660, 171664, 171670, - 171674, 171681, 171683, 171687, 171689, 171691, 171693, 171695, 171697, - 171699, 171703, 171707, 171714, 171718, 171720, 171725, 171727, 171729, - 171731, 171733, 171737, 171741, 171743, 171748, 171753, 171755, 171757, - 171759, 171761, 171766, 171768, 171772, 171776, 171778, 171782, 171784, - 0, 0, 171797, 171809, 171821, 171825, 0, 0, 0, 171829, 0, 171836, 171840, - 171842, 171846, 171850, 171852, 171856, 171858, 171860, 171864, 171866, - 171868, 171870, 171872, 171874, 171878, 171880, 171882, 171884, 171886, - 171888, 171890, 171892, 171896, 171900, 171902, 171904, 171906, 171908, - 171910, 171912, 171914, 171916, 171918, 171920, 171922, 171924, 171926, - 171928, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171930, 171938, 171946, - 171952, 171959, 171961, 171963, 171965, 171967, 171969, 0, 0, 0, 0, 0, 0, - 171971, 171975, 171977, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171981, - 171986, 171988, 171990, 171994, 171998, 172003, 172011, 172015, 172023, - 172025, 172027, 172029, 172031, 172033, 172035, 172037, 172039, 172043, - 172047, 172049, 172051, 172053, 172055, 172061, 172063, 172069, 172073, - 172077, 172082, 172084, 172086, 172090, 172092, 172094, 172096, 172098, - 172102, 172107, 172112, 172116, 172120, 172122, 172124, 172129, 172134, - 172136, 172138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 172142, 172148, 172154, 172160, 172166, 172172, 172178, - 172184, 172189, 172194, 172199, 172204, 172209, 172214, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172219, - 172223, 172227, 172231, 172235, 172239, 172243, 172247, 172251, 172255, - 172259, 172263, 172267, 172271, 172275, 172279, 172283, 172287, 172291, - 172295, 172299, 172303, 172307, 172311, 172315, 172319, 172323, 172327, - 172331, 172335, 172339, 172343, 172347, 172351, 172355, 172359, 172363, - 172367, 172371, 172375, 172379, 172383, 172387, 172391, 172395, 172399, - 172403, 172407, 172411, 172415, 172419, 172423, 172427, 172431, 172435, - 172439, 172443, 172447, 172451, 172455, 172459, 172463, 172467, 172471, - 172475, 172479, 172483, 172487, 172491, 172495, 172499, 172503, 172507, - 172511, 172515, 172519, 172523, 172527, 172531, 172535, 172539, 172543, - 172547, 172551, 172555, 172559, 172563, 172567, 172571, 172575, 172579, - 172583, 172587, 172591, 172595, 172599, 172603, 172607, 172611, 172615, - 172619, 172623, 172627, 172631, 172635, 172639, 172643, 172647, 172651, - 172655, 172659, 172663, 172667, 172671, 172675, 172679, 172683, 172687, - 172691, 172695, 172699, 172703, 172707, 172711, 172715, 172719, 172723, - 172727, 172731, 172735, 172739, 172743, 172747, 172751, 172755, 172759, - 172763, 172767, 172771, 172775, 172779, 172783, 172787, 172791, 172795, - 172799, 172803, 172807, 172811, 172815, 172819, 172823, 172827, 172831, - 172835, 172839, 172843, 172847, 172851, 172855, 172859, 172863, 172867, - 172871, 172875, 172879, 172883, 172887, 172891, 172895, 172899, 172903, - 172907, 172911, 172915, 172919, 172923, 172927, 172931, 172935, 172939, - 172943, 172947, 172951, 172955, 172959, 172963, 172967, 172971, 172975, - 172979, 172983, 172987, 172991, 172995, 172999, 173003, 173007, 173011, - 173015, 173019, 173023, 173027, 173031, 173035, 173039, 173043, 173047, - 173051, 173055, 173059, 173063, 173067, 173071, 173075, 173079, 173083, - 173087, 173091, 173095, 173099, 173103, 173107, 173111, 173115, 173119, - 173123, 173127, 173131, 173135, 173139, 173143, 173147, 173151, 173155, - 173159, 173163, 173167, 173171, 173175, 173179, 173183, 173187, 173191, - 173195, 173199, 173203, 173207, 173211, 173215, 173219, 173223, 173227, - 173231, 173235, 173239, 173243, 173247, 173251, 173255, 173259, 173263, - 173267, 173271, 173275, 173279, 173283, 173287, 173291, 173295, 173299, - 173303, 173307, 173311, 173315, 173319, 173323, 173327, 173331, 173335, - 173339, 173343, 173347, 173351, 173355, 173359, 173363, 173367, 173371, - 173375, 173379, 173383, 173387, 173391, 173395, 173399, 173403, 173407, - 173411, 173415, 173419, 173423, 173427, 173431, 173435, 173439, 173443, - 173447, 173451, 173455, 173459, 173463, 173467, 173471, 173475, 173479, - 173483, 173487, 173491, 173495, 173499, 173503, 173507, 173511, 173515, - 173519, 173523, 173527, 173531, 173535, 173539, 173543, 173547, 173551, - 173555, 173559, 173563, 173567, 173571, 173575, 173579, 173583, 173587, - 173591, 173595, 173599, 173603, 173607, 173611, 173615, 173619, 173623, - 173627, 173631, 173635, 173639, 173643, 173647, 173651, 173655, 173659, - 173663, 173667, 173671, 173675, 173679, 173683, 173687, 173691, 173695, - 173699, 173703, 173707, 173711, 173715, 173719, 173723, 173727, 173731, - 173735, 173739, 173743, 173747, 173751, 173755, 173759, 173763, 173767, - 173771, 173775, 173779, 173783, 173787, 173791, 173795, 173799, 173803, - 173807, 173811, 173815, 173819, 173823, 173827, 173831, 173835, 173839, - 173843, 173847, 173851, 173855, 173859, 173863, 173867, 173871, 173875, - 173879, 173883, 173887, 173891, 173895, 173899, 173903, 173907, 173911, - 173915, 173919, 173923, 173927, 173931, 173935, 173939, 173943, 173947, - 173951, 173955, 173959, 173963, 173967, 173971, 173975, 173979, 173983, - 173987, 173991, 173995, 173999, 174003, 174007, 174011, 174015, 174019, - 174023, 174027, 174031, 174035, 174039, 174043, 174047, 174051, 174055, - 174059, 174063, 174067, 174071, 174075, 174079, 174083, 174087, 174091, - 174095, 174099, 174103, 174107, 174111, 174115, 174119, 174123, 174127, - 174131, 174135, 174139, 174143, 174147, 174151, 174155, 174159, 174163, - 174167, 174171, 174175, 174179, 174183, 174187, 174191, 174195, 174199, - 174203, 174207, 174211, 174215, 174219, 174223, 174227, 174231, 174235, - 174239, 174243, 174247, 174251, 174255, 174259, 174263, 174267, 174271, - 174275, 174279, 174283, 174287, 174291, 174295, 174299, 174303, 174307, - 174311, 174315, 174319, 174323, 174327, 174331, 174335, 174339, 174343, - 174347, 174351, 174355, 174359, 174363, 174367, 174371, 174375, 174379, - 174383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174387, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174391, - 174394, 174398, 174402, 174405, 174409, 174413, 174416, 174419, 174423, - 174427, 174430, 174433, 174436, 174439, 174444, 174447, 174451, 174454, - 174457, 174460, 174463, 174466, 174469, 174472, 174475, 174478, 174481, - 174484, 174488, 174492, 174496, 174500, 174505, 174510, 174516, 174522, - 174528, 174533, 174539, 174545, 174551, 174556, 174562, 174568, 174573, - 174579, 174585, 174590, 174596, 174602, 174607, 174613, 174619, 174624, - 174630, 174636, 174642, 174648, 174654, 174658, 174663, 174667, 174672, - 174676, 174681, 174686, 174692, 174698, 174704, 174709, 174715, 174721, - 174727, 174732, 174738, 174744, 174749, 174755, 174761, 174766, 174772, - 174778, 174783, 174789, 174795, 174800, 174806, 174812, 174818, 174824, - 174830, 174835, 174839, 174844, 174847, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174851, - 174854, 174857, 174860, 174863, 174866, 174869, 174872, 174875, 174878, - 174881, 174884, 174887, 174890, 174893, 174896, 174899, 174902, 174905, - 174908, 174911, 174914, 174917, 174920, 174923, 174926, 174929, 174932, - 174935, 174938, 174941, 174944, 174947, 174950, 174953, 174956, 174959, - 174962, 174965, 174968, 174971, 174974, 174977, 174980, 174983, 174986, - 174989, 174992, 174995, 174998, 175001, 175004, 175007, 175010, 175013, - 175016, 175019, 175022, 175025, 175028, 175031, 175034, 175037, 175040, - 175043, 175046, 175049, 175052, 175055, 175058, 175061, 175064, 175067, - 175070, 175073, 175076, 175079, 175082, 175085, 175088, 175091, 175094, - 175097, 175100, 175103, 175106, 175109, 175112, 175115, 175118, 175121, - 175124, 175127, 175130, 175133, 175136, 175139, 175142, 175145, 175148, - 175151, 175154, 175157, 175160, 175163, 175166, 175169, 175172, 175175, - 175178, 175181, 175184, 175187, 175190, 175193, 175196, 175199, 175202, - 175205, 175208, 175211, 175214, 175217, 175220, 175223, 175226, 175229, - 175232, 175235, 175238, 175241, 175244, 175247, 175250, 175253, 175256, - 175259, 175262, 175265, 175268, 175271, 175274, 175277, 175280, 175283, - 175286, 175289, 175292, 175295, 175298, 175301, 175304, 175307, 175310, - 175313, 175316, 175319, 175322, 175325, 175328, 175331, 175334, 175337, - 175340, 175343, 175346, 175349, 175352, 175355, 175358, 175361, 175364, - 175367, 175370, 175373, 175376, 175379, 175382, 175385, 175388, 175391, - 175394, 175397, 175400, 175403, 175406, 175409, 175412, 175415, 175418, - 175421, 175424, 175427, 175430, 175433, 175436, 175439, 175442, 175445, - 175448, 175451, 175454, 175457, 175460, 175463, 175466, 175469, 175472, - 175475, 175478, 175481, 175484, 175487, 175490, 175493, 175496, 175499, - 175502, 175505, 175508, 175511, 175514, 175517, 175520, 175523, 175526, - 175529, 175532, 175535, 175538, 175541, 175544, 175547, 175550, 175553, - 175556, 175559, 175562, 175565, 175568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 175571, 175573, 175575, 175580, 175582, 175587, 175589, - 175594, 175596, 175601, 175603, 175605, 175607, 175609, 175611, 175613, - 175615, 175617, 175619, 175622, 175626, 175628, 175630, 175634, 175638, - 175643, 175645, 175647, 175649, 175653, 175656, 175658, 175662, 175664, - 175668, 175670, 175674, 175677, 175679, 175683, 175687, 175689, 175695, - 175697, 175702, 175704, 175709, 175711, 175716, 175718, 175723, 175725, - 175729, 175731, 175735, 175737, 175744, 175746, 175748, 175750, 175755, - 175757, 175759, 175761, 175763, 175765, 175770, 175774, 175776, 175781, - 175785, 175787, 175792, 175796, 175798, 175803, 175807, 175809, 175811, - 175813, 175815, 175819, 175821, 175826, 175828, 175834, 175836, 175842, - 175844, 175846, 175848, 175852, 175854, 175861, 175863, 175870, 175872, - 175877, 175883, 175885, 175891, 175898, 175900, 175906, 175911, 175913, - 175919, 175925, 175927, 175933, 175939, 175941, 175947, 175951, 175953, - 175958, 175960, 175962, 175967, 175969, 175971, 175977, 175979, 175984, - 175988, 175990, 175995, 175999, 176001, 176007, 176009, 176013, 176015, - 176019, 176021, 176028, 176035, 176037, 176044, 176051, 176053, 176058, - 176060, 176067, 176069, 176074, 176076, 176082, 176084, 176088, 176090, - 176096, 176098, 176102, 176104, 176110, 176112, 176114, 176116, 176121, - 176126, 176128, 176130, 176140, 176145, 176152, 176159, 176164, 176169, - 176181, 176185, 176189, 176193, 176197, 176199, 176201, 176203, 176205, - 176207, 176209, 176211, 176213, 176215, 176217, 176219, 176221, 176223, - 176225, 176227, 176229, 176231, 176233, 176235, 176237, 176239, 176245, - 176252, 176257, 176265, 176273, 176278, 176280, 176282, 176284, 176286, - 176288, 176290, 176292, 176294, 176296, 176298, 176300, 176302, 176304, - 176306, 176308, 176310, 176321, 176326, 176328, 176330, 176336, 176348, - 176354, 176360, 176366, 176372, 176376, 176387, 176389, 176391, 176393, - 176395, 176397, 176399, 176401, 176403, 176405, 176407, 176409, 176411, - 176413, 176415, 176417, 176419, 176421, 176423, 176425, 176427, 176429, - 176431, 176433, 176435, 176437, 176439, 176441, 176443, 176445, 176447, - 176449, 176451, 176453, 176455, 176457, 176459, 176461, 176463, 176465, - 176467, 176469, 176471, 176473, 176475, 176477, 176479, 176481, 176483, - 176485, 176487, 176489, 176491, 176493, 176495, 176497, 176499, 176501, - 176503, 176505, 176507, 176509, 176511, 176513, 176515, 176517, 176519, - 176521, 176523, 176525, 176527, 176529, 176531, 176533, 176535, 176537, - 176539, 176541, 176543, 176545, 176547, 176549, 176551, 176553, 176555, - 176557, 176559, 176561, 176563, 176565, 176567, 176569, 176571, 176573, - 176575, 176577, 176579, 176581, 176583, 176585, 176587, 176589, 176591, - 176593, 176595, 176597, 176599, 176601, 176603, 176605, 176607, 176609, - 176611, 176613, 176615, 176617, 176619, 176621, 176623, 176625, 176627, - 176629, 176631, 176633, 176635, 176637, 176639, 176641, 176643, 176645, - 176647, 176649, 176651, 176653, 176655, 176657, 176659, 176661, 176663, - 176665, 176667, 176669, 176671, 176673, 176675, 176677, 176679, 176681, - 176683, 176685, 176687, 176689, 176691, 176693, 176695, 176697, 176699, - 176701, 176703, 176705, 176707, 176709, 176711, 176713, 176715, 176717, - 176719, 176721, 176723, 176725, 176727, 176729, 176731, 176733, 176735, - 176737, 176739, 176741, 176743, 176745, 176747, 176749, 176751, 176753, - 176755, 176757, 176759, 176761, 176763, 176765, 176767, 176769, 176771, - 176773, 176775, 176777, 176779, 176781, 176783, 176785, 176787, 176789, - 176791, 176793, 176795, 176797, 176799, 176801, 176803, 176805, 176807, - 176809, 176811, 176813, 176815, 176817, 176819, 176821, 176823, 176825, - 176827, 176829, 176831, 176833, 176835, 176837, 176839, 176841, 176843, - 176845, 176847, 176849, 176851, 176853, 176855, 176857, 176859, 176861, - 176863, 176865, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 176867, 176871, 176875, 176880, 176884, 176888, 176892, 176896, - 176900, 176904, 176908, 176912, 176916, 176926, 176936, 176946, 176956, - 176970, 176984, 176997, 177010, 177021, 177032, 177043, 177054, 177065, - 177076, 177086, 177095, 177104, 177113, 177126, 177139, 177151, 177163, - 177173, 177183, 177193, 177203, 177212, 177221, 177231, 177241, 177251, - 177261, 177272, 177283, 177293, 177303, 177314, 177325, 177336, 177347, - 177357, 177370, 177381, 177395, 177403, 177414, 177422, 177430, 177438, - 177446, 177454, 177462, 177471, 177480, 177490, 177500, 177509, 177518, - 177528, 177538, 177546, 177554, 177561, 177571, 177580, 177588, 177595, - 177605, 177614, 177625, 177636, 177648, 177659, 177669, 177680, 177690, - 177701, 177709, 177713, 177717, 177721, 177725, 177729, 177733, 177737, - 177741, 177745, 177749, 177753, 177757, 177760, 177763, 177767, 177771, - 177775, 177779, 177783, 177787, 177791, 177795, 177799, 177803, 177807, - 177811, 177815, 177819, 177823, 177827, 177831, 177835, 177839, 177843, - 177847, 177851, 177855, 177859, 177863, 177867, 177871, 177875, 177879, - 177883, 177887, 177891, 177895, 177899, 177903, 177907, 177911, 177915, - 177919, 177923, 177927, 177931, 177935, 177939, 177943, 177947, 177951, - 177955, 177959, 177963, 177967, 177971, 177975, 177979, 177983, 177987, - 177991, 177995, 177999, 178003, 178007, 178011, 178015, 178019, 178023, - 178027, 178031, 178035, 178039, 178043, 178047, 178051, 178055, 178059, - 178063, 178067, 178071, 178075, 178079, 178083, 178087, 178091, 178095, - 178099, 178103, 178106, 178110, 178114, 178118, 178122, 178126, 178130, - 178134, 178138, 178142, 178146, 178150, 178154, 178158, 178162, 178166, - 178170, 178174, 178178, 178182, 178186, 178190, 178194, 178198, 178202, - 178206, 178210, 178214, 178218, 178222, 178226, 178230, 178234, 178238, - 178242, 178246, 178250, 178254, 178258, 178262, 178266, 178270, 178274, - 178278, 178282, 178286, 178290, 178294, 178298, 178302, 178306, 178310, - 178314, 178318, 178322, 178326, 178330, 178334, 178338, 178342, 178346, - 178350, 178354, 178358, 178362, 178366, 178370, 178374, 178378, 178382, - 178386, 178390, 178394, 178398, 178402, 178406, 178410, 178414, 178418, - 178422, 178426, 178430, 178434, 178438, 178442, 178446, 178450, 178454, - 178458, 178462, 178466, 178470, 178474, 178478, 178482, 178486, 178490, - 178494, 178498, 178502, 178506, 178510, 178514, 178518, 178522, 178526, - 178530, 178534, 178538, 178542, 178546, 178550, 178554, 178558, 178562, - 178566, 178570, 178574, 178578, 178582, 178586, 178590, 178594, 178598, - 178602, 178606, 178610, 178614, 178618, 178622, 178626, 178630, 178634, - 178638, 178642, 178646, 178650, 178654, 178658, 178662, 178666, 178670, - 178674, 178678, 178682, 178686, 178690, 178694, 178698, 178702, 178706, - 178710, 178714, 178718, 178722, 178726, 178730, 178734, 178738, 178742, - 178746, 178750, 178754, 178758, 178762, 178766, 178770, 178774, 178778, - 178782, 178786, 178790, 178794, 178798, 178802, 178806, 178810, 178814, - 178818, 178822, 178826, 178830, 178834, 178838, 178842, 178846, 178850, - 178854, 178858, 178862, 178866, 178870, 178875, 178880, 178885, 178889, - 178895, 178902, 178909, 178916, 178923, 178930, 178937, 178944, 178951, - 178958, 178965, 178972, 178979, 178986, 178992, 178999, 179006, 179012, - 179019, 179026, 179033, 179040, 179047, 179054, 179061, 179068, 179075, - 179082, 179089, 179096, 179103, 179109, 179115, 179121, 179128, 179137, - 179146, 179155, 179164, 179169, 179174, 179180, 179186, 179192, 179198, - 179204, 179210, 179216, 179222, 179228, 179234, 179240, 179246, 179251, - 179257, 179267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; /* name->code dictionary */ static unsigned int code_hash[] = { 74224, 4851, 0, 0, 0, 0, 7929, 0, 0, 0, 0, 127931, 0, 42833, 983091, - 12064, 0, 0, 194597, 69850, 65842, 0, 0, 0, 78159, 68476, 72392, 1373, 0, - 0, 5816, 0, 0, 4231, 0, 0, 4233, 4234, 4232, 68885, 70351, 0, 7404, - 72393, 0, 0, 0, 0, 0, 41601, 8874, 0, 0, 0, 0, 0, 0, 41603, 9784, 0, - 9188, 41600, 0, 0, 0, 0, 3535, 0, 0, 0, 66797, 0, 74491, 0, 3404, 100419, - 0, 72411, 1759, 100417, 0, 100418, 69972, 11240, 121038, 100416, 127764, - 0, 0, 0, 0, 0, 69970, 0, 0, 9834, 43249, 2234, 983872, 0, 0, 0, 0, 92417, - 0, 74398, 12035, 0, 983074, 43548, 0, 0, 0, 0, 0, 64318, 917549, 0, 3390, - 74483, 43265, 0, 983865, 0, 0, 0, 3400, 0, 0, 11647, 0, 0, 0, 0, 2121, - 128741, 4043, 8712, 0, 983795, 0, 121172, 0, 129456, 0, 0, 93042, 0, 0, - 983856, 0, 0, 0, 11851, 0, 3181, 66002, 0, 0, 0, 66021, 0, 194588, 5457, - 5440, 0, 93981, 65282, 2843, 5355, 0, 129333, 69971, 5194, 11657, 128353, - 0, 0, 0, 0, 0, 0, 100525, 0, 0, 74350, 0, 10682, 110820, 10602, 800, - 70044, 118883, 0, 0, 64930, 118940, 67853, 0, 0, 762, 120485, 0, 0, 0, - 10906, 1353, 6960, 0, 0, 5828, 8724, 0, 0, 0, 0, 0, 7080, 0, 0, 0, 0, - 72388, 0, 0, 0, 0, 68878, 0, 0, 0, 7240, 0, 556, 0, 0, 0, 0, 0, 72397, 0, - 0, 0, 0, 0, 0, 0, 0, 72986, 0, 0, 43931, 0, 11093, 0, 0, 125016, 7341, - 66801, 68527, 0, 1874, 0, 0, 129314, 0, 0, 0, 0, 0, 0, 7688, 0, 0, 9036, - 0, 0, 66389, 0, 121347, 0, 0, 10100, 0, 2725, 0, 0, 43981, 42128, 0, 0, - 68146, 0, 0, 0, 0, 71349, 7859, 1945, 0, 0, 0, 65918, 7188, 9992, 0, - 7389, 127008, 71341, 0, 0, 0, 528, 0, 44017, 11429, 71347, 0, 0, 120864, - 0, 0, 0, 11530, 73102, 6188, 0, 0, 68208, 1823, 0, 0, 92928, 0, 0, 7233, - 92929, 0, 0, 6639, 0, 0, 0, 0, 1176, 0, 0, 8276, 128667, 0, 0, 68892, - 42931, 0, 0, 0, 0, 0, 0, 0, 5388, 0, 0, 0, 11310, 0, 0, 0, 68888, 4199, - 119264, 0, 119020, 0, 0, 9560, 0, 0, 43869, 0, 0, 0, 83172, 0, 0, 0, - 83173, 121256, 128875, 0, 0, 74327, 0, 0, 0, 0, 0, 0, 68886, 0, 0, 0, - 8408, 64704, 0, 0, 0, 0, 0, 67999, 0, 0, 0, 0, 43049, 0, 43050, 73028, 0, - 0, 0, 0, 0, 127396, 0, 69847, 9322, 0, 0, 129321, 68192, 120507, 983634, - 0, 0, 0, 6199, 67249, 0, 0, 0, 0, 11329, 66285, 0, 983086, 0, 0, 0, 0, - 41335, 118866, 43401, 0, 41334, 0, 0, 0, 983479, 0, 983478, 128114, 0, - 42627, 0, 32, 6187, 0, 0, 983475, 3665, 121083, 42871, 983118, 41336, 0, - 0, 983471, 0, 0, 0, 4412, 0, 0, 0, 0, 119533, 0, 4181, 0, 0, 127589, 0, - 0, 71453, 6181, 74755, 917895, 0, 0, 0, 0, 121107, 0, 0, 10073, 0, - 100738, 127186, 0, 42844, 7498, 1098, 92565, 119530, 0, 0, 10207, 0, - 983229, 0, 983555, 0, 9234, 0, 6182, 0, 92552, 0, 0, 0, 0, 5471, 9461, - 6697, 0, 5473, 0, 0, 0, 0, 0, 0, 70073, 0, 0, 7767, 8304, 41339, 0, - 983489, 69450, 0, 0, 983487, 43855, 41337, 0, 0, 0, 0, 0, 0, 0, 72396, 0, - 0, 0, 42633, 0, 0, 0, 0, 0, 0, 0, 70005, 129506, 0, 0, 0, 0, 69817, - 128299, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1437, 41617, 0, 0, 0, 128853, 0, 0, 0, - 0, 0, 128529, 12113, 0, 42772, 0, 0, 7693, 10749, 0, 65210, 5773, 978, - 128134, 0, 41619, 10239, 0, 0, 0, 74328, 0, 9748, 0, 0, 0, 0, 0, 0, 0, - 70681, 0, 72811, 0, 0, 0, 92776, 0, 0, 2379, 11325, 0, 0, 67854, 0, - 78547, 42209, 0, 120392, 2369, 0, 983984, 983985, 0, 0, 73936, 7008, - 69415, 122919, 0, 43841, 2367, 127827, 983869, 0, 2375, 8060, 6194, 0, 0, - 119084, 0, 0, 0, 0, 6961, 0, 0, 0, 68426, 0, 42862, 0, 0, 6192, 127900, - 42771, 0, 0, 11435, 128445, 118797, 120800, 0, 12892, 0, 128621, 67149, - 0, 0, 0, 0, 120707, 0, 0, 19954, 0, 121164, 8983, 0, 0, 0, 0, 0, 6198, - 121344, 0, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 983507, 41323, - 0, 0, 92289, 0, 0, 0, 983503, 41321, 12907, 3048, 7752, 41320, 0, 0, - 12819, 111247, 128477, 0, 0, 0, 0, 0, 72971, 0, 0, 0, 0, 78650, 78649, 0, - 41326, 0, 11806, 43167, 0, 1245, 0, 66463, 0, 0, 0, 0, 0, 194619, 0, 0, - 0, 0, 0, 0, 70403, 325, 12874, 0, 74178, 0, 0, 119110, 0, 0, 0, 0, 0, 0, - 983563, 92175, 0, 0, 0, 121049, 0, 0, 0, 0, 0, 0, 110844, 11776, 0, - 19908, 0, 0, 0, 8753, 0, 0, 0, 9511, 43493, 0, 93032, 6205, 0, 0, 0, 0, - 0, 0, 0, 0, 126577, 0, 41607, 0, 0, 120617, 0, 0, 0, 7005, 41609, 9580, - 0, 401, 0, 43779, 0, 127962, 0, 65486, 0, 12857, 0, 11983, 0, 0, 0, - 121371, 0, 194971, 74258, 0, 0, 0, 0, 0, 0, 8295, 6200, 0, 0, 0, 0, - 71435, 0, 92523, 0, 128631, 0, 0, 125197, 0, 0, 0, 127556, 0, 0, 0, - 64775, 0, 68862, 120590, 0, 0, 0, 8074, 8199, 126641, 1907, 127269, 4432, - 127271, 10808, 120668, 127272, 127259, 3888, 127261, 72724, 127263, - 127262, 127265, 127264, 121195, 127250, 66879, 127252, 100422, 66023, - 67363, 7663, 0, 0, 0, 0, 66321, 0, 12814, 127248, 127169, 0, 0, 194603, - 7641, 92694, 0, 0, 0, 0, 74320, 120818, 120268, 0, 128475, 0, 110627, 0, - 9622, 128972, 120264, 0, 0, 0, 0, 68319, 0, 0, 71484, 0, 0, 0, 69906, 0, - 0, 947, 0, 194586, 129059, 10969, 119935, 7613, 119937, 119936, 4795, - 119930, 119933, 7376, 0, 0, 0, 0, 0, 0, 0, 0, 119919, 7216, 119921, 7217, - 119915, 7218, 119917, 7219, 119927, 119926, 119929, 119928, 7213, 119922, - 7214, 7215, 128622, 0, 8880, 7685, 128849, 0, 0, 119618, 0, 8187, 119913, - 12815, 7236, 7915, 71906, 0, 121284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 10468, 0, 0, 0, 0, 0, 0, 0, 0, 917909, 0, 110633, 1616, 3795, 67732, - 11529, 0, 0, 0, 0, 1138, 194577, 12677, 0, 0, 3239, 0, 0, 194809, 194583, - 0, 42164, 0, 11778, 0, 43259, 0, 119073, 0, 0, 0, 67094, 129638, 0, - 78421, 128123, 78418, 0, 0, 0, 0, 43959, 43960, 0, 72257, 0, 9359, 78416, - 0, 0, 0, 6662, 0, 0, 3863, 0, 41329, 55266, 0, 127822, 41328, 75026, - 194569, 129516, 0, 0, 0, 119595, 569, 0, 0, 0, 119085, 110669, 0, 0, - 11610, 11368, 0, 194570, 41331, 1006, 127747, 120883, 1550, 8201, 0, 0, - 5499, 43956, 77908, 77910, 77906, 43957, 77904, 77905, 128410, 0, 0, 0, - 100447, 43955, 77913, 0, 0, 5511, 0, 983702, 0, 69241, 8255, 5512, - 128560, 119560, 127858, 64313, 127928, 5906, 1119, 128180, 67088, 983362, - 0, 113798, 0, 66423, 0, 0, 0, 67089, 0, 0, 0, 0, 128177, 983709, 0, 0, 0, - 5821, 6186, 0, 128034, 19961, 0, 983700, 0, 65138, 302, 41113, 41115, 0, - 6637, 5907, 128789, 0, 43642, 0, 128625, 0, 70345, 5513, 6666, 100567, - 78442, 5510, 0, 0, 0, 983706, 78437, 0, 0, 0, 110838, 0, 0, 0, 92710, 0, - 0, 0, 0, 0, 74497, 92395, 120511, 6929, 69412, 0, 110835, 64442, 0, 0, - 74496, 0, 6674, 43397, 0, 1476, 0, 0, 72276, 3233, 0, 0, 10164, 0, 0, - 3530, 67243, 0, 111219, 6656, 0, 0, 74647, 8512, 72275, 74261, 8967, 0, - 0, 0, 72277, 7986, 73782, 120556, 9006, 983562, 72273, 0, 7853, 0, - 983355, 0, 0, 0, 0, 983952, 0, 0, 0, 0, 0, 0, 0, 0, 127971, 67983, 13296, - 517, 0, 0, 0, 41528, 19923, 65454, 0, 0, 0, 10531, 7784, 41526, 71727, 0, - 8057, 1126, 73895, 0, 0, 0, 119186, 4251, 8235, 43142, 0, 489, 71733, - 4250, 71731, 110721, 43151, 94177, 71725, 0, 121238, 0, 0, 0, 110726, 0, - 8711, 6183, 110722, 110723, 0, 0, 7623, 0, 0, 9235, 12760, 74176, 0, 0, - 0, 0, 3743, 11514, 11078, 74582, 0, 0, 126597, 0, 0, 0, 0, 983888, 267, - 3393, 127504, 2364, 0, 69233, 6958, 0, 6201, 0, 42360, 0, 10652, 41612, - 917802, 3402, 917801, 3398, 0, 0, 0, 3391, 70683, 0, 92541, 128017, - 126087, 126590, 0, 12767, 0, 983375, 64261, 0, 127537, 70852, 70347, 0, - 6673, 0, 0, 129346, 12438, 0, 0, 0, 71128, 0, 9053, 43954, 74523, 0, 0, - 0, 6195, 0, 6660, 0, 917760, 917793, 0, 12629, 0, 0, 0, 0, 0, 127940, 0, - 0, 0, 65448, 0, 0, 121084, 0, 43949, 0, 78099, 0, 0, 0, 0, 0, 5741, 1131, - 0, 0, 74862, 0, 43952, 42533, 119598, 78107, 0, 0, 43950, 121297, 118990, - 7691, 43951, 578, 0, 0, 0, 42514, 74547, 74196, 120608, 74561, 0, 983957, - 0, 0, 0, 0, 0, 0, 0, 0, 7241, 0, 93846, 119167, 0, 12811, 78082, 3946, 0, - 10998, 66807, 673, 0, 0, 0, 0, 119301, 0, 68890, 0, 0, 78085, 10267, 0, - 74560, 78083, 0, 8729, 0, 0, 0, 0, 0, 0, 0, 119296, 0, 0, 0, 120853, - 983458, 731, 0, 71904, 128316, 0, 0, 0, 1175, 0, 68167, 0, 0, 10793, 0, - 67644, 7723, 983453, 0, 0, 0, 0, 5273, 0, 5269, 0, 129138, 2404, 5267, - 124967, 0, 0, 5277, 0, 0, 6189, 65469, 1314, 0, 0, 118873, 8785, 0, 0, - 127527, 68414, 43535, 9204, 0, 3879, 0, 71696, 6197, 9497, 0, 7567, - 64484, 78128, 41390, 41379, 41882, 67647, 67279, 70085, 0, 121413, 41388, - 64446, 41392, 64288, 41387, 0, 8706, 10675, 0, 700, 0, 5775, 0, 7088, - 74756, 7499, 0, 78120, 78111, 67251, 126557, 0, 0, 128945, 10311, 78115, - 6665, 11115, 0, 7618, 10821, 11455, 0, 64632, 64447, 0, 0, 78093, 78091, - 0, 0, 65033, 0, 6668, 0, 0, 0, 656, 69686, 65037, 0, 0, 0, 0, 0, 0, 0, - 73014, 0, 0, 917774, 9702, 0, 92273, 66580, 118895, 66683, 43640, 3417, - 0, 6832, 0, 917768, 0, 917767, 0, 4935, 11906, 0, 0, 67296, 92896, 3651, - 0, 67294, 70848, 0, 67292, 0, 12983, 0, 55272, 0, 0, 1439, 0, 74897, 0, - 0, 0, 78373, 0, 42087, 3063, 0, 0, 7838, 0, 129282, 0, 0, 67968, 0, - 128582, 9078, 92446, 0, 0, 0, 0, 0, 0, 119586, 0, 7750, 128422, 68237, - 6190, 0, 0, 0, 72340, 9857, 7014, 9856, 0, 92620, 120547, 0, 8481, 0, - 6202, 0, 10920, 67970, 0, 0, 983292, 0, 7843, 65818, 66824, 0, 0, 0, 0, - 0, 0, 0, 6657, 207, 0, 69728, 74819, 0, 0, 0, 0, 0, 0, 0, 0, 41368, + 12064, 0, 129548, 194597, 69850, 65842, 0, 0, 0, 78159, 68476, 72392, + 1373, 0, 0, 5816, 0, 0, 4231, 0, 0, 4233, 4234, 4232, 68885, 70351, 0, + 7404, 72393, 0, 0, 0, 0, 0, 41601, 8874, 0, 0, 0, 0, 0, 0, 41603, 9784, + 0, 9188, 41600, 0, 0, 0, 0, 3535, 0, 0, 0, 66797, 0, 74491, 0, 3404, + 100419, 0, 72411, 1759, 100417, 0, 100418, 69972, 11240, 121038, 100416, + 127764, 0, 0, 0, 0, 0, 69970, 0, 0, 9834, 43249, 2234, 983872, 0, 0, 0, + 0, 92417, 0, 74398, 12035, 0, 983074, 43548, 0, 0, 0, 0, 0, 64318, + 917549, 0, 3390, 74483, 43265, 0, 983865, 0, 0, 0, 3400, 0, 0, 11647, 0, + 0, 0, 0, 2121, 128741, 4043, 8712, 0, 983795, 0, 121172, 0, 129456, 0, 0, + 93042, 0, 0, 983856, 0, 0, 0, 11851, 0, 3181, 66002, 0, 69601, 0, 66021, + 0, 194588, 5457, 5440, 0, 93981, 65282, 2843, 5355, 0, 129333, 69971, + 5194, 11657, 128353, 0, 0, 0, 0, 0, 0, 100525, 0, 0, 74350, 0, 10682, + 110820, 10602, 800, 70044, 118883, 0, 0, 64930, 118940, 67853, 0, 0, 762, + 120485, 0, 0, 0, 10906, 1353, 6960, 0, 0, 5828, 8724, 0, 0, 0, 0, 0, + 7080, 0, 0, 0, 0, 72388, 0, 0, 0, 0, 68878, 0, 0, 0, 7240, 0, 556, 0, 0, + 0, 0, 0, 72397, 0, 0, 0, 0, 0, 0, 0, 0, 72986, 0, 0, 43931, 0, 11093, 0, + 0, 125016, 7341, 66801, 68527, 0, 1874, 0, 0, 129314, 0, 0, 0, 0, 0, 0, + 7688, 0, 0, 9036, 0, 0, 66389, 0, 121347, 0, 0, 10100, 0, 2725, 0, 0, + 43981, 42128, 0, 0, 68146, 0, 0, 0, 0, 71349, 7859, 1945, 0, 0, 0, 65918, + 7188, 9992, 0, 7389, 127008, 71341, 0, 0, 0, 528, 129681, 44017, 11429, + 71347, 0, 0, 120864, 0, 0, 0, 11530, 73102, 6188, 0, 0, 68208, 1823, 0, + 0, 92928, 0, 0, 7233, 92929, 0, 0, 6639, 0, 0, 123149, 0, 1176, 0, 0, + 8276, 128667, 0, 0, 68892, 42931, 0, 0, 0, 0, 0, 0, 0, 5388, 0, 0, 0, + 11310, 0, 123607, 0, 68888, 4199, 119264, 0, 119020, 0, 0, 9560, 0, 0, + 43869, 0, 0, 0, 83172, 0, 0, 0, 83173, 121256, 128875, 0, 0, 74327, 0, 0, + 0, 0, 0, 123623, 68886, 0, 0, 0, 8408, 64704, 0, 0, 0, 0, 0, 67999, 0, 0, + 0, 0, 43049, 0, 43050, 73028, 0, 0, 0, 0, 0, 127396, 0, 69847, 9322, 0, + 0, 129321, 68192, 120507, 983634, 0, 0, 0, 6199, 67249, 0, 0, 0, 0, + 11329, 66285, 0, 983086, 0, 0, 0, 0, 41335, 118866, 43401, 0, 41334, 0, + 0, 0, 983479, 0, 983478, 128114, 0, 42627, 0, 32, 6187, 0, 123619, + 983475, 3665, 121083, 42871, 983118, 41336, 0, 0, 983471, 0, 0, 0, 4412, + 0, 0, 0, 0, 119533, 0, 4181, 0, 0, 127589, 0, 0, 71453, 6181, 74755, + 917895, 0, 0, 0, 0, 121107, 0, 0, 10073, 0, 100738, 127186, 0, 42844, + 7498, 1098, 92565, 119530, 0, 0, 10207, 0, 983229, 0, 983555, 0, 9234, 0, + 6182, 0, 92552, 0, 0, 0, 0, 5471, 9461, 6697, 0, 5473, 0, 0, 0, 0, 0, 0, + 70073, 0, 0, 7767, 8304, 41339, 0, 983489, 69450, 0, 0, 983487, 43855, + 41337, 0, 0, 0, 0, 0, 0, 0, 72396, 0, 0, 0, 42633, 0, 0, 0, 0, 0, 0, 0, + 70005, 129506, 0, 0, 0, 129580, 69817, 128299, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1437, 41617, 0, 0, 0, 128853, 0, 0, 0, 0, 0, 128529, 12113, 0, 42772, 0, + 0, 7693, 10749, 0, 65210, 5773, 978, 128134, 0, 41619, 10239, 0, 0, 0, + 74328, 0, 9748, 0, 0, 0, 0, 0, 0, 0, 70681, 0, 72811, 0, 0, 0, 92776, 0, + 0, 2379, 11325, 0, 0, 67854, 0, 78547, 42209, 0, 120392, 2369, 0, 983984, + 983985, 0, 0, 73936, 7008, 69415, 122919, 0, 43841, 2367, 127827, 983869, + 0, 2375, 8060, 6194, 0, 0, 119084, 0, 0, 0, 0, 6961, 0, 0, 0, 68426, 0, + 42862, 0, 0, 6192, 127900, 42771, 0, 0, 11435, 128445, 118797, 120800, 0, + 12892, 0, 128621, 67149, 0, 0, 0, 0, 120707, 0, 0, 19954, 0, 121164, + 8983, 0, 0, 0, 0, 0, 6198, 121344, 0, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 983507, 41323, 0, 0, 92289, 0, 0, 0, 983503, 41321, 12907, + 3048, 7752, 41320, 0, 0, 12819, 111247, 72127, 0, 0, 0, 0, 0, 72971, 0, + 0, 0, 0, 78650, 78649, 0, 41326, 0, 11806, 43167, 0, 1245, 0, 66463, 0, + 0, 0, 0, 0, 194619, 0, 0, 0, 0, 0, 0, 70403, 325, 12874, 0, 74178, 0, 0, + 119110, 0, 0, 0, 0, 0, 0, 983563, 92175, 0, 0, 0, 121049, 0, 0, 0, 0, 0, + 0, 110844, 11776, 0, 19908, 0, 0, 0, 8753, 0, 0, 0, 9511, 43493, 0, + 93032, 6205, 0, 0, 0, 0, 0, 0, 0, 0, 126577, 0, 41607, 0, 0, 120617, 0, + 0, 0, 7005, 41609, 9580, 0, 401, 0, 43779, 0, 127962, 0, 65486, 0, 12857, + 0, 11983, 0, 0, 0, 121371, 0, 194971, 74258, 0, 0, 0, 0, 0, 0, 8295, + 6200, 0, 127864, 0, 0, 71435, 0, 92523, 0, 128631, 0, 0, 125197, 0, 0, 0, + 127556, 0, 0, 0, 64775, 0, 68862, 120590, 0, 0, 0, 8074, 8199, 126641, + 1907, 127269, 4432, 127271, 10808, 120668, 127272, 127259, 3888, 127261, + 72724, 127263, 127262, 127265, 123169, 121195, 127250, 66879, 127252, + 100422, 66023, 67363, 7663, 0, 0, 0, 0, 66321, 0, 12814, 127248, 127169, + 0, 0, 194603, 7641, 92694, 0, 0, 0, 0, 74320, 120818, 120268, 0, 128475, + 0, 110627, 0, 9622, 128972, 120264, 0, 0, 0, 0, 68319, 0, 0, 71484, 0, 0, + 0, 69906, 0, 0, 947, 0, 194586, 129059, 10969, 119935, 7613, 119937, + 119936, 4795, 119930, 119933, 7376, 0, 0, 0, 0, 0, 0, 0, 0, 119919, 7216, + 119921, 7217, 119915, 7218, 119917, 7219, 119927, 119926, 119929, 119928, + 7213, 119922, 7214, 7215, 128622, 0, 8880, 7685, 128849, 0, 0, 119618, 0, + 8187, 119913, 12815, 7236, 7915, 71906, 0, 121284, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10468, 0, 0, 0, 0, 0, 0, 0, 0, 917909, 0, 110633, 1616, + 3795, 67732, 11529, 0, 126225, 0, 0, 1138, 194577, 12677, 0, 0, 3239, 0, + 0, 194809, 194583, 0, 42164, 0, 11778, 0, 43259, 0, 119073, 0, 0, 0, + 67094, 129638, 0, 78421, 128123, 78418, 0, 0, 0, 0, 43959, 43960, 0, + 72257, 0, 9359, 78416, 0, 0, 0, 6662, 0, 0, 3863, 0, 41329, 55266, 0, + 127822, 41328, 75026, 194569, 129516, 0, 0, 0, 119595, 569, 0, 0, 0, + 119085, 110669, 0, 0, 11610, 11368, 0, 194570, 41331, 1006, 127747, + 120883, 1550, 8201, 0, 0, 5499, 43956, 77908, 77910, 77906, 43957, 77904, + 77905, 128410, 0, 0, 129581, 100447, 43955, 77913, 0, 0, 5511, 0, 983702, + 0, 69241, 8255, 5512, 128560, 119560, 127858, 64313, 127928, 5906, 1119, + 128180, 67088, 983362, 0, 113798, 0, 66423, 0, 0, 0, 67089, 0, 0, 0, 0, + 128177, 983709, 0, 0, 0, 5821, 6186, 0, 128034, 19961, 0, 983700, 0, + 65138, 302, 41113, 41115, 0, 6637, 5907, 128789, 0, 43642, 0, 128625, 0, + 70345, 5513, 6666, 100567, 78442, 5510, 0, 0, 0, 983706, 78437, 0, 0, 0, + 110838, 0, 0, 0, 92710, 0, 0, 0, 0, 0, 74497, 92395, 120511, 6929, 69412, + 0, 110835, 64442, 0, 0, 74496, 0, 6674, 43397, 0, 1476, 0, 0, 72276, + 3233, 0, 0, 10164, 0, 0, 3530, 67243, 0, 111219, 6656, 0, 0, 74647, 8512, + 72275, 74261, 8967, 0, 0, 0, 72277, 7986, 73782, 120556, 9006, 983562, + 72273, 0, 7853, 0, 983355, 0, 0, 0, 0, 983952, 0, 0, 0, 0, 0, 0, 0, 0, + 127971, 67983, 13296, 517, 0, 0, 0, 41528, 19923, 65454, 0, 0, 0, 10531, + 7784, 41526, 71727, 0, 8057, 1126, 73895, 0, 0, 0, 119186, 4251, 8235, + 43142, 0, 489, 71733, 4250, 71731, 110721, 43151, 94177, 71725, 0, + 121238, 0, 0, 0, 110726, 0, 8711, 6183, 110722, 110723, 0, 0, 7623, 0, 0, + 9235, 12760, 74176, 0, 0, 0, 0, 3743, 11514, 11078, 74582, 0, 0, 126597, + 0, 0, 0, 0, 983888, 267, 3393, 127504, 2364, 0, 69233, 6958, 0, 6201, 0, + 42360, 0, 10652, 41612, 917802, 3402, 917801, 3398, 0, 0, 0, 3391, 70683, + 0, 92541, 128017, 126087, 126590, 0, 12767, 0, 983375, 64261, 0, 127537, + 70852, 70347, 0, 6673, 0, 0, 129346, 12438, 0, 0, 0, 71128, 0, 9053, + 43954, 74523, 0, 0, 0, 6195, 0, 6660, 0, 917760, 917793, 0, 12629, 0, 0, + 0, 0, 0, 127940, 0, 0, 0, 65448, 0, 0, 121084, 0, 43949, 0, 78099, 0, 0, + 0, 0, 0, 5741, 1131, 0, 0, 74862, 0, 43952, 42533, 119598, 78107, 0, 0, + 43950, 121297, 118990, 7691, 43951, 578, 0, 0, 0, 42514, 74547, 74196, + 120608, 74561, 0, 983957, 0, 0, 0, 0, 0, 0, 0, 0, 7241, 0, 93846, 119167, + 0, 12811, 78082, 3946, 0, 10998, 66807, 673, 0, 0, 0, 0, 119301, 0, + 68890, 0, 0, 78085, 10267, 0, 74560, 78083, 0, 8729, 0, 0, 0, 0, 0, 0, 0, + 119296, 0, 0, 0, 120853, 983458, 731, 0, 71904, 128316, 0, 0, 0, 1175, 0, + 68167, 0, 0, 10793, 0, 67644, 7723, 983453, 0, 0, 0, 0, 5273, 0, 5269, 0, + 69607, 2404, 5267, 124967, 0, 0, 5277, 0, 0, 6189, 65469, 1314, 0, 0, + 118873, 8785, 0, 0, 127527, 68414, 43535, 9204, 0, 3879, 0, 71696, 6197, + 9497, 0, 7567, 64484, 78128, 41390, 41379, 41882, 67647, 67279, 70085, 0, + 121413, 41388, 64446, 41392, 64288, 41387, 0, 8706, 10675, 0, 700, 0, + 5775, 0, 7088, 74756, 7499, 0, 78120, 78111, 67251, 126557, 0, 0, 128945, + 10311, 78115, 6665, 11115, 0, 7618, 10821, 11455, 0, 64632, 64447, 0, 0, + 78093, 78091, 0, 0, 65033, 0, 6668, 0, 0, 0, 656, 69686, 65037, 0, 0, 0, + 0, 0, 0, 0, 73014, 0, 0, 917774, 9702, 0, 92273, 66580, 118895, 66683, + 43640, 3417, 0, 6832, 0, 917768, 0, 917767, 0, 4935, 11906, 0, 0, 67296, + 92896, 3651, 0, 67294, 70848, 0, 67292, 0, 12983, 0, 55272, 0, 0, 1439, + 0, 74897, 0, 0, 0, 78373, 0, 42087, 3063, 0, 0, 7838, 0, 129282, 0, 0, + 67968, 0, 128582, 9078, 92446, 0, 0, 0, 0, 0, 0, 119586, 0, 7750, 128422, + 68237, 6190, 0, 0, 0, 72340, 9857, 7014, 9856, 0, 92620, 120547, 0, 8481, + 0, 6202, 0, 10920, 67970, 0, 0, 983292, 0, 7843, 65818, 66824, 0, 0, 0, + 0, 0, 0, 0, 6657, 207, 0, 69728, 74819, 0, 0, 0, 0, 0, 0, 0, 0, 41368, 43974, 488, 0, 0, 71339, 10157, 0, 43034, 11982, 0, 0, 0, 0, 0, 41372, - 6669, 8504, 127864, 0, 41367, 129328, 119272, 0, 11726, 8261, 0, 304, 0, + 6669, 8504, 72103, 0, 41367, 129328, 119272, 0, 11726, 8261, 0, 304, 0, 0, 0, 0, 113683, 983235, 238, 74522, 0, 0, 19905, 120577, 983469, 0, 41044, 67640, 67302, 64814, 9912, 65939, 983465, 0, 0, 0, 0, 0, 0, 309, - 6622, 0, 10858, 0, 67636, 0, 72749, 0, 0, 0, 67637, 0, 9712, 68680, + 6622, 0, 10858, 0, 67636, 0, 72749, 0, 0, 0, 67637, 123138, 9712, 68680, 43970, 0, 65165, 93047, 0, 0, 0, 0, 0, 0, 6191, 12944, 0, 0, 67634, - 43763, 0, 0, 67635, 9370, 41381, 0, 0, 0, 118817, 0, 3222, 121439, 0, 0, - 66663, 0, 0, 0, 0, 0, 65732, 121144, 0, 0, 0, 0, 67309, 72192, 41383, - 64568, 0, 0, 0, 0, 983990, 66725, 0, 0, 0, 0, 0, 67306, 3632, 128246, 0, - 8376, 3648, 0, 74844, 67639, 3636, 0, 3650, 8837, 0, 0, 0, 43250, 41562, - 0, 0, 68839, 3640, 127190, 0, 11781, 0, 0, 0, 0, 0, 0, 126649, 0, 42080, - 2529, 0, 78004, 0, 42083, 0, 0, 120531, 67619, 0, 0, 9634, 0, 0, 0, 0, 0, - 0, 0, 68841, 0, 92545, 68874, 0, 0, 0, 41987, 119667, 67623, 983760, 0, - 925, 127156, 0, 41985, 64441, 9586, 120988, 41984, 9217, 128372, 0, 0, - 9186, 67620, 4016, 983815, 0, 381, 0, 0, 42077, 0, 128777, 67622, 42078, - 0, 10810, 0, 4585, 19943, 5860, 67633, 0, 0, 812, 0, 0, 0, 92518, 0, 0, - 0, 0, 67629, 0, 10692, 0, 67630, 0, 924, 0, 67631, 42616, 0, 0, 0, 67317, - 67632, 0, 12771, 12736, 12753, 0, 983734, 67626, 67722, 0, 0, 0, 0, - 12751, 74906, 8542, 0, 0, 3626, 66706, 0, 0, 3883, 64388, 0, 0, 0, 0, 0, - 0, 0, 67624, 0, 10932, 0, 65585, 64338, 806, 0, 41884, 110845, 1318, - 128828, 0, 0, 0, 983789, 3465, 2405, 983390, 0, 12756, 65259, 69381, - 983793, 12752, 5833, 1432, 110843, 41883, 110841, 9799, 0, 41886, 0, 0, - 2062, 0, 0, 0, 0, 129376, 0, 124969, 0, 0, 120971, 0, 118832, 0, 0, 0, - 68005, 10622, 0, 0, 0, 6566, 71195, 0, 73780, 0, 68865, 0, 0, 0, 8284, 0, - 0, 0, 0, 0, 43023, 0, 983285, 6642, 3977, 72743, 64729, 836, 983381, - 92947, 0, 0, 0, 0, 0, 0, 125239, 917923, 0, 0, 0, 0, 0, 0, 1374, 65149, - 119014, 67720, 0, 2273, 0, 0, 0, 11234, 0, 0, 9630, 12597, 0, 0, 0, 6661, - 0, 113751, 0, 125015, 0, 0, 0, 0, 93008, 7718, 113755, 0, 0, 0, 0, - 983758, 0, 0, 0, 127841, 6365, 1887, 0, 0, 8080, 113681, 0, 0, 0, 0, - 1544, 0, 0, 64677, 0, 0, 0, 0, 119019, 0, 0, 12812, 7342, 0, 73784, 0, - 7904, 0, 0, 120910, 0, 0, 0, 0, 9724, 0, 0, 9524, 0, 0, 0, 0, 0, 0, 0, - 471, 0, 0, 128302, 0, 0, 0, 983750, 0, 0, 6918, 0, 0, 5156, 0, 128683, - 10232, 10615, 10213, 0, 0, 42528, 0, 0, 0, 0, 65311, 74935, 0, 13306, - 10533, 7870, 0, 7625, 0, 120544, 0, 0, 128816, 126098, 0, 0, 0, 0, 0, - 92341, 0, 12978, 128533, 0, 0, 43836, 42675, 0, 12845, 0, 19942, 0, 0, 0, - 0, 0, 120000, 120008, 120001, 0, 194894, 0, 0, 0, 0, 7186, 73107, 0, - 70093, 445, 0, 0, 0, 0, 73047, 0, 0, 128442, 0, 0, 0, 3902, 68913, 0, 0, - 0, 1560, 43958, 0, 4584, 0, 67862, 0, 10866, 92905, 1118, 92209, 74888, - 0, 1081, 7436, 11147, 7252, 0, 121188, 0, 0, 0, 41386, 5162, 0, 1330, 0, - 121270, 0, 12047, 7675, 0, 0, 1848, 74528, 983147, 64708, 0, 0, 194880, - 0, 0, 0, 983753, 12715, 128349, 0, 0, 0, 66672, 194892, 66685, 0, 0, - 92464, 0, 68884, 0, 72835, 0, 70800, 70101, 120725, 0, 194893, 9214, - 43494, 0, 0, 120841, 0, 0, 6313, 65513, 0, 0, 0, 0, 2345, 72975, 0, 0, 0, - 0, 3117, 0, 71882, 0, 73100, 0, 0, 0, 0, 78415, 983232, 100907, 0, 13248, - 0, 120241, 129416, 128415, 0, 121009, 12382, 71120, 0, 0, 0, 0, 1471, 0, - 113747, 0, 12378, 0, 69664, 0, 12374, 121357, 0, 0, 0, 0, 0, 0, 12376, 0, - 0, 0, 12380, 10557, 0, 12520, 11122, 2024, 127180, 0, 0, 74588, 0, 0, - 70120, 3853, 0, 0, 0, 983744, 0, 0, 12090, 0, 12474, 92579, 9503, 0, 0, - 983271, 68318, 0, 110834, 0, 0, 0, 12470, 0, 74189, 2742, 12476, 66370, - 10946, 0, 12472, 0, 0, 0, 0, 8213, 43824, 7771, 6161, 0, 68010, 0, 0, 0, - 68235, 0, 0, 0, 120985, 0, 0, 0, 0, 73791, 0, 68871, 0, 0, 0, 0, 0, - 73952, 12015, 128561, 8275, 0, 43459, 120927, 127555, 0, 0, 0, 68881, - 71215, 0, 118841, 0, 12516, 4444, 0, 119017, 120506, 10892, 118828, 0, - 6473, 0, 0, 71735, 3591, 0, 0, 0, 0, 72345, 0, 0, 0, 127547, 0, 0, 0, 0, - 128253, 0, 0, 0, 0, 94060, 687, 0, 0, 0, 0, 0, 68671, 0, 128526, 285, 0, - 0, 0, 4459, 0, 0, 74917, 0, 0, 0, 0, 119248, 0, 9743, 0, 0, 126535, 0, 0, - 73104, 0, 69659, 0, 0, 3081, 74577, 42921, 0, 0, 0, 0, 0, 0, 0, 9125, - 119023, 0, 120820, 0, 65221, 0, 0, 64852, 0, 0, 0, 0, 66578, 5001, 41879, - 0, 0, 5003, 884, 0, 0, 4943, 5150, 73889, 74182, 0, 41876, 0, 0, 42448, - 42299, 72804, 0, 0, 0, 0, 8491, 0, 0, 983635, 4530, 42409, 7126, 0, - 66200, 0, 0, 19929, 0, 0, 0, 4242, 0, 0, 0, 0, 66034, 65941, 124929, - 64522, 10740, 8958, 128257, 9754, 119102, 983246, 74222, 983244, 983243, - 119064, 983241, 983240, 0, 0, 0, 74518, 66026, 4306, 41468, 68432, 0, 0, - 66667, 0, 0, 983494, 42200, 0, 0, 0, 0, 6948, 0, 8524, 0, 0, 12385, 0, - 74926, 0, 1386, 73996, 0, 0, 0, 121184, 12392, 0, 8064, 0, 0, 78216, - 119004, 2080, 710, 128491, 12390, 1666, 42091, 0, 12383, 92968, 42092, - 68418, 0, 128106, 0, 0, 42096, 0, 3362, 12377, 127878, 0, 0, 0, 0, 1244, - 4401, 73786, 12683, 10662, 0, 8112, 0, 119021, 121017, 12379, 73108, - 120534, 0, 42208, 0, 12381, 0, 0, 0, 4327, 0, 0, 128350, 0, 78232, 0, - 584, 12933, 0, 12373, 73105, 13000, 0, 2935, 129113, 12665, 0, 43081, - 73098, 120505, 12427, 0, 983625, 78227, 0, 0, 0, 0, 0, 74551, 0, 0, - 12426, 0, 0, 0, 12428, 0, 0, 0, 0, 0, 12429, 6727, 0, 0, 0, 3387, 0, 0, - 0, 0, 0, 0, 74427, 0, 3536, 120589, 9752, 92397, 6162, 0, 0, 10113, 0, 0, - 0, 12422, 0, 439, 3072, 0, 42207, 74549, 120830, 0, 0, 0, 0, 8308, 0, - 70807, 0, 0, 0, 13218, 0, 0, 8082, 12424, 0, 6819, 3539, 93838, 0, 0, - 74539, 0, 68181, 0, 72964, 0, 72969, 12420, 11371, 0, 4600, 0, 127810, 0, - 0, 0, 72962, 128552, 6704, 4591, 72966, 0, 0, 0, 72960, 120623, 561, - 12159, 78223, 0, 78224, 0, 71068, 11932, 7172, 42687, 8368, 0, 0, 93068, - 0, 0, 75010, 0, 0, 0, 0, 42463, 0, 2924, 67183, 0, 0, 0, 128958, 0, 0, - 42330, 73079, 3969, 0, 0, 7169, 1992, 9652, 0, 0, 42086, 0, 100865, 0, 0, - 0, 0, 0, 327, 0, 0, 0, 0, 0, 12433, 0, 0, 0, 12431, 0, 12434, 983434, 0, - 0, 0, 7712, 12432, 0, 69377, 129147, 100867, 0, 8212, 0, 128014, 0, - 119066, 7333, 0, 0, 0, 67407, 70006, 128461, 0, 12436, 0, 43160, 0, - 74896, 92757, 71360, 42350, 0, 0, 0, 100566, 0, 11348, 0, 0, 9194, - 983184, 0, 55250, 0, 100569, 0, 0, 0, 0, 0, 64746, 66012, 100565, 3444, - 75029, 64651, 0, 41503, 0, 0, 0, 0, 0, 0, 0, 120876, 0, 0, 129408, 65309, - 12416, 0, 0, 0, 0, 93024, 12418, 74111, 121046, 0, 0, 0, 0, 0, 4596, - 66339, 12417, 66001, 0, 126491, 12414, 8287, 0, 0, 0, 1143, 0, 0, 12415, - 0, 0, 983242, 0, 9021, 120783, 0, 11724, 0, 0, 0, 194794, 0, 0, 8027, - 194796, 74257, 127375, 11400, 74197, 194799, 66833, 194798, 0, 0, 983247, - 0, 0, 1324, 0, 0, 0, 194878, 7715, 0, 0, 194777, 194780, 0, 0, 0, 194787, - 0, 0, 0, 0, 0, 66289, 127109, 3889, 0, 194800, 0, 0, 0, 0, 121226, 12999, - 0, 120902, 0, 0, 0, 0, 0, 64802, 42210, 4597, 0, 0, 0, 12371, 67164, 0, + 43763, 0, 0, 67635, 9370, 41381, 0, 0, 123148, 118817, 0, 3222, 121439, + 0, 0, 66663, 0, 0, 0, 0, 0, 65732, 121144, 0, 0, 0, 0, 67309, 72192, + 41383, 64568, 0, 0, 0, 0, 983990, 66725, 0, 0, 0, 0, 0, 67306, 3632, + 128246, 0, 8376, 3648, 0, 74844, 67639, 3636, 0, 3650, 8837, 0, 0, 0, + 43250, 41562, 0, 0, 68839, 3640, 127190, 0, 11781, 0, 0, 0, 0, 0, 0, + 126649, 0, 42080, 2529, 0, 78004, 0, 42083, 0, 0, 120531, 67619, 0, 0, + 9634, 0, 0, 0, 0, 0, 0, 0, 68841, 0, 92545, 68874, 0, 0, 0, 41987, + 119667, 67623, 983760, 0, 925, 127156, 0, 41985, 64441, 9586, 120988, + 41984, 9217, 128372, 0, 0, 9186, 67620, 4016, 983815, 0, 381, 0, 0, + 42077, 0, 128777, 67622, 42078, 0, 10810, 0, 4585, 19943, 5860, 67633, 0, + 0, 812, 0, 0, 0, 92518, 0, 0, 0, 0, 67629, 0, 10692, 0, 67630, 0, 924, 0, + 67631, 42616, 0, 0, 0, 67317, 67632, 0, 12771, 12736, 12753, 0, 983734, + 67626, 67722, 0, 0, 0, 0, 12751, 74906, 8542, 0, 0, 3626, 66706, 0, 0, + 3883, 64388, 0, 0, 0, 0, 0, 0, 126268, 67624, 0, 10932, 0, 65585, 64338, + 806, 0, 41884, 110845, 1318, 128828, 0, 0, 0, 983789, 3465, 2405, 983390, + 0, 12756, 65259, 69381, 983793, 12752, 5833, 1432, 110843, 41883, 110841, + 9799, 0, 41886, 0, 0, 2062, 0, 0, 0, 0, 129376, 0, 124969, 0, 0, 120971, + 0, 118832, 0, 0, 0, 68005, 10622, 0, 0, 0, 6566, 71195, 0, 73780, 0, + 68865, 0, 0, 0, 8284, 0, 0, 0, 0, 0, 43023, 0, 983285, 6642, 3977, 72743, + 64729, 836, 983381, 92947, 0, 0, 0, 0, 0, 0, 125239, 917923, 0, 0, 0, 0, + 0, 0, 1374, 65149, 119014, 67720, 0, 2273, 0, 0, 0, 11234, 0, 0, 9630, + 12597, 0, 0, 0, 6661, 0, 113751, 0, 125015, 0, 0, 72151, 0, 73674, 7718, + 113755, 0, 0, 0, 0, 983758, 0, 0, 0, 127841, 6365, 1887, 0, 0, 8080, + 113681, 0, 0, 0, 0, 1544, 0, 0, 64677, 0, 0, 0, 0, 119019, 0, 0, 12812, + 7342, 0, 73784, 0, 7904, 0, 0, 120910, 0, 0, 0, 0, 9724, 0, 983785, 9524, + 0, 0, 0, 0, 0, 129344, 0, 471, 0, 0, 128302, 0, 0, 0, 983750, 0, 0, 6918, + 0, 0, 5156, 0, 128683, 10232, 10615, 10213, 0, 0, 42528, 0, 0, 0, 0, + 65311, 74935, 0, 13306, 10533, 7870, 0, 7625, 0, 120544, 0, 0, 128816, + 126098, 0, 0, 0, 0, 0, 92341, 0, 12978, 128533, 0, 0, 43836, 42675, 0, + 12845, 0, 19942, 0, 0, 0, 0, 0, 120000, 120008, 120001, 0, 194894, 0, 0, + 0, 0, 7186, 73107, 0, 70093, 445, 0, 0, 0, 0, 73047, 0, 0, 128442, 0, 0, + 0, 3902, 68913, 0, 0, 0, 1560, 43958, 0, 4584, 0, 67862, 0, 10866, 92905, + 1118, 92209, 74888, 0, 1081, 7436, 11147, 7252, 0, 121188, 0, 0, 0, + 41386, 5162, 0, 1330, 0, 121270, 0, 12047, 7675, 0, 0, 1848, 74528, + 983147, 64708, 0, 0, 194880, 0, 0, 0, 983753, 12715, 128349, 0, 0, 0, + 66672, 73710, 66685, 0, 0, 92464, 0, 68884, 0, 72835, 0, 70800, 70101, + 120725, 0, 194893, 9214, 43494, 0, 0, 120841, 0, 0, 6313, 65513, 0, 0, 0, + 0, 2345, 72975, 0, 0, 0, 0, 3117, 0, 71882, 0, 73100, 0, 0, 0, 0, 78415, + 983232, 100907, 0, 13248, 0, 120241, 129416, 128415, 0, 121009, 12382, + 71120, 0, 0, 0, 0, 1471, 0, 113747, 0, 12378, 0, 69664, 0, 12374, 121357, + 0, 0, 0, 0, 0, 0, 12376, 0, 0, 0, 12380, 10557, 0, 12520, 11122, 2024, + 127180, 0, 0, 74588, 0, 0, 70120, 3853, 0, 0, 0, 983744, 0, 0, 12090, 0, + 12474, 92579, 9503, 0, 0, 983271, 68318, 0, 110834, 0, 0, 0, 12470, 0, + 74189, 2742, 12476, 66370, 10946, 0, 12472, 0, 0, 0, 0, 8213, 43824, + 7771, 6161, 983275, 68010, 0, 0, 0, 68235, 0, 0, 0, 120985, 0, 0, 0, 0, + 73791, 0, 68871, 0, 0, 0, 0, 0, 73704, 12015, 128561, 8275, 0, 43459, + 120927, 127555, 0, 0, 0, 68881, 71215, 0, 118841, 0, 12516, 4444, 0, + 119017, 120506, 10892, 118828, 0, 6473, 0, 0, 71735, 3591, 0, 0, 0, 0, + 72345, 0, 0, 0, 127547, 0, 0, 0, 0, 128253, 0, 0, 0, 0, 94060, 687, 0, 0, + 983399, 0, 0, 68671, 0, 128526, 285, 0, 0, 0, 4459, 0, 0, 74917, 0, 0, + 126255, 0, 119248, 0, 9743, 0, 0, 126535, 0, 0, 73104, 0, 69659, 0, 0, + 3081, 74577, 42921, 0, 0, 0, 0, 0, 0, 0, 9125, 119023, 0, 120820, 0, + 65221, 0, 0, 64852, 0, 0, 0, 0, 66578, 5001, 41879, 0, 0, 5003, 884, 0, + 0, 4943, 5150, 73889, 74182, 0, 41876, 0, 0, 42448, 42299, 72804, 0, 0, + 0, 0, 8491, 0, 0, 983635, 4530, 42409, 7126, 119526, 66200, 0, 0, 19929, + 0, 0, 0, 4242, 0, 0, 0, 0, 66034, 65941, 124929, 64522, 10740, 8958, + 128257, 9754, 119102, 983246, 74222, 983244, 983243, 119064, 983241, + 983240, 0, 0, 0, 74518, 66026, 4306, 41468, 68432, 0, 0, 66667, 0, 0, + 983494, 42200, 0, 0, 0, 120236, 6948, 0, 8524, 0, 0, 12385, 0, 74926, 0, + 1386, 73996, 0, 0, 0, 121184, 12392, 0, 8064, 0, 0, 78216, 119004, 2080, + 710, 128491, 12390, 1666, 42091, 0, 12383, 92968, 42092, 68418, 0, + 128106, 0, 0, 42096, 0, 3362, 12377, 127878, 0, 0, 0, 0, 1244, 4401, + 73786, 12683, 10662, 0, 8112, 0, 119021, 121017, 12379, 73108, 120534, 0, + 42208, 0, 12381, 0, 0, 0, 4327, 0, 0, 128350, 0, 78232, 0, 584, 12933, 0, + 12373, 73105, 13000, 0, 2935, 129113, 12665, 0, 43081, 73098, 120505, + 12427, 0, 983625, 78227, 0, 0, 0, 0, 0, 74551, 0, 0, 12426, 0, 0, 0, + 12428, 0, 0, 0, 0, 0, 12429, 6727, 0, 0, 0, 3387, 0, 0, 0, 0, 0, 0, + 74427, 0, 3536, 120589, 9752, 92397, 6162, 0, 0, 10113, 0, 0, 0, 12422, + 0, 439, 3072, 0, 42207, 74549, 120830, 0, 0, 0, 0, 8308, 0, 70807, 0, 0, + 0, 13218, 0, 0, 8082, 12424, 0, 6819, 3539, 93838, 0, 0, 74539, 0, 68181, + 0, 72964, 0, 72969, 12420, 11371, 0, 4600, 0, 127810, 0, 0, 0, 72962, + 128552, 6704, 4591, 72966, 0, 0, 0, 72960, 120623, 561, 12159, 78223, 0, + 78224, 0, 71068, 11932, 7172, 42687, 8368, 0, 0, 93068, 0, 0, 75010, 0, + 0, 0, 0, 42463, 0, 2924, 67183, 0, 0, 0, 128958, 0, 0, 42330, 73079, + 3969, 0, 0, 7169, 1992, 9652, 0, 0, 42086, 0, 100865, 0, 0, 0, 0, 0, 327, + 0, 0, 0, 0, 0, 12433, 0, 0, 0, 12431, 0, 12434, 983434, 0, 0, 0, 7712, + 12432, 0, 69377, 129147, 100867, 0, 8212, 0, 128014, 0, 119066, 7333, 0, + 0, 0, 67407, 70006, 128461, 0, 12436, 0, 43160, 0, 74896, 92757, 71360, + 42350, 0, 0, 0, 100566, 0, 11348, 0, 0, 9194, 983184, 0, 55250, 0, + 100569, 0, 0, 0, 0, 0, 64746, 66012, 100565, 3444, 75029, 64651, 0, + 41503, 0, 0, 0, 0, 0, 0, 0, 120876, 0, 0, 129408, 65309, 12416, 0, 0, 0, + 0, 93024, 12418, 74111, 121046, 0, 0, 0, 0, 0, 4596, 66339, 12417, 66001, + 0, 126491, 12414, 8287, 0, 0, 0, 1143, 0, 0, 12415, 0, 0, 983242, 0, + 9021, 120783, 0, 11724, 0, 0, 0, 194794, 0, 0, 8027, 194796, 74257, + 127375, 11400, 74197, 194799, 66833, 194798, 0, 0, 983247, 0, 0, 1324, 0, + 0, 0, 194878, 7715, 0, 0, 194777, 194780, 0, 0, 0, 194787, 0, 0, 0, 0, 0, + 66289, 127109, 3889, 129561, 194800, 0, 0, 0, 0, 121226, 12999, 0, + 120902, 0, 0, 0, 0, 0, 64802, 42210, 4597, 0, 0, 0, 12371, 67164, 0, 67163, 10805, 0, 0, 0, 0, 0, 12367, 0, 0, 92557, 12363, 0, 0, 128611, 0, - 0, 0, 8005, 12365, 0, 0, 983097, 12369, 10649, 0, 0, 0, 0, 0, 42923, 0, - 0, 0, 0, 0, 0, 66659, 0, 0, 0, 0, 5268, 4954, 0, 0, 5266, 126980, 5272, + 0, 0, 8005, 12365, 0, 0, 3756, 12369, 10649, 0, 0, 0, 0, 0, 42923, 0, 0, + 0, 0, 0, 0, 66659, 0, 0, 0, 0, 5268, 4954, 0, 0, 5266, 126980, 5272, 92294, 0, 42230, 983961, 0, 9128, 0, 0, 0, 0, 6928, 9803, 42282, 9110, 1505, 0, 0, 5276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8722, 120805, 0, 0, 66695, 0, 0, 4383, 8900, 0, 0, 74930, 64297, 0, 0, 0, 0, 3419, 42229, 0, 0, @@ -23097,95 +23731,96 @@ static unsigned int code_hash[] = { 9781, 0, 4927, 0, 0, 0, 0, 12397, 129089, 128910, 0, 12394, 0, 0, 0, 0, 0, 72789, 10781, 1546, 0, 5010, 0, 10507, 127891, 128291, 0, 0, 0, 0, 7267, 0, 0, 0, 0, 2819, 0, 0, 71063, 0, 7266, 128553, 7264, 7265, 0, - 1363, 0, 119581, 65080, 0, 0, 0, 0, 43336, 0, 0, 0, 73776, 0, 43339, 0, - 9836, 0, 0, 0, 43335, 41276, 0, 73795, 43337, 817, 11211, 9922, 128841, - 41274, 11340, 42408, 42447, 74932, 0, 0, 12386, 0, 0, 0, 12389, 128398, - 0, 41996, 41686, 0, 8269, 1147, 43849, 120896, 1987, 128540, 43195, - 42001, 41990, 41999, 12391, 0, 0, 4939, 12384, 0, 0, 43243, 0, 0, 0, 0, - 0, 0, 0, 0, 8247, 0, 0, 7545, 0, 43643, 121445, 0, 10036, 0, 119813, - 10178, 119816, 0, 119815, 11762, 119818, 0, 92282, 120597, 0, 0, 119819, - 0, 0, 7719, 0, 2486, 0, 119808, 1507, 0, 129185, 70301, 9687, 119826, 0, - 119811, 66196, 0, 5262, 0, 0, 12681, 0, 0, 12406, 12219, 0, 127528, - 42810, 110991, 0, 983673, 128144, 121027, 126096, 120753, 12403, 2500, 0, - 0, 12409, 0, 0, 0, 74113, 2343, 12412, 19946, 74112, 125042, 13112, 0, - 120603, 67866, 110634, 0, 66369, 5861, 110632, 11999, 12400, 0, 0, 12645, - 0, 11320, 68410, 6748, 65040, 0, 64184, 12974, 66927, 67613, 120645, 0, - 0, 0, 0, 0, 1928, 0, 67649, 0, 0, 67609, 11235, 0, 0, 67610, 8241, 0, 0, - 4206, 0, 0, 0, 128298, 110980, 0, 67238, 0, 0, 0, 1422, 8357, 0, 7187, 0, - 120641, 0, 0, 0, 0, 125022, 111064, 92539, 10120, 12405, 0, 72997, 0, - 13278, 0, 6366, 0, 7945, 0, 4402, 0, 12402, 129372, 0, 74754, 12408, 0, - 44007, 0, 0, 0, 12411, 0, 120824, 128306, 121092, 0, 1575, 0, 0, 0, - 73003, 119622, 0, 0, 12399, 0, 6833, 0, 0, 0, 71878, 9692, 0, 0, 100615, - 6750, 66855, 0, 0, 0, 0, 43527, 0, 727, 0, 0, 0, 0, 6726, 0, 0, 12370, - 44023, 0, 126592, 2280, 0, 12372, 120642, 0, 0, 0, 0, 12366, 10963, 6066, - 1329, 0, 3052, 72987, 0, 66029, 0, 10803, 0, 0, 0, 92473, 0, 0, 0, 0, - 1499, 0, 0, 42740, 0, 0, 0, 0, 12056, 126484, 0, 3660, 69404, 42192, - 74253, 0, 42223, 67617, 125254, 0, 0, 0, 0, 9941, 0, 0, 1933, 0, 0, 0, 0, - 73866, 0, 0, 2487, 67614, 7361, 1804, 0, 67615, 0, 0, 12220, 67616, 0, 0, - 0, 68200, 6675, 0, 0, 67592, 126582, 0, 64771, 0, 9132, 0, 111004, 510, - 0, 0, 0, 4561, 7711, 92769, 92944, 111007, 0, 41569, 121282, 0, 8167, - 66885, 0, 0, 0, 69992, 66403, 6967, 0, 0, 0, 0, 333, 0, 0, 10566, 66409, - 0, 121373, 0, 72965, 110999, 66388, 6678, 0, 0, 12621, 0, 128775, 10227, - 4764, 0, 9981, 0, 70278, 11589, 0, 0, 42202, 12754, 0, 0, 0, 0, 67594, - 2048, 0, 4050, 67595, 0, 0, 43221, 11184, 72709, 0, 0, 64175, 0, 72746, - 0, 0, 0, 65461, 9798, 0, 71210, 0, 69841, 0, 952, 128235, 125107, 0, - 70296, 6449, 0, 0, 0, 43098, 64171, 8142, 64160, 0, 0, 0, 0, 0, 0, 0, 0, - 67597, 6676, 3930, 42615, 73124, 69991, 67598, 0, 0, 0, 65591, 41581, - 128056, 1453, 0, 0, 0, 8500, 42222, 0, 119270, 72992, 69996, 0, 0, 64676, - 0, 0, 67606, 66385, 0, 42217, 13102, 0, 67607, 6672, 0, 0, 0, 0, 67608, - 0, 9001, 0, 11274, 67601, 0, 64210, 6664, 0, 42056, 67602, 0, 0, 0, 0, - 1469, 67603, 65381, 69921, 4988, 42372, 0, 9598, 904, 352, 42225, 0, - 8061, 10673, 0, 0, 128276, 67600, 0, 0, 127293, 8575, 127295, 127296, - 127289, 127290, 127291, 127292, 127285, 127286, 127287, 118877, 127281, - 127282, 9460, 823, 11587, 0, 0, 0, 127305, 12387, 0, 0, 127301, 126979, - 42783, 69998, 64208, 127298, 127299, 66031, 0, 11606, 64784, 0, 69973, 0, - 0, 0, 5152, 11048, 0, 127049, 67605, 0, 0, 0, 70276, 194847, 0, 127052, - 42587, 42214, 41394, 0, 4763, 0, 118935, 0, 5260, 0, 94038, 326, 120131, - 74119, 0, 10771, 42198, 194920, 194837, 194925, 41398, 127079, 41393, - 127077, 127076, 453, 41396, 0, 13159, 11227, 9572, 0, 0, 194576, 128835, - 127081, 0, 126617, 43144, 0, 72972, 194887, 0, 0, 0, 0, 0, 64061, 0, 0, - 64056, 70310, 0, 0, 0, 194864, 0, 111084, 64301, 72998, 10464, 0, 128393, - 72847, 0, 11528, 64024, 128072, 679, 0, 0, 5850, 758, 7536, 0, 0, 43712, - 0, 64006, 983579, 64005, 70298, 0, 126487, 0, 0, 0, 0, 0, 72999, 0, - 64027, 64029, 0, 0, 64000, 0, 194874, 0, 42201, 12421, 194876, 0, 1852, - 0, 0, 73744, 0, 64041, 129127, 0, 0, 0, 92322, 12423, 12854, 0, 3496, 0, - 110966, 0, 194823, 0, 0, 6158, 8327, 74553, 0, 12419, 0, 11570, 0, 0, - 194907, 0, 7844, 983801, 194909, 0, 1682, 93039, 194911, 42756, 6765, - 128178, 0, 0, 0, 11412, 6768, 0, 194830, 71316, 0, 0, 0, 11577, 0, - 194829, 1833, 11576, 74334, 0, 0, 42854, 69438, 0, 70307, 0, 0, 8085, 0, - 194850, 0, 72996, 128778, 1949, 11614, 7847, 120489, 120997, 64483, 0, 0, - 0, 0, 0, 0, 0, 126651, 42864, 0, 64667, 74624, 0, 0, 43261, 11484, - 127535, 67840, 0, 0, 128965, 0, 72974, 0, 0, 128454, 3455, 0, 0, 9879, 0, - 0, 4158, 128050, 0, 0, 129462, 0, 0, 0, 332, 118808, 0, 0, 2407, 0, - 42199, 92386, 110865, 0, 77921, 55217, 0, 125199, 70043, 0, 0, 0, 121093, - 1834, 0, 0, 71315, 0, 65249, 0, 8662, 0, 0, 0, 0, 11539, 10784, 0, 67674, - 0, 92233, 0, 0, 118858, 0, 0, 0, 0, 0, 0, 12499, 6280, 0, 0, 0, 0, 0, 0, - 43851, 6279, 12508, 0, 12502, 9161, 0, 1620, 0, 3601, 0, 0, 67246, 609, - 11555, 0, 12496, 0, 74181, 120492, 12505, 0, 194902, 0, 43567, 239, 0, - 127085, 0, 0, 42671, 0, 0, 83095, 43565, 127082, 983936, 12696, 127753, - 0, 94062, 12929, 0, 712, 0, 4197, 0, 42818, 0, 70306, 0, 0, 983805, 0, - 43562, 0, 129034, 68076, 0, 111074, 64628, 0, 0, 0, 0, 7494, 0, 4924, 0, - 0, 0, 0, 127088, 0, 127087, 69987, 64796, 0, 0, 12033, 0, 0, 0, 0, 0, 0, - 0, 70299, 0, 0, 68324, 72420, 0, 0, 0, 0, 70309, 127000, 0, 0, 0, 72418, - 72963, 0, 5699, 0, 983879, 9488, 74410, 119112, 70477, 11170, 0, 0, - 72312, 0, 5265, 0, 0, 0, 0, 12464, 0, 43264, 72977, 0, 43345, 0, 0, - 120592, 6807, 0, 9829, 69997, 0, 0, 43346, 11393, 795, 0, 72412, 12462, - 72416, 72415, 0, 0, 64362, 0, 0, 120811, 0, 12468, 8607, 1008, 0, 120670, - 0, 0, 67855, 125018, 127177, 6758, 0, 0, 1820, 41112, 0, 11202, 0, 0, - 13223, 0, 64595, 0, 0, 0, 0, 12616, 0, 0, 0, 74467, 0, 0, 0, 0, 0, 0, - 67233, 119060, 0, 83448, 19920, 69897, 0, 129057, 0, 1130, 0, 0, 0, - 11823, 0, 0, 118896, 0, 0, 13280, 0, 10747, 118925, 0, 43509, 0, 0, 8959, - 0, 6747, 0, 0, 8568, 0, 120870, 0, 120803, 83060, 42670, 0, 11621, 12460, - 0, 0, 0, 0, 111190, 0, 66570, 72989, 121305, 126476, 120582, 0, 0, 0, - 111191, 70308, 11594, 0, 68333, 69427, 10491, 0, 0, 0, 0, 0, 127506, 0, - 194910, 4923, 65086, 8981, 0, 42133, 0, 72244, 0, 70294, 0, 0, 12485, 0, - 8642, 0, 42766, 0, 2210, 11109, 0, 0, 0, 0, 0, 7398, 0, 0, 0, 8041, 1461, - 0, 119133, 0, 6749, 0, 0, 0, 71705, 0, 0, 68071, 0, 67668, 0, 0, 9193, 0, - 0, 0, 0, 73810, 0, 0, 64305, 0, 0, 623, 781, 670, 10660, 5769, 613, 7543, - 0, 477, 92633, 92521, 0, 592, 0, 12459, 0, 0, 0, 12465, 119578, 654, - 11345, 653, 652, 111250, 647, 0, 633, 120744, 0, 111262, 12480, 74354, 0, - 39, 12487, 0, 0, 74803, 12482, 0, 12489, 0, 128962, 5550, 129175, 0, 0, - 0, 0, 1813, 0, 41311, 111205, 0, 11229, 0, 70496, 1675, 69840, 129435, 0, + 1363, 0, 119581, 65080, 0, 0, 0, 0, 43336, 0, 0, 126263, 73776, 0, 43339, + 0, 9836, 0, 0, 0, 43335, 41276, 0, 73795, 43337, 817, 11211, 9922, + 128841, 41274, 11340, 42408, 42447, 74932, 0, 0, 12386, 0, 0, 0, 12389, + 128398, 0, 41996, 41686, 0, 8269, 1147, 43849, 120896, 1987, 128540, + 43195, 42001, 41990, 41999, 12391, 0, 0, 4939, 12384, 0, 0, 43243, 0, 0, + 0, 0, 0, 0, 0, 0, 8247, 0, 0, 7545, 0, 43643, 121445, 0, 10036, 0, + 119813, 10178, 119816, 0, 119815, 11762, 119818, 0, 92282, 120597, 0, 0, + 119819, 0, 0, 7719, 0, 2486, 0, 119808, 1507, 0, 129185, 70301, 9687, + 119826, 0, 119811, 66196, 0, 5262, 0, 74642, 12681, 0, 0, 12406, 12219, + 0, 127528, 42810, 110991, 0, 983673, 128144, 121027, 126096, 120753, + 12403, 2500, 0, 0, 12409, 0, 0, 0, 74113, 2343, 12412, 19946, 74112, + 125042, 13112, 0, 120603, 67866, 110634, 0, 66369, 5861, 110632, 11999, + 12400, 0, 0, 12645, 0, 11320, 68410, 6748, 65040, 0, 64184, 12974, 66927, + 67613, 120645, 0, 0, 0, 0, 0, 1928, 0, 67649, 0, 0, 67609, 11235, 0, 0, + 67610, 8241, 0, 0, 4206, 0, 0, 0, 128298, 110980, 0, 67238, 0, 0, 0, + 1422, 8357, 0, 7187, 0, 120641, 0, 0, 0, 0, 125022, 111064, 92539, 10120, + 12405, 0, 72997, 0, 13278, 0, 6366, 0, 7945, 0, 4402, 0, 12402, 129372, + 0, 74754, 12408, 0, 44007, 0, 0, 0, 12411, 0, 120824, 128306, 121092, 0, + 1575, 0, 0, 0, 73003, 119622, 0, 0, 12399, 0, 6833, 0, 0, 0, 71878, 9692, + 0, 0, 100615, 6750, 66855, 0, 0, 0, 0, 43527, 0, 727, 0, 0, 0, 0, 6726, + 0, 0, 12370, 44023, 0, 126592, 2280, 0, 12372, 120642, 0, 0, 0, 0, 12366, + 10963, 6066, 1329, 0, 3052, 72987, 0, 66029, 0, 10803, 0, 0, 0, 92473, 0, + 0, 0, 0, 1499, 0, 0, 42740, 0, 0, 0, 0, 12056, 126484, 0, 3660, 69404, + 42192, 74253, 0, 42223, 67617, 125254, 0, 0, 0, 0, 9941, 0, 0, 1933, 0, + 0, 0, 0, 73866, 0, 0, 2487, 67614, 7361, 1804, 0, 67615, 0, 0, 12220, + 67616, 0, 0, 0, 68200, 6675, 0, 0, 67592, 126582, 0, 64771, 0, 9132, 0, + 111004, 510, 0, 0, 0, 4561, 7711, 92769, 92944, 111007, 0, 41569, 121282, + 0, 8167, 66885, 0, 0, 0, 69992, 66403, 6967, 0, 0, 0, 0, 333, 0, 0, + 10566, 66409, 0, 121373, 0, 72965, 110999, 66388, 6678, 0, 0, 12621, 0, + 128775, 10227, 4764, 0, 9981, 0, 70278, 11589, 0, 0, 42202, 12754, 0, 0, + 0, 0, 67594, 2048, 0, 4050, 67595, 0, 0, 43221, 11184, 72709, 0, 0, + 64175, 0, 72746, 0, 0, 0, 65461, 9798, 0, 71210, 0, 69841, 0, 952, + 128235, 125107, 0, 70296, 6449, 72102, 0, 0, 43098, 64171, 8142, 64160, + 0, 0, 0, 0, 0, 0, 0, 0, 67597, 6676, 3930, 42615, 73124, 69991, 67598, 0, + 0, 0, 65591, 41581, 128056, 1453, 0, 0, 0, 8500, 42222, 0, 119270, 72992, + 69996, 0, 0, 64676, 0, 0, 67606, 66385, 0, 42217, 13102, 0, 67607, 6672, + 0, 0, 0, 0, 67608, 0, 9001, 0, 11274, 67601, 0, 64210, 6664, 0, 42056, + 67602, 0, 0, 0, 0, 1469, 67603, 65381, 69921, 4988, 42372, 0, 9598, 904, + 352, 42225, 0, 8061, 10673, 0, 0, 128276, 67600, 0, 0, 127293, 8575, + 127295, 127296, 127289, 127290, 127291, 127292, 127285, 127286, 127287, + 118877, 127281, 127282, 9460, 823, 11587, 0, 0, 0, 127305, 12387, 0, 0, + 127301, 126979, 42783, 69998, 64208, 127298, 127299, 66031, 0, 11606, + 64784, 0, 69973, 0, 0, 0, 5152, 11048, 0, 120121, 67605, 0, 69604, 0, + 70276, 194847, 0, 127052, 42587, 42214, 41394, 0, 4763, 0, 118935, 0, + 5260, 0, 94038, 326, 120131, 74119, 0, 10771, 42198, 194920, 194837, + 194925, 41398, 127079, 41393, 127077, 127076, 453, 41396, 0, 13159, + 11227, 9572, 0, 0, 194576, 128835, 127081, 0, 126617, 43144, 0, 72972, + 194887, 0, 0, 0, 0, 0, 64061, 0, 0, 64056, 70310, 0, 0, 0, 194864, 0, + 111084, 64301, 72998, 10464, 0, 128393, 72847, 0, 11528, 64024, 128072, + 679, 0, 0, 5850, 758, 7536, 0, 0, 43712, 0, 64006, 983579, 64005, 70298, + 0, 126487, 0, 0, 0, 0, 0, 72999, 0, 64027, 64029, 0, 0, 64000, 0, 194874, + 0, 42201, 12421, 194876, 0, 1852, 0, 0, 73744, 0, 64041, 129127, 0, 0, 0, + 92322, 12423, 12854, 0, 3496, 0, 110966, 0, 194823, 0, 0, 6158, 8327, + 74553, 0, 12419, 0, 11570, 0, 0, 123618, 0, 7844, 983801, 194909, 0, + 1682, 93039, 194911, 42756, 6765, 128178, 0, 0, 0, 11412, 6768, 0, + 194830, 71316, 0, 0, 0, 11577, 0, 194829, 1833, 11576, 74334, 0, 0, + 42854, 69438, 0, 70307, 0, 194856, 8085, 0, 194850, 0, 72996, 128778, + 1949, 11614, 7847, 120489, 120997, 64483, 0, 0, 0, 0, 0, 0, 0, 126651, + 42864, 0, 64667, 74624, 0, 0, 43261, 11484, 127535, 67840, 0, 0, 128965, + 0, 72974, 0, 110928, 128454, 3455, 0, 0, 9879, 0, 0, 4158, 128050, 0, 0, + 110929, 0, 0, 0, 332, 118808, 0, 0, 2407, 0, 42199, 92386, 110865, 0, + 77921, 55217, 123161, 125199, 70043, 0, 0, 0, 121093, 1834, 0, 0, 71315, + 0, 65249, 0, 8662, 0, 0, 123153, 0, 11539, 10784, 0, 67674, 0, 92233, 0, + 0, 118858, 0, 0, 0, 0, 0, 0, 12499, 6280, 0, 0, 0, 0, 0, 0, 43851, 6279, + 12508, 0, 12502, 9161, 0, 1620, 0, 3601, 0, 0, 67246, 609, 11555, 0, + 12496, 0, 74181, 120492, 12505, 0, 194902, 0, 43567, 239, 0, 127085, 0, + 0, 42671, 0, 0, 83095, 43565, 127082, 983936, 12696, 127753, 0, 94062, + 12929, 0, 712, 0, 4197, 0, 42818, 0, 70306, 0, 0, 983805, 0, 43562, 0, + 129034, 68076, 0, 111074, 64628, 0, 0, 0, 0, 7494, 0, 4924, 0, 0, 0, 0, + 127088, 0, 127087, 69987, 64796, 0, 0, 12033, 0, 0, 0, 0, 0, 0, 0, 70299, + 0, 0, 68324, 72420, 0, 0, 0, 0, 70309, 127000, 0, 0, 0, 72418, 72963, 0, + 5699, 0, 983879, 9488, 74410, 119112, 70477, 11170, 0, 0, 72312, 0, 5265, + 0, 0, 0, 0, 12464, 0, 43264, 72977, 0, 43345, 0, 0, 120592, 6807, 0, + 9829, 69997, 0, 0, 43346, 11393, 795, 0, 72412, 12462, 72416, 72415, 0, + 0, 64362, 0, 0, 120811, 0, 12468, 8607, 1008, 0, 120670, 0, 0, 67855, + 125018, 127177, 6758, 0, 0, 1820, 41112, 0, 11202, 195083, 0, 13223, 0, + 64595, 0, 0, 0, 0, 12616, 0, 0, 0, 74467, 0, 0, 0, 0, 0, 0, 67233, + 119060, 0, 83448, 19920, 69897, 0, 129057, 0, 1130, 0, 0, 0, 11823, 0, 0, + 118896, 0, 0, 13280, 0, 10747, 118925, 0, 43509, 0, 0, 8959, 0, 6747, 0, + 0, 8568, 0, 120870, 0, 120803, 83060, 42670, 0, 11621, 12460, 0, 0, 0, 0, + 111190, 0, 66570, 72989, 121305, 126476, 120582, 0, 0, 0, 111191, 70308, + 11594, 0, 68333, 69427, 10491, 0, 0, 0, 0, 0, 127506, 0, 194910, 4923, + 65086, 8981, 0, 42133, 0, 72244, 0, 70294, 0, 0, 12485, 0, 8642, 0, + 42766, 0, 2210, 11109, 0, 0, 0, 0, 0, 7398, 0, 0, 0, 8041, 1461, 0, + 119133, 0, 6749, 0, 0, 0, 71705, 0, 0, 68071, 0, 67668, 0, 0, 9193, 0, 0, + 0, 0, 73810, 0, 0, 64305, 0, 0, 623, 781, 670, 10660, 5769, 613, 7543, 0, + 477, 92633, 92521, 0, 592, 0, 12459, 0, 0, 0, 12465, 119578, 654, 11345, + 653, 652, 111250, 647, 0, 633, 120744, 0, 111262, 12480, 74354, 0, 39, + 12487, 0, 0, 74803, 12482, 0, 12489, 0, 128962, 5550, 129175, 0, 0, 0, 0, + 1813, 0, 41311, 111205, 0, 11229, 0, 70496, 1675, 69840, 129435, 0, 119078, 10070, 10595, 111207, 119077, 111206, 121162, 0, 0, 0, 11222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71716, 917841, 0, 0, 270, 0, 0, 0, 0, 0, 120899, 0, 69741, 0, 0, 68251, 0, 71721, 364, 9595, 0, 0, 0, 707, 0, 0, @@ -23211,8 +23846,8 @@ static unsigned int code_hash[] = { 71717, 70195, 120836, 12510, 127070, 13039, 75019, 12513, 0, 12471, 110761, 0, 121385, 70193, 0, 0, 0, 71714, 0, 12477, 0, 12473, 7666, 67362, 237, 6281, 0, 0, 0, 0, 1312, 0, 0, 12469, 0, 0, 64335, 12475, 0, - 69382, 0, 11524, 10367, 10431, 74368, 13017, 3388, 0, 74372, 0, 0, - 129389, 4932, 0, 0, 13015, 0, 0, 65451, 8185, 0, 0, 43024, 129362, 74375, + 69382, 0, 11524, 10367, 10431, 74368, 13017, 3388, 129547, 74372, 0, 0, + 128725, 4932, 0, 0, 13015, 0, 0, 65451, 8185, 0, 0, 43024, 129362, 74375, 10129, 0, 7948, 9236, 0, 0, 0, 92726, 43473, 6289, 10484, 0, 0, 0, 12082, 12521, 3147, 110643, 110644, 12524, 110642, 2310, 0, 0, 0, 0, 13013, 0, 8596, 983852, 10804, 70497, 0, 0, 13014, 12444, 0, 71697, 13016, 0, 0, 0, @@ -23220,77 +23855,78 @@ static unsigned int code_hash[] = { 73128, 0, 0, 127805, 0, 110647, 0, 0, 983853, 12525, 0, 12523, 2152, 11969, 120596, 403, 0, 11021, 0, 0, 11030, 8610, 92567, 0, 0, 63998, 0, 0, 0, 0, 0, 0, 0, 12506, 0, 11146, 71477, 12500, 0, 12509, 0, 0, 0, 0, - 6608, 0, 0, 0, 0, 0, 77995, 0, 3608, 0, 0, 1107, 0, 0, 0, 0, 0, 0, + 6608, 0, 0, 0, 0, 0, 77995, 0, 3608, 0, 0, 1107, 0, 129658, 0, 0, 0, 0, 983937, 43217, 66571, 13222, 118963, 0, 126514, 10463, 11553, 0, 63995, 9043, 128634, 71722, 0, 0, 127751, 92974, 12529, 8042, 0, 2344, 12528, 0, 0, 0, 69719, 120956, 0, 0, 66512, 0, 12530, 0, 0, 68917, 12658, 0, 71683, 0, 983237, 0, 127526, 469, 0, 4363, 3313, 0, 0, 2023, 0, 72251, 78225, 65706, 10051, 78219, 78220, 0, 9920, 12215, 0, 4931, 1951, 12497, 119363, - 0, 0, 119336, 0, 0, 0, 0, 0, 1491, 128578, 129169, 0, 0, 0, 0, 0, 0, - 41993, 0, 67379, 0, 0, 0, 0, 9738, 41995, 1075, 0, 12535, 41992, 0, 0, 0, - 0, 128117, 0, 9940, 0, 7692, 0, 9727, 41131, 330, 8566, 0, 41133, 41117, - 128482, 12532, 78550, 78546, 43177, 0, 43235, 0, 917542, 78229, 78231, - 13031, 12910, 67710, 78555, 13028, 78553, 12537, 0, 0, 71692, 12536, - 2350, 13029, 78233, 0, 0, 13030, 0, 4527, 71250, 12538, 0, 0, 0, 0, 0, 0, - 0, 12484, 4032, 71459, 194728, 0, 64344, 0, 66700, 66000, 8412, 0, 43466, - 1296, 2325, 0, 121020, 10149, 74118, 0, 0, 12481, 121280, 12488, 0, 0, 0, - 67972, 0, 2354, 42619, 0, 73027, 6295, 901, 0, 0, 0, 0, 0, 128653, 11927, - 66584, 78559, 78560, 78557, 78558, 0, 74649, 0, 0, 67220, 194726, 78568, - 67226, 78565, 70190, 78563, 78564, 2352, 67219, 78569, 78570, 11289, - 1407, 67973, 0, 13026, 6762, 10399, 70192, 13023, 78578, 9777, 67208, - 1871, 0, 0, 0, 13024, 983835, 0, 9325, 6818, 6283, 11738, 0, 0, 0, 11741, - 0, 0, 9216, 8263, 11279, 0, 983837, 0, 13021, 71922, 3136, 0, 983840, 0, - 13022, 129143, 9956, 0, 0, 0, 42580, 0, 0, 0, 13020, 10024, 0, 94013, 0, - 0, 0, 43001, 8029, 0, 0, 0, 3335, 0, 9209, 13048, 73126, 0, 0, 0, 3333, - 119100, 0, 0, 3342, 78582, 78583, 73056, 78581, 4156, 0, 0, 0, 78591, - 1611, 73058, 13018, 78586, 78588, 78584, 3337, 4537, 78593, 11736, 0, 0, - 0, 4214, 73790, 0, 0, 13046, 0, 425, 74763, 42066, 78595, 0, 2392, 13047, - 0, 0, 12425, 13049, 0, 92243, 0, 72715, 73944, 13050, 0, 0, 0, 0, 0, 0, - 0, 8929, 0, 0, 0, 0, 983971, 0, 13045, 0, 0, 7751, 0, 9726, 0, 3997, 0, - 8768, 13044, 0, 0, 4024, 0, 0, 2419, 9757, 69736, 0, 0, 0, 129500, 0, 0, - 0, 72735, 0, 0, 0, 0, 0, 11911, 124990, 0, 2346, 194691, 69931, 0, 9646, - 3773, 43557, 68154, 42536, 0, 70108, 13043, 92686, 92494, 0, 208, 0, - 43766, 0, 0, 0, 10699, 0, 0, 7825, 7110, 111275, 0, 111274, 41109, 2398, - 111271, 0, 0, 0, 0, 0, 0, 72723, 8294, 42912, 0, 0, 0, 4876, 111316, 0, - 111326, 111282, 0, 0, 0, 73950, 13053, 9944, 0, 2811, 13051, 111313, - 3143, 111246, 66374, 110759, 0, 0, 13052, 0, 0, 63972, 119071, 7025, 0, - 0, 100464, 74161, 4154, 9863, 0, 0, 0, 63970, 1564, 0, 0, 0, 0, 0, 9942, - 0, 0, 111227, 0, 128471, 0, 63957, 0, 1626, 0, 63983, 0, 111232, 0, 0, - 121275, 111292, 6254, 4910, 69453, 0, 64753, 100458, 111303, 111298, - 127404, 111297, 3229, 0, 42774, 0, 0, 111218, 111286, 2331, 0, 7085, - 6137, 0, 70411, 0, 126070, 0, 128438, 0, 0, 65043, 0, 127588, 70412, - 128921, 64721, 0, 0, 0, 0, 0, 983770, 0, 0, 5311, 0, 965, 0, 11993, - 78055, 11278, 128787, 0, 0, 0, 121076, 120705, 0, 6294, 3144, 0, 0, - 65019, 0, 0, 0, 0, 0, 63966, 2330, 535, 3148, 12375, 110774, 0, 10556, - 2475, 12388, 4889, 0, 67863, 0, 0, 72750, 2342, 0, 0, 0, 4894, 0, 4890, - 0, 0, 0, 4893, 128426, 6571, 0, 4888, 4157, 78048, 78049, 78046, 78047, - 0, 78045, 64895, 121437, 0, 0, 0, 0, 0, 119041, 2332, 78063, 78060, - 78061, 64932, 78059, 65125, 121098, 0, 0, 0, 73941, 78066, 12203, 78064, - 78065, 8913, 120390, 4875, 0, 120396, 120389, 71854, 0, 120394, 120386, - 120395, 13104, 78076, 78077, 120393, 78075, 0, 3134, 83096, 65696, 72432, - 0, 0, 0, 8334, 0, 83207, 3449, 0, 0, 83215, 0, 0, 0, 83204, 0, 0, 0, - 69707, 0, 0, 10734, 0, 83198, 83108, 7804, 121401, 83166, 8457, 83212, 0, - 11367, 0, 78054, 0, 72762, 0, 64285, 0, 5464, 0, 83100, 2361, 7971, - 78072, 78073, 78070, 78071, 0, 8086, 0, 6707, 0, 2312, 40977, 0, 40962, - 0, 0, 74962, 40980, 0, 0, 0, 40970, 92895, 110823, 0, 42438, 72752, 6288, - 0, 127946, 5653, 42400, 10891, 73946, 5658, 70401, 0, 0, 0, 0, 71060, 0, - 0, 42326, 100482, 92191, 92685, 42478, 2327, 0, 12959, 42287, 92883, 0, - 83081, 917550, 0, 0, 2867, 128562, 66312, 698, 0, 0, 0, 70017, 0, 8000, - 12641, 83140, 0, 0, 129064, 0, 72979, 83133, 0, 83134, 0, 0, 111011, - 92960, 74356, 0, 74562, 0, 72745, 0, 0, 120568, 0, 0, 0, 0, 0, 8703, - 5462, 83195, 0, 10101, 0, 70049, 0, 0, 0, 0, 0, 66254, 120821, 0, 0, 0, - 0, 119194, 0, 42651, 0, 0, 917847, 83227, 83218, 0, 75011, 0, 917846, 0, - 64399, 0, 12899, 74564, 0, 42206, 0, 72718, 71715, 83149, 983775, 83146, - 12192, 917826, 0, 0, 0, 0, 68056, 0, 67426, 128687, 0, 0, 0, 0, 0, 0, - 67431, 71718, 74357, 0, 121176, 43596, 6090, 0, 7812, 10534, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 43306, 0, 0, 0, 7930, 0, 2292, 0, 0, 72737, 0, 6130, - 0, 0, 0, 0, 0, 70463, 968, 0, 0, 0, 43304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 11838, 0, 0, 0, 42682, 0, 0, 0, 41227, 0, 71475, 0, 64848, 0, 78574, 0, - 113792, 0, 0, 129133, 0, 66015, 74614, 959, 8885, 0, 0, 0, 9469, 9632, - 128211, 74761, 64323, 100478, 0, 2266, 78575, 310, 0, 0, 68403, 100480, - 72738, 125279, 0, 0, 6497, 0, 0, 0, 19958, 0, 0, 74953, 0, 118998, 67332, - 374, 0, 41933, 120975, 0, 0, 41934, 7465, 0, 128168, 70666, 11151, 6101, - 0, 41936, 100476, 4879, 0, 65446, 0, 0, 0, 0, 5374, 0, 128059, 127390, 0, + 0, 0, 119336, 0, 0, 0, 0, 0, 1491, 128578, 129169, 0, 0, 0, 0, 78898, + 94086, 41993, 0, 67379, 0, 0, 0, 0, 9738, 41995, 1075, 0, 12535, 41992, + 0, 0, 0, 0, 128117, 0, 9940, 0, 7692, 0, 9727, 41131, 330, 8566, 0, + 41133, 41117, 128482, 12532, 78550, 78546, 43177, 0, 43235, 0, 917542, + 78229, 78231, 13031, 12910, 67710, 78555, 13028, 78553, 12537, 0, 0, + 71692, 12536, 2350, 13029, 78233, 0, 0, 13030, 0, 4527, 71250, 12538, 0, + 0, 0, 0, 0, 0, 0, 12484, 4032, 71459, 194728, 0, 64344, 0, 66700, 66000, + 8412, 0, 43466, 1296, 2325, 0, 121020, 10149, 74118, 0, 0, 12481, 121280, + 12488, 0, 0, 0, 67972, 0, 2354, 42619, 0, 73027, 6295, 901, 0, 0, 0, 0, + 0, 128653, 11927, 66584, 78559, 78560, 78557, 78558, 0, 74649, 0, 126241, + 67220, 194726, 78568, 67226, 78565, 70190, 78563, 78564, 2352, 67219, + 78569, 78570, 11289, 1407, 67973, 0, 13026, 6762, 10399, 70192, 13023, + 78578, 9777, 67208, 1871, 0, 0, 0, 13024, 983835, 0, 9325, 6818, 6283, + 11738, 0, 0, 0, 11741, 0, 0, 9216, 8263, 11279, 0, 983837, 0, 13021, + 71922, 3136, 0, 983840, 0, 13022, 129143, 9956, 0, 0, 0, 42580, 0, 0, 0, + 13020, 10024, 0, 94013, 0, 0, 0, 43001, 8029, 0, 0, 0, 3335, 0, 9209, + 13048, 73126, 0, 0, 0, 3333, 119100, 0, 0, 3342, 78582, 78583, 73056, + 78581, 4156, 0, 0, 0, 78591, 1611, 73058, 13018, 78586, 78588, 78584, + 3337, 4537, 78593, 11736, 0, 0, 0, 4214, 73790, 0, 0, 13046, 0, 425, + 74763, 42066, 78595, 0, 2392, 13047, 0, 0, 12425, 13049, 0, 92243, 0, + 72715, 73944, 13050, 0, 0, 0, 0, 0, 0, 0, 8929, 0, 0, 0, 0, 983971, 0, + 13045, 0, 0, 7751, 0, 9726, 0, 3997, 0, 8768, 13044, 0, 0, 4024, 0, 0, + 2419, 9757, 69736, 0, 0, 0, 129500, 0, 0, 0, 72735, 0, 0, 0, 0, 0, 11911, + 124990, 0, 2346, 194691, 69931, 0, 9646, 3773, 43557, 68154, 42536, 0, + 70108, 13043, 92686, 92494, 0, 208, 0, 43766, 0, 0, 0, 10699, 0, 0, 7825, + 7110, 111275, 0, 111274, 41109, 2398, 111271, 0, 0, 0, 0, 0, 0, 72723, + 8294, 42912, 129343, 0, 0, 4876, 111316, 0, 111326, 111282, 0, 0, 0, + 73950, 13053, 9944, 0, 2811, 13051, 111313, 3143, 111246, 66374, 110759, + 0, 0, 13052, 0, 0, 63972, 119071, 7025, 0, 0, 100464, 74161, 4154, 9863, + 0, 0, 0, 63970, 1564, 0, 0, 0, 0, 0, 9942, 0, 0, 111227, 0, 128471, 0, + 63957, 0, 1626, 0, 63983, 0, 111232, 0, 0, 121275, 111292, 6254, 4910, + 69453, 0, 64753, 100458, 111303, 111298, 127404, 111297, 3229, 0, 42774, + 0, 0, 111218, 111286, 2331, 0, 7085, 6137, 0, 70411, 0, 126070, 0, + 128438, 0, 0, 65043, 0, 127588, 70412, 128921, 64721, 0, 0, 0, 0, 0, + 983770, 0, 0, 5311, 0, 965, 0, 11993, 78055, 11278, 128787, 0, 0, 0, + 121076, 120705, 0, 6294, 3144, 0, 0, 65019, 0, 0, 0, 0, 0, 63966, 2330, + 535, 3148, 12375, 110774, 0, 10556, 2475, 12388, 4889, 0, 67863, 0, 0, + 72750, 2342, 0, 0, 0, 4894, 0, 4890, 0, 0, 0, 4893, 128426, 6571, 0, + 4888, 4157, 78048, 78049, 78046, 11263, 0, 78045, 64895, 121437, 0, 0, 0, + 0, 0, 119041, 2332, 78063, 78060, 78061, 64932, 78059, 65125, 121098, 0, + 0, 0, 73941, 78066, 12203, 78064, 78065, 8913, 120390, 4875, 73678, + 120396, 120389, 71854, 0, 120394, 120386, 120395, 13104, 78076, 78077, + 120393, 78075, 0, 3134, 83096, 65696, 72432, 0, 0, 0, 8334, 0, 83207, + 3449, 0, 0, 83215, 0, 0, 0, 83204, 0, 0, 0, 69707, 0, 0, 10734, 0, 83198, + 83108, 7804, 121401, 83166, 8457, 83212, 0, 11367, 0, 78054, 0, 72762, 0, + 64285, 0, 5464, 0, 83100, 2361, 7971, 78072, 78073, 78070, 78071, 0, + 8086, 0, 6707, 0, 2312, 40977, 0, 40962, 0, 0, 74962, 40980, 0, 0, 0, + 40970, 92895, 110823, 0, 42438, 72752, 6288, 0, 127946, 5653, 42400, + 10891, 73946, 5658, 70401, 0, 0, 0, 0, 71060, 0, 0, 42326, 100482, 92191, + 92685, 42478, 2327, 0, 12959, 42287, 92883, 0, 83081, 917550, 0, 0, 2867, + 128562, 66312, 698, 0, 0, 0, 70017, 0, 8000, 12641, 83140, 0, 0, 129064, + 0, 72979, 83133, 0, 83134, 0, 0, 111011, 92960, 74356, 0, 74562, 0, + 72745, 0, 0, 120568, 0, 0, 0, 0, 0, 8703, 5462, 83195, 0, 10101, 0, + 70049, 0, 0, 128793, 0, 0, 66254, 120821, 0, 0, 123621, 0, 119194, 0, + 42651, 0, 0, 917847, 83227, 83218, 0, 75011, 0, 917846, 0, 64399, 0, + 12899, 74564, 0, 42206, 0, 72718, 71715, 83149, 983775, 83146, 12192, + 917826, 0, 0, 0, 0, 68056, 0, 67426, 128687, 0, 0, 0, 0, 0, 0, 67431, + 71718, 74357, 0, 121176, 43596, 6090, 0, 7812, 10534, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 43306, 0, 0, 0, 7930, 0, 2292, 0, 0, 72737, 0, 6130, 0, 0, + 0, 0, 0, 70463, 968, 0, 0, 0, 43304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11838, + 0, 0, 0, 42682, 0, 0, 0, 41227, 0, 71475, 0, 64848, 0, 78574, 0, 113792, + 0, 0, 129133, 0, 66015, 74614, 959, 8885, 0, 0, 0, 9469, 9632, 128211, + 74761, 64323, 100478, 0, 2266, 78575, 310, 0, 0, 68403, 100480, 72738, + 125279, 0, 0, 6497, 0, 0, 0, 19958, 0, 0, 74953, 0, 118998, 67332, 374, + 0, 41933, 120975, 0, 0, 41934, 7465, 0, 128168, 70666, 11151, 6101, 0, + 41936, 100476, 4879, 0, 65446, 0, 0, 0, 0, 5374, 0, 128059, 127390, 0, 126618, 983571, 129146, 0, 0, 1929, 0, 12142, 0, 0, 0, 121472, 0, 12982, 0, 5378, 0, 128679, 0, 0, 127869, 0, 0, 0, 0, 0, 78832, 74481, 0, 43262, 100511, 2421, 0, 2324, 828, 3611, 121055, 0, 64314, 0, 0, 0, 0, 0, 0, @@ -23299,23 +23935,23 @@ static unsigned int code_hash[] = { 100515, 0, 0, 0, 43912, 128385, 0, 0, 0, 917850, 0, 7485, 0, 129382, 74576, 44019, 128171, 917851, 3967, 129335, 0, 0, 0, 0, 119096, 0, 0, 8699, 723, 83084, 966, 0, 0, 0, 128428, 78778, 2320, 0, 65740, 4968, 0, - 0, 8075, 55276, 0, 8047, 0, 78827, 12634, 0, 78786, 71322, 0, 12174, + 0, 8075, 55276, 123589, 8047, 0, 78827, 12634, 0, 78782, 71322, 0, 12174, 42610, 0, 0, 0, 1584, 0, 6045, 0, 0, 65218, 11559, 0, 0, 0, 124991, 0, 0, 64418, 0, 0, 0, 0, 0, 0, 67821, 0, 13092, 0, 128365, 0, 0, 0, 0, 0, 11414, 0, 2531, 13034, 0, 0, 0, 13036, 0, 70866, 70198, 10394, 0, 13037, 0, 0, 0, 0, 100496, 120640, 41129, 0, 42850, 13035, 0, 0, 5466, 0, 0, 0, 0, 4535, 0, 4271, 0, 0, 6769, 0, 0, 67350, 6767, 0, 66273, 0, 6755, 73827, 9046, 67355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83235, 2563, 13033, 247, - 83229, 0, 12338, 0, 83231, 11270, 0, 0, 0, 0, 70107, 0, 0, 0, 0, 118983, + 83229, 0, 12338, 0, 83231, 11270, 0, 0, 0, 0, 70107, 0, 0, 0, 0, 3752, 83243, 68895, 0, 68897, 0, 0, 0, 0, 5009, 0, 0, 0, 0, 119521, 78823, 78824, 70353, 68399, 3877, 0, 78825, 10145, 43566, 0, 0, 10236, 0, 43782, - 0, 0, 0, 69652, 118921, 120612, 128058, 0, 43200, 43777, 71253, 0, 83254, - 0, 71866, 43203, 0, 68894, 0, 127326, 0, 43778, 119538, 0, 0, 43781, - 11303, 65547, 0, 7031, 0, 0, 67343, 83237, 83267, 0, 67341, 0, 8535, 0, - 0, 0, 66032, 0, 0, 120786, 42233, 0, 9946, 7667, 0, 11822, 0, 43189, - 120673, 100507, 2979, 1579, 0, 0, 0, 0, 0, 12635, 0, 0, 94055, 0, 1285, - 64882, 0, 0, 83113, 12640, 83112, 7401, 0, 12625, 0, 71296, 72744, 0, - 74286, 55260, 3396, 12642, 0, 110719, 0, 12630, 0, 0, 10153, 0, 6166, + 0, 127329, 0, 69652, 118921, 120612, 128058, 0, 43200, 43777, 71253, 0, + 83254, 0, 71866, 43203, 0, 68894, 0, 127326, 0, 43778, 119538, 0, 0, + 43781, 11303, 65547, 0, 7031, 0, 0, 67343, 83237, 83267, 0, 67341, 0, + 8535, 0, 0, 0, 66032, 0, 0, 120786, 42233, 0, 9946, 7667, 0, 11822, 0, + 43189, 120673, 100507, 2979, 1579, 0, 0, 0, 0, 0, 12635, 0, 0, 94055, 0, + 1285, 64882, 0, 0, 83113, 12640, 83112, 7401, 0, 12625, 0, 71296, 72744, + 0, 74286, 55260, 3396, 12642, 0, 110719, 0, 12630, 0, 0, 10153, 0, 6166, 120516, 0, 110680, 0, 0, 0, 9285, 913, 42259, 83017, 0, 2142, 0, 0, 94012, 7878, 0, 72733, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128918, 5263, 74782, 0, 41939, 43702, 0, 917856, 0, 10139, 980, 43698, 0, 2208, 0, 43701, 0, @@ -23337,195 +23973,196 @@ static unsigned int code_hash[] = { 0, 0, 12204, 92436, 0, 0, 0, 0, 0, 0, 0, 70311, 0, 0, 128012, 41063, 0, 10664, 0, 0, 0, 4551, 129090, 74759, 0, 0, 0, 0, 72806, 0, 0, 12517, 7806, 0, 12034, 0, 6355, 12519, 41004, 0, 0, 93849, 0, 71707, 0, 121231, - 7332, 129075, 12111, 3927, 0, 12515, 1474, 121361, 0, 6923, 0, 0, 127802, - 0, 43990, 74639, 0, 121007, 0, 92706, 0, 0, 0, 0, 0, 9645, 0, 121026, - 5853, 0, 10363, 120729, 12956, 0, 0, 0, 0, 127888, 0, 0, 0, 0, 0, 10514, - 65517, 0, 0, 71101, 0, 0, 0, 43570, 2969, 43420, 0, 0, 0, 92366, 70809, - 0, 0, 0, 0, 0, 0, 12125, 41124, 0, 1164, 128817, 0, 120466, 0, 0, 65014, - 66009, 74451, 128760, 983128, 7469, 0, 0, 0, 69988, 120671, 83171, 41123, - 11176, 0, 0, 41126, 9991, 41128, 0, 0, 0, 0, 0, 42877, 7994, 0, 6104, - 983612, 0, 0, 0, 0, 0, 0, 74438, 128272, 121409, 41981, 0, 0, 42904, 0, - 0, 74435, 126640, 0, 0, 0, 127968, 92442, 12703, 9661, 67360, 67359, - 7455, 70732, 11473, 119217, 128512, 0, 92323, 0, 0, 129632, 67358, 0, 0, - 0, 0, 174, 121131, 883, 4161, 128033, 42603, 0, 0, 72256, 0, 0, 128356, - 0, 0, 0, 0, 3846, 8070, 6150, 128109, 4370, 0, 0, 0, 74587, 0, 0, 0, 0, - 4986, 12189, 917553, 67648, 120499, 0, 4257, 71695, 0, 6220, 0, 65561, 0, - 0, 0, 0, 0, 0, 0, 0, 69684, 0, 0, 128452, 120873, 0, 0, 74922, 0, 71897, - 0, 0, 67368, 67367, 8871, 67366, 0, 0, 0, 0, 0, 67361, 0, 0, 67365, - 67364, 3427, 4240, 67376, 67375, 67374, 67373, 0, 0, 0, 67377, 0, 71689, - 0, 0, 67372, 67371, 67370, 67369, 0, 0, 0, 124962, 0, 0, 0, 0, 65898, 0, - 65312, 0, 0, 0, 0, 4010, 121208, 41106, 0, 0, 0, 41105, 0, 64803, 83456, - 0, 0, 0, 0, 0, 0, 0, 11008, 0, 0, 71351, 41110, 71681, 64892, 9113, 1954, - 41108, 0, 42878, 0, 67405, 0, 0, 0, 0, 0, 119539, 69435, 73463, 0, 4586, - 129342, 0, 0, 0, 0, 0, 125233, 92307, 0, 0, 0, 67382, 0, 9500, 0, 4957, - 0, 2422, 2212, 0, 67381, 67380, 11045, 67378, 0, 0, 3890, 12168, 121328, - 0, 0, 0, 41947, 0, 120828, 74946, 917901, 0, 1571, 66461, 41949, 42805, - 8270, 943, 41946, 0, 2073, 0, 41980, 0, 0, 0, 0, 4429, 6272, 0, 1460, - 6954, 128572, 41120, 0, 65733, 0, 41119, 0, 127006, 0, 0, 0, 129168, - 12895, 0, 0, 0, 69440, 0, 1985, 6296, 0, 0, 0, 0, 0, 41122, 0, 2457, 0, - 0, 0, 0, 0, 0, 8840, 8035, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8681, 0, 121505, - 128747, 0, 0, 70102, 0, 124976, 9605, 0, 13220, 0, 67354, 11312, 0, 9246, - 67349, 0, 0, 0, 0, 10012, 12123, 0, 0, 0, 0, 0, 0, 0, 0, 67817, 0, 1272, - 0, 0, 0, 983582, 0, 1467, 0, 917806, 0, 0, 0, 70312, 0, 124955, 0, 70400, - 0, 0, 72817, 0, 19935, 0, 92162, 0, 0, 0, 128406, 5275, 0, 0, 44006, - 129082, 0, 3789, 128205, 0, 0, 0, 11474, 0, 0, 0, 129050, 0, 92194, - 129503, 9537, 4496, 0, 120443, 2605, 4500, 0, 55224, 8600, 0, 0, 41646, - 11667, 0, 0, 0, 917905, 4499, 41649, 0, 0, 0, 0, 0, 0, 0, 65804, 0, - 70034, 41866, 0, 0, 0, 11174, 0, 0, 0, 9559, 128773, 41940, 8299, 41945, - 0, 41941, 5455, 7190, 0, 0, 917810, 65266, 0, 41943, 10762, 0, 41931, 0, - 0, 8106, 4128, 0, 0, 4494, 0, 0, 72405, 0, 119567, 42068, 917808, 0, - 11004, 12794, 65072, 5271, 7317, 0, 0, 0, 0, 0, 0, 92281, 0, 0, 0, 0, - 71880, 3868, 71881, 983569, 128431, 7703, 0, 64390, 0, 7406, 0, 93850, 0, - 3985, 66425, 0, 66615, 10177, 0, 41853, 71873, 12809, 0, 12193, 0, 10879, - 0, 0, 9055, 0, 3851, 8132, 0, 0, 119263, 0, 0, 0, 0, 0, 0, 42657, 0, - 7643, 0, 0, 0, 43568, 0, 11949, 7650, 43569, 64951, 7647, 7649, 0, 7646, - 0, 0, 9651, 125005, 3891, 0, 0, 2337, 77831, 77832, 67860, 129288, 0, 0, - 43561, 67706, 119669, 0, 1860, 0, 68835, 5812, 12784, 0, 0, 0, 0, 0, - 7727, 0, 0, 69818, 66444, 128665, 42719, 0, 1569, 0, 12534, 12124, 7690, - 194871, 12533, 0, 68383, 67997, 0, 6969, 0, 0, 0, 67974, 63895, 128650, - 0, 0, 0, 42144, 0, 0, 0, 0, 92211, 119043, 0, 0, 917545, 0, 0, 12791, 0, - 0, 0, 4447, 71065, 12793, 0, 0, 43385, 0, 0, 12790, 120256, 0, 983821, - 12792, 120254, 0, 0, 12789, 128489, 12317, 74934, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 127840, 41652, 2974, 78689, 11476, 0, 0, 0, 0, 43871, 0, 10894, - 119176, 74557, 65686, 0, 0, 6002, 67335, 67334, 67333, 67338, 67337, 0, - 67336, 0, 65306, 0, 128421, 0, 8646, 983831, 77829, 0, 0, 74852, 0, 0, 0, - 0, 0, 220, 120252, 43551, 0, 10044, 0, 0, 983828, 68659, 110825, 5707, - 71362, 0, 0, 0, 0, 0, 0, 10297, 0, 41308, 67331, 0, 0, 0, 0, 2467, 0, - 6003, 0, 0, 8040, 0, 0, 4182, 0, 11135, 120501, 0, 0, 2510, 0, 10208, 0, - 78302, 70829, 0, 0, 6837, 0, 0, 67348, 0, 0, 0, 0, 1559, 67342, 11104, - 67340, 67347, 67346, 67345, 67344, 0, 0, 67357, 67356, 0, 0, 0, 0, 67352, - 67351, 5516, 2845, 7717, 8036, 65161, 67353, 5514, 12045, 6278, 0, 5515, - 0, 0, 0, 0, 0, 65194, 100387, 5517, 70116, 92774, 0, 67884, 0, 67890, - 42094, 67880, 67881, 67882, 67883, 0, 0, 67879, 120411, 1902, 67887, - 67888, 12976, 126546, 12483, 12368, 41769, 42726, 41765, 0, 12787, 67874, - 7556, 67878, 74351, 67897, 989, 42677, 67889, 0, 6060, 0, 4326, 11000, - 64601, 68478, 0, 0, 6917, 0, 120837, 0, 0, 0, 6148, 8605, 74205, 0, 0, 0, - 42715, 0, 101047, 0, 68663, 0, 41796, 1269, 42703, 64754, 101049, 101042, - 5144, 12221, 42716, 71048, 5133, 4331, 0, 128675, 0, 5279, 121362, 71046, - 0, 0, 42701, 0, 0, 0, 121470, 0, 0, 0, 0, 0, 983608, 121259, 42666, - 12207, 1067, 255, 12131, 0, 0, 0, 0, 0, 0, 0, 70728, 43460, 0, 42723, - 125216, 0, 70427, 0, 12797, 0, 0, 983703, 0, 67977, 12799, 0, 92504, - 9746, 5135, 0, 12796, 0, 0, 0, 5139, 346, 74303, 121134, 12795, 125109, - 5168, 0, 43845, 983708, 0, 8253, 8817, 1136, 983716, 43563, 127774, 0, 0, - 0, 0, 0, 0, 0, 983619, 0, 0, 4041, 0, 2357, 43240, 12786, 0, 0, 0, 44004, - 7142, 0, 67984, 0, 0, 0, 0, 12785, 0, 0, 7770, 10712, 64853, 42679, - 118916, 42375, 0, 983123, 94074, 12119, 0, 11059, 10791, 0, 450, 0, 0, 0, - 0, 5450, 64691, 0, 0, 44009, 0, 0, 111097, 0, 1839, 94004, 0, 10927, - 1701, 0, 0, 41749, 41761, 5453, 8361, 66045, 41758, 5444, 41763, 0, 0, 0, - 66349, 983137, 121274, 0, 0, 8801, 0, 4340, 0, 0, 0, 0, 70001, 41824, 0, - 0, 0, 0, 42700, 0, 127980, 0, 0, 0, 0, 0, 0, 4493, 4336, 129171, 2314, - 983061, 41808, 0, 0, 0, 64638, 0, 65937, 4489, 71331, 0, 0, 5358, 42717, - 0, 71236, 0, 0, 0, 127042, 41813, 2712, 0, 127044, 1410, 0, 0, 0, 0, 0, - 0, 0, 0, 128587, 0, 0, 0, 4892, 0, 0, 0, 0, 0, 5777, 0, 759, 0, 2079, - 65248, 12788, 0, 64552, 0, 41803, 68043, 0, 0, 0, 0, 0, 0, 68492, 67991, - 75071, 2340, 0, 120638, 0, 983883, 0, 0, 0, 64749, 0, 2321, 3587, 0, - 67236, 9953, 9952, 0, 0, 42714, 9951, 0, 0, 127902, 74150, 0, 0, 74757, - 127554, 0, 983807, 2395, 0, 9976, 0, 125128, 0, 0, 0, 42809, 42807, 0, - 66290, 70854, 4150, 64424, 8318, 41790, 67976, 65559, 2360, 41794, 0, 0, - 120987, 0, 0, 2418, 0, 2411, 0, 41783, 0, 41786, 65108, 0, 0, 41772, - 42813, 2317, 0, 118980, 0, 0, 0, 0, 0, 0, 78682, 7753, 2351, 6655, 64489, - 0, 0, 0, 4443, 41697, 230, 65793, 0, 65943, 42803, 0, 0, 5441, 0, 0, - 127053, 0, 855, 0, 6109, 101021, 0, 119116, 69989, 0, 0, 0, 0, 101023, 0, - 77845, 0, 19915, 41892, 0, 0, 128901, 41887, 0, 67980, 9735, 0, 0, - 120591, 13082, 0, 0, 0, 0, 0, 0, 0, 0, 289, 0, 0, 64504, 0, 126130, - 120514, 0, 92962, 0, 42724, 69977, 0, 0, 0, 0, 67994, 0, 0, 0, 3565, 0, - 0, 127553, 43035, 69898, 0, 0, 0, 0, 4891, 0, 0, 4602, 0, 121065, 0, 0, - 121157, 0, 43978, 8988, 0, 0, 0, 0, 0, 119184, 121436, 73902, 69740, 0, - 0, 72976, 0, 0, 8771, 0, 0, 0, 119209, 74974, 71737, 0, 0, 67987, 0, 0, - 0, 67989, 0, 10065, 8207, 0, 983578, 0, 0, 662, 0, 41927, 0, 0, 0, 0, 0, - 0, 0, 41929, 0, 0, 0, 41926, 69994, 0, 0, 0, 0, 68013, 1433, 64648, 6475, - 0, 120983, 0, 73876, 0, 0, 0, 67992, 78052, 0, 3978, 0, 0, 0, 0, 120761, - 12281, 0, 0, 13241, 0, 0, 0, 0, 11765, 42577, 0, 0, 2641, 7192, 0, 0, - 118809, 101015, 0, 101016, 128948, 101013, 6479, 64294, 121194, 0, 0, 0, - 64334, 0, 0, 0, 92266, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9478, 127339, - 124964, 0, 202, 0, 0, 1242, 0, 121170, 0, 63940, 0, 0, 0, 63939, 11990, - 92430, 67982, 0, 65440, 70068, 0, 0, 64829, 0, 0, 0, 0, 0, 2858, 0, - 63989, 0, 69239, 0, 121152, 0, 77841, 0, 70078, 92574, 129519, 0, 0, 0, - 128974, 0, 12922, 92498, 0, 66424, 71124, 0, 0, 0, 2856, 0, 47, 0, - 126986, 65858, 0, 0, 0, 0, 0, 8417, 65903, 0, 0, 0, 4033, 128164, 0, 0, - 0, 0, 64600, 1903, 12320, 0, 120894, 0, 0, 8915, 0, 945, 0, 0, 0, 0, - 111068, 0, 74828, 0, 0, 9531, 0, 8505, 0, 119238, 0, 0, 65538, 0, 0, 0, - 0, 0, 0, 63935, 0, 0, 0, 0, 0, 64787, 111060, 0, 0, 110828, 0, 2230, 0, - 0, 71886, 9843, 0, 92419, 111062, 129337, 92715, 0, 1320, 0, 1673, 0, - 92383, 0, 9338, 128355, 0, 0, 0, 0, 11997, 0, 0, 0, 0, 0, 0, 43308, 0, 0, - 0, 0, 0, 0, 0, 63920, 0, 0, 0, 0, 0, 0, 3514, 78723, 0, 7492, 0, 0, 0, - 7514, 0, 63924, 0, 7502, 7587, 0, 0, 0, 0, 0, 7610, 0, 0, 120759, 692, - 43588, 0, 0, 75056, 9688, 0, 9535, 0, 0, 0, 64530, 0, 125251, 194861, 0, - 72209, 7453, 0, 8013, 66396, 0, 0, 8895, 5356, 0, 5458, 0, 2866, 0, - 127860, 71732, 71724, 6700, 0, 111081, 120583, 0, 110614, 0, 9641, 63830, - 65294, 0, 0, 67969, 0, 7441, 0, 63826, 0, 0, 0, 0, 2844, 983953, 0, - 63824, 12139, 67971, 0, 0, 3358, 65295, 0, 3104, 0, 0, 0, 0, 65772, 0, 0, - 0, 0, 2862, 11326, 0, 0, 94001, 3268, 66591, 0, 6552, 42367, 7035, - 120558, 0, 0, 1814, 195092, 10240, 195093, 0, 0, 0, 0, 0, 71454, 0, 0, - 2837, 4341, 0, 0, 0, 125064, 0, 0, 0, 0, 0, 72721, 863, 129125, 0, 0, - 43323, 0, 0, 0, 68054, 0, 3654, 0, 0, 0, 0, 0, 7653, 0, 0, 66587, 0, 0, - 92401, 0, 0, 12927, 0, 0, 0, 13056, 0, 0, 3056, 0, 0, 195101, 0, 0, - 74506, 73770, 0, 0, 0, 0, 0, 0, 0, 0, 983681, 0, 5811, 0, 0, 0, 66817, - 983836, 0, 0, 128636, 129311, 0, 128041, 0, 67739, 120965, 0, 0, 0, 0, - 68375, 0, 0, 70300, 0, 0, 0, 983679, 111078, 0, 11991, 128079, 0, 92943, - 1502, 74117, 127988, 0, 195083, 121253, 0, 67661, 0, 0, 125084, 120758, - 0, 74057, 68639, 0, 42898, 120742, 0, 74388, 74838, 120822, 0, 0, 0, 0, - 69452, 43214, 5893, 0, 0, 92496, 0, 0, 119907, 119900, 0, 0, 0, 0, 41950, - 0, 0, 68610, 0, 68626, 894, 0, 0, 12306, 73846, 0, 0, 0, 8636, 0, 121028, - 42503, 0, 92942, 0, 121468, 119241, 0, 126569, 5096, 5095, 2863, 127505, - 0, 10454, 42530, 5094, 0, 0, 13156, 0, 111035, 5093, 127178, 983414, 0, - 5092, 10708, 11327, 0, 5091, 0, 0, 9153, 4104, 78599, 78601, 2929, 42712, - 75067, 12272, 9832, 0, 0, 111105, 0, 0, 0, 0, 0, 0, 13106, 0, 0, 129111, - 0, 0, 0, 0, 9074, 111111, 0, 111110, 0, 8113, 11168, 92563, 1786, 111109, - 0, 111108, 0, 74423, 0, 586, 74414, 64359, 1267, 0, 127531, 0, 65731, 0, - 0, 0, 92932, 0, 0, 0, 0, 0, 0, 1228, 0, 42846, 0, 0, 70343, 1714, 74406, - 0, 0, 0, 127389, 66225, 0, 0, 42660, 0, 0, 3804, 0, 0, 0, 0, 2826, 0, 0, - 0, 128396, 0, 0, 0, 0, 0, 0, 12206, 5839, 0, 68524, 74065, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67241, 917821, 7030, 0, 10479, 64959, 2852, - 0, 121225, 0, 0, 128586, 0, 6963, 0, 0, 0, 74786, 0, 0, 0, 0, 121281, 0, - 0, 0, 0, 113815, 121360, 0, 9994, 0, 2864, 64719, 1148, 0, 41677, 0, 0, - 2765, 0, 128181, 0, 0, 0, 92516, 74777, 0, 0, 65206, 0, 0, 0, 0, 69391, - 0, 0, 983751, 0, 41839, 0, 983754, 0, 0, 6931, 0, 0, 7177, 125137, 0, 0, - 0, 93020, 0, 10722, 0, 0, 128186, 121050, 0, 0, 127207, 0, 750, 0, 0, - 63912, 0, 0, 7032, 0, 0, 4314, 128600, 0, 128409, 730, 0, 127866, 0, 0, - 41380, 0, 0, 0, 69697, 8240, 92939, 0, 41378, 0, 6938, 70026, 0, 0, - 66246, 0, 0, 0, 0, 0, 0, 983094, 0, 92754, 41470, 64805, 0, 0, 0, 0, 0, - 0, 0, 0, 92938, 68370, 0, 0, 73831, 0, 0, 0, 2872, 0, 0, 0, 0, 604, - 41097, 0, 0, 0, 0, 0, 127488, 0, 2836, 0, 0, 9707, 0, 43202, 0, 0, 0, 0, - 0, 120916, 2832, 92702, 9670, 12937, 0, 0, 0, 0, 2822, 0, 0, 92519, 0, - 73752, 0, 0, 0, 1331, 92603, 0, 0, 0, 129432, 5090, 5089, 0, 3200, 0, 0, - 0, 5088, 0, 0, 9477, 0, 0, 5087, 92325, 0, 96, 5086, 0, 0, 0, 5085, - 64286, 0, 0, 43820, 0, 983722, 0, 0, 119042, 0, 0, 0, 0, 0, 0, 0, 127241, - 120891, 7601, 0, 591, 0, 118953, 0, 0, 0, 0, 0, 10939, 7246, 6933, 67142, - 67141, 0, 74600, 120695, 0, 67138, 65574, 0, 78058, 67140, 73851, 74598, - 67139, 128094, 0, 6372, 0, 0, 7963, 6371, 0, 0, 125040, 0, 0, 0, 0, 0, 0, - 0, 8258, 0, 0, 0, 65148, 118919, 42, 0, 0, 0, 0, 0, 0, 0, 0, 67135, - 67134, 67133, 0, 0, 0, 0, 67136, 67130, 74597, 11550, 0, 67132, 65868, 0, - 12826, 127872, 0, 0, 9737, 92448, 0, 0, 0, 8878, 0, 0, 0, 0, 0, 72220, - 9086, 0, 0, 0, 7437, 7454, 0, 0, 0, 0, 9042, 0, 0, 0, 0, 3805, 0, 67128, - 44001, 67126, 0, 44022, 19949, 12200, 43522, 983045, 43525, 0, 0, 0, - 64422, 67125, 67124, 7602, 0, 0, 43521, 0, 0, 43711, 43523, 41447, 8424, - 68483, 8704, 2397, 0, 0, 0, 0, 0, 10916, 0, 129290, 93998, 0, 0, 0, - 127800, 67686, 9961, 0, 0, 68842, 10792, 8889, 121402, 6951, 0, 68827, - 917835, 74342, 0, 0, 0, 68816, 129152, 0, 42909, 66597, 70092, 0, 0, - 10481, 4559, 0, 1956, 43138, 0, 0, 43490, 43148, 0, 0, 0, 43140, 0, 0, 0, - 0, 73013, 8533, 0, 0, 0, 0, 0, 4357, 0, 70289, 983156, 0, 42911, 0, 0, 0, - 10941, 0, 6962, 0, 0, 113808, 0, 11014, 0, 8942, 12000, 0, 0, 0, 0, 0, 0, - 42650, 0, 75016, 63975, 0, 66210, 0, 0, 129150, 0, 11193, 0, 0, 0, 0, 0, - 0, 0, 43476, 0, 11024, 74811, 72787, 10563, 92954, 0, 0, 2462, 92955, 0, - 0, 66213, 6957, 0, 120559, 0, 0, 0, 74594, 983419, 92347, 0, 110702, - 110708, 110707, 127119, 3109, 127117, 119909, 0, 121434, 0, 0, 4042, 0, - 0, 0, 127123, 127122, 127121, 0, 127999, 0, 3503, 74444, 68300, 6694, - 127997, 0, 0, 74306, 0, 0, 7736, 0, 0, 0, 10521, 0, 42173, 9705, 0, 0, - 6955, 71467, 0, 6149, 3887, 19956, 1411, 2824, 0, 0, 0, 1403, 0, 1347, - 66282, 127996, 0, 0, 0, 0, 8640, 0, 1178, 1654, 0, 0, 129529, 43314, 0, - 0, 0, 0, 2873, 0, 0, 0, 67085, 10861, 0, 0, 70377, 0, 67082, 67081, - 41391, 67084, 0, 376, 6987, 983181, 119904, 0, 8823, 0, 12943, 65185, - 100988, 42099, 0, 0, 100990, 0, 8301, 0, 0, 1684, 0, 0, 0, 120620, 0, 0, - 0, 42121, 0, 66781, 78067, 42115, 0, 127998, 0, 67080, 1493, 42111, - 67077, 4097, 0, 983748, 0, 65808, 41642, 0, 0, 67076, 41636, 67074, - 65095, 110660, 72254, 121240, 41629, 12154, 75073, 0, 128179, 0, 64380, - 0, 0, 0, 0, 0, 71193, 65371, 7078, 0, 0, 0, 74592, 0, 0, 43275, 0, 41434, - 6062, 0, 0, 19916, 0, 6950, 9606, 9842, 0, 65744, 0, 0, 128659, 0, 41615, - 10105, 0, 0, 41632, 7493, 0, 0, 41622, 0, 0, 0, 0, 7632, 983215, 983214, - 9805, 5990, 900, 0, 0, 0, 0, 3612, 0, 64376, 0, 5389, 0, 0, 0, 2839, - 9621, 582, 0, 0, 3749, 0, 7569, 0, 0, 129472, 6956, 4403, 0, 0, 3299, 0, - 0, 119127, 65676, 0, 74373, 0, 983492, 7598, 69819, 42469, 42242, 1918, + 7332, 129075, 12111, 3927, 0, 12515, 1474, 68768, 0, 6923, 0, 0, 127802, + 0, 43990, 74639, 126229, 121007, 0, 92706, 0, 0, 0, 0, 0, 9645, 0, + 121026, 5853, 0, 10363, 120729, 12956, 0, 0, 0, 0, 127888, 0, 0, 0, 0, 0, + 10514, 65517, 0, 0, 71101, 0, 0, 0, 43570, 2969, 43420, 0, 0, 0, 92366, + 70809, 0, 0, 0, 0, 0, 0, 12125, 41124, 0, 1164, 128817, 0, 120466, 0, 0, + 65014, 66009, 74451, 128760, 983128, 7469, 0, 0, 0, 69988, 120671, 83171, + 41123, 11176, 0, 0, 41126, 9991, 41128, 0, 0, 110949, 0, 0, 42877, 7994, + 0, 6104, 983612, 0, 0, 0, 0, 0, 0, 74438, 128272, 121409, 41981, 0, 0, + 42904, 0, 0, 74435, 126640, 0, 0, 0, 127968, 92442, 12703, 9661, 67360, + 67359, 7455, 70732, 11473, 119217, 128512, 0, 92323, 0, 0, 129632, 67358, + 0, 0, 0, 0, 174, 121131, 883, 4161, 128033, 42603, 0, 0, 72256, 0, 0, + 128356, 0, 0, 0, 0, 3846, 8070, 6150, 128109, 4370, 0, 0, 0, 74587, 0, 0, + 0, 0, 4986, 12189, 917553, 67648, 120499, 0, 4257, 71695, 123620, 6220, + 0, 65561, 0, 0, 0, 0, 0, 0, 0, 0, 69684, 0, 0, 128452, 120873, 0, 0, + 74922, 0, 71897, 0, 0, 67368, 67367, 8871, 67366, 0, 0, 0, 0, 0, 67361, + 0, 0, 67365, 67364, 3427, 4240, 67376, 67375, 67374, 67373, 0, 0, 0, + 67377, 0, 71689, 0, 0, 67372, 67371, 67370, 67369, 0, 0, 0, 124962, 0, 0, + 0, 0, 65898, 0, 65312, 0, 0, 0, 0, 4010, 121208, 41106, 0, 0, 0, 41105, + 0, 64803, 83456, 0, 0, 0, 0, 0, 0, 0, 11008, 0, 0, 71351, 41110, 71681, + 64892, 9113, 1954, 41108, 0, 42878, 0, 67405, 0, 0, 0, 0, 0, 119539, + 69435, 73463, 0, 4586, 129342, 0, 0, 0, 0, 0, 125233, 92307, 0, 0, 0, + 67382, 0, 9500, 0, 4957, 0, 2422, 2212, 0, 67381, 67380, 11045, 67378, 0, + 0, 3890, 12168, 121328, 0, 0, 0, 41947, 0, 120828, 74946, 917901, 0, + 1571, 66461, 41949, 42805, 8270, 943, 41946, 0, 2073, 0, 41980, 0, 0, 0, + 0, 4429, 6272, 0, 1460, 6954, 128572, 41120, 0, 65733, 0, 41119, 0, + 127006, 0, 0, 0, 129168, 12895, 0, 0, 0, 69440, 0, 1985, 6296, 0, 0, 0, + 0, 0, 41122, 0, 2457, 0, 0, 0, 0, 0, 0, 8840, 8035, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8681, 0, 121505, 128747, 0, 0, 70102, 0, 124976, 9605, 0, 13220, + 0, 67354, 11312, 0, 9246, 67349, 0, 0, 0, 0, 10012, 12123, 0, 0, 0, 0, 0, + 0, 0, 0, 67817, 0, 1272, 0, 0, 0, 983582, 0, 1467, 0, 917806, 0, 0, 0, + 70312, 0, 124955, 0, 70400, 0, 0, 72817, 0, 19935, 0, 92162, 0, 0, 0, + 128406, 5275, 0, 0, 44006, 129082, 0, 3789, 128205, 0, 0, 0, 11474, 0, 0, + 0, 129050, 0, 92194, 129503, 9537, 4496, 0, 120443, 2605, 4500, 0, 55224, + 8600, 0, 0, 41646, 11667, 0, 0, 0, 917905, 4499, 41649, 0, 0, 0, 0, 0, 0, + 0, 65804, 0, 70034, 41866, 0, 0, 0, 11174, 0, 0, 0, 9559, 128773, 41940, + 8299, 41945, 0, 41941, 5455, 7190, 0, 0, 917810, 65266, 0, 41943, 10762, + 0, 41931, 0, 0, 8106, 4128, 0, 0, 4494, 0, 0, 72405, 0, 119567, 42068, + 917808, 0, 11004, 12794, 65072, 5271, 7317, 0, 0, 0, 0, 0, 0, 92281, 0, + 0, 0, 0, 71880, 3868, 71881, 983569, 128431, 7703, 0, 64390, 0, 7406, 0, + 93850, 0, 3985, 66425, 0, 66615, 10177, 0, 41853, 71873, 12809, 0, 12193, + 0, 10879, 0, 0, 9055, 0, 3851, 8132, 0, 0, 119263, 917908, 0, 0, 0, 0, 0, + 42657, 0, 7643, 0, 0, 0, 43568, 0, 11949, 7650, 43569, 64951, 7647, 7649, + 0, 7646, 0, 0, 9651, 125005, 3891, 0, 0, 2337, 77831, 77832, 67860, + 129288, 0, 0, 43561, 67706, 119669, 0, 1860, 0, 68835, 5812, 12784, 0, 0, + 0, 0, 0, 7727, 0, 0, 69818, 66444, 128665, 42719, 0, 1569, 0, 12534, + 12124, 7690, 194871, 12533, 0, 68383, 67997, 0, 6969, 0, 0, 0, 67974, + 63895, 128650, 0, 0, 0, 42144, 0, 0, 0, 0, 92211, 119043, 0, 0, 917545, + 0, 0, 12791, 0, 0, 0, 4447, 71065, 12793, 0, 0, 43385, 0, 0, 12790, + 120256, 0, 983821, 12792, 120254, 0, 0, 12789, 128489, 12317, 74934, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 127840, 41652, 2974, 78689, 11476, 0, 0, 0, 0, + 43871, 0, 10894, 119176, 74557, 65686, 0, 0, 3724, 67335, 67334, 67333, + 67338, 67337, 0, 67336, 0, 65306, 0, 128421, 0, 8646, 129593, 77829, 0, + 0, 74852, 0, 0, 0, 0, 0, 220, 120252, 43551, 0, 10044, 0, 0, 983828, + 68659, 110825, 5707, 71362, 0, 0, 0, 0, 0, 0, 10297, 0, 41308, 67331, 0, + 0, 0, 0, 2467, 0, 6003, 0, 0, 8040, 0, 0, 4182, 0, 11135, 120501, 0, 0, + 2510, 0, 10208, 0, 78302, 70829, 0, 0, 6837, 0, 0, 67348, 0, 0, 0, 0, + 1559, 67342, 11104, 67340, 67347, 67346, 67345, 67344, 0, 0, 67357, + 67356, 0, 0, 0, 0, 67352, 67351, 5516, 2845, 7717, 8036, 65161, 67353, + 5514, 12045, 6278, 0, 5515, 0, 0, 0, 0, 0, 65194, 100387, 5517, 70116, + 92774, 0, 67884, 0, 67890, 42094, 67880, 67881, 67882, 67883, 0, 0, + 67879, 120411, 1902, 67887, 67888, 12976, 126546, 12483, 12368, 41769, + 42726, 41765, 0, 12787, 67874, 7556, 67878, 74351, 67897, 989, 42677, + 67889, 0, 6060, 0, 4326, 11000, 64601, 68478, 0, 0, 6917, 0, 120837, 0, + 0, 0, 6148, 8605, 74205, 0, 0, 0, 42715, 0, 101047, 0, 68663, 0, 41796, + 1269, 42703, 64754, 101049, 101042, 5144, 12221, 42716, 71048, 5133, + 4331, 0, 128675, 0, 5279, 121362, 71046, 0, 0, 42701, 0, 0, 0, 121470, 0, + 0, 0, 0, 0, 983608, 121259, 42666, 12207, 1067, 255, 12131, 0, 0, 0, 0, + 0, 0, 0, 70728, 43460, 0, 42723, 125216, 0, 70427, 0, 12797, 0, 0, + 983703, 0, 67977, 12799, 0, 92504, 9746, 5135, 0, 12796, 0, 0, 0, 5139, + 346, 74303, 121134, 12795, 125109, 5168, 0, 43845, 983708, 0, 8253, 8817, + 1136, 983716, 43563, 127774, 129542, 0, 0, 0, 0, 0, 0, 983619, 0, 0, + 4041, 0, 2357, 43240, 12786, 0, 0, 0, 44004, 7142, 0, 67984, 0, 0, 0, 0, + 12785, 0, 0, 7770, 10712, 64853, 42679, 118916, 42375, 0, 983123, 94074, + 12119, 0, 11059, 10791, 0, 450, 0, 0, 0, 0, 5450, 64691, 0, 0, 44009, 0, + 0, 111097, 94085, 1839, 94004, 0, 10927, 1701, 0, 129610, 41749, 41761, + 5453, 8361, 66045, 41758, 5444, 41763, 0, 0, 0, 66349, 983137, 121274, 0, + 0, 8801, 0, 4340, 0, 0, 0, 0, 70001, 41824, 0, 0, 0, 0, 42700, 0, 127980, + 0, 0, 0, 0, 0, 0, 4493, 4336, 129171, 2314, 983061, 41808, 0, 0, 0, + 64638, 0, 65937, 4489, 71331, 0, 0, 5358, 42717, 0, 71236, 0, 0, 0, + 127042, 41813, 2712, 0, 127044, 1410, 0, 0, 0, 0, 0, 0, 0, 0, 128587, 0, + 0, 0, 4892, 0, 0, 0, 0, 0, 5777, 0, 759, 0, 2079, 65248, 12788, 0, 64552, + 0, 41803, 68043, 0, 0, 0, 0, 128785, 0, 68492, 67991, 75071, 2340, 0, + 120638, 0, 983883, 0, 0, 0, 64749, 0, 2321, 3587, 0, 67236, 9953, 9952, + 0, 0, 42714, 9951, 0, 0, 127902, 74150, 0, 0, 74757, 127554, 0, 983807, + 2395, 0, 9976, 0, 125128, 0, 0, 0, 42809, 42807, 0, 66290, 70854, 4150, + 64424, 8318, 41790, 67976, 65559, 2360, 41794, 0, 0, 120987, 0, 0, 2418, + 0, 2411, 0, 41783, 0, 41786, 65108, 0, 0, 41772, 42813, 2317, 0, 118980, + 0, 0, 0, 0, 0, 0, 78682, 7753, 2351, 6655, 64489, 0, 0, 0, 4443, 41697, + 230, 65793, 0, 65943, 42803, 0, 0, 5441, 0, 0, 127053, 0, 855, 0, 6109, + 101021, 0, 119116, 69989, 0, 0, 72146, 0, 101023, 0, 72148, 0, 19915, + 41892, 0, 0, 128901, 41887, 0, 67980, 9735, 0, 0, 120591, 13082, 0, 0, 0, + 0, 0, 0, 0, 0, 289, 0, 0, 64504, 0, 126130, 120514, 0, 92962, 0, 42724, + 69977, 0, 0, 0, 0, 67994, 0, 0, 0, 3565, 0, 0, 127553, 43035, 69898, 0, + 0, 0, 0, 4891, 0, 0, 4602, 0, 121065, 0, 0, 121157, 0, 43978, 8988, 0, 0, + 0, 0, 0, 119184, 121436, 73902, 69740, 0, 0, 72976, 0, 0, 8771, 0, 0, 0, + 119209, 74974, 71737, 0, 0, 67987, 0, 0, 0, 67989, 0, 10065, 8207, 0, + 983578, 0, 0, 662, 0, 41927, 0, 0, 0, 0, 0, 0, 0, 41929, 0, 0, 0, 41926, + 69994, 0, 0, 0, 126230, 68013, 1433, 64648, 6475, 0, 120983, 0, 73876, 0, + 0, 0, 67992, 78052, 0, 3978, 0, 0, 0, 0, 120761, 12281, 0, 0, 13241, 0, + 0, 0, 0, 11765, 42577, 0, 0, 2641, 7192, 0, 0, 118809, 101015, 0, 101016, + 128948, 101013, 6479, 64294, 121194, 0, 0, 0, 64334, 0, 0, 0, 92266, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9478, 127339, 124964, 0, 202, 0, 0, 1242, 0, + 121170, 0, 63940, 0, 0, 0, 63939, 11990, 92430, 67982, 0, 65440, 70068, + 0, 0, 64829, 0, 0, 0, 0, 0, 2858, 0, 63989, 0, 69239, 0, 121152, 0, + 77841, 0, 70078, 92574, 129519, 0, 0, 0, 128974, 0, 12922, 92498, 0, + 66424, 71124, 0, 0, 0, 2856, 0, 47, 0, 126986, 65858, 0, 0, 0, 0, 0, + 8417, 65903, 0, 0, 0, 4033, 128164, 0, 0, 0, 0, 64600, 1903, 12320, 0, + 120894, 0, 0, 8915, 0, 945, 0, 0, 0, 0, 111068, 0, 74828, 0, 0, 9531, 0, + 8505, 0, 119238, 0, 0, 65538, 0, 0, 0, 0, 0, 0, 63935, 0, 0, 0, 0, 0, + 64787, 111060, 0, 0, 110828, 0, 2230, 0, 0, 71886, 9843, 0, 92419, + 111062, 129337, 92715, 0, 1320, 0, 1673, 0, 92383, 0, 9338, 128355, 0, 0, + 0, 0, 11997, 0, 0, 0, 0, 0, 0, 43308, 0, 0, 0, 0, 0, 0, 0, 63920, 0, 0, + 0, 0, 0, 0, 3514, 78723, 0, 7492, 0, 0, 0, 7514, 0, 63924, 0, 7502, 7587, + 0, 0, 0, 0, 0, 7610, 0, 0, 120759, 692, 43588, 0, 0, 75056, 9688, 0, + 9535, 0, 0, 0, 64530, 0, 125251, 194861, 0, 72209, 7453, 0, 8013, 66396, + 0, 0, 8895, 5356, 0, 5458, 0, 2866, 0, 127860, 71732, 71724, 6700, 0, + 111081, 120583, 0, 110614, 0, 9641, 63830, 65294, 0, 0, 67969, 0, 7441, + 0, 63826, 0, 0, 0, 0, 2844, 983953, 0, 63824, 12139, 67971, 0, 0, 3358, + 65295, 0, 3104, 0, 0, 0, 0, 65772, 0, 0, 0, 0, 2862, 11326, 0, 0, 94001, + 3268, 66591, 0, 6552, 42367, 7035, 120558, 0, 0, 1814, 195092, 10240, + 195093, 0, 0, 0, 0, 0, 71454, 0, 0, 2837, 4341, 0, 0, 0, 125064, 0, 0, 0, + 0, 0, 72721, 863, 129125, 0, 0, 43323, 0, 0, 0, 68054, 0, 3654, 0, 0, 0, + 0, 0, 7653, 0, 0, 66587, 0, 0, 92401, 0, 0, 12927, 0, 0, 0, 13056, 0, 0, + 3056, 0, 0, 195101, 0, 0, 74506, 73770, 0, 0, 0, 0, 0, 0, 0, 0, 983681, + 0, 5811, 0, 0, 0, 66817, 983836, 0, 0, 128636, 129311, 0, 128041, 0, + 67739, 120965, 0, 0, 0, 0, 68375, 0, 0, 70300, 0, 0, 0, 983679, 111078, + 0, 11991, 128079, 0, 92943, 1502, 74117, 127988, 0, 129478, 121253, 0, + 67661, 0, 0, 125084, 120758, 0, 74057, 68639, 0, 42898, 120742, 0, 74388, + 74838, 120822, 0, 0, 0, 0, 69452, 43214, 5893, 0, 0, 92496, 0, 0, 119907, + 119900, 0, 0, 0, 0, 41950, 0, 0, 68610, 0, 68626, 894, 0, 0, 12306, + 73846, 0, 0, 0, 8636, 0, 121028, 42503, 0, 92942, 0, 121468, 119241, 0, + 126569, 5096, 5095, 2863, 127505, 0, 10454, 42530, 5094, 0, 0, 13156, 0, + 111035, 5093, 127178, 983414, 0, 5092, 10708, 11327, 0, 5091, 0, 0, 9153, + 4104, 78599, 78601, 2929, 42712, 75067, 12272, 9832, 0, 0, 111105, 0, 0, + 0, 0, 0, 0, 13106, 0, 0, 129111, 0, 0, 0, 0, 9074, 111111, 0, 111110, 0, + 8113, 11168, 92563, 1786, 111109, 0, 111108, 0, 74423, 0, 586, 74414, + 64359, 1267, 0, 127531, 0, 65731, 0, 0, 0, 92932, 0, 0, 0, 0, 0, 0, 1228, + 0, 42846, 0, 0, 70343, 1714, 74406, 0, 0, 0, 127389, 66225, 0, 0, 42660, + 0, 0, 3804, 0, 0, 0, 0, 2826, 0, 0, 0, 128396, 0, 0, 0, 0, 0, 0, 12206, + 5839, 0, 68524, 74065, 0, 0, 0, 126240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 67241, 917821, 7030, 0, 10479, 64959, 2852, 0, 121225, 0, 0, 128586, 0, + 6963, 0, 0, 0, 74786, 0, 0, 0, 0, 121281, 0, 0, 0, 0, 113815, 121360, 0, + 9994, 0, 2864, 64719, 1148, 0, 41677, 0, 0, 2765, 0, 128181, 0, 0, 0, + 92516, 74777, 0, 0, 65206, 0, 0, 0, 0, 69391, 0, 0, 983751, 0, 41839, + 129616, 983754, 0, 0, 6931, 0, 0, 7177, 125137, 0, 0, 0, 93020, 0, 10722, + 0, 0, 128186, 121050, 0, 0, 127207, 0, 750, 0, 0, 63912, 0, 0, 7032, 0, + 0, 4314, 128600, 0, 128409, 730, 0, 127866, 0, 0, 41380, 0, 0, 0, 69697, + 8240, 92939, 0, 41378, 0, 6938, 70026, 0, 0, 66246, 0, 0, 0, 0, 0, 0, + 983094, 0, 92754, 41470, 64805, 0, 0, 0, 0, 0, 0, 0, 0, 92938, 68370, 0, + 0, 73831, 0, 0, 0, 2872, 0, 0, 0, 0, 604, 41097, 0, 0, 0, 0, 0, 127488, + 0, 2836, 0, 0, 9707, 0, 43202, 0, 0, 0, 0, 0, 120916, 2832, 92702, 9670, + 12937, 0, 0, 0, 0, 2822, 0, 0, 92519, 0, 73752, 0, 0, 0, 1331, 92603, 0, + 0, 0, 129432, 5090, 5089, 0, 3200, 0, 0, 0, 5088, 0, 0, 9477, 0, 0, 5087, + 92325, 0, 96, 5086, 0, 0, 0, 5085, 64286, 0, 0, 43820, 0, 983722, 0, 0, + 119042, 0, 0, 0, 0, 0, 0, 0, 127241, 120891, 7601, 0, 591, 0, 118953, 0, + 0, 0, 0, 0, 10939, 7246, 6933, 67142, 67141, 0, 74600, 120695, 0, 67138, + 65574, 0, 78058, 67140, 73851, 74598, 67139, 128094, 0, 6372, 0, 0, 7963, + 6371, 0, 0, 125040, 0, 0, 0, 0, 0, 0, 0, 8258, 123591, 0, 0, 65148, + 118919, 42, 0, 0, 0, 0, 0, 0, 0, 0, 67135, 67134, 67133, 0, 0, 0, 0, + 67136, 67130, 74597, 11550, 0, 67132, 65868, 0, 12826, 127872, 0, 126235, + 9737, 92448, 0, 0, 0, 8878, 0, 0, 0, 0, 0, 72220, 9086, 0, 0, 0, 7437, + 7454, 0, 0, 0, 0, 9042, 0, 0, 0, 0, 3805, 0, 67128, 44001, 67126, 0, + 44022, 19949, 12200, 43522, 983045, 43525, 0, 0, 0, 64422, 67125, 67124, + 7602, 0, 0, 43521, 0, 0, 43711, 43523, 41447, 8424, 68483, 8704, 2397, 0, + 0, 0, 0, 0, 10916, 0, 129290, 93998, 0, 0, 0, 127800, 67686, 9961, + 123203, 0, 68842, 10792, 8889, 121402, 6951, 0, 68827, 917835, 74342, 0, + 0, 0, 68816, 129152, 0, 42909, 66597, 70092, 0, 0, 10481, 4559, 0, 1956, + 43138, 0, 0, 43490, 43148, 0, 0, 0, 43140, 0, 0, 0, 0, 73013, 8533, 0, 0, + 0, 0, 0, 4357, 0, 70289, 983156, 0, 42911, 0, 0, 0, 10941, 0, 6962, 0, 0, + 113808, 0, 11014, 0, 8942, 12000, 0, 0, 0, 0, 0, 0, 42650, 0, 75016, + 63975, 0, 66210, 0, 0, 129150, 0, 11193, 0, 0, 0, 0, 0, 0, 0, 43476, 0, + 11024, 74811, 72787, 10563, 92954, 0, 0, 2462, 92955, 0, 0, 66213, 6957, + 0, 120559, 0, 0, 0, 74594, 983419, 92347, 0, 110702, 110708, 110707, + 127119, 3109, 127117, 119909, 0, 121434, 0, 0, 4042, 0, 0, 0, 127123, + 127122, 127121, 0, 127999, 0, 3503, 74444, 68300, 6694, 127997, 0, 0, + 74306, 0, 983738, 7736, 0, 0, 0, 10521, 0, 42173, 9705, 0, 0, 6955, + 71467, 0, 6149, 3887, 19956, 1411, 2824, 0, 0, 0, 1403, 0, 1347, 66282, + 127996, 0, 0, 0, 0, 8640, 0, 1178, 1654, 0, 0, 129529, 43314, 0, 0, 0, 0, + 2873, 0, 0, 0, 67085, 10861, 0, 0, 70377, 0, 67082, 67081, 41391, 67084, + 0, 376, 6987, 983181, 119904, 0, 8823, 0, 12943, 65185, 100988, 42099, 0, + 0, 100990, 0, 8301, 0, 0, 1684, 0, 0, 0, 120620, 0, 0, 0, 42121, 0, + 66781, 78067, 42115, 0, 127998, 0, 67080, 1493, 42111, 67077, 4097, 0, + 983748, 0, 65808, 41642, 0, 0, 67076, 41636, 67074, 65095, 110660, 72254, + 121240, 41629, 12154, 75073, 0, 128179, 74084, 64380, 0, 0, 0, 0, 0, + 71193, 65371, 7078, 0, 0, 0, 74592, 0, 0, 43275, 0, 41434, 6062, 0, 0, + 19916, 0, 6950, 9606, 9842, 0, 65744, 0, 0, 128659, 0, 41615, 10105, 0, + 0, 41632, 7493, 0, 0, 41622, 0, 0, 0, 0, 7632, 983215, 983214, 9805, + 5990, 900, 0, 0, 0, 0, 3612, 0, 64376, 0, 5389, 129469, 0, 0, 2839, 9621, + 582, 0, 0, 3749, 0, 7569, 0, 0, 129472, 6956, 4403, 0, 0, 3299, 0, 0, + 119127, 65676, 0, 74373, 0, 983492, 7598, 69819, 42469, 42242, 1918, 9542, 480, 7716, 0, 0, 0, 0, 0, 69918, 0, 8328, 0, 118894, 0, 0, 0, 0, 11132, 0, 66743, 74185, 100531, 2854, 66747, 0, 65755, 0, 67120, 67119, 65835, 67117, 66736, 67123, 67122, 67121, 9881, 100481, 65757, 100538, @@ -23544,51 +24181,52 @@ static unsigned int code_hash[] = { 42512, 0, 78857, 42089, 74613, 78856, 0, 101029, 100468, 42079, 100467, 0, 0, 100474, 0, 0, 0, 68338, 69958, 0, 0, 0, 0, 0, 78859, 42093, 128951, 100504, 0, 0, 0, 4580, 0, 0, 0, 92167, 0, 3021, 42004, 0, 0, 42317, - 41998, 0, 6946, 77920, 0, 0, 0, 0, 0, 121442, 42690, 9880, 0, 0, 64589, - 0, 0, 127880, 68035, 0, 11360, 0, 0, 72242, 0, 0, 0, 0, 0, 64941, 0, 0, - 0, 0, 65671, 11244, 0, 6959, 41994, 42907, 0, 0, 122902, 8617, 41982, - 8860, 0, 0, 0, 0, 0, 9597, 0, 43172, 0, 10117, 0, 92297, 65865, 0, 0, - 128077, 0, 126065, 0, 187, 0, 65669, 0, 4963, 0, 0, 0, 8964, 0, 7775, 0, - 41948, 0, 0, 101010, 41942, 65449, 3160, 65922, 13226, 42665, 0, 42663, - 128210, 41766, 0, 78848, 78849, 41760, 1189, 905, 110620, 42658, 78851, - 67859, 9629, 6742, 0, 43625, 12952, 7888, 0, 3980, 0, 42656, 0, 42055, 0, - 0, 0, 64540, 0, 7867, 69218, 6236, 0, 0, 10505, 0, 12851, 118948, 0, - 5474, 128843, 3103, 0, 41753, 41733, 78051, 983472, 78844, 78845, 41739, - 78843, 70744, 10931, 41756, 43347, 68098, 122909, 41746, 119147, 92591, - 41259, 917848, 69930, 2691, 121338, 11231, 41244, 0, 69800, 66364, 41262, - 0, 0, 0, 41251, 0, 0, 11805, 0, 0, 68331, 94045, 0, 0, 0, 74633, 41266, - 126642, 0, 0, 0, 65741, 41737, 2275, 2666, 121232, 41738, 4967, 419, - 13126, 0, 0, 42822, 0, 6434, 74913, 0, 0, 6432, 0, 69932, 128862, 769, - 41742, 69927, 74805, 6433, 0, 547, 1943, 6439, 0, 4994, 487, 0, 0, 3754, - 0, 0, 0, 0, 74780, 0, 0, 1595, 92777, 74431, 0, 0, 74860, 43267, 0, 0, - 129083, 12185, 69406, 0, 0, 100984, 0, 42856, 0, 0, 983746, 128319, - 75057, 0, 0, 0, 65612, 0, 669, 0, 0, 0, 0, 0, 70445, 100404, 69929, 0, 0, - 460, 121513, 0, 0, 0, 120747, 0, 121519, 121518, 0, 0, 121515, 121514, - 65187, 9044, 78497, 11760, 78494, 7577, 78491, 41912, 100412, 0, 100411, - 0, 0, 100394, 78501, 0, 2933, 78500, 0, 66441, 100392, 100397, 100391, - 1549, 0, 100415, 0, 41755, 6206, 8670, 120587, 0, 69935, 0, 0, 69768, - 100952, 0, 0, 0, 0, 10552, 64342, 41922, 0, 917858, 0, 917857, 2717, 0, - 0, 0, 0, 41908, 100722, 41916, 0, 0, 0, 92506, 100723, 66664, 69803, 0, - 100725, 0, 0, 43373, 0, 0, 8468, 100729, 121173, 128297, 119210, 118952, - 0, 0, 0, 100686, 0, 0, 0, 128703, 100670, 457, 78502, 78503, 0, 43006, 0, - 8802, 113777, 0, 0, 0, 0, 126632, 0, 41757, 0, 100657, 44000, 0, 0, - 43534, 0, 0, 11961, 121316, 0, 0, 0, 128736, 0, 0, 9499, 100695, 128330, - 0, 0, 92260, 68184, 0, 0, 7256, 983401, 983179, 0, 42161, 0, 119126, - 128022, 65880, 0, 10802, 64861, 0, 0, 0, 0, 0, 0, 73109, 0, 955, 0, 0, - 5350, 64339, 0, 100705, 10875, 0, 5477, 73121, 0, 0, 0, 67693, 69790, 0, - 0, 3874, 0, 0, 0, 0, 83272, 100674, 127397, 0, 100989, 0, 41038, 0, 9207, - 42239, 0, 0, 0, 0, 74432, 0, 0, 1455, 0, 0, 11753, 119233, 0, 0, 127854, - 100716, 69801, 0, 0, 43520, 0, 119556, 0, 0, 0, 0, 100733, 10788, 6088, - 0, 0, 190, 983341, 12593, 100737, 129308, 64408, 0, 4417, 128615, 74359, - 41744, 0, 0, 100435, 6965, 0, 0, 13201, 100430, 69896, 78868, 74382, - 11841, 7918, 92721, 0, 0, 0, 1728, 0, 0, 0, 0, 92679, 0, 0, 92711, 0, 0, - 119536, 0, 66679, 8382, 0, 0, 100381, 0, 917889, 42254, 68371, 100383, 0, - 0, 0, 9923, 0, 0, 11763, 100386, 120688, 0, 78187, 0, 0, 0, 0, 8333, 0, - 0, 0, 917805, 74464, 0, 92320, 74080, 0, 69911, 11910, 0, 74141, 8963, 0, - 0, 0, 121396, 0, 41747, 0, 0, 8968, 0, 0, 129110, 0, 0, 8836, 12315, 0, - 8300, 0, 0, 0, 8856, 0, 0, 69891, 0, 120404, 120405, 120402, 120403, - 120400, 120401, 12853, 43269, 7263, 120244, 6536, 120238, 120239, 65516, - 12321, 120391, 120388, 55287, 2237, 120246, 9588, 120248, 120382, 120383, + 41998, 0, 6946, 77920, 0, 123610, 0, 0, 0, 121442, 42690, 9880, 0, 0, + 64589, 0, 0, 127880, 68035, 0, 11360, 0, 0, 72242, 0, 0, 0, 0, 0, 64941, + 0, 0, 0, 0, 65671, 11244, 73706, 6959, 41994, 42907, 0, 0, 122902, 8617, + 41982, 8860, 0, 0, 0, 0, 0, 9597, 0, 43172, 0, 10117, 0, 92297, 65865, 0, + 0, 128077, 0, 126065, 0, 187, 0, 65669, 0, 4963, 0, 0, 0, 8964, 0, 7775, + 0, 41948, 0, 0, 101010, 41942, 65449, 3160, 65922, 13226, 42665, 0, + 42663, 128210, 41766, 0, 78848, 78849, 41760, 1189, 905, 110620, 42658, + 78851, 67859, 9629, 6742, 0, 43625, 12952, 7888, 0, 3980, 0, 42656, 0, + 42055, 0, 0, 0, 64540, 0, 7867, 69218, 6236, 0, 0, 10505, 0, 12851, + 118948, 0, 5474, 128843, 3103, 0, 41753, 41733, 78051, 983472, 78844, + 78845, 41739, 78843, 70744, 10931, 41756, 43347, 68098, 122909, 41746, + 119147, 92591, 41259, 917848, 69930, 2691, 121338, 11231, 41244, 0, + 69800, 66364, 41262, 0, 0, 0, 41251, 0, 0, 11805, 0, 0, 68331, 94045, 0, + 0, 0, 74633, 41266, 126642, 0, 0, 0, 65741, 41737, 2275, 2666, 121232, + 41738, 4967, 419, 13126, 0, 0, 42822, 0, 6434, 74913, 0, 0, 6432, 0, + 69932, 128862, 769, 41742, 69927, 74805, 6433, 0, 547, 1943, 6439, 0, + 4994, 487, 0, 0, 3754, 0, 0, 0, 0, 74780, 0, 0, 1595, 92777, 74431, 0, 0, + 74860, 43267, 0, 0, 129083, 12185, 69406, 0, 0, 100984, 0, 42856, 0, 0, + 983746, 128319, 75057, 0, 0, 0, 65612, 0, 669, 0, 0, 0, 0, 0, 70445, + 100404, 69929, 0, 0, 460, 121513, 0, 0, 0, 120747, 0, 121519, 121518, 0, + 0, 121515, 121514, 65187, 9044, 78497, 11760, 78494, 7577, 78491, 41912, + 100412, 0, 100411, 0, 0, 100394, 78501, 0, 2933, 78500, 0, 66441, 100392, + 100397, 100391, 1549, 0, 100415, 0, 41755, 6206, 8670, 120587, 0, 69935, + 0, 0, 69768, 100952, 0, 0, 0, 0, 10552, 64342, 41922, 0, 917858, 0, + 917857, 2717, 0, 0, 0, 73664, 41908, 100722, 41916, 0, 0, 0, 92506, + 100723, 66664, 69803, 0, 100725, 0, 0, 43373, 0, 0, 8468, 100729, 121173, + 128297, 119210, 118952, 0, 0, 0, 100686, 0, 0, 0, 128703, 100670, 457, + 78502, 78503, 123180, 43006, 0, 8802, 113777, 0, 0, 0, 0, 126632, 0, + 41757, 0, 100657, 44000, 0, 0, 43534, 0, 0, 11961, 121316, 0, 0, 0, + 128736, 0, 0, 9499, 100695, 128330, 0, 0, 92260, 68184, 0, 0, 7256, + 983401, 983179, 0, 42161, 0, 119126, 128022, 65880, 0, 10802, 64861, 0, + 0, 0, 0, 0, 0, 73109, 0, 955, 0, 0, 5350, 64339, 0, 100705, 10875, 0, + 5477, 73121, 0, 0, 0, 67693, 69790, 0, 0, 3874, 0, 0, 0, 0, 83272, + 100674, 127397, 0, 100989, 0, 41038, 0, 9207, 42239, 0, 0, 0, 0, 74432, + 0, 0, 1455, 129680, 0, 11753, 119233, 0, 0, 127854, 100716, 69801, 0, 0, + 43520, 0, 119556, 0, 0, 0, 0, 100733, 10788, 6088, 0, 129587, 190, + 983341, 12593, 100737, 129308, 64408, 0, 4417, 128615, 74359, 41744, 0, + 0, 100435, 6965, 0, 0, 13201, 100430, 69896, 78868, 74382, 11841, 7918, + 92721, 0, 0, 0, 1728, 0, 0, 0, 0, 92679, 0, 0, 92711, 0, 0, 119536, 0, + 66679, 8382, 0, 0, 100381, 0, 917889, 42254, 68371, 100383, 0, 0, 0, + 9923, 0, 0, 11763, 100386, 120688, 0, 78187, 0, 0, 0, 0, 8333, 0, 0, 0, + 917805, 74464, 0, 92320, 74080, 0, 69911, 11910, 0, 74141, 8963, 0, 0, 0, + 121396, 0, 41747, 0, 0, 8968, 0, 0, 129110, 0, 0, 8836, 12315, 0, 8300, + 0, 0, 0, 8856, 0, 0, 69891, 0, 120404, 120405, 120402, 120403, 120400, + 120401, 12853, 43269, 7263, 120244, 6536, 120238, 120239, 65516, 12321, + 120391, 120388, 55287, 2237, 120246, 9588, 120248, 120382, 120383, 120380, 120381, 0, 0, 3561, 0, 0, 10613, 0, 0, 0, 0, 0, 128689, 5006, 64328, 68219, 917894, 0, 8825, 0, 0, 0, 0, 128616, 0, 119177, 0, 0, 128641, 120225, 71366, 120227, 120228, 438, 4510, 41707, 8721, 120233, @@ -23599,30 +24237,30 @@ static unsigned int code_hash[] = { 41257, 0, 8675, 10700, 0, 0, 0, 9333, 0, 121471, 0, 0, 0, 0, 0, 499, 0, 70729, 42915, 0, 101000, 0, 100999, 0, 0, 73111, 0, 122897, 0, 125006, 0, 11118, 0, 128009, 0, 0, 128980, 9180, 0, 0, 0, 100986, 43438, 0, 0, 0, 0, - 0, 120669, 64782, 0, 0, 73969, 565, 42484, 118913, 201, 0, 42292, 0, 0, - 0, 119625, 43518, 0, 0, 1022, 113788, 3880, 74247, 0, 0, 0, 0, 0, 0, 0, - 0, 72272, 100997, 0, 0, 0, 74255, 0, 0, 92598, 0, 9903, 118993, 0, 68226, - 0, 0, 0, 127788, 100955, 83280, 7892, 0, 10777, 0, 0, 65562, 0, 101002, - 0, 8039, 3363, 101009, 0, 0, 0, 12596, 70812, 0, 0, 0, 0, 0, 92425, - 74992, 64541, 0, 0, 10520, 12802, 0, 12998, 0, 83270, 42861, 83273, - 11415, 0, 7541, 125068, 65878, 822, 0, 0, 5774, 194746, 43252, 0, 92619, - 7672, 129281, 0, 0, 7463, 0, 0, 0, 0, 0, 0, 121411, 0, 0, 0, 0, 0, 475, - 0, 120586, 7329, 0, 0, 195088, 66291, 10645, 0, 6543, 0, 0, 0, 119065, 0, - 0, 0, 983233, 195095, 0, 8923, 1645, 0, 0, 0, 3196, 72404, 0, 0, 43595, - 0, 0, 0, 0, 0, 195076, 0, 0, 5258, 4328, 0, 0, 0, 405, 11454, 0, 0, 0, 0, - 75052, 41245, 0, 0, 4523, 11369, 0, 0, 0, 195079, 0, 0, 983505, 0, - 100961, 10480, 74610, 0, 0, 0, 12610, 0, 41247, 0, 7609, 118837, 0, 0, - 92253, 0, 984, 0, 92621, 0, 0, 0, 983501, 0, 0, 0, 43369, 0, 0, 0, - 983502, 6634, 0, 0, 0, 0, 74214, 0, 67709, 0, 0, 0, 71114, 9552, 0, 0, 0, - 12997, 0, 0, 0, 0, 129109, 12883, 10994, 10529, 55283, 0, 74618, 0, - 67736, 10661, 19951, 9614, 2428, 0, 121023, 0, 0, 100966, 71127, 0, - 124996, 119162, 1952, 92181, 8455, 100958, 0, 93033, 119566, 100960, 0, - 12183, 100951, 0, 64929, 0, 0, 0, 128290, 42509, 73087, 3922, 9187, + 0, 120669, 64782, 0, 0, 73969, 565, 42484, 118913, 201, 0, 42292, 69610, + 0, 0, 119625, 43518, 0, 0, 1022, 113788, 3880, 74247, 0, 0, 0, 0, 0, 0, + 0, 0, 72272, 100997, 0, 0, 0, 74255, 0, 0, 92598, 0, 9903, 118993, 0, + 68226, 0, 0, 0, 127788, 100955, 83280, 7892, 0, 10777, 0, 0, 65562, 0, + 101002, 0, 8039, 3363, 101009, 0, 0, 0, 12596, 70812, 0, 0, 0, 0, 0, + 92425, 74992, 64541, 0, 0, 10520, 12802, 0, 12998, 0, 83270, 42861, + 83273, 11415, 0, 7541, 125068, 65878, 822, 0, 0, 5774, 194746, 43252, 0, + 92619, 7672, 129281, 0, 0, 7463, 0, 0, 0, 0, 0, 0, 121411, 0, 0, 0, 0, 0, + 475, 0, 120586, 7329, 0, 0, 195088, 66291, 10645, 0, 6543, 0, 0, 0, + 119065, 0, 0, 0, 983233, 195095, 0, 8923, 1645, 0, 0, 0, 3196, 72404, 0, + 0, 43595, 0, 0, 0, 0, 0, 195076, 0, 0, 5258, 4328, 0, 0, 0, 405, 11454, + 0, 0, 0, 0, 75052, 41245, 0, 0, 4523, 11369, 0, 0, 0, 195079, 0, 0, + 983505, 0, 100961, 10480, 74610, 0, 0, 0, 12610, 0, 41247, 0, 7609, + 118837, 0, 0, 92253, 0, 984, 0, 92621, 0, 0, 0, 983501, 0, 0, 0, 43369, + 0, 0, 0, 983502, 6634, 0, 0, 0, 0, 74214, 0, 67709, 0, 0, 0, 71114, 9552, + 0, 0, 0, 12997, 0, 0, 0, 0, 129109, 12883, 10994, 10529, 55283, 0, 74618, + 0, 67736, 10661, 19951, 9614, 2428, 0, 121023, 0, 126224, 100966, 71127, + 0, 124996, 119162, 1952, 92181, 8455, 100958, 0, 93033, 119566, 100960, + 0, 12183, 100951, 0, 64929, 0, 0, 0, 128290, 42509, 73087, 3922, 9187, 983626, 0, 0, 119057, 0, 3353, 9358, 0, 0, 66680, 0, 73975, 12879, 0, 9795, 68380, 0, 0, 0, 0, 0, 41027, 0, 0, 0, 983631, 0, 70378, 0, 11751, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129356, 0, 0, 0, 0, 41029, 0, 126513, 0, 0, 0, 11294, 0, 66665, 0, 0, 127750, 0, 0, 70105, 0, 0, 0, 67843, 0, 0, - 121167, 983876, 0, 8088, 129412, 0, 0, 0, 983973, 6926, 72423, 0, 0, + 121167, 983876, 0, 8088, 129412, 0, 0, 0, 983973, 6926, 72423, 0, 129569, 42369, 4350, 0, 65145, 9041, 43559, 0, 0, 0, 41263, 0, 0, 0, 65825, 9577, 68199, 0, 0, 983121, 0, 6793, 0, 70409, 0, 0, 0, 0, 64669, 0, 0, 0, 11200, 72725, 2995, 0, 0, 0, 7868, 72720, 983560, 11386, 1009, 70405, @@ -23641,7 +24279,7 @@ static unsigned int code_hash[] = { 983319, 0, 126086, 72236, 10021, 0, 0, 0, 65914, 0, 66749, 0, 6721, 217, 12466, 0, 0, 10443, 0, 68654, 0, 0, 0, 78334, 0, 41250, 0, 129532, 0, 0, 0, 69232, 0, 41252, 66682, 0, 119637, 41249, 1366, 0, 0, 0, 0, 0, 4397, - 0, 0, 0, 9545, 121219, 0, 0, 0, 3511, 0, 92190, 0, 0, 128818, 760, 0, + 0, 0, 0, 9545, 121219, 0, 0, 0, 3511, 0, 92190, 0, 0, 126244, 760, 0, 12088, 0, 0, 42256, 0, 0, 417, 0, 111347, 41565, 74965, 0, 111355, 0, 0, 0, 2284, 0, 0, 983257, 0, 0, 0, 0, 0, 0, 42273, 0, 69430, 0, 0, 126643, 0, 65910, 0, 10246, 0, 68224, 12169, 128858, 4552, 0, 0, 0, 1375, 66705, @@ -23659,7 +24297,7 @@ static unsigned int code_hash[] = { 111126, 0, 128591, 128681, 0, 0, 0, 0, 73023, 742, 0, 2893, 78738, 0, 0, 0, 2553, 42294, 6756, 0, 73020, 8363, 0, 2993, 128381, 3916, 4301, 0, 1141, 42407, 0, 0, 7572, 973, 0, 125077, 0, 2415, 0, 0, 9640, 42333, 0, - 0, 0, 42486, 43381, 65390, 0, 69434, 1202, 0, 0, 0, 0, 68484, 0, 0, + 0, 129546, 42486, 43381, 65390, 0, 69434, 1202, 0, 0, 0, 0, 68484, 0, 0, 64542, 3260, 0, 65388, 43502, 69904, 0, 6738, 0, 0, 74193, 0, 0, 0, 74641, 6312, 0, 74556, 12446, 0, 0, 128076, 8229, 1235, 0, 11472, 83064, 0, 0, 0, 0, 0, 1740, 12872, 0, 985, 0, 0, 0, 12068, 0, 0, 0, 0, 0, 0, @@ -23711,7 +24349,7 @@ static unsigned int code_hash[] = { 64647, 0, 0, 4699, 126077, 0, 0, 0, 0, 0, 68074, 0, 0, 0, 128347, 0, 72829, 0, 69773, 121438, 0, 0, 0, 73980, 78255, 78254, 83453, 43157, 0, 0, 0, 7946, 12541, 0, 74615, 69780, 0, 0, 0, 0, 9005, 1225, 0, 0, 0, 0, - 68011, 8847, 0, 0, 0, 8329, 74590, 64806, 0, 0, 0, 3127, 2595, 71040, + 68011, 8847, 0, 0, 0, 8329, 74590, 43878, 0, 0, 0, 3127, 2595, 71040, 69766, 129188, 0, 41089, 0, 0, 70292, 983613, 12112, 0, 74200, 0, 8764, 0, 0, 0, 67273, 67272, 67271, 71044, 0, 0, 0, 71042, 67266, 67265, 0, 67270, 67269, 67268, 67267, 67282, 67281, 67280, 3572, 10023, 4959, 0, 0, @@ -23728,385 +24366,388 @@ static unsigned int code_hash[] = { 128873, 1389, 128871, 0, 0, 0, 12941, 0, 83438, 121062, 0, 12301, 83440, 0, 41102, 66604, 0, 0, 0, 0, 66600, 523, 92642, 71100, 74436, 0, 0, 0, 8608, 83435, 72828, 128704, 0, 127402, 11307, 66707, 67301, 67300, 67299, - 0, 67304, 67303, 0, 0, 0, 0, 0, 5908, 0, 0, 6744, 67310, 1699, 67308, - 67307, 67314, 67313, 6306, 67311, 983207, 0, 69862, 3766, 2389, 67305, - 74569, 6611, 65700, 0, 0, 0, 42386, 0, 0, 2599, 917972, 119131, 119049, - 65717, 0, 0, 119654, 0, 0, 0, 74203, 3760, 1718, 68160, 0, 3776, 7335, 0, - 0, 67324, 69861, 0, 69792, 0, 0, 3778, 0, 9462, 7824, 0, 0, 3768, 68142, - 765, 72822, 3764, 0, 0, 113822, 0, 12947, 0, 0, 0, 118806, 73753, 0, 0, - 0, 6829, 5225, 66901, 0, 0, 0, 0, 67319, 67318, 3162, 67316, 67323, - 67322, 67321, 67320, 0, 5353, 0, 74179, 67315, 0, 1010, 0, 0, 67326, - 67325, 127870, 6952, 67329, 67328, 67327, 2590, 120036, 65552, 120034, - 120039, 7183, 120037, 120038, 120027, 120028, 120025, 120026, 120031, - 970, 120029, 74611, 120019, 120020, 120017, 67330, 120023, 120024, - 120021, 10961, 113693, 11148, 0, 0, 0, 128448, 0, 113703, 64378, 0, 0, 0, - 68821, 119649, 11358, 71172, 69797, 0, 11065, 126464, 0, 68864, 0, 5694, - 120839, 66784, 0, 4325, 3047, 0, 43652, 120962, 93029, 69764, 0, 0, 0, 0, - 5431, 6652, 0, 67753, 71460, 0, 0, 0, 1129, 65016, 0, 65900, 1986, 7846, - 0, 8661, 75058, 0, 0, 3845, 0, 0, 0, 74400, 1456, 7530, 121382, 0, 0, 0, - 0, 120016, 0, 0, 0, 0, 127772, 119966, 0, 11002, 7026, 8145, 68216, 0, - 12138, 71464, 0, 0, 0, 12323, 0, 917869, 0, 0, 0, 92316, 68494, 0, 0, - 129384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42205, 0, 236, 0, 78867, 0, 0, - 113784, 0, 0, 983982, 0, 0, 0, 8097, 0, 0, 68012, 72820, 11194, 0, 72824, - 0, 127974, 0, 0, 110603, 0, 10416, 68070, 3872, 127508, 0, 0, 0, 0, 2838, - 917867, 0, 917866, 119589, 0, 0, 0, 0, 11096, 83019, 10553, 83421, 0, 0, - 0, 0, 0, 0, 73742, 6436, 10096, 0, 0, 0, 113687, 0, 4463, 68018, 0, - 78074, 0, 983591, 7184, 0, 0, 0, 0, 0, 0, 93825, 12818, 12032, 0, 0, 0, - 0, 10357, 121418, 8170, 0, 8556, 0, 9659, 0, 0, 0, 9556, 0, 4503, 92700, - 9647, 64004, 78185, 0, 0, 64002, 78889, 0, 0, 118910, 0, 6438, 0, 9109, - 78884, 0, 64599, 0, 68009, 0, 0, 2447, 0, 0, 0, 126545, 0, 119002, 0, 0, - 0, 19937, 0, 1322, 0, 119204, 254, 0, 0, 69392, 42425, 0, 0, 65204, - 42312, 0, 128519, 0, 42826, 0, 42464, 120567, 0, 67155, 74796, 64400, - 64693, 0, 77861, 0, 0, 67154, 0, 0, 0, 68008, 11785, 0, 119142, 41978, 0, - 0, 43244, 10536, 0, 9901, 7103, 0, 7102, 71428, 120748, 3140, 0, 0, - 68007, 0, 67258, 10909, 0, 1428, 0, 67254, 67253, 7699, 12393, 67257, 0, - 67256, 67255, 0, 0, 69389, 0, 0, 0, 0, 0, 67153, 0, 0, 127383, 69376, - 64554, 0, 3878, 0, 42352, 1752, 0, 0, 42506, 0, 10199, 0, 983463, 125231, - 0, 0, 0, 720, 0, 0, 0, 68831, 0, 1464, 128339, 0, 7974, 0, 125017, 68082, - 0, 0, 0, 0, 74787, 0, 78865, 92258, 0, 0, 78863, 0, 1302, 66288, 0, 0, 0, - 67152, 0, 983611, 983618, 0, 0, 3995, 0, 65608, 3714, 0, 0, 67262, 67261, - 67260, 67259, 43251, 67264, 67263, 0, 120557, 92346, 8672, 68006, 11964, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92610, 0, 468, 0, 0, 0, 983470, 0, 0, - 128544, 129397, 65907, 983163, 0, 0, 0, 0, 0, 983468, 41743, 0, 0, 0, - 74880, 0, 121001, 820, 41741, 0, 120667, 0, 64684, 126992, 128604, - 126082, 69934, 65177, 6226, 353, 43645, 0, 119612, 120738, 67700, 0, 0, - 0, 0, 42457, 120276, 0, 120277, 1884, 129637, 42418, 113678, 41157, 0, - 42305, 120279, 0, 0, 41151, 0, 71430, 0, 42344, 0, 0, 0, 42497, 0, - 194870, 72754, 69933, 0, 0, 42521, 8539, 128606, 0, 983794, 69957, 4788, - 0, 68023, 0, 0, 983053, 0, 0, 0, 0, 41590, 0, 113754, 0, 0, 118901, - 68637, 41136, 64351, 0, 128453, 41154, 113731, 127038, 4038, 41143, - 68232, 64859, 0, 0, 0, 5435, 0, 6734, 41343, 127035, 0, 0, 41359, 66761, - 0, 119835, 41349, 0, 0, 10374, 10310, 0, 0, 10254, 119836, 10278, 10262, - 69858, 41363, 0, 0, 0, 119840, 0, 41356, 10314, 10282, 0, 10378, 0, - 40976, 10266, 0, 119848, 40975, 0, 0, 0, 40978, 0, 92945, 0, 0, 0, - 119098, 119083, 0, 71437, 119854, 69936, 0, 0, 3525, 6824, 0, 0, 119858, - 128451, 0, 72239, 113738, 0, 71424, 0, 0, 0, 0, 0, 10727, 7212, 129071, - 120551, 0, 0, 0, 67156, 808, 7207, 42387, 0, 0, 0, 0, 0, 0, 0, 0, 9225, - 121149, 0, 9145, 128060, 41018, 67841, 983158, 42300, 0, 3084, 983155, - 125014, 41025, 6037, 0, 194885, 0, 10290, 0, 3083, 10322, 111017, 129030, - 0, 41036, 0, 0, 43321, 65606, 0, 41032, 42388, 0, 64700, 0, 1445, 40961, - 0, 0, 0, 40960, 0, 67727, 0, 2223, 64952, 10402, 0, 0, 0, 10603, 0, 0, - 71438, 0, 0, 0, 128469, 0, 0, 0, 0, 0, 0, 42585, 65032, 10704, 65030, - 4787, 0, 917556, 0, 127015, 0, 128118, 0, 0, 9525, 0, 0, 68773, 0, 0, 0, - 0, 40966, 0, 0, 3998, 0, 0, 65919, 71433, 11792, 2690, 0, 42836, 127150, - 41954, 194921, 194923, 6737, 0, 64933, 0, 3487, 194873, 71427, 72758, - 65426, 72756, 66757, 0, 0, 41976, 9720, 74964, 11179, 41970, 0, 12116, - 65024, 0, 127912, 9048, 65028, 65027, 65026, 65025, 64757, 0, 41488, 0, - 8527, 0, 126480, 0, 41480, 41053, 3266, 0, 0, 12093, 41466, 122881, - 78642, 1519, 983906, 3638, 65887, 65429, 0, 0, 0, 0, 8633, 0, 0, 0, - 125118, 0, 70375, 0, 0, 6368, 128124, 0, 70369, 8078, 0, 0, 70373, 72876, - 0, 7002, 121003, 41430, 0, 41051, 41484, 0, 0, 41050, 8872, 0, 13099, - 71445, 70371, 0, 6435, 0, 11362, 0, 0, 0, 0, 41420, 0, 3625, 74915, - 41409, 71441, 0, 0, 0, 9672, 0, 0, 43317, 0, 0, 0, 41424, 917598, 0, 0, - 0, 0, 41417, 1261, 0, 0, 12102, 119662, 41401, 0, 127538, 129518, 0, - 124943, 72765, 3275, 92472, 0, 0, 0, 0, 0, 0, 0, 0, 125129, 983140, - 10598, 0, 128633, 6711, 0, 2920, 0, 0, 0, 0, 19928, 0, 0, 3917, 0, - 113756, 0, 0, 66588, 128078, 0, 0, 113721, 113758, 0, 0, 0, 41184, 0, - 232, 0, 0, 74170, 0, 0, 0, 0, 9094, 0, 0, 92585, 0, 1064, 0, 0, 10115, 0, - 0, 0, 7862, 0, 13224, 0, 0, 66650, 0, 0, 72877, 1878, 0, 71434, 2911, 0, - 41178, 5427, 0, 0, 0, 12617, 41174, 0, 67148, 67147, 0, 42413, 41167, - 2406, 0, 0, 0, 0, 0, 9618, 128668, 0, 0, 0, 0, 41436, 9337, 126067, 0, - 41456, 0, 0, 11333, 0, 6703, 0, 125071, 1613, 0, 0, 0, 983191, 0, 0, - 74500, 41460, 78197, 0, 0, 194899, 67144, 65841, 0, 121109, 74064, - 111146, 111144, 120375, 0, 111122, 0, 111121, 64687, 111120, 42592, 3871, - 0, 128305, 9111, 111163, 0, 111156, 120366, 121462, 11150, 111154, - 111175, 111179, 0, 111168, 0, 120362, 41587, 70391, 0, 74322, 0, 194908, - 111166, 111133, 0, 71443, 194844, 0, 111151, 0, 0, 7928, 111127, 111140, - 41595, 0, 0, 65801, 983600, 0, 0, 0, 0, 0, 41598, 3993, 121269, 1545, - 40971, 121286, 72874, 0, 0, 0, 120767, 65286, 0, 0, 0, 0, 0, 0, 0, 5402, - 0, 0, 74462, 73457, 0, 0, 78194, 64326, 40969, 0, 128110, 983684, 40968, - 0, 983148, 0, 0, 0, 0, 128513, 8020, 0, 41012, 0, 0, 65805, 41006, 0, 0, - 74605, 0, 118942, 43432, 0, 0, 92900, 0, 0, 0, 120687, 0, 92958, 0, 0, - 68332, 0, 40992, 0, 0, 0, 0, 0, 42235, 0, 1741, 42370, 0, 0, 0, 11413, - 126583, 0, 0, 128769, 6470, 0, 74517, 0, 0, 120651, 40984, 0, 42742, 0, - 12916, 6284, 0, 41663, 0, 0, 68313, 72840, 70164, 41648, 0, 0, 2299, - 41666, 0, 0, 2056, 41656, 0, 0, 71917, 42219, 0, 0, 78112, 41676, 0, 0, - 0, 41670, 0, 92590, 2796, 0, 0, 9902, 0, 67988, 64785, 82995, 128822, - 42631, 0, 71890, 0, 74164, 41238, 10049, 11405, 0, 64368, 0, 120925, 0, - 397, 12299, 42139, 0, 9590, 0, 0, 43661, 43819, 0, 6651, 3544, 0, 0, - 9620, 0, 0, 0, 92229, 1333, 7104, 0, 6425, 0, 0, 0, 0, 0, 0, 11976, 8554, - 0, 0, 110733, 0, 110731, 41218, 0, 0, 128673, 1883, 0, 0, 70443, 41225, - 70788, 42419, 983688, 0, 0, 127896, 0, 65809, 11837, 0, 129104, 7141, 0, - 0, 0, 0, 0, 42363, 0, 0, 0, 0, 69949, 119157, 64732, 0, 0, 126983, 0, 0, - 983678, 7140, 42051, 0, 4164, 118799, 0, 120569, 42049, 42042, 0, 0, 0, - 120637, 69938, 0, 42047, 0, 0, 8470, 11807, 128935, 0, 0, 194825, 74300, - 194822, 0, 120517, 0, 0, 0, 0, 8736, 0, 42643, 72753, 0, 0, 0, 71432, 0, - 93023, 110730, 72869, 110728, 0, 0, 0, 0, 68445, 0, 0, 2106, 0, 11273, - 120986, 43004, 0, 82988, 0, 961, 64307, 0, 0, 0, 67711, 110615, 0, 1696, - 0, 9762, 12105, 0, 110622, 110623, 3264, 110621, 110618, 43003, 110616, - 110617, 0, 120359, 0, 128660, 0, 2322, 0, 70831, 11449, 128187, 42868, 0, - 0, 0, 0, 113746, 983234, 0, 0, 66398, 0, 0, 0, 0, 0, 111135, 119224, 0, - 0, 64421, 0, 113739, 0, 65823, 0, 11182, 0, 0, 0, 7766, 55268, 0, 4598, - 0, 65839, 0, 0, 0, 10851, 0, 6179, 92602, 6180, 129524, 11952, 0, 78648, + 0, 67304, 67303, 0, 0, 0, 0, 127212, 5908, 0, 0, 6744, 67310, 1699, + 67308, 67307, 67314, 67313, 6306, 67311, 983207, 72150, 69862, 3766, + 2389, 67305, 74569, 6611, 65700, 0, 0, 0, 42386, 0, 0, 2599, 917972, + 119131, 119049, 65717, 0, 0, 119654, 0, 0, 0, 74203, 3760, 1718, 68160, + 0, 3776, 7335, 0, 0, 67324, 69861, 0, 69792, 0, 0, 3778, 0, 9462, 7824, + 0, 78896, 3768, 68142, 765, 72822, 3764, 0, 0, 113822, 0, 12947, 0, 0, 0, + 118806, 73753, 0, 0, 0, 6829, 5225, 66901, 0, 0, 0, 0, 67319, 67318, + 3162, 67316, 67323, 67322, 67321, 67320, 0, 5353, 0, 74179, 67315, 0, + 1010, 0, 0, 67326, 67325, 127870, 6952, 67329, 67328, 67327, 2590, + 120036, 65552, 120034, 120039, 7183, 120037, 120038, 120027, 120028, + 120025, 120026, 120031, 970, 120029, 74611, 120019, 120020, 120017, + 67330, 120023, 120024, 120021, 10961, 113693, 11148, 0, 0, 0, 128448, 0, + 113703, 64378, 0, 0, 0, 68821, 119649, 11358, 71172, 69797, 0, 11065, + 126464, 0, 68864, 0, 5694, 120839, 66784, 0, 4325, 3047, 0, 43652, + 120962, 93029, 69764, 0, 0, 0, 0, 5431, 6652, 0, 67753, 71460, 0, 0, 0, + 1129, 65016, 0, 65900, 1986, 7846, 0, 8661, 75058, 0, 0, 3845, 0, 0, 0, + 74400, 1456, 7530, 121382, 0, 0, 0, 0, 120016, 0, 0, 0, 917863, 127772, + 119966, 0, 11002, 7026, 8145, 68216, 0, 12138, 71464, 0, 0, 0, 12323, 0, + 917869, 0, 0, 0, 92316, 68494, 0, 0, 129384, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 42205, 0, 236, 0, 78867, 0, 0, 113784, 0, 0, 983982, 0, 0, 0, 8097, 0, + 0, 68012, 72820, 11194, 0, 72824, 0, 127974, 0, 0, 110603, 0, 10416, + 68070, 3872, 127508, 0, 0, 0, 0, 2838, 917867, 0, 917866, 119589, 0, 0, + 0, 0, 11096, 83019, 10553, 83421, 0, 0, 0, 0, 0, 0, 73742, 6436, 10096, + 0, 0, 0, 113687, 0, 4463, 68018, 0, 78074, 0, 983591, 7184, 0, 0, 0, 0, + 0, 0, 93825, 12818, 12032, 0, 0, 0, 0, 10357, 121418, 8170, 0, 8556, 0, + 9659, 0, 0, 0, 9556, 0, 4503, 92700, 9647, 64004, 78185, 0, 0, 64002, + 78889, 0, 0, 118910, 0, 6438, 0, 9109, 78884, 0, 64599, 0, 68009, 0, 0, + 2447, 0, 0, 0, 126545, 0, 119002, 0, 0, 0, 19937, 0, 1322, 0, 119204, + 254, 0, 0, 69392, 42425, 0, 0, 65204, 42312, 0, 128519, 0, 42826, 0, + 42464, 120567, 0, 67155, 74796, 64400, 64693, 126212, 77861, 0, 0, 67154, + 0, 0, 0, 68008, 11785, 0, 119142, 41978, 0, 0, 43244, 10536, 0, 9901, + 7103, 0, 7102, 71428, 120748, 3140, 0, 0, 68007, 0, 67258, 10909, 0, + 1428, 0, 67254, 67253, 7699, 12393, 67257, 0, 67256, 67255, 0, 0, 69389, + 0, 0, 0, 0, 0, 67153, 0, 0, 127383, 69376, 64554, 0, 3878, 0, 42352, + 1752, 0, 0, 42506, 0, 10199, 0, 983463, 125231, 0, 0, 0, 720, 0, 0, 0, + 68831, 0, 1464, 128339, 0, 7974, 0, 125017, 68082, 0, 0, 0, 0, 74787, 0, + 78865, 92258, 0, 0, 78863, 0, 1302, 66288, 0, 0, 0, 67152, 0, 983611, + 983618, 0, 0, 3995, 0, 65608, 3714, 0, 0, 67262, 67261, 67260, 67259, + 43251, 67264, 67263, 0, 120557, 92346, 8672, 68006, 11964, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 92610, 0, 468, 0, 0, 0, 983470, 0, 0, 128544, 129397, + 65907, 983163, 0, 0, 0, 0, 0, 983468, 41743, 0, 0, 0, 74880, 0, 121001, + 820, 41741, 0, 120667, 0, 64684, 126992, 128604, 126082, 69934, 65177, + 6226, 353, 43645, 0, 119612, 120738, 67700, 0, 0, 0, 0, 42457, 120276, 0, + 120277, 1884, 129637, 42418, 113678, 41157, 0, 42305, 120279, 0, 0, + 41151, 0, 71430, 0, 42344, 0, 0, 0, 42497, 0, 194870, 72754, 69933, + 73703, 0, 42521, 8539, 128606, 0, 123609, 69957, 4788, 0, 68023, 0, 0, + 983053, 0, 0, 0, 0, 41590, 0, 113754, 0, 0, 118901, 68637, 41136, 64351, + 0, 128453, 41154, 113731, 127038, 4038, 41143, 68232, 64859, 0, 0, 0, + 5435, 0, 6734, 41343, 127035, 0, 0, 41359, 66761, 0, 119835, 41349, 0, 0, + 10374, 10310, 0, 0, 10254, 119836, 10278, 10262, 69858, 41363, 0, 0, 0, + 119840, 0, 41356, 10314, 10282, 0, 10378, 0, 40976, 10266, 0, 119848, + 40975, 0, 129554, 0, 40978, 0, 92945, 0, 0, 0, 119098, 119083, 0, 71437, + 119854, 69936, 0, 0, 3525, 6824, 0, 0, 119858, 128451, 0, 72239, 113738, + 0, 71424, 0, 0, 0, 0, 0, 10727, 7212, 129071, 120551, 0, 0, 0, 67156, + 808, 7207, 42387, 0, 0, 0, 0, 0, 0, 0, 0, 9225, 121149, 0, 9145, 128060, + 41018, 67841, 983158, 42300, 0, 3084, 983155, 125014, 41025, 6037, 0, + 194885, 0, 10290, 0, 3083, 10322, 111017, 129030, 0, 41036, 0, 0, 43321, + 65606, 0, 41032, 42388, 0, 64700, 0, 1445, 40961, 0, 0, 0, 40960, 0, + 67727, 0, 2223, 64952, 10402, 0, 0, 0, 10603, 0, 0, 71438, 0, 0, 0, + 128469, 0, 0, 0, 0, 0, 0, 42585, 65032, 10704, 65030, 4787, 0, 917556, 0, + 127015, 0, 128118, 0, 0, 9525, 0, 0, 68773, 0, 0, 0, 0, 40966, 0, 0, + 3998, 0, 0, 65919, 71433, 11792, 2690, 0, 42836, 127150, 41954, 194921, + 194923, 6737, 0, 64933, 0, 3487, 194873, 71427, 72758, 65426, 72756, + 66757, 0, 0, 41976, 9720, 74964, 11179, 41970, 0, 12116, 65024, 0, + 127912, 9048, 65028, 65027, 65026, 65025, 64757, 0, 41488, 0, 8527, 0, + 126480, 0, 41480, 41053, 3266, 0, 0, 12093, 41466, 122881, 78642, 1519, + 983906, 3638, 65887, 65429, 0, 0, 0, 0, 8633, 0, 0, 0, 125118, 0, 70375, + 0, 0, 6368, 128124, 0, 70369, 8078, 0, 0, 70373, 72876, 0, 7002, 121003, + 41430, 0, 41051, 41484, 0, 0, 41050, 8872, 0, 13099, 71445, 70371, 0, + 6435, 72154, 11362, 0, 0, 0, 0, 41420, 0, 3625, 74915, 41409, 71441, 0, + 0, 0, 9672, 0, 0, 43317, 0, 0, 0, 41424, 917598, 0, 0, 0, 0, 41417, 1261, + 0, 0, 12102, 119662, 41401, 0, 127538, 129518, 0, 124943, 72765, 3275, + 92472, 0, 0, 0, 0, 0, 0, 0, 0, 125129, 983140, 10598, 0, 128633, 6711, 0, + 2920, 0, 0, 0, 0, 19928, 0, 0, 3917, 0, 113756, 0, 0, 66588, 128078, 0, + 0, 113721, 113758, 0, 0, 0, 41184, 0, 232, 0, 0, 74170, 0, 0, 0, 0, 9094, + 0, 0, 92585, 0, 1064, 0, 0, 10115, 0, 0, 0, 7862, 0, 13224, 0, 0, 66650, + 0, 0, 72877, 1878, 0, 71434, 2911, 0, 41178, 5427, 0, 0, 0, 12617, 41174, + 0, 67148, 67147, 0, 42413, 41167, 2406, 0, 0, 0, 0, 0, 9618, 128668, 0, + 0, 0, 0, 41436, 9337, 126067, 0, 41456, 0, 119086, 11333, 0, 6703, 0, + 125071, 1613, 0, 0, 0, 983191, 0, 0, 74500, 41460, 78197, 0, 0, 194899, + 67144, 65841, 0, 121109, 74064, 111146, 111144, 120375, 0, 111122, 0, + 111121, 64687, 111120, 42592, 3871, 0, 128305, 9111, 111163, 0, 111156, + 120366, 121462, 11150, 111154, 111175, 111179, 0, 111168, 0, 120362, + 41587, 70391, 0, 74322, 0, 194908, 111166, 111133, 0, 71443, 194844, 0, + 111151, 0, 0, 7928, 111127, 111140, 41595, 0, 0, 65801, 983600, 0, 0, 0, + 73712, 0, 41598, 3993, 121269, 1545, 40971, 121286, 72874, 0, 0, 0, + 120767, 65286, 0, 0, 0, 0, 0, 0, 0, 5402, 0, 0, 74462, 73457, 0, 0, + 78194, 64326, 40969, 0, 128110, 983684, 40968, 0, 983148, 0, 0, 0, 0, + 128513, 8020, 0, 41012, 0, 0, 65805, 41006, 0, 0, 74605, 0, 118942, + 43432, 0, 0, 92900, 0, 0, 0, 120687, 0, 92958, 0, 0, 68332, 0, 40992, 0, + 0, 0, 0, 0, 42235, 0, 1741, 42370, 0, 0, 0, 11413, 126583, 0, 0, 128769, + 6470, 0, 74517, 0, 0, 120651, 40984, 0, 42742, 0, 12916, 6284, 0, 41663, + 0, 0, 68313, 72840, 70164, 41648, 0, 0, 2299, 41666, 0, 0, 2056, 41656, + 0, 0, 71917, 42219, 0, 0, 78112, 41676, 0, 0, 0, 41670, 0, 92590, 2796, + 0, 0, 9902, 0, 67988, 64785, 82995, 128822, 42631, 983040, 71890, 0, + 74164, 41238, 10049, 11405, 0, 64368, 0, 120925, 0, 397, 12299, 42139, 0, + 9590, 0, 0, 43661, 43819, 0, 6651, 3544, 0, 0, 9620, 0, 0, 0, 92229, + 1333, 7104, 0, 6425, 0, 0, 0, 0, 0, 0, 11976, 8554, 0, 0, 110733, 0, + 110731, 41218, 0, 0, 128673, 1883, 0, 0, 70443, 41225, 70788, 42419, + 983688, 129450, 0, 127896, 0, 65809, 11837, 0, 129104, 7141, 0, 0, 0, 0, + 0, 42363, 0, 0, 0, 0, 69949, 119157, 64732, 0, 0, 126983, 0, 0, 983678, + 7140, 42051, 0, 4164, 118799, 0, 120569, 42049, 42042, 0, 0, 0, 120637, + 69938, 0, 42047, 0, 0, 8470, 11807, 128935, 0, 0, 194825, 74300, 126267, + 0, 120517, 0, 0, 0, 0, 8736, 0, 42643, 72753, 0, 0, 0, 71432, 0, 93023, + 110730, 72869, 110728, 0, 0, 0, 0, 68445, 0, 0, 2106, 0, 11273, 120986, + 43004, 0, 82988, 0, 961, 64307, 0, 0, 0, 67711, 110615, 0, 1696, 0, 9762, + 12105, 0, 110622, 110623, 3264, 110621, 110618, 43003, 110616, 110617, 0, + 120359, 0, 128660, 0, 2322, 0, 70831, 11449, 128187, 42868, 0, 0, 0, 0, + 113746, 983234, 0, 129583, 66398, 0, 0, 0, 0, 0, 111135, 119224, 0, 0, + 64421, 0, 113739, 0, 65823, 0, 11182, 0, 0, 0, 7766, 55268, 0, 4598, 0, + 65839, 0, 0, 0, 10851, 0, 6179, 92602, 6180, 129524, 11952, 0, 78648, 78651, 78646, 78647, 78644, 78645, 3801, 78643, 6176, 120580, 0, 0, 6177, 0, 78652, 78653, 6178, 0, 0, 0, 0, 2214, 8754, 0, 0, 2137, 0, 0, 0, 0, 66889, 0, 0, 0, 8974, 2308, 0, 74579, 0, 2318, 122920, 0, 8198, 0, 0, 0, - 74307, 0, 119524, 0, 0, 6970, 0, 0, 0, 41159, 0, 0, 6385, 0, 128403, 0, - 0, 0, 0, 72785, 42053, 2075, 42057, 0, 42052, 0, 0, 67651, 0, 9665, 0, 0, - 13181, 0, 0, 69379, 0, 0, 0, 0, 73010, 0, 0, 0, 41145, 0, 0, 0, 41148, 0, - 7594, 113686, 75033, 119090, 10869, 43458, 41146, 0, 0, 0, 917630, 0, 0, - 0, 0, 0, 65184, 11780, 0, 42796, 0, 69742, 0, 65146, 66803, 0, 0, 0, - 7358, 78241, 0, 7988, 0, 0, 3271, 0, 0, 0, 0, 0, 0, 983103, 13070, - 113736, 42044, 0, 1095, 0, 3599, 0, 0, 0, 129087, 66390, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 42043, 43232, 67656, 121014, 42046, 64355, 4036, 0, 0, 0, - 983062, 0, 11954, 0, 41191, 12986, 0, 194854, 65441, 0, 72202, 0, 129338, - 0, 0, 0, 12834, 0, 0, 0, 0, 0, 0, 0, 41190, 0, 0, 4575, 41193, 0, 429, - 119174, 124931, 194859, 0, 65792, 128754, 78509, 0, 128866, 0, 0, 0, - 66786, 0, 194862, 10590, 0, 0, 0, 0, 0, 0, 6247, 10214, 65126, 68253, 0, - 0, 0, 983680, 1617, 8050, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6352, 0, 0, 0, 0, - 0, 0, 0, 0, 92335, 0, 0, 42926, 0, 0, 0, 8689, 78750, 70067, 42896, - 74147, 3559, 0, 0, 74526, 65850, 12327, 72763, 119028, 0, 0, 72761, 0, 0, - 0, 0, 0, 0, 70079, 72751, 0, 12153, 0, 0, 120654, 0, 0, 0, 0, 0, 0, 681, - 129406, 703, 983461, 3272, 0, 0, 70077, 0, 0, 70514, 0, 92532, 71436, - 42238, 124930, 3276, 0, 0, 65928, 0, 0, 128949, 0, 0, 0, 78813, 78814, - 3262, 78811, 42711, 0, 0, 0, 0, 92746, 9995, 1655, 70131, 78818, 78815, - 12479, 0, 0, 0, 70513, 42797, 0, 0, 128371, 43112, 0, 43488, 0, 0, 0, - 42684, 0, 0, 0, 0, 0, 128308, 0, 0, 0, 0, 0, 0, 11031, 0, 0, 0, 70386, - 10348, 10412, 0, 0, 74329, 0, 0, 0, 129026, 0, 0, 0, 8810, 0, 686, 0, 0, - 0, 0, 0, 110709, 0, 0, 12040, 0, 0, 65118, 110704, 0, 118891, 110599, 0, - 110598, 0, 120543, 983660, 0, 65455, 74413, 94097, 0, 119129, 0, 0, 0, - 78776, 0, 64467, 10300, 10161, 10396, 0, 0, 0, 0, 78773, 0, 0, 0, 1458, - 0, 0, 72429, 65120, 11479, 0, 0, 6350, 0, 0, 71473, 1061, 69787, 9115, - 43111, 0, 0, 0, 0, 983960, 0, 120907, 1045, 0, 73913, 983564, 0, 0, 0, 0, - 0, 0, 8486, 0, 0, 0, 4362, 0, 0, 93054, 1025, 0, 0, 0, 0, 0, 92328, - 128206, 0, 1774, 0, 122913, 0, 0, 0, 11207, 0, 0, 3988, 0, 0, 983048, 0, - 0, 8564, 983958, 0, 0, 0, 0, 0, 0, 66513, 6256, 0, 579, 55218, 0, 0, 0, - 127337, 0, 11814, 0, 4488, 128716, 127336, 0, 10444, 118846, 78238, 0, 0, - 127331, 4487, 127849, 42832, 1032, 0, 43450, 0, 70155, 0, 614, 0, 127325, - 0, 0, 128466, 0, 127323, 0, 127322, 0, 0, 0, 1050, 7549, 127319, 0, 9314, - 0, 0, 0, 0, 0, 70434, 127314, 12527, 66504, 0, 0, 0, 0, 64333, 127312, - 128547, 92594, 0, 0, 0, 129316, 0, 124960, 10360, 6746, 0, 0, 0, 0, - 13085, 9233, 0, 0, 0, 0, 0, 0, 92766, 0, 121114, 983925, 74212, 42819, - 10910, 0, 68044, 9896, 0, 0, 120915, 0, 0, 7970, 0, 0, 0, 0, 113699, - 9849, 0, 122910, 0, 0, 10487, 69714, 0, 10103, 0, 4769, 0, 0, 0, 2283, 0, - 0, 74785, 0, 0, 0, 110595, 110596, 0, 110594, 64565, 4773, 0, 0, 0, 4770, - 0, 0, 0, 65457, 69441, 0, 0, 127338, 983593, 4774, 0, 68497, 2259, 0, 0, - 10215, 0, 0, 0, 0, 0, 74776, 0, 4768, 0, 0, 4099, 0, 110699, 110700, - 110697, 2225, 0, 0, 0, 0, 125217, 11255, 42814, 880, 0, 0, 0, 0, 0, - 67756, 65246, 0, 0, 129463, 7095, 0, 0, 0, 0, 0, 0, 2427, 0, 7093, 0, - 11585, 0, 9962, 0, 12223, 0, 78211, 1434, 78212, 0, 11573, 0, 0, 0, - 121257, 0, 0, 0, 0, 74437, 0, 113711, 917596, 0, 8740, 0, 3782, 64331, 0, - 65167, 1014, 0, 0, 0, 10835, 0, 0, 0, 0, 0, 0, 118824, 7302, 0, 67707, 0, - 1150, 10547, 0, 0, 68427, 0, 0, 0, 0, 118788, 0, 0, 0, 42257, 8010, 0, 0, - 0, 9643, 0, 0, 12864, 0, 0, 0, 0, 0, 0, 0, 0, 1426, 68217, 0, 68447, 0, - 0, 0, 0, 0, 0, 0, 0, 65383, 0, 0, 0, 0, 0, 0, 43196, 43194, 92549, 10744, - 0, 990, 93772, 0, 0, 0, 0, 0, 66470, 0, 0, 0, 3945, 0, 0, 0, 0, 0, - 127546, 127746, 1020, 73763, 92257, 0, 0, 64748, 0, 0, 10205, 0, 0, - 10016, 0, 74051, 0, 43242, 125096, 2667, 0, 125037, 0, 9911, 0, 0, 10097, - 0, 0, 0, 118836, 0, 0, 0, 0, 68889, 10159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 92291, 0, 127973, 72882, 0, 1041, 127182, 6354, 0, 65364, 0, 0, 0, - 72884, 0, 0, 0, 65906, 127819, 72883, 0, 128470, 5375, 72881, 0, 8215, 0, - 10074, 0, 0, 0, 69899, 0, 0, 121426, 41382, 0, 0, 5173, 65348, 527, 0, 0, - 0, 128250, 0, 0, 0, 0, 0, 0, 42695, 0, 42250, 0, 11187, 113695, 0, 1568, - 66806, 0, 0, 113705, 0, 0, 0, 0, 0, 128839, 9069, 6144, 0, 0, 0, 0, - 66783, 0, 74027, 118934, 66787, 74580, 0, 110790, 6364, 0, 66794, 43508, - 0, 92612, 0, 0, 0, 0, 128405, 66449, 0, 0, 0, 0, 70714, 0, 70716, 0, - 1044, 42411, 0, 0, 0, 0, 43239, 0, 0, 0, 0, 42450, 0, 0, 68479, 119237, - 0, 0, 0, 0, 0, 69956, 11537, 0, 121206, 0, 0, 0, 0, 1057, 566, 0, 0, - 10907, 42274, 43464, 0, 0, 0, 78472, 71207, 42636, 0, 127237, 0, 0, 0, - 64659, 0, 127749, 0, 6357, 6362, 0, 0, 2216, 9090, 0, 0, 0, 0, 68227, 0, - 0, 0, 0, 1053, 12830, 0, 0, 0, 1052, 1051, 459, 1060, 0, 66479, 0, 0, 0, - 128061, 42490, 689, 6508, 4163, 42298, 8639, 983333, 4246, 0, 43514, - 42362, 0, 42337, 64596, 0, 0, 0, 0, 0, 6359, 0, 43471, 0, 0, 0, 127274, - 0, 6358, 6361, 1926, 6356, 0, 7898, 0, 10935, 0, 127972, 121285, 0, - 43685, 0, 0, 42910, 0, 8693, 0, 0, 44010, 0, 120991, 121454, 0, 0, 0, 0, - 129514, 0, 0, 0, 0, 73947, 0, 129361, 92412, 0, 66477, 0, 0, 0, 43854, - 71913, 0, 0, 0, 0, 72227, 65899, 92275, 0, 0, 0, 68887, 0, 71057, 0, 0, - 0, 0, 119183, 2923, 10853, 0, 0, 0, 0, 72864, 0, 72773, 72772, 0, 120801, - 65251, 0, 68228, 0, 128548, 0, 0, 5370, 70465, 2931, 73848, 0, 10188, 0, - 118848, 0, 983923, 0, 0, 0, 72212, 0, 10844, 121016, 128195, 92424, 0, 0, - 0, 286, 0, 1062, 0, 0, 0, 7395, 0, 1070, 0, 0, 6095, 0, 0, 0, 127796, - 126465, 64497, 0, 0, 0, 0, 70054, 8189, 78272, 0, 0, 0, 0, 0, 113783, - 42102, 78276, 0, 0, 42101, 0, 78402, 67427, 33, 67425, 67424, 10824, - 67430, 67429, 67428, 427, 64723, 0, 0, 0, 0, 1031, 0, 0, 42104, 0, 0, - 2328, 0, 1071, 42899, 128486, 0, 7673, 0, 0, 1047, 0, 0, 42908, 0, 0, - 10651, 0, 0, 0, 72433, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13216, 0, - 69716, 0, 0, 0, 0, 0, 92411, 69654, 0, 0, 0, 2761, 0, 0, 0, 0, 0, 8643, - 0, 0, 0, 2757, 11067, 0, 74498, 8910, 10689, 0, 0, 0, 71173, 0, 9196, - 71214, 0, 0, 0, 0, 118911, 0, 0, 0, 0, 0, 0, 0, 0, 68130, 119616, 0, 0, - 42477, 0, 0, 4495, 0, 0, 0, 0, 70080, 10992, 0, 0, 0, 0, 9318, 0, 0, 0, - 73808, 0, 92601, 42249, 7639, 43995, 0, 0, 5454, 0, 0, 0, 0, 0, 0, 0, - 121189, 0, 119173, 0, 9704, 120686, 0, 78436, 78435, 11204, 0, 0, 1731, - 0, 92937, 0, 67990, 0, 0, 0, 126576, 127018, 0, 55265, 0, 0, 0, 0, - 127257, 73826, 0, 3840, 0, 41432, 0, 0, 68430, 0, 43253, 128284, 0, 3371, - 92936, 0, 0, 1479, 0, 0, 1109, 77997, 0, 129154, 0, 92782, 0, 0, 8868, - 399, 67978, 74842, 0, 0, 194839, 0, 551, 0, 10156, 0, 92572, 0, 2544, - 65074, 0, 0, 0, 0, 0, 0, 0, 128713, 0, 0, 74268, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 68045, 0, 0, 0, 3447, 0, 0, 121414, 2549, 110818, 0, 0, 43564, - 8946, 0, 74411, 66864, 0, 70480, 7980, 0, 113698, 0, 119653, 66489, 0, - 64695, 128063, 0, 0, 0, 0, 0, 0, 43452, 0, 92993, 0, 10919, 0, 67810, 0, - 0, 0, 0, 6450, 10055, 0, 0, 0, 0, 42720, 0, 9626, 0, 128055, 74447, 0, - 125127, 92573, 0, 0, 0, 119075, 0, 0, 66486, 0, 0, 0, 0, 0, 0, 75028, - 983864, 74839, 0, 0, 0, 0, 0, 55286, 0, 1055, 917628, 0, 0, 0, 70516, - 12146, 0, 73956, 66488, 0, 0, 0, 0, 0, 0, 42518, 0, 0, 0, 7407, 74978, 0, - 0, 0, 0, 0, 0, 0, 10231, 0, 66626, 0, 0, 92951, 0, 65927, 0, 0, 69696, 0, - 92389, 0, 0, 0, 68095, 92950, 0, 10555, 0, 0, 9091, 10798, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 43222, 0, 74982, 0, 0, 120952, 0, 0, 2992, 7826, 74321, 0, - 125103, 74981, 92628, 0, 0, 128289, 128203, 4361, 0, 1306, 78770, 1497, - 983628, 0, 0, 0, 8248, 0, 127253, 7973, 128706, 0, 0, 73122, 983930, 0, - 0, 2963, 120653, 0, 128554, 0, 0, 64258, 0, 0, 69677, 74983, 65103, 0, 0, - 42625, 0, 0, 0, 0, 64905, 0, 9512, 0, 119076, 6443, 983262, 0, 9135, 0, - 0, 0, 0, 0, 983863, 93788, 0, 0, 0, 93767, 64256, 0, 11669, 0, 0, 4524, + 74307, 0, 119524, 0, 0, 6970, 0, 0, 0, 41159, 0, 120363, 6385, 0, 128403, + 0, 0, 126258, 0, 72785, 42053, 2075, 42057, 0, 42052, 0, 0, 67651, 0, + 9665, 0, 0, 13181, 0, 0, 69379, 0, 0, 0, 0, 73010, 0, 0, 0, 41145, 0, 0, + 0, 41148, 0, 7594, 113686, 75033, 119090, 10869, 43458, 41146, 0, 0, + 121456, 917630, 0, 0, 0, 0, 0, 65184, 11780, 0, 42796, 0, 69742, 0, + 65146, 66803, 0, 0, 0, 7358, 78241, 0, 7988, 0, 0, 3271, 0, 0, 0, 0, 0, + 0, 983103, 13070, 113736, 42044, 0, 1095, 0, 3599, 0, 0, 0, 129087, + 66390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42043, 43232, 67656, 121014, 42046, + 64355, 4036, 123601, 0, 0, 983062, 0, 11954, 0, 41191, 12986, 0, 194854, + 65441, 0, 72202, 0, 129338, 0, 0, 0, 12834, 0, 0, 0, 0, 0, 0, 0, 41190, + 0, 0, 4575, 41193, 0, 429, 119174, 124931, 194859, 0, 65792, 128754, + 78509, 0, 128866, 0, 0, 0, 66786, 0, 194862, 10590, 0, 0, 0, 0, 0, 0, + 6247, 10214, 65126, 68253, 0, 0, 0, 983680, 1617, 8050, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6352, 0, 0, 0, 0, 0, 0, 0, 0, 92335, 0, 0, 42926, 0, 0, 0, + 8689, 78750, 70067, 42896, 74147, 3559, 0, 0, 74526, 65850, 12327, 72763, + 119028, 0, 0, 72761, 0, 78903, 0, 0, 0, 0, 70079, 72751, 0, 12153, 0, 0, + 120654, 0, 0, 0, 0, 0, 0, 681, 129406, 703, 983461, 3272, 0, 0, 70077, 0, + 0, 70514, 78902, 92532, 71436, 42238, 124930, 3276, 0, 0, 65928, 0, 0, + 128949, 0, 0, 0, 78813, 78814, 3262, 78811, 42711, 0, 0, 0, 0, 92746, + 9995, 1655, 70131, 78818, 78815, 12479, 0, 0, 0, 70513, 42797, 0, 0, + 128371, 43112, 0, 43488, 0, 0, 0, 42684, 0, 0, 0, 0, 0, 128308, 0, 0, 0, + 0, 0, 0, 11031, 0, 0, 0, 70386, 10348, 10412, 0, 0, 74329, 0, 0, 0, + 129026, 0, 0, 0, 8810, 0, 686, 0, 0, 0, 0, 0, 110709, 0, 0, 12040, 0, 0, + 65118, 110704, 0, 118891, 110599, 0, 110598, 0, 120543, 983660, 0, 65455, + 74413, 94097, 0, 119129, 0, 0, 0, 78776, 0, 64467, 10300, 10161, 10396, + 0, 0, 0, 0, 78773, 0, 0, 0, 1458, 0, 0, 72429, 65120, 11479, 0, 0, 6350, + 0, 0, 71473, 1061, 69787, 9115, 43111, 0, 0, 0, 0, 983960, 0, 120907, + 1045, 0, 73913, 983564, 0, 0, 0, 0, 0, 0, 8486, 0, 0, 0, 4362, 0, 0, + 93054, 1025, 0, 0, 0, 0, 0, 92328, 128206, 0, 1774, 0, 122913, 0, 0, 0, + 11207, 0, 0, 3988, 0, 0, 983048, 0, 0, 8564, 983958, 0, 0, 0, 0, 0, 0, + 66513, 6256, 0, 579, 55218, 0, 0, 0, 127337, 0, 11814, 0, 4488, 128716, + 127336, 0, 10444, 118846, 78238, 0, 0, 127331, 4487, 127849, 42832, 1032, + 0, 43450, 0, 70155, 0, 614, 0, 127325, 0, 0, 128466, 0, 127323, 0, + 127322, 0, 0, 0, 1050, 7549, 127319, 0, 9314, 0, 0, 0, 0, 0, 70434, + 127314, 12527, 66504, 0, 0, 0, 0, 64333, 127312, 128547, 92594, 0, 0, 0, + 129316, 0, 124960, 10360, 6746, 0, 0, 0, 0, 13085, 9233, 0, 0, 0, 0, 0, + 0, 92766, 0, 121114, 983925, 74212, 42819, 10910, 0, 68044, 9896, 0, 0, + 120915, 0, 0, 7970, 0, 0, 0, 0, 113699, 9849, 0, 122910, 0, 0, 10487, + 69714, 0, 10103, 0, 4769, 0, 0, 0, 2283, 0, 0, 74785, 0, 0, 0, 110595, + 110596, 0, 110594, 64565, 4773, 0, 0, 0, 4770, 0, 0, 0, 65457, 69441, 0, + 0, 127338, 983593, 4774, 0, 68497, 2259, 0, 0, 10215, 0, 0, 0, 0, 0, + 74776, 92160, 4768, 0, 0, 4099, 0, 110699, 110700, 110697, 2225, 0, 0, 0, + 0, 125217, 11255, 42814, 880, 0, 0, 0, 0, 0, 67756, 65246, 0, 0, 129463, + 7095, 0, 0, 0, 0, 0, 0, 2427, 0, 7093, 0, 11585, 0, 9962, 0, 12223, 0, + 78211, 1434, 42939, 0, 11573, 0, 0, 0, 121257, 0, 0, 0, 0, 74437, 0, + 113711, 917596, 0, 8740, 0, 3782, 64331, 0, 65167, 1014, 0, 0, 0, 10835, + 0, 0, 0, 0, 0, 0, 118824, 7302, 0, 67707, 0, 1150, 10547, 0, 0, 68427, 0, + 0, 0, 0, 118788, 0, 0, 0, 42257, 8010, 0, 0, 0, 9643, 0, 0, 12864, 0, 0, + 0, 0, 0, 0, 0, 0, 1426, 68217, 0, 68447, 0, 0, 0, 0, 73701, 0, 0, 0, + 65383, 0, 0, 0, 0, 0, 0, 43196, 43194, 92549, 10744, 0, 990, 93772, 0, 0, + 0, 0, 0, 66470, 0, 0, 0, 3945, 0, 0, 0, 0, 0, 127546, 127746, 1020, + 73763, 92257, 0, 0, 64748, 0, 0, 10205, 0, 0, 10016, 0, 74051, 0, 43242, + 125096, 2667, 0, 125037, 0, 9911, 0, 0, 10097, 0, 0, 0, 118836, 0, 0, 0, + 0, 68889, 10159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 983338, 92291, 0, 127973, + 72882, 0, 1041, 127182, 6354, 0, 65364, 0, 0, 0, 72884, 0, 128477, 0, + 65906, 127819, 72883, 0, 128470, 5375, 72881, 0, 8215, 0, 10074, 0, 0, 0, + 69899, 0, 0, 121426, 41382, 0, 0, 5173, 65348, 527, 0, 0, 0, 128250, 0, + 0, 0, 0, 0, 0, 42695, 0, 42250, 0, 11187, 113695, 0, 1568, 66806, 0, 0, + 113705, 0, 0, 129487, 0, 0, 128839, 9069, 6144, 0, 0, 0, 0, 66783, 0, + 74027, 118934, 66787, 74580, 0, 110790, 6364, 0, 66794, 43508, 0, 92612, + 0, 0, 0, 0, 128405, 66449, 0, 0, 0, 0, 70714, 0, 70716, 0, 1044, 42411, + 0, 0, 0, 0, 43239, 0, 0, 0, 0, 42450, 0, 0, 68479, 119237, 0, 0, 0, 0, 0, + 69956, 11537, 0, 121206, 0, 0, 0, 0, 1057, 566, 0, 0, 10907, 42274, + 43464, 0, 0, 0, 78472, 71207, 42636, 0, 123603, 0, 0, 0, 64659, 0, + 127749, 0, 6357, 6362, 0, 0, 2216, 9090, 0, 0, 0, 0, 68227, 0, 0, 0, 0, + 1053, 12830, 0, 0, 0, 1052, 1051, 459, 1060, 0, 66479, 0, 0, 0, 128061, + 42490, 689, 6508, 4163, 42298, 8639, 983333, 4246, 0, 43514, 42362, 0, + 42337, 64596, 0, 0, 0, 0, 0, 6359, 0, 43471, 0, 0, 0, 127274, 0, 6358, + 6361, 1926, 6356, 0, 7898, 0, 10935, 0, 127972, 121285, 0, 43685, 0, 0, + 42910, 0, 8693, 0, 0, 44010, 0, 120991, 121454, 0, 0, 0, 0, 129514, 0, 0, + 0, 0, 73947, 0, 129361, 92412, 0, 66477, 0, 0, 0, 43854, 71913, 0, 0, 0, + 0, 72227, 65899, 92275, 0, 0, 0, 68887, 0, 71057, 0, 0, 0, 0, 119183, + 2923, 10853, 0, 0, 0, 0, 72864, 0, 72773, 72772, 0, 120801, 65251, 0, + 68228, 0, 128548, 0, 0, 5370, 70465, 2931, 73848, 0, 10188, 0, 118848, 0, + 983923, 0, 0, 0, 72212, 0, 10844, 121016, 128195, 92424, 0, 0, 0, 286, 0, + 1062, 0, 0, 0, 7395, 0, 1070, 128993, 0, 6095, 0, 0, 0, 127796, 126465, + 64497, 0, 0, 0, 0, 70054, 8189, 78272, 0, 0, 0, 0, 0, 113783, 42102, + 78276, 0, 0, 42101, 0, 78402, 67427, 33, 67425, 67424, 10824, 67430, + 67429, 67428, 427, 64723, 0, 0, 0, 0, 1031, 0, 0, 42104, 0, 0, 2328, 0, + 1071, 42899, 128486, 0, 7673, 0, 0, 1047, 0, 0, 42908, 0, 0, 10651, 0, 0, + 0, 72433, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13216, 0, 69716, 0, 0, 0, + 0, 0, 92411, 69654, 0, 0, 0, 2761, 194834, 0, 0, 0, 0, 8643, 0, 0, 94021, + 2757, 11067, 0, 74498, 8910, 10689, 0, 0, 0, 71173, 0, 9196, 71214, 0, 0, + 0, 0, 118911, 0, 0, 0, 0, 0, 0, 0, 0, 68130, 119616, 0, 0, 42477, 0, 0, + 4495, 0, 0, 0, 0, 70080, 10992, 0, 0, 0, 0, 9318, 0, 6002, 0, 73808, 0, + 92601, 42249, 7639, 43995, 0, 0, 5454, 0, 0, 0, 0, 0, 0, 0, 121189, 0, + 119173, 0, 9704, 120686, 0, 78436, 78435, 11204, 0, 0, 1731, 0, 92937, 0, + 67990, 0, 0, 0, 126576, 127018, 0, 55265, 0, 0, 0, 0, 127257, 73826, 0, + 3840, 0, 41432, 0, 0, 68430, 0, 43253, 128284, 0, 3371, 92936, 0, 0, + 1479, 0, 0, 1109, 77997, 0, 129154, 0, 92782, 0, 0, 8868, 399, 67978, + 74842, 0, 0, 194839, 0, 551, 0, 10156, 0, 92572, 0, 2544, 65074, 0, 0, 0, + 0, 0, 0, 0, 128713, 0, 0, 74268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68045, 0, + 0, 0, 3447, 0, 0, 121414, 2549, 110818, 0, 0, 43564, 8946, 0, 74411, + 66864, 0, 70480, 7980, 0, 113698, 0, 119653, 66489, 0, 64695, 128063, 0, + 0, 0, 0, 0, 0, 43452, 0, 92993, 0, 10919, 0, 67810, 0, 0, 0, 0, 6450, + 10055, 0, 0, 0, 0, 42720, 0, 9626, 0, 128055, 74447, 0, 125127, 92573, 0, + 0, 0, 119075, 0, 0, 66486, 0, 0, 0, 0, 0, 0, 75028, 983864, 74839, 0, 0, + 0, 0, 0, 55286, 0, 1055, 917628, 0, 0, 0, 70516, 12146, 0, 73956, 66488, + 0, 0, 0, 0, 0, 0, 42518, 0, 0, 0, 7407, 74978, 0, 0, 0, 0, 0, 0, 0, + 10231, 0, 66626, 0, 0, 92951, 0, 65927, 0, 0, 69696, 0, 92389, 0, 0, 0, + 68095, 92950, 0, 10555, 0, 0, 9091, 10798, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 43222, 0, 74982, 0, 0, 120952, 0, 0, 2992, 7826, 74321, 0, 125103, 74981, + 92628, 0, 0, 128289, 128203, 4361, 129597, 1306, 78770, 1497, 983628, 0, + 0, 0, 8248, 0, 127253, 7973, 128706, 0, 0, 73122, 983930, 0, 0, 2963, + 120653, 0, 128554, 0, 0, 64258, 0, 0, 69677, 74983, 65103, 0, 0, 42625, + 0, 0, 0, 0, 64905, 0, 9512, 0, 119076, 6443, 983262, 0, 9135, 0, 0, + 123202, 0, 0, 983863, 93788, 0, 0, 0, 93767, 64256, 0, 11669, 0, 0, 4524, 0, 129182, 128390, 0, 74266, 0, 0, 0, 70119, 78410, 69809, 121031, 55219, 69815, 93765, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2986, 0, 93763, 3437, 0, 6203, 4247, 0, 11920, 8274, 68240, 0, 1657, 0, 121276, 0, 0, 2954, 43506, - 42837, 0, 0, 71179, 0, 0, 0, 66476, 68450, 0, 0, 0, 43362, 983134, 0, - 11705, 0, 0, 0, 127354, 0, 11710, 0, 0, 0, 0, 74429, 0, 0, 1058, 0, 0, 0, - 0, 1144, 0, 0, 0, 0, 0, 118972, 0, 65322, 0, 6441, 0, 0, 2547, 66484, - 43634, 0, 5871, 0, 0, 0, 0, 0, 0, 71204, 0, 0, 1865, 0, 0, 69950, 0, 0, - 0, 0, 71199, 65826, 2069, 0, 119092, 43999, 2997, 0, 126588, 0, 65319, 0, - 12316, 0, 0, 0, 8776, 0, 0, 66294, 13130, 0, 71191, 126625, 0, 10030, - 11709, 12364, 983834, 0, 11704, 0, 0, 68672, 0, 0, 0, 0, 11706, 9710, 0, - 82985, 0, 413, 65623, 0, 0, 0, 74446, 0, 1042, 0, 128378, 12171, 119240, - 0, 0, 4984, 0, 708, 11391, 0, 0, 0, 983911, 1308, 0, 3673, 810, 0, - 120933, 0, 0, 0, 1917, 3000, 0, 0, 0, 65628, 66387, 74470, 0, 0, 0, - 10027, 0, 0, 0, 0, 128831, 983167, 2980, 755, 0, 0, 65622, 0, 121012, - 7277, 121022, 0, 0, 0, 0, 8730, 0, 0, 0, 7274, 119250, 0, 7275, 0, 935, - 0, 0, 377, 42325, 121103, 0, 0, 127075, 0, 0, 0, 74911, 2417, 0, 0, - 19912, 0, 0, 0, 0, 0, 0, 0, 7248, 0, 0, 1781, 5496, 3627, 62, 1649, 0, - 964, 0, 0, 0, 0, 92897, 0, 0, 127364, 0, 43689, 127911, 66287, 78812, - 64389, 66575, 0, 73041, 0, 0, 0, 7677, 2991, 0, 0, 0, 0, 72201, 0, 11341, - 128346, 0, 65625, 9714, 11692, 0, 0, 120850, 6478, 10195, 43673, 65237, - 6241, 0, 0, 0, 6238, 0, 0, 0, 4409, 0, 0, 67170, 0, 0, 0, 94047, 6237, - 5461, 66851, 9176, 92882, 121341, 65231, 0, 0, 121182, 128468, 0, 44018, - 0, 64765, 0, 0, 0, 5685, 0, 2461, 0, 7091, 0, 0, 0, 68163, 0, 73030, 0, - 0, 73928, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68506, 0, 0, 0, 0, 0, 2542, 0, 0, 0, - 128176, 5776, 0, 0, 0, 0, 0, 11987, 0, 0, 75036, 68744, 0, 0, 10039, - 42828, 0, 0, 0, 0, 0, 10721, 67664, 43433, 0, 0, 41875, 0, 41870, 266, - 129066, 0, 41873, 71271, 0, 0, 0, 0, 0, 0, 41871, 66186, 3734, 7734, - 43683, 8750, 110600, 66011, 92899, 0, 127937, 0, 0, 10572, 0, 42906, 0, - 64349, 7287, 0, 0, 0, 0, 11167, 69220, 0, 43429, 0, 1697, 0, 0, 68633, - 7286, 0, 128738, 10031, 78754, 0, 68645, 8620, 0, 42162, 0, 0, 7285, 0, - 119577, 0, 66842, 43677, 41583, 0, 65799, 129332, 0, 0, 0, 0, 110806, 0, - 3609, 0, 0, 0, 125116, 0, 128108, 73948, 0, 0, 0, 0, 129189, 42732, - 92699, 74984, 68620, 11691, 74985, 0, 0, 0, 0, 0, 6348, 243, 74075, 0, 0, - 92309, 128029, 0, 0, 10648, 8538, 43687, 0, 0, 0, 70515, 0, 118954, - 92886, 13307, 0, 92891, 0, 120770, 0, 0, 0, 0, 0, 214, 0, 0, 0, 65893, 0, - 120488, 128386, 0, 92893, 0, 2603, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, - 0, 0, 1016, 0, 0, 0, 3885, 92, 65456, 64608, 0, 0, 0, 70656, 113742, 0, - 0, 0, 128128, 983838, 0, 0, 6791, 983842, 127960, 0, 0, 0, 118976, 0, - 7328, 92358, 0, 7995, 8759, 43421, 0, 68029, 0, 0, 125272, 0, 3197, 0, 0, - 0, 983150, 0, 11595, 0, 0, 43435, 0, 0, 0, 0, 0, 70660, 0, 741, 83291, - 5494, 0, 70668, 1990, 11107, 4498, 0, 0, 70658, 0, 0, 2960, 73779, 0, - 8969, 0, 43424, 0, 0, 2950, 0, 0, 129035, 370, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 122900, 0, 0, 0, 0, 2964, 43663, 0, 6344, 0, 0, 10144, 0, 8252, 729, - 66016, 78446, 0, 0, 0, 78740, 43669, 9032, 0, 0, 0, 0, 0, 0, 0, 0, 74612, - 3761, 0, 0, 0, 0, 0, 0, 3850, 0, 0, 128389, 0, 0, 0, 0, 8611, 0, 0, 0, - 43691, 125032, 0, 41802, 120540, 0, 0, 0, 0, 0, 3848, 0, 113800, 127536, - 0, 0, 0, 983270, 663, 0, 0, 0, 0, 0, 0, 0, 0, 13221, 0, 0, 0, 0, 0, - 121348, 0, 65579, 12980, 68046, 12143, 0, 128067, 0, 43441, 41804, 0, 0, - 0, 0, 0, 0, 66329, 0, 0, 0, 0, 125038, 0, 129383, 0, 0, 0, 983871, 0, 0, - 0, 0, 0, 1097, 129033, 0, 0, 0, 93828, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 13110, 0, 983867, 68229, 1000, 0, 0, 0, 1209, 0, 0, 0, 1073, 6321, 77878, - 0, 0, 68213, 0, 12167, 0, 0, 0, 0, 127784, 121500, 0, 121501, 0, 6587, 0, - 0, 0, 9231, 0, 2959, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68768, 0, 0, 68434, 0, - 70742, 0, 0, 12290, 0, 0, 110801, 0, 77873, 8205, 110803, 5131, 0, 0, 0, - 0, 0, 0, 1944, 78453, 0, 0, 119990, 119991, 12701, 78492, 11308, 119995, - 0, 113702, 66836, 119999, 74263, 92382, 120002, 120003, 7075, 120005, - 120006, 120007, 41817, 75063, 42275, 120011, 120012, 120013, 120014, - 120015, 6041, 0, 41899, 0, 8002, 0, 41902, 0, 0, 64332, 0, 7813, 119117, - 0, 41900, 120633, 0, 7281, 78455, 7279, 12041, 93027, 0, 12673, 0, - 129123, 9660, 0, 72984, 0, 0, 0, 0, 92901, 2970, 0, 0, 0, 77870, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3486, 0, 0, 0, 0, 127799, 0, 0, 0, 69920, 0, 66834, 0, - 983987, 0, 68312, 0, 65673, 1019, 78495, 4148, 0, 12289, 0, 4316, 0, - 13119, 983913, 0, 0, 0, 0, 0, 0, 43434, 41865, 128218, 9163, 8659, 9072, - 5867, 13302, 7622, 7120, 0, 0, 0, 0, 7400, 5416, 0, 0, 10817, 0, 0, 0, 0, - 68162, 41855, 41867, 0, 983224, 0, 11536, 0, 0, 7115, 0, 0, 5498, 7337, - 41536, 0, 0, 92587, 7221, 8997, 0, 0, 0, 0, 0, 0, 127814, 0, 0, 0, 0, 0, - 295, 0, 0, 0, 0, 121292, 0, 43454, 63903, 63902, 63901, 0, 3971, 0, 0, - 2952, 0, 11038, 10901, 63900, 63899, 63898, 5198, 667, 43273, 63887, - 63886, 128458, 78521, 66830, 0, 92714, 4159, 0, 0, 63885, 63884, 63883, - 63882, 63880, 8555, 63878, 63877, 93057, 0, 0, 63881, 10746, 0, 0, 0, - 63876, 63875, 63874, 63873, 7432, 1913, 41913, 63852, 0, 128971, 0, - 983875, 0, 446, 41911, 0, 63851, 63850, 41910, 0, 63846, 2972, 63844, - 7262, 0, 63849, 63848, 63847, 72990, 6570, 0, 7259, 63842, 4178, 63840, - 121321, 41521, 63894, 63893, 63892, 0, 0, 1105, 4180, 0, 12094, 0, 0, - 63891, 63890, 63889, 63888, 0, 0, 0, 0, 1678, 0, 66909, 0, 0, 0, 0, - 11192, 128360, 128404, 9159, 70089, 63861, 63860, 63859, 63858, 63865, - 1615, 63863, 63862, 0, 0, 0, 0, 63857, 63856, 71902, 0, 1077, 0, 65099, - 0, 0, 0, 0, 0, 0, 42773, 121331, 0, 0, 119220, 120912, 0, 0, 1112, - 119122, 8686, 0, 0, 65081, 0, 0, 0, 11077, 0, 7260, 0, 5327, 0, 63870, - 63869, 3847, 63867, 0, 2903, 0, 3001, 66762, 0, 43746, 0, 63866, 0, 0, 0, - 0, 0, 0, 68420, 2990, 0, 128254, 0, 0, 0, 0, 1117, 118987, 12212, 0, - 129151, 63836, 63835, 63834, 0, 0, 63839, 63838, 63837, 0, 125095, 63833, - 6042, 66360, 0, 74808, 0, 63821, 63820, 63819, 63818, 0, 0, 9047, 63822, - 128328, 6091, 0, 10691, 0, 74344, 8226, 0, 63812, 63811, 63810, 63809, - 2289, 63815, 63814, 63813, 6047, 0, 0, 780, 63808, 77925, 77922, 65147, - 63931, 63930, 2076, 1093, 9882, 63934, 2082, 63932, 75050, 63929, 63928, - 63927, 77934, 9806, 65566, 77933, 63922, 63921, 2086, 0, 63926, 2984, - 5968, 63923, 0, 0, 129458, 11137, 13169, 5290, 2089, 0, 63827, 1088, - 63825, 7268, 1084, 1085, 63829, 1083, 10131, 7283, 0, 0, 0, 1092, 0, - 7273, 0, 44016, 43627, 0, 0, 0, 11809, 0, 0, 0, 2965, 7258, 8808, 0, - 1089, 7278, 63937, 63936, 43405, 11106, 940, 5787, 10099, 63938, 0, - 63897, 126123, 2994, 0, 0, 0, 121041, 77939, 77940, 77937, 77938, 74343, - 93043, 72704, 660, 10127, 666, 0, 5532, 43667, 5533, 77941, 0, 0, 0, 979, - 0, 0, 72706, 92652, 9108, 0, 128374, 0, 63951, 71685, 0, 0, 128782, - 63946, 1707, 983824, 128612, 63950, 63949, 63948, 63947, 63945, 6038, - 63943, 63942, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73884, 0, 1690, 63919, 63918, - 63917, 70865, 43659, 0, 983829, 0, 2054, 0, 78515, 63916, 9184, 63914, - 69737, 63911, 63910, 63909, 63908, 0, 0, 63913, 6044, 0, 0, 9061, 5534, - 10672, 11653, 124932, 5531, 0, 0, 0, 0, 0, 0, 11957, 0, 68668, 0, 0, 0, - 10474, 43426, 0, 42354, 0, 0, 0, 0, 0, 8413, 66841, 0, 7269, 7272, 0, 0, - 0, 125008, 78460, 0, 0, 0, 0, 126639, 0, 0, 0, 66840, 0, 0, 128441, 0, 0, - 0, 92187, 7270, 0, 0, 6628, 1076, 128700, 0, 0, 0, 0, 0, 0, 12807, 43413, - 63906, 4548, 63904, 71187, 70393, 41729, 44005, 1307, 0, 0, 0, 0, 0, - 128268, 0, 8180, 0, 127778, 0, 0, 5413, 43681, 0, 3493, 0, 0, 0, 92544, - 73937, 10517, 0, 4518, 10990, 0, 5167, 4481, 3771, 0, 2710, 0, 66277, 0, - 0, 43073, 0, 0, 0, 0, 0, 0, 119659, 1628, 0, 0, 0, 65262, 66809, 10783, - 11172, 0, 0, 70840, 113679, 0, 119029, 0, 0, 41530, 66843, 4457, 0, 0, 0, - 0, 0, 41529, 0, 0, 6031, 65807, 70814, 0, 0, 0, 69705, 0, 0, 11926, 6033, - 9656, 0, 0, 0, 68869, 0, 128930, 0, 128100, 0, 42612, 43655, 0, 0, 0, - 66468, 0, 0, 68623, 0, 0, 0, 0, 120869, 983343, 0, 0, 1151, 0, 0, 127544, - 0, 71106, 0, 0, 0, 0, 0, 0, 0, 11527, 118870, 0, 0, 11538, 127387, 0, - 11020, 0, 66467, 0, 8087, 71700, 0, 9894, 0, 0, 70824, 120854, 0, 78513, - 8053, 0, 0, 0, 0, 120495, 0, 0, 63845, 0, 0, 78602, 0, 13084, 70170, - 8741, 0, 0, 0, 0, 64605, 83051, 0, 473, 43415, 0, 0, 119271, 1087, - 124966, 71275, 0, 0, 66439, 43218, 0, 0, 7237, 0, 0, 0, 0, 0, 92261, 0, - 121036, 4384, 74220, 983779, 2058, 917561, 0, 0, 0, 0, 0, 3857, 0, 0, 0, - 64630, 0, 0, 74168, 0, 125088, 4421, 0, 0, 0, 66400, 0, 68431, 0, 0, 0, - 83053, 0, 0, 69640, 127861, 0, 437, 0, 0, 0, 0, 65236, 13290, 119180, - 4997, 64306, 0, 0, 4999, 0, 0, 0, 4711, 120769, 0, 2739, 0, 92915, 74834, - 0, 127175, 0, 0, 0, 0, 0, 1779, 6600, 6601, 0, 5325, 0, 128437, 13058, 0, - 0, 0, 92186, 0, 71845, 10575, 43399, 0, 0, 0, 1104, 0, 0, 10655, 0, 0, 0, - 0, 1082, 110878, 0, 67401, 0, 0, 0, 0, 6783, 0, 0, 42867, 69655, 44021, - 6458, 0, 0, 0, 0, 0, 0, 1273, 43407, 0, 0, 0, 0, 1313, 6322, 41720, - 128627, 66433, 0, 0, 0, 11216, 0, 0, 0, 43437, 93833, 0, 0, 0, 5122, 0, - 72728, 129520, 70161, 0, 0, 0, 0, 0, 8303, 0, 128926, 0, 10003, 0, 0, 0, - 1686, 0, 0, 42834, 3664, 0, 126088, 121346, 0, 0, 4324, 126, 0, 0, 0, 0, - 0, 65166, 0, 0, 0, 0, 43817, 0, 43822, 0, 0, 65600, 13002, 0, 0, 0, 1103, - 0, 119575, 0, 0, 13078, 0, 8116, 0, 2050, 0, 0, 1102, 0, 6555, 0, 0, - 74003, 74794, 0, 0, 42591, 127278, 0, 1111, 0, 75047, 4707, 0, 0, 0, 0, - 43468, 4522, 8645, 0, 74857, 0, 11352, 0, 0, 0, 2293, 0, 0, 0, 128265, - 71709, 0, 0, 0, 93827, 0, 0, 0, 128488, 0, 160, 2677, 0, 0, 120141, 0, 0, - 70790, 0, 42770, 0, 0, 0, 43821, 113769, 0, 0, 43816, 0, 0, 1079, 3867, - 64817, 0, 0, 0, 0, 64768, 0, 0, 4005, 983211, 0, 10991, 0, 92957, 917578, - 917581, 917580, 917575, 128314, 917577, 917576, 917571, 78534, 917573, - 917572, 0, 0, 128359, 73458, 0, 3339, 11448, 1106, 917591, 917590, - 917593, 3340, 917587, 917586, 917589, 917588, 917583, 10605, 1309, 74996, - 120743, 92650, 0, 0, 9485, 0, 0, 0, 0, 0, 125002, 92533, 128487, 0, - 129285, 4338, 11238, 0, 66825, 0, 0, 0, 0, 0, 0, 74128, 0, 0, 92522, 0, - 129438, 9553, 1590, 63777, 63776, 128677, 63782, 63781, 63780, 63779, - 1583, 0, 0, 0, 0, 128011, 0, 0, 41522, 0, 92168, 983784, 66759, 0, - 983584, 0, 0, 0, 0, 11394, 0, 983071, 0, 66823, 1334, 0, 4479, 0, 0, - 120663, 0, 122883, 10497, 0, 0, 983777, 66828, 0, 0, 0, 6809, 63786, 0, - 0, 63791, 63790, 1145, 63788, 119143, 63785, 63784, 63783, 10192, 65267, - 0, 0, 8928, 0, 0, 0, 0, 0, 74216, 66805, 0, 0, 63759, 63758, 3523, 1074, - 0, 121340, 74077, 0, 0, 0, 63757, 43145, 63755, 63754, 63752, 1349, - 63750, 63749, 0, 0, 0, 63753, 63802, 41084, 72784, 0, 41930, 63805, - 63804, 11140, 63801, 41082, 43843, 42787, 0, 0, 0, 0, 63793, 63792, 0, - 128241, 10201, 12238, 63795, 42358, 92394, 43862, 0, 0, 41932, 66826, 0, - 0, 0, 121136, 0, 7950, 63772, 63771, 63770, 0, 63767, 63766, 2793, 63764, - 0, 128501, 63769, 9530, 0, 92398, 0, 128642, 63763, 63762, 4595, 63760, - 792, 0, 0, 0, 8742, 0, 0, 0, 63744, 0, 0, 120815, 63748, 63747, 63746, - 63745, 5055, 0, 0, 1090, 0, 125268, 11665, 0, 4558, 0, 72211, 0, 0, 0, - 11513, 0, 6157, 63775, 63774, 63773, 0, 12170, 9067, 0, 0, 10872, 129643, - 43891, 43893, 43892, 0, 43933, 0, 128231, 0, 0, 0, 0, 0, 11063, 0, 43888, - 0, 0, 128368, 43889, 0, 73807, 983104, 7386, 0, 0, 70295, 0, 0, 0, 71201, - 128460, 0, 0, 0, 0, 69915, 2918, 66820, 65300, 0, 127859, 64726, 2790, 0, - 3793, 42065, 127829, 0, 0, 0, 0, 0, 0, 0, 92712, 0, 12923, 5270, 0, 0, 0, - 65813, 0, 128499, 0, 75012, 0, 10888, 0, 93997, 0, 3330, 129417, 0, 0, 0, - 0, 0, 8220, 0, 0, 0, 0, 1627, 0, 0, 0, 5371, 118938, 0, 1826, 118794, 0, - 0, 70023, 0, 0, 0, 71108, 0, 0, 0, 0, 92207, 68125, 74898, 0, 0, 0, + 42837, 0, 0, 71179, 0, 0, 0, 66476, 68450, 0, 0, 0, 43362, 983134, + 129596, 11705, 0, 0, 0, 127354, 0, 11710, 0, 0, 0, 0, 74429, 0, 0, 1058, + 0, 0, 0, 0, 1144, 0, 0, 0, 0, 0, 118972, 0, 65322, 0, 6441, 0, 0, 2547, + 66484, 43634, 0, 5871, 0, 0, 0, 0, 0, 0, 71204, 0, 0, 1865, 0, 0, 69950, + 0, 0, 73713, 0, 71199, 65826, 2069, 0, 119092, 43999, 2997, 0, 126588, 0, + 65319, 0, 12316, 0, 0, 123630, 8776, 0, 0, 66294, 13130, 0, 71191, + 126625, 0, 10030, 11709, 12364, 983834, 0, 11704, 0, 0, 68672, 0, 0, 0, + 0, 11706, 9710, 0, 82985, 0, 413, 65623, 0, 0, 0, 74446, 0, 1042, 0, + 128378, 12171, 119240, 0, 0, 4984, 0, 708, 11391, 0, 0, 0, 983911, 1308, + 0, 3673, 810, 0, 120933, 0, 0, 0, 1917, 3000, 0, 0, 0, 65628, 66387, + 74470, 0, 0, 0, 10027, 0, 0, 0, 0, 128831, 983167, 2980, 755, 0, 0, + 65622, 0, 121012, 7277, 121022, 0, 0, 0, 0, 8730, 0, 0, 0, 7274, 119250, + 0, 7275, 0, 935, 0, 0, 377, 42325, 121103, 0, 0, 127075, 0, 0, 0, 74911, + 2417, 0, 0, 19912, 0, 0, 0, 0, 0, 0, 0, 7248, 0, 0, 1781, 5496, 3627, 62, + 1649, 0, 964, 0, 0, 0, 0, 92897, 0, 0, 127364, 0, 43689, 127911, 66287, + 78812, 64389, 66575, 0, 73041, 0, 0, 0, 7677, 2991, 0, 0, 0, 0, 72201, 0, + 11341, 127049, 0, 65625, 9714, 11692, 0, 0, 120850, 6478, 10195, 43673, + 65237, 6241, 0, 0, 0, 6238, 0, 0, 0, 4409, 0, 0, 67170, 0, 0, 0, 94047, + 6237, 5461, 66851, 9176, 92882, 121341, 65231, 0, 0, 121182, 128468, 0, + 44018, 0, 64765, 0, 0, 0, 5685, 0, 2461, 0, 7091, 0, 0, 0, 68163, 0, + 73030, 0, 0, 73928, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68506, 0, 0, 0, 0, 0, + 2542, 0, 0, 0, 128176, 5776, 0, 0, 0, 0, 0, 11987, 0, 0, 75036, 68744, 0, + 0, 10039, 42828, 0, 0, 0, 0, 0, 10721, 67664, 43433, 0, 0, 41875, 0, + 41870, 266, 129066, 0, 41873, 71271, 0, 0, 0, 0, 0, 0, 41871, 66186, + 3734, 7734, 43683, 8750, 110600, 66011, 92899, 0, 127937, 0, 0, 10572, 0, + 42906, 0, 64349, 7287, 0, 0, 0, 0, 11167, 69220, 0, 43429, 0, 1697, 0, 0, + 68633, 7286, 0, 128738, 10031, 78754, 0, 68645, 8620, 0, 42162, 0, 0, + 7285, 0, 119577, 0, 66842, 43677, 41583, 0, 65799, 129332, 0, 0, 0, 0, + 110806, 0, 3609, 0, 129448, 0, 125116, 126254, 128108, 73948, 0, 0, 0, 0, + 129189, 42732, 92699, 74984, 68620, 11691, 74985, 0, 0, 0, 0, 0, 6348, + 243, 74075, 0, 0, 92309, 123585, 0, 0, 10648, 8538, 43687, 0, 0, 0, + 70515, 0, 118954, 92886, 13307, 129573, 92891, 0, 120770, 983831, 0, 0, + 0, 0, 214, 0, 0, 0, 65893, 0, 120488, 128386, 0, 92893, 0, 2603, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, 1016, 0, 0, 0, 3885, 92, 65456, 64608, + 0, 0, 0, 70656, 113742, 0, 0, 0, 128128, 983838, 0, 0, 6791, 983842, + 127960, 0, 0, 0, 118976, 0, 7328, 92358, 0, 7995, 8759, 43421, 0, 68029, + 0, 0, 125272, 0, 3197, 0, 0, 0, 983150, 0, 11595, 0, 0, 43435, 0, 0, 0, + 0, 0, 70660, 0, 741, 83291, 5494, 0, 70668, 1990, 11107, 4498, 0, 0, + 70658, 0, 0, 2960, 73779, 0, 8969, 0, 43424, 0, 0, 2950, 0, 0, 129035, + 370, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122900, 0, 0, 0, 0, 2964, 43663, 0, + 6344, 0, 0, 10144, 0, 8252, 729, 66016, 78446, 0, 0, 0, 78740, 43669, + 9032, 0, 0, 0, 0, 0, 0, 0, 0, 74612, 3761, 0, 0, 0, 0, 0, 0, 3850, 0, 0, + 128389, 0, 0, 0, 0, 8611, 0, 0, 0, 43691, 125032, 0, 41802, 120540, 0, 0, + 0, 0, 0, 3848, 0, 113800, 127536, 0, 0, 0, 983270, 663, 0, 0, 0, 0, 0, 0, + 0, 0, 13221, 0, 0, 0, 0, 0, 121348, 0, 65579, 12980, 68046, 12143, 0, + 128067, 0, 43441, 41804, 0, 0, 0, 0, 0, 0, 66329, 0, 72324, 0, 0, 125038, + 0, 129383, 0, 0, 0, 983871, 0, 0, 0, 0, 0, 1097, 129033, 0, 0, 0, 93828, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13110, 0, 983867, 68229, 1000, 0, 0, 0, + 1209, 0, 0, 0, 1073, 6321, 77878, 0, 0, 68213, 0, 12167, 0, 0, 0, 0, + 73673, 121500, 0, 121501, 0, 6587, 0, 0, 0, 9231, 0, 2959, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 42941, 0, 0, 68434, 0, 70742, 0, 0, 12290, 0, 0, 110801, + 0, 77873, 8205, 110803, 5131, 0, 0, 0, 0, 0, 0, 1944, 78453, 0, 0, + 119990, 119991, 12701, 78492, 11308, 119995, 0, 113702, 66836, 119999, + 74263, 92382, 120002, 120003, 7075, 120005, 120006, 120007, 41817, 75063, + 42275, 120011, 120012, 120013, 120014, 42943, 6041, 0, 41899, 0, 8002, 0, + 41902, 0, 0, 64332, 0, 7813, 119117, 0, 41900, 120633, 0, 7281, 78455, + 7279, 12041, 93027, 0, 12673, 0, 129123, 9660, 0, 72984, 0, 0, 0, 0, + 92901, 2970, 0, 0, 0, 77870, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3486, 0, 0, 0, 0, + 127799, 0, 0, 0, 69920, 0, 66834, 0, 983987, 0, 68312, 0, 65673, 1019, + 78495, 4148, 0, 12289, 0, 4316, 0, 13119, 983913, 0, 0, 0, 0, 0, 0, + 43434, 41865, 128218, 9163, 8659, 9072, 5867, 13302, 7622, 7120, 0, 0, 0, + 0, 7400, 5416, 0, 0, 10817, 0, 0, 0, 0, 68162, 41855, 41867, 0, 983224, + 0, 11536, 0, 0, 7115, 0, 0, 5498, 7337, 41536, 0, 0, 92587, 7221, 8997, + 0, 0, 0, 0, 0, 0, 127814, 0, 0, 0, 0, 0, 295, 0, 0, 0, 0, 121292, 0, + 43454, 63903, 63902, 63901, 0, 3971, 0, 0, 2952, 0, 11038, 10901, 63900, + 63899, 63898, 5198, 667, 43273, 63887, 63886, 128458, 78521, 66830, 0, + 92714, 4159, 0, 0, 63885, 63884, 63883, 63882, 63880, 8555, 63878, 63877, + 93057, 0, 0, 63881, 10746, 0, 118983, 0, 63876, 63875, 63874, 63873, + 7432, 1913, 41913, 63852, 0, 128971, 0, 983875, 0, 446, 41911, 0, 63851, + 63850, 41910, 0, 63846, 2972, 63844, 7262, 0, 63849, 63848, 63847, 72990, + 6570, 0, 7259, 63842, 4178, 63840, 121321, 41521, 63894, 63893, 63892, 0, + 0, 1105, 4180, 0, 7418, 0, 0, 63891, 63890, 63889, 63888, 0, 0, 0, 0, + 1678, 0, 66909, 0, 0, 0, 0, 11192, 128360, 128404, 9159, 70089, 63861, + 63860, 63859, 63858, 63865, 1615, 63863, 63862, 0, 0, 0, 0, 63857, 63856, + 71902, 0, 1077, 0, 65099, 0, 0, 0, 0, 0, 0, 42773, 121331, 0, 0, 119220, + 120912, 129564, 0, 1112, 119122, 8686, 0, 0, 65081, 0, 0, 0, 11077, 0, + 7260, 0, 5327, 0, 63870, 63869, 3847, 63867, 0, 2903, 0, 3001, 66762, 0, + 43746, 0, 63866, 0, 0, 0, 0, 0, 127785, 68420, 2990, 0, 128254, 0, 0, 0, + 0, 1117, 118987, 12212, 129003, 129151, 63836, 63835, 63834, 0, 0, 63839, + 63838, 63837, 0, 125095, 63833, 6042, 66360, 0, 74808, 0, 63821, 63820, + 63819, 63818, 0, 0, 9047, 63822, 128328, 6091, 0, 10691, 0, 74344, 8226, + 0, 63812, 63811, 63810, 63809, 2289, 63815, 63814, 63813, 6047, 0, 0, + 780, 63808, 77925, 77922, 65147, 63931, 63930, 2076, 1093, 9882, 63934, + 2082, 63932, 75050, 63929, 63928, 63927, 77934, 9806, 65566, 77933, + 63922, 63921, 2086, 0, 63926, 2984, 5968, 63923, 0, 0, 129458, 11137, + 13169, 5290, 2089, 0, 63827, 1088, 63825, 7268, 1084, 1085, 63829, 1083, + 10131, 7283, 0, 0, 0, 1092, 0, 7273, 983272, 44016, 43627, 0, 0, 0, + 11809, 0, 0, 0, 2965, 7258, 8808, 0, 1089, 7278, 63937, 63936, 43405, + 11106, 940, 5787, 10099, 63938, 0, 63897, 126123, 2994, 0, 0, 0, 121041, + 77939, 77940, 77937, 77938, 74343, 93043, 72704, 660, 10127, 666, 0, + 5532, 43667, 5533, 77941, 0, 0, 0, 979, 0, 0, 72706, 92652, 9108, 0, + 128374, 129403, 63951, 71685, 0, 0, 128782, 63946, 1707, 983824, 128612, + 63950, 63949, 63948, 63947, 63945, 6038, 63943, 63942, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 73884, 0, 1690, 63919, 63918, 63917, 70865, 43659, 0, 983829, + 0, 2054, 0, 78515, 63916, 9184, 63914, 69737, 63911, 63910, 63909, 63908, + 0, 0, 63913, 6044, 0, 0, 9061, 5534, 10672, 11653, 124932, 5531, 0, 0, 0, + 0, 0, 0, 11957, 0, 68668, 0, 0, 0, 10474, 43426, 0, 42354, 0, 0, 0, 0, 0, + 8413, 66841, 0, 7269, 7272, 0, 0, 0, 125008, 78460, 0, 0, 0, 0, 126639, + 0, 0, 0, 66840, 0, 0, 128441, 0, 0, 0, 92187, 7270, 0, 0, 6628, 1076, + 128700, 0, 0, 0, 0, 0, 0, 12807, 43413, 63906, 4548, 63904, 71187, 70393, + 41729, 44005, 1307, 0, 0, 0, 0, 0, 128268, 0, 8180, 0, 127778, 0, 0, + 5413, 43681, 123205, 3493, 0, 0, 0, 92544, 73937, 10517, 0, 4518, 10990, + 0, 5167, 4481, 3771, 0, 2710, 0, 66277, 0, 0, 43073, 0, 0, 0, 0, 0, 0, + 119659, 1628, 0, 0, 0, 65262, 66809, 10783, 11172, 0, 0, 70840, 113679, + 0, 119029, 0, 0, 41530, 66843, 4457, 0, 0, 0, 0, 0, 41529, 0, 0, 6031, + 65807, 70814, 0, 0, 0, 69705, 0, 0, 11926, 6033, 9656, 0, 0, 0, 68869, 0, + 128930, 0, 128100, 0, 42612, 43655, 0, 0, 0, 66468, 0, 0, 68623, 0, 0, 0, + 0, 120869, 983343, 0, 0, 1151, 0, 73709, 127544, 0, 71106, 0, 0, 0, 0, 0, + 0, 0, 11527, 118870, 0, 0, 11538, 127387, 0, 11020, 0, 66467, 0, 8087, + 71700, 0, 9894, 0, 0, 70824, 120854, 0, 78513, 8053, 0, 0, 0, 0, 120495, + 0, 0, 63845, 0, 0, 78602, 0, 13084, 70170, 8741, 0, 0, 0, 0, 64605, + 83051, 0, 473, 43415, 0, 0, 119271, 1087, 124966, 71275, 0, 0, 66439, + 43218, 0, 0, 7237, 0, 0, 0, 0, 0, 92261, 0, 121036, 4384, 74220, 983779, + 2058, 917561, 0, 0, 0, 0, 0, 3857, 0, 0, 0, 64630, 0, 0, 74168, 0, + 125088, 4421, 0, 0, 0, 66400, 0, 68431, 0, 0, 0, 83053, 0, 0, 69640, + 127861, 0, 437, 0, 0, 0, 0, 65236, 13290, 119180, 4997, 64306, 0, 0, + 4999, 0, 0, 0, 4711, 120769, 0, 2739, 0, 92915, 74834, 0, 127175, 0, 0, + 0, 0, 0, 1779, 6600, 6601, 0, 5325, 0, 128437, 13058, 0, 0, 0, 92186, 0, + 71845, 10575, 43399, 0, 0, 0, 1104, 0, 0, 10655, 0, 0, 0, 0, 1082, + 110878, 0, 67401, 0, 0, 0, 0, 6783, 0, 0, 42867, 69655, 44021, 6458, 0, + 0, 0, 0, 0, 0, 1273, 43407, 0, 0, 0, 0, 1313, 6322, 41720, 128627, 66433, + 0, 0, 0, 11216, 0, 0, 0, 43437, 93833, 0, 0, 0, 5122, 0, 72728, 129520, + 70161, 0, 0, 0, 0, 0, 8303, 0, 128926, 0, 10003, 0, 0, 0, 1686, 0, 0, + 42834, 3664, 0, 126088, 121346, 0, 0, 4324, 126, 0, 0, 0, 0, 0, 65166, 0, + 0, 0, 0, 43817, 0, 43822, 0, 0, 65600, 13002, 0, 0, 0, 1103, 0, 119575, + 0, 0, 13078, 0, 8116, 0, 2050, 0, 0, 1102, 0, 6555, 0, 0, 74003, 74794, + 0, 0, 42591, 127278, 0, 1111, 0, 75047, 4707, 0, 0, 0, 0, 43468, 4522, + 8645, 0, 74857, 0, 11352, 0, 0, 0, 2293, 0, 0, 0, 128265, 71709, 0, 0, 0, + 93827, 0, 0, 0, 128488, 0, 160, 2677, 0, 0, 120141, 0, 0, 70790, 0, + 42770, 0, 0, 0, 43821, 113769, 0, 0, 43816, 0, 0, 1079, 3867, 64817, 0, + 0, 0, 0, 64768, 0, 0, 4005, 983211, 0, 10991, 0, 92957, 917578, 917581, + 917580, 917575, 128314, 917577, 917576, 917571, 78534, 917573, 917572, 0, + 0, 128359, 73458, 0, 3339, 11448, 1106, 917591, 917590, 917593, 3340, + 917587, 917586, 917589, 917588, 917583, 10605, 1309, 74996, 120743, + 92650, 0, 0, 9485, 0, 0, 0, 0, 0, 125002, 92533, 128487, 0, 129285, 4338, + 11238, 0, 66825, 0, 0, 0, 0, 0, 0, 74128, 0, 0, 73680, 0, 129438, 9553, + 1590, 63777, 63776, 128677, 63782, 63781, 63780, 63779, 1583, 0, 0, 0, 0, + 128011, 0, 0, 41522, 0, 92168, 983784, 66759, 0, 983584, 0, 0, 0, 0, + 11394, 0, 983071, 0, 66823, 1334, 0, 4479, 0, 0, 120663, 0, 122883, + 10497, 0, 0, 983777, 66828, 0, 0, 0, 6809, 63786, 0, 0, 63791, 63790, + 1145, 63788, 119143, 63785, 63784, 63783, 10192, 65267, 0, 0, 8928, 0, 0, + 0, 0, 0, 74216, 66805, 0, 0, 63759, 63758, 3523, 1074, 0, 121340, 74077, + 0, 0, 0, 63757, 43145, 63755, 63754, 63752, 1349, 63750, 63749, 0, 0, 0, + 63753, 63802, 41084, 72784, 0, 41930, 63805, 63804, 11140, 63801, 41082, + 43843, 42787, 123197, 0, 0, 0, 63793, 63792, 0, 128241, 10201, 12238, + 63795, 42358, 92394, 43862, 0, 0, 41932, 66826, 0, 0, 0, 121136, 0, 7950, + 63772, 63771, 63770, 0, 63767, 63766, 2793, 63764, 0, 128501, 63769, + 9530, 0, 92398, 0, 128642, 63763, 63762, 4595, 63760, 792, 0, 0, 0, 8742, + 0, 0, 0, 63744, 0, 0, 120815, 63748, 63747, 63746, 63745, 5055, 0, 0, + 1090, 0, 125268, 11665, 127809, 4558, 0, 72211, 0, 0, 0, 11513, 0, 6157, + 63775, 63774, 63773, 0, 12170, 9067, 0, 0, 10872, 129643, 43891, 43893, + 43892, 0, 43933, 0, 128231, 0, 0, 0, 0, 0, 11063, 0, 43888, 0, 0, 128368, + 43889, 0, 73807, 983104, 7386, 0, 0, 70295, 0, 0, 0, 71201, 128460, 0, 0, + 0, 0, 69915, 2918, 66820, 65300, 0, 127859, 64726, 2790, 0, 3793, 42065, + 127829, 0, 129560, 0, 0, 0, 0, 0, 92712, 0, 12923, 5270, 0, 0, 0, 65813, + 0, 128499, 0, 75012, 0, 10888, 0, 93997, 0, 3330, 129417, 0, 0, 0, 0, 0, + 8220, 0, 0, 0, 0, 1627, 0, 0, 0, 5371, 118938, 0, 1826, 118794, 0, 0, + 70023, 0, 0, 0, 71108, 0, 0, 0, 0, 92207, 68125, 74898, 101069, 0, 0, 71098, 70029, 0, 43116, 0, 70019, 64346, 0, 0, 66818, 0, 70031, 0, 12666, 120413, 120420, 120414, 120406, 120428, 0, 120431, 0, 65509, 0, 7449, 0, 0, 0, 7438, 0, 0, 9054, 971, 0, 0, 0, 65195, 64767, 0, 0, 0, 0, 0, 0, 0, @@ -24120,127 +24761,128 @@ static unsigned int code_hash[] = { 55223, 0, 64414, 110689, 0, 0, 0, 0, 0, 0, 118802, 0, 42855, 118856, 42866, 0, 0, 0, 0, 66438, 0, 983977, 119356, 119355, 119354, 0, 983580, 0, 0, 67685, 128062, 119350, 0, 64512, 10404, 10340, 119352, 1556, 5274, - 0, 0, 10017, 9733, 0, 0, 0, 41373, 0, 0, 0, 0, 0, 349, 4863, 41371, 0, 0, - 0, 0, 72295, 4398, 8543, 65618, 128018, 0, 0, 0, 0, 12441, 0, 119348, - 119347, 4318, 10452, 0, 8032, 0, 119349, 119344, 0, 127844, 121156, 0, - 110729, 119345, 8597, 0, 110727, 9864, 0, 0, 0, 0, 0, 0, 0, 7722, 0, 0, - 0, 0, 0, 66590, 0, 0, 0, 0, 0, 0, 4965, 0, 917536, 0, 0, 0, 0, 0, 10436, - 119342, 43147, 119340, 10356, 10420, 982, 2756, 0, 983978, 0, 0, 11162, - 119338, 0, 92914, 0, 65110, 0, 0, 983781, 121456, 0, 118793, 0, 128112, - 119179, 64476, 1694, 8216, 0, 0, 78539, 0, 65620, 0, 78537, 0, 0, 42158, - 65621, 69955, 120324, 120327, 120326, 120321, 120320, 120323, 120322, - 12314, 65616, 55221, 43825, 983553, 119337, 68060, 119335, 0, 71874, - 124957, 128537, 119332, 73089, 0, 41347, 0, 0, 8842, 0, 0, 4379, 127393, - 12692, 0, 0, 66353, 71875, 0, 0, 92907, 0, 0, 71877, 120303, 65619, 9872, - 0, 0, 1846, 120309, 120308, 119256, 71192, 120305, 120304, 120307, 6442, - 120317, 120316, 5379, 120318, 110717, 120312, 120315, 71876, 0, 65934, - 66497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6151, 12110, 0, 0, 0, 0, 0, 0, - 0, 0, 68335, 0, 0, 0, 0, 0, 0, 66041, 9676, 10202, 0, 0, 0, 64575, - 126637, 11965, 0, 124936, 0, 0, 0, 0, 0, 9698, 66293, 0, 119651, 0, 0, - 41921, 0, 0, 0, 119258, 0, 0, 0, 0, 0, 8012, 12355, 12353, 0, 0, 74107, - 0, 0, 41925, 0, 41920, 65444, 0, 0, 41923, 12694, 0, 10112, 1294, 0, - 120091, 0, 120092, 0, 0, 128474, 121400, 0, 0, 0, 8718, 0, 10284, 10268, - 10380, 10316, 92593, 0, 71850, 0, 0, 92889, 0, 0, 0, 0, 9342, 12829, 0, - 0, 0, 127978, 0, 0, 69428, 0, 73767, 72347, 0, 7956, 598, 0, 72329, - 93837, 0, 0, 128860, 0, 120041, 0, 0, 0, 0, 0, 847, 0, 9529, 0, 0, 0, 0, - 120035, 0, 0, 0, 67411, 0, 0, 0, 120040, 0, 128580, 0, 9624, 0, 0, 0, - 65463, 1554, 0, 0, 0, 0, 71879, 0, 0, 0, 121161, 19963, 0, 0, 72326, - 92933, 71887, 10324, 10292, 65546, 0, 68141, 8372, 0, 0, 83018, 120022, - 10175, 10388, 42799, 0, 983180, 10568, 0, 127400, 0, 0, 0, 983743, 0, - 4366, 0, 983786, 0, 0, 42608, 0, 9884, 0, 0, 0, 0, 129180, 0, 0, 0, 0, - 1609, 0, 92773, 73448, 0, 11661, 0, 5818, 0, 0, 0, 9540, 0, 2554, 5158, - 0, 2213, 0, 0, 78522, 43079, 0, 0, 8264, 11175, 64553, 120863, 42155, 0, - 0, 0, 0, 0, 0, 8676, 0, 0, 0, 451, 0, 0, 0, 0, 0, 0, 0, 43609, 0, 0, - 1440, 0, 0, 0, 127061, 11005, 0, 66656, 127063, 0, 0, 0, 127065, 43393, - 0, 120643, 0, 0, 0, 0, 120798, 0, 0, 0, 0, 0, 0, 70435, 64356, 0, 0, 0, - 383, 7154, 127815, 43495, 128809, 121448, 0, 0, 0, 11286, 0, 0, 0, 0, 0, - 0, 0, 42644, 0, 0, 0, 8292, 0, 4980, 113726, 92674, 70130, 0, 0, 0, 0, - 74912, 0, 10631, 83330, 100488, 68042, 0, 0, 7900, 0, 0, 78779, 4198, - 128555, 0, 0, 0, 0, 0, 0, 12931, 0, 0, 0, 2088, 0, 0, 129284, 0, 0, - 124951, 0, 0, 0, 69694, 0, 0, 8593, 0, 0, 0, 0, 0, 0, 11798, 0, 100483, - 0, 0, 0, 64211, 128865, 120494, 0, 0, 0, 121228, 68901, 128788, 0, 0, - 65162, 0, 0, 0, 0, 0, 128130, 0, 92264, 127153, 0, 0, 0, 0, 61, 0, 0, - 92182, 119554, 0, 0, 12089, 0, 65834, 83281, 119671, 128701, 0, 0, 42566, - 42743, 0, 69824, 0, 92653, 0, 0, 42621, 0, 0, 0, 0, 0, 43266, 0, 0, 0, - 74843, 0, 0, 119103, 64417, 0, 0, 64737, 0, 0, 8930, 0, 0, 66900, 10056, - 1800, 0, 0, 0, 0, 121175, 7743, 0, 0, 119528, 92640, 92453, 9034, 6039, - 129139, 10075, 0, 0, 0, 10748, 0, 0, 0, 0, 0, 92984, 0, 0, 128183, - 129421, 0, 43064, 127558, 0, 7539, 0, 0, 0, 0, 0, 0, 0, 92898, 42567, 0, - 0, 73886, 0, 0, 12326, 0, 0, 0, 0, 11355, 0, 0, 0, 0, 69437, 0, 0, 0, - 119537, 72327, 43005, 65342, 118902, 0, 0, 8644, 0, 0, 11186, 74296, - 41909, 0, 128682, 2791, 0, 1891, 0, 0, 41907, 66647, 0, 0, 41906, 0, 0, - 10773, 70206, 0, 0, 0, 6412, 2061, 8520, 13146, 0, 0, 83275, 65902, 2882, - 0, 0, 65852, 0, 983306, 0, 0, 0, 0, 0, 0, 0, 128098, 0, 0, 0, 70871, 0, - 0, 0, 120087, 0, 0, 0, 93971, 0, 3844, 6842, 0, 0, 6612, 0, 0, 0, 0, 0, - 783, 0, 0, 0, 983064, 68032, 119225, 0, 0, 68378, 4556, 67839, 68480, - 78663, 120069, 120074, 67657, 10510, 4382, 74218, 42194, 0, 0, 9177, - 8902, 93958, 9839, 0, 120700, 0, 0, 63999, 41904, 41917, 9788, 120973, 0, - 1862, 0, 0, 0, 41915, 0, 41919, 63994, 41914, 7981, 0, 0, 0, 0, 0, 0, 0, - 120834, 0, 0, 0, 6784, 78788, 0, 0, 0, 0, 127534, 127484, 127476, 0, 0, - 983941, 64289, 65289, 0, 0, 0, 64509, 0, 0, 126505, 11051, 0, 66635, - 55259, 65885, 0, 128310, 0, 0, 0, 0, 7500, 4506, 0, 0, 0, 0, 0, 126609, - 4040, 128680, 6167, 0, 0, 0, 0, 0, 0, 7830, 43036, 0, 0, 63990, 19947, - 63988, 63987, 0, 63993, 10440, 9611, 0, 71883, 0, 65260, 63986, 11446, - 63984, 92641, 3435, 119652, 0, 119108, 0, 128632, 0, 0, 12748, 0, 0, - 92705, 0, 78790, 0, 0, 63956, 42458, 63954, 63953, 63960, 63959, 63958, - 11596, 0, 11469, 70025, 42306, 2723, 0, 0, 70027, 0, 0, 0, 128093, 2880, - 0, 0, 0, 0, 128506, 3498, 4378, 0, 0, 0, 65551, 118928, 0, 43387, 0, - 64415, 128898, 0, 0, 0, 0, 8161, 393, 12013, 0, 92216, 126479, 63965, - 63964, 63963, 42345, 0, 0, 63967, 42498, 0, 2927, 0, 63961, 0, 0, 983927, - 0, 69699, 0, 42340, 0, 0, 0, 10730, 0, 69688, 0, 64187, 0, 0, 12437, - 9813, 0, 42453, 1604, 9565, 0, 69701, 69235, 42414, 110724, 129196, 0, - 42301, 11372, 0, 917973, 0, 0, 63980, 63979, 63978, 0, 128207, 12017, - 63982, 63981, 94008, 0, 63977, 63976, 72794, 0, 0, 0, 63971, 4347, 4416, - 63968, 11009, 63974, 63973, 402, 69390, 13147, 0, 0, 64646, 13228, 0, 0, - 3515, 74252, 65261, 0, 0, 6259, 0, 0, 0, 0, 0, 0, 74813, 74425, 0, - 126998, 126114, 0, 0, 0, 0, 983698, 0, 0, 74301, 0, 0, 0, 0, 74060, 0, 0, - 66235, 5145, 0, 0, 128394, 0, 73120, 0, 7402, 0, 0, 0, 7952, 7832, 43382, - 66616, 0, 983931, 120852, 0, 127875, 64866, 0, 0, 0, 78784, 74248, 0, 0, - 983196, 0, 0, 0, 78656, 42390, 0, 0, 983921, 0, 0, 0, 0, 9508, 0, 9544, - 11520, 0, 0, 3377, 0, 0, 0, 0, 0, 0, 0, 66280, 0, 127198, 0, 0, 0, 1955, - 119565, 0, 0, 3076, 0, 42168, 73049, 66304, 0, 0, 8917, 42403, 301, 0, 0, - 0, 0, 0, 0, 0, 0, 67819, 92987, 0, 0, 0, 983204, 0, 69403, 3182, 0, 0, 0, - 0, 0, 42169, 0, 74244, 0, 42329, 0, 66326, 6841, 0, 128913, 0, 1219, - 3934, 71276, 11483, 74510, 0, 0, 42442, 65470, 0, 0, 64622, 7759, 42482, - 485, 0, 0, 42290, 0, 0, 42280, 0, 0, 11655, 64379, 127913, 42431, 10126, - 42318, 0, 119631, 74397, 42470, 0, 68315, 0, 110829, 74041, 0, 0, 0, - 5411, 0, 0, 0, 64205, 0, 64206, 42393, 64478, 1310, 125007, 0, 12052, - 10643, 55271, 72727, 0, 121045, 0, 0, 118852, 0, 0, 0, 0, 113826, 0, 0, - 64385, 0, 0, 0, 0, 0, 0, 93848, 92560, 2713, 0, 9650, 0, 0, 120602, 1406, - 0, 78174, 92659, 0, 68223, 0, 0, 0, 0, 43475, 0, 65287, 1508, 127938, - 8779, 10569, 75034, 0, 0, 0, 0, 0, 0, 0, 70786, 0, 0, 128344, 9185, 0, - 42932, 43403, 0, 0, 0, 0, 0, 0, 0, 0, 12955, 0, 2888, 0, 0, 0, 0, 0, 0, - 0, 2878, 0, 0, 0, 0, 0, 0, 129028, 13203, 0, 10429, 10365, 0, 0, 127165, - 7503, 0, 113676, 68381, 119658, 0, 8986, 0, 10632, 11934, 11452, 1332, 0, - 0, 0, 0, 73741, 1791, 8850, 9288, 0, 2892, 0, 43394, 555, 0, 0, 0, 0, - 64172, 118899, 0, 0, 0, 0, 8854, 0, 5858, 73101, 10582, 0, 0, 1361, 0, 0, - 7905, 0, 65256, 0, 41210, 0, 0, 71884, 0, 0, 0, 6828, 0, 92302, 0, 1342, - 68440, 0, 64161, 10903, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64381, 0, 0, 0, - 42245, 126467, 41972, 0, 0, 0, 9127, 0, 66619, 126489, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 11620, 0, 1149, 68316, 0, 0, 0, 0, 0, 92492, 0, 118784, 0, 0, 0, - 12838, 0, 118819, 0, 0, 0, 0, 41087, 0, 0, 0, 0, 12036, 0, 0, 0, 0, 0, - 64428, 12227, 0, 0, 0, 0, 125248, 120964, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1743, 0, 0, 0, 65186, 0, 0, 0, 0, 0, 64439, 0, 68062, 0, 111259, - 111258, 43866, 0, 111263, 3395, 9362, 111260, 0, 111257, 111256, 111255, - 0, 0, 41091, 3426, 1344, 111249, 111248, 0, 4735, 11111, 6119, 111251, - 42699, 0, 0, 74818, 1423, 0, 0, 0, 0, 12039, 10559, 0, 0, 0, 9472, 67734, - 11929, 0, 0, 0, 0, 128826, 0, 11579, 0, 0, 128364, 0, 92185, 0, 0, 1004, - 92584, 0, 0, 0, 0, 0, 2556, 0, 0, 72790, 0, 0, 9686, 0, 0, 0, 70109, - 111102, 0, 10718, 13154, 111100, 9139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 41708, 12860, 41703, 0, 42090, 5403, 10352, 73917, 129144, 111096, 0, - 5140, 0, 118785, 41704, 0, 43078, 127789, 111092, 129360, 0, 983205, - 92362, 0, 0, 2410, 92525, 0, 0, 0, 0, 0, 0, 0, 0, 119253, 0, 126601, 0, - 2066, 74199, 0, 43463, 10659, 119623, 68863, 0, 1336, 0, 0, 69463, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, 0, 0, 0, 0, 983946, 128133, 0, 0, 124940, - 0, 1190, 42146, 1335, 42177, 43867, 0, 0, 10448, 0, 125041, 0, 0, 2099, - 5120, 2409, 7799, 0, 74424, 0, 126581, 4731, 0, 111199, 111198, 111197, - 111196, 11689, 0, 74977, 9913, 129430, 0, 0, 0, 111195, 111194, 11694, 0, - 11690, 111189, 111188, 111187, 11693, 111193, 111192, 43097, 11688, 0, - 78797, 194, 111186, 111185, 111184, 0, 0, 0, 11226, 4519, 70337, 10898, - 43072, 70205, 0, 0, 0, 73094, 10695, 0, 7540, 0, 110984, 41859, 6067, 0, - 0, 0, 110981, 13311, 0, 41857, 0, 8359, 121224, 12689, 0, 0, 64577, + 0, 0, 10017, 9733, 0, 129476, 0, 41373, 0, 0, 0, 0, 0, 349, 4863, 41371, + 0, 0, 0, 0, 72295, 4398, 8543, 65618, 128018, 0, 0, 0, 0, 12441, 0, + 119348, 119347, 4318, 10452, 0, 8032, 0, 119349, 119344, 0, 127844, + 121156, 0, 110729, 119345, 8597, 0, 110727, 9864, 0, 0, 0, 0, 0, 0, 0, + 7722, 0, 0, 0, 0, 0, 66590, 0, 0, 0, 0, 0, 0, 4965, 0, 917536, 0, 123196, + 0, 0, 0, 10436, 119342, 43147, 119340, 10356, 10420, 982, 2756, 0, + 983978, 0, 0, 11162, 119338, 0, 92914, 0, 65110, 0, 0, 983781, 78543, 0, + 118793, 0, 128112, 119179, 64476, 1694, 8216, 0, 0, 78539, 0, 65620, 0, + 78537, 0, 0, 42158, 65621, 69955, 120324, 120327, 120326, 120321, 120320, + 120323, 120322, 12314, 65616, 55221, 43825, 983553, 119337, 68060, + 119335, 0, 71874, 123628, 128537, 119332, 73089, 0, 41347, 0, 0, 8842, 0, + 0, 4379, 127393, 12692, 0, 0, 66353, 71875, 0, 0, 92907, 0, 0, 71877, + 120303, 65619, 9872, 0, 0, 1846, 120309, 120308, 119256, 71192, 120305, + 120304, 120307, 6442, 120317, 120316, 5379, 120318, 110717, 120312, + 120315, 71876, 0, 65934, 66497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6151, + 12110, 0, 0, 0, 0, 0, 0, 0, 0, 68335, 0, 0, 0, 0, 0, 0, 66041, 9676, + 10202, 0, 0, 0, 64575, 126637, 11965, 0, 124936, 0, 0, 0, 0, 0, 9698, + 66293, 0, 119651, 0, 0, 41921, 0, 0, 0, 119258, 0, 0, 0, 0, 0, 8012, + 12355, 12353, 0, 0, 74107, 0, 0, 41925, 0, 41920, 65444, 0, 0, 41923, + 12694, 0, 10112, 1294, 0, 120091, 0, 120092, 0, 0, 128474, 121400, 0, 0, + 0, 8718, 0, 10284, 10268, 10380, 10316, 92593, 0, 71850, 0, 0, 92889, 0, + 0, 0, 0, 9342, 12829, 0, 0, 0, 127978, 0, 0, 69428, 0, 73767, 72347, 0, + 7956, 598, 0, 72329, 93837, 0, 0, 128860, 0, 120041, 0, 0, 0, 0, 0, 847, + 0, 9529, 0, 0, 0, 0, 120035, 0, 0, 0, 67411, 0, 0, 0, 120040, 0, 128580, + 0, 9624, 0, 0, 0, 65463, 1554, 0, 0, 0, 0, 71879, 0, 0, 0, 121161, 19963, + 123625, 0, 72326, 92933, 71887, 10324, 10292, 65546, 0, 68141, 8372, 0, + 0, 83018, 120022, 10175, 10388, 42799, 0, 983180, 10568, 0, 127400, 0, 0, + 0, 983743, 0, 4366, 0, 983786, 0, 0, 42608, 0, 9884, 0, 0, 0, 0, 129180, + 0, 0, 0, 0, 1609, 0, 92773, 73448, 0, 11661, 0, 5818, 0, 0, 0, 9540, 0, + 2554, 5158, 0, 2213, 0, 0, 78522, 43079, 0, 0, 8264, 11175, 64553, + 120863, 42155, 0, 0, 0, 0, 0, 0, 8676, 0, 0, 0, 451, 0, 0, 0, 0, 0, 0, + 123167, 43609, 0, 0, 1440, 0, 0, 0, 127061, 11005, 0, 66656, 127063, 0, + 0, 0, 127065, 43393, 0, 120643, 0, 0, 0, 0, 120798, 0, 0, 0, 0, 0, 0, + 70435, 64356, 0, 0, 0, 383, 7154, 127815, 43495, 128809, 121448, 0, 0, 0, + 11286, 0, 0, 0, 0, 0, 0, 0, 42644, 0, 0, 0, 8292, 0, 4980, 113726, 92674, + 70130, 0, 0, 0, 0, 74912, 0, 10631, 83330, 100488, 68042, 0, 0, 7900, 0, + 0, 78779, 4198, 128555, 0, 0, 0, 123159, 0, 0, 12931, 0, 0, 0, 2088, 0, + 72164, 129284, 0, 0, 124951, 0, 0, 0, 69694, 0, 0, 8593, 0, 0, 0, 0, 0, + 0, 11798, 0, 100483, 0, 0, 0, 64211, 128865, 120494, 0, 0, 0, 121228, + 68901, 128788, 0, 0, 65162, 0, 0, 0, 0, 0, 128130, 0, 92264, 127153, 0, + 128818, 0, 0, 61, 0, 0, 92182, 119554, 0, 0, 12089, 0, 65834, 83281, + 119671, 128701, 0, 0, 42566, 42743, 0, 69824, 0, 92653, 0, 0, 42621, 0, + 0, 0, 0, 0, 43266, 0, 0, 0, 74843, 0, 0, 119103, 64417, 0, 0, 64737, 0, + 0, 8930, 0, 0, 66900, 10056, 1800, 0, 0, 0, 0, 121175, 7743, 0, 0, + 119528, 92640, 92453, 9034, 6039, 129139, 10075, 0, 0, 0, 10748, 0, 0, 0, + 0, 0, 92984, 0, 0, 128183, 129421, 0, 43064, 127558, 0, 7539, 0, 0, 0, 0, + 0, 0, 0, 92898, 42567, 0, 0, 73886, 0, 0, 12326, 0, 0, 0, 0, 11355, 0, 0, + 0, 0, 69437, 0, 0, 0, 119537, 72327, 43005, 65342, 118902, 0, 0, 8644, 0, + 0, 11186, 74296, 41909, 0, 128682, 2791, 0, 1891, 0, 0, 41907, 66647, 0, + 0, 41906, 0, 0, 10773, 70206, 0, 0, 0, 6412, 2061, 8520, 13146, 0, 0, + 83275, 65902, 2882, 0, 126232, 65852, 0, 983306, 0, 123627, 0, 0, 0, 0, + 0, 128098, 0, 0, 0, 70871, 0, 0, 0, 120087, 0, 0, 0, 93971, 0, 3844, + 6842, 0, 0, 6612, 0, 0, 0, 0, 0, 783, 0, 0, 0, 983064, 68032, 119225, 0, + 0, 68378, 4556, 67839, 68480, 78663, 120069, 120074, 67657, 10510, 4382, + 74218, 42194, 0, 0, 9177, 8902, 93958, 9839, 0, 120700, 0, 0, 63999, + 41904, 41917, 9788, 120973, 0, 1862, 0, 0, 0, 41915, 0, 41919, 63994, + 41914, 7981, 0, 0, 0, 0, 0, 0, 0, 120834, 0, 0, 0, 6784, 78788, 0, 0, 0, + 0, 127534, 127484, 127476, 0, 0, 983941, 64289, 65289, 0, 129539, 129575, + 64509, 0, 0, 126505, 11051, 0, 66635, 55259, 65885, 0, 128310, 0, 0, 0, + 0, 7500, 4506, 0, 0, 0, 0, 0, 126609, 4040, 128680, 6167, 0, 0, 0, 0, 0, + 0, 7830, 43036, 0, 0, 63990, 19947, 63988, 63987, 0, 63993, 10440, 9611, + 0, 71883, 0, 65260, 63986, 11446, 63984, 92641, 3435, 119652, 0, 119108, + 0, 128632, 0, 0, 12748, 0, 0, 92705, 0, 78790, 0, 0, 63956, 42458, 63954, + 63953, 63960, 63959, 63958, 11596, 0, 11469, 70025, 42306, 2723, 0, 0, + 70027, 0, 0, 0, 128093, 2880, 0, 0, 0, 0, 128506, 3498, 4378, 0, 0, 0, + 65551, 118928, 0, 43387, 0, 64415, 128898, 0, 0, 0, 0, 8161, 393, 12013, + 0, 92216, 126479, 63965, 63964, 63963, 42345, 0, 0, 63967, 42498, 0, + 2927, 0, 63961, 0, 0, 983927, 0, 69699, 0, 42340, 0, 0, 0, 10730, 0, + 69688, 0, 64187, 0, 0, 12437, 9813, 0, 42453, 1604, 9565, 0, 69701, + 69235, 42414, 110724, 129196, 0, 42301, 11372, 0, 917973, 0, 0, 63980, + 63979, 63978, 0, 128207, 12017, 63982, 63981, 73687, 0, 63977, 63976, + 72794, 0, 0, 0, 63971, 4347, 4416, 63968, 11009, 63974, 63973, 402, + 69390, 13147, 0, 0, 64646, 13228, 0, 0, 3515, 74252, 65261, 0, 0, 6259, + 0, 0, 0, 0, 0, 0, 74813, 74425, 0, 126998, 126114, 0, 0, 0, 0, 983698, 0, + 0, 74301, 0, 0, 0, 0, 74060, 0, 0, 66235, 5145, 0, 0, 128394, 0, 73120, + 0, 7402, 0, 0, 0, 7952, 7832, 43382, 66616, 0, 983931, 120852, 0, 127875, + 64866, 0, 0, 0, 78784, 74248, 0, 0, 983196, 0, 0, 0, 78656, 42390, 0, 0, + 983921, 0, 0, 0, 0, 9508, 0, 9544, 11520, 0, 0, 3377, 0, 129562, 0, 0, 0, + 0, 0, 66280, 0, 127198, 0, 0, 0, 1955, 119565, 0, 0, 3076, 0, 42168, + 73049, 66304, 0, 0, 8917, 42403, 301, 0, 0, 0, 0, 0, 0, 0, 0, 67819, + 92987, 0, 0, 0, 983204, 0, 69403, 3182, 0, 0, 0, 0, 0, 42169, 123162, + 74244, 0, 42329, 0, 66326, 6841, 0, 128913, 0, 1219, 3934, 71276, 11483, + 74510, 0, 0, 42442, 65470, 0, 0, 64622, 7759, 42482, 485, 0, 0, 42290, 0, + 0, 42280, 0, 0, 11655, 64379, 127913, 42431, 10126, 42318, 0, 119631, + 74397, 42470, 0, 68315, 0, 110829, 74041, 0, 0, 0, 5411, 0, 0, 0, 64205, + 0, 64206, 42393, 64478, 1310, 125007, 0, 12052, 10643, 55271, 72727, 0, + 121045, 0, 0, 118852, 0, 0, 0, 0, 113826, 0, 0, 64385, 0, 0, 0, 0, 0, 0, + 93848, 92560, 2713, 0, 9650, 0, 0, 120602, 1406, 0, 78174, 92659, 0, + 68223, 0, 0, 0, 0, 43475, 0, 65287, 1508, 127938, 8779, 10569, 75034, 0, + 0, 0, 0, 0, 0, 0, 70786, 0, 0, 128344, 9185, 0, 42932, 43403, 0, 0, 0, 0, + 0, 0, 0, 0, 12955, 0, 2888, 0, 0, 0, 0, 0, 0, 0, 2878, 0, 0, 0, 0, 0, 0, + 129028, 13203, 0, 10429, 10365, 0, 0, 127165, 7503, 0, 113676, 68381, + 119658, 0, 8986, 0, 10632, 11934, 11452, 1332, 0, 0, 0, 0, 73741, 1791, + 8850, 9288, 0, 2892, 0, 43394, 555, 0, 0, 0, 0, 64172, 118899, 0, 0, 0, + 0, 8854, 0, 5858, 73101, 10582, 0, 0, 1361, 0, 0, 7905, 0, 65256, 0, + 41210, 0, 0, 71884, 0, 0, 0, 6828, 0, 92302, 0, 1342, 68440, 0, 64161, + 10903, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64381, 0, 0, 0, 42245, 126467, + 41972, 0, 0, 0, 9127, 0, 66619, 126489, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11620, + 0, 1149, 68316, 0, 0, 0, 0, 0, 92492, 0, 118784, 0, 0, 0, 12838, 0, + 118819, 0, 0, 0, 0, 41087, 0, 0, 0, 0, 12036, 0, 0, 0, 0, 0, 64428, + 12227, 0, 0, 0, 0, 125248, 120964, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1743, + 0, 0, 0, 65186, 0, 0, 0, 0, 0, 64439, 0, 68062, 0, 111259, 111258, 43866, + 0, 111263, 3395, 9362, 111260, 0, 111257, 111256, 111255, 0, 0, 41091, + 3426, 1344, 111249, 111248, 126215, 4735, 11111, 6119, 111251, 42699, 0, + 0, 74818, 1423, 0, 0, 0, 0, 12039, 10559, 0, 0, 0, 9472, 67734, 11929, 0, + 0, 0, 0, 128826, 0, 11579, 0, 0, 128364, 0, 92185, 0, 0, 1004, 92584, 0, + 0, 0, 0, 0, 2556, 0, 0, 72790, 0, 0, 9686, 0, 0, 0, 70109, 111102, 0, + 10718, 13154, 111100, 9139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41708, 12860, + 41703, 0, 42090, 5403, 10352, 73917, 129144, 111096, 0, 5140, 3753, + 118785, 41704, 0, 43078, 127789, 111092, 129360, 0, 983205, 92362, 0, 0, + 2410, 92525, 0, 0, 0, 0, 0, 0, 0, 0, 119253, 0, 126601, 0, 2066, 74199, + 0, 43463, 10659, 119623, 68863, 0, 1336, 0, 0, 69463, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 272, 0, 0, 0, 0, 983946, 128133, 0, 0, 124940, 0, 1190, + 42146, 1335, 42177, 43867, 0, 0, 10448, 0, 125041, 0, 0, 2099, 5120, + 2409, 7799, 0, 74424, 0, 126581, 4731, 0, 111199, 111198, 111197, 111196, + 11689, 0, 74977, 9913, 129430, 0, 0, 0, 111195, 111194, 11694, 0, 11690, + 111189, 111188, 111187, 11693, 111193, 111192, 43097, 11688, 0, 78797, + 194, 111186, 111185, 111184, 0, 0, 0, 11226, 4519, 70337, 10898, 43072, + 70205, 0, 0, 0, 73094, 10695, 0, 7540, 0, 110984, 41859, 6067, 0, 0, 0, + 110981, 13311, 0, 41857, 0, 8359, 121224, 12689, 0, 983131, 64577, 111204, 111203, 68183, 111209, 111208, 6064, 110988, 0, 110979, 74142, 0, - 111201, 111200, 6051, 0, 0, 0, 983369, 0, 0, 0, 0, 0, 110864, 10537, + 111201, 111200, 6051, 123613, 0, 0, 983369, 0, 0, 0, 0, 0, 110864, 10537, 110862, 1276, 0, 6549, 6052, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1960, 0, 71232, 66297, 0, 129313, 0, 0, 1345, 111213, 111212, 111211, 8956, 43083, 0, 111215, 64682, 0, 6430, 0, 111210, 119814, 0, 0, 0, 119817, 0, 492, @@ -24249,7 +24891,7 @@ static unsigned int code_hash[] = { 111229, 111228, 93764, 111226, 0, 0, 111231, 111230, 71686, 1799, 0, 42148, 74336, 0, 0, 65340, 111220, 110974, 2262, 111217, 111224, 74931, 111222, 10896, 0, 0, 0, 0, 6338, 111003, 110997, 110994, 111006, 111002, - 111005, 0, 111279, 111278, 111277, 111276, 0, 111273, 111272, 110961, + 111005, 0, 111279, 111278, 111277, 72133, 0, 111273, 111272, 110961, 3171, 6623, 4961, 0, 886, 55216, 8654, 0, 111270, 74390, 64603, 111267, 129283, 68122, 0, 43084, 0, 0, 0, 0, 69693, 8994, 10944, 65938, 111239, 111238, 111237, 111236, 66279, 92890, 42510, 0, 0, 6804, 0, 1947, 0, 0, @@ -24273,62 +24915,63 @@ static unsigned int code_hash[] = { 778, 41626, 42455, 7989, 0, 3227, 69907, 111053, 0, 2915, 11502, 983212, 41702, 10309, 0, 0, 0, 0, 0, 0, 0, 127268, 127258, 127267, 65215, 64410, 127260, 71175, 0, 0, 0, 0, 0, 0, 41700, 110651, 0, 126488, 0, 0, 42495, - 0, 0, 0, 10460, 43364, 0, 1356, 12161, 42713, 0, 0, 42342, 10914, 0, + 0, 0, 0, 10460, 43364, 0, 1356, 3728, 42713, 0, 0, 42342, 10914, 0, 42489, 64310, 66896, 41861, 42297, 0, 0, 41860, 64862, 0, 0, 5289, 42336, 128658, 0, 92529, 42410, 0, 120624, 0, 2649, 74493, 0, 126635, 0, 3382, 42449, 9081, 1658, 11936, 93019, 113814, 11269, 0, 0, 43100, 69888, 65508, 0, 0, 121451, 0, 0, 0, 0, 0, 4732, 128283, 0, 0, 0, 121113, 2236, 126551, 0, 6048, 0, 0, 73965, 0, 0, 0, 0, 10151, 9681, 4475, 0, 64735, - 2100, 0, 0, 6035, 0, 0, 10296, 0, 0, 0, 0, 0, 0, 0, 983307, 68488, 10392, - 10328, 0, 43462, 0, 0, 0, 8979, 0, 0, 983304, 0, 0, 0, 10977, 0, 10344, - 0, 65299, 10408, 0, 0, 121187, 66505, 0, 0, 0, 0, 0, 0, 43074, 73799, 0, - 0, 0, 0, 3446, 0, 0, 128692, 0, 0, 119582, 4474, 0, 43093, 6282, 0, 0, - 127372, 0, 0, 0, 0, 0, 0, 0, 0, 66910, 67811, 92277, 0, 64948, 0, 74347, - 0, 0, 0, 983962, 8194, 0, 121165, 11010, 0, 8893, 0, 983969, 0, 0, 0, - 983317, 7925, 0, 0, 113825, 0, 1352, 11069, 7707, 0, 126486, 0, 0, 0, 0, - 65605, 6040, 0, 10071, 0, 128156, 43750, 0, 8899, 69873, 0, 0, 983311, - 128208, 7820, 0, 0, 0, 7746, 1492, 0, 0, 0, 66866, 0, 11788, 65913, 0, 0, - 43095, 0, 0, 92265, 2999, 0, 120720, 0, 371, 0, 6023, 0, 0, 11708, 0, 0, - 6323, 0, 0, 0, 8938, 6043, 65866, 0, 0, 0, 72419, 0, 0, 2589, 74332, - 1689, 7802, 0, 0, 0, 0, 66704, 0, 0, 0, 0, 128127, 6049, 0, 4027, 0, 0, - 111334, 111333, 1503, 111331, 0, 111337, 11951, 111335, 2387, 0, 0, 8289, - 111330, 7326, 66514, 65514, 0, 64865, 0, 9668, 0, 0, 0, 0, 93060, 6036, - 92768, 4026, 74089, 127091, 0, 0, 75044, 110821, 0, 110819, 0, 0, 0, 0, - 6021, 0, 128288, 0, 43155, 0, 110822, 0, 111343, 42691, 111341, 111340, - 0, 166, 0, 0, 0, 10623, 408, 0, 111339, 13298, 0, 7426, 43694, 0, 0, - 8811, 0, 0, 0, 0, 0, 74134, 983054, 0, 127811, 0, 0, 0, 6645, 646, - 128813, 0, 42129, 0, 120880, 0, 8697, 0, 120936, 0, 0, 0, 0, 5809, 1950, - 0, 92432, 68339, 0, 42136, 0, 0, 0, 0, 0, 0, 111354, 983965, 0, 0, - 111349, 111348, 43330, 111346, 111353, 111352, 41567, 111350, 0, 0, 0, 0, - 111345, 111344, 8285, 0, 4509, 0, 128361, 0, 0, 0, 0, 0, 41727, 0, 0, 0, - 0, 0, 0, 0, 74512, 7027, 3886, 0, 74023, 92888, 0, 0, 126092, 94058, - 119855, 0, 121455, 11707, 119852, 0, 7939, 92454, 92460, 72747, 121408, - 917569, 0, 71198, 94077, 119847, 0, 0, 7201, 0, 0, 120866, 983968, 1540, - 0, 0, 0, 0, 0, 41718, 71177, 0, 0, 128001, 0, 0, 119040, 0, 9619, 120840, - 0, 0, 0, 0, 3560, 0, 6070, 0, 0, 2922, 6082, 70147, 65009, 983954, 0, 0, - 0, 0, 0, 0, 3607, 65863, 0, 92487, 42153, 121042, 0, 983843, 2032, 0, 0, - 0, 0, 0, 0, 43085, 6057, 0, 0, 0, 0, 0, 0, 0, 0, 638, 6083, 126976, 0, 0, - 2305, 0, 0, 0, 6056, 10878, 0, 0, 6085, 0, 0, 3915, 0, 0, 0, 0, 0, 0, - 4028, 1787, 0, 43096, 0, 0, 1768, 0, 0, 0, 128125, 0, 0, 583, 129137, 0, - 0, 66004, 0, 0, 0, 0, 0, 55267, 120810, 0, 43075, 65049, 0, 74531, 0, - 93009, 70694, 0, 0, 129375, 9869, 128815, 1771, 0, 0, 0, 0, 0, 0, 119115, - 113708, 0, 0, 74101, 0, 0, 0, 0, 0, 0, 0, 0, 12539, 0, 0, 0, 0, 73862, - 69842, 9897, 0, 100561, 0, 0, 0, 0, 0, 8931, 0, 1415, 8866, 74552, 0, - 128312, 0, 983576, 43106, 0, 71089, 1580, 92278, 68424, 0, 0, 7658, 3440, - 78215, 1562, 0, 0, 129031, 0, 0, 0, 0, 0, 0, 6028, 68900, 42892, 0, - 111016, 0, 0, 0, 0, 0, 128269, 0, 66776, 983131, 127276, 129124, 0, 0, 0, - 11599, 0, 11602, 11591, 11574, 11581, 11597, 11598, 6253, 11571, 11584, - 70273, 11569, 0, 8906, 0, 5755, 2636, 0, 10815, 11619, 129094, 0, 7815, - 11616, 11617, 70064, 11618, 11604, 7869, 11612, 0, 42152, 0, 0, 0, 92586, - 0, 0, 92173, 0, 0, 6616, 0, 0, 120875, 391, 0, 0, 0, 42296, 11588, 0, 0, - 0, 68397, 0, 0, 42335, 983188, 0, 0, 7538, 94040, 0, 42491, 0, 0, 128088, - 4576, 0, 0, 43809, 4277, 0, 3563, 0, 42338, 368, 0, 0, 42412, 0, 78209, - 0, 0, 43814, 983616, 1849, 0, 9921, 42451, 4253, 0, 0, 0, 42404, 64657, - 73919, 3618, 78338, 0, 0, 0, 0, 0, 929, 6827, 42035, 0, 0, 0, 67847, 0, - 0, 0, 0, 0, 0, 0, 0, 4578, 64513, 0, 0, 0, 71049, 68090, 0, 43305, 0, 0, - 0, 0, 42048, 10166, 0, 127095, 113810, 983127, 0, 983972, 0, 0, 42483, 0, - 0, 0, 42291, 0, 71047, 0, 6641, 525, 66404, 0, 8763, 125091, 0, 0, 0, 0, - 0, 42504, 42581, 74280, 6915, 42310, 0, 8559, 0, 983975, 125100, 0, 0, + 2100, 0, 0, 6035, 0, 123599, 10296, 0, 0, 0, 0, 0, 0, 0, 983307, 68488, + 10392, 10328, 0, 43462, 0, 0, 0, 8979, 0, 0, 983304, 0, 0, 0, 10977, 0, + 10344, 0, 65299, 10408, 0, 0, 121187, 66505, 0, 0, 0, 0, 0, 0, 43074, + 73799, 0, 0, 0, 0, 3446, 0, 0, 128692, 0, 0, 119582, 4474, 0, 43093, + 6282, 0, 0, 127372, 0, 0, 0, 0, 0, 0, 0, 0, 66910, 67811, 92277, 0, + 64948, 0, 74347, 0, 0, 0, 983962, 8194, 0, 121165, 11010, 0, 8893, 0, + 983969, 0, 0, 0, 983317, 7925, 0, 0, 113825, 0, 1352, 11069, 7707, 0, + 126486, 0, 0, 0, 0, 65605, 6040, 0, 10071, 0, 128156, 43750, 0, 8899, + 69873, 0, 0, 983311, 128208, 7820, 69615, 0, 0, 7746, 1492, 0, 0, 0, + 66866, 0, 11788, 65913, 0, 0, 43095, 0, 0, 92265, 2999, 0, 120720, 0, + 371, 0, 6023, 0, 0, 11708, 0, 0, 6323, 0, 0, 0, 8938, 6043, 65866, 0, 0, + 0, 72419, 0, 129480, 2589, 74332, 1689, 7802, 0, 0, 0, 0, 66704, 0, 0, 0, + 0, 128127, 6049, 0, 4027, 0, 0, 111334, 111333, 1503, 111331, 0, 111337, + 11951, 111335, 2387, 0, 0, 8289, 111330, 7326, 66514, 65514, 0, 64865, 0, + 9668, 0, 0, 0, 0, 93060, 6036, 92768, 4026, 74089, 127091, 0, 0, 75044, + 110821, 0, 110819, 0, 0, 0, 0, 6021, 0, 128288, 0, 43155, 0, 110822, 0, + 111343, 42691, 111341, 111340, 0, 166, 0, 0, 0, 10623, 408, 0, 111339, + 13298, 0, 7426, 43694, 0, 0, 8811, 0, 0, 0, 0, 0, 74134, 983054, 0, + 127811, 0, 0, 0, 6645, 646, 128813, 0, 42129, 0, 120880, 0, 8697, 0, + 120936, 0, 0, 0, 0, 5809, 1950, 0, 92432, 68339, 0, 42136, 0, 0, 0, 0, 0, + 0, 111354, 983965, 0, 0, 111349, 111348, 43330, 111346, 111353, 111352, + 41567, 111350, 0, 0, 0, 0, 111345, 111344, 8285, 0, 4509, 0, 128361, 0, + 0, 0, 0, 0, 41727, 0, 0, 0, 0, 0, 0, 0, 74512, 7027, 3886, 0, 74023, + 92888, 0, 0, 126092, 94058, 119855, 0, 121455, 11707, 119852, 0, 7939, + 10342, 92460, 72747, 121408, 917569, 0, 71198, 94077, 119847, 0, 0, 7201, + 0, 0, 120866, 983968, 1540, 0, 0, 0, 0, 0, 41718, 71177, 0, 0, 128001, 0, + 0, 119040, 0, 9619, 120840, 0, 0, 0, 0, 3560, 0, 6070, 129000, 0, 2922, + 6082, 70147, 65009, 983954, 0, 0, 0, 0, 0, 0, 3607, 65863, 0, 92487, + 42153, 121042, 0, 983843, 2032, 0, 0, 0, 0, 0, 0, 43085, 6057, 0, 0, 0, + 0, 0, 0, 0, 0, 638, 6083, 126976, 0, 0, 2305, 0, 0, 0, 6056, 10878, 0, 0, + 6085, 0, 0, 3915, 0, 0, 0, 0, 0, 0, 4028, 1787, 0, 43096, 0, 0, 1768, 0, + 0, 0, 128125, 0, 0, 583, 129137, 0, 0, 66004, 0, 0, 0, 0, 0, 55267, + 120810, 128995, 43075, 65049, 0, 74531, 0, 93009, 70694, 0, 0, 129375, + 9869, 128815, 1771, 0, 0, 0, 0, 0, 0, 119115, 113708, 0, 0, 74101, 0, 0, + 0, 0, 0, 0, 0, 0, 12539, 123631, 0, 0, 0, 73862, 69842, 9897, 0, 100561, + 0, 0, 0, 0, 0, 8931, 0, 1415, 8866, 74552, 0, 128312, 0, 983576, 43106, + 0, 71089, 1580, 92278, 68424, 0, 0, 7658, 3440, 78215, 1562, 0, 0, + 129031, 0, 0, 0, 0, 0, 0, 6028, 68900, 42892, 0, 111016, 0, 0, 0, 0, 0, + 128269, 0, 66776, 42946, 127276, 129124, 0, 0, 0, 11599, 0, 11602, 11591, + 11574, 11581, 11597, 11598, 6253, 11571, 11584, 70273, 11569, 0, 8906, 0, + 5755, 2636, 0, 10815, 11619, 129094, 0, 7815, 11616, 11617, 70064, 11618, + 11604, 7869, 11612, 0, 42152, 0, 0, 0, 92586, 126247, 0, 92173, 0, 0, + 6616, 0, 0, 120875, 391, 0, 0, 0, 42296, 11588, 0, 0, 0, 68397, 0, 0, + 42335, 983188, 0, 0, 7538, 94040, 0, 42491, 0, 0, 128088, 4576, 0, 0, + 43809, 4277, 0, 3563, 0, 42338, 368, 0, 0, 42412, 0, 78209, 0, 0, 43814, + 983616, 1849, 0, 9921, 42451, 4253, 0, 0, 0, 42404, 64657, 73919, 3618, + 78338, 0, 0, 0, 0, 0, 929, 6827, 42035, 0, 0, 0, 67847, 0, 0, 0, 0, 0, 0, + 0, 0, 4578, 64513, 0, 0, 0, 71049, 68090, 0, 43305, 0, 73462, 0, 0, + 42048, 10166, 0, 127095, 113810, 983127, 0, 983972, 0, 0, 42483, 0, 0, 0, + 42291, 0, 71047, 0, 6641, 525, 66404, 0, 8763, 125091, 0, 0, 0, 0, 0, + 42504, 42581, 74280, 6915, 42310, 0, 8559, 0, 983975, 125100, 0, 0, 11666, 8679, 0, 1576, 42423, 0, 0, 73840, 983092, 11374, 0, 10889, 129076, 0, 42462, 0, 77982, 0, 2718, 42424, 0, 0, 127166, 0, 1179, 0, 0, 0, 363, 11015, 72229, 0, 43857, 0, 66692, 0, 0, 0, 11041, 0, 0, 0, 0, 0, @@ -24367,154 +25010,155 @@ static unsigned int code_hash[] = { 125013, 6823, 42391, 1588, 65400, 0, 0, 0, 65398, 787, 0, 0, 0, 0, 2078, 127239, 65399, 0, 0, 0, 65401, 0, 121196, 0, 0, 644, 0, 71335, 0, 3659, 0, 0, 0, 13107, 92669, 0, 10502, 74457, 0, 11221, 41554, 0, 0, 0, 41557, - 0, 0, 11070, 119221, 0, 0, 73858, 41555, 9514, 0, 66771, 64641, 92447, 0, - 7520, 73888, 77955, 0, 0, 0, 0, 0, 64527, 0, 0, 12723, 0, 68776, 0, 0, 0, - 78835, 4055, 78826, 77960, 65212, 0, 127353, 12319, 0, 0, 983216, 7964, - 65427, 0, 65424, 72217, 120966, 0, 65425, 74890, 128251, 0, 0, 0, 3448, - 10827, 0, 9866, 74527, 0, 0, 8625, 69783, 92304, 10477, 0, 0, 0, 65423, - 0, 0, 0, 0, 6152, 0, 0, 6629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11046, 11490, - 0, 4485, 71126, 0, 0, 0, 0, 0, 5869, 0, 119633, 0, 7040, 3588, 0, 12825, - 0, 0, 128569, 0, 0, 0, 0, 0, 0, 0, 0, 128449, 64499, 65245, 127367, 1171, - 127368, 69717, 127365, 1805, 8772, 0, 127363, 9930, 65247, 0, 0, 2338, - 127362, 92695, 0, 0, 0, 69219, 0, 120104, 0, 120103, 72221, 120106, 0, - 118814, 8734, 4212, 0, 0, 66701, 0, 65862, 0, 120095, 42903, 0, 0, 0, - 126117, 426, 0, 120098, 8251, 0, 65436, 0, 2120, 43302, 1224, 0, 65576, - 0, 66876, 1764, 6074, 0, 12858, 0, 0, 65439, 6378, 74566, 0, 41960, 0, - 41644, 0, 2129, 0, 9222, 0, 0, 4259, 9092, 0, 41961, 0, 0, 66357, 42331, - 64935, 0, 0, 1293, 0, 2132, 0, 983589, 0, 2454, 0, 3613, 128837, 71117, - 0, 0, 69681, 10978, 10840, 0, 10668, 0, 127197, 9118, 120164, 0, 0, 0, - 1157, 64903, 8638, 0, 0, 0, 0, 0, 0, 0, 128981, 10086, 0, 11128, 0, 0, - 65430, 74013, 6079, 0, 10764, 127910, 64435, 128051, 1339, 0, 65428, - 1317, 8822, 0, 0, 0, 127143, 0, 0, 0, 43110, 0, 10428, 0, 0, 0, 5742, - 43076, 4692, 0, 0, 4007, 5004, 128781, 0, 751, 6595, 6596, 0, 66373, 0, - 0, 64908, 0, 6593, 72349, 12004, 119192, 74097, 43108, 0, 0, 119333, - 92188, 6598, 0, 6599, 0, 93031, 74194, 0, 121483, 66674, 6597, 0, 73921, - 0, 64745, 2281, 0, 0, 0, 43790, 0, 2430, 41678, 0, 0, 43785, 113716, 0, - 121263, 0, 0, 1921, 0, 19927, 70390, 65406, 0, 43786, 4284, 0, 72210, - 43789, 12841, 9229, 0, 42285, 0, 0, 0, 0, 3521, 0, 120888, 8325, 0, - 65403, 0, 1854, 0, 0, 0, 0, 0, 0, 0, 0, 4344, 0, 65433, 6076, 0, 0, - 74764, 12074, 0, 0, 0, 0, 12934, 119555, 65432, 128877, 0, 6071, 65434, - 0, 65435, 4053, 128623, 0, 0, 0, 0, 69823, 127463, 0, 121403, 127473, - 8421, 127472, 0, 43705, 502, 0, 65431, 0, 0, 0, 1303, 316, 7364, 0, 2136, - 0, 120796, 64365, 43480, 92639, 4860, 0, 127877, 0, 0, 9583, 0, 5546, 0, - 0, 0, 0, 0, 5544, 127475, 0, 70352, 5543, 128917, 72821, 12137, 5548, 0, - 0, 10007, 0, 127523, 6077, 0, 65452, 0, 119341, 11214, 65952, 0, 72226, - 0, 0, 1319, 74210, 65410, 67399, 92606, 0, 0, 119343, 0, 66716, 83513, - 4691, 128619, 9345, 621, 0, 0, 122889, 65411, 0, 74575, 121246, 65408, - 73899, 0, 9474, 2812, 119118, 65412, 3786, 65409, 8894, 83246, 119611, - 7923, 3716, 0, 0, 0, 0, 7012, 0, 128439, 9566, 0, 94176, 0, 65012, 0, - 545, 9575, 0, 10050, 12718, 0, 8859, 6820, 0, 983979, 120740, 0, 0, 9119, - 2787, 0, 983981, 8507, 2012, 7985, 0, 0, 0, 0, 194634, 0, 410, 0, 0, - 120789, 120609, 0, 120378, 120379, 0, 0, 120374, 72742, 120376, 120377, - 120370, 120371, 120372, 120373, 3860, 120367, 72205, 74031, 111131, - 111130, 11748, 120365, 7941, 111134, 8749, 111132, 12698, 111129, 361, - 110793, 845, 0, 0, 0, 4562, 72241, 2926, 0, 4569, 0, 110797, 43487, 0, 0, - 0, 74287, 122885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6291, 0, 0, 0, 9734, 0, 0, - 0, 0, 127754, 7359, 83523, 43863, 0, 111150, 8769, 111148, 111147, - 111145, 4859, 111143, 111142, 0, 0, 0, 0, 12172, 111136, 0, 127899, - 111141, 64764, 4210, 111138, 0, 804, 0, 83520, 0, 70344, 0, 0, 67202, - 10091, 67200, 119257, 67206, 67205, 67204, 67203, 72302, 0, 0, 0, 128959, - 0, 1425, 92259, 119229, 11049, 0, 71480, 42649, 8482, 0, 0, 66715, 67209, - 11940, 67207, 664, 0, 0, 0, 70200, 127525, 0, 70194, 93061, 111155, - 68474, 111153, 6032, 67218, 67217, 7430, 194670, 70191, 0, 0, 0, 0, 0, - 41161, 0, 9765, 10993, 41162, 0, 70189, 1169, 111181, 0, 1905, 6034, - 41164, 64744, 43236, 0, 128800, 73110, 0, 0, 788, 0, 0, 111167, 111128, - 1663, 128976, 42901, 0, 67211, 67210, 0, 0, 67215, 67214, 67213, 67212, - 111160, 111159, 111158, 111157, 0, 0, 0, 111161, 43612, 0, 0, 0, 10855, - 67223, 9355, 67221, 65198, 120355, 0, 221, 0, 0, 0, 121141, 7191, 118930, - 72208, 125212, 0, 0, 0, 0, 67228, 67227, 43333, 67225, 0, 0, 0, 67229, 0, - 7245, 0, 74405, 69922, 72219, 111178, 3873, 8367, 111174, 111173, 111172, - 43649, 0, 111177, 111176, 0, 11164, 0, 74403, 111171, 111170, 111169, - 7682, 74404, 1462, 10235, 0, 0, 0, 0, 0, 120363, 0, 0, 74402, 0, 92299, - 0, 0, 74052, 0, 126127, 120549, 0, 64295, 0, 0, 0, 0, 0, 120662, 0, 0, - 67231, 67230, 10755, 55257, 11155, 128568, 983136, 9470, 0, 127540, 0, - 69680, 64384, 0, 128607, 0, 0, 0, 0, 73764, 8204, 0, 0, 0, 0, 0, 8728, 0, - 10904, 73446, 19936, 7833, 0, 0, 0, 0, 92546, 0, 0, 0, 8537, 0, 0, 0, - 121244, 0, 0, 0, 128193, 0, 0, 0, 0, 3062, 0, 0, 0, 0, 0, 41160, 41147, - 41158, 0, 120777, 0, 41155, 111116, 111115, 111114, 0, 121332, 111119, - 111118, 111117, 0, 0, 129091, 0, 0, 0, 64594, 2456, 66867, 0, 0, 0, 0, 0, - 0, 0, 1230, 2678, 0, 3597, 917795, 0, 0, 92215, 0, 67737, 8352, 0, 0, 0, - 64515, 121378, 0, 129128, 67846, 0, 0, 92466, 0, 0, 71338, 0, 8660, 0, 0, - 0, 0, 0, 4483, 0, 0, 0, 6080, 0, 0, 1746, 1315, 0, 70201, 0, 13140, - 74508, 0, 0, 4480, 0, 111113, 111112, 0, 67979, 0, 6360, 10897, 111106, - 605, 68302, 110737, 69875, 110735, 110736, 66681, 0, 0, 0, 0, 0, 0, 0, - 10877, 118868, 64885, 0, 0, 0, 0, 0, 0, 345, 0, 0, 64606, 9917, 0, 0, - 92196, 0, 1776, 8422, 43992, 0, 0, 0, 126543, 43328, 0, 0, 1295, 0, + 11209, 0, 11070, 119221, 0, 0, 73858, 41555, 9514, 0, 66771, 64641, + 92447, 0, 7520, 73888, 77955, 0, 0, 0, 0, 0, 64527, 0, 0, 12723, 0, + 68776, 0, 0, 0, 78835, 4055, 78826, 77960, 65212, 0, 127353, 12319, 0, 0, + 983216, 7964, 65427, 0, 65424, 72217, 120966, 0, 65425, 74890, 128251, 0, + 0, 0, 3448, 10827, 0, 9866, 74527, 0, 0, 8625, 69783, 92304, 10477, 0, 0, + 0, 65423, 0, 0, 0, 0, 6152, 0, 0, 6629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11046, 11490, 0, 4485, 71126, 0, 0, 0, 0, 0, 5869, 0, 119633, 0, 7040, + 3588, 0, 12825, 0, 0, 128569, 0, 0, 0, 0, 0, 0, 0, 0, 128449, 64499, + 65245, 127367, 1171, 127368, 69717, 127365, 1805, 8772, 0, 127363, 9930, + 65247, 0, 0, 2338, 127362, 92695, 0, 0, 0, 69219, 0, 120104, 0, 120103, + 72221, 120106, 0, 118814, 8734, 4212, 0, 0, 66701, 0, 65862, 0, 120095, + 42903, 0, 0, 0, 126117, 426, 0, 120098, 8251, 0, 65436, 0, 2120, 43302, + 1224, 0, 65576, 0, 66876, 1764, 6074, 0, 12858, 0, 0, 65439, 6378, 74566, + 0, 41960, 0, 41644, 0, 2129, 0, 9222, 0, 0, 4259, 9092, 0, 41961, 0, 0, + 66357, 42331, 64935, 0, 0, 1293, 0, 2132, 0, 983589, 0, 2454, 0, 3613, + 128837, 71117, 0, 0, 69681, 10978, 10840, 0, 10668, 0, 127197, 9118, + 120164, 0, 0, 0, 1157, 64903, 8638, 0, 0, 0, 0, 0, 0, 0, 128981, 10086, + 0, 11128, 0, 0, 65430, 74013, 6079, 0, 10764, 127910, 64435, 128051, + 1339, 0, 65428, 1317, 8822, 0, 0, 0, 127143, 0, 0, 0, 43110, 0, 10428, 0, + 0, 0, 5742, 43076, 4692, 0, 0, 4007, 5004, 128781, 0, 751, 6595, 6596, 0, + 66373, 0, 0, 64908, 0, 6593, 72349, 12004, 119192, 74097, 43108, 0, 0, + 119333, 92188, 6598, 0, 6599, 0, 93031, 74194, 0, 121483, 66674, 6597, 0, + 73921, 0, 64745, 2281, 0, 0, 128996, 43790, 0, 2430, 41678, 0, 0, 43785, + 113716, 0, 121263, 0, 0, 1921, 0, 19927, 70390, 65406, 0, 43786, 4284, + 128346, 72210, 43789, 12841, 9229, 0, 42285, 0, 0, 0, 0, 3521, 0, 120888, + 8325, 0, 65403, 0, 1854, 0, 0, 0, 0, 0, 0, 0, 0, 4344, 0, 65433, 6076, 0, + 0, 74764, 12074, 0, 0, 0, 0, 12934, 119555, 65432, 128877, 0, 6071, + 65434, 0, 65435, 4053, 128623, 0, 0, 0, 0, 69823, 127463, 0, 121403, + 127473, 8421, 127472, 0, 43705, 502, 0, 65431, 0, 0, 0, 1303, 316, 7364, + 0, 2136, 0, 120796, 64365, 43480, 92639, 4860, 0, 127877, 0, 0, 9583, 0, + 5546, 0, 0, 0, 0, 0, 5544, 127475, 0, 70352, 5543, 128917, 72821, 12137, + 5548, 0, 0, 10007, 0, 127523, 6077, 0, 65452, 0, 119341, 11214, 65952, 0, + 72226, 0, 0, 1319, 74210, 65410, 67399, 92606, 0, 0, 119343, 0, 66716, + 83513, 4691, 128619, 9345, 621, 0, 0, 122889, 65411, 0, 74575, 121246, + 65408, 73899, 0, 9474, 2812, 119118, 65412, 3786, 65409, 8894, 83246, + 119611, 7923, 3716, 0, 0, 0, 0, 7012, 0, 128439, 9566, 0, 94176, 0, + 65012, 126242, 545, 9575, 0, 10050, 12718, 0, 8859, 6820, 0, 983979, + 120740, 0, 0, 9119, 2787, 0, 983981, 8507, 2012, 7985, 0, 0, 0, 0, + 194634, 0, 410, 0, 0, 120789, 120609, 0, 120378, 120379, 0, 0, 120374, + 72742, 120376, 120377, 120370, 120371, 120372, 120373, 3860, 120367, + 72205, 74031, 111131, 73685, 11748, 120365, 7941, 111134, 8749, 111132, + 12698, 111129, 361, 110793, 845, 0, 0, 0, 4562, 72241, 2926, 0, 4569, 0, + 110797, 43487, 0, 0, 0, 74287, 122885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6291, + 0, 0, 0, 9734, 0, 0, 0, 0, 127754, 7359, 83523, 43863, 0, 111150, 8769, + 111148, 111147, 111145, 4859, 111143, 111142, 0, 0, 0, 0, 12172, 111136, + 0, 127899, 111141, 64764, 4210, 111138, 0, 804, 0, 83520, 0, 70344, 0, 0, + 67202, 10091, 67200, 119257, 67206, 67205, 67204, 67203, 72302, 0, 0, 0, + 128959, 0, 1425, 92259, 119229, 11049, 0, 71480, 42649, 8482, 0, 0, + 66715, 67209, 11940, 67207, 664, 0, 0, 0, 70200, 127525, 0, 70194, 93061, + 111155, 68474, 111153, 6032, 67218, 67217, 7430, 194670, 70191, 0, 0, 0, + 0, 0, 41161, 0, 9765, 10993, 41162, 0, 70189, 1169, 111181, 0, 1905, + 6034, 41164, 64744, 43236, 0, 128800, 73110, 0, 0, 788, 0, 0, 111167, + 111128, 1663, 128976, 42901, 127237, 67211, 67210, 0, 0, 67215, 67214, + 67213, 67212, 111160, 111159, 111158, 111157, 0, 0, 0, 111161, 43612, 0, + 0, 0, 10855, 67223, 9355, 67221, 65198, 120355, 0, 221, 0, 0, 0, 121141, + 7191, 118930, 72208, 125212, 0, 0, 0, 0, 67228, 67227, 43333, 67225, 0, + 0, 0, 67229, 0, 7245, 0, 74405, 69922, 72219, 111178, 3873, 8367, 111174, + 111173, 111172, 43649, 0, 111177, 111176, 0, 11164, 0, 74403, 111171, + 111170, 111169, 7682, 74404, 1462, 10235, 0, 0, 0, 0, 0, 111130, 0, 0, + 74402, 0, 92299, 0, 0, 74052, 0, 126127, 120549, 0, 64295, 0, 0, 0, 0, 0, + 120662, 0, 0, 67231, 67230, 10755, 55257, 11155, 128568, 983136, 9470, 0, + 127540, 0, 69680, 64384, 0, 128607, 0, 0, 0, 0, 73764, 8204, 0, 0, 0, 0, + 0, 8728, 0, 10904, 73446, 19936, 7833, 0, 0, 0, 0, 92546, 0, 0, 0, 8537, + 0, 0, 0, 121244, 0, 0, 0, 128193, 0, 0, 0, 0, 3062, 0, 0, 0, 0, 0, 41160, + 41147, 41158, 0, 120777, 0, 41155, 111116, 111115, 111114, 0, 121332, + 111119, 111118, 111117, 0, 0, 129091, 0, 0, 0, 64594, 2456, 66867, 0, 0, + 0, 0, 3721, 0, 0, 1230, 2678, 0, 3597, 917795, 0, 0, 92215, 0, 67737, + 8352, 0, 0, 0, 64515, 121378, 0, 129128, 67846, 0, 0, 92466, 0, 0, 71338, + 0, 8660, 0, 0, 0, 0, 0, 4483, 0, 0, 0, 6080, 0, 0, 1746, 1315, 0, 70201, + 0, 13140, 74508, 0, 0, 4480, 0, 111113, 111112, 0, 67979, 0, 6360, 10897, + 111106, 605, 68302, 110737, 69875, 110735, 110736, 66681, 0, 0, 0, 0, 0, + 0, 0, 10877, 118868, 64885, 0, 0, 0, 0, 0, 0, 345, 0, 0, 64606, 9917, 0, + 0, 92196, 0, 1776, 8422, 43992, 0, 0, 0, 126543, 43328, 0, 0, 1295, 0, 42869, 0, 0, 0, 0, 128772, 65123, 125210, 11293, 11288, 0, 0, 65666, 0, 92369, 65420, 0, 0, 4252, 0, 0, 0, 706, 72800, 0, 0, 0, 65419, 92177, 0, 8419, 65421, 0, 66702, 0, 12670, 0, 0, 0, 0, 72825, 65422, 83008, 0, 0, - 0, 0, 0, 0, 9736, 4184, 65418, 0, 0, 74035, 0, 0, 0, 0, 0, 0, 0, 0, 7962, - 12211, 9837, 83505, 0, 0, 5719, 0, 0, 119068, 73777, 1857, 0, 9927, 0, - 983940, 0, 10037, 0, 74627, 78322, 78319, 7818, 0, 0, 0, 0, 0, 0, 65077, - 0, 78325, 78326, 78323, 43327, 43989, 0, 65828, 0, 0, 83499, 0, 68390, 0, - 110687, 78336, 78339, 9543, 78335, 78332, 78333, 0, 127964, 0, 0, 983895, - 0, 69448, 0, 71429, 0, 0, 0, 11914, 69431, 0, 0, 0, 9949, 0, 0, 119215, - 0, 12073, 0, 0, 0, 0, 0, 2260, 0, 0, 0, 0, 0, 0, 1939, 0, 0, 0, 69903, 0, - 0, 0, 0, 6643, 92477, 0, 0, 78330, 78331, 78328, 78329, 0, 92551, 0, 0, - 0, 0, 0, 72417, 0, 0, 0, 0, 78341, 78342, 120944, 78340, 129513, 127529, - 92350, 3784, 78350, 0, 78348, 78349, 78345, 43324, 78343, 78344, 2231, 0, - 0, 0, 42467, 0, 0, 42894, 78363, 13281, 78360, 78361, 78356, 78358, - 78353, 64899, 0, 41149, 0, 43162, 68096, 41150, 0, 10571, 67162, 67161, - 67160, 67159, 6947, 41152, 887, 9249, 6565, 0, 74366, 0, 67158, 67157, 0, - 10831, 67175, 67174, 120232, 65827, 43325, 67178, 10168, 67176, 0, 0, - 9190, 128497, 9666, 41997, 0, 0, 0, 0, 0, 0, 129411, 0, 78508, 0, 78351, - 78352, 0, 0, 72839, 983730, 0, 126604, 0, 0, 0, 983417, 0, 2270, 0, 0, 0, - 78365, 0, 67189, 72818, 0, 0, 0, 0, 0, 0, 0, 72833, 0, 78366, 78367, 0, - 0, 0, 0, 10137, 6121, 10995, 0, 71050, 8119, 0, 71052, 0, 0, 0, 0, 0, 0, - 0, 1394, 0, 0, 128960, 0, 67184, 2998, 67182, 67181, 67188, 67187, 67186, - 67185, 0, 0, 0, 0, 67180, 42003, 0, 0, 67193, 67192, 67191, 67190, 67197, - 67196, 67195, 67194, 0, 72770, 43315, 71051, 0, 1593, 0, 125120, 619, - 4635, 0, 72875, 0, 128859, 0, 0, 0, 0, 67199, 67198, 0, 42790, 42006, 0, - 0, 0, 0, 10757, 9347, 127767, 0, 0, 74227, 0, 0, 74116, 128423, 121073, - 120860, 0, 92427, 0, 0, 0, 0, 64590, 0, 4371, 0, 0, 92478, 0, 0, 73977, - 0, 0, 127847, 0, 120862, 0, 64550, 73745, 70451, 0, 121013, 0, 0, 0, - 129286, 0, 0, 0, 0, 9131, 0, 125214, 0, 0, 0, 64260, 0, 12606, 0, 0, 0, - 0, 562, 0, 0, 0, 66455, 127533, 3219, 0, 0, 0, 1037, 0, 64491, 0, 983676, - 78572, 78580, 4568, 549, 0, 0, 0, 0, 0, 128095, 70851, 0, 0, 0, 0, 0, 0, - 0, 10825, 8079, 118962, 0, 0, 0, 128855, 0, 13071, 0, 0, 41049, 42840, - 43614, 129341, 74881, 74596, 127191, 5212, 0, 66402, 119191, 0, 9747, 0, - 0, 0, 983989, 41047, 1668, 0, 0, 0, 1187, 0, 74416, 0, 0, 0, 0, 3240, - 128518, 9213, 0, 0, 0, 127174, 69822, 0, 0, 0, 0, 1623, 0, 0, 0, 0, 0, 0, - 11272, 0, 73914, 65048, 1909, 42172, 0, 0, 10736, 11580, 72228, 7615, 0, - 0, 4237, 66576, 0, 65815, 68083, 0, 0, 0, 3489, 0, 0, 0, 0, 0, 0, 127146, - 3796, 6800, 0, 65582, 0, 129521, 0, 0, 68036, 0, 0, 64857, 121213, - 126493, 0, 66308, 0, 0, 64634, 127817, 0, 0, 0, 0, 3246, 0, 43972, - 128643, 0, 0, 0, 0, 120751, 0, 0, 0, 0, 1496, 42827, 0, 942, 2378, - 119213, 0, 0, 0, 0, 9510, 1232, 8139, 0, 0, 0, 11409, 0, 6382, 0, 66319, - 121237, 0, 0, 0, 127887, 2374, 0, 8475, 120844, 66313, 0, 0, 64879, - 119298, 0, 0, 70869, 0, 0, 129025, 0, 7705, 11942, 0, 0, 3309, 0, 0, 0, - 83345, 983847, 0, 0, 1280, 6998, 128104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 74239, 983073, 0, 0, 0, 6078, 121354, 0, 1475, 0, 9938, 6084, 0, 983976, - 0, 0, 0, 3256, 0, 43973, 0, 0, 0, 8727, 0, 0, 0, 110831, 110832, 10562, - 110830, 0, 0, 0, 3248, 0, 0, 9015, 0, 0, 3635, 64337, 0, 0, 43852, 7195, - 0, 2007, 64431, 0, 0, 0, 0, 0, 0, 0, 65613, 77909, 0, 0, 0, 0, 119218, - 7984, 11670, 74434, 127770, 4176, 0, 2034, 69442, 11154, 65891, 0, 0, - 318, 2038, 0, 0, 0, 3649, 13149, 42145, 42798, 3634, 0, 0, 128483, 0, 0, - 0, 11402, 120954, 94032, 74238, 0, 43313, 0, 0, 7938, 0, 1761, 0, 65379, - 68386, 128185, 1159, 71183, 0, 0, 0, 66687, 120851, 0, 41680, 0, 0, 0, - 1514, 11668, 67891, 9313, 0, 128490, 67877, 0, 41681, 0, 0, 12848, 69982, - 67873, 0, 74278, 0, 0, 12649, 0, 0, 1194, 3242, 9761, 9555, 8598, 0, - 120524, 0, 1551, 65447, 129414, 0, 0, 0, 0, 67875, 0, 3495, 66648, - 125079, 0, 73024, 983228, 0, 0, 10641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11131, - 0, 0, 0, 0, 0, 42685, 92354, 193, 0, 0, 0, 42667, 0, 0, 92318, 119661, 0, - 1362, 9558, 0, 0, 0, 7351, 73789, 0, 0, 4426, 0, 0, 0, 0, 7276, 42163, - 5220, 0, 0, 67822, 0, 0, 0, 0, 41692, 0, 72283, 0, 0, 3223, 65492, 0, 0, - 4549, 983687, 0, 0, 0, 10807, 0, 0, 0, 42182, 8688, 12866, 0, 3294, 0, 0, - 128101, 0, 64514, 0, 43329, 0, 0, 0, 0, 119061, 0, 43422, 0, 0, 128618, - 0, 42729, 0, 3215, 120982, 68880, 917564, 0, 0, 0, 65682, 0, 0, 65924, 0, - 983804, 0, 1501, 0, 118807, 0, 0, 9607, 0, 65794, 72243, 983046, 10989, - 0, 74399, 0, 0, 7152, 0, 0, 129530, 7483, 125083, 0, 8104, 70128, 7474, - 0, 72233, 0, 0, 0, 8141, 0, 42537, 0, 0, 0, 0, 0, 0, 127307, 42934, 0, 0, - 0, 0, 0, 0, 64517, 0, 0, 1650, 0, 0, 128502, 7901, 3238, 0, 65556, 0, 0, - 65158, 43416, 74959, 0, 7527, 0, 43319, 0, 0, 45, 0, 0, 0, 0, 0, 7347, 0, - 0, 0, 13129, 0, 9084, 0, 8737, 0, 0, 0, 66808, 9639, 7912, 2620, 0, 3564, - 0, 0, 0, 0, 75049, 0, 2853, 0, 0, 0, 0, 0, 2850, 8084, 0, 0, 71446, - 92284, 43122, 0, 0, 0, 0, 72214, 0, 74767, 0, 7331, 110646, 0, 8245, 0, - 3158, 92396, 3983, 0, 923, 0, 69397, 292, 0, 126548, 0, 3221, 1763, 0, 0, - 0, 0, 7253, 0, 68391, 75002, 0, 3637, 12996, 0, 70461, 0, 0, 3228, 0, 0, - 0, 0, 0, 0, 120833, 118939, 0, 7696, 0, 0, 0, 0, 43316, 4177, 0, 9089, 0, - 128805, 0, 64500, 68133, 0, 0, 1856, 100572, 0, 6379, 0, 0, 0, 3208, 0, - 0, 0, 0, 0, 0, 129402, 0, 0, 0, 2033, 0, 0, 0, 55254, 7740, 0, 0, 0, + 0, 0, 0, 0, 9736, 4184, 65418, 0, 0, 74035, 0, 0, 0, 0, 0, 0, 129447, 0, + 7962, 12211, 9837, 83505, 0, 0, 5719, 0, 0, 119068, 73777, 1857, 0, 9927, + 0, 983940, 0, 10037, 0, 73695, 78322, 78319, 7818, 0, 0, 127769, 0, 0, 0, + 65077, 0, 78325, 78326, 78323, 43327, 43989, 0, 65828, 0, 0, 83499, 0, + 68390, 0, 110687, 78336, 78339, 9543, 78335, 78332, 78333, 0, 127964, 0, + 129552, 983895, 0, 69448, 0, 71429, 0, 0, 0, 11914, 69431, 0, 0, 0, 9949, + 0, 0, 119215, 0, 12073, 0, 0, 0, 0, 0, 2260, 0, 0, 0, 0, 0, 0, 1939, 0, + 0, 0, 69903, 0, 0, 0, 0, 6643, 92477, 0, 0, 78330, 78331, 78328, 78329, + 0, 92551, 0, 0, 0, 0, 0, 72417, 0, 0, 0, 0, 78341, 78342, 120944, 78340, + 129513, 127529, 92350, 3784, 78350, 0, 78348, 78349, 78345, 43324, 78343, + 78344, 2231, 0, 0, 0, 42467, 0, 0, 42894, 78363, 13281, 78360, 78361, + 78356, 78358, 78353, 64899, 0, 41149, 0, 43162, 68096, 41150, 0, 10571, + 67162, 67161, 67160, 67159, 6947, 41152, 887, 9249, 6565, 64806, 74366, + 0, 67158, 67157, 0, 10831, 67175, 67174, 120232, 65827, 43325, 67178, + 10168, 67176, 0, 0, 9190, 128497, 9666, 41997, 0, 0, 0, 0, 0, 0, 129411, + 0, 78508, 0, 78351, 78352, 0, 0, 72839, 983730, 0, 126604, 0, 0, 0, + 983417, 0, 2270, 0, 0, 0, 78365, 0, 67189, 72818, 0, 0, 0, 0, 0, 0, 0, + 72833, 0, 78366, 78367, 0, 0, 0, 0, 10137, 6121, 10995, 0, 71050, 8119, + 0, 71052, 0, 0, 0, 0, 0, 0, 0, 1394, 0, 0, 128960, 0, 67184, 2998, 67182, + 67181, 67188, 67187, 67186, 67185, 0, 0, 0, 0, 67180, 42003, 0, 0, 67193, + 67192, 67191, 67190, 67197, 67196, 67195, 67194, 0, 72770, 43315, 71051, + 0, 1593, 0, 125120, 619, 4635, 0, 72875, 0, 128859, 0, 0, 0, 0, 67199, + 67198, 0, 42790, 42006, 0, 0, 0, 128998, 10757, 9347, 127767, 0, 0, + 74227, 78904, 0, 74116, 128423, 121073, 120860, 0, 92427, 0, 0, 0, 0, + 64590, 0, 4371, 0, 0, 92478, 0, 0, 73977, 0, 0, 127847, 0, 120862, 0, + 64550, 73745, 70451, 0, 121013, 0, 0, 0, 129286, 0, 0, 0, 0, 9131, 0, + 125214, 0, 0, 0, 64260, 0, 12606, 0, 0, 0, 0, 562, 0, 0, 129648, 66455, + 127533, 3219, 0, 0, 0, 1037, 0, 64491, 0, 983676, 78572, 78580, 4568, + 549, 0, 0, 0, 0, 0, 128095, 70851, 0, 0, 0, 0, 0, 0, 0, 10825, 8079, + 118962, 0, 0, 0, 128855, 0, 13071, 0, 0, 41049, 42840, 43614, 129341, + 74881, 74596, 127191, 5212, 0, 66402, 119191, 0, 9747, 0, 0, 0, 983989, + 41047, 1668, 0, 0, 0, 1187, 0, 74416, 0, 0, 0, 0, 3240, 128518, 9213, 0, + 0, 0, 127174, 69822, 0, 0, 0, 0, 1623, 0, 0, 0, 0, 0, 0, 11272, 0, 73914, + 65048, 1909, 42172, 0, 0, 10736, 11580, 72228, 7615, 0, 0, 4237, 66576, + 0, 65815, 68083, 0, 0, 0, 3489, 0, 0, 0, 0, 0, 0, 127146, 3796, 6800, 0, + 65582, 0, 129521, 0, 0, 68036, 0, 0, 64857, 121213, 126493, 0, 66308, 0, + 0, 64634, 127817, 0, 0, 0, 0, 3246, 0, 43972, 128643, 0, 0, 0, 0, 120751, + 0, 0, 0, 0, 1496, 42827, 0, 942, 2378, 119213, 0, 0, 0, 0, 9510, 1232, + 8139, 0, 0, 0, 11409, 0, 6382, 0, 66319, 121237, 0, 0, 0, 127887, 2374, + 0, 8475, 120844, 66313, 0, 0, 64879, 119298, 0, 0, 70869, 0, 0, 129025, + 0, 7705, 11942, 0, 0, 3309, 0, 0, 0, 83345, 983847, 0, 0, 1280, 6998, + 128104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74239, 983073, 0, 0, 0, 6078, + 121354, 0, 1475, 0, 9938, 6084, 0, 983976, 0, 0, 0, 3256, 0, 43973, 0, 0, + 0, 8727, 0, 0, 0, 110831, 110832, 10562, 110830, 0, 0, 0, 3248, 0, 0, + 9015, 0, 0, 3635, 64337, 0, 0, 43852, 7195, 0, 2007, 64431, 0, 0, 0, 0, + 0, 0, 0, 65613, 77909, 0, 0, 0, 0, 119218, 7984, 11670, 74434, 127770, + 4176, 0, 2034, 69442, 11154, 65891, 0, 0, 318, 2038, 0, 0, 0, 3649, + 13149, 42145, 42798, 3634, 0, 0, 128483, 0, 0, 0, 11402, 120954, 94032, + 74238, 0, 43313, 0, 0, 7938, 0, 1761, 0, 65379, 68386, 128185, 1159, + 71183, 0, 0, 0, 66687, 120851, 0, 41680, 0, 0, 0, 1514, 11668, 67891, + 9313, 0, 128490, 67877, 0, 41681, 0, 0, 12848, 69982, 67873, 0, 74278, 0, + 0, 12649, 0, 0, 1194, 3242, 9761, 9555, 8598, 0, 120524, 0, 1551, 65447, + 129414, 126211, 0, 0, 0, 67875, 0, 3495, 66648, 125079, 0, 73024, 983228, + 0, 0, 10641, 0, 0, 0, 77845, 0, 0, 0, 0, 0, 11131, 0, 0, 0, 0, 0, 42685, + 92354, 193, 0, 0, 0, 42667, 0, 0, 92318, 119661, 0, 1362, 9558, 0, 0, 0, + 7351, 73789, 0, 0, 4426, 0, 0, 0, 0, 7276, 42163, 5220, 0, 0, 67822, 0, + 0, 0, 0, 41692, 0, 72283, 0, 0, 3223, 65492, 0, 0, 4549, 983687, 0, 0, 0, + 10807, 0, 0, 0, 42182, 8688, 12866, 0, 3294, 0, 0, 128101, 0, 64514, 0, + 43329, 0, 0, 0, 0, 119061, 0, 43422, 0, 0, 128618, 0, 42729, 0, 3215, + 120982, 68880, 917564, 0, 0, 0, 65682, 0, 0, 65924, 0, 983804, 0, 1501, + 0, 118807, 0, 0, 9607, 0, 65794, 72243, 983046, 10989, 0, 74399, 0, 0, + 7152, 0, 0, 129530, 7483, 125083, 0, 8104, 70128, 7474, 0, 72233, 0, 0, + 0, 8141, 0, 42537, 69612, 0, 0, 0, 0, 0, 127307, 42934, 0, 0, 0, 0, 0, 0, + 64517, 0, 0, 1650, 0, 0, 128502, 7901, 3238, 0, 65556, 0, 0, 65158, + 43416, 74959, 0, 7527, 0, 43319, 0, 0, 45, 0, 0, 0, 0, 0, 7347, 0, 0, 0, + 13129, 0, 9084, 0, 8737, 0, 0, 0, 66808, 9639, 7912, 2620, 0, 3564, 0, 0, + 0, 0, 75049, 0, 2853, 0, 0, 0, 0, 0, 2850, 8084, 0, 0, 71446, 92284, + 43122, 0, 0, 0, 0, 72214, 0, 74767, 0, 7331, 110646, 0, 8245, 0, 3158, + 92396, 3983, 0, 923, 0, 69397, 292, 0, 126548, 0, 3221, 1763, 0, 0, 0, 0, + 7253, 0, 68391, 75002, 0, 3637, 12996, 0, 70461, 0, 0, 3228, 0, 0, 0, 0, + 0, 0, 120833, 118939, 0, 7696, 0, 0, 0, 0, 43316, 4177, 0, 9089, 0, + 128805, 72116, 64500, 68133, 0, 0, 1856, 100572, 0, 6379, 0, 0, 0, 3208, + 0, 0, 0, 0, 0, 0, 129402, 0, 0, 0, 2033, 0, 0, 0, 55254, 7740, 0, 0, 0, 128197, 0, 93988, 0, 67612, 0, 0, 41689, 129380, 0, 0, 6646, 0, 0, 0, 983945, 0, 0, 4573, 0, 0, 0, 0, 0, 92961, 0, 128222, 41688, 0, 0, 0, 8314, 0, 0, 0, 0, 0, 66721, 0, 0, 121033, 0, 128226, 0, 0, 0, 13164, 0, @@ -24528,20 +25172,20 @@ static unsigned int code_hash[] = { 983288, 0, 11112, 0, 92321, 43318, 0, 0, 0, 0, 126518, 120604, 0, 983286, 0, 983281, 0, 983782, 0, 9958, 0, 125108, 0, 0, 0, 2433, 128602, 0, 3352, 0, 0, 0, 0, 0, 0, 305, 567, 67662, 0, 69979, 65242, 0, 41695, 0, 0, 0, - 7837, 917625, 917624, 5337, 917622, 7325, 43312, 917619, 68742, 917617, + 7837, 917625, 129002, 5337, 917622, 7325, 43312, 917619, 68742, 917617, 74086, 68777, 917614, 917613, 10973, 917611, 1372, 128768, 917608, 917607, 1254, 917605, 917604, 93967, 917602, 65228, 113753, 0, 67723, 8068, 0, 0, 983951, 0, 3245, 64393, 119069, 0, 0, 0, 0, 0, 0, 0, 983279, 0, 119563, 0, 0, 0, 126638, 0, 0, 43322, 0, 0, 0, 0, 92698, 3226, 67695, 0, 0, 983939, 10200, 0, 128779, 127821, 0, 65610, 0, 0, 0, 3585, 250, - 983272, 43320, 0, 0, 0, 0, 1152, 0, 1688, 0, 0, 0, 0, 0, 121040, 128340, + 129598, 43320, 0, 0, 0, 0, 1152, 0, 1688, 0, 0, 0, 0, 0, 121040, 128340, 0, 0, 0, 2107, 0, 129048, 0, 0, 0, 43868, 0, 0, 0, 128239, 0, 0, 127777, 0, 6927, 42267, 42261, 11464, 3365, 0, 0, 0, 0, 0, 41869, 0, 0, 0, 43326, 0, 11519, 0, 5530, 5210, 0, 983970, 0, 5208, 0, 128842, 0, 2424, 7976, 0, 0, 3244, 5529, 0, 73894, 128852, 5432, 0, 5527, 0, 78484, 0, 5528, 0, 0, - 120281, 0, 0, 43545, 120282, 0, 0, 0, 42565, 0, 0, 3206, 120278, 0, 0, 0, - 0, 0, 211, 3216, 83407, 0, 120998, 3220, 68750, 0, 0, 8951, 5214, 0, - 8118, 0, 10768, 8735, 0, 5852, 124952, 0, 0, 0, 0, 0, 2623, 0, 0, 0, + 120281, 0, 0, 43545, 120282, 0, 0, 73686, 42565, 0, 0, 3206, 120278, 0, + 0, 0, 0, 0, 211, 3216, 83407, 0, 120998, 3220, 68750, 0, 0, 8951, 5214, + 0, 8118, 0, 10768, 8735, 0, 5852, 124952, 0, 0, 0, 0, 0, 2623, 0, 0, 0, 127388, 4698, 66509, 0, 0, 4701, 0, 120289, 74225, 120284, 8267, 0, 1421, 66426, 0, 0, 2625, 92724, 0, 74309, 0, 0, 0, 7850, 120296, 69639, 127032, 0, 0, 43384, 12660, 110663, 0, 0, 110706, 110661, 0, 92380, 0, 0, 69649, @@ -24555,7 +25199,7 @@ static unsigned int code_hash[] = { 7655, 120330, 0, 0, 10593, 1703, 0, 0, 8033, 69953, 0, 9810, 0, 0, 127949, 0, 119159, 10109, 0, 73898, 0, 71730, 126704, 0, 0, 917620, 1965, 917621, 0, 0, 73887, 0, 0, 0, 6314, 0, 8501, 0, 0, 0, 41317, 0, 5417, - 983586, 0, 0, 9353, 68148, 41315, 0, 11161, 0, 41314, 0, 0, 126562, + 983586, 0, 0, 9353, 68148, 41315, 0, 11161, 0, 41314, 194892, 0, 126562, 119236, 634, 0, 0, 0, 69779, 4355, 12016, 0, 9654, 12856, 6924, 7660, 0, 0, 0, 0, 0, 42692, 0, 74604, 0, 0, 0, 680, 6274, 0, 1181, 0, 3174, 67248, 0, 0, 0, 0, 113776, 10650, 917603, 92295, 70672, 118965, 0, 64644, @@ -24571,135 +25215,135 @@ static unsigned int code_hash[] = { 128455, 0, 519, 0, 64547, 5766, 0, 0, 0, 8848, 0, 41297, 0, 0, 0, 41300, 74468, 65160, 0, 0, 127511, 0, 0, 6558, 0, 0, 128686, 92775, 0, 71450, 41302, 127927, 0, 0, 128646, 68762, 11729, 8719, 9060, 0, 128796, 0, 0, - 0, 0, 0, 11734, 93011, 11730, 73450, 9593, 5757, 2403, 0, 55275, 0, + 0, 129682, 0, 11734, 93011, 11730, 73450, 9593, 5757, 2403, 0, 55275, 0, 11728, 65894, 0, 0, 0, 68741, 0, 0, 0, 43489, 4282, 983845, 0, 83497, 70328, 128103, 70324, 0, 0, 127509, 0, 8456, 0, 0, 0, 0, 78250, 0, 70320, - 120722, 9792, 0, 70326, 0, 0, 83500, 70322, 10019, 71701, 0, 6568, 4365, - 0, 0, 3647, 0, 41134, 128341, 0, 125043, 41135, 0, 0, 0, 0, 0, 0, 0, - 41137, 41139, 0, 6545, 0, 125139, 7597, 10528, 75054, 0, 3732, 73910, 0, - 0, 0, 7312, 983639, 9062, 93840, 11853, 0, 0, 128324, 41538, 0, 0, 0, 0, - 194706, 41531, 1263, 3720, 0, 68028, 0, 41524, 64692, 119635, 0, 41534, - 0, 92193, 0, 41168, 0, 67398, 127347, 3524, 0, 8831, 127349, 127357, 0, - 127360, 127352, 0, 0, 0, 0, 0, 0, 5845, 0, 0, 0, 71909, 8200, 0, 68460, - 0, 43283, 5551, 0, 0, 0, 6340, 983552, 100602, 0, 0, 0, 0, 0, 5422, 0, 0, - 0, 2471, 0, 0, 2749, 0, 73774, 10913, 129344, 0, 8666, 675, 74093, 0, - 194986, 0, 0, 0, 0, 0, 10928, 0, 41153, 0, 0, 0, 3738, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 42347, 12092, 9615, 7234, 74047, 0, 0, 0, 0, 0, 0, - 2934, 0, 0, 0, 0, 74507, 0, 74461, 0, 0, 74290, 0, 64562, 0, 64473, 0, 0, - 73728, 0, 11212, 0, 12128, 6534, 0, 0, 1901, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 69940, 65459, 68293, 92290, 128808, 0, 0, 0, 0, 64579, 128511, 0, 0, - 983332, 983340, 0, 0, 0, 5941, 0, 0, 65079, 0, 0, 0, 73961, 983334, 0, 0, - 0, 0, 0, 0, 10638, 0, 0, 0, 71486, 0, 0, 983349, 0, 43840, 129495, 0, - 5233, 983346, 64792, 71233, 0, 983324, 0, 0, 9847, 0, 1685, 595, 0, - 73971, 1292, 8940, 0, 11088, 0, 10004, 0, 0, 6541, 0, 0, 0, 5603, 9014, - 5606, 0, 538, 128705, 5602, 8467, 74391, 6547, 0, 0, 0, 0, 8458, 129534, - 8495, 0, 0, 917552, 10981, 78314, 0, 2465, 0, 0, 0, 9730, 9280, 0, 0, - 74155, 72766, 113690, 0, 504, 0, 120715, 0, 983606, 0, 0, 0, 0, 125024, - 0, 0, 732, 3737, 0, 1548, 0, 0, 1832, 5604, 0, 41141, 0, 5607, 72854, - 41142, 3745, 0, 0, 128137, 0, 0, 3869, 11937, 5725, 0, 66566, 7416, 5728, - 0, 0, 0, 11918, 66567, 5724, 118829, 5727, 0, 0, 0, 5723, 0, 128116, 0, - 0, 0, 0, 42532, 0, 12303, 0, 11423, 0, 983115, 68303, 74074, 0, 128267, - 6559, 64557, 71348, 0, 66763, 43019, 0, 10238, 0, 0, 43377, 0, 71346, - 124937, 9783, 42704, 0, 71719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41144, - 129465, 0, 0, 0, 72793, 92176, 0, 70682, 0, 8820, 0, 0, 0, 11515, 526, 0, - 0, 0, 0, 0, 0, 8635, 0, 0, 8288, 11815, 0, 0, 0, 1543, 3713, 0, 0, 0, - 68041, 127816, 0, 0, 64357, 0, 42082, 0, 0, 8987, 42081, 0, 0, 0, 0, 0, - 0, 6553, 0, 0, 11253, 0, 0, 5475, 0, 0, 0, 119334, 12990, 1160, 42084, 0, - 0, 0, 0, 360, 0, 0, 128274, 5863, 3137, 0, 983315, 0, 0, 10959, 3146, 0, - 127374, 0, 68341, 13076, 3135, 983298, 0, 0, 3142, 0, 94068, 10819, - 128479, 0, 74635, 12877, 119867, 73967, 0, 70808, 0, 0, 0, 0, 6163, 0, - 113728, 0, 0, 0, 8603, 0, 0, 3306, 0, 43392, 0, 0, 5751, 0, 0, 0, 0, 0, - 7403, 0, 118933, 0, 0, 64783, 92658, 0, 0, 0, 0, 0, 65569, 7021, 0, 0, 0, - 0, 0, 6540, 6974, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43585, 0, 6551, 983974, 0, - 0, 0, 0, 0, 72216, 8977, 602, 120814, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 983624, 74812, 0, 0, 0, 9475, 0, 65105, 0, 983219, 0, 43592, 7831, - 66751, 0, 0, 73915, 0, 43593, 0, 43591, 43061, 0, 0, 43589, 43584, 0, - 13113, 0, 0, 43590, 8766, 9087, 0, 0, 41574, 78337, 0, 42900, 6376, 0, 0, - 0, 0, 9854, 0, 0, 0, 0, 0, 0, 0, 2909, 0, 0, 0, 6529, 0, 0, 3751, 0, 0, - 0, 1798, 0, 0, 1354, 0, 13152, 6557, 12430, 0, 94098, 0, 0, 0, 68123, - 128097, 0, 0, 0, 71264, 0, 11082, 0, 65677, 8682, 42054, 92595, 42045, - 9804, 0, 0, 3595, 0, 0, 0, 0, 42399, 0, 0, 0, 0, 0, 7324, 0, 0, 0, 8797, - 77895, 0, 64888, 7167, 2356, 95, 0, 0, 0, 42286, 0, 0, 69999, 0, 120877, - 0, 0, 42324, 129359, 0, 0, 43492, 0, 43406, 0, 0, 0, 0, 0, 43400, 0, 0, - 71720, 0, 66435, 0, 0, 3201, 514, 74502, 0, 43396, 0, 64493, 0, 43404, - 11218, 0, 0, 43398, 0, 0, 41341, 0, 6564, 1463, 41342, 0, 5293, 0, 0, - 3733, 0, 0, 41344, 0, 0, 0, 0, 41346, 0, 0, 0, 0, 0, 0, 0, 0, 0, 983745, - 0, 0, 0, 65272, 0, 0, 1270, 1132, 0, 0, 0, 66655, 0, 0, 74314, 64761, 0, - 110853, 8510, 0, 0, 0, 0, 0, 0, 0, 0, 69692, 0, 0, 42383, 69690, 0, - 69700, 13141, 0, 92465, 0, 0, 0, 41566, 0, 0, 129334, 127171, 0, 0, 0, 0, - 0, 0, 0, 6308, 0, 0, 2611, 0, 66881, 0, 65063, 0, 0, 0, 0, 4484, 8747, - 110597, 128369, 0, 0, 0, 0, 0, 0, 12902, 0, 0, 7299, 0, 0, 12107, 7100, - 10905, 65010, 0, 125135, 66018, 9284, 0, 0, 0, 0, 0, 0, 0, 12010, 0, - 126093, 120949, 121032, 0, 0, 0, 0, 0, 0, 0, 0, 6618, 3562, 66365, 0, - 42234, 12648, 128039, 0, 0, 0, 41309, 9764, 41316, 0, 0, 13230, 41299, 0, - 0, 68365, 0, 0, 0, 0, 0, 0, 4153, 0, 0, 128047, 0, 0, 42889, 0, 129322, - 41578, 0, 41577, 0, 68092, 0, 6533, 0, 41570, 0, 72414, 0, 41580, 74628, - 0, 12901, 0, 0, 0, 0, 71461, 41360, 0, 0, 4743, 0, 0, 0, 0, 68398, - 110781, 5890, 110779, 111103, 3739, 8695, 92514, 0, 3964, 8984, 111095, - 68288, 0, 0, 70000, 111090, 111089, 111088, 3956, 82952, 111093, 6563, - 111091, 41305, 0, 0, 12067, 41312, 0, 0, 0, 0, 0, 8175, 0, 3600, 0, 934, - 0, 0, 173, 0, 0, 110784, 110785, 1750, 110783, 41358, 68368, 1807, 0, - 92298, 0, 5889, 0, 0, 0, 67127, 0, 0, 121395, 6982, 1721, 0, 7891, 0, - 42160, 67129, 4512, 983771, 69460, 0, 0, 0, 0, 0, 120716, 0, 0, 0, 0, 0, - 119140, 3975, 72253, 74087, 0, 12672, 0, 0, 0, 0, 0, 0, 121100, 0, 0, - 41095, 3962, 68242, 2932, 41101, 3954, 6457, 4513, 0, 0, 0, 0, 1468, 0, - 0, 55237, 128230, 0, 127244, 55238, 41080, 0, 0, 4320, 74104, 0, 0, 0, 0, - 77918, 0, 128384, 8256, 0, 72413, 0, 8879, 0, 0, 8770, 0, 0, 92214, 0, 0, - 128786, 4283, 0, 0, 68361, 0, 74826, 0, 0, 0, 0, 127954, 65106, 42761, - 121516, 4581, 8411, 0, 0, 72259, 0, 93037, 0, 0, 0, 92452, 4392, 0, - 10786, 69661, 0, 8184, 0, 0, 7396, 0, 0, 69788, 0, 43512, 7965, 111039, - 111038, 111037, 111036, 41350, 0, 0, 0, 2294, 64501, 68034, 0, 68405, - 111034, 0, 0, 111030, 111029, 71105, 111027, 0, 111033, 92200, 111031, 0, - 6764, 0, 0, 111026, 111025, 111024, 65203, 128010, 0, 0, 0, 3210, 0, 0, - 0, 0, 82958, 127970, 82957, 0, 68875, 10043, 82963, 1186, 41571, 0, 5209, - 9464, 82960, 66657, 5207, 65062, 5213, 0, 0, 41348, 41568, 128803, 3253, - 111045, 111044, 74067, 111042, 111049, 5596, 111047, 111046, 0, 64887, 0, - 5217, 111041, 72252, 0, 0, 0, 0, 2635, 92760, 0, 0, 0, 92742, 0, 0, 0, 0, - 0, 64558, 0, 0, 67083, 0, 0, 0, 5784, 0, 0, 0, 0, 4011, 0, 0, 0, 0, 4254, - 0, 111054, 5600, 111052, 111051, 10447, 5598, 1207, 111055, 0, 3501, - 42582, 0, 111050, 0, 1124, 5597, 983496, 983497, 9321, 129464, 75040, - 983493, 0, 1719, 68356, 68354, 9671, 1125, 2721, 0, 983498, 983499, 7631, - 5488, 111082, 0, 0, 5491, 111086, 8937, 0, 3236, 74187, 5490, 0, 5489, - 8522, 68358, 111069, 6300, 111067, 111066, 0, 0, 111071, 111070, 0, 9875, - 7593, 111065, 0, 0, 43182, 0, 68379, 3311, 111058, 111057, 3746, 11016, - 65752, 111061, 0, 43423, 68775, 0, 111056, 72225, 0, 0, 127120, 0, 2232, - 0, 0, 0, 0, 0, 126555, 0, 0, 8656, 0, 128358, 0, 0, 983485, 983486, - 917563, 983484, 983481, 983482, 0, 0, 0, 0, 0, 111183, 128043, 983490, - 1036, 983488, 111075, 1723, 111073, 111072, 111079, 41579, 111077, - 111076, 10705, 0, 983480, 74486, 71693, 740, 983476, 983477, 129645, 0, - 0, 74846, 92255, 0, 0, 0, 0, 0, 10438, 74487, 73798, 13285, 0, 0, 0, - 5690, 0, 93992, 0, 0, 13095, 0, 127857, 121419, 7321, 121203, 13254, - 70176, 75070, 0, 0, 0, 0, 127845, 3247, 317, 0, 0, 0, 0, 917543, 0, - 10173, 0, 0, 0, 0, 0, 5223, 0, 0, 119564, 5226, 0, 94044, 5880, 94065, - 7758, 0, 0, 5224, 5487, 94041, 5692, 41725, 983462, 0, 5695, 41711, 0, - 43171, 0, 94049, 5691, 983467, 866, 1488, 983466, 983452, 65665, 94036, - 983451, 74797, 0, 0, 11039, 983460, 11145, 71211, 983459, 983456, 983457, - 983454, 983455, 42492, 43402, 125208, 3302, 0, 72842, 68809, 0, 0, - 120885, 121300, 0, 7856, 8690, 0, 73076, 0, 0, 0, 73091, 0, 69925, - 120635, 65153, 0, 0, 0, 0, 0, 0, 4540, 0, 0, 0, 0, 11844, 121209, 8863, - 0, 75061, 0, 6389, 0, 42371, 83205, 8790, 120911, 0, 111125, 71168, 8869, - 0, 0, 42060, 0, 9648, 111123, 71170, 10270, 10286, 10318, 10382, 43529, - 0, 0, 0, 0, 0, 70110, 43835, 119520, 70111, 127086, 118815, 127084, - 127083, 8767, 0, 0, 41281, 0, 5201, 0, 6215, 67072, 6214, 13101, 0, 0, - 65268, 67073, 0, 0, 127976, 72995, 127073, 10511, 42075, 0, 127071, - 129509, 0, 67115, 127069, 111293, 127068, 0, 127067, 0, 74845, 0, 42071, - 43156, 0, 0, 0, 0, 7954, 0, 0, 0, 8485, 4671, 0, 0, 4740, 0, 0, 42618, - 78294, 3064, 6212, 0, 0, 0, 9554, 0, 83044, 0, 126598, 0, 78291, 0, 6213, - 12885, 0, 129086, 64720, 0, 983907, 0, 0, 0, 11430, 0, 7518, 9317, 0, - 10342, 10406, 0, 119259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73825, 0, 0, 0, 8786, - 10390, 0, 0, 917601, 93034, 0, 7924, 0, 43307, 0, 0, 0, 0, 0, 0, 118843, - 9623, 435, 0, 0, 12893, 8093, 9079, 0, 0, 0, 0, 0, 64430, 0, 10294, - 10326, 0, 0, 0, 0, 0, 0, 3623, 125188, 83378, 0, 43197, 0, 0, 0, 78296, - 0, 0, 0, 7914, 0, 92170, 0, 2624, 0, 0, 0, 120859, 67110, 11058, 0, - 67107, 0, 0, 0, 0, 120793, 0, 0, 6717, 10619, 0, 0, 0, 11832, 128664, 0, - 0, 0, 70202, 0, 0, 0, 3232, 73824, 74581, 0, 0, 0, 41889, 0, 0, 1161, - 41895, 74103, 9701, 0, 0, 129385, 73819, 120588, 5012, 0, 41362, 0, - 68507, 0, 0, 0, 0, 0, 41364, 0, 0, 41352, 41361, 0, 41366, 0, 70129, + 120722, 9792, 0, 70326, 0, 0, 83500, 70322, 10019, 71701, 123617, 6568, + 4365, 0, 0, 3647, 0, 41134, 128341, 0, 125043, 41135, 0, 0, 0, 0, 0, + 123616, 0, 41137, 41139, 0, 6545, 0, 125139, 7597, 10528, 75054, 0, 3732, + 73910, 0, 0, 0, 7312, 983639, 9062, 93840, 11853, 0, 0, 128324, 41538, 0, + 0, 0, 0, 194706, 41531, 1263, 3720, 0, 68028, 0, 41524, 64692, 119635, 0, + 41534, 0, 92193, 0, 41168, 0, 67398, 127347, 3524, 0, 8831, 127349, + 127357, 0, 127360, 127352, 0, 0, 0, 0, 0, 0, 5845, 0, 0, 0, 71909, 8200, + 0, 68460, 0, 43283, 5551, 0, 0, 0, 6340, 983552, 100602, 0, 0, 0, 0, 0, + 5422, 0, 0, 0, 2471, 0, 0, 2749, 0, 73774, 10913, 72122, 0, 8666, 675, + 74093, 0, 194986, 0, 0, 0, 0, 0, 10928, 0, 41153, 0, 0, 0, 3738, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42347, 12092, 9615, 7234, 74047, 0, 0, 0, + 123639, 0, 0, 2934, 0, 0, 0, 0, 74507, 0, 74461, 0, 0, 74290, 0, 64562, + 0, 64473, 0, 0, 73728, 0, 11212, 0, 12128, 6534, 0, 0, 1901, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 69940, 65459, 68293, 92290, 128808, 3770, 0, 0, 0, + 64579, 128511, 0, 0, 983332, 983340, 0, 0, 0, 5941, 0, 0, 65079, 0, 0, 0, + 73961, 983334, 0, 0, 0, 0, 0, 0, 10638, 0, 0, 0, 71486, 0, 0, 983349, 0, + 43840, 129495, 0, 5233, 983346, 64792, 71233, 0, 983324, 0, 0, 9847, 0, + 1685, 595, 0, 73971, 1292, 8940, 0, 11088, 0, 10004, 0, 0, 6541, 0, 0, 0, + 5603, 9014, 5606, 0, 538, 128705, 5602, 8467, 74391, 6547, 0, 0, 0, 0, + 8458, 129534, 8495, 0, 0, 917552, 10981, 78314, 0, 2465, 0, 0, 0, 9730, + 9280, 0, 0, 74155, 72766, 113690, 0, 504, 0, 120715, 0, 983606, 0, 0, 0, + 123141, 125024, 0, 0, 732, 3737, 0, 1548, 0, 0, 1832, 5604, 0, 41141, 0, + 5607, 72854, 41142, 3745, 0, 0, 128137, 0, 0, 3869, 11937, 5725, 0, + 66566, 7416, 5728, 0, 0, 0, 11918, 66567, 5724, 118829, 5727, 0, 0, 0, + 5723, 0, 128116, 0, 0, 0, 0, 42532, 0, 12303, 0, 11423, 0, 983115, 68303, + 74074, 0, 128267, 6559, 64557, 71348, 0, 66763, 43019, 0, 10238, 0, 0, + 43377, 0, 71346, 124937, 9783, 42704, 0, 71719, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 41144, 129465, 0, 0, 0, 72793, 92176, 0, 70682, 0, 8820, 0, 0, + 0, 11515, 526, 0, 0, 0, 0, 0, 0, 8635, 0, 0, 8288, 11815, 0, 0, 0, 1543, + 3713, 0, 0, 0, 68041, 127816, 0, 0, 64357, 0, 42082, 0, 0, 8987, 42081, + 0, 0, 0, 0, 0, 0, 6553, 0, 0, 11253, 0, 0, 5475, 0, 0, 0, 119334, 12990, + 1160, 42084, 0, 123152, 0, 0, 360, 0, 0, 128274, 5863, 3137, 0, 983315, + 0, 0, 10959, 3146, 0, 127374, 0, 68341, 13076, 3135, 983298, 0, 0, 3142, + 0, 94068, 10819, 128479, 0, 74635, 12877, 119867, 73967, 0, 70808, 0, 0, + 0, 0, 6163, 0, 113728, 0, 0, 0, 8603, 0, 0, 3306, 0, 43392, 0, 0, 5751, + 0, 0, 0, 0, 0, 7403, 0, 118933, 0, 0, 64783, 92658, 0, 0, 129592, 0, 0, + 65569, 7021, 0, 0, 0, 0, 0, 6540, 6974, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43585, + 0, 6551, 983974, 0, 0, 0, 0, 0, 72216, 8977, 602, 120814, 0, 0, 0, 72119, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 983624, 74812, 0, 0, 0, 9475, 0, 65105, 0, + 983219, 0, 43592, 7831, 66751, 0, 0, 73915, 0, 43593, 0, 43591, 43061, 0, + 0, 43589, 43584, 0, 13113, 0, 0, 43590, 8766, 9087, 0, 0, 41574, 78337, + 0, 42900, 6376, 0, 0, 0, 0, 9854, 0, 0, 0, 0, 0, 0, 0, 2909, 0, 0, 0, + 6529, 110930, 75004, 3751, 0, 0, 0, 1798, 0, 0, 1354, 0, 13152, 6557, + 12430, 0, 94098, 0, 0, 0, 68123, 128097, 0, 0, 0, 71264, 0, 11082, 0, + 65677, 8682, 42054, 92595, 42045, 9804, 0, 0, 3595, 0, 0, 0, 0, 42399, 0, + 0, 0, 65541, 0, 7324, 0, 0, 0, 8797, 77895, 0, 64888, 7167, 2356, 95, 0, + 0, 0, 42286, 0, 0, 69999, 0, 120877, 0, 0, 42324, 129359, 0, 0, 43492, 0, + 43406, 0, 0, 0, 0, 0, 43400, 0, 0, 71720, 0, 66435, 0, 0, 3201, 514, + 74502, 0, 43396, 0, 64493, 0, 43404, 11218, 0, 0, 43398, 0, 0, 41341, + 129485, 6564, 1463, 41342, 0, 5293, 0, 0, 3733, 0, 0, 41344, 0, 0, 0, 0, + 41346, 0, 0, 0, 0, 0, 0, 0, 0, 0, 983745, 0, 0, 0, 65272, 0, 0, 1270, + 1132, 0, 0, 0, 66655, 0, 0, 74314, 64761, 0, 110853, 8510, 0, 129600, 0, + 0, 0, 0, 0, 0, 69692, 0, 0, 42383, 69690, 0, 69700, 13141, 0, 92465, 0, + 0, 0, 41566, 0, 0, 129334, 127171, 0, 0, 0, 0, 0, 0, 0, 6308, 0, 0, 2611, + 0, 66881, 0, 65063, 0, 0, 0, 0, 4484, 8747, 110597, 128369, 0, 0, 0, 0, + 0, 0, 12902, 0, 0, 7299, 0, 0, 12107, 7100, 10905, 65010, 0, 125135, + 66018, 9284, 0, 0, 0, 0, 0, 0, 0, 12010, 0, 126093, 120949, 121032, 0, 0, + 0, 0, 0, 0, 0, 0, 6618, 3562, 66365, 0, 42234, 12648, 128039, 0, 0, 0, + 41309, 9764, 41316, 0, 0, 13230, 41299, 0, 0, 68365, 0, 0, 0, 0, 0, 0, + 4153, 0, 0, 128047, 0, 0, 42889, 0, 129322, 41578, 0, 41577, 0, 68092, 0, + 6533, 0, 41570, 0, 72414, 0, 41580, 74628, 0, 12901, 0, 0, 0, 0, 71461, + 41360, 0, 0, 4743, 0, 0, 0, 0, 68398, 110781, 5890, 110779, 111103, 3739, + 8695, 92514, 0, 3964, 8984, 111095, 68288, 0, 0, 70000, 111090, 111089, + 111088, 3956, 82952, 111093, 6563, 111091, 41305, 0, 0, 12067, 41312, 0, + 0, 0, 0, 0, 8175, 0, 3600, 0, 934, 0, 0, 173, 0, 0, 110784, 110785, 1750, + 110783, 41358, 68368, 1807, 0, 92298, 0, 5889, 0, 0, 0, 67127, 0, 0, + 121395, 6982, 1721, 0, 7891, 0, 42160, 67129, 4512, 983771, 69460, 0, 0, + 0, 0, 0, 120716, 0, 0, 0, 0, 0, 119140, 3975, 72253, 74087, 0, 12672, 0, + 0, 0, 0, 0, 0, 121100, 0, 0, 41095, 3962, 68242, 2932, 41101, 3954, 6457, + 4513, 0, 0, 0, 0, 1468, 0, 0, 55237, 128230, 0, 127244, 55238, 41080, 0, + 0, 4320, 74104, 0, 0, 0, 0, 77918, 0, 128384, 8256, 0, 72413, 0, 8879, 0, + 0, 8770, 0, 0, 92214, 0, 0, 128786, 4283, 0, 0, 68361, 0, 74826, 0, 0, 0, + 0, 127954, 65106, 42761, 121516, 4581, 8411, 0, 0, 72259, 0, 93037, 0, 0, + 0, 92452, 4392, 0, 10786, 69661, 0, 8184, 0, 0, 7396, 0, 0, 69788, 0, + 43512, 7965, 111039, 111038, 111037, 111036, 41350, 0, 0, 0, 2294, 64501, + 68034, 0, 68405, 111034, 0, 0, 111030, 111029, 71105, 111027, 0, 111033, + 92200, 111031, 0, 6764, 0, 0, 111026, 111025, 111024, 65203, 128010, 0, + 0, 0, 3210, 0, 0, 0, 0, 82958, 127970, 82957, 0, 68875, 10043, 82963, + 1186, 41571, 0, 5209, 9464, 82960, 66657, 5207, 65062, 5213, 0, 0, 41348, + 41568, 128803, 3253, 111045, 111044, 74067, 111042, 111049, 5596, 111047, + 111046, 0, 64887, 0, 5217, 111041, 72252, 0, 0, 0, 0, 2635, 92760, 0, 0, + 0, 92742, 0, 113672, 0, 0, 0, 64558, 0, 0, 67083, 0, 0, 0, 5784, 0, 0, 0, + 0, 4011, 0, 0, 0, 0, 4254, 0, 111054, 5600, 111052, 111051, 10447, 5598, + 1207, 111055, 0, 3501, 42582, 0, 111050, 0, 1124, 5597, 983496, 983497, + 9321, 129464, 75040, 983493, 0, 1719, 68356, 68354, 9671, 1125, 2721, 0, + 983498, 983499, 7631, 5488, 111082, 0, 0, 5491, 111086, 8937, 0, 3236, + 74187, 5490, 0, 5489, 8522, 68358, 111069, 6300, 111067, 111066, 0, 0, + 111071, 111070, 0, 9875, 7593, 111065, 0, 0, 43182, 0, 68379, 3311, + 111058, 111057, 3746, 11016, 65752, 111061, 0, 43423, 68775, 0, 111056, + 72225, 0, 0, 127120, 0, 2232, 0, 0, 0, 0, 0, 126555, 0, 0, 8656, 0, + 128358, 0, 0, 983485, 983486, 917563, 983484, 983481, 983482, 0, 0, 0, 0, + 0, 111183, 128043, 983490, 1036, 983488, 111075, 1723, 111073, 111072, + 111079, 41579, 111077, 111076, 10705, 0, 983480, 74486, 71693, 740, + 983476, 983477, 129645, 0, 0, 74846, 92255, 0, 0, 0, 0, 0, 10438, 74487, + 73798, 13285, 0, 0, 0, 5690, 0, 93992, 0, 0, 13095, 0, 127857, 121419, + 7321, 121203, 13254, 70176, 75070, 0, 0, 0, 0, 127845, 3247, 317, 0, 0, + 0, 0, 917543, 0, 10173, 0, 0, 0, 0, 0, 5223, 0, 0, 119564, 5226, 0, + 94044, 5880, 94065, 7758, 0, 0, 5224, 5487, 94041, 5692, 41725, 983462, + 0, 5695, 41711, 0, 43171, 0, 94049, 5691, 983467, 866, 1488, 983466, + 983452, 65665, 94036, 983451, 74797, 0, 0, 11039, 983460, 11145, 71211, + 983459, 983456, 983457, 983454, 983455, 42492, 43402, 125208, 3302, 0, + 72842, 68809, 0, 0, 120885, 121300, 0, 7856, 8690, 0, 73076, 0, 0, 0, + 73091, 0, 69925, 120635, 65153, 0, 0, 0, 0, 0, 0, 4540, 0, 0, 0, 0, + 11844, 121209, 8863, 0, 75061, 0, 6389, 0, 42371, 83205, 8790, 120911, 0, + 111125, 71168, 8869, 0, 0, 42060, 0, 9648, 111123, 71170, 10270, 10286, + 10318, 10382, 43529, 0, 0, 0, 0, 0, 70110, 43835, 119520, 70111, 127086, + 118815, 127084, 127083, 8767, 0, 0, 41281, 0, 5201, 0, 6215, 67072, 6214, + 13101, 0, 0, 65268, 67073, 0, 0, 127976, 72995, 127073, 10511, 42075, 0, + 127071, 129509, 0, 67115, 127069, 111293, 127068, 0, 127067, 0, 74845, 0, + 42071, 43156, 0, 0, 0, 0, 7954, 0, 0, 0, 8485, 4671, 0, 0, 4740, 0, 0, + 42618, 78294, 3064, 6212, 0, 0, 0, 9554, 0, 83044, 0, 126598, 0, 78291, + 0, 6213, 12885, 0, 129086, 64720, 0, 983907, 0, 0, 0, 11430, 0, 7518, + 9317, 0, 3729, 10406, 0, 119259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73825, 0, 0, + 129599, 8786, 10390, 0, 0, 917601, 93034, 0, 7924, 0, 43307, 0, 0, 0, 0, + 0, 0, 118843, 9623, 435, 0, 0, 12893, 8093, 9079, 0, 0, 0, 0, 0, 64430, + 0, 10294, 10326, 0, 0, 0, 0, 0, 0, 3623, 125188, 83378, 0, 43197, 0, 0, + 0, 78296, 0, 0, 0, 7914, 0, 92170, 0, 2624, 0, 0, 0, 120859, 67110, + 11058, 0, 67107, 0, 0, 0, 0, 120793, 0, 0, 6717, 10619, 0, 0, 0, 11832, + 128664, 0, 0, 0, 70202, 0, 0, 0, 3232, 73824, 74581, 0, 0, 0, 41889, 0, + 0, 1161, 41895, 74103, 9701, 0, 0, 129385, 73819, 120588, 5012, 0, 41362, + 0, 68507, 0, 0, 0, 0, 0, 41364, 0, 0, 41352, 41361, 0, 41366, 0, 70129, 129065, 917, 0, 119934, 119923, 92421, 119912, 0, 119924, 119916, 0, 71482, 0, 0, 0, 0, 128583, 0, 7022, 0, 4739, 0, 5802, 9816, 8615, 0, 0, 491, 65837, 0, 0, 128644, 0, 8426, 11092, 9891, 0, 0, 0, 41881, 118823, - 0, 7394, 42648, 0, 68448, 9095, 7741, 12684, 41885, 0, 0, 0, 0, 5815, 0, - 0, 0, 127392, 0, 0, 41878, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120804, 0, 0, + 3736, 7394, 42648, 0, 68448, 9095, 7741, 12684, 41885, 0, 0, 0, 0, 5815, + 0, 0, 0, 127392, 0, 0, 41878, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120804, 0, 0, 2267, 0, 78289, 78359, 78288, 0, 0, 78318, 65920, 0, 0, 7057, 9408, 9409, 9410, 9411, 9412, 9413, 9414, 9415, 9416, 9417, 9418, 9419, 9420, 9421, 5897, 9423, 917933, 127107, 0, 127108, 917937, 127963, 8955, 9399, 9400, @@ -24714,7 +25358,7 @@ static unsigned int code_hash[] = { 41357, 8011, 42885, 42887, 41354, 0, 0, 10026, 5472, 120554, 1191, 121110, 5470, 128784, 5476, 0, 0, 0, 0, 42874, 78281, 42876, 6304, 78283, 0, 2675, 120690, 0, 0, 128954, 0, 0, 5478, 5904, 0, 0, 0, 7291, 77848, - 43761, 13067, 0, 0, 127809, 120360, 69731, 77856, 77857, 77854, 77855, + 43761, 13067, 0, 0, 126249, 120360, 69731, 77856, 77857, 77854, 77855, 77852, 77853, 77850, 10750, 43714, 77858, 0, 0, 0, 12887, 120364, 127745, 77866, 77867, 77864, 77865, 9929, 5199, 77859, 1120, 0, 0, 0, 9486, 7554, 0, 77868, 72832, 0, 0, 5894, 70069, 0, 0, 92511, 70358, 1323, 13162, @@ -24747,50 +25391,51 @@ static unsigned int code_hash[] = { 119973, 0, 119983, 119982, 119985, 119984, 119979, 119978, 0, 119980, 119670, 129297, 0, 11284, 119987, 70097, 65155, 119988, 0, 9363, 0, 0, 0, 5900, 93990, 7889, 2722, 128770, 0, 0, 0, 0, 2282, 0, 0, 0, 68093, 0, 0, - 0, 0, 0, 70150, 0, 0, 0, 0, 0, 70146, 983079, 119967, 71330, 70148, 0, 0, - 94006, 70144, 119964, 110677, 110678, 110675, 110676, 0, 110674, 4226, 0, - 0, 5732, 71327, 0, 0, 65119, 0, 0, 92971, 64770, 0, 0, 6093, 0, 0, 1395, - 0, 0, 0, 121179, 786, 0, 43174, 64340, 0, 125269, 0, 983643, 125138, - 10132, 0, 0, 0, 0, 0, 93956, 0, 68444, 0, 92437, 0, 0, 0, 92656, 0, 0, 0, - 1399, 121463, 0, 121465, 121464, 120808, 241, 121469, 4907, 0, 0, 0, 0, - 0, 0, 0, 0, 127904, 0, 0, 42780, 0, 0, 0, 4217, 0, 0, 0, 0, 0, 0, 0, - 43099, 3965, 0, 0, 0, 13300, 0, 0, 43057, 0, 0, 0, 0, 0, 65372, 0, 6410, - 126073, 125252, 70468, 0, 0, 0, 119558, 0, 0, 0, 0, 0, 0, 43188, 2626, - 7762, 0, 0, 0, 127183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67726, 0, 126993, - 1542, 0, 0, 92550, 0, 0, 74311, 0, 0, 10181, 2150, 0, 0, 0, 0, 0, 68053, - 6029, 72852, 0, 0, 0, 0, 8993, 0, 0, 0, 93968, 606, 0, 0, 0, 0, 4311, 0, - 6027, 126615, 4322, 0, 65207, 0, 0, 983901, 0, 0, 2735, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 70806, 0, 0, 0, 92783, 0, 0, 65817, 55288, 127934, 66564, - 8530, 0, 7709, 0, 121202, 66560, 128528, 917595, 12876, 66561, 0, 121430, - 983938, 7789, 5855, 809, 0, 0, 72853, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 64386, 0, 74909, 0, 120607, 66416, 83360, 6532, 0, 0, 0, 0, 128224, 0, 0, - 0, 0, 43091, 92287, 0, 0, 129312, 0, 0, 0, 11361, 0, 0, 8153, 128105, 0, - 10741, 0, 0, 0, 0, 0, 64706, 0, 0, 0, 78870, 9466, 78866, 9824, 0, 0, 0, - 120977, 915, 0, 0, 43865, 0, 0, 0, 67131, 70096, 67137, 0, 983227, 78864, - 6730, 78862, 68161, 0, 78861, 126542, 0, 0, 94010, 983683, 0, 0, 66043, - 0, 0, 43107, 0, 0, 92343, 0, 73879, 0, 0, 0, 6103, 0, 0, 92470, 0, 12889, - 0, 127137, 0, 0, 0, 0, 0, 0, 119262, 83028, 0, 0, 0, 0, 0, 0, 0, 13118, - 7700, 917537, 9690, 0, 0, 68080, 512, 0, 72792, 0, 0, 77892, 632, 77890, - 77891, 42529, 0, 0, 0, 0, 0, 0, 0, 128273, 0, 0, 7379, 64581, 5386, 0, 0, - 10633, 72316, 64488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124956, 71307, 0, 0, 0, - 0, 0, 92370, 0, 0, 0, 0, 0, 71314, 1801, 0, 0, 120867, 0, 0, 77888, 2085, - 702, 77887, 77884, 77885, 13074, 77883, 66299, 0, 0, 12106, 0, 0, 1755, - 0, 77897, 77898, 1163, 3102, 77893, 77894, 0, 0, 0, 0, 69227, 0, 77901, - 77902, 77899, 77900, 65171, 0, 0, 0, 70157, 0, 0, 0, 0, 2908, 0, 11177, - 64902, 64950, 0, 128740, 66906, 124959, 70499, 0, 0, 0, 64352, 0, 125031, - 1007, 0, 9199, 0, 127371, 118992, 41890, 0, 2730, 119072, 0, 5428, 0, - 73771, 0, 0, 0, 0, 71458, 0, 0, 0, 68089, 0, 44012, 0, 71456, 0, 9158, - 66878, 69905, 92440, 0, 0, 0, 484, 0, 0, 0, 194742, 0, 0, 0, 0, 572, - 7041, 2736, 0, 0, 93962, 0, 68628, 0, 0, 5438, 5222, 5381, 43114, 0, - 5193, 5125, 5456, 5509, 0, 120664, 113700, 0, 0, 0, 3430, 0, 42905, 0, - 74929, 6050, 0, 0, 129197, 0, 0, 10908, 0, 0, 0, 64617, 0, 0, 3957, 0, 0, - 0, 674, 0, 0, 2946, 5354, 5251, 5328, 5307, 3759, 72318, 8364, 5123, 0, - 5281, 5469, 5121, 0, 0, 0, 5130, 0, 0, 0, 0, 0, 1221, 2733, 0, 0, 0, - 72321, 0, 0, 0, 0, 0, 0, 5939, 0, 0, 0, 71867, 68400, 128216, 10321, - 10289, 0, 10385, 0, 0, 0, 0, 0, 118943, 0, 11411, 0, 5938, 0, 120865, 0, - 0, 10401, 10337, 0, 0, 0, 0, 0, 0, 0, 78277, 0, 0, 12165, 0, 0, 9885, 0, - 8077, 0, 127908, 0, 0, 0, 0, 0, 4220, 10725, 10433, 0, 68395, 4987, - 64519, 0, 0, 0, 0, 120356, 0, 11733, 0, 120792, 0, 127233, 0, 0, 0, + 0, 0, 0, 70150, 0, 0, 0, 0, 129651, 70146, 983079, 119967, 71330, 70148, + 0, 0, 94006, 70144, 119964, 110677, 110678, 110675, 110676, 0, 110674, + 4226, 0, 123165, 5732, 71327, 0, 0, 65119, 0, 0, 92971, 64770, 0, 0, + 6093, 0, 0, 1395, 0, 0, 0, 121179, 786, 0, 43174, 64340, 0, 125269, 0, + 983643, 125138, 10132, 0, 0, 0, 0, 0, 93956, 0, 68444, 0, 92437, 123143, + 0, 0, 92656, 0, 0, 0, 1399, 121463, 0, 121465, 121464, 120808, 241, + 121469, 4907, 0, 0, 0, 0, 0, 0, 0, 0, 127904, 0, 0, 42780, 0, 0, 0, 4217, + 0, 0, 0, 0, 72158, 0, 0, 43099, 3965, 0, 0, 0, 13300, 0, 0, 43057, 0, 0, + 0, 0, 0, 65372, 0, 6410, 126073, 125252, 70468, 0, 0, 0, 119558, 0, 0, 0, + 0, 0, 0, 43188, 2626, 7762, 0, 0, 0, 127183, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 67726, 0, 126993, 1542, 0, 0, 92550, 0, 0, 74311, 0, 0, 10181, 2150, + 0, 0, 0, 0, 0, 68053, 6029, 72852, 0, 0, 0, 0, 8993, 0, 0, 0, 93968, 606, + 0, 0, 0, 0, 4311, 0, 6027, 126615, 4322, 0, 65207, 0, 0, 983901, 0, 0, + 2735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70806, 0, 0, 0, 92783, 0, 0, + 65817, 55288, 127934, 66564, 8530, 0, 7709, 0, 121202, 66560, 128528, + 917595, 12876, 66561, 0, 121430, 983938, 7789, 5855, 809, 0, 0, 72853, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64386, 0, 74909, 0, 120607, 66416, 83360, + 6532, 0, 0, 0, 0, 128224, 0, 0, 0, 0, 43091, 92287, 0, 0, 129312, 0, 0, + 0, 11361, 0, 0, 8153, 128105, 0, 10741, 0, 0, 0, 0, 0, 64706, 0, 0, 0, + 78870, 9466, 78866, 9824, 0, 0, 0, 120977, 915, 0, 0, 43865, 0, 0, 0, + 67131, 70096, 67137, 0, 129614, 78864, 6730, 78862, 68161, 0, 78861, + 126542, 0, 0, 94010, 983683, 0, 0, 66043, 0, 0, 43107, 0, 0, 92343, 0, + 73879, 0, 0, 0, 6103, 0, 0, 92470, 0, 12889, 0, 127137, 0, 0, 0, 0, 0, 0, + 119262, 83028, 0, 0, 0, 0, 0, 0, 0, 13118, 7700, 917537, 9690, 0, 0, + 68080, 512, 0, 72792, 0, 0, 77892, 632, 77890, 77891, 42529, 0, 0, 0, 0, + 0, 0, 0, 128273, 0, 0, 7379, 64581, 5386, 0, 0, 10633, 72316, 64488, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 124956, 71307, 0, 0, 0, 0, 0, 92370, 0, 0, 0, 0, + 0, 71314, 1801, 0, 0, 120867, 0, 0, 77888, 2085, 702, 77887, 77884, + 77885, 13074, 77883, 66299, 0, 0, 12106, 0, 0, 1755, 0, 77897, 77898, + 1163, 3102, 77893, 77894, 0, 0, 0, 0, 69227, 0, 77901, 77902, 77899, + 77900, 65171, 0, 0, 0, 70157, 0, 0, 0, 0, 2908, 0, 11177, 64902, 64950, + 0, 128740, 66906, 124959, 70499, 0, 0, 0, 64352, 0, 125031, 1007, 0, + 9199, 0, 127371, 118992, 41890, 0, 2730, 119072, 0, 5428, 0, 73771, 0, 0, + 0, 0, 71458, 0, 0, 0, 68089, 0, 44012, 0, 71456, 0, 9158, 66878, 69905, + 92440, 0, 0, 0, 484, 0, 0, 0, 194742, 0, 0, 0, 0, 572, 7041, 2736, 0, 0, + 93962, 0, 68628, 0, 0, 5438, 5222, 5381, 43114, 0, 5193, 5125, 5456, + 5509, 0, 120664, 113700, 0, 0, 0, 3430, 0, 42905, 0, 74929, 6050, 0, 0, + 129197, 0, 0, 10908, 0, 0, 0, 64617, 0, 0, 3957, 0, 0, 0, 674, 0, 0, + 2946, 5354, 5251, 5328, 5307, 3759, 72318, 8364, 5123, 0, 5281, 5469, + 5121, 0, 0, 0, 5130, 0, 129608, 0, 0, 0, 1221, 2733, 0, 0, 0, 72321, 0, + 0, 0, 0, 0, 0, 5939, 0, 0, 0, 71867, 68400, 128216, 10321, 10289, 0, + 10385, 123164, 0, 0, 0, 0, 118943, 0, 11411, 0, 5938, 0, 120865, 0, 0, + 10401, 10337, 0, 0, 0, 0, 0, 0, 0, 78277, 0, 0, 12165, 0, 0, 9885, 0, + 8077, 0, 127908, 0, 0, 0, 0, 129138, 4220, 10725, 10433, 0, 68395, 4987, + 64519, 0, 0, 0, 123626, 120356, 0, 11733, 0, 120792, 0, 127233, 0, 0, 0, 92345, 68254, 983642, 77991, 0, 2724, 0, 0, 12313, 110619, 515, 119947, 119944, 119945, 119942, 119943, 119940, 119941, 119938, 8606, 4046, 4589, 4521, 0, 9141, 0, 0, 2741, 0, 0, 1370, 0, 0, 0, 0, 0, 0, 66880, 0, 66003, @@ -24800,94 +25445,95 @@ static unsigned int code_hash[] = { 110975, 0, 0, 0, 0, 1581, 64920, 93830, 12954, 963, 110973, 110972, 110971, 110969, 5278, 110967, 68621, 92222, 983449, 68625, 983447, 68617, 110960, 0, 0, 110965, 110964, 110963, 110962, 0, 0, 983439, 983440, - 983437, 983438, 983435, 92648, 127379, 0, 65137, 6483, 65392, 0, 4213, 0, - 41303, 0, 0, 0, 41306, 983217, 2698, 0, 0, 0, 68396, 0, 41304, 824, 0, - 78011, 72315, 78894, 110982, 78892, 64804, 9820, 119820, 110985, 110976, - 0, 6739, 0, 5481, 3490, 110978, 110977, 71706, 69947, 67702, 9124, 12688, - 119833, 0, 0, 119822, 119821, 119824, 68367, 42575, 119825, 119828, - 119827, 119948, 0, 71087, 68658, 119946, 8025, 0, 127024, 68675, 92445, - 71097, 983421, 0, 0, 0, 0, 983430, 2745, 11797, 110990, 983426, 9202, - 983424, 983425, 0, 0, 0, 10525, 5436, 74584, 110987, 110986, 121506, - 43080, 121508, 121507, 983415, 6246, 119958, 10921, 9723, 6777, 6776, - 6775, 0, 0, 70287, 92384, 0, 8669, 0, 0, 65093, 0, 78881, 2716, 0, 0, - 11252, 0, 68369, 0, 11060, 12985, 2711, 78872, 78027, 78026, 7992, 0, 0, - 0, 78033, 78032, 78877, 70724, 78029, 78028, 78031, 78030, 64535, 110998, - 10130, 110996, 0, 0, 111001, 111000, 127914, 983412, 78014, 5713, 110995, - 7570, 110993, 110992, 0, 11190, 0, 9026, 0, 74864, 7547, 78891, 0, 10008, - 10222, 0, 0, 9744, 0, 127193, 983408, 119656, 983406, 94070, 983404, - 983405, 983402, 9045, 78888, 4225, 78886, 78887, 68757, 78885, 78882, - 78883, 983397, 983398, 8405, 983396, 10423, 10359, 983391, 983392, 0, - 129149, 4215, 9789, 0, 4321, 12309, 983400, 41313, 0, 5368, 66886, 0, 0, - 5366, 0, 5372, 0, 0, 0, 7720, 7390, 2696, 0, 0, 8268, 0, 1790, 0, 0, - 118977, 0, 0, 0, 5376, 1835, 72313, 78704, 128089, 0, 0, 68655, 1180, 0, - 0, 0, 0, 0, 0, 0, 9122, 0, 11928, 0, 65283, 0, 0, 5971, 121171, 43500, - 1268, 65097, 983218, 0, 0, 0, 1427, 128440, 0, 5970, 3431, 72299, 983386, - 983387, 983384, 983385, 983382, 2738, 125066, 10455, 0, 74026, 0, 4222, - 6240, 0, 119013, 983389, 68377, 6248, 983373, 67815, 983371, 917907, - 92582, 0, 128698, 125215, 0, 2728, 65549, 64563, 983377, 983378, 0, - 128145, 0, 10713, 7166, 119559, 2622, 0, 0, 0, 0, 8954, 0, 0, 2632, - 42617, 10108, 1011, 42852, 12080, 2709, 0, 5716, 0, 0, 0, 0, 127100, - 69378, 0, 9515, 127098, 66465, 6451, 0, 127097, 8918, 983556, 0, 0, - 19950, 0, 0, 0, 44003, 0, 0, 0, 0, 0, 0, 983495, 74022, 0, 128795, 68643, - 67410, 0, 5721, 0, 0, 0, 121074, 11267, 983364, 66464, 5720, 983363, 0, - 4219, 5718, 8696, 5717, 0, 983370, 983878, 983368, 541, 983366, 983367, - 128237, 119089, 68389, 983352, 119949, 56, 4216, 10577, 0, 0, 77849, - 983360, 983357, 983358, 66899, 983356, 0, 0, 67628, 0, 0, 7086, 0, 67998, - 67621, 0, 2734, 0, 0, 67627, 118937, 0, 67625, 0, 0, 0, 42593, 0, 128217, - 0, 0, 119939, 0, 68180, 0, 0, 71104, 7442, 43665, 359, 41253, 68392, - 6239, 120599, 41256, 0, 67740, 111023, 111022, 111021, 9346, 69660, - 41254, 0, 43291, 78002, 0, 0, 124993, 93841, 0, 0, 0, 4368, 983500, 0, - 68137, 0, 0, 41024, 0, 0, 121359, 121420, 0, 0, 0, 4223, 0, 8574, 83502, - 0, 0, 0, 0, 0, 92718, 983636, 70432, 128323, 68382, 0, 0, 0, 0, 0, 4144, - 0, 83193, 6245, 0, 2732, 92644, 0, 0, 0, 83501, 0, 0, 0, 128005, 0, 0, 0, - 0, 3097, 0, 0, 77996, 0, 0, 10863, 111020, 111019, 111018, 0, 111015, - 111014, 111013, 111012, 118964, 0, 10216, 64293, 0, 0, 69393, 128331, - 12325, 111010, 8717, 111008, 0, 0, 0, 0, 8700, 0, 0, 68363, 10426, 0, - 71091, 10362, 0, 1715, 0, 0, 64918, 0, 43278, 42635, 0, 0, 65275, 0, 0, - 0, 0, 0, 1607, 466, 118949, 0, 0, 127918, 6243, 983882, 1350, 74195, - 64420, 1993, 5362, 10666, 2708, 92471, 0, 13143, 234, 3199, 0, 41268, - 6334, 6250, 0, 0, 73750, 0, 73762, 10458, 0, 8576, 127136, 0, 2704, - 64953, 0, 68211, 8322, 0, 5753, 0, 2694, 0, 0, 2439, 65104, 69804, 0, - 303, 74625, 92622, 0, 2437, 0, 9817, 4844, 0, 0, 0, 0, 0, 121120, 43292, - 0, 2441, 0, 0, 0, 0, 0, 2451, 2714, 0, 0, 43379, 127984, 74541, 753, - 5849, 0, 43089, 0, 0, 119534, 0, 0, 0, 0, 2726, 3107, 0, 0, 64937, 0, - 78841, 1408, 0, 4607, 0, 181, 0, 67728, 9539, 0, 0, 65201, 121121, 92973, - 64185, 4142, 64183, 0, 0, 0, 9706, 64178, 64177, 64176, 0, 64182, 64181, - 64180, 64179, 11401, 125124, 0, 1822, 0, 128581, 68055, 3865, 122918, 0, - 10500, 0, 119024, 0, 110732, 9830, 0, 0, 0, 65131, 0, 0, 0, 0, 74608, - 9567, 0, 9599, 8748, 0, 0, 9557, 0, 0, 0, 11494, 0, 0, 10865, 0, 43279, - 64186, 68521, 0, 64191, 64190, 8898, 64188, 129153, 41030, 78836, 0, 0, - 78820, 126100, 0, 78805, 78806, 78801, 78802, 6745, 78800, 0, 0, 0, - 110866, 0, 0, 0, 67838, 41039, 78809, 0, 0, 0, 0, 110869, 127045, 110867, - 110868, 127039, 4400, 0, 64207, 10275, 8925, 10371, 10307, 64202, 4248, - 0, 72802, 4541, 6299, 64204, 64203, 64201, 64200, 64199, 64198, 126471, - 0, 0, 0, 64193, 64192, 0, 9943, 64197, 64196, 64195, 64194, 13282, 42652, - 64174, 64173, 83495, 846, 72337, 9965, 74495, 72330, 83493, 83494, 2543, - 12163, 64170, 83490, 64167, 64166, 64165, 64164, 72333, 0, 64169, 64168, - 64949, 0, 10251, 10247, 64163, 64162, 2295, 43299, 43301, 129363, 0, - 70791, 0, 0, 550, 9910, 0, 0, 66579, 0, 0, 0, 9504, 0, 0, 10373, 0, 0, - 10261, 10253, 7821, 10277, 0, 74823, 1552, 0, 0, 129420, 0, 121435, - 19910, 0, 0, 118849, 121150, 0, 43985, 68051, 0, 69890, 121329, 78355, - 983757, 0, 66405, 2431, 0, 66852, 1809, 0, 0, 0, 73759, 1264, 0, 78676, - 11697, 121278, 9785, 64716, 0, 0, 0, 0, 121307, 0, 0, 42609, 128388, 0, - 66912, 127016, 0, 983885, 74229, 0, 6487, 93798, 70743, 0, 0, 0, 83484, - 83485, 83486, 83487, 83480, 8355, 7854, 83483, 954, 64927, 0, 41045, 0, - 41438, 0, 0, 10711, 0, 0, 0, 0, 64774, 13309, 10947, 66727, 0, 0, 0, - 66795, 0, 0, 0, 0, 0, 0, 0, 120634, 69228, 0, 0, 0, 0, 0, 0, 3060, 83478, - 9986, 0, 83473, 83474, 11698, 77880, 83469, 9916, 11701, 83472, 42586, 0, - 8320, 0, 119095, 0, 0, 1477, 43289, 0, 74358, 10884, 69446, 9908, 0, 0, - 0, 3414, 74304, 0, 0, 0, 0, 2110, 0, 68306, 0, 74532, 0, 0, 0, 0, 7164, - 0, 0, 0, 11950, 5392, 42248, 65129, 68656, 5397, 0, 0, 68136, 0, 0, 5395, - 72870, 5393, 354, 68615, 0, 0, 0, 0, 0, 0, 0, 0, 626, 0, 5895, 0, 0, - 5780, 0, 66407, 10220, 0, 71121, 43297, 0, 0, 11468, 64436, 0, 0, 0, - 73818, 3918, 0, 3797, 72786, 0, 0, 4140, 0, 71254, 0, 9030, 813, 0, - 68131, 4146, 119957, 5360, 0, 129498, 0, 0, 6249, 0, 0, 0, 0, 0, 73092, - 0, 4911, 988, 0, 73125, 0, 0, 0, 0, 0, 0, 74972, 0, 0, 0, 9825, 0, 0, - 12803, 126977, 11032, 67654, 6244, 0, 0, 68662, 0, 129351, 0, 0, 4169, 0, - 0, 0, 0, 121410, 120657, 0, 0, 68657, 128943, 78496, 0, 0, 5898, 74540, - 0, 41856, 93056, 917865, 125000, 127373, 83424, 83425, 83426, 73736, - 83420, 68870, 6448, 6835, 0, 4831, 83418, 83419, 67731, 0, 0, 0, 0, 0, 0, - 0, 78499, 0, 0, 0, 43288, 0, 0, 0, 0, 0, 43418, 0, 0, 0, 7876, 68132, + 983437, 983438, 983435, 92648, 127379, 0, 65137, 6483, 65392, 0, 4213, + 129649, 41303, 0, 0, 0, 41306, 983217, 2698, 0, 0, 0, 68396, 0, 41304, + 824, 0, 78011, 72315, 78894, 110982, 78892, 64804, 9820, 119820, 110985, + 110976, 0, 6739, 0, 5481, 3490, 110978, 110977, 71706, 69947, 67702, + 9124, 12688, 119833, 0, 0, 119822, 119821, 119824, 68367, 42575, 119825, + 119828, 119827, 119948, 0, 71087, 68658, 119946, 8025, 0, 127024, 68675, + 92445, 71097, 69613, 0, 0, 0, 0, 983430, 2745, 11797, 110990, 983426, + 9202, 983424, 983425, 0, 0, 0, 10525, 5436, 74584, 110987, 110986, + 121506, 43080, 121508, 121507, 983415, 6246, 119958, 10921, 9723, 6777, + 6776, 6775, 0, 0, 70287, 92384, 0, 8669, 0, 0, 65093, 0, 78881, 2716, 0, + 0, 11252, 0, 68369, 0, 11060, 12985, 2711, 78872, 78027, 78026, 7992, 0, + 0, 42938, 78033, 78032, 78877, 70724, 78029, 78028, 78031, 78030, 64535, + 110998, 10130, 110996, 0, 0, 111001, 111000, 127914, 983412, 78014, 5713, + 110995, 7570, 110993, 110992, 0, 11190, 0, 9026, 0, 74864, 7547, 78891, + 0, 10008, 10222, 0, 129543, 9744, 0, 127193, 983408, 119656, 983406, + 94070, 983404, 983405, 983402, 9045, 78888, 4225, 78886, 78887, 68757, + 78885, 78882, 78883, 983397, 983398, 8405, 983396, 10423, 10359, 983391, + 983392, 0, 129149, 4215, 9789, 0, 4321, 12309, 983400, 41313, 0, 5368, + 66886, 0, 0, 5366, 0, 5372, 0, 0, 0, 7720, 7390, 2696, 0, 0, 8268, 0, + 1790, 0, 0, 118977, 0, 0, 0, 5376, 1835, 72313, 78704, 128089, 0, 0, + 68655, 1180, 0, 0, 0, 0, 0, 0, 0, 9122, 0, 11928, 0, 65283, 0, 0, 5971, + 121171, 43500, 1268, 65097, 983218, 0, 0, 0, 1427, 128440, 0, 5970, 3431, + 72299, 983386, 983387, 983384, 983385, 983382, 2738, 125066, 10455, 0, + 74026, 0, 4222, 6240, 0, 119013, 983389, 68377, 6248, 983373, 67815, + 983371, 917907, 92582, 0, 128698, 125215, 0, 2728, 65549, 64563, 983377, + 983378, 0, 128145, 0, 10713, 7166, 119559, 2622, 0, 0, 0, 0, 8954, 0, + 94008, 2632, 42617, 10108, 1011, 42852, 12080, 2709, 0, 5716, 0, 0, 0, 0, + 127100, 69378, 0, 9515, 127098, 66465, 6451, 0, 127097, 8918, 983556, 0, + 0, 19950, 0, 0, 0, 44003, 0, 0, 0, 0, 0, 0, 983495, 74022, 0, 128795, + 68643, 67410, 0, 5721, 0, 0, 0, 121074, 11267, 983364, 66464, 5720, + 983363, 0, 4219, 5718, 8696, 5717, 0, 983370, 983878, 983368, 541, + 983366, 983367, 128237, 119089, 68389, 983352, 119949, 56, 4216, 10577, + 0, 0, 77849, 69620, 983357, 983358, 66899, 983356, 0, 0, 67628, 0, 0, + 7086, 0, 67998, 67621, 0, 2734, 69616, 0, 67627, 118937, 0, 67625, 0, 0, + 0, 42593, 0, 128217, 0, 0, 119939, 0, 68180, 0, 0, 71104, 7442, 43665, + 359, 41253, 68392, 6239, 120599, 41256, 0, 67740, 111023, 111022, 111021, + 9346, 69660, 41254, 0, 43291, 78002, 0, 0, 124993, 93841, 0, 0, 0, 4368, + 983500, 0, 68137, 0, 0, 41024, 0, 0, 121359, 121420, 0, 0, 0, 4223, 0, + 8574, 83502, 0, 0, 0, 0, 0, 92718, 983636, 70432, 128323, 68382, 0, 0, 0, + 0, 0, 4144, 0, 83193, 6245, 0, 2732, 92644, 0, 0, 0, 83501, 0, 0, 0, + 128005, 0, 0, 0, 0, 3097, 0, 0, 77996, 0, 0, 10863, 111020, 111019, + 111018, 0, 111015, 111014, 111013, 111012, 118964, 0, 10216, 64293, 0, 0, + 69393, 128331, 12325, 111010, 8717, 111008, 0, 0, 0, 0, 8700, 0, 0, + 68363, 10426, 0, 71091, 10362, 0, 1715, 0, 0, 64918, 0, 43278, 42635, 0, + 0, 65275, 0, 0, 0, 0, 0, 1607, 466, 118949, 0, 0, 127918, 6243, 983882, + 1350, 74195, 64420, 1993, 5362, 10666, 2708, 92471, 0, 13143, 234, 3199, + 0, 41268, 6334, 6250, 0, 0, 73750, 0, 73762, 10458, 0, 8576, 127136, 0, + 2704, 64953, 0, 68211, 8322, 0, 5753, 0, 2694, 0, 0, 2439, 65104, 69804, + 0, 303, 74625, 92622, 0, 2437, 0, 9817, 4844, 0, 0, 0, 0, 0, 121120, + 43292, 0, 2441, 0, 0, 0, 0, 0, 2451, 2714, 0, 0, 43379, 127984, 74541, + 753, 5849, 0, 43089, 0, 0, 119534, 0, 0, 0, 0, 2726, 3107, 0, 0, 64937, + 0, 78841, 1408, 0, 4607, 0, 181, 0, 67728, 9539, 0, 0, 65201, 121121, + 92973, 64185, 4142, 64183, 0, 0, 0, 9706, 64178, 64177, 64176, 0, 64182, + 64181, 64180, 64179, 11401, 125124, 0, 1822, 0, 128581, 68055, 3865, + 122918, 0, 10500, 129602, 119024, 0, 110732, 9830, 0, 0, 0, 65131, 0, 0, + 0, 0, 74608, 9567, 0, 9599, 8748, 0, 0, 9557, 0, 0, 0, 11494, 0, 0, + 10865, 0, 43279, 64186, 68521, 0, 64191, 64190, 8898, 64188, 129153, + 41030, 78836, 0, 0, 78820, 126100, 0, 78805, 78806, 78801, 78802, 6745, + 78800, 0, 0, 0, 110866, 0, 0, 73679, 67838, 41039, 78809, 0, 0, 0, 0, + 110869, 127045, 110867, 110868, 127039, 4400, 0, 64207, 10275, 8925, + 10371, 10307, 64202, 4248, 0, 72802, 4541, 6299, 64204, 64203, 64201, + 64200, 64199, 64198, 126471, 0, 0, 0, 64193, 64192, 0, 9943, 64197, + 64196, 64195, 64194, 13282, 42652, 64174, 64173, 83495, 846, 72337, 9965, + 74495, 72330, 83493, 83494, 2543, 12163, 64170, 83490, 64167, 64166, + 64165, 64164, 72333, 0, 64169, 64168, 64949, 0, 10251, 10247, 64163, + 64162, 2295, 43299, 43301, 129363, 0, 70791, 0, 0, 550, 9910, 0, 0, + 66579, 0, 0, 0, 9504, 0, 0, 10373, 0, 0, 10261, 10253, 7821, 10277, 0, + 74823, 1552, 0, 0, 129420, 0, 121435, 19910, 0, 0, 118849, 121150, 0, + 43985, 68051, 0, 69890, 121329, 78355, 983757, 0, 66405, 2431, 3744, + 66852, 1809, 0, 0, 0, 73759, 1264, 0, 78676, 11697, 121278, 9785, 64716, + 0, 0, 0, 0, 121307, 0, 0, 42609, 128388, 0, 66912, 127016, 0, 983885, + 74229, 0, 6487, 93798, 70743, 0, 0, 0, 83484, 83485, 83486, 83487, 83480, + 8355, 7854, 83483, 954, 64927, 0, 41045, 0, 41438, 0, 0, 10711, 0, 0, 0, + 0, 64774, 13309, 10947, 66727, 0, 0, 0, 66795, 0, 0, 0, 0, 0, 0, 0, + 120634, 69228, 0, 0, 0, 0, 0, 0, 3060, 83478, 9986, 0, 83473, 83474, + 11698, 77880, 83469, 9916, 11701, 83472, 42586, 0, 8320, 0, 119095, 0, 0, + 1477, 43289, 0, 74358, 10884, 69446, 9908, 0, 0, 0, 3414, 74304, 0, 0, 0, + 0, 2110, 0, 68306, 0, 74532, 0, 0, 0, 0, 7164, 0, 0, 0, 11950, 5392, + 42248, 65129, 68656, 5397, 129579, 0, 68136, 0, 0, 5395, 72870, 5393, + 354, 68615, 0, 0, 0, 0, 0, 126236, 0, 0, 626, 0, 5895, 0, 0, 5780, 0, + 66407, 10220, 0, 71121, 43297, 0, 0, 11468, 64436, 0, 0, 0, 73818, 3918, + 0, 3797, 72786, 0, 0, 4140, 0, 71254, 0, 9030, 813, 0, 68131, 4146, + 119957, 5360, 0, 129498, 0, 0, 6249, 0, 0, 0, 0, 0, 73092, 0, 4911, 988, + 0, 73125, 0, 42948, 0, 0, 0, 0, 74972, 0, 0, 0, 9825, 0, 0, 12803, + 126977, 11032, 67654, 6244, 0, 0, 68662, 0, 129351, 0, 72131, 4169, 0, 0, + 0, 0, 121410, 120657, 0, 0, 68657, 128943, 78496, 0, 0, 5898, 74540, 0, + 41856, 93056, 917865, 125000, 127373, 83424, 83425, 83426, 73736, 83420, + 68870, 6448, 6835, 0, 4831, 83418, 83419, 67731, 0, 0, 0, 0, 0, 0, 0, + 78499, 0, 0, 0, 43288, 0, 0, 0, 0, 0, 43418, 0, 0, 0, 7876, 68132, 917872, 0, 917870, 43378, 0, 0, 120890, 5892, 43605, 0, 0, 0, 129058, 0, 0, 6251, 83409, 83410, 83411, 83412, 126512, 0, 71092, 83408, 10114, 0, 0, 5387, 0, 0, 0, 0, 65553, 78346, 1747, 917849, 65109, 69240, 917852, @@ -24901,11 +25547,11 @@ static unsigned int code_hash[] = { 8957, 4139, 0, 0, 129336, 0, 0, 12740, 0, 92195, 12761, 127793, 12759, 0, 72304, 67169, 83467, 44002, 0, 83462, 83463, 83464, 12755, 12762, 41022, 67690, 64217, 476, 0, 983715, 0, 64212, 41020, 1382, 64209, 64216, 64215, - 64214, 64213, 0, 0, 0, 67584, 8720, 3908, 0, 0, 0, 0, 129434, 0, 0, 0, - 3849, 92324, 917908, 9778, 917906, 5891, 917912, 55, 917910, 917911, 0, + 64214, 64213, 0, 0, 0, 67584, 8720, 3908, 0, 0, 0, 0, 129434, 129576, 0, + 0, 3849, 92324, 94026, 9778, 917906, 5891, 917912, 55, 917910, 917911, 0, 0, 7935, 67586, 0, 1114, 92599, 67585, 78675, 0, 83447, 83449, 0, 0, 0, 64717, 0, 0, 0, 66884, 6292, 65303, 0, 6452, 917886, 917887, 66249, - 917885, 917890, 917891, 917888, 719, 0, 0, 917892, 0, 0, 0, 0, 10868, + 917885, 917890, 917891, 917888, 719, 0, 0, 917892, 0, 0, 0, 94083, 10868, 121333, 2349, 5902, 917896, 6335, 917902, 917899, 917900, 0, 64369, 0, 0, 0, 69245, 0, 126564, 0, 0, 128565, 0, 0, 0, 0, 0, 6454, 1229, 83457, 83458, 83450, 83451, 83452, 65100, 120508, 8224, 917873, 917874, 917879, @@ -24913,63 +25559,63 @@ static unsigned int code_hash[] = { 0, 0, 0, 0, 5925, 83436, 64330, 128400, 83431, 83432, 83433, 83434, 83427, 83428, 83429, 83430, 64928, 10543, 0, 0, 83446, 414, 0, 0, 83442, 6456, 83444, 83445, 11905, 83439, 66284, 83441, 0, 68337, 0, 83437, - 43832, 983139, 9751, 0, 128085, 11770, 0, 0, 0, 65061, 0, 0, 0, 0, 0, 0, - 121087, 0, 0, 69924, 0, 0, 0, 69913, 0, 121387, 0, 0, 0, 42038, 387, 0, - 12737, 0, 0, 43368, 0, 0, 0, 0, 0, 0, 121295, 0, 69400, 127309, 0, 375, - 0, 0, 0, 983886, 0, 0, 119202, 119203, 0, 43120, 0, 0, 119196, 119197, 0, - 4529, 119200, 119201, 119198, 119199, 0, 0, 69698, 13150, 64492, 0, 0, 0, - 0, 0, 42891, 66327, 74298, 0, 0, 0, 2587, 42193, 0, 6455, 0, 4241, 0, 0, - 0, 0, 0, 0, 0, 118821, 0, 0, 0, 125030, 0, 128684, 129390, 0, 5373, 0, 0, - 119232, 10015, 0, 0, 0, 68642, 0, 120855, 42040, 128827, 5779, 0, 42037, - 83282, 0, 0, 93040, 0, 0, 0, 127320, 6983, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 119588, 0, 92495, 74558, 0, 68138, 70163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 11144, 0, 2551, 0, 6453, 0, 6235, 0, 0, 129081, 72886, 44020, 11826, 0, - 7780, 5369, 118958, 0, 0, 5367, 66870, 0, 0, 5377, 0, 68143, 128624, - 78245, 5218, 0, 127333, 0, 0, 0, 0, 0, 1300, 0, 127334, 64505, 0, 0, - 119624, 1465, 0, 0, 0, 0, 0, 0, 0, 113694, 10729, 0, 0, 8839, 119243, 0, - 7785, 126530, 0, 0, 0, 0, 126603, 0, 0, 0, 3897, 0, 92331, 74417, 113704, - 0, 68127, 71425, 70688, 0, 0, 0, 0, 0, 3542, 0, 120685, 7951, 68152, - 118857, 0, 92972, 0, 0, 127311, 0, 0, 65150, 68031, 0, 0, 0, 0, 9985, 0, - 127328, 0, 0, 0, 0, 10830, 0, 615, 64490, 7574, 0, 0, 0, 12909, 127329, - 64559, 127332, 73951, 0, 67996, 2020, 0, 0, 0, 120701, 0, 983640, 0, 0, - 0, 92991, 0, 0, 9070, 0, 68411, 11281, 42829, 0, 1033, 0, 0, 0, 0, 0, - 65226, 0, 0, 0, 0, 0, 3450, 0, 7397, 0, 0, 42778, 10000, 41088, 449, 0, - 0, 68458, 113725, 0, 0, 10738, 69634, 0, 0, 41085, 0, 0, 0, 12764, 0, - 93058, 3596, 7322, 0, 0, 0, 0, 0, 0, 0, 0, 2092, 0, 0, 0, 121350, 10820, - 0, 0, 126567, 1853, 0, 0, 93014, 0, 12770, 0, 0, 124997, 0, 0, 0, 0, 0, - 129053, 4828, 1258, 0, 2006, 0, 0, 74285, 127987, 0, 120683, 122880, - 983881, 983884, 8846, 128255, 0, 128091, 2650, 9182, 1961, 121399, 11525, - 0, 1959, 0, 55228, 11774, 41016, 0, 0, 128054, 41017, 13109, 0, 10519, - 66331, 3454, 19930, 0, 41019, 92894, 0, 0, 78362, 41021, 0, 0, 0, 0, 0, - 65531, 0, 0, 0, 0, 0, 0, 8865, 6402, 113827, 77923, 0, 127924, 0, 7733, - 0, 4998, 68493, 0, 0, 0, 4268, 0, 0, 0, 0, 128718, 10881, 0, 0, 0, 0, - 2014, 0, 71901, 0, 0, 195057, 0, 0, 78357, 65281, 0, 0, 0, 0, 0, 2015, 0, - 0, 71840, 66318, 74824, 0, 0, 0, 0, 0, 70061, 8094, 10135, 0, 0, 794, 0, - 0, 66335, 0, 121303, 4343, 0, 4833, 0, 0, 0, 0, 189, 12611, 0, 72215, 0, - 4838, 0, 4834, 65078, 0, 126104, 4837, 118853, 0, 121230, 4832, 128271, - 0, 0, 983790, 0, 0, 0, 0, 0, 0, 0, 3976, 118995, 128937, 0, 0, 0, 0, 0, - 119010, 0, 121015, 0, 0, 0, 0, 2871, 0, 0, 999, 0, 68177, 0, 0, 2017, 0, - 67824, 0, 0, 0, 0, 0, 0, 4775, 12555, 12571, 12550, 12583, 12560, 2019, - 12556, 12584, 12586, 0, 12562, 12561, 12566, 12569, 12554, 0, 83344, 0, - 68882, 0, 12567, 1402, 0, 0, 83348, 125072, 83347, 0, 83346, 0, 0, 0, 0, - 64391, 0, 83341, 92160, 0, 1999, 0, 128141, 0, 0, 0, 0, 0, 0, 0, 68873, - 0, 0, 66913, 2377, 0, 0, 12572, 11318, 12557, 12559, 9192, 12549, 12568, - 2373, 9446, 9447, 9448, 9449, 0, 9480, 481, 0, 9438, 9439, 9440, 9441, - 9442, 9443, 9444, 9445, 9430, 9431, 9432, 9433, 9434, 9435, 9436, 9437, - 0, 0, 9424, 9425, 9426, 9427, 9428, 7481, 0, 2362, 9655, 0, 2004, 0, - 9782, 0, 0, 0, 0, 0, 0, 0, 1108, 0, 92461, 0, 0, 0, 64781, 0, 0, 0, - 121126, 0, 1392, 0, 0, 917557, 0, 8065, 70710, 128739, 0, 0, 0, 121068, - 92418, 0, 0, 0, 43280, 0, 70718, 1812, 0, 73046, 0, 0, 0, 0, 0, 6054, - 10697, 3169, 0, 0, 70720, 11487, 70712, 0, 0, 0, 194716, 0, 0, 41863, 0, - 0, 2304, 0, 92326, 0, 118792, 0, 0, 64760, 11766, 0, 0, 0, 0, 69236, 0, - 0, 8773, 10733, 36, 0, 0, 0, 0, 0, 11074, 0, 64910, 983130, 2009, 0, 0, - 128036, 68114, 128906, 0, 0, 0, 0, 12852, 3031, 0, 0, 129088, 0, 66414, - 0, 0, 119950, 42613, 65933, 366, 0, 9892, 0, 11754, 0, 83329, 65301, - 44013, 83058, 67245, 10102, 0, 7739, 41026, 0, 0, 0, 0, 0, 0, 0, 0, - 78386, 0, 71868, 113811, 13081, 10923, 129330, 0, 68145, 0, 0, 74083, 0, - 0, 128392, 83063, 83065, 0, 70706, 0, 0, 0, 70168, 66586, 4183, 64967, - 66250, 0, 92547, 0, 0, 113685, 0, 3792, 2011, 0, 0, 126503, 83332, 0, - 120595, 0, 68489, 41023, 0, 0, 11659, 7922, 12614, 2005, 8523, 0, 0, + 43832, 983139, 9751, 0, 128085, 11770, 0, 0, 69600, 65061, 0, 0, 0, 0, 0, + 0, 121087, 0, 0, 69924, 0, 0, 0, 69913, 0, 121387, 0, 0, 0, 42038, 387, + 0, 12737, 0, 0, 43368, 0, 0, 0, 0, 0, 129449, 121295, 0, 69400, 127309, + 0, 375, 0, 0, 0, 983886, 0, 0, 119202, 119203, 0, 43120, 0, 0, 119196, + 119197, 0, 4529, 119200, 119201, 119198, 119199, 0, 0, 69698, 13150, + 64492, 0, 0, 0, 0, 0, 42891, 66327, 74298, 0, 0, 0, 2587, 42193, 0, 6455, + 0, 4241, 0, 0, 0, 0, 0, 0, 0, 118821, 0, 0, 0, 125030, 0, 128684, 129390, + 0, 5373, 0, 0, 119232, 10015, 0, 0, 0, 68642, 0, 120855, 42040, 128827, + 5779, 0, 42037, 83282, 0, 0, 93040, 83283, 0, 0, 127320, 6983, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 119588, 0, 92495, 74558, 0, 68138, 70163, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 11144, 0, 2551, 0, 6453, 0, 6235, 0, 0, 129081, 72886, + 44020, 11826, 0, 7780, 5369, 118958, 0, 0, 5367, 66870, 0, 0, 5377, 0, + 68143, 128624, 78245, 5218, 0, 127333, 0, 0, 0, 0, 0, 1300, 0, 127334, + 64505, 0, 0, 119624, 1465, 0, 0, 0, 0, 0, 0, 0, 113694, 10729, 0, 0, + 8839, 119243, 0, 7785, 126530, 0, 0, 0, 0, 126603, 0, 0, 0, 3897, 0, + 92331, 74417, 113704, 0, 68127, 71425, 70688, 0, 0, 0, 0, 0, 3542, 0, + 120685, 7951, 68152, 118857, 0, 92972, 0, 0, 127311, 73683, 0, 65150, + 68031, 0, 0, 0, 0, 9985, 0, 127328, 0, 0, 0, 0, 10830, 0, 615, 64490, + 7574, 0, 0, 0, 12909, 73698, 64559, 127332, 73951, 0, 67996, 2020, 0, 0, + 0, 120701, 0, 983640, 0, 0, 0, 92991, 0, 0, 9070, 0, 68411, 11281, 42829, + 0, 1033, 0, 0, 0, 0, 0, 65226, 0, 0, 0, 0, 0, 3450, 0, 7397, 0, 0, 42778, + 10000, 41088, 449, 0, 0, 68458, 113725, 0, 0, 10738, 69634, 0, 0, 41085, + 0, 0, 0, 12764, 0, 93058, 3596, 7322, 0, 0, 0, 0, 0, 0, 0, 0, 2092, 0, 0, + 0, 121350, 10820, 0, 0, 126567, 1853, 0, 0, 93014, 0, 12770, 0, 0, + 124997, 0, 0, 0, 0, 0, 129053, 4828, 1258, 0, 2006, 0, 0, 74285, 127987, + 0, 120683, 122880, 983881, 983884, 8846, 128255, 0, 128091, 2650, 9182, + 1961, 121399, 11525, 0, 1959, 0, 55228, 11774, 41016, 0, 0, 128054, + 41017, 13109, 0, 10519, 66331, 3454, 19930, 0, 41019, 92894, 0, 0, 78362, + 41021, 0, 0, 0, 0, 0, 65531, 0, 0, 0, 0, 0, 0, 8865, 6402, 113827, 77923, + 0, 127924, 0, 7733, 0, 4998, 68493, 0, 0, 0, 4268, 0, 0, 0, 0, 128718, + 10881, 0, 0, 0, 0, 2014, 0, 71901, 0, 0, 195057, 0, 0, 78357, 65281, 0, + 0, 0, 0, 0, 2015, 0, 0, 71840, 66318, 74824, 0, 0, 0, 0, 0, 70061, 8094, + 10135, 0, 0, 794, 0, 0, 66335, 0, 121303, 4343, 0, 4833, 0, 0, 0, 0, 189, + 12611, 0, 72215, 0, 4838, 126214, 4834, 65078, 0, 126104, 4837, 118853, + 0, 121230, 4832, 128271, 0, 0, 127838, 0, 0, 0, 0, 0, 0, 0, 3976, 118995, + 128937, 0, 0, 0, 0, 0, 119010, 0, 121015, 0, 0, 0, 0, 2871, 0, 0, 999, 0, + 68177, 0, 0, 2017, 0, 67824, 0, 0, 0, 0, 0, 0, 4775, 12555, 12571, 12550, + 12583, 12560, 2019, 12556, 12584, 12586, 0, 12562, 12561, 12566, 12569, + 12554, 0, 83344, 0, 68882, 0, 12567, 1402, 0, 0, 83348, 125072, 83347, 0, + 83346, 0, 0, 0, 0, 64391, 0, 83341, 69602, 0, 1999, 0, 128141, 0, 0, 0, + 0, 0, 0, 0, 68873, 0, 0, 66913, 2377, 0, 0, 12572, 11318, 12557, 12559, + 9192, 12549, 12568, 2373, 9446, 9447, 9448, 9449, 0, 9480, 481, 0, 9438, + 9439, 9440, 9441, 9442, 9443, 9444, 9445, 9430, 9431, 9432, 9433, 9434, + 9435, 9436, 9437, 983097, 0, 9424, 9425, 9426, 9427, 9428, 7481, 0, 2362, + 9655, 0, 2004, 0, 9782, 0, 0, 0, 0, 0, 0, 0, 1108, 0, 92461, 0, 0, 0, + 64781, 0, 0, 0, 121126, 0, 1392, 0, 0, 917557, 0, 8065, 70710, 128739, 0, + 0, 0, 121068, 92418, 0, 0, 0, 43280, 0, 70718, 1812, 0, 73046, 0, 0, 0, + 0, 0, 6054, 10697, 3169, 0, 0, 70720, 11487, 70712, 0, 0, 0, 194716, 0, + 0, 41863, 0, 0, 2304, 0, 92326, 0, 118792, 0, 0, 64760, 11766, 0, 0, 0, + 0, 69236, 0, 0, 8773, 10733, 36, 0, 0, 0, 0, 0, 11074, 0, 64910, 983130, + 2009, 0, 0, 128036, 68114, 128906, 0, 0, 0, 0, 12852, 3031, 0, 0, 129088, + 0, 66414, 0, 0, 119950, 42613, 65933, 366, 0, 9892, 0, 11754, 0, 83329, + 65301, 44013, 83058, 67245, 10102, 0, 7739, 41026, 0, 0, 0, 0, 0, 0, 0, + 0, 78386, 129475, 71868, 113811, 13081, 10923, 129330, 0, 68145, 0, 0, + 74083, 0, 0, 128392, 83063, 83065, 0, 70706, 0, 0, 0, 70168, 66586, 4183, + 64967, 66250, 0, 92547, 0, 0, 113685, 0, 3792, 2011, 0, 0, 126503, 83332, + 0, 120595, 0, 68489, 41023, 0, 0, 11659, 7922, 12614, 2005, 8523, 0, 0, 7513, 1863, 129436, 83337, 128969, 0, 120274, 120033, 0, 8144, 0, 73031, 120269, 127524, 120270, 42241, 8783, 83326, 0, 0, 120735, 983959, 0, 129367, 0, 10680, 0, 43293, 68771, 0, 119164, 83320, 92467, 10187, 0, 0, @@ -24984,123 +25630,124 @@ static unsigned int code_hash[] = { 3875, 0, 64341, 0, 9814, 43457, 13066, 3314, 7787, 0, 0, 0, 0, 0, 0, 64531, 0, 0, 0, 0, 0, 0, 127138, 0, 0, 9742, 0, 0, 10800, 0, 8404, 0, 92592, 0, 7089, 0, 78545, 0, 0, 0, 0, 0, 4772, 5771, 0, 0, 9841, 8843, 0, - 0, 0, 0, 120816, 0, 0, 0, 0, 0, 0, 0, 0, 8849, 0, 0, 65112, 1796, 0, 0, - 69665, 8164, 41301, 3502, 0, 122884, 128387, 0, 983816, 5825, 0, 0, 0, 0, - 121322, 10983, 10354, 10418, 0, 2022, 0, 1409, 100789, 0, 0, 0, 0, 1390, - 0, 0, 10471, 65904, 5846, 126472, 0, 0, 0, 0, 0, 0, 66035, 0, 0, 0, 0, - 128190, 0, 3168, 67733, 0, 0, 2370, 0, 0, 0, 195049, 0, 0, 1836, 0, - 121207, 119137, 118959, 125232, 0, 0, 0, 2390, 3944, 0, 0, 0, 0, 69908, - 125011, 0, 0, 0, 0, 0, 8975, 64739, 0, 0, 0, 0, 64409, 0, 0, 0, 0, - 128564, 0, 0, 0, 0, 6204, 0, 0, 0, 10911, 64954, 119003, 74809, 0, 4267, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92887, 0, 0, 0, 0, 121125, 0, 128337, 5842, - 0, 41439, 0, 0, 0, 9328, 0, 120980, 120917, 0, 0, 2285, 0, 0, 0, 0, 0, - 64555, 0, 0, 0, 9541, 0, 0, 0, 41441, 0, 0, 0, 41040, 2459, 0, 0, 41041, - 0, 0, 0, 0, 0, 10450, 0, 41043, 0, 0, 43125, 0, 0, 0, 0, 0, 121008, - 68436, 128040, 0, 120649, 0, 0, 4312, 43927, 0, 0, 11923, 42227, 0, 5763, - 0, 4827, 74559, 42228, 64406, 0, 0, 0, 433, 119620, 0, 2499, 67167, - 67166, 0, 11973, 0, 4293, 42271, 42224, 0, 0, 66322, 42226, 0, 0, 0, - 74180, 0, 55277, 0, 0, 0, 983265, 0, 74632, 0, 0, 71103, 0, 0, 0, 585, - 2383, 0, 43263, 0, 4290, 0, 0, 68920, 0, 8511, 0, 0, 0, 119048, 2380, - 126119, 0, 71704, 2376, 0, 0, 0, 5197, 127046, 127047, 127048, 2366, - 127050, 127051, 73442, 0, 0, 0, 93835, 0, 93818, 0, 0, 74188, 113813, 0, - 0, 0, 983819, 0, 0, 0, 0, 1847, 0, 72771, 0, 42384, 0, 4227, 74158, 0, - 92501, 0, 0, 42365, 0, 128902, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128563, - 0, 983504, 127560, 2754, 0, 0, 128900, 0, 127867, 119638, 0, 1711, 12984, - 92365, 0, 6255, 0, 0, 0, 0, 0, 42063, 74184, 0, 0, 0, 0, 0, 0, 0, 41035, - 43274, 0, 11256, 119088, 0, 520, 0, 41037, 128162, 0, 0, 41034, 0, 0, - 64815, 0, 0, 321, 41028, 0, 0, 0, 0, 0, 0, 0, 74191, 0, 0, 72767, 1861, - 0, 0, 0, 0, 100770, 0, 0, 128530, 3859, 0, 41660, 0, 70793, 0, 983737, - 75014, 0, 127514, 41658, 0, 0, 0, 0, 0, 4414, 120766, 0, 42632, 0, 0, 0, - 0, 0, 1405, 0, 43220, 43341, 0, 0, 0, 0, 0, 983714, 11199, 0, 3513, 0, - 70341, 43342, 0, 65529, 0, 0, 0, 6485, 1397, 0, 0, 92678, 0, 0, 0, 82961, - 0, 82962, 0, 74270, 43287, 983712, 0, 0, 983719, 0, 71914, 4317, 10490, - 0, 0, 194867, 74463, 128952, 464, 41624, 0, 0, 0, 1346, 128240, 917631, - 64724, 128566, 423, 0, 0, 113748, 0, 128161, 0, 0, 120563, 64960, 0, 0, - 0, 0, 9584, 129106, 0, 125026, 0, 9718, 0, 42642, 92977, 64750, 0, 0, 0, - 0, 128333, 0, 3204, 64666, 0, 43530, 2752, 0, 0, 119594, 0, 0, 0, 0, - 92371, 0, 41983, 0, 7010, 0, 0, 41495, 92379, 5877, 42252, 93070, 8009, - 3305, 0, 0, 0, 0, 92293, 0, 0, 0, 100836, 0, 65915, 1400, 75018, 10685, - 75017, 2103, 0, 0, 43276, 0, 11169, 0, 6481, 0, 0, 0, 100837, 72249, - 100838, 74198, 0, 9116, 0, 0, 0, 0, 0, 0, 8129, 92994, 0, 124992, 0, - 11658, 0, 0, 3452, 41031, 0, 1385, 0, 0, 0, 43340, 11123, 41033, 6493, - 12758, 0, 0, 11426, 0, 1681, 100755, 1204, 11960, 69902, 0, 69457, 0, - 119322, 0, 7415, 43338, 0, 0, 67717, 64915, 0, 100759, 100850, 41497, - 65044, 0, 19960, 65358, 983601, 0, 0, 0, 100847, 0, 1789, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 64728, 0, 0, 0, 6506, 64312, 0, 2368, 0, 0, 0, 0, 3439, - 1825, 1192, 0, 73739, 10639, 0, 7790, 5430, 0, 0, 2848, 92981, 0, 0, - 7607, 0, 0, 0, 120658, 0, 0, 8883, 0, 728, 0, 0, 0, 0, 92931, 0, 121372, - 128348, 0, 68078, 8091, 11447, 0, 0, 0, 0, 0, 70003, 0, 0, 74419, 12335, - 0, 0, 3443, 0, 0, 0, 127145, 0, 0, 0, 0, 11843, 0, 9205, 8624, 128543, - 92930, 43295, 0, 65445, 0, 6277, 41672, 0, 10010, 70186, 983052, 0, 835, - 71340, 0, 0, 0, 0, 0, 5426, 4258, 0, 64891, 5424, 0, 8283, 0, 5434, 0, 0, - 0, 0, 0, 11947, 0, 1404, 0, 11432, 0, 3464, 6486, 4819, 0, 0, 570, 8095, - 0, 0, 1498, 0, 0, 0, 431, 67820, 0, 0, 128096, 0, 0, 13096, 0, 0, 43408, - 0, 128538, 8835, 77875, 0, 0, 0, 0, 0, 0, 0, 0, 3477, 227, 10488, 0, 382, - 11418, 0, 5878, 0, 0, 0, 0, 6484, 92355, 66039, 0, 0, 0, 78717, 0, 92662, - 119665, 0, 0, 43290, 0, 0, 0, 0, 8782, 0, 0, 4323, 128649, 0, 120903, 0, - 0, 0, 0, 0, 92953, 3856, 120970, 0, 5872, 6495, 72306, 0, 0, 0, 67173, - 67172, 67171, 3953, 0, 0, 93063, 11994, 4339, 0, 92654, 0, 0, 0, 0, - 128804, 0, 5228, 0, 9766, 0, 92741, 0, 0, 0, 0, 68860, 0, 1162, 0, 2671, - 0, 0, 92632, 92631, 0, 0, 73811, 0, 194895, 0, 68085, 0, 74331, 11424, 0, - 10466, 121239, 0, 194890, 0, 4820, 0, 0, 0, 194891, 0, 119212, 4896, 0, - 4897, 42821, 64611, 0, 4438, 0, 0, 1753, 11331, 6147, 0, 43282, 8833, 0, - 0, 6504, 0, 0, 0, 0, 0, 1413, 0, 0, 64353, 12141, 121138, 0, 0, 43163, 0, - 72880, 64789, 127094, 838, 127092, 120697, 127090, 5014, 0, 256, 0, 0, - 42443, 42739, 0, 7542, 0, 70389, 0, 6489, 10048, 74326, 0, 66573, 0, - 125271, 78712, 11761, 126078, 0, 41094, 0, 0, 0, 0, 92689, 8453, 0, 0, - 120942, 128184, 0, 11816, 0, 0, 2930, 93845, 0, 41098, 92771, 41093, 0, - 0, 6498, 41096, 0, 0, 1238, 200, 0, 1660, 74476, 0, 0, 74362, 0, 0, - 72301, 9224, 0, 0, 0, 0, 0, 0, 0, 0, 72729, 43284, 0, 0, 120561, 13183, - 0, 0, 0, 1669, 10776, 0, 0, 0, 0, 0, 1732, 4030, 0, 3963, 0, 0, 0, 6491, - 0, 0, 914, 121394, 0, 0, 0, 78713, 0, 92441, 74367, 0, 0, 0, 0, 0, 0, 0, - 0, 65537, 0, 0, 43430, 5301, 0, 92618, 0, 43285, 0, 0, 125186, 0, 0, - 5876, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11114, 74536, 0, 0, 0, 0, 983129, - 0, 0, 0, 0, 10915, 983069, 12007, 0, 0, 0, 0, 67655, 92604, 0, 8629, 0, - 43168, 41872, 0, 0, 0, 42488, 0, 0, 0, 0, 0, 64730, 70041, 0, 122895, 0, - 0, 0, 92306, 11416, 4280, 128516, 8765, 73451, 0, 1393, 0, 11157, 74386, - 0, 0, 0, 0, 6683, 0, 93832, 12144, 0, 74513, 13019, 74994, 0, 0, 0, - 983267, 0, 6488, 357, 0, 41100, 0, 41104, 0, 41099, 0, 71320, 0, 0, 0, - 4434, 0, 0, 0, 74231, 83107, 0, 194914, 0, 0, 72286, 68305, 0, 41759, - 12757, 0, 0, 72769, 9790, 8995, 0, 121095, 68209, 0, 41764, 0, 0, 72322, - 2268, 0, 0, 0, 12743, 0, 6480, 0, 41779, 0, 66601, 0, 74490, 10986, - 66602, 0, 64807, 0, 0, 41767, 119629, 0, 0, 0, 3955, 64571, 194918, - 127089, 0, 70187, 69975, 9770, 12305, 12230, 0, 78579, 0, 0, 74752, 0, 0, - 0, 128263, 74449, 0, 0, 0, 0, 0, 71131, 129505, 78573, 0, 0, 11116, 0, - 5747, 0, 110667, 9802, 41092, 120731, 0, 0, 0, 0, 0, 120733, 41090, 0, 0, - 0, 11271, 57, 0, 0, 0, 0, 71268, 121290, 43137, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 277, 74385, 0, 0, 0, 0, 0, 13025, 8757, 0, 0, 1574, 0, 126124, 100800, - 0, 5749, 0, 0, 42824, 0, 1039, 9801, 0, 5745, 0, 41858, 0, 0, 120655, 0, - 41862, 0, 0, 0, 436, 4771, 194636, 42501, 0, 10573, 0, 0, 0, 917986, - 9644, 0, 0, 0, 0, 69837, 0, 0, 0, 0, 67409, 0, 0, 0, 125204, 11939, 0, 0, - 0, 0, 0, 0, 0, 3504, 0, 0, 0, 0, 0, 10226, 65558, 0, 3594, 0, 0, 40, 0, - 0, 0, 0, 0, 74312, 0, 74337, 0, 983667, 0, 0, 0, 70476, 0, 121143, 72317, - 0, 0, 4304, 0, 0, 78707, 0, 0, 0, 78597, 1348, 78596, 0, 0, 0, 70406, - 92392, 0, 7599, 0, 0, 13269, 0, 0, 0, 100804, 0, 74494, 6097, 7568, - 43980, 4982, 78592, 0, 0, 0, 0, 13270, 0, 0, 13138, 0, 9484, 0, 0, 71364, - 0, 0, 0, 9487, 0, 92913, 0, 71911, 78668, 73963, 6193, 0, 0, 0, 194848, - 7228, 10011, 194849, 194852, 194851, 11654, 194853, 194856, 194855, 0, - 194857, 3604, 0, 0, 0, 0, 0, 94110, 43740, 94109, 194860, 194863, 66750, - 121021, 0, 94111, 6995, 74173, 5437, 74174, 0, 8702, 7339, 194842, 0, - 199, 194843, 194846, 194845, 0, 126069, 0, 67818, 0, 7560, 0, 0, 0, 0, - 6472, 65814, 0, 128983, 70845, 0, 0, 9191, 0, 0, 0, 0, 0, 10196, 0, 0, - 6585, 0, 120750, 0, 0, 71872, 129129, 0, 0, 78590, 72308, 11382, 129499, - 0, 983651, 0, 194833, 194832, 194835, 194834, 94020, 194836, 42727, - 194838, 128252, 78585, 43874, 119610, 0, 0, 43248, 0, 194816, 0, 194818, - 128845, 194820, 194819, 5297, 194821, 13284, 6112, 93964, 93010, 73927, - 0, 0, 65746, 0, 0, 194827, 194826, 4342, 42839, 194831, 1677, 0, 0, 0, 0, + 0, 0, 0, 120816, 0, 123137, 0, 0, 0, 0, 0, 0, 8849, 0, 0, 65112, 1796, 0, + 0, 69665, 8164, 41301, 3502, 0, 122884, 128387, 0, 983816, 5825, 0, 0, 0, + 0, 121322, 10983, 10354, 10418, 0, 2022, 0, 1409, 100789, 0, 0, 0, 0, + 1390, 0, 0, 10471, 65904, 5846, 126472, 0, 0, 0, 0, 0, 0, 66035, 0, 0, 0, + 0, 128190, 0, 3168, 67733, 0, 0, 2370, 0, 126243, 0, 195049, 0, 0, 1836, + 0, 121207, 119137, 118959, 125232, 0, 0, 0, 2390, 3944, 0, 0, 0, 0, + 69908, 125011, 0, 0, 123200, 0, 0, 8975, 64739, 0, 0, 0, 0, 64409, 0, 0, + 0, 0, 128564, 0, 0, 0, 0, 6204, 0, 0, 0, 10911, 64954, 119003, 74809, + 118903, 4267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92887, 0, 0, 0, 0, 121125, 0, + 128337, 5842, 0, 41439, 0, 0, 0, 9328, 0, 120980, 120917, 0, 0, 2285, 0, + 0, 0, 0, 0, 64555, 0, 0, 72162, 9541, 0, 0, 0, 41441, 0, 0, 0, 41040, + 2459, 0, 0, 41041, 0, 0, 0, 0, 0, 10450, 0, 41043, 0, 0, 43125, 0, 0, 0, + 0, 0, 121008, 68436, 128040, 0, 120649, 0, 0, 4312, 43927, 0, 0, 11923, + 42227, 0, 5763, 0, 4827, 74559, 42228, 64406, 0, 0, 0, 433, 119620, 0, + 2499, 67167, 67166, 0, 11973, 0, 4293, 42271, 42224, 0, 0, 66322, 42226, + 0, 0, 0, 74180, 0, 55277, 0, 0, 0, 983265, 0, 74632, 0, 0, 71103, 0, 0, + 0, 585, 2383, 0, 43263, 0, 4290, 0, 0, 68920, 0, 8511, 0, 0, 0, 119048, + 2380, 126119, 0, 71704, 2376, 0, 0, 0, 5197, 127046, 127047, 127048, + 2366, 127050, 127051, 73442, 0, 0, 0, 93835, 0, 93818, 0, 0, 74188, + 113813, 0, 0, 0, 983819, 0, 0, 0, 0, 1847, 0, 72771, 0, 42384, 0, 4227, + 74158, 0, 92501, 0, 0, 42365, 0, 128902, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 128563, 0, 983504, 127560, 2754, 0, 0, 128900, 0, 127867, 119638, 0, + 1711, 12984, 92365, 0, 6255, 0, 0, 0, 0, 0, 42063, 74184, 0, 0, 0, 0, 0, + 0, 0, 41035, 43274, 0, 11256, 119088, 0, 520, 0, 41037, 128162, 0, 0, + 41034, 0, 983810, 64815, 0, 0, 321, 41028, 0, 0, 0, 0, 0, 0, 0, 74191, 0, + 0, 72767, 1861, 0, 129666, 0, 0, 100770, 0, 0, 128530, 3859, 0, 41660, 0, + 70793, 0, 983737, 75014, 0, 127514, 41658, 0, 0, 0, 0, 0, 4414, 120766, + 0, 42632, 0, 0, 0, 0, 0, 1405, 0, 43220, 43341, 0, 0, 0, 0, 0, 983714, + 11199, 0, 3513, 0, 70341, 43342, 0, 65529, 0, 0, 0, 6485, 1397, 0, 0, + 92678, 0, 0, 0, 82961, 0, 82962, 0, 74270, 43287, 983712, 0, 0, 983719, + 0, 71914, 4317, 10490, 0, 0, 194867, 74463, 128952, 464, 41624, 0, 0, 0, + 1346, 128240, 917631, 64724, 128566, 423, 0, 0, 113748, 0, 128161, 0, 0, + 120563, 64960, 0, 0, 0, 0, 9584, 129106, 0, 125026, 0, 9718, 0, 42642, + 92977, 64750, 0, 0, 0, 0, 128333, 0, 3204, 64666, 0, 43530, 2752, 0, 0, + 119594, 0, 0, 0, 0, 92371, 0, 41983, 0, 7010, 0, 0, 41495, 92379, 5877, + 42252, 93070, 8009, 3305, 0, 0, 0, 0, 92293, 0, 0, 0, 100836, 0, 65915, + 1400, 75018, 10685, 75017, 2103, 0, 0, 43276, 0, 11169, 0, 6481, 0, 0, 0, + 100837, 72249, 100838, 74198, 0, 9116, 0, 0, 0, 0, 0, 0, 8129, 92994, 0, + 124992, 0, 11658, 0, 0, 3452, 41031, 0, 1385, 0, 0, 0, 43340, 11123, + 41033, 6493, 12758, 0, 0, 11426, 0, 1681, 100755, 1204, 11960, 69902, 0, + 69457, 0, 119322, 0, 7415, 43338, 0, 0, 67717, 64915, 0, 100759, 100850, + 41497, 65044, 0, 19960, 65358, 983601, 0, 0, 0, 73670, 0, 1789, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 64728, 0, 0, 0, 6506, 64312, 0, 2368, 0, 0, 0, 0, + 3439, 1825, 1192, 0, 73739, 10639, 0, 7790, 5430, 0, 0, 2848, 92981, 0, + 0, 7607, 0, 0, 0, 120658, 0, 0, 8883, 0, 728, 0, 0, 0, 0, 92931, 0, + 121372, 128348, 0, 68078, 8091, 11447, 0, 0, 126261, 0, 0, 70003, 0, 0, + 74419, 12335, 0, 0, 3443, 0, 0, 0, 127145, 0, 0, 0, 0, 11843, 0, 9205, + 8624, 128543, 92930, 43295, 0, 65445, 0, 6277, 41672, 0, 10010, 70186, + 983052, 0, 835, 71340, 0, 0, 0, 0, 0, 5426, 4258, 0, 64891, 5424, 0, + 8283, 0, 5434, 0, 0, 0, 0, 0, 11947, 0, 1404, 0, 11432, 0, 3464, 6486, + 4819, 0, 0, 570, 8095, 0, 0, 1498, 0, 0, 0, 431, 67820, 0, 0, 128096, 0, + 0, 13096, 0, 0, 43408, 0, 128538, 8835, 77875, 0, 0, 0, 0, 0, 0, 0, 0, + 3477, 227, 10488, 0, 382, 11418, 0, 5878, 0, 0, 0, 0, 6484, 92355, 66039, + 0, 0, 0, 78717, 0, 92662, 119665, 0, 0, 43290, 0, 0, 0, 0, 8782, 0, 0, + 4323, 128649, 0, 120903, 12094, 0, 0, 0, 0, 92953, 3856, 120970, 0, 5872, + 6495, 72306, 0, 0, 0, 67173, 67172, 67171, 3953, 0, 0, 93063, 11994, + 4339, 0, 92654, 0, 0, 0, 0, 128804, 0, 5228, 0, 9766, 0, 92741, 0, 0, 0, + 0, 68860, 0, 1162, 0, 2671, 0, 0, 92632, 92631, 72117, 0, 73811, 0, + 194895, 0, 68085, 0, 74331, 11424, 0, 10466, 121239, 0, 194890, 0, 4820, + 0, 0, 0, 194891, 0, 119212, 4896, 0, 4897, 42821, 64611, 0, 4438, 0, 0, + 1753, 11331, 6147, 0, 43282, 8833, 0, 0, 6504, 0, 0, 0, 0, 0, 1413, 0, 0, + 64353, 12141, 121138, 0, 0, 43163, 0, 72880, 64789, 127094, 838, 127092, + 120697, 127090, 5014, 0, 256, 0, 0, 42443, 42739, 0, 7542, 0, 70389, 0, + 6489, 10048, 74326, 0, 66573, 0, 125271, 78712, 11761, 126078, 129603, + 41094, 0, 0, 0, 0, 92689, 8453, 0, 0, 120942, 128184, 0, 11816, 0, 0, + 2930, 93845, 0, 41098, 92771, 41093, 0, 0, 6498, 41096, 0, 0, 1238, 200, + 0, 1660, 74476, 0, 0, 74362, 0, 0, 72301, 9224, 0, 0, 0, 0, 0, 0, 0, 0, + 72729, 43284, 0, 72110, 120561, 13183, 0, 0, 0, 1669, 10776, 0, 0, 0, 0, + 0, 1732, 4030, 0, 3963, 0, 0, 0, 6491, 0, 0, 914, 121394, 0, 0, 0, 78713, + 0, 92441, 74367, 0, 0, 0, 0, 0, 0, 0, 0, 65537, 0, 0, 43430, 5301, 0, + 92618, 0, 43285, 0, 0, 125186, 0, 0, 5876, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 11114, 74536, 0, 0, 0, 0, 983129, 0, 0, 0, 0, 10915, 983069, 12007, 0, + 0, 0, 0, 67655, 92604, 0, 8629, 0, 43168, 41872, 0, 0, 0, 42488, 0, 0, 0, + 0, 0, 64730, 70041, 0, 122895, 0, 0, 0, 92306, 11416, 4280, 128516, 8765, + 73451, 0, 1393, 0, 11157, 74386, 0, 0, 0, 0, 6683, 0, 93832, 12144, 0, + 74513, 13019, 74994, 0, 0, 0, 983267, 0, 6488, 357, 0, 41100, 0, 41104, + 0, 41099, 0, 71320, 0, 0, 0, 4434, 0, 0, 0, 74231, 83107, 0, 194914, 0, + 0, 72286, 68305, 0, 41759, 12757, 0, 0, 72769, 9790, 8995, 0, 121095, + 68209, 0, 41764, 0, 0, 72322, 2268, 0, 0, 0, 12743, 0, 6480, 0, 41779, 0, + 66601, 0, 74490, 10986, 66602, 0, 64807, 0, 0, 41767, 119629, 0, 0, 0, + 3955, 64571, 194918, 127089, 0, 70187, 69975, 9770, 12305, 12230, 0, + 78579, 0, 0, 74752, 0, 0, 123168, 128263, 74449, 0, 0, 69611, 0, 0, + 71131, 129505, 78573, 0, 0, 11116, 0, 5747, 0, 110667, 9802, 41092, + 120731, 0, 0, 0, 0, 0, 120733, 41090, 0, 0, 0, 11271, 57, 0, 0, 0, 0, + 71268, 121290, 43137, 0, 0, 0, 126221, 0, 0, 0, 0, 0, 277, 74385, 0, 0, + 0, 72155, 0, 13025, 8757, 0, 0, 1574, 0, 126124, 100800, 0, 5749, 0, 0, + 42824, 0, 1039, 9801, 0, 5745, 0, 41858, 0, 0, 120655, 0, 41862, 0, 0, 0, + 436, 4771, 194636, 42501, 0, 10573, 0, 0, 0, 917986, 9644, 0, 0, 0, 0, + 69837, 0, 0, 0, 0, 67409, 0, 0, 0, 125204, 11939, 0, 0, 0, 0, 0, 0, 0, + 3504, 0, 0, 0, 126209, 0, 10226, 65558, 0, 3594, 0, 0, 40, 0, 0, 0, 0, 0, + 74312, 72138, 74337, 0, 983667, 0, 0, 0, 70476, 0, 121143, 72317, 0, 0, + 4304, 0, 0, 78707, 0, 0, 0, 78597, 1348, 78596, 0, 0, 0, 70406, 92392, 0, + 7599, 0, 0, 13269, 0, 0, 0, 100804, 0, 74494, 6097, 7568, 43980, 4982, + 78592, 0, 0, 0, 0, 13270, 0, 0, 13138, 0, 9484, 0, 0, 71364, 0, 0, 0, + 9487, 0, 92913, 0, 71911, 78668, 73963, 6193, 0, 0, 0, 194848, 7228, + 10011, 194849, 194852, 194851, 11654, 194853, 126218, 194855, 0, 194857, + 3604, 0, 0, 0, 0, 0, 94110, 43740, 94109, 194860, 194863, 66750, 121021, + 0, 94111, 6995, 74173, 5437, 74174, 0, 8702, 7339, 194842, 0, 199, + 194843, 194846, 194845, 0, 126069, 0, 67818, 0, 7560, 0, 0, 0, 0, 6472, + 65814, 0, 128983, 70845, 0, 0, 9191, 0, 0, 0, 0, 0, 10196, 0, 0, 6585, 0, + 120750, 0, 0, 71872, 129129, 0, 0, 78590, 72308, 11382, 129499, 0, + 983651, 0, 194833, 194832, 194835, 129540, 94020, 194836, 42727, 194838, + 128252, 78585, 43874, 119610, 0, 0, 43248, 0, 194816, 0, 194818, 128845, + 194820, 194819, 5297, 194821, 13284, 6112, 93964, 93010, 73927, 42947, 0, + 65746, 0, 0, 194827, 194826, 4342, 42839, 194831, 1677, 0, 72135, 0, 0, 0, 11011, 66399, 0, 0, 0, 10160, 0, 0, 0, 0, 2052, 4308, 92174, 43000, 0, 543, 64916, 0, 0, 0, 119170, 0, 118922, 2064, 0, 43158, 0, 0, 69984, 0, 0, 129187, 0, 0, 0, 0, 41631, 92728, 0, 0, 6228, 0, 0, 0, 0, 0, 0, 506, 0, 0, 65735, 2055, 43255, 121407, 0, 0, 0, 0, 0, 0, 194666, 2063, 0, 0, - 0, 0, 0, 0, 74333, 194912, 11827, 74308, 194913, 194916, 194915, 64564, - 194917, 67986, 194919, 0, 11037, 0, 121102, 0, 0, 10560, 0, 120756, - 194922, 113737, 194924, 194927, 194926, 1931, 0, 0, 0, 128228, 0, 12643, - 8751, 127838, 0, 12294, 0, 78834, 9138, 78831, 78833, 12631, 78829, - 11080, 78821, 0, 0, 1239, 0, 121067, 0, 12636, 0, 0, 0, 0, 0, 0, 8998, 0, - 0, 9152, 0, 0, 0, 67589, 0, 64290, 0, 92393, 12615, 0, 129141, 6914, - 93013, 0, 119569, 0, 65188, 0, 67611, 4337, 0, 194897, 194896, 78516, - 194898, 7681, 194900, 194903, 67596, 194905, 194904, 2477, 93974, 0, 0, - 0, 67604, 70705, 0, 194882, 194881, 194884, 194883, 194886, 128914, + 0, 0, 72136, 0, 74333, 194912, 11827, 74308, 194913, 194916, 194915, + 64564, 194917, 67986, 194919, 0, 11037, 0, 121102, 0, 0, 10560, 0, + 120756, 194922, 113737, 194924, 194927, 194926, 1931, 0, 0, 0, 128228, 0, + 12643, 8751, 123629, 0, 12294, 0, 78834, 9138, 78831, 78833, 12631, + 78829, 11080, 78821, 0, 0, 1239, 0, 121067, 0, 12636, 0, 0, 0, 0, 0, 0, + 8998, 0, 0, 9152, 0, 0, 0, 67589, 0, 64290, 0, 92393, 12615, 0, 129141, + 6914, 93013, 0, 119569, 0, 65188, 0, 67611, 4337, 0, 194897, 194896, + 78516, 194898, 7681, 194900, 194903, 67596, 194905, 194904, 2477, 93974, + 0, 0, 0, 67604, 70705, 0, 194882, 194881, 194884, 194883, 194886, 128914, 194888, 67599, 0, 194889, 0, 0, 0, 0, 3357, 0, 78852, 4207, 1288, 78842, 78839, 78840, 78837, 78838, 66354, 194872, 0, 128432, 0, 67618, 92664, 0, 42788, 0, 64612, 194875, 10774, 194877, 0, 194879, 0, 0, 0, 997, 194901, @@ -25108,157 +25755,158 @@ static unsigned int code_hash[] = { 0, 0, 2818, 0, 0, 73793, 0, 4172, 93028, 126523, 124981, 0, 0, 0, 0, 129522, 69706, 0, 6834, 0, 0, 194865, 126982, 121211, 194866, 194869, 194868, 766, 1257, 0, 0, 0, 3265, 66617, 3274, 0, 0, 94042, 0, 8373, - 41989, 0, 73460, 3418, 3263, 0, 0, 0, 3270, 64539, 11489, 0, 118945, 0, - 0, 127795, 0, 128498, 0, 0, 0, 0, 0, 70512, 983964, 186, 0, 119156, 5770, - 13179, 0, 12612, 12949, 64856, 12800, 0, 0, 983151, 11507, 0, 0, 118929, - 0, 0, 73462, 0, 73459, 0, 0, 0, 73461, 9254, 66877, 0, 0, 92338, 5624, 0, - 0, 0, 0, 120472, 120464, 0, 0, 122915, 120462, 0, 1872, 66508, 120467, - 41079, 0, 5502, 119330, 41078, 194906, 0, 0, 4511, 68449, 0, 0, 0, 0, - 43245, 41083, 68861, 0, 0, 9003, 119959, 0, 5305, 9653, 41081, 43146, - 9546, 0, 0, 120478, 0, 65205, 71713, 64063, 120459, 0, 0, 0, 64058, - 43101, 43102, 0, 64062, 1028, 64060, 64059, 0, 10567, 110816, 110817, - 110814, 110815, 0, 2902, 64043, 64042, 43749, 10756, 64047, 64046, 64045, - 64044, 0, 10076, 64040, 64039, 0, 1034, 0, 0, 64034, 64033, 64032, 42735, - 64038, 64037, 64036, 64035, 4291, 0, 64015, 64014, 83393, 83394, 83395, - 983765, 0, 43090, 83391, 3476, 64013, 64012, 64011, 64010, 64008, 64007, - 2003, 7706, 0, 0, 119050, 64009, 204, 0, 0, 4430, 8239, 64003, 10626, - 64001, 64057, 13079, 64055, 64054, 0, 0, 43246, 9343, 64049, 64048, 0, - 1133, 64053, 64052, 64051, 64050, 0, 0, 0, 66415, 12329, 0, 0, 0, 1942, - 0, 0, 0, 128249, 0, 68291, 10760, 64023, 64022, 64021, 64020, 43670, - 77924, 64025, 41412, 78243, 78244, 0, 0, 64019, 64018, 64017, 64016, 0, - 0, 78251, 78252, 78248, 78249, 77914, 78247, 0, 917560, 77919, 6788, - 13094, 0, 7532, 41414, 0, 3179, 70745, 64769, 0, 0, 0, 0, 10751, 0, 0, 0, - 0, 0, 0, 0, 2008, 64031, 64030, 294, 41874, 83383, 83384, 65929, 83376, - 129063, 83379, 83380, 64028, 11396, 64026, 83374, 0, 0, 118795, 71739, - 43247, 0, 70153, 0, 0, 0, 0, 0, 0, 0, 0, 7801, 83359, 83361, 128931, 0, - 3297, 83356, 83357, 1135, 83350, 83351, 83352, 1995, 7927, 71738, 110742, - 2552, 83372, 60, 0, 8649, 83368, 83369, 83370, 83371, 10541, 83365, - 78679, 43833, 0, 0, 2013, 83362, 0, 110636, 0, 0, 12832, 110638, 8081, - 8362, 120188, 0, 9137, 0, 0, 0, 0, 3466, 0, 0, 1996, 0, 3453, 3412, 0, - 2002, 2000, 120176, 0, 0, 0, 0, 1998, 0, 1842, 0, 0, 9628, 68446, 0, - 9826, 64502, 1767, 3413, 0, 0, 0, 0, 0, 0, 13108, 44024, 120204, 0, - 92693, 0, 0, 0, 70291, 12650, 983208, 0, 68061, 0, 3592, 0, 0, 0, 0, - 983956, 0, 66417, 128792, 10742, 0, 0, 1994, 9281, 3296, 64475, 1997, - 1895, 128936, 72387, 0, 0, 0, 72391, 0, 8999, 0, 983633, 0, 66480, 0, 0, - 0, 983083, 0, 596, 0, 0, 120216, 8651, 120217, 0, 0, 12995, 0, 0, 70740, - 0, 42930, 119955, 64810, 917834, 6825, 0, 917839, 120208, 64275, 120889, - 128069, 120210, 6384, 917840, 126477, 0, 67698, 0, 0, 0, 120496, 0, - 43412, 0, 0, 0, 0, 0, 120172, 0, 120763, 0, 0, 0, 128343, 1457, 0, 0, - 6381, 2815, 0, 65240, 0, 0, 0, 119522, 70487, 0, 0, 0, 0, 0, 120572, 0, - 0, 0, 0, 0, 125253, 0, 0, 0, 120574, 0, 0, 0, 3055, 9852, 0, 65288, 0, - 11398, 0, 0, 93016, 0, 0, 603, 128557, 0, 0, 0, 129366, 3350, 0, 0, - 917828, 917827, 68428, 917825, 73045, 917831, 917830, 917829, 0, 1919, 0, - 110767, 83296, 83297, 83298, 66446, 64141, 8562, 64139, 64138, 64136, - 64135, 64134, 64133, 11297, 0, 0, 11966, 64128, 66286, 0, 0, 64132, - 10867, 64130, 64129, 0, 43374, 9779, 2764, 0, 0, 9471, 0, 0, 0, 0, 66010, - 0, 8857, 128771, 121423, 0, 69223, 0, 194660, 983857, 0, 0, 43984, 0, 0, - 0, 0, 0, 0, 10717, 64570, 5630, 0, 64143, 64142, 83300, 67758, 83302, 0, - 77930, 0, 0, 0, 11631, 64146, 64145, 64144, 2384, 72801, 127380, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 122916, 8933, 1601, 917803, 858, 917809, 64109, 64108, - 8090, 0, 917812, 917811, 587, 0, 82971, 0, 0, 0, 78214, 2750, 0, 9983, - 64158, 64157, 83288, 83289, 83290, 2760, 83284, 83285, 83286, 83287, - 64156, 64155, 64154, 83283, 64151, 64150, 12679, 10053, 10421, 0, 64153, - 64152, 0, 0, 4839, 0, 0, 4435, 119016, 0, 64126, 64125, 64124, 64123, - 129287, 0, 0, 7007, 0, 65443, 0, 0, 64122, 0, 0, 93834, 64117, 64116, - 6287, 64114, 64121, 64120, 64119, 64118, 110659, 127842, 1177, 65601, - 12322, 64106, 92169, 110654, 64102, 64101, 64100, 64099, 0, 10453, 64104, - 64103, 7997, 0, 92534, 0, 8705, 64097, 64096, 9571, 0, 110652, 127398, - 12132, 0, 0, 0, 110624, 73841, 83339, 83340, 9056, 0, 0, 0, 6155, 64068, - 64067, 64066, 64065, 64072, 64071, 63, 64069, 127382, 0, 93822, 7257, - 64064, 0, 0, 0, 0, 0, 0, 78748, 0, 0, 0, 120519, 0, 66242, 66232, 4333, - 9855, 64112, 0, 0, 0, 0, 0, 0, 0, 66222, 0, 0, 0, 0, 69816, 0, 118796, 0, - 8708, 0, 64077, 64076, 8996, 4992, 4471, 83343, 64079, 64078, 92179, 0, - 0, 129120, 64615, 0, 0, 12075, 42041, 0, 0, 0, 0, 127557, 3123, 0, - 983735, 0, 0, 0, 83328, 0, 9223, 0, 83321, 83322, 73797, 83327, 1116, 0, - 83319, 7136, 0, 0, 0, 0, 75031, 0, 0, 0, 64092, 43675, 10104, 83338, - 83331, 64095, 64094, 8111, 66247, 0, 64089, 64088, 0, 70106, 42236, - 11434, 64083, 64082, 43216, 7737, 64087, 64086, 64085, 64084, 0, 0, 0, - 4118, 1797, 83312, 0, 0, 46, 83308, 83309, 298, 83303, 72402, 83305, - 83306, 0, 0, 0, 128905, 11495, 0, 0, 0, 127377, 194828, 127370, 0, 0, 0, - 66239, 74945, 64403, 0, 0, 83314, 0, 0, 65758, 43536, 0, 8544, 0, 0, 0, - 0, 194824, 0, 0, 0, 0, 0, 3639, 11242, 0, 0, 0, 0, 0, 0, 0, 68409, 0, 0, - 0, 0, 0, 0, 0, 128654, 8789, 0, 0, 0, 0, 0, 0, 0, 0, 65058, 0, 78234, - 68064, 0, 66227, 71694, 5573, 118936, 0, 44, 0, 66244, 118907, 0, 66238, - 12844, 0, 1622, 129190, 1900, 0, 11458, 0, 0, 6581, 5576, 128303, 0, - 126122, 0, 113680, 8947, 0, 113812, 0, 0, 0, 7908, 0, 0, 6579, 0, 0, 0, - 0, 2138, 6583, 7761, 0, 0, 0, 66802, 5058, 0, 0, 0, 5057, 125256, 0, - 74538, 5054, 0, 0, 0, 0, 0, 0, 658, 3497, 128509, 0, 5061, 5060, 4235, 0, - 0, 0, 127757, 4236, 4727, 0, 0, 0, 128791, 0, 7488, 128693, 7476, 0, 0, - 120646, 0, 0, 0, 66209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 9341, 119596, 0, 0, 0, 64668, 0, 8125, 0, 6743, 119175, 0, 129441, - 83406, 0, 127966, 119235, 74092, 0, 0, 43660, 0, 0, 127901, 0, 0, 0, 264, - 0, 74954, 0, 0, 0, 0, 0, 6019, 0, 0, 129121, 0, 0, 0, 8800, 0, 66376, 0, - 120948, 0, 100744, 0, 0, 92333, 725, 68014, 0, 0, 983040, 0, 0, 0, 0, - 74899, 0, 0, 0, 110804, 0, 0, 5074, 5073, 0, 0, 0, 0, 70723, 5072, - 128576, 13098, 72403, 0, 11040, 0, 0, 0, 4929, 0, 0, 0, 0, 0, 0, 0, 0, - 67754, 4934, 0, 0, 9758, 0, 0, 70181, 42584, 0, 4329, 0, 4979, 8663, - 74521, 0, 983042, 74418, 0, 0, 5071, 0, 3642, 0, 5070, 10042, 0, 3987, - 5068, 120211, 8909, 0, 0, 69917, 0, 73981, 983141, 70749, 4531, 120212, - 9105, 0, 4921, 121059, 4926, 65544, 113786, 0, 0, 0, 0, 83269, 0, 120790, - 4922, 0, 992, 119568, 4925, 0, 0, 9526, 4920, 128617, 948, 0, 0, 4930, 0, - 0, 0, 4933, 0, 0, 0, 4928, 0, 0, 0, 0, 128379, 722, 0, 127483, 127482, - 127485, 82997, 127487, 1509, 0, 5468, 66214, 127474, 127477, 1672, - 127479, 10864, 127481, 127480, 127467, 127466, 127469, 127468, 127471, - 127470, 68336, 82999, 120115, 1679, 120116, 0, 120113, 127462, 127465, - 127464, 127110, 120119, 120112, 0, 120109, 6968, 5761, 342, 8553, 0, - 8143, 127115, 127114, 127113, 624, 127111, 4057, 0, 5078, 0, 0, 0, 5076, - 0, 0, 0, 120097, 685, 9025, 1524, 8003, 0, 5539, 113727, 113795, 120102, - 7138, 120552, 0, 0, 0, 113724, 0, 8058, 9732, 0, 5080, 0, 5036, 5035, 0, - 42604, 0, 0, 0, 275, 13291, 69995, 0, 0, 983908, 5033, 0, 0, 4836, 70184, - 73792, 0, 0, 0, 120681, 43704, 0, 2274, 119000, 124983, 0, 8858, 6409, 0, - 119585, 0, 0, 0, 0, 0, 68442, 0, 3432, 10218, 0, 6094, 11232, 0, 0, 0, 0, - 1676, 129157, 0, 0, 5030, 0, 118810, 0, 73869, 0, 0, 69944, 6787, 0, 0, - 0, 983595, 10544, 12919, 69425, 92218, 0, 0, 0, 129172, 0, 67703, 0, 0, - 0, 0, 0, 72290, 0, 0, 0, 0, 7018, 66241, 0, 0, 0, 0, 0, 74056, 0, 11833, - 0, 67975, 65232, 40964, 251, 12686, 7895, 4395, 43538, 0, 0, 0, 78042, 0, - 0, 40967, 5879, 0, 0, 0, 0, 0, 65540, 128590, 625, 0, 120194, 1113, 0, - 13103, 3630, 67224, 8179, 74264, 67886, 9316, 10980, 2489, 120958, 8150, - 1359, 121353, 70464, 127330, 127327, 5042, 5041, 42769, 12084, 11196, - 127321, 92279, 72398, 120535, 127317, 127318, 127315, 12283, 127313, - 11453, 0, 8795, 66245, 0, 0, 0, 5037, 118864, 0, 0, 67724, 0, 66893, - 74006, 0, 8431, 0, 0, 0, 0, 12620, 6826, 73773, 70169, 5040, 0, 0, 0, 0, - 0, 5039, 0, 0, 0, 5038, 0, 0, 0, 0, 0, 65908, 0, 0, 0, 0, 0, 65157, 0, 0, - 70182, 0, 73909, 4835, 0, 0, 0, 4309, 7127, 0, 0, 0, 1301, 0, 0, 12222, - 0, 73813, 711, 92439, 7133, 0, 0, 0, 0, 0, 0, 0, 7661, 72263, 0, 0, 0, - 70453, 7627, 0, 5031, 92340, 42738, 65784, 0, 65782, 3758, 0, 65781, - 67865, 0, 2440, 65780, 70795, 8449, 121393, 121479, 0, 2118, 0, 12121, 0, - 0, 129510, 2128, 2130, 2131, 2126, 2133, 0, 121250, 2114, 2116, 2455, 0, - 2122, 2123, 2124, 2125, 983787, 8714, 0, 2113, 0, 2115, 0, 127907, 43713, - 5052, 66220, 66653, 65777, 65778, 65775, 5051, 65773, 1429, 42647, 5050, - 65769, 388, 70685, 735, 0, 0, 128035, 0, 12726, 0, 0, 0, 0, 0, 5109, - 5053, 0, 0, 0, 0, 0, 2470, 0, 0, 1925, 71251, 0, 10971, 113770, 5048, - 5047, 0, 0, 194946, 92313, 0, 0, 0, 8089, 0, 639, 0, 68179, 0, 70180, 0, - 4599, 0, 0, 0, 0, 983798, 648, 194948, 65819, 0, 0, 0, 0, 94017, 0, - 11777, 9750, 983122, 0, 0, 92367, 70175, 5046, 66255, 0, 0, 65253, 0, - 5045, 0, 1916, 74069, 5044, 92348, 0, 0, 5043, 0, 0, 0, 74004, 9669, - 12341, 0, 8402, 0, 0, 70174, 0, 3586, 64508, 92456, 0, 0, 119606, 0, - 42628, 10069, 0, 0, 0, 0, 123, 120703, 0, 121326, 0, 10719, 129409, - 120444, 10829, 120593, 0, 12130, 0, 0, 0, 0, 3925, 0, 0, 75065, 71112, - 92372, 71110, 71111, 0, 120441, 120452, 983178, 0, 0, 0, 0, 0, 0, 0, 0, - 69879, 8509, 120449, 0, 0, 0, 120448, 0, 118889, 194858, 0, 0, 0, 66445, - 0, 71109, 0, 0, 72425, 0, 12136, 0, 0, 0, 0, 0, 0, 19922, 41768, 74002, - 0, 0, 0, 0, 2458, 0, 0, 0, 41074, 4266, 0, 0, 41077, 0, 9050, 0, 0, 0, 0, - 0, 41075, 2476, 0, 0, 0, 69761, 0, 0, 74202, 78745, 0, 121324, 70152, - 66033, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83106, 0, 0, 0, 43693, 78753, 0, 12194, - 66215, 0, 121273, 67216, 121499, 0, 121118, 0, 78756, 0, 0, 55256, 0, 0, - 0, 0, 43876, 0, 0, 0, 12948, 195003, 195002, 195005, 195004, 195007, - 195006, 0, 128320, 4287, 70183, 4902, 74020, 0, 0, 0, 1816, 0, 0, 168, 0, - 4898, 64298, 0, 78450, 4901, 1821, 0, 43294, 3653, 0, 791, 9162, 6977, - 121183, 0, 70160, 0, 73731, 8354, 0, 0, 0, 7557, 0, 0, 8234, 194992, - 78456, 194994, 194993, 194996, 194995, 65925, 194997, 195000, 194999, 0, - 195001, 0, 64397, 0, 0, 0, 71310, 194977, 194976, 2448, 194978, 194981, - 194980, 2452, 194982, 194985, 194984, 78694, 72292, 7845, 0, 78692, 4408, - 4122, 6772, 194988, 8723, 194990, 194989, 119302, 67403, 119304, 119303, - 2438, 119297, 119300, 119299, 41953, 0, 42135, 373, 119172, 2119, 11457, - 0, 41955, 0, 0, 0, 41952, 0, 0, 2127, 0, 128496, 5202, 0, 78765, 42823, - 11291, 0, 0, 12963, 0, 0, 4125, 41958, 12133, 0, 125099, 1271, 129427, 0, - 66024, 0, 3864, 127825, 0, 0, 0, 0, 4166, 0, 0, 0, 7459, 0, 119914, 5384, - 0, 0, 70154, 5759, 0, 0, 0, 0, 66744, 0, 120571, 0, 75066, 5552, 0, 0, - 127192, 5553, 0, 0, 0, 12906, 0, 0, 110787, 110792, 110788, 5554, 0, - 12344, 110786, 0, 0, 0, 0, 0, 8517, 0, 0, 0, 66017, 5555, 92317, 0, - 983653, 0, 0, 0, 9143, 0, 195067, 67995, 195069, 127162, 195071, 195070, - 4577, 64624, 0, 0, 125105, 983661, 4269, 983655, 983652, 983650, 0, 950, - 0, 983654, 983664, 983649, 0, 983656, 0, 119121, 0, 5098, 0, 0, 119099, + 41989, 0, 73460, 3418, 3263, 0, 0, 0, 3270, 64539, 11489, 0, 118945, + 126220, 0, 127795, 0, 94031, 0, 0, 0, 0, 0, 70512, 983964, 186, 0, + 119156, 5770, 13179, 0, 12612, 12949, 64856, 12800, 0, 0, 983151, 11507, + 0, 0, 118929, 0, 0, 72141, 0, 73459, 0, 0, 0, 73461, 9254, 66877, 194907, + 0, 92338, 5624, 126253, 0, 0, 0, 120472, 120464, 0, 0, 122915, 120462, 0, + 1872, 66508, 120467, 41079, 0, 5502, 119330, 41078, 194906, 0, 0, 4511, + 68449, 0, 0, 0, 0, 43245, 41083, 68861, 0, 0, 9003, 119959, 0, 5305, + 9653, 41081, 43146, 9546, 0, 0, 120478, 0, 65205, 71713, 64063, 120459, + 0, 0, 0, 64058, 43101, 43102, 0, 64062, 1028, 64060, 64059, 0, 10567, + 110816, 110817, 110814, 110815, 0, 2902, 64043, 64042, 43749, 10756, + 64047, 64046, 64045, 64044, 0, 10076, 64040, 64039, 0, 1034, 0, 0, 64034, + 64033, 64032, 42735, 64038, 64037, 64036, 64035, 4291, 0, 64015, 64014, + 83393, 83394, 83395, 983765, 0, 43090, 83391, 3476, 64013, 64012, 64011, + 64010, 64008, 64007, 2003, 7706, 0, 0, 119050, 64009, 204, 0, 0, 4430, + 8239, 64003, 10626, 64001, 64057, 13079, 64055, 64054, 0, 0, 43246, 9343, + 64049, 64048, 0, 1133, 64053, 64052, 64051, 64050, 0, 0, 0, 66415, 12329, + 0, 0, 0, 1942, 0, 0, 0, 128249, 0, 68291, 10760, 64023, 64022, 64021, + 64020, 43670, 77924, 64025, 41412, 78243, 78244, 0, 0, 64019, 64018, + 64017, 64016, 0, 0, 78251, 78252, 78248, 78249, 77914, 78247, 0, 917560, + 77919, 6788, 13094, 0, 7532, 41414, 0, 3179, 70745, 64769, 0, 0, 0, 0, + 10751, 0, 0, 0, 0, 0, 0, 0, 2008, 64031, 64030, 294, 41874, 83383, 83384, + 65929, 83376, 129063, 83379, 83380, 64028, 11396, 64026, 83374, 0, 0, + 118795, 71739, 43247, 0, 70153, 0, 0, 0, 0, 0, 0, 0, 0, 7801, 83359, + 83361, 128931, 0, 3297, 83356, 83357, 1135, 83350, 83351, 73696, 1995, + 7927, 71738, 110742, 2552, 83372, 60, 0, 8649, 83368, 83369, 83370, + 83371, 10541, 83365, 78679, 43833, 0, 0, 2013, 83362, 0, 110636, 0, 0, + 12832, 110638, 8081, 8362, 120188, 0, 9137, 0, 0, 0, 0, 3466, 0, 0, 1996, + 0, 3453, 3412, 0, 2002, 2000, 120176, 0, 0, 0, 0, 1998, 0, 1842, 0, 0, + 9628, 68446, 0, 9826, 64502, 1767, 3413, 0, 0, 0, 0, 0, 0, 13108, 44024, + 120204, 0, 92693, 0, 0, 0, 70291, 12650, 983208, 0, 68061, 0, 3592, 0, 0, + 0, 0, 983956, 0, 66417, 128792, 10742, 0, 0, 1994, 9281, 3296, 64475, + 1997, 1895, 128936, 72387, 0, 0, 123184, 72391, 0, 8999, 0, 983633, 0, + 66480, 0, 0, 0, 983083, 0, 596, 0, 0, 120216, 8651, 120217, 0, 0, 12995, + 0, 0, 70740, 0, 42930, 119955, 64810, 917834, 6825, 0, 917839, 120208, + 64275, 120889, 128069, 120210, 6384, 917840, 126477, 0, 67698, 0, 0, 0, + 120496, 0, 43412, 0, 0, 0, 0, 0, 120172, 0, 120763, 0, 0, 0, 128343, + 1457, 0, 0, 6381, 2815, 0, 65240, 129664, 0, 0, 119522, 70487, 0, 0, 0, + 0, 0, 120572, 0, 0, 0, 0, 0, 125253, 0, 0, 0, 120574, 0, 0, 0, 3055, + 9852, 0, 65288, 0, 11398, 0, 0, 93016, 0, 0, 603, 128557, 0, 0, 0, + 129366, 3350, 0, 0, 917828, 917827, 68428, 917825, 73045, 917831, 917830, + 917829, 0, 1919, 0, 110767, 83296, 83297, 83298, 66446, 64141, 8562, + 64139, 64138, 64136, 64135, 64134, 64133, 11297, 0, 0, 11966, 64128, + 66286, 0, 0, 64132, 10867, 64130, 64129, 0, 43374, 9779, 2764, 0, 0, + 9471, 0, 0, 0, 0, 66010, 0, 8857, 128771, 121423, 0, 69223, 0, 194660, + 983857, 0, 0, 43984, 0, 0, 0, 0, 0, 0, 10717, 64570, 5630, 0, 64143, + 64142, 83300, 67758, 83302, 0, 77930, 0, 0, 0, 11631, 64146, 64145, + 64144, 2384, 72801, 127380, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122916, 8933, + 1601, 917803, 858, 917809, 64109, 64108, 8090, 0, 917812, 917811, 587, 0, + 82971, 0, 0, 0, 78214, 2750, 0, 9983, 64158, 64157, 83288, 83289, 83290, + 2760, 83284, 83285, 83286, 83287, 64156, 64155, 64154, 72109, 64151, + 64150, 12679, 10053, 10421, 0, 64153, 64152, 0, 0, 4839, 0, 0, 4435, + 119016, 0, 64126, 64125, 64124, 64123, 129287, 0, 0, 7007, 0, 65443, 0, + 0, 64122, 0, 0, 93834, 64117, 64116, 6287, 64114, 64121, 64120, 64119, + 64118, 110659, 127842, 1177, 65601, 12322, 64106, 92169, 110654, 64102, + 64101, 64100, 64099, 0, 10453, 64104, 64103, 7997, 0, 92534, 0, 8705, + 64097, 64096, 9571, 0, 110652, 127398, 12132, 0, 0, 0, 110624, 73841, + 83339, 83340, 9056, 0, 0, 0, 6155, 64068, 64067, 64066, 64065, 64072, + 64071, 63, 64069, 127382, 0, 93822, 7257, 64064, 0, 0, 0, 0, 0, 0, 78748, + 0, 0, 0, 120519, 0, 66242, 66232, 4333, 9855, 64112, 0, 0, 0, 0, 0, 0, 0, + 66222, 0, 0, 0, 0, 69816, 0, 118796, 0, 8708, 0, 64077, 64076, 8996, + 4992, 4471, 83343, 64079, 64078, 92179, 0, 0, 129120, 64615, 0, 0, 12075, + 42041, 0, 0, 0, 0, 127557, 3123, 0, 983735, 0, 0, 0, 83328, 0, 9223, 0, + 83321, 83322, 73797, 83327, 1116, 0, 83319, 7136, 0, 0, 0, 0, 75031, 0, + 0, 0, 64092, 43675, 10104, 83338, 83331, 64095, 64094, 8111, 66247, 0, + 64089, 64088, 0, 70106, 42236, 11434, 64083, 64082, 43216, 7737, 64087, + 64086, 64085, 64084, 0, 0, 0, 4118, 1797, 83312, 0, 0, 46, 83308, 83309, + 298, 83303, 72402, 83305, 83306, 0, 0, 0, 128905, 11495, 0, 0, 0, 127377, + 194828, 127370, 0, 0, 0, 66239, 74945, 64403, 0, 0, 83314, 0, 0, 65758, + 43536, 0, 8544, 0, 0, 0, 0, 194824, 0, 0, 0, 0, 0, 3639, 11242, 194822, + 0, 0, 0, 0, 0, 0, 68409, 0, 0, 0, 0, 0, 0, 0, 128654, 8789, 126248, 0, 0, + 0, 0, 0, 0, 0, 65058, 0, 78234, 68064, 0, 66227, 71694, 5573, 118936, 0, + 44, 0, 66244, 118907, 0, 66238, 12844, 0, 1622, 129190, 1900, 0, 11458, + 0, 0, 6581, 5576, 128303, 0, 126122, 0, 113680, 8947, 0, 113812, 0, 0, 0, + 7908, 0, 0, 6579, 0, 0, 0, 0, 2138, 6583, 7761, 0, 0, 0, 66802, 5058, 0, + 0, 0, 5057, 125256, 0, 74538, 5054, 0, 0, 0, 0, 0, 0, 658, 3497, 128509, + 0, 5061, 5060, 4235, 0, 0, 0, 127757, 4236, 4727, 0, 0, 0, 128791, 0, + 7488, 128693, 7476, 0, 125259, 120646, 0, 0, 0, 66209, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9341, 119596, 0, 0, 0, 64668, 0, 8125, + 0, 6743, 119175, 0, 129441, 83406, 0, 127966, 119235, 74092, 0, 0, 43660, + 0, 0, 127901, 0, 0, 0, 264, 0, 74954, 0, 0, 0, 0, 0, 6019, 0, 0, 129121, + 0, 0, 0, 8800, 0, 66376, 0, 120948, 0, 100744, 0, 0, 92333, 725, 68014, + 0, 0, 72099, 0, 0, 0, 0, 74899, 0, 0, 0, 110804, 0, 72142, 5074, 5073, 0, + 0, 0, 0, 70723, 5072, 128576, 13098, 72403, 0, 11040, 0, 0, 0, 4929, 0, + 0, 0, 0, 0, 0, 0, 0, 67754, 4934, 0, 0, 9758, 0, 0, 70181, 42584, 0, + 4329, 0, 4979, 8663, 74521, 0, 983042, 74418, 0, 0, 5071, 0, 3642, 0, + 5070, 10042, 0, 3987, 5068, 120211, 8909, 0, 0, 69917, 0, 73981, 983141, + 70749, 4531, 120212, 9105, 0, 4921, 121059, 4926, 65544, 113786, 69621, + 0, 0, 0, 83269, 0, 120790, 4922, 0, 992, 119568, 4925, 0, 0, 9526, 4920, + 128617, 948, 0, 0, 4930, 0, 0, 0, 4933, 0, 0, 0, 4928, 0, 0, 0, 0, + 128379, 722, 0, 127483, 127482, 127485, 82997, 127487, 1509, 0, 5468, + 66214, 127474, 127477, 1672, 127479, 10864, 127481, 72132, 127467, 72159, + 127469, 127468, 127471, 127470, 68336, 82999, 120115, 1679, 120116, 0, + 120113, 127462, 127465, 127464, 127110, 120119, 120112, 0, 120109, 6968, + 5761, 342, 8553, 0, 8143, 127115, 127114, 127113, 624, 127111, 4057, 0, + 5078, 0, 0, 0, 5076, 0, 0, 0, 120097, 685, 9025, 1524, 8003, 0, 5539, + 113727, 113795, 120102, 7138, 120552, 0, 0, 0, 113724, 0, 8058, 9732, 0, + 5080, 0, 5036, 5035, 0, 42604, 72118, 0, 0, 275, 13291, 69995, 0, 0, + 983908, 5033, 0, 0, 4836, 70184, 73792, 0, 0, 0, 120681, 43704, 0, 2274, + 119000, 124983, 0, 8858, 6409, 0, 119585, 0, 0, 0, 0, 0, 68442, 0, 3432, + 10218, 0, 6094, 11232, 0, 0, 0, 0, 1676, 129157, 0, 0, 5030, 0, 118810, + 0, 73869, 0, 0, 69944, 6787, 0, 0, 0, 983595, 10544, 12919, 69425, 92218, + 0, 0, 0, 129172, 0, 67703, 0, 0, 0, 0, 0, 72290, 0, 0, 0, 0, 7018, 66241, + 0, 0, 0, 0, 0, 74056, 0, 11833, 0, 67975, 65232, 40964, 251, 12686, 7895, + 4395, 43538, 0, 0, 0, 78042, 0, 0, 40967, 5879, 0, 0, 0, 0, 0, 65540, + 128590, 625, 0, 120194, 1113, 0, 13103, 3630, 67224, 8179, 74264, 67886, + 9316, 10980, 2489, 120958, 8150, 1359, 121353, 70464, 127330, 127327, + 5042, 5041, 42769, 12084, 11196, 127321, 92279, 72398, 120535, 127317, + 127318, 127315, 12283, 127313, 11453, 0, 8795, 66245, 0, 0, 0, 5037, + 118864, 0, 0, 67724, 0, 66893, 74006, 0, 8431, 0, 0, 0, 0, 12620, 6826, + 73773, 70169, 5040, 0, 0, 0, 0, 0, 5039, 0, 0, 0, 5038, 0, 0, 0, 0, 0, + 65908, 0, 0, 0, 0, 0, 65157, 0, 0, 70182, 0, 73909, 4835, 0, 0, 0, 4309, + 7127, 0, 0, 0, 1301, 0, 0, 12222, 0, 73813, 711, 92439, 7133, 0, 0, 0, 0, + 0, 0, 0, 7661, 72263, 129541, 0, 0, 70453, 7627, 0, 5031, 92340, 42738, + 65784, 0, 65782, 3758, 0, 65781, 67865, 0, 2440, 65780, 70795, 8449, + 121393, 121479, 0, 2118, 0, 12121, 0, 0, 129510, 2128, 2130, 2131, 2126, + 2133, 0, 121250, 2114, 2116, 2455, 0, 2122, 2123, 2124, 2125, 983787, + 8714, 0, 2113, 0, 2115, 0, 127907, 43713, 5052, 66220, 66653, 65777, + 65778, 65775, 5051, 65773, 1429, 42647, 5050, 65769, 388, 70685, 735, 0, + 0, 128035, 0, 12726, 0, 0, 0, 0, 0, 5109, 5053, 0, 0, 0, 0, 0, 2470, 0, + 0, 1925, 71251, 0, 10971, 113770, 5048, 5047, 0, 0, 194946, 92313, 0, 0, + 0, 8089, 0, 639, 0, 68179, 0, 70180, 0, 4599, 0, 0, 0, 0, 983798, 648, + 194948, 65819, 0, 0, 0, 0, 94017, 0, 11777, 9750, 983122, 0, 0, 92367, + 70175, 5046, 66255, 0, 0, 65253, 0, 5045, 0, 1916, 74069, 5044, 92348, 0, + 0, 5043, 0, 0, 0, 74004, 9669, 12341, 0, 8402, 0, 0, 70174, 0, 3586, + 64508, 92456, 0, 0, 119606, 0, 42628, 10069, 0, 0, 0, 0, 123, 120703, 0, + 121326, 0, 10719, 129409, 120444, 10829, 120593, 0, 12130, 0, 0, 0, 0, + 3925, 0, 0, 75065, 71112, 92372, 71110, 71111, 0, 120441, 120452, 983178, + 0, 0, 0, 0, 0, 0, 0, 0, 69879, 8509, 120449, 0, 0, 0, 120448, 0, 118889, + 194858, 0, 0, 0, 66445, 0, 71109, 0, 0, 72425, 0, 12136, 0, 0, 0, 0, 0, + 0, 19922, 41768, 74002, 0, 0, 0, 0, 2458, 0, 0, 0, 41074, 4266, 0, 0, + 41077, 0, 9050, 0, 0, 73693, 0, 0, 41075, 2476, 0, 0, 0, 69761, 0, 0, + 74202, 78745, 0, 121324, 70152, 66033, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83106, + 0, 0, 0, 43693, 78753, 0, 12194, 66215, 0, 121273, 67216, 121499, 0, + 121118, 0, 78756, 0, 0, 55256, 0, 0, 0, 0, 43876, 0, 0, 0, 12948, 195003, + 195002, 195005, 195004, 195007, 195006, 0, 128320, 4287, 70183, 4902, + 74020, 0, 0, 0, 1816, 0, 0, 168, 0, 4898, 64298, 0, 78450, 4901, 1821, 0, + 43294, 3653, 0, 791, 9162, 6977, 121183, 0, 70160, 0, 73731, 8354, 0, 0, + 0, 7557, 0, 0, 8234, 194992, 78456, 194994, 194993, 194996, 194995, + 65925, 194997, 195000, 194999, 0, 195001, 0, 64397, 0, 0, 0, 71310, + 194977, 194976, 2448, 194978, 194981, 194980, 2452, 194982, 194985, + 194984, 78694, 72292, 7845, 0, 78692, 4408, 4122, 6772, 194988, 8723, + 72147, 194989, 119302, 67403, 119304, 119303, 2438, 119297, 119300, + 119299, 41953, 0, 42135, 373, 119172, 2119, 11457, 129618, 41955, 0, 0, + 0, 41952, 0, 0, 2127, 0, 128496, 5202, 0, 78765, 42823, 11291, 0, 0, + 12963, 0, 0, 4125, 41958, 12133, 0, 125099, 1271, 129427, 0, 66024, 0, + 3864, 127825, 0, 0, 0, 0, 4166, 0, 0, 0, 7459, 0, 119914, 5384, 0, 0, + 70154, 5759, 0, 0, 0, 0, 66744, 0, 120571, 0, 75066, 5552, 0, 0, 127192, + 5553, 0, 0, 0, 12906, 0, 0, 110787, 110792, 110788, 5554, 0, 12344, + 110786, 0, 0, 0, 0, 0, 8517, 0, 0, 0, 66017, 5555, 92317, 0, 983653, 0, + 0, 0, 9143, 0, 195067, 67995, 195069, 127162, 195071, 195070, 4577, + 64624, 0, 0, 125105, 983661, 4269, 983655, 983652, 983650, 0, 950, 0, + 983654, 983664, 983649, 0, 983656, 0, 119121, 0, 5098, 0, 0, 119099, 5097, 0, 9848, 0, 10293, 983645, 72798, 0, 0, 70303, 983665, 5102, 5101, 128370, 0, 8138, 4517, 1932, 5100, 195060, 195059, 1247, 10034, 195064, 5099, 0, 1441, 0, 4724, 650, 0, 73954, 983266, 129348, 195040, 195043, @@ -25279,79 +25927,80 @@ static unsigned int code_hash[] = { 64586, 127164, 42396, 0, 3475, 0, 2479, 0, 0, 0, 120728, 0, 42434, 194960, 194963, 194962, 110611, 67894, 42473, 194966, 110609, 1843, 42283, 0, 0, 0, 0, 0, 194970, 0, 42321, 7284, 194974, 194973, 194950, - 194949, 194952, 194951, 0, 194953, 0, 128645, 0, 0, 0, 0, 74952, 194954, - 194957, 194956, 66367, 194958, 41069, 67689, 9988, 0, 41068, 0, 4295, 0, - 0, 41951, 67835, 0, 785, 8236, 128647, 9027, 0, 194943, 0, 0, 0, 0, 0, 0, - 41071, 41059, 0, 92458, 129442, 0, 0, 0, 0, 2067, 4310, 0, 194606, 5180, - 194605, 0, 73872, 0, 69880, 5184, 42385, 194947, 983755, 128531, 0, 0, - 119149, 0, 121334, 0, 983762, 0, 0, 5178, 194929, 120548, 194931, 5188, - 194933, 194932, 72245, 194934, 1166, 64429, 42639, 0, 0, 0, 0, 128071, - 2442, 10703, 194940, 194939, 194635, 42439, 0, 0, 0, 73933, 983238, - 42401, 0, 0, 0, 42288, 0, 0, 0, 13145, 0, 2468, 0, 42327, 0, 0, 0, 42479, - 0, 0, 0, 92580, 0, 74939, 120678, 0, 73733, 0, 0, 2715, 0, 71257, 0, - 74114, 0, 0, 0, 0, 0, 66325, 118967, 0, 9240, 0, 0, 129142, 0, 0, 0, - 9815, 0, 11246, 0, 73912, 42733, 0, 0, 2480, 0, 0, 0, 6494, 5537, 0, 0, - 0, 0, 1211, 0, 121379, 0, 0, 12318, 0, 113796, 0, 0, 0, 0, 0, 64642, 0, - 0, 0, 0, 64864, 0, 0, 0, 121212, 0, 0, 3589, 92719, 4035, 6492, 92236, - 4265, 6843, 0, 74186, 41778, 113764, 119216, 2488, 0, 4582, 0, 71426, - 41777, 12926, 72708, 7528, 10550, 113761, 0, 0, 11439, 0, 0, 64878, 0, 0, - 0, 0, 2286, 0, 0, 126646, 127909, 0, 400, 126500, 0, 0, 0, 0, 0, 64827, - 0, 74948, 390, 0, 71301, 0, 3473, 0, 0, 66742, 0, 55285, 0, 0, 0, 92206, - 0, 0, 8004, 0, 6763, 0, 0, 7006, 0, 0, 6757, 0, 126648, 0, 6766, 0, 0, 0, - 6146, 0, 771, 0, 0, 41318, 0, 42272, 0, 0, 0, 0, 953, 12917, 72287, - 12300, 0, 11491, 68612, 0, 0, 71321, 7490, 11389, 7489, 3379, 0, 7487, - 72716, 7486, 7484, 7482, 6753, 7480, 7479, 7478, 7477, 6501, 7475, 0, - 7473, 7472, 2474, 7470, 7468, 124977, 0, 0, 0, 0, 71871, 11834, 128376, - 0, 6017, 0, 0, 0, 0, 0, 119365, 73949, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2472, 69945, 120699, 121133, 2139, 4256, 120776, 74380, 0, 73847, 73844, - 0, 0, 0, 0, 0, 0, 0, 0, 7083, 0, 8066, 7678, 0, 121124, 0, 0, 0, 0, 0, 0, - 0, 0, 120566, 0, 0, 0, 8330, 0, 0, 0, 0, 0, 0, 19934, 0, 1770, 67091, 0, - 128671, 0, 110605, 110606, 73843, 110604, 0, 110602, 67092, 0, 71334, 0, - 0, 0, 0, 0, 8162, 0, 5996, 129644, 4903, 0, 0, 43063, 0, 5172, 0, 7139, - 0, 127385, 0, 0, 0, 0, 4334, 6324, 41975, 12186, 10674, 12308, 0, 0, 0, - 72807, 41977, 68002, 0, 126630, 2018, 121388, 41979, 68003, 0, 68000, 0, - 0, 126984, 68001, 9334, 0, 71440, 0, 7975, 0, 0, 0, 66621, 4884, 70367, - 983740, 0, 121010, 0, 0, 0, 0, 0, 0, 0, 0, 463, 0, 0, 119607, 6509, 5460, - 0, 0, 0, 0, 42279, 0, 0, 0, 0, 0, 0, 0, 125027, 0, 121119, 0, 0, 0, 5663, - 0, 0, 0, 0, 2482, 66202, 0, 0, 42247, 65174, 73925, 0, 100940, 0, 0, - 126573, 0, 0, 2460, 0, 11944, 0, 0, 64679, 120835, 127310, 0, 0, 0, 5870, - 0, 0, 0, 100931, 539, 100933, 100932, 100935, 9064, 100937, 100936, - 100939, 100938, 0, 0, 0, 0, 0, 0, 41295, 100941, 2478, 100943, 4162, - 100945, 4260, 12953, 100950, 100949, 0, 0, 0, 0, 0, 0, 0, 0, 5000, 0, 0, - 0, 69672, 71439, 0, 74017, 0, 0, 6709, 0, 0, 983720, 0, 0, 100922, - 100921, 10301, 10333, 10397, 100925, 100928, 100927, 0, 0, 0, 127830, 0, - 4014, 12842, 0, 67413, 0, 0, 3893, 0, 0, 12210, 0, 42147, 0, 983622, - 74465, 0, 0, 0, 0, 0, 0, 0, 0, 110805, 8231, 0, 69946, 41968, 100929, - 41973, 12935, 41969, 0, 2453, 0, 0, 78807, 122893, 0, 10349, 10413, 0, - 41962, 3202, 119097, 0, 8316, 129174, 0, 7314, 0, 0, 0, 0, 1840, 0, 0, 0, - 4883, 100908, 4723, 70099, 100909, 0, 0, 0, 0, 11089, 240, 19906, 0, 0, - 0, 43600, 121004, 13134, 93065, 0, 65931, 110649, 110650, 42634, 110648, - 0, 121005, 11463, 0, 0, 0, 10445, 0, 92969, 0, 2614, 0, 0, 1729, 0, 0, - 100911, 0, 43334, 100912, 100915, 100914, 66201, 100916, 69662, 100896, - 100899, 100898, 4121, 100900, 70272, 82954, 63879, 0, 70872, 0, 0, 4039, - 643, 7726, 120082, 0, 120068, 58, 0, 0, 0, 63872, 0, 0, 100891, 0, 10625, - 100892, 100895, 100894, 1416, 120073, 917761, 67393, 0, 0, 0, 6996, 4264, - 0, 100902, 66179, 66768, 100903, 13114, 72311, 0, 3094, 0, 0, 127074, - 4437, 0, 0, 0, 55280, 42174, 0, 42430, 0, 72246, 42355, 0, 0, 0, 0, - 121251, 127401, 0, 0, 0, 0, 0, 0, 100882, 100881, 74037, 100883, 0, - 127099, 0, 0, 0, 0, 0, 69646, 65035, 65034, 11480, 6116, 65039, 65038, - 41180, 65036, 194565, 0, 12101, 5822, 0, 0, 0, 0, 11663, 127873, 63854, - 119657, 63853, 0, 0, 65810, 4289, 100885, 63896, 100887, 100890, 43621, - 0, 0, 0, 0, 194560, 7461, 73901, 0, 331, 0, 0, 0, 0, 0, 0, 0, 74629, 0, - 0, 0, 41964, 0, 63843, 2084, 41965, 0, 100864, 100863, 100866, 63841, - 78549, 41220, 13032, 100869, 8383, 0, 78548, 126102, 0, 0, 1351, 983846, - 8698, 100874, 100877, 1930, 100879, 78554, 74360, 100880, 69859, 78551, - 0, 0, 129433, 3657, 0, 65202, 6000, 119206, 41901, 0, 0, 41740, 0, 41283, - 0, 119267, 0, 0, 100871, 9695, 100873, 7562, 100853, 5170, 100855, - 100854, 676, 100856, 100859, 100858, 9978, 100860, 0, 0, 64934, 0, 0, 0, - 113714, 113706, 41829, 65886, 5159, 0, 41832, 704, 43077, 0, 120532, 0, - 68496, 65065, 41830, 0, 917799, 917798, 917797, 917796, 0, 67864, 113696, - 917800, 12336, 4135, 69805, 341, 2727, 4129, 100862, 100861, 0, 64503, - 7913, 0, 0, 4131, 63868, 0, 63871, 4133, 63864, 210, 0, 0, 0, 4137, - 78505, 78506, 0, 78504, 78830, 0, 0, 43873, 0, 0, 0, 0, 11988, 78510, - 195, 68321, 41501, 0, 42031, 0, 13135, 0, 0, 0, 41499, 0, 0, 9680, 41498, - 917794, 42025, 78567, 78556, 0, 0, 0, 0, 0, 0, 101074, 120502, 92597, 0, - 0, 917784, 7864, 0, 0, 917788, 121106, 917786, 917785, 917792, 67816, + 194949, 194952, 194951, 0, 194953, 123614, 128645, 0, 0, 0, 0, 74952, + 194954, 194957, 194956, 66367, 194958, 41069, 67689, 9988, 0, 41068, 0, + 4295, 0, 0, 41951, 67835, 0, 785, 8236, 128647, 9027, 0, 194943, 0, 0, 0, + 0, 0, 0, 41071, 41059, 0, 92458, 129442, 0, 0, 0, 123612, 2067, 4310, 0, + 123611, 5180, 123605, 0, 73872, 0, 69880, 5184, 42385, 194947, 983755, + 128531, 0, 0, 119149, 0, 121334, 0, 983762, 0, 0, 5178, 194929, 120548, + 194931, 5188, 194933, 194932, 72245, 194934, 1166, 64429, 42639, 0, 0, 0, + 0, 128071, 2442, 10703, 194940, 194939, 194635, 42439, 0, 0, 0, 73933, + 983238, 42401, 0, 0, 0, 42288, 0, 0, 0, 13145, 0, 2468, 0, 42327, 0, 0, + 0, 42479, 0, 0, 0, 92580, 0, 74939, 120678, 0, 73733, 0, 0, 2715, 0, + 71257, 0, 74114, 0, 0, 0, 0, 0, 66325, 69603, 0, 9240, 0, 0, 129142, 0, + 0, 0, 9815, 0, 11246, 0, 73912, 42733, 0, 0, 2480, 0, 0, 0, 6494, 5537, + 0, 0, 0, 0, 1211, 0, 121379, 0, 0, 12318, 0, 113796, 0, 0, 0, 0, 0, + 64642, 0, 0, 0, 0, 64864, 0, 0, 0, 121212, 0, 0, 3589, 92719, 4035, 6492, + 92236, 4265, 6843, 0, 74186, 41778, 113764, 119216, 2488, 0, 4582, 0, + 71426, 41777, 12926, 72708, 7528, 10550, 113761, 0, 0, 11439, 0, 0, + 64878, 0, 0, 0, 0, 2286, 0, 0, 126646, 127909, 0, 400, 126500, 0, 0, 0, + 0, 0, 64827, 0, 74948, 390, 0, 71301, 0, 3473, 0, 0, 66742, 0, 55285, 0, + 0, 0, 92206, 0, 0, 8004, 0, 6763, 0, 0, 7006, 0, 0, 6757, 73707, 126648, + 0, 6766, 0, 0, 0, 6146, 0, 771, 0, 0, 41318, 0, 42272, 0, 0, 0, 0, 953, + 12917, 72287, 12300, 0, 11491, 68612, 0, 0, 71321, 7490, 11389, 7489, + 3379, 0, 7487, 72716, 7486, 7484, 7482, 6753, 7480, 7479, 7478, 7477, + 6501, 7475, 0, 7473, 7472, 2474, 7470, 7468, 124977, 0, 0, 0, 0, 71871, + 11834, 128376, 0, 6017, 0, 0, 0, 0, 0, 119365, 73949, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2472, 69945, 120699, 121133, 2139, 4256, 120776, 74380, 0, + 73847, 73844, 0, 0, 0, 0, 0, 0, 0, 0, 7083, 0, 8066, 7678, 0, 121124, 0, + 0, 0, 0, 0, 0, 0, 0, 120566, 0, 0, 0, 8330, 0, 0, 0, 0, 0, 0, 19934, 0, + 1770, 67091, 0, 128671, 129617, 110605, 110606, 73843, 110604, 0, 110602, + 67092, 0, 71334, 0, 0, 0, 0, 0, 8162, 0, 5996, 129644, 4903, 0, 0, 43063, + 0, 5172, 0, 7139, 0, 127385, 0, 0, 0, 0, 4334, 6324, 41975, 12186, 10674, + 12308, 0, 0, 0, 72807, 41977, 68002, 0, 126630, 2018, 121388, 41979, + 68003, 0, 68000, 0, 0, 126984, 68001, 9334, 0, 71440, 0, 7975, 0, 0, 0, + 66621, 4884, 70367, 983740, 0, 121010, 0, 0, 0, 0, 0, 0, 0, 0, 463, 0, 0, + 69617, 6509, 5460, 0, 0, 0, 0, 42279, 0, 0, 0, 0, 0, 0, 0, 125027, 0, + 121119, 0, 0, 0, 5663, 0, 0, 0, 0, 2482, 66202, 0, 0, 42247, 65174, + 73925, 0, 100940, 0, 0, 126573, 0, 0, 2460, 0, 11944, 0, 0, 64679, + 120835, 127310, 0, 0, 0, 5870, 0, 0, 0, 100931, 539, 100933, 100932, + 100935, 9064, 100937, 100936, 100939, 100938, 0, 0, 0, 0, 0, 0, 41295, + 100941, 2478, 100943, 4162, 100945, 4260, 12953, 100950, 100949, 0, 0, 0, + 0, 0, 0, 0, 0, 5000, 0, 0, 0, 69672, 71439, 0, 74017, 0, 0, 6709, 0, 0, + 983720, 0, 0, 100922, 100921, 10301, 10333, 10397, 100925, 100928, + 100927, 0, 0, 0, 127830, 0, 4014, 12842, 0, 67413, 0, 0, 3893, 0, 0, + 12210, 0, 42147, 0, 983622, 74465, 0, 0, 0, 0, 0, 0, 0, 0, 110805, 8231, + 0, 69946, 41968, 100929, 41973, 12935, 41969, 0, 2453, 0, 0, 78807, + 122893, 0, 10349, 10413, 0, 41962, 3202, 119097, 0, 8316, 129174, 0, + 7314, 0, 0, 0, 0, 1840, 0, 0, 0, 4883, 100908, 4723, 70099, 100909, 0, 0, + 0, 0, 11089, 240, 19906, 0, 0, 0, 43600, 121004, 13134, 93065, 0, 65931, + 110649, 110650, 42634, 110648, 0, 121005, 11463, 0, 0, 0, 10445, 0, + 92969, 0, 2614, 0, 0, 1729, 0, 0, 100911, 0, 43334, 100912, 100915, + 100914, 66201, 100916, 69662, 100896, 100899, 100898, 4121, 100900, + 70272, 82954, 63879, 0, 70872, 0, 0, 4039, 643, 7726, 120082, 0, 120068, + 58, 0, 0, 0, 63872, 0, 0, 100891, 0, 10625, 100892, 100895, 100894, 1416, + 120073, 917761, 67393, 0, 0, 0, 6996, 4264, 0, 100902, 66179, 66768, + 100903, 13114, 72311, 0, 3094, 0, 0, 127074, 4437, 0, 0, 0, 55280, 42174, + 0, 42430, 0, 72246, 42355, 0, 0, 0, 0, 121251, 127401, 0, 0, 0, 0, 0, 0, + 100882, 100881, 74037, 100883, 0, 127099, 0, 0, 0, 0, 0, 69646, 65035, + 65034, 11480, 6116, 65039, 65038, 41180, 65036, 194565, 0, 12101, 5822, + 0, 0, 0, 0, 11663, 127873, 63854, 119657, 63853, 0, 0, 65810, 4289, + 100885, 63896, 100887, 100890, 43621, 0, 0, 0, 129613, 194560, 7461, + 73901, 0, 331, 0, 0, 0, 128029, 0, 0, 0, 74629, 0, 0, 0, 41964, 0, 63843, + 2084, 41965, 0, 100864, 100863, 100866, 63841, 78549, 41220, 13032, + 100869, 8383, 0, 78548, 126102, 0, 0, 1351, 983846, 8698, 100874, 100877, + 1930, 100879, 78554, 74360, 100880, 69859, 78551, 0, 0, 129433, 3657, 0, + 65202, 6000, 119206, 41901, 0, 0, 41740, 0, 41283, 0, 119267, 0, 0, + 100871, 9695, 100873, 7562, 100853, 5170, 100855, 100854, 676, 100856, + 100859, 100858, 9978, 100860, 0, 0, 64934, 0, 0, 0, 113714, 113706, + 41829, 65886, 5159, 0, 41832, 704, 43077, 0, 120532, 0, 68496, 65065, + 41830, 0, 917799, 917798, 917797, 917796, 0, 67864, 113696, 917800, + 12336, 4135, 69805, 341, 2727, 4129, 100862, 100861, 0, 64503, 7913, 0, + 0, 4131, 63868, 0, 63871, 4133, 63864, 210, 0, 0, 0, 4137, 78505, 78506, + 0, 78504, 78830, 0, 0, 43873, 0, 0, 0, 0, 11988, 78510, 195, 68321, + 41501, 0, 42031, 0, 13135, 0, 0, 0, 41499, 0, 0, 9680, 41498, 917794, + 42025, 78567, 78556, 0, 0, 0, 0, 0, 0, 101074, 120502, 92597, 0, 0, + 917784, 7864, 129001, 0, 917788, 121106, 917786, 917785, 917792, 67816, 917790, 2219, 0, 0, 0, 0, 0, 0, 121277, 0, 917777, 917776, 917775, 69644, 917781, 917780, 917779, 917778, 8668, 0, 121383, 917782, 5999, 0, 0, 129195, 128243, 43653, 1726, 1015, 0, 0, 0, 0, 64919, 0, 0, 0, 128478, 0, @@ -25376,233 +26025,234 @@ static unsigned int code_hash[] = { 10182, 0, 71311, 0, 0, 94052, 74963, 83503, 5998, 0, 0, 74825, 0, 12587, 0, 78571, 74889, 71328, 128955, 0, 74121, 0, 78822, 0, 0, 5995, 0, 42568, 0, 0, 63944, 73860, 0, 0, 4167, 0, 43175, 0, 74120, 0, 65076, 938, 73857, - 73854, 11737, 9721, 0, 0, 0, 11742, 0, 0, 11493, 12334, 0, 0, 66623, 0, - 9173, 0, 11978, 0, 73982, 113750, 113741, 0, 6759, 0, 0, 0, 0, 0, 70388, - 129093, 13027, 42777, 7683, 1167, 0, 4983, 0, 861, 0, 0, 68297, 0, 43757, - 92978, 129298, 0, 0, 0, 0, 70815, 9616, 0, 0, 12816, 43759, 0, 12710, - 68674, 12721, 4101, 66185, 0, 5992, 7616, 0, 0, 12577, 0, 0, 853, 42693, - 0, 121088, 0, 0, 917915, 0, 42835, 0, 0, 0, 0, 0, 12712, 7105, 127807, - 65060, 66875, 9900, 0, 0, 0, 121482, 119265, 0, 64778, 12585, 0, 0, 0, 0, - 0, 0, 77826, 0, 4900, 125245, 0, 0, 0, 4119, 74768, 8971, 0, 0, 0, 78594, - 41132, 9245, 73060, 0, 4138, 194841, 0, 0, 0, 77827, 0, 13054, 0, 0, - 128416, 110760, 0, 0, 3948, 128878, 0, 0, 0, 1680, 0, 78589, 0, 0, + 73854, 11737, 9721, 0, 0, 0, 11742, 0, 0, 11493, 12334, 128762, 0, 66623, + 0, 9173, 0, 11978, 0, 73982, 113750, 113741, 0, 6759, 0, 0, 0, 126222, 0, + 70388, 129093, 13027, 42777, 7683, 1167, 0, 4983, 0, 861, 0, 0, 68297, 0, + 43757, 92978, 129298, 0, 0, 0, 0, 70815, 9616, 0, 0, 12816, 43759, 0, + 12710, 68674, 12721, 4101, 66185, 0, 5992, 7616, 0, 0, 12577, 0, 0, 853, + 42693, 0, 121088, 0, 0, 917915, 0, 42835, 0, 0, 0, 0, 0, 12712, 7105, + 127807, 65060, 66875, 9900, 0, 0, 0, 121482, 119265, 0, 64778, 12585, 0, + 0, 0, 0, 0, 0, 77826, 0, 4900, 125245, 0, 0, 0, 4119, 74768, 8971, 0, 0, + 0, 78594, 41132, 9245, 73060, 0, 4138, 194841, 0, 0, 0, 77827, 0, 13054, + 0, 0, 128416, 110760, 0, 0, 3948, 128878, 0, 0, 0, 1680, 0, 78589, 0, 0, 120032, 0, 0, 0, 0, 74833, 74190, 5993, 42709, 0, 12706, 77846, 1893, 0, 63915, 0, 0, 110744, 0, 0, 63997, 120018, 63996, 3077, 0, 0, 1512, 0, 12589, 41479, 0, 0, 0, 0, 11831, 120727, 0, 41481, 0, 118912, 0, 3090, 0, - 3086, 1664, 1850, 0, 3079, 0, 0, 0, 127140, 0, 0, 74401, 0, 917555, 0, 0, - 0, 0, 0, 11526, 63985, 5864, 0, 63992, 0, 63991, 0, 5480, 7858, 0, 4116, - 78149, 0, 0, 0, 63907, 0, 0, 126131, 63905, 119601, 0, 983190, 0, 119666, - 0, 0, 7534, 507, 91, 2042, 120775, 0, 0, 66028, 118811, 41844, 70680, - 774, 0, 0, 0, 5994, 0, 0, 0, 0, 0, 72297, 0, 0, 0, 0, 6026, 0, 0, 0, 162, - 0, 125247, 78151, 78152, 983590, 92709, 0, 68304, 0, 0, 0, 66658, 0, 0, - 0, 0, 121511, 2226, 121512, 129349, 10492, 0, 121510, 0, 43119, 0, 0, 0, - 66192, 0, 0, 4899, 12729, 0, 0, 0, 0, 4103, 0, 0, 77851, 69429, 129046, - 0, 12859, 70087, 0, 0, 0, 0, 0, 0, 0, 0, 65264, 5146, 0, 194694, 71684, - 0, 0, 0, 983844, 0, 71688, 194693, 5147, 125019, 0, 74524, 71682, 128435, - 0, 194692, 5991, 3445, 0, 4976, 66193, 0, 0, 0, 0, 128309, 0, 0, 0, 0, - 63855, 0, 10138, 0, 0, 8897, 0, 75027, 0, 120931, 77862, 65836, 0, 0, - 77860, 0, 0, 1123, 4124, 41553, 77903, 0, 71680, 121386, 398, 0, 0, - 41551, 0, 0, 0, 41550, 9970, 0, 93062, 42392, 1305, 0, 0, 0, 0, 7346, + 3086, 1664, 1850, 0, 3079, 0, 0, 94080, 127140, 0, 0, 74401, 0, 917555, + 0, 0, 0, 0, 0, 11526, 63985, 5864, 0, 63992, 0, 63991, 0, 5480, 7858, 0, + 4116, 78149, 0, 0, 0, 63907, 0, 0, 126131, 63905, 119601, 0, 983190, 0, + 119666, 0, 0, 7534, 507, 91, 2042, 120775, 0, 0, 66028, 118811, 41844, + 70680, 774, 0, 0, 0, 5994, 0, 0, 0, 0, 0, 72297, 0, 0, 0, 0, 6026, 0, 0, + 0, 162, 0, 125247, 78151, 78152, 983590, 92709, 0, 68304, 0, 0, 0, 66658, + 0, 0, 0, 0, 121511, 2226, 121512, 129349, 10492, 0, 121510, 0, 43119, 0, + 0, 0, 66192, 0, 0, 4899, 12729, 0, 0, 0, 0, 4103, 0, 0, 77851, 69429, + 129046, 0, 12859, 70087, 0, 0, 0, 0, 0, 0, 0, 0, 65264, 5146, 0, 194694, + 71684, 0, 0, 0, 983844, 0, 71688, 194693, 5147, 125019, 0, 74524, 71682, + 128435, 0, 194692, 5991, 3445, 0, 4976, 66193, 0, 0, 0, 0, 128309, 0, 0, + 0, 0, 63855, 0, 10138, 0, 0, 8897, 0, 75027, 0, 120931, 77862, 65836, 0, + 0, 77860, 0, 0, 1123, 4124, 41553, 77903, 0, 71680, 121386, 398, 0, 0, + 41551, 0, 0, 0, 41550, 9970, 0, 93062, 42392, 1305, 78901, 0, 0, 0, 7346, 41464, 0, 0, 0, 41465, 983577, 8528, 9149, 0, 63955, 165, 3024, 11852, - 119163, 0, 9093, 0, 9147, 0, 0, 110989, 9148, 0, 4096, 53, 8296, 0, 0, 0, - 9594, 0, 0, 63952, 0, 10997, 0, 0, 5805, 0, 0, 0, 42176, 71455, 74601, 0, - 10591, 0, 0, 0, 0, 0, 0, 0, 0, 92475, 0, 0, 42379, 0, 0, 9220, 0, 121425, - 0, 0, 4132, 0, 0, 11239, 0, 0, 74837, 0, 66408, 0, 8055, 0, 0, 0, 63962, - 74042, 8924, 43123, 5988, 0, 63969, 0, 42718, 8788, 1357, 77872, 65743, - 0, 8774, 0, 0, 0, 0, 92748, 120598, 128234, 9564, 0, 0, 119124, 0, - 121241, 110983, 92975, 3121, 0, 0, 0, 70081, 0, 0, 0, 0, 0, 64851, 0, 0, - 73085, 119532, 0, 0, 0, 0, 1198, 0, 66708, 64619, 0, 64663, 93991, 0, 0, - 2101, 1398, 0, 92554, 0, 0, 92684, 11406, 0, 12127, 0, 840, 0, 0, 7101, - 120938, 0, 0, 12880, 0, 43104, 0, 0, 0, 2117, 0, 0, 0, 0, 0, 0, 0, 7769, - 0, 92413, 0, 0, 0, 0, 40986, 83117, 0, 0, 4127, 0, 0, 0, 0, 0, 0, 70738, - 0, 0, 0, 0, 0, 0, 119081, 0, 10581, 0, 4533, 0, 128941, 6490, 0, 12038, - 0, 0, 68225, 0, 0, 69704, 0, 1948, 119007, 0, 128594, 0, 0, 0, 120802, 0, - 9494, 0, 0, 0, 4843, 0, 74772, 4098, 0, 0, 0, 3436, 0, 127279, 12817, 0, - 126607, 0, 0, 0, 0, 74433, 0, 0, 0, 0, 121296, 65916, 0, 0, 121458, 0, - 129107, 93815, 0, 73743, 0, 0, 983132, 67676, 0, 0, 0, 128928, 0, 127892, - 0, 71326, 67222, 0, 75013, 92435, 0, 128500, 0, 0, 9613, 43425, 4526, - 121415, 0, 64520, 71336, 0, 0, 55278, 10228, 64957, 0, 0, 3807, 2081, - 66640, 0, 0, 0, 0, 119269, 0, 128688, 0, 128142, 1451, 0, 0, 4134, 0, - 74847, 0, 74793, 0, 0, 74295, 9960, 1201, 0, 12846, 121271, 0, 11919, - 64962, 0, 43739, 0, 66358, 0, 0, 0, 43679, 72284, 72289, 0, 129523, 1253, - 983851, 65766, 500, 65764, 65765, 65762, 65763, 65760, 65761, 70334, - 983848, 9821, 11702, 110630, 110631, 110628, 110629, 128481, 0, 7533, - 66717, 92500, 92305, 0, 0, 0, 127758, 71332, 0, 0, 0, 0, 11188, 0, 4112, - 0, 0, 12890, 0, 0, 9915, 0, 68423, 0, 0, 2876, 0, 0, 0, 0, 7382, 92415, - 0, 128132, 0, 0, 0, 0, 0, 127915, 0, 7003, 0, 0, 7704, 0, 0, 0, 4123, 0, - 0, 9977, 0, 0, 65759, 0, 0, 128266, 9808, 0, 92611, 4126, 0, 9521, 9589, - 64755, 0, 0, 0, 69948, 0, 92368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93814, 0, 0, - 92234, 0, 10693, 0, 0, 65897, 4058, 0, 0, 64660, 0, 0, 0, 983711, 1139, - 43298, 0, 71333, 8970, 0, 9934, 0, 11023, 128020, 42522, 0, 0, 0, 0, - 3057, 128113, 7349, 121327, 128722, 68065, 110813, 0, 128090, 67201, 0, - 0, 0, 9528, 0, 0, 0, 9102, 627, 0, 6273, 129496, 0, 0, 983210, 92966, - 43300, 0, 983721, 11696, 0, 1018, 65554, 0, 74338, 0, 7645, 0, 128321, 0, - 0, 0, 0, 73814, 11544, 12563, 10728, 0, 0, 0, 43311, 64966, 0, 0, 0, - 118946, 0, 0, 74779, 0, 185, 65085, 74533, 0, 0, 7535, 0, 42525, 0, 9749, - 41701, 6131, 0, 4117, 129062, 126988, 0, 92429, 65693, 0, 73445, 0, - 69695, 0, 0, 0, 0, 0, 0, 0, 1184, 0, 815, 0, 0, 0, 0, 0, 71325, 0, 0, - 64683, 983797, 0, 127959, 0, 0, 0, 0, 0, 0, 0, 68166, 0, 0, 0, 0, 66799, - 0, 128912, 0, 5142, 0, 69643, 0, 0, 83367, 93975, 0, 0, 0, 0, 0, 0, 0, - 74855, 121330, 0, 0, 0, 0, 10940, 66030, 0, 70385, 0, 0, 2652, 120527, 0, - 0, 0, 126508, 0, 0, 0, 0, 0, 0, 1828, 0, 128357, 0, 8531, 0, 74799, - 12324, 72434, 65238, 68374, 0, 65573, 0, 68308, 68679, 12904, 43445, 0, - 0, 0, 11247, 0, 0, 41426, 0, 0, 0, 0, 0, 67250, 69451, 83354, 71337, 0, - 0, 0, 0, 0, 0, 637, 0, 0, 0, 121178, 0, 0, 74474, 71306, 0, 7298, 128256, - 0, 0, 0, 0, 8210, 0, 0, 0, 2046, 0, 0, 0, 70333, 0, 1506, 69926, 0, - 83353, 0, 12651, 0, 0, 0, 12058, 120626, 74084, 7803, 0, 0, 65592, - 118844, 0, 0, 355, 9719, 0, 118961, 0, 121077, 0, 0, 42178, 0, 69760, - 42571, 0, 0, 0, 0, 0, 0, 127176, 3178, 0, 0, 92704, 83381, 9080, 120943, - 67697, 0, 121342, 0, 0, 71485, 0, 917837, 0, 0, 78157, 0, 0, 0, 0, 0, - 71313, 0, 0, 128212, 0, 72238, 67858, 0, 0, 0, 0, 0, 0, 0, 10770, 118994, - 0, 465, 0, 0, 74348, 0, 0, 0, 0, 0, 0, 0, 10930, 0, 0, 0, 119091, 69388, - 983614, 0, 0, 0, 0, 0, 0, 10092, 0, 0, 0, 0, 0, 1766, 11282, 11996, - 66644, 4547, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120906, 4345, 0, 0, 128947, 0, 0, - 0, 0, 0, 5382, 0, 0, 0, 0, 0, 5406, 43127, 121139, 0, 3590, 0, 0, 0, 0, - 42016, 0, 0, 121002, 0, 7742, 0, 66562, 71323, 0, 0, 5310, 0, 128173, 0, - 43594, 0, 128260, 66723, 0, 73816, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1326, - 128723, 0, 0, 74519, 0, 0, 0, 0, 71308, 0, 5410, 5783, 0, 8403, 5400, - 120526, 0, 128863, 0, 0, 0, 64412, 0, 0, 5587, 42865, 71858, 0, 0, 0, 0, - 113785, 0, 120755, 0, 69738, 0, 74867, 10461, 12103, 0, 0, 70701, 0, 0, - 0, 0, 0, 94009, 0, 0, 0, 8816, 41515, 0, 11802, 0, 7585, 910, 0, 0, 0, - 3658, 83386, 120525, 0, 7617, 0, 12888, 0, 0, 64631, 0, 41514, 11097, + 119163, 0, 9093, 0, 9147, 0, 0, 110989, 9148, 0, 4096, 53, 8296, 0, + 71352, 0, 9594, 0, 0, 63952, 0, 10997, 0, 0, 5805, 0, 0, 0, 42176, 71455, + 74601, 129604, 10591, 0, 0, 0, 0, 0, 0, 0, 0, 92475, 0, 0, 42379, 0, 0, + 9220, 0, 121425, 0, 0, 4132, 0, 0, 11239, 0, 0, 74837, 0, 66408, 0, 8055, + 0, 0, 0, 63962, 74042, 8924, 43123, 5988, 0, 63969, 0, 42718, 8788, 1357, + 77872, 65743, 0, 8774, 0, 0, 0, 0, 92748, 120598, 128234, 9564, 0, 0, + 119124, 0, 121241, 110983, 92975, 3121, 0, 0, 0, 70081, 0, 0, 0, 0, 0, + 64851, 0, 0, 73085, 119532, 0, 0, 0, 0, 1198, 0, 66708, 64619, 0, 64663, + 93991, 0, 0, 2101, 1398, 0, 92554, 0, 0, 92684, 11406, 0, 12127, 0, 840, + 0, 0, 7101, 120938, 0, 0, 12880, 0, 43104, 0, 0, 0, 2117, 0, 0, 0, 0, 0, + 0, 0, 7769, 0, 92413, 0, 0, 0, 0, 40986, 83117, 0, 0, 4127, 0, 0, 0, 0, + 0, 0, 70738, 0, 129466, 0, 0, 0, 0, 119081, 0, 10581, 0, 4533, 0, 128941, + 6490, 0, 12038, 0, 0, 68225, 0, 0, 69704, 0, 1948, 119007, 129607, + 128594, 0, 0, 0, 120802, 0, 9494, 0, 0, 0, 4843, 0, 74772, 4098, 0, 0, 0, + 3436, 0, 127279, 12817, 0, 126607, 0, 0, 0, 0, 74433, 0, 0, 0, 0, 121296, + 65916, 0, 0, 121458, 0, 129107, 93815, 0, 73743, 0, 0, 983132, 67676, 0, + 0, 74627, 128928, 0, 127892, 0, 71326, 67222, 0, 75013, 92435, 0, 128500, + 0, 0, 9613, 43425, 4526, 121415, 0, 64520, 71336, 0, 0, 55278, 10228, + 64957, 0, 0, 3807, 2081, 66640, 0, 0, 0, 0, 119269, 0, 128688, 0, 128142, + 1451, 0, 0, 4134, 0, 74847, 0, 74793, 0, 0, 74295, 9960, 1201, 0, 12846, + 121271, 0, 11919, 64962, 0, 43739, 0, 66358, 0, 0, 0, 43679, 72284, + 72289, 0, 129523, 1253, 983851, 65766, 500, 65764, 65765, 65762, 65763, + 65760, 65761, 70334, 983848, 9821, 11702, 110630, 110631, 110628, 110629, + 128481, 0, 7533, 66717, 92500, 92305, 0, 0, 0, 127758, 71332, 0, 0, 0, 0, + 11188, 0, 4112, 0, 0, 12890, 0, 0, 9915, 0, 68423, 0, 0, 2876, 0, 0, 0, + 0, 7382, 92415, 0, 128132, 0, 0, 0, 0, 0, 127915, 0, 7003, 0, 0, 7704, 0, + 0, 0, 4123, 0, 0, 9977, 0, 0, 65759, 0, 0, 128266, 9808, 0, 92611, 4126, + 0, 9521, 9589, 64755, 0, 0, 0, 69948, 0, 92368, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 93814, 0, 0, 92234, 0, 10693, 0, 0, 65897, 4058, 0, 0, 64660, 0, 0, 0, + 983711, 1139, 43298, 0, 71333, 8970, 0, 9934, 0, 11023, 128020, 42522, 0, + 0, 0, 78899, 3057, 128113, 7349, 121327, 128722, 68065, 110813, 0, + 128090, 67201, 0, 0, 0, 9528, 0, 0, 0, 9102, 627, 0, 6273, 129496, 0, 0, + 983210, 92966, 43300, 0, 983721, 11696, 0, 1018, 65554, 0, 74338, 0, + 7645, 0, 128321, 0, 0, 0, 0, 73814, 11544, 12563, 10728, 0, 0, 127340, + 43311, 64966, 0, 0, 0, 118946, 0, 0, 74779, 0, 185, 65085, 74533, 0, 0, + 7535, 0, 42525, 0, 9749, 41701, 6131, 0, 4117, 129062, 126988, 0, 92429, + 65693, 0, 73445, 0, 69695, 0, 0, 0, 0, 0, 0, 0, 1184, 0, 815, 0, 0, 0, 0, + 0, 71325, 0, 0, 64683, 983797, 0, 127959, 0, 0, 0, 0, 0, 0, 0, 68166, 0, + 0, 0, 0, 66799, 0, 128912, 0, 5142, 0, 69643, 0, 0, 83367, 93975, 0, 0, + 0, 123209, 0, 0, 0, 74855, 121330, 0, 0, 0, 0, 10940, 66030, 0, 70385, 0, + 0, 2652, 120527, 0, 0, 0, 126508, 0, 0, 0, 0, 0, 0, 1828, 0, 128357, 0, + 8531, 0, 74799, 12324, 72434, 65238, 68374, 0, 65573, 0, 68308, 68679, + 12904, 43445, 0, 0, 0, 11247, 0, 0, 41426, 0, 0, 0, 0, 0, 67250, 69451, + 83354, 71337, 0, 0, 0, 0, 0, 0, 637, 0, 0, 0, 121178, 0, 0, 74474, 71306, + 0, 7298, 128256, 0, 0, 0, 0, 8210, 0, 0, 0, 2046, 0, 0, 0, 70333, 0, + 1506, 69926, 0, 83353, 0, 12651, 0, 0, 0, 12058, 120626, 72111, 7803, 0, + 0, 65592, 118844, 0, 0, 355, 9719, 0, 118961, 0, 121077, 0, 0, 42178, 0, + 69760, 42571, 0, 0, 0, 0, 0, 0, 127176, 3178, 0, 0, 92704, 83381, 9080, + 120943, 67697, 0, 121342, 0, 0, 71485, 0, 917837, 0, 0, 78157, 0, 0, 0, + 0, 0, 71313, 0, 0, 128212, 0, 72238, 67858, 0, 0, 0, 0, 0, 0, 0, 10770, + 118994, 0, 465, 0, 0, 74348, 0, 0, 0, 0, 0, 0, 0, 10930, 0, 0, 0, 119091, + 69388, 983614, 0, 0, 0, 0, 0, 0, 10092, 0, 0, 0, 0, 0, 1766, 11282, + 11996, 66644, 4547, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120906, 4345, 0, 0, + 128947, 0, 0, 0, 0, 0, 5382, 0, 0, 0, 0, 0, 5406, 43127, 121139, 0, 3590, + 0, 0, 0, 0, 42016, 0, 0, 121002, 0, 7742, 0, 66562, 71323, 0, 0, 5310, 0, + 128173, 0, 43594, 0, 128260, 66723, 0, 73816, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1326, 128723, 0, 0, 74519, 0, 0, 0, 0, 71308, 0, 5410, 5783, 0, 8403, + 5400, 120526, 0, 128863, 0, 0, 0, 64412, 0, 0, 5587, 42865, 71858, 0, 0, + 0, 0, 113785, 0, 120755, 0, 69738, 0, 74867, 10461, 12103, 0, 0, 70701, + 0, 0, 0, 0, 0, 94009, 0, 0, 0, 8816, 41515, 0, 11802, 0, 7585, 910, 0, 0, + 0, 3658, 83386, 120525, 0, 7617, 0, 12888, 0, 0, 64631, 0, 41514, 11097, 5703, 0, 41517, 41504, 41519, 0, 70104, 0, 65864, 0, 120533, 0, 121037, 0, 0, 43553, 120774, 0, 0, 0, 0, 0, 1578, 0, 43449, 0, 0, 8225, 121191, - 0, 72799, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110655, 0, 110656, 121247, + 94024, 72799, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110655, 0, 110656, 121247, 72213, 0, 110658, 0, 74997, 0, 3195, 10999, 983566, 7897, 0, 1203, 74396, - 0, 64544, 0, 0, 0, 2877, 0, 0, 0, 121112, 0, 0, 128977, 0, 0, 0, 0, 0, - 983623, 0, 0, 0, 0, 0, 0, 0, 0, 983078, 0, 0, 0, 9939, 0, 0, 0, 0, 0, 0, - 0, 10714, 0, 0, 0, 0, 0, 67738, 0, 74038, 0, 42897, 0, 0, 0, 0, 0, 0, - 7730, 0, 0, 0, 11163, 0, 0, 0, 113701, 4966, 128802, 70674, 0, 0, 3841, - 0, 0, 0, 77886, 0, 4972, 0, 64699, 0, 0, 0, 0, 0, 12705, 10203, 9608, 0, - 0, 11962, 121397, 0, 1196, 67684, 0, 777, 0, 0, 65271, 0, 0, 0, 0, 64824, - 983194, 0, 9454, 63778, 8658, 0, 0, 2705, 0, 64894, 0, 0, 11986, 92636, - 0, 8280, 0, 2701, 0, 0, 0, 0, 0, 9809, 0, 0, 0, 0, 0, 63761, 1748, 0, - 65719, 121078, 0, 0, 0, 55244, 3061, 0, 63765, 63787, 0, 41520, 0, 7694, - 0, 8896, 63768, 55282, 0, 127781, 0, 0, 63807, 1591, 0, 6386, 119144, 0, - 0, 0, 983199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68289, 0, 0, 7624, 0, 10996, - 92247, 10609, 0, 127181, 10987, 0, 70370, 3894, 0, 0, 0, 0, 493, 0, 0, - 1717, 12228, 479, 917941, 129347, 129473, 917935, 917939, 917924, 917932, - 92303, 64315, 0, 0, 83522, 6233, 42681, 83525, 83518, 83519, 64911, - 83521, 0, 0, 83516, 83517, 983081, 8378, 11632, 0, 0, 7323, 0, 120771, 0, - 0, 0, 0, 120904, 83526, 0, 128710, 92672, 0, 0, 0, 0, 0, 0, 0, 63806, - 63800, 0, 0, 0, 63798, 63803, 244, 11542, 0, 0, 73761, 0, 12669, 120310, - 0, 0, 0, 0, 120680, 71908, 0, 0, 8612, 0, 0, 0, 0, 0, 64662, 125056, - 1360, 248, 0, 63797, 0, 63794, 0, 7292, 983666, 63756, 42786, 74957, 0, - 12663, 0, 0, 0, 0, 0, 0, 0, 4579, 0, 0, 0, 0, 0, 0, 71130, 65545, 9602, - 8623, 0, 128052, 0, 0, 0, 0, 0, 0, 0, 659, 6098, 0, 12234, 83511, 83512, - 8311, 83514, 7669, 83508, 83509, 83510, 0, 0, 0, 0, 983932, 0, 0, 2323, - 0, 2319, 77917, 120900, 77916, 2311, 83077, 4415, 1586, 68050, 0, 128724, - 83020, 2309, 83022, 8173, 83013, 83014, 83015, 83016, 0, 83010, 83011, - 83012, 9397, 0, 9395, 9396, 9393, 9394, 9391, 9392, 9389, 6209, 9387, - 9388, 9385, 9386, 9383, 9384, 0, 0, 0, 0, 0, 11259, 0, 0, 0, 2313, 0, 0, - 0, 0, 0, 0, 10570, 65776, 110968, 0, 83006, 83007, 11998, 83009, 83002, - 83003, 83004, 66406, 0, 128780, 83000, 11818, 9381, 9382, 9379, 9380, - 9377, 9378, 9375, 9376, 1683, 9374, 0, 9372, 0, 0, 0, 0, 127801, 0, - 42029, 11079, 0, 43451, 42032, 0, 0, 0, 0, 5005, 0, 0, 42030, 5007, - 78828, 0, 0, 4951, 110776, 0, 110775, 0, 43309, 121222, 92172, 0, 92334, - 0, 9548, 0, 119138, 71896, 0, 0, 0, 0, 0, 0, 65691, 65580, 64361, 10496, - 0, 0, 0, 917975, 0, 0, 41046, 0, 0, 0, 13177, 0, 64703, 0, 43499, 3389, - 10589, 0, 11208, 120719, 78395, 73964, 78393, 78392, 78391, 11314, 8281, - 113732, 113667, 113745, 9076, 8862, 69743, 41052, 78397, 64766, 69821, 0, - 0, 0, 82992, 82994, 10671, 82998, 82987, 82989, 82990, 6303, 113664, 498, - 64471, 82986, 0, 0, 9349, 0, 0, 0, 8031, 2414, 0, 0, 3231, 0, 6422, 0, 0, - 119339, 2537, 78405, 41429, 78403, 78401, 78399, 0, 0, 41433, 4719, - 41431, 0, 78411, 5211, 41428, 78407, 82983, 1772, 0, 0, 82979, 66850, - 64812, 82982, 82975, 68767, 82977, 82978, 0, 0, 0, 0, 41064, 70368, 9663, - 66838, 129381, 12304, 125113, 0, 41062, 66847, 0, 0, 41061, 70454, 0, - 127187, 83049, 83050, 41509, 83054, 83045, 83046, 83047, 83048, 0, 43184, - 41507, 1958, 0, 66816, 41506, 0, 0, 0, 120717, 0, 0, 0, 74349, 0, 8008, - 0, 0, 0, 65083, 6839, 0, 126517, 73803, 127055, 127056, 3508, 127058, - 127059, 78038, 0, 120932, 0, 6411, 128115, 0, 0, 128832, 100930, 0, 0, 0, - 0, 0, 0, 128546, 0, 0, 120914, 0, 0, 0, 0, 917822, 128810, 983657, 65599, - 0, 9966, 12607, 4948, 128070, 0, 128149, 0, 0, 6207, 0, 6117, 73916, 0, - 0, 0, 0, 68244, 41511, 0, 129489, 127304, 0, 121289, 0, 0, 83031, 83032, - 0, 41556, 0, 0, 0, 128571, 73766, 0, 0, 0, 41510, 7953, 0, 0, 41513, 0, - 0, 0, 83038, 83039, 83040, 83041, 83034, 83035, 848, 9868, 983149, 6424, - 0, 83033, 0, 0, 0, 0, 0, 0, 893, 64576, 13299, 0, 0, 0, 71447, 0, 0, 0, - 0, 8903, 0, 0, 0, 8099, 0, 0, 0, 0, 0, 0, 0, 0, 113713, 0, 0, 0, 0, 0, - 83027, 41483, 83029, 83030, 83023, 83024, 69436, 83026, 194756, 41485, - 194758, 194757, 194760, 41482, 42737, 64588, 0, 127787, 0, 10014, 0, 0, - 194763, 194762, 68785, 194764, 194767, 194766, 0, 0, 0, 11377, 0, 0, - 983792, 0, 0, 0, 9776, 0, 93824, 5215, 194750, 13227, 8758, 194751, - 128744, 0, 0, 5363, 12957, 0, 0, 129051, 129526, 6421, 0, 0, 121304, 0, - 0, 0, 0, 92625, 119070, 67895, 983943, 0, 68608, 6482, 0, 0, 11945, 0, 0, - 8838, 0, 4025, 10709, 0, 2108, 0, 73929, 0, 0, 10617, 194737, 128031, - 194739, 194738, 68614, 194740, 68611, 9924, 194745, 194744, 0, 0, 0, - 3277, 0, 4947, 41055, 0, 194722, 194721, 194724, 194723, 64626, 194725, - 42266, 194727, 8371, 194729, 127028, 12806, 41492, 0, 0, 73930, 194731, - 194730, 41054, 1078, 194735, 194734, 41057, 0, 0, 0, 0, 0, 92210, 73009, - 0, 41496, 0, 9165, 1572, 0, 917934, 0, 128635, 9215, 9330, 0, 10032, - 41745, 43183, 6401, 5831, 0, 0, 0, 8056, 0, 65681, 92377, 0, 0, 0, - 121048, 0, 118887, 6408, 0, 0, 5661, 82972, 82973, 3603, 0, 82967, 3548, - 82969, 82970, 0, 82964, 82965, 9918, 118787, 11321, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 41558, 41471, 0, 8158, 41561, 41472, 0, 0, 194672, 43762, 77927, - 6701, 41559, 1896, 66256, 66248, 194680, 5665, 0, 194681, 0, 0, 0, 74352, - 0, 5664, 127895, 194682, 12310, 5662, 194687, 194686, 73924, 1121, 82953, - 82955, 0, 74378, 0, 0, 74966, 0, 71892, 0, 69413, 194667, 8627, 194669, - 10110, 194671, 42024, 6420, 42028, 0, 10509, 2795, 73923, 0, 69231, 0, - 6275, 93957, 917927, 124972, 194655, 127786, 6423, 0, 0, 0, 68526, 12823, - 0, 0, 42026, 42017, 0, 7524, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12691, 68072, - 42722, 69877, 82956, 78655, 78661, 82959, 78662, 41265, 41065, 1795, 0, - 118791, 10587, 0, 983114, 0, 194640, 0, 12946, 194641, 71921, 194643, - 9169, 70372, 194648, 194647, 68202, 194649, 73990, 65111, 0, 748, 41067, - 6234, 194651, 9990, 72795, 194652, 194629, 194628, 194631, 194630, 67896, - 194632, 0, 3593, 82948, 82949, 82950, 82951, 82944, 69729, 82946, 82947, - 194638, 194637, 0, 581, 0, 42929, 7944, 0, 0, 0, 0, 0, 0, 0, 0, 10119, - 6415, 42893, 0, 69702, 0, 0, 11375, 0, 0, 0, 412, 92765, 42928, 42880, - 43587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65854, 92508, 65811, 75024, 194624, - 194627, 9344, 8826, 92916, 0, 125090, 74781, 0, 0, 0, 0, 0, 0, 127783, 0, - 0, 0, 0, 10133, 92755, 0, 0, 0, 0, 78414, 78413, 118950, 74011, 0, 0, - 121080, 0, 1908, 127378, 4918, 0, 0, 70709, 67825, 0, 0, 10811, 78412, - 11339, 4914, 0, 0, 118971, 4917, 70686, 0, 0, 4912, 69722, 73845, 0, 0, - 129527, 0, 0, 0, 118986, 0, 0, 74317, 0, 8319, 194714, 194717, 10960, - 72196, 8305, 12573, 983620, 72193, 0, 13202, 0, 12582, 0, 72198, 69856, - 0, 0, 78598, 0, 72195, 0, 65802, 74822, 7698, 12708, 74045, 0, 0, 70460, - 4913, 127990, 0, 0, 0, 0, 12728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12588, 8821, - 6153, 194705, 194708, 194707, 194710, 194709, 194712, 194711, 118854, - 194713, 651, 0, 0, 0, 0, 0, 78468, 78469, 69433, 78467, 78463, 74905, - 194695, 78461, 194697, 194696, 0, 4716, 43277, 0, 78474, 78475, 128592, - 120928, 194700, 55264, 194702, 120676, 0, 12707, 0, 0, 0, 0, 121417, - 8479, 4151, 0, 0, 0, 0, 0, 0, 0, 0, 113799, 0, 74050, 0, 0, 0, 0, 0, 0, - 12278, 0, 129507, 0, 2700, 12576, 7842, 0, 0, 0, 2699, 0, 0, 2985, 0, - 126475, 0, 0, 119314, 0, 119312, 9827, 119310, 119311, 119308, 119309, - 119306, 11481, 0, 119305, 0, 35, 78481, 78482, 66694, 78480, 78477, - 78478, 0, 0, 64257, 0, 0, 0, 78485, 78486, 78483, 4272, 0, 0, 40965, 0, - 12704, 78487, 983588, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5244, 4189, 94108, 0, - 127948, 4188, 1879, 0, 0, 0, 43743, 0, 8873, 2279, 0, 0, 0, 12574, 0, - 92749, 92753, 983902, 0, 0, 75001, 0, 0, 0, 12578, 12720, 128628, 101088, - 0, 12346, 128596, 101089, 0, 0, 7251, 0, 0, 118850, 73025, 0, 0, 0, 0, 0, - 12564, 66457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41564, 10976, 0, - 121223, 0, 0, 10054, 9197, 120618, 0, 9012, 65737, 74420, 0, 13215, - 12730, 0, 0, 0, 0, 816, 0, 0, 0, 83191, 0, 0, 92752, 0, 4715, 94107, - 94106, 71075, 0, 0, 0, 67729, 0, 307, 0, 9585, 0, 0, 0, 0, 0, 125267, 0, - 70727, 65567, 120498, 75006, 120984, 983890, 0, 12236, 41419, 194618, - 194621, 194620, 75003, 194622, 75004, 120957, 41421, 75005, 4462, 0, - 126599, 983892, 821, 0, 2498, 5800, 100834, 100833, 1760, 94019, 4469, - 64377, 100840, 100839, 0, 757, 1185, 0, 100841, 0, 10628, 100842, 68849, - 100844, 43971, 100846, 100849, 64763, 0, 7713, 0, 0, 0, 4380, 194608, - 128073, 194610, 194609, 194612, 862, 65626, 194613, 65627, 65629, 5137, - 194617, 0, 0, 0, 65069, 7566, 64688, 67143, 194592, 100823, 100822, - 100825, 4748, 92228, 100826, 100829, 42260, 129494, 64107, 0, 0, 0, 0, - 128189, 0, 194604, 13137, 8775, 127945, 0, 194607, 0, 8410, 4454, 194585, - 0, 92542, 4449, 92330, 127064, 75022, 92761, 70664, 194589, 339, 194591, - 194590, 0, 70662, 0, 100830, 41543, 0, 0, 0, 41542, 127066, 8916, 6705, - 0, 129296, 0, 0, 0, 0, 0, 41548, 6729, 119329, 0, 7348, 0, 0, 7537, 0, - 11819, 0, 0, 0, 71269, 0, 7344, 100808, 0, 9780, 0, 11117, 74993, 0, - 194578, 10483, 194580, 194579, 194582, 194581, 68781, 125114, 100820, - 100819, 0, 4211, 1259, 7517, 0, 0, 194561, 70827, 194563, 194562, 641, - 5219, 94034, 194566, 11064, 194568, 0, 0, 0, 0, 0, 0, 100812, 100811, - 100814, 100813, 100816, 100815, 100818, 100817, 100798, 100797, 41410, - 100799, 64262, 0, 41407, 75000, 0, 0, 93812, 0, 0, 72803, 74999, 0, 0, 0, - 67675, 0, 0, 0, 0, 43647, 0, 0, 100792, 100791, 100794, 100793, 100796, - 100795, 0, 74630, 11933, 0, 0, 41903, 67892, 11001, 100801, 42255, - 100803, 100802, 100805, 41905, 100807, 100806, 10775, 9793, 0, 0, 74452, - 0, 983063, 42535, 0, 64529, 41408, 42853, 0, 0, 42674, 118915, 0, 0, - 983788, 0, 70838, 0, 0, 0, 64506, 0, 66738, 4747, 100783, 69844, 100785, - 5832, 0, 0, 5141, 42600, 0, 0, 0, 0, 0, 0, 93790, 0, 7657, 0, 71132, - 74137, 0, 128362, 0, 0, 859, 0, 0, 0, 6059, 126985, 55235, 0, 0, 0, 0, 0, + 0, 64544, 0, 0, 0, 2877, 0, 0, 0, 121112, 0, 0, 128977, 119607, 0, 0, 0, + 0, 983623, 0, 0, 0, 0, 0, 0, 0, 0, 983078, 0, 0, 0, 9939, 0, 0, 0, 0, 0, + 0, 0, 10714, 0, 0, 0, 0, 0, 67738, 0, 74038, 0, 42897, 0, 0, 0, 0, 0, 0, + 7730, 0, 0, 0, 11163, 0, 0, 0, 113701, 4966, 128802, 70674, 129468, + 123207, 3841, 0, 0, 983227, 77886, 0, 4972, 0, 64699, 0, 0, 0, 0, 0, + 12705, 10203, 9608, 0, 0, 11962, 121397, 0, 1196, 67684, 0, 777, 0, 0, + 65271, 0, 0, 0, 0, 64824, 983194, 0, 9454, 63778, 8658, 0, 0, 2705, 0, + 64894, 0, 0, 11986, 92636, 0, 8280, 0, 2701, 0, 0, 0, 0, 0, 9809, 0, 0, + 0, 0, 0, 63761, 1748, 0, 65719, 121078, 0, 0, 0, 55244, 3061, 0, 63765, + 63787, 0, 41520, 0, 7694, 0, 8896, 63768, 55282, 0, 127781, 0, 0, 63807, + 1591, 0, 6386, 119144, 0, 0, 0, 983199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68289, + 0, 0, 7624, 0, 10996, 92247, 10609, 0, 127181, 10987, 0, 70370, 3894, 0, + 0, 0, 0, 493, 0, 0, 1717, 12228, 479, 917941, 129347, 129473, 917935, + 917939, 917924, 917932, 92303, 64315, 0, 0, 83522, 6233, 42681, 83525, + 83518, 83519, 64911, 83521, 0, 0, 83516, 83517, 983081, 8378, 11632, 0, + 0, 7323, 0, 120771, 0, 0, 0, 0, 120904, 83526, 0, 128710, 92672, 0, 0, 0, + 0, 0, 0, 0, 63806, 63800, 0, 0, 0, 63798, 63803, 244, 11542, 0, 0, 73761, + 0, 12669, 120310, 0, 0, 0, 0, 120680, 71908, 0, 0, 8612, 0, 0, 0, 0, 0, + 64662, 125056, 1360, 248, 0, 63797, 0, 63794, 0, 7292, 983666, 63756, + 42786, 74957, 0, 12663, 0, 0, 0, 0, 0, 0, 0, 4579, 0, 0, 0, 0, 0, 0, + 71130, 65545, 9602, 8623, 0, 128052, 0, 0, 0, 0, 0, 0, 0, 659, 6098, 0, + 12234, 83511, 83512, 8311, 83514, 7669, 83508, 83509, 83510, 0, 0, 0, 0, + 983932, 0, 0, 2323, 0, 2319, 77917, 120900, 77916, 2311, 83077, 4415, + 1586, 68050, 0, 128724, 83020, 2309, 83022, 8173, 83013, 83014, 83015, + 83016, 0, 83010, 83011, 83012, 9397, 0, 9395, 9396, 9393, 9394, 9391, + 9392, 9389, 6209, 9387, 9388, 9385, 9386, 9383, 9384, 0, 0, 0, 0, 0, + 11259, 0, 0, 0, 2313, 0, 0, 0, 0, 0, 0, 10570, 65776, 110968, 0, 83006, + 83007, 11998, 83009, 83002, 83003, 83004, 66406, 0, 128780, 83000, 11818, + 9381, 9382, 9379, 9380, 9377, 9378, 9375, 9376, 1683, 9374, 0, 9372, 0, + 0, 0, 0, 127801, 0, 42029, 11079, 0, 43451, 42032, 0, 0, 0, 0, 5005, 0, + 0, 42030, 5007, 78828, 126210, 0, 4951, 110776, 0, 110775, 0, 43309, + 121222, 92172, 0, 92334, 0, 9548, 0, 119138, 71896, 0, 0, 0, 0, 0, 0, + 65691, 65580, 64361, 10496, 0, 0, 0, 917975, 0, 0, 41046, 0, 0, 0, 13177, + 0, 64703, 0, 43499, 3389, 10589, 0, 11208, 120719, 78395, 73964, 78393, + 78392, 78391, 11314, 8281, 113732, 113667, 113745, 9076, 8862, 69743, + 41052, 78397, 64766, 69821, 0, 0, 0, 82992, 82994, 10671, 82998, 82987, + 82989, 82990, 6303, 113664, 498, 64471, 82986, 0, 0, 9349, 0, 0, 0, 8031, + 2414, 0, 128999, 3231, 0, 6422, 0, 0, 119339, 2537, 78405, 41429, 78403, + 78401, 78399, 0, 0, 41433, 4719, 41431, 0, 78411, 5211, 41428, 78407, + 82983, 1772, 0, 0, 82979, 66850, 64812, 82982, 82975, 68767, 82977, + 82978, 0, 0, 0, 0, 41064, 70368, 9663, 66838, 129381, 12304, 125113, 0, + 41062, 66847, 0, 0, 41061, 70454, 0, 127187, 83049, 83050, 41509, 83054, + 83045, 83046, 83047, 83048, 0, 43184, 41507, 1958, 0, 66816, 41506, 0, 0, + 0, 120717, 0, 0, 0, 74349, 72113, 8008, 0, 0, 0, 65083, 6839, 0, 126517, + 73803, 127055, 127056, 3508, 127058, 127059, 78038, 0, 120932, 0, 6411, + 128115, 0, 0, 128832, 100930, 0, 0, 0, 0, 0, 0, 128546, 0, 0, 120914, 0, + 0, 0, 0, 917822, 128810, 983657, 65599, 0, 9966, 12607, 4948, 128070, 0, + 128149, 0, 0, 6207, 0, 6117, 73916, 0, 0, 0, 0, 68244, 41511, 0, 129489, + 127304, 0, 121289, 0, 0, 83031, 83032, 0, 41556, 0, 0, 0, 128571, 73766, + 0, 0, 0, 41510, 7953, 0, 0, 41513, 0, 0, 0, 83038, 83039, 83040, 83041, + 83034, 83035, 848, 9868, 983149, 6424, 0, 83033, 0, 0, 0, 0, 0, 0, 893, + 64576, 13299, 0, 0, 0, 71447, 0, 0, 0, 0, 8903, 0, 0, 0, 8099, 0, 0, 0, + 0, 0, 0, 0, 0, 113713, 0, 0, 0, 0, 0, 83027, 41483, 83029, 83030, 83023, + 83024, 69436, 83026, 194756, 41485, 194758, 194757, 194760, 41482, 42737, + 64588, 0, 127787, 0, 10014, 0, 0, 194763, 194762, 68785, 194764, 194767, + 194766, 0, 0, 0, 11377, 0, 0, 983792, 0, 0, 0, 9776, 0, 93824, 5215, + 194750, 13227, 8758, 194751, 128744, 0, 0, 5363, 12957, 0, 0, 129051, + 129526, 6421, 0, 0, 121304, 0, 0, 0, 0, 92625, 119070, 67895, 983943, 0, + 68608, 6482, 0, 0, 11945, 0, 0, 8838, 0, 4025, 10709, 0, 2108, 0, 73929, + 0, 0, 10617, 194737, 128031, 194739, 194738, 68614, 194740, 68611, 9924, + 194745, 194744, 0, 0, 0, 3277, 0, 4947, 41055, 0, 194722, 194721, 194724, + 194723, 64626, 194725, 42266, 194727, 8371, 194729, 127028, 12806, 41492, + 0, 0, 73930, 194731, 194730, 41054, 1078, 194735, 194734, 41057, 0, 0, 0, + 0, 0, 92210, 73009, 0, 41496, 0, 9165, 1572, 0, 917934, 0, 128635, 9215, + 9330, 0, 10032, 41745, 43183, 6401, 5831, 0, 0, 0, 8056, 0, 65681, 92377, + 0, 0, 0, 121048, 0, 118887, 6408, 0, 0, 5661, 82972, 82973, 3603, 0, + 82967, 3548, 82969, 82970, 0, 82964, 82965, 9918, 118787, 11321, 0, 0, 0, + 128992, 0, 0, 0, 0, 0, 0, 41558, 41471, 0, 8158, 41561, 41472, 0, 0, + 194672, 43762, 77927, 6701, 41559, 1896, 66256, 66248, 194680, 5665, 0, + 194681, 0, 0, 0, 74352, 0, 5664, 127895, 194682, 12310, 5662, 194687, + 194686, 73924, 1121, 82953, 82955, 0, 74378, 0, 0, 74966, 0, 71892, 0, + 69413, 194667, 8627, 194669, 10110, 194671, 42024, 6420, 42028, 0, 10509, + 2795, 73923, 0, 69231, 0, 6275, 93957, 917927, 124972, 194655, 127786, + 6423, 0, 0, 0, 68526, 12823, 0, 0, 42026, 42017, 0, 7524, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 12691, 68072, 42722, 69877, 82956, 78655, 78661, 82959, + 78662, 41265, 41065, 1795, 0, 118791, 10587, 0, 983114, 0, 194640, 0, + 12946, 194641, 71921, 194643, 9169, 70372, 194648, 194647, 68202, 194649, + 73990, 65111, 0, 748, 41067, 6234, 194651, 9990, 72795, 194652, 194629, + 194628, 194631, 194630, 67896, 194632, 0, 3593, 82948, 82949, 82950, + 82951, 82944, 69729, 82946, 82947, 194638, 194637, 0, 581, 0, 42929, + 7944, 0, 0, 0, 0, 0, 0, 72143, 0, 10119, 6415, 42893, 0, 69702, 0, 0, + 11375, 0, 0, 0, 412, 92765, 42928, 42880, 43587, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 65854, 92508, 65811, 75024, 194624, 194627, 9344, 8826, 92916, 0, + 125090, 74781, 0, 0, 0, 0, 0, 0, 127783, 0, 0, 0, 0, 10133, 92755, 0, 0, + 0, 0, 78414, 78413, 118950, 74011, 0, 0, 121080, 0, 1908, 127378, 4918, + 0, 0, 70709, 67825, 0, 0, 10811, 78412, 11339, 4914, 0, 0, 118971, 4917, + 70686, 0, 0, 4912, 69722, 73845, 0, 0, 129527, 0, 0, 0, 118986, 0, 0, + 74317, 0, 8319, 194714, 194717, 10960, 72196, 8305, 12573, 983620, 72193, + 0, 13202, 0, 12582, 0, 72198, 69856, 0, 0, 78598, 0, 72195, 0, 65802, + 74822, 7698, 12708, 74045, 0, 0, 70460, 4913, 127990, 0, 0, 0, 0, 12728, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 12588, 8821, 6153, 194705, 78900, 194707, + 194710, 194709, 194712, 194711, 118854, 194713, 651, 0, 0, 0, 0, 0, + 78468, 78469, 69433, 78467, 69614, 74905, 194695, 78461, 194697, 194696, + 0, 4716, 43277, 0, 78474, 78475, 128592, 120928, 194700, 55264, 194702, + 120676, 0, 12707, 0, 0, 0, 0, 121417, 8479, 4151, 0, 0, 0, 0, 0, 0, 0, 0, + 113799, 0, 74050, 0, 0, 0, 0, 0, 129467, 12278, 0, 129507, 0, 2700, + 12576, 7842, 0, 0, 0, 2699, 0, 0, 2985, 0, 126475, 0, 0, 119314, 0, + 119312, 9827, 119310, 119311, 119308, 119309, 119306, 11481, 0, 119305, + 0, 35, 78481, 78482, 66694, 78480, 78477, 78478, 0, 0, 64257, 0, 0, 0, + 78485, 78486, 78483, 4272, 0, 0, 40965, 0, 12704, 78487, 983588, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5244, 4189, 94108, 0, 127948, 4188, 1879, 0, 0, 0, + 43743, 0, 8873, 2279, 0, 0, 0, 12574, 0, 92749, 92753, 983902, 0, 0, + 75001, 0, 0, 0, 12578, 12720, 128628, 101088, 0, 12346, 128596, 101089, + 0, 0, 7251, 0, 0, 118850, 73025, 0, 0, 0, 0, 0, 12564, 66457, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 41564, 10976, 0, 121223, 0, 0, 10054, 9197, + 120618, 0, 9012, 65737, 74420, 0, 13215, 12730, 0, 0, 0, 0, 816, 0, + 129462, 0, 83191, 0, 0, 92752, 0, 4715, 94107, 94106, 71075, 0, 0, 0, + 67729, 0, 307, 0, 9585, 0, 0, 0, 0, 0, 125267, 0, 70727, 65567, 120498, + 75006, 120984, 983890, 0, 12236, 41419, 194618, 194621, 194620, 75003, + 194622, 73675, 120957, 41421, 75005, 4462, 0, 126599, 983892, 821, 0, + 2498, 5800, 100834, 100833, 1760, 94019, 4469, 64377, 100840, 100839, 0, + 757, 1185, 0, 100841, 0, 10628, 100842, 68849, 100844, 43971, 100846, + 100849, 64763, 0, 7713, 0, 0, 0, 4380, 194608, 128073, 194610, 194609, + 194612, 862, 65626, 194613, 65627, 65629, 5137, 194617, 0, 0, 0, 65069, + 7566, 64688, 67143, 194592, 100823, 100822, 100825, 4748, 92228, 100826, + 100829, 42260, 129494, 64107, 0, 0, 0, 0, 128189, 0, 194604, 13137, 8775, + 127945, 123633, 194607, 0, 8410, 4454, 194585, 0, 92542, 4449, 92330, + 127064, 75022, 92761, 70664, 194589, 339, 194591, 194590, 0, 70662, 0, + 100830, 41543, 0, 0, 0, 41542, 127066, 8916, 6705, 0, 129296, 0, 0, 0, 0, + 0, 41548, 6729, 119329, 0, 7348, 0, 0, 7537, 0, 11819, 0, 0, 123624, + 71269, 0, 7344, 100808, 129595, 9780, 0, 11117, 74993, 0, 194578, 10483, + 194580, 194579, 194582, 194581, 68781, 125114, 100820, 100819, 0, 4211, + 1259, 7517, 0, 0, 194561, 70827, 194563, 194562, 641, 5219, 94034, + 194566, 11064, 194568, 0, 0, 0, 0, 0, 0, 100812, 100811, 100814, 100813, + 100816, 100815, 100818, 100817, 100798, 100797, 41410, 100799, 64262, 0, + 41407, 75000, 0, 0, 93812, 0, 0, 72803, 74999, 78897, 0, 0, 67675, 0, 0, + 0, 0, 43647, 0, 0, 100792, 100791, 100794, 100793, 100796, 100795, 0, + 74630, 11933, 0, 0, 41903, 67892, 11001, 100801, 42255, 100803, 100802, + 100805, 41905, 100807, 100806, 10775, 9793, 0, 0, 74452, 0, 983063, + 42535, 0, 64529, 41408, 42853, 0, 0, 42674, 118915, 0, 0, 983788, 0, + 70838, 0, 0, 0, 64506, 0, 66738, 4747, 100783, 69844, 100785, 5832, 0, 0, + 5141, 42600, 0, 0, 0, 0, 0, 0, 93790, 0, 7657, 0, 71132, 74137, 0, + 128362, 73682, 73681, 859, 0, 0, 0, 6059, 126985, 55235, 0, 0, 0, 0, 0, 100787, 11488, 72838, 100788, 0, 100790, 10558, 0, 0, 0, 126090, 71069, - 0, 0, 1788, 0, 0, 0, 0, 119571, 917961, 9028, 0, 69234, 0, 0, 9905, + 0, 0, 1788, 0, 0, 0, 0, 119571, 917961, 9028, 0, 69234, 73665, 0, 9905, 128485, 41242, 70086, 0, 74109, 100765, 100764, 100767, 100766, 70830, 83184, 70082, 3940, 0, 43754, 0, 128188, 8665, 0, 0, 0, 1653, 100775, 42406, 100777, 100780, 70825, 120523, 0, 8815, 0, 65046, 0, 42445, 0, @@ -25633,22 +26283,22 @@ static unsigned int code_hash[] = { 69656, 127217, 10604, 127215, 0, 0, 0, 0, 126561, 0, 0, 0, 0, 1618, 0, 0, 83175, 10430, 0, 0, 13063, 917585, 0, 92982, 113666, 0, 78390, 83489, 12060, 0, 113669, 0, 6329, 0, 0, 0, 74395, 2707, 8309, 0, 127054, 78398, - 0, 2697, 0, 78396, 127057, 2695, 0, 0, 68334, 0, 0, 0, 0, 2693, 74091, 0, - 0, 2703, 113729, 70283, 41918, 983168, 127542, 8687, 127543, 12178, - 43361, 92540, 64075, 110705, 5248, 110703, 120538, 6427, 0, 0, 0, 0, - 110710, 0, 74990, 74989, 70703, 127031, 0, 9873, 0, 0, 0, 64762, 2053, 0, - 6591, 9340, 0, 1589, 0, 296, 67712, 128315, 12766, 118931, 74370, 120417, - 8922, 128068, 43829, 111202, 74836, 0, 12579, 0, 12575, 6416, 5656, 0, - 13262, 65590, 5299, 0, 0, 5449, 1252, 0, 78404, 0, 74369, 65373, 5295, 0, - 121066, 1223, 1642, 78408, 0, 12158, 5303, 0, 120546, 41413, 3212, - 127025, 3211, 74810, 41425, 127029, 0, 74450, 9728, 0, 10924, 74778, - 6636, 0, 0, 0, 0, 0, 9519, 0, 0, 983928, 129439, 68780, 0, 0, 0, 0, 0, - 12104, 77942, 77951, 9004, 0, 74249, 10230, 0, 0, 0, 77947, 0, 69679, - 121475, 9890, 125049, 12971, 0, 92556, 0, 67903, 70051, 983905, 0, 0, - 9635, 12600, 0, 0, 0, 0, 6469, 0, 0, 65304, 4679, 0, 64300, 64867, 6531, - 0, 101099, 101098, 0, 101100, 42916, 0, 0, 0, 0, 0, 0, 4445, 72296, 0, - 11533, 0, 3416, 129148, 0, 0, 0, 78566, 0, 0, 101091, 0, 101093, 5447, - 101095, 101094, 101097, 101096, 0, 0, 0, 64448, 0, 43920, 70677, 0, 6232, + 0, 2697, 0, 78396, 127057, 2695, 0, 0, 68334, 0, 0, 0, 72325, 2693, + 74091, 0, 0, 2703, 113729, 70283, 41918, 983168, 127542, 8687, 127543, + 12178, 43361, 92540, 64075, 110705, 5248, 110703, 120538, 6427, 0, 0, 0, + 0, 110710, 0, 74990, 74989, 70703, 127031, 0, 9873, 0, 0, 0, 64762, 2053, + 0, 6591, 9340, 0, 1589, 0, 296, 67712, 128315, 12766, 118931, 74370, + 120417, 8922, 128068, 43829, 111202, 74836, 0, 12579, 0, 12575, 6416, + 5656, 0, 13262, 65590, 5299, 0, 0, 5449, 1252, 0, 78404, 0, 74369, 65373, + 5295, 0, 121066, 1223, 1642, 78408, 0, 12158, 5303, 0, 120546, 41413, + 3212, 127025, 3211, 74810, 41425, 127029, 0, 74450, 9728, 0, 10924, + 74778, 6636, 0, 0, 0, 0, 0, 9519, 0, 0, 983928, 129439, 68780, 0, 0, 0, + 126260, 0, 12104, 77942, 77951, 9004, 0, 74249, 10230, 0, 0, 0, 77947, 0, + 69679, 121475, 9890, 125049, 12971, 0, 92556, 0, 67903, 70051, 983905, 0, + 0, 9635, 12600, 0, 0, 0, 0, 6469, 0, 0, 65304, 4679, 0, 64300, 64867, + 6531, 0, 101099, 101098, 0, 101100, 42916, 0, 0, 0, 0, 0, 0, 4445, 72296, + 0, 11533, 0, 3416, 129148, 0, 0, 0, 78566, 0, 0, 101091, 0, 101093, 5447, + 72140, 101094, 101097, 101096, 0, 0, 0, 64448, 0, 43920, 70677, 0, 6232, 101101, 101104, 101103, 43608, 101105, 0, 6538, 4335, 0, 3941, 74986, 11061, 0, 74988, 74987, 0, 12155, 128278, 0, 0, 0, 0, 74578, 0, 65832, 0, 129459, 70789, 0, 125050, 0, 0, 350, 10951, 101081, 509, 101083, 101086, @@ -25657,7 +26307,7 @@ static unsigned int code_hash[] = { 1220, 917952, 93844, 0, 0, 5008, 42630, 70787, 101087, 101090, 68206, 564, 0, 312, 0, 0, 0, 70797, 8877, 269, 0, 128065, 9617, 0, 0, 100910, 0, 0, 10862, 0, 0, 41416, 0, 4173, 0, 0, 0, 1906, 0, 41418, 74073, 101068, - 101067, 41415, 101069, 9582, 0, 64287, 0, 0, 11428, 1730, 0, 0, 19918, + 101067, 41415, 69622, 9582, 0, 64287, 0, 0, 11428, 1730, 0, 0, 19918, 10469, 101076, 101079, 68088, 0, 101080, 72342, 0, 0, 0, 6129, 0, 0, 0, 0, 7874, 0, 0, 11206, 13136, 0, 129305, 0, 64374, 74925, 0, 73892, 0, 101073, 101072, 101075, 74960, 9228, 101054, 101057, 101056, 5240, 9811, @@ -25665,182 +26315,185 @@ static unsigned int code_hash[] = { 64654, 7467, 0, 0, 83460, 10040, 0, 3096, 0, 101053, 101052, 68820, 83461, 0, 0, 0, 0, 0, 0, 0, 0, 68801, 0, 101062, 101061, 101064, 101063, 0, 8637, 70741, 0, 77983, 77969, 11471, 43554, 0, 77968, 0, 0, 0, 2426, - 12042, 0, 0, 0, 3961, 12115, 129633, 0, 77972, 64561, 0, 4981, 74644, 0, - 0, 0, 42686, 77976, 128776, 64686, 0, 77958, 7589, 0, 0, 3237, 0, 68215, - 0, 8541, 127157, 71067, 0, 0, 0, 0, 0, 0, 43555, 0, 0, 10060, 111261, - 100917, 0, 0, 0, 64877, 0, 0, 8614, 65220, 41493, 0, 0, 0, 43780, 0, 0, - 70689, 0, 0, 0, 0, 0, 0, 4012, 10395, 0, 0, 111253, 126511, 111254, + 12042, 0, 0, 0, 3961, 12115, 129633, 0, 77972, 64561, 0, 4981, 74644, + 129558, 0, 0, 42686, 77976, 128776, 64686, 0, 77958, 7589, 0, 0, 3237, 0, + 68215, 0, 8541, 127157, 71067, 0, 0, 0, 0, 0, 0, 43555, 0, 0, 10060, + 111261, 100917, 0, 0, 0, 64877, 0, 0, 8614, 65220, 41493, 0, 0, 0, 43780, + 0, 0, 70689, 0, 0, 0, 0, 0, 0, 4012, 10395, 0, 0, 111253, 126511, 111254, 125051, 695, 739, 696, 7611, 0, 42755, 68421, 9227, 7506, 7510, 69937, 691, 738, 7511, 7512, 7515, 7501, 688, 41847, 690, 2548, 737, 974, 43386, 0, 0, 0, 0, 0, 0, 65860, 0, 7051, 69777, 4682, 0, 983096, 6406, 4685, 0, 0, 10347, 4680, 6341, 0, 0, 92607, 74325, 0, 0, 0, 0, 0, 0, 0, 0, 43505, - 92468, 11718, 42373, 11714, 0, 0, 0, 11717, 0, 10594, 0, 11712, 0, 0, - 10967, 0, 0, 0, 66632, 0, 0, 0, 0, 1735, 0, 11134, 2363, 983135, 0, 0, + 92468, 11718, 42373, 11714, 0, 0, 129567, 11717, 0, 10594, 0, 11712, 0, + 0, 10967, 0, 0, 0, 66632, 0, 0, 0, 0, 1735, 0, 11134, 2363, 983135, 0, 0, 70695, 128032, 0, 7491, 7495, 7580, 7496, 7497, 7584, 121478, 127853, 0, 0, 128375, 0, 8498, 0, 8949, 3065, 0, 0, 0, 0, 0, 0, 11713, 0, 64939, 0, 6418, 4543, 0, 0, 0, 74800, 0, 0, 0, 0, 0, 0, 0, 12282, 0, 0, 0, 64556, 0, 9238, 0, 68063, 0, 0, 0, 65438, 0, 128525, 0, 119268, 0, 0, 12900, 0, 10950, 0, 0, 0, 41400, 126636, 119664, 0, 42232, 0, 1744, 0, 41402, 0, 0, 0, 41399, 0, 125028, 0, 0, 12690, 0, 0, 43672, 0, 0, 0, 100870, 11315, 0, - 278, 121204, 41405, 129345, 0, 10077, 0, 70667, 0, 0, 0, 68210, 0, 0, - 11189, 70657, 0, 0, 0, 7934, 0, 93829, 120940, 0, 0, 0, 0, 0, 0, 6413, + 278, 121204, 41405, 129345, 0, 10077, 129650, 70667, 0, 0, 0, 68210, 0, + 0, 11189, 70657, 0, 0, 0, 7934, 0, 93829, 120940, 0, 0, 0, 0, 0, 0, 6413, 6550, 0, 1940, 2809, 43637, 70045, 0, 0, 10678, 0, 0, 0, 0, 78804, 6403, 6556, 78803, 0, 0, 0, 0, 0, 0, 0, 0, 3742, 74408, 3959, 0, 0, 917969, 0, 0, 128024, 0, 0, 127956, 0, 0, 0, 0, 4676, 983049, 9210, 0, 78143, 983903, 0, 78168, 983100, 11540, 43546, 6692, 0, 0, 0, 0, 9083, 0, 0, 78144, 128515, 0, 9677, 0, 70867, 74175, 0, 74070, 0, 0, 365, 0, 43027, - 0, 0, 128236, 0, 119574, 70284, 13151, 0, 0, 127935, 0, 544, 13249, - 119018, 0, 120846, 0, 0, 983051, 65339, 73000, 2211, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 128236, 0, 119574, 70284, 13151, 0, 0, 127935, 127950, 544, 13249, + 119018, 0, 120846, 0, 0, 73671, 65339, 73000, 2211, 0, 0, 0, 0, 0, 0, 0, 0, 128037, 0, 0, 0, 0, 0, 0, 0, 127188, 0, 69708, 9638, 0, 100878, 0, 0, 0, 74545, 128820, 128819, 75062, 128963, 0, 0, 0, 11264, 43994, 0, 0, 0, 1311, 0, 0, 0, 0, 13068, 0, 0, 78164, 78155, 0, 949, 0, 0, 0, 78176, 69709, 78177, 63828, 0, 0, 0, 70282, 0, 0, 0, 64822, 0, 6530, 0, 0, - 70493, 0, 129325, 0, 0, 4431, 118839, 127490, 983741, 0, 127986, 0, + 70493, 0, 129325, 0, 0, 4431, 118839, 127490, 983741, 73667, 127986, 0, 10336, 10400, 0, 0, 92959, 0, 0, 0, 42270, 128880, 6428, 0, 0, 0, 0, 43455, 0, 43526, 100888, 12835, 129501, 9493, 0, 0, 11793, 0, 127897, - 74394, 0, 10653, 0, 0, 0, 0, 6560, 7016, 74274, 983627, 43556, 3929, 0, - 6614, 2768, 0, 65609, 0, 11811, 0, 0, 0, 127513, 0, 6554, 0, 6305, 66283, - 4675, 118826, 78552, 0, 0, 74361, 0, 0, 68108, 0, 0, 92232, 0, 93022, - 7392, 8230, 9365, 983723, 0, 0, 0, 0, 42925, 0, 0, 0, 0, 229, 43834, - 119884, 0, 43552, 119881, 119880, 119883, 119882, 119877, 119876, 119879, - 119878, 119873, 119872, 119875, 119874, 0, 0, 0, 0, 0, 66352, 0, 0, 0, - 128663, 0, 12239, 0, 0, 10432, 12097, 0, 194815, 1233, 0, 0, 127200, 0, - 66395, 0, 0, 129504, 0, 0, 0, 0, 2388, 92555, 119868, 119871, 119870, - 119865, 895, 92668, 119866, 64889, 7143, 119863, 119862, 0, 0, 69983, 0, - 74376, 3053, 0, 0, 2047, 0, 0, 0, 121279, 67985, 194801, 92600, 194803, - 194802, 194805, 194804, 194807, 194806, 129134, 194808, 0, 0, 0, 10473, - 129331, 0, 194810, 0, 194812, 194811, 194814, 194813, 194790, 43528, - 69673, 194791, 0, 194793, 1912, 120779, 10306, 10370, 0, 0, 8867, 10250, - 10258, 10274, 1635, 120152, 0, 0, 0, 129379, 0, 0, 9919, 120148, 559, - 128157, 41825, 127975, 92989, 0, 74016, 194781, 6542, 41957, 7318, 0, 0, - 41956, 65749, 65750, 65751, 121323, 64487, 0, 0, 10223, 42062, 100640, 0, - 125044, 3668, 65754, 43560, 12226, 0, 93973, 194784, 41959, 194786, - 194785, 194788, 43618, 65747, 10937, 2962, 0, 2953, 10062, 65745, 71457, - 8921, 66013, 129370, 0, 194769, 194768, 43409, 194770, 2949, 194772, - 194775, 194774, 2958, 194776, 74868, 2300, 2951, 120061, 0, 120043, - 194778, 0, 120051, 194779, 120056, 120065, 70798, 120048, 0, 120062, - 120055, 78178, 100668, 0, 0, 92269, 0, 0, 70796, 127818, 0, 0, 64890, 0, - 43630, 11336, 799, 0, 10276, 10308, 10372, 917541, 0, 0, 10252, 10260, - 68220, 55284, 0, 0, 10384, 0, 0, 0, 64523, 0, 0, 65736, 0, 0, 0, 0, 0, 0, - 0, 0, 43549, 65738, 42150, 65739, 0, 78195, 10288, 10320, 0, 10596, 0, - 67673, 65045, 121283, 78198, 2049, 10098, 0, 122904, 127943, 10264, - 10280, 10312, 10376, 7013, 0, 0, 0, 0, 66375, 0, 4862, 0, 6537, 0, - 128335, 3914, 92178, 93976, 9065, 64816, 0, 72218, 73026, 0, 0, 0, 4694, - 11420, 4690, 0, 0, 983209, 4693, 0, 0, 0, 4688, 0, 0, 0, 0, 8238, 3110, - 0, 983920, 0, 6528, 0, 0, 0, 218, 0, 1520, 0, 70039, 0, 983594, 0, 0, - 78167, 10088, 6548, 100786, 0, 0, 0, 8888, 0, 124954, 0, 0, 126593, - 68876, 0, 0, 0, 0, 0, 0, 0, 4689, 43541, 77954, 120157, 0, 120156, 78810, - 120163, 0, 0, 0, 0, 78121, 0, 0, 11450, 0, 71900, 92613, 0, 121317, - 74622, 128720, 9244, 0, 0, 127763, 0, 0, 0, 0, 0, 0, 71084, 0, 0, 0, 0, - 10513, 0, 0, 0, 52, 119178, 0, 0, 93961, 0, 0, 4812, 0, 0, 0, 0, 0, 0, - 128425, 0, 120453, 0, 77959, 10170, 120450, 6544, 0, 0, 69782, 121517, 0, - 0, 65258, 10369, 0, 1585, 74014, 10249, 422, 1500, 2036, 986, 0, 64394, - 0, 5599, 917981, 2494, 0, 0, 74021, 983877, 78203, 127808, 0, 72871, - 65102, 8961, 74305, 10243, 10245, 128170, 0, 0, 0, 0, 0, 2508, 0, 120440, - 0, 120439, 0, 0, 0, 0, 0, 0, 64533, 983186, 0, 0, 74008, 0, 0, 43375, 0, - 2504, 0, 121313, 0, 983922, 6943, 0, 5859, 100677, 0, 0, 72873, 983926, - 0, 0, 983904, 92390, 2753, 1936, 2153, 67701, 2751, 12662, 2763, 8953, 0, - 10731, 0, 7052, 0, 0, 0, 0, 119899, 0, 66675, 0, 119897, 0, 71053, 0, - 119903, 0, 67829, 7899, 119901, 71119, 43798, 7072, 119902, 122898, - 11260, 0, 71059, 0, 0, 212, 0, 12350, 0, 0, 0, 0, 0, 128402, 2759, 0, 0, - 93064, 0, 0, 0, 1291, 0, 0, 121318, 119911, 0, 119910, 0, 12062, 0, - 121216, 0, 0, 121044, 120611, 8246, 0, 0, 0, 0, 0, 0, 73962, 0, 0, 43524, - 0, 64426, 0, 0, 0, 0, 65664, 6693, 0, 0, 8674, 0, 128812, 0, 11846, - 70690, 121461, 69395, 4811, 0, 5986, 0, 3046, 74480, 5985, 0, 0, 0, 0, - 12187, 83148, 71041, 5984, 0, 93817, 4393, 0, 120206, 917599, 0, 0, 0, - 93806, 93805, 0, 3491, 0, 67146, 0, 93819, 0, 72428, 0, 0, 0, 124968, - 41284, 0, 0, 0, 41287, 0, 100689, 0, 0, 92189, 0, 0, 219, 120874, 0, 0, - 0, 68485, 119672, 43241, 0, 7147, 0, 0, 0, 0, 0, 0, 64610, 11804, 0, - 7149, 64808, 0, 0, 0, 92301, 0, 0, 5253, 0, 0, 0, 0, 129045, 983596, - 11098, 68433, 0, 120484, 111009, 0, 0, 0, 0, 0, 70801, 100779, 0, 128198, - 9604, 0, 0, 0, 0, 118941, 64392, 0, 0, 0, 0, 41974, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 983239, 5308, 0, 290, 0, 125278, 128382, 2792, 0, 0, - 120521, 0, 0, 0, 126099, 0, 0, 0, 0, 128503, 0, 0, 72816, 0, 0, 0, 92671, - 0, 0, 42646, 7606, 2591, 73896, 0, 43513, 64482, 0, 0, 65270, 0, 0, - 983682, 9112, 0, 113763, 9490, 0, 0, 0, 0, 0, 9071, 0, 0, 0, 0, 74607, 0, - 2535, 65504, 43602, 0, 0, 71256, 0, 0, 0, 11845, 11006, 92315, 7807, - 8073, 0, 10629, 0, 74088, 0, 10823, 0, 113762, 8762, 0, 69689, 0, 43969, - 65047, 10737, 3463, 72858, 0, 66645, 0, 4815, 0, 0, 12345, 983742, 0, - 5195, 0, 0, 66639, 0, 0, 127316, 0, 92759, 92385, 1262, 0, 6561, 19939, - 0, 0, 100772, 0, 0, 0, 100774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 5702, 3655, 0, 8430, 0, 68807, 0, 0, 121137, 0, 0, 5254, 0, 0, 0, 0, - 119107, 5129, 0, 70816, 0, 92280, 5614, 0, 0, 11720, 0, 11721, 70804, - 4798, 0, 120541, 66038, 4793, 67851, 7352, 0, 0, 0, 0, 917600, 0, 300, 0, - 0, 128575, 92660, 0, 0, 2562, 70156, 120856, 0, 0, 92738, 0, 0, 127820, - 71093, 0, 127969, 128221, 0, 3424, 93843, 0, 0, 7074, 70873, 917926, 0, - 0, 10832, 0, 0, 69852, 72430, 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 1215, 0, - 5744, 0, 66440, 0, 0, 0, 42881, 0, 8980, 118988, 67861, 8844, 7433, 0, 0, - 4278, 0, 0, 0, 70821, 9312, 4348, 0, 128401, 65946, 0, 7087, 5255, 0, - 661, 0, 0, 0, 0, 0, 0, 0, 129073, 0, 0, 0, 0, 0, 0, 127179, 3621, 83325, - 66666, 72968, 0, 6562, 12928, 0, 73991, 0, 0, 11383, 0, 0, 65588, 120739, - 0, 0, 0, 0, 0, 0, 0, 0, 11436, 2070, 64, 110824, 0, 10291, 10323, 10387, - 0, 0, 0, 42008, 9708, 42710, 0, 42011, 0, 92164, 0, 0, 1702, 1240, - 128383, 6286, 9689, 111080, 0, 0, 0, 1765, 0, 0, 92373, 0, 0, 0, 8401, - 72991, 42014, 0, 67237, 0, 0, 0, 0, 0, 0, 0, 70819, 0, 0, 0, 0, 12667, 0, - 0, 10147, 0, 127568, 126483, 72812, 0, 0, 0, 0, 0, 128968, 0, 64947, 0, - 0, 0, 0, 10435, 11462, 0, 7084, 0, 0, 0, 0, 0, 126084, 0, 66662, 0, 0, 0, - 0, 125134, 0, 0, 77990, 263, 983728, 41288, 0, 0, 78387, 74340, 70313, - 129140, 0, 0, 0, 42022, 71265, 0, 0, 0, 0, 0, 0, 42020, 126575, 0, 6992, - 42019, 0, 41290, 0, 12295, 0, 71304, 0, 0, 71300, 120631, 5954, 64931, - 69385, 100699, 198, 68453, 78129, 0, 121351, 0, 70818, 13165, 7107, 0, - 42804, 678, 72850, 118960, 0, 72985, 42806, 42808, 0, 0, 2097, 0, 120560, - 70823, 0, 0, 3892, 68632, 0, 6712, 917959, 0, 0, 0, 0, 0, 69954, 0, 497, - 12100, 5953, 92667, 7796, 0, 43254, 0, 0, 11072, 5952, 1281, 43747, 0, - 69380, 10677, 0, 0, 0, 1859, 0, 72856, 3425, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 65199, 1738, 0, 122911, 0, 0, 0, 11101, 0, 0, 0, 0, 127002, 69651, - 4436, 194683, 73984, 0, 70305, 64872, 128296, 0, 0, 0, 121377, 0, 0, 0, - 43686, 983108, 0, 119109, 0, 70826, 319, 0, 43479, 73001, 0, 0, 12849, 0, - 7640, 71083, 9673, 0, 0, 0, 92670, 0, 92665, 113717, 41422, 0, 100708, - 74941, 3772, 0, 120660, 5011, 0, 0, 126587, 111315, 0, 0, 6677, 111312, - 0, 41427, 64419, 0, 92262, 0, 70799, 0, 0, 0, 6106, 0, 41271, 6760, - 983739, 4534, 41270, 128876, 0, 0, 119561, 0, 0, 3671, 8976, 126474, 0, - 41275, 0, 128084, 55261, 0, 42013, 0, 568, 0, 41273, 0, 0, 6728, 0, 9715, - 0, 0, 121058, 74820, 0, 92268, 0, 194564, 11191, 43688, 128023, 0, 0, 0, - 0, 0, 0, 0, 11958, 11165, 0, 125087, 0, 0, 66336, 127944, 0, 0, 0, 0, - 42858, 11789, 72878, 5557, 0, 69444, 7300, 0, 9467, 5558, 64486, 43844, - 0, 0, 6706, 10146, 0, 127185, 64566, 0, 0, 0, 0, 0, 0, 0, 4546, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 64528, 0, 6307, 128966, 0, 7544, 0, 43469, 111317, 0, - 10152, 0, 65091, 0, 0, 0, 0, 66652, 0, 0, 0, 0, 64823, 5559, 0, 70711, - 6702, 5556, 0, 0, 0, 0, 0, 11166, 0, 0, 5506, 0, 1911, 73021, 0, 12598, - 8845, 66698, 0, 73012, 0, 0, 2098, 0, 0, 0, 66622, 194678, 0, 0, 0, 9898, - 0, 0, 7552, 0, 0, 0, 7223, 65723, 0, 0, 0, 7024, 65728, 127155, 1210, 0, - 65175, 10184, 65726, 43654, 0, 0, 0, 38, 65729, 66669, 0, 0, 0, 0, 0, 0, - 0, 0, 74233, 73018, 119843, 42860, 111301, 92576, 65721, 65722, 0, 0, 0, - 0, 68843, 0, 68850, 0, 92388, 92267, 128536, 65577, 92213, 0, 127518, - 11650, 5013, 92663, 68810, 92568, 118914, 6613, 74371, 0, 0, 0, 0, 64714, - 71479, 0, 983778, 12120, 0, 0, 43124, 0, 0, 78037, 0, 0, 0, 0, 0, 1837, + 74394, 0, 10653, 0, 0, 0, 0, 6560, 7016, 74274, 983627, 43556, 3929, + 123615, 6614, 2768, 0, 65609, 0, 11811, 0, 0, 0, 127513, 0, 6554, 0, + 6305, 66283, 4675, 118826, 78552, 0, 0, 74361, 0, 0, 68108, 0, 0, 92232, + 0, 93022, 7392, 8230, 9365, 983723, 0, 0, 0, 0, 42925, 0, 0, 0, 0, 229, + 43834, 119884, 0, 43552, 119881, 119880, 119883, 119882, 119877, 119876, + 119879, 119878, 119873, 119872, 119875, 119874, 0, 0, 0, 0, 0, 66352, 0, + 0, 0, 128663, 0, 12239, 0, 0, 10432, 12097, 0, 194815, 1233, 0, 0, + 127200, 0, 66395, 0, 0, 129504, 0, 0, 0, 0, 2388, 92555, 119868, 119871, + 119870, 119865, 895, 92668, 119866, 64889, 7143, 119863, 119862, 0, 0, + 69983, 0, 74376, 3053, 0, 0, 2047, 0, 0, 0, 121279, 67985, 194801, 92600, + 194803, 194802, 194805, 194804, 194807, 194806, 129134, 194808, 0, 0, 0, + 10473, 129331, 0, 194810, 0, 194812, 194811, 194814, 194813, 123195, + 43528, 69673, 194791, 0, 194793, 1912, 120779, 10306, 10370, 0, 0, 8867, + 10250, 10258, 10274, 1635, 120152, 0, 0, 0, 129379, 0, 0, 9919, 120148, + 559, 128157, 41825, 127975, 92989, 0, 74016, 194781, 6542, 41957, 7318, + 0, 0, 41956, 65749, 65750, 65751, 121323, 64487, 0, 0, 10223, 42062, + 100640, 0, 125044, 3668, 65754, 43560, 12226, 0, 93973, 194784, 41959, + 194786, 194785, 194788, 43618, 65747, 10937, 2962, 0, 2953, 10062, 65745, + 71457, 8921, 66013, 129370, 0, 194769, 194768, 43409, 194770, 2949, + 194772, 194775, 194774, 2958, 194776, 74868, 2300, 2951, 120061, 0, + 120043, 194778, 0, 120051, 194779, 120056, 120065, 70798, 120048, 0, + 120062, 120055, 78178, 100668, 0, 0, 92269, 0, 0, 70796, 127818, 0, 0, + 64890, 0, 43630, 11336, 799, 0, 10276, 10308, 10372, 917541, 0, 0, 10252, + 10260, 68220, 55284, 0, 0, 10384, 0, 0, 0, 64523, 0, 0, 65736, 0, 0, 0, + 0, 0, 0, 0, 0, 43549, 65738, 42150, 65739, 0, 78195, 10288, 10320, 0, + 10596, 0, 67673, 65045, 121283, 78198, 2049, 10098, 0, 122904, 127943, + 10264, 10280, 10312, 10376, 7013, 0, 0, 0, 0, 66375, 0, 4862, 0, 6537, 0, + 128335, 3914, 92178, 93976, 9065, 64816, 0, 72218, 73026, 0, 0, 72139, + 4694, 11420, 4690, 0, 0, 983209, 4693, 0, 0, 0, 4688, 0, 0, 0, 0, 8238, + 3110, 0, 983920, 0, 6528, 0, 0, 0, 218, 0, 1520, 129577, 70039, 0, + 983594, 0, 0, 78167, 10088, 6548, 100786, 0, 0, 0, 8888, 0, 124954, 0, 0, + 126593, 68876, 0, 0, 0, 0, 0, 0, 0, 4689, 43541, 77954, 120157, 0, + 120156, 78810, 120163, 0, 0, 0, 0, 78121, 0, 0, 11450, 0, 71900, 92613, + 0, 121317, 74622, 128720, 9244, 0, 0, 127763, 0, 0, 0, 0, 0, 0, 71084, 0, + 0, 0, 0, 10513, 0, 0, 0, 52, 119178, 0, 0, 93961, 0, 0, 4812, 0, 0, 0, 0, + 0, 0, 128425, 0, 120453, 0, 77959, 10170, 120450, 6544, 0, 0, 69782, + 121517, 0, 0, 65258, 10369, 0, 1585, 74014, 10249, 422, 1500, 2036, 986, + 0, 64394, 0, 5599, 917981, 2494, 0, 0, 74021, 983877, 78203, 127808, 0, + 72871, 65102, 8961, 74305, 10243, 10245, 128170, 0, 0, 0, 0, 0, 2508, + 129591, 120440, 0, 120439, 0, 0, 0, 0, 0, 0, 64533, 983186, 0, 0, 74008, + 0, 0, 43375, 0, 2504, 0, 121313, 0, 983922, 6943, 0, 5859, 100677, 0, 0, + 72873, 983926, 0, 0, 983904, 92390, 2753, 1936, 2153, 67701, 2751, 12662, + 2763, 8953, 0, 10731, 0, 7052, 0, 0, 0, 0, 119899, 0, 66675, 0, 119897, + 0, 71053, 0, 119903, 0, 67829, 7899, 119901, 71119, 43798, 7072, 119902, + 122898, 11260, 0, 71059, 0, 0, 212, 0, 12350, 0, 0, 0, 0, 0, 128402, + 2759, 0, 0, 93064, 0, 0, 0, 1291, 0, 0, 121318, 119911, 0, 119910, 0, + 12062, 0, 121216, 0, 0, 121044, 120611, 8246, 0, 0, 0, 0, 0, 0, 73962, 0, + 0, 43524, 0, 64426, 0, 0, 0, 0, 65664, 6693, 0, 0, 8674, 0, 128812, 0, + 11846, 70690, 121461, 69395, 4811, 0, 5986, 0, 3046, 74480, 5985, 0, 0, + 0, 0, 12187, 83148, 71041, 5984, 0, 93817, 4393, 126264, 120206, 917599, + 0, 0, 0, 93806, 93805, 0, 3491, 0, 67146, 0, 93819, 0, 72428, 0, 0, 0, + 124968, 41284, 126228, 0, 0, 41287, 0, 100689, 0, 0, 92189, 0, 0, 219, + 120874, 0, 0, 0, 68485, 119672, 43241, 0, 7147, 0, 0, 0, 0, 0, 0, 64610, + 11804, 0, 7149, 64808, 0, 0, 0, 92301, 73690, 0, 5253, 0, 0, 0, 0, + 129045, 983596, 11098, 68433, 0, 120484, 111009, 0, 0, 0, 0, 0, 70801, + 100779, 0, 128198, 9604, 0, 0, 0, 0, 118941, 64392, 0, 0, 0, 0, 41974, + 126262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 983239, 5308, 0, 290, 0, 125278, + 128382, 2792, 0, 0, 120521, 0, 126237, 0, 126099, 0, 0, 0, 0, 128503, 0, + 0, 72816, 0, 0, 0, 92671, 0, 0, 42646, 7606, 2591, 73896, 0, 43513, + 64482, 0, 0, 65270, 0, 0, 983682, 9112, 0, 113763, 9490, 0, 0, 0, 0, 0, + 9071, 0, 0, 0, 0, 74607, 0, 2535, 65504, 43602, 0, 0, 71256, 0, 0, + 123147, 11845, 11006, 92315, 7807, 8073, 0, 10629, 0, 74088, 0, 10823, 0, + 113762, 8762, 0, 69689, 0, 43969, 65047, 10737, 3463, 72858, 129585, + 66645, 0, 4815, 0, 0, 12345, 983742, 0, 5195, 0, 0, 66639, 0, 0, 127316, + 0, 92759, 92385, 1262, 0, 6561, 19939, 0, 0, 100772, 123160, 0, 0, + 100774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5702, 3655, 0, 8430, 0, + 68807, 0, 0, 121137, 0, 0, 5254, 0, 0, 0, 0, 119107, 5129, 0, 70816, 0, + 92280, 5614, 0, 0, 11720, 0, 11721, 70804, 4798, 0, 120541, 66038, 4793, + 67851, 7352, 0, 0, 0, 0, 917600, 0, 300, 0, 0, 128575, 92660, 0, 0, 2562, + 70156, 120856, 0, 0, 92738, 0, 0, 127820, 71093, 0, 127969, 128221, 0, + 3424, 93843, 0, 0, 7074, 70873, 917926, 0, 0, 10832, 0, 0, 69852, 72430, + 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 1215, 0, 5744, 0, 66440, 0, 0, 0, + 42881, 0, 8980, 118988, 67861, 8844, 7433, 0, 0, 4278, 0, 0, 0, 70821, + 9312, 4348, 0, 128401, 65946, 0, 7087, 5255, 0, 661, 0, 0, 0, 0, 0, 0, 0, + 129073, 73694, 0, 123154, 0, 73688, 0, 127179, 3621, 83325, 66666, 72968, + 0, 6562, 12928, 0, 73991, 0, 0, 11383, 0, 0, 65588, 120739, 0, 0, 0, 0, + 0, 0, 0, 0, 11436, 2070, 64, 110824, 0, 10291, 10323, 10387, 0, 0, 0, + 42008, 9708, 42710, 0, 42011, 0, 92164, 0, 0, 1702, 1240, 128383, 6286, + 9689, 111080, 0, 0, 0, 1765, 0, 0, 92373, 0, 0, 0, 8401, 72991, 42014, 0, + 67237, 0, 0, 0, 0, 0, 0, 0, 70819, 0, 0, 0, 0, 12667, 0, 0, 10147, 0, + 127568, 126483, 72812, 0, 0, 0, 0, 123139, 128968, 0, 64947, 0, 0, 0, 0, + 10435, 11462, 0, 7084, 0, 0, 0, 0, 0, 126084, 0, 66662, 0, 0, 0, 0, + 125134, 0, 0, 77990, 263, 983728, 41288, 0, 0, 78387, 74340, 70313, + 129140, 0, 0, 0, 42022, 71265, 0, 0, 0, 0, 0, 0, 42020, 123146, 0, 6992, + 42019, 0, 41290, 0, 12295, 126233, 71304, 0, 0, 71300, 120631, 5954, + 64931, 69385, 100699, 198, 68453, 78129, 0, 121351, 0, 70818, 13165, + 7107, 0, 42804, 678, 72850, 118960, 0, 72985, 42806, 42808, 0, 0, 2097, + 0, 120560, 70823, 0, 0, 3892, 68632, 0, 6712, 917959, 0, 0, 0, 0, 123158, + 69954, 0, 497, 12100, 5953, 92667, 7796, 0, 43254, 0, 0, 11072, 5952, + 1281, 43747, 0, 69380, 10677, 0, 0, 0, 1859, 0, 72856, 3425, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 65199, 1738, 0, 122911, 0, 0, 0, 11101, 0, 0, 0, 0, + 127002, 69651, 4436, 194683, 73984, 0, 70305, 64872, 128296, 0, 0, 0, + 121377, 0, 0, 0, 43686, 983108, 0, 119109, 0, 70826, 319, 0, 43479, + 73001, 0, 0, 12849, 0, 7640, 71083, 9673, 0, 0, 0, 92670, 0, 92665, + 113717, 41422, 0, 100708, 74941, 3772, 0, 120660, 5011, 0, 0, 126587, + 111315, 0, 0, 6677, 111312, 0, 41427, 64419, 129445, 92262, 0, 70799, 0, + 0, 0, 6106, 0, 41271, 6760, 983739, 4534, 41270, 128876, 0, 0, 119561, 0, + 0, 3671, 8976, 123177, 0, 41275, 0, 128084, 55261, 0, 42013, 0, 568, 0, + 41273, 0, 0, 6728, 0, 9715, 0, 0, 121058, 74820, 0, 92268, 0, 194564, + 11191, 43688, 128023, 0, 0, 0, 126266, 0, 0, 0, 11958, 11165, 0, 125087, + 0, 0, 66336, 127944, 0, 0, 0, 0, 42858, 11789, 72878, 5557, 0, 69444, + 7300, 0, 9467, 5558, 64486, 43844, 0, 0, 6706, 10146, 0, 127185, 64566, + 0, 0, 0, 0, 0, 0, 0, 4546, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64528, 123136, + 6307, 128966, 0, 7544, 0, 43469, 111317, 0, 10152, 0, 65091, 0, 0, 0, 0, + 66652, 0, 0, 0, 0, 64823, 5559, 0, 70711, 6702, 5556, 0, 0, 0, 0, 0, + 11166, 0, 0, 5506, 0, 1911, 73021, 0, 12598, 8845, 66698, 0, 73012, + 123145, 0, 2098, 0, 0, 0, 66622, 194678, 0, 0, 0, 9898, 0, 0, 7552, 0, 0, + 0, 7223, 65723, 0, 0, 0, 7024, 65728, 127155, 1210, 0, 65175, 10184, + 65726, 43654, 0, 0, 0, 38, 65729, 66669, 0, 0, 0, 0, 0, 0, 0, 0, 74233, + 73018, 119843, 42860, 111301, 92576, 65721, 65722, 0, 0, 0, 0, 68843, 0, + 68850, 0, 92388, 92267, 128536, 65577, 92213, 0, 127518, 11650, 5013, + 92663, 68810, 92568, 118914, 6613, 74371, 0, 0, 0, 0, 64714, 71479, 0, + 983778, 12120, 0, 0, 43124, 0, 0, 78037, 0, 0, 126219, 0, 0, 1837, 125086, 0, 0, 0, 127210, 4952, 65718, 64405, 5504, 65720, 65714, 65715, 65716, 10403, 127005, 0, 41449, 0, 74028, 127213, 0, 119234, 1127, 455, 0, 0, 72860, 3483, 0, 1989, 0, 69678, 9104, 0, 65375, 0, 0, 0, 1864, 0, 72810, 8107, 2540, 0, 0, 11257, 128807, 119576, 0, 120999, 0, 0, 8604, 0, 0, 0, 0, 128270, 0, 0, 3115, 0, 10106, 127862, 118842, 0, 0, 9631, 0, 0, 0, 0, 0, 0, 0, 258, 129079, 0, 0, 0, 92292, 0, 70699, 0, 11478, 0, - 129640, 11522, 0, 8549, 0, 128430, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9221, - 12590, 73048, 0, 0, 0, 67741, 111294, 12619, 0, 10154, 111266, 74439, - 2039, 0, 7446, 0, 0, 10974, 458, 72831, 0, 0, 0, 11916, 0, 0, 69671, 0, - 121057, 12288, 0, 111288, 0, 111289, 983176, 0, 128199, 13080, 0, 67828, - 6610, 6030, 8059, 7508, 0, 0, 0, 0, 0, 41278, 0, 0, 128192, 41277, 64658, - 983983, 0, 6625, 983159, 19904, 0, 0, 0, 0, 0, 0, 833, 0, 6369, 0, 0, - 42664, 0, 0, 0, 0, 0, 0, 6913, 933, 1341, 68828, 6720, 0, 0, 983604, 0, - 0, 7405, 128025, 0, 0, 0, 0, 0, 0, 0, 70704, 0, 0, 0, 0, 9716, 0, 0, 0, - 70719, 0, 0, 0, 0, 72862, 70687, 0, 93987, 0, 0, 0, 70721, 9573, 0, 0, - 111245, 83225, 83226, 6949, 126482, 74061, 83222, 83223, 83224, 0, 19962, - 83219, 83220, 0, 111233, 0, 42830, 0, 111234, 74236, 66276, 0, 546, - 72861, 0, 70661, 0, 472, 11083, 10319, 10383, 917971, 0, 83202, 83203, - 3602, 83206, 41182, 83199, 83200, 69796, 41183, 0, 10271, 10287, 684, 0, - 0, 0, 83214, 4592, 83216, 83217, 83210, 11963, 43620, 83213, 0, 0, 83208, - 83209, 0, 92623, 128559, 3415, 0, 121267, 0, 0, 0, 43447, 0, 92212, 0, - 418, 0, 0, 10295, 10327, 10391, 0, 83189, 83190, 83192, 83194, 83185, - 83186, 83187, 83188, 120879, 0, 41446, 70700, 0, 0, 120809, 10599, 66892, - 0, 0, 0, 0, 0, 0, 11437, 0, 0, 0, 0, 0, 0, 12624, 0, 41185, 72865, 69439, - 8159, 0, 11686, 71478, 65224, 0, 4655, 0, 0, 92183, 0, 10343, 10407, 0, - 0, 0, 111221, 0, 0, 0, 94057, 68201, 0, 0, 983568, 0, 42792, 5743, 10424, - 0, 0, 0, 0, 0, 8875, 111225, 0, 917991, 13117, 12847, 4651, 118917, 0, - 962, 0, 0, 64705, 42564, 0, 1582, 0, 5508, 0, 0, 0, 10801, 0, 118798, 0, - 0, 66911, 10439, 66891, 0, 0, 7860, 0, 906, 917985, 0, 6405, 64722, 0, - 83266, 64694, 83268, 917990, 1153, 83263, 64788, 83265, 0, 12626, 83260, - 83261, 9964, 0, 0, 4642, 66574, 127886, 0, 0, 0, 0, 0, 9008, 0, 0, 0, 0, - 83248, 917976, 917993, 0, 42842, 83244, 83245, 83247, 83239, 83240, + 129640, 11522, 0, 8549, 0, 128430, 0, 0, 0, 0, 0, 0, 123140, 0, 0, 0, + 9221, 12590, 73048, 0, 0, 0, 67741, 111294, 12619, 0, 10154, 111266, + 74439, 2039, 0, 7446, 0, 111276, 10974, 458, 72831, 0, 0, 0, 11916, 0, 0, + 69671, 0, 121057, 12288, 0, 111288, 0, 111289, 983176, 0, 128199, 13080, + 0, 67828, 6610, 6030, 8059, 7508, 123170, 0, 0, 0, 0, 41278, 129393, 0, + 128192, 41277, 64658, 983983, 0, 6625, 983159, 19904, 0, 0, 0, 0, 0, 0, + 833, 0, 6369, 0, 0, 42664, 0, 0, 0, 0, 0, 0, 6913, 933, 1341, 68828, + 6720, 0, 0, 983604, 0, 0, 7405, 128025, 0, 0, 0, 0, 0, 0, 0, 70704, 0, 0, + 0, 0, 9716, 0, 0, 0, 70719, 0, 0, 0, 0, 72862, 70687, 0, 93987, 0, 0, 0, + 70721, 9573, 0, 0, 111245, 83225, 83226, 6949, 126482, 74061, 83222, + 83223, 83224, 0, 19962, 83219, 83220, 0, 111233, 0, 42830, 0, 111234, + 74236, 66276, 0, 546, 72861, 0, 70661, 0, 472, 11083, 10319, 10383, + 917971, 0, 83202, 83203, 3602, 83206, 41182, 83199, 83200, 69796, 41183, + 0, 10271, 10287, 684, 0, 0, 0, 83214, 4592, 83216, 83217, 83210, 11963, + 43620, 83213, 0, 0, 83208, 83209, 0, 92623, 128559, 3415, 0, 121267, 0, + 0, 123151, 43447, 0, 92212, 0, 418, 0, 0, 10295, 10327, 10391, 0, 83189, + 83190, 83192, 83194, 83185, 83186, 83187, 83188, 120879, 0, 41446, 70700, + 0, 0, 120809, 10599, 66892, 0, 0, 0, 0, 0, 0, 11437, 0, 0, 0, 0, 0, 0, + 12624, 0, 41185, 72865, 69439, 8159, 0, 11686, 71478, 65224, 0, 4655, 0, + 0, 92183, 0, 10343, 10407, 0, 0, 0, 111221, 0, 0, 0, 94057, 68201, + 129574, 0, 983568, 72156, 42792, 5743, 10424, 0, 0, 0, 0, 0, 8875, + 111225, 0, 917991, 13117, 12847, 4651, 118917, 0, 962, 0, 0, 64705, + 42564, 0, 1582, 0, 5508, 0, 0, 0, 10801, 123602, 118798, 73705, 0, 66911, + 10439, 66891, 0, 0, 7860, 0, 906, 917985, 0, 6405, 64722, 0, 83266, + 64694, 83268, 917990, 1153, 83263, 64788, 83265, 0, 12626, 83260, 83261, + 9964, 0, 0, 4642, 66574, 127886, 0, 0, 0, 0, 0, 9008, 100847, 0, 0, 0, + 83248, 917976, 917993, 123173, 42842, 83244, 83245, 83247, 83239, 83240, 83241, 83242, 0, 11335, 92661, 83238, 3920, 0, 0, 0, 83255, 83256, 41967, 83258, 83251, 83252, 83253, 8920, 0, 0, 83249, 83250, 0, 0, 43919, 0, 0, 0, 0, 128021, 0, 68113, 65196, 0, 0, 128472, 0, 10111, 64875, 0, 83491, @@ -25851,10 +26504,10 @@ static unsigned int code_hash[] = { 65840, 0, 0, 10081, 0, 0, 983893, 0, 0, 0, 127394, 65882, 0, 128758, 0, 0, 3605, 10985, 0, 0, 128872, 93972, 1745, 0, 73835, 0, 0, 0, 0, 0, 0, 8806, 7023, 0, 0, 0, 70702, 70304, 0, 0, 0, 0, 0, 0, 0, 0, 348, 10089, 0, - 9017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42515, 0, 0, 0, 0, 5391, 0, 0, 0, 0, - 5561, 0, 9429, 0, 67150, 7933, 5562, 0, 0, 0, 0, 78039, 0, 0, 0, 0, 3979, - 71248, 0, 0, 0, 68847, 0, 0, 118847, 65847, 68836, 68838, 0, 10585, 0, - 92676, 7334, 0, 0, 0, 831, 0, 0, 10716, 0, 121325, 0, 12218, 0, 6939, + 9017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42515, 0, 0, 0, 0, 5391, 983236, 0, 0, + 0, 5561, 0, 9429, 0, 67150, 7933, 5562, 0, 0, 0, 0, 78039, 0, 0, 0, 0, + 3979, 71248, 0, 0, 0, 68847, 0, 0, 118847, 65847, 68836, 68838, 0, 10585, + 0, 92676, 7334, 0, 0, 0, 831, 0, 0, 10716, 0, 121325, 0, 12218, 0, 6939, 70697, 65042, 0, 0, 916, 0, 0, 11968, 0, 0, 5563, 0, 0, 128830, 5560, 41212, 41774, 0, 4497, 0, 0, 0, 9039, 70678, 41776, 0, 8716, 3567, 119252, 0, 0, 74260, 0, 93954, 0, 0, 100827, 0, 128879, 70072, 68355, @@ -25870,8 +26523,8 @@ static unsigned int code_hash[] = { 78702, 78703, 78690, 78700, 0, 65701, 1934, 0, 0, 0, 78710, 0, 78706, 78709, 6087, 78705, 78716, 78719, 78711, 8043, 8950, 65694, 64485, 0, 10457, 0, 78724, 78725, 78722, 72332, 78720, 78721, 0, 65515, 0, 10035, - 13069, 0, 0, 127773, 0, 0, 0, 125207, 0, 0, 1667, 0, 0, 42428, 0, 0, 0, - 41750, 0, 0, 93999, 0, 8101, 3610, 113670, 41748, 127080, 0, 78394, + 13069, 0, 0, 127773, 0, 0, 0, 125207, 0, 0, 1667, 0, 0, 42428, 110950, 0, + 0, 41750, 0, 0, 93999, 0, 8101, 3610, 113670, 41748, 110948, 0, 78394, 119208, 0, 0, 113691, 64549, 68359, 0, 0, 65692, 92701, 0, 0, 12896, 10456, 68298, 0, 0, 0, 0, 917962, 0, 0, 113665, 70502, 0, 65687, 0, 0, 74009, 0, 113673, 8536, 70671, 0, 78726, 0, 724, 0, 113675, 78749, 9975, @@ -25883,7 +26536,7 @@ static unsigned int code_hash[] = { 9252, 0, 4652, 74259, 0, 917947, 0, 0, 0, 10806, 0, 0, 70016, 0, 6723, 0, 0, 6993, 0, 0, 12855, 0, 0, 11390, 0, 0, 0, 92503, 0, 0, 983161, 125270, 92627, 8278, 0, 4034, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12750, 9350, 66037, 0, - 0, 127785, 12747, 0, 0, 128064, 43153, 74640, 0, 0, 43150, 0, 983090, + 0, 73700, 12747, 0, 0, 128064, 43153, 74640, 0, 0, 43150, 0, 983090, 983088, 66779, 66777, 10813, 2592, 43139, 0, 0, 0, 0, 0, 71891, 0, 0, 0, 0, 0, 0, 0, 0, 128825, 1596, 0, 0, 0, 0, 6838, 66572, 0, 126574, 120627, 8092, 12805, 41928, 0, 78406, 78409, 0, 0, 0, 9931, 0, 0, 0, 0, 0, @@ -25893,75 +26546,76 @@ static unsigned int code_hash[] = { 0, 0, 0, 0, 0, 843, 0, 71099, 0, 0, 41935, 0, 0, 0, 0, 1371, 0, 43818, 43159, 8069, 9579, 41938, 41608, 0, 92444, 6242, 0, 0, 128595, 128244, 0, 92499, 8805, 1742, 113722, 0, 8202, 72399, 0, 983197, 0, 0, 73882, - 100809, 0, 43467, 0, 55290, 0, 1712, 5932, 0, 41762, 0, 0, 11967, 1775, - 0, 75009, 0, 120398, 120387, 9458, 0, 126614, 0, 0, 43176, 101032, - 101031, 42782, 101033, 101036, 101035, 101038, 101037, 101040, 101039, 0, - 0, 0, 0, 101041, 5794, 92274, 2662, 101045, 101044, 8254, 101046, 10975, - 101048, 120625, 101050, 917977, 4108, 8478, 917982, 0, 0, 92263, 917980, - 7507, 0, 43149, 0, 65031, 7961, 1636, 0, 65029, 0, 0, 70188, 9674, 0, 99, - 98, 97, 101022, 92203, 4049, 101027, 101026, 7090, 101028, 0, 101030, - 66589, 0, 65310, 66593, 66599, 0, 0, 0, 7447, 66594, 0, 0, 0, 73920, - 66595, 66596, 42570, 5593, 0, 0, 0, 0, 6061, 64854, 119, 118, 117, 116, - 0, 122, 121, 120, 111, 110, 109, 108, 115, 114, 113, 112, 103, 102, 101, - 100, 107, 106, 105, 104, 128504, 73974, 534, 0, 67713, 1536, 73973, - 73970, 0, 0, 0, 6020, 12716, 0, 12744, 65143, 0, 13266, 127813, 0, 0, 0, - 127116, 0, 1212, 65560, 0, 8134, 42935, 12129, 73870, 0, 1866, 0, 0, 0, - 0, 65073, 12059, 66585, 121391, 0, 0, 0, 5935, 1250, 0, 8174, 9787, 6733, - 9859, 9858, 9861, 9860, 101012, 1882, 1892, 6731, 10882, 10795, 101018, - 73911, 101020, 101019, 41169, 8939, 0, 120713, 41170, 1454, 0, 65130, - 69732, 0, 0, 0, 41172, 7855, 0, 71472, 0, 0, 0, 71691, 65901, 0, 0, 645, - 100992, 100991, 100994, 100993, 100996, 100995, 100998, 65587, 0, 10688, - 0, 0, 7729, 0, 101001, 120518, 101003, 66722, 101005, 101004, 68415, - 101006, 4538, 101008, 43141, 0, 0, 0, 0, 0, 0, 71918, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2381, 983733, 0, 0, 69857, 100981, 0, 100983, 100982, - 100985, 10856, 100987, 55255, 41478, 8582, 10064, 0, 0, 0, 0, 64896, 0, - 74609, 0, 128048, 10082, 11575, 0, 0, 0, 917505, 0, 6145, 75020, 0, - 92433, 71916, 83279, 43186, 0, 0, 83274, 83276, 83277, 83278, 10191, - 83271, 69633, 72353, 0, 0, 0, 0, 120090, 120089, 7931, 8558, 917946, 0, - 0, 0, 119145, 120081, 120084, 120083, 120086, 71449, 120088, 7366, 7019, - 75021, 0, 917951, 120078, 120077, 120080, 8657, 100967, 8594, 100969, - 100968, 0, 100970, 120072, 120071, 0, 0, 43154, 0, 0, 11332, 0, 7728, - 100978, 100977, 100980, 100979, 7851, 0, 8375, 128662, 0, 0, 126095, - 9085, 0, 0, 9327, 6160, 0, 0, 0, 0, 70698, 74012, 0, 0, 4439, 121151, - 100972, 100971, 100974, 100973, 100976, 100975, 100956, 42524, 71220, - 100957, 10826, 100959, 11296, 0, 0, 0, 7504, 43161, 127868, 0, 64670, 0, - 78056, 0, 11295, 0, 78053, 0, 0, 0, 10902, 0, 0, 0, 78068, 10472, 100954, - 100953, 120215, 78062, 2371, 78069, 118893, 259, 0, 0, 2402, 12157, 6440, - 0, 100963, 100962, 100965, 100964, 65380, 9103, 2278, 0, 0, 7301, 0, - 10219, 0, 0, 0, 67718, 43178, 0, 0, 119362, 917974, 8613, 0, 126121, - 917978, 917979, 121449, 12005, 7353, 0, 1890, 129130, 0, 0, 0, 42815, - 7991, 0, 10578, 0, 0, 0, 0, 0, 0, 0, 0, 120601, 42668, 9348, 0, 6164, 0, - 0, 0, 7676, 0, 0, 0, 0, 0, 129422, 83443, 71096, 0, 9175, 0, 78050, 9088, - 0, 0, 1396, 0, 0, 11461, 71088, 127835, 92252, 0, 71090, 121185, 69872, - 0, 0, 0, 0, 74043, 119632, 0, 0, 0, 5928, 4525, 10658, 0, 1266, 10180, - 64472, 0, 12622, 0, 0, 0, 0, 127139, 13310, 773, 19933, 0, 0, 0, 0, - 92205, 0, 0, 0, 0, 5862, 7823, 0, 0, 0, 3250, 43991, 69687, 66649, 0, 0, - 0, 0, 0, 64673, 917963, 917964, 0, 0, 917967, 917968, 917965, 917966, - 127791, 75041, 3471, 917970, 64573, 882, 0, 119584, 0, 120772, 0, 0, 0, - 92696, 0, 0, 72988, 0, 3225, 0, 73729, 0, 0, 43173, 11752, 4381, 0, 0, - 917945, 11756, 11757, 917944, 917949, 42654, 127848, 917948, 0, 0, 5160, - 1387, 0, 917953, 0, 128933, 917956, 917957, 917954, 917955, 917960, - 121082, 917958, 10789, 68314, 0, 126521, 11143, 0, 0, 70669, 128904, - 42179, 0, 5931, 11744, 11215, 70676, 119245, 0, 0, 0, 77915, 10217, - 64635, 128661, 83292, 0, 0, 0, 0, 0, 41296, 11747, 41291, 0, 0, 0, 41294, - 41282, 5923, 120610, 0, 0, 0, 0, 66800, 5786, 68252, 42539, 119869, - 119860, 0, 41474, 0, 0, 0, 5934, 74572, 66583, 119231, 0, 94072, 64481, - 0, 0, 0, 0, 67240, 0, 0, 0, 0, 5819, 0, 0, 0, 0, 0, 129387, 0, 0, 0, - 67993, 1237, 0, 0, 0, 983557, 0, 0, 0, 0, 0, 0, 0, 69789, 11266, 69845, - 0, 10506, 194747, 0, 0, 0, 0, 43185, 0, 100533, 100532, 100535, 10769, - 100537, 100536, 100539, 9753, 121035, 100540, 0, 0, 121433, 0, 100542, - 6072, 100544, 100543, 100546, 100545, 100548, 100547, 100550, 100549, 0, - 113744, 0, 0, 7222, 10283, 10315, 10379, 4996, 0, 0, 66517, 0, 10087, - 127833, 74938, 0, 0, 83492, 7565, 42890, 0, 77931, 43180, 77928, 74891, - 77929, 43982, 100526, 622, 77926, 100527, 100530, 1602, 0, 0, 0, 0, - 12160, 0, 10212, 77936, 0, 12071, 43143, 77935, 917983, 917984, 917989, - 77932, 917987, 917988, 10255, 10263, 10279, 4194, 10375, 93035, 0, 0, - 12644, 127516, 917994, 75007, 110791, 67408, 110789, 11501, 41177, 0, 0, - 71912, 0, 0, 8715, 0, 41179, 0, 0, 0, 41176, 0, 41181, 0, 8452, 121006, - 13161, 0, 70503, 5921, 0, 2597, 0, 5922, 118903, 0, 74242, 0, 0, 0, 0, 0, - 0, 0, 0, 127906, 0, 64944, 0, 0, 0, 0, 5924, 5920, 129508, 6921, 78081, - 74007, 78078, 8418, 11681, 43169, 10176, 0, 0, 0, 78087, 10772, 65276, - 5937, 1914, 78084, 11682, 0, 0, 0, 11685, 0, 100513, 7772, 11680, 100514, + 100809, 0, 43467, 123636, 55290, 0, 1712, 5932, 0, 41762, 129389, 0, + 11967, 1775, 0, 75009, 0, 120398, 120387, 9458, 0, 126614, 0, 0, 43176, + 101032, 101031, 42782, 101033, 101036, 101035, 101038, 101037, 101040, + 101039, 0, 0, 0, 0, 101041, 5794, 92274, 2662, 101045, 101044, 8254, + 101046, 10975, 101048, 120625, 101050, 917977, 4108, 8478, 917982, + 194790, 0, 92263, 917980, 7507, 0, 43149, 0, 65031, 7961, 1636, 0, 65029, + 0, 129665, 70188, 9674, 0, 99, 98, 97, 101022, 92203, 4049, 101027, + 101026, 7090, 101028, 0, 101030, 66589, 0, 65310, 66593, 66599, 0, 0, 0, + 7447, 66594, 0, 0, 0, 73920, 66595, 66596, 42570, 5593, 0, 0, 0, 0, 6061, + 64854, 119, 118, 117, 116, 0, 122, 121, 120, 111, 110, 109, 108, 115, + 114, 113, 112, 103, 102, 101, 100, 107, 106, 105, 104, 128504, 73974, + 534, 0, 67713, 1536, 73973, 73970, 0, 0, 0, 6020, 12716, 0, 12744, 65143, + 0, 13266, 127813, 0, 0, 0, 127116, 0, 1212, 65560, 0, 8134, 42935, 12129, + 73870, 0, 1866, 0, 0, 0, 0, 65073, 12059, 66585, 121391, 0, 0, 0, 5935, + 1250, 0, 8174, 9787, 6733, 9859, 9858, 9861, 9860, 101012, 1882, 1892, + 6731, 10882, 10795, 101018, 73911, 101020, 101019, 41169, 8939, 0, + 120713, 41170, 1454, 0, 65130, 69732, 0, 0, 129611, 41172, 7855, 0, + 71472, 0, 0, 0, 71691, 65901, 0, 0, 645, 100992, 100991, 100994, 100993, + 100996, 100995, 100998, 65587, 0, 10688, 0, 0, 7729, 0, 101001, 120518, + 101003, 66722, 101005, 101004, 68415, 101006, 4538, 101008, 43141, 0, 0, + 73699, 0, 0, 0, 71918, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2381, 983733, 0, + 0, 69857, 100981, 0, 100983, 100982, 100985, 10856, 100987, 55255, 41478, + 8582, 10064, 0, 0, 0, 0, 64896, 0, 74609, 0, 128048, 10082, 11575, 0, 0, + 0, 917505, 0, 6145, 75020, 0, 92433, 71916, 83279, 43186, 0, 0, 83274, + 83276, 83277, 83278, 10191, 83271, 69633, 72353, 0, 0, 0, 0, 120090, + 120089, 7931, 8558, 917946, 0, 0, 0, 119145, 120081, 120084, 120083, + 120086, 71449, 120088, 7366, 7019, 75021, 0, 917951, 120078, 120077, + 120080, 8657, 100967, 8594, 100969, 100968, 0, 100970, 120072, 120071, 0, + 0, 43154, 0, 0, 11332, 0, 7728, 100978, 100977, 100980, 100979, 7851, 0, + 8375, 128662, 0, 0, 126095, 9085, 0, 0, 9327, 6160, 0, 0, 0, 0, 70698, + 74012, 0, 0, 4439, 121151, 100972, 100971, 100974, 100973, 100976, + 100975, 100956, 42524, 71220, 100957, 10826, 100959, 11296, 0, 0, 0, + 7504, 43161, 127868, 0, 64670, 0, 78056, 0, 11295, 0, 78053, 0, 0, 0, + 10902, 0, 0, 0, 78068, 10472, 100954, 100953, 120215, 78062, 2371, 78069, + 118893, 259, 0, 0, 2402, 12157, 6440, 0, 100963, 100962, 100965, 100964, + 65380, 9103, 2278, 0, 0, 7301, 0, 10219, 0, 0, 0, 67718, 43178, 0, 0, + 119362, 917974, 8613, 0, 126121, 917978, 917979, 121449, 12005, 7353, 0, + 1890, 129130, 0, 0, 0, 42815, 7991, 0, 10578, 0, 0, 0, 0, 0, 0, 0, 0, + 120601, 42668, 9348, 0, 6164, 0, 0, 0, 7676, 0, 0, 0, 0, 0, 129422, + 83443, 71096, 0, 9175, 0, 78047, 9088, 73689, 0, 1396, 0, 0, 11461, + 71088, 127835, 92252, 0, 71090, 121185, 69872, 0, 0, 0, 0, 74043, 119632, + 0, 0, 0, 5928, 4525, 10658, 0, 1266, 10180, 64472, 0, 12622, 0, 0, 0, 0, + 127139, 13310, 773, 19933, 0, 0, 0, 0, 92205, 0, 0, 0, 0, 5862, 7823, 0, + 0, 0, 3250, 43991, 69687, 66649, 0, 0, 0, 0, 0, 64673, 917963, 917964, 0, + 0, 917967, 917968, 917965, 917966, 127791, 75041, 3471, 917970, 64573, + 882, 0, 119584, 0, 120772, 0, 0, 0, 92696, 0, 0, 72988, 0, 3225, 0, + 73729, 0, 0, 43173, 11752, 4381, 0, 0, 917945, 11756, 11757, 917944, + 917949, 42654, 127848, 917948, 0, 0, 5160, 1387, 0, 917953, 0, 128933, + 917956, 917957, 917954, 917955, 917960, 121082, 917958, 10789, 68314, 0, + 126521, 11143, 0, 0, 70669, 128904, 42179, 0, 5931, 11744, 11215, 70676, + 119245, 0, 0, 0, 77915, 10217, 64635, 128661, 83292, 0, 0, 0, 0, 0, + 41296, 11747, 41291, 0, 0, 0, 41294, 41282, 5923, 120610, 0, 0, 0, 0, + 66800, 5786, 68252, 42539, 119869, 119860, 0, 41474, 0, 0, 0, 5934, + 74572, 66583, 119231, 0, 94072, 64481, 0, 0, 0, 0, 67240, 0, 0, 123201, + 0, 5819, 0, 0, 0, 0, 0, 129387, 0, 0, 0, 67993, 1237, 0, 0, 0, 983557, 0, + 0, 0, 0, 0, 0, 0, 69789, 11266, 69845, 0, 10506, 194747, 0, 0, 0, 0, + 43185, 0, 100533, 100532, 100535, 10769, 100537, 100536, 100539, 9753, + 121035, 100540, 0, 0, 121433, 0, 100542, 6072, 100544, 100543, 100546, + 100545, 100548, 100547, 100550, 100549, 0, 113744, 0, 0, 7222, 10283, + 10315, 10379, 4996, 0, 129294, 66517, 0, 10087, 127833, 74938, 0, 0, + 83492, 7565, 42890, 0, 77931, 43180, 77928, 74891, 77929, 43982, 100526, + 622, 77926, 100527, 100530, 1602, 0, 0, 0, 129559, 12160, 0, 10212, + 77936, 194605, 12071, 43143, 77935, 917983, 917984, 917989, 77932, + 917987, 917988, 10255, 10263, 10279, 4194, 10375, 93035, 0, 0, 12644, + 127516, 917994, 75007, 110791, 67408, 110789, 11501, 41177, 0, 0, 71912, + 0, 0, 8715, 0, 41179, 0, 0, 0, 41176, 0, 41181, 0, 8452, 121006, 13161, + 0, 70503, 5921, 0, 2597, 0, 5922, 72128, 0, 74242, 0, 0, 0, 0, 0, 0, 0, + 0, 127906, 0, 64944, 0, 0, 0, 0, 5924, 5920, 129508, 6921, 78081, 74007, + 78078, 8418, 11681, 43169, 10176, 0, 0, 0, 78087, 10772, 65276, 5937, + 1914, 78084, 11682, 0, 0, 0, 11685, 0, 100513, 7772, 11680, 100514, 100517, 100516, 100519, 7417, 718, 100520, 70083, 100500, 120718, 3235, 0, 43164, 0, 8018, 0, 0, 128708, 6937, 67672, 128508, 0, 10067, 120849, 0, 0, 0, 0, 0, 100491, 0, 100493, 100492, 13116, 100494, 100497, 9945, @@ -25970,7 +26624,7 @@ static unsigned int code_hash[] = { 4544, 71228, 0, 0, 0, 78097, 11110, 66810, 12882, 64511, 78094, 78100, 78102, 71226, 10141, 0, 78280, 65298, 4476, 78109, 94005, 71216, 8907, 78105, 78106, 78103, 78104, 120898, 0, 10665, 64616, 128944, 0, 127545, - 0, 83159, 83160, 4554, 0, 83155, 83156, 83157, 83158, 0, 125123, 0, + 69605, 83159, 83160, 4554, 0, 83155, 83156, 83157, 83158, 0, 125123, 0, 72258, 0, 0, 0, 0, 43179, 0, 0, 0, 717, 10754, 83168, 83169, 83162, 83163, 83164, 83165, 78282, 0, 0, 83161, 68848, 10611, 72859, 126978, 71474, 129426, 127871, 0, 0, 0, 12820, 0, 0, 7009, 70103, 0, 0, 67848, @@ -25980,7 +26634,7 @@ static unsigned int code_hash[] = { 78125, 42513, 0, 0, 0, 11651, 13093, 78135, 0, 100471, 0, 100473, 100472, 100475, 74048, 100477, 74783, 100457, 100456, 43703, 13097, 0, 100460, 13283, 0, 0, 125073, 3488, 5933, 10033, 0, 0, 65570, 0, 12297, 0, 0, 0, - 128517, 42538, 0, 0, 0, 100451, 0, 100453, 100452, 100455, 100454, + 128517, 42538, 0, 129293, 0, 100451, 0, 100453, 100452, 100455, 100454, 121221, 0, 0, 7638, 0, 129193, 0, 43109, 7637, 0, 11213, 100461, 83355, 100463, 100466, 100465, 0, 0, 7636, 0, 0, 0, 128848, 983087, 291, 0, 0, 2027, 78141, 78142, 78136, 78137, 83481, 4640, 64713, 10224, 120429, @@ -25991,387 +26645,390 @@ static unsigned int code_hash[] = { 865, 78275, 78274, 78273, 4645, 78271, 78270, 0, 983172, 7338, 0, 68840, 0, 12565, 0, 0, 0, 195089, 119655, 195091, 195090, 2913, 13120, 128956, 195094, 195097, 195096, 128019, 0, 71462, 0, 7916, 10485, 195098, 0, - 195100, 195099, 0, 67705, 195078, 195077, 195080, 129636, 0, 195081, 0, - 0, 0, 10229, 10687, 826, 128081, 195082, 195085, 195084, 195087, 195086, - 0, 1808, 7848, 0, 0, 0, 0, 0, 0, 128897, 0, 119086, 67704, 0, 0, 0, 0, 0, - 0, 9144, 0, 0, 92992, 9840, 0, 0, 0, 0, 0, 0, 74448, 83475, 0, 10962, - 66904, 113718, 983187, 0, 0, 74537, 195072, 1792, 195074, 195073, 78266, - 195075, 0, 0, 12066, 0, 385, 4152, 0, 0, 0, 67397, 0, 0, 0, 0, 43258, 0, - 0, 13157, 0, 0, 3570, 0, 0, 0, 67252, 0, 71218, 126631, 7879, 68247, - 128579, 0, 0, 70196, 0, 0, 8463, 7810, 917862, 7839, 983859, 127768, - 917860, 9691, 0, 129323, 0, 120385, 0, 917844, 0, 10066, 0, 0, 0, 0, 0, - 8016, 0, 983072, 64831, 0, 126103, 0, 119171, 1634, 68115, 0, 11056, 0, - 0, 0, 41165, 11328, 12450, 0, 41166, 0, 12456, 0, 171, 0, 12452, 917544, - 12458, 12531, 0, 917853, 0, 74162, 0, 0, 9969, 0, 12454, 74160, 42132, - 110755, 78878, 110753, 3230, 110751, 0, 0, 8932, 4399, 5810, 64534, 8415, - 0, 110756, 110757, 74159, 0, 0, 960, 74156, 6981, 92374, 12938, 9201, 0, - 983658, 74904, 0, 72866, 92270, 0, 0, 0, 0, 5851, 73833, 5824, 0, 5844, - 110848, 110849, 110846, 110847, 4663, 0, 0, 0, 0, 0, 74085, 0, 0, 0, 0, - 0, 92339, 0, 0, 5782, 0, 0, 0, 43796, 129639, 0, 0, 125223, 128004, 0, - 43861, 0, 0, 0, 92976, 0, 0, 0, 4659, 0, 0, 0, 0, 129386, 0, 11129, 0, - 329, 0, 92707, 121416, 0, 0, 0, 69943, 67692, 42167, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 43671, 0, 64701, 0, 0, 0, 93055, 1172, 125089, 6786, - 43601, 0, 74126, 0, 0, 0, 0, 0, 0, 0, 0, 118804, 0, 66741, 5347, 0, - 983644, 0, 0, 10588, 0, 0, 0, 0, 5343, 0, 0, 0, 5341, 0, 0, 74916, 5351, - 0, 0, 917884, 0, 92692, 0, 121148, 128916, 0, 0, 66785, 0, 6638, 0, 0, - 271, 0, 917904, 0, 0, 12653, 67588, 0, 0, 0, 0, 128838, 11912, 128301, - 983646, 0, 11800, 0, 0, 11103, 0, 7340, 0, 110695, 0, 0, 0, 0, 2423, 0, - 0, 0, 128136, 42705, 0, 0, 0, 11854, 0, 0, 0, 0, 4916, 0, 380, 10958, - 66563, 127790, 78284, 67587, 0, 12918, 0, 917897, 0, 917898, 917893, - 10684, 0, 125063, 92906, 0, 0, 8182, 0, 0, 0, 0, 0, 0, 92904, 0, 6630, - 100405, 0, 0, 0, 0, 0, 65876, 5535, 0, 0, 0, 92609, 0, 0, 6477, 43795, - 92217, 0, 0, 0, 43848, 0, 0, 74256, 2665, 11304, 43751, 0, 4970, 74353, - 0, 8934, 0, 93996, 4492, 92908, 65011, 0, 0, 92909, 1188, 7254, 1100, 0, - 0, 0, 2912, 11749, 92643, 0, 0, 65057, 0, 12343, 0, 78879, 0, 78880, 0, - 0, 0, 70355, 0, 0, 11803, 0, 0, 41450, 0, 100897, 0, 41451, 0, 0, 8273, - 0, 3451, 0, 972, 41453, 68164, 78876, 0, 92408, 73945, 43504, 2288, - 78873, 9538, 78874, 128685, 0, 129095, 0, 0, 0, 0, 11019, 0, 0, 121205, - 0, 73007, 71365, 92716, 5927, 0, 0, 0, 0, 128484, 0, 6073, 0, 0, 0, 6075, - 93995, 282, 126510, 0, 74078, 121459, 65861, 0, 0, 66791, 0, 3474, 0, 0, - 0, 6081, 0, 127843, 74076, 0, 0, 0, 128908, 0, 0, 0, 12623, 120273, 9120, - 120275, 4665, 12628, 4670, 120271, 120272, 0, 0, 121480, 958, 0, 0, 0, - 4666, 0, 4915, 0, 4669, 0, 0, 0, 4664, 0, 120550, 0, 0, 0, 0, 0, 0, - 917875, 8664, 11664, 0, 129327, 11224, 0, 0, 1063, 120250, 120251, 9772, - 7255, 8886, 0, 127932, 120257, 120258, 120259, 120260, 42661, 71345, - 120255, 119125, 120265, 120266, 120267, 42721, 92407, 120262, 120263, - 66788, 1017, 0, 0, 505, 1447, 0, 0, 70340, 66793, 65115, 42789, 128443, - 0, 0, 0, 0, 119195, 0, 0, 11745, 7919, 0, 1641, 0, 0, 8966, 0, 0, 8743, - 71870, 0, 67813, 0, 0, 0, 0, 0, 0, 128505, 10169, 71324, 0, 10068, 0, - 120457, 120456, 120455, 120454, 257, 43170, 13153, 0, 0, 0, 0, 0, 0, - 6496, 19917, 5930, 128354, 11033, 0, 0, 5622, 120436, 8477, 8474, 120433, - 120432, 0, 0, 0, 41435, 4352, 0, 2435, 0, 5621, 0, 4201, 8450, 4203, - 4202, 4205, 4204, 120447, 120446, 120445, 66792, 41440, 120442, 8473, - 6373, 8469, 120438, 0, 4564, 125206, 0, 0, 0, 8374, 0, 0, 0, 66796, 0, 0, - 0, 0, 0, 92885, 0, 5626, 43507, 11771, 0, 0, 0, 42614, 0, 5625, 0, 0, 0, - 5623, 0, 0, 42623, 64277, 69942, 0, 0, 120752, 0, 5817, 5629, 0, 7551, - 10325, 5632, 69674, 0, 0, 124946, 125194, 5628, 0, 5631, 0, 0, 2400, - 5627, 0, 0, 118786, 74792, 0, 0, 0, 203, 129084, 74365, 0, 0, 0, 0, - 83382, 83422, 0, 0, 554, 0, 0, 0, 12182, 0, 64569, 110840, 73891, 0, 0, - 0, 7689, 69798, 9323, 10269, 10285, 10317, 175, 0, 0, 0, 0, 0, 1243, - 42154, 0, 92387, 0, 0, 43651, 0, 125021, 0, 9075, 128774, 0, 64777, - 128570, 0, 0, 0, 0, 65255, 0, 121142, 4490, 0, 6649, 120698, 12181, 0, - 11977, 7249, 8366, 0, 7756, 12342, 0, 51, 41516, 69432, 0, 9568, 71318, - 456, 0, 10437, 1168, 9251, 9082, 0, 0, 42781, 3866, 0, 41512, 0, 0, - 68121, 41494, 0, 4660, 0, 10405, 0, 0, 0, 0, 0, 73918, 119627, 110686, - 41454, 12605, 0, 126611, 41455, 917996, 983605, 0, 8214, 0, 100413, 0, - 41457, 0, 0, 1969, 127771, 0, 0, 7413, 0, 69426, 10341, 43864, 78079, - 5854, 0, 0, 0, 0, 72819, 0, 0, 0, 0, 0, 8429, 0, 72328, 0, 6429, 0, 0, 0, - 0, 110688, 83417, 0, 917864, 120813, 83423, 1662, 917863, 0, 0, 917871, - 917868, 0, 0, 66, 65, 68, 67, 70, 69, 72, 71, 74, 73, 76, 75, 78, 77, 80, - 79, 82, 81, 84, 83, 86, 85, 88, 87, 90, 89, 0, 0, 7385, 70508, 1704, - 12993, 0, 0, 0, 0, 0, 0, 0, 0, 11353, 72207, 0, 0, 0, 0, 118831, 0, 0, 0, - 0, 0, 0, 83364, 0, 0, 1289, 0, 0, 119583, 0, 65507, 0, 0, 0, 128042, 0, - 74409, 0, 0, 0, 0, 64793, 0, 0, 0, 5675, 119239, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 6972, 70735, 0, 121108, 0, 0, 0, 0, 0, 0, 110640, 67687, 0, 0, - 119634, 0, 43977, 111252, 129105, 0, 7412, 64671, 0, 1412, 4594, 1391, 0, - 8067, 12478, 110639, 78375, 110637, 10281, 110635, 0, 0, 7960, 43271, 0, - 12518, 69846, 0, 3566, 0, 0, 69864, 0, 0, 68021, 0, 0, 0, 8223, 0, 4261, - 121460, 68918, 0, 0, 121294, 113712, 0, 128046, 43419, 72748, 0, 10574, - 0, 67691, 0, 0, 73785, 0, 78875, 128541, 0, 127366, 0, 0, 0, 0, 6695, - 65113, 324, 0, 128373, 40985, 0, 0, 0, 0, 0, 72307, 43474, 0, 121190, 0, - 0, 3420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110871, 9574, 120684, 110870, 0, - 5204, 74774, 0, 11835, 0, 0, 983185, 0, 0, 0, 0, 0, 0, 11750, 68898, - 127004, 0, 0, 0, 0, 8130, 0, 0, 0, 121268, 0, 0, 0, 68455, 42863, 73839, - 0, 0, 0, 0, 0, 0, 0, 612, 110875, 110876, 72231, 10538, 0, 1674, 0, 0, 0, - 12280, 0, 540, 74550, 0, 66422, 8432, 0, 11073, 0, 64316, 0, 0, 7388, 0, - 0, 0, 0, 126107, 0, 3359, 0, 0, 67284, 0, 0, 65482, 0, 0, 64742, 129304, - 0, 0, 74273, 0, 19941, 0, 0, 0, 0, 9481, 65555, 0, 66628, 129126, 1195, - 64898, 0, 0, 0, 2010, 0, 0, 0, 0, 0, 0, 4360, 127009, 9739, 0, 72885, 0, - 0, 0, 0, 72200, 0, 0, 0, 72199, 0, 0, 65734, 0, 0, 0, 13075, 0, 94063, 0, - 43532, 10837, 2492, 74516, 983075, 120882, 0, 0, 11813, 9649, 0, 119617, - 5128, 7377, 0, 65604, 0, 0, 6771, 1648, 7819, 0, 0, 0, 125192, 128131, - 12709, 6986, 0, 0, 0, 0, 0, 12581, 0, 5175, 0, 73806, 0, 128420, 0, 0, - 77950, 0, 0, 607, 0, 0, 128846, 119605, 0, 129528, 65477, 0, 121130, 0, - 8265, 0, 0, 0, 5840, 42838, 0, 0, 68366, 0, 119255, 0, 0, 0, 127929, 0, - 2550, 121011, 6779, 70059, 0, 0, 0, 0, 0, 0, 5619, 65822, 0, 0, 0, - 129392, 5616, 11486, 0, 0, 0, 0, 5615, 0, 121319, 42380, 127958, 0, - 66451, 74407, 0, 11347, 0, 1026, 5620, 0, 0, 11350, 5617, 0, 0, 64639, 0, - 0, 0, 1338, 0, 0, 0, 4603, 0, 70715, 92484, 0, 9002, 0, 3974, 78213, 0, - 0, 0, 0, 0, 0, 75038, 66040, 70455, 0, 0, 0, 72982, 0, 0, 0, 0, 0, 0, 0, - 0, 119105, 0, 0, 0, 0, 0, 128883, 0, 66897, 0, 0, 0, 42594, 0, 0, 0, 0, - 6714, 10083, 0, 121019, 0, 69976, 0, 0, 9073, 0, 64302, 0, 128286, 9725, - 0, 0, 121288, 73769, 121306, 0, 9570, 0, 11500, 2689, 917626, 0, 0, - 66740, 0, 0, 0, 917623, 13286, 5500, 42598, 42596, 503, 0, 0, 917618, 0, - 0, 0, 0, 917615, 1652, 772, 6688, 8310, 0, 0, 0, 0, 10194, 43542, 0, - 125054, 0, 6468, 68110, 0, 917606, 11767, 0, 0, 5836, 12358, 0, 0, 65624, - 12180, 0, 127994, 0, 43699, 0, 0, 0, 43706, 0, 12362, 12435, 12360, 0, - 9020, 0, 12356, 8616, 0, 42924, 2227, 0, 0, 7315, 12354, 83097, 83098, - 83099, 2358, 83092, 83093, 83094, 0, 0, 83089, 83090, 0, 11759, 71723, 0, - 72834, 83109, 41423, 0, 83103, 83104, 83105, 42237, 110653, 70717, 72260, - 83102, 0, 67856, 0, 128534, 110657, 129354, 129194, 0, 64395, 0, 73008, - 120897, 74816, 0, 0, 0, 83088, 0, 0, 94064, 83083, 83085, 83086, 83087, - 83079, 83080, 2041, 9178, 0, 64870, 0, 83076, 74924, 0, 0, 0, 0, 0, - 78739, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121432, 129457, 0, 0, 0, 0, 0, - 74901, 0, 0, 0, 0, 0, 124944, 113781, 0, 7410, 2669, 903, 0, 0, 0, - 127232, 74603, 0, 128264, 0, 128411, 0, 0, 11732, 0, 72797, 41448, 41461, - 124934, 0, 917558, 0, 8819, 0, 0, 74606, 0, 121412, 74835, 0, 9168, - 65786, 0, 0, 0, 67665, 0, 11758, 68425, 0, 0, 0, 128044, 0, 19924, 67312, - 0, 128755, 64551, 0, 8516, 0, 0, 7561, 983980, 74018, 0, 0, 0, 0, 83074, - 83075, 0, 11233, 83062, 83066, 3787, 83070, 83055, 41458, 83059, 41463, - 65308, 41459, 8683, 775, 0, 65584, 69923, 0, 110798, 110799, 110796, - 43440, 0, 0, 0, 3656, 0, 0, 0, 67694, 1599, 83138, 83139, 8514, 8513, - 83036, 83135, 83136, 110794, 110795, 83131, 83132, 0, 0, 0, 11684, 10542, - 9937, 83150, 0, 75037, 83145, 65730, 83147, 0, 8427, 83142, 55246, 0, 0, - 11497, 0, 0, 0, 119222, 0, 983598, 0, 10621, 0, 0, 0, 119111, 120745, 0, - 0, 0, 11648, 83126, 83127, 42118, 83129, 83122, 65512, 83124, 83125, 0, - 0, 0, 83121, 74530, 128456, 0, 0, 0, 65724, 0, 0, 0, 65727, 0, 0, 64963, - 73830, 66042, 0, 0, 7875, 0, 0, 0, 0, 0, 0, 536, 0, 0, 0, 0, 65173, - 129122, 0, 70331, 0, 0, 0, 0, 129419, 0, 0, 0, 1687, 0, 0, 0, 0, 0, 0, - 10526, 0, 8323, 0, 83301, 11731, 0, 0, 65460, 12242, 0, 0, 10843, 11554, - 0, 0, 8266, 0, 121101, 0, 0, 0, 0, 67667, 0, 119155, 0, 0, 119636, 67857, - 0, 0, 0, 11755, 66305, 0, 0, 10917, 93979, 113688, 0, 2040, 92596, 0, 0, - 0, 0, 1227, 83119, 83120, 0, 0, 83115, 83116, 11149, 4978, 83111, 1984, - 11830, 83114, 128934, 74548, 0, 9373, 0, 0, 0, 0, 0, 0, 0, 0, 9237, 9390, - 0, 0, 0, 0, 0, 1830, 0, 0, 0, 0, 0, 128577, 983820, 68086, 0, 0, 0, - 983059, 0, 983144, 0, 0, 0, 72197, 55291, 11683, 0, 0, 0, 11451, 0, - 72714, 983810, 2359, 0, 67844, 0, 121503, 548, 121502, 983245, 121405, - 983248, 0, 66272, 0, 64678, 0, 9547, 0, 0, 1614, 0, 0, 66307, 128092, - 1358, 120871, 428, 0, 1466, 0, 10982, 0, 0, 0, 407, 0, 0, 0, 0, 0, 0, - 5804, 73464, 0, 0, 0, 70167, 9057, 42446, 0, 125097, 0, 0, 8250, 10952, - 8048, 0, 129155, 0, 118955, 0, 0, 126586, 4407, 74648, 0, 0, 0, 8448, - 92491, 0, 0, 12675, 12659, 0, 0, 983280, 68077, 55273, 10766, 12012, - 2386, 0, 9170, 0, 9123, 128194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8709, 0, - 983585, 0, 0, 0, 0, 0, 0, 0, 128342, 0, 577, 128610, 0, 0, 0, 68087, - 74840, 0, 127036, 0, 0, 0, 1414, 124963, 9683, 43486, 92231, 0, 2536, 0, - 66330, 0, 0, 0, 0, 0, 0, 0, 66317, 0, 66315, 66316, 0, 0, 0, 0, 0, 0, 0, - 0, 66323, 66324, 0, 0, 3106, 65917, 0, 0, 0, 891, 0, 0, 42624, 0, 0, - 8824, 65089, 0, 10936, 0, 0, 0, 0, 92688, 0, 0, 0, 0, 12745, 0, 0, 41285, - 3547, 0, 0, 0, 0, 0, 6089, 0, 68490, 120578, 4170, 1029, 127761, 0, 0, - 42374, 0, 744, 0, 0, 0, 0, 93046, 0, 3551, 0, 0, 4623, 0, 0, 12340, 0, - 65136, 0, 0, 0, 0, 0, 0, 0, 72291, 0, 0, 120778, 0, 11972, 0, 78757, 0, - 122886, 177, 122894, 0, 0, 0, 0, 55243, 0, 0, 0, 70172, 120249, 120242, - 128027, 120243, 0, 0, 0, 120237, 120245, 0, 0, 0, 9136, 120240, 120614, - 41280, 0, 0, 0, 0, 74149, 128327, 0, 0, 66361, 12601, 72194, 64360, - 65163, 0, 0, 0, 0, 0, 0, 5404, 43332, 3667, 7936, 12925, 0, 0, 0, 0, 0, - 10874, 65505, 0, 0, 0, 0, 128920, 983662, 0, 0, 0, 0, 0, 0, 0, 0, 66677, - 0, 0, 0, 70088, 74148, 0, 0, 72868, 120230, 120224, 74172, 0, 0, 94096, - 0, 128414, 120636, 0, 127519, 917609, 917616, 0, 128652, 0, 0, 11441, 0, - 3512, 0, 0, 43597, 0, 0, 72734, 68153, 41563, 0, 0, 129352, 41544, 0, 0, - 0, 0, 129177, 0, 0, 0, 118908, 0, 78108, 67396, 73804, 64711, 0, 0, - 917610, 0, 0, 0, 11557, 127776, 0, 12079, 0, 0, 0, 0, 128861, 0, 0, 0, 0, - 0, 983200, 8103, 72303, 128174, 92486, 110698, 0, 64587, 0, 0, 124961, 0, - 0, 0, 126481, 0, 0, 0, 0, 0, 70348, 1450, 0, 1340, 0, 0, 128970, 0, 0, - 125117, 0, 0, 0, 0, 6539, 92948, 0, 128213, 125060, 0, 0, 0, 3973, 0, - 70504, 121193, 7982, 0, 0, 127194, 0, 0, 0, 128408, 118968, 6417, 120619, - 0, 0, 0, 0, 0, 4919, 65121, 110872, 7755, 0, 0, 64548, 0, 1621, 0, 0, 0, - 0, 0, 12188, 0, 0, 0, 0, 5015, 0, 0, 42590, 70354, 1756, 0, 0, 0, 120694, - 0, 0, 7555, 73874, 5408, 2817, 1214, 69919, 0, 983125, 0, 0, 125055, - 127195, 7957, 0, 0, 1056, 74944, 0, 0, 0, 0, 7073, 74979, 0, 70853, 0, - 110874, 0, 0, 2341, 126644, 8484, 0, 0, 68322, 0, 8461, 67721, 42269, 0, - 0, 43709, 43708, 9451, 7571, 13073, 43847, 126647, 0, 983258, 0, 0, 0, - 8781, 12894, 78134, 0, 92288, 0, 0, 78184, 0, 11338, 120768, 0, 0, 0, 0, - 0, 121367, 65021, 64795, 74574, 0, 10047, 0, 0, 0, 0, 0, 0, 119181, 163, - 576, 9895, 0, 0, 74591, 0, 0, 66888, 0, 0, 0, 0, 0, 0, 7017, 128111, 0, - 0, 0, 0, 41591, 11036, 65252, 120795, 129488, 0, 0, 0, 0, 0, 0, 8887, 0, - 7295, 71203, 0, 127221, 0, 0, 0, 0, 8755, 0, 0, 8147, 73127, 0, 0, 0, 0, - 129377, 0, 74499, 0, 0, 0, 4619, 0, 6654, 0, 0, 0, 0, 65689, 10128, 0, 0, + 195100, 195099, 0, 67705, 195078, 195077, 195080, 129636, 129549, 195081, + 0, 0, 0, 10229, 10687, 826, 128081, 195082, 195085, 195084, 195087, + 195086, 0, 1808, 7848, 0, 0, 0, 0, 0, 0, 128897, 0, 42942, 67704, 0, 0, + 0, 0, 42940, 0, 9144, 0, 0, 92992, 9840, 0, 0, 0, 0, 0, 0, 74448, 83475, + 0, 10962, 66904, 113718, 983187, 0, 0, 74537, 195072, 1792, 195074, + 195073, 78266, 195075, 0, 0, 12066, 0, 385, 4152, 0, 0, 0, 67397, 0, 0, + 0, 0, 43258, 0, 0, 13157, 0, 0, 3570, 0, 0, 0, 67252, 0, 71218, 126631, + 7879, 68247, 128579, 0, 0, 70196, 0, 0, 8463, 7810, 917862, 7839, 983859, + 127768, 917860, 9691, 0, 129323, 0, 120385, 0, 917844, 0, 10066, 0, 0, 0, + 0, 0, 8016, 0, 983072, 64831, 0, 126103, 0, 119171, 1634, 68115, 0, + 11056, 0, 0, 0, 41165, 11328, 12450, 0, 41166, 0, 12456, 0, 171, 0, + 12452, 917544, 12458, 12531, 0, 917853, 0, 74162, 0, 0, 9969, 0, 12454, + 74160, 42132, 110755, 78878, 110753, 3230, 73711, 0, 0, 8932, 4399, 5810, + 64534, 8415, 0, 110756, 110757, 74159, 0, 0, 960, 74156, 6981, 92374, + 12938, 9201, 0, 983658, 74904, 0, 72866, 92270, 0, 0, 0, 0, 5851, 73833, + 5824, 0, 5844, 110848, 110849, 110846, 110847, 4663, 0, 0, 0, 0, 0, + 74085, 0, 0, 0, 0, 0, 92339, 0, 0, 5782, 0, 0, 0, 43796, 129639, 0, 0, + 125223, 128004, 0, 43861, 0, 0, 0, 92976, 0, 0, 0, 4659, 0, 0, 0, 0, + 129386, 0, 11129, 0, 329, 0, 92707, 121416, 0, 0, 0, 69943, 67692, 42167, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69618, 43671, 0, 64701, 0, 0, 0, 93055, + 1172, 125089, 6786, 43601, 0, 74126, 0, 0, 0, 0, 0, 0, 0, 0, 118804, 0, + 66741, 5347, 0, 983644, 0, 0, 10588, 0, 0, 0, 0, 5343, 0, 0, 0, 5341, 0, + 0, 74916, 5351, 0, 0, 917884, 0, 92692, 0, 121148, 128916, 0, 0, 66785, + 126256, 6638, 0, 0, 271, 0, 917904, 0, 0, 12653, 67588, 0, 0, 0, 0, + 128838, 11912, 128301, 983646, 0, 11800, 0, 0, 11103, 0, 7340, 0, 110695, + 0, 0, 0, 0, 2423, 0, 0, 0, 128136, 42705, 0, 0, 0, 11854, 0, 0, 0, 0, + 4916, 0, 380, 10958, 66563, 127790, 78284, 67587, 0, 12918, 0, 917897, 0, + 917898, 917893, 10684, 0, 125063, 92906, 0, 0, 8182, 0, 0, 0, 0, 0, 0, + 92904, 0, 6630, 100405, 0, 123191, 0, 0, 0, 65876, 5535, 0, 0, 0, 92609, + 0, 0, 6477, 43795, 92217, 129571, 72163, 0, 43848, 0, 0, 74256, 2665, + 11304, 43751, 0, 4970, 74353, 0, 8934, 0, 93996, 4492, 92908, 65011, 0, + 0, 92909, 1188, 7254, 1100, 0, 0, 0, 2912, 11749, 92643, 0, 0, 65057, 0, + 12343, 0, 78879, 0, 78880, 0, 0, 0, 70355, 0, 0, 11803, 0, 0, 41450, 0, + 100897, 0, 41451, 0, 0, 8273, 0, 3451, 0, 972, 41453, 68164, 78876, 0, + 92408, 73945, 43504, 2288, 78873, 9538, 78874, 128685, 0, 129095, 0, 0, + 0, 0, 11019, 0, 0, 121205, 0, 73007, 71365, 92716, 5927, 0, 0, 0, 0, + 128484, 0, 6073, 0, 0, 0, 6075, 93995, 282, 126510, 0, 74078, 121459, + 65861, 0, 0, 66791, 0, 3474, 0, 0, 0, 6081, 0, 127843, 74076, 0, 0, 0, + 128908, 0, 0, 0, 12623, 120273, 9120, 120275, 4665, 12628, 4670, 120271, + 120272, 0, 0, 121480, 958, 0, 0, 0, 4666, 0, 4915, 0, 4669, 0, 0, 0, + 4664, 0, 120550, 0, 0, 0, 0, 94023, 0, 917875, 8664, 11664, 0, 129327, + 11224, 0, 0, 1063, 120250, 120251, 9772, 7255, 8886, 0, 127932, 120257, + 120258, 120259, 120260, 42661, 71345, 120255, 119125, 120265, 120266, + 120267, 42721, 92407, 120262, 120263, 66788, 1017, 0, 0, 505, 1447, 0, 0, + 70340, 66793, 65115, 42789, 128443, 0, 0, 123634, 0, 119195, 0, 0, 11745, + 7919, 0, 1641, 0, 0, 8966, 0, 0, 8743, 71870, 0, 67813, 0, 0, 0, 123206, + 0, 0, 128505, 10169, 71324, 0, 10068, 0, 120457, 120456, 120455, 120454, + 257, 43170, 13153, 0, 0, 0, 0, 0, 0, 6496, 19917, 5930, 128354, 11033, 0, + 0, 5622, 120436, 8477, 8474, 120433, 120432, 0, 0, 0, 41435, 4352, 0, + 2435, 0, 5621, 0, 4201, 8450, 4203, 4202, 4205, 4204, 120447, 120446, + 120445, 66792, 41440, 120442, 8473, 6373, 8469, 120438, 0, 4564, 125206, + 0, 0, 0, 8374, 73669, 0, 0, 66796, 0, 0, 0, 0, 0, 92885, 0, 5626, 43507, + 11771, 0, 0, 0, 42614, 0, 5625, 0, 0, 0, 5623, 0, 0, 42623, 64277, 69942, + 0, 0, 120752, 0, 5817, 5629, 0, 7551, 10325, 5632, 69674, 0, 0, 124946, + 125194, 5628, 0, 5631, 0, 0, 2400, 5627, 0, 0, 118786, 74792, 0, 0, 0, + 203, 129084, 74365, 0, 0, 0, 0, 83382, 83422, 0, 0, 554, 0, 0, 0, 12182, + 0, 64569, 110840, 73891, 0, 0, 0, 7689, 69798, 9323, 10269, 10285, 10317, + 175, 0, 0, 0, 0, 0, 1243, 42154, 0, 92387, 0, 0, 43651, 0, 125021, 0, + 9075, 128774, 0, 64777, 128570, 0, 0, 0, 0, 65255, 0, 121142, 4490, 0, + 6649, 120698, 12181, 0, 11977, 7249, 8366, 0, 7756, 12342, 0, 51, 41516, + 69432, 0, 9568, 71318, 456, 0, 10437, 1168, 9251, 9082, 0, 0, 42781, + 3866, 0, 41512, 0, 0, 68121, 41494, 0, 4660, 0, 10405, 0, 0, 0, 0, 0, + 73918, 119627, 110686, 41454, 12605, 0, 126611, 41455, 917996, 983605, 0, + 8214, 0, 100413, 0, 41457, 0, 0, 1969, 127771, 0, 0, 7413, 0, 69426, + 10341, 43864, 78079, 5854, 0, 0, 0, 0, 72819, 0, 0, 0, 0, 0, 8429, 0, + 72328, 0, 6429, 0, 0, 0, 0, 110688, 83417, 0, 917864, 120813, 83423, + 1662, 129588, 0, 0, 917871, 917868, 0, 0, 66, 65, 68, 67, 70, 69, 72, 71, + 74, 73, 76, 75, 78, 77, 80, 79, 82, 81, 84, 83, 86, 85, 88, 87, 90, 89, + 0, 0, 7385, 70508, 1704, 12993, 0, 0, 0, 0, 0, 0, 0, 0, 11353, 72207, 0, + 0, 0, 0, 118831, 0, 0, 0, 0, 0, 0, 83364, 0, 0, 1289, 0, 0, 119583, 0, + 65507, 0, 0, 0, 128042, 0, 74409, 0, 0, 0, 0, 64793, 0, 0, 100843, 5675, + 119239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6972, 70735, 0, 121108, 126217, 0, + 0, 0, 0, 0, 110640, 67687, 0, 0, 119634, 0, 43977, 111252, 129105, 0, + 7412, 64671, 0, 1412, 4594, 1391, 0, 8067, 12478, 110639, 78375, 110637, + 10281, 110635, 0, 0, 7960, 43271, 0, 12518, 69846, 0, 3566, 0, 0, 69864, + 0, 0, 68021, 0, 0, 0, 8223, 0, 4261, 121460, 68918, 0, 0, 121294, 113712, + 0, 128046, 43419, 72748, 0, 10574, 0, 67691, 0, 0, 73785, 0, 78875, + 128541, 0, 127366, 0, 0, 0, 0, 6695, 65113, 324, 0, 128373, 40985, 0, 0, + 0, 0, 0, 72307, 43474, 0, 121190, 0, 0, 3420, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 110871, 9574, 120684, 110870, 0, 5204, 74774, 0, 11835, 0, 0, 983185, 0, + 0, 0, 0, 0, 0, 11750, 68898, 127004, 0, 0, 0, 0, 8130, 0, 0, 0, 121268, + 0, 0, 0, 68455, 42863, 73839, 0, 0, 0, 0, 0, 0, 0, 612, 110875, 110876, + 72231, 10538, 0, 1674, 0, 0, 0, 12280, 0, 540, 74550, 0, 66422, 8432, 0, + 11073, 0, 64316, 0, 0, 7388, 0, 0, 0, 0, 126107, 0, 3359, 0, 0, 67284, 0, + 0, 65482, 129589, 0, 64742, 129304, 0, 0, 74273, 0, 19941, 0, 0, 0, 0, + 9481, 65555, 0, 66628, 129126, 1195, 64898, 0, 0, 0, 2010, 0, 0, 0, 0, 0, + 0, 4360, 127009, 9739, 0, 72885, 0, 0, 0, 126265, 72200, 0, 0, 0, 72199, + 0, 0, 65734, 0, 0, 0, 13075, 0, 94063, 0, 43532, 10837, 2492, 74516, + 983075, 120882, 0, 0, 11813, 9649, 0, 119617, 5128, 7377, 0, 65604, 0, 0, + 6771, 1648, 7819, 0, 0, 0, 125192, 128131, 12709, 6986, 0, 0, 0, 0, 0, + 12581, 0, 5175, 0, 73806, 0, 128420, 0, 0, 77950, 0, 0, 607, 0, 0, + 128846, 119605, 0, 129528, 65477, 0, 121130, 0, 8265, 0, 0, 0, 5840, + 42838, 0, 0, 68366, 0, 119255, 0, 0, 0, 127929, 0, 2550, 121011, 6779, + 70059, 0, 0, 0, 0, 0, 0, 5619, 65822, 0, 0, 0, 129392, 5616, 11486, 0, 0, + 0, 0, 5615, 0, 121319, 42380, 127958, 0, 66451, 74407, 0, 11347, 0, 1026, + 5620, 0, 0, 11350, 5617, 0, 0, 64639, 0, 0, 0, 1338, 0, 0, 0, 4603, 0, + 70715, 92484, 0, 9002, 0, 3974, 78213, 0, 0, 0, 0, 0, 0, 75038, 66040, + 70455, 0, 0, 0, 72982, 0, 0, 0, 0, 0, 0, 0, 0, 119105, 0, 0, 0, 0, 0, + 128883, 0, 66897, 0, 0, 0, 42594, 0, 0, 0, 0, 6714, 10083, 0, 121019, 0, + 69976, 0, 0, 9073, 0, 64302, 0, 128286, 9725, 0, 0, 121288, 73769, + 121306, 0, 9570, 0, 11500, 2689, 917626, 0, 983794, 66740, 0, 0, 0, + 917623, 13286, 5500, 42598, 42596, 503, 0, 0, 917618, 0, 0, 0, 0, 917615, + 1652, 772, 6688, 8310, 0, 0, 72124, 0, 10194, 43542, 0, 125054, 0, 6468, + 68110, 0, 917606, 11767, 0, 0, 5836, 12358, 0, 0, 65624, 12180, 0, + 127994, 0, 43699, 0, 0, 72114, 43706, 0, 12362, 12435, 12360, 0, 9020, 0, + 12356, 8616, 0, 42924, 2227, 0, 0, 7315, 12354, 83097, 83098, 83099, + 2358, 83092, 83093, 83094, 0, 0, 83089, 83090, 0, 11759, 71723, 0, 72834, + 83109, 41423, 0, 83103, 83104, 83105, 42237, 110653, 70717, 72260, 83102, + 0, 67856, 0, 128534, 110657, 129354, 129194, 0, 64395, 0, 73008, 120897, + 74816, 0, 0, 0, 83088, 0, 0, 94064, 83083, 83085, 83086, 83087, 83079, + 83080, 2041, 9178, 0, 64870, 0, 83076, 74924, 0, 0, 0, 0, 0, 78739, 0, 0, + 0, 0, 0, 0, 3726, 0, 0, 0, 0, 0, 121432, 129457, 0, 0, 0, 0, 0, 74901, 0, + 0, 0, 0, 0, 124944, 113781, 0, 7410, 2669, 903, 0, 0, 0, 127232, 74603, + 0, 128264, 0, 128411, 0, 0, 11732, 0, 72797, 41448, 41461, 124934, 0, + 917558, 0, 8819, 0, 0, 74606, 0, 121412, 74835, 0, 9168, 65786, 0, 73691, + 0, 67665, 0, 11758, 68425, 0, 0, 0, 128044, 0, 19924, 67312, 0, 128755, + 64551, 0, 8516, 0, 0, 7561, 983980, 74018, 0, 0, 0, 0, 83074, 83075, 0, + 11233, 83062, 83066, 3787, 83070, 83055, 41458, 83059, 41463, 65308, + 41459, 8683, 775, 0, 65584, 69923, 0, 110798, 110799, 110796, 43440, 0, + 0, 0, 3656, 0, 0, 0, 67694, 1599, 83138, 83139, 8514, 8513, 83036, 83135, + 83136, 110794, 110795, 83131, 83132, 0, 0, 0, 11684, 10542, 9937, 83150, + 0, 75037, 83145, 65730, 83147, 0, 8427, 83142, 55246, 0, 0, 11497, 0, 0, + 0, 119222, 0, 983598, 0, 10621, 0, 0, 129295, 119111, 120745, 0, 0, 0, + 11648, 83126, 83127, 42118, 83129, 83122, 65512, 83124, 83125, 0, 0, 0, + 83121, 74530, 128456, 0, 0, 0, 65724, 0, 0, 0, 65727, 0, 0, 64963, 73830, + 66042, 0, 0, 7875, 0, 0, 0, 0, 0, 0, 536, 0, 0, 0, 0, 65173, 129122, 0, + 70331, 0, 0, 0, 0, 129419, 0, 0, 0, 1687, 0, 0, 0, 0, 0, 0, 10526, 0, + 8323, 0, 83301, 11731, 0, 0, 65460, 12242, 0, 0, 10843, 11554, 0, 0, + 8266, 0, 121101, 0, 0, 0, 0, 67667, 0, 119155, 0, 0, 119636, 67857, 0, 0, + 0, 11755, 66305, 0, 0, 10917, 93979, 113688, 0, 2040, 92596, 0, 0, 0, 0, + 1227, 83119, 83120, 0, 0, 83115, 83116, 11149, 4978, 83111, 1984, 11830, + 83114, 128934, 74548, 0, 9373, 0, 0, 0, 0, 0, 0, 0, 0, 9237, 9390, 0, 0, + 0, 0, 0, 1830, 0, 0, 0, 0, 0, 128577, 983820, 68086, 0, 0, 0, 983059, 0, + 983144, 0, 0, 0, 72197, 55291, 11683, 0, 0, 0, 11451, 0, 72714, 3731, + 2359, 0, 67844, 0, 121503, 548, 121502, 983245, 121405, 983248, 0, 66272, + 0, 64678, 0, 9547, 0, 0, 1614, 0, 0, 66307, 128092, 1358, 120871, 428, 0, + 1466, 0, 10982, 0, 0, 0, 407, 0, 0, 0, 0, 0, 0, 5804, 73464, 0, 0, 0, + 70167, 9057, 42446, 0, 125097, 0, 0, 8250, 10952, 8048, 0, 129155, 0, + 118955, 0, 0, 126586, 4407, 74648, 0, 0, 0, 8448, 92491, 0, 0, 12675, + 12659, 0, 0, 983280, 68077, 55273, 10766, 12012, 2386, 0, 9170, 0, 9123, + 128194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8709, 0, 983585, 0, 0, 0, 0, 0, + 0, 0, 128342, 0, 577, 128610, 0, 0, 124999, 68087, 74840, 126474, 127036, + 0, 0, 0, 1414, 124963, 9683, 43486, 92231, 0, 2536, 0, 66330, 0, 0, 0, 0, + 0, 0, 0, 66317, 0, 66315, 66316, 0, 0, 0, 0, 0, 0, 0, 0, 66323, 66324, 0, + 0, 3106, 65917, 0, 0, 0, 891, 0, 0, 42624, 0, 0, 8824, 65089, 0, 10936, + 0, 0, 0, 0, 92688, 0, 0, 0, 0, 12745, 0, 0, 41285, 3547, 0, 0, 0, 0, 0, + 6089, 0, 68490, 120578, 4170, 1029, 127761, 0, 0, 42374, 0, 744, 917624, + 0, 0, 0, 93046, 0, 3551, 0, 0, 4623, 0, 0, 12340, 0, 65136, 0, 0, 0, 0, + 0, 0, 0, 72291, 0, 0, 120778, 0, 11972, 0, 78757, 0, 122886, 177, 122894, + 0, 0, 0, 0, 55243, 0, 0, 0, 70172, 120249, 120242, 128027, 120243, 0, 0, + 0, 120237, 120245, 94079, 0, 0, 9136, 120240, 120614, 41280, 0, 0, 0, 0, + 74149, 128327, 0, 0, 66361, 12601, 72194, 64360, 65163, 0, 0, 0, 0, 0, 0, + 5404, 43332, 3667, 7936, 12925, 0, 0, 0, 0, 0, 10874, 65505, 0, 0, 0, 0, + 128920, 983662, 0, 0, 0, 0, 0, 0, 0, 0, 66677, 0, 0, 0, 70088, 74148, 0, + 0, 72868, 120230, 120224, 74172, 0, 0, 94096, 0, 128414, 120636, 0, + 127519, 917609, 917616, 0, 128652, 0, 0, 11441, 0, 3512, 0, 0, 43597, 0, + 0, 72734, 68153, 41563, 0, 0, 129352, 41544, 0, 0, 0, 0, 129177, 0, 0, 0, + 118908, 0, 78108, 67396, 73804, 64711, 0, 0, 917610, 0, 0, 0, 11557, + 127776, 0, 12079, 0, 0, 0, 0, 128861, 0, 0, 0, 0, 0, 983200, 8103, 72303, + 128174, 92486, 110698, 0, 64587, 0, 0, 124961, 0, 0, 0, 126481, 0, 0, 0, + 0, 0, 70348, 1450, 0, 1340, 0, 0, 128970, 0, 0, 125117, 0, 0, 0, 0, 6539, + 92948, 0, 128213, 125060, 0, 0, 0, 3973, 0, 70504, 121193, 7982, 0, 0, + 127194, 0, 0, 0, 128408, 118968, 6417, 120619, 0, 0, 0, 0, 129455, 4919, + 65121, 110872, 7755, 0, 0, 64548, 0, 1621, 0, 0, 0, 0, 0, 12188, 0, 0, 0, + 0, 5015, 0, 0, 42590, 70354, 1756, 0, 0, 0, 120694, 0, 0, 7555, 73874, + 5408, 2817, 1214, 69919, 0, 983125, 0, 0, 125055, 127195, 7957, 0, 0, + 1056, 74944, 0, 0, 0, 0, 7073, 74979, 0, 70853, 0, 110874, 0, 0, 2341, + 126644, 8484, 0, 0, 68322, 0, 8461, 67721, 42269, 0, 0, 43709, 43708, + 9451, 7571, 13073, 43847, 126647, 0, 983258, 0, 0, 0, 8781, 12894, 78134, + 0, 92288, 0, 0, 78184, 0, 11338, 120768, 0, 0, 0, 0, 0, 121367, 65021, + 64795, 74574, 0, 10047, 0, 0, 0, 0, 0, 0, 119181, 163, 576, 9895, 0, 0, + 74591, 0, 0, 66888, 0, 0, 0, 0, 0, 0, 7017, 128111, 0, 0, 0, 0, 41591, + 11036, 65252, 120795, 129488, 0, 0, 0, 0, 0, 0, 8887, 0, 7295, 71203, 0, + 127221, 0, 0, 0, 0, 8755, 0, 0, 8147, 73127, 0, 0, 0, 0, 129377, 0, + 74499, 0, 0, 0, 4619, 0, 6654, 123192, 0, 0, 0, 65689, 10128, 0, 129612, 0, 0, 92651, 0, 2401, 0, 8792, 0, 0, 74980, 0, 92246, 0, 0, 0, 12886, 0, 66624, 0, 0, 74133, 65170, 0, 74135, 0, 0, 9984, 73867, 3010, 0, 70349, 10698, 41475, 0, 119151, 0, 119152, 0, 0, 9100, 0, 0, 0, 78116, 64780, 2001, 0, 55230, 0, 4052, 0, 7626, 78080, 0, 0, 0, 41477, 0, 0, 0, 43707, 74127, 0, 0, 0, 78086, 73758, 2335, 10663, 0, 0, 0, 119602, 0, 0, 70325, 0, 41443, 0, 0, 0, 9711, 1523, 0, 0, 41445, 0, 0, 8567, 41442, 12821, 0, - 0, 118978, 0, 65274, 0, 0, 0, 127515, 0, 0, 43446, 0, 0, 0, 0, 127985, 0, - 10206, 127167, 6375, 2673, 0, 0, 0, 43219, 129355, 0, 0, 0, 0, 0, 11799, - 0, 68466, 0, 0, 0, 0, 0, 120736, 0, 7203, 0, 0, 70361, 129077, 120615, - 127216, 0, 0, 0, 0, 43121, 0, 128366, 127212, 0, 0, 0, 121260, 73781, - 70365, 0, 68039, 70446, 10057, 0, 0, 0, 127399, 120963, 0, 2307, 0, 0, 0, - 0, 73873, 0, 94035, 0, 0, 0, 0, 0, 7327, 0, 0, 440, 0, 0, 68613, 75059, - 0, 0, 9957, 0, 0, 8046, 0, 119158, 0, 0, 68609, 0, 129405, 1521, 129460, - 92256, 65344, 0, 11850, 68737, 0, 0, 68914, 7303, 65770, 5243, 0, 5239, - 65771, 121429, 0, 5237, 0, 68756, 0, 5247, 0, 0, 0, 12873, 5764, 0, 0, - 3008, 118981, 128102, 0, 0, 55231, 41103, 0, 92756, 0, 0, 92717, 70074, - 7872, 74886, 917567, 8731, 65378, 0, 0, 11316, 128163, 126600, 70360, - 3019, 9997, 0, 0, 9456, 0, 0, 0, 0, 0, 0, 92682, 4281, 0, 0, 0, 118982, - 0, 69993, 78096, 0, 78095, 0, 78098, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2134, 0, - 10116, 9877, 70679, 0, 0, 92723, 8379, 0, 6778, 0, 0, 8243, 0, 0, 0, 0, - 128008, 0, 0, 0, 983630, 119668, 0, 92722, 983098, 5637, 125115, 0, 0, - 120479, 0, 113730, 0, 0, 0, 64432, 0, 70363, 121368, 1156, 68052, 0, 0, - 120482, 0, 68030, 0, 0, 0, 7634, 0, 0, 65536, 0, 0, 0, 7702, 0, 78890, 0, - 65779, 65783, 195066, 120961, 5700, 0, 0, 92161, 2339, 92476, 5697, 0, 0, - 0, 74923, 0, 5696, 92677, 0, 3862, 0, 0, 0, 983055, 0, 0, 0, 0, 5701, - 9722, 41490, 41370, 5698, 0, 0, 0, 42204, 55270, 8571, 0, 0, 43859, 0, - 78731, 0, 12184, 0, 0, 0, 0, 0, 5650, 0, 64712, 120474, 0, 120458, 5647, - 120473, 7387, 0, 92675, 11477, 5646, 0, 11018, 0, 0, 0, 0, 0, 0, 0, - 128459, 126128, 5651, 0, 0, 0, 5648, 0, 120920, 0, 127517, 3545, 0, 6984, - 0, 0, 0, 69414, 126613, 0, 10123, 0, 0, 0, 0, 65020, 74885, 119166, 0, 0, - 0, 0, 0, 1140, 78426, 0, 0, 0, 0, 8128, 9889, 0, 0, 1815, 0, 890, 0, - 3267, 0, 0, 0, 0, 4410, 125081, 10576, 8102, 0, 580, 74232, 0, 0, 0, 0, - 0, 19938, 0, 0, 0, 0, 3298, 6546, 0, 0, 0, 0, 6134, 41246, 0, 0, 0, - 917770, 0, 6264, 0, 0, 0, 0, 0, 0, 69445, 0, 0, 0, 92697, 11915, 10377, - 0, 10072, 0, 0, 2329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125136, 0, 11201, 92708, - 74769, 0, 13263, 0, 0, 92404, 126066, 73822, 0, 0, 64917, 0, 0, 494, - 128026, 0, 65098, 0, 956, 125265, 0, 0, 73740, 0, 0, 0, 74281, 128638, 0, - 0, 69217, 120930, 0, 0, 0, 0, 0, 43088, 0, 0, 100948, 0, 65229, 0, 0, 0, - 0, 0, 0, 3907, 0, 64526, 11829, 68197, 0, 0, 11475, 70329, 3020, 42264, - 0, 0, 0, 7098, 0, 0, 127967, 957, 42696, 0, 3016, 0, 0, 0, 0, 0, 121248, - 92510, 3006, 4620, 0, 0, 0, 0, 129369, 129425, 0, 0, 0, 0, 8626, 0, - 128824, 0, 65377, 0, 983102, 42920, 1698, 0, 64477, 0, 0, 43813, 100432, - 100431, 100434, 100433, 100436, 70321, 100438, 100437, 100440, 100439, 0, - 121024, 0, 70327, 100441, 55252, 100443, 100442, 100445, 100444, 66641, - 100446, 100449, 100448, 0, 100450, 113820, 74866, 64375, 0, 127850, 0, 0, - 0, 0, 0, 983780, 0, 0, 120827, 0, 0, 983785, 0, 0, 0, 0, 8110, 100421, 0, - 100423, 5830, 100425, 100424, 100427, 100426, 100429, 100428, 42389, - 78611, 121398, 0, 0, 0, 0, 0, 0, 0, 83342, 983935, 0, 127147, 119187, - 2135, 11836, 0, 0, 78869, 42313, 5579, 0, 70384, 983082, 94002, 0, 5578, - 11840, 73006, 42023, 69849, 5669, 92559, 0, 0, 68833, 917845, 128275, - 5583, 0, 0, 42426, 5580, 42276, 0, 892, 2220, 42465, 74313, 73440, 5795, - 194991, 68774, 65702, 68770, 0, 65695, 0, 65710, 128399, 0, 0, 68783, 0, - 0, 0, 1638, 10966, 0, 917547, 0, 0, 0, 0, 0, 8172, 0, 0, 0, 0, 0, 0, - 6374, 0, 0, 120972, 0, 0, 0, 0, 0, 0, 0, 72204, 64900, 7153, 65785, - 68826, 0, 3015, 68743, 68740, 68738, 68805, 6400, 68749, 68748, 68760, - 68758, 11276, 68754, 100420, 372, 128829, 68761, 118874, 0, 41585, - 128202, 0, 74228, 276, 0, 74234, 0, 74226, 0, 9007, 0, 41588, 125001, - 119189, 10763, 0, 0, 0, 126097, 68525, 6257, 73112, 100393, 100396, - 100395, 100398, 92409, 100400, 100399, 0, 74848, 0, 983592, 100401, - 66498, 100403, 100402, 64790, 73454, 100407, 100406, 70356, 100408, 0, - 100410, 66829, 70817, 5711, 41633, 12098, 65571, 9166, 0, 5710, 0, 6790, - 65213, 0, 0, 0, 69726, 0, 73817, 0, 0, 5715, 0, 70408, 0, 5712, 100382, - 41620, 100384, 3074, 5722, 100389, 100388, 73768, 0, 118906, 0, 0, 0, - 66419, 119992, 0, 0, 0, 0, 128903, 78607, 0, 129074, 0, 0, 0, 0, 0, 0, - 113682, 0, 11261, 0, 0, 0, 8701, 0, 11236, 0, 129490, 100390, 0, 0, 0, - 78293, 0, 0, 0, 64946, 0, 0, 0, 70336, 0, 0, 93986, 68814, 42902, 0, 0, - 0, 0, 92344, 0, 67845, 42641, 71444, 0, 0, 70366, 0, 100369, 100368, - 5084, 100370, 0, 118861, 0, 733, 74646, 0, 0, 0, 125085, 0, 9218, 0, - 100380, 100379, 71070, 0, 0, 0, 0, 70323, 0, 0, 5155, 0, 0, 983756, 0, 0, - 72351, 0, 0, 0, 122891, 0, 0, 0, 100372, 100371, 100374, 100373, 100376, - 100375, 100378, 100377, 4974, 100357, 100360, 100359, 0, 0, 0, 12205, 0, - 0, 64507, 0, 0, 0, 0, 0, 0, 12149, 13088, 78290, 0, 12241, 0, 0, 0, 6932, - 100352, 0, 100354, 100353, 100356, 351, 68764, 0, 0, 0, 0, 73443, 0, 0, - 100361, 42377, 100363, 100362, 100365, 100364, 100367, 9013, 4054, 0, 0, - 113740, 0, 120782, 5585, 65881, 0, 0, 0, 0, 5584, 8358, 128975, 121177, - 0, 0, 0, 41616, 0, 983796, 2218, 0, 5589, 0, 2664, 41613, 5586, 118890, - 0, 11356, 0, 0, 0, 78609, 0, 0, 0, 0, 0, 0, 0, 0, 8135, 0, 0, 983791, 0, - 0, 0, 5657, 0, 12915, 121453, 0, 10179, 5654, 12939, 0, 120799, 0, 0, - 5652, 10945, 0, 0, 0, 113710, 0, 73449, 68069, 0, 70332, 0, 5659, 0, 0, - 66729, 5655, 0, 0, 0, 68806, 0, 128225, 66310, 73444, 0, 0, 70362, 0, - 11609, 0, 126990, 92949, 10272, 10304, 10368, 74511, 594, 10244, 10248, - 10256, 983899, 0, 0, 3467, 41010, 0, 3331, 946, 0, 1495, 13184, 74330, - 128242, 9562, 0, 0, 0, 70036, 0, 0, 0, 983738, 0, 0, 0, 5666, 65227, 0, - 68419, 0, 11796, 0, 0, 0, 10186, 0, 7732, 983736, 0, 0, 0, 5668, 83334, - 0, 74645, 5670, 0, 0, 12741, 126619, 0, 5667, 19952, 120807, 113766, - 12749, 0, 67757, 2263, 0, 0, 119260, 129131, 9286, 83335, 128457, 83336, - 70359, 0, 3571, 13247, 5874, 78279, 73447, 68435, 78278, 78267, 78268, 0, - 78265, 553, 113768, 0, 93053, 5829, 0, 4587, 78285, 78299, 0, 12746, 0, - 70338, 0, 5633, 0, 94101, 94102, 94099, 94100, 94105, 74856, 94103, - 12742, 0, 983818, 0, 0, 0, 70330, 0, 983811, 0, 0, 0, 12148, 0, 0, 0, 0, - 0, 64938, 67234, 5634, 0, 0, 2146, 0, 118880, 2425, 65182, 983813, 43636, - 0, 0, 328, 0, 68736, 0, 5636, 0, 5329, 0, 5638, 0, 7940, 0, 43223, 43760, - 5635, 3373, 72424, 78292, 74223, 73441, 68763, 78287, 9833, 0, 74208, - 41635, 0, 0, 43040, 78297, 68778, 78295, 5639, 65603, 5660, 5640, 78303, - 0, 78300, 0, 68301, 0, 0, 78312, 0, 78310, 41625, 78308, 78309, 100731, - 41780, 5642, 100732, 100735, 100734, 4356, 100736, 100739, 12051, 70166, - 100740, 5641, 8259, 0, 0, 0, 119570, 0, 0, 121264, 983558, 0, 0, 0, - 73890, 0, 0, 2800, 11220, 5645, 64964, 8652, 83323, 0, 0, 121356, 5608, - 128281, 119932, 0, 0, 0, 9000, 0, 83324, 92673, 129176, 0, 5613, 74267, - 100721, 100724, 5610, 100726, 92965, 100728, 5612, 100730, 10787, 0, - 3615, 128793, 5609, 78316, 78317, 78313, 78315, 5875, 5808, 0, 8186, 0, - 74269, 0, 70004, 65874, 72422, 5807, 0, 66320, 5306, 12936, 0, 92970, 0, - 0, 92583, 10211, 0, 0, 78871, 121063, 0, 129512, 0, 0, 0, 0, 0, 74237, 0, - 9133, 74262, 0, 0, 0, 64779, 0, 0, 6185, 64776, 0, 121266, 6499, 0, 0, 0, - 0, 0, 93784, 93791, 2534, 0, 93768, 93778, 93762, 71849, 71869, 93781, - 64583, 93761, 93780, 93760, 93787, 92443, 128714, 71848, 93774, 66411, - 93785, 71841, 93770, 93769, 0, 0, 0, 121168, 68443, 69774, 931, 0, - 125052, 6363, 2748, 0, 0, 0, 983603, 44011, 0, 0, 100711, 119009, 100713, - 100712, 100715, 65896, 100717, 78298, 100719, 100718, 128836, 100720, - 11649, 0, 0, 0, 0, 0, 42341, 65284, 0, 0, 12884, 0, 7907, 127255, 0, 0, - 0, 0, 68779, 0, 68786, 0, 100691, 0, 100693, 100692, 42851, 100694, - 100697, 100696, 92276, 78226, 66393, 100700, 0, 93773, 93776, 93777, - 100702, 78301, 100704, 100703, 42415, 78307, 4542, 69909, 100710, 100709, - 0, 0, 0, 0, 42454, 11565, 7949, 124939, 0, 0, 42494, 3073, 0, 0, 42302, - 0, 126553, 70810, 0, 72401, 0, 0, 0, 129319, 4877, 100681, 100684, - 100683, 10548, 100685, 100688, 100687, 100690, 64798, 70805, 5346, 0, - 126570, 0, 4874, 0, 0, 0, 0, 0, 65884, 0, 0, 0, 11378, 0, 42785, 0, 3251, - 11203, 0, 0, 0, 0, 11052, 0, 5342, 8317, 0, 0, 5340, 0, 0, 128599, 0, 0, - 0, 128395, 0, 128510, 0, 0, 9142, 0, 0, 0, 10938, 0, 0, 1182, 127381, - 4829, 0, 0, 72438, 529, 0, 0, 0, 10586, 10790, 10839, 121427, 41593, - 100669, 0, 0, 41594, 225, 66418, 0, 0, 983950, 11376, 0, 41596, 0, 0, 0, - 0, 11084, 3194, 0, 78306, 78305, 0, 0, 0, 11324, 0, 0, 8420, 127756, - 128844, 0, 41338, 0, 11485, 0, 41322, 66605, 100671, 0, 100673, 100672, - 100675, 5161, 41330, 100676, 100679, 100678, 100659, 100658, 0, 100660, - 0, 100485, 12361, 0, 12359, 983559, 41369, 66412, 12191, 0, 0, 0, 0, - 78221, 41376, 0, 9870, 0, 41385, 65824, 100651, 11938, 100653, 100652, - 100655, 100654, 42678, 100656, 0, 64649, 0, 0, 0, 0, 0, 983948, 100662, - 100661, 100664, 66334, 100666, 70280, 832, 100667, 0, 78473, 66007, - 78471, 65703, 0, 0, 0, 12357, 0, 41395, 0, 0, 0, 0, 0, 0, 0, 0, 41114, - 65466, 0, 983825, 6024, 0, 9979, 0, 0, 0, 0, 0, 0, 0, 4285, 0, 0, 4230, - 0, 7367, 0, 92353, 7563, 42376, 0, 128532, 0, 0, 0, 0, 0, 0, 78466, 0, - 12208, 128138, 0, 66311, 71309, 0, 41130, 78286, 0, 0, 70047, 0, 6022, 0, - 0, 0, 0, 0, 41125, 0, 66453, 0, 41107, 0, 41121, 5300, 0, 0, 0, 0, 74801, - 70855, 2074, 73456, 0, 0, 12453, 0, 0, 0, 0, 68159, 12457, 0, 0, 66278, - 0, 0, 0, 0, 0, 66637, 12455, 0, 128473, 0, 12449, 0, 71224, 0, 0, 66908, - 0, 10165, 0, 0, 113715, 0, 128223, 0, 0, 0, 0, 4993, 0, 6168, 74033, - 4995, 0, 69459, 120522, 4639, 0, 72223, 0, 0, 0, 0, 0, 0, 69734, 0, 0, 0, - 0, 0, 0, 83310, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4953, 0, 0, 0, 0, 83311, 0, - 73453, 65688, 0, 10125, 3517, 0, 0, 0, 65094, 74791, 78262, 10627, 66333, - 78256, 78257, 83304, 78253, 0, 71317, 64923, 0, 65208, 10608, 78263, - 78264, 0, 0, 0, 65883, 0, 0, 74914, 0, 0, 0, 0, 0, 12912, 119012, 0, - 128191, 0, 0, 0, 0, 1290, 0, 0, 0, 0, 113719, 71442, 0, 0, 8978, 0, - 119135, 120979, 10527, 71079, 0, 0, 0, 0, 0, 0, 5336, 0, 0, 6934, 0, - 10780, 0, 0, 78767, 0, 0, 0, 347, 0, 0, 78775, 64675, 41582, 78774, - 78771, 68094, 74903, 78769, 69221, 69657, 0, 0, 11153, 120981, 78526, 0, - 0, 0, 0, 41584, 0, 69464, 0, 0, 0, 0, 43510, 66661, 0, 66306, 78791, - 66384, 0, 6609, 0, 0, 11319, 0, 128964, 0, 41730, 0, 0, 127920, 0, 65172, - 41728, 41721, 0, 0, 0, 41203, 0, 0, 41726, 0, 0, 5758, 0, 0, 41140, 2028, - 78092, 0, 0, 0, 92739, 983195, 41138, 0, 0, 0, 125082, 1115, 127060, - 9794, 127062, 67671, 92238, 12237, 78787, 66314, 78785, 9290, 78782, - 78783, 78780, 78781, 127144, 7926, 0, 0, 0, 64398, 100924, 71274, 12311, - 0, 78796, 78798, 78794, 78795, 78792, 78793, 0, 0, 0, 73455, 0, 0, 0, - 42142, 9968, 11583, 0, 7092, 0, 9627, 78536, 78543, 78535, 0, 0, 1248, - 10148, 127755, 0, 0, 0, 0, 66447, 0, 0, 0, 0, 65305, 0, 4031, 42794, - 119986, 0, 8154, 0, 0, 128028, 0, 0, 125220, 73452, 0, 0, 0, 6696, 0, - 119599, 0, 0, 0, 4364, 0, 0, 0, 120976, 0, 120922, 0, 10124, 7526, 8601, - 0, 68246, 0, 129318, 1418, 10885, 0, 0, 0, 0, 0, 0, 4571, 0, 0, 0, 12078, - 41597, 0, 10933, 0, 0, 0, 0, 0, 41599, 0, 0, 0, 12950, 119190, 10498, 0, - 66782, 4239, 0, 0, 66511, 68066, 2637, 110685, 8460, 110683, 8476, - 110681, 0, 110679, 0, 127919, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5412, 66243, - 9935, 122892, 0, 73864, 41734, 8206, 74081, 0, 3286, 120730, 0, 0, 41732, - 0, 41736, 983201, 41731, 0, 0, 70842, 0, 0, 0, 0, 129329, 0, 66853, 0, 0, - 78742, 72755, 11277, 65892, 0, 10620, 92272, 0, 0, 0, 0, 73942, 0, - 100479, 0, 119093, 3459, 0, 129398, 0, 0, 0, 92512, 0, 66377, 69781, 0, - 0, 111304, 3161, 69981, 0, 0, 0, 0, 0, 9016, 78153, 0, 0, 43641, 0, - 121018, 0, 0, 0, 0, 0, 0, 0, 68342, 120950, 94043, 0, 12332, 121310, - 6086, 41722, 0, 120709, 0, 0, 111305, 0, 0, 128307, 74288, 0, 74546, 0, - 129178, 0, 0, 42460, 0, 0, 0, 0, 120941, 42421, 0, 41723, 0, 64358, - 11460, 983506, 0, 64718, 120838, 66869, 0, 42348, 0, 6752, 452, 42500, 0, - 128258, 0, 42308, 0, 0, 0, 12932, 0, 69968, 74642, 66827, 917582, 0, 0, - 8302, 0, 0, 0, 0, 7250, 13214, 10041, 8105, 65568, 127780, 69969, 127759, - 0, 0, 121467, 0, 121466, 0, 0, 69878, 0, 5538, 9987, 0, 118932, 129307, - 0, 552, 0, 7357, 10785, 0, 0, 4557, 0, 0, 10171, 68320, 0, 5540, 0, 0, - 281, 0, 0, 42622, 0, 5536, 0, 0, 1388, 0, 0, 10504, 0, 0, 11531, 74324, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3663, 0, 121081, 70335, 74859, 0, 5334, 0, - 110738, 72319, 0, 11305, 0, 68456, 0, 66611, 0, 19907, 64363, 3478, 7583, - 7679, 74154, 0, 0, 1158, 0, 0, 73748, 0, 0, 1915, 4846, 0, 120132, - 118984, 120134, 120129, 120128, 805, 120130, 64438, 120124, 8760, 120126, - 120121, 120120, 120123, 94003, 0, 0, 0, 0, 0, 12225, 0, 0, 0, 70173, - 75045, 0, 129515, 8083, 0, 0, 0, 111094, 92626, 0, 0, 0, 0, 0, 0, 110837, - 0, 67699, 560, 5643, 0, 0, 0, 0, 0, 0, 0, 120144, 0, 120661, 78304, 1597, - 120143, 120142, 206, 70126, 120139, 120138, 8168, 0, 73086, 0, 0, 0, - 983827, 125036, 0, 0, 3546, 42573, 66811, 0, 0, 128397, 8400, 0, 0, 0, 0, - 0, 7903, 9287, 72791, 0, 0, 0, 0, 0, 66603, 1695, 917861, 0, 0, 111101, - 0, 0, 0, 0, 0, 0, 0, 111099, 0, 111098, 4754, 0, 69222, 128229, 0, 0, - 7354, 7408, 0, 0, 121181, 0, 0, 0, 12739, 0, 1278, 4187, 0, 42119, 42120, - 0, 121158, 0, 12467, 0, 68902, 0, 12463, 0, 0, 118827, 0, 9664, 70834, - 74475, 0, 0, 0, 0, 0, 3661, 0, 0, 9022, 127955, 0, 0, 0, 0, 6118, 222, 0, - 3884, 0, 74151, 0, 6502, 0, 11085, 121261, 0, 0, 0, 0, 0, 0, 0, 0, 12461, - 0, 0, 0, 94059, 11254, 10860, 64880, 0, 64685, 0, 0, 0, 7776, 11219, 0, - 0, 121339, 69730, 801, 43165, 0, 0, 0, 0, 13277, 0, 12951, 0, 9906, 5486, - 2334, 128672, 67680, 5483, 73732, 120884, 119128, 5484, 0, 127876, 2539, - 0, 78507, 5485, 195065, 42697, 0, 0, 113689, 4502, 68057, 253, 0, 0, 0, - 9203, 0, 0, 0, 0, 0, 121242, 11127, 0, 0, 0, 13257, 0, 0, 0, 69645, 0, 0, - 0, 70431, 0, 5693, 64470, 0, 66610, 67678, 0, 983659, 0, 0, 0, 0, 0, 0, - 0, 94078, 0, 0, 66608, 3111, 0, 8804, 66607, 0, 0, 0, 66606, 0, 0, 0, - 1436, 0, 55226, 0, 111287, 7393, 41592, 0, 0, 1598, 78101, 0, 0, 65193, - 4423, 0, 113692, 10515, 41589, 0, 0, 0, 0, 1430, 0, 0, 120606, 0, 66223, - 7619, 3255, 128280, 74032, 11549, 10735, 93038, 100741, 6801, 100743, - 100746, 2148, 100748, 100747, 100750, 100749, 0, 121229, 0, 69243, 41724, - 67716, 69669, 41690, 111269, 983647, 8380, 100355, 983830, 0, 0, 0, 0, 0, - 0, 6333, 111264, 42315, 0, 129502, 111265, 0, 0, 5339, 74323, 0, 13004, - 0, 0, 0, 0, 0, 0, 5684, 0, 0, 0, 5689, 0, 0, 68464, 12633, 12870, 0, - 65183, 5688, 0, 0, 6310, 5686, 0, 0, 0, 120647, 70046, 50, 94095, 9871, - 0, 0, 121446, 0, 0, 0, 66905, 0, 4448, 0, 121406, 113734, 0, 1321, 0, + 0, 118978, 0, 65274, 0, 94082, 0, 127515, 0, 0, 43446, 0, 0, 0, 0, + 127985, 0, 10206, 127167, 6375, 2673, 0, 0, 0, 43219, 129355, 0, 0, 0, 0, + 0, 11799, 0, 68466, 0, 0, 0, 0, 0, 120736, 0, 7203, 0, 0, 70361, 129077, + 120615, 127216, 0, 0, 0, 0, 43121, 0, 128366, 72161, 0, 0, 0, 121260, + 73781, 70365, 0, 68039, 70446, 10057, 0, 0, 0, 127399, 120963, 0, 2307, + 0, 0, 0, 0, 73873, 0, 94035, 0, 0, 0, 0, 0, 7327, 0, 0, 440, 0, 0, 68613, + 75059, 0, 0, 9957, 0, 0, 8046, 0, 119158, 0, 0, 68609, 0, 129405, 1521, + 129460, 92256, 65344, 0, 11850, 68737, 0, 0, 68914, 7303, 65770, 5243, 0, + 5239, 65771, 121429, 0, 5237, 0, 68756, 0, 5247, 0, 0, 0, 12873, 5764, 0, + 0, 3008, 118981, 128102, 0, 0, 55231, 41103, 0, 92756, 0, 0, 92717, + 70074, 7872, 74886, 917567, 8731, 65378, 0, 0, 11316, 128163, 126600, + 70360, 3019, 9997, 0, 0, 9456, 129545, 0, 0, 129555, 0, 0, 92682, 4281, + 0, 0, 0, 118982, 0, 69993, 78096, 0, 78095, 0, 78098, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2134, 0, 10116, 9877, 70679, 0, 0, 92723, 8379, 0, 6778, 0, 0, + 8243, 0, 0, 0, 0, 128008, 0, 0, 0, 983630, 119668, 0, 92722, 983098, + 5637, 125115, 0, 0, 120479, 0, 113730, 0, 0, 194990, 64432, 0, 70363, + 121368, 1156, 68052, 0, 0, 120482, 0, 68030, 0, 0, 0, 7634, 0, 0, 65536, + 0, 0, 0, 7702, 0, 78890, 0, 65779, 65783, 195066, 120961, 5700, 0, 0, + 92161, 2339, 92476, 5697, 0, 0, 0, 74923, 0, 5696, 92677, 0, 3862, 0, 0, + 0, 983055, 0, 0, 0, 0, 5701, 9722, 41490, 41370, 5698, 0, 0, 0, 42204, + 55270, 8571, 0, 0, 43859, 0, 78731, 0, 12184, 0, 0, 0, 0, 0, 5650, 0, + 64712, 120474, 0, 120458, 5647, 120473, 7387, 0, 92675, 11477, 5646, 0, + 11018, 0, 0, 0, 0, 0, 0, 0, 128459, 126128, 5651, 0, 0, 0, 5648, 0, + 120920, 0, 127517, 3545, 0, 6984, 0, 0, 0, 69414, 126613, 0, 10123, 0, 0, + 0, 0, 65020, 74885, 119166, 0, 0, 0, 0, 0, 1140, 78426, 0, 0, 0, 0, 8128, + 9889, 0, 0, 1815, 0, 890, 0, 3267, 0, 0, 0, 0, 4410, 125081, 10576, 8102, + 0, 580, 74232, 0, 0, 0, 0, 0, 19938, 0, 0, 0, 0, 3298, 6546, 0, 0, 0, 0, + 6134, 41246, 0, 0, 0, 917770, 0, 6264, 0, 0, 0, 0, 0, 0, 69445, 0, 0, 0, + 92697, 11915, 10377, 0, 10072, 0, 0, 2329, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 125136, 0, 11201, 92708, 74769, 0, 13263, 0, 0, 92404, 126066, 73822, 0, + 0, 64917, 0, 0, 494, 128026, 0, 65098, 0, 956, 125265, 129556, 0, 73740, + 0, 0, 0, 74281, 128638, 0, 0, 69217, 120930, 0, 0, 0, 0, 0, 43088, 0, + 126269, 100948, 0, 65229, 0, 0, 0, 0, 0, 0, 3907, 118833, 64526, 11829, + 68197, 0, 0, 11475, 70329, 3020, 42264, 0, 0, 0, 7098, 0, 0, 127967, 957, + 42696, 0, 3016, 0, 0, 0, 0, 0, 121248, 92510, 3006, 4620, 0, 0, 0, 0, + 129369, 129425, 0, 0, 0, 126246, 8626, 0, 128824, 0, 65377, 0, 983102, + 42920, 1698, 0, 64477, 0, 0, 43813, 100432, 100431, 100434, 100433, + 100436, 70321, 100438, 100437, 100440, 100439, 0, 121024, 0, 70327, + 100441, 55252, 100443, 100442, 100445, 100444, 66641, 100446, 100449, + 100448, 0, 100450, 113820, 74866, 64375, 0, 127850, 129477, 0, 0, 0, 0, + 983780, 0, 0, 120827, 0, 0, 123637, 0, 0, 0, 0, 8110, 100421, 0, 100423, + 5830, 100425, 100424, 100427, 100426, 100429, 100428, 42389, 78611, + 121398, 0, 0, 0, 0, 0, 0, 0, 83342, 983935, 0, 127147, 119187, 2135, + 11836, 0, 0, 78869, 42313, 5579, 0, 70384, 983082, 94002, 0, 5578, 11840, + 73006, 42023, 69849, 5669, 92559, 0, 0, 68833, 917845, 128275, 5583, 0, + 0, 42426, 5580, 42276, 0, 892, 2220, 42465, 74313, 73440, 5795, 194991, + 68774, 65702, 68770, 0, 65695, 0, 65710, 128399, 0, 0, 68783, 0, 0, 0, + 1638, 10966, 0, 917547, 0, 0, 0, 0, 0, 8172, 0, 0, 0, 0, 0, 0, 6374, 0, + 0, 120972, 0, 0, 0, 0, 0, 0, 0, 72204, 64900, 7153, 65785, 68826, 0, + 3015, 68743, 68740, 68738, 68805, 6400, 68749, 68748, 68760, 68758, + 11276, 68754, 100420, 372, 128829, 68761, 118874, 0, 41585, 128202, 0, + 74228, 276, 0, 74234, 0, 74226, 0, 9007, 0, 41588, 125001, 119189, 10763, + 0, 0, 0, 126097, 68525, 6257, 73112, 100393, 100396, 100395, 100398, + 92409, 100400, 100399, 0, 74848, 0, 983592, 100401, 66498, 100403, + 100402, 64790, 73454, 100407, 100406, 70356, 100408, 0, 100410, 66829, + 70817, 5711, 41633, 12098, 65571, 9166, 0, 5710, 0, 6790, 65213, 0, 0, 0, + 69726, 0, 73817, 0, 0, 5715, 0, 70408, 0, 5712, 100382, 41620, 100384, + 3074, 5722, 100389, 100388, 73768, 0, 118906, 0, 0, 0, 66419, 119992, 0, + 0, 0, 0, 128903, 78607, 0, 129074, 0, 0, 0, 0, 0, 0, 113682, 0, 11261, 0, + 0, 0, 8701, 0, 11236, 0, 129490, 100390, 0, 0, 0, 78293, 0, 0, 0, 64946, + 0, 0, 0, 70336, 0, 0, 93986, 68814, 42902, 0, 0, 0, 0, 92344, 0, 67845, + 42641, 71444, 0, 0, 70366, 0, 100369, 100368, 5084, 100370, 0, 118861, 0, + 733, 74646, 0, 0, 0, 125085, 0, 9218, 0, 100380, 100379, 71070, 0, 0, 0, + 0, 70323, 0, 0, 5155, 0, 0, 983756, 0, 0, 72351, 0, 0, 0, 122891, 0, 0, + 0, 100372, 100371, 100374, 100373, 100376, 100375, 100378, 100377, 4974, + 100357, 100360, 100359, 0, 0, 0, 12205, 0, 0, 64507, 0, 0, 0, 0, 0, 0, + 12149, 13088, 78290, 0, 12241, 0, 0, 0, 6932, 100352, 73676, 100354, + 100353, 100356, 351, 68764, 0, 0, 0, 0, 73443, 0, 0, 100361, 42377, + 100363, 100362, 100365, 100364, 100367, 9013, 4054, 0, 0, 113740, 0, + 120782, 5585, 65881, 0, 0, 0, 0, 5584, 8358, 128975, 121177, 0, 0, 0, + 41616, 0, 983796, 2218, 0, 5589, 0, 2664, 41613, 5586, 118890, 0, 11356, + 0, 0, 0, 78609, 0, 0, 0, 0, 0, 0, 0, 0, 8135, 129685, 0, 983791, 0, 0, 0, + 5657, 0, 12915, 121453, 0, 10179, 5654, 12939, 0, 120799, 0, 0, 5652, + 10945, 0, 0, 0, 113710, 0, 73449, 68069, 0, 70332, 0, 5659, 0, 0, 66729, + 5655, 0, 0, 0, 68806, 0, 128225, 66310, 73444, 0, 0, 70362, 0, 11609, 0, + 126990, 92949, 10272, 10304, 10368, 74511, 594, 10244, 10248, 10256, + 983899, 0, 0, 3467, 41010, 0, 3331, 946, 0, 1495, 13184, 74330, 128242, + 9562, 0, 123175, 0, 70036, 0, 0, 0, 123176, 0, 0, 0, 5666, 65227, 123174, + 68419, 0, 11796, 123178, 0, 0, 10186, 123172, 7732, 983736, 0, 0, 0, + 5668, 83334, 0, 74645, 5670, 0, 0, 12741, 126619, 123638, 5667, 19952, + 120807, 113766, 12749, 0, 67757, 2263, 0, 0, 119260, 129131, 9286, 83335, + 128457, 83336, 70359, 0, 3571, 13247, 5874, 78279, 73447, 68435, 78278, + 78267, 78268, 0, 78265, 553, 113768, 0, 93053, 5829, 0, 4587, 78285, + 78299, 0, 12746, 0, 70338, 0, 5633, 0, 94101, 94102, 94099, 94100, 94105, + 74856, 94103, 12742, 0, 983818, 0, 0, 0, 70330, 0, 983811, 0, 0, 0, + 12148, 0, 0, 0, 0, 0, 64938, 67234, 5634, 0, 0, 2146, 0, 118880, 2425, + 65182, 983813, 43636, 0, 0, 328, 0, 68736, 0, 5636, 123163, 5329, 0, + 5638, 0, 7940, 0, 43223, 43760, 5635, 3373, 72424, 78292, 74223, 73441, + 68763, 78287, 9833, 0, 74208, 41635, 0, 0, 43040, 78297, 68778, 78295, + 5639, 65603, 5660, 5640, 78303, 0, 78300, 0, 68301, 0, 0, 78312, 0, + 78310, 41625, 78308, 78309, 100731, 41780, 5642, 100732, 100735, 100734, + 4356, 100736, 100739, 12051, 70166, 100740, 5641, 8259, 0, 0, 0, 119570, + 0, 0, 121264, 983558, 0, 0, 0, 73890, 0, 0, 2800, 11220, 5645, 64964, + 8652, 83323, 0, 0, 121356, 5608, 128281, 119932, 0, 0, 0, 9000, 0, 83324, + 92673, 129176, 0, 5613, 74267, 100721, 100724, 5610, 100726, 92965, + 100728, 5612, 100730, 10787, 0, 3615, 123647, 5609, 78316, 78317, 78313, + 78315, 5875, 5808, 0, 8186, 0, 74269, 0, 70004, 65874, 72422, 5807, 0, + 66320, 5306, 12936, 0, 92970, 0, 0, 92583, 10211, 0, 0, 78871, 121063, 0, + 129512, 0, 0, 0, 0, 0, 74237, 0, 9133, 74262, 0, 0, 0, 64779, 0, 0, 6185, + 64776, 0, 121266, 6499, 0, 0, 0, 92720, 0, 93784, 93791, 2534, 0, 93768, + 93778, 93762, 71849, 71869, 93781, 64583, 93761, 93780, 93760, 93787, + 92443, 128714, 71848, 93774, 66411, 93785, 71841, 93770, 93769, 0, 0, 0, + 121168, 68443, 69774, 931, 0, 125052, 6363, 2748, 0, 0, 0, 983603, 44011, + 0, 0, 100711, 119009, 100713, 100712, 100715, 65896, 100717, 78298, + 100719, 100718, 128836, 100720, 11649, 0, 0, 0, 0, 0, 42341, 65284, 0, 0, + 12884, 0, 7907, 127255, 0, 0, 0, 0, 68779, 0, 68786, 0, 100691, 0, + 100693, 100692, 42851, 100694, 100697, 100696, 92276, 78226, 66393, + 100700, 0, 93773, 93776, 93777, 100702, 78301, 100704, 100703, 42415, + 78307, 4542, 69909, 94022, 100709, 0, 0, 0, 0, 42454, 11565, 7949, + 124939, 0, 0, 42494, 3073, 0, 0, 42302, 0, 126553, 70810, 0, 72401, 0, 0, + 0, 129319, 4877, 100681, 100684, 100683, 10548, 100685, 100688, 100687, + 100690, 64798, 70805, 5346, 0, 126570, 0, 4874, 0, 0, 0, 0, 0, 65884, 0, + 0, 0, 11378, 0, 42785, 0, 3251, 11203, 0, 0, 0, 0, 11052, 0, 5342, 8317, + 0, 0, 5340, 0, 0, 128599, 0, 129538, 0, 128395, 0, 128510, 0, 0, 9142, 0, + 0, 0, 10938, 0, 0, 1182, 127381, 4829, 0, 0, 72438, 529, 0, 0, 0, 10586, + 10790, 10839, 121427, 41593, 100669, 0, 0, 41594, 225, 66418, 0, 0, + 983950, 11376, 0, 41596, 0, 0, 0, 0, 11084, 3194, 0, 78306, 78305, 0, 0, + 0, 11324, 0, 0, 8420, 127756, 128844, 0, 41338, 129683, 11485, 0, 41322, + 66605, 100671, 0, 100673, 100672, 100675, 5161, 41330, 100676, 100679, + 100678, 100659, 100658, 0, 100660, 0, 100485, 12361, 0, 12359, 983559, + 41369, 66412, 12191, 0, 0, 0, 0, 78221, 41376, 0, 9870, 0, 41385, 65824, + 100651, 11938, 100653, 100652, 100655, 100654, 42678, 100656, 0, 64649, + 0, 0, 0, 0, 0, 983948, 100662, 100661, 100664, 66334, 100666, 70280, 832, + 100667, 0, 78473, 66007, 78471, 65703, 0, 0, 0, 12357, 0, 41395, 0, 0, 0, + 0, 0, 0, 0, 0, 41114, 65466, 0, 983825, 6024, 0, 9979, 0, 0, 0, 0, 0, 0, + 0, 4285, 0, 0, 4230, 0, 7367, 0, 92353, 7563, 42376, 0, 128532, 0, 0, 0, + 0, 0, 0, 78466, 0, 12208, 128138, 0, 66311, 71309, 0, 41130, 78286, 0, 0, + 70047, 0, 6022, 0, 0, 0, 0, 0, 41125, 0, 66453, 0, 41107, 0, 41121, 5300, + 0, 0, 0, 0, 74801, 70855, 2074, 73456, 0, 0, 12453, 0, 0, 0, 0, 68159, + 12457, 0, 0, 66278, 0, 0, 0, 0, 0, 66637, 12455, 0, 128473, 0, 12449, 0, + 71224, 0, 0, 66908, 0, 10165, 0, 0, 113715, 0, 128223, 0, 0, 0, 0, 4993, + 0, 6168, 74033, 4995, 0, 69459, 120522, 4639, 0, 72223, 0, 0, 0, 0, 0, 0, + 69734, 0, 0, 0, 0, 0, 0, 83310, 0, 0, 0, 0, 0, 0, 0, 0, 129594, 4953, 0, + 0, 0, 0, 83311, 0, 73453, 65688, 0, 10125, 3517, 0, 0, 0, 65094, 74791, + 78262, 10627, 66333, 78256, 78257, 83304, 78253, 0, 71317, 64923, 0, + 65208, 10608, 78263, 78264, 0, 0, 0, 65883, 0, 0, 74914, 0, 0, 0, 0, 0, + 12912, 119012, 0, 128191, 0, 0, 129586, 0, 1290, 0, 0, 0, 0, 113719, + 71442, 0, 0, 8978, 0, 119135, 120979, 10527, 71079, 0, 0, 0, 0, 0, 0, + 5336, 0, 0, 6934, 0, 10780, 0, 0, 78767, 0, 0, 0, 347, 0, 0, 78775, + 64675, 41582, 78774, 78771, 68094, 74903, 78769, 69221, 69657, 0, 0, + 11153, 120981, 78526, 0, 0, 0, 0, 41584, 0, 69464, 0, 0, 0, 0, 43510, + 66661, 0, 66306, 78791, 66384, 0, 6609, 0, 0, 11319, 0, 128964, 0, 41730, + 0, 0, 127920, 0, 65172, 41728, 41721, 0, 0, 0, 41203, 0, 0, 41726, 0, 0, + 5758, 0, 0, 41140, 2028, 78092, 0, 0, 0, 92739, 983195, 41138, 0, 0, 0, + 125082, 1115, 127060, 9794, 127062, 67671, 92238, 12237, 78787, 66314, + 78785, 9290, 73668, 78783, 78780, 78781, 127144, 7926, 0, 0, 0, 64398, + 100924, 71274, 12311, 0, 78796, 78798, 78794, 78795, 78792, 78793, 0, 0, + 0, 73455, 0, 0, 0, 42142, 9968, 11583, 0, 7092, 0, 9627, 78536, 73677, + 78535, 0, 0, 1248, 10148, 127755, 0, 0, 0, 0, 66447, 0, 0, 0, 0, 65305, + 0, 4031, 42794, 119986, 0, 8154, 0, 0, 128028, 126259, 0, 125220, 73452, + 0, 0, 0, 6696, 0, 119599, 0, 0, 0, 4364, 0, 0, 0, 120976, 0, 120922, 0, + 10124, 7526, 8601, 0, 68246, 0, 129318, 1418, 10885, 0, 0, 0, 0, 0, 0, + 4571, 0, 0, 0, 12078, 41597, 0, 10933, 0, 72129, 0, 0, 0, 41599, 0, 0, 0, + 12950, 119190, 10498, 0, 66782, 4239, 0, 0, 66511, 68066, 2637, 110685, + 8460, 110683, 8476, 110681, 0, 110679, 0, 127919, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5412, 66243, 9935, 122892, 0, 73864, 41734, 8206, 74081, 0, 3286, + 120730, 0, 0, 41732, 0, 41736, 983201, 41731, 0, 0, 70842, 0, 0, 0, 0, + 129329, 0, 66853, 0, 0, 78742, 72755, 11277, 65892, 0, 10620, 92272, 0, + 0, 0, 0, 73942, 0, 100479, 0, 119093, 3459, 0, 129398, 0, 0, 72130, + 92512, 0, 66377, 69781, 0, 0, 111304, 3161, 69981, 0, 0, 0, 0, 0, 9016, + 78153, 0, 0, 43641, 0, 121018, 0, 0, 0, 0, 0, 0, 0, 68342, 120950, 94043, + 0, 12332, 121310, 6086, 41722, 0, 120709, 0, 0, 111305, 0, 0, 128307, + 74288, 0, 74546, 0, 129178, 0, 0, 42460, 0, 0, 0, 0, 120941, 42421, 0, + 41723, 0, 64358, 11460, 983506, 0, 64718, 120838, 66869, 0, 42348, 0, + 6752, 452, 42500, 0, 128258, 0, 42308, 0, 0, 0, 12932, 0, 69968, 42950, + 66827, 917582, 0, 0, 8302, 0, 0, 0, 0, 7250, 13214, 10041, 8105, 65568, + 127780, 69969, 127759, 0, 0, 121467, 0, 121466, 73666, 0, 69878, 0, 5538, + 9987, 0, 118932, 129307, 0, 552, 0, 7357, 10785, 0, 0, 4557, 0, 0, 10171, + 68320, 0, 5540, 0, 0, 281, 0, 0, 42622, 0, 5536, 0, 0, 1388, 0, 0, 10504, + 0, 0, 11531, 74324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3663, 0, 121081, 70335, + 74859, 0, 5334, 0, 110738, 72319, 0, 11305, 0, 68456, 0, 66611, 0, 19907, + 64363, 3478, 7583, 7679, 74154, 0, 0, 1158, 0, 0, 73748, 0, 0, 1915, + 4846, 0, 120132, 118984, 120134, 120129, 120128, 805, 120130, 64438, + 120124, 8760, 120126, 72137, 120120, 120123, 94003, 0, 0, 0, 0, 0, 12225, + 0, 0, 0, 70173, 75045, 0, 129515, 8083, 0, 0, 0, 111094, 92626, 0, 0, 0, + 0, 0, 0, 110837, 0, 67699, 560, 5643, 0, 0, 0, 0, 0, 0, 0, 120144, 0, + 120661, 78304, 1597, 120143, 120142, 206, 70126, 120139, 120138, 8168, 0, + 73086, 0, 0, 0, 983827, 125036, 0, 0, 3546, 42573, 66811, 0, 0, 128397, + 8400, 0, 0, 0, 0, 0, 7903, 9287, 72791, 0, 0, 0, 0, 72134, 66603, 1695, + 917861, 0, 0, 111101, 0, 0, 0, 0, 0, 0, 0, 111099, 0, 111098, 4754, 0, + 69222, 128229, 0, 0, 7354, 7408, 0, 0, 121181, 0, 0, 0, 12739, 0, 1278, + 4187, 0, 42119, 42120, 0, 121158, 0, 12467, 0, 68902, 0, 12463, 0, 0, + 118827, 0, 9664, 70834, 74475, 0, 0, 0, 0, 0, 3661, 0, 0, 9022, 127955, + 0, 0, 126257, 0, 6118, 222, 126250, 3884, 0, 74151, 0, 6502, 0, 11085, + 121261, 0, 0, 0, 0, 0, 0, 0, 0, 12461, 0, 0, 0, 94059, 11254, 10860, + 64880, 0, 64685, 0, 0, 94087, 7776, 11219, 0, 0, 121339, 69730, 801, + 43165, 0, 78212, 0, 0, 13277, 0, 12951, 0, 9906, 5486, 2334, 128672, + 67680, 5483, 73732, 120884, 119128, 5484, 0, 127876, 2539, 0, 78507, + 5485, 195065, 42697, 0, 0, 113689, 4502, 68057, 253, 73672, 0, 0, 9203, + 0, 0, 0, 0, 0, 121242, 11127, 0, 0, 0, 13257, 0, 0, 0, 69645, 0, 0, 0, + 70431, 0, 5693, 64470, 0, 66610, 67678, 0, 983659, 0, 0, 0, 0, 0, 0, 0, + 94078, 0, 0, 66608, 3111, 0, 8804, 66607, 0, 0, 0, 66606, 0, 0, 0, 1436, + 0, 55226, 0, 111287, 7393, 41592, 0, 0, 1598, 78101, 0, 0, 65193, 4423, + 0, 113692, 10515, 41589, 0, 0, 0, 0, 1430, 0, 0, 120606, 0, 66223, 7619, + 3255, 128280, 74032, 11549, 10735, 93038, 100741, 6801, 100743, 100746, + 2148, 100748, 100747, 100750, 100749, 0, 121229, 0, 69243, 41724, 67716, + 69669, 41690, 111269, 983647, 8380, 100355, 983830, 0, 0, 0, 0, 0, 0, + 6333, 111264, 42315, 0, 129502, 111265, 0, 0, 5339, 74323, 0, 13004, 0, + 0, 0, 0, 0, 0, 5684, 0, 0, 0, 5689, 0, 0, 68464, 12633, 12870, 0, 65183, + 5688, 0, 0, 6310, 5686, 0, 0, 0, 120647, 70046, 50, 94095, 9871, 0, 0, + 121446, 0, 0, 0, 66905, 0, 4448, 0, 121406, 113734, 72125, 1321, 0, 10640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12501, 0, 0, 0, 0, 8812, 0, - 69986, 8673, 0, 129024, 0, 0, 2105, 113672, 72712, 0, 0, 0, 0, 0, 4636, + 69986, 8673, 0, 129024, 0, 0, 2105, 72101, 72712, 0, 0, 0, 0, 0, 4636, 55262, 0, 4515, 2382, 0, 0, 7313, 0, 0, 0, 194626, 0, 0, 0, 0, 0, 0, 0, 10197, 194719, 0, 0, 0, 194718, 0, 0, 0, 64189, 0, 1873, 0, 0, 0, 0, 0, 983663, 0, 0, 0, 72282, 126991, 71113, 0, 0, 129340, 9489, 0, 70843, 0, @@ -26382,48 +27039,48 @@ static unsigned int code_hash[] = { 0, 0, 0, 8146, 11025, 0, 120513, 642, 0, 0, 0, 12875, 0, 0, 13229, 0, 41788, 0, 0, 0, 41791, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8428, 6569, 0, 0, 0, 0, 10167, 0, 68248, 8049, 0, 0, 0, 0, 128882, 4761, 0, 4766, 64623, 0, - 121180, 194653, 118876, 0, 6912, 9232, 7033, 0, 0, 41545, 0, 0, 0, 0, 0, - 0, 0, 3484, 0, 0, 0, 8503, 41539, 41527, 0, 0, 983823, 0, 0, 0, 41537, 0, - 41541, 8282, 11817, 0, 128219, 0, 0, 126132, 0, 0, 70115, 66609, 111235, - 65921, 0, 0, 194664, 0, 129326, 77970, 42246, 75030, 120605, 0, 65926, - 7744, 68859, 94056, 74277, 126108, 0, 6966, 194633, 8136, 0, 0, 0, 0, 0, - 4762, 0, 0, 0, 4765, 69443, 983573, 0, 4760, 0, 0, 10871, 43199, 0, 0, - 93955, 0, 0, 11546, 0, 337, 0, 0, 0, 12279, 7768, 0, 128352, 0, 69812, - 10143, 7883, 121444, 7880, 64618, 13012, 5704, 13010, 0, 0, 119531, 0, 0, - 0, 0, 66654, 0, 0, 0, 13008, 0, 4385, 0, 13011, 0, 92569, 119161, 13009, - 74771, 70159, 0, 0, 41793, 0, 74221, 120996, 41792, 111242, 94054, - 126094, 0, 111244, 5709, 120689, 71076, 0, 0, 0, 0, 0, 5708, 0, 0, 0, - 5706, 66362, 5705, 8791, 41797, 0, 10237, 66436, 0, 0, 0, 0, 128083, - 13170, 0, 0, 0, 0, 41377, 0, 0, 10058, 125225, 0, 0, 0, 0, 0, 0, 0, 0, - 119525, 0, 0, 72350, 0, 983572, 2144, 0, 120765, 0, 0, 1754, 92226, - 13246, 864, 0, 118926, 8972, 0, 7849, 0, 0, 13240, 0, 5192, 0, 0, 10948, - 0, 13199, 0, 1236, 13208, 13261, 13189, 13188, 93993, 0, 7440, 0, 0, 0, - 1844, 125229, 0, 13178, 0, 0, 0, 125230, 0, 0, 13260, 4550, 121249, - 125227, 0, 71071, 0, 0, 68523, 0, 0, 11354, 94071, 0, 42795, 129317, 0, - 0, 0, 125237, 0, 13194, 13274, 0, 0, 129533, 65586, 68311, 0, 119193, - 4601, 194661, 0, 194658, 0, 194659, 0, 121422, 128790, 194657, 41717, - 67402, 0, 121129, 41716, 127376, 7910, 0, 0, 754, 41944, 0, 8183, 120741, - 2037, 0, 0, 0, 125, 0, 0, 0, 983124, 127922, 41719, 0, 7990, 12637, - 13258, 9536, 71056, 0, 4427, 0, 71200, 0, 12217, 0, 41532, 129315, 0, 0, - 0, 0, 111063, 83349, 0, 0, 120622, 0, 0, 0, 0, 43632, 0, 0, 8140, 0, - 6260, 0, 0, 66765, 0, 0, 3898, 0, 0, 13200, 0, 0, 66582, 0, 0, 0, 0, - 1068, 71178, 13259, 12945, 0, 42203, 0, 3124, 69411, 0, 4386, 12224, - 6973, 0, 0, 0, 119535, 0, 121312, 0, 12232, 0, 0, 5681, 64578, 75023, 0, - 13209, 0, 0, 0, 0, 0, 11053, 0, 74902, 128107, 128942, 7588, 0, 1693, - 74942, 43204, 65831, 0, 0, 0, 68803, 111216, 111223, 0, 0, 65685, 9523, - 65070, 0, 0, 0, 0, 0, 0, 0, 0, 13191, 0, 3500, 3139, 100643, 3170, - 100645, 100644, 100647, 100646, 13006, 64433, 0, 100650, 941, 0, 0, - 120967, 65541, 0, 0, 0, 0, 0, 0, 0, 94039, 129299, 92455, 0, 0, 64444, 0, - 0, 43603, 94075, 65397, 288, 0, 0, 0, 10025, 0, 0, 0, 68182, 0, 0, 0, + 121180, 194653, 118876, 0, 6912, 9232, 7033, 0, 0, 41545, 0, 0, 72160, + 72107, 0, 0, 0, 3484, 0, 0, 0, 8503, 41539, 41527, 0, 0, 983823, 0, 0, 0, + 41537, 0, 41541, 8282, 11817, 0, 128219, 0, 0, 126132, 0, 0, 70115, + 66609, 111235, 65921, 0, 0, 194664, 0, 129326, 77970, 42246, 75030, + 120605, 0, 65926, 7744, 68859, 94056, 74277, 126108, 0, 6966, 194633, + 8136, 0, 0, 0, 0, 0, 4762, 0, 0, 0, 4765, 69443, 983573, 0, 4760, 0, 0, + 10871, 43199, 0, 0, 93955, 0, 0, 11546, 0, 337, 0, 0, 0, 12279, 7768, 0, + 128352, 0, 69812, 10143, 7883, 121444, 7880, 64618, 13012, 5704, 13010, + 0, 0, 119531, 0, 0, 0, 0, 66654, 0, 0, 0, 13008, 0, 4385, 0, 13011, 0, + 92569, 119161, 13009, 74771, 70159, 0, 0, 41793, 0, 74221, 120996, 41792, + 111242, 94054, 126094, 0, 111244, 5709, 120689, 71076, 0, 0, 0, 0, 0, + 5708, 0, 0, 0, 5706, 66362, 5705, 8791, 41797, 0, 10237, 66436, 0, 0, 0, + 0, 128083, 13170, 0, 0, 0, 0, 41377, 0, 0, 10058, 125225, 0, 0, 0, 0, 0, + 0, 0, 129641, 119525, 0, 0, 72350, 0, 983572, 2144, 0, 120765, 0, 0, + 1754, 92226, 13246, 864, 0, 118926, 8972, 0, 7849, 0, 0, 13240, 0, 5192, + 0, 0, 10948, 0, 13199, 0, 1236, 13208, 13261, 13189, 13188, 93993, 0, + 7440, 0, 0, 0, 1844, 125229, 0, 13178, 0, 0, 0, 125230, 0, 0, 13260, + 4550, 121249, 125227, 0, 71071, 0, 0, 68523, 0, 0, 11354, 94071, 0, + 42795, 129317, 0, 0, 0, 125237, 0, 13194, 13274, 0, 0, 129533, 65586, + 68311, 0, 119193, 4601, 194661, 0, 194658, 0, 194659, 0, 121422, 128790, + 194657, 41717, 67402, 0, 121129, 41716, 127376, 7910, 0, 0, 754, 41944, + 0, 8183, 120741, 2037, 0, 0, 0, 125, 0, 0, 0, 983124, 127922, 41719, 0, + 7990, 12637, 13258, 9536, 71056, 0, 4427, 0, 71200, 0, 12217, 0, 41532, + 129315, 0, 0, 0, 0, 111063, 83349, 0, 0, 120622, 0, 0, 0, 0, 43632, 0, 0, + 8140, 0, 6260, 0, 0, 66765, 129657, 0, 3898, 0, 0, 13200, 0, 0, 66582, 0, + 0, 0, 0, 1068, 71178, 13259, 12945, 0, 42203, 0, 3124, 69411, 0, 4386, + 12224, 6973, 129563, 0, 0, 119535, 0, 121312, 0, 12232, 0, 0, 5681, + 64578, 75023, 0, 13209, 0, 0, 0, 0, 0, 11053, 0, 74902, 128107, 128942, + 7588, 0, 1693, 74942, 43204, 65831, 0, 0, 0, 68803, 111216, 111223, 0, 0, + 65685, 9523, 65070, 0, 0, 0, 0, 0, 0, 0, 0, 13191, 0, 3500, 3139, 100643, + 3170, 100645, 100644, 100647, 100646, 13006, 64433, 0, 100650, 941, 0, 0, + 120967, 3727, 0, 0, 0, 0, 0, 0, 0, 94039, 129299, 92455, 0, 0, 64444, 0, + 0, 43603, 94075, 65397, 288, 0, 0, 0, 10025, 73692, 0, 0, 68182, 0, 0, 0, 92438, 65395, 0, 0, 0, 65393, 83078, 121111, 0, 0, 0, 0, 0, 65394, 11548, 72305, 0, 65396, 0, 0, 13256, 1282, 0, 0, 0, 111085, 0, 0, 0, 111087, - 129641, 0, 0, 0, 0, 0, 3304, 0, 0, 0, 126595, 72437, 68353, 0, 0, 42113, + 72115, 0, 0, 0, 0, 0, 3304, 0, 0, 0, 126595, 72437, 68353, 0, 0, 42113, 0, 0, 0, 0, 0, 43094, 0, 0, 94037, 68317, 9035, 0, 0, 0, 0, 0, 70822, 128467, 164, 68309, 94067, 94000, 100631, 100634, 100633, 100636, 100635, 100638, 100637, 68808, 100639, 110665, 73893, 11099, 110664, 13175, 13207, 0, 127552, 0, 74643, 5929, 0, 0, 129192, 0, 11306, 0, 119059, - 3180, 125102, 0, 0, 0, 13062, 0, 0, 128707, 0, 0, 74428, 0, 128000, 0, - 11251, 70204, 0, 10045, 0, 13275, 0, 11057, 0, 13276, 125133, 41525, + 3180, 125102, 0, 0, 0, 13062, 0, 129551, 128707, 0, 0, 74428, 0, 128000, + 0, 11251, 70204, 0, 10045, 0, 13275, 0, 11057, 0, 13276, 125133, 41525, 983084, 128015, 11444, 0, 129158, 0, 0, 41523, 127765, 0, 0, 0, 0, 0, 0, 0, 3858, 0, 119573, 0, 0, 0, 0, 0, 0, 101014, 369, 74908, 41784, 0, 120994, 0, 71180, 0, 0, 13210, 41782, 0, 0, 0, 41781, 10486, 74058, @@ -26438,110 +27095,111 @@ static unsigned int code_hash[] = { 92902, 0, 13243, 13237, 12719, 0, 0, 0, 64884, 78043, 0, 0, 0, 0, 12014, 0, 120785, 0, 0, 13195, 41452, 64961, 41535, 0, 10459, 0, 124949, 0, 0, 0, 41533, 66337, 0, 92184, 0, 126091, 0, 0, 73849, 0, 43638, 0, 0, 6261, - 0, 0, 0, 1957, 0, 0, 0, 13292, 13206, 0, 0, 2925, 73809, 42576, 127559, - 13212, 43238, 0, 13190, 13187, 0, 13198, 0, 0, 5242, 0, 0, 128146, 0, 0, - 6770, 43331, 127539, 0, 0, 71074, 126466, 0, 41444, 0, 0, 64799, 5246, - 119106, 13185, 9709, 0, 0, 92751, 0, 5238, 0, 71085, 0, 5236, 40979, 0, - 74201, 8286, 0, 3936, 0, 11699, 0, 127249, 13235, 0, 41248, 0, 13245, - 13239, 0, 7969, 127266, 74832, 127251, 0, 120509, 0, 983874, 734, 127270, - 0, 127254, 70297, 127273, 64921, 120969, 66631, 41771, 120490, 0, 983171, - 41770, 1670, 42560, 0, 121349, 129634, 0, 41163, 0, 11136, 0, 11506, 0, - 42841, 13267, 126109, 0, 41775, 0, 7130, 41773, 0, 0, 0, 0, 0, 0, 0, - 42673, 65572, 0, 65250, 13265, 13264, 64518, 66798, 6100, 0, 0, 6740, - 71080, 67814, 12967, 70028, 68101, 4583, 0, 0, 68097, 0, 0, 0, 0, 119211, - 0, 0, 42653, 83181, 68102, 0, 7814, 71045, 0, 0, 0, 0, 0, 9756, 6985, 0, - 0, 74219, 0, 0, 129069, 124987, 5674, 0, 66421, 0, 5677, 5588, 0, 0, 0, - 0, 5673, 0, 5676, 0, 94048, 0, 5672, 6476, 0, 0, 0, 42511, 1727, 0, 0, 0, - 0, 0, 0, 0, 3550, 736, 0, 4505, 5873, 74090, 5826, 55232, 5813, 0, - 120712, 5841, 5837, 55234, 0, 3105, 64370, 5838, 5796, 0, 119592, 5793, - 0, 5866, 5797, 41011, 5865, 0, 0, 71899, 0, 71235, 5806, 0, 0, 9037, - 5671, 0, 0, 0, 0, 71266, 126616, 7296, 0, 0, 0, 0, 6980, 0, 0, 0, 0, 0, - 0, 0, 64613, 983891, 0, 0, 0, 0, 7114, 0, 129191, 43190, 93842, 128666, - 0, 42611, 42563, 0, 125080, 0, 6792, 43201, 0, 0, 128719, 0, 0, 0, 0, - 5644, 0, 66627, 69727, 0, 0, 0, 65116, 0, 0, 0, 0, 66410, 94104, 41013, - 0, 0, 0, 2869, 0, 41015, 0, 2785, 120616, 0, 73907, 0, 0, 0, 0, 194688, - 4759, 0, 0, 43192, 0, 1170, 43365, 69810, 73908, 0, 902, 0, 0, 0, 0, - 8122, 66420, 129642, 0, 3861, 0, 11028, 0, 73820, 5714, 0, 0, 0, 807, - 127001, 0, 0, 976, 113782, 0, 0, 0, 0, 0, 128657, 118801, 71043, 0, - 127017, 0, 0, 5582, 0, 0, 5798, 0, 0, 0, 128521, 0, 0, 68058, 120553, - 983183, 0, 0, 74933, 74283, 0, 0, 194698, 66044, 0, 0, 0, 0, 0, 10094, 0, - 0, 10857, 69225, 0, 0, 93, 0, 10954, 0, 0, 0, 8171, 0, 0, 82996, 0, 0, 0, - 119001, 92634, 0, 0, 5187, 120711, 71086, 0, 0, 0, 0, 5232, 0, 41009, 0, - 41005, 0, 43205, 0, 0, 0, 0, 0, 71054, 10028, 66478, 7076, 13182, 100385, - 0, 0, 0, 0, 7972, 0, 0, 0, 0, 78789, 11309, 3806, 73985, 0, 0, 0, 78819, - 0, 125218, 0, 127532, 0, 0, 0, 78817, 0, 64366, 65156, 8814, 0, 0, 0, 0, - 12836, 42725, 120079, 0, 0, 0, 0, 0, 13255, 0, 0, 7464, 0, 93831, 0, 0, - 0, 0, 13213, 0, 0, 64516, 0, 0, 0, 41007, 983910, 0, 40995, 12209, - 983914, 119136, 0, 0, 0, 0, 0, 0, 69384, 43558, 5522, 0, 71061, 0, 74105, - 3633, 983912, 119364, 41234, 41231, 0, 9771, 983917, 13251, 0, 0, 6262, - 2784, 0, 71078, 8126, 66483, 0, 0, 441, 0, 0, 0, 41002, 40999, 0, 0, - 7108, 0, 10890, 0, 74445, 8324, 0, 0, 74817, 2813, 119056, 74853, 983671, - 0, 0, 0, 1193, 10462, 65197, 13253, 13252, 7829, 120992, 0, 0, 0, 0, - 77911, 0, 77907, 0, 10386, 0, 41042, 0, 65944, 65683, 10338, 66469, 0, 0, - 0, 0, 0, 41966, 0, 0, 0, 68915, 0, 0, 911, 983870, 128932, 40963, 0, - 65159, 0, 0, 0, 5520, 0, 0, 0, 0, 0, 0, 0, 71081, 0, 0, 0, 0, 0, 983873, - 0, 0, 66839, 0, 0, 0, 68647, 0, 5857, 68135, 92727, 119120, 983675, - 13171, 0, 0, 0, 120338, 0, 0, 0, 13250, 69663, 0, 92201, 66397, 0, 0, 0, - 8761, 12942, 5748, 92713, 92414, 0, 83174, 8796, 0, 0, 0, 43633, 0, - 72805, 71073, 0, 0, 0, 0, 0, 12843, 4520, 0, 0, 73004, 983672, 0, 0, - 194935, 110754, 64345, 0, 0, 110752, 0, 0, 0, 110750, 110758, 0, 0, 0, - 10427, 0, 73859, 0, 9755, 1110, 65239, 0, 0, 0, 0, 0, 0, 0, 194936, 0, - 983802, 0, 70437, 3620, 0, 0, 72855, 0, 0, 0, 74250, 0, 0, 11980, 0, - 66482, 67823, 0, 128345, 110768, 0, 0, 0, 0, 12891, 983767, 983648, 0, - 2016, 0, 65668, 92311, 67696, 10366, 70117, 9155, 120652, 9786, 65082, 0, - 8579, 0, 0, 0, 0, 4508, 64883, 0, 0, 0, 0, 64592, 74276, 67688, 0, 0, 0, - 69456, 0, 113821, 0, 12147, 9024, 66378, 66472, 0, 0, 0, 0, 0, 71935, 0, - 0, 113697, 0, 0, 0, 0, 74275, 0, 122896, 127941, 41214, 0, 0, 0, 0, 0, - 7773, 0, 0, 9963, 68649, 0, 73734, 0, 0, 0, 0, 6594, 983752, 0, 0, 3624, - 70342, 0, 64655, 121481, 0, 0, 0, 0, 0, 65932, 0, 0, 6803, 120968, 7738, - 0, 0, 120628, 0, 66614, 122921, 0, 43810, 7029, 0, 41292, 118898, 0, - 43115, 9517, 11518, 0, 0, 0, 0, 64423, 0, 0, 0, 12503, 9591, 4516, 0, - 118845, 0, 0, 0, 43650, 983192, 0, 0, 0, 68079, 0, 11397, 2884, 0, 0, - 12678, 0, 0, 41014, 73730, 917539, 4270, 92254, 127836, 68205, 6633, - 118947, 0, 5230, 101055, 0, 0, 983230, 121392, 0, 92985, 0, 0, 0, 0, 415, - 0, 0, 0, 0, 5183, 1877, 0, 0, 0, 0, 0, 4472, 0, 0, 0, 128285, 110682, - 78230, 4756, 0, 7081, 0, 0, 0, 78606, 0, 42922, 42103, 8628, 74861, 0, 0, - 0, 43059, 10539, 0, 0, 0, 0, 0, 0, 0, 0, 64873, 11992, 0, 0, 0, 11801, - 3622, 0, 0, 983213, 0, 0, 11521, 0, 1966, 43628, 111048, 0, 0, 0, 0, 0, - 0, 42098, 66671, 10694, 128520, 0, 0, 0, 0, 42100, 0, 111040, 0, 42097, - 0, 0, 0, 0, 11302, 120893, 129145, 43395, 83259, 0, 0, 92351, 0, 0, - 11299, 1561, 0, 92359, 92725, 93021, 0, 194733, 0, 0, 0, 127893, 11280, - 0, 0, 983783, 0, 0, 72760, 0, 12486, 65018, 66516, 5409, 0, 0, 194720, - 5399, 9685, 0, 983694, 5401, 0, 0, 66832, 0, 0, 5405, 0, 0, 0, 0, 0, - 2235, 0, 11330, 983692, 64690, 3254, 0, 0, 0, 0, 43678, 0, 0, 983145, 0, - 6388, 3355, 0, 9867, 0, 55258, 5611, 0, 128527, 0, 0, 129181, 0, 78228, - 0, 0, 119119, 0, 0, 194959, 0, 0, 1379, 246, 0, 0, 64736, 0, 0, 0, - 121227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10656, 0, 65214, 119242, 0, 0, - 13163, 0, 120831, 0, 0, 0, 0, 0, 0, 0, 0, 4755, 0, 127879, 11443, 0, 0, - 0, 608, 600, 0, 8580, 128712, 0, 43635, 0, 0, 74485, 43808, 0, 0, 0, - 13160, 0, 129418, 42268, 128006, 70505, 9828, 0, 0, 0, 0, 9351, 7778, 0, - 0, 0, 6916, 1208, 0, 0, 194754, 0, 0, 0, 0, 0, 83318, 83317, 0, 43539, 0, - 0, 0, 0, 0, 9150, 66831, 0, 128322, 0, 66848, 0, 0, 12166, 128492, - 194685, 0, 2546, 0, 213, 0, 65611, 83316, 0, 0, 74310, 70836, 0, 65285, - 5452, 0, 0, 92772, 0, 0, 0, 0, 65518, 129029, 12609, 194679, 125255, 0, - 0, 0, 0, 74638, 194677, 125190, 4143, 110854, 110855, 65748, 4141, 9682, - 110851, 118790, 194674, 0, 0, 8725, 0, 66638, 0, 42263, 4145, 6380, 0, - 66613, 0, 119207, 0, 0, 9550, 100621, 0, 100623, 100622, 100625, 100624, - 65753, 100626, 65756, 72731, 0, 100630, 0, 0, 0, 0, 9657, 9019, 121154, - 0, 0, 5390, 0, 0, 194965, 0, 194964, 0, 6328, 0, 0, 0, 0, 0, 983047, 0, - 5235, 803, 0, 0, 0, 127979, 43838, 0, 119562, 43544, 0, 0, 0, 0, 0, - 70426, 9107, 5191, 119113, 0, 0, 0, 121099, 0, 0, 0, 0, 0, 128150, - 983067, 0, 7289, 74055, 0, 0, 0, 0, 0, 0, 0, 1784, 124947, 0, 0, 0, 0, - 64868, 0, 13158, 0, 7211, 0, 9371, 129378, 0, 0, 1625, 7664, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4482, 118886, 0, 0, 0, 0, 0, 0, 0, 100612, 66849, - 100614, 100613, 100616, 444, 100618, 100617, 100620, 100619, 0, 0, 0, - 11349, 40991, 0, 0, 129324, 0, 0, 1197, 0, 40993, 0, 0, 0, 40990, 43765, - 0, 3492, 0, 127942, 0, 0, 100592, 100591, 100594, 19948, 100596, 3099, - 92239, 100597, 100600, 100599, 0, 129042, 0, 0, 100601, 194969, 100603, - 8152, 100605, 100604, 100607, 100606, 100609, 12828, 0, 75015, 0, 0, 0, - 0, 0, 75068, 127507, 0, 92680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 100581, 0, 100583, 100582, 100585, 100584, 100587, 100586, 100589, 7576, - 11995, 100590, 43260, 0, 0, 64830, 0, 125046, 0, 0, 43979, 8870, 0, 0, - 42357, 0, 0, 12822, 0, 0, 0, 118944, 0, 0, 42637, 0, 0, 70725, 0, 194748, - 0, 71344, 0, 0, 0, 194749, 7170, 9596, 8277, 194743, 43629, 110610, 0, 0, - 983567, 128691, 0, 66699, 64440, 0, 0, 0, 43234, 66008, 12627, 0, 0, 0, - 43619, 43303, 11300, 0, 0, 8745, 0, 7558, 71342, 100570, 0, 0, 127881, - 3461, 121258, 0, 0, 0, 0, 0, 73877, 74335, 124982, 0, 0, 0, 64620, 74762, + 0, 129568, 0, 1957, 0, 0, 0, 13292, 13206, 0, 0, 2925, 73809, 42576, + 127559, 13212, 43238, 0, 13190, 13187, 0, 13198, 0, 0, 5242, 0, 0, + 128146, 0, 0, 6770, 43331, 127539, 0, 0, 71074, 126466, 0, 41444, 0, 0, + 64799, 5246, 119106, 13185, 9709, 0, 0, 92751, 0, 5238, 0, 71085, 0, + 5236, 40979, 0, 74201, 8286, 0, 3936, 0, 11699, 0, 127249, 13235, 0, + 41248, 127264, 13245, 13239, 0, 7969, 127266, 74832, 127251, 0, 120509, + 0, 983874, 734, 127270, 0, 127254, 70297, 127273, 64921, 120969, 66631, + 41771, 120490, 0, 983171, 41770, 1670, 42560, 0, 121349, 129634, 0, + 41163, 0, 11136, 0, 11506, 0, 42841, 13267, 126109, 0, 41775, 0, 7130, + 41773, 0, 0, 0, 0, 0, 0, 0, 42673, 65572, 0, 65250, 13265, 13264, 64518, + 66798, 6100, 0, 0, 6740, 71080, 67814, 12967, 70028, 68101, 4583, 0, 0, + 68097, 0, 0, 0, 0, 119211, 0, 0, 42653, 83181, 68102, 0, 7814, 71045, 0, + 73702, 0, 0, 0, 9756, 6985, 0, 0, 74219, 0, 0, 129069, 124987, 5674, 0, + 66421, 0, 5677, 5588, 0, 0, 0, 0, 5673, 0, 5676, 0, 94048, 0, 5672, 6476, + 0, 0, 110951, 42511, 1727, 0, 0, 0, 0, 0, 0, 0, 3550, 736, 0, 4505, 5873, + 74090, 5826, 55232, 5813, 0, 120712, 5841, 5837, 55234, 0, 3105, 64370, + 5838, 5796, 0, 119592, 5793, 0, 5866, 5797, 41011, 5865, 0, 0, 71899, 0, + 71235, 5806, 0, 0, 9037, 5671, 0, 0, 0, 0, 71266, 126616, 7296, 0, 0, 0, + 0, 6980, 0, 72108, 0, 0, 0, 0, 0, 64613, 983891, 0, 0, 0, 0, 7114, 0, + 72100, 43190, 93842, 128666, 72096, 42611, 42563, 0, 125080, 0, 6792, + 43201, 72098, 0, 128719, 0, 72106, 0, 0, 5644, 0, 66627, 69727, 0, 0, 0, + 65116, 0, 0, 0, 0, 66410, 94104, 41013, 0, 0, 0, 2869, 0, 41015, 0, 2785, + 120616, 0, 73907, 194689, 0, 0, 0, 194688, 4759, 0, 0, 43192, 0, 1170, + 43365, 69810, 73908, 0, 902, 0, 0, 0, 0, 8122, 66420, 129642, 0, 3861, 0, + 11028, 0, 73820, 5714, 0, 0, 0, 807, 127001, 0, 0, 976, 113782, 0, 0, 0, + 0, 0, 128657, 118801, 71043, 0, 127017, 0, 0, 5582, 0, 0, 5798, 0, 0, 0, + 128521, 0, 0, 68058, 120553, 983183, 0, 0, 74933, 74283, 0, 0, 194698, + 66044, 0, 0, 0, 0, 0, 10094, 0, 0, 10857, 69225, 0, 0, 93, 0, 10954, 0, + 0, 0, 8171, 0, 0, 82996, 0, 0, 0, 119001, 92634, 0, 0, 5187, 120711, + 71086, 0, 0, 0, 0, 5232, 0, 41009, 0, 41005, 0, 43205, 0, 0, 0, 194708, + 0, 71054, 10028, 66478, 7076, 13182, 100385, 0, 0, 0, 0, 7972, 78786, 0, + 0, 0, 78789, 11309, 3806, 73985, 0, 0, 0, 78819, 0, 125218, 0, 127532, 0, + 0, 0, 78817, 0, 64366, 65156, 8814, 0, 0, 0, 0, 12836, 42725, 120079, 0, + 0, 0, 0, 0, 13255, 0, 0, 7464, 0, 93831, 0, 0, 0, 0, 13213, 0, 0, 64516, + 0, 0, 0, 41007, 983910, 0, 40995, 12209, 983914, 119136, 123635, 0, 0, 0, + 0, 0, 69384, 43558, 5522, 0, 71061, 0, 74105, 3633, 983912, 119364, + 41234, 41231, 0, 9771, 983917, 13251, 0, 0, 6262, 2784, 0, 71078, 8126, + 66483, 0, 0, 441, 0, 0, 0, 41002, 40999, 0, 0, 7108, 0, 10890, 0, 74445, + 8324, 0, 0, 74817, 2813, 119056, 74853, 983671, 0, 0, 0, 1193, 10462, + 65197, 13253, 13252, 7829, 120992, 0, 0, 0, 0, 77911, 0, 77907, 0, 10386, + 0, 41042, 0, 65944, 65683, 10338, 66469, 0, 0, 0, 0, 0, 41966, 0, 0, 0, + 68915, 0, 0, 911, 983870, 128932, 40963, 0, 65159, 0, 0, 0, 5520, 0, 0, + 0, 0, 0, 0, 0, 71081, 0, 0, 0, 0, 0, 983873, 0, 0, 66839, 0, 0, 0, 68647, + 0, 5857, 68135, 92727, 119120, 983675, 13171, 0, 0, 0, 120338, 0, 0, 0, + 13250, 69663, 0, 92201, 66397, 0, 0, 0, 8761, 12942, 5748, 92713, 92414, + 0, 83174, 8796, 0, 0, 0, 43633, 0, 72805, 71073, 0, 0, 0, 0, 0, 12843, + 4520, 0, 0, 73004, 983672, 0, 0, 194935, 110754, 64345, 0, 0, 110752, 0, + 0, 0, 110750, 110758, 110751, 0, 0, 10427, 0, 73859, 0, 9755, 1110, + 65239, 0, 0, 0, 0, 0, 0, 0, 194936, 0, 983802, 0, 70437, 3620, 0, 0, + 72855, 0, 0, 0, 74250, 0, 0, 11980, 0, 66482, 67823, 0, 128345, 110768, + 0, 0, 0, 0, 12891, 983767, 983648, 0, 2016, 0, 65668, 92311, 67696, + 10366, 70117, 9155, 120652, 9786, 65082, 0, 8579, 0, 0, 0, 0, 4508, + 64883, 0, 92522, 0, 0, 64592, 74276, 67688, 0, 0, 0, 69456, 0, 113821, 0, + 12147, 9024, 66378, 66472, 0, 0, 0, 0, 0, 71935, 0, 0, 113697, 0, 0, 0, + 0, 74275, 0, 122896, 127941, 41214, 0, 0, 0, 0, 0, 7773, 0, 0, 9963, + 68649, 0, 73734, 0, 0, 0, 0, 6594, 983752, 0, 0, 3624, 70342, 0, 64655, + 121481, 0, 0, 0, 0, 0, 65932, 0, 983790, 6803, 120968, 7738, 0, 0, + 120628, 0, 66614, 122921, 0, 43810, 7029, 0, 41292, 118898, 0, 43115, + 9517, 11518, 0, 0, 0, 0, 64423, 0, 0, 0, 12503, 9591, 4516, 0, 118845, 0, + 0, 129479, 43650, 983192, 0, 0, 0, 68079, 0, 11397, 2884, 0, 0, 12678, 0, + 0, 41014, 73730, 917539, 4270, 92254, 127836, 68205, 6633, 118947, 0, + 5230, 101055, 0, 0, 983230, 121392, 0, 92985, 0, 0, 0, 0, 415, 0, 0, 0, + 0, 5183, 1877, 0, 0, 0, 0, 0, 4472, 0, 0, 0, 128285, 110682, 78230, 4756, + 0, 7081, 0, 0, 0, 78606, 0, 42922, 42103, 8628, 74861, 0, 0, 0, 43059, + 10539, 0, 0, 0, 0, 0, 0, 0, 0, 64873, 11992, 0, 0, 0, 11801, 3622, 0, 0, + 983213, 0, 0, 11521, 0, 1966, 43628, 111048, 0, 0, 0, 0, 0, 0, 42098, + 66671, 10694, 128520, 0, 0, 0, 0, 42100, 0, 111040, 0, 42097, 0, 0, 0, 0, + 11302, 120893, 129145, 43395, 83259, 0, 0, 92351, 0, 0, 11299, 1561, 0, + 92359, 92725, 93021, 0, 194733, 0, 0, 0, 127893, 11280, 0, 0, 983783, 0, + 0, 72760, 0, 12486, 65018, 66516, 5409, 0, 0, 194720, 5399, 9685, 0, + 983694, 5401, 0, 0, 66832, 0, 0, 5405, 0, 0, 0, 0, 0, 2235, 0, 11330, + 983692, 64690, 3254, 0, 0, 0, 0, 43678, 0, 0, 983145, 0, 6388, 3355, 0, + 9867, 0, 55258, 5611, 0, 128527, 0, 0, 129181, 0, 78228, 0, 0, 119119, 0, + 0, 194959, 0, 0, 1379, 246, 0, 0, 64736, 0, 0, 0, 121227, 0, 0, 0, 0, 0, + 0, 11855, 0, 0, 0, 0, 10656, 0, 65214, 119242, 0, 0, 13163, 0, 120831, 0, + 0, 0, 0, 0, 0, 0, 0, 4755, 0, 127879, 11443, 0, 0, 0, 608, 600, 0, 8580, + 128712, 0, 43635, 0, 0, 74485, 43808, 0, 0, 0, 13160, 0, 129418, 42268, + 128006, 70505, 9828, 0, 0, 0, 0, 9351, 7778, 0, 0, 0, 6916, 1208, 0, 0, + 194754, 0, 0, 0, 0, 0, 83318, 83317, 0, 43539, 0, 0, 0, 0, 0, 9150, + 66831, 0, 128322, 0, 66848, 0, 0, 12166, 128492, 194685, 0, 2546, 0, 213, + 0, 65611, 83316, 0, 0, 74310, 70836, 0, 65285, 5452, 0, 0, 92772, 0, 0, + 0, 0, 65518, 129029, 12609, 194679, 125255, 123193, 0, 0, 0, 74638, + 194677, 125190, 4143, 110854, 110855, 65748, 4141, 9682, 110851, 118790, + 194674, 0, 0, 8725, 0, 66638, 0, 42263, 4145, 6380, 0, 66613, 0, 119207, + 0, 0, 9550, 100621, 0, 100623, 100622, 78050, 100624, 65753, 100626, + 65756, 72731, 0, 100630, 0, 0, 0, 0, 9657, 9019, 121154, 0, 0, 5390, 0, + 0, 194965, 72144, 194964, 0, 6328, 0, 0, 0, 0, 0, 983047, 0, 5235, 803, + 0, 0, 0, 127979, 43838, 0, 119562, 43544, 0, 0, 0, 0, 0, 70426, 9107, + 5191, 119113, 0, 0, 0, 121099, 0, 0, 0, 0, 0, 128150, 983067, 0, 7289, + 74055, 0, 0, 0, 0, 0, 0, 0, 1784, 124947, 0, 0, 0, 0, 64868, 0, 13158, 0, + 7211, 0, 9371, 129378, 0, 0, 1625, 7664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4482, 118886, 0, 0, 0, 0, 0, 0, 0, 100612, 66849, 100614, 100613, 100616, + 444, 100618, 100617, 100620, 100619, 0, 0, 0, 11349, 40991, 0, 0, 129324, + 0, 0, 1197, 0, 40993, 0, 0, 0, 40990, 43765, 0, 3492, 0, 127942, 0, 0, + 100592, 100591, 100594, 19948, 100596, 3099, 92239, 100597, 100600, + 100599, 0, 129042, 0, 0, 100601, 194969, 100603, 8152, 100605, 100604, + 100607, 100606, 100609, 12828, 0, 75015, 0, 0, 0, 0, 0, 75068, 127507, 0, + 92680, 0, 0, 0, 0, 0, 0, 0, 118820, 0, 0, 0, 0, 0, 100581, 0, 100583, + 100582, 100585, 100584, 100587, 100586, 100589, 7576, 11995, 100590, + 43260, 0, 0, 64830, 0, 125046, 0, 0, 43979, 8870, 0, 0, 42357, 0, 0, + 12822, 0, 0, 0, 118944, 0, 0, 42637, 0, 0, 70725, 0, 194748, 0, 71344, 0, + 0, 0, 194749, 7170, 9596, 8277, 194743, 43629, 110610, 0, 0, 983567, + 128691, 0, 66699, 64440, 0, 0, 0, 43234, 66008, 12627, 0, 0, 0, 43619, + 43303, 11300, 0, 0, 8745, 0, 7558, 71342, 100570, 0, 0, 127881, 3461, + 121258, 129471, 0, 0, 0, 0, 73877, 74335, 124982, 0, 0, 0, 64620, 74762, 12069, 10838, 92548, 43616, 0, 10061, 0, 125057, 10508, 209, 0, 43193, 120581, 0, 0, 128049, 0, 10899, 69855, 100571, 100574, 100573, 100576, 993, 100578, 100577, 100580, 100579, 100560, 100559, 7232, 0, 0, 0, 0, 0, @@ -26594,105 +27252,106 @@ static unsigned int code_hash[] = { 55263, 3386, 70730, 42574, 0, 5115, 5394, 0, 128756, 5113, 0, 64855, 0, 4425, 0, 0, 0, 43967, 0, 0, 0, 5112, 12173, 127037, 0, 0, 74998, 0, 0, 0, 0, 0, 64874, 43964, 1587, 0, 0, 0, 0, 1369, 917931, 9959, 0, 43963, 4560, - 0, 0, 0, 0, 0, 0, 43961, 42601, 4514, 0, 0, 0, 0, 65041, 10965, 120905, - 0, 0, 12542, 0, 65341, 0, 65829, 0, 0, 10475, 0, 0, 0, 0, 11795, 0, 0, 0, - 127102, 127101, 74956, 7099, 11275, 67681, 127096, 0, 9336, 0, 42626, - 43966, 7798, 64474, 64259, 0, 5730, 119809, 43018, 0, 93796, 0, 0, 0, - 69401, 0, 0, 5127, 11285, 0, 5495, 4273, 0, 74765, 10849, 6346, 5493, + 0, 0, 0, 0, 0, 0, 43961, 42601, 4514, 72149, 0, 0, 0, 65041, 10965, + 120905, 0, 0, 12542, 0, 65341, 0, 65829, 0, 0, 10475, 0, 0, 0, 0, 11795, + 0, 0, 0, 127102, 127101, 74956, 7099, 11275, 67681, 127096, 0, 9336, 0, + 42626, 43966, 7798, 64474, 64259, 0, 5730, 119809, 43018, 0, 93796, 0, 0, + 0, 69401, 0, 0, 5127, 11285, 0, 5495, 4273, 0, 74765, 10849, 6346, 5493, 6342, 68636, 74319, 5492, 0, 0, 169, 5497, 125053, 0, 0, 68198, 0, 0, 128417, 0, 0, 12738, 0, 983076, 5321, 0, 0, 0, 5323, 120732, 9773, - 125209, 4683, 74318, 0, 68823, 0, 0, 0, 0, 0, 0, 0, 0, 0, 834, 0, 1803, - 0, 5733, 0, 0, 71312, 5731, 1381, 2891, 0, 0, 0, 64525, 0, 2881, 92996, - 93847, 9601, 2879, 0, 0, 73129, 5729, 0, 0, 0, 64881, 127905, 9361, 0, - 2887, 0, 3526, 6298, 0, 0, 0, 0, 0, 8572, 127863, 77896, 0, 71174, 0, 0, - 71197, 0, 12096, 0, 0, 0, 110745, 71176, 110746, 65279, 0, 121236, 5734, - 0, 0, 0, 0, 0, 41641, 12717, 0, 12552, 983615, 66713, 0, 0, 41643, - 110747, 0, 8713, 41640, 78657, 41645, 66712, 125196, 0, 66726, 66711, 0, - 93994, 0, 3472, 64863, 0, 121424, 0, 0, 0, 125203, 67837, 0, 0, 0, 0, 0, - 0, 121440, 0, 0, 129461, 119008, 92402, 65017, 0, 0, 66668, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121043, 66471, 12216, 0, 40988, 0, - 0, 0, 0, 0, 2396, 129078, 0, 0, 0, 64940, 0, 8321, 119823, 128165, - 100409, 83299, 996, 0, 0, 4249, 0, 83294, 92535, 8222, 0, 118875, 71213, - 0, 0, 0, 0, 8534, 72844, 40983, 0, 125195, 0, 12551, 73960, 125193, - 74469, 12558, 121039, 0, 10052, 40982, 129371, 0, 0, 0, 127403, 0, - 917559, 0, 0, 1563, 0, 0, 19911, 0, 0, 0, 71363, 0, 7797, 78708, 10006, - 0, 3308, 119134, 74940, 0, 0, 78488, 0, 0, 0, 0, 0, 128462, 9200, 10046, - 9612, 0, 8218, 66496, 0, 43742, 78489, 0, 0, 0, 0, 67826, 0, 70056, 508, - 128585, 0, 126539, 0, 0, 0, 0, 0, 0, 0, 124950, 0, 0, 0, 0, 0, 0, 6659, - 0, 0, 0, 0, 0, 0, 41634, 0, 41639, 71169, 11941, 0, 0, 0, 42180, 68505, - 43753, 3249, 41637, 93982, 12328, 501, 93985, 10601, 0, 6503, 0, 92192, - 0, 71181, 0, 6505, 74010, 0, 13064, 126112, 121105, 6500, 5526, 0, 0, 0, - 0, 92376, 0, 9678, 120832, 0, 41706, 0, 0, 0, 8936, 92964, 119123, 4208, - 0, 0, 0, 67742, 0, 74379, 128605, 0, 0, 92422, 983109, 0, 66475, 0, 5027, - 0, 0, 0, 5069, 0, 5028, 0, 0, 0, 5026, 0, 0, 6331, 0, 0, 0, 0, 41076, 0, - 74790, 0, 0, 0, 0, 5029, 0, 5317, 3598, 0, 41070, 92166, 11185, 6663, 0, - 6507, 0, 126079, 0, 1716, 983691, 0, 917824, 620, 41001, 0, 917823, - 43758, 0, 71116, 5024, 0, 41003, 0, 5025, 7297, 0, 75039, 0, 119328, - 65557, 0, 0, 983599, 0, 0, 0, 0, 43947, 43946, 0, 0, 128363, 6105, 0, - 119325, 983226, 0, 68203, 43945, 66491, 43939, 0, 68144, 78718, 2301, 0, - 0, 66490, 6979, 0, 7721, 0, 0, 1592, 0, 0, 121096, 41048, 129358, 829, 0, - 92406, 0, 120247, 0, 41056, 0, 0, 10953, 41066, 0, 917813, 482, 0, 0, 0, - 43606, 71185, 0, 0, 0, 72262, 110863, 72421, 12050, 0, 5315, 917817, 0, - 0, 42061, 917816, 0, 0, 68417, 917815, 0, 0, 42059, 0, 0, 120723, 42058, - 3960, 11043, 11337, 121358, 0, 0, 3958, 0, 0, 917818, 0, 917819, 0, 0, - 42064, 11959, 983695, 0, 0, 0, 0, 0, 64336, 10478, 92629, 70350, 120704, - 0, 0, 42437, 1555, 0, 8691, 0, 2215, 41662, 119046, 0, 0, 0, 93952, 0, - 66481, 41664, 0, 42578, 0, 41661, 78715, 78714, 9356, 0, 0, 0, 1286, - 110701, 0, 0, 983206, 128925, 42476, 0, 11156, 0, 0, 0, 0, 0, 0, 10020, - 43359, 72827, 0, 120946, 41627, 0, 11979, 0, 41628, 533, 11931, 65225, 0, - 125122, 0, 0, 68118, 0, 4377, 0, 0, 8587, 0, 13193, 64350, 68233, 0, - 41924, 0, 7735, 0, 127585, 120843, 0, 65820, 0, 0, 43461, 7757, 0, 0, - 43787, 66493, 77943, 4168, 43904, 120236, 0, 0, 121072, 4440, 43902, - 77948, 66837, 77946, 43903, 77944, 77945, 0, 120909, 120826, 120226, - 66492, 43901, 64625, 0, 0, 0, 0, 10013, 64434, 0, 983112, 0, 11782, - 64382, 0, 0, 0, 0, 41630, 630, 120960, 0, 0, 70165, 1043, 93017, 0, 0, 0, - 124945, 313, 0, 0, 0, 65593, 7445, 43906, 5750, 42258, 0, 55222, 68222, - 11268, 11225, 0, 8526, 0, 0, 43894, 66495, 69990, 0, 92990, 0, 10707, - 7863, 0, 0, 70692, 631, 77952, 77953, 66443, 71171, 83313, 0, 0, 0, - 13305, 77961, 43925, 43924, 77956, 77957, 66903, 66328, 42381, 77962, 0, - 0, 0, 0, 0, 0, 43899, 66821, 77967, 9157, 77965, 77966, 77963, 77964, 0, - 0, 180, 73904, 0, 0, 66494, 12674, 43896, 0, 0, 43890, 43897, 0, 11535, - 0, 66769, 5185, 7165, 5521, 10334, 5519, 71329, 10302, 12351, 83333, - 1027, 5181, 0, 5117, 0, 5179, 73955, 6845, 991, 5189, 43676, 41647, 0, - 73883, 92571, 77979, 3405, 0, 0, 5523, 43915, 66487, 92459, 74943, 9549, - 0, 125093, 43923, 0, 43682, 74884, 120537, 0, 43921, 0, 71184, 0, 43922, - 128709, 0, 10414, 9846, 0, 10350, 0, 43918, 77981, 75075, 77978, 77980, - 66485, 77977, 77973, 77974, 78057, 43909, 73983, 12330, 0, 0, 0, 43910, - 0, 3407, 6293, 0, 68149, 43908, 129060, 0, 10209, 0, 4195, 0, 9010, - 983686, 75072, 6332, 0, 0, 65871, 0, 1736, 0, 3901, 0, 0, 65890, 128801, - 10446, 0, 693, 9130, 314, 78119, 64149, 0, 0, 0, 11026, 0, 5332, 6940, 0, - 0, 127007, 119831, 0, 273, 8165, 0, 83307, 0, 0, 12824, 43911, 4528, - 5320, 6301, 43662, 6133, 0, 9463, 73738, 127141, 10922, 121069, 0, 0, 0, - 0, 0, 2569, 0, 2326, 0, 2565, 0, 66401, 0, 0, 0, 0, 41848, 2567, 78620, - 121145, 4044, 92646, 0, 12233, 0, 9509, 0, 0, 127158, 7336, 0, 0, 0, 0, - 0, 67235, 0, 0, 0, 0, 2222, 66499, 0, 127170, 0, 10895, 0, 274, 983763, - 1858, 0, 67849, 55251, 0, 3133, 0, 71857, 0, 9610, 0, 8197, 0, 0, 0, - 41665, 5868, 0, 0, 0, 0, 19940, 43668, 41667, 0, 0, 1923, 0, 0, 0, 0, 0, - 0, 0, 0, 6464, 92750, 2996, 125221, 0, 68481, 41835, 4047, 41842, 0, 0, - 0, 0, 0, 0, 0, 293, 0, 0, 64791, 41827, 0, 0, 10579, 8560, 0, 0, 118835, - 4803, 73805, 1739, 0, 3900, 128967, 73737, 0, 0, 73957, 0, 66474, 41971, - 0, 0, 0, 0, 0, 11716, 66473, 0, 121071, 0, 128080, 0, 0, 0, 0, 0, 0, 0, - 6632, 73861, 0, 74770, 0, 0, 8914, 0, 0, 3183, 1435, 0, 0, 0, 0, 0, 0, - 5746, 67392, 0, 0, 0, 83506, 0, 7082, 71481, 12618, 5059, 983597, 83524, - 43604, 0, 0, 0, 0, 0, 0, 8227, 0, 1218, 0, 64416, 65848, 92884, 0, 0, 0, - 126987, 0, 0, 0, 0, 0, 0, 83515, 83507, 0, 0, 42672, 71194, 43224, 0, 0, - 0, 0, 0, 0, 0, 65905, 0, 42662, 0, 121159, 0, 0, 0, 7794, 0, 0, 6377, 0, - 126080, 3669, 3968, 0, 71319, 69658, 0, 0, 66296, 0, 0, 0, 0, 124998, - 6699, 126120, 0, 0, 66678, 0, 0, 0, 8409, 119527, 19967, 0, 0, 9502, 0, - 0, 6115, 0, 41654, 0, 0, 0, 41655, 113779, 43975, 72427, 0, 0, 0, 0, - 41657, 10778, 0, 9533, 184, 1553, 128868, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 125209, 4683, 74318, 0, 68823, 0, 0, 0, 0, 129553, 0, 0, 0, 0, 834, 0, + 1803, 0, 5733, 0, 0, 71312, 5731, 1381, 2891, 0, 0, 0, 64525, 0, 2881, + 92996, 93847, 9601, 2879, 0, 0, 73129, 5729, 0, 0, 0, 64881, 127905, + 9361, 0, 2887, 0, 3526, 6298, 0, 0, 0, 0, 0, 8572, 127863, 77896, 0, + 71174, 0, 0, 71197, 0, 12096, 0, 0, 0, 110745, 71176, 110746, 65279, 0, + 121236, 5734, 0, 0, 0, 0, 0, 41641, 12717, 0, 12552, 983615, 66713, 0, 0, + 41643, 110747, 0, 8713, 41640, 78657, 41645, 66712, 125196, 0, 66726, + 66711, 0, 93994, 0, 3472, 64863, 0, 121424, 0, 0, 0, 125203, 67837, 0, 0, + 0, 0, 0, 0, 121440, 0, 0, 129461, 119008, 92402, 65017, 0, 0, 66668, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121043, 66471, 12216, 0, + 40988, 0, 0, 0, 0, 0, 2396, 129078, 0, 0, 0, 64940, 0, 8321, 119823, + 128165, 100409, 83299, 996, 0, 0, 4249, 0, 83294, 92535, 8222, 0, 118875, + 71213, 0, 0, 0, 0, 8534, 72844, 40983, 0, 125195, 0, 12551, 73960, + 125193, 74469, 12558, 121039, 0, 10052, 40982, 129371, 0, 0, 0, 127403, + 0, 917559, 0, 0, 1563, 0, 0, 19911, 0, 0, 0, 71363, 0, 7797, 78708, + 10006, 0, 3308, 119134, 74940, 0, 0, 78488, 0, 0, 0, 0, 0, 128462, 9200, + 10046, 9612, 0, 8218, 66496, 0, 43742, 78489, 0, 0, 0, 0, 67826, 0, + 70056, 508, 128585, 0, 126539, 0, 0, 0, 0, 0, 0, 0, 124950, 0, 0, 0, 0, + 0, 0, 6659, 0, 0, 0, 0, 0, 0, 41634, 0, 41639, 71169, 11941, 0, 0, 0, + 42180, 68505, 43753, 3249, 41637, 93982, 12328, 501, 93985, 10601, 0, + 6503, 0, 92192, 0, 71181, 0, 6505, 74010, 0, 13064, 126112, 121105, 6500, + 5526, 0, 0, 0, 0, 92376, 0, 9678, 120832, 0, 41706, 0, 0, 0, 8936, 92964, + 119123, 4208, 0, 0, 0, 67742, 0, 74379, 128605, 0, 0, 92422, 983109, 0, + 66475, 0, 5027, 0, 0, 0, 5069, 0, 5028, 0, 0, 0, 5026, 0, 0, 6331, 0, 0, + 0, 0, 41076, 0, 74790, 0, 0, 0, 0, 5029, 0, 5317, 3598, 0, 41070, 92166, + 11185, 6663, 0, 6507, 0, 126079, 0, 1716, 983691, 0, 917824, 620, 41001, + 0, 917823, 43758, 0, 71116, 5024, 0, 41003, 0, 5025, 7297, 0, 75039, 0, + 119328, 65557, 0, 0, 983599, 0, 0, 0, 0, 43947, 43946, 0, 0, 128363, + 6105, 0, 119325, 983226, 0, 68203, 43945, 66491, 43939, 0, 68144, 78718, + 2301, 0, 0, 66490, 6979, 0, 7721, 0, 0, 1592, 0, 0, 121096, 41048, + 129358, 829, 0, 92406, 0, 120247, 0, 41056, 0, 0, 10953, 41066, 0, + 917813, 482, 0, 0, 0, 43606, 71185, 0, 0, 0, 72262, 110863, 72421, 12050, + 0, 5315, 917817, 0, 0, 42061, 917816, 0, 0, 68417, 917815, 0, 0, 42059, + 0, 0, 120723, 42058, 3960, 11043, 11337, 121358, 0, 0, 3958, 0, 0, + 917818, 0, 917819, 0, 0, 42064, 11959, 983695, 0, 0, 0, 0, 128498, 64336, + 10478, 92629, 70350, 120704, 0, 0, 42437, 1555, 0, 8691, 129656, 2215, + 41662, 119046, 0, 0, 0, 93952, 0, 66481, 41664, 0, 42578, 0, 41661, + 78715, 78714, 9356, 0, 129544, 0, 1286, 110701, 0, 0, 983206, 128925, + 42476, 0, 11156, 0, 0, 0, 0, 72123, 0, 10020, 43359, 72827, 0, 120946, + 41627, 0, 11979, 0, 41628, 533, 11931, 65225, 0, 125122, 0, 0, 68118, 0, + 4377, 0, 0, 8587, 72097, 13193, 64350, 68233, 0, 41924, 0, 7735, 0, + 127585, 120843, 0, 65820, 0, 0, 43461, 7757, 0, 0, 43787, 66493, 77943, + 4168, 43904, 73952, 0, 0, 121072, 4440, 43902, 77948, 66837, 77946, + 43903, 77944, 77945, 0, 120909, 120826, 120226, 66492, 43901, 64625, 0, + 0, 0, 0, 10013, 64434, 0, 983112, 0, 11782, 64382, 0, 0, 0, 0, 41630, + 630, 120960, 0, 0, 70165, 1043, 93017, 0, 0, 0, 124945, 313, 129590, 0, + 0, 65593, 7445, 43906, 5750, 42258, 0, 55222, 68222, 11268, 11225, 0, + 8526, 0, 0, 43894, 66495, 69990, 0, 92990, 0, 10707, 7863, 0, 0, 70692, + 631, 77952, 77953, 66443, 71171, 83313, 0, 0, 0, 13305, 77961, 43925, + 43924, 77956, 77957, 66903, 66328, 42381, 77962, 0, 0, 0, 0, 0, 0, 43899, + 66821, 77967, 9157, 77965, 77966, 77963, 77964, 0, 0, 180, 73904, 0, 0, + 66494, 12674, 43896, 0, 0, 43890, 43897, 0, 11535, 0, 66769, 5185, 7165, + 5521, 10334, 5519, 71329, 10302, 12351, 83333, 1027, 5181, 0, 5117, 0, + 5179, 73955, 6845, 991, 5189, 43676, 41647, 0, 73883, 92571, 77979, 3405, + 0, 0, 5523, 43915, 66487, 92459, 74943, 9549, 0, 125093, 43923, 0, 43682, + 74884, 120537, 0, 43921, 0, 71184, 0, 43922, 128709, 0, 10414, 9846, 0, + 10350, 0, 43918, 77981, 75075, 77978, 77980, 66485, 77977, 77973, 77974, + 78057, 43909, 73983, 12330, 0, 0, 0, 43910, 0, 3407, 6293, 0, 68149, + 43908, 129060, 0, 10209, 0, 4195, 0, 9010, 983686, 75072, 6332, 0, 0, + 65871, 0, 1736, 0, 3901, 0, 0, 65890, 128801, 10446, 0, 693, 9130, 314, + 78119, 64149, 0, 0, 0, 11026, 0, 5332, 6940, 0, 0, 127007, 119831, 0, + 273, 8165, 0, 83307, 0, 0, 12824, 43911, 4528, 5320, 6301, 43662, 6133, + 0, 9463, 73738, 127141, 10922, 121069, 0, 0, 0, 0, 0, 2569, 0, 2326, 0, + 2565, 0, 66401, 0, 0, 0, 0, 41848, 2567, 78620, 121145, 4044, 92646, 0, + 12233, 0, 9509, 0, 0, 127158, 7336, 0, 0, 0, 0, 0, 67235, 0, 0, 0, 0, + 2222, 66499, 0, 127170, 0, 10895, 0, 274, 983763, 1858, 0, 67849, 55251, + 0, 3133, 0, 71857, 0, 9610, 0, 8197, 0, 0, 0, 41665, 5868, 0, 0, 72120, + 0, 19940, 43668, 41667, 0, 0, 1923, 0, 0, 0, 0, 0, 0, 0, 0, 6464, 92750, + 2996, 125221, 0, 68481, 41835, 4047, 41842, 0, 0, 129601, 0, 0, 0, 0, + 293, 0, 0, 64791, 41827, 0, 0, 10579, 8560, 0, 0, 118835, 4803, 73805, + 1739, 0, 3900, 128967, 73737, 0, 0, 73957, 0, 66474, 41971, 0, 0, 0, 0, + 0, 11716, 66473, 0, 121071, 0, 128080, 0, 0, 0, 0, 0, 0, 0, 6632, 73861, + 0, 74770, 0, 0, 8914, 0, 0, 3183, 1435, 0, 0, 0, 0, 0, 0, 5746, 67392, 0, + 0, 0, 83506, 0, 7082, 71481, 12618, 5059, 983597, 83524, 43604, 0, 0, 0, + 0, 0, 0, 8227, 0, 1218, 0, 64416, 65848, 92884, 0, 0, 0, 126987, 0, 0, 0, + 0, 0, 0, 83515, 83507, 0, 0, 42672, 71194, 43224, 0, 0, 0, 0, 0, 0, 0, + 65905, 0, 42662, 0, 121159, 0, 129536, 0, 7794, 0, 0, 6377, 0, 126080, + 3669, 3968, 0, 71319, 69658, 129550, 0, 66296, 0, 0, 0, 0, 124998, 6699, + 126120, 0, 0, 66678, 0, 0, 0, 8409, 119527, 19967, 0, 0, 9502, 0, 0, + 6115, 0, 41654, 0, 0, 0, 41655, 113779, 43975, 72427, 0, 0, 0, 0, 41657, + 10778, 0, 9533, 184, 1553, 128868, 0, 0, 0, 0, 0, 0, 0, 0, 73697, 0, 92480, 0, 128938, 74292, 0, 5157, 4020, 0, 128154, 43788, 64818, 0, 0, 0, 92979, 0, 0, 74377, 11029, 66651, 0, 0, 125202, 0, 0, 7877, 121070, 0, 0, 127953, 2810, 9955, 0, 0, 42817, 0, 65122, 11715, 0, 0, 0, 71270, 0, 0, 0, 0, 0, 70199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78222, 127981, 0, 0, 0, 0, 0, 11290, 0, 0, 0, 0, 8315, 0, 0, 0, 74595, 0, 0, 0, 42531, 0, 0, 0, 74589, 43993, 0, 0, 0, 0, 43690, 0, 119139, 42730, 0, 0, 0, 64926, 0, 0, - 43830, 65257, 0, 42728, 0, 128697, 0, 0, 43540, 0, 0, 12725, 72993, + 43830, 65257, 0, 42728, 0, 128697, 123150, 0, 43540, 0, 0, 12725, 72993, 78635, 127826, 223, 0, 69675, 0, 0, 0, 0, 0, 0, 42605, 0, 0, 0, 0, 0, 0, 0, 0, 78621, 0, 78619, 119062, 0, 0, 0, 42676, 129353, 64800, 78617, 83504, 68126, 1213, 0, 0, 797, 0, 0, 83021, 83005, 64387, 4115, 0, 0, 0, 0, 10679, 83001, 121091, 0, 64276, 83498, 13168, 983710, 0, 10136, 0, 0, - 65088, 0, 4262, 0, 0, 0, 10701, 0, 3101, 0, 0, 0, 0, 11373, 0, 0, 0, + 65088, 0, 4262, 0, 0, 0, 10701, 0, 3101, 0, 123204, 0, 0, 11373, 0, 0, 0, 9117, 0, 0, 4539, 0, 0, 12727, 0, 0, 0, 43684, 74567, 68877, 983707, 12724, 73940, 0, 0, 0, 0, 0, 7947, 12003, 0, 74593, 121140, 69653, 74807, 42018, 0, 0, 0, 65888, 0, 0, 69683, 0, 120306, 0, 0, 12595, 0, 0, 0, 0, @@ -26703,133 +27362,135 @@ static unsigned int code_hash[] = { 6311, 110725, 41698, 0, 12049, 78133, 0, 125020, 41705, 0, 0, 121298, 0, 66822, 0, 65389, 0, 66027, 0, 0, 41699, 8340, 0, 69776, 0, 128639, 0, 1988, 5407, 69978, 0, 65912, 93059, 0, 2336, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 19913, 0, 113733, 0, 0, 74279, 0, 10956, 0, 41674, 19964, 41679, - 65084, 41675, 195031, 0, 0, 0, 0, 983089, 0, 10794, 128961, 13217, 0, 0, - 0, 5280, 0, 0, 12905, 41610, 11532, 0, 0, 768, 120545, 442, 0, 0, 0, - 64081, 41682, 0, 41693, 0, 77993, 77994, 0, 4804, 6994, 0, 0, 0, 41696, - 467, 983915, 0, 0, 0, 0, 8678, 0, 69682, 64801, 0, 0, 0, 0, 64093, 12043, - 0, 69666, 0, 2029, 65191, 119246, 42847, 0, 0, 0, 0, 0, 0, 0, 70339, - 126116, 0, 0, 8019, 73856, 0, 0, 0, 0, 2355, 12150, 65725, 77988, 77989, - 68033, 77987, 0, 77985, 0, 0, 68388, 0, 74171, 0, 0, 0, 11301, 78013, - 78008, 78010, 9874, 78007, 983326, 71064, 3050, 0, 0, 0, 78016, 78017, - 71852, 78015, 0, 0, 0, 92242, 0, 69642, 0, 0, 0, 0, 0, 0, 78025, 0, - 78023, 78024, 11847, 10545, 0, 10887, 0, 0, 0, 0, 0, 0, 64942, 92363, - 9996, 8508, 0, 0, 8195, 0, 42171, 0, 3722, 0, 63751, 0, 0, 92637, 69670, - 0, 41552, 69854, 0, 78639, 0, 0, 129374, 128978, 0, 0, 0, 7920, 70285, - 4021, 0, 0, 0, 119663, 0, 0, 78021, 78022, 78019, 78020, 1802, 78018, 0, - 74895, 41659, 41671, 1827, 0, 64396, 41668, 128524, 41673, 0, 11422, - 71846, 0, 11370, 0, 68412, 41345, 0, 0, 0, 0, 0, 0, 65114, 0, 2104, - 64858, 0, 0, 7553, 0, 41560, 11970, 0, 917920, 0, 68495, 74131, 74130, 0, - 0, 0, 611, 74129, 64871, 0, 0, 0, 0, 74854, 0, 70466, 0, 0, 0, 121147, 0, - 68487, 41669, 7094, 917921, 0, 0, 74054, 0, 0, 0, 839, 0, 7695, 0, 0, 0, - 92202, 0, 121053, 0, 67885, 0, 7206, 0, 6647, 43986, 0, 0, 0, 0, 0, 0, - 127936, 43748, 66746, 0, 12298, 110802, 983992, 110800, 64924, 0, 73931, - 9468, 74245, 0, 0, 74246, 0, 0, 118830, 0, 71851, 1279, 0, 6224, 0, - 92405, 128601, 0, 983338, 0, 0, 0, 5032, 0, 0, 0, 0, 0, 5034, 0, 0, - 72846, 42702, 0, 0, 13294, 0, 64869, 0, 67808, 9129, 0, 0, 0, 120819, - 68387, 120168, 120169, 120170, 120171, 5518, 4174, 120166, 120167, - 120160, 120161, 120162, 434, 41437, 66212, 120158, 120159, 0, 0, 118867, - 0, 524, 0, 74029, 0, 126559, 0, 0, 0, 10355, 10419, 74025, 77847, 0, - 69725, 0, 120656, 0, 67876, 0, 0, 0, 74145, 74039, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 5445, 0, 93779, 71855, 7391, 8989, 0, 74068, 0, 0, 0, 0, 4962, - 0, 8855, 0, 70820, 0, 0, 0, 0, 71847, 0, 0, 0, 10451, 0, 67653, 120153, - 12443, 120155, 9947, 120149, 120150, 120151, 13128, 0, 120146, 120147, 0, - 0, 0, 0, 0, 0, 74059, 74062, 6217, 74053, 43846, 0, 74049, 0, 0, 0, 0, 0, - 0, 0, 0, 42595, 0, 68112, 118860, 0, 0, 92497, 74949, 128953, 0, 0, 0, 0, - 0, 0, 119251, 0, 0, 0, 0, 0, 6216, 0, 0, 9455, 127027, 8124, 128851, 0, - 6944, 0, 0, 0, 2828, 128550, 531, 42638, 0, 0, 0, 43428, 0, 3614, 2827, - 9696, 0, 0, 0, 4354, 0, 78562, 78561, 0, 120691, 0, 42599, 42597, 0, - 68829, 125012, 0, 127277, 0, 120421, 0, 983164, 0, 0, 10121, 120422, - 74950, 0, 69715, 0, 0, 120423, 120630, 12608, 125244, 0, 74144, 9700, - 12580, 0, 128911, 0, 71864, 0, 74071, 0, 0, 12713, 0, 70402, 0, 0, 0, - 1734, 0, 0, 0, 0, 118951, 231, 0, 74167, 542, 0, 0, 0, 0, 128074, 0, - 121343, 0, 4446, 10584, 74235, 0, 4037, 0, 0, 0, 5687, 0, 0, 0, 0, 0, 0, - 78434, 0, 0, 113709, 74284, 0, 0, 0, 126495, 0, 0, 0, 74482, 93978, 1709, - 69721, 9909, 92286, 0, 0, 0, 55229, 8667, 0, 0, 0, 0, 0, 0, 0, 0, 127586, - 1226, 6930, 0, 71736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41500, 0, 311, 74282, - 6221, 92988, 0, 67682, 0, 120528, 122901, 74272, 0, 0, 0, 0, 69667, 0, - 124933, 74456, 74302, 42589, 0, 0, 0, 0, 0, 0, 0, 0, 41508, 0, 323, - 125211, 0, 42698, 8131, 0, 4625, 0, 4630, 0, 0, 0, 74316, 78417, 2668, - 92483, 0, 42640, 0, 2519, 0, 92474, 92479, 0, 983085, 5049, 42659, - 119011, 0, 7754, 10854, 8738, 74623, 0, 0, 0, 649, 0, 0, 0, 0, 0, 1013, - 70707, 68212, 705, 0, 0, 127803, 1183, 126519, 9320, 0, 0, 8157, 0, 0, 0, - 0, 0, 0, 0, 11913, 0, 42848, 0, 64925, 0, 0, 70693, 0, 0, 2051, 0, 0, 0, - 0, 0, 0, 0, 8466, 0, 4626, 8464, 8472, 68844, 4629, 8499, 0, 0, 4624, - 194623, 0, 0, 0, 7805, 0, 94007, 6935, 0, 0, 0, 0, 0, 0, 0, 8492, 0, - 8459, 0, 8497, 8496, 0, 0, 0, 0, 0, 0, 0, 0, 65849, 0, 0, 0, 12451, 3328, - 8684, 0, 6102, 0, 5298, 0, 5294, 0, 0, 0, 0, 0, 0, 43617, 0, 0, 0, 0, 0, - 77863, 128695, 0, 0, 0, 0, 0, 5292, 0, 0, 42688, 5302, 3970, 0, 0, 1793, - 0, 0, 0, 0, 0, 65263, 0, 0, 0, 0, 0, 0, 13219, 9569, 0, 74383, 0, 0, 0, - 0, 0, 0, 0, 0, 5322, 0, 0, 43631, 5324, 0, 128694, 41614, 65269, 6230, 0, - 0, 0, 3360, 0, 11523, 72726, 92488, 9926, 7197, 0, 68429, 0, 41821, 1249, - 0, 127951, 0, 0, 0, 0, 0, 74459, 41807, 0, 41815, 0, 0, 0, 0, 0, 128248, - 0, 66835, 0, 0, 0, 41800, 0, 0, 0, 41811, 74466, 93966, 6670, 77882, 0, - 0, 43092, 0, 0, 0, 0, 0, 128655, 0, 0, 0, 0, 74501, 74005, 0, 74387, - 69860, 315, 12813, 128556, 72409, 0, 72408, 0, 0, 73061, 0, 0, 1378, 0, - 0, 0, 72407, 3066, 0, 0, 72406, 0, 0, 0, 8787, 194615, 0, 41618, 0, 0, 0, - 194614, 64652, 194611, 42088, 125226, 0, 0, 0, 0, 7176, 43756, 0, 0, - 74492, 0, 74534, 0, 0, 0, 127199, 0, 128630, 74525, 0, 194594, 12930, - 7168, 74514, 0, 74515, 0, 128919, 43962, 9527, 120659, 70123, 12977, - 69723, 0, 93783, 194598, 41236, 92235, 65168, 118838, 41237, 5848, 0, - 194600, 3670, 194601, 0, 0, 0, 7890, 0, 11298, 0, 0, 6229, 0, 0, 0, - 194593, 128907, 0, 0, 0, 4120, 65337, 65336, 0, 0, 0, 0, 9366, 0, 0, 0, - 65327, 65326, 65325, 65324, 65323, 42216, 65321, 65320, 65335, 65334, - 65333, 65332, 65331, 65330, 65329, 42689, 0, 43943, 118885, 42073, 6785, - 68491, 0, 42076, 7196, 65318, 2035, 65316, 4106, 65314, 65313, 42074, 0, - 41228, 0, 0, 41241, 93786, 41239, 43533, 0, 7189, 194602, 0, 43941, 0, - 42802, 0, 8487, 0, 0, 4615, 12695, 0, 0, 12175, 100414, 0, 0, 7809, 0, 0, - 0, 0, 6590, 69762, 0, 64738, 0, 0, 0, 0, 0, 0, 2025, 0, 0, 0, 10637, - 71860, 0, 1570, 43839, 2835, 83052, 10624, 43623, 194587, 0, 78433, 0, - 42812, 0, 2825, 0, 128287, 0, 2821, 0, 92327, 7365, 83043, 0, 68296, 0, - 2823, 0, 0, 0, 2831, 0, 0, 11465, 0, 0, 0, 0, 0, 7181, 0, 41332, 0, - 12333, 0, 0, 0, 0, 0, 9883, 127294, 73906, 0, 0, 71863, 0, 0, 0, 0, 0, 0, - 43741, 0, 8166, 70739, 0, 0, 74535, 0, 65297, 68294, 571, 0, 8752, 0, - 5288, 118822, 1541, 0, 127284, 8864, 0, 0, 0, 0, 0, 113778, 12151, 0, - 66874, 0, 1035, 0, 0, 7881, 701, 65936, 128493, 0, 70462, 0, 11403, 0, 0, - 82991, 0, 983142, 70472, 3994, 11421, 121217, 127297, 127242, 127300, - 70659, 127303, 0, 125205, 2855, 127828, 0, 41621, 68214, 0, 0, 10654, - 82945, 119226, 12164, 41623, 7906, 0, 74297, 7182, 0, 83069, 0, 0, 0, 0, - 121115, 0, 0, 747, 0, 92463, 12019, 43136, 0, 110861, 0, 0, 8001, 0, 0, - 69394, 0, 0, 0, 68373, 0, 0, 0, 128279, 0, 71915, 0, 0, 7282, 94066, 0, - 0, 0, 0, 0, 5286, 83061, 0, 0, 0, 83057, 0, 194584, 71905, 0, 128480, 0, - 0, 0, 0, 9206, 82980, 113824, 6802, 0, 41653, 0, 1241, 0, 0, 0, 0, 68124, - 41651, 42937, 0, 83042, 41650, 0, 83037, 0, 12914, 2814, 0, 119552, 0, 0, - 0, 118900, 0, 0, 0, 917546, 71862, 0, 0, 0, 3494, 10189, 69784, 0, 0, - 71861, 0, 0, 65875, 0, 0, 127762, 0, 74215, 43065, 0, 0, 7200, 0, 3261, - 0, 0, 0, 65889, 71888, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129424, 0, 635, 0, 0, - 74753, 0, 92420, 73997, 0, 0, 43905, 0, 118834, 126125, 0, 6667, 0, - 983263, 0, 0, 125200, 0, 0, 0, 0, 83137, 0, 0, 0, 0, 0, 121104, 127856, - 125112, 71885, 0, 120125, 7866, 194573, 92770, 194574, 0, 120140, 126074, - 2849, 0, 0, 42157, 12960, 0, 11812, 0, 74509, 0, 69881, 0, 0, 0, 0, 7178, - 0, 0, 0, 0, 129041, 11534, 1967, 0, 0, 71361, 7015, 120298, 72757, 0, - 12989, 0, 9368, 983638, 1624, 43270, 0, 0, 10818, 0, 83091, 0, 120908, 0, - 0, 0, 0, 0, 0, 6169, 12871, 0, 2798, 65176, 4958, 42752, 119025, 0, 0, 0, - 70346, 66448, 0, 113780, 68364, 0, 0, 0, 68360, 0, 73746, 120945, 68352, - 0, 73787, 83110, 2154, 7199, 64955, 0, 0, 0, 0, 0, 66507, 0, 69853, 0, 0, - 0, 0, 0, 0, 0, 92517, 118882, 120301, 13297, 0, 0, 0, 0, 0, 0, 6658, - 8045, 0, 0, 983854, 92319, 83101, 0, 0, 0, 0, 0, 2416, 3310, 0, 0, 379, - 0, 43755, 0, 0, 0, 68362, 1284, 0, 73756, 0, 0, 83141, 70784, 0, 0, 0, 0, - 8515, 83144, 83143, 0, 0, 0, 8529, 93782, 0, 7564, 0, 0, 0, 0, 73757, - 73760, 42359, 0, 2031, 0, 7202, 0, 12676, 0, 0, 128418, 0, 7710, 1610, - 73801, 0, 0, 0, 983607, 43917, 0, 9974, 228, 0, 10398, 0, 0, 0, 92241, - 70062, 118927, 42999, 1725, 65533, 8196, 9352, 0, 0, 66868, 0, 8502, - 5762, 0, 0, 43898, 0, 0, 0, 0, 43914, 0, 126507, 64598, 13001, 9326, - 83082, 43916, 1557, 0, 983860, 6330, 6805, 8631, 2545, 70052, 0, 0, 0, 0, - 70410, 0, 42762, 0, 42914, 126516, 262, 1637, 0, 83025, 129491, 0, - 128757, 0, 0, 0, 128922, 0, 43658, 0, 0, 129183, 6419, 0, 0, 0, 0, 93989, - 0, 0, 7194, 5291, 0, 43666, 0, 0, 0, 0, 128293, 0, 12881, 0, 0, 73842, 0, - 9011, 0, 0, 0, 70436, 179, 43644, 0, 0, 64747, 0, 118813, 0, 0, 121389, - 0, 126629, 0, 73850, 2801, 119837, 42069, 119839, 119838, 119841, 42072, - 92736, 119842, 0, 0, 0, 8377, 0, 42070, 119313, 119834, 119853, 4389, - 43656, 1633, 119857, 119856, 119859, 11119, 119845, 119844, 9967, 119846, - 119849, 4612, 119851, 119850, 42913, 70456, 0, 0, 10782, 66898, 0, - 119141, 0, 0, 0, 11541, 69636, 0, 0, 119614, 2731, 0, 0, 0, 4102, 0, - 73878, 0, 0, 0, 0, 0, 11283, 0, 0, 0, 0, 0, 43674, 0, 0, 126705, 0, 0, 0, - 0, 11142, 128304, 0, 12975, 0, 0, 0, 0, 74072, 0, 55269, 0, 0, 0, 78577, - 78576, 0, 0, 82966, 82974, 70448, 0, 0, 82968, 0, 0, 0, 0, 0, 113809, 0, - 69399, 64909, 0, 11790, 74019, 0, 128066, 0, 8561, 94076, 0, 125045, 0, - 65674, 7230, 0, 0, 8778, 0, 0, 67725, 2071, 0, 6459, 68325, 7628, 65092, - 73903, 0, 11342, 129388, 0, 0, 93965, 0, 0, 11810, 70057, 10723, 967, 0, + 126238, 0, 19913, 0, 113733, 0, 0, 74279, 0, 10956, 0, 41674, 19964, + 41679, 65084, 41675, 195031, 0, 0, 0, 0, 983089, 0, 10794, 128961, 13217, + 0, 0, 0, 5280, 0, 0, 12905, 41610, 11532, 0, 0, 768, 120545, 442, 0, 0, + 0, 64081, 41682, 0, 41693, 0, 77993, 77994, 0, 4804, 6994, 0, 0, 0, + 41696, 467, 983915, 0, 0, 0, 0, 8678, 0, 69682, 64801, 0, 0, 0, 0, 64093, + 12043, 0, 69666, 0, 2029, 65191, 119246, 42847, 0, 0, 0, 0, 0, 0, 0, + 70339, 126116, 0, 0, 8019, 73856, 0, 0, 0, 0, 2355, 12150, 65725, 77988, + 77989, 68033, 77987, 0, 77985, 0, 0, 68388, 0, 74171, 0, 0, 0, 11301, + 78013, 78008, 78010, 9874, 78007, 983326, 71064, 3050, 0, 0, 0, 78016, + 78017, 71852, 78015, 0, 0, 0, 92242, 0, 69642, 0, 0, 0, 0, 0, 0, 78025, + 0, 78023, 78024, 11847, 10545, 0, 10887, 0, 123179, 0, 0, 0, 83352, + 64942, 92363, 9996, 8508, 0, 0, 8195, 0, 42171, 0, 3722, 0, 63751, 0, 0, + 92637, 69670, 0, 41552, 69854, 0, 78639, 0, 0, 129374, 128978, 0, 0, 0, + 7920, 70285, 4021, 0, 0, 0, 119663, 0, 0, 78021, 78022, 78019, 78020, + 1802, 78018, 0, 74895, 41659, 41671, 1827, 0, 64396, 41668, 128524, + 41673, 0, 11422, 71846, 0, 11370, 0, 68412, 41345, 0, 0, 0, 0, 0, 0, + 65114, 0, 2104, 64858, 0, 0, 7553, 0, 41560, 11970, 0, 917920, 0, 68495, + 74131, 74130, 0, 0, 0, 611, 74129, 64871, 0, 0, 0, 0, 74854, 0, 70466, 0, + 0, 0, 121147, 0, 68487, 41669, 7094, 917921, 0, 123144, 74054, 0, 0, 0, + 839, 0, 7695, 0, 0, 0, 92202, 0, 121053, 123157, 67885, 0, 7206, 0, 6647, + 43986, 0, 0, 0, 0, 0, 0, 127936, 43748, 66746, 0, 12298, 110802, 983992, + 110800, 64924, 0, 73931, 9468, 74245, 0, 0, 74246, 0, 0, 118830, 0, + 71851, 1279, 0, 6224, 0, 92405, 128601, 0, 128997, 0, 0, 0, 5032, 0, 0, + 0, 0, 0, 5034, 0, 0, 72846, 42702, 0, 0, 13294, 0, 64869, 0, 67808, 9129, + 123632, 0, 0, 120819, 68387, 120168, 120169, 120170, 120171, 5518, 4174, + 120166, 120167, 120160, 120161, 120162, 434, 41437, 66212, 120158, + 120159, 0, 0, 118867, 0, 524, 0, 74029, 0, 126559, 0, 0, 0, 10355, 10419, + 74025, 77847, 0, 69725, 0, 120656, 0, 67876, 0, 0, 0, 74145, 74039, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5445, 0, 93779, 71855, 7391, 8989, 0, 74068, 0, + 0, 0, 0, 4962, 0, 8855, 0, 70820, 0, 0, 0, 0, 71847, 0, 0, 0, 10451, 0, + 67653, 120153, 12443, 120155, 9947, 120149, 120150, 120151, 13128, 0, + 120146, 120147, 0, 0, 0, 0, 0, 0, 74059, 74062, 6217, 74053, 43846, 0, + 74049, 0, 0, 0, 0, 0, 0, 0, 0, 42595, 0, 68112, 118860, 0, 0, 92497, + 74949, 128953, 126245, 0, 0, 0, 129684, 0, 119251, 0, 0, 0, 0, 0, 6216, + 0, 0, 9455, 127027, 8124, 128851, 0, 6944, 0, 0, 0, 2828, 128550, 531, + 42638, 0, 0, 0, 43428, 0, 3614, 2827, 9696, 0, 0, 0, 4354, 0, 78562, + 78561, 0, 120691, 0, 42599, 42597, 0, 68829, 125012, 0, 127277, 0, + 120421, 0, 983164, 0, 0, 10121, 120422, 74950, 123142, 69715, 0, 0, + 120423, 120630, 12608, 125244, 0, 74144, 9700, 12580, 0, 128911, 0, + 71864, 0, 74071, 0, 0, 12713, 0, 70402, 0, 0, 0, 1734, 0, 0, 0, 0, + 118951, 231, 0, 74167, 542, 0, 0, 0, 0, 128074, 0, 121343, 0, 4446, + 10584, 74235, 0, 4037, 0, 0, 0, 5687, 0, 0, 0, 0, 0, 0, 78434, 0, 0, + 113709, 74284, 0, 0, 0, 126495, 0, 0, 0, 74482, 93978, 1709, 69721, 9909, + 92286, 0, 0, 0, 55229, 8667, 0, 0, 0, 0, 0, 0, 0, 0, 127586, 1226, 6930, + 0, 71736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41500, 0, 311, 74282, 6221, 92988, + 0, 67682, 0, 120528, 122901, 74272, 0, 0, 0, 0, 69667, 0, 124933, 74456, + 74302, 42589, 0, 0, 0, 0, 0, 0, 0, 0, 41508, 0, 323, 125211, 0, 42698, + 8131, 0, 4625, 0, 4630, 0, 0, 0, 74316, 78417, 2668, 92483, 0, 42640, 0, + 2519, 0, 92474, 92479, 0, 983085, 5049, 42659, 119011, 0, 7754, 10854, + 8738, 74623, 0, 0, 0, 649, 0, 0, 0, 0, 0, 1013, 70707, 68212, 705, 0, 0, + 127803, 1183, 126519, 9320, 0, 0, 8157, 0, 0, 0, 0, 0, 0, 0, 11913, 0, + 42848, 0, 64925, 0, 0, 70693, 0, 0, 2051, 0, 0, 0, 0, 0, 0, 0, 8466, 0, + 4626, 8464, 8472, 68844, 4629, 8499, 0, 0, 4624, 194623, 0, 94025, 0, + 7805, 0, 94007, 6935, 0, 0, 0, 0, 0, 0, 0, 8492, 0, 8459, 0, 8497, 8496, + 0, 0, 0, 0, 0, 0, 0, 0, 65849, 0, 0, 0, 12451, 3328, 8684, 0, 6102, 0, + 5298, 0, 5294, 0, 129615, 0, 0, 0, 0, 43617, 0, 0, 0, 0, 0, 77863, + 128695, 0, 0, 0, 0, 0, 5292, 0, 0, 42688, 5302, 3970, 0, 0, 1793, 0, 0, + 0, 0, 0, 65263, 0, 0, 0, 0, 0, 0, 13219, 9569, 0, 74383, 0, 0, 72157, 0, + 42949, 0, 0, 0, 5322, 0, 0, 43631, 5324, 0, 128694, 41614, 65269, 6230, + 0, 0, 0, 3360, 0, 11523, 72726, 92488, 9926, 7197, 0, 68429, 126575, + 41821, 1249, 0, 127951, 0, 123641, 0, 0, 0, 74459, 41807, 0, 41815, 0, 0, + 0, 0, 0, 128248, 0, 66835, 0, 0, 72145, 41800, 0, 0, 0, 41811, 74466, + 93966, 6670, 77882, 0, 0, 43092, 0, 0, 0, 0, 0, 128655, 0, 0, 0, 0, + 74501, 74005, 0, 74387, 69860, 315, 12813, 128556, 72409, 0, 72408, 0, 0, + 73061, 0, 0, 1378, 0, 0, 0, 72407, 3066, 0, 0, 72406, 0, 0, 0, 8787, + 194615, 0, 41618, 0, 0, 0, 194614, 64652, 194611, 42088, 125226, 0, 0, 0, + 0, 7176, 43756, 0, 0, 74492, 0, 74534, 0, 0, 0, 127199, 0, 128630, 74525, + 0, 194594, 12930, 7168, 74514, 0, 74515, 0, 128919, 43962, 9527, 120659, + 70123, 12977, 69723, 0, 93783, 194598, 41236, 92235, 65168, 118838, + 41237, 5848, 0, 194600, 3670, 194601, 0, 0, 0, 7890, 0, 11298, 0, 0, + 6229, 0, 0, 0, 194593, 128907, 0, 0, 0, 4120, 65337, 65336, 0, 0, 0, 0, + 9366, 0, 0, 0, 65327, 65326, 65325, 65324, 65323, 42216, 65321, 65320, + 65335, 65334, 65333, 65332, 65331, 65330, 65329, 42689, 0, 43943, 118885, + 42073, 6785, 68491, 0, 42076, 7196, 65318, 2035, 65316, 4106, 65314, + 65313, 42074, 0, 41228, 0, 0, 41241, 93786, 41239, 43533, 0, 7189, + 194602, 0, 43941, 0, 42802, 0, 8487, 0, 0, 4615, 12695, 0, 0, 12175, + 100414, 0, 0, 7809, 0, 0, 0, 0, 6590, 69762, 0, 64738, 0, 0, 0, 0, 0, 0, + 2025, 0, 0, 0, 10637, 71860, 0, 1570, 43839, 2835, 83052, 10624, 43623, + 194587, 0, 78433, 0, 42812, 0, 2825, 0, 128287, 0, 2821, 0, 92327, 7365, + 83043, 0, 68296, 0, 2823, 0, 0, 0, 2831, 0, 0, 11465, 0, 0, 0, 0, 0, + 7181, 0, 41332, 0, 12333, 0, 0, 0, 0, 0, 9883, 127294, 73906, 70751, 0, + 71863, 0, 0, 0, 0, 0, 0, 43741, 0, 8166, 70739, 0, 0, 74535, 0, 65297, + 68294, 571, 0, 8752, 0, 5288, 118822, 1541, 0, 127284, 8864, 0, 0, 0, 0, + 0, 113778, 12151, 0, 66874, 0, 1035, 0, 0, 7881, 701, 65936, 128493, 0, + 70462, 0, 11403, 0, 0, 82991, 0, 983142, 70472, 3994, 11421, 121217, + 127297, 127242, 127300, 70659, 127303, 0, 125205, 2855, 127828, 0, 41621, + 68214, 0, 0, 10654, 82945, 119226, 12164, 41623, 7906, 0, 74297, 7182, 0, + 83069, 0, 0, 0, 0, 121115, 0, 0, 747, 0, 92463, 12019, 43136, 0, 110861, + 0, 0, 8001, 0, 0, 69394, 0, 0, 0, 68373, 0, 0, 0, 128279, 0, 71915, 0, 0, + 7282, 94066, 0, 0, 0, 0, 0, 5286, 83061, 0, 3718, 0, 83057, 0, 194584, + 71905, 0, 128480, 0, 0, 0, 0, 9206, 82980, 113824, 6802, 0, 41653, 0, + 1241, 0, 0, 0, 0, 68124, 41651, 42937, 0, 83042, 41650, 0, 83037, 0, + 12914, 2814, 0, 119552, 0, 0, 0, 118900, 0, 0, 0, 917546, 71862, 0, 0, 0, + 3494, 10189, 69784, 0, 0, 71861, 0, 0, 65875, 0, 0, 127762, 0, 74215, + 43065, 0, 0, 7200, 0, 3261, 0, 0, 0, 65889, 71888, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 129424, 0, 635, 0, 0, 74753, 0, 92420, 73997, 0, 0, 43905, 0, + 118834, 126125, 0, 6667, 0, 983263, 0, 0, 125200, 0, 0, 0, 0, 83137, 0, + 0, 0, 0, 0, 121104, 127856, 125112, 71885, 0, 120125, 7866, 194573, + 92770, 194574, 0, 120140, 126074, 2849, 0, 0, 42157, 12960, 0, 11812, 0, + 74509, 0, 69881, 0, 0, 0, 123156, 7178, 0, 0, 0, 0, 129041, 11534, 1967, + 0, 0, 71361, 7015, 120298, 72757, 0, 12989, 0, 9368, 983638, 1624, 43270, + 0, 0, 10818, 0, 83091, 0, 120908, 0, 0, 0, 0, 0, 0, 6169, 12871, 0, 2798, + 65176, 4958, 42752, 119025, 0, 0, 0, 70346, 66448, 0, 113780, 68364, 0, + 0, 0, 68360, 0, 73746, 120945, 68352, 0, 73787, 83110, 2154, 7199, 64955, + 0, 0, 0, 0, 0, 66507, 0, 69853, 0, 0, 0, 0, 0, 0, 0, 92517, 118882, + 120301, 13297, 0, 129446, 0, 0, 0, 0, 6658, 8045, 0, 0, 983854, 92319, + 83101, 0, 72126, 0, 0, 0, 2416, 3310, 0, 0, 379, 0, 43755, 0, 0, 0, + 68362, 1284, 0, 73756, 0, 0, 83141, 70784, 0, 0, 0, 0, 8515, 83144, + 83143, 0, 0, 0, 8529, 93782, 0, 7564, 0, 0, 0, 0, 73757, 73760, 42359, 0, + 2031, 0, 7202, 0, 12676, 0, 0, 128418, 0, 7710, 1610, 73801, 0, 0, 0, + 983607, 43917, 0, 9974, 228, 0, 10398, 0, 0, 0, 92241, 70062, 118927, + 42999, 1725, 65533, 8196, 9352, 0, 0, 66868, 0, 8502, 5762, 0, 0, 43898, + 0, 0, 0, 0, 43914, 0, 126507, 64598, 13001, 9326, 83082, 43916, 1557, 0, + 983860, 6330, 6805, 8631, 2545, 70052, 0, 0, 0, 0, 70410, 0, 42762, 0, + 42914, 126516, 262, 1637, 0, 83025, 129491, 0, 128757, 0, 0, 0, 128922, + 0, 43658, 0, 0, 129183, 6419, 0, 0, 0, 0, 93989, 0, 0, 7194, 5291, 0, + 43666, 0, 0, 0, 0, 128293, 0, 12881, 123596, 0, 73842, 0, 9011, 0, 0, 0, + 70436, 179, 43644, 0, 0, 64747, 0, 118813, 0, 0, 121389, 0, 126629, 0, + 73850, 2801, 119837, 42069, 119839, 119838, 119841, 42072, 92736, 119842, + 0, 0, 0, 8377, 0, 42070, 119313, 119834, 119853, 4389, 43656, 1633, + 119857, 119856, 119859, 11119, 119845, 119844, 9967, 119846, 119849, + 4612, 119851, 119850, 42913, 70456, 0, 0, 10782, 66898, 0, 119141, 0, 0, + 0, 11541, 69636, 0, 0, 119614, 2731, 0, 0, 0, 4102, 0, 73878, 0, 0, 0, 0, + 0, 11283, 0, 0, 0, 0, 0, 43674, 0, 0, 126705, 0, 0, 0, 0, 11142, 128304, + 0, 12975, 0, 123208, 0, 0, 74072, 0, 55269, 0, 0, 0, 78577, 78576, 0, 0, + 82966, 82974, 70448, 0, 0, 82968, 0, 0, 0, 0, 0, 113809, 0, 69399, 64909, + 0, 11790, 74019, 0, 128066, 0, 8561, 94076, 129481, 125045, 0, 65674, + 7230, 0, 0, 8778, 0, 0, 67725, 2071, 0, 6459, 68325, 7628, 65092, 73903, + 0, 11342, 129388, 0, 0, 93965, 94081, 0, 11810, 70057, 10723, 967, 0, 121116, 73905, 0, 6387, 0, 12307, 43913, 121089, 0, 127584, 0, 1886, 0, 43895, 870, 7648, 0, 7662, 7652, 876, 871, 877, 7665, 878, 42015, 879, 43692, 4563, 0, 0, 0, 73072, 867, 9520, 872, 7656, 868, 873, 7642, 7659, @@ -26848,67 +27509,68 @@ static unsigned int code_hash[] = { 610, 42800, 7431, 7451, 42801, 640, 42927, 7448, 7439, 628, 3905, 100742, 0, 0, 0, 67850, 0, 0, 0, 4605, 0, 100745, 43372, 65945, 72710, 0, 119590, 0, 0, 70495, 987, 71229, 11572, 0, 0, 10002, 9971, 70673, 0, 0, 0, 0, 0, - 0, 11334, 0, 129493, 42364, 11503, 0, 0, 0, 4627, 70090, 0, 0, 0, 74046, - 68872, 92562, 0, 0, 0, 0, 0, 0, 0, 42569, 64965, 0, 0, 10516, 0, 12190, - 0, 42140, 0, 0, 0, 0, 9887, 0, 4000, 7429, 7428, 665, 7424, 0, 0, 7884, - 0, 0, 0, 0, 0, 2509, 0, 120573, 0, 0, 92449, 0, 10690, 0, 119114, 0, 0, - 0, 73080, 4590, 0, 74440, 0, 0, 0, 1708, 0, 0, 983609, 0, 0, 69226, - 69974, 8813, 0, 1066, 0, 0, 0, 127921, 70447, 0, 0, 0, 72343, 0, 7516, 0, - 0, 0, 8034, 0, 0, 3631, 110696, 0, 0, 8416, 110694, 0, 0, 0, 110692, - 74621, 0, 70185, 0, 74850, 0, 0, 12099, 70475, 0, 6252, 0, 0, 0, 0, 0, 0, - 66368, 0, 64956, 7071, 129070, 70457, 128159, 118800, 0, 0, 0, 9357, 0, - 1773, 0, 125092, 0, 68451, 7745, 9844, 0, 0, 94, 1880, 120929, 0, 0, 0, - 0, 0, 0, 0, 0, 11237, 0, 129173, 0, 0, 0, 1757, 6964, 42480, 72823, 0, - 120806, 0, 0, 7731, 0, 0, 127883, 0, 110810, 43988, 70423, 74758, 0, - 7592, 856, 74299, 0, 0, 0, 78138, 1459, 0, 0, 0, 0, 0, 1504, 0, 0, 0, 0, - 7529, 0, 0, 0, 0, 12594, 0, 0, 336, 0, 7509, 0, 0, 0, 0, 127882, 0, 0, 0, - 65859, 0, 983967, 43062, 124948, 0, 0, 0, 0, 12970, 0, 0, 0, 0, 0, 0, 0, - 119247, 0, 65068, 74291, 0, 7069, 0, 0, 0, 11130, 2087, 0, 0, 0, 0, 0, 0, - 92747, 0, 92614, 2091, 0, 2090, 0, 0, 7117, 2077, 72281, 0, 77889, 2083, - 0, 71196, 0, 0, 92649, 0, 0, 0, 0, 4165, 8746, 0, 0, 0, 0, 0, 7066, 0, - 70415, 128135, 0, 0, 7786, 127766, 2233, 0, 124965, 121122, 2302, 0, 0, - 7056, 0, 0, 0, 0, 0, 0, 126506, 6920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 983099, 70438, 2613, 0, 0, 110734, 0, 74571, 42760, 0, 0, 0, 0, 0, 0, - 71843, 0, 0, 70506, 1246, 74243, 0, 0, 41008, 0, 0, 0, 921, 70048, 0, - 12702, 0, 0, 1566, 8407, 0, 64653, 0, 74617, 0, 0, 72711, 5313, 951, 0, - 0, 0, 0, 0, 4009, 70277, 71844, 0, 83123, 0, 72250, 0, 119898, 113760, 0, - 0, 0, 0, 70024, 0, 0, 119892, 0, 0, 0, 119890, 2579, 119906, 3177, 11357, - 69224, 0, 0, 83130, 64734, 0, 9822, 110670, 70471, 110668, 0, 110666, 0, - 0, 0, 0, 9851, 983729, 110673, 9059, 110671, 110672, 0, 41687, 129054, 0, - 71842, 70178, 0, 0, 1777, 0, 10158, 69767, 0, 42366, 70444, 0, 0, 0, - 70127, 83377, 5989, 110716, 74636, 126999, 0, 41685, 0, 0, 9769, 41684, - 0, 6225, 111328, 11740, 0, 118840, 0, 2600, 0, 70416, 0, 0, 3666, 70420, - 0, 0, 0, 0, 74542, 69771, 0, 0, 0, 0, 0, 69765, 0, 252, 0, 69769, 0, - 194616, 0, 69763, 0, 0, 0, 0, 0, 0, 0, 120947, 0, 129410, 0, 0, 0, 68323, - 125219, 0, 119188, 0, 0, 121335, 0, 0, 0, 0, 0, 7764, 983726, 11094, - 120825, 0, 0, 92505, 8298, 0, 0, 0, 0, 0, 64449, 0, 126650, 0, 0, 0, - 70442, 0, 0, 0, 0, 7774, 10607, 0, 0, 0, 0, 0, 120764, 0, 0, 0, 0, 3458, - 0, 70053, 0, 120995, 0, 2602, 0, 0, 0, 74907, 0, 0, 0, 0, 172, 0, 4971, - 70419, 1889, 7238, 0, 0, 0, 8257, 0, 0, 0, 0, 0, 111342, 983855, 0, - 43366, 43363, 9807, 0, 0, 0, 72247, 64479, 0, 0, 0, 113707, 0, 10900, - 121355, 0, 0, 12048, 0, 64292, 0, 0, 0, 6099, 0, 0, 0, 0, 299, 0, 8525, - 92356, 0, 0, 111338, 0, 92564, 3075, 0, 94053, 0, 94050, 0, 0, 70440, 0, - 0, 0, 0, 0, 2581, 11395, 0, 0, 0, 0, 128584, 0, 0, 129423, 0, 118855, 0, - 0, 0, 7204, 70065, 2588, 2914, 7011, 55281, 0, 7466, 0, 2883, 42253, - 83118, 0, 0, 0, 0, 0, 41230, 68299, 0, 43571, 0, 6219, 0, 9980, 41232, - 92245, 0, 66036, 41229, 0, 0, 120666, 94016, 0, 12711, 0, 0, 74289, - 68472, 42857, 0, 0, 0, 0, 127306, 119006, 0, 11380, 72348, 0, 0, 0, 0, 0, - 0, 0, 983583, 12722, 0, 922, 0, 0, 983126, 74958, 3218, 120471, 120470, - 120469, 120476, 120475, 8569, 11404, 70450, 120463, 3214, 120461, 120468, - 74910, 3207, 120465, 78729, 78728, 78727, 0, 120460, 7425, 3205, 0, - 78737, 78736, 71729, 43383, 78733, 78732, 2606, 78730, 73897, 0, 11496, - 1173, 0, 0, 129135, 0, 0, 0, 120737, 120953, 120872, 120629, 378, 2610, - 0, 0, 0, 0, 0, 37, 7068, 0, 120480, 70421, 3209, 120477, 0, 120483, 9768, - 120481, 0, 0, 0, 0, 0, 0, 65510, 0, 0, 0, 0, 0, 100627, 0, 126633, 0, - 7060, 100628, 0, 127752, 0, 0, 70428, 71463, 0, 7380, 0, 0, 100593, - 126997, 0, 128737, 0, 71465, 121030, 3243, 0, 0, 0, 7050, 0, 70050, 0, 0, - 0, 71466, 8203, 71102, 68241, 0, 65211, 194599, 0, 0, 0, 779, 125061, - 64367, 100906, 69901, 8193, 55279, 0, 0, 0, 7065, 0, 4346, 0, 0, 908, 0, - 0, 8982, 0, 0, 0, 782, 0, 10883, 0, 0, 129396, 65542, 121302, 0, 68650, - 100575, 92244, 0, 0, 111351, 0, 4376, 0, 11787, 12961, 0, 0, 42888, 0, - 100610, 6231, 0, 65713, 100608, 1783, 0, 68238, 0, 0, 0, 194945, 0, 0, 0, - 68653, 0, 0, 0, 764, 0, 0, 43531, 0, 9033, 0, 0, 6223, 11042, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 120648, 0, 0, 0, 0, 0, 0, 0, 0, 1478, 0, 11825, + 0, 11334, 0, 129493, 42364, 11503, 0, 0, 0, 4627, 70090, 127784, 0, 0, + 74046, 68872, 92562, 0, 0, 0, 0, 0, 0, 0, 42569, 64965, 0, 0, 10516, 0, + 12190, 0, 42140, 0, 0, 0, 0, 9887, 0, 4000, 7429, 7428, 665, 7424, 0, 0, + 7884, 0, 0, 0, 0, 0, 2509, 0, 120573, 0, 0, 92449, 0, 10690, 0, 119114, + 126226, 0, 0, 73080, 4590, 0, 74440, 0, 0, 0, 1708, 0, 0, 983609, 0, 0, + 69226, 69974, 8813, 0, 1066, 0, 0, 0, 127921, 70447, 0, 0, 0, 72343, 0, + 7516, 0, 0, 0, 8034, 0, 0, 3631, 110696, 0, 0, 8416, 110694, 0, 0, 0, + 110692, 74621, 0, 70185, 0, 74850, 0, 0, 12099, 70475, 0, 6252, 0, 0, 0, + 0, 0, 0, 66368, 0, 64956, 7071, 129070, 70457, 128159, 118800, 0, 0, 0, + 9357, 0, 1773, 0, 125092, 0, 68451, 7745, 9844, 0, 0, 94, 1880, 120929, + 0, 0, 0, 0, 0, 0, 0, 0, 11237, 0, 129173, 0, 0, 0, 1757, 6964, 42480, + 72823, 0, 120806, 0, 0, 7731, 0, 0, 127883, 0, 110810, 43988, 70423, + 74758, 0, 7592, 856, 74299, 0, 0, 0, 78138, 1459, 0, 0, 0, 0, 0, 1504, 0, + 0, 0, 0, 7529, 0, 0, 0, 0, 12594, 0, 0, 336, 0, 7509, 0, 0, 0, 0, 127882, + 0, 0, 0, 65859, 0, 983967, 43062, 124948, 0, 0, 0, 0, 12970, 0, 0, 0, 0, + 0, 0, 0, 119247, 0, 65068, 74291, 0, 7069, 0, 0, 0, 11130, 2087, 0, 0, 0, + 0, 0, 0, 92747, 0, 92614, 2091, 0, 2090, 0, 0, 7117, 2077, 72281, 0, + 77889, 2083, 0, 71196, 0, 0, 92649, 0, 0, 0, 0, 4165, 8746, 0, 0, 0, 0, + 129572, 7066, 0, 70415, 128135, 0, 0, 7786, 127766, 2233, 0, 124965, + 121122, 2302, 0, 0, 7056, 0, 0, 0, 0, 0, 0, 126506, 6920, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 983099, 70438, 2613, 0, 0, 110734, 0, 74571, 42760, 0, 0, + 0, 0, 0, 0, 71843, 0, 0, 70506, 1246, 74243, 0, 0, 41008, 0, 0, 0, 921, + 70048, 0, 12702, 0, 0, 1566, 8407, 0, 64653, 0, 74617, 0, 0, 72711, 5313, + 951, 0, 0, 0, 0, 0, 4009, 70277, 71844, 0, 83123, 0, 72250, 0, 119898, + 113760, 0, 0, 0, 0, 70024, 0, 0, 119892, 0, 0, 0, 119890, 2579, 119906, + 3177, 11357, 69224, 0, 0, 83130, 64734, 0, 9822, 110670, 70471, 110668, + 0, 110666, 0, 0, 0, 0, 9851, 983729, 110673, 9059, 110671, 110672, 0, + 41687, 129054, 0, 71842, 70178, 0, 0, 1777, 0, 10158, 69767, 0, 42366, + 70444, 0, 0, 0, 70127, 83377, 5989, 110716, 74636, 126999, 0, 41685, 0, + 0, 9769, 41684, 0, 6225, 111328, 11740, 0, 118840, 0, 2600, 0, 70416, 0, + 0, 3666, 70420, 0, 0, 0, 0, 74542, 69771, 0, 0, 0, 0, 0, 69765, 0, 252, + 0, 69769, 0, 194616, 0, 69763, 0, 0, 0, 0, 0, 0, 0, 120947, 0, 129410, 0, + 0, 0, 68323, 125219, 0, 119188, 0, 0, 121335, 0, 0, 0, 0, 0, 7764, + 983726, 11094, 120825, 0, 0, 92505, 8298, 0, 0, 0, 0, 0, 64449, 0, + 126650, 0, 0, 0, 70442, 0, 0, 0, 0, 7774, 10607, 0, 0, 0, 0, 0, 120764, + 0, 0, 0, 0, 3458, 0, 70053, 0, 120995, 0, 2602, 0, 0, 0, 74907, 0, 0, 0, + 0, 172, 0, 4971, 70419, 1889, 7238, 0, 0, 0, 8257, 0, 0, 0, 129570, 0, + 111342, 983855, 0, 43366, 43363, 9807, 0, 0, 0, 72247, 64479, 0, 0, 0, + 113707, 0, 10900, 121355, 0, 0, 12048, 0, 64292, 0, 0, 0, 6099, 94084, + 129486, 0, 0, 299, 0, 8525, 92356, 0, 0, 111338, 0, 92564, 3075, 0, + 94053, 0, 94050, 0, 0, 70440, 0, 123590, 0, 0, 0, 2581, 11395, 0, 0, 0, + 0, 128584, 0, 0, 129423, 0, 118855, 0, 0, 0, 7204, 70065, 2588, 2914, + 7011, 55281, 0, 7466, 0, 2883, 42253, 83118, 0, 0, 0, 123598, 0, 41230, + 68299, 0, 43571, 0, 6219, 0, 9980, 41232, 92245, 0, 66036, 41229, 118967, + 0, 120666, 94016, 0, 12711, 0, 0, 74289, 68472, 42857, 0, 0, 0, 0, + 127306, 119006, 0, 11380, 72348, 0, 0, 0, 0, 0, 0, 0, 983583, 12722, 0, + 922, 0, 0, 983126, 74958, 3218, 120471, 120470, 120469, 120476, 120475, + 8569, 11404, 70450, 120463, 3214, 120461, 120468, 74910, 3207, 120465, + 78729, 78728, 78727, 0, 120460, 7425, 3205, 0, 78737, 78736, 71729, + 43383, 78733, 78732, 2606, 78730, 73897, 0, 11496, 1173, 0, 0, 129135, 0, + 0, 0, 120737, 120953, 120872, 120629, 378, 2610, 0, 0, 0, 0, 0, 37, 7068, + 0, 120480, 70421, 3209, 120477, 0, 120483, 9768, 120481, 0, 0, 0, 0, 0, + 0, 65510, 0, 100625, 0, 0, 0, 100627, 0, 126633, 0, 7060, 100628, 0, + 127752, 0, 0, 70428, 71463, 0, 7380, 0, 0, 100593, 126997, 0, 128737, 0, + 71465, 121030, 3243, 0, 0, 0, 7050, 0, 70050, 0, 0, 0, 71466, 8203, + 71102, 68241, 0, 65211, 194599, 0, 0, 0, 779, 125061, 64367, 100906, + 69901, 8193, 55279, 0, 0, 0, 7065, 0, 4346, 0, 0, 908, 0, 0, 8982, 0, 0, + 0, 782, 0, 10883, 0, 0, 129396, 65542, 121302, 0, 68650, 100575, 92244, + 0, 0, 111351, 0, 4376, 0, 11787, 12961, 0, 0, 42888, 0, 100610, 6231, 0, + 65713, 100608, 1783, 0, 68238, 0, 0, 0, 194945, 0, 0, 0, 68653, 0, + 983051, 0, 764, 0, 0, 43531, 0, 9033, 0, 0, 6223, 11042, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 120648, 0, 0, 0, 0, 0, 0, 0, 0, 1478, 0, 11825, 2607, 0, 0, 0, 74543, 0, 0, 100588, 6132, 0, 0, 0, 70058, 0, 0, 0, 43537, 6761, 10093, 4369, 0, 0, 73735, 100564, 3947, 110778, 0, 0, 0, 0, 100942, 0, 0, 0, 0, 0, 0, 7686, 0, 0, 0, 100934, 0, 100944, 66577, 41221, 0, @@ -26919,204 +27581,206 @@ static unsigned int code_hash[] = { 119660, 0, 0, 0, 0, 127930, 119580, 70675, 64943, 2608, 1470, 0, 0, 6227, 0, 0, 74775, 0, 0, 72320, 101024, 0, 129535, 0, 0, 0, 0, 0, 10876, 92482, 0, 0, 5834, 0, 6222, 0, 0, 12086, 0, 1600, 64309, 0, 0, 68883, 127957, - 93836, 0, 8882, 0, 129415, 2570, 0, 0, 0, 0, 0, 1234, 0, 13115, 110743, - 110740, 100923, 5002, 110739, 41286, 100926, 127019, 0, 0, 0, 0, 0, 0, 0, - 41289, 0, 0, 75051, 41272, 0, 0, 0, 0, 0, 0, 0, 41279, 0, 0, 0, 11081, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9637, 7112, 77975, 128984, 0, 10886, 0, 8548, - 983841, 0, 0, 0, 8076, 43048, 8290, 8291, 43051, 92570, 0, 2596, 0, 0, - 41293, 0, 0, 2393, 7058, 66432, 0, 68673, 0, 0, 0, 0, 0, 128558, 0, 0, 0, - 0, 0, 64696, 0, 0, 121086, 74165, 0, 0, 0, 0, 0, 0, 7063, 983182, 64893, - 73096, 0, 68038, 113757, 709, 0, 0, 1876, 0, 0, 120868, 8137, 110662, - 67752, 70850, 100832, 245, 100831, 11456, 41233, 7070, 0, 94046, 6136, - 100835, 0, 100781, 41235, 0, 0, 100782, 100642, 432, 0, 100784, 65437, 0, - 0, 128909, 0, 100641, 100649, 0, 100648, 0, 43215, 0, 0, 0, 0, 9052, 0, - 0, 110826, 110827, 74784, 10580, 0, 100845, 0, 64640, 983175, 74455, 0, - 0, 70035, 0, 12652, 12199, 127030, 0, 2566, 11971, 0, 0, 1065, 0, 0, 0, - 2576, 0, 66819, 0, 983986, 0, 0, 0, 983050, 983826, 0, 2921, 119104, 0, - 5772, 12968, 70055, 0, 0, 0, 2580, 983822, 0, 0, 70032, 0, 0, 0, 128148, - 0, 0, 121308, 11346, 0, 12054, 100824, 92426, 0, 0, 13091, 0, 0, 100821, - 100828, 0, 127026, 128334, 74821, 0, 66295, 68037, 68047, 127865, 13090, - 0, 0, 0, 118985, 0, 0, 0, 0, 0, 127824, 0, 0, 100776, 119319, 42356, - 42432, 100778, 119317, 0, 0, 0, 78752, 70030, 66914, 0, 0, 7061, 0, 3854, - 0, 70020, 68413, 0, 42319, 0, 0, 7067, 0, 0, 0, 0, 0, 0, 127797, 9029, - 43543, 0, 2353, 119316, 0, 100769, 0, 100768, 983177, 0, 0, 43664, 0, 0, - 0, 12277, 0, 78122, 11066, 65233, 0, 41224, 0, 0, 3747, 10522, 0, 0, - 1691, 41226, 0, 917565, 0, 41223, 121135, 121299, 697, 0, 121051, 4244, - 0, 0, 0, 13121, 128573, 0, 0, 0, 0, 0, 0, 0, 0, 65816, 68111, 0, 127933, - 0, 0, 0, 0, 0, 0, 66895, 74602, 0, 7123, 70038, 5785, 9198, 0, 100810, 0, - 7383, 64656, 0, 0, 0, 0, 0, 0, 0, 0, 13122, 0, 191, 70060, 8585, 126610, - 64411, 0, 0, 64850, 41072, 118996, 0, 0, 0, 0, 100754, 127010, 100753, 0, - 100756, 683, 396, 0, 100758, 0, 100757, 43058, 100760, 343, 7129, 42680, - 0, 0, 0, 0, 0, 100761, 0, 74040, 0, 1724, 0, 119321, 0, 0, 6263, 0, 0, 0, - 6592, 0, 983044, 0, 0, 0, 0, 0, 1778, 0, 0, 128854, 121254, 0, 9018, 0, - 0, 0, 0, 92763, 5547, 0, 0, 128950, 0, 0, 284, 8108, 0, 0, 74001, 0, - 66460, 7174, 92703, 126072, 0, 0, 4394, 0, 0, 0, 0, 101082, 66459, 0, - 7180, 101084, 0, 101092, 68800, 42471, 0, 0, 67232, 64304, 42243, 118820, - 2583, 0, 127804, 0, 0, 0, 71702, 3855, 0, 0, 0, 0, 0, 0, 0, 92416, 7132, - 0, 92743, 0, 64756, 3798, 6578, 0, 0, 92481, 9774, 1275, 0, 0, 983056, 0, - 120515, 7873, 0, 0, 0, 0, 0, 0, 73994, 73992, 0, 0, 0, 41851, 0, 41846, - 126485, 92337, 7633, 41849, 68385, 70726, 3224, 0, 69806, 0, 0, 0, 1510, - 68129, 0, 0, 0, 0, 12109, 0, 0, 0, 0, 0, 78377, 1910, 8671, 78374, - 127118, 70290, 0, 0, 0, 2654, 7893, 0, 0, 0, 72394, 0, 67394, 0, 118970, - 70066, 78372, 78371, 78370, 78369, 78368, 0, 0, 0, 1733, 0, 2568, 0, 0, - 0, 0, 41486, 0, 127839, 7116, 0, 0, 0, 7185, 0, 0, 0, 0, 0, 120575, - 120829, 0, 0, 0, 0, 92489, 0, 0, 0, 70022, 7171, 0, 340, 0, 0, 72980, 0, - 128535, 0, 124979, 94073, 0, 0, 0, 11392, 92509, 0, 0, 0, 0, 0, 0, 0, - 100632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11948, 0, 6999, 617, 983806, 0, 3675, - 10600, 0, 0, 74616, 2617, 0, 0, 0, 128446, 0, 0, 8630, 194771, 7288, - 983809, 5545, 983799, 2586, 0, 0, 73123, 983832, 0, 0, 0, 70847, 0, 0, 0, - 0, 11195, 71708, 0, 7835, 70040, 0, 0, 92285, 0, 0, 72973, 0, 0, 100852, - 71118, 10029, 983166, 0, 0, 70033, 124978, 0, 0, 194782, 0, 0, 118975, 0, - 0, 3903, 100893, 983839, 0, 120555, 0, 93036, 110645, 0, 983565, 0, 0, - 194773, 0, 0, 0, 127238, 983803, 100919, 0, 100918, 64752, 0, 983138, - 100920, 0, 43045, 100904, 0, 0, 0, 66394, 7128, 0, 0, 0, 0, 0, 43044, - 2604, 0, 100851, 43046, 121421, 69985, 11768, 43043, 10470, 0, 7122, - 194789, 4390, 454, 41397, 194792, 0, 78762, 0, 0, 120576, 64572, 0, - 68091, 2394, 2575, 113749, 0, 0, 74802, 100913, 129280, 0, 0, 11989, 0, - 0, 128856, 0, 0, 8249, 128172, 0, 0, 6640, 74806, 2598, 513, 0, 6586, - 127521, 129301, 120710, 65008, 0, 0, 92515, 0, 194795, 66755, 0, 126585, - 0, 43152, 78637, 0, 194797, 0, 69893, 6582, 0, 0, 12839, 0, 0, 0, 0, - 2444, 128759, 66620, 0, 0, 0, 0, 69894, 0, 0, 0, 0, 4238, 11071, 9459, - 68437, 78140, 78139, 0, 10079, 0, 0, 0, 0, 0, 11907, 43928, 0, 0, 0, 0, - 92490, 43929, 0, 43926, 64498, 0, 9506, 6978, 0, 0, 0, 0, 0, 43934, 0, - 1122, 65564, 0, 71055, 0, 0, 1920, 0, 43930, 827, 0, 0, 0, 0, 6577, 1304, - 64733, 0, 10606, 0, 0, 0, 9329, 92997, 9239, 74422, 0, 129373, 1222, - 11076, 0, 69229, 43615, 8262, 72280, 64627, 19909, 983554, 72279, 0, 287, - 0, 233, 0, 0, 42816, 0, 0, 65140, 128158, 8830, 0, 0, 10524, 41175, - 125033, 72294, 0, 5296, 0, 0, 0, 0, 0, 127154, 74858, 6516, 6515, 6514, - 6513, 6512, 0, 70870, 0, 0, 0, 12122, 92462, 100868, 43976, 1785, 92507, - 0, 0, 917771, 5138, 0, 0, 0, 100884, 0, 0, 0, 0, 0, 5134, 69980, 322, - 4643, 5132, 0, 194942, 0, 5143, 0, 72309, 119628, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 73097, 0, 0, 0, 127923, 0, 0, 0, 0, 0, 3234, 0, 100886, 0, - 100889, 118924, 0, 0, 100875, 68231, 74489, 100872, 120746, 0, 100876, 0, - 12714, 0, 64585, 93775, 0, 0, 0, 129428, 0, 11027, 0, 10059, 0, 64524, - 9767, 789, 1749, 0, 66766, 983991, 320, 0, 0, 0, 3049, 0, 6471, 0, 74479, - 9925, 127356, 127355, 127358, 4960, 5549, 127359, 127346, 127345, 127348, - 5418, 127350, 3351, 120892, 127351, 10610, 5414, 0, 0, 4286, 5421, - 127344, 67867, 0, 127794, 0, 6653, 0, 0, 64510, 0, 41868, 0, 128823, 0, - 0, 11613, 70737, 12603, 7131, 11108, 4566, 0, 0, 0, 0, 0, 124938, 127369, - 0, 0, 5200, 0, 0, 0, 9183, 127361, 74458, 73075, 395, 5482, 1376, 4349, - 0, 0, 5196, 0, 6113, 42009, 5205, 0, 120530, 0, 118973, 70467, 0, 0, 0, - 0, 9126, 70498, 0, 0, 0, 0, 0, 3203, 192, 0, 3385, 125075, 128620, 5383, - 0, 0, 0, 5738, 69449, 3336, 0, 5361, 9633, 0, 0, 0, 0, 8581, 0, 1260, - 3149, 5359, 12962, 74955, 10441, 5357, 0, 0, 0, 5364, 0, 11431, 0, 9101, - 0, 0, 0, 0, 78378, 121155, 42917, 0, 129179, 0, 0, 0, 43360, 78385, - 78384, 78383, 78382, 78381, 78380, 78379, 9319, 7097, 0, 127748, 0, 0, 0, - 120632, 0, 71205, 0, 0, 0, 1720, 0, 0, 0, 8622, 0, 70430, 68772, 0, 0, 0, - 73084, 0, 0, 11921, 0, 11769, 68782, 0, 0, 0, 0, 194571, 41586, 0, 0, 0, - 3356, 194572, 64709, 194575, 0, 7134, 0, 78389, 0, 677, 0, 0, 0, 129474, - 68747, 0, 68751, 3349, 74125, 0, 8927, 0, 0, 0, 0, 0, 0, 0, 6806, 0, - 10190, 68755, 0, 0, 0, 0, 0, 0, 0, 7113, 7586, 0, 10852, 0, 0, 4606, 0, - 0, 70084, 0, 0, 1046, 7124, 121192, 68753, 0, 5171, 65539, 0, 0, 0, - 42394, 0, 74849, 127823, 0, 5169, 11935, 0, 0, 3175, 0, 1537, 0, 5176, - 8905, 4136, 4871, 78388, 0, 0, 0, 0, 1128, 0, 0, 0, 74066, 0, 73069, 0, - 0, 3662, 113767, 3378, 0, 71298, 0, 127995, 6320, 71302, 983162, 10163, - 0, 5165, 5126, 0, 66902, 41389, 0, 71368, 3374, 0, 0, 7119, 0, 0, 3507, - 0, 7629, 983629, 19925, 0, 68463, 183, 127208, 127209, 70811, 10636, 0, - 128465, 0, 0, 78772, 0, 0, 0, 78768, 6580, 4332, 0, 0, 10726, 66686, - 127203, 127204, 127205, 127206, 0, 70813, 127201, 127202, 0, 0, 5448, - 41058, 5446, 0, 0, 71369, 5442, 7135, 0, 0, 5451, 0, 78470, 0, 0, 0, 0, - 11243, 10859, 65867, 10345, 10409, 0, 0, 0, 0, 42181, 0, 0, 2060, 0, - 7111, 0, 0, 0, 0, 72741, 0, 205, 0, 72346, 93771, 0, 9862, 6588, 43257, - 0, 0, 0, 5505, 93789, 5503, 65376, 0, 7125, 9819, 0, 0, 0, 5507, 12044, - 194567, 0, 0, 0, 7109, 0, 0, 7911, 10329, 10393, 8991, 125104, 69778, - 11133, 0, 8550, 0, 5592, 2919, 0, 0, 5595, 0, 0, 4367, 0, 0, 5591, 41060, - 5594, 0, 0, 13142, 5590, 0, 72274, 118909, 75069, 0, 9731, 71225, 64633, - 0, 0, 71217, 127950, 71227, 0, 0, 0, 0, 7137, 0, 0, 0, 10551, 10710, 0, - 0, 0, 120570, 0, 92364, 9936, 3348, 0, 0, 1444, 119058, 0, 74206, 983106, - 0, 1442, 129080, 0, 120959, 0, 0, 0, 0, 0, 0, 0, 3334, 73068, 118803, 0, - 0, 71219, 69770, 1651, 0, 8861, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43626, - 0, 0, 3344, 0, 0, 12920, 0, 0, 0, 71853, 3438, 128711, 0, 0, 0, 0, - 129068, 0, 0, 65117, 0, 0, 0, 0, 66366, 128915, 0, 69772, 0, 0, 0, 0, - 4973, 8784, 0, 0, 0, 0, 0, 0, 0, 125198, 983283, 0, 0, 66413, 0, 0, 0, 0, - 0, 9243, 2464, 0, 0, 3372, 0, 0, 0, 70364, 7121, 0, 0, 0, 92163, 0, 0, 0, - 0, 0, 0, 0, 3354, 0, 0, 0, 118999, 0, 3876, 0, 127983, 0, 43696, 43380, - 0, 74240, 0, 0, 0, 983966, 75074, 6589, 0, 0, 120993, 0, 0, 0, 0, 121210, - 0, 10630, 74827, 0, 121293, 0, 0, 121287, 917942, 121337, 121215, 0, 0, - 0, 0, 0, 917940, 3366, 0, 917938, 0, 0, 0, 71062, 0, 121197, 0, 6925, - 71856, 0, 917929, 66780, 66274, 0, 72768, 0, 917930, 0, 11138, 0, 6754, - 7118, 0, 64672, 65296, 0, 118957, 0, 0, 12296, 68457, 121320, 0, 5282, 0, - 72278, 0, 0, 0, 0, 0, 0, 66355, 0, 0, 68073, 64343, 0, 92744, 195058, - 195029, 0, 0, 195056, 195027, 0, 0, 128814, 195025, 6584, 195026, 10657, - 0, 74544, 0, 1200, 12243, 0, 195062, 0, 129300, 11545, 0, 120493, 3343, - 4424, 11047, 0, 69863, 3896, 0, 0, 2947, 0, 0, 42221, 0, 68139, 13059, - 7942, 0, 3381, 0, 0, 0, 0, 0, 0, 78235, 0, 0, 0, 7044, 65800, 78236, 0, - 7045, 7175, 7047, 127884, 11791, 0, 0, 3881, 0, 0, 127395, 0, 0, 67075, - 7106, 0, 0, 0, 74211, 41897, 92513, 0, 73040, 66745, 0, 0, 0, 0, 121245, - 0, 64354, 73083, 8777, 0, 129108, 8884, 2385, 73067, 92450, 0, 0, 0, - 42027, 12114, 0, 0, 64936, 0, 0, 0, 0, 0, 126605, 0, 0, 0, 0, 73064, 0, - 0, 0, 0, 0, 0, 0, 73057, 0, 0, 0, 0, 0, 0, 0, 70803, 0, 0, 124953, 0, 0, - 0, 7048, 11087, 0, 92536, 7043, 9600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42050, + 93836, 0, 8882, 0, 129415, 2570, 0, 0, 194606, 0, 0, 1234, 0, 13115, + 110743, 110740, 100923, 5002, 110739, 41286, 100926, 127019, 0, 0, 0, 0, + 0, 0, 0, 41289, 0, 0, 75051, 41272, 0, 0, 0, 0, 0, 0, 0, 41279, 0, 0, 0, + 11081, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9637, 7112, 77975, 128984, 0, 10886, 0, + 8548, 983841, 0, 0, 0, 8076, 43048, 8290, 8291, 43051, 92570, 0, 2596, 0, + 0, 41293, 0, 0, 2393, 7058, 66432, 0, 68673, 0, 0, 0, 0, 0, 128558, 0, 0, + 0, 0, 0, 64696, 0, 0, 121086, 74165, 0, 0, 0, 0, 0, 0, 7063, 983182, + 64893, 73096, 0, 68038, 113757, 709, 0, 0, 1876, 0, 0, 120868, 8137, + 110662, 67752, 70850, 100832, 245, 100831, 11456, 41233, 7070, 0, 94046, + 6136, 100835, 0, 100781, 41235, 0, 0, 100782, 100642, 432, 0, 100784, + 65437, 0, 0, 128909, 0, 100641, 100649, 0, 100648, 0, 43215, 0, 0, 0, 0, + 9052, 0, 0, 110826, 110827, 74784, 10580, 0, 100845, 0, 64640, 983175, + 74455, 0, 0, 70035, 0, 12652, 12199, 127030, 0, 2566, 11971, 0, 0, 1065, + 0, 0, 0, 2576, 0, 66819, 0, 983986, 0, 0, 0, 983050, 983826, 0, 2921, + 119104, 0, 5772, 12968, 70055, 0, 0, 0, 2580, 983822, 0, 0, 70032, 0, 0, + 0, 128148, 0, 0, 121308, 11346, 0, 12054, 100824, 92426, 0, 0, 13091, 0, + 0, 100821, 100828, 0, 127026, 128334, 74821, 0, 66295, 68037, 68047, + 127865, 13090, 0, 0, 0, 118985, 0, 0, 0, 0, 0, 127824, 0, 0, 100776, + 119319, 42356, 42432, 100778, 119317, 0, 0, 0, 78752, 70030, 66914, 0, 0, + 7061, 0, 3854, 0, 70020, 68413, 0, 42319, 0, 0, 7067, 0, 0, 0, 0, 0, 0, + 127797, 9029, 43543, 0, 2353, 119316, 0, 100769, 0, 100768, 983177, 0, 0, + 43664, 0, 0, 0, 12277, 0, 78122, 11066, 65233, 0, 41224, 0, 0, 3747, + 10522, 0, 129582, 1691, 41226, 0, 917565, 0, 41223, 121135, 121299, 697, + 0, 121051, 4244, 0, 0, 0, 13121, 128573, 0, 0, 0, 0, 0, 0, 0, 0, 65816, + 68111, 0, 127933, 0, 0, 0, 0, 0, 0, 66895, 74602, 0, 7123, 70038, 5785, + 9198, 0, 100810, 0, 7383, 64656, 0, 0, 0, 0, 0, 0, 0, 0, 13122, 0, 191, + 70060, 8585, 126610, 64411, 0, 0, 64850, 41072, 118996, 0, 0, 0, 0, + 100754, 127010, 100753, 0, 100756, 683, 396, 0, 100758, 0, 100757, 43058, + 100760, 343, 7129, 42680, 0, 0, 0, 0, 0, 100761, 0, 74040, 0, 1724, 0, + 119321, 0, 0, 6263, 0, 0, 0, 6592, 0, 983044, 0, 0, 0, 0, 3730, 1778, 0, + 0, 128854, 121254, 0, 9018, 0, 0, 0, 0, 92763, 5547, 0, 0, 128950, 0, 0, + 284, 8108, 0, 0, 74001, 0, 66460, 7174, 92703, 126072, 0, 0, 4394, + 127480, 0, 0, 0, 101082, 66459, 0, 7180, 101084, 0, 101092, 68800, 42471, + 0, 0, 67232, 64304, 42243, 101095, 2583, 0, 127804, 0, 0, 0, 71702, 3855, + 0, 0, 0, 0, 0, 0, 0, 92416, 7132, 0, 92743, 0, 64756, 3798, 6578, 0, 0, + 92481, 9774, 1275, 0, 0, 983056, 0, 120515, 7873, 0, 0, 0, 0, 0, 0, + 73994, 73992, 0, 0, 0, 41851, 0, 41846, 126485, 92337, 7633, 41849, + 68385, 70726, 3224, 0, 69806, 0, 0, 0, 1510, 68129, 0, 0, 0, 0, 12109, 0, + 0, 0, 0, 0, 78377, 1910, 8671, 78374, 127118, 70290, 0, 0, 0, 2654, 7893, + 0, 0, 0, 72394, 0, 67394, 0, 118970, 70066, 78372, 78371, 78370, 78369, + 78368, 0, 0, 0, 1733, 0, 2568, 0, 0, 0, 0, 41486, 0, 127839, 7116, 0, 0, + 0, 7185, 0, 0, 0, 0, 0, 120575, 120829, 0, 0, 0, 0, 92489, 0, 0, 0, + 70022, 7171, 0, 340, 0, 0, 72980, 0, 128535, 0, 124979, 94073, 0, 0, 0, + 11392, 92509, 0, 0, 0, 0, 0, 0, 0, 100632, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11948, 0, 6999, 617, 983806, 0, 3675, 10600, 0, 0, 74616, 2617, 0, 0, 0, + 128446, 0, 0, 8630, 194771, 7288, 983809, 5545, 983799, 2586, 0, 0, + 73123, 983832, 0, 0, 0, 70847, 0, 0, 0, 0, 11195, 71708, 0, 7835, 70040, + 0, 0, 92285, 0, 0, 72973, 0, 0, 100852, 71118, 10029, 983166, 0, 0, + 70033, 124978, 0, 0, 194782, 0, 0, 118975, 0, 0, 3903, 100893, 983839, 0, + 120555, 0, 93036, 110645, 0, 983565, 0, 0, 194773, 0, 0, 0, 127238, + 983803, 100919, 0, 100918, 64752, 0, 983138, 100920, 0, 43045, 100904, 0, + 0, 0, 66394, 7128, 0, 0, 0, 0, 0, 43044, 2604, 0, 100851, 43046, 121421, + 69985, 11768, 43043, 10470, 0, 7122, 194789, 4390, 454, 41397, 194792, 0, + 78762, 0, 0, 120576, 64572, 0, 68091, 2394, 2575, 113749, 0, 0, 74802, + 100913, 129280, 0, 0, 11989, 0, 0, 128856, 0, 0, 8249, 128172, 0, 0, + 6640, 74806, 2598, 513, 0, 6586, 127521, 129301, 120710, 65008, 0, 0, + 92515, 0, 194795, 66755, 0, 126585, 0, 43152, 78637, 0, 194797, 0, 69893, + 6582, 0, 0, 12839, 0, 0, 0, 0, 2444, 128759, 66620, 0, 0, 0, 0, 69894, 0, + 0, 0, 0, 4238, 11071, 9459, 68437, 78140, 78139, 0, 10079, 0, 0, 0, 0, 0, + 11907, 43928, 0, 0, 0, 0, 92490, 43929, 0, 43926, 64498, 0, 9506, 6978, + 126234, 0, 0, 0, 0, 43934, 0, 1122, 65564, 0, 71055, 0, 0, 1920, 0, + 43930, 827, 0, 0, 0, 0, 6577, 1304, 64733, 0, 10606, 0, 0, 0, 9329, + 92997, 9239, 74422, 0, 129373, 1222, 11076, 0, 69229, 43615, 8262, 72280, + 64627, 19909, 983554, 72279, 0, 287, 0, 233, 0, 0, 42816, 0, 0, 65140, + 128158, 8830, 0, 0, 10524, 41175, 125033, 72294, 0, 5296, 0, 0, 0, 0, 0, + 127154, 74858, 6516, 6515, 6514, 6513, 6512, 0, 70870, 0, 0, 0, 12122, + 92462, 100868, 43976, 1785, 92507, 0, 0, 917771, 5138, 0, 0, 0, 100884, + 0, 0, 0, 0, 0, 5134, 69980, 322, 4643, 5132, 0, 194942, 0, 5143, 0, + 72309, 119628, 0, 0, 72112, 0, 0, 0, 0, 0, 0, 0, 0, 73097, 0, 0, 0, + 127923, 0, 0, 0, 0, 0, 3234, 0, 100886, 0, 100889, 118924, 0, 0, 100875, + 68231, 74489, 100872, 120746, 0, 100876, 0, 12714, 0, 64585, 93775, 0, 0, + 0, 129428, 0, 11027, 0, 10059, 0, 64524, 9767, 789, 1749, 0, 66766, + 983991, 320, 0, 0, 0, 3049, 0, 6471, 0, 74479, 9925, 127356, 127355, + 127358, 4960, 5549, 127359, 127346, 127345, 127348, 5418, 127350, 3351, + 120892, 127351, 10610, 5414, 0, 0, 4286, 5421, 127344, 67867, 0, 127794, + 0, 6653, 0, 0, 64510, 0, 41868, 0, 128823, 0, 0, 11613, 70737, 12603, + 7131, 11108, 4566, 0, 0, 0, 0, 0, 124938, 127369, 0, 0, 5200, 0, 0, 0, + 9183, 127361, 74458, 73075, 395, 5482, 1376, 4349, 0, 0, 5196, 0, 6113, + 42009, 5205, 0, 120530, 0, 118973, 70467, 0, 0, 0, 0, 9126, 70498, 0, 0, + 0, 0, 0, 3203, 192, 0, 3385, 125075, 128620, 5383, 0, 0, 0, 5738, 69449, + 3336, 0, 5361, 9633, 0, 0, 0, 0, 8581, 0, 1260, 3149, 5359, 12962, 74955, + 10441, 5357, 0, 0, 0, 5364, 0, 11431, 0, 9101, 0, 0, 0, 0, 78378, 121155, + 42917, 0, 129179, 0, 0, 0, 43360, 78385, 78384, 78383, 78382, 78381, + 78380, 78379, 9319, 7097, 0, 127748, 0, 0, 0, 120632, 0, 71205, 0, 0, 0, + 1720, 0, 0, 0, 8622, 0, 70430, 68772, 0, 0, 0, 73084, 0, 0, 11921, 0, + 11769, 68782, 0, 0, 0, 0, 194571, 41586, 0, 0, 0, 3356, 194572, 64709, + 194575, 0, 7134, 0, 78389, 0, 677, 0, 0, 0, 129474, 68747, 0, 68751, + 3349, 74125, 0, 8927, 0, 0, 0, 0, 0, 0, 0, 6806, 0, 10190, 68755, 0, 0, + 0, 0, 0, 0, 0, 7113, 7586, 0, 10852, 0, 0, 4606, 0, 0, 70084, 0, 0, 1046, + 7124, 121192, 68753, 0, 5171, 65539, 0, 0, 0, 42394, 0, 74849, 127823, 0, + 5169, 11935, 0, 0, 3175, 0, 1537, 0, 5176, 8905, 4136, 4871, 78388, 0, 0, + 0, 0, 1128, 0, 0, 0, 74066, 0, 73069, 0, 0, 3662, 113767, 3378, 0, 71298, + 0, 127995, 6320, 71302, 983162, 10163, 0, 5165, 5126, 0, 66902, 41389, 0, + 71368, 3374, 0, 0, 7119, 0, 0, 3507, 0, 7629, 983629, 19925, 0, 68463, + 183, 127208, 127209, 70811, 10636, 0, 128465, 0, 0, 78772, 0, 0, 0, + 78768, 6580, 4332, 123584, 0, 10726, 66686, 127203, 127204, 127205, + 127206, 0, 70813, 127201, 127202, 0, 0, 5448, 41058, 5446, 0, 0, 71369, + 5442, 7135, 0, 0, 5451, 0, 78470, 0, 0, 0, 0, 11243, 10859, 65867, 10345, + 10409, 123606, 0, 0, 0, 42181, 0, 0, 2060, 0, 7111, 0, 0, 0, 0, 72741, 0, + 205, 0, 72346, 93771, 0, 9862, 6588, 43257, 0, 0, 0, 5505, 93789, 5503, + 65376, 0, 7125, 9819, 0, 0, 0, 5507, 12044, 194567, 0, 0, 0, 7109, 0, 0, + 7911, 10329, 10393, 8991, 125104, 69778, 11133, 129619, 8550, 0, 5592, + 2919, 0, 0, 5595, 0, 0, 4367, 0, 0, 5591, 41060, 5594, 0, 0, 13142, 5590, + 0, 72274, 118909, 75069, 123586, 9731, 71225, 64633, 0, 0, 71217, 121361, + 71227, 0, 0, 0, 0, 7137, 0, 0, 0, 10551, 10710, 0, 0, 0, 120570, 0, + 92364, 9936, 3348, 0, 0, 1444, 119058, 0, 74206, 983106, 0, 1442, 129080, + 0, 120959, 0, 0, 0, 0, 0, 0, 0, 3334, 73068, 118803, 0, 0, 71219, 69770, + 1651, 0, 8861, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43626, 0, 0, 3344, 0, 0, + 12920, 0, 0, 0, 71853, 3438, 128711, 0, 0, 0, 0, 129068, 0, 0, 65117, 0, + 0, 0, 0, 66366, 128915, 0, 69772, 0, 0, 0, 0, 4973, 8784, 0, 0, 0, 0, 0, + 0, 0, 125198, 983283, 0, 0, 66413, 0, 0, 0, 0, 0, 9243, 2464, 0, 0, 3372, + 0, 0, 0, 70364, 7121, 0, 0, 0, 92163, 0, 0, 0, 0, 0, 0, 0, 3354, 0, 0, 0, + 118999, 0, 3876, 0, 127983, 0, 43696, 43380, 0, 74240, 0, 0, 0, 983966, + 75074, 6589, 0, 0, 120993, 0, 0, 69609, 0, 121210, 0, 10630, 74827, 0, + 121293, 0, 0, 121287, 917942, 121337, 121215, 0, 0, 0, 0, 0, 917940, + 3366, 0, 917938, 0, 0, 0, 71062, 0, 121197, 0, 6925, 71856, 0, 917929, + 66780, 66274, 0, 72768, 0, 917930, 129482, 11138, 0, 6754, 7118, 0, + 64672, 65296, 0, 118957, 0, 0, 12296, 68457, 121320, 0, 5282, 0, 72278, + 0, 0, 0, 0, 0, 0, 66355, 0, 0, 68073, 64343, 0, 92744, 195058, 195029, 0, + 0, 195056, 195027, 0, 0, 128814, 195025, 6584, 195026, 10657, 0, 74544, + 0, 1200, 12243, 0, 195062, 0, 129300, 11545, 0, 120493, 3343, 4424, + 11047, 0, 69863, 3896, 0, 0, 2947, 0, 0, 42221, 0, 68139, 13059, 7942, 0, + 3381, 0, 0, 0, 0, 0, 0, 78235, 0, 0, 0, 7044, 65800, 78236, 0, 7045, + 7175, 7047, 127884, 11791, 0, 0, 3881, 0, 0, 127395, 0, 0, 67075, 7106, + 0, 0, 0, 74211, 41897, 92513, 0, 73040, 66745, 0, 0, 0, 0, 121245, 0, + 64354, 73083, 8777, 0, 129108, 8884, 2385, 73067, 92450, 0, 0, 0, 42027, + 12114, 0, 0, 64936, 0, 0, 0, 0, 0, 126605, 0, 0, 0, 0, 73064, 0, 0, 0, 0, + 0, 0, 0, 73057, 0, 123587, 0, 0, 0, 0, 0, 70803, 0, 0, 124953, 0, 0, 0, + 7048, 11087, 123600, 92536, 7043, 9600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42050, 0, 55289, 0, 0, 657, 0, 195054, 4461, 92903, 0, 0, 126490, 0, 4468, 0, 0, - 0, 4456, 73070, 10720, 0, 0, 127520, 0, 0, 0, 195046, 260, 7714, 74163, - 2045, 0, 65064, 4466, 0, 0, 128087, 0, 41403, 0, 0, 0, 41406, 120692, 0, - 0, 73939, 0, 0, 0, 41404, 1165, 0, 4451, 13087, 0, 11258, 0, 73855, 0, - 43014, 5439, 12061, 74586, 3375, 128869, 0, 0, 0, 0, 0, 0, 0, 113823, - 67078, 0, 67079, 0, 0, 0, 0, 68459, 0, 0, 0, 0, 0, 0, 7280, 0, 0, 0, - 4868, 8297, 0, 0, 42791, 0, 66737, 66739, 0, 0, 5182, 0, 0, 72764, 0, + 0, 4456, 73070, 10720, 123588, 0, 127520, 0, 0, 0, 195046, 260, 7714, + 74163, 2045, 0, 65064, 4466, 0, 0, 128087, 0, 41403, 0, 0, 0, 41406, + 120692, 0, 0, 73939, 0, 0, 0, 41404, 1165, 0, 4451, 13087, 0, 11258, 0, + 73855, 0, 43014, 5439, 12061, 74586, 3375, 128869, 0, 0, 0, 0, 0, 0, 0, + 113823, 67078, 0, 67079, 0, 0, 0, 0, 68459, 0, 0, 0, 0, 0, 0, 7280, 0, 0, + 0, 4868, 8297, 0, 0, 42791, 0, 66737, 66739, 0, 0, 5182, 0, 0, 72764, 0, 4465, 0, 12135, 0, 4464, 0, 0, 977, 4458, 43827, 0, 0, 0, 0, 344, 0, 0, 0, 0, 0, 92240, 0, 64443, 126995, 73078, 129525, 0, 0, 0, 43026, 7612, - 119591, 64413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119160, 10204, 127947, - 73063, 0, 0, 127236, 0, 68746, 0, 8852, 0, 0, 0, 0, 128427, 0, 7932, 0, - 128463, 0, 0, 0, 0, 0, 0, 0, 74893, 0, 0, 73095, 0, 8650, 0, 0, 0, 69900, - 118872, 0, 70868, 0, 6719, 0, 0, 0, 72836, 0, 0, 118991, 0, 0, 73815, - 4420, 0, 10583, 7760, 0, 0, 128752, 71711, 0, 128407, 0, 0, 0, 9066, 0, - 74795, 0, 0, 0, 0, 0, 0, 0, 42825, 41854, 5304, 0, 124942, 6919, 8619, 0, - 10038, 66454, 9592, 129049, 0, 0, 110771, 110777, 110772, 0, 0, 0, 0, 0, - 78498, 110773, 43624, 0, 7779, 0, 0, 9479, 78493, 0, 0, 2224, 0, 0, 0, 0, - 0, 42378, 3368, 0, 66804, 7697, 69237, 0, 2030, 0, 68236, 8370, 0, - 127961, 0, 0, 983350, 127903, 983348, 983347, 5174, 42831, 983344, 70439, - 983342, 8881, 119047, 0, 70433, 0, 0, 0, 0, 0, 0, 9576, 0, 3347, 4160, - 5154, 0, 3794, 0, 0, 0, 0, 0, 127916, 73073, 8381, 4572, 71129, 126101, - 0, 0, 0, 0, 0, 0, 0, 92283, 0, 0, 5799, 983339, 70100, 983337, 983336, - 983335, 43031, 64425, 65128, 983331, 0, 73059, 0, 68616, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 283, 68665, 0, 532, 0, 0, 983808, 0, 0, 3370, 73077, - 119132, 5443, 71431, 0, 0, 0, 0, 0, 2298, 0, 0, 0, 983330, 983329, - 983328, 983327, 7144, 983325, 119600, 983323, 983322, 983321, 0, 78816, - 128833, 0, 0, 0, 0, 0, 0, 0, 0, 73088, 0, 0, 983933, 0, 0, 0, 0, 5186, - 7360, 127837, 0, 12108, 0, 65124, 0, 0, 0, 6326, 43344, 0, 0, 42562, 0, - 0, 0, 983320, 65495, 983318, 101066, 983316, 101065, 983314, 65490, - 983312, 125034, 0, 101070, 0, 55245, 128927, 1630, 128232, 65483, 0, 0, - 0, 65476, 0, 0, 119214, 9283, 10183, 0, 0, 65499, 0, 64593, 66758, 3376, - 0, 0, 0, 101077, 43872, 12940, 0, 0, 78587, 101078, 5957, 0, 8926, - 983310, 983309, 983308, 10745, 10174, 983305, 113793, 983303, 983302, - 983301, 0, 0, 5056, 0, 0, 0, 120773, 0, 9812, 0, 4460, 127792, 73066, 0, - 128038, 0, 0, 0, 64278, 0, 0, 0, 66760, 0, 0, 70122, 0, 0, 917627, 0, - 73823, 101071, 0, 2276, 0, 42579, 0, 983300, 983299, 127831, 983297, - 983296, 983295, 983294, 983293, 74207, 121255, 10482, 12863, 73002, 2412, - 0, 9522, 0, 983887, 120674, 101059, 3384, 101058, 10702, 830, 0, 128166, - 0, 8451, 0, 0, 121380, 69739, 128957, 0, 0, 0, 0, 0, 0, 0, 4243, 0, - 73093, 0, 0, 4441, 0, 983290, 983289, 66618, 983287, 125141, 411, 983284, - 68068, 983282, 4056, 983894, 0, 92666, 0, 983897, 983949, 0, 0, 3364, - 42265, 64437, 0, 118816, 0, 9684, 216, 0, 1401, 0, 0, 0, 0, 0, 0, 0, - 11126, 5768, 0, 0, 0, 0, 0, 0, 0, 65895, 0, 0, 3338, 73935, 983278, - 983277, 983276, 983275, 983274, 983273, 2794, 8807, 0, 0, 110720, 0, - 8312, 0, 110718, 11953, 11662, 0, 0, 0, 0, 9534, 66767, 129040, 0, 11113, - 0, 0, 73082, 0, 981, 0, 4330, 119244, 120536, 1824, 0, 0, 7034, 41683, 0, - 0, 73754, 0, 0, 74478, 128259, 983268, 983255, 983254, 43831, 983252, - 66752, 983250, 983249, 0, 70288, 65343, 0, 0, 43225, 0, 0, 0, 0, 126129, - 0, 128608, 0, 0, 0, 120726, 0, 983833, 11746, 0, 5216, 0, 0, 0, 0, 3468, - 127149, 9230, 65942, 0, 0, 5803, 120677, 0, 0, 13124, 0, 0, 0, 42843, 0, - 0, 0, 66753, 11739, 128318, 0, 128444, 0, 0, 0, 12448, 0, 121441, 13057, - 73852, 124994, 0, 0, 0, 0, 0, 0, 126612, 0, 68903, 0, 0, 0, 917992, 0, 0, - 0, 0, 0, 0, 0, 92457, 0, 0, 0, 0, 0, 0, 0, 0, 125078, 0, 0, 0, 10970, - 92208, 0, 0, 0, 19944, 0, 9009, 8551, 0, 0, 0, 7575, 0, 0, 128899, 0, 0, - 78847, 0, 78846, 0, 0, 0, 0, 0, 0, 0, 9775, 100682, 0, 119052, 68629, - 194703, 0, 0, 78850, 92880, 0, 0, 0, 0, 0, 0, 0, 71273, 6184, 41540, - 3303, 66182, 11786, 66180, 66203, 3422, 0, 68290, 43007, 4478, 66178, 0, - 0, 0, 0, 4477, 0, 92720, 66184, 66183, 66204, 66194, 0, 66198, 41880, - 66188, 66197, 78148, 66195, 66190, 66191, 41111, 66189, 73788, 7788, 0, - 0, 0, 0, 0, 2221, 78163, 6535, 78161, 78162, 430, 78160, 78156, 78158, 0, - 0, 4945, 0, 4950, 0, 78165, 0, 67118, 0, 5964, 12908, 0, 0, 0, 74477, - 83390, 0, 4949, 0, 443, 0, 4944, 5467, 119603, 983260, 0, 9364, 0, - 119148, 4946, 0, 3788, 126106, 983699, 0, 120847, 0, 74441, 0, 0, 12072, - 92248, 0, 983689, 0, 128676, 12091, 0, 0, 0, 4673, 0, 4678, 0, 0, 65059, - 43860, 0, 0, 0, 128151, 1199, 0, 8356, 0, 0, 4677, 0, 0, 0, 4672, 78173, - 78175, 78171, 78172, 72255, 78170, 78166, 4674, 128450, 194944, 0, - 124970, 0, 119579, 0, 0, 1855, 0, 0, 0, 0, 0, 68912, 72323, 0, 12988, - 121000, 0, 0, 0, 4654, 6840, 983427, 0, 73993, 0, 4649, 65209, 983889, - 93839, 4648, 0, 121169, 983431, 0, 983422, 66846, 7828, 4650, 0, 72879, - 0, 4653, 7822, 0, 0, 43187, 0, 983574, 6821, 0, 0, 0, 0, 0, 0, 66756, + 119591, 64413, 0, 0, 0, 0, 0, 0, 0, 0, 123622, 0, 119160, 10204, 127947, + 73063, 0, 0, 127236, 0, 68746, 0, 8852, 0, 0, 0, 0, 128427, 123597, 7932, + 0, 128463, 0, 0, 0, 0, 0, 0, 0, 74893, 0, 0, 73095, 0, 8650, 0, 0, 0, + 69900, 118872, 0, 70868, 0, 6719, 0, 0, 0, 72836, 0, 0, 118991, 0, + 123594, 73815, 4420, 0, 10583, 7760, 0, 0, 128752, 71711, 0, 128407, 0, + 0, 0, 9066, 0, 74795, 0, 0, 0, 0, 0, 0, 0, 42825, 41854, 5304, 0, 124942, + 6919, 8619, 0, 10038, 66454, 9592, 129049, 0, 0, 110771, 110777, 110772, + 0, 0, 0, 0, 0, 78498, 110773, 43624, 0, 7779, 0, 0, 9479, 78493, 0, 0, + 2224, 0, 0, 0, 0, 0, 42378, 3368, 0, 66804, 7697, 69237, 0, 2030, 0, + 68236, 8370, 0, 127961, 0, 0, 983350, 127903, 983348, 983347, 5174, + 42831, 983344, 70439, 983342, 8881, 119047, 0, 70433, 0, 0, 0, 0, 0, 0, + 9576, 0, 3347, 4160, 5154, 0, 3794, 0, 0, 0, 0, 0, 127916, 73073, 8381, + 4572, 71129, 126101, 0, 0, 0, 0, 0, 0, 0, 92283, 0, 0, 5799, 983339, + 70100, 983337, 983336, 983335, 43031, 64425, 65128, 983331, 0, 73059, 0, + 68616, 0, 0, 0, 0, 0, 0, 0, 123604, 0, 0, 283, 68665, 0, 532, 0, 0, + 983808, 0, 0, 3370, 73077, 119132, 5443, 71431, 0, 0, 0, 0, 0, 2298, 0, + 0, 0, 983330, 983329, 983328, 983327, 7144, 983325, 119600, 983323, + 983322, 983321, 0, 78816, 128833, 0, 0, 0, 0, 0, 0, 0, 0, 73088, 0, + 123592, 983933, 0, 0, 0, 0, 5186, 7360, 127837, 0, 12108, 0, 65124, 0, 0, + 0, 6326, 43344, 0, 0, 42562, 0, 0, 0, 983320, 65495, 983318, 101066, + 983316, 101065, 983314, 65490, 983312, 125034, 0, 101070, 0, 55245, + 128927, 1630, 128232, 65483, 0, 0, 0, 65476, 0, 0, 119214, 9283, 10183, + 0, 0, 65499, 0, 64593, 66758, 3376, 0, 0, 0, 101077, 43872, 12940, 0, 0, + 78587, 101078, 5957, 0, 8926, 983310, 983309, 983308, 10745, 10174, + 983305, 113793, 983303, 983302, 983301, 0, 123593, 5056, 0, 0, 0, 120773, + 0, 9812, 0, 4460, 127792, 73066, 0, 128038, 0, 123608, 0, 64278, 0, 0, 0, + 66760, 0, 0, 70122, 0, 0, 917627, 0, 73823, 101071, 0, 2276, 0, 42579, 0, + 983300, 983299, 127831, 983297, 983296, 983295, 983294, 983293, 74207, + 121255, 10482, 12863, 73002, 2412, 0, 9522, 0, 983887, 120674, 101059, + 3384, 101058, 10702, 830, 0, 128166, 0, 8451, 0, 0, 121380, 69739, + 128957, 0, 0, 0, 0, 0, 0, 0, 4243, 92454, 73093, 0, 0, 4441, 0, 983290, + 983289, 66618, 983287, 125141, 411, 983284, 68068, 983282, 4056, 983894, + 0, 92666, 0, 983897, 983949, 0, 0, 3364, 42265, 64437, 0, 118816, 0, + 9684, 216, 0, 1401, 0, 0, 0, 0, 0, 0, 0, 11126, 5768, 3191, 0, 0, 0, 0, + 0, 0, 65895, 0, 0, 3338, 73935, 983278, 983277, 983276, 129605, 983274, + 983273, 2794, 8807, 0, 0, 110720, 0, 8312, 0, 110718, 11953, 11662, 0, 0, + 0, 0, 9534, 66767, 129040, 0, 11113, 0, 0, 73082, 0, 981, 0, 4330, + 119244, 120536, 1824, 0, 0, 7034, 41683, 123166, 0, 73754, 0, 0, 74478, + 128259, 983268, 983255, 983254, 43831, 983252, 66752, 983250, 983249, 0, + 70288, 65343, 0, 0, 43225, 0, 0, 0, 0, 126129, 0, 128608, 0, 0, 0, + 120726, 0, 983833, 11746, 0, 5216, 0, 0, 0, 0, 3468, 127149, 9230, 65942, + 0, 0, 5803, 120677, 0, 0, 13124, 0, 0, 0, 42843, 0, 0, 0, 66753, 11739, + 128318, 0, 128444, 0, 0, 0, 12448, 0, 121441, 13057, 73852, 124994, 0, 0, + 0, 0, 0, 0, 126612, 0, 68903, 0, 129470, 0, 917992, 0, 0, 0, 0, 0, 0, 0, + 92457, 0, 0, 0, 0, 0, 0, 0, 0, 125078, 0, 0, 0, 10970, 92208, 0, 0, 0, + 19944, 0, 9009, 8551, 0, 0, 0, 7575, 0, 0, 128899, 0, 129609, 78847, 0, + 78846, 0, 0, 0, 0, 0, 0, 0, 9775, 100682, 129191, 119052, 68629, 194703, + 0, 0, 78850, 92880, 0, 0, 0, 0, 0, 0, 0, 71273, 6184, 41540, 3303, 66182, + 11786, 66180, 66203, 3422, 0, 68290, 43007, 4478, 66178, 0, 0, 126216, 0, + 4477, 0, 69608, 66184, 66183, 66204, 66194, 0, 66198, 41880, 66188, + 66197, 78148, 66195, 66190, 66191, 41111, 66189, 73788, 7788, 0, 0, 0, 0, + 0, 2221, 78163, 6535, 78161, 78162, 430, 78160, 78156, 78158, 0, 0, 4945, + 0, 4950, 0, 78165, 0, 67118, 0, 5964, 12908, 0, 0, 0, 74477, 83390, 0, + 4949, 0, 443, 0, 4944, 5467, 119603, 983260, 0, 9364, 0, 119148, 4946, 0, + 3788, 126106, 983699, 0, 120847, 0, 74441, 0, 0, 12072, 92248, 0, 983689, + 0, 128676, 12091, 0, 0, 0, 4673, 0, 4678, 0, 0, 65059, 43860, 0, 0, 0, + 128151, 1199, 0, 8356, 0, 0, 4677, 0, 0, 0, 4672, 78173, 78175, 78171, + 78172, 72255, 78170, 78166, 4674, 128450, 194944, 0, 124970, 0, 119579, + 0, 0, 1855, 0, 0, 127806, 0, 0, 68912, 72323, 0, 12988, 121000, 0, 0, 0, + 4654, 6840, 983427, 0, 73993, 0, 4649, 65209, 983889, 93839, 4648, 0, + 121169, 983431, 126231, 983422, 66846, 7828, 4650, 983421, 72879, 0, + 4653, 7822, 0, 0, 43187, 0, 983574, 6821, 0, 0, 0, 0, 0, 0, 66756, 983428, 0, 0, 0, 8547, 0, 42165, 0, 119228, 6836, 0, 0, 4662, 0, 0, 0, 9146, 599, 4657, 0, 120754, 0, 4656, 0, 0, 7811, 40994, 0, 6414, 5967, 4658, 3725, 0, 5814, 4661, 127760, 194961, 0, 0, 64904, 0, 10833, 0, 0, @@ -27142,27 +27806,27 @@ static unsigned int code_hash[] = { 111180, 74209, 0, 64740, 0, 0, 0, 983916, 3767, 5737, 0, 4865, 0, 5740, 0, 5736, 7724, 0, 7193, 0, 0, 5739, 0, 4866, 0, 0, 0, 4869, 67093, 0, 0, 128514, 6650, 983483, 0, 983474, 78376, 4870, 0, 68661, 6716, 983473, - 68667, 69786, 68676, 0, 10122, 4864, 66568, 0, 0, 0, 9603, 68652, 0, + 68667, 69786, 68676, 0, 10122, 4864, 66568, 0, 0, 0, 9603, 68652, 126213, 42734, 745, 0, 0, 0, 4777, 0, 917925, 68631, 42775, 68196, 0, 0, 0, 0, 5966, 0, 4778, 127890, 0, 0, 4781, 127196, 64407, 0, 74132, 8577, 71221, 0, 71223, 0, 4782, 0, 0, 120757, 68618, 43472, 43056, 68622, 0, 92986, 4776, 0, 11492, 0, 0, 13176, 0, 0, 0, 0, 0, 0, 0, 4849, 8242, 9561, - 73922, 0, 0, 0, 0, 5963, 0, 125201, 0, 4850, 0, 0, 590, 4853, 0, 4854, 0, - 5164, 0, 1605, 5124, 0, 111165, 0, 8471, 0, 111164, 12445, 3785, 0, - 111162, 0, 0, 4848, 2530, 0, 2068, 1964, 0, 0, 10796, 0, 0, 0, 0, 0, + 73922, 0, 0, 0, 0, 5963, 0, 125201, 0, 4850, 72121, 0, 590, 4853, 0, + 4854, 0, 5164, 0, 1605, 5124, 0, 111165, 0, 8471, 0, 111164, 12445, 3785, + 0, 111162, 0, 0, 4848, 2530, 0, 2068, 1964, 0, 0, 10796, 0, 0, 0, 0, 0, 4794, 0, 0, 0, 4797, 68040, 111152, 43465, 4792, 0, 0, 0, 0, 0, 110842, 983101, 92963, 0, 0, 0, 4221, 92360, 118869, 0, 0, 0, 70042, 0, 0, 0, 0, 10739, 65090, 0, 119327, 126541, 0, 0, 119326, 0, 0, 4937, 43376, 0, 0, - 10597, 0, 11722, 9248, 0, 42879, 11725, 0, 0, 7579, 11141, 73958, 4941, - 0, 917538, 9140, 4936, 5261, 0, 0, 72298, 0, 4942, 0, 4938, 0, 0, 5259, - 9369, 983429, 111182, 5257, 0, 6844, 4964, 5264, 0, 0, 0, 41411, 0, - 121473, 0, 128233, 9482, 4873, 41991, 64707, 42526, 127989, 64480, 64725, - 983442, 0, 0, 0, 0, 0, 0, 73043, 0, 389, 10893, 7521, 0, 4872, 5463, 0, - 3125, 111124, 0, 4878, 5459, 4604, 0, 0, 5465, 0, 0, 0, 0, 9563, 0, 0, - 128419, 125273, 0, 0, 0, 0, 67735, 0, 0, 0, 0, 0, 78179, 0, 917838, 0, - 917833, 0, 917836, 0, 0, 3082, 0, 0, 0, 0, 0, 7079, 5856, 917842, 5163, - 0, 0, 1817, 66724, 0, 0, 10564, 7763, 13077, 0, 0, 68140, 111137, 0, 0, - 0, 111139, 0, 111149, 121457, 0, 0, 0, 983189, 73081, 0, 0, 983117, + 10597, 0, 11722, 9248, 129566, 42879, 11725, 0, 0, 7579, 11141, 73958, + 4941, 0, 917538, 9140, 4936, 5261, 0, 0, 72298, 0, 4942, 0, 4938, 0, 0, + 5259, 9369, 983429, 111182, 5257, 0, 6844, 4964, 5264, 0, 0, 0, 41411, 0, + 121473, 73684, 128233, 9482, 4873, 41991, 64707, 42526, 127989, 64480, + 64725, 983442, 0, 0, 0, 0, 0, 0, 73043, 0, 389, 10893, 7521, 0, 4872, + 5463, 0, 3125, 111124, 0, 4878, 5459, 4604, 0, 0, 5465, 0, 0, 0, 0, 9563, + 0, 0, 128419, 125273, 0, 0, 0, 0, 67735, 0, 0, 0, 0, 0, 78179, 0, 917838, + 0, 917833, 0, 917836, 0, 0, 3082, 0, 0, 0, 0, 0, 7079, 5856, 917842, + 5163, 0, 0, 1817, 66724, 0, 0, 10564, 7763, 13077, 0, 0, 68140, 111137, + 0, 0, 0, 111139, 0, 111149, 121457, 0, 0, 0, 983189, 73081, 0, 0, 983117, 983077, 0, 42156, 0, 0, 0, 983080, 0, 0, 0, 119254, 120693, 0, 69386, 0, 118881, 0, 78189, 0, 78186, 78188, 0, 0, 0, 0, 110877, 0, 3108, 9745, 0, 0, 0, 118825, 0, 0, 0, 0, 0, 10972, 0, 0, 42768, 715, 983113, 121117, @@ -27190,10 +27854,10 @@ static unsigned int code_hash[] = { 4738, 42105, 7062, 0, 4737, 11779, 4742, 120564, 92391, 0, 41374, 41375, 983376, 6715, 12700, 7049, 983374, 0, 0, 0, 4741, 42108, 983365, 64159, 4736, 64148, 0, 849, 0, 128247, 983361, 0, 120913, 917997, 0, 983379, - 9496, 66371, 983403, 0, 11322, 0, 0, 3928, 983152, 0, 10706, 7198, 0, + 9496, 66371, 983403, 0, 11322, 0, 93008, 3928, 983152, 0, 10706, 7198, 0, 4842, 12053, 0, 0, 4841, 0, 4171, 12008, 68416, 3923, 1490, 0, 0, 983393, 40972, 5245, 72288, 983395, 126578, 0, 4845, 8332, 40974, 0, 4840, 9077, - 0, 2408, 72851, 4825, 0, 0, 0, 0, 983399, 0, 0, 983353, 0, 983354, 0, + 0, 2408, 72851, 4825, 0, 0, 0, 0, 126251, 0, 0, 983353, 0, 983354, 0, 4826, 42440, 0, 0, 1274, 0, 74315, 0, 120384, 0, 121200, 0, 0, 0, 4830, 983388, 129044, 0, 0, 119082, 0, 64105, 0, 0, 4824, 120397, 0, 0, 1888, 64127, 7861, 125111, 78524, 41836, 0, 10873, 72439, 0, 64098, 12214, 0, @@ -27201,11 +27865,11 @@ static unsigned int code_hash[] = { 119053, 0, 119055, 119054, 0, 0, 0, 0, 4017, 12827, 5241, 0, 73042, 41118, 3924, 0, 11366, 0, 0, 0, 0, 41116, 69455, 0, 0, 0, 0, 11917, 0, 74000, 4721, 129635, 983918, 0, 0, 0, 0, 0, 0, 122907, 0, 128702, 4722, - 6816, 124974, 0, 4725, 67099, 4726, 0, 0, 0, 0, 0, 0, 0, 0, 4015, 0, - 8052, 78766, 0, 0, 128294, 0, 0, 4720, 73090, 125003, 0, 0, 1656, 41831, - 0, 0, 41843, 0, 0, 1452, 13111, 0, 0, 0, 8552, 64113, 41845, 64073, - 120354, 0, 0, 120066, 120067, 7064, 64070, 9948, 0, 0, 0, 0, 2420, 0, 0, - 0, 0, 120052, 120053, 120050, 74920, 3938, 120057, 120054, 119249, + 6816, 124974, 0, 4725, 67099, 4726, 0, 0, 123171, 0, 123194, 0, 0, 0, + 4015, 0, 8052, 78766, 0, 0, 128294, 0, 0, 4720, 73090, 125003, 0, 0, + 1656, 41831, 0, 0, 41843, 0, 0, 1452, 13111, 0, 0, 0, 8552, 64113, 41845, + 64073, 120354, 0, 0, 120066, 120067, 7064, 64070, 9948, 0, 0, 0, 0, 2420, + 0, 0, 0, 0, 120052, 120053, 120050, 74920, 3938, 120057, 120054, 119249, 120060, 71920, 120058, 120059, 120064, 72203, 7955, 64074, 4713, 128196, 983107, 0, 0, 0, 65152, 10198, 120044, 120045, 120042, 6713, 4532, 120049, 120046, 120047, 4717, 7046, 0, 66450, 4712, 75055, 0, 121085, 0, @@ -27213,183 +27877,184 @@ static unsigned int code_hash[] = { 0, 129061, 66437, 66025, 74115, 0, 0, 11228, 4809, 0, 92221, 72352, 0, 0, 0, 65405, 0, 0, 0, 73934, 4545, 0, 917566, 0, 4813, 78699, 0, 0, 4808, 0, 0, 65475, 0, 0, 4814, 72240, 4810, 0, 0, 68784, 10761, 71249, 3522, 0, - 78693, 65404, 0, 0, 0, 0, 0, 6691, 70125, 0, 0, 0, 0, 0, 43858, 0, 0, - 12992, 65407, 0, 0, 3919, 0, 0, 0, 0, 0, 0, 12235, 110748, 0, 0, 64091, - 68739, 64080, 0, 64090, 0, 0, 0, 0, 0, 8454, 0, 0, 983858, 0, 0, 0, 4780, - 0, 0, 92764, 64621, 6732, 0, 0, 0, 0, 121363, 0, 0, 120817, 6976, 0, - 119005, 0, 93809, 0, 0, 0, 12526, 120399, 2315, 0, 1938, 0, 0, 0, 0, 0, - 0, 0, 120358, 93794, 0, 0, 0, 93810, 0, 2291, 0, 0, 0, 0, 129429, 0, - 10799, 0, 0, 66372, 0, 4193, 0, 0, 983057, 7998, 0, 0, 0, 0, 2316, 0, 0, - 0, 0, 125241, 0, 0, 74140, 0, 0, 0, 0, 3762, 93813, 120672, 93820, 0, 0, - 0, 70098, 3780, 12808, 8163, 983154, 0, 0, 3906, 12349, 0, 8326, 0, - 65498, 3763, 0, 5618, 0, 3779, 0, 43613, 0, 128007, 0, 0, 0, 0, 280, 0, - 0, 983448, 13072, 1894, 0, 0, 65478, 43310, 7231, 0, 11773, 0, 0, 0, 0, - 0, 0, 7559, 11652, 10009, 110765, 110766, 110763, 110764, 4470, 110762, - 0, 0, 983441, 0, 5249, 0, 0, 8756, 0, 0, 41694, 120585, 92349, 0, 0, 0, - 69685, 983768, 983445, 113794, 0, 6808, 41319, 13125, 66332, 127977, 0, - 2290, 0, 983413, 0, 0, 3943, 0, 41205, 0, 0, 0, 0, 5352, 0, 0, 41207, 0, - 7384, 69647, 41204, 0, 41209, 69637, 0, 43607, 0, 0, 5420, 0, 10134, 0, - 0, 4018, 7150, 0, 0, 0, 0, 0, 0, 2561, 0, 0, 7148, 12076, 0, 0, 0, 0, - 6276, 1706, 0, 0, 7146, 0, 128277, 41819, 74991, 0, 10847, 41822, 72248, - 860, 0, 0, 0, 69641, 10753, 41820, 126118, 0, 71898, 0, 92617, 128567, 0, - 0, 43016, 0, 0, 92225, 0, 0, 0, 0, 4022, 0, 0, 110807, 0, 41691, 0, - 75060, 0, 0, 65292, 0, 110812, 0, 3911, 110811, 110808, 110809, 0, - 125191, 7000, 3904, 118997, 72261, 0, 0, 0, 13123, 10846, 0, 0, 0, 0, 0, - 74082, 0, 0, 0, 0, 3777, 128329, 0, 9636, 71726, 0, 0, 9367, 593, 0, - 3999, 0, 41713, 0, 0, 67677, 0, 0, 0, 9763, 120280, 120283, 12347, 124, - 12981, 41127, 92527, 0, 0, 0, 0, 0, 43987, 0, 0, 1769, 41715, 2463, 2151, - 0, 0, 71222, 1538, 93044, 0, 0, 0, 7795, 120300, 0, 92493, 10955, 0, 0, - 0, 78208, 9498, 78207, 127033, 78210, 120288, 3939, 120290, 120285, 8943, - 120287, 120286, 120297, 4491, 120299, 42602, 120293, 120292, 120295, - 120294, 0, 0, 0, 0, 0, 0, 1511, 9324, 0, 0, 0, 0, 0, 64536, 0, 0, 0, - 124935, 6822, 12862, 0, 0, 42143, 41828, 0, 917629, 70864, 118879, 0, 0, - 0, 41826, 128413, 0, 0, 13279, 7917, 0, 0, 0, 0, 0, 0, 92332, 0, 0, - 43515, 0, 0, 0, 4013, 0, 0, 0, 72224, 125266, 0, 68243, 2432, 0, 0, 0, 0, - 0, 69952, 0, 0, 0, 10949, 0, 0, 0, 0, 0, 0, 0, 128574, 43233, 0, 42517, - 0, 0, 0, 0, 0, 64468, 119359, 6474, 127275, 43497, 12656, 128122, 119353, - 0, 1665, 0, 0, 0, 119351, 0, 0, 5256, 0, 0, 0, 2859, 0, 0, 0, 0, 0, 0, - 128220, 0, 770, 0, 811, 0, 0, 917551, 42244, 64427, 0, 72222, 0, 3895, 0, - 74341, 12087, 0, 42859, 10193, 3116, 7747, 0, 0, 43496, 0, 0, 0, 0, - 41877, 0, 65382, 64614, 0, 64296, 0, 6345, 0, 2663, 0, 121234, 0, 0, - 10150, 0, 64308, 1522, 597, 0, 0, 41201, 64731, 0, 0, 41198, 0, 71483, - 3092, 0, 0, 4783, 71448, 0, 0, 0, 10812, 0, 0, 0, 3078, 0, 0, 0, 0, 0, - 71703, 394, 3088, 0, 0, 0, 3991, 0, 129072, 0, 424, 67652, 74927, 0, 0, - 0, 0, 0, 0, 42231, 2209, 128215, 72983, 0, 41840, 129136, 5344, 1298, 0, - 13155, 0, 128973, 41838, 0, 8488, 1003, 41837, 0, 0, 0, 48, 0, 0, 8493, - 0, 0, 0, 65487, 0, 8465, 10332, 13172, 0, 0, 10449, 126989, 127014, 0, - 69447, 3984, 129159, 0, 0, 0, 0, 0, 0, 0, 0, 64758, 0, 100947, 0, 0, - 9096, 0, 0, 9172, 128545, 0, 0, 5955, 67666, 0, 0, 0, 0, 0, 74426, 3926, - 71734, 0, 8798, 100946, 92165, 0, 0, 120696, 0, 0, 0, 118805, 10353, - 10417, 0, 0, 0, 128629, 4019, 0, 0, 0, 8219, 68402, 0, 0, 121301, 0, 0, - 0, 0, 0, 0, 0, 0, 110625, 42474, 10642, 3909, 9950, 0, 128139, 0, 68678, - 92917, 0, 1049, 43517, 65707, 11943, 41806, 0, 68635, 3921, 0, 11775, - 121352, 69820, 1038, 42303, 9823, 0, 2145, 4008, 68624, 0, 121025, 0, 0, - 5153, 41805, 0, 0, 763, 9211, 0, 0, 0, 0, 0, 127142, 0, 0, 65179, 0, - 8621, 0, 118878, 0, 0, 0, 0, 182, 0, 0, 0, 0, 72978, 9058, 8489, 0, - 71188, 5969, 65909, 10848, 4570, 0, 128614, 4255, 0, 0, 41189, 4003, - 69785, 68109, 13293, 41192, 0, 0, 42251, 0, 0, 126085, 11287, 6128, - 121315, 11034, 0, 68207, 0, 65506, 42382, 0, 0, 66872, 9932, 43516, 0, - 125098, 0, 41814, 0, 71234, 0, 12117, 127040, 127041, 10540, 127043, - 9063, 78000, 0, 0, 0, 12897, 0, 0, 0, 6065, 0, 0, 0, 8692, 41186, 41816, - 0, 41818, 41187, 0, 42196, 0, 110690, 110691, 126115, 0, 0, 125235, 4710, - 0, 5956, 7621, 110641, 92624, 4705, 716, 74918, 110693, 4704, 0, 0, - 127112, 161, 0, 0, 0, 4706, 0, 0, 0, 4709, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1700, 119223, 0, 0, 128119, 4004, 0, 73071, 69383, 69914, 8506, 0, 0, - 126996, 2538, 937, 0, 4734, 0, 0, 0, 0, 0, 4729, 0, 0, 0, 4728, 0, 72809, - 120644, 0, 8109, 43105, 11249, 4730, 447, 0, 1513, 4733, 0, 0, 0, 0, 0, - 0, 0, 8565, 2469, 0, 6690, 0, 0, 43439, 78218, 43103, 78217, 2674, 0, - 11922, 0, 0, 3510, 0, 129368, 0, 5605, 42095, 126572, 0, 9098, 120512, 0, - 121272, 68891, 74570, 0, 67708, 0, 119346, 0, 5959, 0, 0, 66275, 43371, - 0, 0, 0, 0, 0, 12769, 69793, 0, 1283, 0, 4779, 0, 3719, 4006, 0, 0, - 71186, 68204, 0, 0, 119331, 43028, 65493, 0, 125058, 5962, 65485, 92616, - 0, 43501, 5827, 0, 120951, 0, 65494, 0, 129365, 0, 0, 119526, 0, 0, 0, 0, - 983203, 65467, 0, 0, 0, 0, 521, 0, 0, 983909, 0, 0, 483, 7096, 0, 0, 928, - 0, 0, 0, 0, 92983, 3989, 73972, 0, 0, 0, 0, 12145, 0, 73932, 0, 0, 3769, - 0, 0, 0, 0, 0, 0, 65290, 92223, 0, 65855, 0, 0, 0, 0, 128811, 0, 0, 0, 0, - 0, 0, 73838, 0, 0, 13007, 68165, 0, 0, 12661, 7608, 75032, 12213, 0, 0, - 0, 0, 12195, 4001, 3112, 92647, 0, 7590, 0, 0, 421, 0, 0, 0, 4130, - 127775, 7595, 42588, 7600, 0, 0, 0, 0, 65851, 42607, 0, 92403, 8680, 0, - 42134, 0, 0, 2846, 92605, 0, 0, 0, 0, 12979, 0, 0, 92558, 3740, 69843, - 120437, 0, 120451, 65923, 120435, 0, 120434, 0, 93800, 3118, 74265, - 93795, 93816, 93823, 93797, 8127, 92912, 93792, 7943, 93821, 93799, - 10618, 2584, 93793, 0, 0, 9998, 0, 0, 0, 66350, 0, 0, 0, 121374, 8279, - 128169, 0, 4975, 70075, 0, 0, 1631, 0, 0, 0, 6290, 0, 66386, 0, 64645, 0, - 0, 0, 0, 0, 9242, 93807, 93802, 93801, 983264, 93803, 3122, 93804, 7793, - 0, 0, 0, 0, 12604, 93808, 6615, 67650, 0, 3986, 44025, 0, 8912, 0, 7409, - 0, 0, 0, 0, 0, 0, 8540, 11498, 0, 0, 0, 0, 0, 13060, 120682, 0, 0, 0, 0, - 0, 121345, 0, 0, 7020, 120353, 3765, 92881, 0, 1606, 120348, 120351, - 3093, 110593, 0, 0, 0, 0, 0, 0, 92892, 120337, 69402, 120339, 4023, - 120333, 120332, 120335, 92250, 120345, 12810, 120347, 120346, 4455, - 120340, 120343, 120342, 66660, 0, 0, 0, 0, 113720, 13089, 74355, 120329, - 120328, 42758, 12196, 128429, 0, 0, 0, 0, 128867, 127806, 0, 3120, 9797, - 0, 0, 11086, 10389, 0, 101025, 4895, 128153, 124941, 4359, 0, 0, 3509, - 70037, 486, 0, 0, 0, 0, 0, 7004, 0, 0, 0, 0, 4855, 128200, 0, 0, 0, 0, 0, - 0, 10381, 70839, 0, 0, 0, 0, 125121, 70837, 125070, 129431, 983372, 0, 0, - 983359, 0, 120063, 0, 0, 0, 75048, 0, 74900, 0, 0, 120978, 0, 983351, 0, - 10339, 0, 0, 0, 0, 0, 0, 0, 43032, 125010, 0, 983380, 12671, 11384, 0, 0, - 120901, 64797, 0, 5820, 0, 0, 0, 0, 0, 120650, 42137, 9893, 8851, 12664, - 0, 0, 13192, 0, 41799, 65530, 0, 0, 43039, 3114, 0, 0, 0, 0, 0, 926, 0, - 0, 0, 0, 0, 0, 0, 43037, 41798, 0, 0, 127769, 41801, 0, 0, 0, 4200, - 12699, 8331, 70118, 3091, 92980, 66298, 70293, 8360, 0, 78044, 0, 4229, - 64543, 983236, 65563, 0, 129310, 2861, 43793, 10095, 121428, 9195, - 121381, 121132, 0, 0, 0, 0, 43041, 0, 43794, 0, 83167, 0, 43797, 8209, 0, - 129132, 12973, 0, 0, 0, 0, 0, 121235, 5760, 0, 743, 0, 0, 0, 0, 0, 0, - 83170, 128589, 0, 0, 119063, 0, 0, 0, 19919, 0, 64532, 0, 43710, 0, 0, - 9483, 71115, 0, 43697, 0, 0, 83211, 0, 0, 0, 7247, 0, 0, 0, 0, 0, 113674, - 0, 7471, 120823, 128743, 12682, 0, 0, 65679, 983143, 0, 0, 83201, 1099, - 74241, 0, 10501, 0, 0, 113743, 0, 64743, 128476, 67663, 0, 0, 92219, 0, - 83197, 64897, 9973, 1818, 0, 0, 8272, 127812, 0, 4218, 3087, 0, 127234, - 0, 0, 65181, 9954, 10465, 0, 0, 0, 9106, 0, 67406, 0, 0, 0, 0, 43038, 0, - 0, 265, 0, 0, 0, 0, 0, 0, 69405, 0, 59, 0, 0, 0, 0, 0, 41810, 0, 126492, - 0, 41809, 41888, 0, 41795, 0, 42213, 0, 0, 43033, 511, 129413, 0, 13127, - 0, 0, 0, 0, 111107, 0, 4467, 41812, 41215, 0, 41211, 917783, 4453, - 983409, 0, 983174, 0, 983407, 41213, 118812, 0, 0, 0, 0, 41841, 6617, 0, - 0, 92995, 462, 0, 10493, 0, 55248, 0, 0, 74471, 6644, 0, 0, 0, 983383, - 100484, 9581, 67104, 3098, 0, 0, 983410, 125250, 0, 120621, 0, 0, 0, 0, - 101011, 0, 118789, 74473, 3755, 64661, 7748, 7235, 3966, 0, 0, 127510, 0, - 0, 0, 5726, 66456, 42175, 100486, 0, 42212, 92681, 121443, 2851, 43017, - 0, 121056, 4373, 0, 0, 9587, 0, 6671, 128840, 3100, 0, 0, 0, 0, 0, - 917789, 73836, 8190, 12083, 917791, 0, 6689, 64629, 0, 0, 0, 4419, - 917787, 101017, 0, 69851, 0, 0, 8891, 3080, 0, 2347, 0, 0, 8990, 0, - 121201, 0, 92528, 249, 0, 0, 69424, 0, 0, 0, 55253, 0, 0, 11173, 995, 0, - 121047, 119861, 0, 0, 0, 0, 19945, 0, 558, 983394, 12273, 0, 983862, 0, - 69912, 120861, 129492, 67274, 124999, 0, 68019, 43030, 3129, 0, 2102, 0, - 0, 121450, 0, 7725, 0, 11120, 0, 126111, 69246, 0, 0, 0, 41894, 0, 41898, - 0, 41893, 74921, 128678, 3540, 11848, 0, 73005, 120848, 0, 0, 126113, - 73959, 0, 0, 0, 120858, 0, 0, 9699, 128656, 41896, 0, 83196, 69230, - 74951, 0, 72736, 0, 0, 3095, 983670, 11946, 983866, 0, 0, 0, 0, 0, - 113677, 3672, 119864, 0, 0, 0, 128539, 8890, 93826, 0, 128182, 0, 0, 0, - 126568, 0, 0, 983617, 9516, 983436, 0, 0, 42220, 0, 4450, 0, 11547, - 43417, 128542, 356, 0, 0, 0, 0, 64901, 0, 0, 0, 0, 0, 0, 111302, 65940, - 2541, 71231, 0, 0, 126470, 3549, 0, 0, 0, 2743, 0, 0, 0, 9097, 128896, - 43015, 0, 0, 776, 2524, 0, 8573, 100665, 126494, 0, 0, 42694, 71122, - 8952, 10814, 118818, 0, 43646, 128598, 0, 0, 0, 128380, 100663, 0, 65853, - 42707, 1897, 93071, 0, 0, 71907, 69410, 0, 125106, 0, 0, 0, 68473, 66778, - 43573, 92638, 0, 0, 0, 120955, 73986, 0, 0, 43022, 0, 74841, 0, 67714, 0, - 0, 0, 0, 0, 4553, 0, 0, 0, 0, 0, 19921, 0, 0, 983668, 4567, 41891, 0, - 983800, 55249, 194663, 0, 194662, 0, 194665, 43042, 121291, 1377, 12869, - 0, 0, 9250, 0, 0, 0, 0, 125039, 194642, 0, 74995, 0, 194644, 0, 0, 0, - 194668, 121166, 0, 70275, 1898, 0, 0, 0, 802, 0, 0, 0, 6648, 0, 2528, 0, - 0, 194646, 194625, 194645, 68804, 844, 0, 68824, 0, 68818, 194650, 0, 0, - 0, 983724, 65464, 0, 0, 0, 0, 83221, 0, 0, 100680, 0, 0, 64371, 70665, 0, - 194654, 0, 0, 0, 0, 0, 6196, 6945, 0, 0, 0, 120491, 0, 68846, 6210, 0, - 70274, 0, 0, 0, 68067, 68834, 194715, 588, 9760, 129112, 0, 983704, - 128798, 0, 127992, 0, 0, 118905, 0, 0, 92485, 110839, 69396, 0, 3394, - 70734, 194639, 0, 0, 0, 0, 0, 0, 194656, 7817, 1841, 11055, 0, 194979, - 194983, 127011, 119074, 194987, 7701, 194998, 0, 0, 1946, 121404, 0, 0, - 0, 0, 0, 10934, 0, 70376, 0, 0, 8071, 3538, 0, 2287, 65328, 0, 0, 7614, - 0, 0, 0, 12009, 43968, 0, 67852, 0, 0, 10841, 0, 0, 0, 0, 0, 8960, 0, 0, - 65317, 0, 0, 0, 70374, 0, 0, 0, 65315, 0, 0, 0, 0, 0, 119621, 0, 11849, - 12447, 0, 0, 110741, 0, 0, 0, 0, 42767, 0, 0, 0, 43695, 120520, 11975, - 194941, 983443, 0, 2555, 0, 128640, 70070, 42936, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 66714, 0, 0, 70076, 65596, 121034, 66710, 67658, 0, 126994, - 65338, 7792, 0, 0, 67871, 119027, 0, 8233, 43572, 0, 0, 0, 3442, 0, 2841, - 12543, 0, 1473, 42820, 64329, 127832, 917772, 126126, 7937, 0, 1048, 0, - 0, 983924, 0, 3406, 1054, 100701, 1040, 65450, 0, 92329, 1069, 917763, - 128367, 128940, 0, 917765, 0, 983705, 9693, 110873, 0, 0, 0, 983929, - 4353, 0, 1059, 127530, 0, 0, 0, 127093, 118862, 120500, 10646, 0, 118833, - 917762, 70424, 74830, 0, 0, 983701, 10221, 100706, 68255, 0, 0, 74346, - 119619, 100707, 64945, 12921, 0, 0, 0, 0, 0, 983776, 43020, 0, 0, 74254, - 0, 983766, 0, 0, 983773, 0, 0, 0, 0, 0, 0, 0, 0, 120503, 70663, 0, 2755, - 0, 0, 0, 4857, 0, 4428, 0, 0, 983772, 0, 0, 0, 43842, 0, 122899, 0, 7978, - 0, 70392, 0, 11924, 43812, 0, 65015, 0, 563, 68340, 0, 12798, 0, 100727, - 0, 0, 0, 74110, 0, 94051, 0, 694, 0, 9876, 0, 119168, 0, 0, 0, 92361, 0, - 0, 7229, 0, 0, 0, 0, 64811, 0, 119087, 126478, 0, 7381, 0, 2525, 4852, - 11586, 68465, 41605, 126089, 0, 11582, 7151, 10155, 92578, 188, 0, 11592, - 0, 74015, 0, 0, 4858, 0, 0, 0, 4861, 0, 2786, 121431, 4856, 8051, 0, - 119609, 0, 113797, 71133, 0, 78448, 0, 0, 67842, 68084, 0, 0, 0, 0, 0, - 10234, 5843, 0, 71865, 66728, 0, 3157, 0, 0, 75035, 72788, 983731, 0, - 10822, 5149, 129517, 0, 65142, 0, 4565, 0, 0, 0, 12657, 0, 0, 386, 0, - 8834, 120974, 0, 43574, 0, 0, 0, 70113, 7220, 11839, 124984, 74883, - 194752, 0, 65241, 74503, 8160, 0, 194753, 0, 0, 0, 0, 0, 121265, 0, - 13303, 0, 0, 194755, 0, 118865, 0, 194761, 0, 0, 74505, 0, 0, 0, 100518, - 0, 8780, 100512, 0, 68745, 110626, 66697, 0, 2672, 3735, 983641, 0, - 68752, 11205, 10724, 41202, 0, 100714, 0, 0, 0, 0, 194765, 3842, 0, - 78183, 12442, 78182, 9791, 78181, 0, 42516, 67730, 64821, 195061, 194689, - 0, 78464, 119219, 78465, 0, 194690, 195063, 0, 0, 0, 0, 78540, 78541, - 78538, 1962, 78490, 78476, 65930, 11660, 0, 2072, 0, 0, 78544, 194704, - 78542, 10669, 110859, 110860, 110857, 110858, 0, 110856, 4105, 0, 194699, - 0, 0, 0, 13148, 195068, 78479, 9226, 0, 0, 10765, 127486, 71919, 121218, + 78693, 65404, 0, 0, 0, 0, 0, 6691, 70125, 0, 126223, 0, 0, 0, 43858, 0, + 0, 12992, 65407, 0, 0, 3919, 0, 0, 0, 0, 0, 0, 12235, 110748, 0, 0, + 64091, 68739, 64080, 0, 64090, 0, 0, 0, 0, 0, 8454, 0, 0, 983858, 0, 0, + 0, 4780, 0, 0, 92764, 64621, 6732, 0, 0, 0, 0, 121363, 0, 0, 120817, + 6976, 0, 119005, 0, 93809, 0, 0, 0, 12526, 120399, 2315, 0, 1938, 0, 0, + 0, 0, 0, 0, 0, 120358, 93794, 0, 0, 0, 93810, 0, 2291, 0, 0, 0, 0, + 129429, 0, 10799, 0, 0, 66372, 0, 4193, 0, 0, 983057, 7998, 0, 0, 0, 0, + 2316, 0, 0, 0, 0, 125241, 0, 0, 74140, 0, 0, 0, 0, 3762, 93813, 120672, + 93820, 0, 0, 0, 70098, 3780, 12808, 8163, 983154, 0, 0, 3906, 12349, 0, + 8326, 0, 65498, 3763, 0, 5618, 0, 3779, 0, 43613, 0, 128007, 0, 0, 0, 0, + 280, 0, 126252, 983448, 13072, 1894, 0, 0, 65478, 43310, 7231, 0, 11773, + 0, 0, 0, 0, 0, 0, 7559, 11652, 10009, 110765, 110766, 110763, 110764, + 4470, 110762, 0, 0, 983441, 0, 5249, 0, 0, 8756, 0, 0, 41694, 120585, + 92349, 0, 0, 0, 69685, 983768, 983445, 113794, 0, 6808, 41319, 13125, + 66332, 127977, 0, 2290, 0, 983413, 0, 0, 3943, 0, 41205, 0, 0, 0, 0, + 5352, 0, 0, 41207, 0, 7384, 69647, 41204, 0, 41209, 69637, 0, 43607, 0, + 0, 5420, 0, 10134, 0, 0, 4018, 7150, 0, 0, 0, 0, 0, 129606, 2561, 0, 0, + 7148, 12076, 0, 0, 0, 0, 6276, 1706, 0, 0, 7146, 0, 128277, 41819, 74991, + 0, 10847, 41822, 72248, 860, 0, 0, 0, 69641, 10753, 41820, 126118, 0, + 71898, 0, 92617, 128567, 0, 0, 43016, 0, 0, 92225, 0, 0, 0, 0, 4022, 0, + 0, 110807, 0, 41691, 0, 75060, 0, 0, 65292, 0, 110812, 0, 3911, 110811, + 110808, 110809, 0, 125191, 7000, 3904, 118997, 72261, 0, 0, 0, 13123, + 10846, 0, 0, 0, 0, 0, 74082, 0, 0, 0, 0, 3777, 128329, 0, 9636, 71726, 0, + 0, 9367, 593, 0, 3999, 0, 41713, 0, 0, 67677, 0, 0, 0, 9763, 120280, + 120283, 12347, 124, 12981, 41127, 92527, 0, 0, 0, 0, 0, 43987, 0, 0, + 1769, 41715, 2463, 2151, 0, 0, 71222, 1538, 93044, 0, 0, 0, 7795, 120300, + 0, 92493, 10955, 0, 0, 0, 78208, 9498, 78207, 127033, 78210, 120288, + 3939, 120290, 120285, 8943, 120287, 120286, 120297, 4491, 120299, 42602, + 120293, 120292, 120295, 120294, 0, 0, 0, 0, 0, 0, 1511, 9324, 0, 0, 0, 0, + 0, 64536, 0, 0, 0, 124935, 6822, 12862, 0, 0, 42143, 41828, 0, 917629, + 70864, 118879, 0, 0, 0, 41826, 128413, 0, 0, 13279, 7917, 0, 0, 0, 0, 0, + 0, 92332, 0, 0, 43515, 0, 0, 0, 4013, 0, 0, 0, 72224, 125266, 0, 68243, + 2432, 0, 0, 0, 0, 0, 69952, 0, 0, 0, 10949, 0, 0, 0, 0, 0, 0, 0, 128574, + 43233, 0, 42517, 0, 0, 0, 0, 0, 64468, 119359, 6474, 127275, 43497, + 12656, 128122, 119353, 0, 1665, 0, 0, 0, 119351, 0, 0, 5256, 0, 0, 0, + 2859, 0, 0, 0, 0, 0, 0, 128220, 0, 770, 0, 811, 0, 0, 917551, 42244, + 64427, 0, 72222, 0, 3895, 0, 74341, 12087, 0, 42859, 10193, 3116, 7747, + 0, 0, 43496, 0, 0, 0, 0, 41877, 0, 65382, 64614, 0, 64296, 0, 6345, 0, + 2663, 0, 121234, 0, 0, 10150, 0, 64308, 1522, 597, 0, 0, 41201, 64731, 0, + 0, 41198, 0, 71483, 3092, 0, 0, 4783, 71448, 0, 0, 0, 10812, 0, 0, 0, + 3078, 0, 0, 0, 0, 0, 71703, 394, 3088, 0, 0, 0, 3991, 0, 129072, 0, 424, + 67652, 74927, 0, 0, 0, 0, 0, 0, 42231, 2209, 128215, 72983, 0, 41840, + 129136, 5344, 1298, 0, 13155, 0, 128973, 41838, 0, 8488, 1003, 41837, 0, + 0, 0, 48, 0, 0, 8493, 0, 0, 0, 65487, 0, 8465, 10332, 13172, 0, 0, 10449, + 126989, 127014, 69606, 69447, 3984, 129159, 0, 0, 0, 0, 0, 0, 0, 0, + 64758, 0, 100947, 0, 0, 9096, 0, 0, 9172, 128545, 0, 0, 5955, 67666, 0, + 0, 0, 0, 0, 74426, 3926, 71734, 0, 8798, 100946, 92165, 0, 0, 120696, 0, + 0, 0, 118805, 10353, 10417, 0, 0, 0, 128629, 4019, 0, 0, 0, 8219, 68402, + 0, 0, 121301, 0, 0, 0, 0, 0, 0, 0, 0, 110625, 42474, 10642, 3909, 9950, + 0, 128139, 69619, 68678, 92917, 0, 1049, 43517, 65707, 11943, 41806, 0, + 68635, 3921, 0, 11775, 121352, 69820, 1038, 42303, 9823, 0, 2145, 4008, + 68624, 0, 121025, 0, 0, 5153, 41805, 0, 0, 763, 9211, 0, 0, 0, 0, 0, + 127142, 0, 0, 65179, 0, 8621, 0, 118878, 0, 0, 0, 0, 182, 0, 0, 0, 0, + 72978, 9058, 8489, 0, 71188, 5969, 65909, 10848, 4570, 0, 128614, 4255, + 0, 0, 41189, 4003, 69785, 68109, 13293, 41192, 0, 0, 42251, 0, 0, 126085, + 11287, 6128, 121315, 11034, 0, 68207, 0, 65506, 42382, 0, 0, 66872, 9932, + 43516, 0, 125098, 0, 41814, 0, 71234, 0, 12117, 127040, 127041, 10540, + 127043, 9063, 78000, 0, 0, 0, 12897, 0, 0, 0, 6065, 0, 0, 0, 8692, 41186, + 41816, 0, 41818, 41187, 0, 42196, 0, 110690, 110691, 126115, 0, 0, + 125235, 4710, 0, 5956, 7621, 110641, 92624, 4705, 716, 74918, 110693, + 4704, 0, 0, 127112, 161, 0, 0, 0, 4706, 0, 0, 0, 4709, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1700, 119223, 0, 0, 128119, 4004, 0, 73071, 69383, 69914, 8506, + 0, 0, 126996, 2538, 937, 0, 4734, 0, 0, 0, 0, 0, 4729, 0, 0, 0, 4728, 0, + 72809, 120644, 0, 8109, 43105, 11249, 4730, 447, 0, 1513, 4733, 0, 0, 0, + 0, 0, 0, 0, 8565, 2469, 0, 6690, 0, 0, 43439, 78218, 43103, 78217, 2674, + 0, 11922, 0, 0, 3510, 0, 129368, 0, 5605, 42095, 126572, 0, 9098, 120512, + 0, 121272, 68891, 74570, 0, 67708, 0, 119346, 0, 5959, 0, 0, 66275, + 43371, 0, 0, 0, 0, 0, 12769, 69793, 0, 1283, 0, 4779, 0, 3719, 4006, 0, + 0, 71186, 68204, 124957, 0, 119331, 43028, 65493, 0, 125058, 5962, 65485, + 92616, 0, 43501, 5827, 0, 120951, 0, 65494, 0, 129365, 0, 0, 43879, 0, 0, + 0, 0, 983203, 65467, 0, 0, 0, 0, 521, 0, 0, 983909, 0, 0, 483, 7096, 0, + 0, 928, 0, 0, 0, 0, 92983, 3989, 73972, 0, 0, 0, 0, 12145, 0, 73932, 0, + 0, 3769, 0, 0, 0, 0, 0, 0, 65290, 92223, 0, 65855, 0, 0, 0, 0, 128811, 0, + 0, 0, 0, 0, 0, 73838, 0, 0, 13007, 68165, 0, 0, 12661, 7608, 75032, + 12213, 0, 0, 0, 0, 12195, 4001, 3112, 92647, 0, 7590, 0, 0, 421, 0, 0, 0, + 4130, 127775, 7595, 42588, 7600, 0, 0, 0, 0, 65851, 42607, 0, 92403, + 8680, 0, 42134, 0, 0, 2846, 92605, 0, 0, 0, 0, 12979, 0, 0, 92558, 3740, + 69843, 120437, 0, 120451, 65923, 120435, 0, 120434, 0, 93800, 3118, + 74265, 93795, 93816, 93823, 93797, 8127, 92912, 93792, 7943, 93821, + 93799, 10618, 2584, 93793, 0, 0, 9998, 0, 0, 0, 66350, 0, 0, 0, 121374, + 8279, 128169, 0, 4975, 70075, 0, 0, 1631, 0, 0, 0, 6290, 128994, 66386, + 0, 64645, 0, 0, 0, 0, 0, 9242, 93807, 93802, 93801, 983264, 93803, 3122, + 93804, 7793, 0, 0, 0, 0, 12604, 93808, 6615, 67650, 0, 3986, 44025, 0, + 8912, 0, 7409, 0, 0, 0, 0, 0, 0, 8540, 11498, 0, 0, 0, 0, 0, 13060, + 120682, 0, 0, 0, 0, 0, 121345, 0, 0, 7020, 120353, 3765, 92881, 0, 1606, + 120348, 120351, 3093, 110593, 0, 0, 0, 0, 0, 0, 92892, 120337, 69402, + 120339, 4023, 120333, 120332, 120335, 92250, 120345, 12810, 120347, + 120346, 4455, 120340, 120343, 120342, 66660, 0, 0, 0, 0, 113720, 13089, + 74355, 120329, 120328, 42758, 12196, 128429, 0, 0, 0, 0, 128867, 94179, + 0, 3120, 9797, 0, 0, 11086, 10389, 0, 101025, 4895, 128153, 124941, 4359, + 0, 0, 3509, 70037, 486, 0, 0, 0, 0, 0, 7004, 0, 0, 0, 0, 4855, 128200, 0, + 0, 0, 0, 0, 0, 10381, 70839, 0, 0, 0, 0, 125121, 70837, 125070, 129431, + 983372, 983360, 0, 983359, 0, 120063, 0, 0, 0, 75048, 0, 74900, 0, 0, + 120978, 12161, 983351, 0, 10339, 0, 0, 0, 0, 0, 0, 0, 43032, 125010, 0, + 983380, 12671, 11384, 0, 0, 120901, 64797, 0, 5820, 0, 0, 0, 0, 0, + 120650, 42137, 9893, 8851, 12664, 0, 0, 13192, 0, 41799, 65530, 0, 0, + 43039, 3114, 0, 0, 0, 0, 0, 926, 0, 0, 0, 0, 0, 0, 0, 43037, 41798, 0, 0, + 123214, 41801, 0, 0, 0, 4200, 12699, 8331, 70118, 3091, 92980, 66298, + 70293, 8360, 0, 78044, 0, 4229, 64543, 126227, 65563, 0, 129310, 2861, + 43793, 10095, 121428, 9195, 121381, 121132, 0, 129578, 0, 0, 43041, 0, + 43794, 0, 83167, 0, 43797, 8209, 0, 129132, 12973, 0, 0, 0, 0, 0, 121235, + 5760, 0, 743, 0, 0, 0, 0, 0, 0, 83170, 128589, 129537, 0, 119063, 0, 0, + 0, 19919, 0, 64532, 0, 43710, 0, 0, 9483, 71115, 0, 43697, 0, 0, 83211, + 0, 0, 0, 7247, 0, 0, 0, 0, 0, 113674, 0, 7471, 120823, 128743, 12682, 0, + 0, 65679, 983143, 0, 0, 83201, 1099, 74241, 0, 10501, 0, 0, 113743, 0, + 64743, 128476, 67663, 0, 0, 92219, 0, 83197, 64897, 9973, 1818, 0, 0, + 8272, 127812, 0, 4218, 3087, 0, 127234, 0, 0, 65181, 9954, 10465, 0, 0, + 0, 9106, 0, 67406, 0, 0, 0, 0, 43038, 0, 0, 265, 0, 0, 0, 0, 0, 0, 69405, + 0, 59, 0, 0, 0, 0, 126239, 41810, 0, 126492, 0, 41809, 41888, 0, 41795, + 0, 42213, 0, 0, 43033, 511, 129413, 0, 13127, 0, 0, 0, 0, 111107, 0, + 4467, 41812, 41215, 0, 41211, 917783, 4453, 983409, 0, 983174, 0, 983407, + 41213, 118812, 0, 0, 0, 0, 41841, 6617, 0, 0, 92995, 462, 0, 10493, 0, + 55248, 0, 0, 74471, 6644, 0, 0, 0, 983383, 100484, 9581, 67104, 3098, 0, + 0, 983410, 125250, 0, 120621, 0, 0, 0, 129584, 101011, 0, 118789, 74473, + 3755, 64661, 7748, 7235, 3966, 0, 0, 127510, 0, 0, 0, 5726, 66456, 42175, + 100486, 0, 42212, 92681, 121443, 2851, 43017, 0, 121056, 4373, 0, 0, + 9587, 0, 6671, 128840, 3100, 0, 0, 0, 0, 0, 917789, 73836, 8190, 12083, + 917791, 0, 6689, 64629, 0, 0, 0, 4419, 917787, 101017, 0, 69851, 0, 0, + 8891, 3080, 0, 2347, 0, 0, 8990, 0, 121201, 0, 92528, 249, 0, 0, 69424, + 0, 0, 0, 55253, 0, 0, 11173, 995, 0, 121047, 119861, 0, 73708, 0, 0, + 19945, 0, 558, 983394, 12273, 0, 983862, 0, 69912, 120861, 129492, 67274, + 94178, 0, 68019, 43030, 3129, 0, 2102, 0, 0, 121450, 0, 7725, 0, 11120, + 0, 126111, 69246, 0, 0, 0, 41894, 0, 41898, 0, 41893, 74921, 128678, + 3540, 11848, 0, 73005, 120848, 0, 0, 126113, 73959, 0, 0, 0, 120858, 0, + 0, 9699, 128656, 41896, 0, 83196, 69230, 74951, 0, 72736, 0, 0, 3095, + 983670, 11946, 983866, 0, 0, 0, 0, 0, 113677, 3672, 119864, 0, 0, 0, + 128539, 8890, 93826, 0, 128182, 0, 0, 0, 126568, 0, 0, 983617, 9516, + 983436, 0, 0, 42220, 0, 4450, 0, 11547, 43417, 128542, 356, 0, 0, 0, 0, + 64901, 0, 0, 0, 0, 0, 0, 111302, 65940, 2541, 71231, 0, 123215, 126470, + 3549, 0, 0, 0, 2743, 0, 0, 0, 9097, 128896, 43015, 0, 0, 776, 2524, 0, + 8573, 100665, 126494, 0, 0, 42694, 71122, 8952, 10814, 118818, 0, 43646, + 128598, 0, 0, 0, 128380, 100663, 0, 65853, 42707, 1897, 93071, 0, 0, + 71907, 69410, 0, 125106, 0, 0, 0, 68473, 66778, 43573, 92638, 0, 0, 0, + 120955, 73986, 0, 0, 43022, 0, 74841, 0, 67714, 0, 0, 0, 0, 0, 4553, 0, + 0, 0, 0, 0, 19921, 0, 0, 983668, 4567, 41891, 0, 983800, 55249, 194663, + 0, 194662, 0, 194665, 43042, 121291, 1377, 12869, 0, 0, 9250, 0, 0, 0, 0, + 125039, 194642, 0, 74995, 0, 194644, 0, 0, 0, 194668, 121166, 0, 70275, + 1898, 0, 0, 0, 802, 0, 0, 0, 6648, 0, 2528, 0, 0, 194646, 194625, 194645, + 68804, 844, 0, 68824, 0, 68818, 194650, 0, 0, 0, 983724, 65464, 0, 0, 0, + 0, 83221, 0, 0, 100680, 0, 0, 64371, 70665, 0, 194654, 0, 0, 0, 0, 0, + 6196, 6945, 0, 0, 0, 120491, 0, 68846, 6210, 0, 70274, 0, 0, 0, 68067, + 68834, 194715, 588, 9760, 129112, 0, 983704, 128798, 0, 127992, 0, 0, + 118905, 0, 0, 92485, 110839, 69396, 0, 3394, 70734, 194639, 0, 0, 0, 0, + 0, 0, 194656, 7817, 1841, 11055, 0, 194979, 194983, 127011, 119074, + 194987, 7701, 194998, 0, 0, 1946, 121404, 0, 0, 0, 0, 0, 10934, 0, 70376, + 0, 0, 8071, 3538, 0, 2287, 65328, 0, 0, 7614, 0, 0, 0, 12009, 43968, 0, + 67852, 0, 0, 10841, 123640, 0, 0, 0, 0, 8960, 0, 0, 65317, 0, 0, 0, + 70374, 0, 0, 0, 65315, 0, 0, 0, 0, 0, 119621, 0, 11849, 12447, 0, 0, + 110741, 0, 0, 0, 0, 42767, 0, 0, 0, 43695, 120520, 11975, 194941, 983443, + 0, 2555, 0, 128640, 70070, 42936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66714, + 0, 0, 70076, 65596, 121034, 66710, 67658, 0, 126994, 65338, 7792, 0, 0, + 67871, 119027, 0, 8233, 43572, 0, 0, 0, 3442, 0, 2841, 12543, 0, 1473, + 42820, 64329, 127832, 917772, 126126, 7937, 0, 1048, 0, 0, 983924, 0, + 3406, 1054, 100701, 1040, 65450, 0, 92329, 1069, 917763, 128367, 128940, + 0, 917765, 0, 983705, 9693, 110873, 0, 0, 0, 983929, 4353, 0, 1059, + 127530, 0, 0, 0, 127093, 118862, 120500, 10646, 0, 100710, 917762, 70424, + 74830, 0, 0, 983701, 10221, 100706, 68255, 0, 0, 74346, 119619, 100707, + 64945, 12921, 0, 0, 0, 0, 0, 983776, 43020, 0, 0, 74254, 0, 983766, 0, 0, + 983773, 0, 0, 0, 0, 0, 0, 0, 0, 120503, 70663, 0, 2755, 0, 0, 0, 4857, 0, + 4428, 0, 0, 983772, 0, 0, 0, 43842, 0, 122899, 0, 7978, 0, 70392, 127080, + 11924, 43812, 0, 65015, 0, 563, 68340, 0, 12798, 0, 100727, 0, 0, 0, + 74110, 0, 94051, 0, 694, 0, 9876, 0, 119168, 0, 0, 0, 92361, 0, 0, 7229, + 0, 0, 0, 0, 64811, 0, 119087, 126478, 0, 7381, 0, 2525, 4852, 11586, + 68465, 41605, 126089, 0, 11582, 7151, 10155, 92578, 188, 0, 11592, 0, + 74015, 0, 0, 4858, 0, 0, 0, 4861, 0, 2786, 121431, 4856, 8051, 0, 119609, + 0, 113797, 71133, 0, 78448, 0, 0, 67842, 68084, 0, 0, 0, 0, 0, 10234, + 5843, 0, 71865, 66728, 0, 3157, 0, 0, 75035, 72788, 983731, 0, 10822, + 5149, 129517, 0, 65142, 129454, 4565, 0, 0, 0, 12657, 0, 0, 386, 0, 8834, + 120974, 0, 43574, 0, 0, 0, 70113, 7220, 11839, 124984, 74883, 194752, 0, + 65241, 74503, 8160, 0, 194753, 0, 0, 0, 0, 0, 121265, 0, 13303, 0, 0, + 194755, 0, 118865, 0, 194761, 0, 0, 74505, 0, 0, 0, 100518, 0, 8780, + 100512, 0, 68745, 110626, 66697, 0, 2672, 3735, 983641, 0, 68752, 11205, + 10724, 41202, 0, 100714, 0, 0, 0, 0, 194765, 3842, 0, 78183, 12442, + 78182, 9791, 78181, 0, 42516, 67730, 64821, 195061, 78463, 0, 78464, + 119219, 78465, 127466, 194690, 195063, 0, 0, 0, 0, 78540, 78541, 78538, + 1962, 78490, 78476, 65930, 11660, 0, 2072, 0, 0, 78544, 194704, 78542, + 10669, 110859, 110860, 110857, 110858, 0, 110856, 4105, 0, 194699, 0, 0, + 0, 13148, 195068, 78479, 9226, 0, 0, 10765, 127486, 71919, 121218, 195050, 0, 195041, 0, 0, 0, 0, 0, 0, 92312, 7886, 0, 6682, 0, 6680, 195042, 126473, 195052, 6679, 74412, 0, 72206, 74421, 66281, 0, 0, 127478, 0, 0, 0, 6681, 0, 12693, 0, 0, 0, 0, 0, 65442, 129055, 0, 9989, @@ -27403,48 +28068,48 @@ static unsigned int code_hash[] = { 11504, 1612, 120187, 120182, 120181, 120184, 12001, 120178, 120177, 120180, 120179, 120174, 120173, 7749, 120175, 0, 1758, 0, 10667, 0, 120197, 0, 1935, 11517, 120193, 120196, 120195, 120190, 120189, 120192, - 120191, 1217, 64702, 128075, 825, 0, 0, 0, 0, 66748, 0, 11050, 0, 0, 0, - 0, 74554, 0, 0, 8677, 128785, 11313, 0, 3403, 0, 0, 64364, 92683, 0, 0, - 0, 0, 0, 0, 0, 983861, 0, 69408, 41850, 0, 3433, 127965, 0, 1594, 65607, - 0, 66392, 0, 129291, 74565, 41353, 125119, 0, 0, 0, 0, 918, 127280, - 41351, 0, 0, 12140, 0, 12668, 72395, 0, 128753, 0, 127302, 0, 127288, - 129497, 127235, 573, 0, 0, 11417, 0, 127283, 0, 0, 0, 72410, 0, 11482, 0, - 3981, 74345, 0, 0, 0, 0, 0, 0, 125238, 0, 0, 42195, 0, 0, 0, 64602, 0, 0, - 121366, 0, 121061, 128690, 0, 8423, 0, 448, 66907, 9717, 0, 0, 0, 0, 0, - 0, 0, 71910, 0, 0, 0, 120679, 65013, 78169, 0, 72390, 0, 0, 127917, 0, - 74892, 0, 0, 127798, 0, 0, 71252, 0, 0, 0, 12197, 125074, 0, 121447, 0, - 0, 0, 0, 0, 0, 0, 74563, 64828, 11419, 0, 8592, 0, 0, 0, 11381, 0, 0, - 74529, 0, 0, 0, 0, 72796, 0, 83257, 0, 0, 0, 129437, 65672, 0, 0, 0, 0, - 0, 0, 0, 0, 9505, 0, 0, 756, 0, 125243, 100358, 110852, 7261, 0, 0, 0, 0, - 0, 64401, 65830, 41365, 0, 0, 0, 127834, 0, 0, 0, 0, 0, 74626, 0, 11578, - 0, 0, 0, 0, 0, 0, 74568, 0, 113684, 1794, 68310, 120218, 120219, 120220, - 120221, 120222, 120223, 3617, 120209, 64886, 94061, 78202, 120213, - 120214, 10225, 983060, 0, 65223, 983058, 0, 0, 4452, 127779, 0, 0, 0, 0, - 0, 0, 11425, 0, 0, 1231, 0, 0, 0, 0, 8192, 0, 0, 0, 10616, 8694, 0, - 68867, 128332, 0, 120200, 120201, 120202, 120203, 9878, 120205, 119626, - 120207, 0, 8799, 42131, 0, 127163, 0, 120198, 120199, 837, 0, 72384, 0, - 983817, 0, 11427, 0, 78154, 0, 70171, 0, 78150, 42606, 0, 119615, 78147, - 64637, 78146, 43060, 78145, 125009, 3392, 0, 194783, 119067, 119650, - 65468, 43498, 126083, 0, 0, 0, 194928, 194937, 194938, 64681, 194930, - 83264, 92451, 0, 194955, 83262, 983732, 8973, 0, 194967, 70177, 194968, - 0, 4800, 195018, 0, 0, 11820, 70151, 0, 0, 4802, 4111, 111268, 0, 4805, - 127308, 68193, 7885, 121220, 0, 0, 0, 4767, 0, 0, 0, 0, 0, 125234, - 100366, 43453, 0, 41340, 0, 0, 10005, 65856, 41333, 0, 9518, 0, 0, 0, - 42520, 0, 0, 0, 917562, 100506, 0, 0, 0, 0, 0, 0, 9167, 42151, 124958, 0, - 2026, 100848, 0, 0, 100534, 12768, 0, 7582, 0, 0, 0, 0, 0, 0, 120539, - 68879, 0, 43547, 0, 8546, 126071, 78520, 7604, 78518, 78519, 78514, - 78517, 78511, 78512, 73802, 128140, 0, 6708, 10535, 0, 68218, 55274, - 68221, 92296, 0, 0, 0, 0, 0, 72385, 0, 0, 0, 100843, 0, 120706, 74442, 0, - 0, 0, 4351, 0, 119887, 119888, 0, 119886, 119891, 68866, 119889, 11433, - 119895, 119896, 0, 119894, 65578, 0, 0, 0, 983070, 10681, 0, 0, 0, 0, - 983110, 0, 6722, 129364, 0, 119997, 41546, 64860, 68394, 0, 41549, 0, - 72386, 0, 0, 0, 0, 64710, 41547, 0, 0, 0, 78530, 78532, 78528, 78529, - 71343, 78527, 78523, 78525, 3537, 119908, 119905, 7155, 2264, 0, 78533, - 67755, 0, 0, 0, 0, 0, 0, 0, 64715, 0, 0, 537, 0, 4179, 0, 0, 0, 0, 0, 0, - 0, 0, 12081, 0, 0, 4048, 7053, 0, 0, 70459, 0, 124975, 0, 3059, 0, 0, - 43491, 983814, 0, 0, 127993, 4100, 920, 1811, 1355, 0, 0, 64383, 10078, - 69398, 0, 0, 0, 65870, 0, 0, 0, 72400, 42918, 0, 66789, 0, 12865, 0, - 73938, + 120191, 1217, 64702, 128075, 825, 0, 0, 0, 0, 66748, 0, 11050, 0, 123187, + 0, 0, 74554, 0, 0, 8677, 123188, 11313, 123185, 3403, 0, 123186, 64364, + 92683, 0, 0, 0, 0, 123189, 0, 0, 983861, 0, 69408, 41850, 0, 3433, + 127965, 0, 1594, 65607, 0, 66392, 0, 129291, 74565, 41353, 125119, 0, 0, + 0, 0, 918, 127280, 41351, 0, 0, 12140, 0, 12668, 72395, 0, 128753, 0, + 127302, 0, 127288, 129497, 127235, 573, 0, 0, 11417, 0, 127283, 0, 0, 0, + 72410, 0, 11482, 0, 3981, 74345, 0, 0, 0, 0, 0, 0, 125238, 0, 0, 42195, + 0, 123190, 0, 64602, 0, 0, 121366, 0, 121061, 128690, 0, 8423, 0, 448, + 66907, 9717, 0, 0, 0, 0, 0, 0, 0, 71910, 0, 0, 0, 120679, 65013, 78169, + 0, 72390, 0, 0, 127917, 0, 74892, 0, 0, 127798, 0, 0, 71252, 0, 0, 0, + 12197, 125074, 0, 121447, 0, 0, 0, 0, 0, 0, 0, 74563, 64828, 11419, 0, + 8592, 0, 0, 0, 11381, 0, 0, 74529, 0, 0, 0, 0, 72796, 0, 83257, 0, 0, 0, + 129437, 65672, 0, 0, 0, 0, 0, 0, 0, 0, 9505, 0, 0, 756, 0, 125243, + 100358, 110852, 7261, 0, 0, 0, 0, 0, 64401, 65830, 41365, 0, 0, 0, + 127834, 0, 0, 0, 0, 0, 74626, 123155, 11578, 0, 0, 0, 0, 0, 0, 74568, 0, + 113684, 1794, 68310, 120218, 120219, 120220, 120221, 120222, 120223, + 3617, 120209, 64886, 94061, 78202, 120213, 120214, 10225, 983060, 0, + 65223, 983058, 0, 0, 4452, 127779, 0, 0, 0, 0, 0, 0, 11425, 0, 0, 1231, + 0, 0, 0, 0, 8192, 0, 0, 0, 10616, 8694, 0, 68867, 128332, 123595, 120200, + 120201, 120202, 120203, 9878, 120205, 119626, 120207, 0, 8799, 42131, 0, + 127163, 0, 120198, 120199, 837, 120015, 72384, 0, 983817, 0, 11427, 0, + 78154, 0, 70171, 0, 78150, 42606, 0, 119615, 78147, 64637, 78146, 43060, + 78145, 125009, 3392, 0, 194783, 119067, 119650, 65468, 43498, 126083, 0, + 0, 0, 194928, 194937, 194938, 64681, 194930, 83264, 92451, 0, 194955, + 83262, 983732, 8973, 0, 194967, 70177, 194968, 0, 4800, 195018, 0, 0, + 11820, 70151, 0, 0, 4802, 4111, 111268, 0, 4805, 127308, 68193, 7885, + 121220, 0, 0, 0, 4767, 0, 0, 0, 0, 0, 125234, 100366, 43453, 0, 41340, 0, + 0, 10005, 65856, 41333, 0, 9518, 0, 0, 0, 42520, 0, 0, 0, 917562, 100506, + 0, 0, 0, 0, 0, 0, 9167, 42151, 124958, 0, 2026, 100848, 0, 0, 100534, + 12768, 0, 7582, 0, 0, 0, 0, 129557, 0, 120539, 68879, 0, 43547, 0, 8546, + 126071, 78520, 7604, 78518, 78519, 78514, 78517, 78511, 78512, 73802, + 128140, 0, 6708, 10535, 0, 68218, 55274, 68221, 92296, 0, 0, 0, 0, 0, + 72385, 0, 0, 0, 73727, 0, 120706, 74442, 0, 0, 0, 4351, 0, 119887, + 119888, 0, 119886, 119891, 68866, 119889, 11433, 119895, 119896, 0, + 119894, 65578, 0, 0, 0, 983070, 10681, 0, 0, 0, 0, 983110, 0, 6722, + 129364, 0, 119997, 41546, 64860, 68394, 0, 41549, 0, 72386, 0, 0, 0, 0, + 64710, 41547, 0, 0, 0, 78530, 78532, 78528, 78529, 71343, 78527, 78523, + 78525, 3537, 119908, 119905, 7155, 2264, 0, 78533, 67755, 0, 0, 0, 0, 0, + 0, 0, 64715, 0, 0, 537, 0, 4179, 0, 0, 0, 0, 0, 0, 0, 0, 12081, 0, 0, + 4048, 7053, 0, 0, 70459, 0, 124975, 0, 3059, 0, 0, 43491, 983814, 0, 0, + 127993, 4100, 920, 1811, 1355, 0, 0, 64383, 10078, 69398, 0, 0, 0, 65870, + 0, 129565, 0, 72400, 42918, 0, 66789, 0, 12865, 0, 73938, }; #define code_magic 47 diff --git a/Objects/unicodetype_db.h b/Objects/unicodetype_db.h index d49fc9524b43..e64b5059342a 100644 --- a/Objects/unicodetype_db.h +++ b/Objects/unicodetype_db.h @@ -1,4 +1,4 @@ -/* this file was generated by Tools/unicode/makeunicodedata.py 3.2 */ +/* this file was generated by Tools/unicode/makeunicodedata.py 3.3 */ /* a list of unique character type descriptors */ const _PyUnicode_TypeRecord _PyUnicode_TypeRecords[] = { @@ -96,6 +96,7 @@ const _PyUnicode_TypeRecord _PyUnicode_TypeRecords[] = { {-214, 0, -214, 0, 0, 9993}, {10727, 0, 10727, 0, 0, 9993}, {-218, 0, -218, 0, 0, 9993}, + {42307, 0, 42307, 0, 0, 9993}, {42282, 0, 42282, 0, 0, 9993}, {-69, 0, -69, 0, 0, 9993}, {-217, 0, -217, 0, 0, 9993}, @@ -258,6 +259,7 @@ const _PyUnicode_TypeRecord _PyUnicode_TypeRecords[] = { {0, -3008, 0, 0, 0, 10113}, {35332, 0, 35332, 0, 0, 9993}, {3814, 0, 3814, 0, 0, 9993}, + {35384, 0, 35384, 0, 0, 9993}, {33554812, 18874745, 33554812, 0, 0, 26377}, {33554817, 18874750, 33554817, 0, 0, 26377}, {33554822, 18874755, 33554822, 0, 0, 26377}, @@ -391,6 +393,7 @@ const _PyUnicode_TypeRecord _PyUnicode_TypeRecords[] = { {0, 0, 0, 0, 0, 3841}, {0, -35332, 0, 0, 0, 10113}, {0, -42280, 0, 0, 0, 10113}, + {48, 0, 48, 0, 0, 9993}, {0, -42308, 0, 0, 0, 10113}, {0, -42319, 0, 0, 0, 10113}, {0, -42315, 0, 0, 0, 10113}, @@ -399,6 +402,9 @@ const _PyUnicode_TypeRecord _PyUnicode_TypeRecords[] = { {0, -42282, 0, 0, 0, 10113}, {0, -42261, 0, 0, 0, 10113}, {0, 928, 0, 0, 0, 10113}, + {0, -48, 0, 0, 0, 10113}, + {0, -42307, 0, 0, 0, 10113}, + {0, -35384, 0, 0, 0, 10113}, {-928, 0, -928, 0, 0, 9993}, {16778124, 17826698, 16778124, 0, 0, 26377}, {16778127, 17826701, 16778127, 0, 0, 26377}, @@ -1776,51 +1782,51 @@ static unsigned short index1[] = { 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 127, 128, 129, 130, 131, 132, 133, 34, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 144, 34, 34, 151, 144, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 144, 163, 144, 164, 144, 165, - 166, 167, 168, 169, 170, 171, 144, 172, 173, 144, 174, 175, 176, 177, - 144, 178, 179, 144, 144, 180, 181, 144, 144, 182, 183, 184, 185, 144, - 186, 144, 144, 34, 34, 34, 34, 34, 34, 34, 187, 188, 34, 189, 144, 144, + 155, 156, 157, 158, 159, 160, 161, 162, 144, 163, 144, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 144, 173, 174, 144, 175, 176, 177, 178, + 144, 179, 180, 144, 181, 182, 183, 144, 144, 184, 185, 186, 187, 144, + 188, 144, 189, 34, 34, 34, 34, 34, 34, 34, 190, 191, 34, 192, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 34, 34, 34, 34, 34, 34, 34, 34, 190, 144, 144, + 144, 144, 144, 144, 144, 34, 34, 34, 34, 34, 34, 34, 34, 193, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 34, 34, 34, 34, 191, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 34, 34, 34, 34, 194, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 34, 34, 34, 34, 192, 193, 194, 195, 144, 144, 144, 144, 196, - 197, 198, 199, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 144, 144, 34, 34, 34, 34, 195, 196, 197, 198, 144, 144, 144, 144, 199, + 200, 201, 202, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 200, 34, 34, - 34, 34, 34, 201, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 203, 34, 34, + 34, 34, 34, 204, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 34, 34, 202, 34, 34, 203, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 34, 34, 205, 34, 34, 206, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 204, 205, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 207, 208, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 64, - 206, 207, 208, 209, 210, 211, 144, 212, 213, 214, 215, 216, 217, 218, - 219, 64, 64, 64, 64, 220, 221, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 222, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 34, 223, 224, 144, 144, 144, 144, 144, 225, 226, 144, - 144, 227, 228, 144, 144, 229, 230, 231, 232, 233, 144, 64, 234, 64, 64, - 64, 64, 64, 235, 236, 237, 238, 239, 240, 241, 242, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 243, 244, 245, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 86, 246, 34, 247, 248, 34, 34, 34, + 209, 210, 211, 212, 213, 214, 144, 215, 216, 217, 218, 219, 220, 221, + 222, 64, 64, 64, 64, 223, 224, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 225, 144, 226, 144, 144, 227, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 34, 228, 229, 144, 144, 144, 144, 144, 230, 231, 232, + 144, 233, 234, 144, 144, 235, 236, 237, 238, 239, 144, 64, 240, 64, 64, + 64, 64, 64, 241, 242, 243, 244, 245, 246, 247, 248, 249, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 250, 251, 252, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 86, 253, 34, 254, 255, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 249, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 250, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 256, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 257, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 251, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 258, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 252, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 259, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, @@ -1828,16 +1834,16 @@ static unsigned short index1[] = { 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 253, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 254, 34, - 255, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 260, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 261, 34, + 262, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 256, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 263, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 257, 144, 144, 144, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 264, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 34, 249, 34, 34, 258, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 34, 256, 34, 34, 265, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, @@ -2240,8 +2246,8 @@ static unsigned short index1[] = { 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 259, 144, - 260, 261, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 266, 144, + 267, 268, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, @@ -2313,7 +2319,7 @@ static unsigned short index1[] = { 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 262, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 269, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, @@ -2350,7 +2356,7 @@ static unsigned short index1[] = { 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 262, + 126, 126, 126, 126, 126, 126, 126, 269, }; static unsigned short index2[] = { @@ -2387,52 +2393,52 @@ static unsigned short index2[] = { 30, 31, 66, 67, 68, 68, 30, 31, 69, 70, 71, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 72, 73, 74, 75, 76, 20, 77, 77, 20, 78, 20, 79, 80, 20, 20, 20, 77, 81, 20, 82, 20, 83, 84, 20, 85, 86, 84, 87, 88, 20, 20, 86, 20, - 89, 90, 20, 20, 91, 20, 20, 20, 20, 20, 20, 20, 92, 20, 20, 93, 20, 20, - 93, 20, 20, 20, 94, 93, 95, 96, 96, 97, 20, 20, 20, 20, 20, 98, 20, 55, - 20, 20, 20, 20, 20, 20, 20, 20, 99, 100, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 102, 102, 102, 102, 102, 102, 102, 101, 101, 6, 6, 6, 6, 102, - 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 101, 101, 101, 101, 101, 6, 6, 6, 6, 6, 6, 6, - 102, 6, 102, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 25, 25, + 89, 90, 20, 20, 91, 20, 20, 20, 20, 20, 20, 20, 92, 20, 20, 93, 20, 94, + 93, 20, 20, 20, 95, 93, 96, 97, 97, 98, 20, 20, 20, 20, 20, 99, 20, 55, + 20, 20, 20, 20, 20, 20, 20, 20, 100, 101, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 103, 103, 103, 103, 103, 103, 103, 102, 102, 6, 6, 6, 6, 103, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 102, 102, 102, 102, 102, 6, 6, 6, 6, 6, 6, 6, + 103, 6, 103, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 103, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 104, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 30, 31, 30, 31, 102, 6, 30, 31, 0, 0, 104, 50, 50, 50, 5, 105, 0, - 0, 0, 0, 6, 6, 106, 25, 107, 107, 107, 0, 108, 0, 109, 109, 110, 17, 17, + 25, 25, 30, 31, 30, 31, 103, 6, 30, 31, 0, 0, 105, 50, 50, 50, 5, 106, 0, + 0, 0, 0, 6, 6, 107, 25, 108, 108, 108, 0, 109, 0, 110, 110, 111, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 111, 112, 112, 112, 113, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 114, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 115, 116, 116, 117, 118, 119, 120, 120, 120, 121, 122, - 123, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, - 31, 30, 31, 30, 31, 30, 31, 124, 125, 126, 127, 128, 129, 5, 30, 31, 130, - 30, 31, 20, 64, 64, 64, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 112, 113, 113, 113, 114, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 115, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 116, 117, 117, 118, 119, 120, 121, 121, 121, 122, 123, + 124, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 125, 126, 127, 128, 129, 130, 5, 30, 31, 131, + 30, 31, 20, 64, 64, 64, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 132, - 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, - 132, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 5, 25, 25, 25, 25, 25, 6, 6, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 133, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, - 31, 30, 31, 134, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, + 30, 31, 30, 31, 30, 31, 134, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 135, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 0, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 0, 0, 102, 5, 5, 5, 5, 5, 5, 20, 136, 136, 136, 136, + 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 0, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 137, 20, 5, 5, 0, 0, 5, 5, 5, 0, 25, 25, + 136, 136, 136, 136, 0, 0, 103, 5, 5, 5, 5, 5, 5, 20, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 138, 20, 5, 5, 0, 0, 5, 5, 5, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 25, 5, 25, 25, 5, 25, 25, 5, 25, 0, 0, 0, @@ -2441,7 +2447,7 @@ static unsigned short index2[] = { 55, 55, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21, 21, 21, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 21, 0, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 102, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 103, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, 5, 5, 5, 55, 55, 25, 55, 55, 55, 55, 55, 55, 55, 55, @@ -2451,7 +2457,7 @@ static unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 5, 55, 25, 25, 25, 25, 25, 25, 25, 21, 5, 25, 25, 25, 25, 25, 25, - 102, 102, 25, 25, 5, 25, 25, 25, 25, 55, 55, 7, 8, 9, 10, 11, 12, 13, 14, + 103, 103, 25, 25, 5, 25, 25, 25, 25, 55, 55, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, 55, 55, 5, 5, 55, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 21, 55, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, @@ -2465,10 +2471,10 @@ static unsigned short index2[] = { 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 102, 102, 5, 5, 5, 5, 102, 0, 0, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 103, 103, 5, 5, 5, 5, 103, 0, 0, 25, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 25, 25, 25, 25, 102, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 102, 25, 25, 25, 102, 25, 25, 25, 25, 25, 0, 0, 5, 5, 5, 5, 5, 5, 5, + 55, 55, 55, 55, 55, 25, 25, 25, 25, 103, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 103, 25, 25, 25, 103, 25, 25, 25, 25, 25, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 0, 0, 5, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2485,7 +2491,7 @@ static unsigned short index2[] = { 55, 55, 25, 18, 25, 55, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 18, 18, 18, 18, 25, 18, 18, 55, 25, 25, 25, 25, 25, 25, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 5, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 5, 102, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 16, 5, 103, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 18, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 0, 0, 0, 55, 55, 55, @@ -2524,7 +2530,7 @@ static unsigned short index2[] = { 55, 0, 0, 0, 55, 25, 25, 25, 18, 18, 18, 18, 0, 25, 25, 25, 0, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 25, 25, 0, 55, 55, 55, 0, 0, 0, 0, 0, 55, 55, 25, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, - 0, 0, 27, 27, 27, 27, 27, 27, 27, 5, 55, 25, 18, 18, 5, 55, 55, 55, 55, + 0, 5, 27, 27, 27, 27, 27, 27, 27, 5, 55, 25, 18, 18, 5, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 0, 0, 25, 55, 18, 25, 18, @@ -2547,44 +2553,44 @@ static unsigned short index2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 25, 55, 138, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 5, 55, 55, 55, - 55, 55, 55, 102, 25, 25, 25, 25, 25, 25, 25, 25, 5, 7, 8, 9, 10, 11, 12, + 55, 25, 55, 139, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 5, 55, 55, 55, + 55, 55, 55, 103, 25, 25, 25, 25, 25, 25, 25, 25, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 0, - 55, 0, 0, 55, 55, 0, 55, 0, 0, 55, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 0, - 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 0, 55, 0, 55, 0, 0, 55, 55, 0, - 55, 55, 55, 55, 25, 55, 138, 25, 25, 25, 25, 25, 25, 0, 25, 25, 55, 0, 0, - 55, 55, 55, 55, 55, 0, 102, 0, 25, 25, 25, 25, 25, 25, 0, 0, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 0, 0, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, - 25, 5, 5, 5, 5, 5, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 5, 25, 5, 25, 5, 25, 5, 5, 5, 5, 18, 18, 55, - 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 18, 25, 25, 25, 25, 25, 5, 25, 25, 55, 55, - 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 25, 25, 25, + 55, 0, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 0, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 25, 55, 139, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 55, 0, 0, 55, 55, 55, 55, 55, 0, 103, 0, 25, 25, 25, 25, 25, 25, 0, + 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 55, 55, 55, 55, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 55, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 25, 25, 5, 5, 5, 5, 5, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 5, 25, 5, 25, 5, 25, 5, 5, 5, + 5, 18, 18, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 18, 25, 25, 25, 25, 25, 5, 25, + 25, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 5, 5, 5, - 5, 5, 5, 5, 5, 25, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 0, 5, 5, 5, 5, 5, 5, 5, 5, 25, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 18, 18, 25, 25, 25, 25, 18, 25, 25, 25, 25, 25, 25, 18, 25, 25, 18, 18, - 25, 25, 55, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, 5, 5, 5, 5, 5, 55, - 55, 55, 55, 55, 55, 18, 18, 25, 25, 55, 55, 55, 55, 25, 25, 25, 55, 18, - 18, 18, 55, 55, 18, 18, 18, 18, 18, 18, 18, 55, 55, 55, 25, 25, 25, 25, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 18, 25, 25, - 18, 18, 18, 18, 18, 18, 25, 55, 18, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 18, 18, 18, 25, 5, 5, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, - 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, - 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 0, - 139, 0, 0, 0, 0, 0, 139, 0, 0, 140, 140, 140, 140, 140, 140, 140, 140, + 55, 55, 55, 18, 18, 25, 25, 25, 25, 18, 25, 25, 25, 25, 25, 25, 18, 25, + 25, 18, 18, 25, 25, 55, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, 5, 5, 5, + 5, 5, 55, 55, 55, 55, 55, 55, 18, 18, 25, 25, 55, 55, 55, 55, 25, 25, 25, + 55, 18, 18, 18, 55, 55, 18, 18, 18, 18, 18, 18, 18, 55, 55, 55, 25, 25, + 25, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 18, + 25, 25, 18, 18, 18, 18, 18, 18, 25, 55, 18, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 18, 18, 18, 25, 5, 5, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 5, 102, 140, 140, 140, 55, 55, 55, 55, + 140, 140, 0, 140, 0, 0, 0, 0, 0, 140, 0, 0, 141, 141, 141, 141, 141, 141, + 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, + 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, + 141, 141, 141, 141, 141, 141, 141, 141, 141, 5, 103, 141, 141, 141, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -2595,36 +2601,33 @@ static unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, - 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 0, 55, 55, 55, - 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, + 55, 55, 0, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 0, + 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 0, 0, 55, 55, - 55, 55, 55, 55, 55, 0, 55, 0, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, - 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 0, + 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 0, 55, 55, 55, 55, 0, 0, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 25, 25, - 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 0, 0, 0, 0, 0, 0, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 0, 0, 236, 237, 238, 239, 240, 241, 0, 0, - 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, + 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 0, 0, 237, 238, 239, 240, + 241, 242, 0, 0, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -2634,111 +2637,114 @@ static unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 2, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 5, 5, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 2, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 5, 5, 0, + 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 5, 5, 5, 242, 242, 242, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, - 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, - 55, 55, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 5, 5, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 0, 25, 25, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 25, 25, 18, 25, 25, 25, 25, 25, 25, 25, 18, - 18, 18, 18, 18, 18, 18, 18, 25, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 5, 5, 5, 102, 5, 5, 5, 5, 55, 25, 0, 0, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 25, 25, 21, 0, 7, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 5, 5, 5, 243, 243, 243, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 55, 55, 55, 55, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, + 25, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, + 0, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 102, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 18, 25, 25, 25, 25, 25, + 25, 25, 18, 18, 18, 18, 18, 18, 18, 18, 25, 18, 18, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 5, 5, 5, 103, 5, 5, 5, 5, 55, 25, 0, 0, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 25, + 25, 21, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 55, - 55, 55, 55, 55, 243, 243, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 103, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 25, 55, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, + 0, 0, 0, 55, 55, 55, 55, 55, 244, 244, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 25, 55, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 25, 25, 25, 18, 18, 18, 18, - 25, 25, 18, 18, 18, 0, 0, 0, 0, 18, 18, 25, 18, 18, 18, 18, 18, 18, 25, - 25, 25, 0, 0, 0, 0, 5, 0, 0, 0, 5, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, - 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 141, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 25, 25, 25, + 18, 18, 18, 18, 25, 25, 18, 18, 18, 0, 0, 0, 0, 18, 18, 25, 18, 18, 18, + 18, 18, 18, 25, 25, 25, 0, 0, 0, 0, 5, 0, 0, 0, 5, 5, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, + 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 25, 25, 18, 18, 25, 0, 0, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 142, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 25, 25, 18, 18, 25, 0, 0, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 25, 18, 25, 25, 25, 25, 25, - 25, 25, 0, 25, 18, 25, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 18, 18, - 18, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 0, 25, 7, 8, - 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 102, 5, 5, 5, 5, 5, 5, - 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 25, 18, 25, + 25, 25, 25, 25, 25, 25, 0, 25, 18, 25, 18, 18, 25, 25, 25, 25, 25, 25, + 25, 25, 18, 18, 18, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 0, 0, 25, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 103, + 5, 5, 5, 5, 5, 5, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 18, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, + 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 25, 25, 25, + 25, 25, 18, 25, 18, 18, 18, 18, 18, 25, 18, 18, 55, 55, 55, 55, 55, 55, + 55, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 25, 25, 25, 25, 25, 18, 25, 18, - 18, 18, 18, 18, 25, 18, 18, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 7, 8, - 9, 10, 11, 12, 13, 14, 15, 16, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 0, 0, 0, 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, - 25, 25, 25, 25, 18, 18, 25, 25, 18, 25, 25, 25, 55, 55, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 18, 25, 25, 25, 25, 18, 18, 25, 25, 18, 25, 25, 25, 55, + 55, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 25, 25, 18, - 18, 18, 25, 18, 25, 25, 25, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 25, 18, 25, 25, 18, 18, 18, 25, 18, 25, 25, 25, 18, 18, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 18, 18, 18, 18, 18, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 18, 18, - 25, 25, 0, 0, 0, 5, 5, 5, 5, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, - 0, 0, 55, 55, 55, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, 55, 55, 55, + 55, 55, 55, 55, 18, 18, 18, 18, 18, 18, 18, 18, 25, 25, 25, 25, 25, 25, + 25, 25, 18, 18, 25, 25, 0, 0, 0, 5, 5, 5, 5, 5, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 0, 0, 0, 55, 55, 55, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 102, 102, 102, 102, 102, 102, 5, 5, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 0, 0, 0, 0, 0, 0, 0, 253, 253, - 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, - 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, - 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 0, 0, - 253, 253, 253, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, - 25, 5, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 18, 25, 25, - 25, 25, 25, 25, 25, 55, 55, 55, 55, 25, 55, 55, 55, 55, 18, 18, 25, 55, - 55, 18, 25, 25, 0, 0, 0, 0, 0, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 103, 103, 103, 103, 103, 103, + 5, 5, 245, 246, 247, 248, 249, 250, 251, 252, 253, 0, 0, 0, 0, 0, 0, 0, + 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, + 254, 0, 0, 254, 254, 254, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 25, 25, 25, 5, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 18, + 25, 25, 25, 25, 25, 25, 25, 55, 55, 55, 55, 25, 55, 55, 55, 55, 55, 55, + 25, 55, 55, 18, 25, 25, 55, 0, 0, 0, 0, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 101, 101, - 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 101, 101, 101, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 101, 254, 20, 20, 20, 255, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 101, 101, 101, 101, 101, 101, 101, 25, 25, 25, 25, 25, 25, 25, + 20, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 102, 255, 20, 20, 20, 256, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 257, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 25, 25, - 25, 25, 25, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 25, 0, 25, 25, 25, 25, 25, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, @@ -2746,50 +2752,51 @@ static unsigned short index2[] = { 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, - 31, 30, 31, 30, 31, 30, 31, 30, 31, 256, 257, 258, 259, 260, 261, 20, 20, - 262, 20, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 263, 263, 263, 263, 263, 263, 263, 263, - 264, 264, 264, 264, 264, 264, 264, 264, 263, 263, 263, 263, 263, 263, 0, - 0, 264, 264, 264, 264, 264, 264, 0, 0, 263, 263, 263, 263, 263, 263, 263, - 263, 264, 264, 264, 264, 264, 264, 264, 264, 263, 263, 263, 263, 263, - 263, 263, 263, 264, 264, 264, 264, 264, 264, 264, 264, 263, 263, 263, - 263, 263, 263, 0, 0, 264, 264, 264, 264, 264, 264, 0, 0, 265, 263, 266, - 263, 267, 263, 268, 263, 0, 264, 0, 264, 0, 264, 0, 264, 263, 263, 263, - 263, 263, 263, 263, 263, 264, 264, 264, 264, 264, 264, 264, 264, 269, - 269, 270, 270, 270, 270, 271, 271, 272, 272, 273, 273, 274, 274, 0, 0, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - 317, 318, 319, 320, 321, 322, 263, 263, 323, 324, 325, 0, 326, 327, 264, - 264, 328, 328, 329, 6, 330, 6, 6, 6, 331, 332, 333, 0, 334, 335, 336, - 336, 336, 336, 337, 6, 6, 6, 263, 263, 338, 339, 0, 0, 340, 341, 264, - 264, 342, 342, 0, 6, 6, 6, 263, 263, 343, 344, 345, 126, 346, 347, 264, - 264, 348, 348, 130, 6, 6, 6, 0, 0, 349, 350, 351, 0, 352, 353, 354, 354, - 355, 355, 356, 6, 6, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 21, 21, 21, 21, - 21, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, - 6, 3, 3, 21, 21, 21, 21, 21, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 18, 18, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 21, 21, 21, 21, 21, 0, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 357, 101, 0, 0, 358, 359, 360, 361, 362, 363, 5, - 5, 5, 5, 5, 101, 357, 26, 22, 23, 358, 359, 360, 361, 362, 363, 5, 5, 5, - 5, 5, 0, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 6, 6, 6, 6, - 25, 6, 6, 6, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 120, 5, 5, 5, 5, 120, 5, 5, 20, - 120, 120, 120, 20, 20, 120, 120, 120, 20, 5, 120, 5, 5, 364, 120, 120, - 120, 120, 120, 5, 5, 5, 5, 5, 5, 120, 5, 365, 5, 120, 5, 366, 367, 120, - 120, 364, 20, 120, 120, 368, 120, 20, 55, 55, 55, 55, 20, 5, 5, 20, 20, - 120, 120, 5, 5, 5, 5, 5, 120, 20, 20, 20, 20, 5, 5, 5, 5, 369, 5, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 370, 370, 370, - 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 371, - 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, - 371, 242, 242, 242, 30, 31, 242, 242, 242, 242, 27, 5, 5, 0, 0, 0, 0, 5, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 258, 259, 260, 261, + 262, 263, 20, 20, 264, 20, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 265, 265, 265, 265, + 265, 265, 265, 265, 266, 266, 266, 266, 266, 266, 266, 266, 265, 265, + 265, 265, 265, 265, 0, 0, 266, 266, 266, 266, 266, 266, 0, 0, 265, 265, + 265, 265, 265, 265, 265, 265, 266, 266, 266, 266, 266, 266, 266, 266, + 265, 265, 265, 265, 265, 265, 265, 265, 266, 266, 266, 266, 266, 266, + 266, 266, 265, 265, 265, 265, 265, 265, 0, 0, 266, 266, 266, 266, 266, + 266, 0, 0, 267, 265, 268, 265, 269, 265, 270, 265, 0, 266, 0, 266, 0, + 266, 0, 266, 265, 265, 265, 265, 265, 265, 265, 265, 266, 266, 266, 266, + 266, 266, 266, 266, 271, 271, 272, 272, 272, 272, 273, 273, 274, 274, + 275, 275, 276, 276, 0, 0, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 265, 265, 325, + 326, 327, 0, 328, 329, 266, 266, 330, 330, 331, 6, 332, 6, 6, 6, 333, + 334, 335, 0, 336, 337, 338, 338, 338, 338, 339, 6, 6, 6, 265, 265, 340, + 341, 0, 0, 342, 343, 266, 266, 344, 344, 0, 6, 6, 6, 265, 265, 345, 346, + 347, 127, 348, 349, 266, 266, 350, 350, 131, 6, 6, 6, 0, 0, 351, 352, + 353, 0, 354, 355, 356, 356, 357, 357, 358, 6, 6, 0, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 21, 21, 21, 21, 21, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 6, 5, 5, 6, 3, 3, 21, 21, 21, 21, 21, 2, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 18, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 18, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 21, 21, 21, 21, + 21, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 359, 102, 0, 0, 360, 361, + 362, 363, 364, 365, 5, 5, 5, 5, 5, 102, 359, 26, 22, 23, 360, 361, 362, + 363, 364, 365, 5, 5, 5, 5, 5, 0, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 6, 6, 6, 6, 25, 6, 6, 6, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 121, 5, 5, + 5, 5, 121, 5, 5, 20, 121, 121, 121, 20, 20, 121, 121, 121, 20, 5, 121, 5, + 5, 366, 121, 121, 121, 121, 121, 5, 5, 5, 5, 5, 5, 121, 5, 367, 5, 121, + 5, 368, 369, 121, 121, 366, 20, 121, 121, 370, 121, 20, 55, 55, 55, 55, + 20, 5, 5, 20, 20, 121, 121, 5, 5, 5, 5, 5, 121, 20, 20, 20, 20, 5, 5, 5, + 5, 371, 5, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, + 372, 372, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, + 373, 373, 373, 373, 243, 243, 243, 30, 31, 243, 243, 243, 243, 27, 5, 5, + 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, @@ -2800,27 +2807,27 @@ static unsigned short index2[] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 26, 22, 23, 360, 361, 362, 363, 364, 365, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 26, 22, 23, 360, 361, 362, 363, 364, 365, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, 22, 23, 360, 361, 362, 363, 364, + 365, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 374, 374, 374, 374, + 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, + 374, 374, 374, 374, 374, 374, 374, 374, 375, 375, 375, 375, 375, 375, + 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, + 375, 375, 375, 375, 375, 375, 359, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 26, 22, 23, 360, 361, 362, 363, 364, 365, 27, 359, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, - 22, 23, 358, 359, 360, 361, 362, 363, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 26, 22, 23, 358, 359, 360, 361, 362, 363, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 26, 22, 23, 358, 359, 360, 361, 362, 363, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 372, 372, 372, 372, 372, 372, 372, - 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, - 372, 372, 372, 372, 372, 373, 373, 373, 373, 373, 373, 373, 373, 373, - 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, - 373, 373, 373, 357, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, 22, 23, - 358, 359, 360, 361, 362, 363, 27, 357, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 26, 22, 23, 360, 361, + 362, 363, 364, 365, 27, 26, 22, 23, 360, 361, 362, 363, 364, 365, 27, 26, + 22, 23, 360, 361, 362, 363, 364, 365, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 26, 22, 23, 358, 359, 360, 361, 362, - 363, 27, 26, 22, 23, 358, 359, 360, 361, 362, 363, 27, 26, 22, 23, 358, - 359, 360, 361, 362, 363, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, @@ -2828,106 +2835,105 @@ static unsigned short index2[] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 0, 136, 136, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 0, 30, 31, 374, 375, 376, 377, 378, 30, 31, 30, 31, 30, - 31, 379, 380, 381, 382, 20, 30, 31, 20, 30, 31, 20, 20, 20, 20, 20, 101, - 101, 383, 383, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 20, 5, 5, 5, 5, - 5, 5, 30, 31, 30, 31, 25, 25, 25, 30, 31, 0, 0, 0, 0, 0, 5, 5, 5, 5, 27, - 5, 5, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, - 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, - 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 0, 384, 0, 0, 0, - 0, 0, 384, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 102, 5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, - 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, - 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, - 55, 55, 55, 55, 55, 55, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 136, 0, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 0, 30, 31, 376, 377, 378, 379, 380, 30, 31, + 30, 31, 30, 31, 381, 382, 383, 384, 20, 30, 31, 20, 30, 31, 20, 20, 20, + 20, 20, 102, 102, 385, 385, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 20, + 5, 5, 5, 5, 5, 5, 30, 31, 30, 31, 25, 25, 25, 30, 31, 0, 0, 0, 0, 0, 5, + 5, 5, 5, 27, 5, 5, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, + 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, + 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 0, 386, + 0, 0, 0, 0, 0, 386, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 103, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, + 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, + 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, + 0, 55, 55, 55, 55, 55, 55, 55, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 385, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 387, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 0, 0, 0, 0, 2, 5, 5, 5, 5, 102, 55, 242, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 25, 25, 25, 25, 18, 18, 5, 102, 102, 102, 102, 102, 5, 5, - 242, 242, 242, 102, 55, 5, 5, 5, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 0, 0, 0, 0, 2, 5, 5, 5, 5, 103, 55, 243, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 243, 243, 243, 243, 243, + 243, 243, 243, 243, 25, 25, 25, 25, 18, 18, 5, 103, 103, 103, 103, 103, + 5, 5, 243, 243, 243, 103, 55, 5, 5, 5, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 0, 0, 25, 25, 6, 6, 102, 102, 55, 5, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 0, 0, 25, 25, 6, 6, 103, 103, 55, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 5, 102, 102, 102, - 55, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 5, 103, 103, + 103, 55, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 5, - 5, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 27, 27, 27, 27, 27, 27, 27, 27, 5, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 5, 5, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 27, 27, 27, 27, 27, 27, 27, 27, 5, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 5, 5, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 55, 55, 55, 55, 55, 386, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 55, 55, 55, 55, 55, + 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -2936,7 +2942,7 @@ static unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -2945,55 +2951,55 @@ static unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 386, 55, 55, 386, 55, 55, 55, 386, 55, 386, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 5, 5, 5, 5, 5, 5, 388, 55, 55, 388, 55, 55, 55, 388, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 386, 55, 55, 55, 55, 55, 55, 55, 386, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 386, 386, + 55, 388, 55, 55, 55, 55, 55, 55, 55, 388, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, - 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, + 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, + 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 386, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 386, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 386, 55, 386, 55, 386, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 388, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 386, 55, 386, 386, 386, 55, 55, 55, 55, 55, - 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 388, 388, 388, 55, 55, 55, 55, + 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 386, 386, 386, 386, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 388, 388, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -3002,7 +3008,7 @@ static unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -3010,23 +3016,24 @@ static unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 386, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, + 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 388, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 388, 388, 388, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 386, 386, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 386, 386, 386, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -3038,682 +3045,699 @@ static unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 386, - 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 388, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, 386, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 102, 55, + 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 103, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 102, 102, 102, 102, 102, 102, 5, - 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 102, 5, 5, 5, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 103, 103, 103, 103, 103, 103, + 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 103, 5, 5, 5, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 55, 25, 6, 6, 6, - 5, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 102, 30, 31, 30, 31, 30, + 5, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 103, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, - 31, 30, 31, 30, 31, 101, 101, 25, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 31, 30, 31, 30, 31, 102, 102, 25, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 25, 25, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 102, 102, 102, 102, - 102, 102, 102, 102, 102, 6, 6, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, + 55, 55, 55, 55, 55, 55, 55, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 243, 25, 25, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 6, 6, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 20, 20, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 101, 20, 20, 20, - 20, 20, 20, 20, 20, 30, 31, 30, 31, 387, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 102, 6, 6, 30, 31, 388, 20, 55, 30, 31, 30, 31, 20, 20, 30, 31, + 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 102, 20, 20, 20, + 20, 20, 20, 20, 20, 30, 31, 30, 31, 389, 30, 31, 30, 31, 30, 31, 30, 31, + 30, 31, 103, 6, 6, 30, 31, 390, 20, 55, 30, 31, 30, 31, 391, 20, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 389, 390, 391, 392, 389, 20, 393, 394, 395, 396, 30, 31, 30, 31, 30, 31, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 392, 393, 394, 395, 392, 20, 396, 397, 398, 399, 30, 31, 30, 31, 30, 31, + 30, 31, 30, 31, 30, 31, 0, 0, 30, 31, 400, 401, 402, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 101, 101, 20, 55, 55, 55, 55, - 55, 55, 55, 25, 55, 55, 55, 25, 55, 55, 55, 55, 25, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 18, 18, 25, 25, 18, 5, 5, 5, 5, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 5, 5, - 5, 5, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 102, 102, 20, 55, + 55, 55, 55, 55, 55, 55, 25, 55, 55, 55, 25, 55, 55, 55, 55, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 55, 55, 55, + 55, 55, 55, 18, 18, 25, 25, 18, 5, 5, 5, 5, 0, 0, 0, 0, 27, 27, 27, 27, + 27, 27, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 55, 55, 55, 55, - 55, 55, 5, 5, 5, 55, 5, 55, 55, 25, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 55, 55, 55, 55, 55, 55, 55, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 25, - 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 18, - 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 0, 0, 0, 25, 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 25, 18, 18, 25, 25, 25, 25, 18, 18, 25, 18, 18, 18, 18, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 102, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 0, 0, 0, 0, 5, 5, 55, 55, 55, 55, 55, 25, 102, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, 55, 55, 55, 55, - 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 18, 18, 25, 25, 18, 18, - 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 25, 55, 55, 55, 55, 55, - 55, 55, 55, 25, 18, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 5, - 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 102, 55, 55, 55, 55, 55, 55, 5, 5, 5, 55, 18, 25, 18, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 55, 25, 25, 25, 55, 55, 25, 25, - 55, 55, 55, 55, 55, 25, 25, 55, 25, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 102, 5, 5, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 18, 25, 25, 18, 18, 5, 5, 55, 102, 102, 18, - 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, - 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 20, 20, 20, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 25, 25, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 55, + 55, 55, 55, 55, 55, 5, 5, 5, 55, 5, 55, 55, 25, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, + 25, 25, 25, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 0, 0, 0, 25, 25, 25, 18, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 25, 18, 18, 25, 25, 25, 25, 18, 18, 25, 25, 18, 18, + 18, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 103, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 0, 0, 0, 0, 5, 5, 55, 55, 55, 55, 55, 25, 103, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, 55, + 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 18, 18, 25, + 25, 18, 18, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 25, 55, 55, + 55, 55, 55, 55, 55, 55, 25, 18, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 0, 0, 5, 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 103, 55, 55, 55, 55, 55, 55, 5, 5, 5, 55, 18, 25, 18, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 55, 25, 25, 25, 55, + 55, 25, 25, 55, 55, 55, 55, 55, 25, 25, 55, 25, 55, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 103, 5, 5, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 25, 25, 18, 18, 5, 5, 55, + 103, 103, 18, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, + 0, 0, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, + 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 397, 20, 20, 20, - 20, 20, 20, 20, 6, 101, 101, 101, 101, 20, 20, 20, 20, 20, 20, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, - 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, - 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, - 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 55, + 403, 20, 20, 20, 20, 20, 20, 20, 6, 102, 102, 102, 102, 20, 20, 20, 20, + 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 18, 18, 25, 18, 18, 25, 18, 18, 5, 18, 25, 0, 0, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, - 25, 18, 18, 25, 18, 18, 5, 18, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, - 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 55, 55, 55, 55, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 386, 55, 55, 55, - 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, + 55, 55, 388, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 386, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 388, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 478, 479, 480, 481, 482, 483, 484, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 485, 486, 487, 488, 489, 0, 0, 0, 0, 0, 55, 25, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 0, 55, 0, 55, 55, 0, 55, 55, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 484, 485, 486, 487, 488, 489, + 490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 491, 492, 493, 494, 495, 0, 0, + 0, 0, 0, 55, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 5, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 0, 55, 0, + 55, 55, 0, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 496, 496, 496, 496, 496, 496, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 490, 490, 490, 490, 490, 490, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 5, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 55, + 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 490, 490, 5, 5, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 18, 18, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 18, 18, 18, 5, 5, 6, 0, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 0, 5, 5, 5, 5, 0, 0, 0, 0, 490, 55, 490, 55, 490, 0, 490, 55, - 490, 55, 490, 55, 490, 55, 490, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 496, 496, 5, 5, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, + 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, + 5, 5, 18, 18, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 18, 18, 18, 5, 5, 6, 0, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 0, 0, 0, 0, 496, 55, 496, 55, 496, 0, + 496, 55, 496, 55, 496, 55, 496, 55, 496, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 21, 0, 5, 5, 5, 5, 5, 5, 6, 5, 5, - 5, 5, 5, 5, 6, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 6, 5, 5, 5, 5, 5, - 5, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 5, 5, 5, 6, 18, 6, 19, 19, 19, 19, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 21, 0, 5, 5, 5, 5, 5, 5, 6, + 5, 5, 5, 5, 5, 5, 6, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 6, 5, 5, 5, + 5, 5, 5, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 5, 5, 5, 6, 18, 6, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 102, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 19, 19, 19, 19, 19, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 103, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 491, 491, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 497, 497, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 55, 55, 55, 55, 55, - 55, 0, 0, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 0, 0, 55, - 55, 55, 0, 0, 0, 5, 5, 5, 6, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 21, 21, 21, 5, 5, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 0, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 55, 55, 55, 55, + 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 0, 0, + 55, 55, 55, 0, 0, 0, 5, 5, 5, 6, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 5, 5, 0, 0, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, + 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, + 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, - 0, 0, 5, 5, 5, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 55, 0, 0, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 27, 27, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 5, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 243, 243, 243, 243, 243, 243, + 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 243, 243, 243, 243, 243, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 27, 27, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, + 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 25, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, - 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 27, 27, 27, - 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 242, 55, 55, 55, 55, 55, 55, 55, - 55, 242, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 55, + 55, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 243, 55, 55, 55, + 55, 55, 55, 55, 55, 243, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 5, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 0, 0, + 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 55, 55, 55, - 55, 55, 55, 55, 55, 5, 242, 242, 242, 242, 242, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 5, 243, 243, 243, 243, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 492, 492, 492, 492, 492, 492, 492, 492, - 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, - 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, - 492, 492, 492, 492, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, - 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, - 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, - 493, 493, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 498, 498, 498, 498, 498, 498, + 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, + 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, + 498, 498, 498, 498, 498, 498, 499, 499, 499, 499, 499, 499, 499, 499, + 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, + 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, + 499, 499, 499, 499, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 0, 0, 0, 0, 0, 0, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, - 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, - 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 0, 0, 0, 0, - 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, - 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, - 493, 493, 493, 493, 493, 493, 493, 493, 0, 0, 0, 0, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 498, 498, 498, 498, 498, 498, 498, 498, + 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, + 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 0, + 0, 0, 0, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, + 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, + 499, 499, 499, 499, 499, 499, 499, 499, 499, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, - 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, - 55, 0, 0, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 0, 0, 0, 55, - 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 0, 5, 27, 27, 27, 27, 27, 27, 27, 27, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 5, 5, 27, 27, 27, 27, 27, 27, 27, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, + 55, 55, 55, 55, 0, 0, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 0, + 0, 0, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 5, 27, 27, 27, 27, 27, 27, 27, 27, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 5, 5, 27, 27, 27, 27, 27, 27, 27, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 0, 55, 55, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 27, - 27, 27, 27, 27, 27, 0, 0, 0, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, - 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 0, 55, 55, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 27, 27, 27, 27, 27, 27, 0, 0, 0, 5, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, - 0, 27, 27, 55, 55, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 55, 0, 0, 0, 0, 27, 27, 55, 55, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 55, 25, 25, 25, - 0, 25, 25, 0, 0, 0, 0, 0, 25, 25, 25, 25, 55, 55, 55, 55, 0, 55, 55, 55, - 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 25, 25, 25, 0, 0, - 0, 0, 25, 26, 22, 23, 358, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 55, + 25, 25, 25, 0, 25, 25, 0, 0, 0, 0, 0, 25, 25, 25, 25, 55, 55, 55, 55, 0, + 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 25, 25, + 25, 0, 0, 0, 0, 25, 26, 22, 23, 360, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, + 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 27, 27, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 27, - 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 5, 55, 55, + 55, 55, 55, 55, 55, 55, 27, 27, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 0, 0, 0, 0, 27, 27, 27, 27, 27, - 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, + 55, 55, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, + 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 0, 0, 0, 0, 27, 27, + 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 5, 5, 5, 5, 5, - 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, - 0, 27, 27, 27, 27, 27, 27, 27, 27, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 5, + 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 5, + 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 115, 115, 115, 115, - 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 115, 115, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, - 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, + 27, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 22, - 23, 358, 359, 360, 361, 362, 363, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 55, 55, 55, 55, 55, + 26, 22, 23, 360, 361, 362, 363, 364, 365, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 55, 0, 0, - 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 27, 27, 27, 27, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 55, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 27, 27, 27, 27, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 18, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 25, + 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 26, 22, 23, 358, 359, 360, 361, 362, - 363, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 7, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 18, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 5, + 5, 5, 5, 0, 0, 0, 0, 26, 22, 23, 360, 361, 362, 363, 364, 365, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, 25, 25, 25, 18, 18, - 25, 25, 5, 5, 21, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, + 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, 25, 25, 25, 18, 18, 25, 25, 5, 5, + 21, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 0, 0, 0, 0, 0, 0, 25, 25, 25, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 0, 0, 0, 0, 0, 0, 25, 25, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 18, 25, 25, - 25, 25, 25, 25, 25, 25, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, 5, 5, - 5, 55, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 18, 25, 25, 25, 25, 25, + 25, 25, 25, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, 5, 5, 5, 55, 18, + 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 5, 5, 55, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 25, 5, 5, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, + 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, - 18, 25, 25, 25, 25, 25, 25, 25, 25, 25, 18, 18, 55, 55, 55, 55, 5, 5, 5, - 5, 25, 25, 25, 25, 5, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, 5, - 55, 5, 5, 5, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 18, 18, 18, 25, 25, 25, 18, 18, 25, 18, 25, 25, 5, 5, 5, - 5, 5, 5, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, - 55, 55, 55, 55, 55, 0, 55, 0, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 5, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 18, 18, 55, 55, 55, 55, 5, 5, 5, 5, 25, + 25, 25, 25, 5, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, 5, 55, 5, + 5, 5, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 18, 18, 18, 25, 25, 25, 18, 18, 25, 18, 25, 25, 5, 5, 5, 5, 5, 5, + 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, + 55, 55, 0, 55, 0, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 5, 0, + 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 25, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 25, 25, 18, 18, 0, 55, 55, - 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, - 55, 55, 55, 55, 55, 0, 55, 55, 0, 55, 55, 55, 55, 55, 0, 25, 25, 55, 18, - 18, 25, 18, 18, 18, 18, 0, 0, 18, 18, 0, 0, 18, 18, 18, 0, 0, 55, 0, 0, - 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 18, 18, 0, 0, 25, 25, - 25, 25, 25, 25, 25, 0, 0, 0, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 18, + 18, 25, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 25, 25, 18, 18, 0, 55, 55, 55, 55, 55, + 55, 55, 55, 0, 0, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, + 55, 55, 0, 55, 55, 0, 55, 55, 55, 55, 55, 0, 25, 25, 55, 18, 18, 25, 18, + 18, 18, 18, 0, 0, 18, 18, 0, 0, 18, 18, 18, 0, 0, 55, 0, 0, 0, 0, 0, 0, + 18, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 18, 18, 0, 0, 25, 25, 25, 25, 25, + 25, 25, 0, 0, 0, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 18, 18, 25, 25, 25, 18, - 25, 55, 55, 55, 55, 5, 5, 5, 5, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 0, 5, 0, 5, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, + 18, 25, 25, 25, 25, 25, 25, 25, 25, 18, 18, 25, 25, 25, 18, 25, 55, 55, + 55, 55, 5, 5, 5, 5, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 5, 0, 5, + 25, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 18, 18, 18, 25, 25, 25, 25, 25, 25, 18, 25, 18, 18, 18, - 18, 25, 25, 18, 25, 25, 55, 55, 5, 55, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, + 55, 18, 18, 18, 25, 25, 25, 25, 25, 25, 18, 25, 18, 18, 18, 18, 25, 25, + 18, 25, 25, 55, 55, 5, 55, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, 25, 25, 25, 0, 0, - 18, 18, 18, 18, 25, 25, 18, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, 25, 25, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, 25, 25, 25, 0, 0, 18, 18, 18, + 18, 25, 25, 18, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, - 18, 25, 25, 25, 25, 25, 25, 25, 25, 18, 18, 25, 18, 25, 25, 5, 5, 5, 55, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, - 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, 25, + 25, 25, 25, 25, 25, 25, 18, 18, 25, 18, 25, 25, 5, 5, 5, 55, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, + 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, - 18, 25, 18, 18, 25, 25, 25, 25, 25, 25, 18, 25, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 25, 18, + 18, 25, 25, 25, 25, 25, 25, 18, 25, 55, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 0, 0, 25, 25, 25, 18, 18, 25, 25, 25, 25, 18, 25, 25, 25, - 25, 25, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 27, 27, 5, 5, 5, - 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 0, 0, 25, 25, 25, 18, 18, 25, 25, 25, 25, 18, 25, 25, 25, 25, 25, 0, + 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 27, 27, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 25, 18, 25, 25, - 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 25, 18, 25, 25, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 55, 55, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 55, 55, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 25, 25, 25, 25, 25, 25, 18, 55, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, - 5, 5, 25, 0, 0, 0, 0, 0, 0, 0, 0, 55, 25, 25, 25, 25, 25, 25, 18, 18, 25, - 25, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 18, 18, 18, 25, 25, 25, 25, 0, 0, 25, 25, 18, 18, 18, 18, 25, + 55, 5, 55, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 55, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 18, 25, 25, 5, 5, 5, 55, 5, 5, 5, 5, 5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 25, 25, 25, 25, 25, 25, 18, 55, 25, 25, 25, 25, 5, 5, 5, 5, + 5, 5, 5, 5, 25, 0, 0, 0, 0, 0, 0, 0, 0, 55, 25, 25, 25, 25, 25, 25, 18, + 18, 25, 25, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 18, 25, 25, 5, 5, 5, 55, 5, 5, 5, 5, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 18, 25, 25, 25, 25, 25, 25, 25, 0, 25, 25, 25, 25, 25, 25, 18, - 25, 55, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 0, 0, 0, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 0, 18, 25, 25, 25, 25, 25, 25, 25, 18, - 25, 25, 18, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 18, 25, 25, 25, 25, 25, 25, 25, 0, 25, 25, 25, 25, + 25, 25, 18, 25, 55, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 5, 5, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 18, 25, 25, 25, 25, 25, + 25, 25, 18, 25, 25, 18, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 0, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, + 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 25, 25, 25, 25, 25, 25, 0, 0, 0, 25, 0, 25, 25, 0, 25, 25, 25, 25, 25, - 25, 25, 55, 25, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 0, 55, 55, 0, 55, 55, 55, + 55, 55, 55, 25, 25, 25, 25, 25, 25, 0, 0, 0, 25, 0, 25, 25, 0, 25, 25, + 25, 25, 25, 25, 25, 55, 25, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 0, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 18, 18, 0, 25, - 25, 0, 18, 18, 25, 18, 25, 55, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 18, + 18, 0, 25, 25, 0, 18, 18, 25, 18, 25, 55, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 18, - 18, 5, 5, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 25, 25, 18, 18, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 0, - 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 243, + 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 0, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, - 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, + 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 25, 25, - 25, 25, 25, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 25, 25, 25, 25, + 25, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 102, 102, 102, 102, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 0, 27, 27, 27, 27, 27, 27, 27, 0, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, - 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 103, + 103, 103, 103, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 0, 27, 27, 27, 27, 27, 27, 27, 0, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, + 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 17, 17, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 55, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 25, 55, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 102, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 102, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 103, 103, 5, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -3721,272 +3745,296 @@ static unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 5, 25, 25, 5, 21, 21, 21, - 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 5, + 25, 25, 5, 21, 21, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, + 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 18, 25, 25, 25, 5, 5, 5, 18, 18, 18, - 18, 18, 18, 21, 21, 21, 21, 21, 21, 21, 21, 25, 25, 25, 25, 25, 25, 25, - 25, 5, 5, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 25, 25, 25, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 18, 25, 25, 25, + 5, 5, 5, 18, 18, 18, 18, 18, 18, 21, 21, 21, 21, 21, 21, 21, 21, 25, 25, + 25, 25, 25, 25, 25, 25, 5, 5, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 25, 25, 25, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 25, 25, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 20, 20, 20, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 0, 0, 0, 0, 0, 0, 0, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 20, 20, 20, 20, 20, 20, 20, 0, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 20, 20, 20, 20, 20, 20, 20, 0, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 120, 0, 120, - 120, 0, 0, 120, 0, 0, 120, 120, 0, 0, 120, 120, 120, 120, 0, 120, 120, - 120, 120, 120, 120, 120, 120, 20, 20, 20, 20, 0, 20, 0, 20, 20, 20, 20, - 20, 20, 20, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 121, 0, 121, 121, 0, 0, 121, 0, 0, 121, 121, 0, 0, 121, 121, 121, + 121, 0, 121, 121, 121, 121, 121, 121, 121, 121, 20, 20, 20, 20, 0, 20, 0, + 20, 20, 20, 20, 20, 20, 20, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 120, 120, 0, 120, 120, 120, 120, 0, 0, 120, 120, 120, 120, 120, 120, - 120, 120, 0, 120, 120, 120, 120, 120, 120, 120, 0, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 121, 121, 0, 121, 121, 121, 121, 0, 0, 121, 121, 121, + 121, 121, 121, 121, 121, 0, 121, 121, 121, 121, 121, 121, 121, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 120, 120, 0, 120, 120, 120, 120, 0, 120, 120, 120, 120, 120, - 0, 120, 0, 0, 0, 120, 120, 120, 120, 120, 120, 120, 0, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 121, 121, 0, 121, 121, 121, 121, 0, 121, 121, + 121, 121, 121, 0, 121, 0, 0, 0, 121, 121, 121, 121, 121, 121, 121, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 20, 20, 20, + 20, 20, 20, 20, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 5, 20, 20, 20, 20, + 20, 20, 20, 0, 0, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 5, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 5, 20, 20, 20, 20, 20, 20, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 5, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 5, 20, 20, 20, 20, - 20, 20, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 5, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 5, 20, 20, 20, 20, 20, 20, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 5, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 5, 20, 20, 20, 20, 20, 20, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 5, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 5, 20, 20, - 20, 20, 20, 20, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 5, + 5, 20, 20, 20, 20, 20, 20, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 5, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 5, 20, 20, 20, 20, 20, 20, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 5, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 5, 20, 20, 20, 20, 20, 20, 120, 20, 0, 0, 7, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 7, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 7, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 20, 20, 5, 20, 20, 20, 20, 20, 20, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 5, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 5, 20, 20, 20, 20, + 20, 20, 121, 20, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 5, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, + 5, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 25, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 0, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 5, + 5, 5, 5, 5, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 5, 5, 5, 5, + 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, + 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, - 25, 25, 25, 25, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 0, 0, 25, 25, 25, 25, 25, 25, 25, 0, 25, 25, 0, 25, 25, - 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 0, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 0, 25, 25, 25, 25, 25, 25, 25, + 0, 25, 25, 0, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, + 103, 103, 103, 103, 103, 103, 103, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 0, 0, 0, 0, 55, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 0, 0, 0, 0, 0, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, 25, 25, 25, 25, + 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 500, 500, 500, + 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, + 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, + 500, 500, 500, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, + 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, + 501, 501, 501, 501, 501, 501, 501, 501, 501, 25, 25, 25, 25, 25, 25, 25, + 103, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, - 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, - 494, 494, 494, 494, 494, 494, 494, 494, 494, 495, 495, 495, 495, 495, - 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, - 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, - 495, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 5, 27, 27, 27, 5, 27, - 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 27, 27, 27, 27, 27, 27, 5, 27, 27, 27, 5, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 0, 55, 55, 0, 55, 0, 0, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 0, 55, 55, 55, 55, 0, 55, 0, 55, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, - 55, 0, 55, 0, 55, 0, 55, 55, 55, 0, 55, 55, 0, 55, 0, 0, 55, 0, 55, 0, - 55, 0, 55, 0, 55, 0, 55, 55, 0, 55, 0, 0, 55, 55, 55, 55, 0, 55, 55, 55, - 55, 55, 55, 55, 0, 55, 55, 55, 55, 0, 55, 55, 55, 55, 0, 55, 0, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 55, 55, 55, 0, 55, 55, 55, - 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 5, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 0, + 55, 0, 0, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, + 55, 0, 55, 0, 55, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 55, 0, 55, 0, 55, 0, + 55, 55, 55, 0, 55, 55, 0, 55, 0, 0, 55, 0, 55, 0, 55, 0, 55, 0, 55, 0, + 55, 55, 0, 55, 0, 0, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, + 55, 55, 55, 55, 0, 55, 55, 55, 55, 0, 55, 0, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 0, 0, 0, 0, 0, 55, 55, 55, 0, 55, 55, 55, 55, 55, 0, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, + 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, + 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 359, 359, 26, 22, 23, 360, 361, 362, 363, 364, + 365, 27, 27, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 502, 502, 502, 502, 502, + 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, + 502, 502, 502, 502, 502, 502, 502, 5, 5, 5, 5, 5, 5, 502, 502, 502, 502, + 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, + 502, 502, 502, 502, 502, 502, 502, 502, 5, 5, 5, 0, 0, 0, 502, 502, 502, + 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, + 502, 502, 502, 502, 502, 502, 502, 502, 502, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 357, 357, 26, 22, 23, 358, 359, - 360, 361, 362, 363, 27, 27, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 496, 496, - 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, - 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 5, 5, 5, 5, 5, 5, 496, - 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, - 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 5, 5, 0, 0, 0, 0, - 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, - 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 5, 5, 5, 5, + 5, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, - 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, - 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, - 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, + 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 0, 0, 0, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, - 5, 0, 0, 0, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, - 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, - 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, + 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -3997,16 +4045,16 @@ static unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -4014,14 +4062,14 @@ static unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -4033,31 +4081,31 @@ static unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 386, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, + 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -4067,20 +4115,20 @@ static unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 25, 25, 25, 25, 25, 25, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, @@ -4094,12 +4142,13 @@ static unsigned short index2[] = { 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 1, 1, 0, 0, }; /* Returns the numeric value as double for Unicode characters @@ -4184,6 +4233,8 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1D7E2: case 0x1D7EC: case 0x1D7F6: + case 0x1E140: + case 0x1E2F0: case 0x1E950: case 0x1F100: case 0x1F101: @@ -4317,16 +4368,20 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1D7E3: case 0x1D7ED: case 0x1D7F7: + case 0x1E141: + case 0x1E2F1: case 0x1E8C7: case 0x1E951: case 0x1EC71: case 0x1ECA3: case 0x1ECB1: + case 0x1ED01: case 0x1F102: case 0x2092A: return (double) 1.0; case 0x0D5C: case 0x2152: + case 0x11FCB: return (double) 1.0/10.0; case 0x109F6: return (double) 1.0/12.0; @@ -4334,8 +4389,11 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x0B75: case 0x0D76: case 0xA833: + case 0x11FC9: + case 0x11FCA: return (double) 1.0/16.0; case 0x0D58: + case 0x11FC1: return (double) 1.0/160.0; case 0x00BD: case 0x0B73: @@ -4350,10 +4408,14 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x10A48: case 0x10E7B: case 0x10F26: + case 0x11FD1: + case 0x11FD2: case 0x12464: case 0x1ECAE: + case 0x1ED3C: return (double) 1.0/2.0; case 0x0D5B: + case 0x11FC8: return (double) 1.0/20.0; case 0x2153: case 0x10E7D: @@ -4361,6 +4423,11 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1245D: case 0x12465: return (double) 1.0/3.0; + case 0x11FC5: + return (double) 1.0/32.0; + case 0x11FC0: + case 0x11FD4: + return (double) 1.0/320.0; case 0x00BC: case 0x09F7: case 0x0B72: @@ -4369,19 +4436,25 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x10140: case 0x1018B: case 0x10E7C: + case 0x11FD0: case 0x12460: case 0x12462: case 0x12463: case 0x1ECAD: return (double) 1.0/4.0; case 0x0D59: + case 0x11FC4: return (double) 1.0/40.0; case 0x0D5E: case 0x2155: + case 0x11FCF: return (double) 1.0/5.0; case 0x2159: case 0x12461: + case 0x1ED3D: return (double) 1.0/6.0; + case 0x11FC3: + return (double) 1.0/64.0; case 0x2150: return (double) 1.0/7.0; case 0x09F5: @@ -4389,8 +4462,11 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x0D77: case 0x215B: case 0xA834: + case 0x11FCC: case 0x1245F: return (double) 1.0/8.0; + case 0x11FC2: + return (double) 1.0/80.0; case 0x2151: return (double) 1.0/9.0; case 0x0BF0: @@ -4452,6 +4528,8 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1D2EA: case 0x1D369: case 0x1EC7A: + case 0x1ED0A: + case 0x1ED37: return (double) 10.0; case 0x109FF: return (double) 10.0/12.0; @@ -4488,6 +4566,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x11C6C: case 0x16B5C: case 0x1EC83: + case 0x1ED13: return (double) 100.0; case 0x0BF2: case 0x0D72: @@ -4510,6 +4589,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x11065: case 0x111F4: case 0x1EC8C: + case 0x1ED1C: return (double) 1000.0; case 0x137C: case 0x2182: @@ -4522,6 +4602,8 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x16B5D: case 0x1EC95: case 0x1ECB3: + case 0x1ED25: + case 0x1ED3B: return (double) 10000.0; case 0x2188: case 0x109ED: @@ -4748,11 +4830,15 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1D7E4: case 0x1D7EE: case 0x1D7F8: + case 0x1E142: + case 0x1E2F2: case 0x1E8C8: case 0x1E952: case 0x1EC72: case 0x1ECA4: case 0x1ECB2: + case 0x1ED02: + case 0x1ED2F: case 0x1F103: case 0x22390: return (double) 2.0; @@ -4801,20 +4887,25 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x11C64: case 0x1D36A: case 0x1EC7B: + case 0x1ED0B: return (double) 20.0; case 0x1011A: case 0x102F4: case 0x109D3: case 0x10E73: case 0x1EC84: + case 0x1ED14: return (double) 200.0; case 0x10123: case 0x109DC: case 0x1EC8D: + case 0x1ED1D: + case 0x1ED3A: return (double) 2000.0; case 0x1012C: case 0x109E5: case 0x1EC96: + case 0x1ED26: return (double) 20000.0; case 0x109EE: case 0x1EC9F: @@ -4965,10 +5056,14 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1D7E5: case 0x1D7EF: case 0x1D7F9: + case 0x1E143: + case 0x1E2F3: case 0x1E8C9: case 0x1E953: case 0x1EC73: case 0x1ECA5: + case 0x1ED03: + case 0x1ED30: case 0x1F104: case 0x20AFD: case 0x20B19: @@ -4981,10 +5076,12 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x0B77: case 0x0D78: case 0xA835: + case 0x11FCE: return (double) 3.0/16.0; case 0x0F2B: return (double) 3.0/2.0; case 0x0D5D: + case 0x11FCD: return (double) 3.0/20.0; case 0x00BE: case 0x09F8: @@ -4992,13 +5089,17 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x0D75: case 0xA832: case 0x10178: + case 0x11FD3: case 0x1ECAF: return (double) 3.0/4.0; case 0x2157: return (double) 3.0/5.0; + case 0x11FC7: + return (double) 3.0/64.0; case 0x215C: return (double) 3.0/8.0; case 0x0D5A: + case 0x11FC6: return (double) 3.0/80.0; case 0x1374: case 0x303A: @@ -5017,6 +5118,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x11C65: case 0x1D36B: case 0x1EC7C: + case 0x1ED0C: case 0x20983: return (double) 30.0; case 0x1011B: @@ -5025,14 +5127,17 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x109D4: case 0x10E74: case 0x1EC85: + case 0x1ED15: return (double) 300.0; case 0x10124: case 0x109DD: case 0x1EC8E: + case 0x1ED1E: return (double) 3000.0; case 0x1012D: case 0x109E6: case 0x1EC97: + case 0x1ED27: return (double) 30000.0; case 0x109EF: return (double) 300000.0; @@ -5170,10 +5275,14 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1D7E6: case 0x1D7F0: case 0x1D7FA: + case 0x1E144: + case 0x1E2F4: case 0x1E8CA: case 0x1E954: case 0x1EC74: case 0x1ECA6: + case 0x1ED04: + case 0x1ED31: case 0x1F105: case 0x20064: case 0x200E2: @@ -5198,6 +5307,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x12467: case 0x1D36C: case 0x1EC7D: + case 0x1ED0D: case 0x2098C: case 0x2099C: return (double) 40.0; @@ -5206,14 +5316,18 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x109D5: case 0x10E75: case 0x1EC86: + case 0x1ED16: + case 0x1ED38: return (double) 400.0; case 0x10125: case 0x109DE: case 0x1EC8F: + case 0x1ED1F: return (double) 4000.0; case 0x1012E: case 0x109E7: case 0x1EC98: + case 0x1ED28: return (double) 40000.0; case 0x109F0: return (double) 400000.0; @@ -5354,10 +5468,14 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1D7E7: case 0x1D7F1: case 0x1D7FB: + case 0x1E145: + case 0x1E2F5: case 0x1E8CB: case 0x1E955: case 0x1EC75: case 0x1ECA7: + case 0x1ED05: + case 0x1ED32: case 0x1F106: case 0x20121: return (double) 5.0; @@ -5398,6 +5516,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x12468: case 0x1D36D: case 0x1EC7E: + case 0x1ED0E: return (double) 50.0; case 0x216E: case 0x217E: @@ -5414,6 +5533,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x109D6: case 0x10E76: case 0x1EC87: + case 0x1ED17: return (double) 500.0; case 0x2181: case 0x10126: @@ -5422,6 +5542,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x10172: case 0x109DF: case 0x1EC90: + case 0x1ED20: return (double) 5000.0; case 0x2187: case 0x1012F: @@ -5429,6 +5550,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x10156: case 0x109E8: case 0x1EC99: + case 0x1ED29: return (double) 50000.0; case 0x109F1: return (double) 500000.0; @@ -5533,10 +5655,14 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1D7E8: case 0x1D7F2: case 0x1D7FC: + case 0x1E146: + case 0x1E2F6: case 0x1E8CC: case 0x1E956: case 0x1EC76: case 0x1ECA8: + case 0x1ED06: + case 0x1ED33: case 0x1F107: case 0x20AEA: return (double) 6.0; @@ -5554,20 +5680,25 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x11C68: case 0x1D36E: case 0x1EC7F: + case 0x1ED0F: return (double) 60.0; case 0x1011E: case 0x102F8: case 0x109D7: case 0x10E77: case 0x1EC88: + case 0x1ED18: + case 0x1ED39: return (double) 600.0; case 0x10127: case 0x109E0: case 0x1EC91: + case 0x1ED21: return (double) 6000.0; case 0x10130: case 0x109E9: case 0x1EC9A: + case 0x1ED2A: return (double) 60000.0; case 0x109F2: return (double) 600000.0; @@ -5671,10 +5802,14 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1D7E9: case 0x1D7F3: case 0x1D7FD: + case 0x1E147: + case 0x1E2F7: case 0x1E8CD: case 0x1E957: case 0x1EC77: case 0x1ECA9: + case 0x1ED07: + case 0x1ED34: case 0x1F108: case 0x20001: return (double) 7.0; @@ -5696,20 +5831,24 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x11C69: case 0x1D36F: case 0x1EC80: + case 0x1ED10: return (double) 70.0; case 0x1011F: case 0x102F9: case 0x109D8: case 0x10E78: case 0x1EC89: + case 0x1ED19: return (double) 700.0; case 0x10128: case 0x109E1: case 0x1EC92: + case 0x1ED22: return (double) 7000.0; case 0x10131: case 0x109EA: case 0x1EC9B: + case 0x1ED2B: return (double) 70000.0; case 0x109F3: return (double) 700000.0; @@ -5810,10 +5949,14 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1D7EA: case 0x1D7F4: case 0x1D7FE: + case 0x1E148: + case 0x1E2F8: case 0x1E8CE: case 0x1E958: case 0x1EC78: case 0x1ECAA: + case 0x1ED08: + case 0x1ED35: case 0x1F109: return (double) 8.0; case 0x109FD: @@ -5829,20 +5972,24 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x11C6A: case 0x1D370: case 0x1EC81: + case 0x1ED11: return (double) 80.0; case 0x10120: case 0x102FA: case 0x109D9: case 0x10E79: case 0x1EC8A: + case 0x1ED1A: return (double) 800.0; case 0x10129: case 0x109E2: case 0x1EC93: + case 0x1ED23: return (double) 8000.0; case 0x10132: case 0x109EB: case 0x1EC9C: + case 0x1ED2C: return (double) 80000.0; case 0x109F4: return (double) 800000.0; @@ -5946,10 +6093,14 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1D7EB: case 0x1D7F5: case 0x1D7FF: + case 0x1E149: + case 0x1E2F9: case 0x1E8CF: case 0x1E959: case 0x1EC79: case 0x1ECAB: + case 0x1ED09: + case 0x1ED36: case 0x1F10A: case 0x2F890: return (double) 9.0; @@ -5968,6 +6119,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x11C6B: case 0x1D371: case 0x1EC82: + case 0x1ED12: return (double) 90.0; case 0x10121: case 0x102FB: @@ -5975,14 +6127,17 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x109DA: case 0x10E7A: case 0x1EC8B: + case 0x1ED1B: return (double) 900.0; case 0x1012A: case 0x109E3: case 0x1EC94: + case 0x1ED24: return (double) 9000.0; case 0x10133: case 0x109EC: case 0x1EC9D: + case 0x1ED2D: return (double) 90000.0; case 0x109F5: return (double) 900000.0; diff --git a/Tools/unicode/makeunicodedata.py b/Tools/unicode/makeunicodedata.py index 009767183904..9327693a1732 100644 --- a/Tools/unicode/makeunicodedata.py +++ b/Tools/unicode/makeunicodedata.py @@ -41,7 +41,7 @@ # * Doc/library/stdtypes.rst, and # * Doc/library/unicodedata.rst # * Doc/reference/lexical_analysis.rst (two occurrences) -UNIDATA_VERSION = "11.0.0" +UNIDATA_VERSION = "12.0.0" UNICODE_DATA = "UnicodeData%s.txt" COMPOSITION_EXCLUSIONS = "CompositionExclusions%s.txt" EASTASIAN_WIDTH = "EastAsianWidth%s.txt" From webhook-mailer at python.org Sat Mar 9 21:09:54 2019 From: webhook-mailer at python.org (Ned Deily) Date: Sun, 10 Mar 2019 02:09:54 -0000 Subject: [Python-checkins] bpo-35121: prefix dot in domain for proper subdomain validation (GH-10258) Message-ID: https://github.com/python/cpython/commit/ca7fe5063593958e5efdf90f068582837f07bd14 commit: ca7fe5063593958e5efdf90f068582837f07bd14 branch: master author: Xtreak committer: Ned Deily date: 2019-03-09T21:09:48-05:00 summary: bpo-35121: prefix dot in domain for proper subdomain validation (GH-10258) Don't send cookies of domain A without Domain attribute to domain B when domain A is a suffix match of domain B while using a cookiejar with `http.cookiejar.DefaultCookiePolicy` policy. Patch by Karthikeyan Singaravelan. files: A Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst M Lib/http/cookiejar.py M Lib/test/test_http_cookiejar.py diff --git a/Lib/http/cookiejar.py b/Lib/http/cookiejar.py index befe7653c530..3a96383325ca 100644 --- a/Lib/http/cookiejar.py +++ b/Lib/http/cookiejar.py @@ -1148,6 +1148,11 @@ def return_ok_domain(self, cookie, request): req_host, erhn = eff_request_host(request) domain = cookie.domain + if domain and not domain.startswith("."): + dotdomain = "." + domain + else: + dotdomain = domain + # strict check of non-domain cookies: Mozilla does this, MSIE5 doesn't if (cookie.version == 0 and (self.strict_ns_domain & self.DomainStrictNonDomain) and @@ -1160,7 +1165,7 @@ def return_ok_domain(self, cookie, request): _debug(" effective request-host name %s does not domain-match " "RFC 2965 cookie domain %s", erhn, domain) return False - if cookie.version == 0 and not ("."+erhn).endswith(domain): + if cookie.version == 0 and not ("."+erhn).endswith(dotdomain): _debug(" request-host %s does not match Netscape cookie domain " "%s", req_host, domain) return False @@ -1174,7 +1179,11 @@ def domain_return_ok(self, domain, request): req_host = "."+req_host if not erhn.startswith("."): erhn = "."+erhn - if not (req_host.endswith(domain) or erhn.endswith(domain)): + if domain and not domain.startswith("."): + dotdomain = "." + domain + else: + dotdomain = domain + if not (req_host.endswith(dotdomain) or erhn.endswith(dotdomain)): #_debug(" request domain %s does not match cookie domain %s", # req_host, domain) return False diff --git a/Lib/test/test_http_cookiejar.py b/Lib/test/test_http_cookiejar.py index 170549caf5b4..acf315a4f2e0 100644 --- a/Lib/test/test_http_cookiejar.py +++ b/Lib/test/test_http_cookiejar.py @@ -440,6 +440,7 @@ def test_domain_return_ok(self): ("http://foo.bar.com/", ".foo.bar.com", True), ("http://foo.bar.com/", "foo.bar.com", True), ("http://foo.bar.com/", ".bar.com", True), + ("http://foo.bar.com/", "bar.com", True), ("http://foo.bar.com/", "com", True), ("http://foo.com/", "rhubarb.foo.com", False), ("http://foo.com/", ".foo.com", True), @@ -450,6 +451,8 @@ def test_domain_return_ok(self): ("http://foo/", "foo", True), ("http://foo/", "foo.local", True), ("http://foo/", ".local", True), + ("http://barfoo.com", ".foo.com", False), + ("http://barfoo.com", "foo.com", False), ]: request = urllib.request.Request(url) r = pol.domain_return_ok(domain, request) @@ -984,6 +987,33 @@ def test_domain_block(self): c.add_cookie_header(req) self.assertFalse(req.has_header("Cookie")) + c.clear() + + pol.set_blocked_domains([]) + req = urllib.request.Request("http://acme.com/") + res = FakeResponse(headers, "http://acme.com/") + cookies = c.make_cookies(res, req) + c.extract_cookies(res, req) + self.assertEqual(len(c), 1) + + req = urllib.request.Request("http://acme.com/") + c.add_cookie_header(req) + self.assertTrue(req.has_header("Cookie")) + + req = urllib.request.Request("http://badacme.com/") + c.add_cookie_header(req) + self.assertFalse(pol.return_ok(cookies[0], req)) + self.assertFalse(req.has_header("Cookie")) + + p = pol.set_blocked_domains(["acme.com"]) + req = urllib.request.Request("http://acme.com/") + c.add_cookie_header(req) + self.assertFalse(req.has_header("Cookie")) + + req = urllib.request.Request("http://badacme.com/") + c.add_cookie_header(req) + self.assertFalse(req.has_header("Cookie")) + def test_secure(self): for ns in True, False: for whitespace in " ", "": diff --git a/Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst b/Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst new file mode 100644 index 000000000000..d2eb8f1f352c --- /dev/null +++ b/Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst @@ -0,0 +1,4 @@ +Don't send cookies of domain A without Domain attribute to domain B +when domain A is a suffix match of domain B while using a cookiejar +with :class:`http.cookiejar.DefaultCookiePolicy` policy. Patch by +Karthikeyan Singaravelan. From webhook-mailer at python.org Sat Mar 9 21:58:29 2019 From: webhook-mailer at python.org (Ned Deily) Date: Sun, 10 Mar 2019 02:58:29 -0000 Subject: [Python-checkins] bpo-35121: prefix dot in domain for proper subdomain validation (GH-10258) (GH-12261) Message-ID: https://github.com/python/cpython/commit/e5123d81ffb3be35a1b2767d6ced1a097aaf77be commit: e5123d81ffb3be35a1b2767d6ced1a097aaf77be branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Ned Deily date: 2019-03-09T21:58:25-05:00 summary: bpo-35121: prefix dot in domain for proper subdomain validation (GH-10258) (GH-12261) Don't send cookies of domain A without Domain attribute to domain B when domain A is a suffix match of domain B while using a cookiejar with `http.cookiejar.DefaultCookiePolicy` policy. Patch by Karthikeyan Singaravelan. (cherry picked from commit ca7fe5063593958e5efdf90f068582837f07bd14) Co-authored-by: Xtreak files: A Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst M Lib/http/cookiejar.py M Lib/test/test_http_cookiejar.py diff --git a/Lib/http/cookiejar.py b/Lib/http/cookiejar.py index e0f1032b2816..00cb1250a07e 100644 --- a/Lib/http/cookiejar.py +++ b/Lib/http/cookiejar.py @@ -1145,6 +1145,11 @@ def return_ok_domain(self, cookie, request): req_host, erhn = eff_request_host(request) domain = cookie.domain + if domain and not domain.startswith("."): + dotdomain = "." + domain + else: + dotdomain = domain + # strict check of non-domain cookies: Mozilla does this, MSIE5 doesn't if (cookie.version == 0 and (self.strict_ns_domain & self.DomainStrictNonDomain) and @@ -1157,7 +1162,7 @@ def return_ok_domain(self, cookie, request): _debug(" effective request-host name %s does not domain-match " "RFC 2965 cookie domain %s", erhn, domain) return False - if cookie.version == 0 and not ("."+erhn).endswith(domain): + if cookie.version == 0 and not ("."+erhn).endswith(dotdomain): _debug(" request-host %s does not match Netscape cookie domain " "%s", req_host, domain) return False @@ -1171,7 +1176,11 @@ def domain_return_ok(self, domain, request): req_host = "."+req_host if not erhn.startswith("."): erhn = "."+erhn - if not (req_host.endswith(domain) or erhn.endswith(domain)): + if domain and not domain.startswith("."): + dotdomain = "." + domain + else: + dotdomain = domain + if not (req_host.endswith(dotdomain) or erhn.endswith(dotdomain)): #_debug(" request domain %s does not match cookie domain %s", # req_host, domain) return False diff --git a/Lib/test/test_http_cookiejar.py b/Lib/test/test_http_cookiejar.py index abc625d672a7..6e1b30881310 100644 --- a/Lib/test/test_http_cookiejar.py +++ b/Lib/test/test_http_cookiejar.py @@ -415,6 +415,7 @@ def test_domain_return_ok(self): ("http://foo.bar.com/", ".foo.bar.com", True), ("http://foo.bar.com/", "foo.bar.com", True), ("http://foo.bar.com/", ".bar.com", True), + ("http://foo.bar.com/", "bar.com", True), ("http://foo.bar.com/", "com", True), ("http://foo.com/", "rhubarb.foo.com", False), ("http://foo.com/", ".foo.com", True), @@ -425,6 +426,8 @@ def test_domain_return_ok(self): ("http://foo/", "foo", True), ("http://foo/", "foo.local", True), ("http://foo/", ".local", True), + ("http://barfoo.com", ".foo.com", False), + ("http://barfoo.com", "foo.com", False), ]: request = urllib.request.Request(url) r = pol.domain_return_ok(domain, request) @@ -959,6 +962,33 @@ def test_domain_block(self): c.add_cookie_header(req) self.assertFalse(req.has_header("Cookie")) + c.clear() + + pol.set_blocked_domains([]) + req = urllib.request.Request("http://acme.com/") + res = FakeResponse(headers, "http://acme.com/") + cookies = c.make_cookies(res, req) + c.extract_cookies(res, req) + self.assertEqual(len(c), 1) + + req = urllib.request.Request("http://acme.com/") + c.add_cookie_header(req) + self.assertTrue(req.has_header("Cookie")) + + req = urllib.request.Request("http://badacme.com/") + c.add_cookie_header(req) + self.assertFalse(pol.return_ok(cookies[0], req)) + self.assertFalse(req.has_header("Cookie")) + + p = pol.set_blocked_domains(["acme.com"]) + req = urllib.request.Request("http://acme.com/") + c.add_cookie_header(req) + self.assertFalse(req.has_header("Cookie")) + + req = urllib.request.Request("http://badacme.com/") + c.add_cookie_header(req) + self.assertFalse(req.has_header("Cookie")) + def test_secure(self): for ns in True, False: for whitespace in " ", "": diff --git a/Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst b/Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst new file mode 100644 index 000000000000..d2eb8f1f352c --- /dev/null +++ b/Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst @@ -0,0 +1,4 @@ +Don't send cookies of domain A without Domain attribute to domain B +when domain A is a suffix match of domain B while using a cookiejar +with :class:`http.cookiejar.DefaultCookiePolicy` policy. Patch by +Karthikeyan Singaravelan. From webhook-mailer at python.org Sat Mar 9 21:59:31 2019 From: webhook-mailer at python.org (Ned Deily) Date: Sun, 10 Mar 2019 02:59:31 -0000 Subject: [Python-checkins] bpo-35121: prefix dot in domain for proper subdomain validation (GH-10258) (GH-12260) Message-ID: https://github.com/python/cpython/commit/b241af861b37e20ad30533bc0b7e2e5491cc470f commit: b241af861b37e20ad30533bc0b7e2e5491cc470f branch: 3.6 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Ned Deily date: 2019-03-09T21:59:28-05:00 summary: bpo-35121: prefix dot in domain for proper subdomain validation (GH-10258) (GH-12260) Don't send cookies of domain A without Domain attribute to domain B when domain A is a suffix match of domain B while using a cookiejar with `http.cookiejar.DefaultCookiePolicy` policy. Patch by Karthikeyan Singaravelan. (cherry picked from commit ca7fe5063593958e5efdf90f068582837f07bd14) Co-authored-by: Xtreak files: A Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst M Lib/http/cookiejar.py M Lib/test/test_http_cookiejar.py diff --git a/Lib/http/cookiejar.py b/Lib/http/cookiejar.py index adf956d66a07..97599d48d8e0 100644 --- a/Lib/http/cookiejar.py +++ b/Lib/http/cookiejar.py @@ -1148,6 +1148,11 @@ def return_ok_domain(self, cookie, request): req_host, erhn = eff_request_host(request) domain = cookie.domain + if domain and not domain.startswith("."): + dotdomain = "." + domain + else: + dotdomain = domain + # strict check of non-domain cookies: Mozilla does this, MSIE5 doesn't if (cookie.version == 0 and (self.strict_ns_domain & self.DomainStrictNonDomain) and @@ -1160,7 +1165,7 @@ def return_ok_domain(self, cookie, request): _debug(" effective request-host name %s does not domain-match " "RFC 2965 cookie domain %s", erhn, domain) return False - if cookie.version == 0 and not ("."+erhn).endswith(domain): + if cookie.version == 0 and not ("."+erhn).endswith(dotdomain): _debug(" request-host %s does not match Netscape cookie domain " "%s", req_host, domain) return False @@ -1174,7 +1179,11 @@ def domain_return_ok(self, domain, request): req_host = "."+req_host if not erhn.startswith("."): erhn = "."+erhn - if not (req_host.endswith(domain) or erhn.endswith(domain)): + if domain and not domain.startswith("."): + dotdomain = "." + domain + else: + dotdomain = domain + if not (req_host.endswith(dotdomain) or erhn.endswith(dotdomain)): #_debug(" request domain %s does not match cookie domain %s", # req_host, domain) return False diff --git a/Lib/test/test_http_cookiejar.py b/Lib/test/test_http_cookiejar.py index abc625d672a7..6e1b30881310 100644 --- a/Lib/test/test_http_cookiejar.py +++ b/Lib/test/test_http_cookiejar.py @@ -415,6 +415,7 @@ def test_domain_return_ok(self): ("http://foo.bar.com/", ".foo.bar.com", True), ("http://foo.bar.com/", "foo.bar.com", True), ("http://foo.bar.com/", ".bar.com", True), + ("http://foo.bar.com/", "bar.com", True), ("http://foo.bar.com/", "com", True), ("http://foo.com/", "rhubarb.foo.com", False), ("http://foo.com/", ".foo.com", True), @@ -425,6 +426,8 @@ def test_domain_return_ok(self): ("http://foo/", "foo", True), ("http://foo/", "foo.local", True), ("http://foo/", ".local", True), + ("http://barfoo.com", ".foo.com", False), + ("http://barfoo.com", "foo.com", False), ]: request = urllib.request.Request(url) r = pol.domain_return_ok(domain, request) @@ -959,6 +962,33 @@ def test_domain_block(self): c.add_cookie_header(req) self.assertFalse(req.has_header("Cookie")) + c.clear() + + pol.set_blocked_domains([]) + req = urllib.request.Request("http://acme.com/") + res = FakeResponse(headers, "http://acme.com/") + cookies = c.make_cookies(res, req) + c.extract_cookies(res, req) + self.assertEqual(len(c), 1) + + req = urllib.request.Request("http://acme.com/") + c.add_cookie_header(req) + self.assertTrue(req.has_header("Cookie")) + + req = urllib.request.Request("http://badacme.com/") + c.add_cookie_header(req) + self.assertFalse(pol.return_ok(cookies[0], req)) + self.assertFalse(req.has_header("Cookie")) + + p = pol.set_blocked_domains(["acme.com"]) + req = urllib.request.Request("http://acme.com/") + c.add_cookie_header(req) + self.assertFalse(req.has_header("Cookie")) + + req = urllib.request.Request("http://badacme.com/") + c.add_cookie_header(req) + self.assertFalse(req.has_header("Cookie")) + def test_secure(self): for ns in True, False: for whitespace in " ", "": diff --git a/Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst b/Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst new file mode 100644 index 000000000000..d2eb8f1f352c --- /dev/null +++ b/Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst @@ -0,0 +1,4 @@ +Don't send cookies of domain A without Domain attribute to domain B +when domain A is a suffix match of domain B while using a cookiejar +with :class:`http.cookiejar.DefaultCookiePolicy` policy. Patch by +Karthikeyan Singaravelan. From webhook-mailer at python.org Sun Mar 10 06:29:22 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Sun, 10 Mar 2019 10:29:22 -0000 Subject: [Python-checkins] bpo-36251: Fix format strings used in match_repr() and stdprinter_repr(). (GH-12252) Message-ID: https://github.com/python/cpython/commit/8b91edadc06dcb0d391a65d1ecdf07dcb429df1b commit: 8b91edadc06dcb0d391a65d1ecdf07dcb429df1b branch: master author: sth committer: Serhiy Storchaka date: 2019-03-10T12:29:14+02:00 summary: bpo-36251: Fix format strings used in match_repr() and stdprinter_repr(). (GH-12252) files: A Misc/NEWS.d/next/Library/2019-03-09-18-01-24.bpo-36251.zOp9l0.rst M Modules/_sre.c M Objects/fileobject.c diff --git a/Misc/NEWS.d/next/Library/2019-03-09-18-01-24.bpo-36251.zOp9l0.rst b/Misc/NEWS.d/next/Library/2019-03-09-18-01-24.bpo-36251.zOp9l0.rst new file mode 100644 index 000000000000..5138b0a0cb8b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-09-18-01-24.bpo-36251.zOp9l0.rst @@ -0,0 +1,2 @@ +Fix format strings used for stderrprinter and re.Match reprs. Patch by +Stephan Hohe. diff --git a/Modules/_sre.c b/Modules/_sre.c index 5cea7562f280..014cc546e345 100644 --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -2306,7 +2306,7 @@ match_repr(MatchObject *self) if (group0 == NULL) return NULL; result = PyUnicode_FromFormat( - "<%s object; span=(%d, %d), match=%.50R>", + "<%s object; span=(%zd, %zd), match=%.50R>", Py_TYPE(self)->tp_name, self->mark[0], self->mark[1], group0); Py_DECREF(group0); diff --git a/Objects/fileobject.c b/Objects/fileobject.c index babaa05bdbc4..39c7c109979a 100644 --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -411,7 +411,7 @@ stdprinter_fileno(PyStdPrinter_Object *self, PyObject *Py_UNUSED(ignored)) static PyObject * stdprinter_repr(PyStdPrinter_Object *self) { - return PyUnicode_FromFormat("", + return PyUnicode_FromFormat("", self->fd, self); } From webhook-mailer at python.org Sun Mar 10 06:52:59 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 10 Mar 2019 10:52:59 -0000 Subject: [Python-checkins] bpo-36251: Fix format strings used in match_repr() and stdprinter_repr(). (GH-12252) Message-ID: https://github.com/python/cpython/commit/e4be2057d4bd06eb56fbfef4e4ed88fff7fb47cd commit: e4be2057d4bd06eb56fbfef4e4ed88fff7fb47cd branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-10T03:52:44-07:00 summary: bpo-36251: Fix format strings used in match_repr() and stdprinter_repr(). (GH-12252) (cherry picked from commit 8b91edadc06dcb0d391a65d1ecdf07dcb429df1b) Co-authored-by: sth files: A Misc/NEWS.d/next/Library/2019-03-09-18-01-24.bpo-36251.zOp9l0.rst M Modules/_sre.c M Objects/fileobject.c diff --git a/Misc/NEWS.d/next/Library/2019-03-09-18-01-24.bpo-36251.zOp9l0.rst b/Misc/NEWS.d/next/Library/2019-03-09-18-01-24.bpo-36251.zOp9l0.rst new file mode 100644 index 000000000000..5138b0a0cb8b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-09-18-01-24.bpo-36251.zOp9l0.rst @@ -0,0 +1,2 @@ +Fix format strings used for stderrprinter and re.Match reprs. Patch by +Stephan Hohe. diff --git a/Modules/_sre.c b/Modules/_sre.c index a97ce7790e39..4d2bdcc20967 100644 --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -2319,7 +2319,7 @@ match_repr(MatchObject *self) if (group0 == NULL) return NULL; result = PyUnicode_FromFormat( - "<%s object; span=(%d, %d), match=%.50R>", + "<%s object; span=(%zd, %zd), match=%.50R>", Py_TYPE(self)->tp_name, self->mark[0], self->mark[1], group0); Py_DECREF(group0); diff --git a/Objects/fileobject.c b/Objects/fileobject.c index ed4e12ba8a8d..d886e96e0f9b 100644 --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -407,7 +407,7 @@ stdprinter_fileno(PyStdPrinter_Object *self) static PyObject * stdprinter_repr(PyStdPrinter_Object *self) { - return PyUnicode_FromFormat("", + return PyUnicode_FromFormat("", self->fd, self); } From webhook-mailer at python.org Sun Mar 10 07:02:20 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 10 Mar 2019 11:02:20 -0000 Subject: [Python-checkins] Fix padding on asyncio.IncompleteReadError docs (GH-12258) Message-ID: https://github.com/python/cpython/commit/11205b80309a01666eefee2301a244aa73a4c450 commit: 11205b80309a01666eefee2301a244aa73a4c450 branch: master author: Andre Delfino committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-10T04:02:17-07:00 summary: Fix padding on asyncio.IncompleteReadError docs (GH-12258) files: M Doc/library/asyncio-exceptions.rst diff --git a/Doc/library/asyncio-exceptions.rst b/Doc/library/asyncio-exceptions.rst index dbd5df720850..e49577a203e8 100644 --- a/Doc/library/asyncio-exceptions.rst +++ b/Doc/library/asyncio-exceptions.rst @@ -65,11 +65,11 @@ Exceptions .. exception:: IncompleteReadError - The requested read operation did not complete fully. + The requested read operation did not complete fully. - Raised by the :ref:`asyncio stream APIs`. + Raised by the :ref:`asyncio stream APIs`. - This exception is a subclass of :exc:`EOFError`. + This exception is a subclass of :exc:`EOFError`. .. attribute:: expected From webhook-mailer at python.org Sun Mar 10 07:12:18 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 10 Mar 2019 11:12:18 -0000 Subject: [Python-checkins] Fix padding on asyncio.IncompleteReadError docs (GH-12258) Message-ID: https://github.com/python/cpython/commit/ae2378af3e09cb17d8e0187c13a04f0874a48905 commit: ae2378af3e09cb17d8e0187c13a04f0874a48905 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-10T04:12:12-07:00 summary: Fix padding on asyncio.IncompleteReadError docs (GH-12258) (cherry picked from commit 11205b80309a01666eefee2301a244aa73a4c450) Co-authored-by: Andre Delfino files: M Doc/library/asyncio-exceptions.rst diff --git a/Doc/library/asyncio-exceptions.rst b/Doc/library/asyncio-exceptions.rst index dbd5df720850..e49577a203e8 100644 --- a/Doc/library/asyncio-exceptions.rst +++ b/Doc/library/asyncio-exceptions.rst @@ -65,11 +65,11 @@ Exceptions .. exception:: IncompleteReadError - The requested read operation did not complete fully. + The requested read operation did not complete fully. - Raised by the :ref:`asyncio stream APIs`. + Raised by the :ref:`asyncio stream APIs`. - This exception is a subclass of :exc:`EOFError`. + This exception is a subclass of :exc:`EOFError`. .. attribute:: expected From webhook-mailer at python.org Sun Mar 10 07:30:18 2019 From: webhook-mailer at python.org (Nick Coghlan) Date: Sun, 10 Mar 2019 11:30:18 -0000 Subject: [Python-checkins] bpo-21314: Add a FAQ entry about positional only parameters (GH-10641) Message-ID: https://github.com/python/cpython/commit/1aeeaeb79efa4de41f97b58547e23c2965ecabc5 commit: 1aeeaeb79efa4de41f97b58547e23c2965ecabc5 branch: master author: Lysandros Nikolaou committer: Nick Coghlan date: 2019-03-10T21:30:11+10:00 summary: bpo-21314: Add a FAQ entry about positional only parameters (GH-10641) files: A Misc/NEWS.d/next/Documentation/2018-11-21-23-01-37.bpo-21314.PG33VT.rst M Doc/faq/programming.rst M Doc/library/functions.rst M Doc/library/inspect.rst diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst index 7bc00ff7e69d..31614189a62d 100644 --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -767,6 +767,41 @@ Yes. Usually this is done by nesting :keyword:`lambda` within Don't try this at home, kids! +.. _faq-positional-only-arguments: + +What does the slash(/) in the parameter list of a function mean? +---------------------------------------------------------------- + +A slash in the argument list of a function denotes that the parameters prior to +it are positional-only. Positional-only parameters are the ones without an +externally-usable name. Upon calling a function that accepts positional-only +parameters, arguments are mapped to parameters based solely on their position. +For example, :func:`pow` is a function that accepts positional-only parameters. +Its documentation looks like this:: + + >>> help(pow) + Help on built-in function pow in module builtins: + + pow(x, y, z=None, /) + Equivalent to x**y (with two arguments) or x**y % z (with three arguments) + + Some types, such as ints, are able to use a more efficient algorithm when + invoked using the three argument form. + +The slash at the end of the parameter list means that all three parameters are +positional-only. Thus, calling :func:`pow` with keyword aguments would lead to +an error:: + + >>> pow(x=3, y=4) + Traceback (most recent call last): + File "", line 1, in + TypeError: pow() takes no keyword arguments + +Note that as of this writing this is only documentational and no valid syntax +in Python, although there is :pep:`570`, which proposes a syntax for +position-only parameters in Python. + + Numbers and strings =================== diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index ebbee71f48ed..ae0c9fb55a75 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -669,6 +669,11 @@ are always available. They are listed here in alphabetical order. topic, and a help page is printed on the console. If the argument is any other kind of object, a help page on the object is generated. + Note that if a slash(/) appears in the parameter list of a function, when + invoking :func:`help`, it means that the parameters prior to the slash are + positional-only. For more info, see + :ref:`the FAQ entry on positional-only parameters `. + This function is added to the built-in namespace by the :mod:`site` module. .. versionchanged:: 3.4 diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst index dfd78a97145c..81824ddc1e54 100644 --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -572,6 +572,10 @@ function. Raises :exc:`ValueError` if no signature can be provided, and :exc:`TypeError` if that type of object is not supported. + A slash(/) in the signature of a function denotes that the parameters prior + to it are positional-only. For more info, see + :ref:`the FAQ entry on positional-only parameters `. + .. versionadded:: 3.5 ``follow_wrapped`` parameter. Pass ``False`` to get a signature of ``callable`` specifically (``callable.__wrapped__`` will not be used to diff --git a/Misc/NEWS.d/next/Documentation/2018-11-21-23-01-37.bpo-21314.PG33VT.rst b/Misc/NEWS.d/next/Documentation/2018-11-21-23-01-37.bpo-21314.PG33VT.rst new file mode 100644 index 000000000000..83080a3a580b --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2018-11-21-23-01-37.bpo-21314.PG33VT.rst @@ -0,0 +1,3 @@ +A new entry was added to the Core Language Section of the Programming FAQ, +which explaines the usage of slash(/) in the signature of a function. Patch +by Lysandros Nikolaou From webhook-mailer at python.org Sun Mar 10 07:36:21 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 10 Mar 2019 11:36:21 -0000 Subject: [Python-checkins] bpo-21314: Add a FAQ entry about positional only parameters (GH-10641) Message-ID: https://github.com/python/cpython/commit/87f5255cdc9aa737d445b5813e52c41e5266a862 commit: 87f5255cdc9aa737d445b5813e52c41e5266a862 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-10T04:36:18-07:00 summary: bpo-21314: Add a FAQ entry about positional only parameters (GH-10641) (cherry picked from commit 1aeeaeb79efa4de41f97b58547e23c2965ecabc5) Co-authored-by: Lysandros Nikolaou files: A Misc/NEWS.d/next/Documentation/2018-11-21-23-01-37.bpo-21314.PG33VT.rst M Doc/faq/programming.rst M Doc/library/functions.rst M Doc/library/inspect.rst diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst index 7bc00ff7e69d..31614189a62d 100644 --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -767,6 +767,41 @@ Yes. Usually this is done by nesting :keyword:`lambda` within Don't try this at home, kids! +.. _faq-positional-only-arguments: + +What does the slash(/) in the parameter list of a function mean? +---------------------------------------------------------------- + +A slash in the argument list of a function denotes that the parameters prior to +it are positional-only. Positional-only parameters are the ones without an +externally-usable name. Upon calling a function that accepts positional-only +parameters, arguments are mapped to parameters based solely on their position. +For example, :func:`pow` is a function that accepts positional-only parameters. +Its documentation looks like this:: + + >>> help(pow) + Help on built-in function pow in module builtins: + + pow(x, y, z=None, /) + Equivalent to x**y (with two arguments) or x**y % z (with three arguments) + + Some types, such as ints, are able to use a more efficient algorithm when + invoked using the three argument form. + +The slash at the end of the parameter list means that all three parameters are +positional-only. Thus, calling :func:`pow` with keyword aguments would lead to +an error:: + + >>> pow(x=3, y=4) + Traceback (most recent call last): + File "", line 1, in + TypeError: pow() takes no keyword arguments + +Note that as of this writing this is only documentational and no valid syntax +in Python, although there is :pep:`570`, which proposes a syntax for +position-only parameters in Python. + + Numbers and strings =================== diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index b28f28f2142a..9326b8d0fe7d 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -668,6 +668,11 @@ are always available. They are listed here in alphabetical order. topic, and a help page is printed on the console. If the argument is any other kind of object, a help page on the object is generated. + Note that if a slash(/) appears in the parameter list of a function, when + invoking :func:`help`, it means that the parameters prior to the slash are + positional-only. For more info, see + :ref:`the FAQ entry on positional-only parameters `. + This function is added to the built-in namespace by the :mod:`site` module. .. versionchanged:: 3.4 diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst index f985eeb4f53b..18cbacf3e8db 100644 --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -559,6 +559,10 @@ function. Raises :exc:`ValueError` if no signature can be provided, and :exc:`TypeError` if that type of object is not supported. + A slash(/) in the signature of a function denotes that the parameters prior + to it are positional-only. For more info, see + :ref:`the FAQ entry on positional-only parameters `. + .. versionadded:: 3.5 ``follow_wrapped`` parameter. Pass ``False`` to get a signature of ``callable`` specifically (``callable.__wrapped__`` will not be used to diff --git a/Misc/NEWS.d/next/Documentation/2018-11-21-23-01-37.bpo-21314.PG33VT.rst b/Misc/NEWS.d/next/Documentation/2018-11-21-23-01-37.bpo-21314.PG33VT.rst new file mode 100644 index 000000000000..83080a3a580b --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2018-11-21-23-01-37.bpo-21314.PG33VT.rst @@ -0,0 +1,3 @@ +A new entry was added to the Core Language Section of the Programming FAQ, +which explaines the usage of slash(/) in the signature of a function. Patch +by Lysandros Nikolaou From webhook-mailer at python.org Sun Mar 10 13:12:41 2019 From: webhook-mailer at python.org (Senthil Kumaran) Date: Sun, 10 Mar 2019 17:12:41 -0000 Subject: [Python-checkins] bpo-35647: Fix path check in cookiejar (#11436) Message-ID: https://github.com/python/cpython/commit/0e1f1f01058bd4a9b98cfe443214adecc019a38c commit: 0e1f1f01058bd4a9b98cfe443214adecc019a38c branch: master author: Xtreak committer: Senthil Kumaran date: 2019-03-10T10:12:28-07:00 summary: bpo-35647: Fix path check in cookiejar (#11436) * Refactor cookie path check as per RFC 6265 * Add tests for prefix match of path * Add news entry * Fix set_ok_path and refactor tests * Use slice for last letter files: A Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst M Lib/http/cookiejar.py M Lib/test/test_http_cookiejar.py diff --git a/Lib/http/cookiejar.py b/Lib/http/cookiejar.py index 3a96383325ca..db8238235718 100644 --- a/Lib/http/cookiejar.py +++ b/Lib/http/cookiejar.py @@ -993,7 +993,7 @@ def set_ok_path(self, cookie, request): req_path = request_path(request) if ((cookie.version > 0 or (cookie.version == 0 and self.strict_ns_set_path)) and - not req_path.startswith(cookie.path)): + not self.path_return_ok(cookie.path, request)): _debug(" path attribute %s is not a prefix of request " "path %s", cookie.path, req_path) return False @@ -1200,11 +1200,15 @@ def domain_return_ok(self, domain, request): def path_return_ok(self, path, request): _debug("- checking cookie path=%s", path) req_path = request_path(request) - if not req_path.startswith(path): - _debug(" %s does not path-match %s", req_path, path) - return False - return True + pathlen = len(path) + if req_path == path: + return True + elif (req_path.startswith(path) and + (path.endswith("/") or req_path[pathlen:pathlen+1] == "/")): + return True + _debug(" %s does not path-match %s", req_path, path) + return False def vals_sorted_by_key(adict): keys = sorted(adict.keys()) diff --git a/Lib/test/test_http_cookiejar.py b/Lib/test/test_http_cookiejar.py index acf315a4f2e0..22bf41cf1d91 100644 --- a/Lib/test/test_http_cookiejar.py +++ b/Lib/test/test_http_cookiejar.py @@ -720,6 +720,30 @@ def test_request_path(self): req = urllib.request.Request("http://www.example.com") self.assertEqual(request_path(req), "/") + def test_path_prefix_match(self): + pol = DefaultCookiePolicy() + strict_ns_path_pol = DefaultCookiePolicy(strict_ns_set_path=True) + + c = CookieJar(pol) + base_url = "http://bar.com" + interact_netscape(c, base_url, 'spam=eggs; Path=/foo') + cookie = c._cookies['bar.com']['/foo']['spam'] + + for path, ok in [('/foo', True), + ('/foo/', True), + ('/foo/bar', True), + ('/', False), + ('/foobad/foo', False)]: + url = f'{base_url}{path}' + req = urllib.request.Request(url) + h = interact_netscape(c, url) + if ok: + self.assertIn('spam=eggs', h, f"cookie not set for {path}") + self.assertTrue(strict_ns_path_pol.set_ok_path(cookie, req)) + else: + self.assertNotIn('spam=eggs', h, f"cookie set for {path}") + self.assertFalse(strict_ns_path_pol.set_ok_path(cookie, req)) + def test_request_port(self): req = urllib.request.Request("http://www.acme.com:1234/", headers={"Host": "www.acme.com:4321"}) diff --git a/Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst b/Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst new file mode 100644 index 000000000000..032e1e2c00bc --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst @@ -0,0 +1,3 @@ +Don't set cookie for a request when the request path is a prefix match of +the cookie's path attribute but doesn't end with "/". Patch by Karthikeyan +Singaravelan. From webhook-mailer at python.org Sun Mar 10 13:30:40 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 10 Mar 2019 17:30:40 -0000 Subject: [Python-checkins] bpo-35647: Fix path check in cookiejar (GH-11436) Message-ID: https://github.com/python/cpython/commit/97c7d78fda49e03fc773c171ce0c736d02bb73f5 commit: 97c7d78fda49e03fc773c171ce0c736d02bb73f5 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-10T10:30:35-07:00 summary: bpo-35647: Fix path check in cookiejar (GH-11436) * Refactor cookie path check as per RFC 6265 * Add tests for prefix match of path * Add news entry * Fix set_ok_path and refactor tests * Use slice for last letter (cherry picked from commit 0e1f1f01058bd4a9b98cfe443214adecc019a38c) Co-authored-by: Xtreak files: A Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst M Lib/http/cookiejar.py M Lib/test/test_http_cookiejar.py diff --git a/Lib/http/cookiejar.py b/Lib/http/cookiejar.py index 00cb1250a07e..d63544a5f52e 100644 --- a/Lib/http/cookiejar.py +++ b/Lib/http/cookiejar.py @@ -990,7 +990,7 @@ def set_ok_path(self, cookie, request): req_path = request_path(request) if ((cookie.version > 0 or (cookie.version == 0 and self.strict_ns_set_path)) and - not req_path.startswith(cookie.path)): + not self.path_return_ok(cookie.path, request)): _debug(" path attribute %s is not a prefix of request " "path %s", cookie.path, req_path) return False @@ -1197,11 +1197,15 @@ def domain_return_ok(self, domain, request): def path_return_ok(self, path, request): _debug("- checking cookie path=%s", path) req_path = request_path(request) - if not req_path.startswith(path): - _debug(" %s does not path-match %s", req_path, path) - return False - return True + pathlen = len(path) + if req_path == path: + return True + elif (req_path.startswith(path) and + (path.endswith("/") or req_path[pathlen:pathlen+1] == "/")): + return True + _debug(" %s does not path-match %s", req_path, path) + return False def vals_sorted_by_key(adict): keys = sorted(adict.keys()) diff --git a/Lib/test/test_http_cookiejar.py b/Lib/test/test_http_cookiejar.py index 6e1b30881310..16edf34a9925 100644 --- a/Lib/test/test_http_cookiejar.py +++ b/Lib/test/test_http_cookiejar.py @@ -695,6 +695,30 @@ def test_request_path(self): req = urllib.request.Request("http://www.example.com") self.assertEqual(request_path(req), "/") + def test_path_prefix_match(self): + pol = DefaultCookiePolicy() + strict_ns_path_pol = DefaultCookiePolicy(strict_ns_set_path=True) + + c = CookieJar(pol) + base_url = "http://bar.com" + interact_netscape(c, base_url, 'spam=eggs; Path=/foo') + cookie = c._cookies['bar.com']['/foo']['spam'] + + for path, ok in [('/foo', True), + ('/foo/', True), + ('/foo/bar', True), + ('/', False), + ('/foobad/foo', False)]: + url = f'{base_url}{path}' + req = urllib.request.Request(url) + h = interact_netscape(c, url) + if ok: + self.assertIn('spam=eggs', h, f"cookie not set for {path}") + self.assertTrue(strict_ns_path_pol.set_ok_path(cookie, req)) + else: + self.assertNotIn('spam=eggs', h, f"cookie set for {path}") + self.assertFalse(strict_ns_path_pol.set_ok_path(cookie, req)) + def test_request_port(self): req = urllib.request.Request("http://www.acme.com:1234/", headers={"Host": "www.acme.com:4321"}) diff --git a/Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst b/Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst new file mode 100644 index 000000000000..032e1e2c00bc --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst @@ -0,0 +1,3 @@ +Don't set cookie for a request when the request path is a prefix match of +the cookie's path attribute but doesn't end with "/". Patch by Karthikeyan +Singaravelan. From webhook-mailer at python.org Sun Mar 10 20:18:43 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Mon, 11 Mar 2019 00:18:43 -0000 Subject: [Python-checkins] bpo-36176: Fix IDLE autocomplete & calltip popup colors. (#12262) Message-ID: https://github.com/python/cpython/commit/491ef53c1548c2b593d3c35d1e7bf25ccb443019 commit: 491ef53c1548c2b593d3c35d1e7bf25ccb443019 branch: master author: Terry Jan Reedy committer: GitHub date: 2019-03-10T20:18:40-04:00 summary: bpo-36176: Fix IDLE autocomplete & calltip popup colors. (#12262) Prevent conflicts with Linux dark themes (and slightly darken calltip background). files: A Misc/NEWS.d/next/IDLE/2019-03-10-00-07-46.bpo-36176.jk_vv6.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/autocomplete_w.py M Lib/idlelib/calltip_w.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 58050f6ce965..c771dd0d41eb 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,7 +3,11 @@ Released on 2019-10-20? ====================================== -bpl-36152: Remove colorizer.ColorDelegator.close_when_done and the +bpo-36176: Fix IDLE autocomplete & calltip popup colors. +Prevent conflicts with Linux dark themes +(and slightly darken calltip background). + +bpo-36152: Remove colorizer.ColorDelegator.close_when_done and the corresponding argument of .close(). In IDLE, both have always been None or False since 2007. diff --git a/Lib/idlelib/autocomplete_w.py b/Lib/idlelib/autocomplete_w.py index 7994bc0db170..c24962527736 100644 --- a/Lib/idlelib/autocomplete_w.py +++ b/Lib/idlelib/autocomplete_w.py @@ -189,7 +189,7 @@ def show_window(self, comp_lists, index, complete, mode, userWantsWin): pass self.scrollbar = scrollbar = Scrollbar(acw, orient=VERTICAL) self.listbox = listbox = Listbox(acw, yscrollcommand=scrollbar.set, - exportselection=False, bg="white") + exportselection=False) for item in self.completions: listbox.insert(END, item) self.origselforeground = listbox.cget("selectforeground") diff --git a/Lib/idlelib/calltip_w.py b/Lib/idlelib/calltip_w.py index 7553dfefc55c..1e0404aa49f5 100644 --- a/Lib/idlelib/calltip_w.py +++ b/Lib/idlelib/calltip_w.py @@ -80,7 +80,8 @@ def showtip(self, text, parenleft, parenright): def showcontents(self): """Create the call-tip widget.""" self.label = Label(self.tipwindow, text=self.text, justify=LEFT, - background="#ffffe0", relief=SOLID, borderwidth=1, + background="#ffffd0", foreground="black", + relief=SOLID, borderwidth=1, font=self.anchor_widget['font']) self.label.pack() diff --git a/Misc/NEWS.d/next/IDLE/2019-03-10-00-07-46.bpo-36176.jk_vv6.rst b/Misc/NEWS.d/next/IDLE/2019-03-10-00-07-46.bpo-36176.jk_vv6.rst new file mode 100644 index 000000000000..5998c6fadfc7 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-03-10-00-07-46.bpo-36176.jk_vv6.rst @@ -0,0 +1,2 @@ +Fix IDLE autocomplete & calltip popup colors. Prevent conflicts with Linux +dark themes (and slightly darken calltip background). From webhook-mailer at python.org Sun Mar 10 20:37:40 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 11 Mar 2019 00:37:40 -0000 Subject: [Python-checkins] bpo-36176: Fix IDLE autocomplete & calltip popup colors. (GH-12262) Message-ID: https://github.com/python/cpython/commit/ea1627008e2ccca3eefa8f4f8123ad74d34c7500 commit: ea1627008e2ccca3eefa8f4f8123ad74d34c7500 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-10T17:37:36-07:00 summary: bpo-36176: Fix IDLE autocomplete & calltip popup colors. (GH-12262) Prevent conflicts with Linux dark themes (and slightly darken calltip background). (cherry picked from commit 491ef53c1548c2b593d3c35d1e7bf25ccb443019) Co-authored-by: Terry Jan Reedy files: A Misc/NEWS.d/next/IDLE/2019-03-10-00-07-46.bpo-36176.jk_vv6.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/autocomplete_w.py M Lib/idlelib/calltip_w.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index d2c150b8e2a9..c343538a29c2 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,7 +3,11 @@ Released on 2019-??-?? ====================================== -bpl-36152: Remove colorizer.ColorDelegator.close_when_done and the +bpo-36176: Fix IDLE autocomplete & calltip popup colors. +Prevent conflicts with Linux dark themes +(and slightly darken calltip background). + +bpo-36152: Remove colorizer.ColorDelegator.close_when_done and the corresponding argument of .close(). In IDLE, both have always been None or False since 2007. diff --git a/Lib/idlelib/autocomplete_w.py b/Lib/idlelib/autocomplete_w.py index 7994bc0db170..c24962527736 100644 --- a/Lib/idlelib/autocomplete_w.py +++ b/Lib/idlelib/autocomplete_w.py @@ -189,7 +189,7 @@ def show_window(self, comp_lists, index, complete, mode, userWantsWin): pass self.scrollbar = scrollbar = Scrollbar(acw, orient=VERTICAL) self.listbox = listbox = Listbox(acw, yscrollcommand=scrollbar.set, - exportselection=False, bg="white") + exportselection=False) for item in self.completions: listbox.insert(END, item) self.origselforeground = listbox.cget("selectforeground") diff --git a/Lib/idlelib/calltip_w.py b/Lib/idlelib/calltip_w.py index 7553dfefc55c..1e0404aa49f5 100644 --- a/Lib/idlelib/calltip_w.py +++ b/Lib/idlelib/calltip_w.py @@ -80,7 +80,8 @@ def showtip(self, text, parenleft, parenright): def showcontents(self): """Create the call-tip widget.""" self.label = Label(self.tipwindow, text=self.text, justify=LEFT, - background="#ffffe0", relief=SOLID, borderwidth=1, + background="#ffffd0", foreground="black", + relief=SOLID, borderwidth=1, font=self.anchor_widget['font']) self.label.pack() diff --git a/Misc/NEWS.d/next/IDLE/2019-03-10-00-07-46.bpo-36176.jk_vv6.rst b/Misc/NEWS.d/next/IDLE/2019-03-10-00-07-46.bpo-36176.jk_vv6.rst new file mode 100644 index 000000000000..5998c6fadfc7 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-03-10-00-07-46.bpo-36176.jk_vv6.rst @@ -0,0 +1,2 @@ +Fix IDLE autocomplete & calltip popup colors. Prevent conflicts with Linux +dark themes (and slightly darken calltip background). From webhook-mailer at python.org Mon Mar 11 00:59:27 2019 From: webhook-mailer at python.org (larryhastings) Date: Mon, 11 Mar 2019 04:59:27 -0000 Subject: [Python-checkins] bpo-36216: Add check for characters in netloc that normalize to separators (GH-12201) (#12223) Message-ID: https://github.com/python/cpython/commit/c0d95113b070799679bcb9dc49d4960d82e8bb08 commit: c0d95113b070799679bcb9dc49d4960d82e8bb08 branch: 3.5 author: Steve Dower committer: larryhastings date: 2019-03-10T21:59:24-07:00 summary: bpo-36216: Add check for characters in netloc that normalize to separators (GH-12201) (#12223) files: A Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst M Doc/library/urllib.parse.rst M Lib/test/test_urlparse.py M Lib/urllib/parse.py diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst index 6f722a88975c..a4c6b6726e5a 100644 --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -120,6 +120,11 @@ or on combining URL components into a URL string. Unmatched square brackets in the :attr:`netloc` attribute will raise a :exc:`ValueError`. + Characters in the :attr:`netloc` attribute that decompose under NFKC + normalization (as used by the IDNA encoding) into any of ``/``, ``?``, + ``#``, ``@``, or ``:`` will raise a :exc:`ValueError`. If the URL is + decomposed before parsing, no error will be raised. + .. versionchanged:: 3.2 Added IPv6 URL parsing capabilities. @@ -128,6 +133,10 @@ or on combining URL components into a URL string. false), in accordance with :rfc:`3986`. Previously, a whitelist of schemes that support fragments existed. + .. versionchanged:: 3.5.7 + Characters that affect netloc parsing under NFKC normalization will + now raise :exc:`ValueError`. + .. function:: parse_qs(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace') @@ -236,6 +245,15 @@ or on combining URL components into a URL string. Unmatched square brackets in the :attr:`netloc` attribute will raise a :exc:`ValueError`. + Characters in the :attr:`netloc` attribute that decompose under NFKC + normalization (as used by the IDNA encoding) into any of ``/``, ``?``, + ``#``, ``@``, or ``:`` will raise a :exc:`ValueError`. If the URL is + decomposed before parsing, no error will be raised. + + .. versionchanged:: 3.5.7 + Characters that affect netloc parsing under NFKC normalization will + now raise :exc:`ValueError`. + .. function:: urlunsplit(parts) diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index e2cf1b7e0ff5..d0420b0e742d 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -1,3 +1,5 @@ +import sys +import unicodedata import unittest import urllib.parse @@ -970,6 +972,27 @@ def test_all(self): expected.append(name) self.assertCountEqual(urllib.parse.__all__, expected) + def test_urlsplit_normalization(self): + # Certain characters should never occur in the netloc, + # including under normalization. + # Ensure that ALL of them are detected and cause an error + illegal_chars = '/:#?@' + hex_chars = {'{:04X}'.format(ord(c)) for c in illegal_chars} + denorm_chars = [ + c for c in map(chr, range(128, sys.maxunicode)) + if (hex_chars & set(unicodedata.decomposition(c).split())) + and c not in illegal_chars + ] + # Sanity check that we found at least one such character + self.assertIn('\u2100', denorm_chars) + self.assertIn('\uFF03', denorm_chars) + + for scheme in ["http", "https", "ftp"]: + for c in denorm_chars: + url = "{}://netloc{}false.netloc/path".format(scheme, c) + with self.subTest(url=url, char='{:04X}'.format(ord(c))): + with self.assertRaises(ValueError): + urllib.parse.urlsplit(url) class Utility_Tests(unittest.TestCase): """Testcase to test the various utility functions in the urllib.""" diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index 62e8ddf04b05..7ba2b445f5cd 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -327,6 +327,21 @@ def _splitnetloc(url, start=0): delim = min(delim, wdelim) # use earliest delim position return url[start:delim], url[delim:] # return (domain, rest) +def _checknetloc(netloc): + if not netloc or not any(ord(c) > 127 for c in netloc): + return + # looking for characters like \u2100 that expand to 'a/c' + # IDNA uses NFKC equivalence, so normalize for this check + import unicodedata + netloc2 = unicodedata.normalize('NFKC', netloc) + if netloc == netloc2: + return + _, _, netloc = netloc.rpartition('@') # anything to the left of '@' is okay + for c in '/?#@:': + if c in netloc2: + raise ValueError("netloc '" + netloc2 + "' contains invalid " + + "characters under NFKC normalization") + def urlsplit(url, scheme='', allow_fragments=True): """Parse a URL into 5 components: :///?# @@ -356,6 +371,7 @@ def urlsplit(url, scheme='', allow_fragments=True): url, fragment = url.split('#', 1) if '?' in url: url, query = url.split('?', 1) + _checknetloc(netloc) v = SplitResult(scheme, netloc, url, query, fragment) _parse_cache[key] = v return _coerce_result(v) @@ -379,6 +395,7 @@ def urlsplit(url, scheme='', allow_fragments=True): url, fragment = url.split('#', 1) if '?' in url: url, query = url.split('?', 1) + _checknetloc(netloc) v = SplitResult(scheme, netloc, url, query, fragment) _parse_cache[key] = v return _coerce_result(v) diff --git a/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst b/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst new file mode 100644 index 000000000000..5546394157f9 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst @@ -0,0 +1,3 @@ +Changes urlsplit() to raise ValueError when the URL contains characters that +decompose under IDNA encoding (NFKC-normalization) into characters that +affect how the URL is parsed. From webhook-mailer at python.org Mon Mar 11 02:43:40 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 11 Mar 2019 06:43:40 -0000 Subject: [Python-checkins] Various refinements to the NormalDist examples and recipes (GH-12272) Message-ID: https://github.com/python/cpython/commit/cc353a0cd95d9b0c93ed0b60ba762427a94c790d commit: cc353a0cd95d9b0c93ed0b60ba762427a94c790d branch: master author: Raymond Hettinger committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-10T23:43:33-07:00 summary: Various refinements to the NormalDist examples and recipes (GH-12272) files: M Doc/library/statistics.rst diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst index 3e1443424340..81119da0a382 100644 --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -510,10 +510,9 @@ of applications in statistics. .. classmethod:: NormalDist.from_samples(data) - Class method that makes a normal distribution instance - from sample data. The *data* can be any :term:`iterable` - and should consist of values that can be converted to type - :class:`float`. + Makes a normal distribution instance computed from sample data. The + *data* can be any :term:`iterable` and should consist of values that + can be converted to type :class:`float`. If *data* does not contain at least two elements, raises :exc:`StatisticsError` because it takes at least one point to estimate @@ -536,11 +535,10 @@ of applications in statistics. the given value *x*. Mathematically, it is the ratio ``P(x <= X < x+dx) / dx``. - Note the relative likelihood of *x* can be greater than `1.0`. The - probability for a specific point on a continuous distribution is `0.0`, - so the :func:`pdf` is used instead. It gives the probability of a - sample occurring in a narrow range around *x* and then dividing that - probability by the width of the range (hence the word "density"). + The relative likelihood is computed as the probability of a sample + occurring in a narrow range divided by the width of the range (hence + the word "density"). Since the likelihood is relative to other points, + its value can be greater than `1.0`. .. method:: NormalDist.cdf(x) @@ -568,7 +566,8 @@ of applications in statistics. >>> temperature_february * (9/5) + 32 # Fahrenheit NormalDist(mu=41.0, sigma=4.5) - Dividing a constant by an instance of :class:`NormalDist` is not supported. + Dividing a constant by an instance of :class:`NormalDist` is not supported + because the result wouldn't be normally distributed. Since normal distributions arise from additive effects of independent variables, it is possible to `add and subtract two independent normally @@ -581,8 +580,10 @@ of applications in statistics. >>> birth_weights = NormalDist.from_samples([2.5, 3.1, 2.1, 2.4, 2.7, 3.5]) >>> drug_effects = NormalDist(0.4, 0.15) >>> combined = birth_weights + drug_effects - >>> f'mean: {combined.mean :.1f} standard deviation: {combined.stdev :.1f}' - 'mean: 3.1 standard deviation: 0.5' + >>> round(combined.mean, 1) + 3.1 + >>> round(combined.stdev, 1) + 0.5 .. versionadded:: 3.8 @@ -595,14 +596,15 @@ of applications in statistics. 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 scores between 1100 and 1200: +determine the percentage of students with scores between 1100 and 1200, after +rounding to the nearest whole number: .. doctest:: >>> sat = NormalDist(1060, 195) >>> fraction = sat.cdf(1200 + 0.5) - sat.cdf(1100 - 0.5) - >>> f'{fraction * 100 :.1f}% score between 1100 and 1200' - '18.4% score between 1100 and 1200' + >>> round(fraction * 100.0, 1) + 18.4 What percentage of men and women will have the same height in `two normally distributed populations with known means and standard deviations @@ -616,18 +618,19 @@ distributed populations with known means and standard deviations To estimate the distribution for a model than isn't easy to solve analytically, :class:`NormalDist` can generate input samples for a `Monte -Carlo simulation `_ of the -model: +Carlo simulation `_: .. doctest:: + >>> def model(x, y, z): + ... return (3*x + 7*x*y - 5*y) / (11 * z) + ... >>> n = 100_000 - >>> X = NormalDist(350, 15).samples(n) - >>> Y = NormalDist(47, 17).samples(n) - >>> Z = NormalDist(62, 6).samples(n) - >>> model_simulation = [x * y / z for x, y, z in zip(X, Y, Z)] - >>> NormalDist.from_samples(model_simulation) # doctest: +SKIP - NormalDist(mu=267.6516398754636, sigma=101.357284306067) + >>> X = NormalDist(10, 2.5).samples(n) + >>> Y = NormalDist(15, 1.75).samples(n) + >>> Z = NormalDist(5, 1.25).samples(n) + >>> NormalDist.from_samples(map(model, X, Y, Z)) # doctest: +SKIP + NormalDist(mu=19.640137307085507, sigma=47.03273142191088) Normal distributions commonly arise in machine learning problems. From webhook-mailer at python.org Mon Mar 11 08:57:58 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 11 Mar 2019 12:57:58 -0000 Subject: [Python-checkins] bpo-36234: Add more tests to PosixUidGidTests (GH-12234) Message-ID: https://github.com/python/cpython/commit/876e82b4f32075e1bd21750bf852a103035fce23 commit: 876e82b4f32075e1bd21750bf852a103035fce23 branch: master author: Victor Stinner committer: GitHub date: 2019-03-11T13:57:53+01:00 summary: bpo-36234: Add more tests to PosixUidGidTests (GH-12234) test_posix.PosixUidGidTests: * Add tests for invalid uid/gid type (str) * Add UID_OVERFLOW and GID_OVERFLOW constants to replace (1 << 32) Initial patch written by David Malcolm. Co-Authored-By: David Malcolm files: A Misc/NEWS.d/next/Tests/2019-03-08-12-53-37.bpo-36234.NRVK6W.rst M Lib/test/test_os.py diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 746be1239bb4..4c620ccae9c8 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -1796,36 +1796,46 @@ def test_unicode_name(self): @unittest.skipIf(sys.platform == "win32", "Posix specific tests") class PosixUidGidTests(unittest.TestCase): + # uid_t and gid_t are 32-bit unsigned integers on Linux + UID_OVERFLOW = (1 << 32) + GID_OVERFLOW = (1 << 32) + @unittest.skipUnless(hasattr(os, 'setuid'), 'test needs os.setuid()') def test_setuid(self): if os.getuid() != 0: self.assertRaises(OSError, os.setuid, 0) - self.assertRaises(OverflowError, os.setuid, 1<<32) + self.assertRaises(TypeError, os.setuid, 'not an int') + self.assertRaises(OverflowError, os.setuid, self.UID_OVERFLOW) @unittest.skipUnless(hasattr(os, 'setgid'), 'test needs os.setgid()') def test_setgid(self): if os.getuid() != 0 and not HAVE_WHEEL_GROUP: self.assertRaises(OSError, os.setgid, 0) - self.assertRaises(OverflowError, os.setgid, 1<<32) + self.assertRaises(TypeError, os.setgid, 'not an int') + self.assertRaises(OverflowError, os.setgid, self.GID_OVERFLOW) @unittest.skipUnless(hasattr(os, 'seteuid'), 'test needs os.seteuid()') def test_seteuid(self): if os.getuid() != 0: self.assertRaises(OSError, os.seteuid, 0) - self.assertRaises(OverflowError, os.seteuid, 1<<32) + self.assertRaises(TypeError, os.setegid, 'not an int') + self.assertRaises(OverflowError, os.seteuid, self.UID_OVERFLOW) @unittest.skipUnless(hasattr(os, 'setegid'), 'test needs os.setegid()') def test_setegid(self): if os.getuid() != 0 and not HAVE_WHEEL_GROUP: self.assertRaises(OSError, os.setegid, 0) - self.assertRaises(OverflowError, os.setegid, 1<<32) + self.assertRaises(TypeError, os.setegid, 'not an int') + self.assertRaises(OverflowError, os.setegid, self.GID_OVERFLOW) @unittest.skipUnless(hasattr(os, 'setreuid'), 'test needs os.setreuid()') def test_setreuid(self): if os.getuid() != 0: self.assertRaises(OSError, os.setreuid, 0, 0) - self.assertRaises(OverflowError, os.setreuid, 1<<32, 0) - self.assertRaises(OverflowError, os.setreuid, 0, 1<<32) + self.assertRaises(TypeError, os.setreuid, 'not an int', 0) + self.assertRaises(TypeError, os.setreuid, 0, 'not an int') + self.assertRaises(OverflowError, os.setreuid, self.UID_OVERFLOW, 0) + self.assertRaises(OverflowError, os.setreuid, 0, self.UID_OVERFLOW) @unittest.skipUnless(hasattr(os, 'setreuid'), 'test needs os.setreuid()') def test_setreuid_neg1(self): @@ -1839,8 +1849,10 @@ def test_setreuid_neg1(self): def test_setregid(self): if os.getuid() != 0 and not HAVE_WHEEL_GROUP: self.assertRaises(OSError, os.setregid, 0, 0) - self.assertRaises(OverflowError, os.setregid, 1<<32, 0) - self.assertRaises(OverflowError, os.setregid, 0, 1<<32) + self.assertRaises(TypeError, os.setregid, 'not an int', 0) + self.assertRaises(TypeError, os.setregid, 0, 'not an int') + self.assertRaises(OverflowError, os.setregid, self.GID_OVERFLOW, 0) + self.assertRaises(OverflowError, os.setregid, 0, self.GID_OVERFLOW) @unittest.skipUnless(hasattr(os, 'setregid'), 'test needs os.setregid()') def test_setregid_neg1(self): diff --git a/Misc/NEWS.d/next/Tests/2019-03-08-12-53-37.bpo-36234.NRVK6W.rst b/Misc/NEWS.d/next/Tests/2019-03-08-12-53-37.bpo-36234.NRVK6W.rst new file mode 100644 index 000000000000..33178b6c3892 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-03-08-12-53-37.bpo-36234.NRVK6W.rst @@ -0,0 +1,2 @@ +test_posix.PosixUidGidTests: add tests for invalid uid/gid type (str). +Initial patch written by David Malcolm. From webhook-mailer at python.org Mon Mar 11 08:59:47 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 11 Mar 2019 12:59:47 -0000 Subject: [Python-checkins] bpo-36234: test_os: check TypeError for invalid uid type (GH-12235) Message-ID: https://github.com/python/cpython/commit/701af605df336c9e32751e9031266a2da60656c1 commit: 701af605df336c9e32751e9031266a2da60656c1 branch: 2.7 author: Victor Stinner committer: GitHub date: 2019-03-11T13:59:43+01:00 summary: bpo-36234: test_os: check TypeError for invalid uid type (GH-12235) Patch written by David Malcolm. Co-Authored-By: David Malcolm files: A Misc/NEWS.d/next/Tests/2019-03-08-12-53-37.bpo-36234.NRVK6W.rst M Lib/test/test_os.py diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 84e20e0c013b..dcd486e2b185 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -735,30 +735,36 @@ class PosixUidGidTests(unittest.TestCase): def test_setuid(self): if os.getuid() != 0: self.assertRaises(os.error, os.setuid, 0) + self.assertRaises(TypeError, os.setuid, 'not an int') self.assertRaises(OverflowError, os.setuid, 1<<32) @unittest.skipUnless(hasattr(os, 'setgid'), 'test needs os.setgid()') def test_setgid(self): if os.getuid() != 0: self.assertRaises(os.error, os.setgid, 0) + self.assertRaises(TypeError, os.setgid, 'not an int') self.assertRaises(OverflowError, os.setgid, 1<<32) @unittest.skipUnless(hasattr(os, 'seteuid'), 'test needs os.seteuid()') def test_seteuid(self): if os.getuid() != 0: self.assertRaises(os.error, os.seteuid, 0) + self.assertRaises(TypeError, os.seteuid, 'not an int') self.assertRaises(OverflowError, os.seteuid, 1<<32) @unittest.skipUnless(hasattr(os, 'setegid'), 'test needs os.setegid()') def test_setegid(self): if os.getuid() != 0: self.assertRaises(os.error, os.setegid, 0) + self.assertRaises(TypeError, os.setegid, 'not an int') self.assertRaises(OverflowError, os.setegid, 1<<32) @unittest.skipUnless(hasattr(os, 'setreuid'), 'test needs os.setreuid()') def test_setreuid(self): if os.getuid() != 0: self.assertRaises(os.error, os.setreuid, 0, 0) + self.assertRaises(TypeError, os.setreuid, 'not an int', 0) + self.assertRaises(TypeError, os.setreuid, 0, 'not an int') self.assertRaises(OverflowError, os.setreuid, 1<<32, 0) self.assertRaises(OverflowError, os.setreuid, 0, 1<<32) @@ -774,6 +780,8 @@ def test_setreuid_neg1(self): def test_setregid(self): if os.getuid() != 0: self.assertRaises(os.error, os.setregid, 0, 0) + self.assertRaises(TypeError, os.setregid, 'not an int', 0) + self.assertRaises(TypeError, os.setregid, 0, 'not an int') self.assertRaises(OverflowError, os.setregid, 1<<32, 0) self.assertRaises(OverflowError, os.setregid, 0, 1<<32) diff --git a/Misc/NEWS.d/next/Tests/2019-03-08-12-53-37.bpo-36234.NRVK6W.rst b/Misc/NEWS.d/next/Tests/2019-03-08-12-53-37.bpo-36234.NRVK6W.rst new file mode 100644 index 000000000000..ef32dc7170df --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-03-08-12-53-37.bpo-36234.NRVK6W.rst @@ -0,0 +1,2 @@ +test_posix.PosixUidGidTests: add tests for invalid uid/gid type (str). +Patch written by David Malcolm. From webhook-mailer at python.org Mon Mar 11 09:18:55 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 11 Mar 2019 13:18:55 -0000 Subject: [Python-checkins] bpo-36234: Add more tests to PosixUidGidTests (GH-12234) Message-ID: https://github.com/python/cpython/commit/24872e1e15a816fb8e79c2885cafb7d785393547 commit: 24872e1e15a816fb8e79c2885cafb7d785393547 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-11T06:18:40-07:00 summary: bpo-36234: Add more tests to PosixUidGidTests (GH-12234) test_posix.PosixUidGidTests: * Add tests for invalid uid/gid type (str) * Add UID_OVERFLOW and GID_OVERFLOW constants to replace (1 << 32) Initial patch written by David Malcolm. Co-Authored-By: David Malcolm (cherry picked from commit 876e82b4f32075e1bd21750bf852a103035fce23) Co-authored-by: Victor Stinner files: A Misc/NEWS.d/next/Tests/2019-03-08-12-53-37.bpo-36234.NRVK6W.rst M Lib/test/test_os.py diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index bb31e053bae1..fd9f70e30dba 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -1798,36 +1798,46 @@ def test_unicode_name(self): @unittest.skipIf(sys.platform == "win32", "Posix specific tests") class PosixUidGidTests(unittest.TestCase): + # uid_t and gid_t are 32-bit unsigned integers on Linux + UID_OVERFLOW = (1 << 32) + GID_OVERFLOW = (1 << 32) + @unittest.skipUnless(hasattr(os, 'setuid'), 'test needs os.setuid()') def test_setuid(self): if os.getuid() != 0: self.assertRaises(OSError, os.setuid, 0) - self.assertRaises(OverflowError, os.setuid, 1<<32) + self.assertRaises(TypeError, os.setuid, 'not an int') + self.assertRaises(OverflowError, os.setuid, self.UID_OVERFLOW) @unittest.skipUnless(hasattr(os, 'setgid'), 'test needs os.setgid()') def test_setgid(self): if os.getuid() != 0 and not HAVE_WHEEL_GROUP: self.assertRaises(OSError, os.setgid, 0) - self.assertRaises(OverflowError, os.setgid, 1<<32) + self.assertRaises(TypeError, os.setgid, 'not an int') + self.assertRaises(OverflowError, os.setgid, self.GID_OVERFLOW) @unittest.skipUnless(hasattr(os, 'seteuid'), 'test needs os.seteuid()') def test_seteuid(self): if os.getuid() != 0: self.assertRaises(OSError, os.seteuid, 0) - self.assertRaises(OverflowError, os.seteuid, 1<<32) + self.assertRaises(TypeError, os.setegid, 'not an int') + self.assertRaises(OverflowError, os.seteuid, self.UID_OVERFLOW) @unittest.skipUnless(hasattr(os, 'setegid'), 'test needs os.setegid()') def test_setegid(self): if os.getuid() != 0 and not HAVE_WHEEL_GROUP: self.assertRaises(OSError, os.setegid, 0) - self.assertRaises(OverflowError, os.setegid, 1<<32) + self.assertRaises(TypeError, os.setegid, 'not an int') + self.assertRaises(OverflowError, os.setegid, self.GID_OVERFLOW) @unittest.skipUnless(hasattr(os, 'setreuid'), 'test needs os.setreuid()') def test_setreuid(self): if os.getuid() != 0: self.assertRaises(OSError, os.setreuid, 0, 0) - self.assertRaises(OverflowError, os.setreuid, 1<<32, 0) - self.assertRaises(OverflowError, os.setreuid, 0, 1<<32) + self.assertRaises(TypeError, os.setreuid, 'not an int', 0) + self.assertRaises(TypeError, os.setreuid, 0, 'not an int') + self.assertRaises(OverflowError, os.setreuid, self.UID_OVERFLOW, 0) + self.assertRaises(OverflowError, os.setreuid, 0, self.UID_OVERFLOW) @unittest.skipUnless(hasattr(os, 'setreuid'), 'test needs os.setreuid()') def test_setreuid_neg1(self): @@ -1841,8 +1851,10 @@ def test_setreuid_neg1(self): def test_setregid(self): if os.getuid() != 0 and not HAVE_WHEEL_GROUP: self.assertRaises(OSError, os.setregid, 0, 0) - self.assertRaises(OverflowError, os.setregid, 1<<32, 0) - self.assertRaises(OverflowError, os.setregid, 0, 1<<32) + self.assertRaises(TypeError, os.setregid, 'not an int', 0) + self.assertRaises(TypeError, os.setregid, 0, 'not an int') + self.assertRaises(OverflowError, os.setregid, self.GID_OVERFLOW, 0) + self.assertRaises(OverflowError, os.setregid, 0, self.GID_OVERFLOW) @unittest.skipUnless(hasattr(os, 'setregid'), 'test needs os.setregid()') def test_setregid_neg1(self): diff --git a/Misc/NEWS.d/next/Tests/2019-03-08-12-53-37.bpo-36234.NRVK6W.rst b/Misc/NEWS.d/next/Tests/2019-03-08-12-53-37.bpo-36234.NRVK6W.rst new file mode 100644 index 000000000000..33178b6c3892 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-03-08-12-53-37.bpo-36234.NRVK6W.rst @@ -0,0 +1,2 @@ +test_posix.PosixUidGidTests: add tests for invalid uid/gid type (str). +Initial patch written by David Malcolm. From webhook-mailer at python.org Mon Mar 11 09:55:01 2019 From: webhook-mailer at python.org (Julien Palard) Date: Mon, 11 Mar 2019 13:55:01 -0000 Subject: [Python-checkins] Doc: Fix inconsistency in multiprocessing (GH-12273) Message-ID: https://github.com/python/cpython/commit/d9bd8ec2a40ea67bc4248a72943a409ee645ddf3 commit: d9bd8ec2a40ea67bc4248a72943a409ee645ddf3 branch: master author: Julien Palard committer: GitHub date: 2019-03-11T14:54:48+01:00 summary: Doc: Fix inconsistency in multiprocessing (GH-12273) files: M Doc/library/multiprocessing.rst diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 987a0d508768..a5ecfa6cc1c7 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -1654,7 +1654,7 @@ their parent process exits. The manager classes are defined in the Connect a local manager object to a remote manager process:: >>> from multiprocessing.managers import BaseManager - >>> m = BaseManager(address=('127.0.0.1', 5000), authkey=b'abc') + >>> m = BaseManager(address=('127.0.0.1', 50000), authkey=b'abc') >>> m.connect() .. method:: shutdown() From webhook-mailer at python.org Mon Mar 11 10:23:39 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 11 Mar 2019 14:23:39 -0000 Subject: [Python-checkins] [3.7] Doc: Fix inconsistency in multiprocessing (GH-12273) (GH-12275) Message-ID: https://github.com/python/cpython/commit/2c177ec6c542d9924222f9ef3f97858ce7f27453 commit: 2c177ec6c542d9924222f9ef3f97858ce7f27453 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-11T07:23:30-07:00 summary: [3.7] Doc: Fix inconsistency in multiprocessing (GH-12273) (GH-12275) (cherry picked from commit d9bd8ec2a40ea67bc4248a72943a409ee645ddf3) Co-authored-by: Julien Palard files: M Doc/library/multiprocessing.rst diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 6ed8f211f361..96e0dc831b79 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -1645,7 +1645,7 @@ their parent process exits. The manager classes are defined in the Connect a local manager object to a remote manager process:: >>> from multiprocessing.managers import BaseManager - >>> m = BaseManager(address=('127.0.0.1', 5000), authkey=b'abc') + >>> m = BaseManager(address=('127.0.0.1', 50000), authkey=b'abc') >>> m.connect() .. method:: shutdown() From webhook-mailer at python.org Mon Mar 11 23:21:32 2019 From: webhook-mailer at python.org (Lisa Roach) Date: Tue, 12 Mar 2019 03:21:32 -0000 Subject: [Python-checkins] bpo-35132: Fixes missing target in gdb pep0393 check. (GH-11848) Message-ID: https://github.com/python/cpython/commit/1ceb3a3d172dcf0ddff38d5d6b559443ad065b84 commit: 1ceb3a3d172dcf0ddff38d5d6b559443ad065b84 branch: master author: Lisa Roach committer: GitHub date: 2019-03-11T20:21:25-07:00 summary: bpo-35132: Fixes missing target in gdb pep0393 check. (GH-11848) files: A Misc/NEWS.d/next/Tools-Demos/2019-03-04-02-09-09.bpo-35132.1R_pnL.rst M Tools/gdb/libpython.py diff --git a/Misc/NEWS.d/next/Tools-Demos/2019-03-04-02-09-09.bpo-35132.1R_pnL.rst b/Misc/NEWS.d/next/Tools-Demos/2019-03-04-02-09-09.bpo-35132.1R_pnL.rst new file mode 100644 index 000000000000..d73452df429b --- /dev/null +++ b/Misc/NEWS.d/next/Tools-Demos/2019-03-04-02-09-09.bpo-35132.1R_pnL.rst @@ -0,0 +1 @@ +Fix py-list and py-bt commands of python-gdb.py on gdb7. \ No newline at end of file diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py index bfaa9403b787..d744cab7642a 100755 --- a/Tools/gdb/libpython.py +++ b/Tools/gdb/libpython.py @@ -1178,7 +1178,7 @@ def char_width(self): def proxyval(self, visited): global _is_pep393 if _is_pep393 is None: - fields = gdb.lookup_type('PyUnicodeObject').target().fields() + fields = gdb.lookup_type('PyUnicodeObject').fields() _is_pep393 = 'data' in [f.name for f in fields] if _is_pep393: # Python 3.3 and newer From webhook-mailer at python.org Mon Mar 11 23:29:08 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 12 Mar 2019 03:29:08 -0000 Subject: [Python-checkins] bpo-35931: Gracefully handle any exception in pdb debug command (GH-12103) Message-ID: https://github.com/python/cpython/commit/3e936431e23b424b1e4665e8165c245924f0ab02 commit: 3e936431e23b424b1e4665e8165c245924f0ab02 branch: master author: Daniel Hahler committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-11T20:29:04-07:00 summary: bpo-35931: Gracefully handle any exception in pdb debug command (GH-12103) This is relevant for `debug doesnotexist()`, which would crash with a NameError otherwise. files: A Misc/NEWS.d/next/Library/2019-03-11-22-06-36.bpo-35931.Qp_Tbe.rst M Lib/pdb.py M Lib/test/test_pdb.py diff --git a/Lib/pdb.py b/Lib/pdb.py index 1443f9f85c7e..bf3219af3985 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -1093,16 +1093,14 @@ def do_debug(self, arg): sys.settrace(None) globals = self.curframe.f_globals locals = self.curframe_locals - try: - code = compile(arg, "", "exec") - except SyntaxError: - exc_info = sys.exc_info()[:2] - self.error(traceback.format_exception_only(*exc_info)[-1].strip()) - return p = Pdb(self.completekey, self.stdin, self.stdout) p.prompt = "(%s) " % self.prompt.strip() self.message("ENTERING RECURSIVE DEBUGGER") - sys.call_tracing(p.run, (code, globals, locals)) + try: + sys.call_tracing(p.run, (arg, globals, locals)) + except Exception: + exc_info = sys.exc_info()[:2] + self.error(traceback.format_exception_only(*exc_info)[-1].strip()) self.message("LEAVING RECURSIVE DEBUGGER") sys.settrace(self.trace_dispatch) self.lastcmd = p.lastcmd diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index 21f6b7079bb5..7e03df02946b 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -1486,12 +1486,26 @@ def test_relative_imports_on_plain_module(self): stdout, _ = self._run_pdb(['-m', self.module_name + '.runme'], commands) self.assertTrue(any("VAR from module" in l for l in stdout.splitlines()), stdout) - def test_syntaxerror_in_command(self): - commands = "print(\ndebug print(" - stdout, _ = self.run_pdb_script("", commands) + def test_errors_in_command(self): + commands = "\n".join([ + 'print(', + 'debug print(', + 'debug doesnotexist', + 'c', + ]) + stdout, _ = self.run_pdb_script('', commands + '\n') + self.assertEqual(stdout.splitlines()[1:], [ '(Pdb) *** SyntaxError: unexpected EOF while parsing', - '(Pdb) *** SyntaxError: unexpected EOF while parsing', + + '(Pdb) ENTERING RECURSIVE DEBUGGER', + '*** SyntaxError: unexpected EOF while parsing', + 'LEAVING RECURSIVE DEBUGGER', + + '(Pdb) ENTERING RECURSIVE DEBUGGER', + '> (1)()', + "((Pdb)) *** NameError: name 'doesnotexist' is not defined", + 'LEAVING RECURSIVE DEBUGGER', '(Pdb) ', ]) diff --git a/Misc/NEWS.d/next/Library/2019-03-11-22-06-36.bpo-35931.Qp_Tbe.rst b/Misc/NEWS.d/next/Library/2019-03-11-22-06-36.bpo-35931.Qp_Tbe.rst new file mode 100644 index 000000000000..68c57e2e69df --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-11-22-06-36.bpo-35931.Qp_Tbe.rst @@ -0,0 +1 @@ +The :mod:`pdb` ``debug`` command now gracefully handles all exceptions. From webhook-mailer at python.org Tue Mar 12 00:01:05 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 12 Mar 2019 04:01:05 -0000 Subject: [Python-checkins] [3.7] bpo-35931: Gracefully handle any exception in pdb debug command (GH-12103) (GH-12285) Message-ID: https://github.com/python/cpython/commit/1c4580d1f563173f5d6ec990b46bd38f4ae901a1 commit: 1c4580d1f563173f5d6ec990b46bd38f4ae901a1 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-11T21:00:59-07:00 summary: [3.7] bpo-35931: Gracefully handle any exception in pdb debug command (GH-12103) (GH-12285) This is relevant for `debug doesnotexist()`, which would crash with a NameError otherwise. (cherry picked from commit 3e936431e23b424b1e4665e8165c245924f0ab02) Co-authored-by: Daniel Hahler https://bugs.python.org/issue35931 files: A Misc/NEWS.d/next/Library/2019-03-11-22-06-36.bpo-35931.Qp_Tbe.rst D Misc/NEWS.d/next/Library/2019-02-07-16-22-50.bpo-35931._63i7B.rst M Lib/pdb.py M Lib/test/test_pdb.py diff --git a/Lib/pdb.py b/Lib/pdb.py index 1443f9f85c7e..bf3219af3985 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -1093,16 +1093,14 @@ def do_debug(self, arg): sys.settrace(None) globals = self.curframe.f_globals locals = self.curframe_locals - try: - code = compile(arg, "", "exec") - except SyntaxError: - exc_info = sys.exc_info()[:2] - self.error(traceback.format_exception_only(*exc_info)[-1].strip()) - return p = Pdb(self.completekey, self.stdin, self.stdout) p.prompt = "(%s) " % self.prompt.strip() self.message("ENTERING RECURSIVE DEBUGGER") - sys.call_tracing(p.run, (code, globals, locals)) + try: + sys.call_tracing(p.run, (arg, globals, locals)) + except Exception: + exc_info = sys.exc_info()[:2] + self.error(traceback.format_exception_only(*exc_info)[-1].strip()) self.message("LEAVING RECURSIVE DEBUGGER") sys.settrace(self.trace_dispatch) self.lastcmd = p.lastcmd diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index 5b03b47ef468..f573f5f54b0f 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -1482,12 +1482,26 @@ def test_relative_imports_on_plain_module(self): stdout, _ = self._run_pdb(['-m', self.module_name + '.runme'], commands) self.assertTrue(any("VAR from module" in l for l in stdout.splitlines()), stdout) - def test_syntaxerror_in_command(self): - commands = "print(\ndebug print(" - stdout, _ = self.run_pdb_script("", commands) + def test_errors_in_command(self): + commands = "\n".join([ + 'print(', + 'debug print(', + 'debug doesnotexist', + 'c', + ]) + stdout, _ = self.run_pdb_script('', commands + '\n') + self.assertEqual(stdout.splitlines()[1:], [ '(Pdb) *** SyntaxError: unexpected EOF while parsing', - '(Pdb) *** SyntaxError: unexpected EOF while parsing', + + '(Pdb) ENTERING RECURSIVE DEBUGGER', + '*** SyntaxError: unexpected EOF while parsing', + 'LEAVING RECURSIVE DEBUGGER', + + '(Pdb) ENTERING RECURSIVE DEBUGGER', + '> (1)()', + "((Pdb)) *** NameError: name 'doesnotexist' is not defined", + 'LEAVING RECURSIVE DEBUGGER', '(Pdb) ', ]) diff --git a/Misc/NEWS.d/next/Library/2019-02-07-16-22-50.bpo-35931._63i7B.rst b/Misc/NEWS.d/next/Library/2019-02-07-16-22-50.bpo-35931._63i7B.rst deleted file mode 100644 index a229968583d1..000000000000 --- a/Misc/NEWS.d/next/Library/2019-02-07-16-22-50.bpo-35931._63i7B.rst +++ /dev/null @@ -1 +0,0 @@ -The :mod:`pdb` ``debug`` command now gracefully handles syntax errors. diff --git a/Misc/NEWS.d/next/Library/2019-03-11-22-06-36.bpo-35931.Qp_Tbe.rst b/Misc/NEWS.d/next/Library/2019-03-11-22-06-36.bpo-35931.Qp_Tbe.rst new file mode 100644 index 000000000000..68c57e2e69df --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-11-22-06-36.bpo-35931.Qp_Tbe.rst @@ -0,0 +1 @@ +The :mod:`pdb` ``debug`` command now gracefully handles all exceptions. From webhook-mailer at python.org Tue Mar 12 00:28:47 2019 From: webhook-mailer at python.org (Ned Deily) Date: Tue, 12 Mar 2019 04:28:47 -0000 Subject: [Python-checkins] bpo-35647: Fix path check in cookiejar (GH-11436) (GH-12268) Message-ID: https://github.com/python/cpython/commit/5565b1db6f37f244890369e0d68a3e906aca28b9 commit: 5565b1db6f37f244890369e0d68a3e906aca28b9 branch: 3.6 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Ned Deily date: 2019-03-12T00:28:39-04:00 summary: bpo-35647: Fix path check in cookiejar (GH-11436) (GH-12268) Co-authored-by: Xtreak files: A Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst M Lib/http/cookiejar.py M Lib/test/test_http_cookiejar.py diff --git a/Lib/http/cookiejar.py b/Lib/http/cookiejar.py index 97599d48d8e0..e46514bb35eb 100644 --- a/Lib/http/cookiejar.py +++ b/Lib/http/cookiejar.py @@ -993,7 +993,7 @@ def set_ok_path(self, cookie, request): req_path = request_path(request) if ((cookie.version > 0 or (cookie.version == 0 and self.strict_ns_set_path)) and - not req_path.startswith(cookie.path)): + not self.path_return_ok(cookie.path, request)): _debug(" path attribute %s is not a prefix of request " "path %s", cookie.path, req_path) return False @@ -1200,11 +1200,15 @@ def domain_return_ok(self, domain, request): def path_return_ok(self, path, request): _debug("- checking cookie path=%s", path) req_path = request_path(request) - if not req_path.startswith(path): - _debug(" %s does not path-match %s", req_path, path) - return False - return True + pathlen = len(path) + if req_path == path: + return True + elif (req_path.startswith(path) and + (path.endswith("/") or req_path[pathlen:pathlen+1] == "/")): + return True + _debug(" %s does not path-match %s", req_path, path) + return False def vals_sorted_by_key(adict): keys = sorted(adict.keys()) diff --git a/Lib/test/test_http_cookiejar.py b/Lib/test/test_http_cookiejar.py index 6e1b30881310..16edf34a9925 100644 --- a/Lib/test/test_http_cookiejar.py +++ b/Lib/test/test_http_cookiejar.py @@ -695,6 +695,30 @@ def test_request_path(self): req = urllib.request.Request("http://www.example.com") self.assertEqual(request_path(req), "/") + def test_path_prefix_match(self): + pol = DefaultCookiePolicy() + strict_ns_path_pol = DefaultCookiePolicy(strict_ns_set_path=True) + + c = CookieJar(pol) + base_url = "http://bar.com" + interact_netscape(c, base_url, 'spam=eggs; Path=/foo') + cookie = c._cookies['bar.com']['/foo']['spam'] + + for path, ok in [('/foo', True), + ('/foo/', True), + ('/foo/bar', True), + ('/', False), + ('/foobad/foo', False)]: + url = f'{base_url}{path}' + req = urllib.request.Request(url) + h = interact_netscape(c, url) + if ok: + self.assertIn('spam=eggs', h, f"cookie not set for {path}") + self.assertTrue(strict_ns_path_pol.set_ok_path(cookie, req)) + else: + self.assertNotIn('spam=eggs', h, f"cookie set for {path}") + self.assertFalse(strict_ns_path_pol.set_ok_path(cookie, req)) + def test_request_port(self): req = urllib.request.Request("http://www.acme.com:1234/", headers={"Host": "www.acme.com:4321"}) diff --git a/Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst b/Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst new file mode 100644 index 000000000000..032e1e2c00bc --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst @@ -0,0 +1,3 @@ +Don't set cookie for a request when the request path is a prefix match of +the cookie's path attribute but doesn't end with "/". Patch by Karthikeyan +Singaravelan. From webhook-mailer at python.org Tue Mar 12 00:34:06 2019 From: webhook-mailer at python.org (Ned Deily) Date: Tue, 12 Mar 2019 04:34:06 -0000 Subject: [Python-checkins] [3.6] bpo-36216: Add check for characters in netloc that normalize to separators (GH-12201) (GH-12215) Message-ID: https://github.com/python/cpython/commit/23fc0416454c4ad5b9b23d520fbe6d89be3efc24 commit: 23fc0416454c4ad5b9b23d520fbe6d89be3efc24 branch: 3.6 author: Steve Dower committer: Ned Deily date: 2019-03-12T00:34:03-04:00 summary: [3.6] bpo-36216: Add check for characters in netloc that normalize to separators (GH-12201) (GH-12215) files: A Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst M Doc/library/urllib.parse.rst M Lib/test/test_urlparse.py M Lib/urllib/parse.py diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst index d991254d5ca1..647af613a315 100644 --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -121,6 +121,11 @@ or on combining URL components into a URL string. Unmatched square brackets in the :attr:`netloc` attribute will raise a :exc:`ValueError`. + Characters in the :attr:`netloc` attribute that decompose under NFKC + normalization (as used by the IDNA encoding) into any of ``/``, ``?``, + ``#``, ``@``, or ``:`` will raise a :exc:`ValueError`. If the URL is + decomposed before parsing, no error will be raised. + .. versionchanged:: 3.2 Added IPv6 URL parsing capabilities. @@ -133,6 +138,10 @@ or on combining URL components into a URL string. Out-of-range port numbers now raise :exc:`ValueError`, instead of returning :const:`None`. + .. versionchanged:: 3.6.9 + Characters that affect netloc parsing under NFKC normalization will + now raise :exc:`ValueError`. + .. function:: parse_qs(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace', max_num_fields=None) @@ -256,10 +265,19 @@ or on combining URL components into a URL string. Unmatched square brackets in the :attr:`netloc` attribute will raise a :exc:`ValueError`. + Characters in the :attr:`netloc` attribute that decompose under NFKC + normalization (as used by the IDNA encoding) into any of ``/``, ``?``, + ``#``, ``@``, or ``:`` will raise a :exc:`ValueError`. If the URL is + decomposed before parsing, no error will be raised. + .. versionchanged:: 3.6 Out-of-range port numbers now raise :exc:`ValueError`, instead of returning :const:`None`. + .. versionchanged:: 3.6.9 + Characters that affect netloc parsing under NFKC normalization will + now raise :exc:`ValueError`. + .. function:: urlunsplit(parts) diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index be50b47603aa..e6638aee2244 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -1,3 +1,5 @@ +import sys +import unicodedata import unittest import urllib.parse @@ -984,6 +986,27 @@ def test_all(self): expected.append(name) self.assertCountEqual(urllib.parse.__all__, expected) + def test_urlsplit_normalization(self): + # Certain characters should never occur in the netloc, + # including under normalization. + # Ensure that ALL of them are detected and cause an error + illegal_chars = '/:#?@' + hex_chars = {'{:04X}'.format(ord(c)) for c in illegal_chars} + denorm_chars = [ + c for c in map(chr, range(128, sys.maxunicode)) + if (hex_chars & set(unicodedata.decomposition(c).split())) + and c not in illegal_chars + ] + # Sanity check that we found at least one such character + self.assertIn('\u2100', denorm_chars) + self.assertIn('\uFF03', denorm_chars) + + for scheme in ["http", "https", "ftp"]: + for c in denorm_chars: + url = "{}://netloc{}false.netloc/path".format(scheme, c) + with self.subTest(url=url, char='{:04X}'.format(ord(c))): + with self.assertRaises(ValueError): + urllib.parse.urlsplit(url) class Utility_Tests(unittest.TestCase): """Testcase to test the various utility functions in the urllib.""" diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index 85e68c8b42c7..7b06f4d71d67 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -391,6 +391,21 @@ def _splitnetloc(url, start=0): delim = min(delim, wdelim) # use earliest delim position return url[start:delim], url[delim:] # return (domain, rest) +def _checknetloc(netloc): + if not netloc or not any(ord(c) > 127 for c in netloc): + return + # looking for characters like \u2100 that expand to 'a/c' + # IDNA uses NFKC equivalence, so normalize for this check + import unicodedata + netloc2 = unicodedata.normalize('NFKC', netloc) + if netloc == netloc2: + return + _, _, netloc = netloc.rpartition('@') # anything to the left of '@' is okay + for c in '/?#@:': + if c in netloc2: + raise ValueError("netloc '" + netloc2 + "' contains invalid " + + "characters under NFKC normalization") + def urlsplit(url, scheme='', allow_fragments=True): """Parse a URL into 5 components: :///?# @@ -420,6 +435,7 @@ def urlsplit(url, scheme='', allow_fragments=True): url, fragment = url.split('#', 1) if '?' in url: url, query = url.split('?', 1) + _checknetloc(netloc) v = SplitResult(scheme, netloc, url, query, fragment) _parse_cache[key] = v return _coerce_result(v) @@ -443,6 +459,7 @@ def urlsplit(url, scheme='', allow_fragments=True): url, fragment = url.split('#', 1) if '?' in url: url, query = url.split('?', 1) + _checknetloc(netloc) v = SplitResult(scheme, netloc, url, query, fragment) _parse_cache[key] = v return _coerce_result(v) diff --git a/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst b/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst new file mode 100644 index 000000000000..5546394157f9 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst @@ -0,0 +1,3 @@ +Changes urlsplit() to raise ValueError when the URL contains characters that +decompose under IDNA encoding (NFKC-normalization) into characters that +affect how the URL is parsed. From webhook-mailer at python.org Tue Mar 12 03:43:38 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Tue, 12 Mar 2019 07:43:38 -0000 Subject: [Python-checkins] bpo-35892: Fix mode() and add multimode() (#12089) Message-ID: https://github.com/python/cpython/commit/fc06a192fdc44225ef1cc879f615a81931ad0a85 commit: fc06a192fdc44225ef1cc879f615a81931ad0a85 branch: master author: Raymond Hettinger committer: GitHub date: 2019-03-12T00:43:27-07:00 summary: bpo-35892: Fix mode() and add multimode() (#12089) files: M Doc/library/statistics.rst M Doc/whatsnew/3.8.rst M Lib/statistics.py M Lib/test/test_statistics.py diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst index 81119da0a382..97e1c3a0a1c2 100644 --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -37,7 +37,7 @@ Averages and measures of central location These functions calculate an average or typical value from a population or sample. -======================= ============================================= +======================= =============================================================== :func:`mean` Arithmetic mean ("average") of data. :func:`fmean` Fast, floating point arithmetic mean. :func:`harmonic_mean` Harmonic mean of data. @@ -45,8 +45,9 @@ or sample. :func:`median_low` Low median of data. :func:`median_high` High median of data. :func:`median_grouped` Median, or 50th percentile, of grouped data. -:func:`mode` Mode (most common value) of discrete data. -======================= ============================================= +:func:`mode` Single mode (most common value) of discrete or nominal data. +:func:`multimode` List of modes (most common values) of discrete or nomimal data. +======================= =============================================================== Measures of spread ------------------ @@ -287,12 +288,12 @@ However, for reading convenience, most of the examples show sorted sequences. .. function:: mode(data) - Return the most common data point from discrete or nominal *data*. The mode - (when it exists) is the most typical value, and is a robust measure of - central location. + Return the single most common data point from discrete or nominal *data*. + The mode (when it exists) is the most typical value and serves as a + measure of central location. - If *data* is empty, or if there is not exactly one most common value, - :exc:`StatisticsError` is raised. + If there are multiple modes, returns the first one encountered in the *data*. + If *data* is empty, :exc:`StatisticsError` is raised. ``mode`` assumes discrete data, and returns a single value. This is the standard treatment of the mode as commonly taught in schools: @@ -310,6 +311,27 @@ However, for reading convenience, most of the examples show sorted sequences. >>> mode(["red", "blue", "blue", "red", "green", "red", "red"]) 'red' + .. versionchanged:: 3.8 + Now handles multimodal datasets by returning the first mode encountered. + Formerly, it raised :exc:`StatisticsError` when more than one mode was + found. + + +.. function:: multimode(data) + + Return a list of the most frequently occurring values in the order they + were first encountered in the *data*. Will return more than one result if + there are multiple modes or an empty list if the *data* is empty: + + .. doctest:: + + >>> multimode('aabbbbccddddeeffffgg') + ['b', 'd', 'f'] + >>> multimode('') + [] + + .. versionadded:: 3.8 + .. function:: pstdev(data, mu=None) diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 9cd5a3a937dc..ad86917d0cc7 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -282,6 +282,9 @@ Added :func:`statistics.fmean` as a faster, floating point variant of :func:`statistics.mean()`. (Contributed by Raymond Hettinger and Steven D'Aprano in :issue:`35904`.) +Added :func:`statistics.multimode` that returns a list of the most +common values. (Contributed by Raymond Hettinger in :issue:`35892`.) + Added :class:`statistics.NormalDist`, a tool for creating and manipulating normal distributions of a random variable. (Contributed by Raymond Hettinger in :issue:`36018`.) @@ -591,6 +594,11 @@ Changes in the Python API * The function :func:`platform.popen` has been removed, it was deprecated since Python 3.3: use :func:`os.popen` instead. +* The :func:`statistics.mode` function no longer raises an exception + when given multimodal data. Instead, it returns the first mode + encountered in the input data. (Contributed by Raymond Hettinger + in :issue:`35892`.) + * The :meth:`~tkinter.ttk.Treeview.selection` method of the :class:`tkinter.ttk.Treeview` class no longer takes arguments. Using it with arguments for changing the selection was deprecated in Python 3.6. Use diff --git a/Lib/statistics.py b/Lib/statistics.py index e85aaa996cc7..97f154373dc0 100644 --- a/Lib/statistics.py +++ b/Lib/statistics.py @@ -17,6 +17,7 @@ median_high High median of data. median_grouped Median, or 50th percentile, of grouped data. mode Mode (most common value) of data. +multimode List of modes (most common values of data) ================== ============================================= Calculate the arithmetic mean ("the average") of data: @@ -79,10 +80,9 @@ __all__ = [ 'StatisticsError', 'NormalDist', 'pstdev', 'pvariance', 'stdev', 'variance', 'median', 'median_low', 'median_high', 'median_grouped', - 'mean', 'mode', 'harmonic_mean', 'fmean', + 'mean', 'mode', 'multimode', 'harmonic_mean', 'fmean', ] -import collections import math import numbers import random @@ -92,8 +92,8 @@ from itertools import groupby from bisect import bisect_left, bisect_right from math import hypot, sqrt, fabs, exp, erf, tau, log, fsum - - +from operator import itemgetter +from collections import Counter # === Exceptions === @@ -249,20 +249,6 @@ def _convert(value, T): raise -def _counts(data): - # Generate a table of sorted (value, frequency) pairs. - table = collections.Counter(iter(data)).most_common() - if not table: - return table - # Extract the values with the highest frequency. - maxfreq = table[0][1] - for i in range(1, len(table)): - if table[i][1] != maxfreq: - table = table[:i] - break - return table - - def _find_lteq(a, x): 'Locate the leftmost value exactly equal to x' i = bisect_left(a, x) @@ -334,9 +320,9 @@ def count(x): nonlocal n n += 1 return x - total = math.fsum(map(count, data)) + total = fsum(map(count, data)) else: - total = math.fsum(data) + total = fsum(data) try: return total / n except ZeroDivisionError: @@ -523,19 +509,38 @@ def mode(data): >>> mode(["red", "blue", "blue", "red", "green", "red", "red"]) 'red' - If there is not exactly one most common value, ``mode`` will raise - StatisticsError. + If there are multiple modes, return the first one encountered. + + >>> mode(['red', 'red', 'green', 'blue', 'blue']) + 'red' + + If *data* is empty, ``mode``, raises StatisticsError. + """ - # Generate a table of sorted (value, frequency) pairs. - table = _counts(data) - if len(table) == 1: - return table[0][0] - elif table: - raise StatisticsError( - 'no unique mode; found %d equally common values' % len(table) - ) - else: - raise StatisticsError('no mode for empty data') + data = iter(data) + try: + return Counter(data).most_common(1)[0][0] + except IndexError: + raise StatisticsError('no mode for empty data') from None + + +def multimode(data): + """ Return a list of the most frequently occurring values. + + Will return more than one result if there are multiple modes + or an empty list if *data* is empty. + + >>> multimode('aabbbbbbbbcc') + ['b'] + >>> multimode('aabbbbccddddeeffffgg') + ['b', 'd', 'f'] + >>> multimode('') + [] + + """ + counts = Counter(iter(data)).most_common() + maxcount, mode_items = next(groupby(counts, key=itemgetter(1)), (0, [])) + return list(map(itemgetter(0), mode_items)) # === Measures of spread === @@ -836,6 +841,7 @@ def __repr__(self): from math import isclose from operator import add, sub, mul, truediv from itertools import repeat + import doctest g1 = NormalDist(10, 20) g2 = NormalDist(-5, 25) @@ -893,3 +899,5 @@ def assert_close(G1, G2): S = NormalDist.from_samples([x - y for x, y in zip(X.samples(n), Y.samples(n))]) assert_close(X - Y, S) + + print(doctest.testmod()) diff --git a/Lib/test/test_statistics.py b/Lib/test/test_statistics.py index a63e4bf6cc84..26b22a1c4080 100644 --- a/Lib/test/test_statistics.py +++ b/Lib/test/test_statistics.py @@ -1769,7 +1769,7 @@ def prepare_data(self): def test_range_data(self): # Override test from UnivariateCommonMixin. data = range(20, 50, 3) - self.assertRaises(statistics.StatisticsError, self.func, data) + self.assertEqual(self.func(data), 20) def test_nominal_data(self): # Test mode with nominal data. @@ -1790,13 +1790,14 @@ def test_bimodal_data(self): # Test mode with bimodal data. data = [1, 1, 2, 2, 2, 2, 3, 4, 5, 6, 6, 6, 6, 7, 8, 9, 9] assert data.count(2) == data.count(6) == 4 - # Check for an exception. - self.assertRaises(statistics.StatisticsError, self.func, data) + # mode() should return 2, the first encounted mode + self.assertEqual(self.func(data), 2) - def test_unique_data_failure(self): - # Test mode exception when data points are all unique. + def test_unique_data(self): + # Test mode when data points are all unique. data = list(range(10)) - self.assertRaises(statistics.StatisticsError, self.func, data) + # mode() should return 0, the first encounted mode + self.assertEqual(self.func(data), 0) def test_none_data(self): # Test that mode raises TypeError if given None as data. @@ -1809,8 +1810,18 @@ def test_counter_data(self): # Test that a Counter is treated like any other iterable. data = collections.Counter([1, 1, 1, 2]) # Since the keys of the counter are treated as data points, not the - # counts, this should raise. - self.assertRaises(statistics.StatisticsError, self.func, data) + # counts, this should return the first mode encountered, 1 + self.assertEqual(self.func(data), 1) + + +class TestMultiMode(unittest.TestCase): + + def test_basics(self): + multimode = statistics.multimode + self.assertEqual(multimode('aabbbbbbbbcc'), ['b']) + self.assertEqual(multimode('aabbbbccddddeeffffgg'), ['b', 'd', 'f']) + self.assertEqual(multimode(''), []) + class TestFMean(unittest.TestCase): From webhook-mailer at python.org Tue Mar 12 04:25:53 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Tue, 12 Mar 2019 08:25:53 -0000 Subject: [Python-checkins] bpo-30040: new empty dict uses key-sharing dict (GH-1080) Message-ID: https://github.com/python/cpython/commit/f2a186712bfe726d54723eba37d80c7f0303a50b commit: f2a186712bfe726d54723eba37d80c7f0303a50b branch: master author: Inada Naoki committer: GitHub date: 2019-03-12T17:25:44+09:00 summary: bpo-30040: new empty dict uses key-sharing dict (GH-1080) Sizeof new empty dict becomes 72 bytes from 240 bytes (amd64). It is same size to empty dict created by dict.clear(). files: A Misc/NEWS.d/next/Core and Builtins/2019-03-11-22-30-56.bpo-30040.W9z8X7.rst M Lib/test/test_descr.py M Lib/test/test_sys.py M Objects/dictobject.c diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index fc885c5e62f2..e39fea615db3 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -5346,16 +5346,16 @@ class B(A): a, b = A(), B() self.assertEqual(sys.getsizeof(vars(a)), sys.getsizeof(vars(b))) - self.assertLess(sys.getsizeof(vars(a)), sys.getsizeof({})) + self.assertLess(sys.getsizeof(vars(a)), sys.getsizeof({"a":1})) # Initial hash table can contain at most 5 elements. # Set 6 attributes to cause internal resizing. a.x, a.y, a.z, a.w, a.v, a.u = range(6) self.assertNotEqual(sys.getsizeof(vars(a)), sys.getsizeof(vars(b))) a2 = A() self.assertEqual(sys.getsizeof(vars(a)), sys.getsizeof(vars(a2))) - self.assertLess(sys.getsizeof(vars(a)), sys.getsizeof({})) + self.assertLess(sys.getsizeof(vars(a)), sys.getsizeof({"a":1})) b.u, b.v, b.w, b.t, b.s, b.r = range(6) - self.assertLess(sys.getsizeof(vars(b)), sys.getsizeof({})) + self.assertLess(sys.getsizeof(vars(b)), sys.getsizeof({"a":1})) class DebugHelperMeta(type): diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 92aefd8d7af4..4bd54af3629c 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -982,8 +982,10 @@ def inner(): check(int.__add__, size('3P2P')) # method-wrapper (descriptor object) check({}.__iter__, size('2P')) + # empty dict + check({}, size('nQ2P')) # dict - check({}, size('nQ2P') + calcsize('2nP2n') + 8 + (8*2//3)*calcsize('n2P')) + check({"a": 1}, size('nQ2P') + calcsize('2nP2n') + 8 + (8*2//3)*calcsize('n2P')) longdict = {1:1, 2:2, 3:3, 4:4, 5:5, 6:6, 7:7, 8:8} check(longdict, size('nQ2P') + calcsize('2nP2n') + 16 + (16*2//3)*calcsize('n2P')) # dictionary-keyview diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-11-22-30-56.bpo-30040.W9z8X7.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-11-22-30-56.bpo-30040.W9z8X7.rst new file mode 100644 index 000000000000..eacba679d5a3 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-11-22-30-56.bpo-30040.W9z8X7.rst @@ -0,0 +1,2 @@ +New empty dict uses fewer memory for now. It used more memory than empty +dict created by ``dict.clear()``. Patch by Inada Naoki. diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 83cadda84c6d..108c6128ab1a 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -691,10 +691,8 @@ clone_combined_dict(PyDictObject *orig) PyObject * PyDict_New(void) { - PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE); - if (keys == NULL) - return NULL; - return new_dict(keys, NULL); + dictkeys_incref(Py_EMPTY_KEYS); + return new_dict(Py_EMPTY_KEYS, empty_values); } /* Search index of hash table from offset of entry table */ @@ -1276,6 +1274,9 @@ _PyDict_NewPresized(Py_ssize_t minused) Py_ssize_t newsize; PyDictKeysObject *new_keys; + if (minused == 0) { + return PyDict_New(); + } /* There are no strict guarantee that returned dict can contain minused * items without resize. So we create medium size dict instead of very * large dict or MemoryError. From webhook-mailer at python.org Tue Mar 12 04:27:49 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Tue, 12 Mar 2019 08:27:49 -0000 Subject: [Python-checkins] canonicalize "Inada Naoki" in ACKS and 3.8 News (GH-12286) Message-ID: https://github.com/python/cpython/commit/410aea1ebf2f56364369be3b477763ce78577c07 commit: 410aea1ebf2f56364369be3b477763ce78577c07 branch: master author: Inada Naoki committer: GitHub date: 2019-03-12T17:27:43+09:00 summary: canonicalize "Inada Naoki" in ACKS and 3.8 News (GH-12286) files: M Misc/ACKS M Misc/NEWS.d/next/Library/2019-03-01-16-10-01.bpo-36103.n6VgXL.rst diff --git a/Misc/ACKS b/Misc/ACKS index c9fa08bd6141..2026852db1a1 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -728,7 +728,6 @@ Aaron Iles Thomas Ilsche Lars Immisch Bobby Impollonia -Naoki Inada Meador Inge Peter Ingebretson Tony Ingraldi @@ -1130,6 +1129,7 @@ Dong-hee Na Dale Nagata John Nagle Takahiro Nakayama +Inada Naoki Travers Naran Motoki Naruse Charles-Fran?ois Natali diff --git a/Misc/NEWS.d/next/Library/2019-03-01-16-10-01.bpo-36103.n6VgXL.rst b/Misc/NEWS.d/next/Library/2019-03-01-16-10-01.bpo-36103.n6VgXL.rst index 97ed658d3762..9f7330597e7a 100644 --- a/Misc/NEWS.d/next/Library/2019-03-01-16-10-01.bpo-36103.n6VgXL.rst +++ b/Misc/NEWS.d/next/Library/2019-03-01-16-10-01.bpo-36103.n6VgXL.rst @@ -1,3 +1,3 @@ Default buffer size used by ``shutil.copyfileobj()`` is changed from 16 KiB to 64 KiB on non-Windows platform to reduce system call overhead. Contributed -by INADA Naoki. +by Inada Naoki. From webhook-mailer at python.org Tue Mar 12 05:17:26 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 12 Mar 2019 09:17:26 -0000 Subject: [Python-checkins] bpo-35132: Fixes missing target in gdb pep0393 check. (GH-11848) (GH-12284) Message-ID: https://github.com/python/cpython/commit/047f8f25b93e2649d234fa565a59383fceb40e16 commit: 047f8f25b93e2649d234fa565a59383fceb40e16 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Victor Stinner date: 2019-03-12T10:17:17+01:00 summary: bpo-35132: Fixes missing target in gdb pep0393 check. (GH-11848) (GH-12284) (cherry picked from commit 1ceb3a3d172dcf0ddff38d5d6b559443ad065b84) Co-authored-by: Lisa Roach files: A Misc/NEWS.d/next/Tools-Demos/2019-03-04-02-09-09.bpo-35132.1R_pnL.rst M Tools/gdb/libpython.py diff --git a/Misc/NEWS.d/next/Tools-Demos/2019-03-04-02-09-09.bpo-35132.1R_pnL.rst b/Misc/NEWS.d/next/Tools-Demos/2019-03-04-02-09-09.bpo-35132.1R_pnL.rst new file mode 100644 index 000000000000..d73452df429b --- /dev/null +++ b/Misc/NEWS.d/next/Tools-Demos/2019-03-04-02-09-09.bpo-35132.1R_pnL.rst @@ -0,0 +1 @@ +Fix py-list and py-bt commands of python-gdb.py on gdb7. \ No newline at end of file diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py index bfaa9403b787..d744cab7642a 100755 --- a/Tools/gdb/libpython.py +++ b/Tools/gdb/libpython.py @@ -1178,7 +1178,7 @@ def char_width(self): def proxyval(self, visited): global _is_pep393 if _is_pep393 is None: - fields = gdb.lookup_type('PyUnicodeObject').target().fields() + fields = gdb.lookup_type('PyUnicodeObject').fields() _is_pep393 = 'data' in [f.name for f in fields] if _is_pep393: # Python 3.3 and newer From webhook-mailer at python.org Tue Mar 12 11:40:22 2019 From: webhook-mailer at python.org (Steve Dower) Date: Tue, 12 Mar 2019 15:40:22 -0000 Subject: [Python-checkins] bpo-36264: Don't honor POSIX HOME in os.path.expanduser on Windows (GH-12282) Message-ID: https://github.com/python/cpython/commit/25ec4a45dcc36c8087f93bd1634b311613244fc6 commit: 25ec4a45dcc36c8087f93bd1634b311613244fc6 branch: master author: Anthony Sottile committer: Steve Dower date: 2019-03-12T08:39:57-07:00 summary: bpo-36264: Don't honor POSIX HOME in os.path.expanduser on Windows (GH-12282) files: A Misc/NEWS.d/next/Windows/2019-03-11-09-33-47.bpo-36264.rTzWce.rst M Lib/distutils/tests/test_config.py M Lib/distutils/tests/test_dist.py M Lib/ntpath.py M Lib/test/test_netrc.py M Lib/test/test_ntpath.py diff --git a/Lib/distutils/tests/test_config.py b/Lib/distutils/tests/test_config.py index 77ef788e2472..344084afb779 100644 --- a/Lib/distutils/tests/test_config.py +++ b/Lib/distutils/tests/test_config.py @@ -60,6 +60,7 @@ def setUp(self): super(BasePyPIRCCommandTestCase, self).setUp() self.tmp_dir = self.mkdtemp() os.environ['HOME'] = self.tmp_dir + os.environ['USERPROFILE'] = self.tmp_dir self.rc = os.path.join(self.tmp_dir, '.pypirc') self.dist = Distribution() diff --git a/Lib/distutils/tests/test_dist.py b/Lib/distutils/tests/test_dist.py index 0a19f0fb6274..cc34725a99ef 100644 --- a/Lib/distutils/tests/test_dist.py +++ b/Lib/distutils/tests/test_dist.py @@ -463,7 +463,7 @@ def test_custom_pydistutils(self): # win32-style if sys.platform == 'win32': # home drive should be found - os.environ['HOME'] = temp_dir + os.environ['USERPROFILE'] = temp_dir files = dist.find_config_files() self.assertIn(user_filename, files, '%r not found in %r' % (user_filename, files)) diff --git a/Lib/ntpath.py b/Lib/ntpath.py index 11bb297e16bf..b5e1d121fc57 100644 --- a/Lib/ntpath.py +++ b/Lib/ntpath.py @@ -299,9 +299,7 @@ def expanduser(path): while i < n and path[i] not in _get_bothseps(path): i += 1 - if 'HOME' in os.environ: - userhome = os.environ['HOME'] - elif 'USERPROFILE' in os.environ: + if 'USERPROFILE' in os.environ: userhome = os.environ['USERPROFILE'] elif not 'HOMEPATH' in os.environ: return path diff --git a/Lib/test/test_netrc.py b/Lib/test/test_netrc.py index ae53988c45a6..7ce7e565704f 100644 --- a/Lib/test/test_netrc.py +++ b/Lib/test/test_netrc.py @@ -154,6 +154,7 @@ def fake_expanduser(s): called.append(s) with support.EnvironmentVarGuard() as environ: environ.set('HOME', fake_home) + environ.set('USERPROFILE', fake_home) result = orig_expanduser(s) return result diff --git a/Lib/test/test_ntpath.py b/Lib/test/test_ntpath.py index 223e50f12c6d..fc2398c2d518 100644 --- a/Lib/test/test_ntpath.py +++ b/Lib/test/test_ntpath.py @@ -262,20 +262,21 @@ def test_expanduser(self): env['USERPROFILE'] = 'C:\\eric\\idle' tester('ntpath.expanduser("~test")', 'C:\\eric\\test') tester('ntpath.expanduser("~")', 'C:\\eric\\idle') - - env.clear() - env['HOME'] = 'C:\\idle\\eric' - tester('ntpath.expanduser("~test")', 'C:\\idle\\test') - tester('ntpath.expanduser("~")', 'C:\\idle\\eric') - tester('ntpath.expanduser("~test\\foo\\bar")', - 'C:\\idle\\test\\foo\\bar') + 'C:\\eric\\test\\foo\\bar') tester('ntpath.expanduser("~test/foo/bar")', - 'C:\\idle\\test/foo/bar') + 'C:\\eric\\test/foo/bar') tester('ntpath.expanduser("~\\foo\\bar")', - 'C:\\idle\\eric\\foo\\bar') + 'C:\\eric\\idle\\foo\\bar') tester('ntpath.expanduser("~/foo/bar")', - 'C:\\idle\\eric/foo/bar') + 'C:\\eric\\idle/foo/bar') + + # bpo-36264: ignore `HOME` when set on windows + env.clear() + env['HOME'] = 'F:\\' + env['USERPROFILE'] = 'C:\\eric\\idle' + tester('ntpath.expanduser("~test")', 'C:\\eric\\test') + tester('ntpath.expanduser("~")', 'C:\\eric\\idle') @unittest.skipUnless(nt, "abspath requires 'nt' module") def test_abspath(self): diff --git a/Misc/NEWS.d/next/Windows/2019-03-11-09-33-47.bpo-36264.rTzWce.rst b/Misc/NEWS.d/next/Windows/2019-03-11-09-33-47.bpo-36264.rTzWce.rst new file mode 100644 index 000000000000..aae598658116 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-03-11-09-33-47.bpo-36264.rTzWce.rst @@ -0,0 +1,2 @@ +Don't honor POSIX ``HOME`` in ``os.path.expanduser`` on windows. Patch by +Anthony Sottile. From webhook-mailer at python.org Tue Mar 12 12:20:51 2019 From: webhook-mailer at python.org (Ned Deily) Date: Tue, 12 Mar 2019 16:20:51 -0000 Subject: [Python-checkins] Minor edits to news entries for 3.7.3 (GH-12292) Message-ID: https://github.com/python/cpython/commit/e6183cc2742cfa7e7d627a3c573f4fb31099947a commit: e6183cc2742cfa7e7d627a3c573f4fb31099947a branch: 3.7 author: Ned Deily committer: GitHub date: 2019-03-12T12:20:44-04:00 summary: Minor edits to news entries for 3.7.3 (GH-12292) files: A Misc/NEWS.d/next/IDLE/2018-12-21-18-44-30.bpo-35555.M58_K3.rst D Misc/NEWS.d/next/macOS/2018-12-21-18-44-30.bpo-35555.M58_K3.rst M Misc/NEWS.d/next/Core and Builtins/2019-02-18-09-30-55.bpo-35942.oLhL2v.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-02-18-09-30-55.bpo-35942.oLhL2v.rst b/Misc/NEWS.d/next/Core and Builtins/2019-02-18-09-30-55.bpo-35942.oLhL2v.rst index 6ad4c0df2a81..ed7432806589 100644 --- a/Misc/NEWS.d/next/Core and Builtins/2019-02-18-09-30-55.bpo-35942.oLhL2v.rst +++ b/Misc/NEWS.d/next/Core and Builtins/2019-02-18-09-30-55.bpo-35942.oLhL2v.rst @@ -1,3 +1,3 @@ -The error message emmited when returning invalid types from ``__fspath__`` +The error message emitted when returning invalid types from ``__fspath__`` in interfaces that allow passing :class:`~os.PathLike` objects has been improved and now it does explain the origin of the error. diff --git a/Misc/NEWS.d/next/IDLE/2018-12-21-18-44-30.bpo-35555.M58_K3.rst b/Misc/NEWS.d/next/IDLE/2018-12-21-18-44-30.bpo-35555.M58_K3.rst new file mode 100644 index 000000000000..8fcf3f238977 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2018-12-21-18-44-30.bpo-35555.M58_K3.rst @@ -0,0 +1,2 @@ + +Gray out Code Context menu entry on macOS when it's not applicable. diff --git a/Misc/NEWS.d/next/macOS/2018-12-21-18-44-30.bpo-35555.M58_K3.rst b/Misc/NEWS.d/next/macOS/2018-12-21-18-44-30.bpo-35555.M58_K3.rst deleted file mode 100644 index 0939195cadd3..000000000000 --- a/Misc/NEWS.d/next/macOS/2018-12-21-18-44-30.bpo-35555.M58_K3.rst +++ /dev/null @@ -1 +0,0 @@ -Gray out Code Context menu entry when it's not applicable. From webhook-mailer at python.org Tue Mar 12 12:21:28 2019 From: webhook-mailer at python.org (Ned Deily) Date: Tue, 12 Mar 2019 16:21:28 -0000 Subject: [Python-checkins] Minor edits to news entries (ported from 3.7) (GH-12293) Message-ID: https://github.com/python/cpython/commit/f45813df52207ae870fda86475976a9b42857592 commit: f45813df52207ae870fda86475976a9b42857592 branch: master author: Ned Deily committer: GitHub date: 2019-03-12T12:21:22-04:00 summary: Minor edits to news entries (ported from 3.7) (GH-12293) files: M Misc/NEWS.d/3.8.0a1.rst M Misc/NEWS.d/3.8.0a2.rst diff --git a/Misc/NEWS.d/3.8.0a1.rst b/Misc/NEWS.d/3.8.0a1.rst index b838965b69f2..47feb2bb268f 100644 --- a/Misc/NEWS.d/3.8.0a1.rst +++ b/Misc/NEWS.d/3.8.0a1.rst @@ -7954,15 +7954,6 @@ prevent it from truncating the last character. .. -.. bpo: 35555 -.. date: 2018-12-21-18-44-30 -.. nonce: M58_K3 -.. section: macOS - -Gray out Code Context menu entry when it's not applicable. - -.. - .. bpo: 35401 .. date: 2018-12-09-13-56-49 .. nonce: n8B7X1 @@ -8167,6 +8158,15 @@ Squeezer now properly counts wrapped lines before newlines. .. +.. bpo: 35555 +.. date: 2018-12-21-18-44-30 +.. nonce: M58_K3 +.. section: IDLE + +Gray out Code Context menu entry on macOS when it's not applicable. + +.. + .. bpo: 35521 .. date: 2018-12-20-00-14-15 .. nonce: x32BRn diff --git a/Misc/NEWS.d/3.8.0a2.rst b/Misc/NEWS.d/3.8.0a2.rst index 4bf2269e064c..1c0abab4c474 100644 --- a/Misc/NEWS.d/3.8.0a2.rst +++ b/Misc/NEWS.d/3.8.0a2.rst @@ -24,7 +24,7 @@ updated, there was an unnecessary call to update slots. .. nonce: oLhL2v .. section: Core and Builtins -The error message emmited when returning invalid types from ``__fspath__`` +The error message emitted when returning invalid types from ``__fspath__`` in interfaces that allow passing :class:`~os.PathLike` objects has been improved and now it does explain the origin of the error. From webhook-mailer at python.org Tue Mar 12 16:52:04 2019 From: webhook-mailer at python.org (Steve Dower) Date: Tue, 12 Mar 2019 20:52:04 -0000 Subject: [Python-checkins] [3.7] bpo-36216: Only print test messages when verbose (GH-12291) Message-ID: https://github.com/python/cpython/commit/507bd8cde60ced74d13a1ffa883bb9b0e73c38be commit: 507bd8cde60ced74d13a1ffa883bb9b0e73c38be branch: 2.7 author: Steve Dower committer: GitHub date: 2019-03-12T13:51:58-07:00 summary: [3.7] bpo-36216: Only print test messages when verbose (GH-12291) files: M Lib/test/test_urlparse.py diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index 73b0228ea8e3..1830d0b28688 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -644,7 +644,8 @@ def test_urlsplit_normalization(self): for scheme in [u"http", u"https", u"ftp"]: for c in denorm_chars: url = u"{}://netloc{}false.netloc/path".format(scheme, c) - print "Checking %r" % url + if test_support.verbose: + print "Checking %r" % url with self.assertRaises(ValueError): urlparse.urlsplit(url) From webhook-mailer at python.org Tue Mar 12 18:13:26 2019 From: webhook-mailer at python.org (Ned Deily) Date: Tue, 12 Mar 2019 22:13:26 -0000 Subject: [Python-checkins] 3.7.3rc1 Message-ID: https://github.com/python/cpython/commit/69785b212765f0943eb4611e1886436bdd01ade0 commit: 69785b212765f0943eb4611e1886436bdd01ade0 branch: 3.7 author: Ned Deily committer: Ned Deily date: 2019-03-12T15:14:21-04:00 summary: 3.7.3rc1 files: A Misc/NEWS.d/3.7.3rc1.rst D Misc/NEWS.d/next/Build/2018-12-05-22-28-40.bpo-35257.dmcd_s.rst D Misc/NEWS.d/next/Build/2018-12-14-19-36-05.bpo-35499.9yAldM.rst D Misc/NEWS.d/next/Build/2018-12-29-10-19-43.bpo-35550.BTuu8e.rst D Misc/NEWS.d/next/Build/2019-01-02-11-23-33.bpo-35642.pjkhJe.rst D Misc/NEWS.d/next/Build/2019-01-10-11-37-18.bpo-35683.pf5Oos.rst D Misc/NEWS.d/next/Build/2019-02-02-13-34-05.bpo-34691.B-Lsj4.rst D Misc/NEWS.d/next/C API/2018-11-22-13-52-36.bpo-35259.p07c61.rst D Misc/NEWS.d/next/C API/2019-01-11-11-16-16.bpo-33817.nJ4yIj.rst D Misc/NEWS.d/next/Core and Builtins/2018-08-08-20-52-55.bpo-33989.TkLBui.rst D Misc/NEWS.d/next/Core and Builtins/2018-12-15-14-01-45.bpo-35504.JtKczP.rst D Misc/NEWS.d/next/Core and Builtins/2018-12-21-13-29-30.bpo-35552.1DzQQc.rst D Misc/NEWS.d/next/Core and Builtins/2018-12-22-22-19-51.bpo-35560.9vMWSP.rst D Misc/NEWS.d/next/Core and Builtins/2018-12-30-15-36-23.bpo-35214.GWDQcv.rst D Misc/NEWS.d/next/Core and Builtins/2018-12-31-02-37-20.bpo-35623.24AQhY.rst D Misc/NEWS.d/next/Core and Builtins/2019-01-12-23-33-04.bpo-35720.LELKQx.rst D Misc/NEWS.d/next/Core and Builtins/2019-01-22-02-06-39.bpo-31506.eJ5FpV.rst D Misc/NEWS.d/next/Core and Builtins/2019-02-12-20-16-34.bpo-35961.7f7Sne.rst D Misc/NEWS.d/next/Core and Builtins/2019-02-14-00-00-30.bpo-35991.xlbfSk.rst D Misc/NEWS.d/next/Core and Builtins/2019-02-14-12-01-44.bpo-35992.nG9e2L.rst D Misc/NEWS.d/next/Core and Builtins/2019-02-18-09-30-55.bpo-35942.oLhL2v.rst D Misc/NEWS.d/next/Documentation/2018-07-28-12-41-01.bpo-22062.TaN2hn.rst D Misc/NEWS.d/next/Documentation/2018-11-21-23-01-37.bpo-21314.PG33VT.rst D Misc/NEWS.d/next/Documentation/2018-12-23-23-52-31.bpo-34764.DwOGeT.rst D Misc/NEWS.d/next/Documentation/2019-02-24-12-40-13.bpo-36083.JX7zbv.rst D Misc/NEWS.d/next/IDLE/2018-12-18-13-56-31.bpo-22703.UlsjKQ.rst D Misc/NEWS.d/next/IDLE/2018-12-20-00-14-15.bpo-35521.x32BRn.rst D Misc/NEWS.d/next/IDLE/2018-12-21-18-44-30.bpo-35555.M58_K3.rst D Misc/NEWS.d/next/IDLE/2018-12-23-17-42-11.bpo-35208.J5NOg7.rst D Misc/NEWS.d/next/IDLE/2018-12-26-13-53-34.bpo-28097.95I9NT.rst D Misc/NEWS.d/next/IDLE/2018-12-27-15-29-11.bpo-35598.FWOOm8.rst D Misc/NEWS.d/next/IDLE/2018-12-27-17-46-42.bpo-35196.9E-xUh.rst D Misc/NEWS.d/next/IDLE/2018-12-28-01-19-20.bpo-35591.SFpDj2.rst D Misc/NEWS.d/next/IDLE/2018-12-28-17-16-33.bpo-34055.TmmpzR.rst D Misc/NEWS.d/next/IDLE/2018-12-31-17-04-18.bpo-33987.fD92up.rst D Misc/NEWS.d/next/IDLE/2019-01-02-22-15-01.bpo-35641.QEaANl.rst D Misc/NEWS.d/next/IDLE/2019-01-04-19-14-29.bpo-35660.hMxI7N.rst D Misc/NEWS.d/next/IDLE/2019-01-08-17-51-44.bpo-35689.LlaqR8.rst D Misc/NEWS.d/next/IDLE/2019-01-18-01-24-23.bpo-35769.GqsB34.rst D Misc/NEWS.d/next/IDLE/2019-01-18-13-04-30.bpo-35770.2LxJGu.rst D Misc/NEWS.d/next/IDLE/2019-02-08-22-14-24.bpo-35833.XKFRvF.rst D Misc/NEWS.d/next/IDLE/2019-02-23-17-53-53.bpo-36096.mN5Ly3.rst D Misc/NEWS.d/next/IDLE/2019-02-23-22-31-20.bpo-24310.j_vJQl.rst D Misc/NEWS.d/next/IDLE/2019-02-25-11-40-14.bpo-32129.4qVCzD.rst D Misc/NEWS.d/next/IDLE/2019-02-28-18-52-40.bpo-36152.9pkHIU.rst D Misc/NEWS.d/next/IDLE/2019-03-10-00-07-46.bpo-36176.jk_vv6.rst D Misc/NEWS.d/next/Library/2018-02-25-10-17-23.bpo-32146.xOzUFW.rst D Misc/NEWS.d/next/Library/2018-06-10-14-08-52.bpo-33687.1zZdnA.rst D Misc/NEWS.d/next/Library/2018-08-15-16-22-30.bpo-31715.Iw8jS8.rst D Misc/NEWS.d/next/Library/2018-09-05-03-02-32.bpo-34572.ayisd2.rst D Misc/NEWS.d/next/Library/2018-10-04-15-53-14.bpo-28441.2sQENe.rst D Misc/NEWS.d/next/Library/2018-11-09-12-45-28.bpo-35198.EJ8keW.rst D Misc/NEWS.d/next/Library/2018-11-22-15-22-56.bpo-24746.eSLKBE.rst D Misc/NEWS.d/next/Library/2018-11-29-09-38-40.bpo-35066.Nwej2s.rst D Misc/NEWS.d/next/Library/2018-12-05-17-42-49.bpo-10496.laV_IE.rst D Misc/NEWS.d/next/Library/2018-12-09-17-04-15.bpo-17185.SfSCJF.rst D Misc/NEWS.d/next/Library/2018-12-09-21-35-49.bpo-20239.V4mWBL.rst D Misc/NEWS.d/next/Library/2018-12-12-22-52-34.bpo-31446.l--Fjz.rst D Misc/NEWS.d/next/Library/2018-12-14-23-56-48.bpo-35502.gLHuFS.rst D Misc/NEWS.d/next/Library/2018-12-16-23-28-49.bpo-35513.pn-Zh3.rst D Misc/NEWS.d/next/Library/2018-12-21-09-54-30.bpo-21478.5gsXtc.rst D Misc/NEWS.d/next/Library/2018-12-26-02-28-00.bpo-35585.Lkzd3Z.rst D Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst D Misc/NEWS.d/next/Library/2018-12-30-14-56-33.bpo-28503.V4kNN3.rst D Misc/NEWS.d/next/Library/2018-12-30-20-00-05.bpo-35615.Uz1SVh.rst D Misc/NEWS.d/next/Library/2019-01-02-20-04-49.bpo-35643.DaMiaV.rst D Misc/NEWS.d/next/Library/2019-01-07-17-17-16.bpo-35283.WClosC.rst D Misc/NEWS.d/next/Library/2019-01-08-01-54-02.bpo-35682.KDM9lk.rst D Misc/NEWS.d/next/Library/2019-01-08-14-00-52.bpo-32710.Sn5Ujj.rst D Misc/NEWS.d/next/Library/2019-01-10-15-55-10.bpo-32710.KwECPu.rst D Misc/NEWS.d/next/Library/2019-01-11-07-09-25.bpo-35699.VDiENF.rst D Misc/NEWS.d/next/Library/2019-01-11-17-56-15.bpo-35717.6TDTB_.rst D Misc/NEWS.d/next/Library/2019-01-14-11-53-10.bpo-34294.3JFdg2.rst D Misc/NEWS.d/next/Library/2019-01-14-17-34-36.bpo-34323.CRErrt.rst D Misc/NEWS.d/next/Library/2019-01-15-13-31-30.bpo-23846.LT_qL8.rst D Misc/NEWS.d/next/Library/2019-01-19-17-01-43.bpo-35780.CLf7fT.rst D Misc/NEWS.d/next/Library/2019-01-29-09-11-09.bpo-35847.eiSi4t.rst D Misc/NEWS.d/next/Library/2019-02-10-20-57-12.bpo-35960.bh-6Ja.rst D Misc/NEWS.d/next/Library/2019-02-11-16-23-10.bpo-35918.oGDlpT.rst D Misc/NEWS.d/next/Library/2019-02-16-07-11-02.bpo-35899.cjfn5a.rst D Misc/NEWS.d/next/Library/2019-02-23-06-49-06.bpo-36091.26o4Lc.rst D Misc/NEWS.d/next/Library/2019-02-24-00-04-10.bpo-35512.eWDjCJ.rst D Misc/NEWS.d/next/Library/2019-02-25-13-21-43.bpo-36106.VuhEiQ.rst D Misc/NEWS.d/next/Library/2019-02-25-23-04-00.bpo-35178.NA_rXa.rst D Misc/NEWS.d/next/Library/2019-03-04-10-42-46.bpo-36179.jEyuI-.rst D Misc/NEWS.d/next/Library/2019-03-06-13-21-33.bpo-35807.W7mmu3.rst D Misc/NEWS.d/next/Library/2019-03-09-18-01-24.bpo-36251.zOp9l0.rst D Misc/NEWS.d/next/Library/2019-03-11-22-06-36.bpo-35931.Qp_Tbe.rst D Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst D Misc/NEWS.d/next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst D Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst D Misc/NEWS.d/next/Tests/2018-12-10-13-18-37.bpo-26704.DBAN4c.rst D Misc/NEWS.d/next/Tests/2018-12-12-18-07-58.bpo-35412.kbuJor.rst D Misc/NEWS.d/next/Tests/2018-12-12-18-20-18.bpo-34279.DhKcuP.rst D Misc/NEWS.d/next/Tests/2018-12-16-23-36-47.bpo-35513.k4WHlA.rst D Misc/NEWS.d/next/Tests/2018-12-17-16-41-45.bpo-35519.RR3L_w.rst D Misc/NEWS.d/next/Tests/2018-12-18-22-36-53.bpo-35424.1Pz4IS.rst D Misc/NEWS.d/next/Tests/2018-12-18-23-20-39.bpo-31731.tcv85C.rst D Misc/NEWS.d/next/Tests/2019-01-10-18-35-42.bpo-35045.qdd6d9.rst D Misc/NEWS.d/next/Tests/2019-01-18-12-19-19.bpo-35772.sGBbsn.rst D Misc/NEWS.d/next/Tests/2019-02-06-18-06-16.bpo-35917.-Clv1L.rst D Misc/NEWS.d/next/Tests/2019-02-12-01-33-08.bpo-35505.N9ba_K.rst D Misc/NEWS.d/next/Tests/2019-02-19-15-21-14.bpo-36037.75wG9_.rst D Misc/NEWS.d/next/Tests/2019-02-21-14-23-51.bpo-36019.zS_OUi.rst D Misc/NEWS.d/next/Tests/2019-02-24-01-58-38.bpo-27313.Sj9veH.rst D Misc/NEWS.d/next/Tests/2019-02-26-12-51-35.bpo-36123.QRhhRS.rst D Misc/NEWS.d/next/Tests/2019-03-05-13-48-39.bpo-29571.ecGuKR.rst D Misc/NEWS.d/next/Tests/2019-03-08-12-53-37.bpo-36234.NRVK6W.rst D Misc/NEWS.d/next/Tools-Demos/2019-03-04-02-09-09.bpo-35132.1R_pnL.rst D Misc/NEWS.d/next/Windows/2017-11-24-12-53-54.bpo-1104.1CWSZp.rst D Misc/NEWS.d/next/Windows/2018-04-20-03-24-07.bpo-33316.9IiJ8J.rst D Misc/NEWS.d/next/Windows/2018-12-13-13-30-04.bpo-35402.n_mXb2.rst D Misc/NEWS.d/next/Windows/2018-12-28-07-25-47.bpo-35596.P9CEY2.rst D Misc/NEWS.d/next/Windows/2019-01-08-13-56-01.bpo-35596.oFvhcm.rst D Misc/NEWS.d/next/Windows/2019-01-12-16-52-38.bpo-29734.6_OJwI.rst D Misc/NEWS.d/next/Windows/2019-01-25-12-29-14.bpo-35797.MzyOK9.rst D Misc/NEWS.d/next/Windows/2019-01-25-12-46-36.bpo-35811.2hU-mm.rst D Misc/NEWS.d/next/Windows/2019-01-29-15-44-46.bpo-35854.Ww3z19.rst D Misc/NEWS.d/next/Windows/2019-02-02-11-02-44.bpo-32560.I5WAGW.rst D Misc/NEWS.d/next/Windows/2019-02-02-14-47-12.bpo-35299.1rgEzd.rst D Misc/NEWS.d/next/Windows/2019-02-02-15-56-50.bpo-35873.UW-qS9.rst D Misc/NEWS.d/next/Windows/2019-02-02-15-57-19.bpo-35872.Bba2n7.rst D Misc/NEWS.d/next/Windows/2019-02-02-16-23-57.bpo-35692.cIiiE9.rst D Misc/NEWS.d/next/Windows/2019-02-24-07-52-39.bpo-24643.PofyiS.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 5bd68345d677..57775f2e5d01 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -18,12 +18,12 @@ /*--start constants--*/ #define PY_MAJOR_VERSION 3 #define PY_MINOR_VERSION 7 -#define PY_MICRO_VERSION 2 -#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL -#define PY_RELEASE_SERIAL 0 +#define PY_MICRO_VERSION 3 +#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_GAMMA +#define PY_RELEASE_SERIAL 1 /* Version as a string */ -#define PY_VERSION "3.7.2+" +#define PY_VERSION "3.7.3rc1" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index 55fb1199f896..d9cd501e755a 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Sun Dec 23 16:24:58 2018 +# Autogenerated by Sphinx on Tue Mar 12 14:56:48 2019 topics = {'assert': 'The "assert" statement\n' '**********************\n' '\n' @@ -351,9 +351,9 @@ 'Annotated assignment statements\n' '===============================\n' '\n' - 'Annotation assignment is the combination, in a single ' - 'statement, of a\n' - 'variable or attribute annotation and an optional assignment ' + '*Annotation* assignment is the combination, in a single ' + 'statement, of\n' + 'a variable or attribute annotation and an optional assignment\n' 'statement:\n' '\n' ' annotated_assignment_stmt ::= augtarget ":" expression ["=" ' @@ -962,7 +962,8 @@ 'in a parent.)\n' '\n' 'The space saved over using *__dict__* can be ' - 'significant.\n' + 'significant. Attribute\n' + 'lookup speed can be significantly improved as well.\n' '\n' 'object.__slots__\n' '\n' @@ -2667,30 +2668,31 @@ 'passed\n' 'used keyword arguments.\n' '\n' - 'Parameters may have annotations of the form ?": expression"? ' - 'following\n' - 'the parameter name. Any parameter may have an annotation even ' - 'those\n' - 'of the form "*identifier" or "**identifier". Functions may ' - 'have\n' - '?return? annotation of the form ?"-> expression"? after the ' - 'parameter\n' - 'list. These annotations can be any valid Python expression. ' - 'The\n' - 'presence of annotations does not change the semantics of a ' - 'function.\n' - 'The annotation values are available as values of a dictionary ' - 'keyed by\n' - 'the parameters? names in the "__annotations__" attribute of the\n' - 'function object. If the "annotations" import from "__future__" ' - 'is\n' - 'used, annotations are preserved as strings at runtime which ' - 'enables\n' - 'postponed evaluation. Otherwise, they are evaluated when the ' - 'function\n' - 'definition is executed. In this case annotations may be ' - 'evaluated in\n' - 'a different order than they appear in the source code.\n' + 'Parameters may have an *annotation* of the form ?": ' + 'expression"?\n' + 'following the parameter name. Any parameter may have an ' + 'annotation,\n' + 'even those of the form "*identifier" or "**identifier". ' + 'Functions may\n' + 'have ?return? annotation of the form ?"-> expression"? after ' + 'the\n' + 'parameter list. These annotations can be any valid Python ' + 'expression.\n' + 'The presence of annotations does not change the semantics of a\n' + 'function. The annotation values are available as values of a\n' + 'dictionary keyed by the parameters? names in the ' + '"__annotations__"\n' + 'attribute of the function object. If the "annotations" import ' + 'from\n' + '"__future__" is used, annotations are preserved as strings at ' + 'runtime\n' + 'which enables postponed evaluation. Otherwise, they are ' + 'evaluated\n' + 'when the function definition is executed. In this case ' + 'annotations\n' + 'may be evaluated in a different order than they appear in the ' + 'source\n' + 'code.\n' '\n' 'It is also possible to create anonymous functions (functions not ' 'bound\n' @@ -3612,6 +3614,10 @@ 'running\n' 'without the debugger using the "continue" command.\n' '\n' + 'New in version 3.7: The built-in "breakpoint()", when called ' + 'with\n' + 'defaults, can be used instead of "import pdb; pdb.set_trace()".\n' + '\n' 'The typical usage to inspect a crashed program is:\n' '\n' ' >>> import pdb\n' @@ -5690,30 +5696,31 @@ 'passed\n' 'used keyword arguments.\n' '\n' - 'Parameters may have annotations of the form ?": expression"? ' - 'following\n' - 'the parameter name. Any parameter may have an annotation even ' - 'those\n' - 'of the form "*identifier" or "**identifier". Functions may ' - 'have\n' - '?return? annotation of the form ?"-> expression"? after the ' - 'parameter\n' - 'list. These annotations can be any valid Python expression. ' - 'The\n' - 'presence of annotations does not change the semantics of a ' - 'function.\n' - 'The annotation values are available as values of a dictionary ' - 'keyed by\n' - 'the parameters? names in the "__annotations__" attribute of the\n' - 'function object. If the "annotations" import from "__future__" ' - 'is\n' - 'used, annotations are preserved as strings at runtime which ' - 'enables\n' - 'postponed evaluation. Otherwise, they are evaluated when the ' - 'function\n' - 'definition is executed. In this case annotations may be ' - 'evaluated in\n' - 'a different order than they appear in the source code.\n' + 'Parameters may have an *annotation* of the form ?": ' + 'expression"?\n' + 'following the parameter name. Any parameter may have an ' + 'annotation,\n' + 'even those of the form "*identifier" or "**identifier". ' + 'Functions may\n' + 'have ?return? annotation of the form ?"-> expression"? after ' + 'the\n' + 'parameter list. These annotations can be any valid Python ' + 'expression.\n' + 'The presence of annotations does not change the semantics of a\n' + 'function. The annotation values are available as values of a\n' + 'dictionary keyed by the parameters? names in the ' + '"__annotations__"\n' + 'attribute of the function object. If the "annotations" import ' + 'from\n' + '"__future__" is used, annotations are preserved as strings at ' + 'runtime\n' + 'which enables postponed evaluation. Otherwise, they are ' + 'evaluated\n' + 'when the function definition is executed. In this case ' + 'annotations\n' + 'may be evaluated in a different order than they appear in the ' + 'source\n' + 'code.\n' '\n' 'It is also possible to create anonymous functions (functions not ' 'bound\n' @@ -8566,7 +8573,9 @@ '(unless explicitly declared in *__slots__* or available in a ' 'parent.)\n' '\n' - 'The space saved over using *__dict__* can be significant.\n' + 'The space saved over using *__dict__* can be significant. ' + 'Attribute\n' + 'lookup speed can be significantly improved as well.\n' '\n' 'object.__slots__\n' '\n' @@ -11555,7 +11564,7 @@ 'Modules\n' ' Modules are a basic organizational unit of Python code, and are\n' ' created by the import system as invoked either by the "import"\n' - ' statement (see "import"), or by calling functions such as\n' + ' statement, or by calling functions such as\n' ' "importlib.import_module()" and built-in "__import__()". A ' 'module\n' ' object has a namespace implemented by a dictionary object (this ' @@ -12147,11 +12156,11 @@ '\n' ' Return a shallow copy of the dictionary.\n' '\n' - ' classmethod fromkeys(seq[, value])\n' + ' classmethod fromkeys(iterable[, value])\n' '\n' - ' Create a new dictionary with keys from *seq* and ' - 'values set to\n' - ' *value*.\n' + ' Create a new dictionary with keys from *iterable* and ' + 'values set\n' + ' to *value*.\n' '\n' ' "fromkeys()" is a class method that returns a new ' 'dictionary.\n' diff --git a/Misc/NEWS.d/3.7.3rc1.rst b/Misc/NEWS.d/3.7.3rc1.rst new file mode 100644 index 000000000000..4ddf900a7e58 --- /dev/null +++ b/Misc/NEWS.d/3.7.3rc1.rst @@ -0,0 +1,1239 @@ +.. bpo: 36216 +.. date: 2019-03-06-09-38-40 +.. nonce: 6q1m4a +.. release date: 2019-03-12 +.. section: Security + +Changes urlsplit() to raise ValueError when the URL contains characters that +decompose under IDNA encoding (NFKC-normalization) into characters that +affect how the URL is parsed. + +.. + +.. bpo: 35746 +.. date: 2019-01-15-18-16-05 +.. nonce: nMSd0j +.. section: Security + +[CVE-2019-5010] Fix a NULL pointer deref in ssl module. The cert parser did +not handle CRL distribution points with empty DP or URI correctly. A +malicious or buggy certificate can result into segfault. Vulnerability +(TALOS-2018-0758) reported by Colin Read and Nicolas Edet of Cisco. + +.. + +.. bpo: 35121 +.. date: 2018-10-31-15-39-17 +.. nonce: EgHv9k +.. section: Security + +Don't send cookies of domain A without Domain attribute to domain B when +domain A is a suffix match of domain B while using a cookiejar with +:class:`http.cookiejar.DefaultCookiePolicy` policy. Patch by Karthikeyan +Singaravelan. + +.. + +.. bpo: 35942 +.. date: 2019-02-18-09-30-55 +.. nonce: oLhL2v +.. section: Core and Builtins + +The error message emitted when returning invalid types from ``__fspath__`` +in interfaces that allow passing :class:`~os.PathLike` objects has been +improved and now it does explain the origin of the error. + +.. + +.. bpo: 35992 +.. date: 2019-02-14-12-01-44 +.. nonce: nG9e2L +.. section: Core and Builtins + +Fix ``__class_getitem__()`` not being called on a class with a custom +non-subscriptable metaclass. + +.. + +.. bpo: 35991 +.. date: 2019-02-14-00-00-30 +.. nonce: xlbfSk +.. section: Core and Builtins + +Fix a potential double free in Modules/_randommodule.c. + +.. + +.. bpo: 35961 +.. date: 2019-02-12-20-16-34 +.. nonce: 7f7Sne +.. section: Core and Builtins + +Fix a crash in slice_richcompare(): use strong references rather than stolen +references for the two temporary internal tuples. + +.. + +.. bpo: 31506 +.. date: 2019-01-22-02-06-39 +.. nonce: eJ5FpV +.. section: Core and Builtins + +Clarify the errors reported when ``object.__new__`` and ``object.__init__`` +receive more than one argument. Contributed by Sanyam Khurana. + +.. + +.. bpo: 35720 +.. date: 2019-01-12-23-33-04 +.. nonce: LELKQx +.. section: Core and Builtins + +Fixed a minor memory leak in pymain_parse_cmdline_impl function in +Modules/main.c + +.. + +.. bpo: 35623 +.. date: 2018-12-31-02-37-20 +.. nonce: 24AQhY +.. section: Core and Builtins + +Fix a crash when sorting very long lists. Patch by Stephan Hohe. + +.. + +.. bpo: 35214 +.. date: 2018-12-30-15-36-23 +.. nonce: GWDQcv +.. section: Core and Builtins + +clang Memory Sanitizer build instrumentation was added to work around false +positives from posix, socket, time, test_io, and test_faulthandler. + +.. + +.. bpo: 35560 +.. date: 2018-12-22-22-19-51 +.. nonce: 9vMWSP +.. section: Core and Builtins + +Fix an assertion error in :func:`format` in debug build for floating point +formatting with "n" format, zero padding and small width. Release build is +not impacted. Patch by Karthikeyan Singaravelan. + +.. + +.. bpo: 35552 +.. date: 2018-12-21-13-29-30 +.. nonce: 1DzQQc +.. section: Core and Builtins + +Format characters ``%s`` and ``%V`` in :c:func:`PyUnicode_FromFormat` and +``%s`` in :c:func:`PyBytes_FromFormat` no longer read memory past the limit +if *precision* is specified. + +.. + +.. bpo: 35504 +.. date: 2018-12-15-14-01-45 +.. nonce: JtKczP +.. section: Core and Builtins + +Fix segfaults and :exc:`SystemError`\ s when deleting certain attributes. +Patch by Zackery Spytz. + +.. + +.. bpo: 33989 +.. date: 2018-08-08-20-52-55 +.. nonce: TkLBui +.. section: Core and Builtins + +Fix a possible crash in :meth:`list.sort` when sorting objects with +``ob_type->tp_richcompare == NULL``. Patch by Zackery Spytz. + +.. + +.. bpo: 35931 +.. date: 2019-03-11-22-06-36 +.. nonce: Qp_Tbe +.. section: Library + +The :mod:`pdb` ``debug`` command now gracefully handles all exceptions. + +.. + +.. bpo: 36251 +.. date: 2019-03-09-18-01-24 +.. nonce: zOp9l0 +.. section: Library + +Fix format strings used for stderrprinter and re.Match reprs. Patch by +Stephan Hohe. + +.. + +.. bpo: 35807 +.. date: 2019-03-06-13-21-33 +.. nonce: W7mmu3 +.. section: Library + +Update ensurepip to install pip 19.0.3 and setuptools 40.8.0. + +.. + +.. bpo: 36179 +.. date: 2019-03-04-10-42-46 +.. nonce: jEyuI- +.. section: Library + +Fix two unlikely reference leaks in _hashopenssl. The leaks only occur in +out-of-memory cases. + +.. + +.. bpo: 35178 +.. date: 2019-02-25-23-04-00 +.. nonce: NA_rXa +.. section: Library + +Ensure custom :func:`warnings.formatwarning` function can receive `line` as +positional argument. Based on patch by Tashrif Billah. + +.. + +.. bpo: 36106 +.. date: 2019-02-25-13-21-43 +.. nonce: VuhEiQ +.. section: Library + +Resolve potential name clash with libm's sinpi(). Patch by Dmitrii +Pasechnik. + +.. + +.. bpo: 35512 +.. date: 2019-02-24-00-04-10 +.. nonce: eWDjCJ +.. section: Library + +:func:`unittest.mock.patch.dict` used as a decorator with string target +resolves the target during function call instead of during decorator +construction. Patch by Karthikeyan Singaravelan. + +.. + +.. bpo: 36091 +.. date: 2019-02-23-06-49-06 +.. nonce: 26o4Lc +.. section: Library + +Clean up reference to async generator in Lib/types. Patch by Henry Chen. + +.. + +.. bpo: 35899 +.. date: 2019-02-16-07-11-02 +.. nonce: cjfn5a +.. section: Library + +Enum has been fixed to correctly handle empty strings and strings with +non-Latin characters (ie. '?', '?') without crashing. Original patch +contributed by Maxwell. Assisted by St?phane Wirtel. + +.. + +.. bpo: 35918 +.. date: 2019-02-11-16-23-10 +.. nonce: oGDlpT +.. section: Library + +Removed broken ``has_key`` method from +multiprocessing.managers.SyncManager.dict. Contributed by R?mi Lapeyre. + +.. + +.. bpo: 35960 +.. date: 2019-02-10-20-57-12 +.. nonce: bh-6Ja +.. section: Library + +Fix :func:`dataclasses.field` throwing away empty mapping objects passed as +metadata. + +.. + +.. bpo: 35847 +.. date: 2019-01-29-09-11-09 +.. nonce: eiSi4t +.. section: Library + +RISC-V needed the CTYPES_PASS_BY_REF_HACK. Fixes ctypes Structure +test_pass_by_value. + +.. + +.. bpo: 35780 +.. date: 2019-01-19-17-01-43 +.. nonce: CLf7fT +.. section: Library + +Fix lru_cache() errors arising in recursive, reentrant, or multi-threaded +code. These errors could result in orphan links and in the cache being +trapped in a state with fewer than the specified maximum number of links. +Fix handling of negative maxsize which should have been treated as zero. Fix +errors in toggling the "full" status flag. Fix misordering of links when +errors are encountered. Sync-up the C code and pure Python code for the +space saving path in functions with a single positional argument. In this +common case, the space overhead of an lru cache entry is reduced by almost +half. Fix counting of cache misses. In error cases, the miss count was out +of sync with the actual number of times the underlying user function was +called. + +.. + +.. bpo: 23846 +.. date: 2019-01-15-13-31-30 +.. nonce: LT_qL8 +.. section: Library + +:class:`asyncio.ProactorEventLoop` now catchs and logs send errors when the +self-pipe is full. + +.. + +.. bpo: 34323 +.. date: 2019-01-14-17-34-36 +.. nonce: CRErrt +.. section: Library + +:mod:`asyncio`: Enhance ``IocpProactor.close()`` log: wait 1 second before +the first log, then log every second. Log also the number of seconds since +``close()`` was called. + +.. + +.. bpo: 34294 +.. date: 2019-01-14-11-53-10 +.. nonce: 3JFdg2 +.. section: Library + +re module, fix wrong capturing groups in rare cases. :func:`re.search`, +:func:`re.findall`, :func:`re.sub` and other functions that scan through +string looking for a match, should reset capturing groups between two match +attempts. Patch by Ma Lin. + +.. + +.. bpo: 35717 +.. date: 2019-01-11-17-56-15 +.. nonce: 6TDTB_ +.. section: Library + +Fix KeyError exception raised when using enums and compile. Patch +contributed by R?mi Lapeyre. + +.. + +.. bpo: 35699 +.. date: 2019-01-11-07-09-25 +.. nonce: VDiENF +.. section: Library + +Fixed detection of Visual Studio Build Tools 2017 in distutils + +.. + +.. bpo: 32710 +.. date: 2019-01-10-15-55-10 +.. nonce: KwECPu +.. section: Library + +Fix memory leaks in asyncio ProactorEventLoop on overlapped operation +failure. + +.. + +.. bpo: 32710 +.. date: 2019-01-08-14-00-52 +.. nonce: Sn5Ujj +.. section: Library + +Fix a memory leak in asyncio in the ProactorEventLoop when ``ReadFile()`` or +``WSASend()`` overlapped operation fail immediately: release the internal +buffer. + +.. + +.. bpo: 35682 +.. date: 2019-01-08-01-54-02 +.. nonce: KDM9lk +.. section: Library + +Fix ``asyncio.ProactorEventLoop.sendfile()``: don't attempt to set the +result of an internal future if it's already done. + +.. + +.. bpo: 35283 +.. date: 2019-01-07-17-17-16 +.. nonce: WClosC +.. section: Library + +Add a pending deprecated warning for the :meth:`threading.Thread.isAlive` +method. Patch by Dong-hee Na. + +.. + +.. bpo: 35643 +.. date: 2019-01-02-20-04-49 +.. nonce: DaMiaV +.. section: Library + +Fixed a SyntaxWarning: invalid escape sequence in Modules/_sha3/cleanup.py. +Patch by Micka?l Schoentgen. + +.. + +.. bpo: 35615 +.. date: 2018-12-30-20-00-05 +.. nonce: Uz1SVh +.. section: Library + +:mod:`weakref`: Fix a RuntimeError when copying a WeakKeyDictionary or a +WeakValueDictionary, due to some keys or values disappearing while +iterating. + +.. + +.. bpo: 28503 +.. date: 2018-12-30-14-56-33 +.. nonce: V4kNN3 +.. section: Library + +The `crypt` module now internally uses the `crypt_r()` library function +instead of `crypt()` when available. + +.. + +.. bpo: 35121 +.. date: 2018-12-30-14-35-19 +.. nonce: oWmiGU +.. section: Library + +Don't set cookie for a request when the request path is a prefix match of +the cookie's path attribute but doesn't end with "/". Patch by Karthikeyan +Singaravelan. + +.. + +.. bpo: 35585 +.. date: 2018-12-26-02-28-00 +.. nonce: Lkzd3Z +.. section: Library + +Speed-up building enums by value, e.g. http.HTTPStatus(200). + +.. + +.. bpo: 21478 +.. date: 2018-12-21-09-54-30 +.. nonce: 5gsXtc +.. section: Library + +Calls to a child function created with :func:`unittest.mock.create_autospec` +should propagate to the parent. Patch by Karthikeyan Singaravelan. + +.. + +.. bpo: 35513 +.. date: 2018-12-16-23-28-49 +.. nonce: pn-Zh3 +.. section: Library + +:class:`~unittest.runner.TextTestRunner` of :mod:`unittest.runner` now uses +:func:`time.perf_counter` rather than :func:`time.time` to measure the +execution time of a test: :func:`time.time` can go backwards, whereas +:func:`time.perf_counter` is monotonic. + +.. + +.. bpo: 35502 +.. date: 2018-12-14-23-56-48 +.. nonce: gLHuFS +.. section: Library + +Fixed reference leaks in :class:`xml.etree.ElementTree.TreeBuilder` in case +of unfinished building of the tree (in particular when an error was raised +during parsing XML). + +.. + +.. bpo: 31446 +.. date: 2018-12-12-22-52-34 +.. nonce: l--Fjz +.. section: Library + +Copy command line that was passed to CreateProcessW since this function can +change the content of the input buffer. + +.. + +.. bpo: 20239 +.. date: 2018-12-09-21-35-49 +.. nonce: V4mWBL +.. section: Library + +Allow repeated assignment deletion of :class:`unittest.mock.Mock` +attributes. Patch by Pablo Galindo. + +.. + +.. bpo: 17185 +.. date: 2018-12-09-17-04-15 +.. nonce: SfSCJF +.. section: Library + +Set ``__signature__`` on mock for :mod:`inspect` to get signature. Patch by +Karthikeyan Singaravelan. + +.. + +.. bpo: 10496 +.. date: 2018-12-05-17-42-49 +.. nonce: laV_IE +.. section: Library + +:func:`~distutils.utils.check_environ` of :mod:`distutils.utils` now catchs +:exc:`KeyError` on calling :func:`pwd.getpwuid`: don't create the ``HOME`` +environment variable in this case. + +.. + +.. bpo: 35066 +.. date: 2018-11-29-09-38-40 +.. nonce: Nwej2s +.. section: Library + +Previously, calling the strftime() method on a datetime object with a +trailing '%' in the format string would result in an exception. However, +this only occured when the datetime C module was being used; the python +implementation did not match this behavior. Datetime is now PEP-399 +compliant, and will not throw an exception on a trailing '%'. + +.. + +.. bpo: 24746 +.. date: 2018-11-22-15-22-56 +.. nonce: eSLKBE +.. section: Library + +Avoid stripping trailing whitespace in doctest fancy diff. Orignial patch by +R. David Murray & Jairo Trad. Enhanced by Sanyam Khurana. + +.. + +.. bpo: 35198 +.. date: 2018-11-09-12-45-28 +.. nonce: EJ8keW +.. section: Library + +Fix C++ extension compilation on AIX + +.. + +.. bpo: 28441 +.. date: 2018-10-04-15-53-14 +.. nonce: 2sQENe +.. section: Library + +On Cygwin and MinGW, ensure that ``sys.executable`` always includes the full +filename in the path, including the ``.exe`` suffix (unless it is a symbolic +link). + +.. + +.. bpo: 34572 +.. date: 2018-09-05-03-02-32 +.. nonce: ayisd2 +.. section: Library + +Fix C implementation of pickle.loads to use importlib's locking mechanisms, +and thereby avoid using partially-loaded modules. Patch by Tim Burgess. + +.. + +.. bpo: 31715 +.. date: 2018-08-15-16-22-30 +.. nonce: Iw8jS8 +.. section: Library + +Associate ``.mjs`` file extension with ``application/javascript`` MIME Type. + +.. + +.. bpo: 33687 +.. date: 2018-06-10-14-08-52 +.. nonce: 1zZdnA +.. section: Library + +Fix the call to ``os.chmod()`` for ``uu.decode()`` if a mode is given or +decoded. Patch by Timo Furrer. + +.. + +.. bpo: 32146 +.. date: 2018-02-25-10-17-23 +.. nonce: xOzUFW +.. section: Library + +Document the interaction between frozen executables and the spawn and +forkserver start methods in multiprocessing. + +.. + +.. bpo: 36083 +.. date: 2019-02-24-12-40-13 +.. nonce: JX7zbv +.. section: Documentation + +Fix formatting of --check-hash-based-pycs options in the manpage Synopsis. + +.. + +.. bpo: 34764 +.. date: 2018-12-23-23-52-31 +.. nonce: DwOGeT +.. section: Documentation + +Improve example of iter() with 2nd sentinel argument. + +.. + +.. bpo: 21314 +.. date: 2018-11-21-23-01-37 +.. nonce: PG33VT +.. section: Documentation + +A new entry was added to the Core Language Section of the Programming FAQ, +which explaines the usage of slash(/) in the signature of a function. Patch +by Lysandros Nikolaou + +.. + +.. bpo: 22062 +.. date: 2018-07-28-12-41-01 +.. nonce: TaN2hn +.. section: Documentation + +Update documentation and docstrings for pathlib. Original patch by Mike +Short. + +.. + +.. bpo: 36234 +.. date: 2019-03-08-12-53-37 +.. nonce: NRVK6W +.. section: Tests + +test_posix.PosixUidGidTests: add tests for invalid uid/gid type (str). +Initial patch written by David Malcolm. + +.. + +.. bpo: 29571 +.. date: 2019-03-05-13-48-39 +.. nonce: ecGuKR +.. section: Tests + +Fix ``test_re.test_locale_flag()``: use ``locale.getpreferredencoding()`` +rather than ``locale.getlocale()`` to get the locale encoding. With some +locales, ``locale.getlocale()`` returns the wrong encoding. On Windows, set +temporarily the ``LC_CTYPE`` locale to the user preferred encoding to ensure +that it uses the ANSI code page, to be consistent with +``locale.getpreferredencoding()``. + +.. + +.. bpo: 36123 +.. date: 2019-02-26-12-51-35 +.. nonce: QRhhRS +.. section: Tests + +Fix race condition in test_socket. + +.. + +.. bpo: 27313 +.. date: 2019-02-24-01-58-38 +.. nonce: Sj9veH +.. section: Tests + +Avoid test_ttk_guionly ComboboxTest failure with macOS Cocoa Tk. + +.. + +.. bpo: 36019 +.. date: 2019-02-21-14-23-51 +.. nonce: zS_OUi +.. section: Tests + +Add test.support.TEST_HTTP_URL and replace references of +http://www.example.com by this new constant. Contributed by St?phane Wirtel. + +.. + +.. bpo: 36037 +.. date: 2019-02-19-15-21-14 +.. nonce: 75wG9_ +.. section: Tests + +Fix test_ssl for strict OpenSSL configuration like RHEL8 strict crypto +policy. Use older TLS version for minimum TLS version of the server SSL +context if needed, to test TLS version older than default minimum TLS +version. + +.. + +.. bpo: 35505 +.. date: 2019-02-12-01-33-08 +.. nonce: N9ba_K +.. section: Tests + +Make test_imap4_host_default_value independent on whether the local IMAP +server is running. + +.. + +.. bpo: 35917 +.. date: 2019-02-06-18-06-16 +.. nonce: -Clv1L +.. section: Tests + +multiprocessing: provide unit tests for SyncManager and SharedMemoryManager +classes + all the shareable types which are supposed to be supported by +them. (patch by Giampaolo Rodola) + +.. + +.. bpo: 35772 +.. date: 2019-01-18-12-19-19 +.. nonce: sGBbsn +.. section: Tests + +Fix sparse file tests of test_tarfile on ppc64 with the tmpfs filesystem. +Fix the function testing if the filesystem supports sparse files: create a +file which contains data and "holes", instead of creating a file which +contains no data. tmpfs effective block size is a page size (tmpfs lives in +the page cache). RHEL uses 64 KiB pages on aarch64, ppc64, ppc64le, only +s390x and x86_64 use 4 KiB pages, whereas the test punch holes of 4 KiB. + +.. + +.. bpo: 35045 +.. date: 2019-01-10-18-35-42 +.. nonce: qdd6d9 +.. section: Tests + +Make ssl tests less strict and also accept TLSv1 as system default. The +changes unbreaks test_min_max_version on Fedora 29. + +.. + +.. bpo: 31731 +.. date: 2018-12-18-23-20-39 +.. nonce: tcv85C +.. section: Tests + +Fix a race condition in ``check_interrupted_write()`` of test_io: create +directly the thread with SIGALRM signal blocked, rather than blocking the +signal later from the thread. Previously, it was possible that the thread +gets the signal before the signal is blocked. + +.. + +.. bpo: 35424 +.. date: 2018-12-18-22-36-53 +.. nonce: 1Pz4IS +.. section: Tests + +Fix test_multiprocessing_main_handling: use :class:`multiprocessing.Pool` +with a context manager and then explicitly join the pool. + +.. + +.. bpo: 35519 +.. date: 2018-12-17-16-41-45 +.. nonce: RR3L_w +.. section: Tests + +Rename :mod:`test.bisect` module to :mod:`test.bisect_cmd` to avoid conflict +with :mod:`bisect` module when running directly a test like ``./python +Lib/test/test_xmlrpc.py``. + +.. + +.. bpo: 35513 +.. date: 2018-12-16-23-36-47 +.. nonce: k4WHlA +.. section: Tests + +Replace :func:`time.time` with :func:`time.monotonic` in tests to measure +time delta. + +.. + +.. bpo: 34279 +.. date: 2018-12-12-18-20-18 +.. nonce: DhKcuP +.. section: Tests + +:func:`test.support.run_unittest` no longer raise :exc:`TestDidNotRun` if +the test result contains skipped tests. The exception is now only raised if +no test have been run and no test have been skipped. + +.. + +.. bpo: 35412 +.. date: 2018-12-12-18-07-58 +.. nonce: kbuJor +.. section: Tests + +Add testcase to ``test_future4``: check unicode literal. + +.. + +.. bpo: 26704 +.. date: 2018-12-10-13-18-37 +.. nonce: DBAN4c +.. section: Tests + +Added test demonstrating double-patching of an instance method. Patch by +Anthony Sottile. + +.. + +.. bpo: 34691 +.. date: 2019-02-02-13-34-05 +.. nonce: B-Lsj4 +.. section: Build + +The _contextvars module is now built into the core Python library on +Windows. + +.. + +.. bpo: 35683 +.. date: 2019-01-10-11-37-18 +.. nonce: pf5Oos +.. section: Build + +Improved Azure Pipelines build steps and now verifying layouts correctly + +.. + +.. bpo: 35642 +.. date: 2019-01-02-11-23-33 +.. nonce: pjkhJe +.. section: Build + +Remove asynciomodule.c from pythoncore.vcxproj + +.. + +.. bpo: 35550 +.. date: 2018-12-29-10-19-43 +.. nonce: BTuu8e +.. section: Build + +Fix incorrect Solaris #ifdef checks to look for __sun && __SVR4 instead of +sun when compiling. + +.. + +.. bpo: 35499 +.. date: 2018-12-14-19-36-05 +.. nonce: 9yAldM +.. section: Build + +``make profile-opt`` no longer replaces ``CFLAGS_NODIST`` with ``CFLAGS``. +It now adds profile-guided optimization (PGO) flags to ``CFLAGS_NODIST``: +existing ``CFLAGS_NODIST`` flags are kept. + +.. + +.. bpo: 35257 +.. date: 2018-12-05-22-28-40 +.. nonce: dmcd_s +.. section: Build + +Avoid leaking the linker flags from Link Time Optimizations (LTO) into +distutils when compiling C extensions. + +.. + +.. bpo: 24643 +.. date: 2019-02-24-07-52-39 +.. nonce: PofyiS +.. section: Windows + +Fix name collisions due to ``#define timezone _timezone`` in PC/pyconfig.h. + +.. + +.. bpo: 35692 +.. date: 2019-02-02-16-23-57 +.. nonce: cIiiE9 +.. section: Windows + +``pathlib`` no longer raises when checking file and directory existence on +drives that are not ready + +.. + +.. bpo: 35872 +.. date: 2019-02-02-15-57-19 +.. nonce: Bba2n7 +.. section: Windows + +Uses the base Python executable when invoking venv in a virtual environment + +.. + +.. bpo: 35873 +.. date: 2019-02-02-15-56-50 +.. nonce: UW-qS9 +.. section: Windows + +Prevents venv paths being inherited by child processes + +.. + +.. bpo: 35299 +.. date: 2019-02-02-14-47-12 +.. nonce: 1rgEzd +.. section: Windows + +Fix sysconfig detection of the source directory and distutils handling of +pyconfig.h during PGO profiling + +.. + +.. bpo: 32560 +.. date: 2019-02-02-11-02-44 +.. nonce: I5WAGW +.. section: Windows + +The ``py`` launcher now forwards its ``STARTUPINFO`` structure to child +processes. + +.. + +.. bpo: 35854 +.. date: 2019-01-29-15-44-46 +.. nonce: Ww3z19 +.. section: Windows + +Fix EnvBuilder and --symlinks in venv on Windows + +.. + +.. bpo: 35811 +.. date: 2019-01-25-12-46-36 +.. nonce: 2hU-mm +.. section: Windows + +Avoid propagating venv settings when launching via py.exe + +.. + +.. bpo: 35797 +.. date: 2019-01-25-12-29-14 +.. nonce: MzyOK9 +.. section: Windows + +Fix default executable used by the multiprocessing module + +.. + +.. bpo: 29734 +.. date: 2019-01-12-16-52-38 +.. nonce: 6_OJwI +.. section: Windows + +Fix handle leaks in os.stat on Windows. + +.. + +.. bpo: 35596 +.. date: 2019-01-08-13-56-01 +.. nonce: oFvhcm +.. section: Windows + +Use unchecked PYCs for the embeddable distro to avoid zipimport +restrictions. + +.. + +.. bpo: 35596 +.. date: 2018-12-28-07-25-47 +.. nonce: P9CEY2 +.. section: Windows + +Fix vcruntime140.dll being added to embeddable distro multiple times. + +.. + +.. bpo: 35402 +.. date: 2018-12-13-13-30-04 +.. nonce: n_mXb2 +.. section: Windows + +Update Windows build to use Tcl and Tk 8.6.9 + +.. + +.. bpo: 33316 +.. date: 2018-04-20-03-24-07 +.. nonce: 9IiJ8J +.. section: Windows + +PyThread_release_lock always fails + +.. + +.. bpo: 1104 +.. date: 2017-11-24-12-53-54 +.. nonce: 1CWSZp +.. section: Windows + +Correctly handle string length in ``msilib.SummaryInfo.GetProperty()`` to +prevent it from truncating the last character. + +.. + +.. bpo: 36176 +.. date: 2019-03-10-00-07-46 +.. nonce: jk_vv6 +.. section: IDLE + +Fix IDLE autocomplete & calltip popup colors. Prevent conflicts with Linux +dark themes (and slightly darken calltip background). + +.. + +.. bpo: 36152 +.. date: 2019-02-28-18-52-40 +.. nonce: 9pkHIU +.. section: IDLE + +Remove colorizer.ColorDelegator.close_when_done and the corresponding +argument of .close(). In IDLE, both have always been None or False since +2007. + +.. + +.. bpo: 32129 +.. date: 2019-02-25-11-40-14 +.. nonce: 4qVCzD +.. section: IDLE + +Avoid blurry IDLE application icon on macOS with Tk 8.6. Patch by Kevin +Walzer. + +.. + +.. bpo: 24310 +.. date: 2019-02-23-22-31-20 +.. nonce: j_vJQl +.. section: IDLE + +IDLE -- Document settings dialog font tab sample. + +.. + +.. bpo: 36096 +.. date: 2019-02-23-17-53-53 +.. nonce: mN5Ly3 +.. section: IDLE + +Refactor class variables to instance variables in colorizer. + +.. + +.. bpo: 35833 +.. date: 2019-02-08-22-14-24 +.. nonce: XKFRvF +.. section: IDLE + +Revise IDLE doc for control codes sent to Shell. Add a code example block. + +.. + +.. bpo: 35770 +.. date: 2019-01-18-13-04-30 +.. nonce: 2LxJGu +.. section: IDLE + +IDLE macosx deletes Options => Configure IDLE. It previously deleted Window +=> Zoom Height by mistake. (Zoom Height is now on the Options menu). On +Mac, the settings dialog is accessed via Preferences on the IDLE menu. + +.. + +.. bpo: 35769 +.. date: 2019-01-18-01-24-23 +.. nonce: GqsB34 +.. section: IDLE + +Change IDLE's new file name from 'Untitled' to 'untitled' + +.. + +.. bpo: 35689 +.. date: 2019-01-08-17-51-44 +.. nonce: LlaqR8 +.. section: IDLE + +Add docstrings and unittests for colorizer.py. + +.. + +.. bpo: 35660 +.. date: 2019-01-04-19-14-29 +.. nonce: hMxI7N +.. section: IDLE + +Fix imports in idlelib.window. + +.. + +.. bpo: 35641 +.. date: 2019-01-02-22-15-01 +.. nonce: QEaANl +.. section: IDLE + +Proper format `calltip` when the function has no docstring. + +.. + +.. bpo: 33987 +.. date: 2018-12-31-17-04-18 +.. nonce: fD92up +.. section: IDLE + +Use ttk Frame for ttk widgets. + +.. + +.. bpo: 34055 +.. date: 2018-12-28-17-16-33 +.. nonce: TmmpzR +.. section: IDLE + +Fix erroneous 'smart' indents and newlines in IDLE Shell. + +.. + +.. bpo: 35591 +.. date: 2018-12-28-01-19-20 +.. nonce: SFpDj2 +.. section: IDLE + +Find Selection now works when selection not found. + +.. + +.. bpo: 35196 +.. date: 2018-12-27-17-46-42 +.. nonce: 9E-xUh +.. section: IDLE + +Speed up squeezer line counting. + +.. + +.. bpo: 35598 +.. date: 2018-12-27-15-29-11 +.. nonce: FWOOm8 +.. section: IDLE + +Update config_key: use PEP 8 names and ttk widgets, make some objects +global, and add tests. + +.. + +.. bpo: 28097 +.. date: 2018-12-26-13-53-34 +.. nonce: 95I9NT +.. section: IDLE + +Add Previous/Next History entries to Shell menu. + +.. + +.. bpo: 35208 +.. date: 2018-12-23-17-42-11 +.. nonce: J5NOg7 +.. section: IDLE + +Squeezer now properly counts wrapped lines before newlines. + +.. + +.. bpo: 35555 +.. date: 2018-12-21-18-44-30 +.. nonce: M58_K3 +.. section: IDLE + +Gray out Code Context menu entry on macOS when it's not applicable. + +.. + +.. bpo: 35521 +.. date: 2018-12-20-00-14-15 +.. nonce: x32BRn +.. section: IDLE + +Document the IDLE editor code context feature. Add some internal references +within the IDLE doc. + +.. + +.. bpo: 22703 +.. date: 2018-12-18-13-56-31 +.. nonce: UlsjKQ +.. section: IDLE + +The Code Context menu label now toggles between Show/Hide Code Context. The +Zoom Height menu now toggles between Zoom/Restore Height. Zoom Height has +moved from the Window menu to the Options menu. + +.. + +.. bpo: 35132 +.. date: 2019-03-04-02-09-09 +.. nonce: 1R_pnL +.. section: Tools/Demos + +Fix py-list and py-bt commands of python-gdb.py on gdb7. + +.. + +.. bpo: 33817 +.. date: 2019-01-11-11-16-16 +.. nonce: nJ4yIj +.. section: C API + +Fixed :c:func:`_PyBytes_Resize` for empty bytes objects. + +.. + +.. bpo: 35259 +.. date: 2018-11-22-13-52-36 +.. nonce: p07c61 +.. section: C API + +Conditionally declare :c:func:`Py_FinalizeEx()` (new in 3.6) based on +Py_LIMITED_API. Patch by Arthur Neufeld. diff --git a/Misc/NEWS.d/next/Build/2018-12-05-22-28-40.bpo-35257.dmcd_s.rst b/Misc/NEWS.d/next/Build/2018-12-05-22-28-40.bpo-35257.dmcd_s.rst deleted file mode 100644 index fad252578299..000000000000 --- a/Misc/NEWS.d/next/Build/2018-12-05-22-28-40.bpo-35257.dmcd_s.rst +++ /dev/null @@ -1,2 +0,0 @@ -Avoid leaking the linker flags from Link Time Optimizations (LTO) -into distutils when compiling C extensions. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Build/2018-12-14-19-36-05.bpo-35499.9yAldM.rst b/Misc/NEWS.d/next/Build/2018-12-14-19-36-05.bpo-35499.9yAldM.rst deleted file mode 100644 index ed730b9d9b4a..000000000000 --- a/Misc/NEWS.d/next/Build/2018-12-14-19-36-05.bpo-35499.9yAldM.rst +++ /dev/null @@ -1,3 +0,0 @@ -``make profile-opt`` no longer replaces ``CFLAGS_NODIST`` with ``CFLAGS``. It -now adds profile-guided optimization (PGO) flags to ``CFLAGS_NODIST``: existing -``CFLAGS_NODIST`` flags are kept. diff --git a/Misc/NEWS.d/next/Build/2018-12-29-10-19-43.bpo-35550.BTuu8e.rst b/Misc/NEWS.d/next/Build/2018-12-29-10-19-43.bpo-35550.BTuu8e.rst deleted file mode 100644 index 8a6b90d5970e..000000000000 --- a/Misc/NEWS.d/next/Build/2018-12-29-10-19-43.bpo-35550.BTuu8e.rst +++ /dev/null @@ -1 +0,0 @@ -Fix incorrect Solaris #ifdef checks to look for __sun && __SVR4 instead of sun when compiling. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Build/2019-01-02-11-23-33.bpo-35642.pjkhJe.rst b/Misc/NEWS.d/next/Build/2019-01-02-11-23-33.bpo-35642.pjkhJe.rst deleted file mode 100644 index 9f6da315e2d5..000000000000 --- a/Misc/NEWS.d/next/Build/2019-01-02-11-23-33.bpo-35642.pjkhJe.rst +++ /dev/null @@ -1 +0,0 @@ -Remove asynciomodule.c from pythoncore.vcxproj diff --git a/Misc/NEWS.d/next/Build/2019-01-10-11-37-18.bpo-35683.pf5Oos.rst b/Misc/NEWS.d/next/Build/2019-01-10-11-37-18.bpo-35683.pf5Oos.rst deleted file mode 100644 index f39610169370..000000000000 --- a/Misc/NEWS.d/next/Build/2019-01-10-11-37-18.bpo-35683.pf5Oos.rst +++ /dev/null @@ -1 +0,0 @@ -Improved Azure Pipelines build steps and now verifying layouts correctly diff --git a/Misc/NEWS.d/next/Build/2019-02-02-13-34-05.bpo-34691.B-Lsj4.rst b/Misc/NEWS.d/next/Build/2019-02-02-13-34-05.bpo-34691.B-Lsj4.rst deleted file mode 100644 index 3b5aca75103b..000000000000 --- a/Misc/NEWS.d/next/Build/2019-02-02-13-34-05.bpo-34691.B-Lsj4.rst +++ /dev/null @@ -1,2 +0,0 @@ -The _contextvars module is now built into the core Python library on -Windows. diff --git a/Misc/NEWS.d/next/C API/2018-11-22-13-52-36.bpo-35259.p07c61.rst b/Misc/NEWS.d/next/C API/2018-11-22-13-52-36.bpo-35259.p07c61.rst deleted file mode 100644 index 1f4801cbfb71..000000000000 --- a/Misc/NEWS.d/next/C API/2018-11-22-13-52-36.bpo-35259.p07c61.rst +++ /dev/null @@ -1,2 +0,0 @@ -Conditionally declare :c:func:`Py_FinalizeEx()` (new in 3.6) based on -Py_LIMITED_API. Patch by Arthur Neufeld. diff --git a/Misc/NEWS.d/next/C API/2019-01-11-11-16-16.bpo-33817.nJ4yIj.rst b/Misc/NEWS.d/next/C API/2019-01-11-11-16-16.bpo-33817.nJ4yIj.rst deleted file mode 100644 index ca4ccb26d361..000000000000 --- a/Misc/NEWS.d/next/C API/2019-01-11-11-16-16.bpo-33817.nJ4yIj.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed :c:func:`_PyBytes_Resize` for empty bytes objects. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-08-08-20-52-55.bpo-33989.TkLBui.rst b/Misc/NEWS.d/next/Core and Builtins/2018-08-08-20-52-55.bpo-33989.TkLBui.rst deleted file mode 100644 index 056a71c480ad..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-08-08-20-52-55.bpo-33989.TkLBui.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a possible crash in :meth:`list.sort` when sorting objects with -``ob_type->tp_richcompare == NULL``. Patch by Zackery Spytz. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-12-15-14-01-45.bpo-35504.JtKczP.rst b/Misc/NEWS.d/next/Core and Builtins/2018-12-15-14-01-45.bpo-35504.JtKczP.rst deleted file mode 100644 index 2a4f0f694fee..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-12-15-14-01-45.bpo-35504.JtKczP.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix segfaults and :exc:`SystemError`\ s when deleting certain attributes. -Patch by Zackery Spytz. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-12-21-13-29-30.bpo-35552.1DzQQc.rst b/Misc/NEWS.d/next/Core and Builtins/2018-12-21-13-29-30.bpo-35552.1DzQQc.rst deleted file mode 100644 index dbc00bcd75e9..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-12-21-13-29-30.bpo-35552.1DzQQc.rst +++ /dev/null @@ -1,3 +0,0 @@ -Format characters ``%s`` and ``%V`` in :c:func:`PyUnicode_FromFormat` and -``%s`` in :c:func:`PyBytes_FromFormat` no longer read memory past the -limit if *precision* is specified. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-12-22-22-19-51.bpo-35560.9vMWSP.rst b/Misc/NEWS.d/next/Core and Builtins/2018-12-22-22-19-51.bpo-35560.9vMWSP.rst deleted file mode 100644 index 01458f11088e..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-12-22-22-19-51.bpo-35560.9vMWSP.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix an assertion error in :func:`format` in debug build for floating point -formatting with "n" format, zero padding and small width. Release build is -not impacted. Patch by Karthikeyan Singaravelan. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-12-30-15-36-23.bpo-35214.GWDQcv.rst b/Misc/NEWS.d/next/Core and Builtins/2018-12-30-15-36-23.bpo-35214.GWDQcv.rst deleted file mode 100644 index fa61f78a9328..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-12-30-15-36-23.bpo-35214.GWDQcv.rst +++ /dev/null @@ -1,2 +0,0 @@ -clang Memory Sanitizer build instrumentation was added to work around false -positives from posix, socket, time, test_io, and test_faulthandler. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-12-31-02-37-20.bpo-35623.24AQhY.rst b/Misc/NEWS.d/next/Core and Builtins/2018-12-31-02-37-20.bpo-35623.24AQhY.rst deleted file mode 100644 index 6e3df4dc5d4e..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-12-31-02-37-20.bpo-35623.24AQhY.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a crash when sorting very long lists. Patch by Stephan Hohe. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-01-12-23-33-04.bpo-35720.LELKQx.rst b/Misc/NEWS.d/next/Core and Builtins/2019-01-12-23-33-04.bpo-35720.LELKQx.rst deleted file mode 100644 index 9c57ebcb625e..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-01-12-23-33-04.bpo-35720.LELKQx.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed a minor memory leak in pymain_parse_cmdline_impl function in Modules/main.c \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-01-22-02-06-39.bpo-31506.eJ5FpV.rst b/Misc/NEWS.d/next/Core and Builtins/2019-01-22-02-06-39.bpo-31506.eJ5FpV.rst deleted file mode 100644 index 9ebcab7e2a71..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-01-22-02-06-39.bpo-31506.eJ5FpV.rst +++ /dev/null @@ -1,3 +0,0 @@ -Clarify the errors reported when ``object.__new__`` and ``object.__init__`` -receive more than one argument. -Contributed by Sanyam Khurana. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-02-12-20-16-34.bpo-35961.7f7Sne.rst b/Misc/NEWS.d/next/Core and Builtins/2019-02-12-20-16-34.bpo-35961.7f7Sne.rst deleted file mode 100644 index 943aaa2f3c80..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-02-12-20-16-34.bpo-35961.7f7Sne.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a crash in slice_richcompare(): use strong references rather than stolen -references for the two temporary internal tuples. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-02-14-00-00-30.bpo-35991.xlbfSk.rst b/Misc/NEWS.d/next/Core and Builtins/2019-02-14-00-00-30.bpo-35991.xlbfSk.rst deleted file mode 100644 index 4bd55208dada..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-02-14-00-00-30.bpo-35991.xlbfSk.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a potential double free in Modules/_randommodule.c. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-02-14-12-01-44.bpo-35992.nG9e2L.rst b/Misc/NEWS.d/next/Core and Builtins/2019-02-14-12-01-44.bpo-35992.nG9e2L.rst deleted file mode 100644 index 3d8dcd48cd0f..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-02-14-12-01-44.bpo-35992.nG9e2L.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix ``__class_getitem__()`` not being called on a class with a custom -non-subscriptable metaclass. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-02-18-09-30-55.bpo-35942.oLhL2v.rst b/Misc/NEWS.d/next/Core and Builtins/2019-02-18-09-30-55.bpo-35942.oLhL2v.rst deleted file mode 100644 index ed7432806589..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-02-18-09-30-55.bpo-35942.oLhL2v.rst +++ /dev/null @@ -1,3 +0,0 @@ -The error message emitted when returning invalid types from ``__fspath__`` -in interfaces that allow passing :class:`~os.PathLike` objects has been -improved and now it does explain the origin of the error. diff --git a/Misc/NEWS.d/next/Documentation/2018-07-28-12-41-01.bpo-22062.TaN2hn.rst b/Misc/NEWS.d/next/Documentation/2018-07-28-12-41-01.bpo-22062.TaN2hn.rst deleted file mode 100644 index cb47fe136e6b..000000000000 --- a/Misc/NEWS.d/next/Documentation/2018-07-28-12-41-01.bpo-22062.TaN2hn.rst +++ /dev/null @@ -1 +0,0 @@ -Update documentation and docstrings for pathlib. Original patch by Mike Short. diff --git a/Misc/NEWS.d/next/Documentation/2018-11-21-23-01-37.bpo-21314.PG33VT.rst b/Misc/NEWS.d/next/Documentation/2018-11-21-23-01-37.bpo-21314.PG33VT.rst deleted file mode 100644 index 83080a3a580b..000000000000 --- a/Misc/NEWS.d/next/Documentation/2018-11-21-23-01-37.bpo-21314.PG33VT.rst +++ /dev/null @@ -1,3 +0,0 @@ -A new entry was added to the Core Language Section of the Programming FAQ, -which explaines the usage of slash(/) in the signature of a function. Patch -by Lysandros Nikolaou diff --git a/Misc/NEWS.d/next/Documentation/2018-12-23-23-52-31.bpo-34764.DwOGeT.rst b/Misc/NEWS.d/next/Documentation/2018-12-23-23-52-31.bpo-34764.DwOGeT.rst deleted file mode 100644 index d2a7f1b52b75..000000000000 --- a/Misc/NEWS.d/next/Documentation/2018-12-23-23-52-31.bpo-34764.DwOGeT.rst +++ /dev/null @@ -1 +0,0 @@ -Improve example of iter() with 2nd sentinel argument. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Documentation/2019-02-24-12-40-13.bpo-36083.JX7zbv.rst b/Misc/NEWS.d/next/Documentation/2019-02-24-12-40-13.bpo-36083.JX7zbv.rst deleted file mode 100644 index 950dc6e141e1..000000000000 --- a/Misc/NEWS.d/next/Documentation/2019-02-24-12-40-13.bpo-36083.JX7zbv.rst +++ /dev/null @@ -1 +0,0 @@ -Fix formatting of --check-hash-based-pycs options in the manpage Synopsis. diff --git a/Misc/NEWS.d/next/IDLE/2018-12-18-13-56-31.bpo-22703.UlsjKQ.rst b/Misc/NEWS.d/next/IDLE/2018-12-18-13-56-31.bpo-22703.UlsjKQ.rst deleted file mode 100644 index d1129c4f155c..000000000000 --- a/Misc/NEWS.d/next/IDLE/2018-12-18-13-56-31.bpo-22703.UlsjKQ.rst +++ /dev/null @@ -1,3 +0,0 @@ -The Code Context menu label now toggles between Show/Hide Code Context. -The Zoom Height menu now toggles between Zoom/Restore Height. -Zoom Height has moved from the Window menu to the Options menu. diff --git a/Misc/NEWS.d/next/IDLE/2018-12-20-00-14-15.bpo-35521.x32BRn.rst b/Misc/NEWS.d/next/IDLE/2018-12-20-00-14-15.bpo-35521.x32BRn.rst deleted file mode 100644 index 120de7f6c844..000000000000 --- a/Misc/NEWS.d/next/IDLE/2018-12-20-00-14-15.bpo-35521.x32BRn.rst +++ /dev/null @@ -1,2 +0,0 @@ -Document the IDLE editor code context feature. Add some internal references -within the IDLE doc. diff --git a/Misc/NEWS.d/next/IDLE/2018-12-21-18-44-30.bpo-35555.M58_K3.rst b/Misc/NEWS.d/next/IDLE/2018-12-21-18-44-30.bpo-35555.M58_K3.rst deleted file mode 100644 index 8fcf3f238977..000000000000 --- a/Misc/NEWS.d/next/IDLE/2018-12-21-18-44-30.bpo-35555.M58_K3.rst +++ /dev/null @@ -1,2 +0,0 @@ - -Gray out Code Context menu entry on macOS when it's not applicable. diff --git a/Misc/NEWS.d/next/IDLE/2018-12-23-17-42-11.bpo-35208.J5NOg7.rst b/Misc/NEWS.d/next/IDLE/2018-12-23-17-42-11.bpo-35208.J5NOg7.rst deleted file mode 100644 index d47806f62f46..000000000000 --- a/Misc/NEWS.d/next/IDLE/2018-12-23-17-42-11.bpo-35208.J5NOg7.rst +++ /dev/null @@ -1 +0,0 @@ -Squeezer now properly counts wrapped lines before newlines. diff --git a/Misc/NEWS.d/next/IDLE/2018-12-26-13-53-34.bpo-28097.95I9NT.rst b/Misc/NEWS.d/next/IDLE/2018-12-26-13-53-34.bpo-28097.95I9NT.rst deleted file mode 100644 index 83163cf736fe..000000000000 --- a/Misc/NEWS.d/next/IDLE/2018-12-26-13-53-34.bpo-28097.95I9NT.rst +++ /dev/null @@ -1 +0,0 @@ -Add Previous/Next History entries to Shell menu. diff --git a/Misc/NEWS.d/next/IDLE/2018-12-27-15-29-11.bpo-35598.FWOOm8.rst b/Misc/NEWS.d/next/IDLE/2018-12-27-15-29-11.bpo-35598.FWOOm8.rst deleted file mode 100644 index d81cf2c44162..000000000000 --- a/Misc/NEWS.d/next/IDLE/2018-12-27-15-29-11.bpo-35598.FWOOm8.rst +++ /dev/null @@ -1,2 +0,0 @@ -Update config_key: use PEP 8 names and ttk widgets, -make some objects global, and add tests. diff --git a/Misc/NEWS.d/next/IDLE/2018-12-27-17-46-42.bpo-35196.9E-xUh.rst b/Misc/NEWS.d/next/IDLE/2018-12-27-17-46-42.bpo-35196.9E-xUh.rst deleted file mode 100644 index ee90d76010d9..000000000000 --- a/Misc/NEWS.d/next/IDLE/2018-12-27-17-46-42.bpo-35196.9E-xUh.rst +++ /dev/null @@ -1 +0,0 @@ -Speed up squeezer line counting. diff --git a/Misc/NEWS.d/next/IDLE/2018-12-28-01-19-20.bpo-35591.SFpDj2.rst b/Misc/NEWS.d/next/IDLE/2018-12-28-01-19-20.bpo-35591.SFpDj2.rst deleted file mode 100644 index 33f67a4cfe6f..000000000000 --- a/Misc/NEWS.d/next/IDLE/2018-12-28-01-19-20.bpo-35591.SFpDj2.rst +++ /dev/null @@ -1 +0,0 @@ -Find Selection now works when selection not found. diff --git a/Misc/NEWS.d/next/IDLE/2018-12-28-17-16-33.bpo-34055.TmmpzR.rst b/Misc/NEWS.d/next/IDLE/2018-12-28-17-16-33.bpo-34055.TmmpzR.rst deleted file mode 100644 index 7e475fbfa9f3..000000000000 --- a/Misc/NEWS.d/next/IDLE/2018-12-28-17-16-33.bpo-34055.TmmpzR.rst +++ /dev/null @@ -1 +0,0 @@ -Fix erroneous 'smart' indents and newlines in IDLE Shell. diff --git a/Misc/NEWS.d/next/IDLE/2018-12-31-17-04-18.bpo-33987.fD92up.rst b/Misc/NEWS.d/next/IDLE/2018-12-31-17-04-18.bpo-33987.fD92up.rst deleted file mode 100644 index 289a65cf532c..000000000000 --- a/Misc/NEWS.d/next/IDLE/2018-12-31-17-04-18.bpo-33987.fD92up.rst +++ /dev/null @@ -1 +0,0 @@ -Use ttk Frame for ttk widgets. diff --git a/Misc/NEWS.d/next/IDLE/2019-01-02-22-15-01.bpo-35641.QEaANl.rst b/Misc/NEWS.d/next/IDLE/2019-01-02-22-15-01.bpo-35641.QEaANl.rst deleted file mode 100644 index 5abba690be48..000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-01-02-22-15-01.bpo-35641.QEaANl.rst +++ /dev/null @@ -1 +0,0 @@ -Proper format `calltip` when the function has no docstring. diff --git a/Misc/NEWS.d/next/IDLE/2019-01-04-19-14-29.bpo-35660.hMxI7N.rst b/Misc/NEWS.d/next/IDLE/2019-01-04-19-14-29.bpo-35660.hMxI7N.rst deleted file mode 100644 index 1ad83fe29e14..000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-01-04-19-14-29.bpo-35660.hMxI7N.rst +++ /dev/null @@ -1 +0,0 @@ -Fix imports in idlelib.window. diff --git a/Misc/NEWS.d/next/IDLE/2019-01-08-17-51-44.bpo-35689.LlaqR8.rst b/Misc/NEWS.d/next/IDLE/2019-01-08-17-51-44.bpo-35689.LlaqR8.rst deleted file mode 100644 index 9628a6a13afc..000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-01-08-17-51-44.bpo-35689.LlaqR8.rst +++ /dev/null @@ -1 +0,0 @@ -Add docstrings and unittests for colorizer.py. diff --git a/Misc/NEWS.d/next/IDLE/2019-01-18-01-24-23.bpo-35769.GqsB34.rst b/Misc/NEWS.d/next/IDLE/2019-01-18-01-24-23.bpo-35769.GqsB34.rst deleted file mode 100644 index 79003a984a9f..000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-01-18-01-24-23.bpo-35769.GqsB34.rst +++ /dev/null @@ -1 +0,0 @@ -Change IDLE's new file name from 'Untitled' to 'untitled' diff --git a/Misc/NEWS.d/next/IDLE/2019-01-18-13-04-30.bpo-35770.2LxJGu.rst b/Misc/NEWS.d/next/IDLE/2019-01-18-13-04-30.bpo-35770.2LxJGu.rst deleted file mode 100644 index 89e4bdef83ef..000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-01-18-13-04-30.bpo-35770.2LxJGu.rst +++ /dev/null @@ -1,3 +0,0 @@ -IDLE macosx deletes Options => Configure IDLE. It previously deleted Window -=> Zoom Height by mistake. (Zoom Height is now on the Options menu). On -Mac, the settings dialog is accessed via Preferences on the IDLE menu. diff --git a/Misc/NEWS.d/next/IDLE/2019-02-08-22-14-24.bpo-35833.XKFRvF.rst b/Misc/NEWS.d/next/IDLE/2019-02-08-22-14-24.bpo-35833.XKFRvF.rst deleted file mode 100644 index abc92e9442a3..000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-02-08-22-14-24.bpo-35833.XKFRvF.rst +++ /dev/null @@ -1 +0,0 @@ -Revise IDLE doc for control codes sent to Shell. Add a code example block. diff --git a/Misc/NEWS.d/next/IDLE/2019-02-23-17-53-53.bpo-36096.mN5Ly3.rst b/Misc/NEWS.d/next/IDLE/2019-02-23-17-53-53.bpo-36096.mN5Ly3.rst deleted file mode 100644 index cd6f76e9ac2b..000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-02-23-17-53-53.bpo-36096.mN5Ly3.rst +++ /dev/null @@ -1 +0,0 @@ -Refactor class variables to instance variables in colorizer. diff --git a/Misc/NEWS.d/next/IDLE/2019-02-23-22-31-20.bpo-24310.j_vJQl.rst b/Misc/NEWS.d/next/IDLE/2019-02-23-22-31-20.bpo-24310.j_vJQl.rst deleted file mode 100644 index 12ac99022aeb..000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-02-23-22-31-20.bpo-24310.j_vJQl.rst +++ /dev/null @@ -1 +0,0 @@ -IDLE -- Document settings dialog font tab sample. diff --git a/Misc/NEWS.d/next/IDLE/2019-02-25-11-40-14.bpo-32129.4qVCzD.rst b/Misc/NEWS.d/next/IDLE/2019-02-25-11-40-14.bpo-32129.4qVCzD.rst deleted file mode 100644 index 54a5c7244140..000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-02-25-11-40-14.bpo-32129.4qVCzD.rst +++ /dev/null @@ -1,2 +0,0 @@ -Avoid blurry IDLE application icon on macOS with Tk 8.6. Patch by Kevin -Walzer. diff --git a/Misc/NEWS.d/next/IDLE/2019-02-28-18-52-40.bpo-36152.9pkHIU.rst b/Misc/NEWS.d/next/IDLE/2019-02-28-18-52-40.bpo-36152.9pkHIU.rst deleted file mode 100644 index b75ae89ef30a..000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-02-28-18-52-40.bpo-36152.9pkHIU.rst +++ /dev/null @@ -1,3 +0,0 @@ -Remove colorizer.ColorDelegator.close_when_done and the -corresponding argument of .close(). In IDLE, both have -always been None or False since 2007. diff --git a/Misc/NEWS.d/next/IDLE/2019-03-10-00-07-46.bpo-36176.jk_vv6.rst b/Misc/NEWS.d/next/IDLE/2019-03-10-00-07-46.bpo-36176.jk_vv6.rst deleted file mode 100644 index 5998c6fadfc7..000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-03-10-00-07-46.bpo-36176.jk_vv6.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix IDLE autocomplete & calltip popup colors. Prevent conflicts with Linux -dark themes (and slightly darken calltip background). diff --git a/Misc/NEWS.d/next/Library/2018-02-25-10-17-23.bpo-32146.xOzUFW.rst b/Misc/NEWS.d/next/Library/2018-02-25-10-17-23.bpo-32146.xOzUFW.rst deleted file mode 100644 index f071c7101806..000000000000 --- a/Misc/NEWS.d/next/Library/2018-02-25-10-17-23.bpo-32146.xOzUFW.rst +++ /dev/null @@ -1,2 +0,0 @@ -Document the interaction between frozen executables and the spawn and -forkserver start methods in multiprocessing. diff --git a/Misc/NEWS.d/next/Library/2018-06-10-14-08-52.bpo-33687.1zZdnA.rst b/Misc/NEWS.d/next/Library/2018-06-10-14-08-52.bpo-33687.1zZdnA.rst deleted file mode 100644 index 63c5bfcac474..000000000000 --- a/Misc/NEWS.d/next/Library/2018-06-10-14-08-52.bpo-33687.1zZdnA.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix the call to ``os.chmod()`` for ``uu.decode()`` if a mode is given or -decoded. Patch by Timo Furrer. diff --git a/Misc/NEWS.d/next/Library/2018-08-15-16-22-30.bpo-31715.Iw8jS8.rst b/Misc/NEWS.d/next/Library/2018-08-15-16-22-30.bpo-31715.Iw8jS8.rst deleted file mode 100644 index eacba28f9fd9..000000000000 --- a/Misc/NEWS.d/next/Library/2018-08-15-16-22-30.bpo-31715.Iw8jS8.rst +++ /dev/null @@ -1 +0,0 @@ -Associate ``.mjs`` file extension with ``application/javascript`` MIME Type. diff --git a/Misc/NEWS.d/next/Library/2018-09-05-03-02-32.bpo-34572.ayisd2.rst b/Misc/NEWS.d/next/Library/2018-09-05-03-02-32.bpo-34572.ayisd2.rst deleted file mode 100644 index 0468d96420f3..000000000000 --- a/Misc/NEWS.d/next/Library/2018-09-05-03-02-32.bpo-34572.ayisd2.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix C implementation of pickle.loads to use importlib's locking -mechanisms, and thereby avoid using partially-loaded modules. -Patch by Tim Burgess. diff --git a/Misc/NEWS.d/next/Library/2018-10-04-15-53-14.bpo-28441.2sQENe.rst b/Misc/NEWS.d/next/Library/2018-10-04-15-53-14.bpo-28441.2sQENe.rst deleted file mode 100644 index 45143c2a54ac..000000000000 --- a/Misc/NEWS.d/next/Library/2018-10-04-15-53-14.bpo-28441.2sQENe.rst +++ /dev/null @@ -1,3 +0,0 @@ -On Cygwin and MinGW, ensure that ``sys.executable`` always includes the full -filename in the path, including the ``.exe`` suffix (unless it is a symbolic -link). diff --git a/Misc/NEWS.d/next/Library/2018-11-09-12-45-28.bpo-35198.EJ8keW.rst b/Misc/NEWS.d/next/Library/2018-11-09-12-45-28.bpo-35198.EJ8keW.rst deleted file mode 100644 index 4ce7a7e3423c..000000000000 --- a/Misc/NEWS.d/next/Library/2018-11-09-12-45-28.bpo-35198.EJ8keW.rst +++ /dev/null @@ -1 +0,0 @@ -Fix C++ extension compilation on AIX diff --git a/Misc/NEWS.d/next/Library/2018-11-22-15-22-56.bpo-24746.eSLKBE.rst b/Misc/NEWS.d/next/Library/2018-11-22-15-22-56.bpo-24746.eSLKBE.rst deleted file mode 100644 index c592516d1466..000000000000 --- a/Misc/NEWS.d/next/Library/2018-11-22-15-22-56.bpo-24746.eSLKBE.rst +++ /dev/null @@ -1,2 +0,0 @@ -Avoid stripping trailing whitespace in doctest fancy diff. Orignial patch by -R. David Murray & Jairo Trad. Enhanced by Sanyam Khurana. diff --git a/Misc/NEWS.d/next/Library/2018-11-29-09-38-40.bpo-35066.Nwej2s.rst b/Misc/NEWS.d/next/Library/2018-11-29-09-38-40.bpo-35066.Nwej2s.rst deleted file mode 100644 index b0c39bd86383..000000000000 --- a/Misc/NEWS.d/next/Library/2018-11-29-09-38-40.bpo-35066.Nwej2s.rst +++ /dev/null @@ -1,5 +0,0 @@ -Previously, calling the strftime() method on a datetime object with a -trailing '%' in the format string would result in an exception. However, -this only occured when the datetime C module was being used; the python -implementation did not match this behavior. Datetime is now PEP-399 -compliant, and will not throw an exception on a trailing '%'. diff --git a/Misc/NEWS.d/next/Library/2018-12-05-17-42-49.bpo-10496.laV_IE.rst b/Misc/NEWS.d/next/Library/2018-12-05-17-42-49.bpo-10496.laV_IE.rst deleted file mode 100644 index cbfe5eb11668..000000000000 --- a/Misc/NEWS.d/next/Library/2018-12-05-17-42-49.bpo-10496.laV_IE.rst +++ /dev/null @@ -1,3 +0,0 @@ -:func:`~distutils.utils.check_environ` of :mod:`distutils.utils` now catchs -:exc:`KeyError` on calling :func:`pwd.getpwuid`: don't create the ``HOME`` -environment variable in this case. diff --git a/Misc/NEWS.d/next/Library/2018-12-09-17-04-15.bpo-17185.SfSCJF.rst b/Misc/NEWS.d/next/Library/2018-12-09-17-04-15.bpo-17185.SfSCJF.rst deleted file mode 100644 index 311c6d2b0e4e..000000000000 --- a/Misc/NEWS.d/next/Library/2018-12-09-17-04-15.bpo-17185.SfSCJF.rst +++ /dev/null @@ -1,2 +0,0 @@ -Set ``__signature__`` on mock for :mod:`inspect` to get signature. -Patch by Karthikeyan Singaravelan. diff --git a/Misc/NEWS.d/next/Library/2018-12-09-21-35-49.bpo-20239.V4mWBL.rst b/Misc/NEWS.d/next/Library/2018-12-09-21-35-49.bpo-20239.V4mWBL.rst deleted file mode 100644 index fe9c69d234cf..000000000000 --- a/Misc/NEWS.d/next/Library/2018-12-09-21-35-49.bpo-20239.V4mWBL.rst +++ /dev/null @@ -1,2 +0,0 @@ -Allow repeated assignment deletion of :class:`unittest.mock.Mock` attributes. -Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Library/2018-12-12-22-52-34.bpo-31446.l--Fjz.rst b/Misc/NEWS.d/next/Library/2018-12-12-22-52-34.bpo-31446.l--Fjz.rst deleted file mode 100644 index 741263f16bb4..000000000000 --- a/Misc/NEWS.d/next/Library/2018-12-12-22-52-34.bpo-31446.l--Fjz.rst +++ /dev/null @@ -1,2 +0,0 @@ -Copy command line that was passed to CreateProcessW since this function can -change the content of the input buffer. diff --git a/Misc/NEWS.d/next/Library/2018-12-14-23-56-48.bpo-35502.gLHuFS.rst b/Misc/NEWS.d/next/Library/2018-12-14-23-56-48.bpo-35502.gLHuFS.rst deleted file mode 100644 index 0fcea8d5a41d..000000000000 --- a/Misc/NEWS.d/next/Library/2018-12-14-23-56-48.bpo-35502.gLHuFS.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fixed reference leaks in :class:`xml.etree.ElementTree.TreeBuilder` in case -of unfinished building of the tree (in particular when an error was raised -during parsing XML). diff --git a/Misc/NEWS.d/next/Library/2018-12-16-23-28-49.bpo-35513.pn-Zh3.rst b/Misc/NEWS.d/next/Library/2018-12-16-23-28-49.bpo-35513.pn-Zh3.rst deleted file mode 100644 index f1436a718de2..000000000000 --- a/Misc/NEWS.d/next/Library/2018-12-16-23-28-49.bpo-35513.pn-Zh3.rst +++ /dev/null @@ -1,4 +0,0 @@ -:class:`~unittest.runner.TextTestRunner` of :mod:`unittest.runner` now uses -:func:`time.perf_counter` rather than :func:`time.time` to measure the -execution time of a test: :func:`time.time` can go backwards, whereas -:func:`time.perf_counter` is monotonic. diff --git a/Misc/NEWS.d/next/Library/2018-12-21-09-54-30.bpo-21478.5gsXtc.rst b/Misc/NEWS.d/next/Library/2018-12-21-09-54-30.bpo-21478.5gsXtc.rst deleted file mode 100644 index 1000748c9c48..000000000000 --- a/Misc/NEWS.d/next/Library/2018-12-21-09-54-30.bpo-21478.5gsXtc.rst +++ /dev/null @@ -1,2 +0,0 @@ -Calls to a child function created with :func:`unittest.mock.create_autospec` -should propagate to the parent. Patch by Karthikeyan Singaravelan. diff --git a/Misc/NEWS.d/next/Library/2018-12-26-02-28-00.bpo-35585.Lkzd3Z.rst b/Misc/NEWS.d/next/Library/2018-12-26-02-28-00.bpo-35585.Lkzd3Z.rst deleted file mode 100644 index 247a4ae6800f..000000000000 --- a/Misc/NEWS.d/next/Library/2018-12-26-02-28-00.bpo-35585.Lkzd3Z.rst +++ /dev/null @@ -1 +0,0 @@ -Speed-up building enums by value, e.g. http.HTTPStatus(200). diff --git a/Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst b/Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst deleted file mode 100644 index 032e1e2c00bc..000000000000 --- a/Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst +++ /dev/null @@ -1,3 +0,0 @@ -Don't set cookie for a request when the request path is a prefix match of -the cookie's path attribute but doesn't end with "/". Patch by Karthikeyan -Singaravelan. diff --git a/Misc/NEWS.d/next/Library/2018-12-30-14-56-33.bpo-28503.V4kNN3.rst b/Misc/NEWS.d/next/Library/2018-12-30-14-56-33.bpo-28503.V4kNN3.rst deleted file mode 100644 index 651fef1f0371..000000000000 --- a/Misc/NEWS.d/next/Library/2018-12-30-14-56-33.bpo-28503.V4kNN3.rst +++ /dev/null @@ -1,2 +0,0 @@ -The `crypt` module now internally uses the `crypt_r()` library function -instead of `crypt()` when available. diff --git a/Misc/NEWS.d/next/Library/2018-12-30-20-00-05.bpo-35615.Uz1SVh.rst b/Misc/NEWS.d/next/Library/2018-12-30-20-00-05.bpo-35615.Uz1SVh.rst deleted file mode 100644 index 4aff8f7f30c8..000000000000 --- a/Misc/NEWS.d/next/Library/2018-12-30-20-00-05.bpo-35615.Uz1SVh.rst +++ /dev/null @@ -1,3 +0,0 @@ -:mod:`weakref`: Fix a RuntimeError when copying a WeakKeyDictionary or a -WeakValueDictionary, due to some keys or values disappearing while -iterating. diff --git a/Misc/NEWS.d/next/Library/2019-01-02-20-04-49.bpo-35643.DaMiaV.rst b/Misc/NEWS.d/next/Library/2019-01-02-20-04-49.bpo-35643.DaMiaV.rst deleted file mode 100644 index 0b47bb61fc05..000000000000 --- a/Misc/NEWS.d/next/Library/2019-01-02-20-04-49.bpo-35643.DaMiaV.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed a SyntaxWarning: invalid escape sequence in Modules/_sha3/cleanup.py. -Patch by Micka?l Schoentgen. diff --git a/Misc/NEWS.d/next/Library/2019-01-07-17-17-16.bpo-35283.WClosC.rst b/Misc/NEWS.d/next/Library/2019-01-07-17-17-16.bpo-35283.WClosC.rst deleted file mode 100644 index 99544f4cf4ff..000000000000 --- a/Misc/NEWS.d/next/Library/2019-01-07-17-17-16.bpo-35283.WClosC.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add a pending deprecated warning for the :meth:`threading.Thread.isAlive` method. -Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Library/2019-01-08-01-54-02.bpo-35682.KDM9lk.rst b/Misc/NEWS.d/next/Library/2019-01-08-01-54-02.bpo-35682.KDM9lk.rst deleted file mode 100644 index 8152bd707ba5..000000000000 --- a/Misc/NEWS.d/next/Library/2019-01-08-01-54-02.bpo-35682.KDM9lk.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix ``asyncio.ProactorEventLoop.sendfile()``: don't attempt to set the result -of an internal future if it's already done. diff --git a/Misc/NEWS.d/next/Library/2019-01-08-14-00-52.bpo-32710.Sn5Ujj.rst b/Misc/NEWS.d/next/Library/2019-01-08-14-00-52.bpo-32710.Sn5Ujj.rst deleted file mode 100644 index 5c3961c33d96..000000000000 --- a/Misc/NEWS.d/next/Library/2019-01-08-14-00-52.bpo-32710.Sn5Ujj.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix a memory leak in asyncio in the ProactorEventLoop when ``ReadFile()`` or -``WSASend()`` overlapped operation fail immediately: release the internal -buffer. diff --git a/Misc/NEWS.d/next/Library/2019-01-10-15-55-10.bpo-32710.KwECPu.rst b/Misc/NEWS.d/next/Library/2019-01-10-15-55-10.bpo-32710.KwECPu.rst deleted file mode 100644 index 9f7a95a0aaff..000000000000 --- a/Misc/NEWS.d/next/Library/2019-01-10-15-55-10.bpo-32710.KwECPu.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix memory leaks in asyncio ProactorEventLoop on overlapped operation -failure. diff --git a/Misc/NEWS.d/next/Library/2019-01-11-07-09-25.bpo-35699.VDiENF.rst b/Misc/NEWS.d/next/Library/2019-01-11-07-09-25.bpo-35699.VDiENF.rst deleted file mode 100644 index e632e7bdcffe..000000000000 --- a/Misc/NEWS.d/next/Library/2019-01-11-07-09-25.bpo-35699.VDiENF.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed detection of Visual Studio Build Tools 2017 in distutils \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-01-11-17-56-15.bpo-35717.6TDTB_.rst b/Misc/NEWS.d/next/Library/2019-01-11-17-56-15.bpo-35717.6TDTB_.rst deleted file mode 100644 index 7cae1d1c82c7..000000000000 --- a/Misc/NEWS.d/next/Library/2019-01-11-17-56-15.bpo-35717.6TDTB_.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix KeyError exception raised when using enums and compile. Patch -contributed by R?mi Lapeyre. diff --git a/Misc/NEWS.d/next/Library/2019-01-14-11-53-10.bpo-34294.3JFdg2.rst b/Misc/NEWS.d/next/Library/2019-01-14-11-53-10.bpo-34294.3JFdg2.rst deleted file mode 100644 index e1ae2ea6a337..000000000000 --- a/Misc/NEWS.d/next/Library/2019-01-14-11-53-10.bpo-34294.3JFdg2.rst +++ /dev/null @@ -1,4 +0,0 @@ -re module, fix wrong capturing groups in rare cases. :func:`re.search`, -:func:`re.findall`, :func:`re.sub` and other functions that scan through -string looking for a match, should reset capturing groups between two match -attempts. Patch by Ma Lin. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-01-14-17-34-36.bpo-34323.CRErrt.rst b/Misc/NEWS.d/next/Library/2019-01-14-17-34-36.bpo-34323.CRErrt.rst deleted file mode 100644 index 59269244cc47..000000000000 --- a/Misc/NEWS.d/next/Library/2019-01-14-17-34-36.bpo-34323.CRErrt.rst +++ /dev/null @@ -1,3 +0,0 @@ -:mod:`asyncio`: Enhance ``IocpProactor.close()`` log: wait 1 second before -the first log, then log every second. Log also the number of seconds since -``close()`` was called. diff --git a/Misc/NEWS.d/next/Library/2019-01-15-13-31-30.bpo-23846.LT_qL8.rst b/Misc/NEWS.d/next/Library/2019-01-15-13-31-30.bpo-23846.LT_qL8.rst deleted file mode 100644 index 788f092df9c1..000000000000 --- a/Misc/NEWS.d/next/Library/2019-01-15-13-31-30.bpo-23846.LT_qL8.rst +++ /dev/null @@ -1,2 +0,0 @@ -:class:`asyncio.ProactorEventLoop` now catchs and logs send errors when the -self-pipe is full. diff --git a/Misc/NEWS.d/next/Library/2019-01-19-17-01-43.bpo-35780.CLf7fT.rst b/Misc/NEWS.d/next/Library/2019-01-19-17-01-43.bpo-35780.CLf7fT.rst deleted file mode 100644 index d44488272170..000000000000 --- a/Misc/NEWS.d/next/Library/2019-01-19-17-01-43.bpo-35780.CLf7fT.rst +++ /dev/null @@ -1,11 +0,0 @@ -Fix lru_cache() errors arising in recursive, reentrant, or -multi-threaded code. These errors could result in orphan links and in -the cache being trapped in a state with fewer than the specified maximum -number of links. Fix handling of negative maxsize which should have -been treated as zero. Fix errors in toggling the "full" status flag. -Fix misordering of links when errors are encountered. Sync-up the C -code and pure Python code for the space saving path in functions with a -single positional argument. In this common case, the space overhead of -an lru cache entry is reduced by almost half. Fix counting of cache -misses. In error cases, the miss count was out of sync with the actual -number of times the underlying user function was called. diff --git a/Misc/NEWS.d/next/Library/2019-01-29-09-11-09.bpo-35847.eiSi4t.rst b/Misc/NEWS.d/next/Library/2019-01-29-09-11-09.bpo-35847.eiSi4t.rst deleted file mode 100644 index e3775f96f36e..000000000000 --- a/Misc/NEWS.d/next/Library/2019-01-29-09-11-09.bpo-35847.eiSi4t.rst +++ /dev/null @@ -1 +0,0 @@ -RISC-V needed the CTYPES_PASS_BY_REF_HACK. Fixes ctypes Structure test_pass_by_value. diff --git a/Misc/NEWS.d/next/Library/2019-02-10-20-57-12.bpo-35960.bh-6Ja.rst b/Misc/NEWS.d/next/Library/2019-02-10-20-57-12.bpo-35960.bh-6Ja.rst deleted file mode 100644 index 67135843877f..000000000000 --- a/Misc/NEWS.d/next/Library/2019-02-10-20-57-12.bpo-35960.bh-6Ja.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :func:`dataclasses.field` throwing away empty mapping objects passed as -metadata. diff --git a/Misc/NEWS.d/next/Library/2019-02-11-16-23-10.bpo-35918.oGDlpT.rst b/Misc/NEWS.d/next/Library/2019-02-11-16-23-10.bpo-35918.oGDlpT.rst deleted file mode 100644 index 0fcce3e25085..000000000000 --- a/Misc/NEWS.d/next/Library/2019-02-11-16-23-10.bpo-35918.oGDlpT.rst +++ /dev/null @@ -1,2 +0,0 @@ -Removed broken ``has_key`` method from -multiprocessing.managers.SyncManager.dict. Contributed by R?mi Lapeyre. diff --git a/Misc/NEWS.d/next/Library/2019-02-16-07-11-02.bpo-35899.cjfn5a.rst b/Misc/NEWS.d/next/Library/2019-02-16-07-11-02.bpo-35899.cjfn5a.rst deleted file mode 100644 index 73d4fa17b33d..000000000000 --- a/Misc/NEWS.d/next/Library/2019-02-16-07-11-02.bpo-35899.cjfn5a.rst +++ /dev/null @@ -1 +0,0 @@ -Enum has been fixed to correctly handle empty strings and strings with non-Latin characters (ie. '?', '?') without crashing. Original patch contributed by Maxwell. Assisted by St?phane Wirtel. diff --git a/Misc/NEWS.d/next/Library/2019-02-23-06-49-06.bpo-36091.26o4Lc.rst b/Misc/NEWS.d/next/Library/2019-02-23-06-49-06.bpo-36091.26o4Lc.rst deleted file mode 100644 index 582be4493768..000000000000 --- a/Misc/NEWS.d/next/Library/2019-02-23-06-49-06.bpo-36091.26o4Lc.rst +++ /dev/null @@ -1 +0,0 @@ -Clean up reference to async generator in Lib/types. Patch by Henry Chen. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-02-24-00-04-10.bpo-35512.eWDjCJ.rst b/Misc/NEWS.d/next/Library/2019-02-24-00-04-10.bpo-35512.eWDjCJ.rst deleted file mode 100644 index 8281b1b2c49a..000000000000 --- a/Misc/NEWS.d/next/Library/2019-02-24-00-04-10.bpo-35512.eWDjCJ.rst +++ /dev/null @@ -1,3 +0,0 @@ -:func:`unittest.mock.patch.dict` used as a decorator with string target -resolves the target during function call instead of during decorator -construction. Patch by Karthikeyan Singaravelan. diff --git a/Misc/NEWS.d/next/Library/2019-02-25-13-21-43.bpo-36106.VuhEiQ.rst b/Misc/NEWS.d/next/Library/2019-02-25-13-21-43.bpo-36106.VuhEiQ.rst deleted file mode 100644 index 36e17508cd4a..000000000000 --- a/Misc/NEWS.d/next/Library/2019-02-25-13-21-43.bpo-36106.VuhEiQ.rst +++ /dev/null @@ -1 +0,0 @@ -Resolve potential name clash with libm's sinpi(). Patch by Dmitrii Pasechnik. diff --git a/Misc/NEWS.d/next/Library/2019-02-25-23-04-00.bpo-35178.NA_rXa.rst b/Misc/NEWS.d/next/Library/2019-02-25-23-04-00.bpo-35178.NA_rXa.rst deleted file mode 100644 index 2593199cfe9c..000000000000 --- a/Misc/NEWS.d/next/Library/2019-02-25-23-04-00.bpo-35178.NA_rXa.rst +++ /dev/null @@ -1,2 +0,0 @@ -Ensure custom :func:`warnings.formatwarning` function can receive `line` as -positional argument. Based on patch by Tashrif Billah. diff --git a/Misc/NEWS.d/next/Library/2019-03-04-10-42-46.bpo-36179.jEyuI-.rst b/Misc/NEWS.d/next/Library/2019-03-04-10-42-46.bpo-36179.jEyuI-.rst deleted file mode 100644 index 61a98778b78e..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-04-10-42-46.bpo-36179.jEyuI-.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix two unlikely reference leaks in _hashopenssl. The leaks only occur in -out-of-memory cases. diff --git a/Misc/NEWS.d/next/Library/2019-03-06-13-21-33.bpo-35807.W7mmu3.rst b/Misc/NEWS.d/next/Library/2019-03-06-13-21-33.bpo-35807.W7mmu3.rst deleted file mode 100644 index 1109fbed3f9c..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-06-13-21-33.bpo-35807.W7mmu3.rst +++ /dev/null @@ -1 +0,0 @@ -Update ensurepip to install pip 19.0.3 and setuptools 40.8.0. diff --git a/Misc/NEWS.d/next/Library/2019-03-09-18-01-24.bpo-36251.zOp9l0.rst b/Misc/NEWS.d/next/Library/2019-03-09-18-01-24.bpo-36251.zOp9l0.rst deleted file mode 100644 index 5138b0a0cb8b..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-09-18-01-24.bpo-36251.zOp9l0.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix format strings used for stderrprinter and re.Match reprs. Patch by -Stephan Hohe. diff --git a/Misc/NEWS.d/next/Library/2019-03-11-22-06-36.bpo-35931.Qp_Tbe.rst b/Misc/NEWS.d/next/Library/2019-03-11-22-06-36.bpo-35931.Qp_Tbe.rst deleted file mode 100644 index 68c57e2e69df..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-11-22-06-36.bpo-35931.Qp_Tbe.rst +++ /dev/null @@ -1 +0,0 @@ -The :mod:`pdb` ``debug`` command now gracefully handles all exceptions. diff --git a/Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst b/Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst deleted file mode 100644 index d2eb8f1f352c..000000000000 --- a/Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst +++ /dev/null @@ -1,4 +0,0 @@ -Don't send cookies of domain A without Domain attribute to domain B -when domain A is a suffix match of domain B while using a cookiejar -with :class:`http.cookiejar.DefaultCookiePolicy` policy. Patch by -Karthikeyan Singaravelan. diff --git a/Misc/NEWS.d/next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst b/Misc/NEWS.d/next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst deleted file mode 100644 index fc703b9c2469..000000000000 --- a/Misc/NEWS.d/next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst +++ /dev/null @@ -1,4 +0,0 @@ -[CVE-2019-5010] Fix a NULL pointer deref in ssl module. The cert parser did -not handle CRL distribution points with empty DP or URI correctly. A -malicious or buggy certificate can result into segfault. Vulnerability -(TALOS-2018-0758) reported by Colin Read and Nicolas Edet of Cisco. diff --git a/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst b/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst deleted file mode 100644 index 5546394157f9..000000000000 --- a/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst +++ /dev/null @@ -1,3 +0,0 @@ -Changes urlsplit() to raise ValueError when the URL contains characters that -decompose under IDNA encoding (NFKC-normalization) into characters that -affect how the URL is parsed. diff --git a/Misc/NEWS.d/next/Tests/2018-12-10-13-18-37.bpo-26704.DBAN4c.rst b/Misc/NEWS.d/next/Tests/2018-12-10-13-18-37.bpo-26704.DBAN4c.rst deleted file mode 100644 index 458f495be483..000000000000 --- a/Misc/NEWS.d/next/Tests/2018-12-10-13-18-37.bpo-26704.DBAN4c.rst +++ /dev/null @@ -1,2 +0,0 @@ -Added test demonstrating double-patching of an instance method. Patch by -Anthony Sottile. diff --git a/Misc/NEWS.d/next/Tests/2018-12-12-18-07-58.bpo-35412.kbuJor.rst b/Misc/NEWS.d/next/Tests/2018-12-12-18-07-58.bpo-35412.kbuJor.rst deleted file mode 100644 index d696074fb734..000000000000 --- a/Misc/NEWS.d/next/Tests/2018-12-12-18-07-58.bpo-35412.kbuJor.rst +++ /dev/null @@ -1 +0,0 @@ -Add testcase to ``test_future4``: check unicode literal. diff --git a/Misc/NEWS.d/next/Tests/2018-12-12-18-20-18.bpo-34279.DhKcuP.rst b/Misc/NEWS.d/next/Tests/2018-12-12-18-20-18.bpo-34279.DhKcuP.rst deleted file mode 100644 index 5a70cc5308ef..000000000000 --- a/Misc/NEWS.d/next/Tests/2018-12-12-18-20-18.bpo-34279.DhKcuP.rst +++ /dev/null @@ -1,3 +0,0 @@ -:func:`test.support.run_unittest` no longer raise :exc:`TestDidNotRun` if -the test result contains skipped tests. The exception is now only raised if -no test have been run and no test have been skipped. diff --git a/Misc/NEWS.d/next/Tests/2018-12-16-23-36-47.bpo-35513.k4WHlA.rst b/Misc/NEWS.d/next/Tests/2018-12-16-23-36-47.bpo-35513.k4WHlA.rst deleted file mode 100644 index 33ca3a8846e2..000000000000 --- a/Misc/NEWS.d/next/Tests/2018-12-16-23-36-47.bpo-35513.k4WHlA.rst +++ /dev/null @@ -1,2 +0,0 @@ -Replace :func:`time.time` with :func:`time.monotonic` in tests to measure -time delta. diff --git a/Misc/NEWS.d/next/Tests/2018-12-17-16-41-45.bpo-35519.RR3L_w.rst b/Misc/NEWS.d/next/Tests/2018-12-17-16-41-45.bpo-35519.RR3L_w.rst deleted file mode 100644 index e108dd877e1b..000000000000 --- a/Misc/NEWS.d/next/Tests/2018-12-17-16-41-45.bpo-35519.RR3L_w.rst +++ /dev/null @@ -1,3 +0,0 @@ -Rename :mod:`test.bisect` module to :mod:`test.bisect_cmd` to avoid conflict -with :mod:`bisect` module when running directly a test like -``./python Lib/test/test_xmlrpc.py``. diff --git a/Misc/NEWS.d/next/Tests/2018-12-18-22-36-53.bpo-35424.1Pz4IS.rst b/Misc/NEWS.d/next/Tests/2018-12-18-22-36-53.bpo-35424.1Pz4IS.rst deleted file mode 100644 index 461f636981b1..000000000000 --- a/Misc/NEWS.d/next/Tests/2018-12-18-22-36-53.bpo-35424.1Pz4IS.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix test_multiprocessing_main_handling: use :class:`multiprocessing.Pool` with -a context manager and then explicitly join the pool. diff --git a/Misc/NEWS.d/next/Tests/2018-12-18-23-20-39.bpo-31731.tcv85C.rst b/Misc/NEWS.d/next/Tests/2018-12-18-23-20-39.bpo-31731.tcv85C.rst deleted file mode 100644 index 530977c6e87e..000000000000 --- a/Misc/NEWS.d/next/Tests/2018-12-18-23-20-39.bpo-31731.tcv85C.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fix a race condition in ``check_interrupted_write()`` of test_io: create -directly the thread with SIGALRM signal blocked, rather than blocking the -signal later from the thread. Previously, it was possible that the thread gets -the signal before the signal is blocked. diff --git a/Misc/NEWS.d/next/Tests/2019-01-10-18-35-42.bpo-35045.qdd6d9.rst b/Misc/NEWS.d/next/Tests/2019-01-10-18-35-42.bpo-35045.qdd6d9.rst deleted file mode 100644 index 630a22d77868..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-01-10-18-35-42.bpo-35045.qdd6d9.rst +++ /dev/null @@ -1,2 +0,0 @@ -Make ssl tests less strict and also accept TLSv1 as system default. The -changes unbreaks test_min_max_version on Fedora 29. diff --git a/Misc/NEWS.d/next/Tests/2019-01-18-12-19-19.bpo-35772.sGBbsn.rst b/Misc/NEWS.d/next/Tests/2019-01-18-12-19-19.bpo-35772.sGBbsn.rst deleted file mode 100644 index cfd282f1d090..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-01-18-12-19-19.bpo-35772.sGBbsn.rst +++ /dev/null @@ -1,6 +0,0 @@ -Fix sparse file tests of test_tarfile on ppc64 with the tmpfs filesystem. Fix -the function testing if the filesystem supports sparse files: create a file -which contains data and "holes", instead of creating a file which contains no -data. tmpfs effective block size is a page size (tmpfs lives in the page cache). -RHEL uses 64 KiB pages on aarch64, ppc64, ppc64le, only s390x and x86_64 use 4 -KiB pages, whereas the test punch holes of 4 KiB. diff --git a/Misc/NEWS.d/next/Tests/2019-02-06-18-06-16.bpo-35917.-Clv1L.rst b/Misc/NEWS.d/next/Tests/2019-02-06-18-06-16.bpo-35917.-Clv1L.rst deleted file mode 100644 index 546d47e39d87..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-02-06-18-06-16.bpo-35917.-Clv1L.rst +++ /dev/null @@ -1,3 +0,0 @@ -multiprocessing: provide unit tests for SyncManager and SharedMemoryManager -classes + all the shareable types which are supposed to be supported by -them. (patch by Giampaolo Rodola) diff --git a/Misc/NEWS.d/next/Tests/2019-02-12-01-33-08.bpo-35505.N9ba_K.rst b/Misc/NEWS.d/next/Tests/2019-02-12-01-33-08.bpo-35505.N9ba_K.rst deleted file mode 100644 index f1d48d612073..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-02-12-01-33-08.bpo-35505.N9ba_K.rst +++ /dev/null @@ -1,2 +0,0 @@ -Make test_imap4_host_default_value independent on whether the -local IMAP server is running. diff --git a/Misc/NEWS.d/next/Tests/2019-02-19-15-21-14.bpo-36037.75wG9_.rst b/Misc/NEWS.d/next/Tests/2019-02-19-15-21-14.bpo-36037.75wG9_.rst deleted file mode 100644 index dbc0fa256e02..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-02-19-15-21-14.bpo-36037.75wG9_.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix test_ssl for strict OpenSSL configuration like RHEL8 strict crypto policy. -Use older TLS version for minimum TLS version of the server SSL context if -needed, to test TLS version older than default minimum TLS version. diff --git a/Misc/NEWS.d/next/Tests/2019-02-21-14-23-51.bpo-36019.zS_OUi.rst b/Misc/NEWS.d/next/Tests/2019-02-21-14-23-51.bpo-36019.zS_OUi.rst deleted file mode 100644 index b14d157ff492..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-02-21-14-23-51.bpo-36019.zS_OUi.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add test.support.TEST_HTTP_URL and replace references of http://www.example.com -by this new constant. Contributed by St?phane Wirtel. diff --git a/Misc/NEWS.d/next/Tests/2019-02-24-01-58-38.bpo-27313.Sj9veH.rst b/Misc/NEWS.d/next/Tests/2019-02-24-01-58-38.bpo-27313.Sj9veH.rst deleted file mode 100644 index 189b9cf69f07..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-02-24-01-58-38.bpo-27313.Sj9veH.rst +++ /dev/null @@ -1 +0,0 @@ -Avoid test_ttk_guionly ComboboxTest failure with macOS Cocoa Tk. diff --git a/Misc/NEWS.d/next/Tests/2019-02-26-12-51-35.bpo-36123.QRhhRS.rst b/Misc/NEWS.d/next/Tests/2019-02-26-12-51-35.bpo-36123.QRhhRS.rst deleted file mode 100644 index 5a7e5bb8f43c..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-02-26-12-51-35.bpo-36123.QRhhRS.rst +++ /dev/null @@ -1 +0,0 @@ -Fix race condition in test_socket. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Tests/2019-03-05-13-48-39.bpo-29571.ecGuKR.rst b/Misc/NEWS.d/next/Tests/2019-03-05-13-48-39.bpo-29571.ecGuKR.rst deleted file mode 100644 index f89aec5e8d52..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-03-05-13-48-39.bpo-29571.ecGuKR.rst +++ /dev/null @@ -1,6 +0,0 @@ -Fix ``test_re.test_locale_flag()``: use ``locale.getpreferredencoding()`` -rather than ``locale.getlocale()`` to get the locale encoding. With some -locales, ``locale.getlocale()`` returns the wrong encoding. On Windows, set -temporarily the ``LC_CTYPE`` locale to the user preferred encoding to ensure -that it uses the ANSI code page, to be consistent with -``locale.getpreferredencoding()``. diff --git a/Misc/NEWS.d/next/Tests/2019-03-08-12-53-37.bpo-36234.NRVK6W.rst b/Misc/NEWS.d/next/Tests/2019-03-08-12-53-37.bpo-36234.NRVK6W.rst deleted file mode 100644 index 33178b6c3892..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-03-08-12-53-37.bpo-36234.NRVK6W.rst +++ /dev/null @@ -1,2 +0,0 @@ -test_posix.PosixUidGidTests: add tests for invalid uid/gid type (str). -Initial patch written by David Malcolm. diff --git a/Misc/NEWS.d/next/Tools-Demos/2019-03-04-02-09-09.bpo-35132.1R_pnL.rst b/Misc/NEWS.d/next/Tools-Demos/2019-03-04-02-09-09.bpo-35132.1R_pnL.rst deleted file mode 100644 index d73452df429b..000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2019-03-04-02-09-09.bpo-35132.1R_pnL.rst +++ /dev/null @@ -1 +0,0 @@ -Fix py-list and py-bt commands of python-gdb.py on gdb7. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Windows/2017-11-24-12-53-54.bpo-1104.1CWSZp.rst b/Misc/NEWS.d/next/Windows/2017-11-24-12-53-54.bpo-1104.1CWSZp.rst deleted file mode 100644 index a4043496bc24..000000000000 --- a/Misc/NEWS.d/next/Windows/2017-11-24-12-53-54.bpo-1104.1CWSZp.rst +++ /dev/null @@ -1,2 +0,0 @@ -Correctly handle string length in ``msilib.SummaryInfo.GetProperty()`` to -prevent it from truncating the last character. diff --git a/Misc/NEWS.d/next/Windows/2018-04-20-03-24-07.bpo-33316.9IiJ8J.rst b/Misc/NEWS.d/next/Windows/2018-04-20-03-24-07.bpo-33316.9IiJ8J.rst deleted file mode 100644 index 55176791a901..000000000000 --- a/Misc/NEWS.d/next/Windows/2018-04-20-03-24-07.bpo-33316.9IiJ8J.rst +++ /dev/null @@ -1 +0,0 @@ -PyThread_release_lock always fails diff --git a/Misc/NEWS.d/next/Windows/2018-12-13-13-30-04.bpo-35402.n_mXb2.rst b/Misc/NEWS.d/next/Windows/2018-12-13-13-30-04.bpo-35402.n_mXb2.rst deleted file mode 100644 index 56cf17c09dcf..000000000000 --- a/Misc/NEWS.d/next/Windows/2018-12-13-13-30-04.bpo-35402.n_mXb2.rst +++ /dev/null @@ -1 +0,0 @@ -Update Windows build to use Tcl and Tk 8.6.9 diff --git a/Misc/NEWS.d/next/Windows/2018-12-28-07-25-47.bpo-35596.P9CEY2.rst b/Misc/NEWS.d/next/Windows/2018-12-28-07-25-47.bpo-35596.P9CEY2.rst deleted file mode 100644 index 3ce90f6065c9..000000000000 --- a/Misc/NEWS.d/next/Windows/2018-12-28-07-25-47.bpo-35596.P9CEY2.rst +++ /dev/null @@ -1 +0,0 @@ -Fix vcruntime140.dll being added to embeddable distro multiple times. diff --git a/Misc/NEWS.d/next/Windows/2019-01-08-13-56-01.bpo-35596.oFvhcm.rst b/Misc/NEWS.d/next/Windows/2019-01-08-13-56-01.bpo-35596.oFvhcm.rst deleted file mode 100644 index db4d8fa420d6..000000000000 --- a/Misc/NEWS.d/next/Windows/2019-01-08-13-56-01.bpo-35596.oFvhcm.rst +++ /dev/null @@ -1,2 +0,0 @@ -Use unchecked PYCs for the embeddable distro to avoid zipimport -restrictions. diff --git a/Misc/NEWS.d/next/Windows/2019-01-12-16-52-38.bpo-29734.6_OJwI.rst b/Misc/NEWS.d/next/Windows/2019-01-12-16-52-38.bpo-29734.6_OJwI.rst deleted file mode 100644 index c89a509a0e8f..000000000000 --- a/Misc/NEWS.d/next/Windows/2019-01-12-16-52-38.bpo-29734.6_OJwI.rst +++ /dev/null @@ -1 +0,0 @@ -Fix handle leaks in os.stat on Windows. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Windows/2019-01-25-12-29-14.bpo-35797.MzyOK9.rst b/Misc/NEWS.d/next/Windows/2019-01-25-12-29-14.bpo-35797.MzyOK9.rst deleted file mode 100644 index a0745f500b13..000000000000 --- a/Misc/NEWS.d/next/Windows/2019-01-25-12-29-14.bpo-35797.MzyOK9.rst +++ /dev/null @@ -1 +0,0 @@ -Fix default executable used by the multiprocessing module diff --git a/Misc/NEWS.d/next/Windows/2019-01-25-12-46-36.bpo-35811.2hU-mm.rst b/Misc/NEWS.d/next/Windows/2019-01-25-12-46-36.bpo-35811.2hU-mm.rst deleted file mode 100644 index 3207c955bff4..000000000000 --- a/Misc/NEWS.d/next/Windows/2019-01-25-12-46-36.bpo-35811.2hU-mm.rst +++ /dev/null @@ -1 +0,0 @@ -Avoid propagating venv settings when launching via py.exe diff --git a/Misc/NEWS.d/next/Windows/2019-01-29-15-44-46.bpo-35854.Ww3z19.rst b/Misc/NEWS.d/next/Windows/2019-01-29-15-44-46.bpo-35854.Ww3z19.rst deleted file mode 100644 index a1c761458d35..000000000000 --- a/Misc/NEWS.d/next/Windows/2019-01-29-15-44-46.bpo-35854.Ww3z19.rst +++ /dev/null @@ -1 +0,0 @@ -Fix EnvBuilder and --symlinks in venv on Windows diff --git a/Misc/NEWS.d/next/Windows/2019-02-02-11-02-44.bpo-32560.I5WAGW.rst b/Misc/NEWS.d/next/Windows/2019-02-02-11-02-44.bpo-32560.I5WAGW.rst deleted file mode 100644 index bf2bf113e24c..000000000000 --- a/Misc/NEWS.d/next/Windows/2019-02-02-11-02-44.bpo-32560.I5WAGW.rst +++ /dev/null @@ -1,2 +0,0 @@ -The ``py`` launcher now forwards its ``STARTUPINFO`` structure to child -processes. diff --git a/Misc/NEWS.d/next/Windows/2019-02-02-14-47-12.bpo-35299.1rgEzd.rst b/Misc/NEWS.d/next/Windows/2019-02-02-14-47-12.bpo-35299.1rgEzd.rst deleted file mode 100644 index 19fba619b5ab..000000000000 --- a/Misc/NEWS.d/next/Windows/2019-02-02-14-47-12.bpo-35299.1rgEzd.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix sysconfig detection of the source directory and distutils handling of -pyconfig.h during PGO profiling diff --git a/Misc/NEWS.d/next/Windows/2019-02-02-15-56-50.bpo-35873.UW-qS9.rst b/Misc/NEWS.d/next/Windows/2019-02-02-15-56-50.bpo-35873.UW-qS9.rst deleted file mode 100644 index a9ce777a4bd3..000000000000 --- a/Misc/NEWS.d/next/Windows/2019-02-02-15-56-50.bpo-35873.UW-qS9.rst +++ /dev/null @@ -1 +0,0 @@ -Prevents venv paths being inherited by child processes diff --git a/Misc/NEWS.d/next/Windows/2019-02-02-15-57-19.bpo-35872.Bba2n7.rst b/Misc/NEWS.d/next/Windows/2019-02-02-15-57-19.bpo-35872.Bba2n7.rst deleted file mode 100644 index be293c5b5255..000000000000 --- a/Misc/NEWS.d/next/Windows/2019-02-02-15-57-19.bpo-35872.Bba2n7.rst +++ /dev/null @@ -1 +0,0 @@ -Uses the base Python executable when invoking venv in a virtual environment diff --git a/Misc/NEWS.d/next/Windows/2019-02-02-16-23-57.bpo-35692.cIiiE9.rst b/Misc/NEWS.d/next/Windows/2019-02-02-16-23-57.bpo-35692.cIiiE9.rst deleted file mode 100644 index f3715739d4df..000000000000 --- a/Misc/NEWS.d/next/Windows/2019-02-02-16-23-57.bpo-35692.cIiiE9.rst +++ /dev/null @@ -1,2 +0,0 @@ -``pathlib`` no longer raises when checking file and directory existence on -drives that are not ready diff --git a/Misc/NEWS.d/next/Windows/2019-02-24-07-52-39.bpo-24643.PofyiS.rst b/Misc/NEWS.d/next/Windows/2019-02-24-07-52-39.bpo-24643.PofyiS.rst deleted file mode 100644 index 7bc62d8b8fe1..000000000000 --- a/Misc/NEWS.d/next/Windows/2019-02-24-07-52-39.bpo-24643.PofyiS.rst +++ /dev/null @@ -1 +0,0 @@ -Fix name collisions due to ``#define timezone _timezone`` in PC/pyconfig.h. diff --git a/README.rst b/README.rst index 0a375f872421..8d008a26ff77 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,5 @@ -This is Python version 3.7.2+ -============================= +This is Python version 3.7.3 candidate 1 +======================================== .. image:: https://travis-ci.org/python/cpython.svg?branch=master :alt: CPython build status on Travis CI From tjreedy at udel.edu Tue Mar 12 18:13:23 2019 From: tjreedy at udel.edu (Terry Reedy) Date: Tue, 12 Mar 2019 18:13:23 -0400 Subject: [Python-checkins] Minor edits to news entries for 3.7.3 (GH-12292) In-Reply-To: <44JgFm1S9NzpFpy@mail.python.org> References: <44JgFm1S9NzpFpy@mail.python.org> Message-ID: <579fe27f-f0ac-21ba-7a82-009b8a086175@udel.edu> On 3/12/2019 12:21 PM, Ned Deily wrote: > https://github.com/python/cpython/commit/e6183cc2742cfa7e7d627a3c573f4fb31099947a > commit: e6183cc2742cfa7e7d627a3c573f4fb31099947a > branch: 3.7 > author: Ned Deily > committer: GitHub > date: 2019-03-12T12:20:44-04:00 > summary: > > Minor edits to news entries for 3.7.3 (GH-12292) > > files: > A Misc/NEWS.d/next/IDLE/2018-12-21-18-44-30.bpo-35555.M58_K3.rst > D Misc/NEWS.d/next/macOS/2018-12-21-18-44-30.bpo-35555.M58_K3.rst > M Misc/NEWS.d/next/Core and Builtins/2019-02-18-09-30-55.bpo-35942.oLhL2v.rst > diff --git a/Misc/NEWS.d/next/IDLE/2018-12-21-18-44-30.bpo-35555.M58_K3.rst b/Misc/NEWS.d/next/IDLE/2018-12-21-18-44-30.bpo-35555.M58_K3.rst > new file mode 100644 > index 000000000000..8fcf3f238977 > --- /dev/null > +++ b/Misc/NEWS.d/next/IDLE/2018-12-21-18-44-30.bpo-35555.M58_K3.rst > @@ -0,0 +1,2 @@ > + > +Gray out Code Context menu entry on macOS when it's not applicable. This correction is wrong. The change was not system specific. > diff --git a/Misc/NEWS.d/next/macOS/2018-12-21-18-44-30.bpo-35555.M58_K3.rst b/Misc/NEWS.d/next/macOS/2018-12-21-18-44-30.bpo-35555.M58_K3.rst > deleted file mode 100644 > index 0939195cadd3..000000000000 > --- a/Misc/NEWS.d/next/macOS/2018-12-21-18-44-30.bpo-35555.M58_K3.rst > +++ /dev/null > @@ -1 +0,0 @@ > -Gray out Code Context menu entry when it's not applicable. This is correct. From webhook-mailer at python.org Tue Mar 12 18:15:29 2019 From: webhook-mailer at python.org (Steve Dower) Date: Tue, 12 Mar 2019 22:15:29 -0000 Subject: [Python-checkins] bpo-36264: Updates documentation for change to expanduser on Windows (GH-12294) Message-ID: https://github.com/python/cpython/commit/8ef864d50fb847cf15d5717c0db04fd60fb13d8d commit: 8ef864d50fb847cf15d5717c0db04fd60fb13d8d branch: master author: Steve Dower committer: GitHub date: 2019-03-12T15:15:26-07:00 summary: bpo-36264: Updates documentation for change to expanduser on Windows (GH-12294) files: M Doc/library/os.path.rst M Doc/whatsnew/3.8.rst diff --git a/Doc/library/os.path.rst b/Doc/library/os.path.rst index ebbf63cc3548..a167e3b885fd 100644 --- a/Doc/library/os.path.rst +++ b/Doc/library/os.path.rst @@ -172,10 +172,10 @@ the :mod:`glob` module.) password directory through the built-in module :mod:`pwd`. An initial ``~user`` is looked up directly in the password directory. - On Windows, :envvar:`HOME` and :envvar:`USERPROFILE` will be used if set, - otherwise a combination of :envvar:`HOMEPATH` and :envvar:`HOMEDRIVE` will be - used. An initial ``~user`` is handled by stripping the last directory component - from the created user path derived above. + On Windows, :envvar:`USERPROFILE` will be used if set, otherwise a combination + of :envvar:`HOMEPATH` and :envvar:`HOMEDRIVE` will be used. An initial + ``~user`` is handled by stripping the last directory component from the created + user path derived above. If the expansion fails or if the path does not begin with a tilde, the path is returned unchanged. @@ -183,6 +183,9 @@ the :mod:`glob` module.) .. versionchanged:: 3.6 Accepts a :term:`path-like object`. + .. versionchanged:: 3.8 + No longer uses :envvar:`HOME` on Windows. + .. index:: single: $ (dollar); environment variables expansion single: % (percent); environment variables expansion (Windows) diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index ad86917d0cc7..4adeded30375 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -236,6 +236,10 @@ now return ``False`` instead of raising :exc:`ValueError` or its subclasses characters or bytes unrepresentable at the OS level. (Contributed by Serhiy Storchaka in :issue:`33721`.) +:func:`~os.path.expanduser` on Windows now prefers the :envvar:`USERPROFILE` +environment variable and does not use :envvar:`HOME`, which is not normally set +for regular user accounts. + ncurses ------- @@ -672,6 +676,10 @@ Changes in the Python API :exc:`dbm.gnu.error` or :exc:`dbm.ndbm.error`) instead of :exc:`KeyError`. (Contributed by Xiang Zhang in :issue:`33106`.) +* :func:`~os.path.expanduser` on Windows now prefers the :envvar:`USERPROFILE` + environment variable and does not use :envvar:`HOME`, which is not normally + set for regular user accounts. + CPython bytecode changes ------------------------ From tjreedy at udel.edu Tue Mar 12 18:16:59 2019 From: tjreedy at udel.edu (Terry Reedy) Date: Tue, 12 Mar 2019 18:16:59 -0400 Subject: [Python-checkins] Minor edits to news entries (ported from 3.7) (GH-12293) In-Reply-To: <44JgG86GpkzpFrK@mail.python.org> References: <44JgG86GpkzpFrK@mail.python.org> Message-ID: <6ab39260-c960-da00-ab8a-b488ea0e81ab@udel.edu> On 3/12/2019 12:21 PM, Ned Deily wrote: > https://github.com/python/cpython/commit/f45813df52207ae870fda86475976a9b42857592 > commit: f45813df52207ae870fda86475976a9b42857592 > branch: master > author: Ned Deily > committer: GitHub > date: 2019-03-12T12:21:22-04:00 > summary: > > Minor edits to news entries (ported from 3.7) (GH-12293) > > files: > M Misc/NEWS.d/3.8.0a1.rst > M Misc/NEWS.d/3.8.0a2.rst > > diff --git a/Misc/NEWS.d/3.8.0a1.rst b/Misc/NEWS.d/3.8.0a1.rst > index b838965b69f2..47feb2bb268f 100644 > --- a/Misc/NEWS.d/3.8.0a1.rst > +++ b/Misc/NEWS.d/3.8.0a1.rst > @@ -7954,15 +7954,6 @@ prevent it from truncating the last character. > > .. > > -.. bpo: 35555 > -.. date: 2018-12-21-18-44-30 > -.. nonce: M58_K3 > -.. section: macOS > - > -Gray out Code Context menu entry when it's not applicable. > - > -.. > - > .. bpo: 35401 > .. date: 2018-12-09-13-56-49 > .. nonce: n8B7X1 > @@ -8167,6 +8158,15 @@ Squeezer now properly counts wrapped lines before newlines. > > .. > > +.. bpo: 35555 > +.. date: 2018-12-21-18-44-30 > +.. nonce: M58_K3 > +.. section: IDLE > + > +Gray out Code Context menu entry on macOS when it's not applicable. As for 3.7.3, orignal is correct, not macOS specific. > +.. > + > .. bpo: 35521 > .. date: 2018-12-20-00-14-15 > .. nonce: x32BRn From webhook-mailer at python.org Tue Mar 12 19:44:24 2019 From: webhook-mailer at python.org (Ned Deily) Date: Tue, 12 Mar 2019 23:44:24 -0000 Subject: [Python-checkins] Correct minor edit to news entry. (GH-12298) Message-ID: https://github.com/python/cpython/commit/20843a94a81465f06b61c6c8e4a0419df00278e2 commit: 20843a94a81465f06b61c6c8e4a0419df00278e2 branch: master author: Ned Deily committer: GitHub date: 2019-03-12T19:44:20-04:00 summary: Correct minor edit to news entry. (GH-12298) files: M Misc/NEWS.d/3.8.0a1.rst diff --git a/Misc/NEWS.d/3.8.0a1.rst b/Misc/NEWS.d/3.8.0a1.rst index 47feb2bb268f..0386cb6214f5 100644 --- a/Misc/NEWS.d/3.8.0a1.rst +++ b/Misc/NEWS.d/3.8.0a1.rst @@ -8163,7 +8163,7 @@ Squeezer now properly counts wrapped lines before newlines. .. nonce: M58_K3 .. section: IDLE -Gray out Code Context menu entry on macOS when it's not applicable. +Gray out Code Context menu entry when it's not applicable. .. From webhook-mailer at python.org Tue Mar 12 19:44:44 2019 From: webhook-mailer at python.org (Ned Deily) Date: Tue, 12 Mar 2019 23:44:44 -0000 Subject: [Python-checkins] Correct minor edit to news entry. (GH-12299) Message-ID: https://github.com/python/cpython/commit/500320d3a6f2a2927b216fc119f88599f42257ab commit: 500320d3a6f2a2927b216fc119f88599f42257ab branch: 3.7 author: Ned Deily committer: GitHub date: 2019-03-12T19:44:41-04:00 summary: Correct minor edit to news entry. (GH-12299) files: M Misc/NEWS.d/3.7.3rc1.rst diff --git a/Misc/NEWS.d/3.7.3rc1.rst b/Misc/NEWS.d/3.7.3rc1.rst index 4ddf900a7e58..37e50d212943 100644 --- a/Misc/NEWS.d/3.7.3rc1.rst +++ b/Misc/NEWS.d/3.7.3rc1.rst @@ -1187,7 +1187,7 @@ Squeezer now properly counts wrapped lines before newlines. .. nonce: M58_K3 .. section: IDLE -Gray out Code Context menu entry on macOS when it's not applicable. +Gray out Code Context menu entry when it's not applicable. .. From webhook-mailer at python.org Tue Mar 12 19:48:20 2019 From: webhook-mailer at python.org (Steve Dower) Date: Tue, 12 Mar 2019 23:48:20 -0000 Subject: [Python-checkins] bpo-36174: Update nuget authoring for new license field. (GH-12300) Message-ID: https://github.com/python/cpython/commit/26c910c59c47bdef4220c34e66c45a625bda5e56 commit: 26c910c59c47bdef4220c34e66c45a625bda5e56 branch: master author: Steve Dower committer: GitHub date: 2019-03-12T16:48:17-07:00 summary: bpo-36174: Update nuget authoring for new license field. (GH-12300) files: M Tools/nuget/python.nuspec M Tools/nuget/pythondaily.nuspec M Tools/nuget/pythondaily.symbols.nuspec M Tools/nuget/pythonx86.nuspec diff --git a/Tools/nuget/python.nuspec b/Tools/nuget/python.nuspec index d5f3e6324236..8f98e808916a 100644 --- a/Tools/nuget/python.nuspec +++ b/Tools/nuget/python.nuspec @@ -5,9 +5,8 @@ Python 0.0.0.0 Python Software Foundation - https://docs.python.org/3/license.html + tools\LICENSE.txt https://www.python.org/ - false Installs 64-bit Python for use in build scenarios. https://www.python.org/static/favicon.ico python diff --git a/Tools/nuget/pythondaily.nuspec b/Tools/nuget/pythondaily.nuspec index ee3343bbb7b3..5cf55806ddfb 100644 --- a/Tools/nuget/pythondaily.nuspec +++ b/Tools/nuget/pythondaily.nuspec @@ -3,11 +3,10 @@ pythondaily Python (Daily build) - 0.0.0.0 Python Software Foundation - https://docs.python.org/3/license.html + 0.0.0.0 + tools\LICENSE.txt https://www.python.org/ - false Installs an unsigned, untested build of Python for test purposes only. https://www.python.org/static/favicon.ico python diff --git a/Tools/nuget/pythondaily.symbols.nuspec b/Tools/nuget/pythondaily.symbols.nuspec index b89717a1afe3..608e15c50e02 100644 --- a/Tools/nuget/pythondaily.symbols.nuspec +++ b/Tools/nuget/pythondaily.symbols.nuspec @@ -5,9 +5,7 @@ Python (Daily build) 0.0.0.0 Python Software Foundation - https://docs.python.org/3/license.html https://www.python.org/ - false Contains symbols for the daily build of Python. https://www.python.org/static/favicon.ico python diff --git a/Tools/nuget/pythonx86.nuspec b/Tools/nuget/pythonx86.nuspec index ebfcd6c92a4a..27ef67e7f5d3 100644 --- a/Tools/nuget/pythonx86.nuspec +++ b/Tools/nuget/pythonx86.nuspec @@ -5,9 +5,8 @@ Python (32-bit) Python Software Foundation 0.0.0.0 - https://docs.python.org/3/license.html + tools\LICENSE.txt https://www.python.org/ - false Installs 32-bit Python for use in build scenarios. https://www.python.org/static/favicon.ico python From webhook-mailer at python.org Tue Mar 12 20:11:15 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 13 Mar 2019 00:11:15 -0000 Subject: [Python-checkins] bpo-36174: Update nuget authoring for new license field. (GH-12300) Message-ID: https://github.com/python/cpython/commit/ada2e379738bc0eca6ec030a4a573aa7b98faf78 commit: ada2e379738bc0eca6ec030a4a573aa7b98faf78 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-12T17:11:08-07:00 summary: bpo-36174: Update nuget authoring for new license field. (GH-12300) (cherry picked from commit 26c910c59c47bdef4220c34e66c45a625bda5e56) Co-authored-by: Steve Dower files: M Tools/nuget/python.nuspec M Tools/nuget/pythondaily.nuspec M Tools/nuget/pythondaily.symbols.nuspec M Tools/nuget/pythonx86.nuspec diff --git a/Tools/nuget/python.nuspec b/Tools/nuget/python.nuspec index d5f3e6324236..8f98e808916a 100644 --- a/Tools/nuget/python.nuspec +++ b/Tools/nuget/python.nuspec @@ -5,9 +5,8 @@ Python 0.0.0.0 Python Software Foundation - https://docs.python.org/3/license.html + tools\LICENSE.txt https://www.python.org/ - false Installs 64-bit Python for use in build scenarios. https://www.python.org/static/favicon.ico python diff --git a/Tools/nuget/pythondaily.nuspec b/Tools/nuget/pythondaily.nuspec index ee3343bbb7b3..5cf55806ddfb 100644 --- a/Tools/nuget/pythondaily.nuspec +++ b/Tools/nuget/pythondaily.nuspec @@ -3,11 +3,10 @@ pythondaily Python (Daily build) - 0.0.0.0 Python Software Foundation - https://docs.python.org/3/license.html + 0.0.0.0 + tools\LICENSE.txt https://www.python.org/ - false Installs an unsigned, untested build of Python for test purposes only. https://www.python.org/static/favicon.ico python diff --git a/Tools/nuget/pythondaily.symbols.nuspec b/Tools/nuget/pythondaily.symbols.nuspec index b89717a1afe3..608e15c50e02 100644 --- a/Tools/nuget/pythondaily.symbols.nuspec +++ b/Tools/nuget/pythondaily.symbols.nuspec @@ -5,9 +5,7 @@ Python (Daily build) 0.0.0.0 Python Software Foundation - https://docs.python.org/3/license.html https://www.python.org/ - false Contains symbols for the daily build of Python. https://www.python.org/static/favicon.ico python diff --git a/Tools/nuget/pythonx86.nuspec b/Tools/nuget/pythonx86.nuspec index ebfcd6c92a4a..27ef67e7f5d3 100644 --- a/Tools/nuget/pythonx86.nuspec +++ b/Tools/nuget/pythonx86.nuspec @@ -5,9 +5,8 @@ Python (32-bit) Python Software Foundation 0.0.0.0 - https://docs.python.org/3/license.html + tools\LICENSE.txt https://www.python.org/ - false Installs 32-bit Python for use in build scenarios. https://www.python.org/static/favicon.ico python From webhook-mailer at python.org Tue Mar 12 20:15:50 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Wed, 13 Mar 2019 00:15:50 -0000 Subject: [Python-checkins] bpo-35661: Fix failing test on buildbot (GH-12297) Message-ID: https://github.com/python/cpython/commit/839b925f6347222de560cdb767924c502b4039aa commit: 839b925f6347222de560cdb767924c502b4039aa branch: master author: Cheryl Sabella committer: GitHub date: 2019-03-12T20:15:47-04:00 summary: bpo-35661: Fix failing test on buildbot (GH-12297) files: M Lib/test/test_venv.py diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index 1ddec72927fa..0b2c7a0258df 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -110,18 +110,20 @@ def test_defaults(self): def test_prompt(self): env_name = os.path.split(self.env_dir)[1] + rmtree(self.env_dir) builder = venv.EnvBuilder() + self.run_with_capture(builder.create, self.env_dir) context = builder.ensure_directories(self.env_dir) - self.assertEqual(context.prompt, '(%s) ' % env_name) - builder.create(self.env_dir) data = self.get_text_file_contents('pyvenv.cfg') + self.assertEqual(context.prompt, '(%s) ' % env_name) self.assertNotIn("prompt = ", data) + rmtree(self.env_dir) builder = venv.EnvBuilder(prompt='My prompt') + self.run_with_capture(builder.create, self.env_dir) context = builder.ensure_directories(self.env_dir) - self.assertEqual(context.prompt, '(My prompt) ') - builder.create(self.env_dir) data = self.get_text_file_contents('pyvenv.cfg') + self.assertEqual(context.prompt, '(My prompt) ') self.assertIn("prompt = 'My prompt'\n", data) @skipInVenv From webhook-mailer at python.org Tue Mar 12 23:57:12 2019 From: webhook-mailer at python.org (Lisa Roach) Date: Wed, 13 Mar 2019 03:57:12 -0000 Subject: [Python-checkins] Fix stepping into a frame without a __name__ (GH-12064) Message-ID: https://github.com/python/cpython/commit/86900a49000c4a96ad1dc34e49d8af4245b08843 commit: 86900a49000c4a96ad1dc34e49d8af4245b08843 branch: master author: Anthony Sottile committer: Lisa Roach date: 2019-03-12T20:57:09-07:00 summary: Fix stepping into a frame without a __name__ (GH-12064) files: A Misc/NEWS.d/next/Library/2019-02-26-22-41-38.bpo-36130._BnZOo.rst M Lib/bdb.py M Lib/test/test_bdb.py diff --git a/Lib/bdb.py b/Lib/bdb.py index 25c6260c47c7..ec0f92c06a78 100644 --- a/Lib/bdb.py +++ b/Lib/bdb.py @@ -190,6 +190,8 @@ def dispatch_exception(self, frame, arg): def is_skipped_module(self, module_name): "Return True if module_name matches any skip pattern." + if module_name is None: # some modules do not have names + return False for pattern in self.skip: if fnmatch.fnmatch(module_name, pattern): return True diff --git a/Lib/test/test_bdb.py b/Lib/test/test_bdb.py index 751dd9f69597..6e82cce1f411 100644 --- a/Lib/test/test_bdb.py +++ b/Lib/test/test_bdb.py @@ -730,6 +730,13 @@ def main(): with TracerRun(self, skip=skip) as tracer: tracer.runcall(tfunc_import) + def test_skip_with_no_name_module(self): + # some frames have `globals` with no `__name__` + # for instance the second frame in this traceback + # exec(compile('raise ValueError()', '', 'exec'), {}) + bdb = Bdb(skip=['anything*']) + self.assertIs(bdb.is_skipped_module(None), False) + def test_down(self): # Check that set_down() raises BdbError at the newest frame. self.expect_set = [ diff --git a/Misc/NEWS.d/next/Library/2019-02-26-22-41-38.bpo-36130._BnZOo.rst b/Misc/NEWS.d/next/Library/2019-02-26-22-41-38.bpo-36130._BnZOo.rst new file mode 100644 index 000000000000..3bab152871f3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-02-26-22-41-38.bpo-36130._BnZOo.rst @@ -0,0 +1,2 @@ +Fix ``pdb`` with ``skip=...`` when stepping into a frame without a +``__name__`` global. Patch by Anthony Sottile. From webhook-mailer at python.org Wed Mar 13 10:49:31 2019 From: webhook-mailer at python.org (Ned Deily) Date: Wed, 13 Mar 2019 14:49:31 -0000 Subject: [Python-checkins] Remove NEWS entries duplicated from 3.7.2final. (GH-12309) Message-ID: https://github.com/python/cpython/commit/a84f9bc11c3ce4854f7b4e16f3cb3cca954092f6 commit: a84f9bc11c3ce4854f7b4e16f3cb3cca954092f6 branch: 3.7 author: Ned Deily committer: GitHub date: 2019-03-13T10:49:21-04:00 summary: Remove NEWS entries duplicated from 3.7.2final. (GH-12309) files: M Misc/NEWS.d/3.7.3rc1.rst diff --git a/Misc/NEWS.d/3.7.3rc1.rst b/Misc/NEWS.d/3.7.3rc1.rst index 37e50d212943..fbd7197f4403 100644 --- a/Misc/NEWS.d/3.7.3rc1.rst +++ b/Misc/NEWS.d/3.7.3rc1.rst @@ -1,3 +1,4 @@ + .. bpo: 36216 .. date: 2019-03-06-09-38-40 .. nonce: 6q1m4a @@ -564,15 +565,6 @@ and thereby avoid using partially-loaded modules. Patch by Tim Burgess. .. -.. bpo: 31715 -.. date: 2018-08-15-16-22-30 -.. nonce: Iw8jS8 -.. section: Library - -Associate ``.mjs`` file extension with ``application/javascript`` MIME Type. - -.. - .. bpo: 33687 .. date: 2018-06-10-14-08-52 .. nonce: 1zZdnA @@ -852,27 +844,6 @@ sun when compiling. .. -.. bpo: 35499 -.. date: 2018-12-14-19-36-05 -.. nonce: 9yAldM -.. section: Build - -``make profile-opt`` no longer replaces ``CFLAGS_NODIST`` with ``CFLAGS``. -It now adds profile-guided optimization (PGO) flags to ``CFLAGS_NODIST``: -existing ``CFLAGS_NODIST`` flags are kept. - -.. - -.. bpo: 35257 -.. date: 2018-12-05-22-28-40 -.. nonce: dmcd_s -.. section: Build - -Avoid leaking the linker flags from Link Time Optimizations (LTO) into -distutils when compiling C extensions. - -.. - .. bpo: 24643 .. date: 2019-02-24-07-52-39 .. nonce: PofyiS @@ -1227,13 +1198,3 @@ Fix py-list and py-bt commands of python-gdb.py on gdb7. .. section: C API Fixed :c:func:`_PyBytes_Resize` for empty bytes objects. - -.. - -.. bpo: 35259 -.. date: 2018-11-22-13-52-36 -.. nonce: p07c61 -.. section: C API - -Conditionally declare :c:func:`Py_FinalizeEx()` (new in 3.6) based on -Py_LIMITED_API. Patch by Arthur Neufeld. From webhook-mailer at python.org Wed Mar 13 12:55:12 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 13 Mar 2019 16:55:12 -0000 Subject: [Python-checkins] bpo-36262: Fix _Py_dg_strtod() memory leak (goto undfl) (GH-12276) Message-ID: https://github.com/python/cpython/commit/9776b0636ae39668d3ce1c006d4be01dad01bf9f commit: 9776b0636ae39668d3ce1c006d4be01dad01bf9f branch: master author: Victor Stinner committer: GitHub date: 2019-03-13T17:55:01+01:00 summary: bpo-36262: Fix _Py_dg_strtod() memory leak (goto undfl) (GH-12276) Fix an unlikely memory leak on conversion from string to float in the function _Py_dg_strtod() used by float(str), complex(str), pickle.load(), marshal.load(), etc. Fix an unlikely memory leak in _Py_dg_strtod() on "undfl:" label: rewrite memory management in this function to always release all memory before exiting the function. Initialize variables to NULL, and set them to NULL after calling Bfree() at the "cont:" label. Note: Bfree(NULL) is well defined: it does nothing. files: A Misc/NEWS.d/next/Core and Builtins/2019-03-11-15-37-33.bpo-36262.v3N6Fz.rst M Python/dtoa.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-11-15-37-33.bpo-36262.v3N6Fz.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-11-15-37-33.bpo-36262.v3N6Fz.rst new file mode 100644 index 000000000000..b5ccc95fd705 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-11-15-37-33.bpo-36262.v3N6Fz.rst @@ -0,0 +1,3 @@ +Fix an unlikely memory leak on conversion from string to float in the function +``_Py_dg_strtod()`` used by ``float(str)``, ``complex(str)``, +:func:`pickle.load`, :func:`marshal.load`, etc. diff --git a/Python/dtoa.c b/Python/dtoa.c index 01ca9b0b22fb..b7bb7acfb6c2 100644 --- a/Python/dtoa.c +++ b/Python/dtoa.c @@ -1441,8 +1441,9 @@ _Py_dg_strtod(const char *s00, char **se) ULong y, z, abs_exp; Long L; BCinfo bc; - Bigint *bb, *bb1, *bd, *bd0, *bs, *delta; + Bigint *bb = NULL, *bd = NULL, *bd0 = NULL, *bs = NULL, *delta = NULL; size_t ndigits, fraclen; + double result; dval(&rv) = 0.; @@ -1634,7 +1635,6 @@ _Py_dg_strtod(const char *s00, char **se) if (k > 9) { dval(&rv) = tens[k - 9] * dval(&rv) + z; } - bd0 = 0; if (nd <= DBL_DIG && Flt_Rounds == 1 ) { @@ -1804,14 +1804,11 @@ _Py_dg_strtod(const char *s00, char **se) bd = Balloc(bd0->k); if (bd == NULL) { - Bfree(bd0); goto failed_malloc; } Bcopy(bd, bd0); bb = sd2b(&rv, bc.scale, &bbe); /* srv = bb * 2^bbe */ if (bb == NULL) { - Bfree(bd); - Bfree(bd0); goto failed_malloc; } /* Record whether lsb of bb is odd, in case we need this @@ -1821,9 +1818,6 @@ _Py_dg_strtod(const char *s00, char **se) /* tdv = bd * 10**e; srv = bb * 2**bbe */ bs = i2b(1); if (bs == NULL) { - Bfree(bb); - Bfree(bd); - Bfree(bd0); goto failed_malloc; } @@ -1874,54 +1868,36 @@ _Py_dg_strtod(const char *s00, char **se) if (bb5 > 0) { bs = pow5mult(bs, bb5); if (bs == NULL) { - Bfree(bb); - Bfree(bd); - Bfree(bd0); goto failed_malloc; } - bb1 = mult(bs, bb); + Bigint *bb1 = mult(bs, bb); Bfree(bb); bb = bb1; if (bb == NULL) { - Bfree(bs); - Bfree(bd); - Bfree(bd0); goto failed_malloc; } } if (bb2 > 0) { bb = lshift(bb, bb2); if (bb == NULL) { - Bfree(bs); - Bfree(bd); - Bfree(bd0); goto failed_malloc; } } if (bd5 > 0) { bd = pow5mult(bd, bd5); if (bd == NULL) { - Bfree(bb); - Bfree(bs); - Bfree(bd0); goto failed_malloc; } } if (bd2 > 0) { bd = lshift(bd, bd2); if (bd == NULL) { - Bfree(bb); - Bfree(bs); - Bfree(bd0); goto failed_malloc; } } if (bs2 > 0) { bs = lshift(bs, bs2); if (bs == NULL) { - Bfree(bb); - Bfree(bd); - Bfree(bd0); goto failed_malloc; } } @@ -1932,10 +1908,6 @@ _Py_dg_strtod(const char *s00, char **se) delta = diff(bb, bd); if (delta == NULL) { - Bfree(bb); - Bfree(bs); - Bfree(bd); - Bfree(bd0); goto failed_malloc; } dsign = delta->sign; @@ -1989,10 +1961,6 @@ _Py_dg_strtod(const char *s00, char **se) } delta = lshift(delta,Log2P); if (delta == NULL) { - Bfree(bb); - Bfree(bs); - Bfree(bd); - Bfree(bd0); goto failed_malloc; } if (cmp(delta, bs) > 0) @@ -2094,11 +2062,6 @@ _Py_dg_strtod(const char *s00, char **se) if ((word0(&rv) & Exp_mask) >= Exp_msk1*(DBL_MAX_EXP+Bias-P)) { if (word0(&rv0) == Big0 && word1(&rv0) == Big1) { - Bfree(bb); - Bfree(bd); - Bfree(bs); - Bfree(bd0); - Bfree(delta); goto ovfl; } word0(&rv) = Big0; @@ -2140,16 +2103,11 @@ _Py_dg_strtod(const char *s00, char **se) } } cont: - Bfree(bb); - Bfree(bd); - Bfree(bs); - Bfree(delta); + Bfree(bb); bb = NULL; + Bfree(bd); bd = NULL; + Bfree(bs); bs = NULL; + Bfree(delta); delta = NULL; } - Bfree(bb); - Bfree(bd); - Bfree(bs); - Bfree(bd0); - Bfree(delta); if (bc.nd > nd) { error = bigcomp(&rv, s0, &bc); if (error) @@ -2163,24 +2121,37 @@ _Py_dg_strtod(const char *s00, char **se) } ret: - return sign ? -dval(&rv) : dval(&rv); + result = sign ? -dval(&rv) : dval(&rv); + goto done; parse_error: - return 0.0; + result = 0.0; + goto done; failed_malloc: errno = ENOMEM; - return -1.0; + result = -1.0; + goto done; undfl: - return sign ? -0.0 : 0.0; + result = sign ? -0.0 : 0.0; + goto done; ovfl: errno = ERANGE; /* Can't trust HUGE_VAL */ word0(&rv) = Exp_mask; word1(&rv) = 0; - return sign ? -dval(&rv) : dval(&rv); + result = sign ? -dval(&rv) : dval(&rv); + goto done; + + done: + Bfree(bb); + Bfree(bd); + Bfree(bs); + Bfree(bd0); + Bfree(delta); + return result; } From webhook-mailer at python.org Wed Mar 13 13:18:29 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 13 Mar 2019 17:18:29 -0000 Subject: [Python-checkins] bpo-31904: Adapt the _signal module to VxWorks RTOS (GH-12304) Message-ID: https://github.com/python/cpython/commit/8b5bdda5b4c418c4a858f183763d0a497170977c commit: 8b5bdda5b4c418c4a858f183763d0a497170977c branch: master author: pxinwr committer: Victor Stinner date: 2019-03-13T18:18:25+01:00 summary: bpo-31904: Adapt the _signal module to VxWorks RTOS (GH-12304) Limited signal fields in VxWorks. files: A Misc/NEWS.d/next/Library/2019-03-13-14-55-02.bpo-31904.834kfY.rst M Modules/signalmodule.c diff --git a/Misc/NEWS.d/next/Library/2019-03-13-14-55-02.bpo-31904.834kfY.rst b/Misc/NEWS.d/next/Library/2019-03-13-14-55-02.bpo-31904.834kfY.rst new file mode 100644 index 000000000000..d859446b90a3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-13-14-55-02.bpo-31904.834kfY.rst @@ -0,0 +1 @@ +Add _signal module support for VxWorks. diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index f29720bcaf36..4590017c170a 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -1079,11 +1079,18 @@ fill_siginfo(siginfo_t *si) PyStructSequence_SET_ITEM(result, 0, PyLong_FromLong((long)(si->si_signo))); PyStructSequence_SET_ITEM(result, 1, PyLong_FromLong((long)(si->si_code))); +#ifdef __VXWORKS__ + PyStructSequence_SET_ITEM(result, 2, PyLong_FromLong(0L)); + PyStructSequence_SET_ITEM(result, 3, PyLong_FromLong(0L)); + PyStructSequence_SET_ITEM(result, 4, PyLong_FromLong(0L)); + PyStructSequence_SET_ITEM(result, 5, PyLong_FromLong(0L)); +#else PyStructSequence_SET_ITEM(result, 2, PyLong_FromLong((long)(si->si_errno))); PyStructSequence_SET_ITEM(result, 3, PyLong_FromPid(si->si_pid)); PyStructSequence_SET_ITEM(result, 4, _PyLong_FromUid(si->si_uid)); PyStructSequence_SET_ITEM(result, 5, PyLong_FromLong((long)(si->si_status))); +#endif #ifdef HAVE_SIGINFO_T_SI_BAND PyStructSequence_SET_ITEM(result, 6, PyLong_FromLong(si->si_band)); #else From webhook-mailer at python.org Wed Mar 13 16:00:51 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 13 Mar 2019 20:00:51 -0000 Subject: [Python-checkins] bpo-36280: Add Constant.kind field (GH-12295) Message-ID: https://github.com/python/cpython/commit/10f8ce66884cd7fee2372b8dae08ca8132091574 commit: 10f8ce66884cd7fee2372b8dae08ca8132091574 branch: master author: Guido van Rossum committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-13T13:00:46-07:00 summary: bpo-36280: Add Constant.kind field (GH-12295) The value is a string for string and byte literals, None otherwise. It is 'u' for u"..." literals, 'b' for b"..." literals, '' for "..." literals. The 'r' (raw) prefix is ignored. Does not apply to f-strings. This appears sufficient to make mypy capable of using the stdlib ast module instead of typed_ast (assuming a mypy patch I'm working on). WIP: I need to make the tests pass. @ilevkivskyi @serhiy-storchaka https://bugs.python.org/issue36280 files: A Misc/NEWS.d/next/Library/2019-03-12-21-02-55.bpo-36280.mOd3iH.rst M Include/Python-ast.h M Lib/test/test_ast.py M Parser/Python.asdl M Python/Python-ast.c M Python/ast.c diff --git a/Include/Python-ast.h b/Include/Python-ast.h index 8265bed8d6e9..a5742ff0485b 100644 --- a/Include/Python-ast.h +++ b/Include/Python-ast.h @@ -338,6 +338,7 @@ struct _expr { struct { constant value; + string kind; } Constant; struct { @@ -642,9 +643,9 @@ expr_ty _Py_FormattedValue(expr_ty value, int conversion, expr_ty format_spec, #define JoinedStr(a0, a1, a2, a3, a4, a5) _Py_JoinedStr(a0, a1, a2, a3, a4, a5) expr_ty _Py_JoinedStr(asdl_seq * values, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); -#define Constant(a0, a1, a2, a3, a4, a5) _Py_Constant(a0, a1, a2, a3, a4, a5) -expr_ty _Py_Constant(constant value, int lineno, int col_offset, int - end_lineno, int end_col_offset, PyArena *arena); +#define Constant(a0, a1, a2, a3, a4, a5, a6) _Py_Constant(a0, a1, a2, a3, a4, a5, a6) +expr_ty _Py_Constant(constant value, string kind, int lineno, int col_offset, + int end_lineno, int end_col_offset, PyArena *arena); #define Attribute(a0, a1, a2, a3, a4, a5, a6, a7) _Py_Attribute(a0, a1, a2, a3, a4, a5, a6, a7) expr_ty _Py_Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, int col_offset, int end_lineno, int diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py index 609c8b2c6a7f..a7ee0da38d48 100644 --- a/Lib/test/test_ast.py +++ b/Lib/test/test_ast.py @@ -326,7 +326,7 @@ def test_field_attr_writable(self): def test_classattrs(self): x = ast.Num() - self.assertEqual(x._fields, ('value',)) + self.assertEqual(x._fields, ('value', 'kind')) with self.assertRaises(AttributeError): x.value @@ -349,12 +349,12 @@ def test_classattrs(self): x = ast.Num(42, lineno=0) self.assertEqual(x.lineno, 0) - self.assertEqual(x._fields, ('value',)) + self.assertEqual(x._fields, ('value', 'kind')) self.assertEqual(x.value, 42) self.assertEqual(x.n, 42) - self.assertRaises(TypeError, ast.Num, 1, 2) - self.assertRaises(TypeError, ast.Num, 1, 2, lineno=0) + self.assertRaises(TypeError, ast.Num, 1, None, 2) + self.assertRaises(TypeError, ast.Num, 1, None, 2, lineno=0) self.assertEqual(ast.Num(42).n, 42) self.assertEqual(ast.Num(4.25).n, 4.25) @@ -556,6 +556,7 @@ def bad_normalize(*args): class ASTHelpers_Test(unittest.TestCase): + maxDiff = None def test_parse(self): a = ast.parse('foo(1 + 1)') @@ -574,18 +575,18 @@ def test_dump(self): node = ast.parse('spam(eggs, "and cheese")') self.assertEqual(ast.dump(node), "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), " - "args=[Name(id='eggs', ctx=Load()), Constant(value='and cheese')], " + "args=[Name(id='eggs', ctx=Load()), Constant(value='and cheese', kind=None)], " "keywords=[]))], type_ignores=[])" ) self.assertEqual(ast.dump(node, annotate_fields=False), "Module([Expr(Call(Name('spam', Load()), [Name('eggs', Load()), " - "Constant('and cheese')], []))], [])" + "Constant('and cheese', None)], []))], [])" ) self.assertEqual(ast.dump(node, include_attributes=True), "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), " "lineno=1, col_offset=0, end_lineno=1, end_col_offset=4), " "args=[Name(id='eggs', ctx=Load(), lineno=1, col_offset=5, " - "end_lineno=1, end_col_offset=9), Constant(value='and cheese', " + "end_lineno=1, end_col_offset=9), Constant(value='and cheese', kind=None, " "lineno=1, col_offset=11, end_lineno=1, end_col_offset=23)], keywords=[], " "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24), " "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24)], type_ignores=[])" @@ -595,7 +596,7 @@ def test_copy_location(self): src = ast.parse('1 + 1', mode='eval') src.body.right = ast.copy_location(ast.Num(2), src.body.right) self.assertEqual(ast.dump(src, include_attributes=True), - 'Expression(body=BinOp(left=Constant(value=1, lineno=1, col_offset=0, ' + 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=1, col_offset=0, ' 'end_lineno=1, end_col_offset=1), op=Add(), right=Constant(value=2, ' 'lineno=1, col_offset=4, end_lineno=1, end_col_offset=5), lineno=1, ' 'col_offset=0, end_lineno=1, end_col_offset=5))' @@ -610,7 +611,7 @@ def test_fix_missing_locations(self): self.assertEqual(ast.dump(src, include_attributes=True), "Module(body=[Expr(value=Call(func=Name(id='write', ctx=Load(), " "lineno=1, col_offset=0, end_lineno=1, end_col_offset=5), " - "args=[Constant(value='spam', lineno=1, col_offset=6, end_lineno=1, " + "args=[Constant(value='spam', kind=None, lineno=1, col_offset=6, end_lineno=1, " "end_col_offset=12)], keywords=[], lineno=1, col_offset=0, end_lineno=1, " "end_col_offset=13), lineno=1, col_offset=0, end_lineno=1, " "end_col_offset=13), Expr(value=Call(func=Name(id='spam', ctx=Load(), " @@ -625,8 +626,8 @@ def test_increment_lineno(self): src = ast.parse('1 + 1', mode='eval') self.assertEqual(ast.increment_lineno(src, n=3), src) self.assertEqual(ast.dump(src, include_attributes=True), - 'Expression(body=BinOp(left=Constant(value=1, lineno=4, col_offset=0, ' - 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, ' + 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=4, col_offset=0, ' + 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, kind=None, ' 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, ' 'col_offset=0, end_lineno=4, end_col_offset=5))' ) @@ -634,8 +635,8 @@ def test_increment_lineno(self): src = ast.parse('1 + 1', mode='eval') self.assertEqual(ast.increment_lineno(src.body, n=3), src.body) self.assertEqual(ast.dump(src, include_attributes=True), - 'Expression(body=BinOp(left=Constant(value=1, lineno=4, col_offset=0, ' - 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, ' + 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=4, col_offset=0, ' + 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, kind=None, ' 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, ' 'col_offset=0, end_lineno=4, end_col_offset=5))' ) @@ -654,7 +655,7 @@ def test_iter_child_nodes(self): self.assertEqual(next(iterator).value, 23) self.assertEqual(next(iterator).value, 42) self.assertEqual(ast.dump(next(iterator)), - "keyword(arg='eggs', value=Constant(value='leek'))" + "keyword(arg='eggs', value=Constant(value='leek', kind=None))" ) def test_get_docstring(self): @@ -1283,6 +1284,23 @@ def test_literal_eval(self): self.assertEqual(ast.literal_eval(binop), 10+20j) + def test_string_kind(self): + c = ast.parse('"x"', mode='eval').body + self.assertEqual(c.value, "x") + self.assertEqual(c.kind, None) + + c = ast.parse('u"x"', mode='eval').body + self.assertEqual(c.value, "x") + self.assertEqual(c.kind, "u") + + c = ast.parse('r"x"', mode='eval').body + self.assertEqual(c.value, "x") + self.assertEqual(c.kind, None) + + c = ast.parse('b"x"', mode='eval').body + self.assertEqual(c.value, b"x") + self.assertEqual(c.kind, None) + class EndPositionTests(unittest.TestCase): """Tests for end position of AST nodes. @@ -1606,38 +1624,38 @@ def main(): #### EVERYTHING BELOW IS GENERATED BY python Lib/test/test_ast.py -g ##### exec_results = [ -('Module', [('Expr', (1, 0), ('Constant', (1, 0), None))], []), -('Module', [('Expr', (1, 0), ('Constant', (1, 0), 'module docstring'))], []), +('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)], []), +('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)]), [('Pass', (1, 12))], [], 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)], ('arg', (1, 49), 'kwargs', None, None), [('Constant', (1, 11), 1), ('Constant', (1, 16), None), ('List', (1, 24), [], ('Load',)), ('Dict', (1, 30), [], [])]), [('Expr', (1, 58), ('Constant', (1, 58), 'doc for f()'))], [], 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'))], [])], []), +('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)], []), +('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)], []), +('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))], []), +('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', [('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)], []), +('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))], []), +('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)], []), @@ -1649,11 +1667,11 @@ def main(): ('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')), ('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))], [('Expr', (3, 7), ('Constant', (3, 7), 2))], 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)], []), -('Module', [('Expr', (1, 0), ('Dict', (1, 0), [None, ('Constant', (1, 10), 2)], [('Dict', (1, 3), [('Constant', (1, 4), 1)], [('Constant', (1, 6), 2)]), ('Constant', (1, 12), 3)]))], []), -('Module', [('Expr', (1, 0), ('Set', (1, 0), [('Starred', (1, 1), ('Set', (1, 2), [('Constant', (1, 3), 1), ('Constant', (1, 6), 2)]), ('Load',)), ('Constant', (1, 10), 3)]))], []), +('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', (3, 0), 'f', ('arguments', [], None, [], [], None, []), [('Pass', (3, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 0), ('Name', (2, 1), 'deco2', ('Load',)), [], [])], None, None)], []), ('Module', [('AsyncFunctionDef', (3, 0), 'f', ('arguments', [], None, [], [], None, []), [('Pass', (3, 15))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 0), ('Name', (2, 1), 'deco2', ('Load',)), [], [])], None, None)], []), @@ -1661,18 +1679,18 @@ def main(): ('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)], []), ] single_results = [ -('Interactive', [('Expr', (1, 0), ('BinOp', (1, 0), ('Constant', (1, 0), 1), ('Add',), ('Constant', (1, 2), 2)))]), +('Interactive', [('Expr', (1, 0), ('BinOp', (1, 0), ('Constant', (1, 0), 1, None), ('Add',), ('Constant', (1, 2), 2, None)))]), ] eval_results = [ -('Expression', ('Constant', (1, 0), None)), +('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))), -('Expression', ('Dict', (1, 0), [('Constant', (1, 2), 1)], [('Constant', (1, 4), 2)])), +('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)])), -('Expression', ('Dict', (1, 0), [('Constant', (2, 6), 1)], [('Constant', (4, 10), 2)])), +('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)])), @@ -1684,19 +1702,19 @@ def main(): ('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), [('Lt',), ('Lt',)], [('Constant', (1, 4), 2), ('Constant', (1, 8), 3)])), -('Expression', ('Call', (1, 0), ('Name', (1, 0), 'f', ('Load',)), [('Constant', (1, 2), 1), ('Constant', (1, 4), 2), ('Starred', (1, 10), ('Name', (1, 11), 'd', ('Load',)), ('Load',))], [('keyword', 'c', ('Constant', (1, 8), 3)), ('keyword', None, ('Name', (1, 15), 'e', ('Load',)))])), +('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',)), [('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)), -('Expression', ('Constant', (1, 0), 'string')), +('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), ('Constant', (1, 3), 2), ('Constant', (1, 5), 3)], ('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), ('Constant', (1, 2), 2), ('Constant', (1, 4), 3)], ('Load',))), -('Expression', ('Tuple', (1, 0), [('Constant', (1, 1), 1), ('Constant', (1, 3), 2), ('Constant', (1, 5), 3)], ('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), ('Constant', (1, 14), 2), None), ('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',))], [])), ] main() diff --git a/Misc/NEWS.d/next/Library/2019-03-12-21-02-55.bpo-36280.mOd3iH.rst b/Misc/NEWS.d/next/Library/2019-03-12-21-02-55.bpo-36280.mOd3iH.rst new file mode 100644 index 000000000000..e97285431e53 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-12-21-02-55.bpo-36280.mOd3iH.rst @@ -0,0 +1,2 @@ +Add a kind field to ast.Constant. It is 'u' if the literal has a 'u' prefix +(i.e. a Python 2 style unicode literal), else None. diff --git a/Parser/Python.asdl b/Parser/Python.asdl index 1ccd2ca223f0..c32b65a52fe5 100644 --- a/Parser/Python.asdl +++ b/Parser/Python.asdl @@ -78,7 +78,7 @@ module Python | Call(expr func, expr* args, keyword* keywords) | FormattedValue(expr value, int? conversion, expr? format_spec) | JoinedStr(expr* values) - | Constant(constant value) + | Constant(constant value, string? kind) -- the following expression can appear in assignment context | Attribute(expr value, identifier attr, expr_context ctx) diff --git a/Python/Python-ast.c b/Python/Python-ast.c index 0411f9f07f27..d0416eb639c2 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -324,8 +324,10 @@ static char *JoinedStr_fields[]={ "values", }; static PyTypeObject *Constant_type; +_Py_IDENTIFIER(kind); static char *Constant_fields[]={ "value", + "kind", }; static PyTypeObject *Attribute_type; _Py_IDENTIFIER(attr); @@ -950,7 +952,7 @@ static int init_types(void) if (!FormattedValue_type) return 0; JoinedStr_type = make_type("JoinedStr", expr_type, JoinedStr_fields, 1); if (!JoinedStr_type) return 0; - Constant_type = make_type("Constant", expr_type, Constant_fields, 1); + Constant_type = make_type("Constant", expr_type, Constant_fields, 2); if (!Constant_type) return 0; Attribute_type = make_type("Attribute", expr_type, Attribute_fields, 3); if (!Attribute_type) return 0; @@ -2287,8 +2289,8 @@ JoinedStr(asdl_seq * values, int lineno, int col_offset, int end_lineno, int } expr_ty -Constant(constant value, int lineno, int col_offset, int end_lineno, int - end_col_offset, PyArena *arena) +Constant(constant value, string kind, int lineno, int col_offset, int + end_lineno, int end_col_offset, PyArena *arena) { expr_ty p; if (!value) { @@ -2301,6 +2303,7 @@ Constant(constant value, int lineno, int col_offset, int end_lineno, int return NULL; p->kind = Constant_kind; p->v.Constant.value = value; + p->v.Constant.kind = kind; p->lineno = lineno; p->col_offset = col_offset; p->end_lineno = end_lineno; @@ -3507,6 +3510,11 @@ ast2obj_expr(void* _o) if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) goto failed; Py_DECREF(value); + value = ast2obj_string(o->v.Constant.kind); + if (!value) goto failed; + if (_PyObject_SetAttrId(result, &PyId_kind, value) == -1) + goto failed; + Py_DECREF(value); break; case Attribute_kind: result = PyType_GenericNew(Attribute_type, NULL, NULL); @@ -7224,6 +7232,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } if (isinstance) { constant value; + string kind; if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { return 1; @@ -7238,8 +7247,21 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (res != 0) goto failed; Py_CLEAR(tmp); } - *out = Constant(value, lineno, col_offset, end_lineno, end_col_offset, - arena); + if (_PyObject_LookupAttrId(obj, &PyId_kind, &tmp) < 0) { + return 1; + } + if (tmp == NULL || tmp == Py_None) { + Py_CLEAR(tmp); + kind = NULL; + } + else { + int res; + res = obj2ast_string(tmp, &kind, arena); + if (res != 0) goto failed; + Py_CLEAR(tmp); + } + *out = Constant(value, kind, lineno, col_offset, end_lineno, + end_col_offset, arena); if (*out == NULL) goto failed; return 0; } diff --git a/Python/ast.c b/Python/ast.c index d4ee1b351fe1..971b8ddc8c24 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -2313,13 +2313,13 @@ ast_for_atom(struct compiling *c, const node *n) size_t len = strlen(s); if (len >= 4 && len <= 5) { if (!strcmp(s, "None")) - return Constant(Py_None, LINENO(n), n->n_col_offset, + return Constant(Py_None, NULL, LINENO(n), n->n_col_offset, n->n_end_lineno, n->n_end_col_offset, c->c_arena); if (!strcmp(s, "True")) - return Constant(Py_True, LINENO(n), n->n_col_offset, + return Constant(Py_True, NULL, LINENO(n), n->n_col_offset, n->n_end_lineno, n->n_end_col_offset, c->c_arena); if (!strcmp(s, "False")) - return Constant(Py_False, LINENO(n), n->n_col_offset, + return Constant(Py_False, NULL, LINENO(n), n->n_col_offset, n->n_end_lineno, n->n_end_col_offset, c->c_arena); } name = new_identifier(s, c); @@ -2374,11 +2374,11 @@ ast_for_atom(struct compiling *c, const node *n) Py_DECREF(pynum); return NULL; } - return Constant(pynum, LINENO(n), n->n_col_offset, + return Constant(pynum, NULL, LINENO(n), n->n_col_offset, n->n_end_lineno, n->n_end_col_offset, c->c_arena); } case ELLIPSIS: /* Ellipsis */ - return Constant(Py_Ellipsis, LINENO(n), n->n_col_offset, + return Constant(Py_Ellipsis, NULL, LINENO(n), n->n_col_offset, n->n_end_lineno, n->n_end_col_offset, c->c_arena); case LPAR: /* some parenthesized expressions */ ch = CHILD(n, 1); @@ -5388,18 +5388,57 @@ FstringParser_Dealloc(FstringParser *state) ExprList_Dealloc(&state->expr_list); } +/* Constants for the following */ +static PyObject *u_kind; + +/* Compute 'kind' field for string Constant (either 'u' or None) */ +static PyObject * +make_kind(struct compiling *c, const node *n) +{ + char *s = NULL; + PyObject *kind = NULL; + + /* Find the first string literal, if any */ + while (TYPE(n) != STRING) { + if (NCH(n) == 0) + return NULL; + n = CHILD(n, 0); + } + REQ(n, STRING); + + /* If it starts with 'u', return a PyUnicode "u" string */ + s = STR(n); + if (s && *s == 'u') { + if (!u_kind) { + u_kind = PyUnicode_InternFromString("u"); + if (!u_kind) + return NULL; + } + kind = u_kind; + if (PyArena_AddPyObject(c->c_arena, kind) < 0) { + return NULL; + } + Py_INCREF(kind); + } + return kind; +} + /* Make a Constant node, but decref the PyUnicode object being added. */ static expr_ty make_str_node_and_del(PyObject **str, struct compiling *c, const node* n) { PyObject *s = *str; + PyObject *kind = NULL; *str = NULL; assert(PyUnicode_CheckExact(s)); if (PyArena_AddPyObject(c->c_arena, s) < 0) { Py_DECREF(s); return NULL; } - return Constant(s, LINENO(n), n->n_col_offset, + kind = make_kind(c, n); + if (kind == NULL && PyErr_Occurred()) + return NULL; + return Constant(s, kind, LINENO(n), n->n_col_offset, n->n_end_lineno, n->n_end_col_offset, c->c_arena); } @@ -5774,7 +5813,7 @@ parsestrplus(struct compiling *c, const node *n) /* Just return the bytes object and we're done. */ if (PyArena_AddPyObject(c->c_arena, bytes_str) < 0) goto error; - return Constant(bytes_str, LINENO(n), n->n_col_offset, + return Constant(bytes_str, NULL, LINENO(n), n->n_col_offset, n->n_end_lineno, n->n_end_col_offset, c->c_arena); } From webhook-mailer at python.org Wed Mar 13 17:00:21 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Wed, 13 Mar 2019 21:00:21 -0000 Subject: [Python-checkins] bpo-36254: Fix invalid uses of %d in format strings in C. (GH-12264) Message-ID: https://github.com/python/cpython/commit/d53fe5f407ff4b529628b01a1bcbf21a6aad5c3a commit: d53fe5f407ff4b529628b01a1bcbf21a6aad5c3a branch: master author: Serhiy Storchaka committer: GitHub date: 2019-03-13T22:59:55+02:00 summary: bpo-36254: Fix invalid uses of %d in format strings in C. (GH-12264) files: M Modules/_collectionsmodule.c M Modules/_ctypes/callbacks.c M Modules/_ctypes/callproc.c M Modules/_ctypes/malloc_closure.c M Modules/_io/winconsoleio.c M Modules/_localemodule.c M Modules/_lzmamodule.c M Modules/_multiprocessing/semaphore.c M Modules/_ssl.c M Modules/binascii.c M Modules/socketmodule.c M Objects/bytesobject.c M Objects/odictobject.c M Objects/structseq.c M PC/launcher.c M Python/coreconfig.c M Python/dynload_win.c M Python/getargs.c M Python/hamt.c M Python/pyarena.c diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index 8fb5fc233a65..a40b681d2835 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -2388,7 +2388,7 @@ tuplegetter_descr_get(PyObject *self, PyObject *obj, PyObject *type) return self; } PyErr_Format(PyExc_TypeError, - "descriptor for index '%d' for tuple subclasses " + "descriptor for index '%zd' for tuple subclasses " "doesn't apply to '%s' object", index, obj->ob_type->tp_name); diff --git a/Modules/_ctypes/callbacks.c b/Modules/_ctypes/callbacks.c index c1e9b723aac6..2b7cb06ea8a9 100644 --- a/Modules/_ctypes/callbacks.c +++ b/Modules/_ctypes/callbacks.c @@ -165,14 +165,14 @@ static void _CallPythonObject(void *mem, if (cnv) dict = PyType_stgdict(cnv); else { - PrintError("Getting argument converter %d\n", i); + PrintError("Getting argument converter %zd\n", i); goto Done; } if (dict && dict->getfunc && !_ctypes_simple_instance(cnv)) { PyObject *v = dict->getfunc(*pArgs, dict->size); if (!v) { - PrintError("create argument %d:\n", i); + PrintError("create argument %zd:\n", i); Py_DECREF(cnv); goto Done; } @@ -186,14 +186,14 @@ static void _CallPythonObject(void *mem, /* Hm, shouldn't we use PyCData_AtAddress() or something like that instead? */ CDataObject *obj = (CDataObject *)_PyObject_CallNoArg(cnv); if (!obj) { - PrintError("create argument %d:\n", i); + PrintError("create argument %zd:\n", i); Py_DECREF(cnv); goto Done; } if (!CDataObject_Check(obj)) { Py_DECREF(obj); Py_DECREF(cnv); - PrintError("unexpected result of create argument %d:\n", i); + PrintError("unexpected result of create argument %zd:\n", i); goto Done; } memcpy(obj->b_ptr, *pArgs, dict->size); @@ -204,7 +204,7 @@ static void _CallPythonObject(void *mem, } else { PyErr_SetString(PyExc_TypeError, "cannot build parameter"); - PrintError("Parsing argument %d\n", i); + PrintError("Parsing argument %zd\n", i); Py_DECREF(cnv); goto Done; } diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index 9bcc9557ec00..d91e84613b2f 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -1131,20 +1131,20 @@ PyObject *_ctypes_callproc(PPROC pProc, converter = PyTuple_GET_ITEM(argtypes, i); v = PyObject_CallFunctionObjArgs(converter, arg, NULL); if (v == NULL) { - _ctypes_extend_error(PyExc_ArgError, "argument %d: ", i+1); + _ctypes_extend_error(PyExc_ArgError, "argument %zd: ", i+1); goto cleanup; } err = ConvParam(v, i+1, pa); Py_DECREF(v); if (-1 == err) { - _ctypes_extend_error(PyExc_ArgError, "argument %d: ", i+1); + _ctypes_extend_error(PyExc_ArgError, "argument %zd: ", i+1); goto cleanup; } } else { err = ConvParam(arg, i+1, pa); if (-1 == err) { - _ctypes_extend_error(PyExc_ArgError, "argument %d: ", i+1); + _ctypes_extend_error(PyExc_ArgError, "argument %zd: ", i+1); goto cleanup; /* leaking ? */ } } diff --git a/Modules/_ctypes/malloc_closure.c b/Modules/_ctypes/malloc_closure.c index 248c6a67022b..8ad76497c7b3 100644 --- a/Modules/_ctypes/malloc_closure.c +++ b/Modules/_ctypes/malloc_closure.c @@ -76,7 +76,7 @@ static void more_core(void) #ifdef MALLOC_CLOSURE_DEBUG printf("block at %p allocated (%d bytes), %d ITEMs\n", - item, count * sizeof(ITEM), count); + item, count * (int)sizeof(ITEM), count); #endif /* put them into the free list */ for (i = 0; i < count; ++i) { diff --git a/Modules/_io/winconsoleio.c b/Modules/_io/winconsoleio.c index dd0997a10580..70a723ed746a 100644 --- a/Modules/_io/winconsoleio.c +++ b/Modules/_io/winconsoleio.c @@ -725,7 +725,7 @@ readinto(winconsoleio *self, char *buf, Py_ssize_t len) if (u8n) { PyErr_Format(PyExc_SystemError, - "Buffer had room for %d bytes but %d bytes required", + "Buffer had room for %zd bytes but %u bytes required", len, u8n); return -1; } diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c index 96ca68af178c..036bdb301f32 100644 --- a/Modules/_localemodule.c +++ b/Modules/_localemodule.c @@ -392,7 +392,7 @@ PyLocale_getdefaultlocale(PyObject* self, PyObject *Py_UNUSED(ignored)) char encoding[20]; char locale[100]; - PyOS_snprintf(encoding, sizeof(encoding), "cp%d", GetACP()); + PyOS_snprintf(encoding, sizeof(encoding), "cp%u", GetACP()); if (GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SISO639LANGNAME, diff --git a/Modules/_lzmamodule.c b/Modules/_lzmamodule.c index b5f9561df2ad..18bc3dc296e0 100644 --- a/Modules/_lzmamodule.c +++ b/Modules/_lzmamodule.c @@ -219,7 +219,7 @@ parse_filter_spec_lzma(PyObject *spec) if (lzma_lzma_preset(options, preset)) { PyMem_Free(options); - PyErr_Format(Error, "Invalid compression preset: %d", preset); + PyErr_Format(Error, "Invalid compression preset: %u", preset); return NULL; } @@ -622,7 +622,7 @@ Compressor_init_alone(lzma_stream *lzs, uint32_t preset, PyObject *filterspecs) lzma_options_lzma options; if (lzma_lzma_preset(&options, preset)) { - PyErr_Format(Error, "Invalid compression preset: %d", preset); + PyErr_Format(Error, "Invalid compression preset: %u", preset); return -1; } lzret = lzma_alone_encoder(lzs, &options); diff --git a/Modules/_multiprocessing/semaphore.c b/Modules/_multiprocessing/semaphore.c index bb7219e13070..cbcc64cb578f 100644 --- a/Modules/_multiprocessing/semaphore.c +++ b/Modules/_multiprocessing/semaphore.c @@ -141,7 +141,7 @@ semlock_acquire(SemLockObject *self, PyObject *args, PyObject *kwds) default: PyErr_Format(PyExc_RuntimeError, "WaitForSingleObject() or " "WaitForMultipleObjects() gave unrecognized " - "value %d", res); + "value %u", res); return NULL; } } diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 0e720e268d93..f2ce7fa627ee 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -3347,7 +3347,7 @@ _ssl__SSLContext__set_alpn_protocols_impl(PySSLContext *self, #if HAVE_ALPN if ((size_t)protos->len > UINT_MAX) { PyErr_Format(PyExc_OverflowError, - "protocols longer than %d bytes", UINT_MAX); + "protocols longer than %u bytes", UINT_MAX); return NULL; } diff --git a/Modules/binascii.c b/Modules/binascii.c index 19589f906f72..2e71ab97b05a 100644 --- a/Modules/binascii.c +++ b/Modules/binascii.c @@ -520,7 +520,7 @@ binascii_a2b_base64_impl(PyObject *module, Py_buffer *data) */ PyErr_Format(Error, "Invalid base64-encoded string: " - "number of data characters (%d) cannot be 1 more " + "number of data characters (%zd) cannot be 1 more " "than a multiple of 4", (bin_data - bin_data_start) / 3 * 4 + 1); } else { diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 8c3c2faddb9d..1120f6b51325 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -4198,7 +4198,7 @@ sock_sendto(PySocketSockObject *s, PyObject *args) break; default: PyErr_Format(PyExc_TypeError, - "sendto() takes 2 or 3 arguments (%d given)", + "sendto() takes 2 or 3 arguments (%zd given)", arglen); return NULL; } @@ -4741,7 +4741,7 @@ sock_ioctl(PySocketSockObject *s, PyObject *arg) return PyLong_FromUnsignedLong(recv); } #endif default: - PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd); + PyErr_Format(PyExc_ValueError, "invalid ioctl command %lu", cmd); return NULL; } } diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index b299d4871702..0b46ceedf00c 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -1210,7 +1210,7 @@ PyObject *_PyBytes_DecodeEscape(const char *s, if (!errors || strcmp(errors, "strict") == 0) { PyErr_Format(PyExc_ValueError, - "invalid \\x escape at position %d", + "invalid \\x escape at position %zd", s - 2 - (end - len)); goto failed; } diff --git a/Objects/odictobject.c b/Objects/odictobject.c index 767eb5f60612..6c75a42f4ee7 100644 --- a/Objects/odictobject.c +++ b/Objects/odictobject.c @@ -1539,7 +1539,7 @@ odict_init(PyObject *self, PyObject *args, PyObject *kwds) if (len == -1) return -1; if (len > 1) { - const char *msg = "expected at most 1 arguments, got %d"; + const char *msg = "expected at most 1 arguments, got %zd"; PyErr_Format(PyExc_TypeError, msg, len); return -1; } @@ -2213,7 +2213,7 @@ mutablemapping_update(PyObject *self, PyObject *args, PyObject *kwargs) assert(args == NULL || PyTuple_Check(args)); len = (args != NULL) ? PyTuple_GET_SIZE(args) : 0; if (len > 1) { - const char *msg = "update() takes at most 1 positional argument (%d given)"; + const char *msg = "update() takes at most 1 positional argument (%zd given)"; PyErr_Format(PyExc_TypeError, msg, len); return NULL; } diff --git a/Objects/structseq.c b/Objects/structseq.c index 56b06c707f89..1c37845950fe 100644 --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -195,7 +195,7 @@ structseq_repr(PyStructSequence *obj) cname = typ->tp_members[i].name; if (cname == NULL) { - PyErr_Format(PyExc_SystemError, "In structseq_repr(), member %d name is NULL" + PyErr_Format(PyExc_SystemError, "In structseq_repr(), member %zd name is NULL" " for type %.500s", i, typ->tp_name); return NULL; } diff --git a/PC/launcher.c b/PC/launcher.c index a4e678115f34..0f5003a8370e 100644 --- a/PC/launcher.c +++ b/PC/launcher.c @@ -718,7 +718,7 @@ invoke_child(wchar_t * executable, wchar_t * suffix, wchar_t * cmdline) } child_command = calloc(child_command_size, sizeof(wchar_t)); if (child_command == NULL) - error(RC_CREATE_PROCESS, L"unable to allocate %d bytes for child command.", + error(RC_CREATE_PROCESS, L"unable to allocate %zd bytes for child command.", child_command_size); if (no_suffix) _snwprintf_s(child_command, child_command_size, @@ -1189,7 +1189,7 @@ maybe_handle_shebang(wchar_t ** argv, wchar_t * cmdline) if (rc == 0) { read = fread(buffer, sizeof(char), BUFSIZE, fp); - debug(L"maybe_handle_shebang: read %d bytes\n", read); + debug(L"maybe_handle_shebang: read %zd bytes\n", read); fclose(fp); if ((read >= 4) && (buffer[3] == '\n') && (buffer[2] == '\r')) { @@ -1209,7 +1209,7 @@ maybe_handle_shebang(wchar_t ** argv, wchar_t * cmdline) bom = BOMs; /* points to UTF-8 entry - the default */ } else { - debug(L"maybe_handle_shebang: BOM found, code page %d\n", + debug(L"maybe_handle_shebang: BOM found, code page %u\n", bom->code_page); start = &buffer[bom->length]; } diff --git a/Python/coreconfig.c b/Python/coreconfig.c index cd4ef22ff69e..845e4c9a163a 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -1103,7 +1103,7 @@ get_locale_encoding(char **locale_encoding) { #ifdef MS_WINDOWS char encoding[20]; - PyOS_snprintf(encoding, sizeof(encoding), "cp%d", GetACP()); + PyOS_snprintf(encoding, sizeof(encoding), "cp%u", GetACP()); #elif defined(__ANDROID__) || defined(__VXWORKS__) const char *encoding = "UTF-8"; #else diff --git a/Python/dynload_win.c b/Python/dynload_win.c index 129e04d1b21d..36918c3579d9 100644 --- a/Python/dynload_win.c +++ b/Python/dynload_win.c @@ -256,7 +256,7 @@ dl_funcptr _PyImport_FindSharedFuncptrWindows(const char *prefix, This should not happen if called correctly. */ if (theLength == 0) { message = PyUnicode_FromFormat( - "DLL load failed with error code %d", + "DLL load failed with error code %u", errorCode); } else { /* For some reason a \r\n diff --git a/Python/getargs.c b/Python/getargs.c index ba1a9d4214ff..876f5c76d20b 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -372,14 +372,14 @@ vgetargs1_impl(PyObject *compat_args, PyObject *const *stack, Py_ssize_t nargs, if (nargs < min || max < nargs) { if (message == NULL) PyErr_Format(PyExc_TypeError, - "%.150s%s takes %s %d argument%s (%ld given)", + "%.150s%s takes %s %d argument%s (%zd given)", fname==NULL ? "function" : fname, fname==NULL ? "" : "()", min==max ? "exactly" : nargs < min ? "at least" : "at most", nargs < min ? min : max, (nargs < min ? min : max) == 1 ? "" : "s", - Py_SAFE_DOWNCAST(nargs, Py_ssize_t, long)); + nargs); else PyErr_SetString(PyExc_TypeError, message); return cleanreturn(0, &freelist); @@ -1741,7 +1741,7 @@ vgetargskeywords(PyObject *args, PyObject *kwargs, const char *format, else { PyErr_Format(PyExc_TypeError, "%.200s%s takes %s %d positional argument%s" - " (%d given)", + " (%zd given)", (fname == NULL) ? "function" : fname, (fname == NULL) ? "" : "()", (min != INT_MAX) ? "at most" : "exactly", @@ -1826,7 +1826,7 @@ vgetargskeywords(PyObject *args, PyObject *kwargs, const char *format, if (skip) { PyErr_Format(PyExc_TypeError, "%.200s%s takes %s %d positional argument%s" - " (%d given)", + " (%zd given)", (fname == NULL) ? "function" : fname, (fname == NULL) ? "" : "()", (Py_MIN(pos, min) < i) ? "at least" : "exactly", @@ -2194,7 +2194,7 @@ vgetargskeywordsfast_impl(PyObject *const *args, Py_ssize_t nargs, Py_ssize_t min = Py_MIN(pos, parser->min); PyErr_Format(PyExc_TypeError, "%.200s%s takes %s %d positional argument%s" - " (%d given)", + " (%zd given)", (parser->fname == NULL) ? "function" : parser->fname, (parser->fname == NULL) ? "" : "()", min < parser->max ? "at least" : "exactly", diff --git a/Python/hamt.c b/Python/hamt.c index aa90d37240a3..67af04c4377c 100644 --- a/Python/hamt.c +++ b/Python/hamt.c @@ -2005,7 +2005,7 @@ hamt_node_array_dump(PyHamtNode_Array *node, goto error; } - if (_hamt_dump_format(writer, "%d::\n", i)) { + if (_hamt_dump_format(writer, "%zd::\n", i)) { goto error; } diff --git a/Python/pyarena.c b/Python/pyarena.c index abb5729c8ace..aefb787e554f 100644 --- a/Python/pyarena.c +++ b/Python/pyarena.c @@ -160,7 +160,7 @@ PyArena_Free(PyArena *arena) #if defined(Py_DEBUG) /* fprintf(stderr, - "alloc=%d size=%d blocks=%d block_size=%d big=%d objects=%d\n", + "alloc=%zu size=%zu blocks=%zu block_size=%zu big=%zu objects=%zu\n", arena->total_allocs, arena->total_size, arena->total_blocks, arena->total_block_size, arena->total_big_blocks, PyList_Size(arena->a_objects)); From webhook-mailer at python.org Wed Mar 13 17:03:26 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Wed, 13 Mar 2019 21:03:26 -0000 Subject: [Python-checkins] bpo-36282: Improved error message for too much positional arguments. (GH-12310) Message-ID: https://github.com/python/cpython/commit/f2f55e7f03d332fd43bc665a86d585a79c3b3ed4 commit: f2f55e7f03d332fd43bc665a86d585a79c3b3ed4 branch: master author: Serhiy Storchaka committer: GitHub date: 2019-03-13T23:03:22+02:00 summary: bpo-36282: Improved error message for too much positional arguments. (GH-12310) files: A Misc/NEWS.d/next/Core and Builtins/2019-03-13-22-47-28.bpo-36282.zs7RKP.rst M Lib/test/test_call.py M Python/getargs.c diff --git a/Lib/test/test_call.py b/Lib/test/test_call.py index 75a4a9ff8123..0da0719457f5 100644 --- a/Lib/test/test_call.py +++ b/Lib/test/test_call.py @@ -157,7 +157,7 @@ def test_varargs2(self): self.assertRaisesRegex(TypeError, msg, {}.__contains__, 0, 1) def test_varargs3(self): - msg = r"^from_bytes\(\) takes at most 2 positional arguments \(3 given\)" + msg = r"^from_bytes\(\) takes exactly 2 positional arguments \(3 given\)" self.assertRaisesRegex(TypeError, msg, int.from_bytes, b'a', 'little', False) def test_varargs1min(self): diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-13-22-47-28.bpo-36282.zs7RKP.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-13-22-47-28.bpo-36282.zs7RKP.rst new file mode 100644 index 000000000000..f9ec51e381d0 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-13-22-47-28.bpo-36282.zs7RKP.rst @@ -0,0 +1,2 @@ +Improved error message for too much positional arguments in some builtin +functions. diff --git a/Python/getargs.c b/Python/getargs.c index 876f5c76d20b..77ded609eea9 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -2137,7 +2137,7 @@ vgetargskeywordsfast_impl(PyObject *const *args, Py_ssize_t nargs, "%.200s%s takes %s %d positional argument%s (%d given)", (parser->fname == NULL) ? "function" : parser->fname, (parser->fname == NULL) ? "" : "()", - (parser->min != INT_MAX) ? "at most" : "exactly", + (parser->min < parser->max) ? "at most" : "exactly", parser->max, parser->max == 1 ? "" : "s", nargs); From webhook-mailer at python.org Wed Mar 13 17:43:55 2019 From: webhook-mailer at python.org (Steve Dower) Date: Wed, 13 Mar 2019 21:43:55 -0000 Subject: [Python-checkins] bpo-36174: Update nuget authoring for new license field. (GH-12300) Message-ID: https://github.com/python/cpython/commit/ce5c7a93d47e07327d19dfb47a967f1b18b7d6e8 commit: ce5c7a93d47e07327d19dfb47a967f1b18b7d6e8 branch: 2.7 author: Steve Dower committer: GitHub date: 2019-03-13T14:43:47-07:00 summary: bpo-36174: Update nuget authoring for new license field. (GH-12300) files: M Tools/nuget/make_zip.py M Tools/nuget/python2.nuspec M Tools/nuget/python2x86.nuspec diff --git a/Tools/nuget/make_zip.py b/Tools/nuget/make_zip.py index 20fadf2dda43..8844cacb096e 100644 --- a/Tools/nuget/make_zip.py +++ b/Tools/nuget/make_zip.py @@ -103,6 +103,7 @@ def include_in_tools(p): ('Lib/', 'Lib', '**/*', include_in_lib), ('libs/', 'PCBuild/$arch', '*.lib', include_in_libs), ('Tools/', 'Tools', '**/*', include_in_tools), + ('/', '', 'LICENSE', None), ] EMBED_LAYOUT = [ diff --git a/Tools/nuget/python2.nuspec b/Tools/nuget/python2.nuspec index 7c1a63db4e6f..d5e1e8b75717 100644 --- a/Tools/nuget/python2.nuspec +++ b/Tools/nuget/python2.nuspec @@ -5,9 +5,8 @@ Python 2.7 0.0.0.0 Python Software Foundation - https://docs.python.org/2.7/license.html + tools\LICENSE https://www.python.org/ - false Installs 64-bit Python 2.7 for use in build scenarios. https://www.python.org/static/favicon.ico python diff --git a/Tools/nuget/python2x86.nuspec b/Tools/nuget/python2x86.nuspec index 6f433217054a..ff12ac226c71 100644 --- a/Tools/nuget/python2x86.nuspec +++ b/Tools/nuget/python2x86.nuspec @@ -5,9 +5,8 @@ Python 2.7 (32-bit) Python Software Foundation 0.0.0.0 - https://docs.python.org/2.7/license.html + tools\LICENSE https://www.python.org/ - false Installs 32-bit Python 2.7 for use in build scenarios. https://www.python.org/static/favicon.ico python From webhook-mailer at python.org Thu Mar 14 04:06:24 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Thu, 14 Mar 2019 08:06:24 -0000 Subject: [Python-checkins] bpo-36254: Fix yet one invalid use of %d in format string in C. (GH-12318) Message-ID: https://github.com/python/cpython/commit/2c0d3f454705bb5ccf5f6189f3cf77bbae4f056b commit: 2c0d3f454705bb5ccf5f6189f3cf77bbae4f056b branch: master author: Serhiy Storchaka committer: GitHub date: 2019-03-14T10:06:05+02:00 summary: bpo-36254: Fix yet one invalid use of %d in format string in C. (GH-12318) files: M Python/getargs.c diff --git a/Python/getargs.c b/Python/getargs.c index 77ded609eea9..05ebe9c45b37 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -2134,7 +2134,7 @@ vgetargskeywordsfast_impl(PyObject *const *args, Py_ssize_t nargs, } else { PyErr_Format(PyExc_TypeError, - "%.200s%s takes %s %d positional argument%s (%d given)", + "%.200s%s takes %s %d positional argument%s (%zd given)", (parser->fname == NULL) ? "function" : parser->fname, (parser->fname == NULL) ? "" : "()", (parser->min < parser->max) ? "at most" : "exactly", From webhook-mailer at python.org Thu Mar 14 04:32:28 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Thu, 14 Mar 2019 08:32:28 -0000 Subject: [Python-checkins] bpo-36127: Argument Clinic: inline parsing code for keyword parameters. (GH-12058) Message-ID: https://github.com/python/cpython/commit/3191391515824fa7f3c573d807f1034c6a28fab3 commit: 3191391515824fa7f3c573d807f1034c6a28fab3 branch: master author: Serhiy Storchaka committer: GitHub date: 2019-03-14T10:32:22+02:00 summary: bpo-36127: Argument Clinic: inline parsing code for keyword parameters. (GH-12058) files: M Doc/whatsnew/3.8.rst M Include/modsupport.h M Lib/test/clinic.test M Modules/_blake2/clinic/blake2b_impl.c.h M Modules/_blake2/clinic/blake2s_impl.c.h M Modules/_io/clinic/_iomodule.c.h M Modules/_io/clinic/bufferedio.c.h M Modules/_io/clinic/bytesio.c.h M Modules/_io/clinic/fileio.c.h M Modules/_io/clinic/stringio.c.h M Modules/_io/clinic/textio.c.h M Modules/_io/clinic/winconsoleio.c.h M Modules/_multiprocessing/clinic/posixshmem.c.h M Modules/cjkcodecs/clinic/multibytecodec.c.h M Modules/clinic/_asynciomodule.c.h M Modules/clinic/_bz2module.c.h M Modules/clinic/_codecsmodule.c.h M Modules/clinic/_cursesmodule.c.h M Modules/clinic/_datetimemodule.c.h M Modules/clinic/_elementtree.c.h M Modules/clinic/_hashopenssl.c.h M Modules/clinic/_lzmamodule.c.h M Modules/clinic/_opcode.c.h M Modules/clinic/_pickle.c.h M Modules/clinic/_queuemodule.c.h M Modules/clinic/_sre.c.h M Modules/clinic/_ssl.c.h M Modules/clinic/_struct.c.h M Modules/clinic/binascii.c.h M Modules/clinic/cmathmodule.c.h M Modules/clinic/gcmodule.c.h M Modules/clinic/grpmodule.c.h M Modules/clinic/itertoolsmodule.c.h M Modules/clinic/mathmodule.c.h M Modules/clinic/md5module.c.h M Modules/clinic/posixmodule.c.h M Modules/clinic/pyexpat.c.h M Modules/clinic/selectmodule.c.h M Modules/clinic/sha1module.c.h M Modules/clinic/sha256module.c.h M Modules/clinic/sha512module.c.h M Modules/clinic/zlibmodule.c.h M Objects/clinic/bytearrayobject.c.h M Objects/clinic/bytesobject.c.h M Objects/clinic/complexobject.c.h M Objects/clinic/descrobject.c.h M Objects/clinic/enumobject.c.h M Objects/clinic/funcobject.c.h M Objects/clinic/listobject.c.h M Objects/clinic/longobject.c.h M Objects/clinic/moduleobject.c.h M Objects/clinic/odictobject.c.h M Objects/clinic/structseq.c.h M Objects/clinic/unicodeobject.c.h M Objects/stringlib/clinic/transmogrify.h.h M PC/clinic/_testconsole.c.h M PC/clinic/winreg.c.h M PC/clinic/winsound.c.h M Python/clinic/_warnings.c.h M Python/clinic/bltinmodule.c.h M Python/clinic/import.c.h M Python/clinic/sysmodule.c.h M Python/clinic/traceback.c.h M Python/getargs.c M Tools/clinic/clinic.py diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 4adeded30375..31ea0d145819 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -442,6 +442,11 @@ Optimizations (Contributed by Stefan Behnel, Pablo Galindo Salgado, Raymond Hettinger, Neil Schemenauer, and Serhiy Storchaka in :issue:`36012`.) +* Reduced an overhead of converting arguments passed to many builtin functions + and methods. This sped up calling some simple builtin functions and + methods up to 20--50%. (Contributed by Serhiy Storchaka in :issue:`23867`, + :issue:`35582` and :issue:`36127`.) + Build and C API Changes ======================= diff --git a/Include/modsupport.h b/Include/modsupport.h index f17060c2e1e2..66a5ec839e2a 100644 --- a/Include/modsupport.h +++ b/Include/modsupport.h @@ -118,6 +118,18 @@ PyAPI_FUNC(int) _PyArg_ParseStackAndKeywords( ...); PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywordsFast(PyObject *, PyObject *, struct _PyArg_Parser *, va_list); +PyAPI_FUNC(PyObject * const *) _PyArg_UnpackKeywords( + PyObject *const *args, Py_ssize_t nargs, + PyObject *kwargs, PyObject *kwnames, + struct _PyArg_Parser *parser, + int minpos, int maxpos, int minkw, + PyObject **buf); +#define _PyArg_UnpackKeywords(args, nargs, kwargs, kwnames, parser, minpos, maxpos, minkw, buf) \ + (((minkw) == 0 && (kwargs) == NULL && (kwnames) == NULL && \ + (minpos) <= (nargs) && (nargs) <= (maxpos) && args != NULL) ? (args) : \ + _PyArg_UnpackKeywords((args), (nargs), (kwargs), (kwnames), (parser), \ + (minpos), (maxpos), (minkw), (buf))) + void _PyArg_Fini(void); #endif /* Py_LIMITED_API */ diff --git a/Lib/test/clinic.test b/Lib/test/clinic.test index b8f2331b4375..62c2f00c6b2b 100644 --- a/Lib/test/clinic.test +++ b/Lib/test/clinic.test @@ -3,6 +3,7 @@ output preset block [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=3c81ac2402d06a8b]*/ + /*[clinic input] test_object_converter @@ -59,6 +60,7 @@ test_object_converter_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c, PyUnicode_Object *d) /*[clinic end generated code: output=f2c26174b3d46e94 input=005e6a8a711a869b]*/ + /*[clinic input] test_object_converter_one_arg @@ -79,6 +81,7 @@ static PyObject * test_object_converter_one_arg(PyObject *module, PyObject *a) /*[clinic end generated code: output=6da755f8502139df input=d635d92a421f1ca3]*/ + /*[clinic input] test_objects_converter @@ -125,6 +128,7 @@ static PyObject * test_objects_converter_impl(PyObject *module, PyObject *a, PyObject *b) /*[clinic end generated code: output=58009c0e42b4834e input=4cbb3d9edd2a36f3]*/ + /*[clinic input] test_object_converter_subclass_of @@ -238,6 +242,7 @@ test_object_converter_subclass_of_impl(PyObject *module, PyObject *a, PyObject *h, PyObject *i, PyObject *j) /*[clinic end generated code: output=99691bda8eeda6d6 input=31b06b772d5f983e]*/ + /*[clinic input] test_PyBytesObject_converter @@ -278,6 +283,7 @@ static PyObject * test_PyBytesObject_converter_impl(PyObject *module, PyBytesObject *a) /*[clinic end generated code: output=5d9a301c1df24eb5 input=12b10c7cb5750400]*/ + /*[clinic input] test_PyByteArrayObject_converter @@ -318,6 +324,7 @@ static PyObject * test_PyByteArrayObject_converter_impl(PyObject *module, PyByteArrayObject *a) /*[clinic end generated code: output=9455d06f4f09637b input=5a657da535d194ae]*/ + /*[clinic input] test_unicode_converter @@ -361,6 +368,7 @@ static PyObject * test_unicode_converter_impl(PyObject *module, PyObject *a) /*[clinic end generated code: output=9275c04fe204f4c5 input=aa33612df92aa9c5]*/ + /*[clinic input] test_bool_converter @@ -430,6 +438,7 @@ static PyObject * test_bool_converter_impl(PyObject *module, int a, int b, int c) /*[clinic end generated code: output=25f20963894256a1 input=939854fa9f248c60]*/ + /*[clinic input] test_char_converter @@ -683,6 +692,7 @@ test_char_converter_impl(PyObject *module, char a, char b, char c, char d, char k, char l, char m, char n) /*[clinic end generated code: output=e041d687555e0a5d input=e42330417a44feac]*/ + /*[clinic input] test_unsigned_char_converter @@ -799,6 +809,7 @@ test_unsigned_char_converter_impl(PyObject *module, unsigned char a, unsigned char b, unsigned char c) /*[clinic end generated code: output=ebf905c5c9414762 input=021414060993e289]*/ + /*[clinic input] test_short_converter @@ -865,6 +876,7 @@ static PyObject * test_short_converter_impl(PyObject *module, short a) /*[clinic end generated code: output=86fe1a1496a7ff20 input=6a8a7a509a498ff4]*/ + /*[clinic input] test_unsigned_short_converter @@ -934,6 +946,7 @@ test_unsigned_short_converter_impl(PyObject *module, unsigned short a, unsigned short b, unsigned short c) /*[clinic end generated code: output=3779fe104319e3ae input=cdfd8eff3d9176b4]*/ + /*[clinic input] test_int_converter @@ -1030,6 +1043,7 @@ static PyObject * test_int_converter_impl(PyObject *module, int a, int b, int c, myenum d) /*[clinic end generated code: output=de74e24e85a669a5 input=d20541fc1ca0553e]*/ + /*[clinic input] test_unsigned_int_converter @@ -1099,6 +1113,7 @@ test_unsigned_int_converter_impl(PyObject *module, unsigned int a, unsigned int b, unsigned int c) /*[clinic end generated code: output=189176ce67c7d2e7 input=5533534828b62fc0]*/ + /*[clinic input] test_long_converter @@ -1150,6 +1165,7 @@ static PyObject * test_long_converter_impl(PyObject *module, long a) /*[clinic end generated code: output=44cd8823f59d116b input=d2179e3c9cdcde89]*/ + /*[clinic input] test_unsigned_long_converter @@ -1215,6 +1231,7 @@ test_unsigned_long_converter_impl(PyObject *module, unsigned long a, unsigned long b, unsigned long c) /*[clinic end generated code: output=1c05c871c0309e08 input=f450d94cae1ef73b]*/ + /*[clinic input] test_long_long_converter @@ -1266,6 +1283,7 @@ static PyObject * test_long_long_converter_impl(PyObject *module, long long a) /*[clinic end generated code: output=3e8083f3aee4f18a input=d5fc81577ff4dd02]*/ + /*[clinic input] test_unsigned_long_long_converter @@ -1335,6 +1353,7 @@ test_unsigned_long_long_converter_impl(PyObject *module, unsigned long long c) /*[clinic end generated code: output=0a9b17fb824e28eb input=a15115dc41866ff4]*/ + /*[clinic input] test_Py_ssize_t_converter @@ -1426,6 +1445,7 @@ test_Py_ssize_t_converter_impl(PyObject *module, Py_ssize_t a, Py_ssize_t b, Py_ssize_t c) /*[clinic end generated code: output=a46d2aaf40c10398 input=3855f184bb3f299d]*/ + /*[clinic input] test_slice_index_converter @@ -1489,6 +1509,7 @@ test_slice_index_converter_impl(PyObject *module, Py_ssize_t a, Py_ssize_t b, Py_ssize_t c) /*[clinic end generated code: output=2148703cd3c6e941 input=edeadb0ee126f531]*/ + /*[clinic input] test_size_t_converter @@ -1534,6 +1555,7 @@ static PyObject * test_size_t_converter_impl(PyObject *module, size_t a) /*[clinic end generated code: output=8a91a9ca8a92dabb input=52e93a0fed0f1fb3]*/ + /*[clinic input] test_float_converter @@ -1580,6 +1602,7 @@ static PyObject * test_float_converter_impl(PyObject *module, float a) /*[clinic end generated code: output=8293566b2ec1fc52 input=259c0d98eca35034]*/ + /*[clinic input] test_double_converter @@ -1626,6 +1649,7 @@ static PyObject * test_double_converter_impl(PyObject *module, double a) /*[clinic end generated code: output=487081a9b8da67ab input=c6a9945706a41c27]*/ + /*[clinic input] test_Py_complex_converter @@ -1665,6 +1689,7 @@ static PyObject * test_Py_complex_converter_impl(PyObject *module, Py_complex a) /*[clinic end generated code: output=c2ecbec2144ca540 input=070f216a515beb79]*/ + /*[clinic input] test_str_converter @@ -1730,6 +1755,7 @@ test_str_converter_impl(PyObject *module, const char *a, const char *b, const char *h, Py_ssize_clean_t h_length) /*[clinic end generated code: output=8415d82c56154307 input=8afe9da8185cd38c]*/ + /*[clinic input] test_str_converter_encoding @@ -1804,6 +1830,7 @@ test_str_converter_encoding_impl(PyObject *module, char *a, char *b, char *c, Py_ssize_clean_t e_length) /*[clinic end generated code: output=f579dd9e795a364e input=eb4c38e1f898f402]*/ + /*[clinic input] test_Py_UNICODE_converter @@ -1863,6 +1890,7 @@ test_Py_UNICODE_converter_impl(PyObject *module, const Py_UNICODE *a, Py_ssize_clean_t e_length) /*[clinic end generated code: output=dd0a09a1b772e57b input=064a3b68ad7f04b0]*/ + /*[clinic input] test_Py_buffer_converter @@ -1932,3 +1960,1238 @@ static PyObject * test_Py_buffer_converter_impl(PyObject *module, Py_buffer *a, Py_buffer *b, Py_buffer *c, Py_buffer *d, Py_buffer *e) /*[clinic end generated code: output=5760c82faa2ed61f input=6a9da0f56f9525fd]*/ + + +/*[clinic input] +test_keywords + + a: object + b: object + +[clinic start generated code]*/ + +PyDoc_STRVAR(test_keywords__doc__, +"test_keywords($module, /, a, b)\n" +"--\n" +"\n"); + +#define TEST_KEYWORDS_METHODDEF \ + {"test_keywords", (PyCFunction)(void(*)(void))test_keywords, METH_FASTCALL|METH_KEYWORDS, test_keywords__doc__}, + +static PyObject * +test_keywords_impl(PyObject *module, PyObject *a, PyObject *b); + +static PyObject * +test_keywords(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"a", "b", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "test_keywords", 0}; + PyObject *argsbuf[2]; + PyObject *a; + PyObject *b; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { + goto exit; + } + a = args[0]; + b = args[1]; + return_value = test_keywords_impl(module, a, b); + +exit: + return return_value; +} + +static PyObject * +test_keywords_impl(PyObject *module, PyObject *a, PyObject *b) +/*[clinic end generated code: output=4be6cf045ea8242e input=0d3484844749c05b]*/ + + +/*[clinic input] +test_keywords_kwonly + + a: object + * + b: object + +[clinic start generated code]*/ + +PyDoc_STRVAR(test_keywords_kwonly__doc__, +"test_keywords_kwonly($module, /, a, *, b)\n" +"--\n" +"\n"); + +#define TEST_KEYWORDS_KWONLY_METHODDEF \ + {"test_keywords_kwonly", (PyCFunction)(void(*)(void))test_keywords_kwonly, METH_FASTCALL|METH_KEYWORDS, test_keywords_kwonly__doc__}, + +static PyObject * +test_keywords_kwonly_impl(PyObject *module, PyObject *a, PyObject *b); + +static PyObject * +test_keywords_kwonly(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"a", "b", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "test_keywords_kwonly", 0}; + PyObject *argsbuf[2]; + PyObject *a; + PyObject *b; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 1, argsbuf); + if (!args) { + goto exit; + } + a = args[0]; + b = args[1]; + return_value = test_keywords_kwonly_impl(module, a, b); + +exit: + return return_value; +} + +static PyObject * +test_keywords_kwonly_impl(PyObject *module, PyObject *a, PyObject *b) +/*[clinic end generated code: output=d63c4977a7a80713 input=384adc78bfa0bff7]*/ + + +/*[clinic input] +test_keywords_opt + + a: object + b: object = None + c: object = None + +[clinic start generated code]*/ + +PyDoc_STRVAR(test_keywords_opt__doc__, +"test_keywords_opt($module, /, a, b=None, c=None)\n" +"--\n" +"\n"); + +#define TEST_KEYWORDS_OPT_METHODDEF \ + {"test_keywords_opt", (PyCFunction)(void(*)(void))test_keywords_opt, METH_FASTCALL|METH_KEYWORDS, test_keywords_opt__doc__}, + +static PyObject * +test_keywords_opt_impl(PyObject *module, PyObject *a, PyObject *b, + PyObject *c); + +static PyObject * +test_keywords_opt(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"a", "b", "c", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "test_keywords_opt", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; + PyObject *a; + PyObject *b = Py_None; + PyObject *c = Py_None; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); + if (!args) { + goto exit; + } + a = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + b = args[1]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + c = args[2]; +skip_optional_pos: + return_value = test_keywords_opt_impl(module, a, b, c); + +exit: + return return_value; +} + +static PyObject * +test_keywords_opt_impl(PyObject *module, PyObject *a, PyObject *b, + PyObject *c) +/*[clinic end generated code: output=e5e50d114d8fc10a input=eda7964f784f4607]*/ + + +/*[clinic input] +test_keywords_opt_kwonly + + a: object + b: object = None + * + c: object = None + d: object = None + +[clinic start generated code]*/ + +PyDoc_STRVAR(test_keywords_opt_kwonly__doc__, +"test_keywords_opt_kwonly($module, /, a, b=None, *, c=None, d=None)\n" +"--\n" +"\n"); + +#define TEST_KEYWORDS_OPT_KWONLY_METHODDEF \ + {"test_keywords_opt_kwonly", (PyCFunction)(void(*)(void))test_keywords_opt_kwonly, METH_FASTCALL|METH_KEYWORDS, test_keywords_opt_kwonly__doc__}, + +static PyObject * +test_keywords_opt_kwonly_impl(PyObject *module, PyObject *a, PyObject *b, + PyObject *c, PyObject *d); + +static PyObject * +test_keywords_opt_kwonly(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"a", "b", "c", "d", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "test_keywords_opt_kwonly", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; + PyObject *a; + PyObject *b = Py_None; + PyObject *c = Py_None; + PyObject *d = Py_None; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { + goto exit; + } + a = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + b = args[1]; + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[2]) { + c = args[2]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + d = args[3]; +skip_optional_kwonly: + return_value = test_keywords_opt_kwonly_impl(module, a, b, c, d); + +exit: + return return_value; +} + +static PyObject * +test_keywords_opt_kwonly_impl(PyObject *module, PyObject *a, PyObject *b, + PyObject *c, PyObject *d) +/*[clinic end generated code: output=3f065cb8309b9317 input=209387a4815e5082]*/ + + +/*[clinic input] +test_keywords_kwonly_opt + + a: object + * + b: object = None + c: object = None + +[clinic start generated code]*/ + +PyDoc_STRVAR(test_keywords_kwonly_opt__doc__, +"test_keywords_kwonly_opt($module, /, a, *, b=None, c=None)\n" +"--\n" +"\n"); + +#define TEST_KEYWORDS_KWONLY_OPT_METHODDEF \ + {"test_keywords_kwonly_opt", (PyCFunction)(void(*)(void))test_keywords_kwonly_opt, METH_FASTCALL|METH_KEYWORDS, test_keywords_kwonly_opt__doc__}, + +static PyObject * +test_keywords_kwonly_opt_impl(PyObject *module, PyObject *a, PyObject *b, + PyObject *c); + +static PyObject * +test_keywords_kwonly_opt(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"a", "b", "c", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "test_keywords_kwonly_opt", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; + PyObject *a; + PyObject *b = Py_None; + PyObject *c = Py_None; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + a = args[0]; + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[1]) { + b = args[1]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + c = args[2]; +skip_optional_kwonly: + return_value = test_keywords_kwonly_opt_impl(module, a, b, c); + +exit: + return return_value; +} + +static PyObject * +test_keywords_kwonly_opt_impl(PyObject *module, PyObject *a, PyObject *b, + PyObject *c) +/*[clinic end generated code: output=94edba5484e1681e input=18393cc64fa000f4]*/ + + +/*[clinic input] +test_posonly_keywords + + a: object + / + b: object + +[clinic start generated code]*/ + +PyDoc_STRVAR(test_posonly_keywords__doc__, +"test_posonly_keywords($module, a, /, b)\n" +"--\n" +"\n"); + +#define TEST_POSONLY_KEYWORDS_METHODDEF \ + {"test_posonly_keywords", (PyCFunction)(void(*)(void))test_posonly_keywords, METH_FASTCALL|METH_KEYWORDS, test_posonly_keywords__doc__}, + +static PyObject * +test_posonly_keywords_impl(PyObject *module, PyObject *a, PyObject *b); + +static PyObject * +test_posonly_keywords(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"", "b", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "test_posonly_keywords", 0}; + PyObject *argsbuf[2]; + PyObject *a; + PyObject *b; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { + goto exit; + } + a = args[0]; + b = args[1]; + return_value = test_posonly_keywords_impl(module, a, b); + +exit: + return return_value; +} + +static PyObject * +test_posonly_keywords_impl(PyObject *module, PyObject *a, PyObject *b) +/*[clinic end generated code: output=eca1507f0182ffb0 input=1767b0ebdf06060e]*/ + + +/*[clinic input] +test_posonly_kwonly + + a: object + / + * + c: object + +[clinic start generated code]*/ + +PyDoc_STRVAR(test_posonly_kwonly__doc__, +"test_posonly_kwonly($module, a, /, *, c)\n" +"--\n" +"\n"); + +#define TEST_POSONLY_KWONLY_METHODDEF \ + {"test_posonly_kwonly", (PyCFunction)(void(*)(void))test_posonly_kwonly, METH_FASTCALL|METH_KEYWORDS, test_posonly_kwonly__doc__}, + +static PyObject * +test_posonly_kwonly_impl(PyObject *module, PyObject *a, PyObject *c); + +static PyObject * +test_posonly_kwonly(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"", "c", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "test_posonly_kwonly", 0}; + PyObject *argsbuf[2]; + PyObject *a; + PyObject *c; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 1, argsbuf); + if (!args) { + goto exit; + } + a = args[0]; + c = args[1]; + return_value = test_posonly_kwonly_impl(module, a, c); + +exit: + return return_value; +} + +static PyObject * +test_posonly_kwonly_impl(PyObject *module, PyObject *a, PyObject *c) +/*[clinic end generated code: output=3e14655646b66e9a input=9042f2818f664839]*/ + + +/*[clinic input] +test_posonly_keywords_kwonly + + a: object + / + b: object + * + c: object + +[clinic start generated code]*/ + +PyDoc_STRVAR(test_posonly_keywords_kwonly__doc__, +"test_posonly_keywords_kwonly($module, a, /, b, *, c)\n" +"--\n" +"\n"); + +#define TEST_POSONLY_KEYWORDS_KWONLY_METHODDEF \ + {"test_posonly_keywords_kwonly", (PyCFunction)(void(*)(void))test_posonly_keywords_kwonly, METH_FASTCALL|METH_KEYWORDS, test_posonly_keywords_kwonly__doc__}, + +static PyObject * +test_posonly_keywords_kwonly_impl(PyObject *module, PyObject *a, PyObject *b, + PyObject *c); + +static PyObject * +test_posonly_keywords_kwonly(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"", "b", "c", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "test_posonly_keywords_kwonly", 0}; + PyObject *argsbuf[3]; + PyObject *a; + PyObject *b; + PyObject *c; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 1, argsbuf); + if (!args) { + goto exit; + } + a = args[0]; + b = args[1]; + c = args[2]; + return_value = test_posonly_keywords_kwonly_impl(module, a, b, c); + +exit: + return return_value; +} + +static PyObject * +test_posonly_keywords_kwonly_impl(PyObject *module, PyObject *a, PyObject *b, + PyObject *c) +/*[clinic end generated code: output=de57172fc97a626e input=29546ebdca492fea]*/ + + +/*[clinic input] +test_posonly_keywords_opt + + a: object + / + b: object + c: object = None + d: object = None + +[clinic start generated code]*/ + +PyDoc_STRVAR(test_posonly_keywords_opt__doc__, +"test_posonly_keywords_opt($module, a, /, b, c=None, d=None)\n" +"--\n" +"\n"); + +#define TEST_POSONLY_KEYWORDS_OPT_METHODDEF \ + {"test_posonly_keywords_opt", (PyCFunction)(void(*)(void))test_posonly_keywords_opt, METH_FASTCALL|METH_KEYWORDS, test_posonly_keywords_opt__doc__}, + +static PyObject * +test_posonly_keywords_opt_impl(PyObject *module, PyObject *a, PyObject *b, + PyObject *c, PyObject *d); + +static PyObject * +test_posonly_keywords_opt(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"", "b", "c", "d", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "test_posonly_keywords_opt", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; + PyObject *a; + PyObject *b; + PyObject *c = Py_None; + PyObject *d = Py_None; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 4, 0, argsbuf); + if (!args) { + goto exit; + } + a = args[0]; + b = args[1]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[2]) { + c = args[2]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + d = args[3]; +skip_optional_pos: + return_value = test_posonly_keywords_opt_impl(module, a, b, c, d); + +exit: + return return_value; +} + +static PyObject * +test_posonly_keywords_opt_impl(PyObject *module, PyObject *a, PyObject *b, + PyObject *c, PyObject *d) +/*[clinic end generated code: output=8bc6b44a25d4b716 input=cdf5a9625e554e9b]*/ + + +/*[clinic input] +test_posonly_keywords_opt2 + + a: object + / + b: object = None + c: object = None + +[clinic start generated code]*/ + +PyDoc_STRVAR(test_posonly_keywords_opt2__doc__, +"test_posonly_keywords_opt2($module, a, /, b=None, c=None)\n" +"--\n" +"\n"); + +#define TEST_POSONLY_KEYWORDS_OPT2_METHODDEF \ + {"test_posonly_keywords_opt2", (PyCFunction)(void(*)(void))test_posonly_keywords_opt2, METH_FASTCALL|METH_KEYWORDS, test_posonly_keywords_opt2__doc__}, + +static PyObject * +test_posonly_keywords_opt2_impl(PyObject *module, PyObject *a, PyObject *b, + PyObject *c); + +static PyObject * +test_posonly_keywords_opt2(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"", "b", "c", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "test_posonly_keywords_opt2", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; + PyObject *a; + PyObject *b = Py_None; + PyObject *c = Py_None; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); + if (!args) { + goto exit; + } + a = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + b = args[1]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + c = args[2]; +skip_optional_pos: + return_value = test_posonly_keywords_opt2_impl(module, a, b, c); + +exit: + return return_value; +} + +static PyObject * +test_posonly_keywords_opt2_impl(PyObject *module, PyObject *a, PyObject *b, + PyObject *c) +/*[clinic end generated code: output=a870c45a6510ba91 input=1581299d21d16f14]*/ + + +/*[clinic input] +test_posonly_opt_keywords_opt + + a: object + b: object = None + / + c: object = None + d: object = None + +[clinic start generated code]*/ + +PyDoc_STRVAR(test_posonly_opt_keywords_opt__doc__, +"test_posonly_opt_keywords_opt($module, a, b=None, /, c=None, d=None)\n" +"--\n" +"\n"); + +#define TEST_POSONLY_OPT_KEYWORDS_OPT_METHODDEF \ + {"test_posonly_opt_keywords_opt", (PyCFunction)(void(*)(void))test_posonly_opt_keywords_opt, METH_FASTCALL|METH_KEYWORDS, test_posonly_opt_keywords_opt__doc__}, + +static PyObject * +test_posonly_opt_keywords_opt_impl(PyObject *module, PyObject *a, + PyObject *b, PyObject *c, PyObject *d); + +static PyObject * +test_posonly_opt_keywords_opt(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"", "", "c", "d", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "test_posonly_opt_keywords_opt", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; + PyObject *a; + PyObject *b = Py_None; + PyObject *c = Py_None; + PyObject *d = Py_None; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 4, 0, argsbuf); + if (!args) { + goto exit; + } + a = args[0]; + if (nargs < 2) { + goto skip_optional_posonly; + } + noptargs--; + b = args[1]; +skip_optional_posonly: + if (!noptargs) { + goto skip_optional_pos; + } + if (args[2]) { + c = args[2]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + d = args[3]; +skip_optional_pos: + return_value = test_posonly_opt_keywords_opt_impl(module, a, b, c, d); + +exit: + return return_value; +} + +static PyObject * +test_posonly_opt_keywords_opt_impl(PyObject *module, PyObject *a, + PyObject *b, PyObject *c, PyObject *d) +/*[clinic end generated code: output=9ae3d52e071d3b7f input=408798ec3d42949f]*/ + + +/*[clinic input] +test_posonly_kwonly_opt + + a: object + / + * + b: object + c: object = None + d: object = None + +[clinic start generated code]*/ + +PyDoc_STRVAR(test_posonly_kwonly_opt__doc__, +"test_posonly_kwonly_opt($module, a, /, *, b, c=None, d=None)\n" +"--\n" +"\n"); + +#define TEST_POSONLY_KWONLY_OPT_METHODDEF \ + {"test_posonly_kwonly_opt", (PyCFunction)(void(*)(void))test_posonly_kwonly_opt, METH_FASTCALL|METH_KEYWORDS, test_posonly_kwonly_opt__doc__}, + +static PyObject * +test_posonly_kwonly_opt_impl(PyObject *module, PyObject *a, PyObject *b, + PyObject *c, PyObject *d); + +static PyObject * +test_posonly_kwonly_opt(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"", "b", "c", "d", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "test_posonly_kwonly_opt", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; + PyObject *a; + PyObject *b; + PyObject *c = Py_None; + PyObject *d = Py_None; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 1, argsbuf); + if (!args) { + goto exit; + } + a = args[0]; + b = args[1]; + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[2]) { + c = args[2]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + d = args[3]; +skip_optional_kwonly: + return_value = test_posonly_kwonly_opt_impl(module, a, b, c, d); + +exit: + return return_value; +} + +static PyObject * +test_posonly_kwonly_opt_impl(PyObject *module, PyObject *a, PyObject *b, + PyObject *c, PyObject *d) +/*[clinic end generated code: output=fb001f586ba68549 input=8d8e5643bbbc2309]*/ + + +/*[clinic input] +test_posonly_kwonly_opt2 + + a: object + / + * + b: object = None + c: object = None + +[clinic start generated code]*/ + +PyDoc_STRVAR(test_posonly_kwonly_opt2__doc__, +"test_posonly_kwonly_opt2($module, a, /, *, b=None, c=None)\n" +"--\n" +"\n"); + +#define TEST_POSONLY_KWONLY_OPT2_METHODDEF \ + {"test_posonly_kwonly_opt2", (PyCFunction)(void(*)(void))test_posonly_kwonly_opt2, METH_FASTCALL|METH_KEYWORDS, test_posonly_kwonly_opt2__doc__}, + +static PyObject * +test_posonly_kwonly_opt2_impl(PyObject *module, PyObject *a, PyObject *b, + PyObject *c); + +static PyObject * +test_posonly_kwonly_opt2(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"", "b", "c", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "test_posonly_kwonly_opt2", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; + PyObject *a; + PyObject *b = Py_None; + PyObject *c = Py_None; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + a = args[0]; + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[1]) { + b = args[1]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + c = args[2]; +skip_optional_kwonly: + return_value = test_posonly_kwonly_opt2_impl(module, a, b, c); + +exit: + return return_value; +} + +static PyObject * +test_posonly_kwonly_opt2_impl(PyObject *module, PyObject *a, PyObject *b, + PyObject *c) +/*[clinic end generated code: output=51aae7cac77b458a input=f7e5eed94f75fff0]*/ + + +/*[clinic input] +test_posonly_opt_kwonly_opt + + a: object + b: object = None + / + * + c: object = None + d: object = None + +[clinic start generated code]*/ + +PyDoc_STRVAR(test_posonly_opt_kwonly_opt__doc__, +"test_posonly_opt_kwonly_opt($module, a, b=None, /, *, c=None, d=None)\n" +"--\n" +"\n"); + +#define TEST_POSONLY_OPT_KWONLY_OPT_METHODDEF \ + {"test_posonly_opt_kwonly_opt", (PyCFunction)(void(*)(void))test_posonly_opt_kwonly_opt, METH_FASTCALL|METH_KEYWORDS, test_posonly_opt_kwonly_opt__doc__}, + +static PyObject * +test_posonly_opt_kwonly_opt_impl(PyObject *module, PyObject *a, PyObject *b, + PyObject *c, PyObject *d); + +static PyObject * +test_posonly_opt_kwonly_opt(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"", "", "c", "d", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "test_posonly_opt_kwonly_opt", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; + PyObject *a; + PyObject *b = Py_None; + PyObject *c = Py_None; + PyObject *d = Py_None; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { + goto exit; + } + a = args[0]; + if (nargs < 2) { + goto skip_optional_posonly; + } + noptargs--; + b = args[1]; +skip_optional_posonly: + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[2]) { + c = args[2]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + d = args[3]; +skip_optional_kwonly: + return_value = test_posonly_opt_kwonly_opt_impl(module, a, b, c, d); + +exit: + return return_value; +} + +static PyObject * +test_posonly_opt_kwonly_opt_impl(PyObject *module, PyObject *a, PyObject *b, + PyObject *c, PyObject *d) +/*[clinic end generated code: output=68844c45143d1668 input=1e557dc979d120fd]*/ + + +/*[clinic input] +test_posonly_keywords_kwonly_opt + + a: object + / + b: object + * + c: object + d: object = None + e: object = None + +[clinic start generated code]*/ + +PyDoc_STRVAR(test_posonly_keywords_kwonly_opt__doc__, +"test_posonly_keywords_kwonly_opt($module, a, /, b, *, c, d=None, e=None)\n" +"--\n" +"\n"); + +#define TEST_POSONLY_KEYWORDS_KWONLY_OPT_METHODDEF \ + {"test_posonly_keywords_kwonly_opt", (PyCFunction)(void(*)(void))test_posonly_keywords_kwonly_opt, METH_FASTCALL|METH_KEYWORDS, test_posonly_keywords_kwonly_opt__doc__}, + +static PyObject * +test_posonly_keywords_kwonly_opt_impl(PyObject *module, PyObject *a, + PyObject *b, PyObject *c, PyObject *d, + PyObject *e); + +static PyObject * +test_posonly_keywords_kwonly_opt(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"", "b", "c", "d", "e", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "test_posonly_keywords_kwonly_opt", 0}; + PyObject *argsbuf[5]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 3; + PyObject *a; + PyObject *b; + PyObject *c; + PyObject *d = Py_None; + PyObject *e = Py_None; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 1, argsbuf); + if (!args) { + goto exit; + } + a = args[0]; + b = args[1]; + c = args[2]; + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[3]) { + d = args[3]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + e = args[4]; +skip_optional_kwonly: + return_value = test_posonly_keywords_kwonly_opt_impl(module, a, b, c, d, e); + +exit: + return return_value; +} + +static PyObject * +test_posonly_keywords_kwonly_opt_impl(PyObject *module, PyObject *a, + PyObject *b, PyObject *c, PyObject *d, + PyObject *e) +/*[clinic end generated code: output=996ff645551897ac input=c3884a4f956fdc89]*/ + + +/*[clinic input] +test_posonly_keywords_kwonly_opt2 + + a: object + / + b: object + * + c: object = None + d: object = None + +[clinic start generated code]*/ + +PyDoc_STRVAR(test_posonly_keywords_kwonly_opt2__doc__, +"test_posonly_keywords_kwonly_opt2($module, a, /, b, *, c=None, d=None)\n" +"--\n" +"\n"); + +#define TEST_POSONLY_KEYWORDS_KWONLY_OPT2_METHODDEF \ + {"test_posonly_keywords_kwonly_opt2", (PyCFunction)(void(*)(void))test_posonly_keywords_kwonly_opt2, METH_FASTCALL|METH_KEYWORDS, test_posonly_keywords_kwonly_opt2__doc__}, + +static PyObject * +test_posonly_keywords_kwonly_opt2_impl(PyObject *module, PyObject *a, + PyObject *b, PyObject *c, PyObject *d); + +static PyObject * +test_posonly_keywords_kwonly_opt2(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"", "b", "c", "d", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "test_posonly_keywords_kwonly_opt2", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; + PyObject *a; + PyObject *b; + PyObject *c = Py_None; + PyObject *d = Py_None; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { + goto exit; + } + a = args[0]; + b = args[1]; + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[2]) { + c = args[2]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + d = args[3]; +skip_optional_kwonly: + return_value = test_posonly_keywords_kwonly_opt2_impl(module, a, b, c, d); + +exit: + return return_value; +} + +static PyObject * +test_posonly_keywords_kwonly_opt2_impl(PyObject *module, PyObject *a, + PyObject *b, PyObject *c, PyObject *d) +/*[clinic end generated code: output=e5a3e992fd4b28b3 input=68d01d7c0f6dafb0]*/ + + +/*[clinic input] +test_posonly_keywords_opt_kwonly_opt + + a: object + / + b: object + c: object = None + * + d: object = None + e: object = None + +[clinic start generated code]*/ + +PyDoc_STRVAR(test_posonly_keywords_opt_kwonly_opt__doc__, +"test_posonly_keywords_opt_kwonly_opt($module, a, /, b, c=None, *,\n" +" d=None, e=None)\n" +"--\n" +"\n"); + +#define TEST_POSONLY_KEYWORDS_OPT_KWONLY_OPT_METHODDEF \ + {"test_posonly_keywords_opt_kwonly_opt", (PyCFunction)(void(*)(void))test_posonly_keywords_opt_kwonly_opt, METH_FASTCALL|METH_KEYWORDS, test_posonly_keywords_opt_kwonly_opt__doc__}, + +static PyObject * +test_posonly_keywords_opt_kwonly_opt_impl(PyObject *module, PyObject *a, + PyObject *b, PyObject *c, + PyObject *d, PyObject *e); + +static PyObject * +test_posonly_keywords_opt_kwonly_opt(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"", "b", "c", "d", "e", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "test_posonly_keywords_opt_kwonly_opt", 0}; + PyObject *argsbuf[5]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; + PyObject *a; + PyObject *b; + PyObject *c = Py_None; + PyObject *d = Py_None; + PyObject *e = Py_None; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf); + if (!args) { + goto exit; + } + a = args[0]; + b = args[1]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[2]) { + c = args[2]; + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[3]) { + d = args[3]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + e = args[4]; +skip_optional_kwonly: + return_value = test_posonly_keywords_opt_kwonly_opt_impl(module, a, b, c, d, e); + +exit: + return return_value; +} + +static PyObject * +test_posonly_keywords_opt_kwonly_opt_impl(PyObject *module, PyObject *a, + PyObject *b, PyObject *c, + PyObject *d, PyObject *e) +/*[clinic end generated code: output=ff9fb6c3d2cbbaa4 input=d0883d45876f186c]*/ + + +/*[clinic input] +test_posonly_keywords_opt2_kwonly_opt + + a: object + / + b: object = None + c: object = None + * + d: object = None + e: object = None + +[clinic start generated code]*/ + +PyDoc_STRVAR(test_posonly_keywords_opt2_kwonly_opt__doc__, +"test_posonly_keywords_opt2_kwonly_opt($module, a, /, b=None, c=None, *,\n" +" d=None, e=None)\n" +"--\n" +"\n"); + +#define TEST_POSONLY_KEYWORDS_OPT2_KWONLY_OPT_METHODDEF \ + {"test_posonly_keywords_opt2_kwonly_opt", (PyCFunction)(void(*)(void))test_posonly_keywords_opt2_kwonly_opt, METH_FASTCALL|METH_KEYWORDS, test_posonly_keywords_opt2_kwonly_opt__doc__}, + +static PyObject * +test_posonly_keywords_opt2_kwonly_opt_impl(PyObject *module, PyObject *a, + PyObject *b, PyObject *c, + PyObject *d, PyObject *e); + +static PyObject * +test_posonly_keywords_opt2_kwonly_opt(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"", "b", "c", "d", "e", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "test_posonly_keywords_opt2_kwonly_opt", 0}; + PyObject *argsbuf[5]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; + PyObject *a; + PyObject *b = Py_None; + PyObject *c = Py_None; + PyObject *d = Py_None; + PyObject *e = Py_None; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); + if (!args) { + goto exit; + } + a = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + b = args[1]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (args[2]) { + c = args[2]; + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[3]) { + d = args[3]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + e = args[4]; +skip_optional_kwonly: + return_value = test_posonly_keywords_opt2_kwonly_opt_impl(module, a, b, c, d, e); + +exit: + return return_value; +} + +static PyObject * +test_posonly_keywords_opt2_kwonly_opt_impl(PyObject *module, PyObject *a, + PyObject *b, PyObject *c, + PyObject *d, PyObject *e) +/*[clinic end generated code: output=c809d7a84a2205e1 input=c95e2e1ec93035ad]*/ + + +/*[clinic input] +test_posonly_opt_keywords_opt_kwonly_opt + + a: object + b: object = None + / + c: object = None + d: object = None + * + e: object = None + f: object = None + +[clinic start generated code]*/ + +PyDoc_STRVAR(test_posonly_opt_keywords_opt_kwonly_opt__doc__, +"test_posonly_opt_keywords_opt_kwonly_opt($module, a, b=None, /, c=None,\n" +" d=None, *, e=None, f=None)\n" +"--\n" +"\n"); + +#define TEST_POSONLY_OPT_KEYWORDS_OPT_KWONLY_OPT_METHODDEF \ + {"test_posonly_opt_keywords_opt_kwonly_opt", (PyCFunction)(void(*)(void))test_posonly_opt_keywords_opt_kwonly_opt, METH_FASTCALL|METH_KEYWORDS, test_posonly_opt_keywords_opt_kwonly_opt__doc__}, + +static PyObject * +test_posonly_opt_keywords_opt_kwonly_opt_impl(PyObject *module, PyObject *a, + PyObject *b, PyObject *c, + PyObject *d, PyObject *e, + PyObject *f); + +static PyObject * +test_posonly_opt_keywords_opt_kwonly_opt(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"", "", "c", "d", "e", "f", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "test_posonly_opt_keywords_opt_kwonly_opt", 0}; + PyObject *argsbuf[6]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; + PyObject *a; + PyObject *b = Py_None; + PyObject *c = Py_None; + PyObject *d = Py_None; + PyObject *e = Py_None; + PyObject *f = Py_None; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 4, 0, argsbuf); + if (!args) { + goto exit; + } + a = args[0]; + if (nargs < 2) { + goto skip_optional_posonly; + } + noptargs--; + b = args[1]; +skip_optional_posonly: + if (!noptargs) { + goto skip_optional_pos; + } + if (args[2]) { + c = args[2]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (args[3]) { + d = args[3]; + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[4]) { + e = args[4]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + f = args[5]; +skip_optional_kwonly: + return_value = test_posonly_opt_keywords_opt_kwonly_opt_impl(module, a, b, c, d, e, f); + +exit: + return return_value; +} + +static PyObject * +test_posonly_opt_keywords_opt_kwonly_opt_impl(PyObject *module, PyObject *a, + PyObject *b, PyObject *c, + PyObject *d, PyObject *e, + PyObject *f) +/*[clinic end generated code: output=719e4f6c224402d4 input=9914857713c5bbf8]*/ diff --git a/Modules/_blake2/clinic/blake2b_impl.c.h b/Modules/_blake2/clinic/blake2b_impl.c.h index 3315bf9490cf..09fe00457f35 100644 --- a/Modules/_blake2/clinic/blake2b_impl.c.h +++ b/Modules/_blake2/clinic/blake2b_impl.c.h @@ -22,7 +22,11 @@ py_blake2b_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; static const char * const _keywords[] = {"", "digest_size", "key", "salt", "person", "fanout", "depth", "leaf_size", "node_offset", "node_depth", "inner_size", "last_node", NULL}; - static _PyArg_Parser _parser = {"|O$iy*y*y*iiO&O&iip:blake2b", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "blake2b", 0}; + PyObject *argsbuf[12]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0; PyObject *data = NULL; int digest_size = BLAKE2B_OUTBYTES; Py_buffer key = {NULL, NULL}; @@ -36,10 +40,146 @@ py_blake2b_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) int inner_size = 0; int last_node = 0; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &data, &digest_size, &key, &salt, &person, &fanout, &depth, _PyLong_UnsignedLong_Converter, &leaf_size, _PyLong_UnsignedLongLong_Converter, &node_offset, &node_depth, &inner_size, &last_node)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 0, 1, 0, argsbuf); + if (!fastargs) { goto exit; } + if (nargs < 1) { + goto skip_optional_posonly; + } + noptargs--; + data = fastargs[0]; +skip_optional_posonly: + if (!noptargs) { + goto skip_optional_kwonly; + } + if (fastargs[1]) { + if (PyFloat_Check(fastargs[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + digest_size = _PyLong_AsInt(fastargs[1]); + if (digest_size == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (fastargs[2]) { + if (PyObject_GetBuffer(fastargs[2], &key, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&key, 'C')) { + _PyArg_BadArgument("blake2b", 3, "contiguous buffer", fastargs[2]); + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (fastargs[3]) { + if (PyObject_GetBuffer(fastargs[3], &salt, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&salt, 'C')) { + _PyArg_BadArgument("blake2b", 4, "contiguous buffer", fastargs[3]); + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (fastargs[4]) { + if (PyObject_GetBuffer(fastargs[4], &person, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&person, 'C')) { + _PyArg_BadArgument("blake2b", 5, "contiguous buffer", fastargs[4]); + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (fastargs[5]) { + if (PyFloat_Check(fastargs[5])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + fanout = _PyLong_AsInt(fastargs[5]); + if (fanout == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (fastargs[6]) { + if (PyFloat_Check(fastargs[6])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + depth = _PyLong_AsInt(fastargs[6]); + if (depth == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (fastargs[7]) { + if (!_PyLong_UnsignedLong_Converter(fastargs[7], &leaf_size)) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (fastargs[8]) { + if (!_PyLong_UnsignedLongLong_Converter(fastargs[8], &node_offset)) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (fastargs[9]) { + if (PyFloat_Check(fastargs[9])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + node_depth = _PyLong_AsInt(fastargs[9]); + if (node_depth == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (fastargs[10]) { + if (PyFloat_Check(fastargs[10])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + inner_size = _PyLong_AsInt(fastargs[10]); + if (inner_size == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + last_node = PyObject_IsTrue(fastargs[11]); + if (last_node < 0) { + goto exit; + } +skip_optional_kwonly: return_value = py_blake2b_new_impl(type, data, digest_size, &key, &salt, &person, fanout, depth, leaf_size, node_offset, node_depth, inner_size, last_node); exit: @@ -121,4 +261,4 @@ _blake2_blake2b_hexdigest(BLAKE2bObject *self, PyObject *Py_UNUSED(ignored)) { return _blake2_blake2b_hexdigest_impl(self); } -/*[clinic end generated code: output=39c77de2142faa12 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=a91d182ce1109f34 input=a9049054013a1b77]*/ diff --git a/Modules/_blake2/clinic/blake2s_impl.c.h b/Modules/_blake2/clinic/blake2s_impl.c.h index 23d19ecc9ce8..92739a1feb32 100644 --- a/Modules/_blake2/clinic/blake2s_impl.c.h +++ b/Modules/_blake2/clinic/blake2s_impl.c.h @@ -22,7 +22,11 @@ py_blake2s_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; static const char * const _keywords[] = {"", "digest_size", "key", "salt", "person", "fanout", "depth", "leaf_size", "node_offset", "node_depth", "inner_size", "last_node", NULL}; - static _PyArg_Parser _parser = {"|O$iy*y*y*iiO&O&iip:blake2s", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "blake2s", 0}; + PyObject *argsbuf[12]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0; PyObject *data = NULL; int digest_size = BLAKE2S_OUTBYTES; Py_buffer key = {NULL, NULL}; @@ -36,10 +40,146 @@ py_blake2s_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) int inner_size = 0; int last_node = 0; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &data, &digest_size, &key, &salt, &person, &fanout, &depth, _PyLong_UnsignedLong_Converter, &leaf_size, _PyLong_UnsignedLongLong_Converter, &node_offset, &node_depth, &inner_size, &last_node)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 0, 1, 0, argsbuf); + if (!fastargs) { goto exit; } + if (nargs < 1) { + goto skip_optional_posonly; + } + noptargs--; + data = fastargs[0]; +skip_optional_posonly: + if (!noptargs) { + goto skip_optional_kwonly; + } + if (fastargs[1]) { + if (PyFloat_Check(fastargs[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + digest_size = _PyLong_AsInt(fastargs[1]); + if (digest_size == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (fastargs[2]) { + if (PyObject_GetBuffer(fastargs[2], &key, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&key, 'C')) { + _PyArg_BadArgument("blake2s", 3, "contiguous buffer", fastargs[2]); + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (fastargs[3]) { + if (PyObject_GetBuffer(fastargs[3], &salt, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&salt, 'C')) { + _PyArg_BadArgument("blake2s", 4, "contiguous buffer", fastargs[3]); + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (fastargs[4]) { + if (PyObject_GetBuffer(fastargs[4], &person, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&person, 'C')) { + _PyArg_BadArgument("blake2s", 5, "contiguous buffer", fastargs[4]); + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (fastargs[5]) { + if (PyFloat_Check(fastargs[5])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + fanout = _PyLong_AsInt(fastargs[5]); + if (fanout == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (fastargs[6]) { + if (PyFloat_Check(fastargs[6])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + depth = _PyLong_AsInt(fastargs[6]); + if (depth == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (fastargs[7]) { + if (!_PyLong_UnsignedLong_Converter(fastargs[7], &leaf_size)) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (fastargs[8]) { + if (!_PyLong_UnsignedLongLong_Converter(fastargs[8], &node_offset)) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (fastargs[9]) { + if (PyFloat_Check(fastargs[9])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + node_depth = _PyLong_AsInt(fastargs[9]); + if (node_depth == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (fastargs[10]) { + if (PyFloat_Check(fastargs[10])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + inner_size = _PyLong_AsInt(fastargs[10]); + if (inner_size == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + last_node = PyObject_IsTrue(fastargs[11]); + if (last_node < 0) { + goto exit; + } +skip_optional_kwonly: return_value = py_blake2s_new_impl(type, data, digest_size, &key, &salt, &person, fanout, depth, leaf_size, node_offset, node_depth, inner_size, last_node); exit: @@ -121,4 +261,4 @@ _blake2_blake2s_hexdigest(BLAKE2sObject *self, PyObject *Py_UNUSED(ignored)) { return _blake2_blake2s_hexdigest_impl(self); } -/*[clinic end generated code: output=a31a1d56f0e0781f input=a9049054013a1b77]*/ +/*[clinic end generated code: output=ae8e9b7301d092b4 input=a9049054013a1b77]*/ diff --git a/Modules/_io/clinic/_iomodule.c.h b/Modules/_io/clinic/_iomodule.c.h index f03e84e4318a..990c81c35574 100644 --- a/Modules/_io/clinic/_iomodule.c.h +++ b/Modules/_io/clinic/_iomodule.c.h @@ -139,7 +139,9 @@ _io_open(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw { PyObject *return_value = NULL; static const char * const _keywords[] = {"file", "mode", "buffering", "encoding", "errors", "newline", "closefd", "opener", NULL}; - static _PyArg_Parser _parser = {"O|sizzziO:open", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "open", 0}; + PyObject *argsbuf[8]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *file; const char *mode = "r"; int buffering = -1; @@ -149,13 +151,134 @@ _io_open(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw int closefd = 1; PyObject *opener = Py_None; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &file, &mode, &buffering, &encoding, &errors, &newline, &closefd, &opener)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 8, 0, argsbuf); + if (!args) { goto exit; } + file = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + if (!PyUnicode_Check(args[1])) { + _PyArg_BadArgument("open", 2, "str", args[1]); + goto exit; + } + Py_ssize_t mode_length; + mode = PyUnicode_AsUTF8AndSize(args[1], &mode_length); + if (mode == NULL) { + goto exit; + } + if (strlen(mode) != (size_t)mode_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (args[2]) { + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + buffering = _PyLong_AsInt(args[2]); + if (buffering == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (args[3]) { + if (args[3] == Py_None) { + encoding = NULL; + } + else if (PyUnicode_Check(args[3])) { + Py_ssize_t encoding_length; + encoding = PyUnicode_AsUTF8AndSize(args[3], &encoding_length); + if (encoding == NULL) { + goto exit; + } + if (strlen(encoding) != (size_t)encoding_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + } + else { + _PyArg_BadArgument("open", 4, "str or None", args[3]); + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (args[4]) { + if (args[4] == Py_None) { + errors = NULL; + } + else if (PyUnicode_Check(args[4])) { + Py_ssize_t errors_length; + errors = PyUnicode_AsUTF8AndSize(args[4], &errors_length); + if (errors == NULL) { + goto exit; + } + if (strlen(errors) != (size_t)errors_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + } + else { + _PyArg_BadArgument("open", 5, "str or None", args[4]); + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (args[5]) { + if (args[5] == Py_None) { + newline = NULL; + } + else if (PyUnicode_Check(args[5])) { + Py_ssize_t newline_length; + newline = PyUnicode_AsUTF8AndSize(args[5], &newline_length); + if (newline == NULL) { + goto exit; + } + if (strlen(newline) != (size_t)newline_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + } + else { + _PyArg_BadArgument("open", 6, "str or None", args[5]); + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (args[6]) { + if (PyFloat_Check(args[6])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + closefd = _PyLong_AsInt(args[6]); + if (closefd == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + opener = args[7]; +skip_optional_pos: return_value = _io_open_impl(module, file, mode, buffering, encoding, errors, newline, closefd, opener); exit: return return_value; } -/*[clinic end generated code: output=a2c1af38d943ccec input=a9049054013a1b77]*/ +/*[clinic end generated code: output=19fc9b69a5166f63 input=a9049054013a1b77]*/ diff --git a/Modules/_io/clinic/bufferedio.c.h b/Modules/_io/clinic/bufferedio.c.h index 60a6dac742fe..d5e8c8a74813 100644 --- a/Modules/_io/clinic/bufferedio.c.h +++ b/Modules/_io/clinic/bufferedio.c.h @@ -418,14 +418,40 @@ _io_BufferedReader___init__(PyObject *self, PyObject *args, PyObject *kwargs) { int return_value = -1; static const char * const _keywords[] = {"raw", "buffer_size", NULL}; - static _PyArg_Parser _parser = {"O|n:BufferedReader", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "BufferedReader", 0}; + PyObject *argsbuf[2]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 1; PyObject *raw; Py_ssize_t buffer_size = DEFAULT_BUFFER_SIZE; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &raw, &buffer_size)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 2, 0, argsbuf); + if (!fastargs) { goto exit; } + raw = fastargs[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (PyFloat_Check(fastargs[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(fastargs[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + buffer_size = ival; + } +skip_optional_pos: return_value = _io_BufferedReader___init___impl((buffered *)self, raw, buffer_size); exit: @@ -451,14 +477,40 @@ _io_BufferedWriter___init__(PyObject *self, PyObject *args, PyObject *kwargs) { int return_value = -1; static const char * const _keywords[] = {"raw", "buffer_size", NULL}; - static _PyArg_Parser _parser = {"O|n:BufferedWriter", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "BufferedWriter", 0}; + PyObject *argsbuf[2]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 1; PyObject *raw; Py_ssize_t buffer_size = DEFAULT_BUFFER_SIZE; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &raw, &buffer_size)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 2, 0, argsbuf); + if (!fastargs) { + goto exit; + } + raw = fastargs[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (PyFloat_Check(fastargs[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); goto exit; } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(fastargs[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + buffer_size = ival; + } +skip_optional_pos: return_value = _io_BufferedWriter___init___impl((buffered *)self, raw, buffer_size); exit: @@ -581,17 +633,43 @@ _io_BufferedRandom___init__(PyObject *self, PyObject *args, PyObject *kwargs) { int return_value = -1; static const char * const _keywords[] = {"raw", "buffer_size", NULL}; - static _PyArg_Parser _parser = {"O|n:BufferedRandom", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "BufferedRandom", 0}; + PyObject *argsbuf[2]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 1; PyObject *raw; Py_ssize_t buffer_size = DEFAULT_BUFFER_SIZE; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &raw, &buffer_size)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 2, 0, argsbuf); + if (!fastargs) { + goto exit; + } + raw = fastargs[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (PyFloat_Check(fastargs[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); goto exit; } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(fastargs[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + buffer_size = ival; + } +skip_optional_pos: return_value = _io_BufferedRandom___init___impl((buffered *)self, raw, buffer_size); exit: return return_value; } -/*[clinic end generated code: output=b7f51040defff318 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b22b4aedd53c340a input=a9049054013a1b77]*/ diff --git a/Modules/_io/clinic/bytesio.c.h b/Modules/_io/clinic/bytesio.c.h index 54c5123a008c..8dd68f56137f 100644 --- a/Modules/_io/clinic/bytesio.c.h +++ b/Modules/_io/clinic/bytesio.c.h @@ -494,16 +494,25 @@ _io_BytesIO___init__(PyObject *self, PyObject *args, PyObject *kwargs) { int return_value = -1; static const char * const _keywords[] = {"initial_bytes", NULL}; - static _PyArg_Parser _parser = {"|O:BytesIO", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "BytesIO", 0}; + PyObject *argsbuf[1]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0; PyObject *initvalue = NULL; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &initvalue)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 0, 1, 0, argsbuf); + if (!fastargs) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + initvalue = fastargs[0]; +skip_optional_pos: return_value = _io_BytesIO___init___impl((bytesio *)self, initvalue); exit: return return_value; } -/*[clinic end generated code: output=a6b47dd7921abfcd input=a9049054013a1b77]*/ +/*[clinic end generated code: output=22e8fb54874b6ee5 input=a9049054013a1b77]*/ diff --git a/Modules/_io/clinic/fileio.c.h b/Modules/_io/clinic/fileio.c.h index e7d49d47f8ae..8016e9888624 100644 --- a/Modules/_io/clinic/fileio.c.h +++ b/Modules/_io/clinic/fileio.c.h @@ -50,16 +50,58 @@ _io_FileIO___init__(PyObject *self, PyObject *args, PyObject *kwargs) { int return_value = -1; static const char * const _keywords[] = {"file", "mode", "closefd", "opener", NULL}; - static _PyArg_Parser _parser = {"O|siO:FileIO", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "FileIO", 0}; + PyObject *argsbuf[4]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 1; PyObject *nameobj; const char *mode = "r"; int closefd = 1; PyObject *opener = Py_None; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &nameobj, &mode, &closefd, &opener)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 4, 0, argsbuf); + if (!fastargs) { goto exit; } + nameobj = fastargs[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (fastargs[1]) { + if (!PyUnicode_Check(fastargs[1])) { + _PyArg_BadArgument("FileIO", 2, "str", fastargs[1]); + goto exit; + } + Py_ssize_t mode_length; + mode = PyUnicode_AsUTF8AndSize(fastargs[1], &mode_length); + if (mode == NULL) { + goto exit; + } + if (strlen(mode) != (size_t)mode_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (fastargs[2]) { + if (PyFloat_Check(fastargs[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + closefd = _PyLong_AsInt(fastargs[2]); + if (closefd == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + opener = fastargs[3]; +skip_optional_pos: return_value = _io_FileIO___init___impl((fileio *)self, nameobj, mode, closefd, opener); exit: @@ -405,4 +447,4 @@ _io_FileIO_isatty(fileio *self, PyObject *Py_UNUSED(ignored)) #ifndef _IO_FILEIO_TRUNCATE_METHODDEF #define _IO_FILEIO_TRUNCATE_METHODDEF #endif /* !defined(_IO_FILEIO_TRUNCATE_METHODDEF) */ -/*[clinic end generated code: output=b6f327457938d4dd input=a9049054013a1b77]*/ +/*[clinic end generated code: output=7ee4f3ae584fc6d2 input=a9049054013a1b77]*/ diff --git a/Modules/_io/clinic/stringio.c.h b/Modules/_io/clinic/stringio.c.h index 1757d83ef7e1..77a720c2a6ff 100644 --- a/Modules/_io/clinic/stringio.c.h +++ b/Modules/_io/clinic/stringio.c.h @@ -266,14 +266,29 @@ _io_StringIO___init__(PyObject *self, PyObject *args, PyObject *kwargs) { int return_value = -1; static const char * const _keywords[] = {"initial_value", "newline", NULL}; - static _PyArg_Parser _parser = {"|OO:StringIO", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "StringIO", 0}; + PyObject *argsbuf[2]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0; PyObject *value = NULL; PyObject *newline_obj = NULL; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &value, &newline_obj)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 0, 2, 0, argsbuf); + if (!fastargs) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + if (fastargs[0]) { + value = fastargs[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + newline_obj = fastargs[1]; +skip_optional_pos: return_value = _io_StringIO___init___impl((stringio *)self, value, newline_obj); exit: @@ -333,4 +348,4 @@ _io_StringIO_seekable(stringio *self, PyObject *Py_UNUSED(ignored)) { return _io_StringIO_seekable_impl(self); } -/*[clinic end generated code: output=db5e51dcc4dae8d5 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=7aad5ab2e64a25b8 input=a9049054013a1b77]*/ diff --git a/Modules/_io/clinic/textio.c.h b/Modules/_io/clinic/textio.c.h index 2a13abfd9671..cec9defea025 100644 --- a/Modules/_io/clinic/textio.c.h +++ b/Modules/_io/clinic/textio.c.h @@ -25,15 +25,34 @@ _io_IncrementalNewlineDecoder___init__(PyObject *self, PyObject *args, PyObject { int return_value = -1; static const char * const _keywords[] = {"decoder", "translate", "errors", NULL}; - static _PyArg_Parser _parser = {"Oi|O:IncrementalNewlineDecoder", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "IncrementalNewlineDecoder", 0}; + PyObject *argsbuf[3]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 2; PyObject *decoder; int translate; PyObject *errors = NULL; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &decoder, &translate, &errors)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 2, 3, 0, argsbuf); + if (!fastargs) { goto exit; } + decoder = fastargs[0]; + if (PyFloat_Check(fastargs[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + translate = _PyLong_AsInt(fastargs[1]); + if (translate == -1 && PyErr_Occurred()) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + errors = fastargs[2]; +skip_optional_pos: return_value = _io_IncrementalNewlineDecoder___init___impl((nldecoder_object *)self, decoder, translate, errors); exit: @@ -57,14 +76,30 @@ _io_IncrementalNewlineDecoder_decode(nldecoder_object *self, PyObject *const *ar { PyObject *return_value = NULL; static const char * const _keywords[] = {"input", "final", NULL}; - static _PyArg_Parser _parser = {"O|i:decode", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "decode", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *input; int final = 0; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &input, &final)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { + goto exit; + } + input = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); goto exit; } + final = _PyLong_AsInt(args[1]); + if (final == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional_pos: return_value = _io_IncrementalNewlineDecoder_decode_impl(self, input, final); exit: @@ -158,7 +193,11 @@ _io_TextIOWrapper___init__(PyObject *self, PyObject *args, PyObject *kwargs) { int return_value = -1; static const char * const _keywords[] = {"buffer", "encoding", "errors", "newline", "line_buffering", "write_through", NULL}; - static _PyArg_Parser _parser = {"O|zOzii:TextIOWrapper", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "TextIOWrapper", 0}; + PyObject *argsbuf[6]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 1; PyObject *buffer; const char *encoding = NULL; PyObject *errors = Py_None; @@ -166,10 +205,90 @@ _io_TextIOWrapper___init__(PyObject *self, PyObject *args, PyObject *kwargs) int line_buffering = 0; int write_through = 0; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &buffer, &encoding, &errors, &newline, &line_buffering, &write_through)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 6, 0, argsbuf); + if (!fastargs) { goto exit; } + buffer = fastargs[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (fastargs[1]) { + if (fastargs[1] == Py_None) { + encoding = NULL; + } + else if (PyUnicode_Check(fastargs[1])) { + Py_ssize_t encoding_length; + encoding = PyUnicode_AsUTF8AndSize(fastargs[1], &encoding_length); + if (encoding == NULL) { + goto exit; + } + if (strlen(encoding) != (size_t)encoding_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + } + else { + _PyArg_BadArgument("TextIOWrapper", 2, "str or None", fastargs[1]); + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (fastargs[2]) { + errors = fastargs[2]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (fastargs[3]) { + if (fastargs[3] == Py_None) { + newline = NULL; + } + else if (PyUnicode_Check(fastargs[3])) { + Py_ssize_t newline_length; + newline = PyUnicode_AsUTF8AndSize(fastargs[3], &newline_length); + if (newline == NULL) { + goto exit; + } + if (strlen(newline) != (size_t)newline_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + } + else { + _PyArg_BadArgument("TextIOWrapper", 4, "str or None", fastargs[3]); + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (fastargs[4]) { + if (PyFloat_Check(fastargs[4])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + line_buffering = _PyLong_AsInt(fastargs[4]); + if (line_buffering == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (PyFloat_Check(fastargs[5])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + write_through = _PyLong_AsInt(fastargs[5]); + if (write_through == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional_pos: return_value = _io_TextIOWrapper___init___impl((textio *)self, buffer, encoding, errors, newline, line_buffering, write_through); exit: @@ -199,17 +318,48 @@ _io_TextIOWrapper_reconfigure(textio *self, PyObject *const *args, Py_ssize_t na { PyObject *return_value = NULL; static const char * const _keywords[] = {"encoding", "errors", "newline", "line_buffering", "write_through", NULL}; - static _PyArg_Parser _parser = {"|$OOOOO:reconfigure", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "reconfigure", 0}; + PyObject *argsbuf[5]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *encoding = Py_None; PyObject *errors = Py_None; PyObject *newline_obj = NULL; PyObject *line_buffering_obj = Py_None; PyObject *write_through_obj = Py_None; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &encoding, &errors, &newline_obj, &line_buffering_obj, &write_through_obj)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[0]) { + encoding = args[0]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[1]) { + errors = args[1]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[2]) { + newline_obj = args[2]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[3]) { + line_buffering_obj = args[3]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + write_through_obj = args[4]; +skip_optional_kwonly: return_value = _io_TextIOWrapper_reconfigure_impl(self, encoding, errors, newline_obj, line_buffering_obj, write_through_obj); exit: @@ -551,4 +701,4 @@ _io_TextIOWrapper_close(textio *self, PyObject *Py_UNUSED(ignored)) { return _io_TextIOWrapper_close_impl(self); } -/*[clinic end generated code: output=c3d1b2a5d2d2d429 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b651e056e3000f88 input=a9049054013a1b77]*/ diff --git a/Modules/_io/clinic/winconsoleio.c.h b/Modules/_io/clinic/winconsoleio.c.h index e7cd854ae25d..bb0cdc4558dd 100644 --- a/Modules/_io/clinic/winconsoleio.c.h +++ b/Modules/_io/clinic/winconsoleio.c.h @@ -49,16 +49,58 @@ _io__WindowsConsoleIO___init__(PyObject *self, PyObject *args, PyObject *kwargs) { int return_value = -1; static const char * const _keywords[] = {"file", "mode", "closefd", "opener", NULL}; - static _PyArg_Parser _parser = {"O|siO:_WindowsConsoleIO", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "_WindowsConsoleIO", 0}; + PyObject *argsbuf[4]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 1; PyObject *nameobj; const char *mode = "r"; int closefd = 1; PyObject *opener = Py_None; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &nameobj, &mode, &closefd, &opener)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 4, 0, argsbuf); + if (!fastargs) { goto exit; } + nameobj = fastargs[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (fastargs[1]) { + if (!PyUnicode_Check(fastargs[1])) { + _PyArg_BadArgument("_WindowsConsoleIO", 2, "str", fastargs[1]); + goto exit; + } + Py_ssize_t mode_length; + mode = PyUnicode_AsUTF8AndSize(fastargs[1], &mode_length); + if (mode == NULL) { + goto exit; + } + if (strlen(mode) != (size_t)mode_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (fastargs[2]) { + if (PyFloat_Check(fastargs[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + closefd = _PyLong_AsInt(fastargs[2]); + if (closefd == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + opener = fastargs[3]; +skip_optional_pos: return_value = _io__WindowsConsoleIO___init___impl((winconsoleio *)self, nameobj, mode, closefd, opener); exit: @@ -344,4 +386,4 @@ _io__WindowsConsoleIO_isatty(winconsoleio *self, PyObject *Py_UNUSED(ignored)) #ifndef _IO__WINDOWSCONSOLEIO_ISATTY_METHODDEF #define _IO__WINDOWSCONSOLEIO_ISATTY_METHODDEF #endif /* !defined(_IO__WINDOWSCONSOLEIO_ISATTY_METHODDEF) */ -/*[clinic end generated code: output=ab0f0ee8062eecb3 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=57bf2c09a42bd330 input=a9049054013a1b77]*/ diff --git a/Modules/_multiprocessing/clinic/posixshmem.c.h b/Modules/_multiprocessing/clinic/posixshmem.c.h index 20abddc0a2e9..0ebfa2fe3789 100644 --- a/Modules/_multiprocessing/clinic/posixshmem.c.h +++ b/Modules/_multiprocessing/clinic/posixshmem.c.h @@ -22,16 +22,48 @@ _posixshmem_shm_open(PyObject *module, PyObject *const *args, Py_ssize_t nargs, { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "flags", "mode", NULL}; - static _PyArg_Parser _parser = {"Ui|i:shm_open", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "shm_open", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; PyObject *path; int flags; int mode = 511; int _return_value; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &path, &flags, &mode)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf); + if (!args) { goto exit; } + if (!PyUnicode_Check(args[0])) { + _PyArg_BadArgument("shm_open", 1, "str", args[0]); + goto exit; + } + if (PyUnicode_READY(args[0]) == -1) { + goto exit; + } + path = args[0]; + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + flags = _PyLong_AsInt(args[1]); + if (flags == -1 && PyErr_Occurred()) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + mode = _PyLong_AsInt(args[2]); + if (mode == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional_pos: _return_value = _posixshmem_shm_open_impl(module, path, flags, mode); if ((_return_value == -1) && PyErr_Occurred()) { goto exit; @@ -67,13 +99,22 @@ _posixshmem_shm_unlink(PyObject *module, PyObject *const *args, Py_ssize_t nargs { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", NULL}; - static _PyArg_Parser _parser = {"U:shm_unlink", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "shm_unlink", 0}; + PyObject *argsbuf[1]; PyObject *path; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &path)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!PyUnicode_Check(args[0])) { + _PyArg_BadArgument("shm_unlink", 1, "str", args[0]); + goto exit; + } + if (PyUnicode_READY(args[0]) == -1) { goto exit; } + path = args[0]; return_value = _posixshmem_shm_unlink_impl(module, path); exit: @@ -89,4 +130,4 @@ _posixshmem_shm_unlink(PyObject *module, PyObject *const *args, Py_ssize_t nargs #ifndef _POSIXSHMEM_SHM_UNLINK_METHODDEF #define _POSIXSHMEM_SHM_UNLINK_METHODDEF #endif /* !defined(_POSIXSHMEM_SHM_UNLINK_METHODDEF) */ -/*[clinic end generated code: output=ff9cf0bc9b8baddf input=a9049054013a1b77]*/ +/*[clinic end generated code: output=be42e23c18677c0f input=a9049054013a1b77]*/ diff --git a/Modules/cjkcodecs/clinic/multibytecodec.c.h b/Modules/cjkcodecs/clinic/multibytecodec.c.h index c62a64179bec..84774f007600 100644 --- a/Modules/cjkcodecs/clinic/multibytecodec.c.h +++ b/Modules/cjkcodecs/clinic/multibytecodec.c.h @@ -26,14 +26,39 @@ _multibytecodec_MultibyteCodec_encode(MultibyteCodecObject *self, PyObject *cons { PyObject *return_value = NULL; static const char * const _keywords[] = {"input", "errors", NULL}; - static _PyArg_Parser _parser = {"O|z:encode", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "encode", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *input; const char *errors = NULL; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &input, &errors)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { goto exit; } + input = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1] == Py_None) { + errors = NULL; + } + else if (PyUnicode_Check(args[1])) { + Py_ssize_t errors_length; + errors = PyUnicode_AsUTF8AndSize(args[1], &errors_length); + if (errors == NULL) { + goto exit; + } + if (strlen(errors) != (size_t)errors_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + } + else { + _PyArg_BadArgument("encode", 2, "str or None", args[1]); + goto exit; + } +skip_optional_pos: return_value = _multibytecodec_MultibyteCodec_encode_impl(self, input, errors); exit: @@ -64,14 +89,45 @@ _multibytecodec_MultibyteCodec_decode(MultibyteCodecObject *self, PyObject *cons { PyObject *return_value = NULL; static const char * const _keywords[] = {"input", "errors", NULL}; - static _PyArg_Parser _parser = {"y*|z:decode", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "decode", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; Py_buffer input = {NULL, NULL}; const char *errors = NULL; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &input, &errors)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyObject_GetBuffer(args[0], &input, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&input, 'C')) { + _PyArg_BadArgument("decode", 1, "contiguous buffer", args[0]); + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1] == Py_None) { + errors = NULL; + } + else if (PyUnicode_Check(args[1])) { + Py_ssize_t errors_length; + errors = PyUnicode_AsUTF8AndSize(args[1], &errors_length); + if (errors == NULL) { + goto exit; + } + if (strlen(errors) != (size_t)errors_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + } + else { + _PyArg_BadArgument("decode", 2, "str or None", args[1]); goto exit; } +skip_optional_pos: return_value = _multibytecodec_MultibyteCodec_decode_impl(self, &input, errors); exit: @@ -101,14 +157,30 @@ _multibytecodec_MultibyteIncrementalEncoder_encode(MultibyteIncrementalEncoderOb { PyObject *return_value = NULL; static const char * const _keywords[] = {"input", "final", NULL}; - static _PyArg_Parser _parser = {"O|i:encode", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "encode", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *input; int final = 0; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &input, &final)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { goto exit; } + input = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + final = _PyLong_AsInt(args[1]); + if (final == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional_pos: return_value = _multibytecodec_MultibyteIncrementalEncoder_encode_impl(self, input, final); exit: @@ -196,14 +268,36 @@ _multibytecodec_MultibyteIncrementalDecoder_decode(MultibyteIncrementalDecoderOb { PyObject *return_value = NULL; static const char * const _keywords[] = {"input", "final", NULL}; - static _PyArg_Parser _parser = {"y*|i:decode", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "decode", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; Py_buffer input = {NULL, NULL}; int final = 0; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &input, &final)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyObject_GetBuffer(args[0], &input, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&input, 'C')) { + _PyArg_BadArgument("decode", 1, "contiguous buffer", args[0]); + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + final = _PyLong_AsInt(args[1]); + if (final == -1 && PyErr_Occurred()) { goto exit; } +skip_optional_pos: return_value = _multibytecodec_MultibyteIncrementalDecoder_decode_impl(self, &input, final); exit: @@ -431,4 +525,4 @@ PyDoc_STRVAR(_multibytecodec___create_codec__doc__, #define _MULTIBYTECODEC___CREATE_CODEC_METHODDEF \ {"__create_codec", (PyCFunction)_multibytecodec___create_codec, METH_O, _multibytecodec___create_codec__doc__}, -/*[clinic end generated code: output=bcd6311010557faf input=a9049054013a1b77]*/ +/*[clinic end generated code: output=eb95a408c4ddbfff input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_asynciomodule.c.h b/Modules/clinic/_asynciomodule.c.h index 860b57f9ee38..87669f7c9f32 100644 --- a/Modules/clinic/_asynciomodule.c.h +++ b/Modules/clinic/_asynciomodule.c.h @@ -27,13 +27,22 @@ _asyncio_Future___init__(PyObject *self, PyObject *args, PyObject *kwargs) { int return_value = -1; static const char * const _keywords[] = {"loop", NULL}; - static _PyArg_Parser _parser = {"|$O:Future", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "Future", 0}; + PyObject *argsbuf[1]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0; PyObject *loop = Py_None; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &loop)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 0, 0, 0, argsbuf); + if (!fastargs) { goto exit; } + if (!noptargs) { + goto skip_optional_kwonly; + } + loop = fastargs[0]; +skip_optional_kwonly: return_value = _asyncio_Future___init___impl((FutureObj *)self, loop); exit: @@ -131,14 +140,22 @@ _asyncio_Future_add_done_callback(FutureObj *self, PyObject *const *args, Py_ssi { PyObject *return_value = NULL; static const char * const _keywords[] = {"", "context", NULL}; - static _PyArg_Parser _parser = {"O|$O:add_done_callback", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "add_done_callback", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *fn; PyObject *context = NULL; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &fn, &context)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { goto exit; } + fn = args[0]; + if (!noptargs) { + goto skip_optional_kwonly; + } + context = args[1]; +skip_optional_kwonly: return_value = _asyncio_Future_add_done_callback_impl(self, fn, context); exit: @@ -267,15 +284,31 @@ _asyncio_Task___init__(PyObject *self, PyObject *args, PyObject *kwargs) { int return_value = -1; static const char * const _keywords[] = {"coro", "loop", "name", NULL}; - static _PyArg_Parser _parser = {"O|$OO:Task", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "Task", 0}; + PyObject *argsbuf[3]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 1; PyObject *coro; PyObject *loop = Py_None; PyObject *name = Py_None; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &coro, &loop, &name)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 1, 0, argsbuf); + if (!fastargs) { goto exit; } + coro = fastargs[0]; + if (!noptargs) { + goto skip_optional_kwonly; + } + if (fastargs[1]) { + loop = fastargs[1]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + name = fastargs[2]; +skip_optional_kwonly: return_value = _asyncio_Task___init___impl((TaskObj *)self, coro, loop, name); exit: @@ -303,13 +336,20 @@ _asyncio_Task_current_task(PyTypeObject *type, PyObject *const *args, Py_ssize_t { PyObject *return_value = NULL; static const char * const _keywords[] = {"loop", NULL}; - static _PyArg_Parser _parser = {"|O:current_task", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "current_task", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *loop = Py_None; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &loop)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + loop = args[0]; +skip_optional_pos: return_value = _asyncio_Task_current_task_impl(type, loop); exit: @@ -335,13 +375,20 @@ _asyncio_Task_all_tasks(PyTypeObject *type, PyObject *const *args, Py_ssize_t na { PyObject *return_value = NULL; static const char * const _keywords[] = {"loop", NULL}; - static _PyArg_Parser _parser = {"|O:all_tasks", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "all_tasks", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *loop = Py_None; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &loop)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + loop = args[0]; +skip_optional_pos: return_value = _asyncio_Task_all_tasks_impl(type, loop); exit: @@ -435,13 +482,20 @@ _asyncio_Task_get_stack(TaskObj *self, PyObject *const *args, Py_ssize_t nargs, { PyObject *return_value = NULL; static const char * const _keywords[] = {"limit", NULL}; - static _PyArg_Parser _parser = {"|$O:get_stack", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "get_stack", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *limit = Py_None; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &limit)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_kwonly; + } + limit = args[0]; +skip_optional_kwonly: return_value = _asyncio_Task_get_stack_impl(self, limit); exit: @@ -472,14 +526,27 @@ _asyncio_Task_print_stack(TaskObj *self, PyObject *const *args, Py_ssize_t nargs { PyObject *return_value = NULL; static const char * const _keywords[] = {"limit", "file", NULL}; - static _PyArg_Parser _parser = {"|$OO:print_stack", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "print_stack", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *limit = Py_None; PyObject *file = Py_None; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &limit, &file)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[0]) { + limit = args[0]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + file = args[1]; +skip_optional_kwonly: return_value = _asyncio_Task_print_stack_impl(self, limit, file); exit: @@ -624,13 +691,15 @@ _asyncio__register_task(PyObject *module, PyObject *const *args, Py_ssize_t narg { PyObject *return_value = NULL; static const char * const _keywords[] = {"task", NULL}; - static _PyArg_Parser _parser = {"O:_register_task", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "_register_task", 0}; + PyObject *argsbuf[1]; PyObject *task; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &task)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { goto exit; } + task = args[0]; return_value = _asyncio__register_task_impl(module, task); exit: @@ -656,13 +725,15 @@ _asyncio__unregister_task(PyObject *module, PyObject *const *args, Py_ssize_t na { PyObject *return_value = NULL; static const char * const _keywords[] = {"task", NULL}; - static _PyArg_Parser _parser = {"O:_unregister_task", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "_unregister_task", 0}; + PyObject *argsbuf[1]; PyObject *task; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &task)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { goto exit; } + task = args[0]; return_value = _asyncio__unregister_task_impl(module, task); exit: @@ -690,14 +761,17 @@ _asyncio__enter_task(PyObject *module, PyObject *const *args, Py_ssize_t nargs, { PyObject *return_value = NULL; static const char * const _keywords[] = {"loop", "task", NULL}; - static _PyArg_Parser _parser = {"OO:_enter_task", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "_enter_task", 0}; + PyObject *argsbuf[2]; PyObject *loop; PyObject *task; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &loop, &task)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { goto exit; } + loop = args[0]; + task = args[1]; return_value = _asyncio__enter_task_impl(module, loop, task); exit: @@ -725,17 +799,20 @@ _asyncio__leave_task(PyObject *module, PyObject *const *args, Py_ssize_t nargs, { PyObject *return_value = NULL; static const char * const _keywords[] = {"loop", "task", NULL}; - static _PyArg_Parser _parser = {"OO:_leave_task", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "_leave_task", 0}; + PyObject *argsbuf[2]; PyObject *loop; PyObject *task; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &loop, &task)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { goto exit; } + loop = args[0]; + task = args[1]; return_value = _asyncio__leave_task_impl(module, loop, task); exit: return return_value; } -/*[clinic end generated code: output=fd474bdc8f03d5ae input=a9049054013a1b77]*/ +/*[clinic end generated code: output=e3b02d96da56e80c input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_bz2module.c.h b/Modules/clinic/_bz2module.c.h index fb6433380541..cc16d8bb228f 100644 --- a/Modules/clinic/_bz2module.c.h +++ b/Modules/clinic/_bz2module.c.h @@ -142,14 +142,44 @@ _bz2_BZ2Decompressor_decompress(BZ2Decompressor *self, PyObject *const *args, Py { PyObject *return_value = NULL; static const char * const _keywords[] = {"data", "max_length", NULL}; - static _PyArg_Parser _parser = {"y*|n:decompress", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "decompress", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; Py_buffer data = {NULL, NULL}; Py_ssize_t max_length = -1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &data, &max_length)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { goto exit; } + if (PyObject_GetBuffer(args[0], &data, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&data, 'C')) { + _PyArg_BadArgument("decompress", 1, "contiguous buffer", args[0]); + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + max_length = ival; + } +skip_optional_pos: return_value = _bz2_BZ2Decompressor_decompress_impl(self, &data, max_length); exit: @@ -190,4 +220,4 @@ _bz2_BZ2Decompressor___init__(PyObject *self, PyObject *args, PyObject *kwargs) exit: return return_value; } -/*[clinic end generated code: output=892c6133e97ff840 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=8e123f4eec497655 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_codecsmodule.c.h b/Modules/clinic/_codecsmodule.c.h index a8223ad0a1d3..d1f4cf3fc681 100644 --- a/Modules/clinic/_codecsmodule.c.h +++ b/Modules/clinic/_codecsmodule.c.h @@ -76,15 +76,53 @@ _codecs_encode(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje { PyObject *return_value = NULL; static const char * const _keywords[] = {"obj", "encoding", "errors", NULL}; - static _PyArg_Parser _parser = {"O|ss:encode", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "encode", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *obj; const char *encoding = NULL; const char *errors = NULL; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &obj, &encoding, &errors)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); + if (!args) { goto exit; } + obj = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + if (!PyUnicode_Check(args[1])) { + _PyArg_BadArgument("encode", 2, "str", args[1]); + goto exit; + } + Py_ssize_t encoding_length; + encoding = PyUnicode_AsUTF8AndSize(args[1], &encoding_length); + if (encoding == NULL) { + goto exit; + } + if (strlen(encoding) != (size_t)encoding_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (!PyUnicode_Check(args[2])) { + _PyArg_BadArgument("encode", 3, "str", args[2]); + goto exit; + } + Py_ssize_t errors_length; + errors = PyUnicode_AsUTF8AndSize(args[2], &errors_length); + if (errors == NULL) { + goto exit; + } + if (strlen(errors) != (size_t)errors_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } +skip_optional_pos: return_value = _codecs_encode_impl(module, obj, encoding, errors); exit: @@ -115,15 +153,53 @@ _codecs_decode(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje { PyObject *return_value = NULL; static const char * const _keywords[] = {"obj", "encoding", "errors", NULL}; - static _PyArg_Parser _parser = {"O|ss:decode", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "decode", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *obj; const char *encoding = NULL; const char *errors = NULL; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &obj, &encoding, &errors)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); + if (!args) { + goto exit; + } + obj = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + if (!PyUnicode_Check(args[1])) { + _PyArg_BadArgument("decode", 2, "str", args[1]); + goto exit; + } + Py_ssize_t encoding_length; + encoding = PyUnicode_AsUTF8AndSize(args[1], &encoding_length); + if (encoding == NULL) { + goto exit; + } + if (strlen(encoding) != (size_t)encoding_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (!PyUnicode_Check(args[2])) { + _PyArg_BadArgument("decode", 3, "str", args[2]); + goto exit; + } + Py_ssize_t errors_length; + errors = PyUnicode_AsUTF8AndSize(args[2], &errors_length); + if (errors == NULL) { + goto exit; + } + if (strlen(errors) != (size_t)errors_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); goto exit; } +skip_optional_pos: return_value = _codecs_decode_impl(module, obj, encoding, errors); exit: @@ -2948,4 +3024,4 @@ _codecs_lookup_error(PyObject *module, PyObject *arg) #ifndef _CODECS_CODE_PAGE_ENCODE_METHODDEF #define _CODECS_CODE_PAGE_ENCODE_METHODDEF #endif /* !defined(_CODECS_CODE_PAGE_ENCODE_METHODDEF) */ -/*[clinic end generated code: output=85ea29db163ee74c input=a9049054013a1b77]*/ +/*[clinic end generated code: output=02bd0f0cf9a28150 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_cursesmodule.c.h b/Modules/clinic/_cursesmodule.c.h index 659fd4ec4ec8..6837eac39096 100644 --- a/Modules/clinic/_cursesmodule.c.h +++ b/Modules/clinic/_cursesmodule.c.h @@ -2988,14 +2988,52 @@ _curses_setupterm(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyO { PyObject *return_value = NULL; static const char * const _keywords[] = {"term", "fd", NULL}; - static _PyArg_Parser _parser = {"|zi:setupterm", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "setupterm", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; const char *term = NULL; int fd = -1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &term, &fd)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + if (args[0] == Py_None) { + term = NULL; + } + else if (PyUnicode_Check(args[0])) { + Py_ssize_t term_length; + term = PyUnicode_AsUTF8AndSize(args[0], &term_length); + if (term == NULL) { + goto exit; + } + if (strlen(term) != (size_t)term_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + } + else { + _PyArg_BadArgument("setupterm", 1, "str or None", args[0]); + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + fd = _PyLong_AsInt(args[1]); + if (fd == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional_pos: return_value = _curses_setupterm_impl(module, term, fd); exit: @@ -4531,4 +4569,4 @@ _curses_use_default_colors(PyObject *module, PyObject *Py_UNUSED(ignored)) #ifndef _CURSES_USE_DEFAULT_COLORS_METHODDEF #define _CURSES_USE_DEFAULT_COLORS_METHODDEF #endif /* !defined(_CURSES_USE_DEFAULT_COLORS_METHODDEF) */ -/*[clinic end generated code: output=5305982cb312a911 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=1350eeb0c1e06af6 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_datetimemodule.c.h b/Modules/clinic/_datetimemodule.c.h index 36b4fcac47e5..447036ca0381 100644 --- a/Modules/clinic/_datetimemodule.c.h +++ b/Modules/clinic/_datetimemodule.c.h @@ -36,16 +36,23 @@ datetime_datetime_now(PyTypeObject *type, PyObject *const *args, Py_ssize_t narg { PyObject *return_value = NULL; static const char * const _keywords[] = {"tz", NULL}; - static _PyArg_Parser _parser = {"|O:now", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "now", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *tz = Py_None; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &tz)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + tz = args[0]; +skip_optional_pos: return_value = datetime_datetime_now_impl(type, tz); exit: return return_value; } -/*[clinic end generated code: output=b3d746843403a8ce input=a9049054013a1b77]*/ +/*[clinic end generated code: output=aae916ab728ca85b input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_elementtree.c.h b/Modules/clinic/_elementtree.c.h index 1293acddc1ce..d239c802583c 100644 --- a/Modules/clinic/_elementtree.c.h +++ b/Modules/clinic/_elementtree.c.h @@ -169,14 +169,22 @@ _elementtree_Element_find(ElementObject *self, PyObject *const *args, Py_ssize_t { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "namespaces", NULL}; - static _PyArg_Parser _parser = {"O|O:find", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "find", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *path; PyObject *namespaces = Py_None; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &path, &namespaces)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { goto exit; } + path = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + namespaces = args[1]; +skip_optional_pos: return_value = _elementtree_Element_find_impl(self, path, namespaces); exit: @@ -201,15 +209,29 @@ _elementtree_Element_findtext(ElementObject *self, PyObject *const *args, Py_ssi { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "default", "namespaces", NULL}; - static _PyArg_Parser _parser = {"O|OO:findtext", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "findtext", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *path; PyObject *default_value = Py_None; PyObject *namespaces = Py_None; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &path, &default_value, &namespaces)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); + if (!args) { goto exit; } + path = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + default_value = args[1]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + namespaces = args[2]; +skip_optional_pos: return_value = _elementtree_Element_findtext_impl(self, path, default_value, namespaces); exit: @@ -233,14 +255,22 @@ _elementtree_Element_findall(ElementObject *self, PyObject *const *args, Py_ssiz { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "namespaces", NULL}; - static _PyArg_Parser _parser = {"O|O:findall", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "findall", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *path; PyObject *namespaces = Py_None; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &path, &namespaces)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { goto exit; } + path = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + namespaces = args[1]; +skip_optional_pos: return_value = _elementtree_Element_findall_impl(self, path, namespaces); exit: @@ -264,14 +294,22 @@ _elementtree_Element_iterfind(ElementObject *self, PyObject *const *args, Py_ssi { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "namespaces", NULL}; - static _PyArg_Parser _parser = {"O|O:iterfind", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "iterfind", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *path; PyObject *namespaces = Py_None; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &path, &namespaces)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { goto exit; } + path = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + namespaces = args[1]; +skip_optional_pos: return_value = _elementtree_Element_iterfind_impl(self, path, namespaces); exit: @@ -295,14 +333,22 @@ _elementtree_Element_get(ElementObject *self, PyObject *const *args, Py_ssize_t { PyObject *return_value = NULL; static const char * const _keywords[] = {"key", "default", NULL}; - static _PyArg_Parser _parser = {"O|O:get", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "get", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *key; PyObject *default_value = Py_None; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &key, &default_value)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { goto exit; } + key = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + default_value = args[1]; +skip_optional_pos: return_value = _elementtree_Element_get_impl(self, key, default_value); exit: @@ -342,13 +388,20 @@ _elementtree_Element_iter(ElementObject *self, PyObject *const *args, Py_ssize_t { PyObject *return_value = NULL; static const char * const _keywords[] = {"tag", NULL}; - static _PyArg_Parser _parser = {"|O:iter", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "iter", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *tag = Py_None; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &tag)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + tag = args[0]; +skip_optional_pos: return_value = _elementtree_Element_iter_impl(self, tag); exit: @@ -371,13 +424,20 @@ _elementtree_Element_getiterator(ElementObject *self, PyObject *const *args, Py_ { PyObject *return_value = NULL; static const char * const _keywords[] = {"tag", NULL}; - static _PyArg_Parser _parser = {"|O:getiterator", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "getiterator", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *tag = Py_None; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &tag)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + tag = args[0]; +skip_optional_pos: return_value = _elementtree_Element_getiterator_impl(self, tag); exit: @@ -582,13 +642,22 @@ _elementtree_TreeBuilder___init__(PyObject *self, PyObject *args, PyObject *kwar { int return_value = -1; static const char * const _keywords[] = {"element_factory", NULL}; - static _PyArg_Parser _parser = {"|O:TreeBuilder", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "TreeBuilder", 0}; + PyObject *argsbuf[1]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0; PyObject *element_factory = NULL; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &element_factory)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 0, 1, 0, argsbuf); + if (!fastargs) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + element_factory = fastargs[0]; +skip_optional_pos: return_value = _elementtree_TreeBuilder___init___impl((TreeBuilderObject *)self, element_factory); exit: @@ -671,14 +740,46 @@ _elementtree_XMLParser___init__(PyObject *self, PyObject *args, PyObject *kwargs { int return_value = -1; static const char * const _keywords[] = {"target", "encoding", NULL}; - static _PyArg_Parser _parser = {"|$Oz:XMLParser", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "XMLParser", 0}; + PyObject *argsbuf[2]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0; PyObject *target = NULL; const char *encoding = NULL; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &target, &encoding)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 0, 0, 0, argsbuf); + if (!fastargs) { + goto exit; + } + if (!noptargs) { + goto skip_optional_kwonly; + } + if (fastargs[0]) { + target = fastargs[0]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (fastargs[1] == Py_None) { + encoding = NULL; + } + else if (PyUnicode_Check(fastargs[1])) { + Py_ssize_t encoding_length; + encoding = PyUnicode_AsUTF8AndSize(fastargs[1], &encoding_length); + if (encoding == NULL) { + goto exit; + } + if (strlen(encoding) != (size_t)encoding_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + } + else { + _PyArg_BadArgument("XMLParser", 2, "str or None", fastargs[1]); goto exit; } +skip_optional_kwonly: return_value = _elementtree_XMLParser___init___impl((XMLParserObject *)self, target, encoding); exit: @@ -752,4 +853,4 @@ _elementtree_XMLParser__setevents(XMLParserObject *self, PyObject *const *args, exit: return return_value; } -/*[clinic end generated code: output=0c15c41e03a7829f input=a9049054013a1b77]*/ +/*[clinic end generated code: output=440b5d90a4b86590 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_hashopenssl.c.h b/Modules/clinic/_hashopenssl.c.h index 43f965124508..5596f13e508f 100644 --- a/Modules/clinic/_hashopenssl.c.h +++ b/Modules/clinic/_hashopenssl.c.h @@ -87,14 +87,22 @@ EVP_new(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwn { PyObject *return_value = NULL; static const char * const _keywords[] = {"name", "string", NULL}; - static _PyArg_Parser _parser = {"O|O:new", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "new", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *name_obj; PyObject *data_obj = NULL; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &name_obj, &data_obj)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { goto exit; } + name_obj = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + data_obj = args[1]; +skip_optional_pos: return_value = EVP_new_impl(module, name_obj, data_obj); exit: @@ -123,17 +131,60 @@ pbkdf2_hmac(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject { PyObject *return_value = NULL; static const char * const _keywords[] = {"hash_name", "password", "salt", "iterations", "dklen", NULL}; - static _PyArg_Parser _parser = {"sy*y*l|O:pbkdf2_hmac", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "pbkdf2_hmac", 0}; + PyObject *argsbuf[5]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 4; const char *hash_name; Py_buffer password = {NULL, NULL}; Py_buffer salt = {NULL, NULL}; long iterations; PyObject *dklen_obj = Py_None; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &hash_name, &password, &salt, &iterations, &dklen_obj)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 4, 5, 0, argsbuf); + if (!args) { + goto exit; + } + if (!PyUnicode_Check(args[0])) { + _PyArg_BadArgument("pbkdf2_hmac", 1, "str", args[0]); + goto exit; + } + Py_ssize_t hash_name_length; + hash_name = PyUnicode_AsUTF8AndSize(args[0], &hash_name_length); + if (hash_name == NULL) { + goto exit; + } + if (strlen(hash_name) != (size_t)hash_name_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + if (PyObject_GetBuffer(args[1], &password, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&password, 'C')) { + _PyArg_BadArgument("pbkdf2_hmac", 2, "contiguous buffer", args[1]); + goto exit; + } + if (PyObject_GetBuffer(args[2], &salt, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&salt, 'C')) { + _PyArg_BadArgument("pbkdf2_hmac", 3, "contiguous buffer", args[2]); + goto exit; + } + if (PyFloat_Check(args[3])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + iterations = PyLong_AsLong(args[3]); + if (iterations == -1 && PyErr_Occurred()) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + dklen_obj = args[4]; +skip_optional_pos: return_value = pbkdf2_hmac_impl(module, hash_name, &password, &salt, iterations, dklen_obj); exit: @@ -173,7 +224,9 @@ _hashlib_scrypt(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj { PyObject *return_value = NULL; static const char * const _keywords[] = {"password", "salt", "n", "r", "p", "maxmem", "dklen", NULL}; - static _PyArg_Parser _parser = {"y*|$y*O!O!O!ll:scrypt", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "scrypt", 0}; + PyObject *argsbuf[7]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; Py_buffer password = {NULL, NULL}; Py_buffer salt = {NULL, NULL}; PyObject *n_obj = Py_None; @@ -182,10 +235,86 @@ _hashlib_scrypt(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj long maxmem = 0; long dklen = 64; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &password, &salt, &PyLong_Type, &n_obj, &PyLong_Type, &r_obj, &PyLong_Type, &p_obj, &maxmem, &dklen)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyObject_GetBuffer(args[0], &password, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&password, 'C')) { + _PyArg_BadArgument("scrypt", 1, "contiguous buffer", args[0]); goto exit; } + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[1]) { + if (PyObject_GetBuffer(args[1], &salt, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&salt, 'C')) { + _PyArg_BadArgument("scrypt", 2, "contiguous buffer", args[1]); + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[2]) { + if (!PyLong_Check(args[2])) { + _PyArg_BadArgument("scrypt", 3, "int", args[2]); + goto exit; + } + n_obj = args[2]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[3]) { + if (!PyLong_Check(args[3])) { + _PyArg_BadArgument("scrypt", 4, "int", args[3]); + goto exit; + } + r_obj = args[3]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[4]) { + if (!PyLong_Check(args[4])) { + _PyArg_BadArgument("scrypt", 5, "int", args[4]); + goto exit; + } + p_obj = args[4]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[5]) { + if (PyFloat_Check(args[5])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + maxmem = PyLong_AsLong(args[5]); + if (maxmem == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (PyFloat_Check(args[6])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + dklen = PyLong_AsLong(args[6]); + if (dklen == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional_kwonly: return_value = _hashlib_scrypt_impl(module, &password, &salt, n_obj, r_obj, p_obj, maxmem, dklen); exit: @@ -221,13 +350,41 @@ _hashlib_hmac_digest(PyObject *module, PyObject *const *args, Py_ssize_t nargs, { PyObject *return_value = NULL; static const char * const _keywords[] = {"key", "msg", "digest", NULL}; - static _PyArg_Parser _parser = {"y*y*s:hmac_digest", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "hmac_digest", 0}; + PyObject *argsbuf[3]; Py_buffer key = {NULL, NULL}; Py_buffer msg = {NULL, NULL}; const char *digest; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &key, &msg, &digest)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 3, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyObject_GetBuffer(args[0], &key, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&key, 'C')) { + _PyArg_BadArgument("hmac_digest", 1, "contiguous buffer", args[0]); + goto exit; + } + if (PyObject_GetBuffer(args[1], &msg, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&msg, 'C')) { + _PyArg_BadArgument("hmac_digest", 2, "contiguous buffer", args[1]); + goto exit; + } + if (!PyUnicode_Check(args[2])) { + _PyArg_BadArgument("hmac_digest", 3, "str", args[2]); + goto exit; + } + Py_ssize_t digest_length; + digest = PyUnicode_AsUTF8AndSize(args[2], &digest_length); + if (digest == NULL) { + goto exit; + } + if (strlen(digest) != (size_t)digest_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); goto exit; } return_value = _hashlib_hmac_digest_impl(module, &key, &msg, digest); @@ -252,4 +409,4 @@ _hashlib_hmac_digest(PyObject *module, PyObject *const *args, Py_ssize_t nargs, #ifndef _HASHLIB_SCRYPT_METHODDEF #define _HASHLIB_SCRYPT_METHODDEF #endif /* !defined(_HASHLIB_SCRYPT_METHODDEF) */ -/*[clinic end generated code: output=fe5931d2b301ca12 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=5955ec791260045a input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_lzmamodule.c.h b/Modules/clinic/_lzmamodule.c.h index aeb98a66039e..68aa770d41f8 100644 --- a/Modules/clinic/_lzmamodule.c.h +++ b/Modules/clinic/_lzmamodule.c.h @@ -96,14 +96,44 @@ _lzma_LZMADecompressor_decompress(Decompressor *self, PyObject *const *args, Py_ { PyObject *return_value = NULL; static const char * const _keywords[] = {"data", "max_length", NULL}; - static _PyArg_Parser _parser = {"y*|n:decompress", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "decompress", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; Py_buffer data = {NULL, NULL}; Py_ssize_t max_length = -1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &data, &max_length)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { goto exit; } + if (PyObject_GetBuffer(args[0], &data, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&data, 'C')) { + _PyArg_BadArgument("decompress", 1, "contiguous buffer", args[0]); + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + max_length = ival; + } +skip_optional_pos: return_value = _lzma_LZMADecompressor_decompress_impl(self, &data, max_length); exit: @@ -147,15 +177,44 @@ _lzma_LZMADecompressor___init__(PyObject *self, PyObject *args, PyObject *kwargs { int return_value = -1; static const char * const _keywords[] = {"format", "memlimit", "filters", NULL}; - static _PyArg_Parser _parser = {"|iOO:LZMADecompressor", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "LZMADecompressor", 0}; + PyObject *argsbuf[3]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0; int format = FORMAT_AUTO; PyObject *memlimit = Py_None; PyObject *filters = Py_None; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &format, &memlimit, &filters)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 0, 3, 0, argsbuf); + if (!fastargs) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + if (fastargs[0]) { + if (PyFloat_Check(fastargs[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + format = _PyLong_AsInt(fastargs[0]); + if (format == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (fastargs[1]) { + memlimit = fastargs[1]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + filters = fastargs[2]; +skip_optional_pos: return_value = _lzma_LZMADecompressor___init___impl((Decompressor *)self, format, memlimit, filters); exit: @@ -275,4 +334,4 @@ _lzma__decode_filter_properties(PyObject *module, PyObject *const *args, Py_ssiz return return_value; } -/*[clinic end generated code: output=47e4732df79509ad input=a9049054013a1b77]*/ +/*[clinic end generated code: output=1a290aa478603107 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_opcode.c.h b/Modules/clinic/_opcode.c.h index 2104a52915c4..777701ff1409 100644 --- a/Modules/clinic/_opcode.c.h +++ b/Modules/clinic/_opcode.c.h @@ -20,16 +20,38 @@ _opcode_stack_effect(PyObject *module, PyObject *const *args, Py_ssize_t nargs, { PyObject *return_value = NULL; static const char * const _keywords[] = {"", "", "jump", NULL}; - static _PyArg_Parser _parser = {"i|O$O:stack_effect", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "stack_effect", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; int opcode; PyObject *oparg = Py_None; PyObject *jump = Py_None; int _return_value; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &opcode, &oparg, &jump)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { goto exit; } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + opcode = _PyLong_AsInt(args[0]); + if (opcode == -1 && PyErr_Occurred()) { + goto exit; + } + if (nargs < 2) { + goto skip_optional_posonly; + } + noptargs--; + oparg = args[1]; +skip_optional_posonly: + if (!noptargs) { + goto skip_optional_kwonly; + } + jump = args[2]; +skip_optional_kwonly: _return_value = _opcode_stack_effect_impl(module, opcode, oparg, jump); if ((_return_value == -1) && PyErr_Occurred()) { goto exit; @@ -39,4 +61,4 @@ _opcode_stack_effect(PyObject *module, PyObject *const *args, Py_ssize_t nargs, exit: return return_value; } -/*[clinic end generated code: output=871941eea3d855c6 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=7bc08f2835b2cf89 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_pickle.c.h b/Modules/clinic/_pickle.c.h index 2759b2f21e01..1da2f936be43 100644 --- a/Modules/clinic/_pickle.c.h +++ b/Modules/clinic/_pickle.c.h @@ -94,15 +94,34 @@ _pickle_Pickler___init__(PyObject *self, PyObject *args, PyObject *kwargs) { int return_value = -1; static const char * const _keywords[] = {"file", "protocol", "fix_imports", NULL}; - static _PyArg_Parser _parser = {"O|Op:Pickler", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "Pickler", 0}; + PyObject *argsbuf[3]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 1; PyObject *file; PyObject *protocol = NULL; int fix_imports = 1; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &file, &protocol, &fix_imports)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 3, 0, argsbuf); + if (!fastargs) { goto exit; } + file = fastargs[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (fastargs[1]) { + protocol = fastargs[1]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + fix_imports = PyObject_IsTrue(fastargs[2]); + if (fix_imports < 0) { + goto exit; + } +skip_optional_pos: return_value = _pickle_Pickler___init___impl((PicklerObject *)self, file, protocol, fix_imports); exit: @@ -287,16 +306,65 @@ _pickle_Unpickler___init__(PyObject *self, PyObject *args, PyObject *kwargs) { int return_value = -1; static const char * const _keywords[] = {"file", "fix_imports", "encoding", "errors", NULL}; - static _PyArg_Parser _parser = {"O|$pss:Unpickler", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "Unpickler", 0}; + PyObject *argsbuf[4]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 1; PyObject *file; int fix_imports = 1; const char *encoding = "ASCII"; const char *errors = "strict"; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &file, &fix_imports, &encoding, &errors)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 1, 0, argsbuf); + if (!fastargs) { + goto exit; + } + file = fastargs[0]; + if (!noptargs) { + goto skip_optional_kwonly; + } + if (fastargs[1]) { + fix_imports = PyObject_IsTrue(fastargs[1]); + if (fix_imports < 0) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (fastargs[2]) { + if (!PyUnicode_Check(fastargs[2])) { + _PyArg_BadArgument("Unpickler", 3, "str", fastargs[2]); + goto exit; + } + Py_ssize_t encoding_length; + encoding = PyUnicode_AsUTF8AndSize(fastargs[2], &encoding_length); + if (encoding == NULL) { + goto exit; + } + if (strlen(encoding) != (size_t)encoding_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (!PyUnicode_Check(fastargs[3])) { + _PyArg_BadArgument("Unpickler", 4, "str", fastargs[3]); + goto exit; + } + Py_ssize_t errors_length; + errors = PyUnicode_AsUTF8AndSize(fastargs[3], &errors_length); + if (errors == NULL) { goto exit; } + if (strlen(errors) != (size_t)errors_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } +skip_optional_kwonly: return_value = _pickle_Unpickler___init___impl((UnpicklerObject *)self, file, fix_imports, encoding, errors); exit: @@ -396,16 +464,38 @@ _pickle_dump(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject { PyObject *return_value = NULL; static const char * const _keywords[] = {"obj", "file", "protocol", "fix_imports", NULL}; - static _PyArg_Parser _parser = {"OO|O$p:dump", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "dump", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; PyObject *obj; PyObject *file; PyObject *protocol = NULL; int fix_imports = 1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &obj, &file, &protocol, &fix_imports)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf); + if (!args) { + goto exit; + } + obj = args[0]; + file = args[1]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[2]) { + protocol = args[2]; + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + fix_imports = PyObject_IsTrue(args[3]); + if (fix_imports < 0) { goto exit; } +skip_optional_kwonly: return_value = _pickle_dump_impl(module, obj, file, protocol, fix_imports); exit: @@ -443,15 +533,36 @@ _pickle_dumps(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObjec { PyObject *return_value = NULL; static const char * const _keywords[] = {"obj", "protocol", "fix_imports", NULL}; - static _PyArg_Parser _parser = {"O|O$p:dumps", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "dumps", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *obj; PyObject *protocol = NULL; int fix_imports = 1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &obj, &protocol, &fix_imports)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { goto exit; } + obj = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + protocol = args[1]; + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + fix_imports = PyObject_IsTrue(args[2]); + if (fix_imports < 0) { + goto exit; + } +skip_optional_kwonly: return_value = _pickle_dumps_impl(module, obj, protocol, fix_imports); exit: @@ -499,16 +610,63 @@ _pickle_load(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject { PyObject *return_value = NULL; static const char * const _keywords[] = {"file", "fix_imports", "encoding", "errors", NULL}; - static _PyArg_Parser _parser = {"O|$pss:load", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "load", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *file; int fix_imports = 1; const char *encoding = "ASCII"; const char *errors = "strict"; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &file, &fix_imports, &encoding, &errors)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + file = args[0]; + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[1]) { + fix_imports = PyObject_IsTrue(args[1]); + if (fix_imports < 0) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[2]) { + if (!PyUnicode_Check(args[2])) { + _PyArg_BadArgument("load", 3, "str", args[2]); + goto exit; + } + Py_ssize_t encoding_length; + encoding = PyUnicode_AsUTF8AndSize(args[2], &encoding_length); + if (encoding == NULL) { + goto exit; + } + if (strlen(encoding) != (size_t)encoding_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (!PyUnicode_Check(args[3])) { + _PyArg_BadArgument("load", 4, "str", args[3]); + goto exit; + } + Py_ssize_t errors_length; + errors = PyUnicode_AsUTF8AndSize(args[3], &errors_length); + if (errors == NULL) { + goto exit; + } + if (strlen(errors) != (size_t)errors_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); goto exit; } +skip_optional_kwonly: return_value = _pickle_load_impl(module, file, fix_imports, encoding, errors); exit: @@ -547,19 +705,66 @@ _pickle_loads(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObjec { PyObject *return_value = NULL; static const char * const _keywords[] = {"data", "fix_imports", "encoding", "errors", NULL}; - static _PyArg_Parser _parser = {"O|$pss:loads", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "loads", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *data; int fix_imports = 1; const char *encoding = "ASCII"; const char *errors = "strict"; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &data, &fix_imports, &encoding, &errors)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + data = args[0]; + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[1]) { + fix_imports = PyObject_IsTrue(args[1]); + if (fix_imports < 0) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[2]) { + if (!PyUnicode_Check(args[2])) { + _PyArg_BadArgument("loads", 3, "str", args[2]); + goto exit; + } + Py_ssize_t encoding_length; + encoding = PyUnicode_AsUTF8AndSize(args[2], &encoding_length); + if (encoding == NULL) { + goto exit; + } + if (strlen(encoding) != (size_t)encoding_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (!PyUnicode_Check(args[3])) { + _PyArg_BadArgument("loads", 4, "str", args[3]); + goto exit; + } + Py_ssize_t errors_length; + errors = PyUnicode_AsUTF8AndSize(args[3], &errors_length); + if (errors == NULL) { + goto exit; + } + if (strlen(errors) != (size_t)errors_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); goto exit; } +skip_optional_kwonly: return_value = _pickle_loads_impl(module, data, fix_imports, encoding, errors); exit: return return_value; } -/*[clinic end generated code: output=225f06abcf27ed2b input=a9049054013a1b77]*/ +/*[clinic end generated code: output=8f972562c8f71e2b input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_queuemodule.c.h b/Modules/clinic/_queuemodule.c.h index a19fe78e3a01..c25eacf08bc8 100644 --- a/Modules/clinic/_queuemodule.c.h +++ b/Modules/clinic/_queuemodule.c.h @@ -51,15 +51,32 @@ _queue_SimpleQueue_put(simplequeueobject *self, PyObject *const *args, Py_ssize_ { PyObject *return_value = NULL; static const char * const _keywords[] = {"item", "block", "timeout", NULL}; - static _PyArg_Parser _parser = {"O|pO:put", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "put", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *item; int block = 1; PyObject *timeout = Py_None; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &item, &block, &timeout)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); + if (!args) { goto exit; } + item = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + block = PyObject_IsTrue(args[1]); + if (block < 0) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + timeout = args[2]; +skip_optional_pos: return_value = _queue_SimpleQueue_put_impl(self, item, block, timeout); exit: @@ -86,13 +103,15 @@ _queue_SimpleQueue_put_nowait(simplequeueobject *self, PyObject *const *args, Py { PyObject *return_value = NULL; static const char * const _keywords[] = {"item", NULL}; - static _PyArg_Parser _parser = {"O:put_nowait", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "put_nowait", 0}; + PyObject *argsbuf[1]; PyObject *item; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &item)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { goto exit; } + item = args[0]; return_value = _queue_SimpleQueue_put_nowait_impl(self, item); exit: @@ -125,14 +144,30 @@ _queue_SimpleQueue_get(simplequeueobject *self, PyObject *const *args, Py_ssize_ { PyObject *return_value = NULL; static const char * const _keywords[] = {"block", "timeout", NULL}; - static _PyArg_Parser _parser = {"|pO:get", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "get", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; int block = 1; PyObject *timeout = Py_None; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &block, &timeout)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + block = PyObject_IsTrue(args[0]); + if (block < 0) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + timeout = args[1]; +skip_optional_pos: return_value = _queue_SimpleQueue_get_impl(self, block, timeout); exit: @@ -215,4 +250,4 @@ _queue_SimpleQueue_qsize(simplequeueobject *self, PyObject *Py_UNUSED(ignored)) exit: return return_value; } -/*[clinic end generated code: output=c12ce9050f153304 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b4717e2974cbc909 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_sre.c.h b/Modules/clinic/_sre.c.h index e5bb32fbea69..9c08dec4541a 100644 --- a/Modules/clinic/_sre.c.h +++ b/Modules/clinic/_sre.c.h @@ -195,15 +195,61 @@ _sre_SRE_Pattern_match(PatternObject *self, PyObject *const *args, Py_ssize_t na { PyObject *return_value = NULL; static const char * const _keywords[] = {"string", "pos", "endpos", NULL}; - static _PyArg_Parser _parser = {"O|nn:match", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "match", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *string; Py_ssize_t pos = 0; Py_ssize_t endpos = PY_SSIZE_T_MAX; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &string, &pos, &endpos)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); + if (!args) { goto exit; } + string = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + pos = ival; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + endpos = ival; + } +skip_optional_pos: return_value = _sre_SRE_Pattern_match_impl(self, string, pos, endpos); exit: @@ -228,15 +274,61 @@ _sre_SRE_Pattern_fullmatch(PatternObject *self, PyObject *const *args, Py_ssize_ { PyObject *return_value = NULL; static const char * const _keywords[] = {"string", "pos", "endpos", NULL}; - static _PyArg_Parser _parser = {"O|nn:fullmatch", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "fullmatch", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *string; Py_ssize_t pos = 0; Py_ssize_t endpos = PY_SSIZE_T_MAX; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &string, &pos, &endpos)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); + if (!args) { + goto exit; + } + string = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + pos = ival; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); goto exit; } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + endpos = ival; + } +skip_optional_pos: return_value = _sre_SRE_Pattern_fullmatch_impl(self, string, pos, endpos); exit: @@ -263,15 +355,61 @@ _sre_SRE_Pattern_search(PatternObject *self, PyObject *const *args, Py_ssize_t n { PyObject *return_value = NULL; static const char * const _keywords[] = {"string", "pos", "endpos", NULL}; - static _PyArg_Parser _parser = {"O|nn:search", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "search", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *string; Py_ssize_t pos = 0; Py_ssize_t endpos = PY_SSIZE_T_MAX; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &string, &pos, &endpos)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); + if (!args) { + goto exit; + } + string = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + pos = ival; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); goto exit; } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + endpos = ival; + } +skip_optional_pos: return_value = _sre_SRE_Pattern_search_impl(self, string, pos, endpos); exit: @@ -296,15 +434,61 @@ _sre_SRE_Pattern_findall(PatternObject *self, PyObject *const *args, Py_ssize_t { PyObject *return_value = NULL; static const char * const _keywords[] = {"string", "pos", "endpos", NULL}; - static _PyArg_Parser _parser = {"O|nn:findall", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "findall", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *string; Py_ssize_t pos = 0; Py_ssize_t endpos = PY_SSIZE_T_MAX; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &string, &pos, &endpos)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); + if (!args) { + goto exit; + } + string = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + pos = ival; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); goto exit; } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + endpos = ival; + } +skip_optional_pos: return_value = _sre_SRE_Pattern_findall_impl(self, string, pos, endpos); exit: @@ -331,15 +515,61 @@ _sre_SRE_Pattern_finditer(PatternObject *self, PyObject *const *args, Py_ssize_t { PyObject *return_value = NULL; static const char * const _keywords[] = {"string", "pos", "endpos", NULL}; - static _PyArg_Parser _parser = {"O|nn:finditer", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "finditer", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *string; Py_ssize_t pos = 0; Py_ssize_t endpos = PY_SSIZE_T_MAX; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &string, &pos, &endpos)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); + if (!args) { + goto exit; + } + string = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + pos = ival; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); goto exit; } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + endpos = ival; + } +skip_optional_pos: return_value = _sre_SRE_Pattern_finditer_impl(self, string, pos, endpos); exit: @@ -363,15 +593,61 @@ _sre_SRE_Pattern_scanner(PatternObject *self, PyObject *const *args, Py_ssize_t { PyObject *return_value = NULL; static const char * const _keywords[] = {"string", "pos", "endpos", NULL}; - static _PyArg_Parser _parser = {"O|nn:scanner", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "scanner", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *string; Py_ssize_t pos = 0; Py_ssize_t endpos = PY_SSIZE_T_MAX; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &string, &pos, &endpos)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); + if (!args) { goto exit; } + string = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + pos = ival; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + endpos = ival; + } +skip_optional_pos: return_value = _sre_SRE_Pattern_scanner_impl(self, string, pos, endpos); exit: @@ -396,14 +672,38 @@ _sre_SRE_Pattern_split(PatternObject *self, PyObject *const *args, Py_ssize_t na { PyObject *return_value = NULL; static const char * const _keywords[] = {"string", "maxsplit", NULL}; - static _PyArg_Parser _parser = {"O|n:split", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "split", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *string; Py_ssize_t maxsplit = 0; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &string, &maxsplit)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { + goto exit; + } + string = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); goto exit; } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + maxsplit = ival; + } +skip_optional_pos: return_value = _sre_SRE_Pattern_split_impl(self, string, maxsplit); exit: @@ -428,15 +728,40 @@ _sre_SRE_Pattern_sub(PatternObject *self, PyObject *const *args, Py_ssize_t narg { PyObject *return_value = NULL; static const char * const _keywords[] = {"repl", "string", "count", NULL}; - static _PyArg_Parser _parser = {"OO|n:sub", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "sub", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; PyObject *repl; PyObject *string; Py_ssize_t count = 0; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &repl, &string, &count)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf); + if (!args) { + goto exit; + } + repl = args[0]; + string = args[1]; + if (!noptargs) { + goto skip_optional_pos; + } + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); goto exit; } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + count = ival; + } +skip_optional_pos: return_value = _sre_SRE_Pattern_sub_impl(self, repl, string, count); exit: @@ -461,15 +786,40 @@ _sre_SRE_Pattern_subn(PatternObject *self, PyObject *const *args, Py_ssize_t nar { PyObject *return_value = NULL; static const char * const _keywords[] = {"repl", "string", "count", NULL}; - static _PyArg_Parser _parser = {"OO|n:subn", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "subn", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; PyObject *repl; PyObject *string; Py_ssize_t count = 0; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &repl, &string, &count)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf); + if (!args) { + goto exit; + } + repl = args[0]; + string = args[1]; + if (!noptargs) { + goto skip_optional_pos; + } + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); goto exit; } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + count = ival; + } +skip_optional_pos: return_value = _sre_SRE_Pattern_subn_impl(self, repl, string, count); exit: @@ -520,7 +870,8 @@ _sre_compile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject { PyObject *return_value = NULL; static const char * const _keywords[] = {"pattern", "flags", "code", "groups", "groupindex", "indexgroup", NULL}; - static _PyArg_Parser _parser = {"OiO!nO!O!:compile", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "compile", 0}; + PyObject *argsbuf[6]; PyObject *pattern; int flags; PyObject *code; @@ -528,10 +879,52 @@ _sre_compile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject PyObject *groupindex; PyObject *indexgroup; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &pattern, &flags, &PyList_Type, &code, &groups, &PyDict_Type, &groupindex, &PyTuple_Type, &indexgroup)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 6, 6, 0, argsbuf); + if (!args) { goto exit; } + pattern = args[0]; + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + flags = _PyLong_AsInt(args[1]); + if (flags == -1 && PyErr_Occurred()) { + goto exit; + } + if (!PyList_Check(args[2])) { + _PyArg_BadArgument("compile", 3, "list", args[2]); + goto exit; + } + code = args[2]; + if (PyFloat_Check(args[3])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[3]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + groups = ival; + } + if (!PyDict_Check(args[4])) { + _PyArg_BadArgument("compile", 5, "dict", args[4]); + goto exit; + } + groupindex = args[4]; + if (!PyTuple_Check(args[5])) { + _PyArg_BadArgument("compile", 6, "tuple", args[5]); + goto exit; + } + indexgroup = args[5]; return_value = _sre_compile_impl(module, pattern, flags, code, groups, groupindex, indexgroup); exit: @@ -555,13 +948,15 @@ _sre_SRE_Match_expand(MatchObject *self, PyObject *const *args, Py_ssize_t nargs { PyObject *return_value = NULL; static const char * const _keywords[] = {"template", NULL}; - static _PyArg_Parser _parser = {"O:expand", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "expand", 0}; + PyObject *argsbuf[1]; PyObject *template; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &template)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { goto exit; } + template = args[0]; return_value = _sre_SRE_Match_expand_impl(self, template); exit: @@ -588,13 +983,20 @@ _sre_SRE_Match_groups(MatchObject *self, PyObject *const *args, Py_ssize_t nargs { PyObject *return_value = NULL; static const char * const _keywords[] = {"default", NULL}; - static _PyArg_Parser _parser = {"|O:groups", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "groups", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *default_value = Py_None; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &default_value)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + default_value = args[0]; +skip_optional_pos: return_value = _sre_SRE_Match_groups_impl(self, default_value); exit: @@ -621,13 +1023,20 @@ _sre_SRE_Match_groupdict(MatchObject *self, PyObject *const *args, Py_ssize_t na { PyObject *return_value = NULL; static const char * const _keywords[] = {"default", NULL}; - static _PyArg_Parser _parser = {"|O:groupdict", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "groupdict", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *default_value = Py_None; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &default_value)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + default_value = args[0]; +skip_optional_pos: return_value = _sre_SRE_Match_groupdict_impl(self, default_value); exit: @@ -798,4 +1207,4 @@ _sre_SRE_Scanner_search(ScannerObject *self, PyObject *Py_UNUSED(ignored)) { return _sre_SRE_Scanner_search_impl(self); } -/*[clinic end generated code: output=8d19359d6a4a3a7e input=a9049054013a1b77]*/ +/*[clinic end generated code: output=67b702da5bdc9cac input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_ssl.c.h b/Modules/clinic/_ssl.c.h index 3ec30c3c9850..b1012f7aee2e 100644 --- a/Modules/clinic/_ssl.c.h +++ b/Modules/clinic/_ssl.c.h @@ -340,13 +340,32 @@ _ssl__SSLSocket_get_channel_binding(PySSLSocket *self, PyObject *const *args, Py { PyObject *return_value = NULL; static const char * const _keywords[] = {"cb_type", NULL}; - static _PyArg_Parser _parser = {"|s:get_channel_binding", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "get_channel_binding", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; const char *cb_type = "tls-unique"; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &cb_type)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + if (!PyUnicode_Check(args[0])) { + _PyArg_BadArgument("get_channel_binding", 1, "str", args[0]); + goto exit; + } + Py_ssize_t cb_type_length; + cb_type = PyUnicode_AsUTF8AndSize(args[0], &cb_type_length); + if (cb_type == NULL) { + goto exit; + } + if (strlen(cb_type) != (size_t)cb_type_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } +skip_optional_pos: return_value = _ssl__SSLSocket_get_channel_binding_impl(self, cb_type); exit: @@ -548,15 +567,29 @@ _ssl__SSLContext_load_cert_chain(PySSLContext *self, PyObject *const *args, Py_s { PyObject *return_value = NULL; static const char * const _keywords[] = {"certfile", "keyfile", "password", NULL}; - static _PyArg_Parser _parser = {"O|OO:load_cert_chain", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "load_cert_chain", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *certfile; PyObject *keyfile = NULL; PyObject *password = NULL; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &certfile, &keyfile, &password)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); + if (!args) { goto exit; } + certfile = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + keyfile = args[1]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + password = args[2]; +skip_optional_pos: return_value = _ssl__SSLContext_load_cert_chain_impl(self, certfile, keyfile, password); exit: @@ -582,15 +615,34 @@ _ssl__SSLContext_load_verify_locations(PySSLContext *self, PyObject *const *args { PyObject *return_value = NULL; static const char * const _keywords[] = {"cafile", "capath", "cadata", NULL}; - static _PyArg_Parser _parser = {"|OOO:load_verify_locations", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "load_verify_locations", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *cafile = NULL; PyObject *capath = NULL; PyObject *cadata = NULL; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &cafile, &capath, &cadata)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 3, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + cafile = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (args[1]) { + capath = args[1]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + cadata = args[2]; +skip_optional_pos: return_value = _ssl__SSLContext_load_verify_locations_impl(self, cafile, capath, cadata); exit: @@ -624,17 +676,54 @@ _ssl__SSLContext__wrap_socket(PySSLContext *self, PyObject *const *args, Py_ssiz { PyObject *return_value = NULL; static const char * const _keywords[] = {"sock", "server_side", "server_hostname", "owner", "session", NULL}; - static _PyArg_Parser _parser = {"O!i|O$OO:_wrap_socket", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "_wrap_socket", 0}; + PyObject *argsbuf[5]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; PyObject *sock; int server_side; PyObject *hostname_obj = Py_None; PyObject *owner = Py_None; PyObject *session = Py_None; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - PySocketModule.Sock_Type, &sock, &server_side, &hostname_obj, &owner, &session)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf); + if (!args) { + goto exit; + } + if (!PyObject_TypeCheck(args[0], PySocketModule.Sock_Type)) { + _PyArg_BadArgument("_wrap_socket", 1, (PySocketModule.Sock_Type)->tp_name, args[0]); goto exit; } + sock = args[0]; + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + server_side = _PyLong_AsInt(args[1]); + if (server_side == -1 && PyErr_Occurred()) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[2]) { + hostname_obj = args[2]; + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[3]) { + owner = args[3]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + session = args[4]; +skip_optional_kwonly: return_value = _ssl__SSLContext__wrap_socket_impl(self, sock, server_side, hostname_obj, owner, session); exit: @@ -661,7 +750,9 @@ _ssl__SSLContext__wrap_bio(PySSLContext *self, PyObject *const *args, Py_ssize_t { PyObject *return_value = NULL; static const char * const _keywords[] = {"incoming", "outgoing", "server_side", "server_hostname", "owner", "session", NULL}; - static _PyArg_Parser _parser = {"O!O!i|O$OO:_wrap_bio", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "_wrap_bio", 0}; + PyObject *argsbuf[6]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 3; PySSLMemoryBIO *incoming; PySSLMemoryBIO *outgoing; int server_side; @@ -669,10 +760,50 @@ _ssl__SSLContext__wrap_bio(PySSLContext *self, PyObject *const *args, Py_ssize_t PyObject *owner = Py_None; PyObject *session = Py_None; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &PySSLMemoryBIO_Type, &incoming, &PySSLMemoryBIO_Type, &outgoing, &server_side, &hostname_obj, &owner, &session)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 4, 0, argsbuf); + if (!args) { goto exit; } + if (!PyObject_TypeCheck(args[0], &PySSLMemoryBIO_Type)) { + _PyArg_BadArgument("_wrap_bio", 1, (&PySSLMemoryBIO_Type)->tp_name, args[0]); + goto exit; + } + incoming = (PySSLMemoryBIO *)args[0]; + if (!PyObject_TypeCheck(args[1], &PySSLMemoryBIO_Type)) { + _PyArg_BadArgument("_wrap_bio", 2, (&PySSLMemoryBIO_Type)->tp_name, args[1]); + goto exit; + } + outgoing = (PySSLMemoryBIO *)args[1]; + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + server_side = _PyLong_AsInt(args[2]); + if (server_side == -1 && PyErr_Occurred()) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[3]) { + hostname_obj = args[3]; + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[4]) { + owner = args[4]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + session = args[5]; +skip_optional_kwonly: return_value = _ssl__SSLContext__wrap_bio_impl(self, incoming, outgoing, server_side, hostname_obj, owner, session); exit: @@ -772,13 +903,23 @@ _ssl__SSLContext_get_ca_certs(PySSLContext *self, PyObject *const *args, Py_ssiz { PyObject *return_value = NULL; static const char * const _keywords[] = {"binary_form", NULL}; - static _PyArg_Parser _parser = {"|p:get_ca_certs", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "get_ca_certs", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; int binary_form = 0; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &binary_form)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + binary_form = PyObject_IsTrue(args[0]); + if (binary_form < 0) { + goto exit; + } +skip_optional_pos: return_value = _ssl__SSLContext_get_ca_certs_impl(self, binary_form); exit: @@ -1131,14 +1272,37 @@ _ssl_txt2obj(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject { PyObject *return_value = NULL; static const char * const _keywords[] = {"txt", "name", NULL}; - static _PyArg_Parser _parser = {"s|p:txt2obj", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "txt2obj", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; const char *txt; int name = 0; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &txt, &name)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!PyUnicode_Check(args[0])) { + _PyArg_BadArgument("txt2obj", 1, "str", args[0]); + goto exit; + } + Py_ssize_t txt_length; + txt = PyUnicode_AsUTF8AndSize(args[0], &txt_length); + if (txt == NULL) { + goto exit; + } + if (strlen(txt) != (size_t)txt_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + name = PyObject_IsTrue(args[1]); + if (name < 0) { + goto exit; + } +skip_optional_pos: return_value = _ssl_txt2obj_impl(module, txt, name); exit: @@ -1203,11 +1367,25 @@ _ssl_enum_certificates(PyObject *module, PyObject *const *args, Py_ssize_t nargs { PyObject *return_value = NULL; static const char * const _keywords[] = {"store_name", NULL}; - static _PyArg_Parser _parser = {"s:enum_certificates", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "enum_certificates", 0}; + PyObject *argsbuf[1]; const char *store_name; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &store_name)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!PyUnicode_Check(args[0])) { + _PyArg_BadArgument("enum_certificates", 1, "str", args[0]); + goto exit; + } + Py_ssize_t store_name_length; + store_name = PyUnicode_AsUTF8AndSize(args[0], &store_name_length); + if (store_name == NULL) { + goto exit; + } + if (strlen(store_name) != (size_t)store_name_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); goto exit; } return_value = _ssl_enum_certificates_impl(module, store_name); @@ -1242,11 +1420,25 @@ _ssl_enum_crls(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje { PyObject *return_value = NULL; static const char * const _keywords[] = {"store_name", NULL}; - static _PyArg_Parser _parser = {"s:enum_crls", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "enum_crls", 0}; + PyObject *argsbuf[1]; const char *store_name; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &store_name)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!PyUnicode_Check(args[0])) { + _PyArg_BadArgument("enum_crls", 1, "str", args[0]); + goto exit; + } + Py_ssize_t store_name_length; + store_name = PyUnicode_AsUTF8AndSize(args[0], &store_name_length); + if (store_name == NULL) { + goto exit; + } + if (strlen(store_name) != (size_t)store_name_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); goto exit; } return_value = _ssl_enum_crls_impl(module, store_name); @@ -1284,4 +1476,4 @@ _ssl_enum_crls(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje #ifndef _SSL_ENUM_CRLS_METHODDEF #define _SSL_ENUM_CRLS_METHODDEF #endif /* !defined(_SSL_ENUM_CRLS_METHODDEF) */ -/*[clinic end generated code: output=ac3fb15ca27500f2 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=a399d0eb393b6fab input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_struct.c.h b/Modules/clinic/_struct.c.h index 2cc2d216f8b4..908c44266c4e 100644 --- a/Modules/clinic/_struct.c.h +++ b/Modules/clinic/_struct.c.h @@ -21,13 +21,17 @@ Struct___init__(PyObject *self, PyObject *args, PyObject *kwargs) { int return_value = -1; static const char * const _keywords[] = {"format", NULL}; - static _PyArg_Parser _parser = {"O:Struct", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "Struct", 0}; + PyObject *argsbuf[1]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); PyObject *format; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &format)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 1, 0, argsbuf); + if (!fastargs) { goto exit; } + format = fastargs[0]; return_value = Struct___init___impl((PyStructObject *)self, format); exit: @@ -100,14 +104,44 @@ Struct_unpack_from(PyStructObject *self, PyObject *const *args, Py_ssize_t nargs { PyObject *return_value = NULL; static const char * const _keywords[] = {"buffer", "offset", NULL}; - static _PyArg_Parser _parser = {"y*|n:unpack_from", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "unpack_from", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; Py_buffer buffer = {NULL, NULL}; Py_ssize_t offset = 0; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &buffer, &offset)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { goto exit; } + if (PyObject_GetBuffer(args[0], &buffer, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&buffer, 'C')) { + _PyArg_BadArgument("unpack_from", 1, "contiguous buffer", args[0]); + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + offset = ival; + } +skip_optional_pos: return_value = Struct_unpack_from_impl(self, &buffer, offset); exit: @@ -257,15 +291,48 @@ unpack_from(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject { PyObject *return_value = NULL; static const char * const _keywords[] = {"", "buffer", "offset", NULL}; - static _PyArg_Parser _parser = {"O&y*|n:unpack_from", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "unpack_from", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; PyStructObject *s_object = NULL; Py_buffer buffer = {NULL, NULL}; Py_ssize_t offset = 0; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - cache_struct_converter, &s_object, &buffer, &offset)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf); + if (!args) { + goto exit; + } + if (!cache_struct_converter(args[0], &s_object)) { + goto exit; + } + if (PyObject_GetBuffer(args[1], &buffer, PyBUF_SIMPLE) != 0) { goto exit; } + if (!PyBuffer_IsContiguous(&buffer, 'C')) { + _PyArg_BadArgument("unpack_from", 2, "contiguous buffer", args[1]); + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + offset = ival; + } +skip_optional_pos: return_value = unpack_from_impl(module, s_object, &buffer, offset); exit: @@ -319,4 +386,4 @@ iter_unpack(PyObject *module, PyObject *const *args, Py_ssize_t nargs) return return_value; } -/*[clinic end generated code: output=ac595db9d2b271aa input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b642e1002d25ebdd input=a9049054013a1b77]*/ diff --git a/Modules/clinic/binascii.c.h b/Modules/clinic/binascii.c.h index 3295833e87a9..4043d89d97db 100644 --- a/Modules/clinic/binascii.c.h +++ b/Modules/clinic/binascii.c.h @@ -50,14 +50,36 @@ binascii_b2a_uu(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj { PyObject *return_value = NULL; static const char * const _keywords[] = {"", "backtick", NULL}; - static _PyArg_Parser _parser = {"y*|$i:b2a_uu", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "b2a_uu", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; Py_buffer data = {NULL, NULL}; int backtick = 0; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &data, &backtick)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { goto exit; } + if (PyObject_GetBuffer(args[0], &data, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&data, 'C')) { + _PyArg_BadArgument("b2a_uu", 1, "contiguous buffer", args[0]); + goto exit; + } + if (!noptargs) { + goto skip_optional_kwonly; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + backtick = _PyLong_AsInt(args[1]); + if (backtick == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional_kwonly: return_value = binascii_b2a_uu_impl(module, &data, backtick); exit: @@ -117,14 +139,36 @@ binascii_b2a_base64(PyObject *module, PyObject *const *args, Py_ssize_t nargs, P { PyObject *return_value = NULL; static const char * const _keywords[] = {"", "newline", NULL}; - static _PyArg_Parser _parser = {"y*|$i:b2a_base64", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "b2a_base64", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; Py_buffer data = {NULL, NULL}; int newline = 1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &data, &newline)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyObject_GetBuffer(args[0], &data, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&data, 'C')) { + _PyArg_BadArgument("b2a_base64", 1, "contiguous buffer", args[0]); + goto exit; + } + if (!noptargs) { + goto skip_optional_kwonly; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + newline = _PyLong_AsInt(args[1]); + if (newline == -1 && PyErr_Occurred()) { goto exit; } +skip_optional_kwonly: return_value = binascii_b2a_base64_impl(module, &data, newline); exit: @@ -548,14 +592,32 @@ binascii_a2b_qp(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj { PyObject *return_value = NULL; static const char * const _keywords[] = {"data", "header", NULL}; - static _PyArg_Parser _parser = {"O&|i:a2b_qp", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "a2b_qp", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; Py_buffer data = {NULL, NULL}; int header = 0; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - ascii_buffer_converter, &data, &header)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!ascii_buffer_converter(args[0], &data)) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + header = _PyLong_AsInt(args[1]); + if (header == -1 && PyErr_Occurred()) { goto exit; } +skip_optional_pos: return_value = binascii_a2b_qp_impl(module, &data, header); exit: @@ -588,16 +650,66 @@ binascii_b2a_qp(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj { PyObject *return_value = NULL; static const char * const _keywords[] = {"data", "quotetabs", "istext", "header", NULL}; - static _PyArg_Parser _parser = {"y*|iii:b2a_qp", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "b2a_qp", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; Py_buffer data = {NULL, NULL}; int quotetabs = 0; int istext = 1; int header = 0; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &data, "etabs, &istext, &header)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 4, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyObject_GetBuffer(args[0], &data, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&data, 'C')) { + _PyArg_BadArgument("b2a_qp", 1, "contiguous buffer", args[0]); + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + quotetabs = _PyLong_AsInt(args[1]); + if (quotetabs == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (args[2]) { + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + istext = _PyLong_AsInt(args[2]); + if (istext == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (PyFloat_Check(args[3])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + header = _PyLong_AsInt(args[3]); + if (header == -1 && PyErr_Occurred()) { goto exit; } +skip_optional_pos: return_value = binascii_b2a_qp_impl(module, &data, quotetabs, istext, header); exit: @@ -608,4 +720,4 @@ binascii_b2a_qp(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj return return_value; } -/*[clinic end generated code: output=7210a01a718da4a0 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=a4a38e162605aca2 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/cmathmodule.c.h b/Modules/clinic/cmathmodule.c.h index cc1b8f2e21c0..83c498c22406 100644 --- a/Modules/clinic/cmathmodule.c.h +++ b/Modules/clinic/cmathmodule.c.h @@ -897,17 +897,44 @@ cmath_isclose(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObjec { PyObject *return_value = NULL; static const char * const _keywords[] = {"a", "b", "rel_tol", "abs_tol", NULL}; - static _PyArg_Parser _parser = {"DD|$dd:isclose", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "isclose", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; Py_complex a; Py_complex b; double rel_tol = 1e-09; double abs_tol = 0.0; int _return_value; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &a, &b, &rel_tol, &abs_tol)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { goto exit; } + a = PyComplex_AsCComplex(args[0]); + if (PyErr_Occurred()) { + goto exit; + } + b = PyComplex_AsCComplex(args[1]); + if (PyErr_Occurred()) { + goto exit; + } + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[2]) { + rel_tol = PyFloat_AsDouble(args[2]); + if (PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + abs_tol = PyFloat_AsDouble(args[3]); + if (PyErr_Occurred()) { + goto exit; + } +skip_optional_kwonly: _return_value = cmath_isclose_impl(module, a, b, rel_tol, abs_tol); if ((_return_value == -1) && PyErr_Occurred()) { goto exit; @@ -917,4 +944,4 @@ cmath_isclose(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObjec exit: return return_value; } -/*[clinic end generated code: output=86a365d23f34aaff input=a9049054013a1b77]*/ +/*[clinic end generated code: output=c7afb866e593fa45 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/gcmodule.c.h b/Modules/clinic/gcmodule.c.h index eece04597b10..22d2aa4a87bc 100644 --- a/Modules/clinic/gcmodule.c.h +++ b/Modules/clinic/gcmodule.c.h @@ -89,14 +89,29 @@ gc_collect(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject * { PyObject *return_value = NULL; static const char * const _keywords[] = {"generation", NULL}; - static _PyArg_Parser _parser = {"|i:collect", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "collect", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; int generation = NUM_GENERATIONS - 1; Py_ssize_t _return_value; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &generation)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + generation = _PyLong_AsInt(args[0]); + if (generation == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional_pos: _return_value = gc_collect_impl(module, generation); if ((_return_value == -1) && PyErr_Occurred()) { goto exit; @@ -238,13 +253,22 @@ gc_get_objects(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje { PyObject *return_value = NULL; static const char * const _keywords[] = {"generation", NULL}; - static _PyArg_Parser _parser = {"|O&:get_objects", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "get_objects", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; Py_ssize_t generation = -1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - _Py_convert_optional_to_ssize_t, &generation)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (!_Py_convert_optional_to_ssize_t(args[0], &generation)) { goto exit; } +skip_optional_pos: return_value = gc_get_objects_impl(module, generation); exit: @@ -349,4 +373,4 @@ gc_get_freeze_count(PyObject *module, PyObject *Py_UNUSED(ignored)) exit: return return_value; } -/*[clinic end generated code: output=d692bf475f0bb096 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=e40d384b1f0d513c input=a9049054013a1b77]*/ diff --git a/Modules/clinic/grpmodule.c.h b/Modules/clinic/grpmodule.c.h index c2e54c94e063..ae99c50955f6 100644 --- a/Modules/clinic/grpmodule.c.h +++ b/Modules/clinic/grpmodule.c.h @@ -21,13 +21,15 @@ grp_getgrgid(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject { PyObject *return_value = NULL; static const char * const _keywords[] = {"id", NULL}; - static _PyArg_Parser _parser = {"O:getgrgid", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "getgrgid", 0}; + PyObject *argsbuf[1]; PyObject *id; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &id)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { goto exit; } + id = args[0]; return_value = grp_getgrgid_impl(module, id); exit: @@ -53,13 +55,22 @@ grp_getgrnam(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject { PyObject *return_value = NULL; static const char * const _keywords[] = {"name", NULL}; - static _PyArg_Parser _parser = {"U:getgrnam", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "getgrnam", 0}; + PyObject *argsbuf[1]; PyObject *name; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &name)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { goto exit; } + if (!PyUnicode_Check(args[0])) { + _PyArg_BadArgument("getgrnam", 1, "str", args[0]); + goto exit; + } + if (PyUnicode_READY(args[0]) == -1) { + goto exit; + } + name = args[0]; return_value = grp_getgrnam_impl(module, name); exit: @@ -86,4 +97,4 @@ grp_getgrall(PyObject *module, PyObject *Py_UNUSED(ignored)) { return grp_getgrall_impl(module); } -/*[clinic end generated code: output=ab10233f6015bc0a input=a9049054013a1b77]*/ +/*[clinic end generated code: output=2aa6c60873d41ee8 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/itertoolsmodule.c.h b/Modules/clinic/itertoolsmodule.c.h index bcf4c5f97987..b43ce64af0dc 100644 --- a/Modules/clinic/itertoolsmodule.c.h +++ b/Modules/clinic/itertoolsmodule.c.h @@ -23,14 +23,24 @@ itertools_groupby(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; static const char * const _keywords[] = {"iterable", "key", NULL}; - static _PyArg_Parser _parser = {"O|O:groupby", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "groupby", 0}; + PyObject *argsbuf[2]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 1; PyObject *it; PyObject *keyfunc = Py_None; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &it, &keyfunc)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 2, 0, argsbuf); + if (!fastargs) { goto exit; } + it = fastargs[0]; + if (!noptargs) { + goto skip_optional_pos; + } + keyfunc = fastargs[1]; +skip_optional_pos: return_value = itertools_groupby_impl(type, it, keyfunc); exit: @@ -334,14 +344,35 @@ itertools_combinations(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; static const char * const _keywords[] = {"iterable", "r", NULL}; - static _PyArg_Parser _parser = {"On:combinations", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "combinations", 0}; + PyObject *argsbuf[2]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); PyObject *iterable; Py_ssize_t r; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &iterable, &r)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 2, 2, 0, argsbuf); + if (!fastargs) { + goto exit; + } + iterable = fastargs[0]; + if (PyFloat_Check(fastargs[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); goto exit; } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(fastargs[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + r = ival; + } return_value = itertools_combinations_impl(type, iterable, r); exit: @@ -366,14 +397,35 @@ itertools_combinations_with_replacement(PyTypeObject *type, PyObject *args, PyOb { PyObject *return_value = NULL; static const char * const _keywords[] = {"iterable", "r", NULL}; - static _PyArg_Parser _parser = {"On:combinations_with_replacement", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "combinations_with_replacement", 0}; + PyObject *argsbuf[2]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); PyObject *iterable; Py_ssize_t r; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &iterable, &r)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 2, 2, 0, argsbuf); + if (!fastargs) { + goto exit; + } + iterable = fastargs[0]; + if (PyFloat_Check(fastargs[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); goto exit; } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(fastargs[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + r = ival; + } return_value = itertools_combinations_with_replacement_impl(type, iterable, r); exit: @@ -397,14 +449,24 @@ itertools_permutations(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; static const char * const _keywords[] = {"iterable", "r", NULL}; - static _PyArg_Parser _parser = {"O|O:permutations", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "permutations", 0}; + PyObject *argsbuf[2]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 1; PyObject *iterable; PyObject *robj = Py_None; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &iterable, &robj)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 2, 0, argsbuf); + if (!fastargs) { goto exit; } + iterable = fastargs[0]; + if (!noptargs) { + goto skip_optional_pos; + } + robj = fastargs[1]; +skip_optional_pos: return_value = itertools_permutations_impl(type, iterable, robj); exit: @@ -426,15 +488,35 @@ itertools_accumulate(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; static const char * const _keywords[] = {"iterable", "func", "initial", NULL}; - static _PyArg_Parser _parser = {"O|O$O:accumulate", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "accumulate", 0}; + PyObject *argsbuf[3]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 1; PyObject *iterable; PyObject *binop = Py_None; PyObject *initial = Py_None; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &iterable, &binop, &initial)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 2, 0, argsbuf); + if (!fastargs) { goto exit; } + iterable = fastargs[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (fastargs[1]) { + binop = fastargs[1]; + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + initial = fastargs[2]; +skip_optional_kwonly: return_value = itertools_accumulate_impl(type, iterable, binop, initial); exit: @@ -458,14 +540,19 @@ itertools_compress(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; static const char * const _keywords[] = {"data", "selectors", NULL}; - static _PyArg_Parser _parser = {"OO:compress", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "compress", 0}; + PyObject *argsbuf[2]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); PyObject *seq1; PyObject *seq2; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &seq1, &seq2)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 2, 2, 0, argsbuf); + if (!fastargs) { goto exit; } + seq1 = fastargs[0]; + seq2 = fastargs[1]; return_value = itertools_compress_impl(type, seq1, seq2); exit: @@ -527,17 +614,32 @@ itertools_count(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; static const char * const _keywords[] = {"start", "step", NULL}; - static _PyArg_Parser _parser = {"|OO:count", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "count", 0}; + PyObject *argsbuf[2]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0; PyObject *long_cnt = NULL; PyObject *long_step = NULL; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &long_cnt, &long_step)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 0, 2, 0, argsbuf); + if (!fastargs) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + if (fastargs[0]) { + long_cnt = fastargs[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + long_step = fastargs[1]; +skip_optional_pos: return_value = itertools_count_impl(type, long_cnt, long_step); exit: return return_value; } -/*[clinic end generated code: output=3d0ca69707b60715 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=04c49debcae96003 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/mathmodule.c.h b/Modules/clinic/mathmodule.c.h index b99a8deecea1..1806a01588c5 100644 --- a/Modules/clinic/mathmodule.c.h +++ b/Modules/clinic/mathmodule.c.h @@ -536,17 +536,44 @@ math_isclose(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject { PyObject *return_value = NULL; static const char * const _keywords[] = {"a", "b", "rel_tol", "abs_tol", NULL}; - static _PyArg_Parser _parser = {"dd|$dd:isclose", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "isclose", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; double a; double b; double rel_tol = 1e-09; double abs_tol = 0.0; int _return_value; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &a, &b, &rel_tol, &abs_tol)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { goto exit; } + a = PyFloat_AsDouble(args[0]); + if (PyErr_Occurred()) { + goto exit; + } + b = PyFloat_AsDouble(args[1]); + if (PyErr_Occurred()) { + goto exit; + } + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[2]) { + rel_tol = PyFloat_AsDouble(args[2]); + if (PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + abs_tol = PyFloat_AsDouble(args[3]); + if (PyErr_Occurred()) { + goto exit; + } +skip_optional_kwonly: _return_value = math_isclose_impl(module, a, b, rel_tol, abs_tol); if ((_return_value == -1) && PyErr_Occurred()) { goto exit; @@ -580,17 +607,25 @@ math_prod(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k { PyObject *return_value = NULL; static const char * const _keywords[] = {"", "start", NULL}; - static _PyArg_Parser _parser = {"O|$O:prod", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "prod", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *iterable; PyObject *start = NULL; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &iterable, &start)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { goto exit; } + iterable = args[0]; + if (!noptargs) { + goto skip_optional_kwonly; + } + start = args[1]; +skip_optional_kwonly: return_value = math_prod_impl(module, iterable, start); exit: return return_value; } -/*[clinic end generated code: output=20505690ca6fe402 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=96e71135dce41c48 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/md5module.c.h b/Modules/clinic/md5module.c.h index 67cb48c08473..12484cc0e3dd 100644 --- a/Modules/clinic/md5module.c.h +++ b/Modules/clinic/md5module.c.h @@ -82,16 +82,23 @@ _md5_md5(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw { PyObject *return_value = NULL; static const char * const _keywords[] = {"string", NULL}; - static _PyArg_Parser _parser = {"|O:md5", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "md5", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *string = NULL; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &string)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + string = args[0]; +skip_optional_pos: return_value = _md5_md5_impl(module, string); exit: return return_value; } -/*[clinic end generated code: output=83cb1aef575f13bc input=a9049054013a1b77]*/ +/*[clinic end generated code: output=53133f08cf9095fc input=a9049054013a1b77]*/ diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index dc5f3b14abb9..55f2cbb91a08 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -38,15 +38,36 @@ os_stat(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwn { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "dir_fd", "follow_symlinks", NULL}; - static _PyArg_Parser _parser = {"O&|$O&p:stat", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "stat", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; path_t path = PATH_T_INITIALIZE("stat", "path", 0, 1); int dir_fd = DEFAULT_DIR_FD; int follow_symlinks = 1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path, FSTATAT_DIR_FD_CONVERTER, &dir_fd, &follow_symlinks)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { + goto exit; + } + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[1]) { + if (!FSTATAT_DIR_FD_CONVERTER(args[1], &dir_fd)) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + follow_symlinks = PyObject_IsTrue(args[2]); + if (follow_symlinks < 0) { goto exit; } +skip_optional_kwonly: return_value = os_stat_impl(module, &path, dir_fd, follow_symlinks); exit: @@ -76,14 +97,26 @@ os_lstat(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "dir_fd", NULL}; - static _PyArg_Parser _parser = {"O&|$O&:lstat", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "lstat", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; path_t path = PATH_T_INITIALIZE("lstat", "path", 0, 0); int dir_fd = DEFAULT_DIR_FD; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path, FSTATAT_DIR_FD_CONVERTER, &dir_fd)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { + goto exit; + } + if (!noptargs) { + goto skip_optional_kwonly; + } + if (!FSTATAT_DIR_FD_CONVERTER(args[1], &dir_fd)) { goto exit; } +skip_optional_kwonly: return_value = os_lstat_impl(module, &path, dir_fd); exit: @@ -137,7 +170,9 @@ os_access(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "mode", "dir_fd", "effective_ids", "follow_symlinks", NULL}; - static _PyArg_Parser _parser = {"O&i|$O&pp:access", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "access", 0}; + PyObject *argsbuf[5]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; path_t path = PATH_T_INITIALIZE("access", "path", 0, 0); int mode; int dir_fd = DEFAULT_DIR_FD; @@ -145,10 +180,47 @@ os_access(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k int follow_symlinks = 1; int _return_value; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path, &mode, FACCESSAT_DIR_FD_CONVERTER, &dir_fd, &effective_ids, &follow_symlinks)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { goto exit; } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + mode = _PyLong_AsInt(args[1]); + if (mode == -1 && PyErr_Occurred()) { + goto exit; + } + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[2]) { + if (!FACCESSAT_DIR_FD_CONVERTER(args[2], &dir_fd)) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[3]) { + effective_ids = PyObject_IsTrue(args[3]); + if (effective_ids < 0) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + follow_symlinks = PyObject_IsTrue(args[4]); + if (follow_symlinks < 0) { + goto exit; + } +skip_optional_kwonly: _return_value = os_access_impl(module, &path, mode, dir_fd, effective_ids, follow_symlinks); if ((_return_value == -1) && PyErr_Occurred()) { goto exit; @@ -245,11 +317,15 @@ os_chdir(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", NULL}; - static _PyArg_Parser _parser = {"O&:chdir", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "chdir", 0}; + PyObject *argsbuf[1]; path_t path = PATH_T_INITIALIZE("chdir", "path", 0, PATH_HAVE_FCHDIR); - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { goto exit; } return_value = os_chdir_impl(module, &path); @@ -283,11 +359,15 @@ os_fchdir(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k { PyObject *return_value = NULL; static const char * const _keywords[] = {"fd", NULL}; - static _PyArg_Parser _parser = {"O&:fchdir", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "fchdir", 0}; + PyObject *argsbuf[1]; int fd; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - fildes_converter, &fd)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!fildes_converter(args[0], &fd)) { goto exit; } return_value = os_fchdir_impl(module, fd); @@ -336,16 +416,46 @@ os_chmod(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "mode", "dir_fd", "follow_symlinks", NULL}; - static _PyArg_Parser _parser = {"O&i|$O&p:chmod", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "chmod", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; path_t path = PATH_T_INITIALIZE("chmod", "path", 0, PATH_HAVE_FCHMOD); int mode; int dir_fd = DEFAULT_DIR_FD; int follow_symlinks = 1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path, &mode, FCHMODAT_DIR_FD_CONVERTER, &dir_fd, &follow_symlinks)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { + goto exit; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + mode = _PyLong_AsInt(args[1]); + if (mode == -1 && PyErr_Occurred()) { + goto exit; + } + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[2]) { + if (!FCHMODAT_DIR_FD_CONVERTER(args[2], &dir_fd)) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + follow_symlinks = PyObject_IsTrue(args[3]); + if (follow_symlinks < 0) { goto exit; } +skip_optional_kwonly: return_value = os_chmod_impl(module, &path, mode, dir_fd, follow_symlinks); exit: @@ -376,12 +486,31 @@ os_fchmod(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k { PyObject *return_value = NULL; static const char * const _keywords[] = {"fd", "mode", NULL}; - static _PyArg_Parser _parser = {"ii:fchmod", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "fchmod", 0}; + PyObject *argsbuf[2]; int fd; int mode; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &fd, &mode)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + fd = _PyLong_AsInt(args[0]); + if (fd == -1 && PyErr_Occurred()) { + goto exit; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + mode = _PyLong_AsInt(args[1]); + if (mode == -1 && PyErr_Occurred()) { goto exit; } return_value = os_fchmod_impl(module, fd, mode); @@ -414,12 +543,25 @@ os_lchmod(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "mode", NULL}; - static _PyArg_Parser _parser = {"O&i:lchmod", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "lchmod", 0}; + PyObject *argsbuf[2]; path_t path = PATH_T_INITIALIZE("lchmod", "path", 0, 0); int mode; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path, &mode)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { + goto exit; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + mode = _PyLong_AsInt(args[1]); + if (mode == -1 && PyErr_Occurred()) { goto exit; } return_value = os_lchmod_impl(module, &path, mode); @@ -459,15 +601,33 @@ os_chflags(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject * { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "flags", "follow_symlinks", NULL}; - static _PyArg_Parser _parser = {"O&k|p:chflags", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "chflags", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; path_t path = PATH_T_INITIALIZE("chflags", "path", 0, 0); unsigned long flags; int follow_symlinks = 1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path, &flags, &follow_symlinks)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { goto exit; } + if (!PyLong_Check(args[1])) { + _PyArg_BadArgument("chflags", 2, "int", args[1]); + goto exit; + } + flags = PyLong_AsUnsignedLongMask(args[1]); + if (!noptargs) { + goto skip_optional_pos; + } + follow_symlinks = PyObject_IsTrue(args[2]); + if (follow_symlinks < 0) { + goto exit; + } +skip_optional_pos: return_value = os_chflags_impl(module, &path, flags, follow_symlinks); exit: @@ -501,14 +661,23 @@ os_lchflags(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "flags", NULL}; - static _PyArg_Parser _parser = {"O&k:lchflags", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "lchflags", 0}; + PyObject *argsbuf[2]; path_t path = PATH_T_INITIALIZE("lchflags", "path", 0, 0); unsigned long flags; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path, &flags)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { goto exit; } + if (!PyLong_Check(args[1])) { + _PyArg_BadArgument("lchflags", 2, "int", args[1]); + goto exit; + } + flags = PyLong_AsUnsignedLongMask(args[1]); return_value = os_lchflags_impl(module, &path, flags); exit: @@ -539,11 +708,15 @@ os_chroot(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", NULL}; - static _PyArg_Parser _parser = {"O&:chroot", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "chroot", 0}; + PyObject *argsbuf[1]; path_t path = PATH_T_INITIALIZE("chroot", "path", 0, 0); - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { goto exit; } return_value = os_chroot_impl(module, &path); @@ -576,11 +749,15 @@ os_fsync(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw { PyObject *return_value = NULL; static const char * const _keywords[] = {"fd", NULL}; - static _PyArg_Parser _parser = {"O&:fsync", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "fsync", 0}; + PyObject *argsbuf[1]; int fd; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - fildes_converter, &fd)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!fildes_converter(args[0], &fd)) { goto exit; } return_value = os_fsync_impl(module, fd); @@ -632,11 +809,15 @@ os_fdatasync(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject { PyObject *return_value = NULL; static const char * const _keywords[] = {"fd", NULL}; - static _PyArg_Parser _parser = {"O&:fdatasync", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "fdatasync", 0}; + PyObject *argsbuf[1]; int fd; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - fildes_converter, &fd)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!fildes_converter(args[0], &fd)) { goto exit; } return_value = os_fdatasync_impl(module, fd); @@ -691,17 +872,44 @@ os_chown(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "uid", "gid", "dir_fd", "follow_symlinks", NULL}; - static _PyArg_Parser _parser = {"O&O&O&|$O&p:chown", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "chown", 0}; + PyObject *argsbuf[5]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 3; path_t path = PATH_T_INITIALIZE("chown", "path", 0, PATH_HAVE_FCHOWN); uid_t uid; gid_t gid; int dir_fd = DEFAULT_DIR_FD; int follow_symlinks = 1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path, _Py_Uid_Converter, &uid, _Py_Gid_Converter, &gid, FCHOWNAT_DIR_FD_CONVERTER, &dir_fd, &follow_symlinks)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 3, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { + goto exit; + } + if (!_Py_Uid_Converter(args[1], &uid)) { + goto exit; + } + if (!_Py_Gid_Converter(args[2], &gid)) { + goto exit; + } + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[3]) { + if (!FCHOWNAT_DIR_FD_CONVERTER(args[3], &dir_fd)) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + follow_symlinks = PyObject_IsTrue(args[4]); + if (follow_symlinks < 0) { goto exit; } +skip_optional_kwonly: return_value = os_chown_impl(module, &path, uid, gid, dir_fd, follow_symlinks); exit: @@ -734,13 +942,29 @@ os_fchown(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k { PyObject *return_value = NULL; static const char * const _keywords[] = {"fd", "uid", "gid", NULL}; - static _PyArg_Parser _parser = {"iO&O&:fchown", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "fchown", 0}; + PyObject *argsbuf[3]; int fd; uid_t uid; gid_t gid; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &fd, _Py_Uid_Converter, &uid, _Py_Gid_Converter, &gid)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 3, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + fd = _PyLong_AsInt(args[0]); + if (fd == -1 && PyErr_Occurred()) { + goto exit; + } + if (!_Py_Uid_Converter(args[1], &uid)) { + goto exit; + } + if (!_Py_Gid_Converter(args[2], &gid)) { goto exit; } return_value = os_fchown_impl(module, fd, uid, gid); @@ -773,13 +997,23 @@ os_lchown(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "uid", "gid", NULL}; - static _PyArg_Parser _parser = {"O&O&O&:lchown", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "lchown", 0}; + PyObject *argsbuf[3]; path_t path = PATH_T_INITIALIZE("lchown", "path", 0, 0); uid_t uid; gid_t gid; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path, _Py_Uid_Converter, &uid, _Py_Gid_Converter, &gid)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 3, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { + goto exit; + } + if (!_Py_Uid_Converter(args[1], &uid)) { + goto exit; + } + if (!_Py_Gid_Converter(args[2], &gid)) { goto exit; } return_value = os_lchown_impl(module, &path, uid, gid); @@ -860,17 +1094,49 @@ os_link(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwn { PyObject *return_value = NULL; static const char * const _keywords[] = {"src", "dst", "src_dir_fd", "dst_dir_fd", "follow_symlinks", NULL}; - static _PyArg_Parser _parser = {"O&O&|$O&O&p:link", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "link", 0}; + PyObject *argsbuf[5]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; path_t src = PATH_T_INITIALIZE("link", "src", 0, 0); path_t dst = PATH_T_INITIALIZE("link", "dst", 0, 0); int src_dir_fd = DEFAULT_DIR_FD; int dst_dir_fd = DEFAULT_DIR_FD; int follow_symlinks = 1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &src, path_converter, &dst, dir_fd_converter, &src_dir_fd, dir_fd_converter, &dst_dir_fd, &follow_symlinks)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &src)) { goto exit; } + if (!path_converter(args[1], &dst)) { + goto exit; + } + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[2]) { + if (!dir_fd_converter(args[2], &src_dir_fd)) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[3]) { + if (!dir_fd_converter(args[3], &dst_dir_fd)) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + follow_symlinks = PyObject_IsTrue(args[4]); + if (follow_symlinks < 0) { + goto exit; + } +skip_optional_kwonly: return_value = os_link_impl(module, &src, &dst, src_dir_fd, dst_dir_fd, follow_symlinks); exit: @@ -912,13 +1178,22 @@ os_listdir(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject * { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", NULL}; - static _PyArg_Parser _parser = {"|O&:listdir", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "listdir", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; path_t path = PATH_T_INITIALIZE("listdir", "path", 1, PATH_HAVE_FDOPENDIR); - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + if (!path_converter(args[0], &path)) { + goto exit; + } +skip_optional_pos: return_value = os_listdir_impl(module, &path); exit: @@ -1027,11 +1302,15 @@ os__getvolumepathname(PyObject *module, PyObject *const *args, Py_ssize_t nargs, { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", NULL}; - static _PyArg_Parser _parser = {"O&:_getvolumepathname", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "_getvolumepathname", 0}; + PyObject *argsbuf[1]; path_t path = PATH_T_INITIALIZE("_getvolumepathname", "path", 0, 0); - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { goto exit; } return_value = os__getvolumepathname_impl(module, &path); @@ -1069,15 +1348,45 @@ os_mkdir(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "mode", "dir_fd", NULL}; - static _PyArg_Parser _parser = {"O&|i$O&:mkdir", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "mkdir", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; path_t path = PATH_T_INITIALIZE("mkdir", "path", 0, 0); int mode = 511; int dir_fd = DEFAULT_DIR_FD; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path, &mode, MKDIRAT_DIR_FD_CONVERTER, &dir_fd)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + mode = _PyLong_AsInt(args[1]); + if (mode == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + if (!MKDIRAT_DIR_FD_CONVERTER(args[2], &dir_fd)) { goto exit; } +skip_optional_kwonly: return_value = os_mkdir_impl(module, &path, mode, dir_fd); exit: @@ -1143,12 +1452,31 @@ os_getpriority(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje { PyObject *return_value = NULL; static const char * const _keywords[] = {"which", "who", NULL}; - static _PyArg_Parser _parser = {"ii:getpriority", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "getpriority", 0}; + PyObject *argsbuf[2]; int which; int who; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &which, &who)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + which = _PyLong_AsInt(args[0]); + if (which == -1 && PyErr_Occurred()) { + goto exit; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + who = _PyLong_AsInt(args[1]); + if (who == -1 && PyErr_Occurred()) { goto exit; } return_value = os_getpriority_impl(module, which, who); @@ -1178,13 +1506,41 @@ os_setpriority(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje { PyObject *return_value = NULL; static const char * const _keywords[] = {"which", "who", "priority", NULL}; - static _PyArg_Parser _parser = {"iii:setpriority", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "setpriority", 0}; + PyObject *argsbuf[3]; int which; int who; int priority; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &which, &who, &priority)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 3, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + which = _PyLong_AsInt(args[0]); + if (which == -1 && PyErr_Occurred()) { + goto exit; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + who = _PyLong_AsInt(args[1]); + if (who == -1 && PyErr_Occurred()) { + goto exit; + } + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + priority = _PyLong_AsInt(args[2]); + if (priority == -1 && PyErr_Occurred()) { goto exit; } return_value = os_setpriority_impl(module, which, who, priority); @@ -1219,16 +1575,39 @@ os_rename(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k { PyObject *return_value = NULL; static const char * const _keywords[] = {"src", "dst", "src_dir_fd", "dst_dir_fd", NULL}; - static _PyArg_Parser _parser = {"O&O&|$O&O&:rename", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "rename", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; path_t src = PATH_T_INITIALIZE("rename", "src", 0, 0); path_t dst = PATH_T_INITIALIZE("rename", "dst", 0, 0); int src_dir_fd = DEFAULT_DIR_FD; int dst_dir_fd = DEFAULT_DIR_FD; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &src, path_converter, &dst, dir_fd_converter, &src_dir_fd, dir_fd_converter, &dst_dir_fd)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &src)) { + goto exit; + } + if (!path_converter(args[1], &dst)) { + goto exit; + } + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[2]) { + if (!dir_fd_converter(args[2], &src_dir_fd)) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (!dir_fd_converter(args[3], &dst_dir_fd)) { goto exit; } +skip_optional_kwonly: return_value = os_rename_impl(module, &src, &dst, src_dir_fd, dst_dir_fd); exit: @@ -1264,16 +1643,39 @@ os_replace(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject * { PyObject *return_value = NULL; static const char * const _keywords[] = {"src", "dst", "src_dir_fd", "dst_dir_fd", NULL}; - static _PyArg_Parser _parser = {"O&O&|$O&O&:replace", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "replace", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; path_t src = PATH_T_INITIALIZE("replace", "src", 0, 0); path_t dst = PATH_T_INITIALIZE("replace", "dst", 0, 0); int src_dir_fd = DEFAULT_DIR_FD; int dst_dir_fd = DEFAULT_DIR_FD; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &src, path_converter, &dst, dir_fd_converter, &src_dir_fd, dir_fd_converter, &dst_dir_fd)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &src)) { + goto exit; + } + if (!path_converter(args[1], &dst)) { + goto exit; + } + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[2]) { + if (!dir_fd_converter(args[2], &src_dir_fd)) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (!dir_fd_converter(args[3], &dst_dir_fd)) { goto exit; } +skip_optional_kwonly: return_value = os_replace_impl(module, &src, &dst, src_dir_fd, dst_dir_fd); exit: @@ -1307,14 +1709,26 @@ os_rmdir(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "dir_fd", NULL}; - static _PyArg_Parser _parser = {"O&|$O&:rmdir", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "rmdir", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; path_t path = PATH_T_INITIALIZE("rmdir", "path", 0, 0); int dir_fd = DEFAULT_DIR_FD; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path, UNLINKAT_DIR_FD_CONVERTER, &dir_fd)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { goto exit; } + if (!path_converter(args[0], &path)) { + goto exit; + } + if (!noptargs) { + goto skip_optional_kwonly; + } + if (!UNLINKAT_DIR_FD_CONVERTER(args[1], &dir_fd)) { + goto exit; + } +skip_optional_kwonly: return_value = os_rmdir_impl(module, &path, dir_fd); exit: @@ -1382,12 +1796,16 @@ os_system(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k { PyObject *return_value = NULL; static const char * const _keywords[] = {"command", NULL}; - static _PyArg_Parser _parser = {"O&:system", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "system", 0}; + PyObject *argsbuf[1]; PyObject *command = NULL; long _return_value; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - PyUnicode_FSConverter, &command)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!PyUnicode_FSConverter(args[0], &command)) { goto exit; } _return_value = os_system_impl(module, command); @@ -1460,14 +1878,26 @@ os_unlink(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "dir_fd", NULL}; - static _PyArg_Parser _parser = {"O&|$O&:unlink", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "unlink", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; path_t path = PATH_T_INITIALIZE("unlink", "path", 0, 0); int dir_fd = DEFAULT_DIR_FD; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path, UNLINKAT_DIR_FD_CONVERTER, &dir_fd)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { goto exit; } + if (!noptargs) { + goto skip_optional_kwonly; + } + if (!UNLINKAT_DIR_FD_CONVERTER(args[1], &dir_fd)) { + goto exit; + } +skip_optional_kwonly: return_value = os_unlink_impl(module, &path, dir_fd); exit: @@ -1499,14 +1929,26 @@ os_remove(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "dir_fd", NULL}; - static _PyArg_Parser _parser = {"O&|$O&:remove", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "remove", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; path_t path = PATH_T_INITIALIZE("remove", "path", 0, 0); int dir_fd = DEFAULT_DIR_FD; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path, UNLINKAT_DIR_FD_CONVERTER, &dir_fd)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { + goto exit; + } + if (!noptargs) { + goto skip_optional_kwonly; + } + if (!UNLINKAT_DIR_FD_CONVERTER(args[1], &dir_fd)) { goto exit; } +skip_optional_kwonly: return_value = os_remove_impl(module, &path, dir_fd); exit: @@ -1582,17 +2024,54 @@ os_utime(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "times", "ns", "dir_fd", "follow_symlinks", NULL}; - static _PyArg_Parser _parser = {"O&|O$OO&p:utime", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "utime", 0}; + PyObject *argsbuf[5]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; path_t path = PATH_T_INITIALIZE("utime", "path", 0, PATH_UTIME_HAVE_FD); PyObject *times = NULL; PyObject *ns = NULL; int dir_fd = DEFAULT_DIR_FD; int follow_symlinks = 1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path, ×, &ns, FUTIMENSAT_DIR_FD_CONVERTER, &dir_fd, &follow_symlinks)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { goto exit; } + if (!path_converter(args[0], &path)) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + times = args[1]; + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[2]) { + ns = args[2]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[3]) { + if (!FUTIMENSAT_DIR_FD_CONVERTER(args[3], &dir_fd)) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + follow_symlinks = PyObject_IsTrue(args[4]); + if (follow_symlinks < 0) { + goto exit; + } +skip_optional_kwonly: return_value = os_utime_impl(module, &path, times, ns, dir_fd, follow_symlinks); exit: @@ -1619,11 +2098,21 @@ os__exit(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw { PyObject *return_value = NULL; static const char * const _keywords[] = {"status", NULL}; - static _PyArg_Parser _parser = {"i:_exit", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "_exit", 0}; + PyObject *argsbuf[1]; int status; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &status)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + status = _PyLong_AsInt(args[0]); + if (status == -1 && PyErr_Occurred()) { goto exit; } return_value = os__exit_impl(module, status); @@ -1702,15 +2191,21 @@ os_execve(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "argv", "env", NULL}; - static _PyArg_Parser _parser = {"O&OO:execve", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "execve", 0}; + PyObject *argsbuf[3]; path_t path = PATH_T_INITIALIZE("execve", "path", 0, PATH_HAVE_FEXECVE); PyObject *argv; PyObject *env; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path, &argv, &env)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 3, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { goto exit; } + argv = args[1]; + env = args[2]; return_value = os_execve_impl(module, &path, argv, env); exit: @@ -1768,7 +2263,9 @@ os_posix_spawn(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje { PyObject *return_value = NULL; static const char * const _keywords[] = {"", "", "", "file_actions", "setpgroup", "resetids", "setsid", "setsigmask", "setsigdef", "scheduler", NULL}; - static _PyArg_Parser _parser = {"O&OO|$OOiiOOO:posix_spawn", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "posix_spawn", 0}; + PyObject *argsbuf[10]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 3; path_t path = PATH_T_INITIALIZE("posix_spawn", "path", 0, 0); PyObject *argv; PyObject *env; @@ -1780,10 +2277,72 @@ os_posix_spawn(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje PyObject *setsigdef = NULL; PyObject *scheduler = NULL; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path, &argv, &env, &file_actions, &setpgroup, &resetids, &setsid, &setsigmask, &setsigdef, &scheduler)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 3, 0, argsbuf); + if (!args) { goto exit; } + if (!path_converter(args[0], &path)) { + goto exit; + } + argv = args[1]; + env = args[2]; + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[3]) { + file_actions = args[3]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[4]) { + setpgroup = args[4]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[5]) { + if (PyFloat_Check(args[5])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + resetids = _PyLong_AsInt(args[5]); + if (resetids == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[6]) { + if (PyFloat_Check(args[6])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + setsid = _PyLong_AsInt(args[6]); + if (setsid == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[7]) { + setsigmask = args[7]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[8]) { + setsigdef = args[8]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + scheduler = args[9]; +skip_optional_kwonly: return_value = os_posix_spawn_impl(module, &path, argv, env, file_actions, setpgroup, resetids, setsid, setsigmask, setsigdef, scheduler); exit: @@ -1841,7 +2400,9 @@ os_posix_spawnp(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj { PyObject *return_value = NULL; static const char * const _keywords[] = {"", "", "", "file_actions", "setpgroup", "resetids", "setsid", "setsigmask", "setsigdef", "scheduler", NULL}; - static _PyArg_Parser _parser = {"O&OO|$OOiiOOO:posix_spawnp", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "posix_spawnp", 0}; + PyObject *argsbuf[10]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 3; path_t path = PATH_T_INITIALIZE("posix_spawnp", "path", 0, 0); PyObject *argv; PyObject *env; @@ -1853,10 +2414,72 @@ os_posix_spawnp(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj PyObject *setsigdef = NULL; PyObject *scheduler = NULL; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path, &argv, &env, &file_actions, &setpgroup, &resetids, &setsid, &setsigmask, &setsigdef, &scheduler)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 3, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { goto exit; } + argv = args[1]; + env = args[2]; + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[3]) { + file_actions = args[3]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[4]) { + setpgroup = args[4]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[5]) { + if (PyFloat_Check(args[5])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + resetids = _PyLong_AsInt(args[5]); + if (resetids == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[6]) { + if (PyFloat_Check(args[6])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + setsid = _PyLong_AsInt(args[6]); + if (setsid == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[7]) { + setsigmask = args[7]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[8]) { + setsigdef = args[8]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + scheduler = args[9]; +skip_optional_kwonly: return_value = os_posix_spawnp_impl(module, &path, argv, env, file_actions, setpgroup, resetids, setsid, setsigmask, setsigdef, scheduler); exit: @@ -2016,15 +2639,34 @@ os_register_at_fork(PyObject *module, PyObject *const *args, Py_ssize_t nargs, P { PyObject *return_value = NULL; static const char * const _keywords[] = {"before", "after_in_child", "after_in_parent", NULL}; - static _PyArg_Parser _parser = {"|$OOO:register_at_fork", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "register_at_fork", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *before = NULL; PyObject *after_in_child = NULL; PyObject *after_in_parent = NULL; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &before, &after_in_child, &after_in_parent)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[0]) { + before = args[0]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (args[1]) { + after_in_child = args[1]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + after_in_parent = args[2]; +skip_optional_kwonly: return_value = os_register_at_fork_impl(module, before, after_in_child, after_in_parent); exit: @@ -2100,11 +2742,21 @@ os_sched_get_priority_max(PyObject *module, PyObject *const *args, Py_ssize_t na { PyObject *return_value = NULL; static const char * const _keywords[] = {"policy", NULL}; - static _PyArg_Parser _parser = {"i:sched_get_priority_max", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "sched_get_priority_max", 0}; + PyObject *argsbuf[1]; int policy; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &policy)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + policy = _PyLong_AsInt(args[0]); + if (policy == -1 && PyErr_Occurred()) { goto exit; } return_value = os_sched_get_priority_max_impl(module, policy); @@ -2134,11 +2786,21 @@ os_sched_get_priority_min(PyObject *module, PyObject *const *args, Py_ssize_t na { PyObject *return_value = NULL; static const char * const _keywords[] = {"policy", NULL}; - static _PyArg_Parser _parser = {"i:sched_get_priority_min", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "sched_get_priority_min", 0}; + PyObject *argsbuf[1]; int policy; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &policy)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + policy = _PyLong_AsInt(args[0]); + if (policy == -1 && PyErr_Occurred()) { goto exit; } return_value = os_sched_get_priority_min_impl(module, policy); @@ -2201,13 +2863,17 @@ os_sched_param(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; static const char * const _keywords[] = {"sched_priority", NULL}; - static _PyArg_Parser _parser = {"O:sched_param", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "sched_param", 0}; + PyObject *argsbuf[1]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); PyObject *sched_priority; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &sched_priority)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 1, 0, argsbuf); + if (!fastargs) { goto exit; } + sched_priority = fastargs[0]; return_value = os_sched_param_impl(type, sched_priority); exit: @@ -3100,11 +3766,21 @@ os_wait3(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw { PyObject *return_value = NULL; static const char * const _keywords[] = {"options", NULL}; - static _PyArg_Parser _parser = {"i:wait3", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "wait3", 0}; + PyObject *argsbuf[1]; int options; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &options)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + options = _PyLong_AsInt(args[0]); + if (options == -1 && PyErr_Occurred()) { goto exit; } return_value = os_wait3_impl(module, options); @@ -3324,14 +4000,26 @@ os_readlink(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "dir_fd", NULL}; - static _PyArg_Parser _parser = {"O&|$O&:readlink", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "readlink", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; path_t path = PATH_T_INITIALIZE("readlink", "path", 0, 0); int dir_fd = DEFAULT_DIR_FD; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path, READLINKAT_DIR_FD_CONVERTER, &dir_fd)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { goto exit; } + if (!noptargs) { + goto skip_optional_kwonly; + } + if (!READLINKAT_DIR_FD_CONVERTER(args[1], &dir_fd)) { + goto exit; + } +skip_optional_kwonly: return_value = os_readlink_impl(module, &path, dir_fd); exit: @@ -3373,16 +4061,44 @@ os_symlink(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject * { PyObject *return_value = NULL; static const char * const _keywords[] = {"src", "dst", "target_is_directory", "dir_fd", NULL}; - static _PyArg_Parser _parser = {"O&O&|p$O&:symlink", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "symlink", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; path_t src = PATH_T_INITIALIZE("symlink", "src", 0, 0); path_t dst = PATH_T_INITIALIZE("symlink", "dst", 0, 0); int target_is_directory = 0; int dir_fd = DEFAULT_DIR_FD; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &src, path_converter, &dst, &target_is_directory, SYMLINKAT_DIR_FD_CONVERTER, &dir_fd)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &src)) { + goto exit; + } + if (!path_converter(args[1], &dst)) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[2]) { + target_is_directory = PyObject_IsTrue(args[2]); + if (target_is_directory < 0) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + if (!SYMLINKAT_DIR_FD_CONVERTER(args[3], &dir_fd)) { goto exit; } +skip_optional_kwonly: return_value = os_symlink_impl(module, &src, &dst, target_is_directory, dir_fd); exit: @@ -3600,17 +4316,56 @@ os_open(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwn { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "flags", "mode", "dir_fd", NULL}; - static _PyArg_Parser _parser = {"O&i|i$O&:open", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "open", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; path_t path = PATH_T_INITIALIZE("open", "path", 0, 0); int flags; int mode = 511; int dir_fd = DEFAULT_DIR_FD; int _return_value; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path, &flags, &mode, OPENAT_DIR_FD_CONVERTER, &dir_fd)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { goto exit; } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + flags = _PyLong_AsInt(args[1]); + if (flags == -1 && PyErr_Occurred()) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[2]) { + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + mode = _PyLong_AsInt(args[2]); + if (mode == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + if (!OPENAT_DIR_FD_CONVERTER(args[3], &dir_fd)) { + goto exit; + } +skip_optional_kwonly: _return_value = os_open_impl(module, &path, flags, mode, dir_fd); if ((_return_value == -1) && PyErr_Occurred()) { goto exit; @@ -3641,11 +4396,21 @@ os_close(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw { PyObject *return_value = NULL; static const char * const _keywords[] = {"fd", NULL}; - static _PyArg_Parser _parser = {"i:close", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "close", 0}; + PyObject *argsbuf[1]; int fd; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &fd)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + fd = _PyLong_AsInt(args[0]); + if (fd == -1 && PyErr_Occurred()) { goto exit; } return_value = os_close_impl(module, fd); @@ -3755,16 +4520,44 @@ os_dup2(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwn { PyObject *return_value = NULL; static const char * const _keywords[] = {"fd", "fd2", "inheritable", NULL}; - static _PyArg_Parser _parser = {"ii|p:dup2", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "dup2", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; int fd; int fd2; int inheritable = 1; int _return_value; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &fd, &fd2, &inheritable)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + fd = _PyLong_AsInt(args[0]); + if (fd == -1 && PyErr_Occurred()) { + goto exit; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + fd2 = _PyLong_AsInt(args[1]); + if (fd2 == -1 && PyErr_Occurred()) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + inheritable = PyObject_IsTrue(args[2]); + if (inheritable < 0) { goto exit; } +skip_optional_pos: _return_value = os_dup2_impl(module, fd, fd2, inheritable); if ((_return_value == -1) && PyErr_Occurred()) { goto exit; @@ -4274,11 +5067,21 @@ os_fstat(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw { PyObject *return_value = NULL; static const char * const _keywords[] = {"fd", NULL}; - static _PyArg_Parser _parser = {"i:fstat", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "fstat", 0}; + PyObject *argsbuf[1]; int fd; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &fd)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + fd = _PyLong_AsInt(args[0]); + if (fd == -1 && PyErr_Occurred()) { goto exit; } return_value = os_fstat_impl(module, fd); @@ -4616,15 +5419,45 @@ os_mkfifo(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "mode", "dir_fd", NULL}; - static _PyArg_Parser _parser = {"O&|i$O&:mkfifo", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "mkfifo", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; path_t path = PATH_T_INITIALIZE("mkfifo", "path", 0, 0); int mode = 438; int dir_fd = DEFAULT_DIR_FD; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path, &mode, MKFIFOAT_DIR_FD_CONVERTER, &dir_fd)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + mode = _PyLong_AsInt(args[1]); + if (mode == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + if (!MKFIFOAT_DIR_FD_CONVERTER(args[2], &dir_fd)) { goto exit; } +skip_optional_kwonly: return_value = os_mkfifo_impl(module, &path, mode, dir_fd); exit: @@ -4668,16 +5501,54 @@ os_mknod(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "mode", "device", "dir_fd", NULL}; - static _PyArg_Parser _parser = {"O&|iO&$O&:mknod", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "mknod", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; path_t path = PATH_T_INITIALIZE("mknod", "path", 0, 0); int mode = 384; dev_t device = 0; int dir_fd = DEFAULT_DIR_FD; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path, &mode, _Py_Dev_Converter, &device, MKNODAT_DIR_FD_CONVERTER, &dir_fd)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + mode = _PyLong_AsInt(args[1]); + if (mode == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (args[2]) { + if (!_Py_Dev_Converter(args[2], &device)) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + if (!MKNODAT_DIR_FD_CONVERTER(args[3], &dir_fd)) { goto exit; } +skip_optional_kwonly: return_value = os_mknod_impl(module, &path, mode, device, dir_fd); exit: @@ -4882,12 +5753,19 @@ os_truncate(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "length", NULL}; - static _PyArg_Parser _parser = {"O&O&:truncate", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "truncate", 0}; + PyObject *argsbuf[2]; path_t path = PATH_T_INITIALIZE("truncate", "path", 0, PATH_HAVE_FTRUNCATE); Py_off_t length; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path, Py_off_t_converter, &length)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { + goto exit; + } + if (!Py_off_t_converter(args[1], &length)) { goto exit; } return_value = os_truncate_impl(module, &path, length); @@ -5242,12 +6120,22 @@ os_WIFCONTINUED(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj { PyObject *return_value = NULL; static const char * const _keywords[] = {"status", NULL}; - static _PyArg_Parser _parser = {"i:WIFCONTINUED", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "WIFCONTINUED", 0}; + PyObject *argsbuf[1]; int status; int _return_value; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &status)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + status = _PyLong_AsInt(args[0]); + if (status == -1 && PyErr_Occurred()) { goto exit; } _return_value = os_WIFCONTINUED_impl(module, status); @@ -5281,12 +6169,22 @@ os_WIFSTOPPED(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObjec { PyObject *return_value = NULL; static const char * const _keywords[] = {"status", NULL}; - static _PyArg_Parser _parser = {"i:WIFSTOPPED", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "WIFSTOPPED", 0}; + PyObject *argsbuf[1]; int status; int _return_value; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &status)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + status = _PyLong_AsInt(args[0]); + if (status == -1 && PyErr_Occurred()) { goto exit; } _return_value = os_WIFSTOPPED_impl(module, status); @@ -5320,12 +6218,22 @@ os_WIFSIGNALED(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje { PyObject *return_value = NULL; static const char * const _keywords[] = {"status", NULL}; - static _PyArg_Parser _parser = {"i:WIFSIGNALED", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "WIFSIGNALED", 0}; + PyObject *argsbuf[1]; int status; int _return_value; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &status)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + status = _PyLong_AsInt(args[0]); + if (status == -1 && PyErr_Occurred()) { goto exit; } _return_value = os_WIFSIGNALED_impl(module, status); @@ -5359,12 +6267,22 @@ os_WIFEXITED(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject { PyObject *return_value = NULL; static const char * const _keywords[] = {"status", NULL}; - static _PyArg_Parser _parser = {"i:WIFEXITED", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "WIFEXITED", 0}; + PyObject *argsbuf[1]; int status; int _return_value; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &status)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + status = _PyLong_AsInt(args[0]); + if (status == -1 && PyErr_Occurred()) { goto exit; } _return_value = os_WIFEXITED_impl(module, status); @@ -5398,12 +6316,22 @@ os_WEXITSTATUS(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje { PyObject *return_value = NULL; static const char * const _keywords[] = {"status", NULL}; - static _PyArg_Parser _parser = {"i:WEXITSTATUS", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "WEXITSTATUS", 0}; + PyObject *argsbuf[1]; int status; int _return_value; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &status)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + status = _PyLong_AsInt(args[0]); + if (status == -1 && PyErr_Occurred()) { goto exit; } _return_value = os_WEXITSTATUS_impl(module, status); @@ -5437,12 +6365,22 @@ os_WTERMSIG(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject { PyObject *return_value = NULL; static const char * const _keywords[] = {"status", NULL}; - static _PyArg_Parser _parser = {"i:WTERMSIG", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "WTERMSIG", 0}; + PyObject *argsbuf[1]; int status; int _return_value; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &status)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + status = _PyLong_AsInt(args[0]); + if (status == -1 && PyErr_Occurred()) { goto exit; } _return_value = os_WTERMSIG_impl(module, status); @@ -5476,12 +6414,22 @@ os_WSTOPSIG(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject { PyObject *return_value = NULL; static const char * const _keywords[] = {"status", NULL}; - static _PyArg_Parser _parser = {"i:WSTOPSIG", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "WSTOPSIG", 0}; + PyObject *argsbuf[1]; int status; int _return_value; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &status)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + status = _PyLong_AsInt(args[0]); + if (status == -1 && PyErr_Occurred()) { goto exit; } _return_value = os_WSTOPSIG_impl(module, status); @@ -5558,11 +6506,15 @@ os_statvfs(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject * { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", NULL}; - static _PyArg_Parser _parser = {"O&:statvfs", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "statvfs", 0}; + PyObject *argsbuf[1]; path_t path = PATH_T_INITIALIZE("statvfs", "path", 0, PATH_HAVE_FSTATVFS); - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { goto exit; } return_value = os_statvfs_impl(module, &path); @@ -5595,11 +6547,15 @@ os__getdiskusage(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyOb { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", NULL}; - static _PyArg_Parser _parser = {"O&:_getdiskusage", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "_getdiskusage", 0}; + PyObject *argsbuf[1]; path_t path = PATH_T_INITIALIZE("_getdiskusage", "path", 0, 0); - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { goto exit; } return_value = os__getdiskusage_impl(module, &path); @@ -5687,13 +6643,20 @@ os_pathconf(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "name", NULL}; - static _PyArg_Parser _parser = {"O&O&:pathconf", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "pathconf", 0}; + PyObject *argsbuf[2]; path_t path = PATH_T_INITIALIZE("pathconf", "path", 0, PATH_HAVE_FPATHCONF); int name; long _return_value; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path, conv_path_confname, &name)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { + goto exit; + } + if (!conv_path_confname(args[1], &name)) { goto exit; } _return_value = os_pathconf_impl(module, &path, name); @@ -5901,11 +6864,21 @@ os_device_encoding(PyObject *module, PyObject *const *args, Py_ssize_t nargs, Py { PyObject *return_value = NULL; static const char * const _keywords[] = {"fd", NULL}; - static _PyArg_Parser _parser = {"i:device_encoding", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "device_encoding", 0}; + PyObject *argsbuf[1]; int fd; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &fd)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + fd = _PyLong_AsInt(args[0]); + if (fd == -1 && PyErr_Occurred()) { goto exit; } return_value = os_device_encoding_impl(module, fd); @@ -6067,15 +7040,31 @@ os_getxattr(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "attribute", "follow_symlinks", NULL}; - static _PyArg_Parser _parser = {"O&O&|$p:getxattr", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "getxattr", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; path_t path = PATH_T_INITIALIZE("getxattr", "path", 0, 1); path_t attribute = PATH_T_INITIALIZE("getxattr", "attribute", 0, 0); int follow_symlinks = 1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path, path_converter, &attribute, &follow_symlinks)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { + goto exit; + } + if (!path_converter(args[1], &attribute)) { + goto exit; + } + if (!noptargs) { + goto skip_optional_kwonly; + } + follow_symlinks = PyObject_IsTrue(args[2]); + if (follow_symlinks < 0) { goto exit; } +skip_optional_kwonly: return_value = os_getxattr_impl(module, &path, &attribute, follow_symlinks); exit: @@ -6115,17 +7104,58 @@ os_setxattr(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "attribute", "value", "flags", "follow_symlinks", NULL}; - static _PyArg_Parser _parser = {"O&O&y*|i$p:setxattr", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "setxattr", 0}; + PyObject *argsbuf[5]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 3; path_t path = PATH_T_INITIALIZE("setxattr", "path", 0, 1); path_t attribute = PATH_T_INITIALIZE("setxattr", "attribute", 0, 0); Py_buffer value = {NULL, NULL}; int flags = 0; int follow_symlinks = 1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path, path_converter, &attribute, &value, &flags, &follow_symlinks)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 4, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { + goto exit; + } + if (!path_converter(args[1], &attribute)) { + goto exit; + } + if (PyObject_GetBuffer(args[2], &value, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&value, 'C')) { + _PyArg_BadArgument("setxattr", 3, "contiguous buffer", args[2]); + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[3]) { + if (PyFloat_Check(args[3])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + flags = _PyLong_AsInt(args[3]); + if (flags == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + follow_symlinks = PyObject_IsTrue(args[4]); + if (follow_symlinks < 0) { goto exit; } +skip_optional_kwonly: return_value = os_setxattr_impl(module, &path, &attribute, &value, flags, follow_symlinks); exit: @@ -6168,15 +7198,31 @@ os_removexattr(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "attribute", "follow_symlinks", NULL}; - static _PyArg_Parser _parser = {"O&O&|$p:removexattr", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "removexattr", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; path_t path = PATH_T_INITIALIZE("removexattr", "path", 0, 1); path_t attribute = PATH_T_INITIALIZE("removexattr", "attribute", 0, 0); int follow_symlinks = 1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path, path_converter, &attribute, &follow_symlinks)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { + goto exit; + } + if (!path_converter(args[1], &attribute)) { goto exit; } + if (!noptargs) { + goto skip_optional_kwonly; + } + follow_symlinks = PyObject_IsTrue(args[2]); + if (follow_symlinks < 0) { + goto exit; + } +skip_optional_kwonly: return_value = os_removexattr_impl(module, &path, &attribute, follow_symlinks); exit: @@ -6215,14 +7261,36 @@ os_listxattr(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", "follow_symlinks", NULL}; - static _PyArg_Parser _parser = {"|O&$p:listxattr", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "listxattr", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; path_t path = PATH_T_INITIALIZE("listxattr", "path", 1, 1); int follow_symlinks = 1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path, &follow_symlinks)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + if (!path_converter(args[0], &path)) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + follow_symlinks = PyObject_IsTrue(args[1]); + if (follow_symlinks < 0) { goto exit; } +skip_optional_kwonly: return_value = os_listxattr_impl(module, &path, follow_symlinks); exit: @@ -6593,13 +7661,23 @@ os_DirEntry_stat(DirEntry *self, PyObject *const *args, Py_ssize_t nargs, PyObje { PyObject *return_value = NULL; static const char * const _keywords[] = {"follow_symlinks", NULL}; - static _PyArg_Parser _parser = {"|$p:stat", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "stat", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; int follow_symlinks = 1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &follow_symlinks)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_kwonly; + } + follow_symlinks = PyObject_IsTrue(args[0]); + if (follow_symlinks < 0) { goto exit; } +skip_optional_kwonly: return_value = os_DirEntry_stat_impl(self, follow_symlinks); exit: @@ -6623,14 +7701,24 @@ os_DirEntry_is_dir(DirEntry *self, PyObject *const *args, Py_ssize_t nargs, PyOb { PyObject *return_value = NULL; static const char * const _keywords[] = {"follow_symlinks", NULL}; - static _PyArg_Parser _parser = {"|$p:is_dir", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "is_dir", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; int follow_symlinks = 1; int _return_value; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &follow_symlinks)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_kwonly; + } + follow_symlinks = PyObject_IsTrue(args[0]); + if (follow_symlinks < 0) { goto exit; } +skip_optional_kwonly: _return_value = os_DirEntry_is_dir_impl(self, follow_symlinks); if ((_return_value == -1) && PyErr_Occurred()) { goto exit; @@ -6658,14 +7746,24 @@ os_DirEntry_is_file(DirEntry *self, PyObject *const *args, Py_ssize_t nargs, PyO { PyObject *return_value = NULL; static const char * const _keywords[] = {"follow_symlinks", NULL}; - static _PyArg_Parser _parser = {"|$p:is_file", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "is_file", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; int follow_symlinks = 1; int _return_value; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &follow_symlinks)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_kwonly; + } + follow_symlinks = PyObject_IsTrue(args[0]); + if (follow_symlinks < 0) { goto exit; } +skip_optional_kwonly: _return_value = os_DirEntry_is_file_impl(self, follow_symlinks); if ((_return_value == -1) && PyErr_Occurred()) { goto exit; @@ -6735,13 +7833,22 @@ os_scandir(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject * { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", NULL}; - static _PyArg_Parser _parser = {"|O&:scandir", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "scandir", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; path_t path = PATH_T_INITIALIZE("scandir", "path", 1, PATH_HAVE_FDOPENDIR); - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - path_converter, &path)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (!path_converter(args[0], &path)) { goto exit; } +skip_optional_pos: return_value = os_scandir_impl(module, &path); exit: @@ -6772,13 +7879,15 @@ os_fspath(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k { PyObject *return_value = NULL; static const char * const _keywords[] = {"path", NULL}; - static _PyArg_Parser _parser = {"O:fspath", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "fspath", 0}; + PyObject *argsbuf[1]; PyObject *path; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &path)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { goto exit; } + path = args[0]; return_value = os_fspath_impl(module, path); exit: @@ -6804,14 +7913,46 @@ os_getrandom(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject { PyObject *return_value = NULL; static const char * const _keywords[] = {"size", "flags", NULL}; - static _PyArg_Parser _parser = {"n|i:getrandom", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "getrandom", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; Py_ssize_t size; int flags = 0; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &size, &flags)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[0]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + size = ival; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + flags = _PyLong_AsInt(args[1]); + if (flags == -1 && PyErr_Occurred()) { goto exit; } +skip_optional_pos: return_value = os_getrandom_impl(module, size, flags); exit: @@ -7339,4 +8480,4 @@ os_getrandom(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject #ifndef OS_GETRANDOM_METHODDEF #define OS_GETRANDOM_METHODDEF #endif /* !defined(OS_GETRANDOM_METHODDEF) */ -/*[clinic end generated code: output=bb677205c036deca input=a9049054013a1b77]*/ +/*[clinic end generated code: output=1a9c62f5841221ae input=a9049054013a1b77]*/ diff --git a/Modules/clinic/pyexpat.c.h b/Modules/clinic/pyexpat.c.h index 3fe7b64e6f39..dfb27d5f1114 100644 --- a/Modules/clinic/pyexpat.c.h +++ b/Modules/clinic/pyexpat.c.h @@ -297,15 +297,68 @@ pyexpat_ParserCreate(PyObject *module, PyObject *const *args, Py_ssize_t nargs, { PyObject *return_value = NULL; static const char * const _keywords[] = {"encoding", "namespace_separator", "intern", NULL}; - static _PyArg_Parser _parser = {"|zzO:ParserCreate", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "ParserCreate", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; const char *encoding = NULL; const char *namespace_separator = NULL; PyObject *intern = NULL; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &encoding, &namespace_separator, &intern)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 3, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + if (args[0] == Py_None) { + encoding = NULL; + } + else if (PyUnicode_Check(args[0])) { + Py_ssize_t encoding_length; + encoding = PyUnicode_AsUTF8AndSize(args[0], &encoding_length); + if (encoding == NULL) { + goto exit; + } + if (strlen(encoding) != (size_t)encoding_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + } + else { + _PyArg_BadArgument("ParserCreate", 1, "str or None", args[0]); + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (args[1]) { + if (args[1] == Py_None) { + namespace_separator = NULL; + } + else if (PyUnicode_Check(args[1])) { + Py_ssize_t namespace_separator_length; + namespace_separator = PyUnicode_AsUTF8AndSize(args[1], &namespace_separator_length); + if (namespace_separator == NULL) { + goto exit; + } + if (strlen(namespace_separator) != (size_t)namespace_separator_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + } + else { + _PyArg_BadArgument("ParserCreate", 2, "str or None", args[1]); + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + intern = args[2]; +skip_optional_pos: return_value = pyexpat_ParserCreate_impl(module, encoding, namespace_separator, intern); exit: @@ -348,4 +401,4 @@ pyexpat_ErrorString(PyObject *module, PyObject *arg) #ifndef PYEXPAT_XMLPARSER_USEFOREIGNDTD_METHODDEF #define PYEXPAT_XMLPARSER_USEFOREIGNDTD_METHODDEF #endif /* !defined(PYEXPAT_XMLPARSER_USEFOREIGNDTD_METHODDEF) */ -/*[clinic end generated code: output=0f18b756d82b78a5 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=e48f37d326956bdd input=a9049054013a1b77]*/ diff --git a/Modules/clinic/selectmodule.c.h b/Modules/clinic/selectmodule.c.h index c2ef26f240a7..9015816f80c1 100644 --- a/Modules/clinic/selectmodule.c.h +++ b/Modules/clinic/selectmodule.c.h @@ -512,14 +512,45 @@ select_epoll(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; static const char * const _keywords[] = {"sizehint", "flags", NULL}; - static _PyArg_Parser _parser = {"|ii:epoll", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "epoll", 0}; + PyObject *argsbuf[2]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0; int sizehint = -1; int flags = 0; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &sizehint, &flags)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 0, 2, 0, argsbuf); + if (!fastargs) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + if (fastargs[0]) { + if (PyFloat_Check(fastargs[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + sizehint = _PyLong_AsInt(fastargs[0]); + if (sizehint == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (PyFloat_Check(fastargs[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + flags = _PyLong_AsInt(fastargs[1]); + if (flags == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional_pos: return_value = select_epoll_impl(type, sizehint, flags); exit: @@ -638,14 +669,32 @@ select_epoll_register(pyEpoll_Object *self, PyObject *const *args, Py_ssize_t na { PyObject *return_value = NULL; static const char * const _keywords[] = {"fd", "eventmask", NULL}; - static _PyArg_Parser _parser = {"O&|I:register", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "register", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; int fd; unsigned int eventmask = EPOLLIN | EPOLLPRI | EPOLLOUT; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - fildes_converter, &fd, &eventmask)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!fildes_converter(args[0], &fd)) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + eventmask = (unsigned int)PyLong_AsUnsignedLongMask(args[1]); + if (eventmask == (unsigned int)-1 && PyErr_Occurred()) { + goto exit; + } +skip_optional_pos: return_value = select_epoll_register_impl(self, fd, eventmask); exit: @@ -679,12 +728,25 @@ select_epoll_modify(pyEpoll_Object *self, PyObject *const *args, Py_ssize_t narg { PyObject *return_value = NULL; static const char * const _keywords[] = {"fd", "eventmask", NULL}; - static _PyArg_Parser _parser = {"O&I:modify", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "modify", 0}; + PyObject *argsbuf[2]; int fd; unsigned int eventmask; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - fildes_converter, &fd, &eventmask)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!fildes_converter(args[0], &fd)) { + goto exit; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + eventmask = (unsigned int)PyLong_AsUnsignedLongMask(args[1]); + if (eventmask == (unsigned int)-1 && PyErr_Occurred()) { goto exit; } return_value = select_epoll_modify_impl(self, fd, eventmask); @@ -717,11 +779,15 @@ select_epoll_unregister(pyEpoll_Object *self, PyObject *const *args, Py_ssize_t { PyObject *return_value = NULL; static const char * const _keywords[] = {"fd", NULL}; - static _PyArg_Parser _parser = {"O&:unregister", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "unregister", 0}; + PyObject *argsbuf[1]; int fd; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - fildes_converter, &fd)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!fildes_converter(args[0], &fd)) { goto exit; } return_value = select_epoll_unregister_impl(self, fd); @@ -761,14 +827,35 @@ select_epoll_poll(pyEpoll_Object *self, PyObject *const *args, Py_ssize_t nargs, { PyObject *return_value = NULL; static const char * const _keywords[] = {"timeout", "maxevents", NULL}; - static _PyArg_Parser _parser = {"|Oi:poll", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "poll", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *timeout_obj = Py_None; int maxevents = -1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &timeout_obj, &maxevents)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + timeout_obj = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + maxevents = _PyLong_AsInt(args[1]); + if (maxevents == -1 && PyErr_Occurred()) { goto exit; } +skip_optional_pos: return_value = select_epoll_poll_impl(self, timeout_obj, maxevents); exit: @@ -1128,4 +1215,4 @@ select_kqueue_control(kqueue_queue_Object *self, PyObject *const *args, Py_ssize #ifndef SELECT_KQUEUE_CONTROL_METHODDEF #define SELECT_KQUEUE_CONTROL_METHODDEF #endif /* !defined(SELECT_KQUEUE_CONTROL_METHODDEF) */ -/*[clinic end generated code: output=3e40b33a3294d03d input=a9049054013a1b77]*/ +/*[clinic end generated code: output=03041f3d09b04a3d input=a9049054013a1b77]*/ diff --git a/Modules/clinic/sha1module.c.h b/Modules/clinic/sha1module.c.h index af29173bae55..001c6af73782 100644 --- a/Modules/clinic/sha1module.c.h +++ b/Modules/clinic/sha1module.c.h @@ -82,16 +82,23 @@ _sha1_sha1(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject * { PyObject *return_value = NULL; static const char * const _keywords[] = {"string", NULL}; - static _PyArg_Parser _parser = {"|O:sha1", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "sha1", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *string = NULL; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &string)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + string = args[0]; +skip_optional_pos: return_value = _sha1_sha1_impl(module, string); exit: return return_value; } -/*[clinic end generated code: output=3bae85313ee5a3b5 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=1ae7e73ec84a27d5 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/sha256module.c.h b/Modules/clinic/sha256module.c.h index 14a88a2be8f4..658abb15cf30 100644 --- a/Modules/clinic/sha256module.c.h +++ b/Modules/clinic/sha256module.c.h @@ -82,13 +82,20 @@ _sha256_sha256(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje { PyObject *return_value = NULL; static const char * const _keywords[] = {"string", NULL}; - static _PyArg_Parser _parser = {"|O:sha256", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "sha256", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *string = NULL; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &string)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + string = args[0]; +skip_optional_pos: return_value = _sha256_sha256_impl(module, string); exit: @@ -112,16 +119,23 @@ _sha256_sha224(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje { PyObject *return_value = NULL; static const char * const _keywords[] = {"string", NULL}; - static _PyArg_Parser _parser = {"|O:sha224", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "sha224", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *string = NULL; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &string)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + string = args[0]; +skip_optional_pos: return_value = _sha256_sha224_impl(module, string); exit: return return_value; } -/*[clinic end generated code: output=fb208641d4bc3b5f input=a9049054013a1b77]*/ +/*[clinic end generated code: output=c54d0956ec88409d input=a9049054013a1b77]*/ diff --git a/Modules/clinic/sha512module.c.h b/Modules/clinic/sha512module.c.h index 7e08701937a5..459a9341cfc5 100644 --- a/Modules/clinic/sha512module.c.h +++ b/Modules/clinic/sha512module.c.h @@ -82,13 +82,20 @@ _sha512_sha512(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje { PyObject *return_value = NULL; static const char * const _keywords[] = {"string", NULL}; - static _PyArg_Parser _parser = {"|O:sha512", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "sha512", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *string = NULL; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &string)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + string = args[0]; +skip_optional_pos: return_value = _sha512_sha512_impl(module, string); exit: @@ -112,16 +119,23 @@ _sha512_sha384(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje { PyObject *return_value = NULL; static const char * const _keywords[] = {"string", NULL}; - static _PyArg_Parser _parser = {"|O:sha384", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "sha384", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *string = NULL; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &string)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + string = args[0]; +skip_optional_pos: return_value = _sha512_sha384_impl(module, string); exit: return return_value; } -/*[clinic end generated code: output=3706fa47bea06c0b input=a9049054013a1b77]*/ +/*[clinic end generated code: output=580df4b667084a7e input=a9049054013a1b77]*/ diff --git a/Modules/clinic/zlibmodule.c.h b/Modules/clinic/zlibmodule.c.h index 8e5f96aa143d..aa579209108d 100644 --- a/Modules/clinic/zlibmodule.c.h +++ b/Modules/clinic/zlibmodule.c.h @@ -24,14 +24,36 @@ zlib_compress(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObjec { PyObject *return_value = NULL; static const char * const _keywords[] = {"", "level", NULL}; - static _PyArg_Parser _parser = {"y*|i:compress", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "compress", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; Py_buffer data = {NULL, NULL}; int level = Z_DEFAULT_COMPRESSION; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &data, &level)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { goto exit; } + if (PyObject_GetBuffer(args[0], &data, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&data, 'C')) { + _PyArg_BadArgument("compress", 1, "contiguous buffer", args[0]); + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + level = _PyLong_AsInt(args[1]); + if (level == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional_pos: return_value = zlib_compress_impl(module, &data, level); exit: @@ -68,15 +90,45 @@ zlib_decompress(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj { PyObject *return_value = NULL; static const char * const _keywords[] = {"", "wbits", "bufsize", NULL}; - static _PyArg_Parser _parser = {"y*|iO&:decompress", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "decompress", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; Py_buffer data = {NULL, NULL}; int wbits = MAX_WBITS; Py_ssize_t bufsize = DEF_BUF_SIZE; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &data, &wbits, ssize_t_converter, &bufsize)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); + if (!args) { goto exit; } + if (PyObject_GetBuffer(args[0], &data, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&data, 'C')) { + _PyArg_BadArgument("decompress", 1, "contiguous buffer", args[0]); + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + wbits = _PyLong_AsInt(args[1]); + if (wbits == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (!ssize_t_converter(args[2], &bufsize)) { + goto exit; + } +skip_optional_pos: return_value = zlib_decompress_impl(module, &data, wbits, bufsize); exit: @@ -130,7 +182,9 @@ zlib_compressobj(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyOb { PyObject *return_value = NULL; static const char * const _keywords[] = {"level", "method", "wbits", "memLevel", "strategy", "zdict", NULL}; - static _PyArg_Parser _parser = {"|iiiiiy*:compressobj", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "compressobj", 0}; + PyObject *argsbuf[6]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; int level = Z_DEFAULT_COMPRESSION; int method = DEFLATED; int wbits = MAX_WBITS; @@ -138,10 +192,91 @@ zlib_compressobj(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyOb int strategy = Z_DEFAULT_STRATEGY; Py_buffer zdict = {NULL, NULL}; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &level, &method, &wbits, &memLevel, &strategy, &zdict)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 6, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + level = _PyLong_AsInt(args[0]); + if (level == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (args[1]) { + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + method = _PyLong_AsInt(args[1]); + if (method == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (args[2]) { + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + wbits = _PyLong_AsInt(args[2]); + if (wbits == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (args[3]) { + if (PyFloat_Check(args[3])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + memLevel = _PyLong_AsInt(args[3]); + if (memLevel == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (args[4]) { + if (PyFloat_Check(args[4])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + strategy = _PyLong_AsInt(args[4]); + if (strategy == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (PyObject_GetBuffer(args[5], &zdict, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&zdict, 'C')) { + _PyArg_BadArgument("compressobj", 6, "contiguous buffer", args[5]); + goto exit; + } +skip_optional_pos: return_value = zlib_compressobj_impl(module, level, method, wbits, memLevel, strategy, &zdict); exit: @@ -176,14 +311,35 @@ zlib_decompressobj(PyObject *module, PyObject *const *args, Py_ssize_t nargs, Py { PyObject *return_value = NULL; static const char * const _keywords[] = {"wbits", "zdict", NULL}; - static _PyArg_Parser _parser = {"|iO:decompressobj", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "decompressobj", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; int wbits = MAX_WBITS; PyObject *zdict = NULL; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &wbits, &zdict)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + wbits = _PyLong_AsInt(args[0]); + if (wbits == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + zdict = args[1]; +skip_optional_pos: return_value = zlib_decompressobj_impl(module, wbits, zdict); exit: @@ -262,14 +418,30 @@ zlib_Decompress_decompress(compobject *self, PyObject *const *args, Py_ssize_t n { PyObject *return_value = NULL; static const char * const _keywords[] = {"", "max_length", NULL}; - static _PyArg_Parser _parser = {"y*|O&:decompress", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "decompress", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; Py_buffer data = {NULL, NULL}; Py_ssize_t max_length = 0; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &data, ssize_t_converter, &max_length)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyObject_GetBuffer(args[0], &data, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&data, 'C')) { + _PyArg_BadArgument("decompress", 1, "contiguous buffer", args[0]); + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (!ssize_t_converter(args[1], &max_length)) { goto exit; } +skip_optional_pos: return_value = zlib_Decompress_decompress_impl(self, &data, max_length); exit: @@ -613,4 +785,4 @@ zlib_crc32(PyObject *module, PyObject *const *args, Py_ssize_t nargs) #ifndef ZLIB_DECOMPRESS___DEEPCOPY___METHODDEF #define ZLIB_DECOMPRESS___DEEPCOPY___METHODDEF #endif /* !defined(ZLIB_DECOMPRESS___DEEPCOPY___METHODDEF) */ -/*[clinic end generated code: output=b3acec2384f18782 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=feb079cebbbaacd6 input=a9049054013a1b77]*/ diff --git a/Objects/clinic/bytearrayobject.c.h b/Objects/clinic/bytearrayobject.c.h index a4669f5076f3..da1dc6a40af0 100644 --- a/Objects/clinic/bytearrayobject.c.h +++ b/Objects/clinic/bytearrayobject.c.h @@ -62,14 +62,22 @@ bytearray_translate(PyByteArrayObject *self, PyObject *const *args, Py_ssize_t n { PyObject *return_value = NULL; static const char * const _keywords[] = {"", "delete", NULL}; - static _PyArg_Parser _parser = {"O|O:translate", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "translate", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *table; PyObject *deletechars = NULL; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &table, &deletechars)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { goto exit; } + table = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + deletechars = args[1]; +skip_optional_pos: return_value = bytearray_translate_impl(self, table, deletechars); exit: @@ -239,14 +247,43 @@ bytearray_split(PyByteArrayObject *self, PyObject *const *args, Py_ssize_t nargs { PyObject *return_value = NULL; static const char * const _keywords[] = {"sep", "maxsplit", NULL}; - static _PyArg_Parser _parser = {"|On:split", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "split", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *sep = Py_None; Py_ssize_t maxsplit = -1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &sep, &maxsplit)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + sep = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); goto exit; } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + maxsplit = ival; + } +skip_optional_pos: return_value = bytearray_split_impl(self, sep, maxsplit); exit: @@ -314,14 +351,43 @@ bytearray_rsplit(PyByteArrayObject *self, PyObject *const *args, Py_ssize_t narg { PyObject *return_value = NULL; static const char * const _keywords[] = {"sep", "maxsplit", NULL}; - static _PyArg_Parser _parser = {"|On:rsplit", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "rsplit", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *sep = Py_None; Py_ssize_t maxsplit = -1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &sep, &maxsplit)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + sep = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); goto exit; } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + maxsplit = ival; + } +skip_optional_pos: return_value = bytearray_rsplit_impl(self, sep, maxsplit); exit: @@ -654,14 +720,51 @@ bytearray_decode(PyByteArrayObject *self, PyObject *const *args, Py_ssize_t narg { PyObject *return_value = NULL; static const char * const _keywords[] = {"encoding", "errors", NULL}; - static _PyArg_Parser _parser = {"|ss:decode", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "decode", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; const char *encoding = NULL; const char *errors = NULL; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &encoding, &errors)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + if (!PyUnicode_Check(args[0])) { + _PyArg_BadArgument("decode", 1, "str", args[0]); + goto exit; + } + Py_ssize_t encoding_length; + encoding = PyUnicode_AsUTF8AndSize(args[0], &encoding_length); + if (encoding == NULL) { + goto exit; + } + if (strlen(encoding) != (size_t)encoding_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (!PyUnicode_Check(args[1])) { + _PyArg_BadArgument("decode", 2, "str", args[1]); + goto exit; + } + Py_ssize_t errors_length; + errors = PyUnicode_AsUTF8AndSize(args[1], &errors_length); + if (errors == NULL) { + goto exit; + } + if (strlen(errors) != (size_t)errors_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } +skip_optional_pos: return_value = bytearray_decode_impl(self, encoding, errors); exit: @@ -701,13 +804,28 @@ bytearray_splitlines(PyByteArrayObject *self, PyObject *const *args, Py_ssize_t { PyObject *return_value = NULL; static const char * const _keywords[] = {"keepends", NULL}; - static _PyArg_Parser _parser = {"|i:splitlines", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "splitlines", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; int keepends = 0; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &keepends)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + keepends = _PyLong_AsInt(args[0]); + if (keepends == -1 && PyErr_Occurred()) { goto exit; } +skip_optional_pos: return_value = bytearray_splitlines_impl(self, keepends); exit: @@ -824,4 +942,4 @@ bytearray_sizeof(PyByteArrayObject *self, PyObject *Py_UNUSED(ignored)) { return bytearray_sizeof_impl(self); } -/*[clinic end generated code: output=f4353c27dcb4a13d input=a9049054013a1b77]*/ +/*[clinic end generated code: output=272fcb836b92da32 input=a9049054013a1b77]*/ diff --git a/Objects/clinic/bytesobject.c.h b/Objects/clinic/bytesobject.c.h index d75bbf1e5432..b03078305a60 100644 --- a/Objects/clinic/bytesobject.c.h +++ b/Objects/clinic/bytesobject.c.h @@ -27,14 +27,43 @@ bytes_split(PyBytesObject *self, PyObject *const *args, Py_ssize_t nargs, PyObje { PyObject *return_value = NULL; static const char * const _keywords[] = {"sep", "maxsplit", NULL}; - static _PyArg_Parser _parser = {"|On:split", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "split", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *sep = Py_None; Py_ssize_t maxsplit = -1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &sep, &maxsplit)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + sep = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + maxsplit = ival; + } +skip_optional_pos: return_value = bytes_split_impl(self, sep, maxsplit); exit: @@ -154,14 +183,43 @@ bytes_rsplit(PyBytesObject *self, PyObject *const *args, Py_ssize_t nargs, PyObj { PyObject *return_value = NULL; static const char * const _keywords[] = {"sep", "maxsplit", NULL}; - static _PyArg_Parser _parser = {"|On:rsplit", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "rsplit", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *sep = Py_None; Py_ssize_t maxsplit = -1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &sep, &maxsplit)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + sep = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); goto exit; } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + maxsplit = ival; + } +skip_optional_pos: return_value = bytes_rsplit_impl(self, sep, maxsplit); exit: @@ -309,14 +367,22 @@ bytes_translate(PyBytesObject *self, PyObject *const *args, Py_ssize_t nargs, Py { PyObject *return_value = NULL; static const char * const _keywords[] = {"", "delete", NULL}; - static _PyArg_Parser _parser = {"O|O:translate", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "translate", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *table; PyObject *deletechars = NULL; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &table, &deletechars)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { goto exit; } + table = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + deletechars = args[1]; +skip_optional_pos: return_value = bytes_translate_impl(self, table, deletechars); exit: @@ -487,14 +553,51 @@ bytes_decode(PyBytesObject *self, PyObject *const *args, Py_ssize_t nargs, PyObj { PyObject *return_value = NULL; static const char * const _keywords[] = {"encoding", "errors", NULL}; - static _PyArg_Parser _parser = {"|ss:decode", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "decode", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; const char *encoding = NULL; const char *errors = NULL; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &encoding, &errors)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + if (!PyUnicode_Check(args[0])) { + _PyArg_BadArgument("decode", 1, "str", args[0]); + goto exit; + } + Py_ssize_t encoding_length; + encoding = PyUnicode_AsUTF8AndSize(args[0], &encoding_length); + if (encoding == NULL) { + goto exit; + } + if (strlen(encoding) != (size_t)encoding_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (!PyUnicode_Check(args[1])) { + _PyArg_BadArgument("decode", 2, "str", args[1]); + goto exit; + } + Py_ssize_t errors_length; + errors = PyUnicode_AsUTF8AndSize(args[1], &errors_length); + if (errors == NULL) { + goto exit; + } + if (strlen(errors) != (size_t)errors_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); goto exit; } +skip_optional_pos: return_value = bytes_decode_impl(self, encoding, errors); exit: @@ -521,13 +624,28 @@ bytes_splitlines(PyBytesObject *self, PyObject *const *args, Py_ssize_t nargs, P { PyObject *return_value = NULL; static const char * const _keywords[] = {"keepends", NULL}; - static _PyArg_Parser _parser = {"|i:splitlines", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "splitlines", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; int keepends = 0; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &keepends)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + keepends = _PyLong_AsInt(args[0]); + if (keepends == -1 && PyErr_Occurred()) { goto exit; } +skip_optional_pos: return_value = bytes_splitlines_impl(self, keepends); exit: @@ -568,4 +686,4 @@ bytes_fromhex(PyTypeObject *type, PyObject *arg) exit: return return_value; } -/*[clinic end generated code: output=c6621bda84e63e51 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=af9f51b9b185567d input=a9049054013a1b77]*/ diff --git a/Objects/clinic/complexobject.c.h b/Objects/clinic/complexobject.c.h index 0cbfb793e102..8caa910d037d 100644 --- a/Objects/clinic/complexobject.c.h +++ b/Objects/clinic/complexobject.c.h @@ -18,17 +18,32 @@ complex_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; static const char * const _keywords[] = {"real", "imag", NULL}; - static _PyArg_Parser _parser = {"|OO:complex", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "complex", 0}; + PyObject *argsbuf[2]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0; PyObject *r = _PyLong_Zero; PyObject *i = NULL; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &r, &i)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 0, 2, 0, argsbuf); + if (!fastargs) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + if (fastargs[0]) { + r = fastargs[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + i = fastargs[1]; +skip_optional_pos: return_value = complex_new_impl(type, r, i); exit: return return_value; } -/*[clinic end generated code: output=5017b2458bdc4ecd input=a9049054013a1b77]*/ +/*[clinic end generated code: output=a0fe23fdbdc9b06b input=a9049054013a1b77]*/ diff --git a/Objects/clinic/descrobject.c.h b/Objects/clinic/descrobject.c.h index 71b196621c30..d248b91bf48d 100644 --- a/Objects/clinic/descrobject.c.h +++ b/Objects/clinic/descrobject.c.h @@ -10,13 +10,17 @@ mappingproxy_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; static const char * const _keywords[] = {"mapping", NULL}; - static _PyArg_Parser _parser = {"O:mappingproxy", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "mappingproxy", 0}; + PyObject *argsbuf[1]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); PyObject *mapping; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &mapping)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 1, 0, argsbuf); + if (!fastargs) { goto exit; } + mapping = fastargs[0]; return_value = mappingproxy_new_impl(type, mapping); exit: @@ -69,19 +73,46 @@ property_init(PyObject *self, PyObject *args, PyObject *kwargs) { int return_value = -1; static const char * const _keywords[] = {"fget", "fset", "fdel", "doc", NULL}; - static _PyArg_Parser _parser = {"|OOOO:property", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "property", 0}; + PyObject *argsbuf[4]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0; PyObject *fget = NULL; PyObject *fset = NULL; PyObject *fdel = NULL; PyObject *doc = NULL; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &fget, &fset, &fdel, &doc)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 0, 4, 0, argsbuf); + if (!fastargs) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + if (fastargs[0]) { + fget = fastargs[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (fastargs[1]) { + fset = fastargs[1]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (fastargs[2]) { + fdel = fastargs[2]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + doc = fastargs[3]; +skip_optional_pos: return_value = property_init_impl((propertyobject *)self, fget, fset, fdel, doc); exit: return return_value; } -/*[clinic end generated code: output=729021fa9cdc46be input=a9049054013a1b77]*/ +/*[clinic end generated code: output=916624e717862abc input=a9049054013a1b77]*/ diff --git a/Objects/clinic/enumobject.c.h b/Objects/clinic/enumobject.c.h index 27da2942195e..09d4c87e155f 100644 --- a/Objects/clinic/enumobject.c.h +++ b/Objects/clinic/enumobject.c.h @@ -25,14 +25,24 @@ enum_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; static const char * const _keywords[] = {"iterable", "start", NULL}; - static _PyArg_Parser _parser = {"O|O:enumerate", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "enumerate", 0}; + PyObject *argsbuf[2]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 1; PyObject *iterable; PyObject *start = 0; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &iterable, &start)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 2, 0, argsbuf); + if (!fastargs) { goto exit; } + iterable = fastargs[0]; + if (!noptargs) { + goto skip_optional_pos; + } + start = fastargs[1]; +skip_optional_pos: return_value = enum_new_impl(type, iterable, start); exit: @@ -67,4 +77,4 @@ reversed_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) exit: return return_value; } -/*[clinic end generated code: output=831cec3db0e987c9 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=e18c3fefcf914ec7 input=a9049054013a1b77]*/ diff --git a/Objects/clinic/funcobject.c.h b/Objects/clinic/funcobject.c.h index 4c54483fe6e5..929797bfb02d 100644 --- a/Objects/clinic/funcobject.c.h +++ b/Objects/clinic/funcobject.c.h @@ -28,20 +28,51 @@ func_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; static const char * const _keywords[] = {"code", "globals", "name", "argdefs", "closure", NULL}; - static _PyArg_Parser _parser = {"O!O!|OOO:function", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "function", 0}; + PyObject *argsbuf[5]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 2; PyCodeObject *code; PyObject *globals; PyObject *name = Py_None; PyObject *defaults = Py_None; PyObject *closure = Py_None; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &PyCode_Type, &code, &PyDict_Type, &globals, &name, &defaults, &closure)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 2, 5, 0, argsbuf); + if (!fastargs) { goto exit; } + if (!PyObject_TypeCheck(fastargs[0], &PyCode_Type)) { + _PyArg_BadArgument("function", 1, (&PyCode_Type)->tp_name, fastargs[0]); + goto exit; + } + code = (PyCodeObject *)fastargs[0]; + if (!PyDict_Check(fastargs[1])) { + _PyArg_BadArgument("function", 2, "dict", fastargs[1]); + goto exit; + } + globals = fastargs[1]; + if (!noptargs) { + goto skip_optional_pos; + } + if (fastargs[2]) { + name = fastargs[2]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (fastargs[3]) { + defaults = fastargs[3]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + closure = fastargs[4]; +skip_optional_pos: return_value = func_new_impl(type, code, globals, name, defaults, closure); exit: return return_value; } -/*[clinic end generated code: output=a6ab29e4dd33010a input=a9049054013a1b77]*/ +/*[clinic end generated code: output=1d01072cd5620d7e input=a9049054013a1b77]*/ diff --git a/Objects/clinic/listobject.c.h b/Objects/clinic/listobject.c.h index 447cdefbe10f..7b8e2d9905f9 100644 --- a/Objects/clinic/listobject.c.h +++ b/Objects/clinic/listobject.c.h @@ -169,14 +169,35 @@ list_sort(PyListObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject { PyObject *return_value = NULL; static const char * const _keywords[] = {"key", "reverse", NULL}; - static _PyArg_Parser _parser = {"|$Oi:sort", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "sort", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *keyfunc = Py_None; int reverse = 0; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &keyfunc, &reverse)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[0]) { + keyfunc = args[0]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + reverse = _PyLong_AsInt(args[1]); + if (reverse == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional_kwonly: return_value = list_sort_impl(self, keyfunc, reverse); exit: @@ -338,4 +359,4 @@ list___reversed__(PyListObject *self, PyObject *Py_UNUSED(ignored)) { return list___reversed___impl(self); } -/*[clinic end generated code: output=4a835f9880a72273 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=d1d5078edb7d3cf4 input=a9049054013a1b77]*/ diff --git a/Objects/clinic/longobject.c.h b/Objects/clinic/longobject.c.h index 67700239ff8d..453edba481df 100644 --- a/Objects/clinic/longobject.c.h +++ b/Objects/clinic/longobject.c.h @@ -10,14 +10,29 @@ long_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; static const char * const _keywords[] = {"", "base", NULL}; - static _PyArg_Parser _parser = {"|OO:int", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "int", 0}; + PyObject *argsbuf[2]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0; PyObject *x = NULL; PyObject *obase = NULL; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &x, &obase)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 0, 2, 0, argsbuf); + if (!fastargs) { goto exit; } + if (nargs < 1) { + goto skip_optional_posonly; + } + noptargs--; + x = fastargs[0]; +skip_optional_posonly: + if (!noptargs) { + goto skip_optional_pos; + } + obase = fastargs[1]; +skip_optional_pos: return_value = long_new_impl(type, x, obase); exit: @@ -183,15 +198,50 @@ int_to_bytes(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject * { PyObject *return_value = NULL; static const char * const _keywords[] = {"length", "byteorder", "signed", NULL}; - static _PyArg_Parser _parser = {"nU|$p:to_bytes", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "to_bytes", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; Py_ssize_t length; PyObject *byteorder; int is_signed = 0; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &length, &byteorder, &is_signed)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[0]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + length = ival; + } + if (!PyUnicode_Check(args[1])) { + _PyArg_BadArgument("to_bytes", 2, "str", args[1]); goto exit; } + if (PyUnicode_READY(args[1]) == -1) { + goto exit; + } + byteorder = args[1]; + if (!noptargs) { + goto skip_optional_kwonly; + } + is_signed = PyObject_IsTrue(args[2]); + if (is_signed < 0) { + goto exit; + } +skip_optional_kwonly: return_value = int_to_bytes_impl(self, length, byteorder, is_signed); exit: @@ -230,18 +280,37 @@ int_from_bytes(PyTypeObject *type, PyObject *const *args, Py_ssize_t nargs, PyOb { PyObject *return_value = NULL; static const char * const _keywords[] = {"bytes", "byteorder", "signed", NULL}; - static _PyArg_Parser _parser = {"OU|$p:from_bytes", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "from_bytes", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; PyObject *bytes_obj; PyObject *byteorder; int is_signed = 0; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &bytes_obj, &byteorder, &is_signed)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { + goto exit; + } + bytes_obj = args[0]; + if (!PyUnicode_Check(args[1])) { + _PyArg_BadArgument("from_bytes", 2, "str", args[1]); + goto exit; + } + if (PyUnicode_READY(args[1]) == -1) { + goto exit; + } + byteorder = args[1]; + if (!noptargs) { + goto skip_optional_kwonly; + } + is_signed = PyObject_IsTrue(args[2]); + if (is_signed < 0) { goto exit; } +skip_optional_kwonly: return_value = int_from_bytes_impl(type, bytes_obj, byteorder, is_signed); exit: return return_value; } -/*[clinic end generated code: output=3b91cda9d83abaa2 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=709503897c55bca1 input=a9049054013a1b77]*/ diff --git a/Objects/clinic/moduleobject.c.h b/Objects/clinic/moduleobject.c.h index e841e76e9ad7..512edee72fea 100644 --- a/Objects/clinic/moduleobject.c.h +++ b/Objects/clinic/moduleobject.c.h @@ -18,17 +18,34 @@ module___init__(PyObject *self, PyObject *args, PyObject *kwargs) { int return_value = -1; static const char * const _keywords[] = {"name", "doc", NULL}; - static _PyArg_Parser _parser = {"U|O:module", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "module", 0}; + PyObject *argsbuf[2]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 1; PyObject *name; PyObject *doc = Py_None; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &name, &doc)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 2, 0, argsbuf); + if (!fastargs) { goto exit; } + if (!PyUnicode_Check(fastargs[0])) { + _PyArg_BadArgument("module", 1, "str", fastargs[0]); + goto exit; + } + if (PyUnicode_READY(fastargs[0]) == -1) { + goto exit; + } + name = fastargs[0]; + if (!noptargs) { + goto skip_optional_pos; + } + doc = fastargs[1]; +skip_optional_pos: return_value = module___init___impl((PyModuleObject *)self, name, doc); exit: return return_value; } -/*[clinic end generated code: output=7b1b324bf6a590d1 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=d7b7ca1237597b08 input=a9049054013a1b77]*/ diff --git a/Objects/clinic/odictobject.c.h b/Objects/clinic/odictobject.c.h index 1aea36ec94c9..f43bc14ce1b6 100644 --- a/Objects/clinic/odictobject.c.h +++ b/Objects/clinic/odictobject.c.h @@ -19,14 +19,22 @@ OrderedDict_fromkeys(PyTypeObject *type, PyObject *const *args, Py_ssize_t nargs { PyObject *return_value = NULL; static const char * const _keywords[] = {"iterable", "value", NULL}; - static _PyArg_Parser _parser = {"O|O:fromkeys", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "fromkeys", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *seq; PyObject *value = Py_None; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &seq, &value)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { goto exit; } + seq = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + value = args[1]; +skip_optional_pos: return_value = OrderedDict_fromkeys_impl(type, seq, value); exit: @@ -53,14 +61,22 @@ OrderedDict_setdefault(PyODictObject *self, PyObject *const *args, Py_ssize_t na { PyObject *return_value = NULL; static const char * const _keywords[] = {"key", "default", NULL}; - static _PyArg_Parser _parser = {"O|O:setdefault", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "setdefault", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *key; PyObject *default_value = Py_None; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &key, &default_value)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { goto exit; } + key = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + default_value = args[1]; +skip_optional_pos: return_value = OrderedDict_setdefault_impl(self, key, default_value); exit: @@ -86,13 +102,23 @@ OrderedDict_popitem(PyODictObject *self, PyObject *const *args, Py_ssize_t nargs { PyObject *return_value = NULL; static const char * const _keywords[] = {"last", NULL}; - static _PyArg_Parser _parser = {"|p:popitem", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "popitem", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; int last = 1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &last)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + last = PyObject_IsTrue(args[0]); + if (last < 0) { goto exit; } +skip_optional_pos: return_value = OrderedDict_popitem_impl(self, last); exit: @@ -118,17 +144,28 @@ OrderedDict_move_to_end(PyODictObject *self, PyObject *const *args, Py_ssize_t n { PyObject *return_value = NULL; static const char * const _keywords[] = {"key", "last", NULL}; - static _PyArg_Parser _parser = {"O|p:move_to_end", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "move_to_end", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *key; int last = 1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &key, &last)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { + goto exit; + } + key = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + last = PyObject_IsTrue(args[1]); + if (last < 0) { goto exit; } +skip_optional_pos: return_value = OrderedDict_move_to_end_impl(self, key, last); exit: return return_value; } -/*[clinic end generated code: output=f6f189e1fe032e0b input=a9049054013a1b77]*/ +/*[clinic end generated code: output=8eb1296df9142908 input=a9049054013a1b77]*/ diff --git a/Objects/clinic/structseq.c.h b/Objects/clinic/structseq.c.h index ed6a5643f886..b3b4836543d0 100644 --- a/Objects/clinic/structseq.c.h +++ b/Objects/clinic/structseq.c.h @@ -10,17 +10,27 @@ structseq_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; static const char * const _keywords[] = {"sequence", "dict", NULL}; - static _PyArg_Parser _parser = {"O|O:structseq", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "structseq", 0}; + PyObject *argsbuf[2]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 1; PyObject *arg; PyObject *dict = NULL; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &arg, &dict)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 2, 0, argsbuf); + if (!fastargs) { goto exit; } + arg = fastargs[0]; + if (!noptargs) { + goto skip_optional_pos; + } + dict = fastargs[1]; +skip_optional_pos: return_value = structseq_new_impl(type, arg, dict); exit: return return_value; } -/*[clinic end generated code: output=cd643eb89b5d312a input=a9049054013a1b77]*/ +/*[clinic end generated code: output=ed3019acf49b656c input=a9049054013a1b77]*/ diff --git a/Objects/clinic/unicodeobject.c.h b/Objects/clinic/unicodeobject.c.h index 3e40a62ab0e4..647507dea61a 100644 --- a/Objects/clinic/unicodeobject.c.h +++ b/Objects/clinic/unicodeobject.c.h @@ -142,14 +142,51 @@ unicode_encode(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject { PyObject *return_value = NULL; static const char * const _keywords[] = {"encoding", "errors", NULL}; - static _PyArg_Parser _parser = {"|ss:encode", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "encode", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; const char *encoding = NULL; const char *errors = NULL; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &encoding, &errors)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + if (!PyUnicode_Check(args[0])) { + _PyArg_BadArgument("encode", 1, "str", args[0]); + goto exit; + } + Py_ssize_t encoding_length; + encoding = PyUnicode_AsUTF8AndSize(args[0], &encoding_length); + if (encoding == NULL) { + goto exit; + } + if (strlen(encoding) != (size_t)encoding_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (!PyUnicode_Check(args[1])) { + _PyArg_BadArgument("encode", 2, "str", args[1]); + goto exit; + } + Py_ssize_t errors_length; + errors = PyUnicode_AsUTF8AndSize(args[1], &errors_length); + if (errors == NULL) { + goto exit; + } + if (strlen(errors) != (size_t)errors_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } +skip_optional_pos: return_value = unicode_encode_impl(self, encoding, errors); exit: @@ -175,13 +212,28 @@ unicode_expandtabs(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyOb { PyObject *return_value = NULL; static const char * const _keywords[] = {"tabsize", NULL}; - static _PyArg_Parser _parser = {"|i:expandtabs", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "expandtabs", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; int tabsize = 8; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &tabsize)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + tabsize = _PyLong_AsInt(args[0]); + if (tabsize == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional_pos: return_value = unicode_expandtabs_impl(self, tabsize); exit: @@ -781,14 +833,43 @@ unicode_split(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject { PyObject *return_value = NULL; static const char * const _keywords[] = {"sep", "maxsplit", NULL}; - static _PyArg_Parser _parser = {"|On:split", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "split", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *sep = Py_None; Py_ssize_t maxsplit = -1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &sep, &maxsplit)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + sep = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); goto exit; } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + maxsplit = ival; + } +skip_optional_pos: return_value = unicode_split_impl(self, sep, maxsplit); exit: @@ -854,14 +935,43 @@ unicode_rsplit(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject { PyObject *return_value = NULL; static const char * const _keywords[] = {"sep", "maxsplit", NULL}; - static _PyArg_Parser _parser = {"|On:rsplit", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "rsplit", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *sep = Py_None; Py_ssize_t maxsplit = -1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &sep, &maxsplit)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + sep = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + maxsplit = ival; + } +skip_optional_pos: return_value = unicode_rsplit_impl(self, sep, maxsplit); exit: @@ -888,13 +998,28 @@ unicode_splitlines(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyOb { PyObject *return_value = NULL; static const char * const _keywords[] = {"keepends", NULL}; - static _PyArg_Parser _parser = {"|i:splitlines", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "splitlines", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; int keepends = 0; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &keepends)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + keepends = _PyLong_AsInt(args[0]); + if (keepends == -1 && PyErr_Occurred()) { goto exit; } +skip_optional_pos: return_value = unicode_splitlines_impl(self, keepends); exit: @@ -1107,4 +1232,4 @@ unicode_sizeof(PyObject *self, PyObject *Py_UNUSED(ignored)) { return unicode_sizeof_impl(self); } -/*[clinic end generated code: output=087ff163a10505ae input=a9049054013a1b77]*/ +/*[clinic end generated code: output=d1541724cb4a0070 input=a9049054013a1b77]*/ diff --git a/Objects/stringlib/clinic/transmogrify.h.h b/Objects/stringlib/clinic/transmogrify.h.h index 15c43af61a28..0c53a75b1bf8 100644 --- a/Objects/stringlib/clinic/transmogrify.h.h +++ b/Objects/stringlib/clinic/transmogrify.h.h @@ -21,13 +21,28 @@ stringlib_expandtabs(PyObject *self, PyObject *const *args, Py_ssize_t nargs, Py { PyObject *return_value = NULL; static const char * const _keywords[] = {"tabsize", NULL}; - static _PyArg_Parser _parser = {"|i:expandtabs", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "expandtabs", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; int tabsize = 8; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &tabsize)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + tabsize = _PyLong_AsInt(args[0]); + if (tabsize == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional_pos: return_value = stringlib_expandtabs_impl(self, tabsize); exit: @@ -259,4 +274,4 @@ stringlib_zfill(PyObject *self, PyObject *arg) exit: return return_value; } -/*[clinic end generated code: output=787248a980f6a00e input=a9049054013a1b77]*/ +/*[clinic end generated code: output=96cbb19b238d0e84 input=a9049054013a1b77]*/ diff --git a/PC/clinic/_testconsole.c.h b/PC/clinic/_testconsole.c.h index 2809f2aa6e68..a37d1235a02a 100644 --- a/PC/clinic/_testconsole.c.h +++ b/PC/clinic/_testconsole.c.h @@ -22,14 +22,21 @@ _testconsole_write_input(PyObject *module, PyObject *const *args, Py_ssize_t nar { PyObject *return_value = NULL; static const char * const _keywords[] = {"file", "s", NULL}; - static _PyArg_Parser _parser = {"OS:write_input", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "write_input", 0}; + PyObject *argsbuf[2]; PyObject *file; PyBytesObject *s; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &file, &s)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { goto exit; } + file = args[0]; + if (!PyBytes_Check(args[1])) { + _PyArg_BadArgument("write_input", 2, "bytes", args[1]); + goto exit; + } + s = (PyBytesObject *)args[1]; return_value = _testconsole_write_input_impl(module, file, s); exit: @@ -57,13 +64,15 @@ _testconsole_read_output(PyObject *module, PyObject *const *args, Py_ssize_t nar { PyObject *return_value = NULL; static const char * const _keywords[] = {"file", NULL}; - static _PyArg_Parser _parser = {"O:read_output", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "read_output", 0}; + PyObject *argsbuf[1]; PyObject *file; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &file)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { goto exit; } + file = args[0]; return_value = _testconsole_read_output_impl(module, file); exit: @@ -79,4 +88,4 @@ _testconsole_read_output(PyObject *module, PyObject *const *args, Py_ssize_t nar #ifndef _TESTCONSOLE_READ_OUTPUT_METHODDEF #define _TESTCONSOLE_READ_OUTPUT_METHODDEF #endif /* !defined(_TESTCONSOLE_READ_OUTPUT_METHODDEF) */ -/*[clinic end generated code: output=ab9ea8e78d26288e input=a9049054013a1b77]*/ +/*[clinic end generated code: output=ef452d5fb9287fc2 input=a9049054013a1b77]*/ diff --git a/PC/clinic/winreg.c.h b/PC/clinic/winreg.c.h index 21a9302d0af7..50210250ed19 100644 --- a/PC/clinic/winreg.c.h +++ b/PC/clinic/winreg.c.h @@ -88,15 +88,19 @@ winreg_HKEYType___exit__(PyHKEYObject *self, PyObject *const *args, Py_ssize_t n { PyObject *return_value = NULL; static const char * const _keywords[] = {"exc_type", "exc_value", "traceback", NULL}; - static _PyArg_Parser _parser = {"OOO:__exit__", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "__exit__", 0}; + PyObject *argsbuf[3]; PyObject *exc_type; PyObject *exc_value; PyObject *traceback; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &exc_type, &exc_value, &traceback)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 3, 0, argsbuf); + if (!args) { goto exit; } + exc_type = args[0]; + exc_value = args[1]; + traceback = args[2]; return_value = winreg_HKEYType___exit___impl(self, exc_type, exc_value, traceback); exit: @@ -1117,4 +1121,4 @@ winreg_QueryReflectionKey(PyObject *module, PyObject *arg) exit: return return_value; } -/*[clinic end generated code: output=bd491131d343ae7a input=a9049054013a1b77]*/ +/*[clinic end generated code: output=1204d20c543b5b4a input=a9049054013a1b77]*/ diff --git a/PC/clinic/winsound.c.h b/PC/clinic/winsound.c.h index 86514f5cfe96..b37db4c6cbc4 100644 --- a/PC/clinic/winsound.c.h +++ b/PC/clinic/winsound.c.h @@ -24,12 +24,23 @@ winsound_PlaySound(PyObject *module, PyObject *const *args, Py_ssize_t nargs, Py { PyObject *return_value = NULL; static const char * const _keywords[] = {"sound", "flags", NULL}; - static _PyArg_Parser _parser = {"Oi:PlaySound", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "PlaySound", 0}; + PyObject *argsbuf[2]; PyObject *sound; int flags; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &sound, &flags)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { + goto exit; + } + sound = args[0]; + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + flags = _PyLong_AsInt(args[1]); + if (flags == -1 && PyErr_Occurred()) { goto exit; } return_value = winsound_PlaySound_impl(module, sound, flags); @@ -61,12 +72,31 @@ winsound_Beep(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObjec { PyObject *return_value = NULL; static const char * const _keywords[] = {"frequency", "duration", NULL}; - static _PyArg_Parser _parser = {"ii:Beep", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "Beep", 0}; + PyObject *argsbuf[2]; int frequency; int duration; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &frequency, &duration)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + frequency = _PyLong_AsInt(args[0]); + if (frequency == -1 && PyErr_Occurred()) { + goto exit; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + duration = _PyLong_AsInt(args[1]); + if (duration == -1 && PyErr_Occurred()) { goto exit; } return_value = winsound_Beep_impl(module, frequency, duration); @@ -94,16 +124,31 @@ winsound_MessageBeep(PyObject *module, PyObject *const *args, Py_ssize_t nargs, { PyObject *return_value = NULL; static const char * const _keywords[] = {"type", NULL}; - static _PyArg_Parser _parser = {"|i:MessageBeep", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "MessageBeep", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; int type = MB_OK; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &type)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + type = _PyLong_AsInt(args[0]); + if (type == -1 && PyErr_Occurred()) { goto exit; } +skip_optional_pos: return_value = winsound_MessageBeep_impl(module, type); exit: return return_value; } -/*[clinic end generated code: output=19e5f0fb15bcd5bc input=a9049054013a1b77]*/ +/*[clinic end generated code: output=28d1cd033282723d input=a9049054013a1b77]*/ diff --git a/Python/clinic/_warnings.c.h b/Python/clinic/_warnings.c.h index d1e50de7d9da..67ab0e3d9de5 100644 --- a/Python/clinic/_warnings.c.h +++ b/Python/clinic/_warnings.c.h @@ -20,19 +20,55 @@ warnings_warn(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObjec { PyObject *return_value = NULL; static const char * const _keywords[] = {"message", "category", "stacklevel", "source", NULL}; - static _PyArg_Parser _parser = {"O|OnO:warn", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "warn", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *message; PyObject *category = Py_None; Py_ssize_t stacklevel = 1; PyObject *source = Py_None; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &message, &category, &stacklevel, &source)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 4, 0, argsbuf); + if (!args) { goto exit; } + message = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + category = args[1]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (args[2]) { + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + stacklevel = ival; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + source = args[3]; +skip_optional_pos: return_value = warnings_warn_impl(module, message, category, stacklevel, source); exit: return return_value; } -/*[clinic end generated code: output=a4fbe6e2d1cc2091 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b7bb54c73b5433ec input=a9049054013a1b77]*/ diff --git a/Python/clinic/bltinmodule.c.h b/Python/clinic/bltinmodule.c.h index df9970942b74..0ed11bceeb87 100644 --- a/Python/clinic/bltinmodule.c.h +++ b/Python/clinic/bltinmodule.c.h @@ -180,7 +180,9 @@ builtin_compile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj { PyObject *return_value = NULL; static const char * const _keywords[] = {"source", "filename", "mode", "flags", "dont_inherit", "optimize", "feature_version", NULL}; - static _PyArg_Parser _parser = {"OO&s|iiii:compile", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "compile", 0}; + PyObject *argsbuf[7]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 3; PyObject *source; PyObject *filename; const char *mode; @@ -189,10 +191,82 @@ builtin_compile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj int optimize = -1; int feature_version = -1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &source, PyUnicode_FSDecoder, &filename, &mode, &flags, &dont_inherit, &optimize, &feature_version)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 7, 0, argsbuf); + if (!args) { goto exit; } + source = args[0]; + if (!PyUnicode_FSDecoder(args[1], &filename)) { + goto exit; + } + if (!PyUnicode_Check(args[2])) { + _PyArg_BadArgument("compile", 3, "str", args[2]); + goto exit; + } + Py_ssize_t mode_length; + mode = PyUnicode_AsUTF8AndSize(args[2], &mode_length); + if (mode == NULL) { + goto exit; + } + if (strlen(mode) != (size_t)mode_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[3]) { + if (PyFloat_Check(args[3])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + flags = _PyLong_AsInt(args[3]); + if (flags == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (args[4]) { + if (PyFloat_Check(args[4])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + dont_inherit = _PyLong_AsInt(args[4]); + if (dont_inherit == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (args[5]) { + if (PyFloat_Check(args[5])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + optimize = _PyLong_AsInt(args[5]); + if (optimize == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (PyFloat_Check(args[6])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + feature_version = _PyLong_AsInt(args[6]); + if (feature_version == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional_pos: return_value = builtin_compile_impl(module, source, filename, mode, flags, dont_inherit, optimize, feature_version); exit: @@ -637,14 +711,22 @@ builtin_round(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObjec { PyObject *return_value = NULL; static const char * const _keywords[] = {"number", "ndigits", NULL}; - static _PyArg_Parser _parser = {"O|O:round", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "round", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *number; PyObject *ndigits = NULL; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &number, &ndigits)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { goto exit; } + number = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + ndigits = args[1]; +skip_optional_pos: return_value = builtin_round_impl(module, number, ndigits); exit: @@ -672,14 +754,22 @@ builtin_sum(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject { PyObject *return_value = NULL; static const char * const _keywords[] = {"", "start", NULL}; - static _PyArg_Parser _parser = {"O|O:sum", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "sum", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *iterable; PyObject *start = NULL; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &iterable, &start)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { goto exit; } + iterable = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + start = args[1]; +skip_optional_pos: return_value = builtin_sum_impl(module, iterable, start); exit: @@ -755,4 +845,4 @@ builtin_issubclass(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=00b97a48ea49eaf2 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=3f690311ac556c31 input=a9049054013a1b77]*/ diff --git a/Python/clinic/import.c.h b/Python/clinic/import.c.h index 9ee20fbe5089..05e3106bb39a 100644 --- a/Python/clinic/import.c.h +++ b/Python/clinic/import.c.h @@ -411,12 +411,29 @@ _imp_source_hash(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyOb { PyObject *return_value = NULL; static const char * const _keywords[] = {"key", "source", NULL}; - static _PyArg_Parser _parser = {"ly*:source_hash", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "source_hash", 0}; + PyObject *argsbuf[2]; long key; Py_buffer source = {NULL, NULL}; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &key, &source)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + key = PyLong_AsLong(args[0]); + if (key == -1 && PyErr_Occurred()) { + goto exit; + } + if (PyObject_GetBuffer(args[1], &source, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&source, 'C')) { + _PyArg_BadArgument("source_hash", 2, "contiguous buffer", args[1]); goto exit; } return_value = _imp_source_hash_impl(module, key, &source); @@ -437,4 +454,4 @@ _imp_source_hash(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyOb #ifndef _IMP_EXEC_DYNAMIC_METHODDEF #define _IMP_EXEC_DYNAMIC_METHODDEF #endif /* !defined(_IMP_EXEC_DYNAMIC_METHODDEF) */ -/*[clinic end generated code: output=2409b8feeafe7c4b input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b51244770fdcf4b8 input=a9049054013a1b77]*/ diff --git a/Python/clinic/sysmodule.c.h b/Python/clinic/sysmodule.c.h index fc9794bf255a..c70b721983c1 100644 --- a/Python/clinic/sysmodule.c.h +++ b/Python/clinic/sysmodule.c.h @@ -410,11 +410,21 @@ sys_set_coroutine_origin_tracking_depth(PyObject *module, PyObject *const *args, { PyObject *return_value = NULL; static const char * const _keywords[] = {"depth", NULL}; - static _PyArg_Parser _parser = {"i:set_coroutine_origin_tracking_depth", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "set_coroutine_origin_tracking_depth", 0}; + PyObject *argsbuf[1]; int depth; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &depth)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + depth = _PyLong_AsInt(args[0]); + if (depth == -1 && PyErr_Occurred()) { goto exit; } return_value = sys_set_coroutine_origin_tracking_depth_impl(module, depth); @@ -1050,4 +1060,4 @@ sys_getandroidapilevel(PyObject *module, PyObject *Py_UNUSED(ignored)) #ifndef SYS_GETANDROIDAPILEVEL_METHODDEF #define SYS_GETANDROIDAPILEVEL_METHODDEF #endif /* !defined(SYS_GETANDROIDAPILEVEL_METHODDEF) */ -/*[clinic end generated code: output=109787af3401cd27 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=3ba4c194d00f1866 input=a9049054013a1b77]*/ diff --git a/Python/clinic/traceback.c.h b/Python/clinic/traceback.c.h index d9daccbbb740..2815f65d3dd1 100644 --- a/Python/clinic/traceback.c.h +++ b/Python/clinic/traceback.c.h @@ -17,14 +17,41 @@ tb_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; static const char * const _keywords[] = {"tb_next", "tb_frame", "tb_lasti", "tb_lineno", NULL}; - static _PyArg_Parser _parser = {"OO!ii:TracebackType", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "TracebackType", 0}; + PyObject *argsbuf[4]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); PyObject *tb_next; PyFrameObject *tb_frame; int tb_lasti; int tb_lineno; - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &tb_next, &PyFrame_Type, &tb_frame, &tb_lasti, &tb_lineno)) { + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 4, 4, 0, argsbuf); + if (!fastargs) { + goto exit; + } + tb_next = fastargs[0]; + if (!PyObject_TypeCheck(fastargs[1], &PyFrame_Type)) { + _PyArg_BadArgument("TracebackType", 2, (&PyFrame_Type)->tp_name, fastargs[1]); + goto exit; + } + tb_frame = (PyFrameObject *)fastargs[1]; + if (PyFloat_Check(fastargs[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + tb_lasti = _PyLong_AsInt(fastargs[2]); + if (tb_lasti == -1 && PyErr_Occurred()) { + goto exit; + } + if (PyFloat_Check(fastargs[3])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + tb_lineno = _PyLong_AsInt(fastargs[3]); + if (tb_lineno == -1 && PyErr_Occurred()) { goto exit; } return_value = tb_new_impl(type, tb_next, tb_frame, tb_lasti, tb_lineno); @@ -32,4 +59,4 @@ tb_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) exit: return return_value; } -/*[clinic end generated code: output=0133130d7d19556f input=a9049054013a1b77]*/ +/*[clinic end generated code: output=7e4c0e252d0973b0 input=a9049054013a1b77]*/ diff --git a/Python/getargs.c b/Python/getargs.c index 05ebe9c45b37..693a29cced42 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -1905,24 +1905,11 @@ parser_init(struct _PyArg_Parser *parser) int i, len, min, max, nkw; PyObject *kwtuple; - assert(parser->format != NULL); assert(parser->keywords != NULL); if (parser->kwtuple != NULL) { return 1; } - /* grab the function name or custom error msg first (mutually exclusive) */ - parser->fname = strchr(parser->format, ':'); - if (parser->fname) { - parser->fname++; - parser->custom_msg = NULL; - } - else { - parser->custom_msg = strchr(parser->format,';'); - if (parser->custom_msg) - parser->custom_msg++; - } - keywords = parser->keywords; /* scan keywords and count the number of positional-only parameters */ for (i = 0; keywords[i] && !*keywords[i]; i++) { @@ -1938,60 +1925,74 @@ parser_init(struct _PyArg_Parser *parser) } len = i; - min = max = INT_MAX; format = parser->format; - for (i = 0; i < len; i++) { - if (*format == '|') { - if (min != INT_MAX) { - PyErr_SetString(PyExc_SystemError, - "Invalid format string (| specified twice)"); - return 0; + if (format) { + /* grab the function name or custom error msg first (mutually exclusive) */ + parser->fname = strchr(parser->format, ':'); + if (parser->fname) { + parser->fname++; + parser->custom_msg = NULL; + } + else { + parser->custom_msg = strchr(parser->format,';'); + if (parser->custom_msg) + parser->custom_msg++; + } + + min = max = INT_MAX; + for (i = 0; i < len; i++) { + if (*format == '|') { + if (min != INT_MAX) { + PyErr_SetString(PyExc_SystemError, + "Invalid format string (| specified twice)"); + return 0; + } + if (max != INT_MAX) { + PyErr_SetString(PyExc_SystemError, + "Invalid format string ($ before |)"); + return 0; + } + min = i; + format++; } - if (max != INT_MAX) { - PyErr_SetString(PyExc_SystemError, - "Invalid format string ($ before |)"); - return 0; + if (*format == '$') { + if (max != INT_MAX) { + PyErr_SetString(PyExc_SystemError, + "Invalid format string ($ specified twice)"); + return 0; + } + if (i < parser->pos) { + PyErr_SetString(PyExc_SystemError, + "Empty parameter name after $"); + return 0; + } + max = i; + format++; } - min = i; - format++; - } - if (*format == '$') { - if (max != INT_MAX) { - PyErr_SetString(PyExc_SystemError, - "Invalid format string ($ specified twice)"); + if (IS_END_OF_FORMAT(*format)) { + PyErr_Format(PyExc_SystemError, + "More keyword list entries (%d) than " + "format specifiers (%d)", len, i); return 0; } - if (i < parser->pos) { - PyErr_SetString(PyExc_SystemError, - "Empty parameter name after $"); + + msg = skipitem(&format, NULL, 0); + if (msg) { + PyErr_Format(PyExc_SystemError, "%s: '%s'", msg, + format); return 0; } - max = i; - format++; - } - if (IS_END_OF_FORMAT(*format)) { - PyErr_Format(PyExc_SystemError, - "More keyword list entries (%d) than " - "format specifiers (%d)", len, i); - return 0; } + parser->min = Py_MIN(min, len); + parser->max = Py_MIN(max, len); - msg = skipitem(&format, NULL, 0); - if (msg) { - PyErr_Format(PyExc_SystemError, "%s: '%s'", msg, - format); + if (!IS_END_OF_FORMAT(*format) && (*format != '|') && (*format != '$')) { + PyErr_Format(PyExc_SystemError, + "more argument specifiers than keyword list entries " + "(remaining format:'%s')", format); return 0; } } - parser->min = Py_MIN(min, len); - parser->max = Py_MIN(max, len); - - if (!IS_END_OF_FORMAT(*format) && (*format != '|') && (*format != '$')) { - PyErr_Format(PyExc_SystemError, - "more argument specifiers than keyword list entries " - "(remaining format:'%s')", format); - return 0; - } nkw = len - parser->pos; kwtuple = PyTuple_New(nkw); @@ -2313,6 +2314,215 @@ vgetargskeywordsfast(PyObject *args, PyObject *keywords, } +#undef _PyArg_UnpackKeywords + +PyObject * const * +_PyArg_UnpackKeywords(PyObject *const *args, Py_ssize_t nargs, + PyObject *kwargs, PyObject *kwnames, + struct _PyArg_Parser *parser, + int minpos, int maxpos, int minkw, + PyObject **buf) +{ + PyObject *kwtuple; + PyObject *keyword; + int i, posonly, minposonly, maxargs; + int reqlimit = minkw ? maxpos + minkw : minpos; + Py_ssize_t nkwargs; + PyObject *current_arg; + PyObject * const *kwstack = NULL; + + assert(kwargs == NULL || PyDict_Check(kwargs)); + assert(kwargs == NULL || kwnames == NULL); + + if (parser == NULL) { + PyErr_BadInternalCall(); + return NULL; + } + + if (kwnames != NULL && !PyTuple_Check(kwnames)) { + PyErr_BadInternalCall(); + return NULL; + } + + if (args == NULL && nargs == 0) { + args = buf; + } + + if (!parser_init(parser)) { + return NULL; + } + + kwtuple = parser->kwtuple; + posonly = parser->pos; + minposonly = Py_MIN(posonly, minpos); + maxargs = posonly + (int)PyTuple_GET_SIZE(kwtuple); + + if (kwargs != NULL) { + nkwargs = PyDict_GET_SIZE(kwargs); + } + else if (kwnames != NULL) { + nkwargs = PyTuple_GET_SIZE(kwnames); + kwstack = args + nargs; + } + else { + nkwargs = 0; + } + if (nkwargs == 0 && minkw == 0 && minpos <= nargs && nargs <= maxpos) { + /* Fast path. */ + return args; + } + if (nargs + nkwargs > maxargs) { + /* Adding "keyword" (when nargs == 0) prevents producing wrong error + messages in some special cases (see bpo-31229). */ + PyErr_Format(PyExc_TypeError, + "%.200s%s takes at most %d %sargument%s (%zd given)", + (parser->fname == NULL) ? "function" : parser->fname, + (parser->fname == NULL) ? "" : "()", + maxargs, + (nargs == 0) ? "keyword " : "", + (maxargs == 1) ? "" : "s", + nargs + nkwargs); + return NULL; + } + if (nargs > maxpos) { + if (maxpos == 0) { + PyErr_Format(PyExc_TypeError, + "%.200s%s takes no positional arguments", + (parser->fname == NULL) ? "function" : parser->fname, + (parser->fname == NULL) ? "" : "()"); + } + else { + PyErr_Format(PyExc_TypeError, + "%.200s%s takes %s %d positional argument%s (%zd given)", + (parser->fname == NULL) ? "function" : parser->fname, + (parser->fname == NULL) ? "" : "()", + (minpos < maxpos) ? "at most" : "exactly", + maxpos, + (maxpos == 1) ? "" : "s", + nargs); + } + return NULL; + } + if (nargs < minposonly) { + PyErr_Format(PyExc_TypeError, + "%.200s%s takes %s %d positional argument%s" + " (%zd given)", + (parser->fname == NULL) ? "function" : parser->fname, + (parser->fname == NULL) ? "" : "()", + minposonly < maxpos ? "at least" : "exactly", + minposonly, + minposonly == 1 ? "" : "s", + nargs); + return NULL; + } + + /* copy tuple args */ + for (i = 0; i < nargs; i++) { + buf[i] = args[i]; + } + + /* copy keyword args using kwtuple to drive process */ + for (i = Py_MAX(nargs, posonly); i < maxargs; i++) { + if (nkwargs) { + keyword = PyTuple_GET_ITEM(kwtuple, i - posonly); + if (kwargs != NULL) { + current_arg = PyDict_GetItemWithError(kwargs, keyword); + if (!current_arg && PyErr_Occurred()) { + return NULL; + } + } + else { + current_arg = find_keyword(kwnames, kwstack, keyword); + } + } + else if (i >= reqlimit) { + break; + } + else { + current_arg = NULL; + } + + buf[i] = current_arg; + + if (current_arg) { + --nkwargs; + } + else if (i < minpos || (maxpos <= i && i < reqlimit)) { + /* Less arguments than required */ + keyword = PyTuple_GET_ITEM(kwtuple, i - posonly); + PyErr_Format(PyExc_TypeError, "%.200s%s missing required " + "argument '%U' (pos %d)", + (parser->fname == NULL) ? "function" : parser->fname, + (parser->fname == NULL) ? "" : "()", + keyword, i+1); + return NULL; + } + } + + if (nkwargs > 0) { + Py_ssize_t j; + /* make sure there are no arguments given by name and position */ + for (i = posonly; i < nargs; i++) { + keyword = PyTuple_GET_ITEM(kwtuple, i - posonly); + if (kwargs != NULL) { + current_arg = PyDict_GetItemWithError(kwargs, keyword); + if (!current_arg && PyErr_Occurred()) { + return NULL; + } + } + else { + current_arg = find_keyword(kwnames, kwstack, keyword); + } + if (current_arg) { + /* arg present in tuple and in dict */ + PyErr_Format(PyExc_TypeError, + "argument for %.200s%s given by name ('%U') " + "and position (%d)", + (parser->fname == NULL) ? "function" : parser->fname, + (parser->fname == NULL) ? "" : "()", + keyword, i+1); + return NULL; + } + } + /* make sure there are no extraneous keyword arguments */ + j = 0; + while (1) { + int match; + if (kwargs != NULL) { + if (!PyDict_Next(kwargs, &j, &keyword, NULL)) + break; + } + else { + if (j >= PyTuple_GET_SIZE(kwnames)) + break; + keyword = PyTuple_GET_ITEM(kwnames, j); + j++; + } + + if (!PyUnicode_Check(keyword)) { + PyErr_SetString(PyExc_TypeError, + "keywords must be strings"); + return NULL; + } + match = PySequence_Contains(kwtuple, keyword); + if (match <= 0) { + if (!match) { + PyErr_Format(PyExc_TypeError, + "'%U' is an invalid keyword " + "argument for %.200s%s", + keyword, + (parser->fname == NULL) ? "this function" : parser->fname, + (parser->fname == NULL) ? "" : "()"); + } + return NULL; + } + } + } + + return buf; +} + + static const char * skipitem(const char **p_format, va_list *p_va, int flags) { diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index 0e7ce965b0f1..cb2ded4649dc 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -645,10 +645,21 @@ def output_templates(self, f): default_return_converter = (not f.return_converter or f.return_converter.type == 'PyObject *') - positional = parameters and parameters[-1].is_positional_only() - new_or_init = f.kind in (METHOD_NEW, METHOD_INIT) + pos_only = min_pos = max_pos = min_kw_only = 0 + for i, p in enumerate(parameters, 1): + if p.is_keyword_only(): + assert not p.is_positional_only() + if not p.is_optional(): + min_kw_only = i - max_pos + else: + max_pos = i + if p.is_positional_only(): + pos_only = i + if not p.is_optional(): + min_pos = i + meth_o = (len(parameters) == 1 and parameters[0].is_positional_only() and not converters[0].is_optional() and @@ -712,16 +723,19 @@ def output_templates(self, f): # parser_body_fields remembers the fields passed in to the # previous call to parser_body. this is used for an awful hack. parser_body_fields = () - def parser_body(prototype, *fields): - nonlocal parser_body_fields + parser_body_declarations = '' + def parser_body(prototype, *fields, declarations=''): + nonlocal parser_body_fields, parser_body_declarations add, output = text_accumulator() add(prototype) parser_body_fields = fields + parser_body_declarations = declarations fields = list(fields) fields.insert(0, normalize_snippet(""" {{ {return_value_declaration} + {parser_declarations} {declarations} {initializers} """) + "\n") @@ -739,13 +753,7 @@ def parser_body(prototype, *fields): for field in fields: add('\n') add(field) - return output() - - def insert_keywords(s): - return linear_format(s, declarations= - 'static const char * const _keywords[] = {{{keywords}, NULL}};\n' - 'static _PyArg_Parser _parser = {{"{format_units}:{name}", _keywords, 0}};\n' - '{declarations}') + return linear_format(output(), parser_declarations=declarations) if not parameters: # no parameters, METH_NOARGS @@ -818,7 +826,7 @@ def insert_keywords(s): parser_definition = parser_body(parser_prototype, ' {option_group_parsing}') - elif positional: + elif pos_only == len(parameters): if not new_or_init: # positional-only, but no option groups # we only need one call to _PyArg_ParseStack @@ -836,15 +844,19 @@ def insert_keywords(s): nargs = 'PyTuple_GET_SIZE(args)' argname_fmt = 'PyTuple_GET_ITEM(args, %d)' - parser_code = [] + parser_code = [normalize_snippet(""" + if (!_PyArg_CheckPositional("{name}", %s, %d, %d)) {{ + goto exit; + }} + """ % (nargs, min_pos, max_pos), indent=4)] has_optional = False - for i, converter in enumerate(converters): - parsearg = converter.parse_arg(argname_fmt % i, i + 1) + for i, p in enumerate(parameters): + parsearg = p.converter.parse_arg(argname_fmt % i, i + 1) if parsearg is None: - #print('Cannot convert %s %r for %s' % (converter.__class__.__name__, converter.format_unit, converter.name), file=sys.stderr) + #print('Cannot convert %s %r for %s' % (p.converter.__class__.__name__, p.converter.format_unit, p.converter.name), file=sys.stderr) parser_code = None break - if has_optional or converter.default is not unspecified: + if has_optional or p.is_optional(): has_optional = True parser_code.append(normalize_snippet(""" if (%s < %d) {{ @@ -854,11 +866,6 @@ def insert_keywords(s): parser_code.append(normalize_snippet(parsearg, indent=4)) if parser_code is not None: - parser_code.insert(0, normalize_snippet(""" - if (!_PyArg_CheckPositional("{name}", %s, {unpack_min}, {unpack_max})) {{ - goto exit; - }} - """ % nargs, indent=4)) if has_optional: parser_code.append("skip_optional:") else: @@ -878,33 +885,122 @@ def insert_keywords(s): """, indent=4)] parser_definition = parser_body(parser_prototype, *parser_code) - elif not new_or_init: - flags = "METH_FASTCALL|METH_KEYWORDS" - - parser_prototype = parser_prototype_fastcall_keywords - - body = normalize_snippet(""" - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - {parse_arguments})) {{ - goto exit; - }} - """, indent=4) - parser_definition = parser_body(parser_prototype, body) - parser_definition = insert_keywords(parser_definition) else: - # positional-or-keyword arguments - flags = "METH_VARARGS|METH_KEYWORDS" + has_optional_kw = (max(pos_only, min_pos) + min_kw_only < len(converters)) + if not new_or_init: + flags = "METH_FASTCALL|METH_KEYWORDS" + parser_prototype = parser_prototype_fastcall_keywords + argname_fmt = 'args[%d]' + declarations = normalize_snippet(""" + static const char * const _keywords[] = {{{keywords}, NULL}}; + static _PyArg_Parser _parser = {{NULL, _keywords, "{name}", 0}}; + PyObject *argsbuf[%s]; + """ % len(converters)) + if has_optional_kw: + declarations += "\nPy_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - %d;" % (min_pos + min_kw_only) + parser_code = [normalize_snippet(""" + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, %d, %d, %d, argsbuf); + if (!args) {{ + goto exit; + }} + """ % (min_pos, max_pos, min_kw_only), indent=4)] + else: + # positional-or-keyword arguments + flags = "METH_VARARGS|METH_KEYWORDS" + parser_prototype = parser_prototype_keyword + argname_fmt = 'fastargs[%d]' + declarations = normalize_snippet(""" + static const char * const _keywords[] = {{{keywords}, NULL}}; + static _PyArg_Parser _parser = {{NULL, _keywords, "{name}", 0}}; + PyObject *argsbuf[%s]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + """ % len(converters)) + if has_optional_kw: + declarations += "\nPy_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - %d;" % (min_pos + min_kw_only) + parser_code = [normalize_snippet(""" + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, %d, %d, %d, argsbuf); + if (!fastargs) {{ + goto exit; + }} + """ % (min_pos, max_pos, min_kw_only), indent=4)] - parser_prototype = parser_prototype_keyword + add_label = None + for i, p in enumerate(parameters): + parsearg = p.converter.parse_arg(argname_fmt % i, i + 1) + if parsearg is None: + #print('Cannot convert %s %r for %s' % (p.converter.__class__.__name__, p.converter.format_unit, p.converter.name), file=sys.stderr) + parser_code = None + break + if add_label and (i == pos_only or i == max_pos): + parser_code.append("%s:" % add_label) + add_label = None + if not p.is_optional(): + parser_code.append(normalize_snippet(parsearg, indent=4)) + elif i < pos_only: + add_label = 'skip_optional_posonly' + parser_code.append(normalize_snippet(""" + if (nargs < %d) {{ + goto %s; + }} + """ % (i + 1, add_label), indent=4)) + if has_optional_kw: + parser_code.append(normalize_snippet(""" + noptargs--; + """, indent=4)) + parser_code.append(normalize_snippet(parsearg, indent=4)) + else: + if i < max_pos: + label = 'skip_optional_pos' + first_opt = max(min_pos, pos_only) + else: + label = 'skip_optional_kwonly' + first_opt = max_pos + min_kw_only + if i == first_opt: + add_label = label + parser_code.append(normalize_snippet(""" + if (!noptargs) {{ + goto %s; + }} + """ % add_label, indent=4)) + if i + 1 == len(parameters): + parser_code.append(normalize_snippet(parsearg, indent=4)) + else: + add_label = label + parser_code.append(normalize_snippet(""" + if (%s) {{ + """ % (argname_fmt % i), indent=4)) + parser_code.append(normalize_snippet(parsearg, indent=8)) + parser_code.append(normalize_snippet(""" + if (!--noptargs) {{ + goto %s; + }} + }} + """ % add_label, indent=4)) - body = normalize_snippet(""" - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - {parse_arguments})) {{ - goto exit; - }} - """, indent=4) - parser_definition = parser_body(parser_prototype, body) - parser_definition = insert_keywords(parser_definition) + if parser_code is not None: + if add_label: + parser_code.append("%s:" % add_label) + else: + declarations = ( + 'static const char * const _keywords[] = {{{keywords}, NULL}};\n' + 'static _PyArg_Parser _parser = {{"{format_units}:{name}", _keywords, 0}};') + if not new_or_init: + parser_code = [normalize_snippet(""" + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, + {parse_arguments})) {{ + goto exit; + }} + """, indent=4)] + else: + parser_code = [normalize_snippet(""" + if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, + {parse_arguments})) {{ + goto exit; + }} + """, indent=4)] + parser_definition = parser_body(parser_prototype, *parser_code, + declarations=declarations) if new_or_init: @@ -938,9 +1034,8 @@ def insert_keywords(s): }} """, indent=4)) - parser_definition = parser_body(parser_prototype, *fields) - if parses_keywords: - parser_definition = insert_keywords(parser_definition) + parser_definition = parser_body(parser_prototype, *fields, + declarations=parser_body_declarations) if flags in ('METH_NOARGS', 'METH_O', 'METH_VARARGS'): @@ -2176,6 +2271,9 @@ def is_keyword_only(self): def is_positional_only(self): return self.kind == inspect.Parameter.POSITIONAL_ONLY + def is_optional(self): + return (self.default is not unspecified) + def copy(self, **overrides): kwargs = { 'name': self.name, 'kind': self.kind, 'default':self.default, From webhook-mailer at python.org Thu Mar 14 04:47:44 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Thu, 14 Mar 2019 08:47:44 -0000 Subject: [Python-checkins] [3.7] bpo-36254: Fix invalid uses of %d in format strings in C. (GH-12264). (GH-12322) Message-ID: https://github.com/python/cpython/commit/783bed4c8daf65a2893d94761ea44af4e3718f4f commit: 783bed4c8daf65a2893d94761ea44af4e3718f4f branch: 3.7 author: Serhiy Storchaka committer: GitHub date: 2019-03-14T10:47:27+02:00 summary: [3.7] bpo-36254: Fix invalid uses of %d in format strings in C. (GH-12264). (GH-12322) (cherry picked from commit d53fe5f407ff4b529628b01a1bcbf21a6aad5c3a) Co-authored-by: Serhiy Storchaka files: M Modules/_ctypes/callbacks.c M Modules/_ctypes/callproc.c M Modules/_ctypes/malloc_closure.c M Modules/_io/winconsoleio.c M Modules/_localemodule.c M Modules/_lzmamodule.c M Modules/_multiprocessing/semaphore.c M Modules/_ssl.c M Modules/binascii.c M Modules/socketmodule.c M Objects/bytesobject.c M Objects/odictobject.c M Objects/structseq.c M PC/launcher.c M Python/dynload_win.c M Python/getargs.c M Python/hamt.c M Python/pyarena.c diff --git a/Modules/_ctypes/callbacks.c b/Modules/_ctypes/callbacks.c index ec9f44336e0e..5a8303fba290 100644 --- a/Modules/_ctypes/callbacks.c +++ b/Modules/_ctypes/callbacks.c @@ -160,14 +160,14 @@ static void _CallPythonObject(void *mem, if (cnv) dict = PyType_stgdict(cnv); else { - PrintError("Getting argument converter %d\n", i); + PrintError("Getting argument converter %zd\n", i); goto Done; } if (dict && dict->getfunc && !_ctypes_simple_instance(cnv)) { PyObject *v = dict->getfunc(*pArgs, dict->size); if (!v) { - PrintError("create argument %d:\n", i); + PrintError("create argument %zd:\n", i); Py_DECREF(cnv); goto Done; } @@ -181,14 +181,14 @@ static void _CallPythonObject(void *mem, /* Hm, shouldn't we use PyCData_AtAddress() or something like that instead? */ CDataObject *obj = (CDataObject *)_PyObject_CallNoArg(cnv); if (!obj) { - PrintError("create argument %d:\n", i); + PrintError("create argument %zd:\n", i); Py_DECREF(cnv); goto Done; } if (!CDataObject_Check(obj)) { Py_DECREF(obj); Py_DECREF(cnv); - PrintError("unexpected result of create argument %d:\n", i); + PrintError("unexpected result of create argument %zd:\n", i); goto Done; } memcpy(obj->b_ptr, *pArgs, dict->size); @@ -199,7 +199,7 @@ static void _CallPythonObject(void *mem, } else { PyErr_SetString(PyExc_TypeError, "cannot build parameter"); - PrintError("Parsing argument %d\n", i); + PrintError("Parsing argument %zd\n", i); Py_DECREF(cnv); goto Done; } diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index e971388f69b9..ec854c864cc2 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -1125,20 +1125,20 @@ PyObject *_ctypes_callproc(PPROC pProc, converter = PyTuple_GET_ITEM(argtypes, i); v = PyObject_CallFunctionObjArgs(converter, arg, NULL); if (v == NULL) { - _ctypes_extend_error(PyExc_ArgError, "argument %d: ", i+1); + _ctypes_extend_error(PyExc_ArgError, "argument %zd: ", i+1); goto cleanup; } err = ConvParam(v, i+1, pa); Py_DECREF(v); if (-1 == err) { - _ctypes_extend_error(PyExc_ArgError, "argument %d: ", i+1); + _ctypes_extend_error(PyExc_ArgError, "argument %zd: ", i+1); goto cleanup; } } else { err = ConvParam(arg, i+1, pa); if (-1 == err) { - _ctypes_extend_error(PyExc_ArgError, "argument %d: ", i+1); + _ctypes_extend_error(PyExc_ArgError, "argument %zd: ", i+1); goto cleanup; /* leaking ? */ } } diff --git a/Modules/_ctypes/malloc_closure.c b/Modules/_ctypes/malloc_closure.c index 248c6a67022b..8ad76497c7b3 100644 --- a/Modules/_ctypes/malloc_closure.c +++ b/Modules/_ctypes/malloc_closure.c @@ -76,7 +76,7 @@ static void more_core(void) #ifdef MALLOC_CLOSURE_DEBUG printf("block at %p allocated (%d bytes), %d ITEMs\n", - item, count * sizeof(ITEM), count); + item, count * (int)sizeof(ITEM), count); #endif /* put them into the free list */ for (i = 0; i < count; ++i) { diff --git a/Modules/_io/winconsoleio.c b/Modules/_io/winconsoleio.c index c11c1e09f4c3..bf5b10b49474 100644 --- a/Modules/_io/winconsoleio.c +++ b/Modules/_io/winconsoleio.c @@ -724,7 +724,7 @@ readinto(winconsoleio *self, char *buf, Py_ssize_t len) if (u8n) { PyErr_Format(PyExc_SystemError, - "Buffer had room for %d bytes but %d bytes required", + "Buffer had room for %zd bytes but %u bytes required", len, u8n); return -1; } diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c index 8efda35dd4e5..f94689811850 100644 --- a/Modules/_localemodule.c +++ b/Modules/_localemodule.c @@ -394,7 +394,7 @@ PyLocale_getdefaultlocale(PyObject* self) char encoding[100]; char locale[100]; - PyOS_snprintf(encoding, sizeof(encoding), "cp%d", GetACP()); + PyOS_snprintf(encoding, sizeof(encoding), "cp%u", GetACP()); if (GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SISO639LANGNAME, diff --git a/Modules/_lzmamodule.c b/Modules/_lzmamodule.c index bb7a7ec50ce0..f93c6c668e5d 100644 --- a/Modules/_lzmamodule.c +++ b/Modules/_lzmamodule.c @@ -219,7 +219,7 @@ parse_filter_spec_lzma(PyObject *spec) if (lzma_lzma_preset(options, preset)) { PyMem_Free(options); - PyErr_Format(Error, "Invalid compression preset: %d", preset); + PyErr_Format(Error, "Invalid compression preset: %u", preset); return NULL; } @@ -630,7 +630,7 @@ Compressor_init_alone(lzma_stream *lzs, uint32_t preset, PyObject *filterspecs) lzma_options_lzma options; if (lzma_lzma_preset(&options, preset)) { - PyErr_Format(Error, "Invalid compression preset: %d", preset); + PyErr_Format(Error, "Invalid compression preset: %u", preset); return -1; } lzret = lzma_alone_encoder(lzs, &options); diff --git a/Modules/_multiprocessing/semaphore.c b/Modules/_multiprocessing/semaphore.c index 0cc46b53222e..0f3e33d91e9d 100644 --- a/Modules/_multiprocessing/semaphore.c +++ b/Modules/_multiprocessing/semaphore.c @@ -141,7 +141,7 @@ semlock_acquire(SemLockObject *self, PyObject *args, PyObject *kwds) default: PyErr_Format(PyExc_RuntimeError, "WaitForSingleObject() or " "WaitForMultipleObjects() gave unrecognized " - "value %d", res); + "value %u", res); return NULL; } } diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 9baec8a9bc84..7076fddf8dd4 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -3348,7 +3348,7 @@ _ssl__SSLContext__set_alpn_protocols_impl(PySSLContext *self, #if HAVE_ALPN if ((size_t)protos->len > UINT_MAX) { PyErr_Format(PyExc_OverflowError, - "protocols longer than %d bytes", UINT_MAX); + "protocols longer than %u bytes", UINT_MAX); return NULL; } diff --git a/Modules/binascii.c b/Modules/binascii.c index d0d3f7d34b8f..c13bed6bbfdc 100644 --- a/Modules/binascii.c +++ b/Modules/binascii.c @@ -520,7 +520,7 @@ binascii_a2b_base64_impl(PyObject *module, Py_buffer *data) */ PyErr_Format(Error, "Invalid base64-encoded string: " - "number of data characters (%d) cannot be 1 more " + "number of data characters (%zd) cannot be 1 more " "than a multiple of 4", (bin_data - bin_data_start) / 3 * 4 + 1); } else { diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 988471e15fbe..65385e8974cf 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -4102,7 +4102,7 @@ sock_sendto(PySocketSockObject *s, PyObject *args) break; default: PyErr_Format(PyExc_TypeError, - "sendto() takes 2 or 3 arguments (%d given)", + "sendto() takes 2 or 3 arguments (%zd given)", arglen); return NULL; } @@ -4642,7 +4642,7 @@ sock_ioctl(PySocketSockObject *s, PyObject *arg) return PyLong_FromUnsignedLong(recv); } #endif default: - PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd); + PyErr_Format(PyExc_ValueError, "invalid ioctl command %lu", cmd); return NULL; } } diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index 172c7f38b9e2..a5319da48daa 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -1209,7 +1209,7 @@ PyObject *_PyBytes_DecodeEscape(const char *s, if (!errors || strcmp(errors, "strict") == 0) { PyErr_Format(PyExc_ValueError, - "invalid \\x escape at position %d", + "invalid \\x escape at position %zd", s - 2 - (end - len)); goto failed; } diff --git a/Objects/odictobject.c b/Objects/odictobject.c index 7487bd960764..88afc61f6071 100644 --- a/Objects/odictobject.c +++ b/Objects/odictobject.c @@ -1538,7 +1538,7 @@ odict_init(PyObject *self, PyObject *args, PyObject *kwds) if (len == -1) return -1; if (len > 1) { - const char *msg = "expected at most 1 arguments, got %d"; + const char *msg = "expected at most 1 arguments, got %zd"; PyErr_Format(PyExc_TypeError, msg, len); return -1; } @@ -2211,7 +2211,7 @@ mutablemapping_update(PyObject *self, PyObject *args, PyObject *kwargs) assert(args == NULL || PyTuple_Check(args)); len = (args != NULL) ? PyTuple_GET_SIZE(args) : 0; if (len > 1) { - const char *msg = "update() takes at most 1 positional argument (%d given)"; + const char *msg = "update() takes at most 1 positional argument (%zd given)"; PyErr_Format(PyExc_TypeError, msg, len); return NULL; } diff --git a/Objects/structseq.c b/Objects/structseq.c index 1b71f724a66b..900aaba7c150 100644 --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -194,7 +194,7 @@ structseq_repr(PyStructSequence *obj) cname = typ->tp_members[i].name; if (cname == NULL) { - PyErr_Format(PyExc_SystemError, "In structseq_repr(), member %d name is NULL" + PyErr_Format(PyExc_SystemError, "In structseq_repr(), member %zd name is NULL" " for type %.500s", i, typ->tp_name); return NULL; } diff --git a/PC/launcher.c b/PC/launcher.c index a4e678115f34..0f5003a8370e 100644 --- a/PC/launcher.c +++ b/PC/launcher.c @@ -718,7 +718,7 @@ invoke_child(wchar_t * executable, wchar_t * suffix, wchar_t * cmdline) } child_command = calloc(child_command_size, sizeof(wchar_t)); if (child_command == NULL) - error(RC_CREATE_PROCESS, L"unable to allocate %d bytes for child command.", + error(RC_CREATE_PROCESS, L"unable to allocate %zd bytes for child command.", child_command_size); if (no_suffix) _snwprintf_s(child_command, child_command_size, @@ -1189,7 +1189,7 @@ maybe_handle_shebang(wchar_t ** argv, wchar_t * cmdline) if (rc == 0) { read = fread(buffer, sizeof(char), BUFSIZE, fp); - debug(L"maybe_handle_shebang: read %d bytes\n", read); + debug(L"maybe_handle_shebang: read %zd bytes\n", read); fclose(fp); if ((read >= 4) && (buffer[3] == '\n') && (buffer[2] == '\r')) { @@ -1209,7 +1209,7 @@ maybe_handle_shebang(wchar_t ** argv, wchar_t * cmdline) bom = BOMs; /* points to UTF-8 entry - the default */ } else { - debug(L"maybe_handle_shebang: BOM found, code page %d\n", + debug(L"maybe_handle_shebang: BOM found, code page %u\n", bom->code_page); start = &buffer[bom->length]; } diff --git a/Python/dynload_win.c b/Python/dynload_win.c index 0fdf77f55280..51325be658af 100644 --- a/Python/dynload_win.c +++ b/Python/dynload_win.c @@ -254,7 +254,7 @@ dl_funcptr _PyImport_FindSharedFuncptrWindows(const char *prefix, This should not happen if called correctly. */ if (theLength == 0) { message = PyUnicode_FromFormat( - "DLL load failed with error code %d", + "DLL load failed with error code %u", errorCode); } else { /* For some reason a \r\n diff --git a/Python/getargs.c b/Python/getargs.c index 992cb216c257..73e47f84561b 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -371,14 +371,14 @@ vgetargs1_impl(PyObject *compat_args, PyObject *const *stack, Py_ssize_t nargs, if (nargs < min || max < nargs) { if (message == NULL) PyErr_Format(PyExc_TypeError, - "%.150s%s takes %s %d argument%s (%ld given)", + "%.150s%s takes %s %d argument%s (%zd given)", fname==NULL ? "function" : fname, fname==NULL ? "" : "()", min==max ? "exactly" : nargs < min ? "at least" : "at most", nargs < min ? min : max, (nargs < min ? min : max) == 1 ? "" : "s", - Py_SAFE_DOWNCAST(nargs, Py_ssize_t, long)); + nargs); else PyErr_SetString(PyExc_TypeError, message); return cleanreturn(0, &freelist); @@ -1718,7 +1718,7 @@ vgetargskeywords(PyObject *args, PyObject *kwargs, const char *format, else { PyErr_Format(PyExc_TypeError, "%.200s%s takes %s %d positional arguments" - " (%d given)", + " (%zd given)", (fname == NULL) ? "function" : fname, (fname == NULL) ? "" : "()", (min != INT_MAX) ? "at most" : "exactly", @@ -1797,7 +1797,7 @@ vgetargskeywords(PyObject *args, PyObject *kwargs, const char *format, if (skip) { PyErr_Format(PyExc_TypeError, "%.200s%s takes %s %d positional arguments" - " (%d given)", + " (%zd given)", (fname == NULL) ? "function" : fname, (fname == NULL) ? "" : "()", (Py_MIN(pos, min) < i) ? "at least" : "exactly", @@ -2103,7 +2103,7 @@ vgetargskeywordsfast_impl(PyObject *const *args, Py_ssize_t nargs, } else { PyErr_Format(PyExc_TypeError, - "%.200s%s takes %s %d positional arguments (%d given)", + "%.200s%s takes %s %d positional arguments (%zd given)", (parser->fname == NULL) ? "function" : parser->fname, (parser->fname == NULL) ? "" : "()", (parser->min != INT_MAX) ? "at most" : "exactly", @@ -2152,7 +2152,7 @@ vgetargskeywordsfast_impl(PyObject *const *args, Py_ssize_t nargs, Py_ssize_t min = Py_MIN(pos, parser->min); PyErr_Format(PyExc_TypeError, "%.200s%s takes %s %d positional arguments" - " (%d given)", + " (%zd given)", (parser->fname == NULL) ? "function" : parser->fname, (parser->fname == NULL) ? "" : "()", min < parser->max ? "at least" : "exactly", diff --git a/Python/hamt.c b/Python/hamt.c index 562f777ea0bf..71a5ec87c585 100644 --- a/Python/hamt.c +++ b/Python/hamt.c @@ -2003,7 +2003,7 @@ hamt_node_array_dump(PyHamtNode_Array *node, goto error; } - if (_hamt_dump_format(writer, "%d::\n", i)) { + if (_hamt_dump_format(writer, "%zd::\n", i)) { goto error; } diff --git a/Python/pyarena.c b/Python/pyarena.c index 103603fcdff3..d2aa8b8c3264 100644 --- a/Python/pyarena.c +++ b/Python/pyarena.c @@ -160,7 +160,7 @@ PyArena_Free(PyArena *arena) #if defined(Py_DEBUG) /* fprintf(stderr, - "alloc=%d size=%d blocks=%d block_size=%d big=%d objects=%d\n", + "alloc=%zu size=%zu blocks=%zu block_size=%zu big=%zu objects=%zu\n", arena->total_allocs, arena->total_size, arena->total_blocks, arena->total_block_size, arena->total_big_blocks, PyList_Size(arena->a_objects)); From webhook-mailer at python.org Thu Mar 14 05:25:31 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 14 Mar 2019 09:25:31 -0000 Subject: [Python-checkins] Simplify overlap() formula for case where variances are equal (GH-12323) Message-ID: https://github.com/python/cpython/commit/41f0b78cbf204649bbae71662a115425c58f048d commit: 41f0b78cbf204649bbae71662a115425c58f048d branch: master author: Raymond Hettinger committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-14T02:25:26-07:00 summary: Simplify overlap() formula for case where variances are equal (GH-12323) files: M Lib/statistics.py diff --git a/Lib/statistics.py b/Lib/statistics.py index 97f154373dc0..8d79eed6b1aa 100644 --- a/Lib/statistics.py +++ b/Lib/statistics.py @@ -773,7 +773,7 @@ def overlap(self, other): dv = Y_var - X_var dm = fabs(Y.mu - X.mu) if not dv: - return 2.0 * NormalDist(dm, 2.0 * X.sigma).cdf(0) + return 1.0 - erf(dm / (2.0 * X.sigma * sqrt(2.0))) a = X.mu * Y_var - Y.mu * X_var b = X.sigma * Y.sigma * sqrt(dm**2.0 + dv * log(Y_var / X_var)) x1 = (a + b) / dv From webhook-mailer at python.org Thu Mar 14 05:54:14 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Thu, 14 Mar 2019 09:54:14 -0000 Subject: [Python-checkins] bpo-30040: update news entry (GH-12324) Message-ID: https://github.com/python/cpython/commit/3fe7fa316f74ed630fbbcdf54564f15cda7cb045 commit: 3fe7fa316f74ed630fbbcdf54564f15cda7cb045 branch: master author: Inada Naoki committer: GitHub date: 2019-03-14T18:54:09+09:00 summary: bpo-30040: update news entry (GH-12324) This optimization is not only for space, but also for speed. files: M Misc/NEWS.d/next/Core and Builtins/2019-03-11-22-30-56.bpo-30040.W9z8X7.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-11-22-30-56.bpo-30040.W9z8X7.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-11-22-30-56.bpo-30040.W9z8X7.rst index eacba679d5a3..0975dba1f37e 100644 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-11-22-30-56.bpo-30040.W9z8X7.rst +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-11-22-30-56.bpo-30040.W9z8X7.rst @@ -1,2 +1,3 @@ New empty dict uses fewer memory for now. It used more memory than empty -dict created by ``dict.clear()``. Patch by Inada Naoki. +dict created by ``dict.clear()``. And empty dict creation and deletion +is about 2x faster. Patch by Inada Naoki. From webhook-mailer at python.org Thu Mar 14 11:11:08 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 14 Mar 2019 15:11:08 -0000 Subject: [Python-checkins] [2.7] bpo-36212: Fix two possible reference leaks in the hotshot module (GH-12327) Message-ID: https://github.com/python/cpython/commit/2832ad53358e3fbc4bdc601b9f3fa04dd0deae46 commit: 2832ad53358e3fbc4bdc601b9f3fa04dd0deae46 branch: 2.7 author: stratakis committer: Victor Stinner date: 2019-03-14T16:10:58+01:00 summary: [2.7] bpo-36212: Fix two possible reference leaks in the hotshot module (GH-12327) Fix reference leaks in _hotshot.LogReaderType on PyTuple_New() failure. files: A Misc/NEWS.d/next/Library/2019-03-14-14-40-22.bpo-36212.IEgRI8.rst M Modules/_hotshot.c diff --git a/Misc/NEWS.d/next/Library/2019-03-14-14-40-22.bpo-36212.IEgRI8.rst b/Misc/NEWS.d/next/Library/2019-03-14-14-40-22.bpo-36212.IEgRI8.rst new file mode 100644 index 000000000000..b2d264234e4d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-14-14-40-22.bpo-36212.IEgRI8.rst @@ -0,0 +1 @@ +Fix two possible reference leaks in the hotshot module. diff --git a/Modules/_hotshot.c b/Modules/_hotshot.c index 33cd38da2ffe..4fc5cee479e5 100644 --- a/Modules/_hotshot.c +++ b/Modules/_hotshot.c @@ -482,8 +482,11 @@ logreader_tp_iternext(LogReaderObject *self) } else if (!err) { result = PyTuple_New(4); - if (result == NULL) + if (result == NULL) { + Py_XDECREF(s1); + Py_XDECREF(s2); return NULL; + } PyTuple_SET_ITEM(result, 0, PyInt_FromLong(what)); PyTuple_SET_ITEM(result, 2, PyInt_FromLong(fileno)); if (s1 == NULL) From webhook-mailer at python.org Thu Mar 14 11:23:08 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 14 Mar 2019 15:23:08 -0000 Subject: [Python-checkins] [2.7] bpo-36291: Fix a possible reference leak in the json module (GH-12330) Message-ID: https://github.com/python/cpython/commit/fb3336acfde3204fd01ce519ef24cc18a94dfa3f commit: fb3336acfde3204fd01ce519ef24cc18a94dfa3f branch: 2.7 author: stratakis committer: Victor Stinner date: 2019-03-14T16:22:46+01:00 summary: [2.7] bpo-36291: Fix a possible reference leak in the json module (GH-12330) Fix a reference leak in json if parsing a floating point number fails. If PyOS_string_to_double() fails in _match_number_str(): decrement numstr ref counter. files: A Misc/NEWS.d/next/Library/2019-03-14-15-54-46.bpo-36291.UalHXP.rst M Modules/_json.c diff --git a/Misc/NEWS.d/next/Library/2019-03-14-15-54-46.bpo-36291.UalHXP.rst b/Misc/NEWS.d/next/Library/2019-03-14-15-54-46.bpo-36291.UalHXP.rst new file mode 100644 index 000000000000..07d780cd7fd6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-14-15-54-46.bpo-36291.UalHXP.rst @@ -0,0 +1 @@ +Fix a possible reference leak in the json module. diff --git a/Modules/_json.c b/Modules/_json.c index 3a88882f0c98..050d37daa43c 100644 --- a/Modules/_json.c +++ b/Modules/_json.c @@ -1375,8 +1375,10 @@ _match_number_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t start, Py_ssiz else { double d = PyOS_string_to_double(PyString_AS_STRING(numstr), NULL, NULL); - if (d == -1.0 && PyErr_Occurred()) + if (d == -1.0 && PyErr_Occurred()) { + Py_DECREF(numstr); return NULL; + } rval = PyFloat_FromDouble(d); } } From webhook-mailer at python.org Thu Mar 14 11:35:45 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 14 Mar 2019 15:35:45 -0000 Subject: [Python-checkins] [2.7] bpo-36289: Fix a possible reference leak in the io module (GH-12329) Message-ID: https://github.com/python/cpython/commit/2dd6e079ae71f3723fbea2582ac080be06a6968f commit: 2dd6e079ae71f3723fbea2582ac080be06a6968f branch: 2.7 author: stratakis committer: Victor Stinner date: 2019-03-14T16:35:40+01:00 summary: [2.7] bpo-36289: Fix a possible reference leak in the io module (GH-12329) Fix a reference leak in _bufferedreader_read_all(): _io.BufferedIOMixin.read() leaks a reference on 'data' when it reads the whole file content but flush() fails. files: A Misc/NEWS.d/next/Library/2019-03-14-15-42-48.bpo-36289.wYKS47.rst M Modules/_io/bufferedio.c diff --git a/Misc/NEWS.d/next/Library/2019-03-14-15-42-48.bpo-36289.wYKS47.rst b/Misc/NEWS.d/next/Library/2019-03-14-15-42-48.bpo-36289.wYKS47.rst new file mode 100644 index 000000000000..8917bee727bf --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-14-15-42-48.bpo-36289.wYKS47.rst @@ -0,0 +1 @@ +Fix a possible reference leak in the io module. diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c index b8c98a4d0d04..d68f7d85b029 100644 --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -1363,6 +1363,7 @@ _bufferedreader_read_all(buffered *self) res = buffered_flush_and_rewind_unlocked(self); if (res == NULL) { Py_DECREF(chunks); + Py_XDECREF(data); return NULL; } Py_CLEAR(res); From webhook-mailer at python.org Thu Mar 14 12:12:09 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 14 Mar 2019 16:12:09 -0000 Subject: [Python-checkins] bpo-36262: Fix _Py_dg_strtod() memory leak (goto undfl) (GH-12276) (GH-12331) Message-ID: https://github.com/python/cpython/commit/9818360ed94b39c4605951077b73ae798cddbfb9 commit: 9818360ed94b39c4605951077b73ae798cddbfb9 branch: 3.7 author: Victor Stinner committer: GitHub date: 2019-03-14T17:12:01+01:00 summary: bpo-36262: Fix _Py_dg_strtod() memory leak (goto undfl) (GH-12276) (GH-12331) Fix an unlikely memory leak on conversion from string to float in the function _Py_dg_strtod() used by float(str), complex(str), pickle.load(), marshal.load(), etc. Fix an unlikely memory leak in _Py_dg_strtod() on "undfl:" label: rewrite memory management in this function to always release all memory before exiting the function. Initialize variables to NULL, and set them to NULL after calling Bfree() at the "cont:" label. Note: Bfree(NULL) is well defined: it does nothing. (cherry picked from commit 9776b0636ae39668d3ce1c006d4be01dad01bf9f) files: A Misc/NEWS.d/next/Core and Builtins/2019-03-11-15-37-33.bpo-36262.v3N6Fz.rst M Python/dtoa.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-11-15-37-33.bpo-36262.v3N6Fz.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-11-15-37-33.bpo-36262.v3N6Fz.rst new file mode 100644 index 000000000000..b5ccc95fd705 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-11-15-37-33.bpo-36262.v3N6Fz.rst @@ -0,0 +1,3 @@ +Fix an unlikely memory leak on conversion from string to float in the function +``_Py_dg_strtod()`` used by ``float(str)``, ``complex(str)``, +:func:`pickle.load`, :func:`marshal.load`, etc. diff --git a/Python/dtoa.c b/Python/dtoa.c index 01ca9b0b22fb..b7bb7acfb6c2 100644 --- a/Python/dtoa.c +++ b/Python/dtoa.c @@ -1441,8 +1441,9 @@ _Py_dg_strtod(const char *s00, char **se) ULong y, z, abs_exp; Long L; BCinfo bc; - Bigint *bb, *bb1, *bd, *bd0, *bs, *delta; + Bigint *bb = NULL, *bd = NULL, *bd0 = NULL, *bs = NULL, *delta = NULL; size_t ndigits, fraclen; + double result; dval(&rv) = 0.; @@ -1634,7 +1635,6 @@ _Py_dg_strtod(const char *s00, char **se) if (k > 9) { dval(&rv) = tens[k - 9] * dval(&rv) + z; } - bd0 = 0; if (nd <= DBL_DIG && Flt_Rounds == 1 ) { @@ -1804,14 +1804,11 @@ _Py_dg_strtod(const char *s00, char **se) bd = Balloc(bd0->k); if (bd == NULL) { - Bfree(bd0); goto failed_malloc; } Bcopy(bd, bd0); bb = sd2b(&rv, bc.scale, &bbe); /* srv = bb * 2^bbe */ if (bb == NULL) { - Bfree(bd); - Bfree(bd0); goto failed_malloc; } /* Record whether lsb of bb is odd, in case we need this @@ -1821,9 +1818,6 @@ _Py_dg_strtod(const char *s00, char **se) /* tdv = bd * 10**e; srv = bb * 2**bbe */ bs = i2b(1); if (bs == NULL) { - Bfree(bb); - Bfree(bd); - Bfree(bd0); goto failed_malloc; } @@ -1874,54 +1868,36 @@ _Py_dg_strtod(const char *s00, char **se) if (bb5 > 0) { bs = pow5mult(bs, bb5); if (bs == NULL) { - Bfree(bb); - Bfree(bd); - Bfree(bd0); goto failed_malloc; } - bb1 = mult(bs, bb); + Bigint *bb1 = mult(bs, bb); Bfree(bb); bb = bb1; if (bb == NULL) { - Bfree(bs); - Bfree(bd); - Bfree(bd0); goto failed_malloc; } } if (bb2 > 0) { bb = lshift(bb, bb2); if (bb == NULL) { - Bfree(bs); - Bfree(bd); - Bfree(bd0); goto failed_malloc; } } if (bd5 > 0) { bd = pow5mult(bd, bd5); if (bd == NULL) { - Bfree(bb); - Bfree(bs); - Bfree(bd0); goto failed_malloc; } } if (bd2 > 0) { bd = lshift(bd, bd2); if (bd == NULL) { - Bfree(bb); - Bfree(bs); - Bfree(bd0); goto failed_malloc; } } if (bs2 > 0) { bs = lshift(bs, bs2); if (bs == NULL) { - Bfree(bb); - Bfree(bd); - Bfree(bd0); goto failed_malloc; } } @@ -1932,10 +1908,6 @@ _Py_dg_strtod(const char *s00, char **se) delta = diff(bb, bd); if (delta == NULL) { - Bfree(bb); - Bfree(bs); - Bfree(bd); - Bfree(bd0); goto failed_malloc; } dsign = delta->sign; @@ -1989,10 +1961,6 @@ _Py_dg_strtod(const char *s00, char **se) } delta = lshift(delta,Log2P); if (delta == NULL) { - Bfree(bb); - Bfree(bs); - Bfree(bd); - Bfree(bd0); goto failed_malloc; } if (cmp(delta, bs) > 0) @@ -2094,11 +2062,6 @@ _Py_dg_strtod(const char *s00, char **se) if ((word0(&rv) & Exp_mask) >= Exp_msk1*(DBL_MAX_EXP+Bias-P)) { if (word0(&rv0) == Big0 && word1(&rv0) == Big1) { - Bfree(bb); - Bfree(bd); - Bfree(bs); - Bfree(bd0); - Bfree(delta); goto ovfl; } word0(&rv) = Big0; @@ -2140,16 +2103,11 @@ _Py_dg_strtod(const char *s00, char **se) } } cont: - Bfree(bb); - Bfree(bd); - Bfree(bs); - Bfree(delta); + Bfree(bb); bb = NULL; + Bfree(bd); bd = NULL; + Bfree(bs); bs = NULL; + Bfree(delta); delta = NULL; } - Bfree(bb); - Bfree(bd); - Bfree(bs); - Bfree(bd0); - Bfree(delta); if (bc.nd > nd) { error = bigcomp(&rv, s0, &bc); if (error) @@ -2163,24 +2121,37 @@ _Py_dg_strtod(const char *s00, char **se) } ret: - return sign ? -dval(&rv) : dval(&rv); + result = sign ? -dval(&rv) : dval(&rv); + goto done; parse_error: - return 0.0; + result = 0.0; + goto done; failed_malloc: errno = ENOMEM; - return -1.0; + result = -1.0; + goto done; undfl: - return sign ? -0.0 : 0.0; + result = sign ? -0.0 : 0.0; + goto done; ovfl: errno = ERANGE; /* Can't trust HUGE_VAL */ word0(&rv) = Exp_mask; word1(&rv) = 0; - return sign ? -dval(&rv) : dval(&rv); + result = sign ? -dval(&rv) : dval(&rv); + goto done; + + done: + Bfree(bb); + Bfree(bd); + Bfree(bs); + Bfree(bd0); + Bfree(delta); + return result; } From webhook-mailer at python.org Thu Mar 14 12:20:05 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 14 Mar 2019 16:20:05 -0000 Subject: [Python-checkins] bpo-36262: Fix _Py_dg_strtod() memory leak (goto undfl) (GH-12276) (GH-12332) Message-ID: https://github.com/python/cpython/commit/b14057877fd897eaee7bc6626682fc6092b6bbd2 commit: b14057877fd897eaee7bc6626682fc6092b6bbd2 branch: 2.7 author: Victor Stinner committer: GitHub date: 2019-03-14T17:19:52+01:00 summary: bpo-36262: Fix _Py_dg_strtod() memory leak (goto undfl) (GH-12276) (GH-12332) Fix an unlikely memory leak on conversion from string to float in the function _Py_dg_strtod() used by float(str), complex(str), pickle.load(), marshal.load(), etc. Fix an unlikely memory leak in _Py_dg_strtod() on "undfl:" label: rewrite memory management in this function to always release all memory before exiting the function. Initialize variables to NULL, and set them to NULL after calling Bfree() at the "cont:" label. Note: Bfree(NULL) is well defined: it does nothing. (cherry picked from commit 9776b0636ae39668d3ce1c006d4be01dad01bf9f) files: A Misc/NEWS.d/next/Core and Builtins/2019-03-11-15-37-33.bpo-36262.v3N6Fz.rst M Python/dtoa.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-11-15-37-33.bpo-36262.v3N6Fz.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-11-15-37-33.bpo-36262.v3N6Fz.rst new file mode 100644 index 000000000000..b5ccc95fd705 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-11-15-37-33.bpo-36262.v3N6Fz.rst @@ -0,0 +1,3 @@ +Fix an unlikely memory leak on conversion from string to float in the function +``_Py_dg_strtod()`` used by ``float(str)``, ``complex(str)``, +:func:`pickle.load`, :func:`marshal.load`, etc. diff --git a/Python/dtoa.c b/Python/dtoa.c index 73e23af010c1..25eb9a72d0a4 100644 --- a/Python/dtoa.c +++ b/Python/dtoa.c @@ -1514,8 +1514,9 @@ _Py_dg_strtod(const char *s00, char **se) ULong y, z, abs_exp; Long L; BCinfo bc; - Bigint *bb, *bb1, *bd, *bd0, *bs, *delta; + Bigint *bb = NULL, *bd = NULL, *bd0 = NULL, *bs = NULL, *delta = NULL; size_t ndigits, fraclen; + double result; dval(&rv) = 0.; @@ -1707,7 +1708,6 @@ _Py_dg_strtod(const char *s00, char **se) if (k > 9) { dval(&rv) = tens[k - 9] * dval(&rv) + z; } - bd0 = 0; if (nd <= DBL_DIG && Flt_Rounds == 1 ) { @@ -1877,14 +1877,11 @@ _Py_dg_strtod(const char *s00, char **se) bd = Balloc(bd0->k); if (bd == NULL) { - Bfree(bd0); goto failed_malloc; } Bcopy(bd, bd0); bb = sd2b(&rv, bc.scale, &bbe); /* srv = bb * 2^bbe */ if (bb == NULL) { - Bfree(bd); - Bfree(bd0); goto failed_malloc; } /* Record whether lsb of bb is odd, in case we need this @@ -1894,9 +1891,6 @@ _Py_dg_strtod(const char *s00, char **se) /* tdv = bd * 10**e; srv = bb * 2**bbe */ bs = i2b(1); if (bs == NULL) { - Bfree(bb); - Bfree(bd); - Bfree(bd0); goto failed_malloc; } @@ -1945,56 +1939,39 @@ _Py_dg_strtod(const char *s00, char **se) /* Scale bb, bd, bs by the appropriate powers of 2 and 5. */ if (bb5 > 0) { + Bigint *bb1; bs = pow5mult(bs, bb5); if (bs == NULL) { - Bfree(bb); - Bfree(bd); - Bfree(bd0); goto failed_malloc; } bb1 = mult(bs, bb); Bfree(bb); bb = bb1; if (bb == NULL) { - Bfree(bs); - Bfree(bd); - Bfree(bd0); goto failed_malloc; } } if (bb2 > 0) { bb = lshift(bb, bb2); if (bb == NULL) { - Bfree(bs); - Bfree(bd); - Bfree(bd0); goto failed_malloc; } } if (bd5 > 0) { bd = pow5mult(bd, bd5); if (bd == NULL) { - Bfree(bb); - Bfree(bs); - Bfree(bd0); goto failed_malloc; } } if (bd2 > 0) { bd = lshift(bd, bd2); if (bd == NULL) { - Bfree(bb); - Bfree(bs); - Bfree(bd0); goto failed_malloc; } } if (bs2 > 0) { bs = lshift(bs, bs2); if (bs == NULL) { - Bfree(bb); - Bfree(bd); - Bfree(bd0); goto failed_malloc; } } @@ -2005,10 +1982,6 @@ _Py_dg_strtod(const char *s00, char **se) delta = diff(bb, bd); if (delta == NULL) { - Bfree(bb); - Bfree(bs); - Bfree(bd); - Bfree(bd0); goto failed_malloc; } dsign = delta->sign; @@ -2062,10 +2035,6 @@ _Py_dg_strtod(const char *s00, char **se) } delta = lshift(delta,Log2P); if (delta == NULL) { - Bfree(bb); - Bfree(bs); - Bfree(bd); - Bfree(bd0); goto failed_malloc; } if (cmp(delta, bs) > 0) @@ -2167,11 +2136,6 @@ _Py_dg_strtod(const char *s00, char **se) if ((word0(&rv) & Exp_mask) >= Exp_msk1*(DBL_MAX_EXP+Bias-P)) { if (word0(&rv0) == Big0 && word1(&rv0) == Big1) { - Bfree(bb); - Bfree(bd); - Bfree(bs); - Bfree(bd0); - Bfree(delta); goto ovfl; } word0(&rv) = Big0; @@ -2213,16 +2177,11 @@ _Py_dg_strtod(const char *s00, char **se) } } cont: - Bfree(bb); - Bfree(bd); - Bfree(bs); - Bfree(delta); + Bfree(bb); bb = NULL; + Bfree(bd); bd = NULL; + Bfree(bs); bs = NULL; + Bfree(delta); delta = NULL; } - Bfree(bb); - Bfree(bd); - Bfree(bs); - Bfree(bd0); - Bfree(delta); if (bc.nd > nd) { error = bigcomp(&rv, s0, &bc); if (error) @@ -2236,24 +2195,37 @@ _Py_dg_strtod(const char *s00, char **se) } ret: - return sign ? -dval(&rv) : dval(&rv); + result = sign ? -dval(&rv) : dval(&rv); + goto done; parse_error: - return 0.0; + result = 0.0; + goto done; failed_malloc: errno = ENOMEM; - return -1.0; + result = -1.0; + goto done; undfl: - return sign ? -0.0 : 0.0; + result = sign ? -0.0 : 0.0; + goto done; ovfl: errno = ERANGE; /* Can't trust HUGE_VAL */ word0(&rv) = Exp_mask; word1(&rv) = 0; - return sign ? -dval(&rv) : dval(&rv); + result = sign ? -dval(&rv) : dval(&rv); + goto done; + + done: + Bfree(bb); + Bfree(bd); + Bfree(bs); + Bfree(bd0); + Bfree(delta); + return result; } From webhook-mailer at python.org Thu Mar 14 15:26:32 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Thu, 14 Mar 2019 19:26:32 -0000 Subject: [Python-checkins] Fix typo duplicate period in a docstring in the zipfile module. (GH-12326) Message-ID: https://github.com/python/cpython/commit/53c2935dac9d814a3d0bae504dae2ee1c941c731 commit: 53c2935dac9d814a3d0bae504dae2ee1c941c731 branch: master author: nick sung committer: Serhiy Storchaka date: 2019-03-14T21:26:25+02:00 summary: Fix typo duplicate period in a docstring in the zipfile module. (GH-12326) files: M Lib/zipfile.py diff --git a/Lib/zipfile.py b/Lib/zipfile.py index dc16f6d464fd..61cd929f614f 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -879,7 +879,7 @@ def readable(self): def read(self, n=-1): """Read and return up to n bytes. - If the argument is omitted, None, or negative, data is read and returned until EOF is reached.. + If the argument is omitted, None, or negative, data is read and returned until EOF is reached. """ if n is None or n < 0: buf = self._readbuffer[self._offset:] From webhook-mailer at python.org Thu Mar 14 15:28:34 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Thu, 14 Mar 2019 19:28:34 -0000 Subject: [Python-checkins] Document actual string.punctuation value. (GH-12270) Message-ID: https://github.com/python/cpython/commit/b420428cf5c27ab90a206bf107cb055c84dcccd1 commit: b420428cf5c27ab90a206bf107cb055c84dcccd1 branch: master author: Andre Delfino committer: Serhiy Storchaka date: 2019-03-14T21:28:31+02:00 summary: Document actual string.punctuation value. (GH-12270) files: M Doc/library/string.rst M Doc/tools/susp-ignored.csv diff --git a/Doc/library/string.rst b/Doc/library/string.rst index 46b2bfc82b73..c2f65224bc8d 100644 --- a/Doc/library/string.rst +++ b/Doc/library/string.rst @@ -56,8 +56,7 @@ The constants defined in this module are: .. data:: punctuation String of ASCII characters which are considered punctuation characters - in the ``C`` locale. - + in the ``C`` locale: ``!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~``. .. data:: printable diff --git a/Doc/tools/susp-ignored.csv b/Doc/tools/susp-ignored.csv index 3c23dc12e3ad..68a278c1f4a7 100644 --- a/Doc/tools/susp-ignored.csv +++ b/Doc/tools/susp-ignored.csv @@ -215,6 +215,7 @@ library/stdtypes,,::,>>> hash(v[::-2]) == hash(b'abcefg'[::-2]) library/stdtypes,,:len,s[len(s):len(s)] library/stdtypes,,::,>>> y = m[::2] library/stdtypes,,::,>>> z = y[::-2] +library/string,,`,"!""#$%&'()*+,-./:;<=>?@[\]^_`{|}~" library/subprocess,,`,"output=`dmesg | grep hda`" library/subprocess,,`,"output=`mycmd myarg`" library/tarfile,,:bz2, From webhook-mailer at python.org Fri Mar 15 00:46:35 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 15 Mar 2019 04:46:35 -0000 Subject: [Python-checkins] Correct the heading levels (GH-12338) Message-ID: https://github.com/python/cpython/commit/1c668d16574d47cffd469e00930f39afac927288 commit: 1c668d16574d47cffd469e00930f39afac927288 branch: master author: Raymond Hettinger committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-14T21:46:31-07:00 summary: Correct the heading levels (GH-12338) files: M Doc/library/statistics.rst diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst index 97e1c3a0a1c2..b5521b772b3a 100644 --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -491,7 +491,7 @@ A single exception is defined: :class:`NormalDist` objects -=========================== +--------------------------- :class:`NormalDist` is a tool for creating and manipulating normal distributions of a `random variable @@ -611,7 +611,7 @@ of applications in statistics. :class:`NormalDist` Examples and Recipes ----------------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :class:`NormalDist` readily solves classic probability problems. From webhook-mailer at python.org Fri Mar 15 00:53:02 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 15 Mar 2019 04:53:02 -0000 Subject: [Python-checkins] Fix typo duplicate period in a docstring in the zipfile module. (GH-12326) Message-ID: https://github.com/python/cpython/commit/0b9bd5b4c31f4bfcd7bbdc13b5ebc54ce0dbd0c1 commit: 0b9bd5b4c31f4bfcd7bbdc13b5ebc54ce0dbd0c1 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-14T21:52:59-07:00 summary: Fix typo duplicate period in a docstring in the zipfile module. (GH-12326) (cherry picked from commit 53c2935dac9d814a3d0bae504dae2ee1c941c731) Co-authored-by: nick sung files: M Lib/zipfile.py diff --git a/Lib/zipfile.py b/Lib/zipfile.py index d2d3b693282d..75dc59d1fc29 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -875,7 +875,7 @@ def readable(self): def read(self, n=-1): """Read and return up to n bytes. - If the argument is omitted, None, or negative, data is read and returned until EOF is reached.. + If the argument is omitted, None, or negative, data is read and returned until EOF is reached. """ if n is None or n < 0: buf = self._readbuffer[self._offset:] From webhook-mailer at python.org Fri Mar 15 02:53:40 2019 From: webhook-mailer at python.org (Vinay Sajip) Date: Fri, 15 Mar 2019 06:53:40 -0000 Subject: [Python-checkins] bpo-36272: Logging now propagates RecursionError (GH-12312) Message-ID: https://github.com/python/cpython/commit/65f64b1903ae85b97a30f514bbc1b7ce940c3af2 commit: 65f64b1903ae85b97a30f514bbc1b7ce940c3af2 branch: master author: R?mi Lapeyre committer: Vinay Sajip date: 2019-03-15T06:53:34Z summary: bpo-36272: Logging now propagates RecursionError (GH-12312) files: A Misc/NEWS.d/next/Library/2019-03-13-14-14-36.bpo-36272.f3l2IG.rst M Lib/logging/__init__.py M Lib/test/test_logging.py diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index b4659af7cc98..7355396541a3 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -1032,6 +1032,8 @@ def handleError(self, record): sys.stderr.write('Message: %r\n' 'Arguments: %s\n' % (record.msg, record.args)) + except RecursionError: # See issue 36272 + raise except Exception: sys.stderr.write('Unable to print the message and arguments' ' - possible formatting error.\nUse the' @@ -1094,6 +1096,8 @@ def emit(self, record): # issue 35046: merged two stream.writes into one. stream.write(msg + self.terminator) self.flush() + except RecursionError: # See issue 36272 + raise except Exception: self.handleError(record) diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index c797d66aa645..b23ae24920b7 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -41,7 +41,7 @@ import struct import sys import tempfile -from test.support.script_helper import assert_python_ok +from test.support.script_helper import assert_python_ok, assert_python_failure from test import support import textwrap import threading @@ -4142,6 +4142,21 @@ def __del__(self): self.assertIn("exception in __del__", err) self.assertIn("ValueError: some error", err) + def test_recursion_error(self): + # Issue 36272 + code = """if 1: + import logging + + def rec(): + logging.error("foo") + rec() + + rec()""" + rc, out, err = assert_python_failure("-c", code) + err = err.decode() + self.assertNotIn("Cannot recover from stack overflow.", err) + self.assertEqual(rc, 1) + class LogRecordTest(BaseTest): def test_str_rep(self): diff --git a/Misc/NEWS.d/next/Library/2019-03-13-14-14-36.bpo-36272.f3l2IG.rst b/Misc/NEWS.d/next/Library/2019-03-13-14-14-36.bpo-36272.f3l2IG.rst new file mode 100644 index 000000000000..2f2f7905c015 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-13-14-14-36.bpo-36272.f3l2IG.rst @@ -0,0 +1,2 @@ +:mod:`logging` does not silently ignore RecursionError anymore. Patch +contributed by R?mi Lapeyre. From webhook-mailer at python.org Fri Mar 15 09:58:04 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 15 Mar 2019 13:58:04 -0000 Subject: [Python-checkins] bpo-36235: Fix CFLAGS in distutils customize_compiler() (GH-12236) Message-ID: https://github.com/python/cpython/commit/86082c22d23285995a32aabb491527c9f5629556 commit: 86082c22d23285995a32aabb491527c9f5629556 branch: master author: Victor Stinner committer: GitHub date: 2019-03-15T14:57:52+01:00 summary: bpo-36235: Fix CFLAGS in distutils customize_compiler() (GH-12236) Fix CFLAGS in customize_compiler() of distutils.sysconfig: when the CFLAGS environment variable is defined, don't override CFLAGS variable with the OPT variable anymore. Initial patch written by David Malcolm. Co-Authored-By: David Malcolm files: A Misc/NEWS.d/next/Library/2019-03-08-13-32-21.bpo-36235._M72wU.rst M Lib/distutils/sysconfig.py M Lib/distutils/tests/test_sysconfig.py diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py index 40af493cdfb5..a3494670db18 100644 --- a/Lib/distutils/sysconfig.py +++ b/Lib/distutils/sysconfig.py @@ -181,8 +181,8 @@ def customize_compiler(compiler): _osx_support.customize_compiler(_config_vars) _config_vars['CUSTOMIZED_OSX_COMPILER'] = 'True' - (cc, cxx, opt, cflags, ccshared, ldshared, shlib_suffix, ar, ar_flags) = \ - get_config_vars('CC', 'CXX', 'OPT', 'CFLAGS', + (cc, cxx, cflags, ccshared, ldshared, shlib_suffix, ar, ar_flags) = \ + get_config_vars('CC', 'CXX', 'CFLAGS', 'CCSHARED', 'LDSHARED', 'SHLIB_SUFFIX', 'AR', 'ARFLAGS') if 'CC' in os.environ: @@ -205,7 +205,7 @@ def customize_compiler(compiler): if 'LDFLAGS' in os.environ: ldshared = ldshared + ' ' + os.environ['LDFLAGS'] if 'CFLAGS' in os.environ: - cflags = opt + ' ' + os.environ['CFLAGS'] + cflags = cflags + ' ' + os.environ['CFLAGS'] ldshared = ldshared + ' ' + os.environ['CFLAGS'] if 'CPPFLAGS' in os.environ: cpp = cpp + ' ' + os.environ['CPPFLAGS'] diff --git a/Lib/distutils/tests/test_sysconfig.py b/Lib/distutils/tests/test_sysconfig.py index fe4a2994e3b0..4bf6a067d4d9 100644 --- a/Lib/distutils/tests/test_sysconfig.py +++ b/Lib/distutils/tests/test_sysconfig.py @@ -9,7 +9,7 @@ from distutils import sysconfig from distutils.ccompiler import get_default_compiler from distutils.tests import support -from test.support import TESTFN, run_unittest, check_warnings +from test.support import TESTFN, run_unittest, check_warnings, swap_item class SysconfigTestCase(support.EnvironGuard, unittest.TestCase): def setUp(self): @@ -78,7 +78,9 @@ def test_srcdir_independent_of_cwd(self): 'not testing if default compiler is not unix') def test_customize_compiler(self): os.environ['AR'] = 'my_ar' - os.environ['ARFLAGS'] = '-arflags' + os.environ['CC'] = 'my_cc' + os.environ['ARFLAGS'] = '--myarflags' + os.environ['CFLAGS'] = '--mycflags' # make sure AR gets caught class compiler: @@ -87,9 +89,14 @@ class compiler: def set_executables(self, **kw): self.exes = kw + # Make sure that sysconfig._config_vars is initialized + sysconfig.get_config_vars() + comp = compiler() - sysconfig.customize_compiler(comp) - self.assertEqual(comp.exes['archiver'], 'my_ar -arflags') + with swap_item(sysconfig._config_vars, 'CFLAGS', '--sysconfig-cflags'): + sysconfig.customize_compiler(comp) + self.assertEqual(comp.exes['archiver'], 'my_ar --myarflags') + self.assertEqual(comp.exes['compiler'], 'my_cc --sysconfig-cflags --mycflags') def test_parse_makefile_base(self): self.makefile = TESTFN diff --git a/Misc/NEWS.d/next/Library/2019-03-08-13-32-21.bpo-36235._M72wU.rst b/Misc/NEWS.d/next/Library/2019-03-08-13-32-21.bpo-36235._M72wU.rst new file mode 100644 index 000000000000..59df98c101af --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-08-13-32-21.bpo-36235._M72wU.rst @@ -0,0 +1,4 @@ +Fix ``CFLAGS`` in ``customize_compiler()`` of ``distutils.sysconfig``: when +the ``CFLAGS`` environment variable is defined, don't override ``CFLAGS`` +variable with the ``OPT`` variable anymore. Initial patch written by David +Malcolm. From webhook-mailer at python.org Fri Mar 15 10:08:10 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 15 Mar 2019 14:08:10 -0000 Subject: [Python-checkins] bpo-36301: Add _PyWstrList structure (GH-12343) Message-ID: https://github.com/python/cpython/commit/74f6568bbd3e70806ea3219e8bacb386ad802ccf commit: 74f6568bbd3e70806ea3219e8bacb386ad802ccf branch: master author: Victor Stinner committer: GitHub date: 2019-03-15T15:08:05+01:00 summary: bpo-36301: Add _PyWstrList structure (GH-12343) Replace messy _Py_wstrlist_xxx() functions with a new clean _PyWstrList structure and new _PyWstrList_xxx() functions. Changes: * Add _PyCoreConfig.use_module_search_paths to decide if _PyCoreConfig.module_search_paths should be computed or not, to support empty search path list. * _PyWstrList_Clear() sets length to 0 and items to NULL, whereas _Py_wstrlist_clear() only freed memory. * _PyWstrList_Append() returns an int, whereas _Py_wstrlist_append() returned _PyInitError. * _PyWstrList uses Py_ssize_t for the length, instead of int. * Replace (int, wchar_t**) with _PyWstrList in: * _PyPreConfig * _PyCoreConfig * _PyPreCmdline * _PyCmdline * Replace "int orig_argv; wchar_t **orig_argv;" with "_PyWstrList orig_argv". * _PyCmdline and _PyPreCmdline now also copy wchar_argv. * Rename _PyArgv_Decode() to _PyArgv_AsWstrList(). * PySys_SetArgvEx() now pass the fixed (argc, argv) to _PyPathConfig_ComputeArgv0() (don't pass negative argc or NULL argv). * _PyOS_GetOpt() uses Py_ssize_t files: M Include/cpython/coreconfig.h M Include/internal/pycore_coreconfig.h M Include/internal/pycore_getopt.h M Include/internal/pycore_pathconfig.h M Modules/main.c M Programs/_testembed.c M Python/coreconfig.c M Python/getopt.c M Python/pathconfig.c M Python/preconfig.c M Python/sysmodule.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index 267357676bf0..bd28c371ce52 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -46,6 +46,18 @@ typedef struct { #define _Py_INIT_FAILED(err) \ (err.msg != NULL || err.exitcode != -1) +/* --- _PyWstrList ------------------------------------------------ */ + +typedef struct { + /* If length is greater than zero, items must be non-NULL + and all items strings must be non-NULL */ + Py_ssize_t length; + wchar_t **items; +} _PyWstrList; + +#define _PyWstrList_INIT (_PyWstrList){.length = 0, .items = NULL} + + /* --- _PyPreConfig ----------------------------------------------- */ typedef struct { @@ -162,19 +174,12 @@ typedef struct { char *filesystem_encoding; char *filesystem_errors; - wchar_t *pycache_prefix; /* PYTHONPYCACHEPREFIX, -X pycache_prefix=PATH */ - - wchar_t *program_name; /* Program name, see also Py_GetProgramName() */ - int argc; /* Number of command line arguments, - -1 means unset */ - wchar_t **argv; /* Command line arguments */ - wchar_t *program; /* argv[0] or "" */ - - int nxoption; /* Number of -X options */ - wchar_t **xoptions; /* -X options */ - - int nwarnoption; /* Number of warnings options */ - wchar_t **warnoptions; /* Warnings options */ + wchar_t *pycache_prefix; /* PYTHONPYCACHEPREFIX, -X pycache_prefix=PATH */ + wchar_t *program_name; /* Program name, see also Py_GetProgramName() */ + _PyWstrList argv; /* Command line arguments */ + wchar_t *program; /* argv[0] or "" */ + _PyWstrList xoptions; /* Command line -X options */ + _PyWstrList warnoptions; /* Warnings options */ /* Path configuration inputs */ wchar_t *module_search_path_env; /* PYTHONPATH environment variable */ @@ -182,9 +187,11 @@ typedef struct { see also Py_SetPythonHome(). */ /* Path configuration outputs */ - int nmodule_search_path; /* Number of sys.path paths, - -1 means unset */ - wchar_t **module_search_paths; /* sys.path paths */ + int use_module_search_paths; /* If non-zero, use module_search_paths */ + _PyWstrList module_search_paths; /* sys.path paths. Computed if + use_module_search_paths is equal + to zero. */ + wchar_t *executable; /* sys.executable */ wchar_t *prefix; /* sys.prefix */ wchar_t *base_prefix; /* sys.base_prefix */ @@ -366,8 +373,7 @@ typedef struct { .use_hash_seed = -1, \ .faulthandler = -1, \ .tracemalloc = -1, \ - .argc = -1, \ - .nmodule_search_path = -1, \ + .use_module_search_paths = 0, \ .site_import = -1, \ .bytes_warning = -1, \ .inspect = -1, \ diff --git a/Include/internal/pycore_coreconfig.h b/Include/internal/pycore_coreconfig.h index 153309de4ff6..8c5a072e5677 100644 --- a/Include/internal/pycore_coreconfig.h +++ b/Include/internal/pycore_coreconfig.h @@ -8,39 +8,38 @@ extern "C" { # error "this header requires Py_BUILD_CORE or Py_BUILD_CORE_BUILTIN defined" #endif -/* --- _Py_wstrlist ----------------------------------------------- */ - -PyAPI_FUNC(void) _Py_wstrlist_clear( - int len, - wchar_t **list); -PyAPI_FUNC(wchar_t**) _Py_wstrlist_copy( - int len, - wchar_t * const *list); -PyAPI_FUNC(_PyInitError) _Py_wstrlist_append( - int *len, - wchar_t ***list, - const wchar_t *str); -PyAPI_FUNC(PyObject*) _Py_wstrlist_as_pylist( - int len, - wchar_t **list); + +/* --- _PyWstrList ------------------------------------------------ */ + +#ifndef NDEBUG +PyAPI_FUNC(int) _PyWstrList_CheckConsistency(const _PyWstrList *list); +#endif +PyAPI_FUNC(void) _PyWstrList_Clear(_PyWstrList *list); +PyAPI_FUNC(int) _PyWstrList_Copy(_PyWstrList *list, + const _PyWstrList *list2); +PyAPI_FUNC(int) _PyWstrList_Append(_PyWstrList *list, + const wchar_t *item); +PyAPI_FUNC(PyObject*) _PyWstrList_AsList(const _PyWstrList *list); + /* --- _PyArgv ---------------------------------------------------- */ -PyAPI_FUNC(_PyInitError) _PyArgv_Decode(const _PyArgv *args, - wchar_t*** argv_p); +PyAPI_FUNC(_PyInitError) _PyArgv_AsWstrList(const _PyArgv *args, + _PyWstrList *list); + /* --- Py_GetArgcArgv() helpers ----------------------------------- */ PyAPI_FUNC(void) _Py_ClearArgcArgv(void); + /* --- _PyPreConfig ----------------------------------------------- */ PyAPI_FUNC(int) _Py_str_to_int( const char *str, int *result); PyAPI_FUNC(const wchar_t*) _Py_get_xoption( - int nxoption, - wchar_t * const *xoptions, + const _PyWstrList *xoptions, const wchar_t *name); PyAPI_FUNC(void) _PyPreConfig_Clear(_PyPreConfig *config); diff --git a/Include/internal/pycore_getopt.h b/Include/internal/pycore_getopt.h index 1d30f5bb99f8..0d1897c75a64 100644 --- a/Include/internal/pycore_getopt.h +++ b/Include/internal/pycore_getopt.h @@ -6,8 +6,8 @@ #endif extern int _PyOS_opterr; -extern int _PyOS_optind; -extern wchar_t *_PyOS_optarg; +extern Py_ssize_t _PyOS_optind; +extern const wchar_t *_PyOS_optarg; extern void _PyOS_ResetGetOpt(void); @@ -17,6 +17,6 @@ typedef struct { int val; } _PyOS_LongOption; -extern int _PyOS_GetOpt(int argc, wchar_t **argv, int *longindex); +extern int _PyOS_GetOpt(Py_ssize_t argc, wchar_t **argv, int *longindex); #endif /* !Py_INTERNAL_PYGETOPT_H */ diff --git a/Include/internal/pycore_pathconfig.h b/Include/internal/pycore_pathconfig.h index fb6b1d78b364..d0938df54145 100644 --- a/Include/internal/pycore_pathconfig.h +++ b/Include/internal/pycore_pathconfig.h @@ -44,7 +44,7 @@ PyAPI_FUNC(_PyInitError) _PyPathConfig_SetGlobal( PyAPI_FUNC(_PyInitError) _PyPathConfig_Calculate_impl( _PyPathConfig *config, const _PyCoreConfig *core_config); -PyAPI_FUNC(PyObject*) _PyPathConfig_ComputeArgv0(int argc, wchar_t **argv); +PyAPI_FUNC(PyObject*) _PyPathConfig_ComputeArgv0(const _PyWstrList *argv); PyAPI_FUNC(int) _Py_FindEnvConfigValue( FILE *env_file, const wchar_t *key, diff --git a/Modules/main.c b/Modules/main.c index ae99901f1d89..5c7f7e45673a 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -84,15 +84,15 @@ mainconfig_add_xoption(PyObject *opts, const wchar_t *s) static PyObject* mainconfig_create_xoptions_dict(const _PyCoreConfig *config) { - int nxoption = config->nxoption; - wchar_t **xoptions = config->xoptions; + Py_ssize_t nxoption = config->xoptions.length; + wchar_t * const * xoptions = config->xoptions.items; PyObject *dict = PyDict_New(); if (dict == NULL) { return NULL; } - for (int i=0; i < nxoption; i++) { - wchar_t *option = xoptions[i]; + for (Py_ssize_t i=0; i < nxoption; i++) { + const wchar_t *option = xoptions[i]; if (mainconfig_add_xoption(dict, option) < 0) { Py_DECREF(dict); return NULL; @@ -243,22 +243,18 @@ _PyMainInterpreterConfig_Read(_PyMainInterpreterConfig *main_config, } \ } \ } while (0) -#define COPY_WSTRLIST(ATTR, LEN, LIST) \ +#define COPY_WSTRLIST(ATTR, LIST) \ do { \ if (ATTR == NULL) { \ - ATTR = _Py_wstrlist_as_pylist(LEN, LIST); \ + ATTR = _PyWstrList_AsList(LIST); \ if (ATTR == NULL) { \ return _Py_INIT_NO_MEMORY(); \ } \ } \ } while (0) - COPY_WSTRLIST(main_config->warnoptions, - config->nwarnoption, config->warnoptions); - if (config->argc >= 0) { - COPY_WSTRLIST(main_config->argv, - config->argc, config->argv); - } + COPY_WSTRLIST(main_config->warnoptions, &config->warnoptions); + COPY_WSTRLIST(main_config->argv, &config->argv); if (config->_install_importlib) { COPY_WSTR(executable); @@ -268,7 +264,7 @@ _PyMainInterpreterConfig_Read(_PyMainInterpreterConfig *main_config, COPY_WSTR(base_exec_prefix); COPY_WSTRLIST(main_config->module_search_path, - config->nmodule_search_path, config->module_search_paths); + &config->module_search_paths); if (config->pycache_prefix != NULL) { COPY_WSTR(pycache_prefix); @@ -784,8 +780,7 @@ pymain_run_python(PyInterpreterState *interp, int *exitcode) } } else if (!config->preconfig.isolated) { - PyObject *path0 = _PyPathConfig_ComputeArgv0(config->argc, - config->argv); + PyObject *path0 = _PyPathConfig_ComputeArgv0(&config->argv); if (path0 == NULL) { err = _Py_INIT_NO_MEMORY(); goto done; diff --git a/Programs/_testembed.c b/Programs/_testembed.c index bba25108bdf7..7c143f1ef387 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -479,8 +479,8 @@ static int test_init_from_config(void) L"-c", L"pass", }; - config.argc = Py_ARRAY_LENGTH(argv); - config.argv = argv; + config.argv.length = Py_ARRAY_LENGTH(argv); + config.argv.items = argv; config.program = L"conf_program"; @@ -489,15 +489,15 @@ static int test_init_from_config(void) L"core_xoption2=", L"core_xoption3", }; - config.nxoption = Py_ARRAY_LENGTH(xoptions); - config.xoptions = xoptions; + config.xoptions.length = Py_ARRAY_LENGTH(xoptions); + config.xoptions.items = xoptions; static wchar_t* warnoptions[2] = { L"default", L"error::ResourceWarning", }; - config.nwarnoption = Py_ARRAY_LENGTH(warnoptions); - config.warnoptions = warnoptions; + config.warnoptions.length = Py_ARRAY_LENGTH(warnoptions); + config.warnoptions.items = warnoptions; /* FIXME: test module_search_path_env */ /* FIXME: test home */ diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 845e4c9a163a..15107fa36ce9 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -202,81 +202,128 @@ _Py_GetGlobalVariablesAsDict(void) } -/* --- _Py_wstrlist ----------------------------------------------- */ +/* --- _PyWstrList ------------------------------------------------ */ + +#ifndef NDEBUG +int +_PyWstrList_CheckConsistency(const _PyWstrList *list) +{ + assert(list->length >= 0); + if (list->length != 0) { + assert(list->items != NULL); + } + for (Py_ssize_t i = 0; i < list->length; i++) { + assert(list->items[i] != NULL); + } + return 1; +} +#endif /* Py_DEBUG */ + void -_Py_wstrlist_clear(int len, wchar_t **list) +_PyWstrList_Clear(_PyWstrList *list) { - for (int i=0; i < len; i++) { - PyMem_RawFree(list[i]); + assert(_PyWstrList_CheckConsistency(list)); + for (Py_ssize_t i=0; i < list->length; i++) { + PyMem_RawFree(list->items[i]); } - PyMem_RawFree(list); + PyMem_RawFree(list->items); + list->length = 0; + list->items = NULL; } -wchar_t** -_Py_wstrlist_copy(int len, wchar_t * const *list) +int +_PyWstrList_Copy(_PyWstrList *list, const _PyWstrList *list2) { - assert((len > 0 && list != NULL) || len == 0); - size_t size = len * sizeof(list[0]); - wchar_t **list_copy = PyMem_RawMalloc(size); - if (list_copy == NULL) { - return NULL; + assert(_PyWstrList_CheckConsistency(list)); + assert(_PyWstrList_CheckConsistency(list2)); + + if (list2->length == 0) { + _PyWstrList_Clear(list); + return 0; } - for (int i=0; i < len; i++) { - wchar_t* arg = _PyMem_RawWcsdup(list[i]); - if (arg == NULL) { - _Py_wstrlist_clear(i, list_copy); - return NULL; + + _PyWstrList copy = _PyWstrList_INIT; + + size_t size = list2->length * sizeof(list2->items[0]); + copy.items = PyMem_RawMalloc(size); + if (copy.items == NULL) { + return -1; + } + + for (Py_ssize_t i=0; i < list2->length; i++) { + wchar_t *item = _PyMem_RawWcsdup(list2->items[i]); + if (item == NULL) { + _PyWstrList_Clear(©); + return -1; } - list_copy[i] = arg; + copy.items[i] = item; + copy.length = i + 1; } - return list_copy; + + _PyWstrList_Clear(list); + *list = copy; + return 0; } -_PyInitError -_Py_wstrlist_append(int *len, wchar_t ***list, const wchar_t *str) +int +_PyWstrList_Append(_PyWstrList *list, const wchar_t *item) { - if (*len == INT_MAX) { - /* len+1 would overflow */ - return _Py_INIT_NO_MEMORY(); + if (list->length == PY_SSIZE_T_MAX) { + /* lenght+1 would overflow */ + return -1; } - wchar_t *str2 = _PyMem_RawWcsdup(str); - if (str2 == NULL) { - return _Py_INIT_NO_MEMORY(); + + wchar_t *item2 = _PyMem_RawWcsdup(item); + if (item2 == NULL) { + return -1; } - size_t size = (*len + 1) * sizeof(list[0]); - wchar_t **list2 = (wchar_t **)PyMem_RawRealloc(*list, size); - if (list2 == NULL) { - PyMem_RawFree(str2); - return _Py_INIT_NO_MEMORY(); + size_t size = (list->length + 1) * sizeof(list->items[0]); + wchar_t **items2 = (wchar_t **)PyMem_RawRealloc(list->items, size); + if (items2 == NULL) { + PyMem_RawFree(item2); + return -1; } - list2[*len] = str2; - *list = list2; - (*len)++; - return _Py_INIT_OK(); + + items2[list->length] = item2; + list->items = items2; + list->length++; + return 0; +} + + +static int +_PyWstrList_Extend(_PyWstrList *list, const _PyWstrList *list2) +{ + for (Py_ssize_t i = 0; i < list2->length; i++) { + if (_PyWstrList_Append(list, list2->items[i])) { + return -1; + } + } + return 0; } PyObject* -_Py_wstrlist_as_pylist(int len, wchar_t **list) +_PyWstrList_AsList(const _PyWstrList *list) { - assert(list != NULL || len < 1); + assert(_PyWstrList_CheckConsistency(list)); - PyObject *pylist = PyList_New(len); + PyObject *pylist = PyList_New(list->length); if (pylist == NULL) { return NULL; } - for (int i = 0; i < len; i++) { - PyObject *v = PyUnicode_FromWideChar(list[i], -1); - if (v == NULL) { + for (Py_ssize_t i = 0; i < list->length; i++) { + PyObject *item = PyUnicode_FromWideChar(list->items[i], -1); + if (item == NULL) { Py_DECREF(pylist); return NULL; } - PyList_SET_ITEM(pylist, i, v); + PyList_SET_ITEM(pylist, i, item); } return pylist; } @@ -369,8 +416,7 @@ _Py_ClearStandardStreamEncoding(void) /* --- Py_GetArgcArgv() ------------------------------------------- */ /* For Py_GetArgcArgv(); set by _Py_SetArgcArgv() */ -static int orig_argc = 0; -static wchar_t **orig_argv = NULL; +static _PyWstrList orig_argv = {.length = 0, .items = NULL}; void @@ -379,32 +425,22 @@ _Py_ClearArgcArgv(void) PyMemAllocatorEx old_alloc; _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - _Py_wstrlist_clear(orig_argc, orig_argv); - orig_argc = 0; - orig_argv = NULL; + _PyWstrList_Clear(&orig_argv); PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); } static int -_Py_SetArgcArgv(int argc, wchar_t * const *argv) +_Py_SetArgcArgv(Py_ssize_t argc, wchar_t * const *argv) { + const _PyWstrList argv_list = {.length = argc, .items = (wchar_t **)argv}; int res; PyMemAllocatorEx old_alloc; _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - wchar_t **argv_copy = _Py_wstrlist_copy(argc, argv); - if (argv_copy != NULL) { - _Py_ClearArgcArgv(); - orig_argc = argc; - orig_argv = argv_copy; - res = 0; - } - else { - res = -1; - } + res = _PyWstrList_Copy(&orig_argv, &argv_list); PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); return res; @@ -416,8 +452,8 @@ _Py_SetArgcArgv(int argc, wchar_t * const *argv) void Py_GetArgcArgv(int *argc, wchar_t ***argv) { - *argc = orig_argc; - *argv = orig_argv; + *argc = (int)orig_argv.length; + *argv = orig_argv.items; } @@ -439,12 +475,6 @@ _PyCoreConfig_Clear(_PyCoreConfig *config) PyMem_RawFree(ATTR); \ ATTR = NULL; \ } while (0) -#define CLEAR_WSTRLIST(LEN, LIST) \ - do { \ - _Py_wstrlist_clear(LEN, LIST); \ - LEN = 0; \ - LIST = NULL; \ - } while (0) CLEAR(config->pycache_prefix); CLEAR(config->module_search_path_env); @@ -452,13 +482,11 @@ _PyCoreConfig_Clear(_PyCoreConfig *config) CLEAR(config->program_name); CLEAR(config->program); - CLEAR_WSTRLIST(config->argc, config->argv); - config->argc = -1; - - CLEAR_WSTRLIST(config->nwarnoption, config->warnoptions); - CLEAR_WSTRLIST(config->nxoption, config->xoptions); - CLEAR_WSTRLIST(config->nmodule_search_path, config->module_search_paths); - config->nmodule_search_path = -1; + _PyWstrList_Clear(&config->argv); + _PyWstrList_Clear(&config->warnoptions); + _PyWstrList_Clear(&config->xoptions); + _PyWstrList_Clear(&config->module_search_paths); + config->use_module_search_paths = 0; CLEAR(config->executable); CLEAR(config->prefix); @@ -477,7 +505,6 @@ _PyCoreConfig_Clear(_PyCoreConfig *config) CLEAR(config->run_module); CLEAR(config->run_filename); #undef CLEAR -#undef CLEAR_WSTRLIST } @@ -509,15 +536,11 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) } \ } \ } while (0) -#define COPY_WSTRLIST(LEN, LIST) \ +#define COPY_WSTRLIST(LIST) \ do { \ - if (config2->LIST != NULL) { \ - config->LIST = _Py_wstrlist_copy(config2->LEN, config2->LIST); \ - if (config->LIST == NULL) { \ - return -1; \ - } \ + if (_PyWstrList_Copy(&config->LIST, &config2->LIST) < 0 ) { \ + return -1; \ } \ - config->LEN = config2->LEN; \ } while (0) COPY_ATTR(install_signal_handlers); @@ -538,10 +561,11 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) COPY_WSTR_ATTR(program_name); COPY_WSTR_ATTR(program); - COPY_WSTRLIST(argc, argv); - COPY_WSTRLIST(nwarnoption, warnoptions); - COPY_WSTRLIST(nxoption, xoptions); - COPY_WSTRLIST(nmodule_search_path, module_search_paths); + COPY_WSTRLIST(argv); + COPY_WSTRLIST(warnoptions); + COPY_WSTRLIST(xoptions); + COPY_WSTRLIST(module_search_paths); + COPY_ATTR(use_module_search_paths); COPY_WSTR_ATTR(executable); COPY_WSTR_ATTR(prefix); @@ -817,7 +841,7 @@ config_init_executable(_PyCoreConfig *config) static const wchar_t* config_get_xoption(const _PyCoreConfig *config, wchar_t *name) { - return _Py_get_xoption(config->nxoption, config->xoptions, name); + return _Py_get_xoption(&config->xoptions, name); } @@ -1427,9 +1451,6 @@ _PyCoreConfig_Read(_PyCoreConfig *config, const _PyPreConfig *preconfig) if (config->tracemalloc < 0) { config->tracemalloc = 0; } - if (config->argc < 0) { - config->argc = 0; - } if (config->filesystem_encoding == NULL || config->filesystem_errors == NULL) { err = config_init_fs_encoding(config); @@ -1449,6 +1470,7 @@ _PyCoreConfig_Read(_PyCoreConfig *config, const _PyPreConfig *preconfig) assert(config->stdio_encoding != NULL); assert(config->stdio_errors != NULL); assert(config->_check_hash_pycs_mode != NULL); + assert(_PyWstrList_CheckConsistency(&config->argv)); return _Py_INIT_OK(); } @@ -1546,8 +1568,8 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) : (Py_INCREF(Py_None), Py_None)) #define SET_ITEM_WSTR(ATTR) \ SET_ITEM(#ATTR, FROM_WSTRING(config->ATTR)) -#define SET_ITEM_WSTRLIST(NOPTION, OPTIONS) \ - SET_ITEM(#OPTIONS, _Py_wstrlist_as_pylist(config->NOPTION, config->OPTIONS)) +#define SET_ITEM_WSTRLIST(LIST) \ + SET_ITEM(#LIST, _PyWstrList_AsList(&config->LIST)) SET_ITEM_INT(install_signal_handlers); SET_ITEM_INT(use_hash_seed); @@ -1563,13 +1585,13 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) SET_ITEM_STR(filesystem_errors); SET_ITEM_WSTR(pycache_prefix); SET_ITEM_WSTR(program_name); - SET_ITEM_WSTRLIST(argc, argv); + SET_ITEM_WSTRLIST(argv); SET_ITEM_WSTR(program); - SET_ITEM_WSTRLIST(nxoption, xoptions); - SET_ITEM_WSTRLIST(nwarnoption, warnoptions); + SET_ITEM_WSTRLIST(xoptions); + SET_ITEM_WSTRLIST(warnoptions); SET_ITEM_WSTR(module_search_path_env); SET_ITEM_WSTR(home); - SET_ITEM_WSTRLIST(nmodule_search_path, module_search_paths); + SET_ITEM_WSTRLIST(module_search_paths); SET_ITEM_WSTR(executable); SET_ITEM_WSTR(prefix); SET_ITEM_WSTR(base_prefix); @@ -1622,13 +1644,9 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) /* --- _PyCmdline ------------------------------------------------- */ typedef struct { - const _PyArgv *args; - int argc; - wchar_t **argv; - int nwarnoption; /* Number of -W command line options */ - wchar_t **warnoptions; /* Command line -W options */ - int nenv_warnoption; /* Number of PYTHONWARNINGS environment variables */ - wchar_t **env_warnoptions; /* PYTHONWARNINGS environment variables */ + _PyWstrList argv; + _PyWstrList warnoptions; /* Command line -W options */ + _PyWstrList env_warnoptions; /* PYTHONWARNINGS environment variables */ int print_help; /* -h, -? options */ int print_version; /* -V option */ } _PyCmdline; @@ -1637,18 +1655,9 @@ typedef struct { static void cmdline_clear(_PyCmdline *cmdline) { - _Py_wstrlist_clear(cmdline->nwarnoption, cmdline->warnoptions); - cmdline->nwarnoption = 0; - cmdline->warnoptions = NULL; - - _Py_wstrlist_clear(cmdline->nenv_warnoption, cmdline->env_warnoptions); - cmdline->nenv_warnoption = 0; - cmdline->env_warnoptions = NULL; - - if (cmdline->args->use_bytes_argv && cmdline->argv != NULL) { - _Py_wstrlist_clear(cmdline->args->argc, cmdline->argv); - } - cmdline->argv = NULL; + _PyWstrList_Clear(&cmdline->warnoptions); + _PyWstrList_Clear(&cmdline->env_warnoptions); + _PyWstrList_Clear(&cmdline->argv); } @@ -1659,11 +1668,10 @@ static _PyInitError config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, int *need_usage) { - _PyInitError err; _PyOS_ResetGetOpt(); do { int longindex = -1; - int c = _PyOS_GetOpt(cmdline->args->argc, cmdline->argv, &longindex); + int c = _PyOS_GetOpt(cmdline->argv.length, cmdline->argv.items, &longindex); if (c == EOF) { break; } @@ -1775,20 +1783,14 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, break; case 'W': - err = _Py_wstrlist_append(&cmdline->nwarnoption, - &cmdline->warnoptions, - _PyOS_optarg); - if (_Py_INIT_FAILED(err)) { - return err; + if (_PyWstrList_Append(&cmdline->warnoptions, _PyOS_optarg) < 0) { + return _Py_INIT_NO_MEMORY(); } break; case 'X': - err = _Py_wstrlist_append(&config->nxoption, - &config->xoptions, - _PyOS_optarg); - if (_Py_INIT_FAILED(err)) { - return err; + if (_PyWstrList_Append(&config->xoptions, _PyOS_optarg) < 0) { + return _Py_INIT_NO_MEMORY(); } break; @@ -1810,10 +1812,10 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, } while (1); if (config->run_command == NULL && config->run_module == NULL - && _PyOS_optind < cmdline->args->argc - && wcscmp(cmdline->argv[_PyOS_optind], L"-") != 0) + && _PyOS_optind < cmdline->argv.length + && wcscmp(cmdline->argv.items[_PyOS_optind], L"-") != 0) { - config->run_filename = _PyMem_RawWcsdup(cmdline->argv[_PyOS_optind]); + config->run_filename = _PyMem_RawWcsdup(cmdline->argv.items[_PyOS_optind]); if (config->run_filename == NULL) { return _Py_INIT_NO_MEMORY(); } @@ -1858,12 +1860,9 @@ cmdline_init_env_warnoptions(_PyCmdline *cmdline, const _PyCoreConfig *config) warning != NULL; warning = WCSTOK(NULL, L",", &context)) { - _PyInitError err = _Py_wstrlist_append(&cmdline->nenv_warnoption, - &cmdline->env_warnoptions, - warning); - if (_Py_INIT_FAILED(err)) { + if (_PyWstrList_Append(&cmdline->env_warnoptions, warning) < 0) { PyMem_RawFree(env); - return err; + return _Py_INIT_NO_MEMORY(); } } PyMem_RawFree(env); @@ -1875,8 +1874,8 @@ static _PyInitError config_init_program(_PyCoreConfig *config, const _PyCmdline *cmdline) { wchar_t *program; - if (cmdline->args->argc >= 1 && cmdline->argv != NULL) { - program = cmdline->argv[0]; + if (cmdline->argv.length >= 1) { + program = cmdline->argv.items[0]; } else { program = L""; @@ -1890,28 +1889,10 @@ config_init_program(_PyCoreConfig *config, const _PyCmdline *cmdline) } -static _PyInitError -config_add_warnings_optlist(_PyCoreConfig *config, - int len, wchar_t * const *options) -{ - for (int i = 0; i < len; i++) { - _PyInitError err = _Py_wstrlist_append(&config->nwarnoption, - &config->warnoptions, - options[i]); - if (_Py_INIT_FAILED(err)) { - return err; - } - } - return _Py_INIT_OK(); -} - - static _PyInitError config_init_warnoptions(_PyCoreConfig *config, const _PyCmdline *cmdline) { - _PyInitError err; - - assert(config->nwarnoption == 0); + assert(config->warnoptions.length == 0); /* The priority order for warnings configuration is (highest precedence * first): @@ -1929,26 +1910,17 @@ config_init_warnoptions(_PyCoreConfig *config, const _PyCmdline *cmdline) */ if (config->preconfig.dev_mode) { - err = _Py_wstrlist_append(&config->nwarnoption, - &config->warnoptions, - L"default"); - if (_Py_INIT_FAILED(err)) { - return err; + if (_PyWstrList_Append(&config->warnoptions, L"default")) { + return _Py_INIT_NO_MEMORY(); } } - err = config_add_warnings_optlist(config, - cmdline->nenv_warnoption, - cmdline->env_warnoptions); - if (_Py_INIT_FAILED(err)) { - return err; + if (_PyWstrList_Extend(&config->warnoptions, &cmdline->env_warnoptions) < 0) { + return _Py_INIT_NO_MEMORY(); } - err = config_add_warnings_optlist(config, - cmdline->nwarnoption, - cmdline->warnoptions); - if (_Py_INIT_FAILED(err)) { - return err; + if (_PyWstrList_Extend(&config->warnoptions, &cmdline->warnoptions) < 0) { + return _Py_INIT_NO_MEMORY(); } /* If the bytes_warning_flag isn't set, bytesobject.c and bytearrayobject.c @@ -1956,18 +1928,15 @@ config_init_warnoptions(_PyCoreConfig *config, const _PyCmdline *cmdline) * case. */ if (config->bytes_warning) { - wchar_t *filter; + const wchar_t *filter; if (config->bytes_warning> 1) { filter = L"error::BytesWarning"; } else { filter = L"default::BytesWarning"; } - err = _Py_wstrlist_append(&config->nwarnoption, - &config->warnoptions, - filter); - if (_Py_INIT_FAILED(err)) { - return err; + if (_PyWstrList_Append(&config->warnoptions, filter)) { + return _Py_INIT_NO_MEMORY(); } } return _Py_INIT_OK(); @@ -1977,23 +1946,24 @@ config_init_warnoptions(_PyCoreConfig *config, const _PyCmdline *cmdline) static _PyInitError config_init_argv(_PyCoreConfig *config, const _PyCmdline *cmdline) { - /* Copy argv to be able to modify it (to force -c/-m) */ - int argc = cmdline->args->argc - _PyOS_optind; - wchar_t **argv; + _PyWstrList wargv = _PyWstrList_INIT; - if (argc <= 0 || cmdline->argv == NULL) { + /* Copy argv to be able to modify it (to force -c/-m) */ + if (cmdline->argv.length <= _PyOS_optind) { /* Ensure at least one (empty) argument is seen */ - static wchar_t *empty_argv[1] = {L""}; - argc = 1; - argv = _Py_wstrlist_copy(1, empty_argv); + if (_PyWstrList_Append(&wargv, L"") < 0) { + return _Py_INIT_NO_MEMORY(); + } } else { - argv = _Py_wstrlist_copy(argc, &cmdline->argv[_PyOS_optind]); - } - - if (argv == NULL) { - return _Py_INIT_NO_MEMORY(); + _PyWstrList slice; + slice.length = cmdline->argv.length - _PyOS_optind; + slice.items = &cmdline->argv.items[_PyOS_optind]; + if (_PyWstrList_Copy(&wargv, &slice) < 0) { + return _Py_INIT_NO_MEMORY(); + } } + assert(wargv.length >= 1); wchar_t *arg0 = NULL; if (config->run_command != NULL) { @@ -2007,17 +1977,16 @@ config_init_argv(_PyCoreConfig *config, const _PyCmdline *cmdline) if (arg0 != NULL) { arg0 = _PyMem_RawWcsdup(arg0); if (arg0 == NULL) { - _Py_wstrlist_clear(argc, argv); + _PyWstrList_Clear(&wargv); return _Py_INIT_NO_MEMORY(); } - assert(argc >= 1); - PyMem_RawFree(argv[0]); - argv[0] = arg0; + PyMem_RawFree(wargv.items[0]); + wargv.items[0] = arg0; } - config->argc = argc; - config->argv = argv; + _PyWstrList_Clear(&config->argv); + config->argv = wargv; return _Py_INIT_OK(); } @@ -2097,7 +2066,7 @@ config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, return err; } - if (_Py_SetArgcArgv(cmdline->args->argc, cmdline->argv) < 0) { + if (_Py_SetArgcArgv(cmdline->argv.length, cmdline->argv.items) < 0) { return _Py_INIT_NO_MEMORY(); } return _Py_INIT_OK(); @@ -2117,9 +2086,8 @@ _PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, const _PyArgv *args, _PyCmdline cmdline; memset(&cmdline, 0, sizeof(cmdline)); - cmdline.args = args; - err = _PyArgv_Decode(cmdline.args, &cmdline.argv); + err = _PyArgv_AsWstrList(args, &cmdline.argv); if (_Py_INIT_FAILED(err)) { goto done; } diff --git a/Python/getopt.c b/Python/getopt.c index 1dc872041ff5..10bd1d49d7d1 100644 --- a/Python/getopt.c +++ b/Python/getopt.c @@ -37,9 +37,9 @@ extern "C" { #endif -int _PyOS_opterr = 1; /* generate error messages */ -int _PyOS_optind = 1; /* index into argv array */ -wchar_t *_PyOS_optarg = NULL; /* optional argument */ +int _PyOS_opterr = 1; /* generate error messages */ +Py_ssize_t _PyOS_optind = 1; /* index into argv array */ +const wchar_t *_PyOS_optarg = NULL; /* optional argument */ static wchar_t *opt_ptr = L""; @@ -61,7 +61,7 @@ void _PyOS_ResetGetOpt(void) opt_ptr = L""; } -int _PyOS_GetOpt(int argc, wchar_t **argv, int *longindex) +int _PyOS_GetOpt(Py_ssize_t argc, wchar_t **argv, int *longindex) { wchar_t *ptr; wchar_t option; diff --git a/Python/pathconfig.c b/Python/pathconfig.c index 14dbba78af12..fb2d19e2797a 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -154,14 +154,14 @@ _PyPathConfig_ClearGlobal(void) static wchar_t* -wstrlist_join(wchar_t sep, int count, wchar_t **list) +_PyWstrList_Join(const _PyWstrList *list, wchar_t sep) { size_t len = 1; /* NUL terminator */ - for (int i=0; i < count; i++) { + for (Py_ssize_t i=0; i < list->length; i++) { if (i != 0) { len++; } - len += wcslen(list[i]); + len += wcslen(list->items[i]); } wchar_t *text = PyMem_RawMalloc(len * sizeof(wchar_t)); @@ -169,8 +169,8 @@ wstrlist_join(wchar_t sep, int count, wchar_t **list) return NULL; } wchar_t *str = text; - for (int i=0; i < count; i++) { - wchar_t *path = list[i]; + for (Py_ssize_t i=0; i < list->length; i++) { + wchar_t *path = list->items[i]; if (i != 0) { *str++ = SEP; } @@ -194,9 +194,7 @@ _PyCoreConfig_SetPathConfig(const _PyCoreConfig *core_config) _PyInitError err; _PyPathConfig path_config = _PyPathConfig_INIT; - path_config.module_search_path = wstrlist_join(DELIM, - core_config->nmodule_search_path, - core_config->module_search_paths); + path_config.module_search_path = _PyWstrList_Join(&core_config->module_search_paths, DELIM); if (path_config.module_search_path == NULL) { goto no_memory; } @@ -244,10 +242,9 @@ static _PyInitError core_config_init_module_search_paths(_PyCoreConfig *config, _PyPathConfig *path_config) { - assert(config->module_search_paths == NULL); - assert(config->nmodule_search_path < 0); + assert(!config->use_module_search_paths); - config->nmodule_search_path = 0; + _PyWstrList_Clear(&config->module_search_paths); const wchar_t *sys_path = path_config->module_search_path; const wchar_t delim = DELIM; @@ -266,12 +263,10 @@ core_config_init_module_search_paths(_PyCoreConfig *config, memcpy(path, sys_path, path_len * sizeof(wchar_t)); path[path_len] = L'\0'; - _PyInitError err = _Py_wstrlist_append(&config->nmodule_search_path, - &config->module_search_paths, - path); + int res = _PyWstrList_Append(&config->module_search_paths, path); PyMem_RawFree(path); - if (_Py_INIT_FAILED(err)) { - return err; + if (res < 0) { + return _Py_INIT_NO_MEMORY(); } if (*p == '\0') { @@ -279,6 +274,7 @@ core_config_init_module_search_paths(_PyCoreConfig *config, } sys_path = p + 1; } + config->use_module_search_paths = 1; return _Py_INIT_OK(); } @@ -294,7 +290,7 @@ _PyCoreConfig_CalculatePathConfig(_PyCoreConfig *config) goto error; } - if (config->nmodule_search_path < 0) { + if (!config->use_module_search_paths) { err = core_config_init_module_search_paths(config, &path_config); if (_Py_INIT_FAILED(err)) { goto error; @@ -352,7 +348,7 @@ _PyInitError _PyCoreConfig_InitPathConfig(_PyCoreConfig *config) { /* Do we need to calculate the path? */ - if ((config->nmodule_search_path < 0) + if (!config->use_module_search_paths || (config->executable == NULL) || (config->prefix == NULL) #ifdef MS_WINDOWS @@ -567,8 +563,10 @@ Py_GetProgramName(void) /* Compute argv[0] which will be prepended to sys.argv */ PyObject* -_PyPathConfig_ComputeArgv0(int argc, wchar_t **argv) +_PyPathConfig_ComputeArgv0(const _PyWstrList *argv) { + assert(_PyWstrList_CheckConsistency(argv)); + wchar_t *argv0; wchar_t *p = NULL; Py_ssize_t n = 0; @@ -585,8 +583,8 @@ _PyPathConfig_ComputeArgv0(int argc, wchar_t **argv) wchar_t fullpath[MAX_PATH]; #endif - argv0 = argv[0]; - if (argc > 0 && argv0 != NULL) { + if (argv->length > 0) { + argv0 = argv->items[0]; have_module_arg = (wcscmp(argv0, L"-m") == 0); have_script_arg = !have_module_arg && (wcscmp(argv0, L"-c") != 0); } diff --git a/Python/preconfig.c b/Python/preconfig.c index 50d66b124922..a86ece57cfce 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -64,33 +64,38 @@ _Py_SetFileSystemEncoding(const char *encoding, const char *errors) /* --- _PyArgv ---------------------------------------------------- */ _PyInitError -_PyArgv_Decode(const _PyArgv *args, wchar_t*** argv_p) +_PyArgv_AsWstrList(const _PyArgv *args, _PyWstrList *list) { - wchar_t** argv; + _PyWstrList wargv = _PyWstrList_INIT; if (args->use_bytes_argv) { - /* +1 for a the NULL terminator */ - size_t size = sizeof(wchar_t*) * (args->argc + 1); - argv = (wchar_t **)PyMem_RawMalloc(size); - if (argv == NULL) { + size_t size = sizeof(wchar_t*) * args->argc; + wargv.items = (wchar_t **)PyMem_RawMalloc(size); + if (wargv.items == NULL) { return _Py_INIT_NO_MEMORY(); } - for (int i = 0; i < args->argc; i++) { + for (Py_ssize_t i = 0; i < args->argc; i++) { size_t len; wchar_t *arg = Py_DecodeLocale(args->bytes_argv[i], &len); if (arg == NULL) { - _Py_wstrlist_clear(i, argv); + _PyWstrList_Clear(&wargv); return DECODE_LOCALE_ERR("command line arguments", (Py_ssize_t)len); } - argv[i] = arg; + wargv.items[i] = arg; + wargv.length++; } - argv[args->argc] = NULL; + + _PyWstrList_Clear(list); + *list = wargv; } else { - argv = args->wchar_argv; + wargv.length = args->argc; + wargv.items = args->wchar_argv; + if (_PyWstrList_Copy(list, &wargv) < 0) { + return _Py_INIT_NO_MEMORY(); + } } - *argv_p = argv; return _Py_INIT_OK(); } @@ -98,25 +103,16 @@ _PyArgv_Decode(const _PyArgv *args, wchar_t*** argv_p) /* --- _PyPreCmdline ------------------------------------------------- */ typedef struct { - const _PyArgv *args; - int argc; - wchar_t **argv; - int nxoption; /* Number of -X options */ - wchar_t **xoptions; /* -X options */ + _PyWstrList argv; + _PyWstrList xoptions; /* -X options */ } _PyPreCmdline; static void precmdline_clear(_PyPreCmdline *cmdline) { - if (cmdline->args->use_bytes_argv && cmdline->argv != NULL) { - _Py_wstrlist_clear(cmdline->args->argc, cmdline->argv); - } - cmdline->argv = NULL; - - _Py_wstrlist_clear(cmdline->nxoption, cmdline->xoptions); - cmdline->nxoption = 0; - cmdline->xoptions = NULL; + _PyWstrList_Clear(&cmdline->argv); + _PyWstrList_Clear(&cmdline->xoptions); } @@ -267,10 +263,10 @@ _Py_get_env_flag(_PyPreConfig *config, int *flag, const char *name) const wchar_t* -_Py_get_xoption(int nxoption, wchar_t * const *xoptions, const wchar_t *name) +_Py_get_xoption(const _PyWstrList *xoptions, const wchar_t *name) { - for (int i=0; i < nxoption; i++) { - const wchar_t *option = xoptions[i]; + for (Py_ssize_t i=0; i < xoptions->length; i++) { + const wchar_t *option = xoptions->items[i]; size_t len; wchar_t *sep = wcschr(option, L'='); if (sep != NULL) { @@ -292,7 +288,7 @@ preconfig_init_utf8_mode(_PyPreConfig *config, const _PyPreCmdline *cmdline) { const wchar_t *xopt; if (cmdline) { - xopt = _Py_get_xoption(cmdline->nxoption, cmdline->xoptions, L"utf8"); + xopt = _Py_get_xoption(&cmdline->xoptions, L"utf8"); } else { xopt = NULL; @@ -435,7 +431,7 @@ preconfig_read(_PyPreConfig *config, const _PyPreCmdline *cmdline) } /* dev_mode */ - if ((cmdline && _Py_get_xoption(cmdline->nxoption, cmdline->xoptions, L"dev")) + if ((cmdline && _Py_get_xoption(&cmdline->xoptions, L"dev")) || _PyPreConfig_GetEnv(config, "PYTHONDEVMODE")) { config->dev_mode = 1; @@ -579,7 +575,7 @@ preconfig_parse_cmdline(_PyPreConfig *config, _PyPreCmdline *cmdline) _PyOS_opterr = 0; do { int longindex = -1; - int c = _PyOS_GetOpt(cmdline->args->argc, cmdline->argv, &longindex); + int c = _PyOS_GetOpt(cmdline->argv.length, cmdline->argv.items, &longindex); if (c == EOF || c == 'c' || c == 'm') { break; @@ -596,12 +592,8 @@ preconfig_parse_cmdline(_PyPreConfig *config, _PyPreCmdline *cmdline) case 'X': { - _PyInitError err; - err = _Py_wstrlist_append(&cmdline->nxoption, - &cmdline->xoptions, - _PyOS_optarg); - if (_Py_INIT_FAILED(err)) { - return err; + if (_PyWstrList_Append(&cmdline->xoptions, _PyOS_optarg) < 0) { + return _Py_INIT_NO_MEMORY(); } break; } @@ -624,9 +616,8 @@ preconfig_from_argv(_PyPreConfig *config, const _PyArgv *args) _PyPreCmdline cmdline; memset(&cmdline, 0, sizeof(cmdline)); - cmdline.args = args; - err = _PyArgv_Decode(cmdline.args, &cmdline.argv); + err = _PyArgv_AsWstrList(args, &cmdline.argv); if (_Py_INIT_FAILED(err)) { goto done; } diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 99fd460ff5ab..b3330a01f7c1 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -2739,35 +2739,35 @@ PySys_SetPath(const wchar_t *path) } static PyObject * -makeargvobject(int argc, wchar_t **argv) +make_sys_argv(int argc, wchar_t * const * argv) { - PyObject *av; - if (argc <= 0 || argv == NULL) { - /* Ensure at least one (empty) argument is seen */ - static wchar_t *empty_argv[1] = {L""}; - argv = empty_argv; - argc = 1; + PyObject *list = PyList_New(argc); + if (list == NULL) { + return NULL; } - av = PyList_New(argc); - if (av != NULL) { - int i; - for (i = 0; i < argc; i++) { - PyObject *v = PyUnicode_FromWideChar(argv[i], -1); - if (v == NULL) { - Py_DECREF(av); - av = NULL; - break; - } - PyList_SET_ITEM(av, i, v); + + for (Py_ssize_t i = 0; i < argc; i++) { + PyObject *v = PyUnicode_FromWideChar(argv[i], -1); + if (v == NULL) { + Py_DECREF(list); + return NULL; } + PyList_SET_ITEM(list, i, v); } - return av; + return list; } void PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath) { - PyObject *av = makeargvobject(argc, argv); + if (argc < 1 || argv == NULL) { + /* Ensure at least one (empty) argument is seen */ + wchar_t* empty_argv[1] = {L""}; + argv = empty_argv; + argc = 1; + } + + PyObject *av = make_sys_argv(argc, argv); if (av == NULL) { Py_FatalError("no mem for sys.argv"); } @@ -2780,7 +2780,8 @@ PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath) if (updatepath) { /* If argv[0] is not '-c' nor '-m', prepend argv[0] to sys.path. If argv[0] is a symlink, use the real path. */ - PyObject *argv0 = _PyPathConfig_ComputeArgv0(argc, argv); + const _PyWstrList argv_list = {.length = argc, .items = argv}; + PyObject *argv0 = _PyPathConfig_ComputeArgv0(&argv_list); if (argv0 == NULL) { Py_FatalError("can't compute path0 from argv"); } From webhook-mailer at python.org Fri Mar 15 11:03:29 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 15 Mar 2019 15:03:29 -0000 Subject: [Python-checkins] bpo-36301: _PyCoreConfig_Read() ensures that argv is not empty (GH-12347) Message-ID: https://github.com/python/cpython/commit/625997622b4736e9184bdd8bf1e22a7b51be1afc commit: 625997622b4736e9184bdd8bf1e22a7b51be1afc branch: master author: Victor Stinner committer: GitHub date: 2019-03-15T16:03:23+01:00 summary: bpo-36301: _PyCoreConfig_Read() ensures that argv is not empty (GH-12347) If argv is empty, add an empty string. files: M Lib/test/test_embed.py M Python/coreconfig.c diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 952bc327ddb3..374346e3cc89 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -292,7 +292,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'pycache_prefix': None, 'program_name': './_testembed', - 'argv': [], + 'argv': [""], 'program': None, 'xoptions': [], diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 15107fa36ce9..08273765098e 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -1464,6 +1464,13 @@ _PyCoreConfig_Read(_PyCoreConfig *config, const _PyPreConfig *preconfig) return err; } + if (config->argv.length < 1) { + /* Ensure at least one (empty) argument is seen */ + if (_PyWstrList_Append(&config->argv, L"") < 0) { + return _Py_INIT_NO_MEMORY(); + } + } + assert(config->preconfig.use_environment >= 0); assert(config->filesystem_encoding != NULL); assert(config->filesystem_errors != NULL); From webhook-mailer at python.org Fri Mar 15 11:03:47 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 15 Mar 2019 15:03:47 -0000 Subject: [Python-checkins] bpo-36235: Fix CFLAGS in distutils customize_compiler() (GH-12236) (GH-12349) Message-ID: https://github.com/python/cpython/commit/37f6971777c05b5ca9c157606896b7ff458756a5 commit: 37f6971777c05b5ca9c157606896b7ff458756a5 branch: 2.7 author: Victor Stinner committer: GitHub date: 2019-03-15T16:03:44+01:00 summary: bpo-36235: Fix CFLAGS in distutils customize_compiler() (GH-12236) (GH-12349) Fix CFLAGS in customize_compiler() of distutils.sysconfig: when the CFLAGS environment variable is defined, don't override CFLAGS variable with the OPT variable anymore. Initial patch written by David Malcolm. Co-Authored-By: David Malcolm (cherry picked from commit 86082c22d23285995a32aabb491527c9f5629556) files: A Misc/NEWS.d/next/Library/2019-03-08-13-32-21.bpo-36235._M72wU.rst M Lib/distutils/sysconfig.py M Lib/distutils/tests/test_sysconfig.py diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py index de7da1d41394..8f49dac6b12b 100644 --- a/Lib/distutils/sysconfig.py +++ b/Lib/distutils/sysconfig.py @@ -171,8 +171,8 @@ def customize_compiler(compiler): _osx_support.customize_compiler(_config_vars) _config_vars['CUSTOMIZED_OSX_COMPILER'] = 'True' - (cc, cxx, opt, cflags, ccshared, ldshared, so_ext, ar, ar_flags) = \ - get_config_vars('CC', 'CXX', 'OPT', 'CFLAGS', + (cc, cxx, cflags, ccshared, ldshared, so_ext, ar, ar_flags) = \ + get_config_vars('CC', 'CXX', 'CFLAGS', 'CCSHARED', 'LDSHARED', 'SO', 'AR', 'ARFLAGS') @@ -196,7 +196,7 @@ def customize_compiler(compiler): if 'LDFLAGS' in os.environ: ldshared = ldshared + ' ' + os.environ['LDFLAGS'] if 'CFLAGS' in os.environ: - cflags = opt + ' ' + os.environ['CFLAGS'] + cflags = cflags + ' ' + os.environ['CFLAGS'] ldshared = ldshared + ' ' + os.environ['CFLAGS'] if 'CPPFLAGS' in os.environ: cpp = cpp + ' ' + os.environ['CPPFLAGS'] diff --git a/Lib/distutils/tests/test_sysconfig.py b/Lib/distutils/tests/test_sysconfig.py index eb4d27c39efd..2be5d245f9d9 100644 --- a/Lib/distutils/tests/test_sysconfig.py +++ b/Lib/distutils/tests/test_sysconfig.py @@ -8,8 +8,9 @@ import textwrap from distutils import sysconfig +from distutils.ccompiler import get_default_compiler from distutils.tests import support -from test.test_support import TESTFN +from test.test_support import TESTFN, swap_item class SysconfigTestCase(support.EnvironGuard, unittest.TestCase): @@ -50,6 +51,30 @@ def test_get_python_inc(self): python_h = os.path.join(inc_dir, "Python.h") self.assertTrue(os.path.isfile(python_h), python_h) + @unittest.skipUnless(get_default_compiler() == 'unix', + 'not testing if default compiler is not unix') + def test_customize_compiler(self): + os.environ['AR'] = 'my_ar' + os.environ['CC'] = 'my_cc' + os.environ['ARFLAGS'] = '--myarflags' + os.environ['CFLAGS'] = '--mycflags' + + # make sure AR gets caught + class compiler: + compiler_type = 'unix' + + def set_executables(self, **kw): + self.exes = kw + + # Make sure that sysconfig._config_vars is initialized + sysconfig.get_config_vars() + + comp = compiler() + with swap_item(sysconfig._config_vars, 'CFLAGS', '--sysconfig-cflags'): + sysconfig.customize_compiler(comp) + self.assertEqual(comp.exes['archiver'], 'my_ar --myarflags') + self.assertEqual(comp.exes['compiler'], 'my_cc --sysconfig-cflags --mycflags') + def test_parse_makefile_base(self): self.makefile = test.test_support.TESTFN fd = open(self.makefile, 'w') diff --git a/Misc/NEWS.d/next/Library/2019-03-08-13-32-21.bpo-36235._M72wU.rst b/Misc/NEWS.d/next/Library/2019-03-08-13-32-21.bpo-36235._M72wU.rst new file mode 100644 index 000000000000..59df98c101af --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-08-13-32-21.bpo-36235._M72wU.rst @@ -0,0 +1,4 @@ +Fix ``CFLAGS`` in ``customize_compiler()`` of ``distutils.sysconfig``: when +the ``CFLAGS`` environment variable is defined, don't override ``CFLAGS`` +variable with the ``OPT`` variable anymore. Initial patch written by David +Malcolm. From webhook-mailer at python.org Fri Mar 15 11:03:53 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 15 Mar 2019 15:03:53 -0000 Subject: [Python-checkins] bpo-36235: Fix CFLAGS in distutils customize_compiler() (GH-12236) (GH-12348) Message-ID: https://github.com/python/cpython/commit/6c0e0d141a07cc3fd2441d9df8d762f56bf7edf2 commit: 6c0e0d141a07cc3fd2441d9df8d762f56bf7edf2 branch: 3.7 author: Victor Stinner committer: GitHub date: 2019-03-15T16:03:50+01:00 summary: bpo-36235: Fix CFLAGS in distutils customize_compiler() (GH-12236) (GH-12348) Fix CFLAGS in customize_compiler() of distutils.sysconfig: when the CFLAGS environment variable is defined, don't override CFLAGS variable with the OPT variable anymore. Initial patch written by David Malcolm. Co-Authored-By: David Malcolm (cherry picked from commit 86082c22d23285995a32aabb491527c9f5629556) files: A Misc/NEWS.d/next/Library/2019-03-08-13-32-21.bpo-36235._M72wU.rst M Lib/distutils/sysconfig.py M Lib/distutils/tests/test_sysconfig.py diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py index 83160f8dcc59..f803a1d13ac8 100644 --- a/Lib/distutils/sysconfig.py +++ b/Lib/distutils/sysconfig.py @@ -183,8 +183,8 @@ def customize_compiler(compiler): _osx_support.customize_compiler(_config_vars) _config_vars['CUSTOMIZED_OSX_COMPILER'] = 'True' - (cc, cxx, opt, cflags, ccshared, ldshared, shlib_suffix, ar, ar_flags) = \ - get_config_vars('CC', 'CXX', 'OPT', 'CFLAGS', + (cc, cxx, cflags, ccshared, ldshared, shlib_suffix, ar, ar_flags) = \ + get_config_vars('CC', 'CXX', 'CFLAGS', 'CCSHARED', 'LDSHARED', 'SHLIB_SUFFIX', 'AR', 'ARFLAGS') if 'CC' in os.environ: @@ -207,7 +207,7 @@ def customize_compiler(compiler): if 'LDFLAGS' in os.environ: ldshared = ldshared + ' ' + os.environ['LDFLAGS'] if 'CFLAGS' in os.environ: - cflags = opt + ' ' + os.environ['CFLAGS'] + cflags = cflags + ' ' + os.environ['CFLAGS'] ldshared = ldshared + ' ' + os.environ['CFLAGS'] if 'CPPFLAGS' in os.environ: cpp = cpp + ' ' + os.environ['CPPFLAGS'] diff --git a/Lib/distutils/tests/test_sysconfig.py b/Lib/distutils/tests/test_sysconfig.py index fe4a2994e3b0..4bf6a067d4d9 100644 --- a/Lib/distutils/tests/test_sysconfig.py +++ b/Lib/distutils/tests/test_sysconfig.py @@ -9,7 +9,7 @@ from distutils import sysconfig from distutils.ccompiler import get_default_compiler from distutils.tests import support -from test.support import TESTFN, run_unittest, check_warnings +from test.support import TESTFN, run_unittest, check_warnings, swap_item class SysconfigTestCase(support.EnvironGuard, unittest.TestCase): def setUp(self): @@ -78,7 +78,9 @@ def test_srcdir_independent_of_cwd(self): 'not testing if default compiler is not unix') def test_customize_compiler(self): os.environ['AR'] = 'my_ar' - os.environ['ARFLAGS'] = '-arflags' + os.environ['CC'] = 'my_cc' + os.environ['ARFLAGS'] = '--myarflags' + os.environ['CFLAGS'] = '--mycflags' # make sure AR gets caught class compiler: @@ -87,9 +89,14 @@ class compiler: def set_executables(self, **kw): self.exes = kw + # Make sure that sysconfig._config_vars is initialized + sysconfig.get_config_vars() + comp = compiler() - sysconfig.customize_compiler(comp) - self.assertEqual(comp.exes['archiver'], 'my_ar -arflags') + with swap_item(sysconfig._config_vars, 'CFLAGS', '--sysconfig-cflags'): + sysconfig.customize_compiler(comp) + self.assertEqual(comp.exes['archiver'], 'my_ar --myarflags') + self.assertEqual(comp.exes['compiler'], 'my_cc --sysconfig-cflags --mycflags') def test_parse_makefile_base(self): self.makefile = TESTFN diff --git a/Misc/NEWS.d/next/Library/2019-03-08-13-32-21.bpo-36235._M72wU.rst b/Misc/NEWS.d/next/Library/2019-03-08-13-32-21.bpo-36235._M72wU.rst new file mode 100644 index 000000000000..59df98c101af --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-08-13-32-21.bpo-36235._M72wU.rst @@ -0,0 +1,4 @@ +Fix ``CFLAGS`` in ``customize_compiler()`` of ``distutils.sysconfig``: when +the ``CFLAGS`` environment variable is defined, don't override ``CFLAGS`` +variable with the ``OPT`` variable anymore. Initial patch written by David +Malcolm. From webhook-mailer at python.org Fri Mar 15 11:04:24 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 15 Mar 2019 15:04:24 -0000 Subject: [Python-checkins] bpo-33608: Fix PyEval_InitThreads() warning (GH-12346) Message-ID: https://github.com/python/cpython/commit/e3f4070aee6f2d489416fdcafd51d6b04d661919 commit: e3f4070aee6f2d489416fdcafd51d6b04d661919 branch: master author: Victor Stinner committer: GitHub date: 2019-03-15T16:04:20+01:00 summary: bpo-33608: Fix PyEval_InitThreads() warning (GH-12346) The function has no return value. Fix the following warning on Windows: python\ceval.c(180): warning C4098: 'PyEval_InitThreads': 'void' function returning a value files: M Python/ceval.c diff --git a/Python/ceval.c b/Python/ceval.c index 373cde9a17bb..dd8826bf9c83 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -177,7 +177,7 @@ PyEval_InitThreads(void) _PyRuntime.ceval.pending.lock = PyThread_allocate_lock(); if (_PyRuntime.ceval.pending.lock == NULL) { - return Py_FatalError("Can't initialize threads for pending calls"); + Py_FatalError("Can't initialize threads for pending calls"); } } From webhook-mailer at python.org Fri Mar 15 12:18:44 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 15 Mar 2019 16:18:44 -0000 Subject: [Python-checkins] Add the meaning of the returned value of PyTypeObject.tp_init (GH-12325) Message-ID: https://github.com/python/cpython/commit/7c4fcb6b05792e94dd5f8aca032f01314248f5ac commit: 7c4fcb6b05792e94dd5f8aca032f01314248f5ac branch: master author: St?phane Wirtel committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-15T09:18:36-07:00 summary: Add the meaning of the returned value of PyTypeObject.tp_init (GH-12325) files: M Doc/c-api/typeobj.rst diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index 5615f59514b9..f36cfe551e4c 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -1558,6 +1558,8 @@ and :c:type:`PyType_Type` effectively act as defaults.) :c:member:`~PyTypeObject.tp_init` function is called; if :c:member:`~PyTypeObject.tp_new` returns an instance of a subtype of the original type, the subtype's :c:member:`~PyTypeObject.tp_init` is called. + Returns ``0`` on success, ``-1`` and sets an exception on error. + **Inheritance:** This field is inherited by subtypes. From webhook-mailer at python.org Fri Mar 15 17:47:57 2019 From: webhook-mailer at python.org (Eric Snow) Date: Fri, 15 Mar 2019 21:47:57 -0000 Subject: [Python-checkins] bpo-33608: Deal with pending calls relative to runtime shutdown. (gh-12246) Message-ID: https://github.com/python/cpython/commit/842a2f07f2f08a935ef470bfdaeef40f87490cfc commit: 842a2f07f2f08a935ef470bfdaeef40f87490cfc branch: master author: Eric Snow committer: GitHub date: 2019-03-15T15:47:51-06:00 summary: bpo-33608: Deal with pending calls relative to runtime shutdown. (gh-12246) 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 c8e09bac074d..2ead96c7abe3 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -11,7 +11,10 @@ extern "C" { #include "pycore_atomic.h" #include "pythread.h" +PyAPI_FUNC(void) _Py_FinishPendingCalls(void); + struct _pending_calls { + int finishing; PyThread_type_lock lock; /* Request for running pending calls. */ _Py_atomic_int calls_to_do; diff --git a/Python/ceval.c b/Python/ceval.c index dd8826bf9c83..d6a0b335955e 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -330,31 +330,33 @@ _PyEval_SignalReceived(void) /* Push one item onto the queue while holding the lock. */ static int -_push_pending_call(int (*func)(void *), void *arg) +_push_pending_call(struct _pending_calls *pending, + int (*func)(void *), void *arg) { - int i = _PyRuntime.ceval.pending.last; + int i = pending->last; int j = (i + 1) % NPENDINGCALLS; - if (j == _PyRuntime.ceval.pending.first) { + if (j == pending->first) { return -1; /* Queue full */ } - _PyRuntime.ceval.pending.calls[i].func = func; - _PyRuntime.ceval.pending.calls[i].arg = arg; - _PyRuntime.ceval.pending.last = j; + pending->calls[i].func = func; + pending->calls[i].arg = arg; + pending->last = j; return 0; } /* Pop one item off the queue while holding the lock. */ static void -_pop_pending_call(int (**func)(void *), void **arg) +_pop_pending_call(struct _pending_calls *pending, + int (**func)(void *), void **arg) { - int i = _PyRuntime.ceval.pending.first; - if (i == _PyRuntime.ceval.pending.last) { + int i = pending->first; + if (i == pending->last) { return; /* Queue empty */ } - *func = _PyRuntime.ceval.pending.calls[i].func; - *arg = _PyRuntime.ceval.pending.calls[i].arg; - _PyRuntime.ceval.pending.first = (i + 1) % NPENDINGCALLS; + *func = pending->calls[i].func; + *arg = pending->calls[i].arg; + pending->first = (i + 1) % NPENDINGCALLS; } /* This implementation is thread-safe. It allows @@ -365,9 +367,23 @@ _pop_pending_call(int (**func)(void *), void **arg) int Py_AddPendingCall(int (*func)(void *), void *arg) { - PyThread_acquire_lock(_PyRuntime.ceval.pending.lock, WAIT_LOCK); - int result = _push_pending_call(func, arg); - PyThread_release_lock(_PyRuntime.ceval.pending.lock); + struct _pending_calls *pending = &_PyRuntime.ceval.pending; + + PyThread_acquire_lock(pending->lock, WAIT_LOCK); + if (pending->finishing) { + PyThread_release_lock(pending->lock); + + PyObject *exc, *val, *tb; + PyErr_Fetch(&exc, &val, &tb); + PyErr_SetString(PyExc_SystemError, + "Py_AddPendingCall: cannot add pending calls " + "(Python shutting down)"); + PyErr_Print(); + PyErr_Restore(exc, val, tb); + return -1; + } + int result = _push_pending_call(pending, func, arg); + PyThread_release_lock(pending->lock); /* signal main loop */ SIGNAL_PENDING_CALLS(); @@ -400,7 +416,7 @@ handle_signals(void) } static int -make_pending_calls(void) +make_pending_calls(struct _pending_calls* pending) { static int busy = 0; @@ -425,9 +441,9 @@ make_pending_calls(void) void *arg = NULL; /* pop one item off the queue while holding the lock */ - PyThread_acquire_lock(_PyRuntime.ceval.pending.lock, WAIT_LOCK); - _pop_pending_call(&func, &arg); - PyThread_release_lock(_PyRuntime.ceval.pending.lock); + PyThread_acquire_lock(pending->lock, WAIT_LOCK); + _pop_pending_call(pending, &func, &arg); + PyThread_release_lock(pending->lock); /* having released the lock, perform the callback */ if (func == NULL) { @@ -448,6 +464,30 @@ make_pending_calls(void) return res; } +void +_Py_FinishPendingCalls(void) +{ + struct _pending_calls *pending = &_PyRuntime.ceval.pending; + + assert(PyGILState_Check()); + + PyThread_acquire_lock(pending->lock, WAIT_LOCK); + pending->finishing = 1; + PyThread_release_lock(pending->lock); + + if (!_Py_atomic_load_relaxed(&(pending->calls_to_do))) { + return; + } + + if (make_pending_calls(pending) < 0) { + PyObject *exc, *val, *tb; + PyErr_Fetch(&exc, &val, &tb); + PyErr_BadInternalCall(); + _PyErr_ChainExceptions(exc, val, tb); + PyErr_Print(); + } +} + /* Py_MakePendingCalls() is a simple wrapper for the sake of backward-compatibility. */ int @@ -462,7 +502,7 @@ Py_MakePendingCalls(void) return res; } - res = make_pending_calls(); + res = make_pending_calls(&_PyRuntime.ceval.pending); if (res != 0) { return res; } @@ -1012,7 +1052,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) if (_Py_atomic_load_relaxed( &_PyRuntime.ceval.pending.calls_to_do)) { - if (make_pending_calls() != 0) { + if (make_pending_calls(&_PyRuntime.ceval.pending) != 0) { goto error; } } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 0902508429a3..c2d431c912b7 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1049,17 +1049,21 @@ Py_FinalizeEx(void) if (!_PyRuntime.initialized) return status; + // Wrap up existing "threading"-module-created, non-daemon threads. wait_for_thread_shutdown(); /* Get current thread state and interpreter pointer */ tstate = _PyThreadState_GET(); interp = tstate->interp; + // Make any remaining pending calls. + _Py_FinishPendingCalls(); + /* The interpreter is still entirely intact at this point, and the * exit funcs may be relying on that. In particular, if some thread * or exit func is still waiting to do an import, the import machinery * expects Py_IsInitialized() to return true. So don't say the - * interpreter is uninitialized until after the exit funcs have run. + * runtime is uninitialized until after the exit funcs have run. * Note that Threading.py uses an exit func to do a join on all the * threads created thru it, so this also protects pending imports in * the threads created via Threading. @@ -1462,6 +1466,7 @@ Py_EndInterpreter(PyThreadState *tstate) Py_FatalError("Py_EndInterpreter: thread still has a frame"); interp->finalizing = 1; + // Wrap up existing "threading"-module-created, non-daemon threads. wait_for_thread_shutdown(); call_py_exitfuncs(interp); From webhook-mailer at python.org Fri Mar 15 18:35:53 2019 From: webhook-mailer at python.org (Eric Snow) Date: Fri, 15 Mar 2019 22:35:53 -0000 Subject: [Python-checkins] bpo-36097: Use only public C-API in the_xxsubinterpreters module (adding as necessary). (gh-12359) Message-ID: https://github.com/python/cpython/commit/c11183cdcff6af13c4339fdcce84ab63f7930ddc commit: c11183cdcff6af13c4339fdcce84ab63f7930ddc branch: master author: Eric Snow committer: GitHub date: 2019-03-15T16:35:46-06:00 summary: bpo-36097: Use only public C-API in the_xxsubinterpreters module (adding as necessary). (gh-12359) files: A Include/cpython/interpreteridobject.h A Include/interpreteridobject.h A Objects/interpreteridobject.c M Include/cpython/pystate.h M Include/internal/pycore_pystate.h M Makefile.pre.in M Modules/_xxsubinterpretersmodule.c M Objects/object.c M PCbuild/pythoncore.vcxproj M PCbuild/pythoncore.vcxproj.filters M Python/pystate.c M setup.py diff --git a/Include/cpython/interpreteridobject.h b/Include/cpython/interpreteridobject.h new file mode 100644 index 000000000000..cb72c2b0895a --- /dev/null +++ b/Include/cpython/interpreteridobject.h @@ -0,0 +1,21 @@ +#ifndef Py_CPYTHON_INTERPRETERIDOBJECT_H +# error "this header file must not be included directly" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Interpreter ID Object */ + +PyAPI_DATA(PyTypeObject) _PyInterpreterID_Type; + +PyAPI_FUNC(PyObject *) _PyInterpreterID_New(int64_t); +PyAPI_FUNC(PyObject *) _PyInterpreterState_GetIDObject(PyInterpreterState *); +PyAPI_FUNC(PyInterpreterState *) _PyInterpreterID_LookUp(PyObject *); + +PyAPI_FUNC(int64_t) _Py_CoerceID(PyObject *); + +#ifdef __cplusplus +} +#endif diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h index 3fca78f9ddf2..5439d07e6af3 100644 --- a/Include/cpython/pystate.h +++ b/Include/cpython/pystate.h @@ -30,9 +30,13 @@ typedef struct { (_PyMainInterpreterConfig){.install_signal_handlers = -1} /* Note: _PyMainInterpreterConfig_INIT sets other fields to 0/NULL */ +PyAPI_FUNC(int) _PyInterpreterState_RequiresIDRef(PyInterpreterState *); +PyAPI_FUNC(void) _PyInterpreterState_RequireIDRef(PyInterpreterState *, int); + PyAPI_FUNC(_PyCoreConfig *) _PyInterpreterState_GetCoreConfig(PyInterpreterState *); PyAPI_FUNC(_PyMainInterpreterConfig *) _PyInterpreterState_GetMainConfig(PyInterpreterState *); +PyAPI_FUNC(PyObject *) _PyInterpreterState_GetMainModule(PyInterpreterState *); /* State unique per thread */ @@ -214,6 +218,65 @@ PyAPI_FUNC(PyThreadState *) PyThreadState_Next(PyThreadState *); typedef struct _frame *(*PyThreadFrameGetter)(PyThreadState *self_); +/* cross-interpreter data */ + +struct _xid; + +// _PyCrossInterpreterData is similar to Py_buffer as an effectively +// opaque struct that holds data outside the object machinery. This +// is necessary to pass safely between interpreters in the same process. +typedef struct _xid { + // data is the cross-interpreter-safe derivation of a Python object + // (see _PyObject_GetCrossInterpreterData). It will be NULL if the + // new_object func (below) encodes the data. + void *data; + // obj is the Python object from which the data was derived. This + // is non-NULL only if the data remains bound to the object in some + // way, such that the object must be "released" (via a decref) when + // the data is released. In that case the code that sets the field, + // likely a registered "crossinterpdatafunc", is responsible for + // ensuring it owns the reference (i.e. incref). + PyObject *obj; + // interp is the ID of the owning interpreter of the original + // object. It corresponds to the active interpreter when + // _PyObject_GetCrossInterpreterData() was called. This should only + // be set by the cross-interpreter machinery. + // + // We use the ID rather than the PyInterpreterState to avoid issues + // with deleted interpreters. Note that IDs are never re-used, so + // each one will always correspond to a specific interpreter + // (whether still alive or not). + int64_t interp; + // new_object is a function that returns a new object in the current + // interpreter given the data. The resulting object (a new + // reference) will be equivalent to the original object. This field + // is required. + PyObject *(*new_object)(struct _xid *); + // free is called when the data is released. If it is NULL then + // nothing will be done to free the data. For some types this is + // okay (e.g. bytes) and for those types this field should be set + // to NULL. However, for most the data was allocated just for + // cross-interpreter use, so it must be freed when + // _PyCrossInterpreterData_Release is called or the memory will + // leak. In that case, at the very least this field should be set + // to PyMem_RawFree (the default if not explicitly set to NULL). + // The call will happen with the original interpreter activated. + void (*free)(void *); +} _PyCrossInterpreterData; + +PyAPI_FUNC(int) _PyObject_GetCrossInterpreterData(PyObject *, _PyCrossInterpreterData *); +PyAPI_FUNC(PyObject *) _PyCrossInterpreterData_NewObject(_PyCrossInterpreterData *); +PyAPI_FUNC(void) _PyCrossInterpreterData_Release(_PyCrossInterpreterData *); + +PyAPI_FUNC(int) _PyObject_CheckCrossInterpreterData(PyObject *); + +/* cross-interpreter data registry */ + +typedef int (*crossinterpdatafunc)(PyObject *, struct _xid *); + +PyAPI_FUNC(int) _PyCrossInterpreterData_RegisterClass(PyTypeObject *, crossinterpdatafunc); +PyAPI_FUNC(crossinterpdatafunc) _PyCrossInterpreterData_Lookup(PyObject *); + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 456dda2e8490..945d9923a884 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -29,6 +29,7 @@ struct _is { int64_t id; int64_t id_refcount; + int requires_idref; PyThread_type_lock id_mutex; int finalizing; @@ -89,66 +90,12 @@ PyAPI_FUNC(void) _PyInterpreterState_IDIncref(struct _is *); PyAPI_FUNC(void) _PyInterpreterState_IDDecref(struct _is *); -/* cross-interpreter data */ - -struct _xid; - -// _PyCrossInterpreterData is similar to Py_buffer as an effectively -// opaque struct that holds data outside the object machinery. This -// is necessary to pass safely between interpreters in the same process. -typedef struct _xid { - // data is the cross-interpreter-safe derivation of a Python object - // (see _PyObject_GetCrossInterpreterData). It will be NULL if the - // new_object func (below) encodes the data. - void *data; - // obj is the Python object from which the data was derived. This - // is non-NULL only if the data remains bound to the object in some - // way, such that the object must be "released" (via a decref) when - // the data is released. In that case the code that sets the field, - // likely a registered "crossinterpdatafunc", is responsible for - // ensuring it owns the reference (i.e. incref). - PyObject *obj; - // interp is the ID of the owning interpreter of the original - // object. It corresponds to the active interpreter when - // _PyObject_GetCrossInterpreterData() was called. This should only - // be set by the cross-interpreter machinery. - // - // We use the ID rather than the PyInterpreterState to avoid issues - // with deleted interpreters. - int64_t interp; - // new_object is a function that returns a new object in the current - // interpreter given the data. The resulting object (a new - // reference) will be equivalent to the original object. This field - // is required. - PyObject *(*new_object)(struct _xid *); - // free is called when the data is released. If it is NULL then - // nothing will be done to free the data. For some types this is - // okay (e.g. bytes) and for those types this field should be set - // to NULL. However, for most the data was allocated just for - // cross-interpreter use, so it must be freed when - // _PyCrossInterpreterData_Release is called or the memory will - // leak. In that case, at the very least this field should be set - // to PyMem_RawFree (the default if not explicitly set to NULL). - // The call will happen with the original interpreter activated. - void (*free)(void *); -} _PyCrossInterpreterData; - -typedef int (*crossinterpdatafunc)(PyObject *, _PyCrossInterpreterData *); -PyAPI_FUNC(int) _PyObject_CheckCrossInterpreterData(PyObject *); - -PyAPI_FUNC(int) _PyObject_GetCrossInterpreterData(PyObject *, _PyCrossInterpreterData *); -PyAPI_FUNC(PyObject *) _PyCrossInterpreterData_NewObject(_PyCrossInterpreterData *); -PyAPI_FUNC(void) _PyCrossInterpreterData_Release(_PyCrossInterpreterData *); - /* cross-interpreter data registry */ /* For now we use a global registry of shareable classes. An alternative would be to add a tp_* slot for a class's crossinterpdatafunc. It would be simpler and more efficient. */ -PyAPI_FUNC(int) _PyCrossInterpreterData_Register_Class(PyTypeObject *, crossinterpdatafunc); -PyAPI_FUNC(crossinterpdatafunc) _PyCrossInterpreterData_Lookup(PyObject *); - struct _xidregitem; struct _xidregitem { diff --git a/Include/interpreteridobject.h b/Include/interpreteridobject.h new file mode 100644 index 000000000000..e744fcdc9ff1 --- /dev/null +++ b/Include/interpreteridobject.h @@ -0,0 +1,17 @@ +#ifndef Py_INTERPRETERIDOBJECT_H +#define Py_INTERPRETERIDOBJECT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +# define Py_CPYTHON_INTERPRETERIDOBJECT_H +# include "cpython/interpreteridobject.h" +# undef Py_CPYTHON_INTERPRETERIDOBJECT_H +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERPRETERIDOBJECT_H */ diff --git a/Makefile.pre.in b/Makefile.pre.in index 135c3230292b..8042e8e81a05 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -391,6 +391,7 @@ OBJECT_OBJS= \ Objects/floatobject.o \ Objects/frameobject.o \ Objects/funcobject.o \ + Objects/interpreteridobject.o \ Objects/iterobject.o \ Objects/listobject.o \ Objects/longobject.o \ @@ -977,6 +978,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/funcobject.h \ $(srcdir)/Include/genobject.h \ $(srcdir)/Include/import.h \ + $(srcdir)/Include/interpreteridobject.h \ $(srcdir)/Include/intrcheck.h \ $(srcdir)/Include/iterobject.h \ $(srcdir)/Include/listobject.h \ @@ -1039,6 +1041,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/cpython/abstract.h \ $(srcdir)/Include/cpython/coreconfig.h \ $(srcdir)/Include/cpython/dictobject.h \ + $(srcdir)/Include/cpython/interpreteridobject.h \ $(srcdir)/Include/cpython/object.h \ $(srcdir)/Include/cpython/objimpl.h \ $(srcdir)/Include/cpython/pyerrors.h \ diff --git a/Modules/_xxsubinterpretersmodule.c b/Modules/_xxsubinterpretersmodule.c index 79c9def72629..1cf43b7ac76e 100644 --- a/Modules/_xxsubinterpretersmodule.c +++ b/Modules/_xxsubinterpretersmodule.c @@ -4,7 +4,7 @@ #include "Python.h" #include "frameobject.h" -#include "pycore_pystate.h" +#include "interpreteridobject.h" static char * @@ -31,38 +31,6 @@ _get_current(void) return _PyInterpreterState_Get(); } -static int64_t -_coerce_id(PyObject *orig) -{ - PyObject *pyid = PyNumber_Long(orig); - if (pyid == NULL) { - if (PyErr_ExceptionMatches(PyExc_TypeError)) { - PyErr_Format(PyExc_TypeError, - "'id' must be a non-negative int, got %R", orig); - } - else { - PyErr_Format(PyExc_ValueError, - "'id' must be a non-negative int, got %R", orig); - } - return -1; - } - int64_t id = PyLong_AsLongLong(pyid); - Py_DECREF(pyid); - if (id == -1 && PyErr_Occurred() != NULL) { - if (!PyErr_ExceptionMatches(PyExc_OverflowError)) { - PyErr_Format(PyExc_ValueError, - "'id' must be a non-negative int, got %R", orig); - } - return -1; - } - if (id < 0) { - PyErr_Format(PyExc_ValueError, - "'id' must be a non-negative int, got %R", orig); - return -1; - } - return id; -} - /* data-sharing-specific code ***********************************************/ @@ -71,6 +39,8 @@ struct _sharednsitem { _PyCrossInterpreterData data; }; +static void _sharednsitem_clear(struct _sharednsitem *); // forward + static int _sharednsitem_init(struct _sharednsitem *item, PyObject *key, PyObject *value) { @@ -79,6 +49,7 @@ _sharednsitem_init(struct _sharednsitem *item, PyObject *key, PyObject *value) return -1; } if (_PyObject_GetCrossInterpreterData(value, &item->data) != 0) { + _sharednsitem_clear(item); return -1; } return 0; @@ -89,6 +60,7 @@ _sharednsitem_clear(struct _sharednsitem *item) { if (item->name != NULL) { PyMem_Free(item->name); + item->name = NULL; } _PyCrossInterpreterData_Release(&item->data); } @@ -1339,13 +1311,13 @@ _channel_send(_channels *channels, int64_t id, PyObject *obj) return -1; } if (_PyObject_GetCrossInterpreterData(obj, data) != 0) { - PyMem_Free(data); PyThread_release_lock(mutex); + PyMem_Free(data); return -1; } // Add the data to the channel. - int res = _channel_add(chan, interp->id, data); + int res = _channel_add(chan, PyInterpreterState_GetID(interp), data); PyThread_release_lock(mutex); if (res != 0) { _PyCrossInterpreterData_Release(data); @@ -1373,7 +1345,7 @@ _channel_recv(_channels *channels, int64_t id) // Past this point we are responsible for releasing the mutex. // Pop off the next item from the channel. - _PyCrossInterpreterData *data = _channel_next(chan, interp->id); + _PyCrossInterpreterData *data = _channel_next(chan, PyInterpreterState_GetID(interp)); PyThread_release_lock(mutex); if (data == NULL) { if (!PyErr_Occurred()) { @@ -1410,7 +1382,7 @@ _channel_drop(_channels *channels, int64_t id, int send, int recv) // Past this point we are responsible for releasing the mutex. // Close one or both of the two ends. - int res = _channel_close_interpreter(chan, interp->id, send-recv); + int res = _channel_close_interpreter(chan, PyInterpreterState_GetID(interp), send-recv); PyThread_release_lock(mutex); return res; } @@ -1481,7 +1453,7 @@ channelid_new(PyTypeObject *cls, PyObject *args, PyObject *kwds) cid = ((channelid *)id)->id; } else { - cid = _coerce_id(id); + cid = _Py_CoerceID(id); if (cid < 0) { return NULL; } @@ -1875,7 +1847,7 @@ _run_script(PyInterpreterState *interp, const char *codestr, PyObject *excval = NULL; PyObject *tb = NULL; - PyObject *main_mod = PyMapping_GetItemString(interp->modules, "__main__"); + PyObject *main_mod = _PyInterpreterState_GetMainModule(interp); if (main_mod == NULL) { goto error; } @@ -1974,272 +1946,6 @@ _run_script_in_interpreter(PyInterpreterState *interp, const char *codestr, return result; } -/* InterpreterID class */ - -static PyTypeObject InterpreterIDtype; - -typedef struct interpid { - PyObject_HEAD - int64_t id; -} interpid; - -static interpid * -newinterpid(PyTypeObject *cls, int64_t id, int force) -{ - PyInterpreterState *interp = _PyInterpreterState_LookUpID(id); - if (interp == NULL) { - if (force) { - PyErr_Clear(); - } - else { - return NULL; - } - } - - interpid *self = PyObject_New(interpid, cls); - if (self == NULL) { - return NULL; - } - self->id = id; - - if (interp != NULL) { - _PyInterpreterState_IDIncref(interp); - } - return self; -} - -static PyObject * -interpid_new(PyTypeObject *cls, PyObject *args, PyObject *kwds) -{ - static char *kwlist[] = {"id", "force", NULL}; - PyObject *idobj; - int force = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwds, - "O|$p:InterpreterID.__init__", kwlist, - &idobj, &force)) { - return NULL; - } - - // Coerce and check the ID. - int64_t id; - if (PyObject_TypeCheck(idobj, &InterpreterIDtype)) { - id = ((interpid *)idobj)->id; - } - else { - id = _coerce_id(idobj); - if (id < 0) { - return NULL; - } - } - - return (PyObject *)newinterpid(cls, id, force); -} - -static void -interpid_dealloc(PyObject *v) -{ - int64_t id = ((interpid *)v)->id; - PyInterpreterState *interp = _PyInterpreterState_LookUpID(id); - if (interp != NULL) { - _PyInterpreterState_IDDecref(interp); - } - else { - // already deleted - PyErr_Clear(); - } - Py_TYPE(v)->tp_free(v); -} - -static PyObject * -interpid_repr(PyObject *self) -{ - PyTypeObject *type = Py_TYPE(self); - const char *name = _PyType_Name(type); - interpid *id = (interpid *)self; - return PyUnicode_FromFormat("%s(%" PRId64 ")", name, id->id); -} - -static PyObject * -interpid_str(PyObject *self) -{ - interpid *id = (interpid *)self; - return PyUnicode_FromFormat("%" PRId64 "", id->id); -} - -PyObject * -interpid_int(PyObject *self) -{ - interpid *id = (interpid *)self; - return PyLong_FromLongLong(id->id); -} - -static PyNumberMethods interpid_as_number = { - 0, /* nb_add */ - 0, /* nb_subtract */ - 0, /* nb_multiply */ - 0, /* nb_remainder */ - 0, /* nb_divmod */ - 0, /* nb_power */ - 0, /* nb_negative */ - 0, /* nb_positive */ - 0, /* nb_absolute */ - 0, /* nb_bool */ - 0, /* nb_invert */ - 0, /* nb_lshift */ - 0, /* nb_rshift */ - 0, /* nb_and */ - 0, /* nb_xor */ - 0, /* nb_or */ - (unaryfunc)interpid_int, /* nb_int */ - 0, /* nb_reserved */ - 0, /* nb_float */ - - 0, /* nb_inplace_add */ - 0, /* nb_inplace_subtract */ - 0, /* nb_inplace_multiply */ - 0, /* nb_inplace_remainder */ - 0, /* nb_inplace_power */ - 0, /* nb_inplace_lshift */ - 0, /* nb_inplace_rshift */ - 0, /* nb_inplace_and */ - 0, /* nb_inplace_xor */ - 0, /* nb_inplace_or */ - - 0, /* nb_floor_divide */ - 0, /* nb_true_divide */ - 0, /* nb_inplace_floor_divide */ - 0, /* nb_inplace_true_divide */ - - (unaryfunc)interpid_int, /* nb_index */ -}; - -static Py_hash_t -interpid_hash(PyObject *self) -{ - interpid *id = (interpid *)self; - PyObject *obj = PyLong_FromLongLong(id->id); - if (obj == NULL) { - return -1; - } - Py_hash_t hash = PyObject_Hash(obj); - Py_DECREF(obj); - return hash; -} - -static PyObject * -interpid_richcompare(PyObject *self, PyObject *other, int op) -{ - if (op != Py_EQ && op != Py_NE) { - Py_RETURN_NOTIMPLEMENTED; - } - - if (!PyObject_TypeCheck(self, &InterpreterIDtype)) { - Py_RETURN_NOTIMPLEMENTED; - } - - interpid *id = (interpid *)self; - int equal; - if (PyObject_TypeCheck(other, &InterpreterIDtype)) { - interpid *otherid = (interpid *)other; - equal = (id->id == otherid->id); - } - else { - other = PyNumber_Long(other); - if (other == NULL) { - PyErr_Clear(); - Py_RETURN_NOTIMPLEMENTED; - } - int64_t otherid = PyLong_AsLongLong(other); - Py_DECREF(other); - if (otherid == -1 && PyErr_Occurred() != NULL) { - return NULL; - } - if (otherid < 0) { - equal = 0; - } - else { - equal = (id->id == otherid); - } - } - - if ((op == Py_EQ && equal) || (op == Py_NE && !equal)) { - Py_RETURN_TRUE; - } - Py_RETURN_FALSE; -} - -PyDoc_STRVAR(interpid_doc, -"A interpreter ID identifies a interpreter and may be used as an int."); - -static PyTypeObject InterpreterIDtype = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) - "interpreters.InterpreterID", /* tp_name */ - sizeof(interpid), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)interpid_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - (reprfunc)interpid_repr, /* tp_repr */ - &interpid_as_number, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - interpid_hash, /* tp_hash */ - 0, /* tp_call */ - (reprfunc)interpid_str, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | - Py_TPFLAGS_LONG_SUBCLASS, /* tp_flags */ - interpid_doc, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - interpid_richcompare, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - interpid_new, /* tp_new */ -}; - -static PyObject * -_get_id(PyInterpreterState *interp) -{ - PY_INT64_T id = PyInterpreterState_GetID(interp); - if (id < 0) { - return NULL; - } - return (PyObject *)newinterpid(&InterpreterIDtype, id, 0); -} - -static PyInterpreterState * -_look_up(PyObject *requested_id) -{ - int64_t id; - if (PyObject_TypeCheck(requested_id, &InterpreterIDtype)) { - id = ((interpid *)requested_id)->id; - } - else { - id = PyLong_AsLongLong(requested_id); - if (id == -1 && PyErr_Occurred() != NULL) { - return NULL; - } - assert(id <= INT64_MAX); - } - return _PyInterpreterState_LookUpID(id); -} - /* module level code ********************************************************/ @@ -2283,17 +1989,16 @@ interp_create(PyObject *self, PyObject *args) PyErr_SetString(PyExc_RuntimeError, "interpreter creation failed"); return NULL; } - if (_PyInterpreterState_IDInitref(tstate->interp) != 0) { - goto error; - }; - return _get_id(tstate->interp); - -error: - // XXX Possible GILState issues? - save_tstate = PyThreadState_Swap(tstate); - Py_EndInterpreter(tstate); - PyThreadState_Swap(save_tstate); - return NULL; + PyObject *idobj = _PyInterpreterState_GetIDObject(tstate->interp); + if (idobj == NULL) { + // XXX Possible GILState issues? + save_tstate = PyThreadState_Swap(tstate); + Py_EndInterpreter(tstate); + PyThreadState_Swap(save_tstate); + return NULL; + } + _PyInterpreterState_RequireIDRef(tstate->interp, 1); + return idobj; } PyDoc_STRVAR(create_doc, @@ -2318,7 +2023,7 @@ interp_destroy(PyObject *self, PyObject *args, PyObject *kwds) } // Look up the interpreter. - PyInterpreterState *interp = _look_up(id); + PyInterpreterState *interp = _PyInterpreterID_LookUp(id); if (interp == NULL) { return NULL; } @@ -2374,7 +2079,7 @@ interp_list_all(PyObject *self, PyObject *Py_UNUSED(ignored)) interp = PyInterpreterState_Head(); while (interp != NULL) { - id = _get_id(interp); + id = _PyInterpreterState_GetIDObject(interp); if (id == NULL) { Py_DECREF(ids); return NULL; @@ -2406,7 +2111,7 @@ interp_get_current(PyObject *self, PyObject *Py_UNUSED(ignored)) if (interp == NULL) { return NULL; } - return _get_id(interp); + return _PyInterpreterState_GetIDObject(interp); } PyDoc_STRVAR(get_current_doc, @@ -2420,7 +2125,7 @@ interp_get_main(PyObject *self, PyObject *Py_UNUSED(ignored)) { // Currently, 0 is always the main interpreter. PY_INT64_T id = 0; - return (PyObject *)newinterpid(&InterpreterIDtype, id, 0); + return _PyInterpreterID_New(id); } PyDoc_STRVAR(get_main_doc, @@ -2446,7 +2151,7 @@ interp_run_string(PyObject *self, PyObject *args, PyObject *kwds) } // Look up the interpreter. - PyInterpreterState *interp = _look_up(id); + PyInterpreterState *interp = _PyInterpreterID_LookUp(id); if (interp == NULL) { return NULL; } @@ -2516,7 +2221,7 @@ interp_is_running(PyObject *self, PyObject *args, PyObject *kwds) return NULL; } - PyInterpreterState *interp = _look_up(id); + PyInterpreterState *interp = _PyInterpreterID_LookUp(id); if (interp == NULL) { return NULL; } @@ -2568,7 +2273,7 @@ channel_destroy(PyObject *self, PyObject *args, PyObject *kwds) "O:channel_destroy", kwlist, &id)) { return NULL; } - int64_t cid = _coerce_id(id); + int64_t cid = _Py_CoerceID(id); if (cid < 0) { return NULL; } @@ -2632,7 +2337,7 @@ channel_send(PyObject *self, PyObject *args, PyObject *kwds) "OO:channel_send", kwlist, &id, &obj)) { return NULL; } - int64_t cid = _coerce_id(id); + int64_t cid = _Py_CoerceID(id); if (cid < 0) { return NULL; } @@ -2657,7 +2362,7 @@ channel_recv(PyObject *self, PyObject *args, PyObject *kwds) "O:channel_recv", kwlist, &id)) { return NULL; } - int64_t cid = _coerce_id(id); + int64_t cid = _Py_CoerceID(id); if (cid < 0) { return NULL; } @@ -2683,7 +2388,7 @@ channel_close(PyObject *self, PyObject *args, PyObject *kwds) &id, &send, &recv, &force)) { return NULL; } - int64_t cid = _coerce_id(id); + int64_t cid = _Py_CoerceID(id); if (cid < 0) { return NULL; } @@ -2735,7 +2440,7 @@ channel_release(PyObject *self, PyObject *args, PyObject *kwds) &id, &send, &recv, &force)) { return NULL; } - int64_t cid = _coerce_id(id); + int64_t cid = _Py_CoerceID(id); if (cid < 0) { return NULL; } @@ -2837,10 +2542,6 @@ PyInit__xxsubinterpreters(void) if (PyType_Ready(&ChannelIDtype) != 0) { return NULL; } - InterpreterIDtype.tp_base = &PyLong_Type; - if (PyType_Ready(&InterpreterIDtype) != 0) { - return NULL; - } /* Create the module */ PyObject *module = PyModule_Create(&interpretersmodule); @@ -2862,12 +2563,12 @@ PyInit__xxsubinterpreters(void) if (PyDict_SetItemString(ns, "ChannelID", (PyObject *)&ChannelIDtype) != 0) { return NULL; } - Py_INCREF(&InterpreterIDtype); - if (PyDict_SetItemString(ns, "InterpreterID", (PyObject *)&InterpreterIDtype) != 0) { + Py_INCREF(&_PyInterpreterID_Type); + if (PyDict_SetItemString(ns, "InterpreterID", (PyObject *)&_PyInterpreterID_Type) != 0) { return NULL; } - if (_PyCrossInterpreterData_Register_Class(&ChannelIDtype, _channelid_shared)) { + if (_PyCrossInterpreterData_RegisterClass(&ChannelIDtype, _channelid_shared)) { return NULL; } diff --git a/Objects/interpreteridobject.c b/Objects/interpreteridobject.c new file mode 100644 index 000000000000..dd142b043d0a --- /dev/null +++ b/Objects/interpreteridobject.c @@ -0,0 +1,308 @@ +/* InterpreterID object */ + +#include "Python.h" +#include "internal/pycore_pystate.h" +#include "interpreteridobject.h" + + +int64_t +_Py_CoerceID(PyObject *orig) +{ + PyObject *pyid = PyNumber_Long(orig); + if (pyid == NULL) { + if (PyErr_ExceptionMatches(PyExc_TypeError)) { + PyErr_Format(PyExc_TypeError, + "'id' must be a non-negative int, got %R", orig); + } + else { + PyErr_Format(PyExc_ValueError, + "'id' must be a non-negative int, got %R", orig); + } + return -1; + } + int64_t id = PyLong_AsLongLong(pyid); + Py_DECREF(pyid); + if (id == -1 && PyErr_Occurred() != NULL) { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) { + PyErr_Format(PyExc_ValueError, + "'id' must be a non-negative int, got %R", orig); + } + return -1; + } + if (id < 0) { + PyErr_Format(PyExc_ValueError, + "'id' must be a non-negative int, got %R", orig); + return -1; + } + return id; +} + +typedef struct interpid { + PyObject_HEAD + int64_t id; +} interpid; + +static interpid * +newinterpid(PyTypeObject *cls, int64_t id, int force) +{ + PyInterpreterState *interp = _PyInterpreterState_LookUpID(id); + if (interp == NULL) { + if (force) { + PyErr_Clear(); + } + else { + return NULL; + } + } + + interpid *self = PyObject_New(interpid, cls); + if (self == NULL) { + return NULL; + } + self->id = id; + + if (interp != NULL) { + _PyInterpreterState_IDIncref(interp); + } + return self; +} + +static PyObject * +interpid_new(PyTypeObject *cls, PyObject *args, PyObject *kwds) +{ + static char *kwlist[] = {"id", "force", NULL}; + PyObject *idobj; + int force = 0; + if (!PyArg_ParseTupleAndKeywords(args, kwds, + "O|$p:InterpreterID.__init__", kwlist, + &idobj, &force)) { + return NULL; + } + + // Coerce and check the ID. + int64_t id; + if (PyObject_TypeCheck(idobj, &_PyInterpreterID_Type)) { + id = ((interpid *)idobj)->id; + } + else { + id = _Py_CoerceID(idobj); + if (id < 0) { + return NULL; + } + } + + return (PyObject *)newinterpid(cls, id, force); +} + +static void +interpid_dealloc(PyObject *v) +{ + int64_t id = ((interpid *)v)->id; + PyInterpreterState *interp = _PyInterpreterState_LookUpID(id); + if (interp != NULL) { + _PyInterpreterState_IDDecref(interp); + } + else { + // already deleted + PyErr_Clear(); + } + Py_TYPE(v)->tp_free(v); +} + +static PyObject * +interpid_repr(PyObject *self) +{ + PyTypeObject *type = Py_TYPE(self); + const char *name = _PyType_Name(type); + interpid *id = (interpid *)self; + return PyUnicode_FromFormat("%s(%" PRId64 ")", name, id->id); +} + +static PyObject * +interpid_str(PyObject *self) +{ + interpid *id = (interpid *)self; + return PyUnicode_FromFormat("%" PRId64 "", id->id); +} + +static PyObject * +interpid_int(PyObject *self) +{ + interpid *id = (interpid *)self; + return PyLong_FromLongLong(id->id); +} + +static PyNumberMethods interpid_as_number = { + 0, /* nb_add */ + 0, /* nb_subtract */ + 0, /* nb_multiply */ + 0, /* nb_remainder */ + 0, /* nb_divmod */ + 0, /* nb_power */ + 0, /* nb_negative */ + 0, /* nb_positive */ + 0, /* nb_absolute */ + 0, /* nb_bool */ + 0, /* nb_invert */ + 0, /* nb_lshift */ + 0, /* nb_rshift */ + 0, /* nb_and */ + 0, /* nb_xor */ + 0, /* nb_or */ + (unaryfunc)interpid_int, /* nb_int */ + 0, /* nb_reserved */ + 0, /* nb_float */ + + 0, /* nb_inplace_add */ + 0, /* nb_inplace_subtract */ + 0, /* nb_inplace_multiply */ + 0, /* nb_inplace_remainder */ + 0, /* nb_inplace_power */ + 0, /* nb_inplace_lshift */ + 0, /* nb_inplace_rshift */ + 0, /* nb_inplace_and */ + 0, /* nb_inplace_xor */ + 0, /* nb_inplace_or */ + + 0, /* nb_floor_divide */ + 0, /* nb_true_divide */ + 0, /* nb_inplace_floor_divide */ + 0, /* nb_inplace_true_divide */ + + (unaryfunc)interpid_int, /* nb_index */ +}; + +static Py_hash_t +interpid_hash(PyObject *self) +{ + interpid *id = (interpid *)self; + PyObject *obj = PyLong_FromLongLong(id->id); + if (obj == NULL) { + return -1; + } + Py_hash_t hash = PyObject_Hash(obj); + Py_DECREF(obj); + return hash; +} + +static PyObject * +interpid_richcompare(PyObject *self, PyObject *other, int op) +{ + if (op != Py_EQ && op != Py_NE) { + Py_RETURN_NOTIMPLEMENTED; + } + + if (!PyObject_TypeCheck(self, &_PyInterpreterID_Type)) { + Py_RETURN_NOTIMPLEMENTED; + } + + interpid *id = (interpid *)self; + int equal; + if (PyObject_TypeCheck(other, &_PyInterpreterID_Type)) { + interpid *otherid = (interpid *)other; + equal = (id->id == otherid->id); + } + else { + other = PyNumber_Long(other); + if (other == NULL) { + PyErr_Clear(); + Py_RETURN_NOTIMPLEMENTED; + } + int64_t otherid = PyLong_AsLongLong(other); + Py_DECREF(other); + if (otherid == -1 && PyErr_Occurred() != NULL) { + return NULL; + } + if (otherid < 0) { + equal = 0; + } + else { + equal = (id->id == otherid); + } + } + + if ((op == Py_EQ && equal) || (op == Py_NE && !equal)) { + Py_RETURN_TRUE; + } + Py_RETURN_FALSE; +} + +PyDoc_STRVAR(interpid_doc, +"A interpreter ID identifies a interpreter and may be used as an int."); + +PyTypeObject _PyInterpreterID_Type = { + PyVarObject_HEAD_INIT(&PyType_Type, 0) + "InterpreterID", /* tp_name */ + sizeof(interpid), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)interpid_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_as_async */ + (reprfunc)interpid_repr, /* tp_repr */ + &interpid_as_number, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + interpid_hash, /* tp_hash */ + 0, /* tp_call */ + (reprfunc)interpid_str, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | + Py_TPFLAGS_LONG_SUBCLASS, /* tp_flags */ + interpid_doc, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + interpid_richcompare, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + &PyLong_Type, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + interpid_new, /* tp_new */ +}; + +PyObject *_PyInterpreterID_New(int64_t id) +{ + return (PyObject *)newinterpid(&_PyInterpreterID_Type, id, 0); +} + +PyObject * +_PyInterpreterState_GetIDObject(PyInterpreterState *interp) +{ + if (_PyInterpreterState_IDInitref(interp) != 0) { + return NULL; + }; + PY_INT64_T id = PyInterpreterState_GetID(interp); + if (id < 0) { + return NULL; + } + return (PyObject *)newinterpid(&_PyInterpreterID_Type, id, 0); +} + +PyInterpreterState * +_PyInterpreterID_LookUp(PyObject *requested_id) +{ + int64_t id; + if (PyObject_TypeCheck(requested_id, &_PyInterpreterID_Type)) { + id = ((interpid *)requested_id)->id; + } + else { + id = PyLong_AsLongLong(requested_id); + if (id == -1 && PyErr_Occurred() != NULL) { + return NULL; + } + assert(id <= INT64_MAX); + } + return _PyInterpreterState_LookUpID(id); +} diff --git a/Objects/object.c b/Objects/object.c index cf5264b5d80b..b446d598130a 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -5,6 +5,7 @@ #include "pycore_pystate.h" #include "pycore_context.h" #include "frameobject.h" +#include "interpreteridobject.h" #ifdef __cplusplus extern "C" { @@ -1806,6 +1807,7 @@ _PyTypes_Init(void) INIT_TYPE(&PySeqIter_Type, "sequence iterator"); INIT_TYPE(&PyCoro_Type, "coroutine"); INIT_TYPE(&_PyCoroWrapper_Type, "coroutine wrapper"); + INIT_TYPE(&_PyInterpreterID_Type, "interpreter ID"); return _Py_INIT_OK(); #undef INIT_TYPE diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index bff7b95a84ae..c9ff2f88d8e0 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -154,6 +154,7 @@ + @@ -350,6 +351,7 @@ + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 03030744b155..5dfa193f048a 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -483,6 +483,9 @@ Include + + Include + Modules @@ -1043,6 +1046,9 @@ Objects + + Objects + Modules diff --git a/Python/pystate.c b/Python/pystate.c index 3978baa7af89..cdf5a698cbab 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -418,7 +418,7 @@ _PyInterpreterState_IDDecref(PyInterpreterState *interp) int64_t refcount = interp->id_refcount; PyThread_release_lock(interp->id_mutex); - if (refcount == 0) { + if (refcount == 0 && interp->requires_idref) { // XXX Using the "head" thread isn't strictly correct. PyThreadState *tstate = PyInterpreterState_ThreadHead(interp); // XXX Possible GILState issues? @@ -428,6 +428,18 @@ _PyInterpreterState_IDDecref(PyInterpreterState *interp) } } +int +_PyInterpreterState_RequiresIDRef(PyInterpreterState *interp) +{ + return interp->requires_idref; +} + +void +_PyInterpreterState_RequireIDRef(PyInterpreterState *interp, int required) +{ + interp->requires_idref = required ? 1 : 0; +} + _PyCoreConfig * _PyInterpreterState_GetCoreConfig(PyInterpreterState *interp) { @@ -440,6 +452,16 @@ _PyInterpreterState_GetMainConfig(PyInterpreterState *interp) return &interp->config; } +PyObject * +_PyInterpreterState_GetMainModule(PyInterpreterState *interp) +{ + if (interp->modules == NULL) { + PyErr_SetString(PyExc_RuntimeError, "interpreter not initialized"); + return NULL; + } + return PyMapping_GetItemString(interp->modules, "__main__"); +} + /* Default implementation for _PyThreadState_GetFrame */ static struct _frame * threadstate_getframe(PyThreadState *self) @@ -1392,7 +1414,7 @@ _register_xidata(PyTypeObject *cls, crossinterpdatafunc getdata) static void _register_builtins_for_crossinterpreter_data(void); int -_PyCrossInterpreterData_Register_Class(PyTypeObject *cls, +_PyCrossInterpreterData_RegisterClass(PyTypeObject *cls, crossinterpdatafunc getdata) { if (!PyType_Check(cls)) { diff --git a/setup.py b/setup.py index b96961073b98..c278f08b8e6d 100644 --- a/setup.py +++ b/setup.py @@ -784,9 +784,7 @@ def detect_simple_extensions(self): self.add(Extension('syslog', ['syslogmodule.c'])) # Python interface to subinterpreter C-API. - self.add(Extension('_xxsubinterpreters', - ['_xxsubinterpretersmodule.c'], - define_macros=[('Py_BUILD_CORE', '')])) + self.add(Extension('_xxsubinterpreters', ['_xxsubinterpretersmodule.c'])) # # Here ends the simple stuff. From here on, modules need certain From webhook-mailer at python.org Fri Mar 15 19:47:49 2019 From: webhook-mailer at python.org (Eric Snow) Date: Fri, 15 Mar 2019 23:47:49 -0000 Subject: [Python-checkins] bpo-36124: Add PyInterpreterState.dict. (gh-12132) Message-ID: https://github.com/python/cpython/commit/d2fdd1fedf6b9dc785cf5025b548a989faed089a commit: d2fdd1fedf6b9dc785cf5025b548a989faed089a branch: master author: Eric Snow committer: GitHub date: 2019-03-15T17:47:43-06:00 summary: bpo-36124: Add PyInterpreterState.dict. (gh-12132) files: A Misc/NEWS.d/next/Core and Builtins/2019-03-01-13-48-01.bpo-36124.Blzxq1.rst M Doc/c-api/init.rst M Include/internal/pycore_pystate.h M Include/pystate.h M Python/pystate.c diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 6b5290a7ebbb..2c6d21fa9da1 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -1026,6 +1026,18 @@ All of the following functions must be called after :c:func:`Py_Initialize`. .. versionadded:: 3.7 +.. c:function:: PyObject* PyInterpreterState_GetDict(PyInterpreterState *interp) + + Return a dictionary in which interpreter-specific data may be stored. + If this function returns *NULL* then no exception has been raised and + the caller should assume no interpreter-specific dict is available. + + This is not a replacement for :c:func:`PyModule_GetState()`, which + extensions should use to store interpreter-specific state information. + + .. versionadded:: 3.8 + + .. c:function:: PyObject* PyThreadState_GetDict() Return a dictionary in which extensions can store thread-specific state diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 945d9923a884..703a85b96b4e 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -63,6 +63,8 @@ struct _is { int dlopenflags; #endif + PyObject *dict; /* Stores per-interpreter state */ + PyObject *builtins_copy; PyObject *import_func; /* Initialized to PyEval_EvalFrameDefault(). */ diff --git a/Include/pystate.h b/Include/pystate.h index a79a2e60e210..4c25e3f7ef84 100644 --- a/Include/pystate.h +++ b/Include/pystate.h @@ -24,17 +24,23 @@ typedef struct _ts PyThreadState; /* struct _is is defined in internal/pycore_pystate.h */ typedef struct _is PyInterpreterState; -/* State unique per thread */ - PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_New(void); PyAPI_FUNC(void) PyInterpreterState_Clear(PyInterpreterState *); PyAPI_FUNC(void) PyInterpreterState_Delete(PyInterpreterState *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03080000 +/* New in 3.8 */ +PyAPI_FUNC(PyObject *) PyInterpreterState_GetDict(PyInterpreterState *); +#endif + #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000 /* New in 3.7 */ PyAPI_FUNC(int64_t) PyInterpreterState_GetID(PyInterpreterState *); #endif #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 + +/* State unique per thread */ + /* New in 3.3 */ PyAPI_FUNC(int) PyState_AddModule(PyObject*, struct PyModuleDef*); PyAPI_FUNC(int) PyState_RemoveModule(struct PyModuleDef*); diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-01-13-48-01.bpo-36124.Blzxq1.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-01-13-48-01.bpo-36124.Blzxq1.rst new file mode 100644 index 000000000000..ee9b0c110241 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-01-13-48-01.bpo-36124.Blzxq1.rst @@ -0,0 +1,4 @@ +Add a new interpreter-specific dict and expose it in the C-API via +PyInterpreterState_GetDict(). This parallels PyThreadState_GetDict(). +However, extension modules should continue using PyModule_GetState() for +their own internal per-interpreter state. diff --git a/Python/pystate.c b/Python/pystate.c index cdf5a698cbab..6a2dc102ecfe 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -224,6 +224,7 @@ PyInterpreterState_Clear(PyInterpreterState *interp) Py_CLEAR(interp->builtins_copy); Py_CLEAR(interp->importlib); Py_CLEAR(interp->import_func); + Py_CLEAR(interp->dict); #ifdef HAVE_FORK Py_CLEAR(interp->before_forkers); Py_CLEAR(interp->after_forkers_parent); @@ -462,6 +463,19 @@ _PyInterpreterState_GetMainModule(PyInterpreterState *interp) return PyMapping_GetItemString(interp->modules, "__main__"); } +PyObject * +PyInterpreterState_GetDict(PyInterpreterState *interp) +{ + if (interp->dict == NULL) { + interp->dict = PyDict_New(); + if (interp->dict == NULL) { + PyErr_Clear(); + } + } + /* Returning NULL means no per-interpreter dict is available. */ + return interp->dict; +} + /* Default implementation for _PyThreadState_GetFrame */ static struct _frame * threadstate_getframe(PyThreadState *self) From webhook-mailer at python.org Fri Mar 15 23:57:01 2019 From: webhook-mailer at python.org (Nick Coghlan) Date: Sat, 16 Mar 2019 03:57:01 -0000 Subject: [Python-checkins] bpo-36138: Clarify docs about converting datetime.timedelta to scalars. (GH-12137) Message-ID: https://github.com/python/cpython/commit/f40b4a0b6277b2779b9ded3736325489f2af93e4 commit: f40b4a0b6277b2779b9ded3736325489f2af93e4 branch: master author: Yasser A committer: Nick Coghlan date: 2019-03-16T13:56:58+10:00 summary: bpo-36138: Clarify docs about converting datetime.timedelta to scalars. (GH-12137) Be explicit that timedelta division converts an overall duration to the interval units given by the denominator. files: A Misc/NEWS.d/next/Documentation/2019-03-02-00-40-57.bpo-36138.yfjNzG.rst M Doc/library/datetime.rst diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst index 121f73bbe852..1ee23c2175a2 100644 --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -254,8 +254,9 @@ Supported operations: | | rounded to the nearest multiple of | | | timedelta.resolution using round-half-to-even.| +--------------------------------+-----------------------------------------------+ -| ``f = t2 / t3`` | Division (3) of *t2* by *t3*. Returns a | -| | :class:`float` object. | +| ``f = t2 / t3`` | Division (3) of overall duration *t2* by | +| | interval unit *t3*. Returns a :class:`float` | +| | object. | +--------------------------------+-----------------------------------------------+ | ``t1 = t2 / f or t1 = t2 / i`` | Delta divided by a float or an int. The result| | | is rounded to the nearest multiple of | @@ -351,7 +352,8 @@ Instance methods: .. method:: timedelta.total_seconds() Return the total number of seconds contained in the duration. Equivalent to - ``td / timedelta(seconds=1)``. + ``td / timedelta(seconds=1)``. For interval units other than seconds, use the + division form directly (e.g. ``td / timedelta(microseconds=1)``). Note that for very large time intervals (greater than 270 years on most platforms) this method will lose microsecond accuracy. diff --git a/Misc/NEWS.d/next/Documentation/2019-03-02-00-40-57.bpo-36138.yfjNzG.rst b/Misc/NEWS.d/next/Documentation/2019-03-02-00-40-57.bpo-36138.yfjNzG.rst new file mode 100644 index 000000000000..f5352bb3958f --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-03-02-00-40-57.bpo-36138.yfjNzG.rst @@ -0,0 +1 @@ +Improve documentation about converting datetime.timedelta to scalars. From webhook-mailer at python.org Sat Mar 16 00:03:47 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 16 Mar 2019 04:03:47 -0000 Subject: [Python-checkins] bpo-36138: Clarify docs about converting datetime.timedelta to scalars. (GH-12137) Message-ID: https://github.com/python/cpython/commit/e213cd6325f2d6f116b6c3dce109cdf21f6263d5 commit: e213cd6325f2d6f116b6c3dce109cdf21f6263d5 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-15T21:03:43-07:00 summary: bpo-36138: Clarify docs about converting datetime.timedelta to scalars. (GH-12137) Be explicit that timedelta division converts an overall duration to the interval units given by the denominator. (cherry picked from commit f40b4a0b6277b2779b9ded3736325489f2af93e4) Co-authored-by: Yasser A files: A Misc/NEWS.d/next/Documentation/2019-03-02-00-40-57.bpo-36138.yfjNzG.rst M Doc/library/datetime.rst diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst index 121f73bbe852..1ee23c2175a2 100644 --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -254,8 +254,9 @@ Supported operations: | | rounded to the nearest multiple of | | | timedelta.resolution using round-half-to-even.| +--------------------------------+-----------------------------------------------+ -| ``f = t2 / t3`` | Division (3) of *t2* by *t3*. Returns a | -| | :class:`float` object. | +| ``f = t2 / t3`` | Division (3) of overall duration *t2* by | +| | interval unit *t3*. Returns a :class:`float` | +| | object. | +--------------------------------+-----------------------------------------------+ | ``t1 = t2 / f or t1 = t2 / i`` | Delta divided by a float or an int. The result| | | is rounded to the nearest multiple of | @@ -351,7 +352,8 @@ Instance methods: .. method:: timedelta.total_seconds() Return the total number of seconds contained in the duration. Equivalent to - ``td / timedelta(seconds=1)``. + ``td / timedelta(seconds=1)``. For interval units other than seconds, use the + division form directly (e.g. ``td / timedelta(microseconds=1)``). Note that for very large time intervals (greater than 270 years on most platforms) this method will lose microsecond accuracy. diff --git a/Misc/NEWS.d/next/Documentation/2019-03-02-00-40-57.bpo-36138.yfjNzG.rst b/Misc/NEWS.d/next/Documentation/2019-03-02-00-40-57.bpo-36138.yfjNzG.rst new file mode 100644 index 000000000000..f5352bb3958f --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-03-02-00-40-57.bpo-36138.yfjNzG.rst @@ -0,0 +1 @@ +Improve documentation about converting datetime.timedelta to scalars. From webhook-mailer at python.org Sat Mar 16 13:45:07 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Sat, 16 Mar 2019 17:45:07 -0000 Subject: [Python-checkins] bpo-36127: Fix compiler warning in _PyArg_UnpackKeywords(). (GH-12353) Message-ID: https://github.com/python/cpython/commit/1b0393d5b7842dcd9e933117d2d5404d15e2ad00 commit: 1b0393d5b7842dcd9e933117d2d5404d15e2ad00 branch: master author: Serhiy Storchaka committer: GitHub date: 2019-03-16T19:45:00+02:00 summary: bpo-36127: Fix compiler warning in _PyArg_UnpackKeywords(). (GH-12353) files: M Python/getargs.c diff --git a/Python/getargs.c b/Python/getargs.c index 693a29cced42..e50f9b5f5c9d 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -2422,7 +2422,7 @@ _PyArg_UnpackKeywords(PyObject *const *args, Py_ssize_t nargs, } /* copy keyword args using kwtuple to drive process */ - for (i = Py_MAX(nargs, posonly); i < maxargs; i++) { + for (i = Py_MAX((int)nargs, posonly); i < maxargs; i++) { if (nkwargs) { keyword = PyTuple_GET_ITEM(kwtuple, i - posonly); if (kwargs != NULL) { From webhook-mailer at python.org Sat Mar 16 14:16:32 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 16 Mar 2019 18:16:32 -0000 Subject: [Python-checkins] Minor grammar fix in docs (GH-12371) Message-ID: https://github.com/python/cpython/commit/5927cfdf3a657384dd7632938759a3ac096db7e3 commit: 5927cfdf3a657384dd7632938759a3ac096db7e3 branch: master author: Raymond Hettinger committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-16T11:16:29-07:00 summary: Minor grammar fix in docs (GH-12371) files: M Doc/library/collections.rst diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index 1a093796f55d..5c783d46db35 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -853,7 +853,7 @@ they add the ability to access fields by name instead of position index. Added the *module* parameter. .. versionchanged:: 3.7 - Remove the *verbose* parameter and the :attr:`_source` attribute. + Removed the *verbose* parameter and the :attr:`_source` attribute. .. versionchanged:: 3.7 Added the *defaults* parameter and the :attr:`_field_defaults` From webhook-mailer at python.org Sat Mar 16 15:53:28 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 16 Mar 2019 19:53:28 -0000 Subject: [Python-checkins] Update the seealso entries for namedtuple() (GH-12373) Message-ID: https://github.com/python/cpython/commit/9c68543f022b130ff51944edc6771c60510ee683 commit: 9c68543f022b130ff51944edc6771c60510ee683 branch: master author: Raymond Hettinger committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-16T12:53:23-07:00 summary: Update the seealso entries for namedtuple() (GH-12373) * Replace external recipe link with a link to the dataclasses module. * Highlight the class definition syntax for typing.NamedTuple and add an example for clarity. files: M Doc/library/collections.rst M Doc/library/typing.rst diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index 5c783d46db35..daa741428a01 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -1028,17 +1028,20 @@ customize a prototype instance: .. seealso:: - * `Recipe for named tuple abstract base class with a metaclass mix-in - `_ - by Jan Kaliszewski. Besides providing an :term:`abstract base class` for - named tuples, it also supports an alternate :term:`metaclass`-based - constructor that is convenient for use cases where named tuples are being - subclassed. + * See :class:`typing.NamedTuple` for a way to add type hints for named + tuples. It also provides an elegant notation using the :keyword:`class` + keyword:: + + class Component(NamedTuple): + part_number: int + weight: float + description: Optional[str] = None * See :meth:`types.SimpleNamespace` for a mutable namespace based on an underlying dictionary instead of a tuple. - * See :meth:`typing.NamedTuple` for a way to add type hints for named tuples. + * The :mod:`dataclasses` module provides a decorator and functions for + automatically adding generated special methods to user-defined classes. :class:`OrderedDict` objects diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 6ed09f1969db..de03284dfbb6 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -815,7 +815,7 @@ The module defines the following classes, functions and decorators: .. class:: NamedTuple - Typed version of namedtuple. + Typed version of :func:`collections.namedtuple`. Usage:: From webhook-mailer at python.org Sat Mar 16 16:01:38 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 16 Mar 2019 20:01:38 -0000 Subject: [Python-checkins] Update the seealso entries for namedtuple() (GH-12373) Message-ID: https://github.com/python/cpython/commit/68e0ed6a90c9553bf8ef0cfc61d35a30e408cc2f commit: 68e0ed6a90c9553bf8ef0cfc61d35a30e408cc2f branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-16T13:01:35-07:00 summary: Update the seealso entries for namedtuple() (GH-12373) * Replace external recipe link with a link to the dataclasses module. * Highlight the class definition syntax for typing.NamedTuple and add an example for clarity. (cherry picked from commit 9c68543f022b130ff51944edc6771c60510ee683) Co-authored-by: Raymond Hettinger files: M Doc/library/collections.rst M Doc/library/typing.rst diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index 0413f469228a..febaa4bf4620 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -1016,17 +1016,20 @@ customize a prototype instance: .. seealso:: - * `Recipe for named tuple abstract base class with a metaclass mix-in - `_ - by Jan Kaliszewski. Besides providing an :term:`abstract base class` for - named tuples, it also supports an alternate :term:`metaclass`-based - constructor that is convenient for use cases where named tuples are being - subclassed. + * See :class:`typing.NamedTuple` for a way to add type hints for named + tuples. It also provides an elegant notation using the :keyword:`class` + keyword:: + + class Component(NamedTuple): + part_number: int + weight: float + description: Optional[str] = None * See :meth:`types.SimpleNamespace` for a mutable namespace based on an underlying dictionary instead of a tuple. - * See :meth:`typing.NamedTuple` for a way to add type hints for named tuples. + * The :mod:`dataclasses` module provides a decorator and functions for + automatically adding generated special methods to user-defined classes. :class:`OrderedDict` objects diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index e756062240c9..6f1c85feb0eb 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -815,7 +815,7 @@ The module defines the following classes, functions and decorators: .. class:: NamedTuple - Typed version of namedtuple. + Typed version of :func:`collections.namedtuple`. Usage:: From webhook-mailer at python.org Sat Mar 16 18:28:54 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Sat, 16 Mar 2019 22:28:54 -0000 Subject: [Python-checkins] bpo-35715: Liberate return value of _process_worker (GH-11514) Message-ID: https://github.com/python/cpython/commit/962bdeab191ee64459caa199209331005797ea7a commit: 962bdeab191ee64459caa199209331005797ea7a branch: master author: Dave Chevell committer: Pablo Galindo date: 2019-03-16T22:28:51Z summary: bpo-35715: Liberate return value of _process_worker (GH-11514) ProcessPoolExecutor workers will hold the return value of their last task in memory until the next task is received. Since the return value has already been propagated to the parent process's Future (or has been discarded by this point), the object can be safely released. files: A Misc/NEWS.d/next/Library/2019-01-11-08-47-58.bpo-35715.Wi3gl0.rst M Lib/concurrent/futures/process.py diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index ce7d642b098a..9b85e7f33769 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -235,6 +235,7 @@ def _process_worker(call_queue, result_queue, initializer, initargs): _sendback_result(result_queue, call_item.work_id, exception=exc) else: _sendback_result(result_queue, call_item.work_id, result=r) + del r # Liberate the resource as soon as possible, to avoid holding onto # open files or shared memory that is not needed anymore diff --git a/Misc/NEWS.d/next/Library/2019-01-11-08-47-58.bpo-35715.Wi3gl0.rst b/Misc/NEWS.d/next/Library/2019-01-11-08-47-58.bpo-35715.Wi3gl0.rst new file mode 100644 index 000000000000..0c1ec6b53fd8 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-01-11-08-47-58.bpo-35715.Wi3gl0.rst @@ -0,0 +1 @@ +Librates the return value of a ProcessPoolExecutor _process_worker after it's no longer needed to free memory \ No newline at end of file From webhook-mailer at python.org Sat Mar 16 18:34:27 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Sat, 16 Mar 2019 22:34:27 -0000 Subject: [Python-checkins] bpo-35493: Use Process.sentinel instead of sleeping for polling worker status in multiprocessing.Pool (#11488) Message-ID: https://github.com/python/cpython/commit/7c994549dcffd0d9d3bb37475e6374f356e7240e commit: 7c994549dcffd0d9d3bb37475e6374f356e7240e branch: master author: Pablo Galindo committer: GitHub date: 2019-03-16T22:34:24Z summary: bpo-35493: Use Process.sentinel instead of sleeping for polling worker status in multiprocessing.Pool (#11488) * bpo-35493: Use Process.sentinel instead of sleeping for polling worker status in multiprocessing.Pool * Use self-pipe pattern to avoid polling for changes * Refactor some variable names and add comments * Restore timeout and poll * Use reader object only on wait() * Recompute worker sentinels every time * Remove timeout and use change notifier * Refactor some methods to be overloaded by the ThreadPool, document the cache class and fix typos files: A Misc/NEWS.d/next/Library/2019-01-09-23-43-08.bpo-35493.kEcRGE.rst M Lib/multiprocessing/pool.py diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py index 18a56f8524b4..665ca067fa07 100644 --- a/Lib/multiprocessing/pool.py +++ b/Lib/multiprocessing/pool.py @@ -21,11 +21,13 @@ import time import traceback import warnings +from queue import Empty # If threading is available then ThreadPool should be provided. Therefore # we avoid top-level imports which are liable to fail on some systems. from . import util from . import get_context, TimeoutError +from .connection import wait # # Constants representing the state of a pool @@ -145,6 +147,29 @@ def _helper_reraises_exception(ex): # Class representing a process pool # +class _PoolCache(dict): + """ + Class that implements a cache for the Pool class that will notify + the pool management threads every time the cache is emptied. The + notification is done by the use of a queue that is provided when + instantiating the cache. + """ + def __init__(self, *args, notifier=None, **kwds): + self.notifier = notifier + super().__init__(*args, **kwds) + + def __delitem__(self, item): + super().__delitem__(item) + + # Notify that the cache is empty. This is important because the + # pool keeps maintaining workers until the cache gets drained. This + # eliminates a race condition in which a task is finished after the + # the pool's _handle_workers method has enter another iteration of the + # loop. In this situation, the only event that can wake up the pool + # is the cache to be emptied (no more tasks available). + if not self: + self.notifier.put(None) + class Pool(object): ''' Class which supports an async version of applying functions to arguments. @@ -165,7 +190,11 @@ def __init__(self, processes=None, initializer=None, initargs=(), self._ctx = context or get_context() self._setup_queues() self._taskqueue = queue.SimpleQueue() - self._cache = {} + # The _change_notifier queue exist to wake up self._handle_workers() + # when the cache (self._cache) is empty or when there is a change in + # the _state variable of the thread that runs _handle_workers. + self._change_notifier = self._ctx.SimpleQueue() + self._cache = _PoolCache(notifier=self._change_notifier) self._maxtasksperchild = maxtasksperchild self._initializer = initializer self._initargs = initargs @@ -189,12 +218,14 @@ def __init__(self, processes=None, initializer=None, initargs=(), p.join() raise + sentinels = self._get_sentinels() + self._worker_handler = threading.Thread( target=Pool._handle_workers, args=(self._cache, self._taskqueue, self._ctx, self.Process, self._processes, self._pool, self._inqueue, self._outqueue, self._initializer, self._initargs, self._maxtasksperchild, - self._wrap_exception) + self._wrap_exception, sentinels, self._change_notifier) ) self._worker_handler.daemon = True self._worker_handler._state = RUN @@ -221,7 +252,7 @@ def __init__(self, processes=None, initializer=None, initargs=(), self._terminate = util.Finalize( self, self._terminate_pool, args=(self._taskqueue, self._inqueue, self._outqueue, self._pool, - self._worker_handler, self._task_handler, + self._change_notifier, self._worker_handler, self._task_handler, self._result_handler, self._cache), exitpriority=15 ) @@ -233,6 +264,8 @@ def __del__(self, _warn=warnings.warn, RUN=RUN): if self._state == RUN: _warn(f"unclosed running multiprocessing pool {self!r}", ResourceWarning, source=self) + if getattr(self, '_change_notifier', None) is not None: + self._change_notifier.put(None) def __repr__(self): cls = self.__class__ @@ -240,6 +273,16 @@ def __repr__(self): f'state={self._state} ' f'pool_size={len(self._pool)}>') + def _get_sentinels(self): + task_queue_sentinels = [self._outqueue._reader] + self_notifier_sentinels = [self._change_notifier._reader] + return [*task_queue_sentinels, *self_notifier_sentinels] + + @staticmethod + def _get_worker_sentinels(workers): + return [worker.sentinel for worker in + workers if hasattr(worker, "sentinel")] + @staticmethod def _join_exited_workers(pool): """Cleanup after any worker processes which have exited due to reaching @@ -452,18 +495,28 @@ def _map_async(self, func, iterable, mapper, chunksize=None, callback=None, return result @staticmethod - def _handle_workers(cache, taskqueue, ctx, Process, processes, pool, - inqueue, outqueue, initializer, initargs, - maxtasksperchild, wrap_exception): + def _wait_for_updates(sentinels, change_notifier, timeout=None): + wait(sentinels, timeout=timeout) + while not change_notifier.empty(): + change_notifier.get() + + @classmethod + def _handle_workers(cls, cache, taskqueue, ctx, Process, processes, + pool, inqueue, outqueue, initializer, initargs, + maxtasksperchild, wrap_exception, sentinels, + change_notifier): thread = threading.current_thread() # Keep maintaining workers until the cache gets drained, unless the pool # is terminated. while thread._state == RUN or (cache and thread._state != TERMINATE): - Pool._maintain_pool(ctx, Process, processes, pool, inqueue, - outqueue, initializer, initargs, - maxtasksperchild, wrap_exception) - time.sleep(0.1) + cls._maintain_pool(ctx, Process, processes, pool, inqueue, + outqueue, initializer, initargs, + maxtasksperchild, wrap_exception) + + current_sentinels = [*cls._get_worker_sentinels(pool), *sentinels] + + cls._wait_for_updates(current_sentinels, change_notifier) # send sentinel to stop workers taskqueue.put(None) util.debug('worker handler exiting') @@ -593,11 +646,13 @@ def close(self): if self._state == RUN: self._state = CLOSE self._worker_handler._state = CLOSE + self._change_notifier.put(None) def terminate(self): util.debug('terminating pool') self._state = TERMINATE self._worker_handler._state = TERMINATE + self._change_notifier.put(None) self._terminate() def join(self): @@ -622,7 +677,7 @@ def _help_stuff_finish(inqueue, task_handler, size): time.sleep(0) @classmethod - def _terminate_pool(cls, taskqueue, inqueue, outqueue, pool, + def _terminate_pool(cls, taskqueue, inqueue, outqueue, pool, change_notifier, worker_handler, task_handler, result_handler, cache): # this is guaranteed to only be called once util.debug('finalizing pool') @@ -638,6 +693,7 @@ def _terminate_pool(cls, taskqueue, inqueue, outqueue, pool, "Cannot have cache with result_hander not alive") result_handler._state = TERMINATE + change_notifier.put(None) outqueue.put(None) # sentinel # We must wait for the worker handler to exit before terminating @@ -871,6 +927,13 @@ def _setup_queues(self): self._quick_put = self._inqueue.put self._quick_get = self._outqueue.get + def _get_sentinels(self): + return [self._change_notifier._reader] + + @staticmethod + def _get_worker_sentinels(workers): + return [] + @staticmethod def _help_stuff_finish(inqueue, task_handler, size): # drain inqueue, and put sentinels at its head to make workers finish @@ -881,3 +944,6 @@ def _help_stuff_finish(inqueue, task_handler, size): pass for i in range(size): inqueue.put(None) + + def _wait_for_updates(self, sentinels, change_notifier, timeout): + time.sleep(timeout) diff --git a/Misc/NEWS.d/next/Library/2019-01-09-23-43-08.bpo-35493.kEcRGE.rst b/Misc/NEWS.d/next/Library/2019-01-09-23-43-08.bpo-35493.kEcRGE.rst new file mode 100644 index 000000000000..fa408c8163b7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-01-09-23-43-08.bpo-35493.kEcRGE.rst @@ -0,0 +1,3 @@ +Use :func:`multiprocessing.connection.wait` instead of polling each 0.2 +seconds for worker updates in :class:`multiprocessing.Pool`. Patch by Pablo +Galindo. From webhook-mailer at python.org Sat Mar 16 19:29:36 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Sat, 16 Mar 2019 23:29:36 -0000 Subject: [Python-checkins] bpo-23216: IDLE: Add docstrings to search modules (GH-12141) Message-ID: https://github.com/python/cpython/commit/0bb5e75cf8bc9b197ffb91cba6f30543ed502708 commit: 0bb5e75cf8bc9b197ffb91cba6f30543ed502708 branch: master author: Cheryl Sabella committer: GitHub date: 2019-03-16T19:29:33-04:00 summary: bpo-23216: IDLE: Add docstrings to search modules (GH-12141) files: A Misc/NEWS.d/next/IDLE/2019-03-02-19-39-53.bpo-23216.ZA7H8H.rst M Lib/idlelib/grep.py M Lib/idlelib/replace.py M Lib/idlelib/search.py diff --git a/Lib/idlelib/grep.py b/Lib/idlelib/grep.py index 873233ec1543..6068d7e4dfce 100644 --- a/Lib/idlelib/grep.py +++ b/Lib/idlelib/grep.py @@ -14,11 +14,16 @@ from idlelib import searchengine # Importing OutputWindow here fails due to import loop -# EditorWindow -> GrepDialop -> OutputWindow -> EditorWindow +# EditorWindow -> GrepDialog -> OutputWindow -> EditorWindow def grep(text, io=None, flist=None): - """Create or find singleton GrepDialog instance. + """Open the Find in Files dialog. + + Module-level function to access the singleton GrepDialog + instance and open the dialog. If text is selected, it is + used as the search phrase; otherwise, the previous entry + is used. Args: text: Text widget that contains the selected text for @@ -26,7 +31,6 @@ def grep(text, io=None, flist=None): io: iomenu.IOBinding instance with default path to search. flist: filelist.FileList instance for OutputWindow parent. """ - root = text._root() engine = searchengine.get(root) if not hasattr(engine, "_grepdialog"): @@ -50,17 +54,29 @@ def __init__(self, root, engine, flist): searchengine instance to prepare the search. Attributes: - globvar: Value of Text Entry widget for path to search. - recvar: Boolean value of Checkbutton widget - for traversing through subdirectories. + flist: filelist.Filelist instance for OutputWindow parent. + globvar: String value of Entry widget for path to search. + globent: Entry widget for globvar. Created in + create_entries(). + recvar: Boolean value of Checkbutton widget for + traversing through subdirectories. """ - SearchDialogBase.__init__(self, root, engine) + super().__init__(root, engine) self.flist = flist self.globvar = StringVar(root) self.recvar = BooleanVar(root) def open(self, text, searchphrase, io=None): - "Make dialog visible on top of others and ready to use." + """Make dialog visible on top of others and ready to use. + + Extend the SearchDialogBase open() to set the initial value + for globvar. + + Args: + text: Multicall object containing the text information. + searchphrase: String phrase to search. + io: iomenu.IOBinding instance containing file path. + """ SearchDialogBase.open(self, text, searchphrase) if io: path = io.filename or "" @@ -85,9 +101,9 @@ def create_other_buttons(self): btn.pack(side="top", fill="both") def create_command_buttons(self): - "Create base command buttons and add button for search." + "Create base command buttons and add button for Search Files." SearchDialogBase.create_command_buttons(self) - self.make_button("Search Files", self.default_command, 1) + self.make_button("Search Files", self.default_command, isdef=True) def default_command(self, event=None): """Grep for search pattern in file path. The default command is bound @@ -119,6 +135,10 @@ def grep_it(self, prog, path): search each line for the matching pattern. If the pattern is found, write the file and line information to stdout (which is an OutputWindow). + + Args: + prog: The compiled, cooked search pattern. + path: String containing the search path. """ dir, base = os.path.split(path) list = self.findfiles(dir, base, self.recvar.get()) @@ -149,7 +169,13 @@ def grep_it(self, prog, path): def findfiles(self, dir, base, rec): """Return list of files in the dir that match the base pattern. + Use the current directory if dir has no value. If rec is True, recursively iterate through subdirectories. + + Args: + dir: Directory path to search. + base: File search pattern. + rec: Boolean for recursive search through subdirectories. """ try: names = os.listdir(dir or os.curdir) diff --git a/Lib/idlelib/replace.py b/Lib/idlelib/replace.py index 4a834eb7901e..6be034af9626 100644 --- a/Lib/idlelib/replace.py +++ b/Lib/idlelib/replace.py @@ -1,7 +1,7 @@ """Replace dialog for IDLE. Inherits SearchDialogBase for GUI. -Uses idlelib.SearchEngine for search capability. +Uses idlelib.searchengine.SearchEngine for search capability. Defines various replace related functions like replace, replace all, -replace+find. +and replace+find. """ import re @@ -10,9 +10,16 @@ from idlelib.searchbase import SearchDialogBase from idlelib import searchengine + def replace(text): - """Returns a singleton ReplaceDialog instance.The single dialog - saves user entries and preferences across instances.""" + """Create or reuse a singleton ReplaceDialog instance. + + The singleton dialog saves user entries and preferences + across instances. + + Args: + text: Text widget containing the text to be searched. + """ root = text._root() engine = searchengine.get(root) if not hasattr(engine, "_replacedialog"): @@ -22,16 +29,36 @@ def replace(text): class ReplaceDialog(SearchDialogBase): + "Dialog for finding and replacing a pattern in text." title = "Replace Dialog" icon = "Replace" def __init__(self, root, engine): - SearchDialogBase.__init__(self, root, engine) + """Create search dialog for finding and replacing text. + + Uses SearchDialogBase as the basis for the GUI and a + searchengine instance to prepare the search. + + Attributes: + replvar: StringVar containing 'Replace with:' value. + replent: Entry widget for replvar. Created in + create_entries(). + ok: Boolean used in searchengine.search_text to indicate + whether the search includes the selection. + """ + super().__init__(root, engine) self.replvar = StringVar(root) def open(self, text): - """Display the replace dialog""" + """Make dialog visible on top of others and ready to use. + + Also, highlight the currently selected text and set the + search to include the current selection (self.ok). + + Args: + text: Text widget being searched. + """ SearchDialogBase.open(self, text) try: first = text.index("sel.first") @@ -44,37 +71,50 @@ def open(self, text): first = first or text.index("insert") last = last or first self.show_hit(first, last) - self.ok = 1 + self.ok = True def create_entries(self): - """Create label and text entry widgets""" + "Create base and additional label and text entry widgets." SearchDialogBase.create_entries(self) self.replent = self.make_entry("Replace with:", self.replvar)[0] def create_command_buttons(self): + """Create base and additional command buttons. + + The additional buttons are for Find, Replace, + Replace+Find, and Replace All. + """ SearchDialogBase.create_command_buttons(self) self.make_button("Find", self.find_it) self.make_button("Replace", self.replace_it) - self.make_button("Replace+Find", self.default_command, 1) + self.make_button("Replace+Find", self.default_command, isdef=True) self.make_button("Replace All", self.replace_all) def find_it(self, event=None): - self.do_find(0) + "Handle the Find button." + self.do_find(False) def replace_it(self, event=None): + """Handle the Replace button. + + If the find is successful, then perform replace. + """ if self.do_find(self.ok): self.do_replace() def default_command(self, event=None): - "Replace and find next." + """Handle the Replace+Find button as the default command. + + First performs a replace and then, if the replace was + successful, a find next. + """ if self.do_find(self.ok): if self.do_replace(): # Only find next match if replace succeeded. # A bad re can cause it to fail. - self.do_find(0) + self.do_find(False) def _replace_expand(self, m, repl): - """ Helper function for expanding a regular expression - in the replace field, if needed. """ + "Expand replacement text if regular expression." if self.engine.isre(): try: new = m.expand(repl) @@ -87,7 +127,15 @@ def _replace_expand(self, m, repl): return new def replace_all(self, event=None): - """Replace all instances of patvar with replvar in text""" + """Handle the Replace All button. + + Search text for occurrences of the Find value and replace + each of them. The 'wrap around' value controls the start + point for searching. If wrap isn't set, then the searching + starts at the first occurrence after the current selection; + if wrap is set, the replacement starts at the first line. + The replacement is always done top-to-bottom in the text. + """ prog = self.engine.getprog() if not prog: return @@ -104,12 +152,13 @@ def replace_all(self, event=None): if self.engine.iswrap(): line = 1 col = 0 - ok = 1 + ok = True first = last = None # XXX ought to replace circular instead of top-to-bottom when wrapping text.undo_block_start() - while 1: - res = self.engine.search_forward(text, prog, line, col, 0, ok) + while True: + res = self.engine.search_forward(text, prog, line, col, + wrap=False, ok=ok) if not res: break line, m = res @@ -130,13 +179,17 @@ def replace_all(self, event=None): if new: text.insert(first, new) col = i + len(new) - ok = 0 + ok = False text.undo_block_stop() if first and last: self.show_hit(first, last) self.close() - def do_find(self, ok=0): + def do_find(self, ok=False): + """Search for and highlight next occurrence of pattern in text. + + No text replacement is done with this option. + """ if not self.engine.getprog(): return False text = self.text @@ -149,10 +202,11 @@ def do_find(self, ok=0): first = "%d.%d" % (line, i) last = "%d.%d" % (line, j) self.show_hit(first, last) - self.ok = 1 + self.ok = True return True def do_replace(self): + "Replace search pattern in text with replacement value." prog = self.engine.getprog() if not prog: return False @@ -180,12 +234,20 @@ def do_replace(self): text.insert(first, new) text.undo_block_stop() self.show_hit(first, text.index("insert")) - self.ok = 0 + self.ok = False return True def show_hit(self, first, last): - """Highlight text from 'first' to 'last'. - 'first', 'last' - Text indices""" + """Highlight text between first and last indices. + + Text is highlighted via the 'hit' tag and the marked + section is brought into view. + + The colors from the 'hit' tag aren't currently shown + when the text is displayed. This is due to the 'sel' + tag being added first, so the colors in the 'sel' + config are seen instead of the colors for 'hit'. + """ text = self.text text.mark_set("insert", first) text.tag_remove("sel", "1.0", "end") @@ -199,6 +261,7 @@ def show_hit(self, first, last): text.update_idletasks() def close(self, event=None): + "Close the dialog and remove hit tags." SearchDialogBase.close(self, event) self.text.tag_remove("hit", "1.0", "end") diff --git a/Lib/idlelib/search.py b/Lib/idlelib/search.py index 6e5a0c7973c7..5bbe9d6b5dc8 100644 --- a/Lib/idlelib/search.py +++ b/Lib/idlelib/search.py @@ -1,10 +1,23 @@ +"""Search dialog for Find, Find Again, and Find Selection + functionality. + + Inherits from SearchDialogBase for GUI and uses searchengine + to prepare search pattern. +""" from tkinter import TclError from idlelib import searchengine from idlelib.searchbase import SearchDialogBase def _setup(text): - "Create or find the singleton SearchDialog instance." + """Return the new or existing singleton SearchDialog instance. + + The singleton dialog saves user entries and preferences + across instances. + + Args: + text: Text widget containing the text to be searched. + """ root = text._root() engine = searchengine.get(root) if not hasattr(engine, "_searchdialog"): @@ -12,31 +25,71 @@ def _setup(text): return engine._searchdialog def find(text): - "Handle the editor edit menu item and corresponding event." + """Open the search dialog. + + Module-level function to access the singleton SearchDialog + instance and open the dialog. If text is selected, it is + used as the search phrase; otherwise, the previous entry + is used. No search is done with this command. + """ pat = text.get("sel.first", "sel.last") return _setup(text).open(text, pat) # Open is inherited from SDBase. def find_again(text): - "Handle the editor edit menu item and corresponding event." + """Repeat the search for the last pattern and preferences. + + Module-level function to access the singleton SearchDialog + instance to search again using the user entries and preferences + from the last dialog. If there was no prior search, open the + search dialog; otherwise, perform the search without showing the + dialog. + """ return _setup(text).find_again(text) def find_selection(text): - "Handle the editor edit menu item and corresponding event." + """Search for the selected pattern in the text. + + Module-level function to access the singleton SearchDialog + instance to search using the selected text. With a text + selection, perform the search without displaying the dialog. + Without a selection, use the prior entry as the search phrase + and don't display the dialog. If there has been no prior + search, open the search dialog. + """ return _setup(text).find_selection(text) class SearchDialog(SearchDialogBase): + "Dialog for finding a pattern in text." def create_widgets(self): + "Create the base search dialog and add a button for Find Next." SearchDialogBase.create_widgets(self) - self.make_button("Find Next", self.default_command, 1) + # TODO - why is this here and not in a create_command_buttons? + self.make_button("Find Next", self.default_command, isdef=True) def default_command(self, event=None): + "Handle the Find Next button as the default command." if not self.engine.getprog(): return self.find_again(self.text) def find_again(self, text): + """Repeat the last search. + + If no search was previously run, open a new search dialog. In + this case, no search is done. + + If a seach was previously run, the search dialog won't be + shown and the options from the previous search (including the + search pattern) will be used to find the next occurrence + of the pattern. Next is relative based on direction. + + Position the window to display the located occurrence in the + text. + + Return True if the search was successful and False otherwise. + """ if not self.engine.getpat(): self.open(text) return False @@ -66,6 +119,13 @@ def find_again(self, text): return False def find_selection(self, text): + """Search for selected text with previous dialog preferences. + + Instead of using the same pattern for searching (as Find + Again does), this first resets the pattern to the currently + selected text. If the selected text isn't changed, then use + the prior search phrase. + """ pat = text.get("sel.first", "sel.last") if pat: self.engine.setcookedpat(pat) diff --git a/Misc/NEWS.d/next/IDLE/2019-03-02-19-39-53.bpo-23216.ZA7H8H.rst b/Misc/NEWS.d/next/IDLE/2019-03-02-19-39-53.bpo-23216.ZA7H8H.rst new file mode 100644 index 000000000000..ec091615a190 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-03-02-19-39-53.bpo-23216.ZA7H8H.rst @@ -0,0 +1 @@ +Add docstrings to IDLE search modules. From webhook-mailer at python.org Sat Mar 16 19:42:16 2019 From: webhook-mailer at python.org (larryhastings) Date: Sat, 16 Mar 2019 23:42:16 -0000 Subject: [Python-checkins] bpo-35647: Fix path check in cookiejar (#11436) (#12277) Message-ID: https://github.com/python/cpython/commit/382981b25092b5e9285f1e4894142af1e8f2ca86 commit: 382981b25092b5e9285f1e4894142af1e8f2ca86 branch: 3.5 author: Xtreak committer: larryhastings date: 2019-03-16T16:42:11-07:00 summary: bpo-35647: Fix path check in cookiejar (#11436) (#12277) * Refactor cookie path check as per RFC 6265 * Add tests for prefix match of path * Add news entry * Fix set_ok_path and refactor tests * Use slice for last letter (cherry picked from commit 0e1f1f01058bd4a9b98cfe443214adecc019a38c) files: A Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst M Lib/http/cookiejar.py M Lib/test/test_http_cookiejar.py diff --git a/Lib/http/cookiejar.py b/Lib/http/cookiejar.py index 6d4572af03e1..f800b56d25a1 100644 --- a/Lib/http/cookiejar.py +++ b/Lib/http/cookiejar.py @@ -993,7 +993,7 @@ def set_ok_path(self, cookie, request): req_path = request_path(request) if ((cookie.version > 0 or (cookie.version == 0 and self.strict_ns_set_path)) and - not req_path.startswith(cookie.path)): + not self.path_return_ok(cookie.path, request)): _debug(" path attribute %s is not a prefix of request " "path %s", cookie.path, req_path) return False @@ -1191,11 +1191,15 @@ def domain_return_ok(self, domain, request): def path_return_ok(self, path, request): _debug("- checking cookie path=%s", path) req_path = request_path(request) - if not req_path.startswith(path): - _debug(" %s does not path-match %s", req_path, path) - return False - return True + pathlen = len(path) + if req_path == path: + return True + elif (req_path.startswith(path) and + (path.endswith("/") or req_path[pathlen:pathlen+1] == "/")): + return True + _debug(" %s does not path-match %s", req_path, path) + return False def vals_sorted_by_key(adict): keys = sorted(adict.keys()) diff --git a/Lib/test/test_http_cookiejar.py b/Lib/test/test_http_cookiejar.py index 49c01ae48997..9345c2519fa7 100644 --- a/Lib/test/test_http_cookiejar.py +++ b/Lib/test/test_http_cookiejar.py @@ -694,6 +694,32 @@ def test_request_path(self): req = urllib.request.Request("http://www.example.com") self.assertEqual(request_path(req), "/") + def test_path_prefix_match(self): + pol = DefaultCookiePolicy() + strict_ns_path_pol = DefaultCookiePolicy(strict_ns_set_path=True) + + c = CookieJar(pol) + base_url = "http://bar.com" + interact_netscape(c, base_url, 'spam=eggs; Path=/foo') + cookie = c._cookies['bar.com']['/foo']['spam'] + + for path, ok in [('/foo', True), + ('/foo/', True), + ('/foo/bar', True), + ('/', False), + ('/foobad/foo', False)]: + url = '{0}{1}'.format(base_url, path) + req = urllib.request.Request(url) + h = interact_netscape(c, url) + if ok: + self.assertIn('spam=eggs', h, + "cookie not set for {0}".format(path)) + self.assertTrue(strict_ns_path_pol.set_ok_path(cookie, req)) + else: + self.assertNotIn('spam=eggs', h, + "cookie set for {0}".format(path)) + self.assertFalse(strict_ns_path_pol.set_ok_path(cookie, req)) + def test_request_port(self): req = urllib.request.Request("http://www.acme.com:1234/", headers={"Host": "www.acme.com:4321"}) diff --git a/Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst b/Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst new file mode 100644 index 000000000000..032e1e2c00bc --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst @@ -0,0 +1,3 @@ +Don't set cookie for a request when the request path is a prefix match of +the cookie's path attribute but doesn't end with "/". Patch by Karthikeyan +Singaravelan. From webhook-mailer at python.org Sat Mar 16 19:44:59 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Sat, 16 Mar 2019 23:44:59 -0000 Subject: [Python-checkins] bpo-34160: Update news entry for XML order attributes (#12335) Message-ID: https://github.com/python/cpython/commit/06e1e688228013f411aca6309562ef80df6ce5d3 commit: 06e1e688228013f411aca6309562ef80df6ce5d3 branch: master author: Diego Rojas committer: Raymond Hettinger date: 2019-03-16T16:44:56-07:00 summary: bpo-34160: Update news entry for XML order attributes (#12335) files: M Doc/whatsnew/3.8.rst M Misc/ACKS diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 31ea0d145819..eaa3f5b79f05 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -614,6 +614,11 @@ Changes in the Python API specialized methods like :meth:`~tkinter.ttk.Treeview.selection_set` for changing the selection. (Contributed by Serhiy Storchaka in :issue:`31508`.) +* The :meth:`writexml`, :meth:`toxml` and :meth:`toprettyxml` methods of the + :mod:`xml.dom.minidom` module, and :mod:`xml.etree` now preserve the attribute + order specified by the user. + (Contributed by Diego Rojas and Raymond Hettinger in :issue:`34160`.) + * A :mod:`dbm.dumb` database opened with flags ``'r'`` is now read-only. :func:`dbm.dumb.open` with flags ``'r'`` and ``'w'`` no longer creates a database if it does not exist. diff --git a/Misc/ACKS b/Misc/ACKS index 2026852db1a1..9cddcb3a871f 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1847,3 +1847,4 @@ Doug Zongker Peter ?strand Zheao Li Carsten Klein +Diego Rojas From webhook-mailer at python.org Sat Mar 16 19:47:32 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 16 Mar 2019 23:47:32 -0000 Subject: [Python-checkins] bpo-23216: IDLE: Add docstrings to search modules (GH-12141) Message-ID: https://github.com/python/cpython/commit/b34f1aa81433d60aee7bd744352b347dd650ca84 commit: b34f1aa81433d60aee7bd744352b347dd650ca84 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-16T16:47:28-07:00 summary: bpo-23216: IDLE: Add docstrings to search modules (GH-12141) (cherry picked from commit 0bb5e75cf8bc9b197ffb91cba6f30543ed502708) Co-authored-by: Cheryl Sabella files: A Misc/NEWS.d/next/IDLE/2019-03-02-19-39-53.bpo-23216.ZA7H8H.rst M Lib/idlelib/grep.py M Lib/idlelib/replace.py M Lib/idlelib/search.py diff --git a/Lib/idlelib/grep.py b/Lib/idlelib/grep.py index 873233ec1543..6068d7e4dfce 100644 --- a/Lib/idlelib/grep.py +++ b/Lib/idlelib/grep.py @@ -14,11 +14,16 @@ from idlelib import searchengine # Importing OutputWindow here fails due to import loop -# EditorWindow -> GrepDialop -> OutputWindow -> EditorWindow +# EditorWindow -> GrepDialog -> OutputWindow -> EditorWindow def grep(text, io=None, flist=None): - """Create or find singleton GrepDialog instance. + """Open the Find in Files dialog. + + Module-level function to access the singleton GrepDialog + instance and open the dialog. If text is selected, it is + used as the search phrase; otherwise, the previous entry + is used. Args: text: Text widget that contains the selected text for @@ -26,7 +31,6 @@ def grep(text, io=None, flist=None): io: iomenu.IOBinding instance with default path to search. flist: filelist.FileList instance for OutputWindow parent. """ - root = text._root() engine = searchengine.get(root) if not hasattr(engine, "_grepdialog"): @@ -50,17 +54,29 @@ def __init__(self, root, engine, flist): searchengine instance to prepare the search. Attributes: - globvar: Value of Text Entry widget for path to search. - recvar: Boolean value of Checkbutton widget - for traversing through subdirectories. + flist: filelist.Filelist instance for OutputWindow parent. + globvar: String value of Entry widget for path to search. + globent: Entry widget for globvar. Created in + create_entries(). + recvar: Boolean value of Checkbutton widget for + traversing through subdirectories. """ - SearchDialogBase.__init__(self, root, engine) + super().__init__(root, engine) self.flist = flist self.globvar = StringVar(root) self.recvar = BooleanVar(root) def open(self, text, searchphrase, io=None): - "Make dialog visible on top of others and ready to use." + """Make dialog visible on top of others and ready to use. + + Extend the SearchDialogBase open() to set the initial value + for globvar. + + Args: + text: Multicall object containing the text information. + searchphrase: String phrase to search. + io: iomenu.IOBinding instance containing file path. + """ SearchDialogBase.open(self, text, searchphrase) if io: path = io.filename or "" @@ -85,9 +101,9 @@ def create_other_buttons(self): btn.pack(side="top", fill="both") def create_command_buttons(self): - "Create base command buttons and add button for search." + "Create base command buttons and add button for Search Files." SearchDialogBase.create_command_buttons(self) - self.make_button("Search Files", self.default_command, 1) + self.make_button("Search Files", self.default_command, isdef=True) def default_command(self, event=None): """Grep for search pattern in file path. The default command is bound @@ -119,6 +135,10 @@ def grep_it(self, prog, path): search each line for the matching pattern. If the pattern is found, write the file and line information to stdout (which is an OutputWindow). + + Args: + prog: The compiled, cooked search pattern. + path: String containing the search path. """ dir, base = os.path.split(path) list = self.findfiles(dir, base, self.recvar.get()) @@ -149,7 +169,13 @@ def grep_it(self, prog, path): def findfiles(self, dir, base, rec): """Return list of files in the dir that match the base pattern. + Use the current directory if dir has no value. If rec is True, recursively iterate through subdirectories. + + Args: + dir: Directory path to search. + base: File search pattern. + rec: Boolean for recursive search through subdirectories. """ try: names = os.listdir(dir or os.curdir) diff --git a/Lib/idlelib/replace.py b/Lib/idlelib/replace.py index 4a834eb7901e..6be034af9626 100644 --- a/Lib/idlelib/replace.py +++ b/Lib/idlelib/replace.py @@ -1,7 +1,7 @@ """Replace dialog for IDLE. Inherits SearchDialogBase for GUI. -Uses idlelib.SearchEngine for search capability. +Uses idlelib.searchengine.SearchEngine for search capability. Defines various replace related functions like replace, replace all, -replace+find. +and replace+find. """ import re @@ -10,9 +10,16 @@ from idlelib.searchbase import SearchDialogBase from idlelib import searchengine + def replace(text): - """Returns a singleton ReplaceDialog instance.The single dialog - saves user entries and preferences across instances.""" + """Create or reuse a singleton ReplaceDialog instance. + + The singleton dialog saves user entries and preferences + across instances. + + Args: + text: Text widget containing the text to be searched. + """ root = text._root() engine = searchengine.get(root) if not hasattr(engine, "_replacedialog"): @@ -22,16 +29,36 @@ def replace(text): class ReplaceDialog(SearchDialogBase): + "Dialog for finding and replacing a pattern in text." title = "Replace Dialog" icon = "Replace" def __init__(self, root, engine): - SearchDialogBase.__init__(self, root, engine) + """Create search dialog for finding and replacing text. + + Uses SearchDialogBase as the basis for the GUI and a + searchengine instance to prepare the search. + + Attributes: + replvar: StringVar containing 'Replace with:' value. + replent: Entry widget for replvar. Created in + create_entries(). + ok: Boolean used in searchengine.search_text to indicate + whether the search includes the selection. + """ + super().__init__(root, engine) self.replvar = StringVar(root) def open(self, text): - """Display the replace dialog""" + """Make dialog visible on top of others and ready to use. + + Also, highlight the currently selected text and set the + search to include the current selection (self.ok). + + Args: + text: Text widget being searched. + """ SearchDialogBase.open(self, text) try: first = text.index("sel.first") @@ -44,37 +71,50 @@ def open(self, text): first = first or text.index("insert") last = last or first self.show_hit(first, last) - self.ok = 1 + self.ok = True def create_entries(self): - """Create label and text entry widgets""" + "Create base and additional label and text entry widgets." SearchDialogBase.create_entries(self) self.replent = self.make_entry("Replace with:", self.replvar)[0] def create_command_buttons(self): + """Create base and additional command buttons. + + The additional buttons are for Find, Replace, + Replace+Find, and Replace All. + """ SearchDialogBase.create_command_buttons(self) self.make_button("Find", self.find_it) self.make_button("Replace", self.replace_it) - self.make_button("Replace+Find", self.default_command, 1) + self.make_button("Replace+Find", self.default_command, isdef=True) self.make_button("Replace All", self.replace_all) def find_it(self, event=None): - self.do_find(0) + "Handle the Find button." + self.do_find(False) def replace_it(self, event=None): + """Handle the Replace button. + + If the find is successful, then perform replace. + """ if self.do_find(self.ok): self.do_replace() def default_command(self, event=None): - "Replace and find next." + """Handle the Replace+Find button as the default command. + + First performs a replace and then, if the replace was + successful, a find next. + """ if self.do_find(self.ok): if self.do_replace(): # Only find next match if replace succeeded. # A bad re can cause it to fail. - self.do_find(0) + self.do_find(False) def _replace_expand(self, m, repl): - """ Helper function for expanding a regular expression - in the replace field, if needed. """ + "Expand replacement text if regular expression." if self.engine.isre(): try: new = m.expand(repl) @@ -87,7 +127,15 @@ def _replace_expand(self, m, repl): return new def replace_all(self, event=None): - """Replace all instances of patvar with replvar in text""" + """Handle the Replace All button. + + Search text for occurrences of the Find value and replace + each of them. The 'wrap around' value controls the start + point for searching. If wrap isn't set, then the searching + starts at the first occurrence after the current selection; + if wrap is set, the replacement starts at the first line. + The replacement is always done top-to-bottom in the text. + """ prog = self.engine.getprog() if not prog: return @@ -104,12 +152,13 @@ def replace_all(self, event=None): if self.engine.iswrap(): line = 1 col = 0 - ok = 1 + ok = True first = last = None # XXX ought to replace circular instead of top-to-bottom when wrapping text.undo_block_start() - while 1: - res = self.engine.search_forward(text, prog, line, col, 0, ok) + while True: + res = self.engine.search_forward(text, prog, line, col, + wrap=False, ok=ok) if not res: break line, m = res @@ -130,13 +179,17 @@ def replace_all(self, event=None): if new: text.insert(first, new) col = i + len(new) - ok = 0 + ok = False text.undo_block_stop() if first and last: self.show_hit(first, last) self.close() - def do_find(self, ok=0): + def do_find(self, ok=False): + """Search for and highlight next occurrence of pattern in text. + + No text replacement is done with this option. + """ if not self.engine.getprog(): return False text = self.text @@ -149,10 +202,11 @@ def do_find(self, ok=0): first = "%d.%d" % (line, i) last = "%d.%d" % (line, j) self.show_hit(first, last) - self.ok = 1 + self.ok = True return True def do_replace(self): + "Replace search pattern in text with replacement value." prog = self.engine.getprog() if not prog: return False @@ -180,12 +234,20 @@ def do_replace(self): text.insert(first, new) text.undo_block_stop() self.show_hit(first, text.index("insert")) - self.ok = 0 + self.ok = False return True def show_hit(self, first, last): - """Highlight text from 'first' to 'last'. - 'first', 'last' - Text indices""" + """Highlight text between first and last indices. + + Text is highlighted via the 'hit' tag and the marked + section is brought into view. + + The colors from the 'hit' tag aren't currently shown + when the text is displayed. This is due to the 'sel' + tag being added first, so the colors in the 'sel' + config are seen instead of the colors for 'hit'. + """ text = self.text text.mark_set("insert", first) text.tag_remove("sel", "1.0", "end") @@ -199,6 +261,7 @@ def show_hit(self, first, last): text.update_idletasks() def close(self, event=None): + "Close the dialog and remove hit tags." SearchDialogBase.close(self, event) self.text.tag_remove("hit", "1.0", "end") diff --git a/Lib/idlelib/search.py b/Lib/idlelib/search.py index 6e5a0c7973c7..5bbe9d6b5dc8 100644 --- a/Lib/idlelib/search.py +++ b/Lib/idlelib/search.py @@ -1,10 +1,23 @@ +"""Search dialog for Find, Find Again, and Find Selection + functionality. + + Inherits from SearchDialogBase for GUI and uses searchengine + to prepare search pattern. +""" from tkinter import TclError from idlelib import searchengine from idlelib.searchbase import SearchDialogBase def _setup(text): - "Create or find the singleton SearchDialog instance." + """Return the new or existing singleton SearchDialog instance. + + The singleton dialog saves user entries and preferences + across instances. + + Args: + text: Text widget containing the text to be searched. + """ root = text._root() engine = searchengine.get(root) if not hasattr(engine, "_searchdialog"): @@ -12,31 +25,71 @@ def _setup(text): return engine._searchdialog def find(text): - "Handle the editor edit menu item and corresponding event." + """Open the search dialog. + + Module-level function to access the singleton SearchDialog + instance and open the dialog. If text is selected, it is + used as the search phrase; otherwise, the previous entry + is used. No search is done with this command. + """ pat = text.get("sel.first", "sel.last") return _setup(text).open(text, pat) # Open is inherited from SDBase. def find_again(text): - "Handle the editor edit menu item and corresponding event." + """Repeat the search for the last pattern and preferences. + + Module-level function to access the singleton SearchDialog + instance to search again using the user entries and preferences + from the last dialog. If there was no prior search, open the + search dialog; otherwise, perform the search without showing the + dialog. + """ return _setup(text).find_again(text) def find_selection(text): - "Handle the editor edit menu item and corresponding event." + """Search for the selected pattern in the text. + + Module-level function to access the singleton SearchDialog + instance to search using the selected text. With a text + selection, perform the search without displaying the dialog. + Without a selection, use the prior entry as the search phrase + and don't display the dialog. If there has been no prior + search, open the search dialog. + """ return _setup(text).find_selection(text) class SearchDialog(SearchDialogBase): + "Dialog for finding a pattern in text." def create_widgets(self): + "Create the base search dialog and add a button for Find Next." SearchDialogBase.create_widgets(self) - self.make_button("Find Next", self.default_command, 1) + # TODO - why is this here and not in a create_command_buttons? + self.make_button("Find Next", self.default_command, isdef=True) def default_command(self, event=None): + "Handle the Find Next button as the default command." if not self.engine.getprog(): return self.find_again(self.text) def find_again(self, text): + """Repeat the last search. + + If no search was previously run, open a new search dialog. In + this case, no search is done. + + If a seach was previously run, the search dialog won't be + shown and the options from the previous search (including the + search pattern) will be used to find the next occurrence + of the pattern. Next is relative based on direction. + + Position the window to display the located occurrence in the + text. + + Return True if the search was successful and False otherwise. + """ if not self.engine.getpat(): self.open(text) return False @@ -66,6 +119,13 @@ def find_again(self, text): return False def find_selection(self, text): + """Search for selected text with previous dialog preferences. + + Instead of using the same pattern for searching (as Find + Again does), this first resets the pattern to the currently + selected text. If the selected text isn't changed, then use + the prior search phrase. + """ pat = text.get("sel.first", "sel.last") if pat: self.engine.setcookedpat(pat) diff --git a/Misc/NEWS.d/next/IDLE/2019-03-02-19-39-53.bpo-23216.ZA7H8H.rst b/Misc/NEWS.d/next/IDLE/2019-03-02-19-39-53.bpo-23216.ZA7H8H.rst new file mode 100644 index 000000000000..ec091615a190 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-03-02-19-39-53.bpo-23216.ZA7H8H.rst @@ -0,0 +1 @@ +Add docstrings to IDLE search modules. From webhook-mailer at python.org Sat Mar 16 20:03:42 2019 From: webhook-mailer at python.org (larryhastings) Date: Sun, 17 Mar 2019 00:03:42 -0000 Subject: [Python-checkins] [3.5] bpo-35121: prefix dot in domain for proper subdomain validation (GH-10258) (#12281) Message-ID: https://github.com/python/cpython/commit/4749f1b69000259e23b4cc6f63c542a9bdc62f1b commit: 4749f1b69000259e23b4cc6f63c542a9bdc62f1b branch: 3.5 author: Xtreak committer: larryhastings date: 2019-03-16T17:03:39-07:00 summary: [3.5] bpo-35121: prefix dot in domain for proper subdomain validation (GH-10258) (#12281) Don't send cookies of domain A without Domain attribute to domain B when domain A is a suffix match of domain B while using a cookiejar with `http.cookiejar.DefaultCookiePolicy` policy. Patch by Karthikeyan Singaravelan. (cherry picked from commit ca7fe5063593958e5efdf90f068582837f07bd14) Co-authored-by: Xtreak files: A Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst M Lib/http/cookiejar.py M Lib/test/test_http_cookiejar.py diff --git a/Lib/http/cookiejar.py b/Lib/http/cookiejar.py index f800b56d25a1..c6b9d8c011de 100644 --- a/Lib/http/cookiejar.py +++ b/Lib/http/cookiejar.py @@ -1148,6 +1148,11 @@ def return_ok_domain(self, cookie, request): req_host, erhn = eff_request_host(request) domain = cookie.domain + if domain and not domain.startswith("."): + dotdomain = "." + domain + else: + dotdomain = domain + # strict check of non-domain cookies: Mozilla does this, MSIE5 doesn't if (cookie.version == 0 and (self.strict_ns_domain & self.DomainStrictNonDomain) and @@ -1160,7 +1165,7 @@ def return_ok_domain(self, cookie, request): _debug(" effective request-host name %s does not domain-match " "RFC 2965 cookie domain %s", erhn, domain) return False - if cookie.version == 0 and not ("."+erhn).endswith(domain): + if cookie.version == 0 and not ("."+erhn).endswith(dotdomain): _debug(" request-host %s does not match Netscape cookie domain " "%s", req_host, domain) return False @@ -1174,7 +1179,11 @@ def domain_return_ok(self, domain, request): req_host = "."+req_host if not erhn.startswith("."): erhn = "."+erhn - if not (req_host.endswith(domain) or erhn.endswith(domain)): + if domain and not domain.startswith("."): + dotdomain = "." + domain + else: + dotdomain = domain + if not (req_host.endswith(dotdomain) or erhn.endswith(dotdomain)): #_debug(" request domain %s does not match cookie domain %s", # req_host, domain) return False diff --git a/Lib/test/test_http_cookiejar.py b/Lib/test/test_http_cookiejar.py index 9345c2519fa7..767b0fd1375f 100644 --- a/Lib/test/test_http_cookiejar.py +++ b/Lib/test/test_http_cookiejar.py @@ -417,6 +417,7 @@ def test_domain_return_ok(self): ("http://foo.bar.com/", ".foo.bar.com", True), ("http://foo.bar.com/", "foo.bar.com", True), ("http://foo.bar.com/", ".bar.com", True), + ("http://foo.bar.com/", "bar.com", True), ("http://foo.bar.com/", "com", True), ("http://foo.com/", "rhubarb.foo.com", False), ("http://foo.com/", ".foo.com", True), @@ -427,6 +428,8 @@ def test_domain_return_ok(self): ("http://foo/", "foo", True), ("http://foo/", "foo.local", True), ("http://foo/", ".local", True), + ("http://barfoo.com", ".foo.com", False), + ("http://barfoo.com", "foo.com", False), ]: request = urllib.request.Request(url) r = pol.domain_return_ok(domain, request) @@ -987,6 +990,33 @@ def test_domain_block(self): c.add_cookie_header(req) self.assertFalse(req.has_header("Cookie")) + c.clear() + + pol.set_blocked_domains([]) + req = urllib.request.Request("http://acme.com/") + res = FakeResponse(headers, "http://acme.com/") + cookies = c.make_cookies(res, req) + c.extract_cookies(res, req) + self.assertEqual(len(c), 1) + + req = urllib.request.Request("http://acme.com/") + c.add_cookie_header(req) + self.assertTrue(req.has_header("Cookie")) + + req = urllib.request.Request("http://badacme.com/") + c.add_cookie_header(req) + self.assertFalse(pol.return_ok(cookies[0], req)) + self.assertFalse(req.has_header("Cookie")) + + p = pol.set_blocked_domains(["acme.com"]) + req = urllib.request.Request("http://acme.com/") + c.add_cookie_header(req) + self.assertFalse(req.has_header("Cookie")) + + req = urllib.request.Request("http://badacme.com/") + c.add_cookie_header(req) + self.assertFalse(req.has_header("Cookie")) + def test_secure(self): for ns in True, False: for whitespace in " ", "": diff --git a/Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst b/Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst new file mode 100644 index 000000000000..d2eb8f1f352c --- /dev/null +++ b/Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst @@ -0,0 +1,4 @@ +Don't send cookies of domain A without Domain attribute to domain B +when domain A is a suffix match of domain B while using a cookiejar +with :class:`http.cookiejar.DefaultCookiePolicy` policy. Patch by +Karthikeyan Singaravelan. From webhook-mailer at python.org Sun Mar 17 18:51:16 2019 From: webhook-mailer at python.org (Yury Selivanov) Date: Sun, 17 Mar 2019 22:51:16 -0000 Subject: [Python-checkins] bpo-34745: Fix asyncio sslproto memory issues (GH-12386) Message-ID: https://github.com/python/cpython/commit/f683f464259715d620777d7ed568e701337a703a commit: f683f464259715d620777d7ed568e701337a703a branch: master author: Fantix King committer: Yury Selivanov date: 2019-03-17T18:51:10-04:00 summary: bpo-34745: Fix asyncio sslproto memory issues (GH-12386) * Fix handshake timeout leak in asyncio/sslproto Refs MagicStack/uvloop#222 * Break circular ref _SSLPipe <-> SSLProtocol * bpo-34745: Fix asyncio ssl memory leak * Break circular ref SSLProtocol <-> UserProtocol * Add NEWS entry files: A Misc/NEWS.d/next/Library/2019-03-17-16-43-29.bpo-34745.nOfm7_.rst M Lib/asyncio/sslproto.py M Lib/test/test_asyncio/test_sslproto.py diff --git a/Lib/asyncio/sslproto.py b/Lib/asyncio/sslproto.py index 42785609dcd2..97a6fc66a927 100644 --- a/Lib/asyncio/sslproto.py +++ b/Lib/asyncio/sslproto.py @@ -498,7 +498,11 @@ def connection_lost(self, exc): self._app_transport._closed = True self._transport = None self._app_transport = None + if getattr(self, '_handshake_timeout_handle', None): + self._handshake_timeout_handle.cancel() self._wakeup_waiter(exc) + self._app_protocol = None + self._sslpipe = None def pause_writing(self): """Called when the low-level transport's buffer goes over diff --git a/Lib/test/test_asyncio/test_sslproto.py b/Lib/test/test_asyncio/test_sslproto.py index 19b7a4366b2e..7bc2ccf0bddc 100644 --- a/Lib/test/test_asyncio/test_sslproto.py +++ b/Lib/test/test_asyncio/test_sslproto.py @@ -4,6 +4,7 @@ import socket import sys import unittest +import weakref from unittest import mock try: import ssl @@ -274,6 +275,72 @@ def eof_received(self): self.loop.run_until_complete( asyncio.wait_for(client(srv.addr), timeout=10)) + # No garbage is left if SSL is closed uncleanly + client_context = weakref.ref(client_context) + self.assertIsNone(client_context()) + + def test_create_connection_memory_leak(self): + HELLO_MSG = b'1' * self.PAYLOAD_SIZE + + server_context = test_utils.simple_server_sslcontext() + client_context = test_utils.simple_client_sslcontext() + + def serve(sock): + sock.settimeout(self.TIMEOUT) + + sock.start_tls(server_context, server_side=True) + + sock.sendall(b'O') + data = sock.recv_all(len(HELLO_MSG)) + self.assertEqual(len(data), len(HELLO_MSG)) + + sock.shutdown(socket.SHUT_RDWR) + sock.close() + + class ClientProto(asyncio.Protocol): + def __init__(self, on_data, on_eof): + self.on_data = on_data + self.on_eof = on_eof + self.con_made_cnt = 0 + + def connection_made(proto, tr): + # XXX: We assume user stores the transport in protocol + proto.tr = tr + proto.con_made_cnt += 1 + # Ensure connection_made gets called only once. + self.assertEqual(proto.con_made_cnt, 1) + + def data_received(self, data): + self.on_data.set_result(data) + + def eof_received(self): + self.on_eof.set_result(True) + + async def client(addr): + await asyncio.sleep(0.5) + + on_data = self.loop.create_future() + on_eof = self.loop.create_future() + + tr, proto = await self.loop.create_connection( + lambda: ClientProto(on_data, on_eof), *addr, + ssl=client_context) + + self.assertEqual(await on_data, b'O') + tr.write(HELLO_MSG) + await on_eof + + tr.close() + + with self.tcp_server(serve, timeout=self.TIMEOUT) as srv: + self.loop.run_until_complete( + asyncio.wait_for(client(srv.addr), timeout=10)) + + # No garbage is left for SSL client from loop.create_connection, even + # if user stores the SSLTransport in corresponding protocol instance + client_context = weakref.ref(client_context) + self.assertIsNone(client_context()) + def test_start_tls_client_buf_proto_1(self): HELLO_MSG = b'1' * self.PAYLOAD_SIZE @@ -562,6 +629,11 @@ def server(sock): # exception or log an error, even if the handshake failed self.assertEqual(messages, []) + # The 10s handshake timeout should be cancelled to free related + # objects without really waiting for 10s + client_sslctx = weakref.ref(client_sslctx) + self.assertIsNone(client_sslctx()) + def test_create_connection_ssl_slow_handshake(self): client_sslctx = test_utils.simple_client_sslcontext() diff --git a/Misc/NEWS.d/next/Library/2019-03-17-16-43-29.bpo-34745.nOfm7_.rst b/Misc/NEWS.d/next/Library/2019-03-17-16-43-29.bpo-34745.nOfm7_.rst new file mode 100644 index 000000000000..d88f36a6d217 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-17-16-43-29.bpo-34745.nOfm7_.rst @@ -0,0 +1 @@ +Fix :mod:`asyncio` ssl memory issues caused by circular references From webhook-mailer at python.org Sun Mar 17 19:09:18 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 17 Mar 2019 23:09:18 -0000 Subject: [Python-checkins] bpo-34745: Fix asyncio sslproto memory issues (GH-12386) Message-ID: https://github.com/python/cpython/commit/7f7485c0605fe979e39c58b688f2bb6a4f43e65e commit: 7f7485c0605fe979e39c58b688f2bb6a4f43e65e branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-17T16:09:14-07:00 summary: bpo-34745: Fix asyncio sslproto memory issues (GH-12386) * Fix handshake timeout leak in asyncio/sslproto Refs MagicStack/uvloopGH-222 * Break circular ref _SSLPipe <-> SSLProtocol * bpo-34745: Fix asyncio ssl memory leak * Break circular ref SSLProtocol <-> UserProtocol * Add NEWS entry (cherry picked from commit f683f464259715d620777d7ed568e701337a703a) Co-authored-by: Fantix King files: A Misc/NEWS.d/next/Library/2019-03-17-16-43-29.bpo-34745.nOfm7_.rst M Lib/asyncio/sslproto.py M Lib/test/test_asyncio/test_sslproto.py diff --git a/Lib/asyncio/sslproto.py b/Lib/asyncio/sslproto.py index 12fdb0d1c5ec..15eb9c78443a 100644 --- a/Lib/asyncio/sslproto.py +++ b/Lib/asyncio/sslproto.py @@ -499,7 +499,11 @@ def connection_lost(self, exc): self._app_transport._closed = True self._transport = None self._app_transport = None + if getattr(self, '_handshake_timeout_handle', None): + self._handshake_timeout_handle.cancel() self._wakeup_waiter(exc) + self._app_protocol = None + self._sslpipe = None def pause_writing(self): """Called when the low-level transport's buffer goes over diff --git a/Lib/test/test_asyncio/test_sslproto.py b/Lib/test/test_asyncio/test_sslproto.py index 44ae3b67e0bd..6c0b0e2a0187 100644 --- a/Lib/test/test_asyncio/test_sslproto.py +++ b/Lib/test/test_asyncio/test_sslproto.py @@ -4,6 +4,7 @@ import socket import sys import unittest +import weakref from unittest import mock try: import ssl @@ -270,6 +271,72 @@ def eof_received(self): self.loop.run_until_complete( asyncio.wait_for(client(srv.addr), loop=self.loop, timeout=10)) + # No garbage is left if SSL is closed uncleanly + client_context = weakref.ref(client_context) + self.assertIsNone(client_context()) + + def test_create_connection_memory_leak(self): + HELLO_MSG = b'1' * self.PAYLOAD_SIZE + + server_context = test_utils.simple_server_sslcontext() + client_context = test_utils.simple_client_sslcontext() + + def serve(sock): + sock.settimeout(self.TIMEOUT) + + sock.start_tls(server_context, server_side=True) + + sock.sendall(b'O') + data = sock.recv_all(len(HELLO_MSG)) + self.assertEqual(len(data), len(HELLO_MSG)) + + sock.shutdown(socket.SHUT_RDWR) + sock.close() + + class ClientProto(asyncio.Protocol): + def __init__(self, on_data, on_eof): + self.on_data = on_data + self.on_eof = on_eof + self.con_made_cnt = 0 + + def connection_made(proto, tr): + # XXX: We assume user stores the transport in protocol + proto.tr = tr + proto.con_made_cnt += 1 + # Ensure connection_made gets called only once. + self.assertEqual(proto.con_made_cnt, 1) + + def data_received(self, data): + self.on_data.set_result(data) + + def eof_received(self): + self.on_eof.set_result(True) + + async def client(addr): + await asyncio.sleep(0.5) + + on_data = self.loop.create_future() + on_eof = self.loop.create_future() + + tr, proto = await self.loop.create_connection( + lambda: ClientProto(on_data, on_eof), *addr, + ssl=client_context) + + self.assertEqual(await on_data, b'O') + tr.write(HELLO_MSG) + await on_eof + + tr.close() + + with self.tcp_server(serve, timeout=self.TIMEOUT) as srv: + self.loop.run_until_complete( + asyncio.wait_for(client(srv.addr), timeout=10)) + + # No garbage is left for SSL client from loop.create_connection, even + # if user stores the SSLTransport in corresponding protocol instance + client_context = weakref.ref(client_context) + self.assertIsNone(client_context()) + def test_start_tls_client_buf_proto_1(self): HELLO_MSG = b'1' * self.PAYLOAD_SIZE @@ -560,6 +627,11 @@ def server(sock): # exception or log an error, even if the handshake failed self.assertEqual(messages, []) + # The 10s handshake timeout should be cancelled to free related + # objects without really waiting for 10s + client_sslctx = weakref.ref(client_sslctx) + self.assertIsNone(client_sslctx()) + def test_create_connection_ssl_slow_handshake(self): client_sslctx = test_utils.simple_client_sslcontext() diff --git a/Misc/NEWS.d/next/Library/2019-03-17-16-43-29.bpo-34745.nOfm7_.rst b/Misc/NEWS.d/next/Library/2019-03-17-16-43-29.bpo-34745.nOfm7_.rst new file mode 100644 index 000000000000..d88f36a6d217 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-17-16-43-29.bpo-34745.nOfm7_.rst @@ -0,0 +1 @@ +Fix :mod:`asyncio` ssl memory issues caused by circular references From webhook-mailer at python.org Sun Mar 17 19:34:26 2019 From: webhook-mailer at python.org (Mariatta) Date: Sun, 17 Mar 2019 23:34:26 -0000 Subject: [Python-checkins] Fix typo in unittest.mock documentation: manger -> manager (GH-12352) Message-ID: https://github.com/python/cpython/commit/dc69f69f14fb89511d018a3927fc6378a58d2def commit: dc69f69f14fb89511d018a3927fc6378a58d2def branch: master author: Joan Massich committer: Mariatta date: 2019-03-17T16:34:22-07:00 summary: Fix typo in unittest.mock documentation: manger -> manager (GH-12352) files: M Doc/library/unittest.mock.rst diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst index c011e54e3e73..ff7a54c51fba 100644 --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -1440,7 +1440,7 @@ passed by keyword *after* any of the standard arguments created by :func:`patch` >>> test_function() If :func:`patch.multiple` is used as a context manager, the value returned by the -context manger is a dictionary where created mocks are keyed by name:: +context manager is a dictionary where created mocks are keyed by name:: >>> with patch.multiple('__main__', thing=DEFAULT, other=DEFAULT) as values: ... assert 'other' in repr(values['other']) From webhook-mailer at python.org Sun Mar 17 19:48:24 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 17 Mar 2019 23:48:24 -0000 Subject: [Python-checkins] Fix "catchs" typos in NEWS entries (GH-12364) Message-ID: https://github.com/python/cpython/commit/6fb544d8bc994ceb96b0fc5059c65fa82997743e commit: 6fb544d8bc994ceb96b0fc5059c65fa82997743e branch: master author: Harmon committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-17T16:48:21-07:00 summary: Fix "catchs" typos in NEWS entries (GH-12364) files: M Misc/NEWS.d/3.8.0a1.rst diff --git a/Misc/NEWS.d/3.8.0a1.rst b/Misc/NEWS.d/3.8.0a1.rst index 0386cb6214f5..3d5e6336246e 100644 --- a/Misc/NEWS.d/3.8.0a1.rst +++ b/Misc/NEWS.d/3.8.0a1.rst @@ -1845,7 +1845,7 @@ parameter. .. nonce: LT_qL8 .. section: Library -:class:`asyncio.ProactorEventLoop` now catchs and logs send errors when the +:class:`asyncio.ProactorEventLoop` now catches and logs send errors when the self-pipe is full. .. @@ -2270,7 +2270,7 @@ last release was in 2000. Mac OS 9 last release was in 2001. .. nonce: laV_IE .. section: Library -:func:`~distutils.utils.check_environ` of :mod:`distutils.utils` now catchs +:func:`~distutils.utils.check_environ` of :mod:`distutils.utils` now catches :exc:`KeyError` on calling :func:`pwd.getpwuid`: don't create the ``HOME`` environment variable in this case. @@ -8674,7 +8674,7 @@ Argument Clinic now has non-bitwise unsigned int converters. .. nonce: Q3Dwns .. section: Tools/Demos -python-gdb now catchs ``UnicodeDecodeError`` exceptions when calling +python-gdb now catches ``UnicodeDecodeError`` exceptions when calling ``string()``. .. @@ -8684,7 +8684,7 @@ python-gdb now catchs ``UnicodeDecodeError`` exceptions when calling .. nonce: 2YfdwI .. section: Tools/Demos -python-gdb now catchs ValueError on read_var(): when Python has no debug +python-gdb now catches ValueError on read_var(): when Python has no debug symbols for example. .. From webhook-mailer at python.org Sun Mar 17 19:49:45 2019 From: webhook-mailer at python.org (Mariatta) Date: Sun, 17 Mar 2019 23:49:45 -0000 Subject: [Python-checkins] Fix "catchs" typos in NEWS entries (GH-12364) Message-ID: https://github.com/python/cpython/commit/c49521dfd1f09fc4ac1557e365408c0700e4ea27 commit: c49521dfd1f09fc4ac1557e365408c0700e4ea27 branch: 3.7 author: Harmon committer: Mariatta date: 2019-03-17T16:49:43-07:00 summary: Fix "catchs" typos in NEWS entries (GH-12364) files: M Misc/NEWS.d/3.7.1rc1.rst M Misc/NEWS.d/3.7.3rc1.rst diff --git a/Misc/NEWS.d/3.7.1rc1.rst b/Misc/NEWS.d/3.7.1rc1.rst index 515530ae24d2..5ec0a3f90ffd 100644 --- a/Misc/NEWS.d/3.7.1rc1.rst +++ b/Misc/NEWS.d/3.7.1rc1.rst @@ -1515,7 +1515,7 @@ instantiate classes, and check coverage. Check existing files. .. nonce: Q3Dwns .. section: Tools/Demos -python-gdb now catchs ``UnicodeDecodeError`` exceptions when calling +python-gdb now catches ``UnicodeDecodeError`` exceptions when calling ``string()``. .. @@ -1525,7 +1525,7 @@ python-gdb now catchs ``UnicodeDecodeError`` exceptions when calling .. nonce: 2YfdwI .. section: Tools/Demos -python-gdb now catchs ValueError on read_var(): when Python has no debug +python-gdb now catches ValueError on read_var(): when Python has no debug symbols for example. .. diff --git a/Misc/NEWS.d/3.7.3rc1.rst b/Misc/NEWS.d/3.7.3rc1.rst index fbd7197f4403..915071c2a484 100644 --- a/Misc/NEWS.d/3.7.3rc1.rst +++ b/Misc/NEWS.d/3.7.3rc1.rst @@ -299,7 +299,7 @@ called. .. nonce: LT_qL8 .. section: Library -:class:`asyncio.ProactorEventLoop` now catchs and logs send errors when the +:class:`asyncio.ProactorEventLoop` now catches and logs send errors when the self-pipe is full. .. @@ -506,7 +506,7 @@ Karthikeyan Singaravelan. .. nonce: laV_IE .. section: Library -:func:`~distutils.utils.check_environ` of :mod:`distutils.utils` now catchs +:func:`~distutils.utils.check_environ` of :mod:`distutils.utils` now catches :exc:`KeyError` on calling :func:`pwd.getpwuid`: don't create the ``HOME`` environment variable in this case. From webhook-mailer at python.org Sun Mar 17 19:53:09 2019 From: webhook-mailer at python.org (Mariatta) Date: Sun, 17 Mar 2019 23:53:09 -0000 Subject: [Python-checkins] Fix typo in unittest.mock documentation: manger -> manager (GH-12352) Message-ID: https://github.com/python/cpython/commit/76ff715e03483bb562b9aeedfa62509c0724ae5a commit: 76ff715e03483bb562b9aeedfa62509c0724ae5a branch: 3.7 author: Mariatta committer: GitHub date: 2019-03-17T16:53:06-07:00 summary: Fix typo in unittest.mock documentation: manger -> manager (GH-12352) (cherry picked from commit dc69f69f14fb89511d018a3927fc6378a58d2def) Co-authored-by: Joan Massich files: M Doc/library/unittest.mock.rst diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst index 6daf0feca3ce..b76ae712a971 100644 --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -1418,7 +1418,7 @@ passed by keyword *after* any of the standard arguments created by :func:`patch` >>> test_function() If :func:`patch.multiple` is used as a context manager, the value returned by the -context manger is a dictionary where created mocks are keyed by name: +context manager is a dictionary where created mocks are keyed by name:: >>> with patch.multiple('__main__', thing=DEFAULT, other=DEFAULT) as values: ... assert 'other' in repr(values['other']) From webhook-mailer at python.org Sun Mar 17 21:53:12 2019 From: webhook-mailer at python.org (Ned Deily) Date: Mon, 18 Mar 2019 01:53:12 -0000 Subject: [Python-checkins] bpo-36195: Remove the ThreadPoolExecutor documentation mentioning the initializer feature added in Python 3.7 (GH-12182) Message-ID: https://github.com/python/cpython/commit/e601ef0fa384d149f6759fff3c18762a8c63851e commit: e601ef0fa384d149f6759fff3c18762a8c63851e branch: 3.6 author: Harmandeep Singh committer: Ned Deily date: 2019-03-17T21:53:07-04:00 summary: bpo-36195: Remove the ThreadPoolExecutor documentation mentioning the initializer feature added in Python 3.7 (GH-12182) files: M Doc/library/concurrent.futures.rst diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst index 69dfd0f47c1c..319f757aa906 100644 --- a/Doc/library/concurrent.futures.rst +++ b/Doc/library/concurrent.futures.rst @@ -137,12 +137,6 @@ And:: An :class:`Executor` subclass that uses a pool of at most *max_workers* threads to execute calls asynchronously. - *initializer* is an optional callable that is called at the start of - each worker thread; *initargs* is a tuple of arguments passed to the - initializer. Should *initializer* raise an exception, all currently - pending jobs will raise a :exc:`~concurrent.futures.thread.BrokenThreadPool`, - as well any attempt to submit more jobs to the pool. - .. versionchanged:: 3.5 If *max_workers* is ``None`` or not given, it will default to the number of processors on the machine, From webhook-mailer at python.org Sun Mar 17 22:12:03 2019 From: webhook-mailer at python.org (Ned Deily) Date: Mon, 18 Mar 2019 02:12:03 -0000 Subject: [Python-checkins] Fix "catchs" typos in NEWS entries (GH-12366) Message-ID: https://github.com/python/cpython/commit/75f8a691a45442c94972cf0fb7fb7d413d44601e commit: 75f8a691a45442c94972cf0fb7fb7d413d44601e branch: 3.6 author: Harmon committer: Ned Deily date: 2019-03-17T22:11:57-04:00 summary: Fix "catchs" typos in NEWS entries (GH-12366) files: M Misc/NEWS.d/3.6.7rc1.rst diff --git a/Misc/NEWS.d/3.6.7rc1.rst b/Misc/NEWS.d/3.6.7rc1.rst index 5115970d5522..4a53bcd6ccaa 100644 --- a/Misc/NEWS.d/3.6.7rc1.rst +++ b/Misc/NEWS.d/3.6.7rc1.rst @@ -1088,7 +1088,7 @@ instantiate classes, and check coverage. Check existing files. .. nonce: Q3Dwns .. section: Tools/Demos -python-gdb now catchs ``UnicodeDecodeError`` exceptions when calling +python-gdb now catches ``UnicodeDecodeError`` exceptions when calling ``string()``. .. @@ -1098,7 +1098,7 @@ python-gdb now catchs ``UnicodeDecodeError`` exceptions when calling .. nonce: 2YfdwI .. section: Tools/Demos -python-gdb now catchs ValueError on read_var(): when Python has no debug +python-gdb now catches ValueError on read_var(): when Python has no debug symbols for example. .. From webhook-mailer at python.org Mon Mar 18 02:44:14 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Mon, 18 Mar 2019 06:44:14 -0000 Subject: [Python-checkins] bpo-36297: remove "unicode_internal" codec (GH-12342) Message-ID: https://github.com/python/cpython/commit/6a16b18224fa98f6d192aa5014affeccc0376eb3 commit: 6a16b18224fa98f6d192aa5014affeccc0376eb3 branch: master author: Inada Naoki committer: GitHub date: 2019-03-18T15:44:11+09:00 summary: bpo-36297: remove "unicode_internal" codec (GH-12342) files: A Misc/NEWS.d/next/Library/2019-03-15-21-41-22.bpo-36297.Gz9ZfU.rst D Lib/encodings/unicode_internal.py M Doc/library/codecs.rst M Doc/whatsnew/3.8.rst M Include/cpython/unicodeobject.h M Lib/test/test_codeccallbacks.py M Lib/test/test_codecs.py M Lib/test/test_unicode.py M Modules/_codecsmodule.c M Modules/clinic/_codecsmodule.c.h M Objects/unicodeobject.c M PCbuild/lib.pyproj diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst index 7cfec632ed96..d2a0c8b33690 100644 --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -1316,16 +1316,10 @@ encodings. | | | code actually uses UTF-8 | | | | by default. | +--------------------+---------+---------------------------+ -| unicode_internal | | Return the internal | -| | | representation of the | -| | | operand. Stateful codecs | -| | | are not supported. | -| | | | -| | | .. deprecated:: 3.3 | -| | | This representation is | -| | | obsoleted by | -| | | :pep:`393`. | -+--------------------+---------+---------------------------+ + +.. versionchanged:: 3.8 + "unicode_internal" codec is removed. + .. _binary-transforms: diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index eaa3f5b79f05..31baccd9d68d 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -573,6 +573,9 @@ The following features and APIs have been removed from Python 3.8: * Removed the ``doctype()`` method of :class:`~xml.etree.ElementTree.XMLParser`. (Contributed by Serhiy Storchaka in :issue:`29209`.) +* "unicode_internal" codec is removed. + (Contributed by Inada Naoki in :issue:`36297`.) + Porting to Python 3.8 ===================== diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index c76349022485..4eecc963ae2d 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -896,15 +896,6 @@ PyAPI_FUNC(PyObject*) PyUnicode_EncodeRawUnicodeEscape( Py_ssize_t length /* Number of Py_UNICODE chars to encode */ ) Py_DEPRECATED(3.3); -/* --- Unicode Internal Codec --------------------------------------------- */ - -/* Only for internal use in _codecsmodule.c */ -PyObject *_PyUnicode_DecodeUnicodeInternal( - const char *string, - Py_ssize_t length, - const char *errors - ); - /* --- Latin-1 Codecs ----------------------------------------------------- */ PyAPI_FUNC(PyObject*) _PyUnicode_AsLatin1String( diff --git a/Lib/encodings/unicode_internal.py b/Lib/encodings/unicode_internal.py deleted file mode 100644 index df3e7752d20a..000000000000 --- a/Lib/encodings/unicode_internal.py +++ /dev/null @@ -1,45 +0,0 @@ -""" Python 'unicode-internal' Codec - - -Written by Marc-Andre Lemburg (mal at lemburg.com). - -(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. - -""" -import codecs - -### Codec APIs - -class Codec(codecs.Codec): - - # Note: Binding these as C functions will result in the class not - # converting them to methods. This is intended. - encode = codecs.unicode_internal_encode - decode = codecs.unicode_internal_decode - -class IncrementalEncoder(codecs.IncrementalEncoder): - def encode(self, input, final=False): - return codecs.unicode_internal_encode(input, self.errors)[0] - -class IncrementalDecoder(codecs.IncrementalDecoder): - def decode(self, input, final=False): - return codecs.unicode_internal_decode(input, self.errors)[0] - -class StreamWriter(Codec,codecs.StreamWriter): - pass - -class StreamReader(Codec,codecs.StreamReader): - pass - -### encodings module API - -def getregentry(): - return codecs.CodecInfo( - name='unicode-internal', - encode=Codec.encode, - decode=Codec.decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamwriter=StreamWriter, - streamreader=StreamReader, - ) diff --git a/Lib/test/test_codeccallbacks.py b/Lib/test/test_codeccallbacks.py index e2e7463389ef..585992be1f0b 100644 --- a/Lib/test/test_codeccallbacks.py +++ b/Lib/test/test_codeccallbacks.py @@ -211,42 +211,6 @@ def test_charmapencode(self): charmap[ord("?")] = "XYZ" # wrong type in mapping self.assertRaises(TypeError, codecs.charmap_encode, sin, "replace", charmap) - def test_decodeunicodeinternal(self): - with test.support.check_warnings(('unicode_internal codec has been ' - 'deprecated', DeprecationWarning)): - self.assertRaises( - UnicodeDecodeError, - b"\x00\x00\x00\x00\x00".decode, - "unicode-internal", - ) - if len('\0'.encode('unicode-internal')) == 4: - def handler_unicodeinternal(exc): - if not isinstance(exc, UnicodeDecodeError): - raise TypeError("don't know how to handle %r" % exc) - return ("\x01", 1) - - self.assertEqual( - b"\x00\x00\x00\x00\x00".decode("unicode-internal", "ignore"), - "\u0000" - ) - - self.assertEqual( - b"\x00\x00\x00\x00\x00".decode("unicode-internal", "replace"), - "\u0000\ufffd" - ) - - self.assertEqual( - b"\x00\x00\x00\x00\x00".decode("unicode-internal", "backslashreplace"), - "\u0000\\x00" - ) - - codecs.register_error("test.hui", handler_unicodeinternal) - - self.assertEqual( - b"\x00\x00\x00\x00\x00".decode("unicode-internal", "test.hui"), - "\u0000\u0001\u0000" - ) - def test_callbacks(self): def handler1(exc): r = range(exc.start, exc.end) @@ -794,16 +758,13 @@ def test_badhandlerresults(self): ("ascii", b"\xff"), ("utf-8", b"\xff"), ("utf-7", b"+x-"), - ("unicode-internal", b"\x00"), ): - with test.support.check_warnings(): - # unicode-internal has been deprecated - self.assertRaises( - TypeError, - bytes.decode, - enc, - "test.badhandler" - ) + self.assertRaises( + TypeError, + bytes.decode, + enc, + "test.badhandler" + ) def test_lookup(self): self.assertEqual(codecs.strict_errors, codecs.lookup_error("strict")) @@ -1013,7 +974,6 @@ def test_mutatingdecodehandler(self): ("utf-32", b"\xff"), ("unicode-escape", b"\\u123g"), ("raw-unicode-escape", b"\\u123g"), - ("unicode-internal", b"\xff"), ] def replacing(exc): @@ -1024,11 +984,9 @@ def replacing(exc): raise TypeError("don't know how to handle %r" % exc) codecs.register_error("test.replacing", replacing) - with test.support.check_warnings(): - # unicode-internal has been deprecated - for (encoding, data) in baddata: - with self.assertRaises(TypeError): - data.decode(encoding, "test.replacing") + for (encoding, data) in baddata: + with self.assertRaises(TypeError): + data.decode(encoding, "test.replacing") def mutating(exc): if isinstance(exc, UnicodeDecodeError): @@ -1039,10 +997,8 @@ def mutating(exc): codecs.register_error("test.mutating", mutating) # If the decoder doesn't pick up the modified input the following # will lead to an endless loop - with test.support.check_warnings(): - # unicode-internal has been deprecated - for (encoding, data) in baddata: - self.assertEqual(data.decode(encoding, "test.mutating"), "\u4242") + for (encoding, data) in baddata: + self.assertEqual(data.decode(encoding, "test.mutating"), "\u4242") # issue32583 def test_crashing_decode_handler(self): diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index 893212e243ef..e8c7d76544e1 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -1239,16 +1239,6 @@ def test_errors(self): self.assertEqual(decode(br"[\x0]\x0", "replace"), (b"[?]?", 8)) -class RecodingTest(unittest.TestCase): - def test_recoding(self): - f = io.BytesIO() - with codecs.EncodedFile(f, "unicode_internal", "utf-8") as f2: - f2.write("a") - # Python used to crash on this at exit because of a refcount - # bug in _codecsmodule.c - - self.assertTrue(f.closed) - # From RFC 3492 punycode_testcases = [ # A Arabic (Egyptian): @@ -1378,87 +1368,6 @@ def test_decode(self): self.assertEqual(uni, puny.decode("punycode")) -class UnicodeInternalTest(unittest.TestCase): - @unittest.skipUnless(SIZEOF_WCHAR_T == 4, 'specific to 32-bit wchar_t') - def test_bug1251300(self): - # Decoding with unicode_internal used to not correctly handle "code - # points" above 0x10ffff on UCS-4 builds. - ok = [ - (b"\x00\x10\xff\xff", "\U0010ffff"), - (b"\x00\x00\x01\x01", "\U00000101"), - (b"", ""), - ] - not_ok = [ - b"\x7f\xff\xff\xff", - b"\x80\x00\x00\x00", - b"\x81\x00\x00\x00", - b"\x00", - b"\x00\x00\x00\x00\x00", - ] - for internal, uni in ok: - if sys.byteorder == "little": - internal = bytes(reversed(internal)) - with support.check_warnings(): - self.assertEqual(uni, internal.decode("unicode_internal")) - for internal in not_ok: - if sys.byteorder == "little": - internal = bytes(reversed(internal)) - with support.check_warnings(('unicode_internal codec has been ' - 'deprecated', DeprecationWarning)): - self.assertRaises(UnicodeDecodeError, internal.decode, - "unicode_internal") - if sys.byteorder == "little": - invalid = b"\x00\x00\x11\x00" - invalid_backslashreplace = r"\x00\x00\x11\x00" - else: - invalid = b"\x00\x11\x00\x00" - invalid_backslashreplace = r"\x00\x11\x00\x00" - with support.check_warnings(): - self.assertRaises(UnicodeDecodeError, - invalid.decode, "unicode_internal") - with support.check_warnings(): - self.assertEqual(invalid.decode("unicode_internal", "replace"), - '\ufffd') - with support.check_warnings(): - self.assertEqual(invalid.decode("unicode_internal", "backslashreplace"), - invalid_backslashreplace) - - @unittest.skipUnless(SIZEOF_WCHAR_T == 4, 'specific to 32-bit wchar_t') - def test_decode_error_attributes(self): - try: - with support.check_warnings(('unicode_internal codec has been ' - 'deprecated', DeprecationWarning)): - b"\x00\x00\x00\x00\x00\x11\x11\x00".decode("unicode_internal") - except UnicodeDecodeError as ex: - self.assertEqual("unicode_internal", ex.encoding) - self.assertEqual(b"\x00\x00\x00\x00\x00\x11\x11\x00", ex.object) - self.assertEqual(4, ex.start) - self.assertEqual(8, ex.end) - else: - self.fail() - - @unittest.skipUnless(SIZEOF_WCHAR_T == 4, 'specific to 32-bit wchar_t') - def test_decode_callback(self): - codecs.register_error("UnicodeInternalTest", codecs.ignore_errors) - decoder = codecs.getdecoder("unicode_internal") - with support.check_warnings(('unicode_internal codec has been ' - 'deprecated', DeprecationWarning)): - ab = "ab".encode("unicode_internal").decode() - ignored = decoder(bytes("%s\x22\x22\x22\x22%s" % (ab[:4], ab[4:]), - "ascii"), - "UnicodeInternalTest") - self.assertEqual(("ab", 12), ignored) - - def test_encode_length(self): - with support.check_warnings(('unicode_internal codec has been ' - 'deprecated', DeprecationWarning)): - # Issue 3739 - encoder = codecs.getencoder("unicode_internal") - self.assertEqual(encoder("a")[1], 1) - self.assertEqual(encoder("\xe9\u0142")[1], 2) - - self.assertEqual(codecs.escape_encode(br'\x00')[1], 4) - # From http://www.gnu.org/software/libidn/draft-josefsson-idn-test-vectors.html nameprep_tests = [ # 3.1 Map to nothing. @@ -1949,7 +1858,6 @@ def test_basic(self): "shift_jisx0213", "tis_620", "unicode_escape", - "unicode_internal", "utf_16", "utf_16_be", "utf_16_le", @@ -1969,7 +1877,6 @@ def test_basic(self): # The following encodings don't work in stateful mode broken_unicode_with_stateful = [ "punycode", - "unicode_internal" ] @@ -1984,12 +1891,10 @@ def test_basics(self): name = "latin_1" self.assertEqual(encoding.replace("_", "-"), name.replace("_", "-")) - with support.check_warnings(): - # unicode-internal has been deprecated - (b, size) = codecs.getencoder(encoding)(s) - self.assertEqual(size, len(s), "encoding=%r" % encoding) - (chars, size) = codecs.getdecoder(encoding)(b) - self.assertEqual(chars, s, "encoding=%r" % encoding) + (b, size) = codecs.getencoder(encoding)(s) + self.assertEqual(size, len(s), "encoding=%r" % encoding) + (chars, size) = codecs.getdecoder(encoding)(b) + self.assertEqual(chars, s, "encoding=%r" % encoding) if encoding not in broken_unicode_with_stateful: # check stream reader/writer @@ -2116,9 +2021,7 @@ def test_bad_decode_args(self): def test_bad_encode_args(self): for encoding in all_unicode_encodings: encoder = codecs.getencoder(encoding) - with support.check_warnings(): - # unicode-internal has been deprecated - self.assertRaises(TypeError, encoder) + self.assertRaises(TypeError, encoder) def test_encoding_map_type_initialized(self): from encodings import cp1140 diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py index c277e705b9f5..1131efdd26ab 100644 --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -2104,12 +2104,8 @@ def test_codecs(self): u = chr(c) for encoding in ('utf-7', 'utf-8', 'utf-16', 'utf-16-le', 'utf-16-be', 'raw_unicode_escape', - 'unicode_escape', 'unicode_internal'): - with warnings.catch_warnings(): - # unicode-internal has been deprecated - warnings.simplefilter("ignore", DeprecationWarning) - - self.assertEqual(str(u.encode(encoding),encoding), u) + 'unicode_escape'): + self.assertEqual(str(u.encode(encoding),encoding), u) # Roundtrip safety for BMP (just the first 256 chars) for c in range(256): @@ -2125,13 +2121,9 @@ def test_codecs(self): # Roundtrip safety for non-BMP (just a few chars) with warnings.catch_warnings(): - # unicode-internal has been deprecated - warnings.simplefilter("ignore", DeprecationWarning) - u = '\U00010001\U00020002\U00030003\U00040004\U00050005' for encoding in ('utf-8', 'utf-16', 'utf-16-le', 'utf-16-be', - 'raw_unicode_escape', - 'unicode_escape', 'unicode_internal'): + 'raw_unicode_escape', 'unicode_escape'): self.assertEqual(str(u.encode(encoding),encoding), u) # UTF-8 must be roundtrip safe for all code points @@ -2349,22 +2341,22 @@ def test_getnewargs(self): self.assertEqual(args[0], text) self.assertEqual(len(args), 1) + @support.cpython_only def test_resize(self): + from _testcapi import getargs_u for length in range(1, 100, 7): # generate a fresh string (refcount=1) text = 'a' * length + 'b' - with support.check_warnings(('unicode_internal codec has been ' - 'deprecated', DeprecationWarning)): - # fill wstr internal field - abc = text.encode('unicode_internal') - self.assertEqual(abc.decode('unicode_internal'), text) - - # resize text: wstr field must be cleared and then recomputed - text += 'c' - abcdef = text.encode('unicode_internal') - self.assertNotEqual(abc, abcdef) - self.assertEqual(abcdef.decode('unicode_internal'), text) + # fill wstr internal field + abc = getargs_u(text) + self.assertEqual(abc, text) + + # resize text: wstr field must be cleared and then recomputed + text += 'c' + abcdef = getargs_u(text) + self.assertNotEqual(abc, abcdef) + self.assertEqual(abcdef, text) def test_compare(self): # Issue #17615 diff --git a/Misc/NEWS.d/next/Library/2019-03-15-21-41-22.bpo-36297.Gz9ZfU.rst b/Misc/NEWS.d/next/Library/2019-03-15-21-41-22.bpo-36297.Gz9ZfU.rst new file mode 100644 index 000000000000..f633feea5cac --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-15-21-41-22.bpo-36297.Gz9ZfU.rst @@ -0,0 +1,2 @@ +"unicode_internal" codec is removed. It was deprecated since Python 3.3. +Patch by Inada Naoki. diff --git a/Modules/_codecsmodule.c b/Modules/_codecsmodule.c index e0d6902b18aa..90b3e37d1641 100644 --- a/Modules/_codecsmodule.c +++ b/Modules/_codecsmodule.c @@ -21,8 +21,7 @@ (Unicode object, bytes consumed) These s are available: utf_8, unicode_escape, - raw_unicode_escape, unicode_internal, latin_1, ascii (7-bit), - mbcs (on win32). + raw_unicode_escape, latin_1, ascii (7-bit), mbcs (on win32). Written by Marc-Andre Lemburg (mal at lemburg.com). @@ -250,38 +249,6 @@ _codecs_escape_encode_impl(PyObject *module, PyObject *data, } /* --- Decoder ------------------------------------------------------------ */ -/*[clinic input] -_codecs.unicode_internal_decode - obj: object - errors: str(accept={str, NoneType}) = NULL - / -[clinic start generated code]*/ - -static PyObject * -_codecs_unicode_internal_decode_impl(PyObject *module, PyObject *obj, - const char *errors) -/*[clinic end generated code: output=edbfe175e09eff9a input=8d57930aeda170c6]*/ -{ - if (PyUnicode_Check(obj)) { - if (PyUnicode_READY(obj) < 0) - return NULL; - Py_INCREF(obj); - return codec_tuple(obj, PyUnicode_GET_LENGTH(obj)); - } - else { - Py_buffer view; - PyObject *result; - if (PyObject_GetBuffer(obj, &view, PyBUF_SIMPLE) != 0) - return NULL; - - result = codec_tuple( - _PyUnicode_DecodeUnicodeInternal(view.buf, view.len, errors), - view.len); - PyBuffer_Release(&view); - return result; - } -} - /*[clinic input] _codecs.utf_7_decode data: Py_buffer @@ -686,51 +653,6 @@ _codecs_readbuffer_encode_impl(PyObject *module, Py_buffer *data, return codec_tuple(result, data->len); } -/*[clinic input] -_codecs.unicode_internal_encode - obj: object - errors: str(accept={str, NoneType}) = NULL - / -[clinic start generated code]*/ - -static PyObject * -_codecs_unicode_internal_encode_impl(PyObject *module, PyObject *obj, - const char *errors) -/*[clinic end generated code: output=a72507dde4ea558f input=8628f0280cf5ba61]*/ -{ - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "unicode_internal codec has been deprecated", - 1)) - return NULL; - - if (PyUnicode_Check(obj)) { - Py_UNICODE *u; - Py_ssize_t len, size; - - if (PyUnicode_READY(obj) < 0) - return NULL; - - u = PyUnicode_AsUnicodeAndSize(obj, &len); - if (u == NULL) - return NULL; - if ((size_t)len > (size_t)PY_SSIZE_T_MAX / sizeof(Py_UNICODE)) - return PyErr_NoMemory(); - size = len * sizeof(Py_UNICODE); - return codec_tuple(PyBytes_FromStringAndSize((const char*)u, size), - PyUnicode_GET_LENGTH(obj)); - } - else { - Py_buffer view; - PyObject *result; - if (PyObject_GetBuffer(obj, &view, PyBUF_SIMPLE) != 0) - return NULL; - result = codec_tuple(PyBytes_FromStringAndSize(view.buf, view.len), - view.len); - PyBuffer_Release(&view); - return result; - } -} - /*[clinic input] _codecs.utf_7_encode str: unicode @@ -1095,8 +1017,6 @@ static PyMethodDef _codecs_functions[] = { _CODECS_UTF_32_EX_DECODE_METHODDEF _CODECS_UNICODE_ESCAPE_ENCODE_METHODDEF _CODECS_UNICODE_ESCAPE_DECODE_METHODDEF - _CODECS_UNICODE_INTERNAL_ENCODE_METHODDEF - _CODECS_UNICODE_INTERNAL_DECODE_METHODDEF _CODECS_RAW_UNICODE_ESCAPE_ENCODE_METHODDEF _CODECS_RAW_UNICODE_ESCAPE_DECODE_METHODDEF _CODECS_LATIN_1_ENCODE_METHODDEF diff --git a/Modules/clinic/_codecsmodule.c.h b/Modules/clinic/_codecsmodule.c.h index d1f4cf3fc681..65e24832fff6 100644 --- a/Modules/clinic/_codecsmodule.c.h +++ b/Modules/clinic/_codecsmodule.c.h @@ -370,57 +370,6 @@ _codecs_escape_encode(PyObject *module, PyObject *const *args, Py_ssize_t nargs) return return_value; } -PyDoc_STRVAR(_codecs_unicode_internal_decode__doc__, -"unicode_internal_decode($module, obj, errors=None, /)\n" -"--\n" -"\n"); - -#define _CODECS_UNICODE_INTERNAL_DECODE_METHODDEF \ - {"unicode_internal_decode", (PyCFunction)(void(*)(void))_codecs_unicode_internal_decode, METH_FASTCALL, _codecs_unicode_internal_decode__doc__}, - -static PyObject * -_codecs_unicode_internal_decode_impl(PyObject *module, PyObject *obj, - const char *errors); - -static PyObject * -_codecs_unicode_internal_decode(PyObject *module, PyObject *const *args, Py_ssize_t nargs) -{ - PyObject *return_value = NULL; - PyObject *obj; - const char *errors = NULL; - - if (!_PyArg_CheckPositional("unicode_internal_decode", nargs, 1, 2)) { - goto exit; - } - obj = args[0]; - if (nargs < 2) { - goto skip_optional; - } - if (args[1] == Py_None) { - errors = NULL; - } - else if (PyUnicode_Check(args[1])) { - Py_ssize_t errors_length; - errors = PyUnicode_AsUTF8AndSize(args[1], &errors_length); - if (errors == NULL) { - goto exit; - } - if (strlen(errors) != (size_t)errors_length) { - PyErr_SetString(PyExc_ValueError, "embedded null character"); - goto exit; - } - } - else { - _PyArg_BadArgument("unicode_internal_decode", 2, "str or None", args[1]); - goto exit; - } -skip_optional: - return_value = _codecs_unicode_internal_decode_impl(module, obj, errors); - -exit: - return return_value; -} - PyDoc_STRVAR(_codecs_utf_7_decode__doc__, "utf_7_decode($module, data, errors=None, final=False, /)\n" "--\n" @@ -1853,57 +1802,6 @@ _codecs_readbuffer_encode(PyObject *module, PyObject *const *args, Py_ssize_t na return return_value; } -PyDoc_STRVAR(_codecs_unicode_internal_encode__doc__, -"unicode_internal_encode($module, obj, errors=None, /)\n" -"--\n" -"\n"); - -#define _CODECS_UNICODE_INTERNAL_ENCODE_METHODDEF \ - {"unicode_internal_encode", (PyCFunction)(void(*)(void))_codecs_unicode_internal_encode, METH_FASTCALL, _codecs_unicode_internal_encode__doc__}, - -static PyObject * -_codecs_unicode_internal_encode_impl(PyObject *module, PyObject *obj, - const char *errors); - -static PyObject * -_codecs_unicode_internal_encode(PyObject *module, PyObject *const *args, Py_ssize_t nargs) -{ - PyObject *return_value = NULL; - PyObject *obj; - const char *errors = NULL; - - if (!_PyArg_CheckPositional("unicode_internal_encode", nargs, 1, 2)) { - goto exit; - } - obj = args[0]; - if (nargs < 2) { - goto skip_optional; - } - if (args[1] == Py_None) { - errors = NULL; - } - else if (PyUnicode_Check(args[1])) { - Py_ssize_t errors_length; - errors = PyUnicode_AsUTF8AndSize(args[1], &errors_length); - if (errors == NULL) { - goto exit; - } - if (strlen(errors) != (size_t)errors_length) { - PyErr_SetString(PyExc_ValueError, "embedded null character"); - goto exit; - } - } - else { - _PyArg_BadArgument("unicode_internal_encode", 2, "str or None", args[1]); - goto exit; - } -skip_optional: - return_value = _codecs_unicode_internal_encode_impl(module, obj, errors); - -exit: - return return_value; -} - PyDoc_STRVAR(_codecs_utf_7_encode__doc__, "utf_7_encode($module, str, errors=None, /)\n" "--\n" @@ -3024,4 +2922,4 @@ _codecs_lookup_error(PyObject *module, PyObject *arg) #ifndef _CODECS_CODE_PAGE_ENCODE_METHODDEF #define _CODECS_CODE_PAGE_ENCODE_METHODDEF #endif /* !defined(_CODECS_CODE_PAGE_ENCODE_METHODDEF) */ -/*[clinic end generated code: output=02bd0f0cf9a28150 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=da3c47709a55a05e input=a9049054013a1b77]*/ diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 8141ce757412..b3a851a9f814 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -6551,108 +6551,6 @@ PyUnicode_EncodeRawUnicodeEscape(const Py_UNICODE *s, return result; } -/* --- Unicode Internal Codec ------------------------------------------- */ - -PyObject * -_PyUnicode_DecodeUnicodeInternal(const char *s, - Py_ssize_t size, - const char *errors) -{ - const char *starts = s; - Py_ssize_t startinpos; - Py_ssize_t endinpos; - _PyUnicodeWriter writer; - const char *end; - const char *reason; - PyObject *errorHandler = NULL; - PyObject *exc = NULL; - - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "unicode_internal codec has been deprecated", - 1)) - return NULL; - - if (size < 0) { - PyErr_BadInternalCall(); - return NULL; - } - if (size == 0) - _Py_RETURN_UNICODE_EMPTY(); - - _PyUnicodeWriter_Init(&writer); - if (size / Py_UNICODE_SIZE > PY_SSIZE_T_MAX - 1) { - PyErr_NoMemory(); - goto onError; - } - writer.min_length = (size + (Py_UNICODE_SIZE - 1)) / Py_UNICODE_SIZE; - - end = s + size; - while (s < end) { - Py_UNICODE uch; - Py_UCS4 ch; - if (end - s < Py_UNICODE_SIZE) { - endinpos = end-starts; - reason = "truncated input"; - goto error; - } - /* We copy the raw representation one byte at a time because the - pointer may be unaligned (see test_codeccallbacks). */ - ((char *) &uch)[0] = s[0]; - ((char *) &uch)[1] = s[1]; -#ifdef Py_UNICODE_WIDE - ((char *) &uch)[2] = s[2]; - ((char *) &uch)[3] = s[3]; -#endif - ch = uch; -#ifdef Py_UNICODE_WIDE - /* We have to sanity check the raw data, otherwise doom looms for - some malformed UCS-4 data. */ - if (ch > 0x10ffff) { - endinpos = s - starts + Py_UNICODE_SIZE; - reason = "illegal code point (> 0x10FFFF)"; - goto error; - } -#endif - s += Py_UNICODE_SIZE; -#ifndef Py_UNICODE_WIDE - if (Py_UNICODE_IS_HIGH_SURROGATE(ch) && end - s >= Py_UNICODE_SIZE) - { - Py_UNICODE uch2; - ((char *) &uch2)[0] = s[0]; - ((char *) &uch2)[1] = s[1]; - if (Py_UNICODE_IS_LOW_SURROGATE(uch2)) - { - ch = Py_UNICODE_JOIN_SURROGATES(uch, uch2); - s += Py_UNICODE_SIZE; - } - } -#endif - - if (_PyUnicodeWriter_WriteCharInline(&writer, ch) < 0) - goto onError; - continue; - - error: - startinpos = s - starts; - if (unicode_decode_call_errorhandler_writer( - errors, &errorHandler, - "unicode_internal", reason, - &starts, &end, &startinpos, &endinpos, &exc, &s, - &writer)) - goto onError; - } - - Py_XDECREF(errorHandler); - Py_XDECREF(exc); - return _PyUnicodeWriter_Finish(&writer); - - onError: - _PyUnicodeWriter_Dealloc(&writer); - Py_XDECREF(errorHandler); - Py_XDECREF(exc); - return NULL; -} - /* --- Latin-1 Codec ------------------------------------------------------ */ PyObject * diff --git a/PCbuild/lib.pyproj b/PCbuild/lib.pyproj index 701b55f7d111..ffb95c6efcdb 100644 --- a/PCbuild/lib.pyproj +++ b/PCbuild/lib.pyproj @@ -392,7 +392,6 @@ - From webhook-mailer at python.org Mon Mar 18 03:27:43 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Mon, 18 Mar 2019 07:27:43 -0000 Subject: [Python-checkins] bpo-36321: Fix misspelled attribute in namedtuple() (GH-12375) Message-ID: https://github.com/python/cpython/commit/23581c018fceb607fe829a41c6fbe81b4d502cab commit: 23581c018fceb607fe829a41c6fbe81b4d502cab branch: master author: Raymond Hettinger committer: GitHub date: 2019-03-18T00:27:39-07:00 summary: bpo-36321: Fix misspelled attribute in namedtuple() (GH-12375) files: A Misc/NEWS.d/next/Library/2019-03-16-13-40-59.bpo-36321.s6crQx.rst M Doc/library/collections.rst M Lib/collections/__init__.py M Lib/test/test_collections.py diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index daa741428a01..64de970fec94 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -953,14 +953,14 @@ field names, the method and attribute names start with an underscore. >>> Pixel(11, 22, 128, 255, 0) Pixel(x=11, y=22, red=128, green=255, blue=0) -.. attribute:: somenamedtuple._fields_defaults +.. attribute:: somenamedtuple._field_defaults Dictionary mapping field names to default values. .. doctest:: >>> Account = namedtuple('Account', ['type', 'balance'], defaults=[0]) - >>> Account._fields_defaults + >>> Account._field_defaults {'balance': 0} >>> Account('premium') Account(type='premium', balance=0) diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index 632a509d316c..cff75a48d627 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -445,6 +445,8 @@ def __getnewargs__(self): '__doc__': f'{typename}({arg_list})', '__slots__': (), '_fields': field_names, + '_field_defaults': field_defaults, + # alternate spelling for backward compatiblity '_fields_defaults': field_defaults, '__new__': __new__, '_make': _make, diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index dad1b6cd7fb3..1f619bcdac92 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -248,18 +248,18 @@ def test_factory(self): def test_defaults(self): Point = namedtuple('Point', 'x y', defaults=(10, 20)) # 2 defaults - self.assertEqual(Point._fields_defaults, {'x': 10, 'y': 20}) + self.assertEqual(Point._field_defaults, {'x': 10, 'y': 20}) self.assertEqual(Point(1, 2), (1, 2)) self.assertEqual(Point(1), (1, 20)) self.assertEqual(Point(), (10, 20)) Point = namedtuple('Point', 'x y', defaults=(20,)) # 1 default - self.assertEqual(Point._fields_defaults, {'y': 20}) + self.assertEqual(Point._field_defaults, {'y': 20}) self.assertEqual(Point(1, 2), (1, 2)) self.assertEqual(Point(1), (1, 20)) Point = namedtuple('Point', 'x y', defaults=()) # 0 defaults - self.assertEqual(Point._fields_defaults, {}) + self.assertEqual(Point._field_defaults, {}) self.assertEqual(Point(1, 2), (1, 2)) with self.assertRaises(TypeError): Point(1) @@ -276,21 +276,21 @@ def test_defaults(self): Point = namedtuple('Point', 'x y', defaults=False) Point = namedtuple('Point', 'x y', defaults=None) # default is None - self.assertEqual(Point._fields_defaults, {}) + self.assertEqual(Point._field_defaults, {}) self.assertIsNone(Point.__new__.__defaults__, None) self.assertEqual(Point(10, 20), (10, 20)) with self.assertRaises(TypeError): # catch too few args Point(10) Point = namedtuple('Point', 'x y', defaults=[10, 20]) # allow non-tuple iterable - self.assertEqual(Point._fields_defaults, {'x': 10, 'y': 20}) + self.assertEqual(Point._field_defaults, {'x': 10, 'y': 20}) self.assertEqual(Point.__new__.__defaults__, (10, 20)) self.assertEqual(Point(1, 2), (1, 2)) self.assertEqual(Point(1), (1, 20)) self.assertEqual(Point(), (10, 20)) Point = namedtuple('Point', 'x y', defaults=iter([10, 20])) # allow plain iterator - self.assertEqual(Point._fields_defaults, {'x': 10, 'y': 20}) + self.assertEqual(Point._field_defaults, {'x': 10, 'y': 20}) self.assertEqual(Point.__new__.__defaults__, (10, 20)) self.assertEqual(Point(1, 2), (1, 2)) self.assertEqual(Point(1), (1, 20)) diff --git a/Misc/NEWS.d/next/Library/2019-03-16-13-40-59.bpo-36321.s6crQx.rst b/Misc/NEWS.d/next/Library/2019-03-16-13-40-59.bpo-36321.s6crQx.rst new file mode 100644 index 000000000000..eea6f5418484 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-16-13-40-59.bpo-36321.s6crQx.rst @@ -0,0 +1,5 @@ +collections.namedtuple() misspelled the name of an attribute. To be +consistent with typing.NamedTuple, the attribute name should have been +"_field_defaults" instead of "_fields_defaults". For backwards +compatibility, both spellings are now created. The misspelled version may +be removed in the future. From webhook-mailer at python.org Mon Mar 18 03:48:06 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Mon, 18 Mar 2019 07:48:06 -0000 Subject: [Python-checkins] bpo-36321: Fix misspelled attribute in namedtuple() (GH-12375) (GH-12395) Message-ID: https://github.com/python/cpython/commit/bedfbc790e18f14cfdd59cf27d27bb86518dc3fc commit: bedfbc790e18f14cfdd59cf27d27bb86518dc3fc branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Raymond Hettinger date: 2019-03-18T00:48:02-07:00 summary: bpo-36321: Fix misspelled attribute in namedtuple() (GH-12375) (GH-12395) (cherry picked from commit 23581c018fceb607fe829a41c6fbe81b4d502cab) Co-authored-by: Raymond Hettinger files: A Misc/NEWS.d/next/Library/2019-03-16-13-40-59.bpo-36321.s6crQx.rst M Doc/library/collections.rst M Lib/collections/__init__.py M Lib/test/test_collections.py diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index febaa4bf4620..1616585b654b 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -941,14 +941,14 @@ field names, the method and attribute names start with an underscore. >>> Pixel(11, 22, 128, 255, 0) Pixel(x=11, y=22, red=128, green=255, blue=0) -.. attribute:: somenamedtuple._fields_defaults +.. attribute:: somenamedtuple._field_defaults Dictionary mapping field names to default values. .. doctest:: >>> Account = namedtuple('Account', ['type', 'balance'], defaults=[0]) - >>> Account._fields_defaults + >>> Account._field_defaults {'balance': 0} >>> Account('premium') Account(type='premium', balance=0) diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index 9a753db71cae..1c69b1b50961 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -443,6 +443,8 @@ def __getnewargs__(self): '__doc__': f'{typename}({arg_list})', '__slots__': (), '_fields': field_names, + '_field_defaults': field_defaults, + # alternate spelling for backward compatiblity '_fields_defaults': field_defaults, '__new__': __new__, '_make': _make, diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index 2e7c1996d118..00b33ce27674 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -249,18 +249,18 @@ def test_factory(self): def test_defaults(self): Point = namedtuple('Point', 'x y', defaults=(10, 20)) # 2 defaults - self.assertEqual(Point._fields_defaults, {'x': 10, 'y': 20}) + self.assertEqual(Point._field_defaults, {'x': 10, 'y': 20}) self.assertEqual(Point(1, 2), (1, 2)) self.assertEqual(Point(1), (1, 20)) self.assertEqual(Point(), (10, 20)) Point = namedtuple('Point', 'x y', defaults=(20,)) # 1 default - self.assertEqual(Point._fields_defaults, {'y': 20}) + self.assertEqual(Point._field_defaults, {'y': 20}) self.assertEqual(Point(1, 2), (1, 2)) self.assertEqual(Point(1), (1, 20)) Point = namedtuple('Point', 'x y', defaults=()) # 0 defaults - self.assertEqual(Point._fields_defaults, {}) + self.assertEqual(Point._field_defaults, {}) self.assertEqual(Point(1, 2), (1, 2)) with self.assertRaises(TypeError): Point(1) @@ -277,21 +277,21 @@ def test_defaults(self): Point = namedtuple('Point', 'x y', defaults=False) Point = namedtuple('Point', 'x y', defaults=None) # default is None - self.assertEqual(Point._fields_defaults, {}) + self.assertEqual(Point._field_defaults, {}) self.assertIsNone(Point.__new__.__defaults__, None) self.assertEqual(Point(10, 20), (10, 20)) with self.assertRaises(TypeError): # catch too few args Point(10) Point = namedtuple('Point', 'x y', defaults=[10, 20]) # allow non-tuple iterable - self.assertEqual(Point._fields_defaults, {'x': 10, 'y': 20}) + self.assertEqual(Point._field_defaults, {'x': 10, 'y': 20}) self.assertEqual(Point.__new__.__defaults__, (10, 20)) self.assertEqual(Point(1, 2), (1, 2)) self.assertEqual(Point(1), (1, 20)) self.assertEqual(Point(), (10, 20)) Point = namedtuple('Point', 'x y', defaults=iter([10, 20])) # allow plain iterator - self.assertEqual(Point._fields_defaults, {'x': 10, 'y': 20}) + self.assertEqual(Point._field_defaults, {'x': 10, 'y': 20}) self.assertEqual(Point.__new__.__defaults__, (10, 20)) self.assertEqual(Point(1, 2), (1, 2)) self.assertEqual(Point(1), (1, 20)) diff --git a/Misc/NEWS.d/next/Library/2019-03-16-13-40-59.bpo-36321.s6crQx.rst b/Misc/NEWS.d/next/Library/2019-03-16-13-40-59.bpo-36321.s6crQx.rst new file mode 100644 index 000000000000..eea6f5418484 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-16-13-40-59.bpo-36321.s6crQx.rst @@ -0,0 +1,5 @@ +collections.namedtuple() misspelled the name of an attribute. To be +consistent with typing.NamedTuple, the attribute name should have been +"_field_defaults" instead of "_fields_defaults". For backwards +compatibility, both spellings are now created. The misspelled version may +be removed in the future. From webhook-mailer at python.org Mon Mar 18 06:07:57 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 18 Mar 2019 10:07:57 -0000 Subject: [Python-checkins] Fix typo in _PyObject_FastCallDict documentation (GH-12383) Message-ID: https://github.com/python/cpython/commit/b4b97af8bed21e32eb77e7f7497acde1f8af4e70 commit: b4b97af8bed21e32eb77e7f7497acde1f8af4e70 branch: master author: R?mi Lapeyre committer: Victor Stinner date: 2019-03-18T11:07:53+01:00 summary: Fix typo in _PyObject_FastCallDict documentation (GH-12383) files: M Include/cpython/abstract.h diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h index 991bea14ebf0..b8b2d449faf3 100644 --- a/Include/cpython/abstract.h +++ b/Include/cpython/abstract.h @@ -66,7 +66,7 @@ PyAPI_FUNC(int) _PyObject_HasFastCall(PyObject *callable); If nargs is equal to zero, args can be NULL. kwargs can be NULL. nargs must be greater or equal to zero. - Return the result on success. Raise an exception on return NULL on + Return the result on success. Raise an exception and return NULL on error. */ PyAPI_FUNC(PyObject *) _PyObject_FastCallDict( PyObject *callable, From webhook-mailer at python.org Mon Mar 18 06:45:07 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Mon, 18 Mar 2019 10:45:07 -0000 Subject: [Python-checkins] bpo-36307: Travis: upgrade to Xenial environment (GH-12356) Message-ID: https://github.com/python/cpython/commit/74ae50e53e59bbe39d6287b902757f0cd01327dc commit: 74ae50e53e59bbe39d6287b902757f0cd01327dc branch: master author: CAM Gerlach committer: Inada Naoki date: 2019-03-18T19:44:58+09:00 summary: bpo-36307: Travis: upgrade to Xenial environment (GH-12356) files: M .travis.yml diff --git a/.travis.yml b/.travis.yml index c6e009291a2d..6d57ebb1d2fb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,5 @@ language: c -dist: trusty -sudo: false +dist: xenial group: beta # To cache doc-building dependencies and C compiler output. From webhook-mailer at python.org Mon Mar 18 06:48:06 2019 From: webhook-mailer at python.org (Julien Palard) Date: Mon, 18 Mar 2019 10:48:06 -0000 Subject: [Python-checkins] bpo-36329: Declare the version of Python to use for Tools/scripts/serve.py (#12385) Message-ID: https://github.com/python/cpython/commit/09a9f1799c8c58f573c50cb2d526422436b8658b commit: 09a9f1799c8c58f573c50cb2d526422436b8658b branch: master author: St?phane Wirtel committer: Julien Palard date: 2019-03-18T11:47:55+01:00 summary: bpo-36329: Declare the version of Python to use for Tools/scripts/serve.py (#12385) * bpo-36329: Declare the version of Python to use for Tools/scripts/serve.py * Add the blurb entry files: A Misc/NEWS.d/next/Documentation/2019-03-17-20-01-41.bpo-36329.L5dJPD.rst M Doc/Makefile diff --git a/Doc/Makefile b/Doc/Makefile index 4b85e9eb6058..53877e613290 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -174,7 +174,7 @@ check: $(PYTHON) tools/rstlint.py -i tools -i $(VENVDIR) -i README.rst serve: - ../Tools/scripts/serve.py build/html + $(PYTHON) ../Tools/scripts/serve.py build/html # Targets for daily automated doc build # By default, Sphinx only rebuilds pages where the page content has changed. diff --git a/Misc/NEWS.d/next/Documentation/2019-03-17-20-01-41.bpo-36329.L5dJPD.rst b/Misc/NEWS.d/next/Documentation/2019-03-17-20-01-41.bpo-36329.L5dJPD.rst new file mode 100644 index 000000000000..94e5884cc9ad --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-03-17-20-01-41.bpo-36329.L5dJPD.rst @@ -0,0 +1,3 @@ +Declare the path of the Python binary for the usage of +``Tools/scripts/serve.py`` when executing ``make -C Doc/ serve``. +Contributed by St?phane Wirtel From webhook-mailer at python.org Mon Mar 18 07:38:38 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Mon, 18 Mar 2019 11:38:38 -0000 Subject: [Python-checkins] bpo-30040: optimize inserting into empty dict (GH-12307) Message-ID: https://github.com/python/cpython/commit/2ddc7f6d6223840c9971b36b30da4b3371d6e52b commit: 2ddc7f6d6223840c9971b36b30da4b3371d6e52b branch: master author: Inada Naoki committer: GitHub date: 2019-03-18T20:38:33+09:00 summary: bpo-30040: optimize inserting into empty dict (GH-12307) files: M Objects/dictobject.c diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 108c6128ab1a..524ff67837bc 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -1102,6 +1102,41 @@ insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value) return -1; } +// Same to insertdict but specialized for ma_keys = Py_EMPTY_KEYS. +static int +insert_to_emptydict(PyDictObject *mp, PyObject *key, Py_hash_t hash, + PyObject *value) +{ + assert(mp->ma_keys == Py_EMPTY_KEYS); + + PyDictKeysObject *newkeys = new_keys_object(PyDict_MINSIZE); + if (newkeys == NULL) { + return -1; + } + if (!PyUnicode_CheckExact(key)) { + newkeys->dk_lookup = lookdict; + } + dictkeys_decref(Py_EMPTY_KEYS); + mp->ma_keys = newkeys; + mp->ma_values = NULL; + + Py_INCREF(key); + Py_INCREF(value); + MAINTAIN_TRACKING(mp, key, value); + + size_t hashpos = (size_t)hash & (PyDict_MINSIZE-1); + PyDictKeyEntry *ep = &DK_ENTRIES(mp->ma_keys)[0]; + dictkeys_set_index(mp->ma_keys, hashpos, 0); + ep->me_key = key; + ep->me_hash = hash; + ep->me_value = value; + mp->ma_used++; + mp->ma_version_tag = DICT_NEXT_VERSION(); + mp->ma_keys->dk_usable--; + mp->ma_keys->dk_nentries++; + return 0; +} + /* Internal routine used by dictresize() to build a hashtable of entries. */ @@ -1274,7 +1309,7 @@ _PyDict_NewPresized(Py_ssize_t minused) Py_ssize_t newsize; PyDictKeysObject *new_keys; - if (minused == 0) { + if (minused <= USABLE_FRACTION(PyDict_MINSIZE)) { return PyDict_New(); } /* There are no strict guarantee that returned dict can contain minused @@ -1286,7 +1321,7 @@ _PyDict_NewPresized(Py_ssize_t minused) } else { Py_ssize_t minsize = ESTIMATE_SIZE(minused); - newsize = PyDict_MINSIZE; + newsize = PyDict_MINSIZE*2; while (newsize < minsize) { newsize <<= 1; } @@ -1495,6 +1530,9 @@ PyDict_SetItem(PyObject *op, PyObject *key, PyObject *value) return -1; } + if (mp->ma_keys == Py_EMPTY_KEYS) { + return insert_to_emptydict(mp, key, hash, value); + } /* insertdict() handles any resizing that might be necessary */ return insertdict(mp, key, hash, value); } @@ -1514,6 +1552,9 @@ _PyDict_SetItem_KnownHash(PyObject *op, PyObject *key, PyObject *value, assert(hash != -1); mp = (PyDictObject *)op; + if (mp->ma_keys == Py_EMPTY_KEYS) { + return insert_to_emptydict(mp, key, hash, value); + } /* insertdict() handles any resizing that might be necessary */ return insertdict(mp, key, hash, value); } @@ -2844,6 +2885,12 @@ PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *defaultobj) if (hash == -1) return NULL; } + if (mp->ma_keys == Py_EMPTY_KEYS) { + if (insert_to_emptydict(mp, key, hash, defaultobj) < 0) { + return NULL; + } + return defaultobj; + } if (mp->ma_values != NULL && !PyUnicode_CheckExact(key)) { if (insertion_resize(mp) < 0) From webhook-mailer at python.org Mon Mar 18 07:51:26 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 18 Mar 2019 11:51:26 -0000 Subject: [Python-checkins] bpo-36317: Fix typo in _PyObject_FastCallDict documentation (GH-12383) (GH-12402) Message-ID: https://github.com/python/cpython/commit/67294f64256a5cb29ca3c22d1a8d324e7ea177c6 commit: 67294f64256a5cb29ca3c22d1a8d324e7ea177c6 branch: 3.7 author: R?mi Lapeyre committer: Victor Stinner date: 2019-03-18T12:51:23+01:00 summary: bpo-36317: Fix typo in _PyObject_FastCallDict documentation (GH-12383) (GH-12402) (cherry picked from commit b4b97af8bed21e32eb77e7f7497acde1f8af4e70) files: M Include/abstract.h diff --git a/Include/abstract.h b/Include/abstract.h index 4088f75ff3c7..3fe5a0064532 100644 --- a/Include/abstract.h +++ b/Include/abstract.h @@ -220,7 +220,7 @@ PyAPI_FUNC(int) _PyObject_HasFastCall(PyObject *callable); If nargs is equal to zero, args can be NULL. kwargs can be NULL. nargs must be greater or equal to zero. - Return the result on success. Raise an exception on return NULL on + Return the result on success. Raise an exception and return NULL on error. */ PyAPI_FUNC(PyObject *) _PyObject_FastCallDict( PyObject *callable, From webhook-mailer at python.org Mon Mar 18 09:51:59 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Mon, 18 Mar 2019 13:51:59 -0000 Subject: [Python-checkins] bpo-36332: Allow compile() to handle AST objects with assignment expressions (GH-12398) Message-ID: https://github.com/python/cpython/commit/0c9258a6d299e0484538ef8d4b23f30515283db2 commit: 0c9258a6d299e0484538ef8d4b23f30515283db2 branch: master author: Pablo Galindo committer: GitHub date: 2019-03-18T13:51:53Z summary: bpo-36332: Allow compile() to handle AST objects with assignment expressions (GH-12398) files: A Misc/NEWS.d/next/Core and Builtins/2019-03-18-09-27-54.bpo-36332.yEC-Vz.rst M Lib/test/test_ast.py M Python/ast.c diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py index a7ee0da38d48..e39d1f2e17a8 100644 --- a/Lib/test/test_ast.py +++ b/Lib/test/test_ast.py @@ -135,6 +135,9 @@ def to_tuple(t): "@deco1\n at deco2()\nclass C: pass", # Decorator with generator argument "@deco(a for a in b)\ndef f(): pass", + # Simple assignment expression + "(a := 1)", + ] # These are compiled through "single" @@ -276,6 +279,13 @@ def test_snippets(self): with self.subTest(action="compiling", input=i, kind=kind): compile(ast_tree, "?", kind) + def test_ast_validation(self): + # compile() is the only function that calls PyAST_Validate + snippets_to_validate = exec_tests + single_tests + eval_tests + for snippet in snippets_to_validate: + tree = ast.parse(snippet) + compile(tree, '', 'exec') + def test_slice(self): slc = ast.parse("x[::]").body[0].value.slice self.assertIsNone(slc.upper) @@ -1677,6 +1687,7 @@ def main(): ('Module', [('AsyncFunctionDef', (3, 0), 'f', ('arguments', [], None, [], [], None, []), [('Pass', (3, 15))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 0), ('Name', (2, 1), 'deco2', ('Load',)), [], [])], None, None)], []), ('Module', [('ClassDef', (3, 0), 'C', [], [], [('Pass', (3, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 0), ('Name', (2, 1), 'deco2', ('Load',)), [], [])])], []), ('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)))], []), ] single_results = [ ('Interactive', [('Expr', (1, 0), ('BinOp', (1, 0), ('Constant', (1, 0), 1, None), ('Add',), ('Constant', (1, 2), 2, None)))]), diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-18-09-27-54.bpo-36332.yEC-Vz.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-18-09-27-54.bpo-36332.yEC-Vz.rst new file mode 100644 index 000000000000..2c69c1c56527 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-18-09-27-54.bpo-36332.yEC-Vz.rst @@ -0,0 +1,2 @@ +The builtin :func:`compile` can now handle AST objects that contain +assignment expressions. Patch by Pablo Galindo. diff --git a/Python/ast.c b/Python/ast.c index 971b8ddc8c24..e9154fecff06 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -316,13 +316,14 @@ validate_expr(expr_ty exp, expr_context_ty ctx) return validate_exprs(exp->v.List.elts, ctx, 0); case Tuple_kind: return validate_exprs(exp->v.Tuple.elts, ctx, 0); + case NamedExpr_kind: + return validate_expr(exp->v.NamedExpr.value, Load); /* This last case doesn't have any checking. */ case Name_kind: return 1; - default: - PyErr_SetString(PyExc_SystemError, "unexpected expression"); - return 0; } + PyErr_SetString(PyExc_SystemError, "unexpected expression"); + return 0; } static int From webhook-mailer at python.org Mon Mar 18 10:22:47 2019 From: webhook-mailer at python.org (Vinay Sajip) Date: Mon, 18 Mar 2019 14:22:47 -0000 Subject: [Python-checkins] bpo-36272: Logging now propagates RecursionError (GH-12312) (GH-12391) Message-ID: https://github.com/python/cpython/commit/6a7a9f1d83cef628d2bacd71ee568b93f53fd6b4 commit: 6a7a9f1d83cef628d2bacd71ee568b93f53fd6b4 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Vinay Sajip date: 2019-03-18T14:22:41Z summary: bpo-36272: Logging now propagates RecursionError (GH-12312) (GH-12391) (cherry picked from commit 65f64b1903ae85b97a30f514bbc1b7ce940c3af2) Co-authored-by: R?mi Lapeyre files: A Misc/NEWS.d/next/Library/2019-03-13-14-14-36.bpo-36272.f3l2IG.rst M Lib/logging/__init__.py M Lib/test/test_logging.py diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 2761509d9951..66fd5ac9fe06 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -974,6 +974,8 @@ def handleError(self, record): sys.stderr.write('Message: %r\n' 'Arguments: %s\n' % (record.msg, record.args)) + except RecursionError: # See issue 36272 + raise except Exception: sys.stderr.write('Unable to print the message and arguments' ' - possible formatting error.\nUse the' @@ -1036,6 +1038,8 @@ def emit(self, record): # issue 35046: merged two stream.writes into one. stream.write(msg + self.terminator) self.flush() + except RecursionError: # See issue 36272 + raise except Exception: self.handleError(record) diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 1ea2967f5b4a..3b671ce2ab37 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -40,7 +40,7 @@ import struct import sys import tempfile -from test.support.script_helper import assert_python_ok +from test.support.script_helper import assert_python_ok, assert_python_failure from test import support import textwrap import threading @@ -3841,6 +3841,21 @@ def __del__(self): self.assertIn("exception in __del__", err) self.assertIn("ValueError: some error", err) + def test_recursion_error(self): + # Issue 36272 + code = """if 1: + import logging + + def rec(): + logging.error("foo") + rec() + + rec()""" + rc, out, err = assert_python_failure("-c", code) + err = err.decode() + self.assertNotIn("Cannot recover from stack overflow.", err) + self.assertEqual(rc, 1) + class LogRecordTest(BaseTest): def test_str_rep(self): diff --git a/Misc/NEWS.d/next/Library/2019-03-13-14-14-36.bpo-36272.f3l2IG.rst b/Misc/NEWS.d/next/Library/2019-03-13-14-14-36.bpo-36272.f3l2IG.rst new file mode 100644 index 000000000000..2f2f7905c015 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-13-14-14-36.bpo-36272.f3l2IG.rst @@ -0,0 +1,2 @@ +:mod:`logging` does not silently ignore RecursionError anymore. Patch +contributed by R?mi Lapeyre. From webhook-mailer at python.org Mon Mar 18 12:10:35 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 18 Mar 2019 16:10:35 -0000 Subject: [Python-checkins] bpo-36328: Fix compiler warning in Py_NewInterpreter() (GH-12381) Message-ID: https://github.com/python/cpython/commit/9e06d2b865beb62e54a4da39eb191f9fb8385282 commit: 9e06d2b865beb62e54a4da39eb191f9fb8385282 branch: master author: St?phane Wirtel committer: Victor Stinner date: 2019-03-18T17:10:29+01:00 summary: bpo-36328: Fix compiler warning in Py_NewInterpreter() (GH-12381) files: M Python/pylifecycle.c diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index c2d431c912b7..49a2f18e49fa 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1434,7 +1434,7 @@ new_interpreter(PyThreadState **tstate_p) PyThreadState * Py_NewInterpreter(void) { - PyThreadState *tstate; + PyThreadState *tstate = NULL; _PyInitError err = new_interpreter(&tstate); if (_Py_INIT_FAILED(err)) { _Py_ExitInitError(err); From webhook-mailer at python.org Mon Mar 18 12:19:06 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 18 Mar 2019 16:19:06 -0000 Subject: [Python-checkins] bpo-36235: Enhance distutils test_customize_compiler() (GH-12403) Message-ID: https://github.com/python/cpython/commit/72c7b372cf145fded93a9a776acc742a60090f95 commit: 72c7b372cf145fded93a9a776acc742a60090f95 branch: master author: Victor Stinner committer: GitHub date: 2019-03-18T17:19:02+01:00 summary: bpo-36235: Enhance distutils test_customize_compiler() (GH-12403) The test test_customize_compiler() now mocks all sysconfig variables and all environment variables used by customize_compiler(). files: M Lib/distutils/tests/test_sysconfig.py diff --git a/Lib/distutils/tests/test_sysconfig.py b/Lib/distutils/tests/test_sysconfig.py index 4bf6a067d4d9..245a6c86b111 100644 --- a/Lib/distutils/tests/test_sysconfig.py +++ b/Lib/distutils/tests/test_sysconfig.py @@ -1,4 +1,5 @@ """Tests for distutils.sysconfig.""" +import contextlib import os import shutil import subprocess @@ -74,14 +75,7 @@ def test_srcdir_independent_of_cwd(self): os.chdir(cwd) self.assertEqual(srcdir, srcdir2) - @unittest.skipUnless(get_default_compiler() == 'unix', - 'not testing if default compiler is not unix') - def test_customize_compiler(self): - os.environ['AR'] = 'my_ar' - os.environ['CC'] = 'my_cc' - os.environ['ARFLAGS'] = '--myarflags' - os.environ['CFLAGS'] = '--mycflags' - + def customize_compiler(self): # make sure AR gets caught class compiler: compiler_type = 'unix' @@ -89,14 +83,86 @@ class compiler: def set_executables(self, **kw): self.exes = kw - # Make sure that sysconfig._config_vars is initialized - sysconfig.get_config_vars() + sysconfig_vars = { + 'AR': 'sc_ar', + 'CC': 'sc_cc', + 'CXX': 'sc_cxx', + 'ARFLAGS': '--sc-arflags', + 'CFLAGS': '--sc-cflags', + 'CCSHARED': '--sc-ccshared', + 'LDSHARED': 'sc_ldshared', + 'SHLIB_SUFFIX': 'sc_shutil_suffix', + } comp = compiler() - with swap_item(sysconfig._config_vars, 'CFLAGS', '--sysconfig-cflags'): + with contextlib.ExitStack() as cm: + for key, value in sysconfig_vars.items(): + cm.enter_context(swap_item(sysconfig._config_vars, key, value)) sysconfig.customize_compiler(comp) - self.assertEqual(comp.exes['archiver'], 'my_ar --myarflags') - self.assertEqual(comp.exes['compiler'], 'my_cc --sysconfig-cflags --mycflags') + + return comp + + @unittest.skipUnless(get_default_compiler() == 'unix', + 'not testing if default compiler is not unix') + def test_customize_compiler(self): + # Make sure that sysconfig._config_vars is initialized + sysconfig.get_config_vars() + + os.environ['AR'] = 'env_ar' + os.environ['CC'] = 'env_cc' + os.environ['CPP'] = 'env_cpp' + os.environ['CXX'] = 'env_cxx --env-cxx-flags' + os.environ['LDSHARED'] = 'env_ldshared' + os.environ['LDFLAGS'] = '--env-ldflags' + os.environ['ARFLAGS'] = '--env-arflags' + os.environ['CFLAGS'] = '--env-cflags' + os.environ['CPPFLAGS'] = '--env-cppflags' + + comp = self.customize_compiler() + self.assertEqual(comp.exes['archiver'], + 'env_ar --env-arflags') + self.assertEqual(comp.exes['preprocessor'], + 'env_cpp --env-cppflags') + self.assertEqual(comp.exes['compiler'], + 'env_cc --sc-cflags --env-cflags --env-cppflags') + self.assertEqual(comp.exes['compiler_so'], + ('env_cc --sc-cflags ' + '--env-cflags ''--env-cppflags --sc-ccshared')) + self.assertEqual(comp.exes['compiler_cxx'], + 'env_cxx --env-cxx-flags') + self.assertEqual(comp.exes['linker_exe'], + 'env_cc') + self.assertEqual(comp.exes['linker_so'], + ('env_ldshared --env-ldflags --env-cflags' + ' --env-cppflags')) + self.assertEqual(comp.shared_lib_extension, 'sc_shutil_suffix') + + del os.environ['AR'] + del os.environ['CC'] + del os.environ['CPP'] + del os.environ['CXX'] + del os.environ['LDSHARED'] + del os.environ['LDFLAGS'] + del os.environ['ARFLAGS'] + del os.environ['CFLAGS'] + del os.environ['CPPFLAGS'] + + comp = self.customize_compiler() + self.assertEqual(comp.exes['archiver'], + 'sc_ar --sc-arflags') + self.assertEqual(comp.exes['preprocessor'], + 'sc_cc -E') + self.assertEqual(comp.exes['compiler'], + 'sc_cc --sc-cflags') + self.assertEqual(comp.exes['compiler_so'], + 'sc_cc --sc-cflags --sc-ccshared') + self.assertEqual(comp.exes['compiler_cxx'], + 'sc_cxx') + self.assertEqual(comp.exes['linker_exe'], + 'sc_cc') + self.assertEqual(comp.exes['linker_so'], + 'sc_ldshared') + self.assertEqual(comp.shared_lib_extension, 'sc_shutil_suffix') def test_parse_makefile_base(self): self.makefile = TESTFN From webhook-mailer at python.org Mon Mar 18 12:47:35 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 18 Mar 2019 16:47:35 -0000 Subject: [Python-checkins] bpo-36352: Clarify fileutils.h documentation (GH-12406) Message-ID: https://github.com/python/cpython/commit/1be0d1135f5627d0525eab635cf2da441d9cbc08 commit: 1be0d1135f5627d0525eab635cf2da441d9cbc08 branch: master author: Victor Stinner committer: GitHub date: 2019-03-18T17:47:26+01:00 summary: bpo-36352: Clarify fileutils.h documentation (GH-12406) The last parameter of _Py_wreadlink(), _Py_wrealpath() and _Py_wgetcwd() is a length, not a size: number of characters including the trailing NUL character. Enhance also documentation of error conditions. files: M Include/fileutils.h M Python/fileutils.c diff --git a/Include/fileutils.h b/Include/fileutils.h index 830e56ad367a..0be8b0ae3b31 100644 --- a/Include/fileutils.h +++ b/Include/fileutils.h @@ -140,19 +140,25 @@ PyAPI_FUNC(Py_ssize_t) _Py_write_noraise( PyAPI_FUNC(int) _Py_wreadlink( const wchar_t *path, wchar_t *buf, - size_t bufsiz); + /* Number of characters of 'buf' buffer + including the trailing NUL character */ + size_t buflen); #endif #ifdef HAVE_REALPATH PyAPI_FUNC(wchar_t*) _Py_wrealpath( const wchar_t *path, wchar_t *resolved_path, - size_t resolved_path_size); + /* Number of characters of 'resolved_path' buffer + including the trailing NUL character */ + size_t resolved_path_len); #endif PyAPI_FUNC(wchar_t*) _Py_wgetcwd( wchar_t *buf, - size_t size); + /* Number of characters of 'buf' buffer + including the trailing NUL character */ + size_t buflen); PyAPI_FUNC(int) _Py_get_inheritable(int fd); diff --git a/Python/fileutils.c b/Python/fileutils.c index 75e015afaec3..0ac690a211cf 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -1629,10 +1629,12 @@ _Py_write_noraise(int fd, const void *buf, size_t count) #ifdef HAVE_READLINK /* Read value of symbolic link. Encode the path to the locale encoding, decode - the result from the locale encoding. Return -1 on error. */ + the result from the locale encoding. + Return -1 on encoding error, on readlink() error, if the internal buffer is + too short, on decoding error, or if 'buf' is too short. */ int -_Py_wreadlink(const wchar_t *path, wchar_t *buf, size_t bufsiz) +_Py_wreadlink(const wchar_t *path, wchar_t *buf, size_t buflen) { char *cpath; char cbuf[MAXPATHLEN]; @@ -1659,12 +1661,13 @@ _Py_wreadlink(const wchar_t *path, wchar_t *buf, size_t bufsiz) errno = EINVAL; return -1; } - if (bufsiz <= r1) { + /* wbuf must have space to store the trailing NUL character */ + if (buflen <= r1) { PyMem_RawFree(wbuf); errno = EINVAL; return -1; } - wcsncpy(buf, wbuf, bufsiz); + wcsncpy(buf, wbuf, buflen); PyMem_RawFree(wbuf); return (int)r1; } @@ -1674,11 +1677,12 @@ _Py_wreadlink(const wchar_t *path, wchar_t *buf, size_t bufsiz) /* Return the canonicalized absolute pathname. Encode path to the locale encoding, decode the result from the locale encoding. - Return NULL on error. */ + Return NULL on encoding error, realpath() error, decoding error + or if 'resolved_path' is too short. */ wchar_t* _Py_wrealpath(const wchar_t *path, - wchar_t *resolved_path, size_t resolved_path_size) + wchar_t *resolved_path, size_t resolved_path_len) { char *cpath; char cresolved_path[MAXPATHLEN]; @@ -1700,12 +1704,13 @@ _Py_wrealpath(const wchar_t *path, errno = EINVAL; return NULL; } - if (resolved_path_size <= r) { + /* wresolved_path must have space to store the trailing NUL character */ + if (resolved_path_len <= r) { PyMem_RawFree(wresolved_path); errno = EINVAL; return NULL; } - wcsncpy(resolved_path, wresolved_path, resolved_path_size); + wcsncpy(resolved_path, wresolved_path, resolved_path_len); PyMem_RawFree(wresolved_path); return resolved_path; } @@ -1713,14 +1718,15 @@ _Py_wrealpath(const wchar_t *path, /* Get the current directory. size is the buffer size in wide characters including the null character. Decode the path from the locale encoding. - Return NULL on error. */ + Return NULL on getcwd() error, on decoding error, or if 'buf' is + too short. */ wchar_t* -_Py_wgetcwd(wchar_t *buf, size_t size) +_Py_wgetcwd(wchar_t *buf, size_t buflen) { #ifdef MS_WINDOWS - int isize = (int)Py_MIN(size, INT_MAX); - return _wgetcwd(buf, isize); + int ibuflen = (int)Py_MIN(buflen, INT_MAX); + return _wgetcwd(buf, ibuflen); #else char fname[MAXPATHLEN]; wchar_t *wname; @@ -1731,11 +1737,12 @@ _Py_wgetcwd(wchar_t *buf, size_t size) wname = Py_DecodeLocale(fname, &len); if (wname == NULL) return NULL; - if (size <= len) { + /* wname must have space to store the trailing NUL character */ + if (buflen <= len) { PyMem_RawFree(wname); return NULL; } - wcsncpy(buf, wname, size); + wcsncpy(buf, wname, buflen); PyMem_RawFree(wname); return buf; #endif From webhook-mailer at python.org Mon Mar 18 12:54:25 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 18 Mar 2019 16:54:25 -0000 Subject: [Python-checkins] bpo-36320: Switch typing.NamedTuple from OrderedDict to regular dict (GH-12396) Message-ID: https://github.com/python/cpython/commit/f7b57df0c09c3a04ab27ba06eb2feb989bbb16cb commit: f7b57df0c09c3a04ab27ba06eb2feb989bbb16cb branch: master author: Raymond Hettinger committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-18T09:53:56-07:00 summary: bpo-36320: Switch typing.NamedTuple from OrderedDict to regular dict (GH-12396) Also, deprecate the *_field_types* attributes which duplicated the information in *\__annotations__*. https://bugs.python.org/issue36320 files: A Misc/NEWS.d/next/Library/2019-03-18-01-08-14.bpo-36320.-06b9_.rst M Doc/library/typing.rst M Doc/whatsnew/3.8.rst M Lib/typing.py diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index de03284dfbb6..fad9dc69431f 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -838,10 +838,11 @@ The module defines the following classes, functions and decorators: Fields with a default value must come after any fields without a default. - The resulting class has two extra attributes: ``_field_types``, - giving a dict mapping field names to types, and ``_field_defaults``, a dict - mapping field names to default values. (The field names are in the - ``_fields`` attribute, which is part of the namedtuple API.) + The resulting class has an extra attribute ``__annotations__`` giving a + dict that maps the field names to the field types. (The field names are in + the ``_fields`` attribute and the default values are in the + ``_field_defaults`` attribute both of which are part of the namedtuple + API.) ``NamedTuple`` subclasses can also have docstrings and methods:: @@ -863,6 +864,15 @@ The module defines the following classes, functions and decorators: .. versionchanged:: 3.6.1 Added support for default values, methods, and docstrings. + .. versionchanged:: 3.8 + Deprecated the ``_field_types`` attribute in favor of the more + standard ``__annotations__`` attribute which has the same information. + + .. versionchanged:: 3.8 + The ``_field_types`` and ``__annotations__`` attributes are + now regular dictionaries instead of instances of ``OrderedDict``. + + .. function:: NewType(typ) A helper function to indicate a distinct types to a typechecker, diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 31baccd9d68d..2e311ab1c1f5 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -510,6 +510,10 @@ Deprecated (Contributed by Berker Peksag in :issue:`9372`.) +* The :class:`typing.NamedTuple` class has deprecated the ``_field_types`` + attribute in favor of the ``__annotations__`` attribute which has the same + information. (Contributed by Raymond Hettinger in :issue:`36320`.) + * :mod:`ast` classes ``Num``, ``Str``, ``Bytes``, ``NameConstant`` and ``Ellipsis`` are considered deprecated and will be removed in future Python versions. :class:`~ast.Constant` should be used instead. diff --git a/Lib/typing.py b/Lib/typing.py index 3243e2af1119..530d4633fe4c 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1325,8 +1325,8 @@ def _make_nmtuple(name, types): types = [(n, _type_check(t, msg)) for n, t in types] nm_tpl = collections.namedtuple(name, [n for n, t in types]) # Prior to PEP 526, only _field_types attribute was assigned. - # Now, both __annotations__ and _field_types are used to maintain compatibility. - nm_tpl.__annotations__ = nm_tpl._field_types = collections.OrderedDict(types) + # Now __annotations__ are used and _field_types is deprecated (remove in 3.9) + nm_tpl.__annotations__ = nm_tpl._field_types = dict(types) try: nm_tpl.__module__ = sys._getframe(2).f_globals.get('__name__', '__main__') except (AttributeError, ValueError): @@ -1361,7 +1361,7 @@ def __new__(cls, typename, bases, ns): "follow default field(s) {default_names}" .format(field_name=field_name, default_names=', '.join(defaults_dict.keys()))) - nm_tpl.__new__.__annotations__ = collections.OrderedDict(types) + nm_tpl.__new__.__annotations__ = dict(types) nm_tpl.__new__.__defaults__ = tuple(defaults) nm_tpl._field_defaults = defaults_dict # update from user namespace without overriding special namedtuple attributes @@ -1386,12 +1386,10 @@ class Employee(NamedTuple): Employee = collections.namedtuple('Employee', ['name', 'id']) - The resulting class has extra __annotations__ and _field_types - attributes, giving an ordered dict mapping field names to types. - __annotations__ should be preferred, while _field_types - is kept to maintain pre PEP 526 compatibility. (The field names - are in the _fields attribute, which is part of the namedtuple - API.) Alternative equivalent keyword syntax is also accepted:: + The resulting class has an extra __annotations__ attribute, giving a + dict that maps field names to types. (The field names are also in + the _fields attribute, which is part of the namedtuple API.) + Alternative equivalent keyword syntax is also accepted:: Employee = NamedTuple('Employee', name=str, id=int) diff --git a/Misc/NEWS.d/next/Library/2019-03-18-01-08-14.bpo-36320.-06b9_.rst b/Misc/NEWS.d/next/Library/2019-03-18-01-08-14.bpo-36320.-06b9_.rst new file mode 100644 index 000000000000..9e9495f46b7e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-18-01-08-14.bpo-36320.-06b9_.rst @@ -0,0 +1,3 @@ +The typing.NamedTuple() class has deprecated the _field_types attribute in +favor of the __annotations__ attribute which carried the same information. +Also, both attributes were converted from OrderedDict to a regular dict. From webhook-mailer at python.org Mon Mar 18 13:34:36 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 18 Mar 2019 17:34:36 -0000 Subject: [Python-checkins] bpo-36235: Enhance distutils test_customize_compiler() (GH-12403) (GH-12415) Message-ID: https://github.com/python/cpython/commit/dd1cfefd67f254ce44f33995922e347c9d3f7b4e commit: dd1cfefd67f254ce44f33995922e347c9d3f7b4e branch: 3.7 author: Victor Stinner committer: GitHub date: 2019-03-18T18:34:11+01:00 summary: bpo-36235: Enhance distutils test_customize_compiler() (GH-12403) (GH-12415) The test test_customize_compiler() now mocks all sysconfig variables and all environment variables used by customize_compiler(). (cherry picked from commit 72c7b372cf145fded93a9a776acc742a60090f95) files: M Lib/distutils/tests/test_sysconfig.py diff --git a/Lib/distutils/tests/test_sysconfig.py b/Lib/distutils/tests/test_sysconfig.py index 4bf6a067d4d9..245a6c86b111 100644 --- a/Lib/distutils/tests/test_sysconfig.py +++ b/Lib/distutils/tests/test_sysconfig.py @@ -1,4 +1,5 @@ """Tests for distutils.sysconfig.""" +import contextlib import os import shutil import subprocess @@ -74,14 +75,7 @@ def test_srcdir_independent_of_cwd(self): os.chdir(cwd) self.assertEqual(srcdir, srcdir2) - @unittest.skipUnless(get_default_compiler() == 'unix', - 'not testing if default compiler is not unix') - def test_customize_compiler(self): - os.environ['AR'] = 'my_ar' - os.environ['CC'] = 'my_cc' - os.environ['ARFLAGS'] = '--myarflags' - os.environ['CFLAGS'] = '--mycflags' - + def customize_compiler(self): # make sure AR gets caught class compiler: compiler_type = 'unix' @@ -89,14 +83,86 @@ class compiler: def set_executables(self, **kw): self.exes = kw - # Make sure that sysconfig._config_vars is initialized - sysconfig.get_config_vars() + sysconfig_vars = { + 'AR': 'sc_ar', + 'CC': 'sc_cc', + 'CXX': 'sc_cxx', + 'ARFLAGS': '--sc-arflags', + 'CFLAGS': '--sc-cflags', + 'CCSHARED': '--sc-ccshared', + 'LDSHARED': 'sc_ldshared', + 'SHLIB_SUFFIX': 'sc_shutil_suffix', + } comp = compiler() - with swap_item(sysconfig._config_vars, 'CFLAGS', '--sysconfig-cflags'): + with contextlib.ExitStack() as cm: + for key, value in sysconfig_vars.items(): + cm.enter_context(swap_item(sysconfig._config_vars, key, value)) sysconfig.customize_compiler(comp) - self.assertEqual(comp.exes['archiver'], 'my_ar --myarflags') - self.assertEqual(comp.exes['compiler'], 'my_cc --sysconfig-cflags --mycflags') + + return comp + + @unittest.skipUnless(get_default_compiler() == 'unix', + 'not testing if default compiler is not unix') + def test_customize_compiler(self): + # Make sure that sysconfig._config_vars is initialized + sysconfig.get_config_vars() + + os.environ['AR'] = 'env_ar' + os.environ['CC'] = 'env_cc' + os.environ['CPP'] = 'env_cpp' + os.environ['CXX'] = 'env_cxx --env-cxx-flags' + os.environ['LDSHARED'] = 'env_ldshared' + os.environ['LDFLAGS'] = '--env-ldflags' + os.environ['ARFLAGS'] = '--env-arflags' + os.environ['CFLAGS'] = '--env-cflags' + os.environ['CPPFLAGS'] = '--env-cppflags' + + comp = self.customize_compiler() + self.assertEqual(comp.exes['archiver'], + 'env_ar --env-arflags') + self.assertEqual(comp.exes['preprocessor'], + 'env_cpp --env-cppflags') + self.assertEqual(comp.exes['compiler'], + 'env_cc --sc-cflags --env-cflags --env-cppflags') + self.assertEqual(comp.exes['compiler_so'], + ('env_cc --sc-cflags ' + '--env-cflags ''--env-cppflags --sc-ccshared')) + self.assertEqual(comp.exes['compiler_cxx'], + 'env_cxx --env-cxx-flags') + self.assertEqual(comp.exes['linker_exe'], + 'env_cc') + self.assertEqual(comp.exes['linker_so'], + ('env_ldshared --env-ldflags --env-cflags' + ' --env-cppflags')) + self.assertEqual(comp.shared_lib_extension, 'sc_shutil_suffix') + + del os.environ['AR'] + del os.environ['CC'] + del os.environ['CPP'] + del os.environ['CXX'] + del os.environ['LDSHARED'] + del os.environ['LDFLAGS'] + del os.environ['ARFLAGS'] + del os.environ['CFLAGS'] + del os.environ['CPPFLAGS'] + + comp = self.customize_compiler() + self.assertEqual(comp.exes['archiver'], + 'sc_ar --sc-arflags') + self.assertEqual(comp.exes['preprocessor'], + 'sc_cc -E') + self.assertEqual(comp.exes['compiler'], + 'sc_cc --sc-cflags') + self.assertEqual(comp.exes['compiler_so'], + 'sc_cc --sc-cflags --sc-ccshared') + self.assertEqual(comp.exes['compiler_cxx'], + 'sc_cxx') + self.assertEqual(comp.exes['linker_exe'], + 'sc_cc') + self.assertEqual(comp.exes['linker_so'], + 'sc_ldshared') + self.assertEqual(comp.shared_lib_extension, 'sc_shutil_suffix') def test_parse_makefile_base(self): self.makefile = TESTFN From webhook-mailer at python.org Mon Mar 18 13:34:36 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 18 Mar 2019 17:34:36 -0000 Subject: [Python-checkins] bpo-36235: Enhance distutils test_customize_compiler() (GH-12403) (GH-12417) Message-ID: https://github.com/python/cpython/commit/8c380e99e9b71387d5722373805fe3159e2d912c commit: 8c380e99e9b71387d5722373805fe3159e2d912c branch: 2.7 author: Victor Stinner committer: GitHub date: 2019-03-18T18:34:06+01:00 summary: bpo-36235: Enhance distutils test_customize_compiler() (GH-12403) (GH-12417) The test test_customize_compiler() now mocks all sysconfig variables and all environment variables used by customize_compiler(). (cherry picked from commit 72c7b372cf145fded93a9a776acc742a60090f95) files: M Lib/distutils/tests/test_sysconfig.py diff --git a/Lib/distutils/tests/test_sysconfig.py b/Lib/distutils/tests/test_sysconfig.py index 2be5d245f9d9..71754ddba17f 100644 --- a/Lib/distutils/tests/test_sysconfig.py +++ b/Lib/distutils/tests/test_sysconfig.py @@ -51,14 +51,7 @@ def test_get_python_inc(self): python_h = os.path.join(inc_dir, "Python.h") self.assertTrue(os.path.isfile(python_h), python_h) - @unittest.skipUnless(get_default_compiler() == 'unix', - 'not testing if default compiler is not unix') - def test_customize_compiler(self): - os.environ['AR'] = 'my_ar' - os.environ['CC'] = 'my_cc' - os.environ['ARFLAGS'] = '--myarflags' - os.environ['CFLAGS'] = '--mycflags' - + def customize_compiler(self): # make sure AR gets caught class compiler: compiler_type = 'unix' @@ -66,14 +59,90 @@ class compiler: def set_executables(self, **kw): self.exes = kw - # Make sure that sysconfig._config_vars is initialized - sysconfig.get_config_vars() + sysconfig_vars = { + 'AR': 'sc_ar', + 'CC': 'sc_cc', + 'CXX': 'sc_cxx', + 'ARFLAGS': '--sc-arflags', + 'CFLAGS': '--sc-cflags', + 'CCSHARED': '--sc-ccshared', + 'LDSHARED': 'sc_ldshared', + 'SO': 'sc_shutil_suffix', + } comp = compiler() - with swap_item(sysconfig._config_vars, 'CFLAGS', '--sysconfig-cflags'): + old_vars = dict(sysconfig._config_vars) + try: + for key, value in sysconfig_vars.items(): + sysconfig._config_vars[key] = value sysconfig.customize_compiler(comp) - self.assertEqual(comp.exes['archiver'], 'my_ar --myarflags') - self.assertEqual(comp.exes['compiler'], 'my_cc --sysconfig-cflags --mycflags') + finally: + sysconfig._config_vars.clear() + sysconfig._config_vars.update(old_vars) + + return comp + + @unittest.skipUnless(get_default_compiler() == 'unix', + 'not testing if default compiler is not unix') + def test_customize_compiler(self): + # Make sure that sysconfig._config_vars is initialized + sysconfig.get_config_vars() + + os.environ['AR'] = 'env_ar' + os.environ['CC'] = 'env_cc' + os.environ['CPP'] = 'env_cpp' + os.environ['CXX'] = 'env_cxx --env-cxx-flags' + os.environ['LDSHARED'] = 'env_ldshared' + os.environ['LDFLAGS'] = '--env-ldflags' + os.environ['ARFLAGS'] = '--env-arflags' + os.environ['CFLAGS'] = '--env-cflags' + os.environ['CPPFLAGS'] = '--env-cppflags' + + comp = self.customize_compiler() + self.assertEqual(comp.exes['archiver'], + 'env_ar --env-arflags') + self.assertEqual(comp.exes['preprocessor'], + 'env_cpp --env-cppflags') + self.assertEqual(comp.exes['compiler'], + 'env_cc --sc-cflags --env-cflags --env-cppflags') + self.assertEqual(comp.exes['compiler_so'], + ('env_cc --sc-cflags ' + '--env-cflags ''--env-cppflags --sc-ccshared')) + self.assertEqual(comp.exes['compiler_cxx'], + 'env_cxx --env-cxx-flags') + self.assertEqual(comp.exes['linker_exe'], + 'env_cc') + self.assertEqual(comp.exes['linker_so'], + ('env_ldshared --env-ldflags --env-cflags' + ' --env-cppflags')) + self.assertEqual(comp.shared_lib_extension, 'sc_shutil_suffix') + + del os.environ['AR'] + del os.environ['CC'] + del os.environ['CPP'] + del os.environ['CXX'] + del os.environ['LDSHARED'] + del os.environ['LDFLAGS'] + del os.environ['ARFLAGS'] + del os.environ['CFLAGS'] + del os.environ['CPPFLAGS'] + + comp = self.customize_compiler() + self.assertEqual(comp.exes['archiver'], + 'sc_ar --sc-arflags') + self.assertEqual(comp.exes['preprocessor'], + 'sc_cc -E') + self.assertEqual(comp.exes['compiler'], + 'sc_cc --sc-cflags') + self.assertEqual(comp.exes['compiler_so'], + 'sc_cc --sc-cflags --sc-ccshared') + self.assertEqual(comp.exes['compiler_cxx'], + 'sc_cxx') + self.assertEqual(comp.exes['linker_exe'], + 'sc_cc') + self.assertEqual(comp.exes['linker_so'], + 'sc_ldshared') + self.assertEqual(comp.shared_lib_extension, 'sc_shutil_suffix') def test_parse_makefile_base(self): self.makefile = test.test_support.TESTFN From webhook-mailer at python.org Mon Mar 18 13:59:35 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 18 Mar 2019 17:59:35 -0000 Subject: [Python-checkins] bpo-36292: Mark unreachable code as such in long bitwise ops (GH-12333) Message-ID: https://github.com/python/cpython/commit/a10d426bab66a4e1f20d5e1b9aee3dbb435cf309 commit: a10d426bab66a4e1f20d5e1b9aee3dbb435cf309 branch: master author: stratakis committer: Victor Stinner date: 2019-03-18T18:59:20+01:00 summary: bpo-36292: Mark unreachable code as such in long bitwise ops (GH-12333) files: M Objects/longobject.c diff --git a/Objects/longobject.c b/Objects/longobject.c index 1e3445c64a6a..da697a784faa 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -4637,8 +4637,7 @@ long_bitwise(PyLongObject *a, size_z = negb ? size_b : size_a; break; default: - PyErr_BadArgument(); - return NULL; + Py_UNREACHABLE(); } /* We allow an extra digit if z is negative, to make sure that @@ -4665,8 +4664,7 @@ long_bitwise(PyLongObject *a, z->ob_digit[i] = a->ob_digit[i] ^ b->ob_digit[i]; break; default: - PyErr_BadArgument(); - return NULL; + Py_UNREACHABLE(); } /* Copy any remaining digits of a, inverting if necessary. */ From webhook-mailer at python.org Mon Mar 18 14:11:35 2019 From: webhook-mailer at python.org (Julien Palard) Date: Mon, 18 Mar 2019 18:11:35 -0000 Subject: [Python-checkins] [2.7] bpo-35605: Fix documentation build for sphinx<1.6 (GH-12413) Message-ID: https://github.com/python/cpython/commit/869652b426bb34a30ce7b39f0a0ac242ed5b1016 commit: 869652b426bb34a30ce7b39f0a0ac242ed5b1016 branch: 2.7 author: Julien Palard committer: GitHub date: 2019-03-18T19:11:30+01:00 summary: [2.7] bpo-35605: Fix documentation build for sphinx<1.6 (GH-12413) (cherry picked from commit dfc8fc15fa989acba3c372572e52bbcb5ab38a37) files: A Misc/NEWS.d/next/Documentation/2018-12-30-09-56-13.bpo-35605.gAWt32.rst M Doc/conf.py M Doc/tools/extensions/pyspecific.py diff --git a/Doc/conf.py b/Doc/conf.py index 557fe1e72f27..df76b943b794 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -57,7 +57,7 @@ # Custom sidebar templates, filenames relative to this file. html_sidebars = { - 'index': 'indexsidebar.html', + 'index': ['indexsidebar.html'], } # Additional templates that should be rendered to pages. diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index 6378f76bdc2c..1ec88c23e01b 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -15,7 +15,6 @@ from docutils import nodes, utils from docutils.parsers.rst import Directive -from sphinx.util import status_iterator from sphinx.util.nodes import split_explicit_title from sphinx.writers.html import HTMLTranslator from sphinx.writers.latex import LaTeXTranslator @@ -173,6 +172,11 @@ def get_target_uri(self, docname, typ=None): return '' # no URIs def write(self, *ignored): + try: # sphinx>=1.6 + from sphinx.util import status_iterator + except ImportError: # sphinx<1.6 + status_iterator = self.status_iterator + writer = TextWriter(self) for label in status_iterator(pydoc_topic_labels, 'building topics... ', diff --git a/Misc/NEWS.d/next/Documentation/2018-12-30-09-56-13.bpo-35605.gAWt32.rst b/Misc/NEWS.d/next/Documentation/2018-12-30-09-56-13.bpo-35605.gAWt32.rst new file mode 100644 index 000000000000..cbc0f1e07f31 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2018-12-30-09-56-13.bpo-35605.gAWt32.rst @@ -0,0 +1 @@ +Fix documentation build for sphinx<1.6. Patch by Anthony Sottile. From webhook-mailer at python.org Mon Mar 18 17:24:32 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 18 Mar 2019 21:24:32 -0000 Subject: [Python-checkins] bpo-36301: Fix Py_Main() memory leaks (GH-12420) Message-ID: https://github.com/python/cpython/commit/c183444f7e2640b054956474d71aae6e8d31a543 commit: c183444f7e2640b054956474d71aae6e8d31a543 branch: master author: Victor Stinner committer: GitHub date: 2019-03-18T22:24:28+01:00 summary: bpo-36301: Fix Py_Main() memory leaks (GH-12420) bpo-36301, bpo-36333: * Fix memory allocator used by _PyPathConfig_ClearGlobal(): force the default allocator. * _PyPreConfig_ReadFromArgv(): free init_ctype_locale memory. * pymain_main(): call pymain_free() on init error Co-Authored-By: St?phane Wirtel files: M Modules/main.c M Python/pathconfig.c M Python/preconfig.c diff --git a/Modules/main.c b/Modules/main.c index 5c7f7e45673a..50fecc9103d9 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -888,13 +888,13 @@ pymain_main(_PyArgv *args) PyInterpreterState *interp; err = pymain_init(args, &interp); if (_Py_INIT_FAILED(err)) { - _Py_ExitInitError(err); + goto exit_init_error; } int exitcode = 0; err = pymain_run_python(interp, &exitcode); if (_Py_INIT_FAILED(err)) { - _Py_ExitInitError(err); + goto exit_init_error; } if (Py_FinalizeEx() < 0) { @@ -910,6 +910,10 @@ pymain_main(_PyArgv *args) } return exitcode; + +exit_init_error: + pymain_free(); + _Py_ExitInitError(err); } diff --git a/Python/pathconfig.c b/Python/pathconfig.c index fb2d19e2797a..0ee87c42525f 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -149,7 +149,12 @@ _PyPathConfig_SetGlobal(const _PyPathConfig *config) void _PyPathConfig_ClearGlobal(void) { + PyMemAllocatorEx old_alloc; + _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); + _PyPathConfig_Clear(&_Py_path_config); + + PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); } diff --git a/Python/preconfig.c b/Python/preconfig.c index a86ece57cfce..1efc7ee5c56e 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -758,6 +758,7 @@ _PyPreConfig_ReadFromArgv(_PyPreConfig *config, const _PyArgv *args) done: if (init_ctype_locale != NULL) { setlocale(LC_CTYPE, init_ctype_locale); + PyMem_RawFree(init_ctype_locale); } _PyPreConfig_Clear(&save_config); Py_UTF8Mode = init_utf8_mode ; From webhook-mailer at python.org Mon Mar 18 18:55:06 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 18 Mar 2019 22:55:06 -0000 Subject: [Python-checkins] bpo-36352: Add error handling to getpath.c (GH-12421) Message-ID: https://github.com/python/cpython/commit/7b14f0c02ce9d919c503119db190dbca0e703393 commit: 7b14f0c02ce9d919c503119db190dbca0e703393 branch: master author: Victor Stinner committer: GitHub date: 2019-03-18T23:54:59+01:00 summary: bpo-36352: Add error handling to getpath.c (GH-12421) Replace Py_FatalError() with _PyInitError to let the caller handle the fatal error. files: M Modules/getpath.c diff --git a/Modules/getpath.c b/Modules/getpath.c index 18df795c93fc..4dafc8b24e46 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -117,6 +117,8 @@ extern "C" { ? _Py_INIT_USER_ERR("cannot decode " NAME) \ : _Py_INIT_NO_MEMORY() +#define PATHLEN_ERR() _Py_INIT_USER_ERR("path configuration: path too long") + typedef struct { wchar_t *path_env; /* PATH environment variable */ @@ -237,7 +239,7 @@ isdir(wchar_t *filename) than MAXPATHLEN characters at exit. If stuff is too long, only as much of stuff as fits will be appended. */ -static void +static _PyInitError joinpath(wchar_t *buffer, wchar_t *stuff) { size_t n, k; @@ -251,7 +253,7 @@ joinpath(wchar_t *buffer, wchar_t *stuff) } } if (n > MAXPATHLEN) { - Py_FatalError("buffer overflow in getpath.c's joinpath()"); + return PATHLEN_ERR(); } k = wcslen(stuff); if (n + k > MAXPATHLEN) { @@ -259,12 +261,13 @@ joinpath(wchar_t *buffer, wchar_t *stuff) } wcsncpy(buffer+n, stuff, k); buffer[n+k] = '\0'; + return _Py_INIT_OK(); } /* copy_absolute requires that path be allocated at least MAXPATHLEN + 1 bytes and that p be no more than MAXPATHLEN bytes. */ -static void +static _PyInitError copy_absolute(wchar_t *path, wchar_t *p, size_t pathlen) { if (p[0] == SEP) { @@ -274,27 +277,36 @@ copy_absolute(wchar_t *path, wchar_t *p, size_t pathlen) if (!_Py_wgetcwd(path, pathlen)) { /* unable to get the current directory */ wcscpy(path, p); - return; + return _Py_INIT_OK(); } if (p[0] == '.' && p[1] == SEP) { p += 2; } - joinpath(path, p); + _PyInitError err = joinpath(path, p); + if (_Py_INIT_FAILED(err)) { + return err; + } } + return _Py_INIT_OK(); } /* absolutize() requires that path be allocated at least MAXPATHLEN+1 bytes. */ -static void +static _PyInitError absolutize(wchar_t *path) { wchar_t buffer[MAXPATHLEN+1]; if (path[0] == SEP) { - return; + return _Py_INIT_OK(); + } + + _PyInitError err = copy_absolute(buffer, path, MAXPATHLEN+1); + if (_Py_INIT_FAILED(err)) { + return err; } - copy_absolute(buffer, path, MAXPATHLEN+1); wcscpy(path, buffer); + return _Py_INIT_OK(); } @@ -307,7 +319,7 @@ absolutize(wchar_t *path) #define EXE_SUFFIX L".exe" #endif -static void +static _PyInitError add_exe_suffix(wchar_t *progpath) { /* Check for already have an executable suffix */ @@ -315,7 +327,7 @@ add_exe_suffix(wchar_t *progpath) size_t s = wcslen(EXE_SUFFIX); if (wcsncasecmp(EXE_SUFFIX, progpath+n-s, s) != 0) { if (n + s > MAXPATHLEN) { - Py_FatalError("progpath overflow in getpath.c's add_exe_suffix()"); + return PATHLEN_ERR(); } /* Save original path for revert */ wchar_t orig[MAXPATHLEN+1]; @@ -329,6 +341,7 @@ add_exe_suffix(wchar_t *progpath) wcsncpy(progpath, orig, MAXPATHLEN); } } + return _Py_INIT_OK(); } #endif @@ -336,10 +349,11 @@ add_exe_suffix(wchar_t *progpath) /* search_for_prefix requires that argv0_path be no more than MAXPATHLEN bytes long. */ -static int +static _PyInitError search_for_prefix(const _PyCoreConfig *core_config, - PyCalculatePath *calculate, wchar_t *prefix) + PyCalculatePath *calculate, wchar_t *prefix, int *found) { + _PyInitError err; size_t n; wchar_t *vpath; @@ -351,39 +365,74 @@ search_for_prefix(const _PyCoreConfig *core_config, if (delim) { *delim = L'\0'; } - joinpath(prefix, calculate->lib_python); - joinpath(prefix, LANDMARK); - return 1; + err = joinpath(prefix, calculate->lib_python); + if (_Py_INIT_FAILED(err)) { + return err; + } + err = joinpath(prefix, LANDMARK); + if (_Py_INIT_FAILED(err)) { + return err; + } + *found = 1; + return _Py_INIT_OK(); } /* Check to see if argv[0] is in the build directory */ wcsncpy(prefix, calculate->argv0_path, MAXPATHLEN); prefix[MAXPATHLEN] = L'\0'; - joinpath(prefix, L"Modules/Setup.local"); + err = joinpath(prefix, L"Modules/Setup.local"); + if (_Py_INIT_FAILED(err)) { + return err; + } + if (isfile(prefix)) { /* Check VPATH to see if argv0_path is in the build directory. */ vpath = Py_DecodeLocale(VPATH, NULL); if (vpath != NULL) { wcsncpy(prefix, calculate->argv0_path, MAXPATHLEN); prefix[MAXPATHLEN] = L'\0'; - joinpath(prefix, vpath); + err = joinpath(prefix, vpath); PyMem_RawFree(vpath); - joinpath(prefix, L"Lib"); - joinpath(prefix, LANDMARK); + if (_Py_INIT_FAILED(err)) { + return err; + } + + err = joinpath(prefix, L"Lib"); + if (_Py_INIT_FAILED(err)) { + return err; + } + err = joinpath(prefix, LANDMARK); + if (_Py_INIT_FAILED(err)) { + return err; + } + if (ismodule(prefix)) { - return -1; + *found = -1; + return _Py_INIT_OK(); } } } /* Search from argv0_path, until root is found */ - copy_absolute(prefix, calculate->argv0_path, MAXPATHLEN+1); + err = copy_absolute(prefix, calculate->argv0_path, MAXPATHLEN+1); + if (_Py_INIT_FAILED(err)) { + return err; + } + do { n = wcslen(prefix); - joinpath(prefix, calculate->lib_python); - joinpath(prefix, LANDMARK); + err = joinpath(prefix, calculate->lib_python); + if (_Py_INIT_FAILED(err)) { + return err; + } + err = joinpath(prefix, LANDMARK); + if (_Py_INIT_FAILED(err)) { + return err; + } + if (ismodule(prefix)) { - return 1; + *found = 1; + return _Py_INIT_OK(); } prefix[n] = L'\0'; reduce(prefix); @@ -392,33 +441,52 @@ search_for_prefix(const _PyCoreConfig *core_config, /* Look at configure's PREFIX */ wcsncpy(prefix, calculate->prefix, MAXPATHLEN); prefix[MAXPATHLEN] = L'\0'; - joinpath(prefix, calculate->lib_python); - joinpath(prefix, LANDMARK); + err = joinpath(prefix, calculate->lib_python); + if (_Py_INIT_FAILED(err)) { + return err; + } + err = joinpath(prefix, LANDMARK); + if (_Py_INIT_FAILED(err)) { + return err; + } + if (ismodule(prefix)) { - return 1; + *found = 1; + return _Py_INIT_OK(); } /* Fail */ - return 0; + *found = 0; + return _Py_INIT_OK(); } -static void +static _PyInitError calculate_prefix(const _PyCoreConfig *core_config, PyCalculatePath *calculate, wchar_t *prefix) { - calculate->prefix_found = search_for_prefix(core_config, calculate, prefix); + _PyInitError err; + + err = search_for_prefix(core_config, calculate, prefix, &calculate->prefix_found); + if (_Py_INIT_FAILED(err)) { + return err; + } + if (!calculate->prefix_found) { if (!core_config->_frozen) { fprintf(stderr, "Could not find platform independent libraries \n"); } wcsncpy(prefix, calculate->prefix, MAXPATHLEN); - joinpath(prefix, calculate->lib_python); + err = joinpath(prefix, calculate->lib_python); + if (_Py_INIT_FAILED(err)) { + return err; + } } else { reduce(prefix); } + return _Py_INIT_OK(); } @@ -448,10 +516,12 @@ calculate_reduce_prefix(PyCalculatePath *calculate, wchar_t *prefix) /* search_for_exec_prefix requires that argv0_path be no more than MAXPATHLEN bytes long. */ -static int +static _PyInitError search_for_exec_prefix(const _PyCoreConfig *core_config, - PyCalculatePath *calculate, wchar_t *exec_prefix) + PyCalculatePath *calculate, wchar_t *exec_prefix, + int *found) { + _PyInitError err; size_t n; /* If PYTHONHOME is set, we believe it unconditionally */ @@ -464,9 +534,16 @@ search_for_exec_prefix(const _PyCoreConfig *core_config, wcsncpy(exec_prefix, core_config->home, MAXPATHLEN); } exec_prefix[MAXPATHLEN] = L'\0'; - joinpath(exec_prefix, calculate->lib_python); - joinpath(exec_prefix, L"lib-dynload"); - return 1; + err = joinpath(exec_prefix, calculate->lib_python); + if (_Py_INIT_FAILED(err)) { + return err; + } + err = joinpath(exec_prefix, L"lib-dynload"); + if (_Py_INIT_FAILED(err)) { + return err; + } + *found = 1; + return _Py_INIT_OK(); } /* Check to see if argv[0] is in the build directory. "pybuilddir.txt" @@ -474,7 +551,11 @@ search_for_exec_prefix(const _PyCoreConfig *core_config, of shared library modules. */ wcsncpy(exec_prefix, calculate->argv0_path, MAXPATHLEN); exec_prefix[MAXPATHLEN] = L'\0'; - joinpath(exec_prefix, L"pybuilddir.txt"); + err = joinpath(exec_prefix, L"pybuilddir.txt"); + if (_Py_INIT_FAILED(err)) { + return err; + } + if (isfile(exec_prefix)) { FILE *f = _Py_wfopen(exec_prefix, L"rb"); if (f == NULL) { @@ -490,21 +571,37 @@ search_for_exec_prefix(const _PyCoreConfig *core_config, if (rel_builddir_path) { wcsncpy(exec_prefix, calculate->argv0_path, MAXPATHLEN); exec_prefix[MAXPATHLEN] = L'\0'; - joinpath(exec_prefix, rel_builddir_path); + err = joinpath(exec_prefix, rel_builddir_path); PyMem_RawFree(rel_builddir_path ); - return -1; + if (_Py_INIT_FAILED(err)) { + return err; + } + + *found = -1; + return _Py_INIT_OK(); } } } /* Search from argv0_path, until root is found */ - copy_absolute(exec_prefix, calculate->argv0_path, MAXPATHLEN+1); + err = copy_absolute(exec_prefix, calculate->argv0_path, MAXPATHLEN+1); + if (_Py_INIT_FAILED(err)) { + return err; + } + do { n = wcslen(exec_prefix); - joinpath(exec_prefix, calculate->lib_python); - joinpath(exec_prefix, L"lib-dynload"); + err = joinpath(exec_prefix, calculate->lib_python); + if (_Py_INIT_FAILED(err)) { + return err; + } + err = joinpath(exec_prefix, L"lib-dynload"); + if (_Py_INIT_FAILED(err)) { + return err; + } if (isdir(exec_prefix)) { - return 1; + *found = 1; + return _Py_INIT_OK(); } exec_prefix[n] = L'\0'; reduce(exec_prefix); @@ -513,33 +610,50 @@ search_for_exec_prefix(const _PyCoreConfig *core_config, /* Look at configure's EXEC_PREFIX */ wcsncpy(exec_prefix, calculate->exec_prefix, MAXPATHLEN); exec_prefix[MAXPATHLEN] = L'\0'; - joinpath(exec_prefix, calculate->lib_python); - joinpath(exec_prefix, L"lib-dynload"); + err = joinpath(exec_prefix, calculate->lib_python); + if (_Py_INIT_FAILED(err)) { + return err; + } + err = joinpath(exec_prefix, L"lib-dynload"); + if (_Py_INIT_FAILED(err)) { + return err; + } if (isdir(exec_prefix)) { - return 1; + *found = 1; + return _Py_INIT_OK(); } /* Fail */ - return 0; + *found = 0; + return _Py_INIT_OK(); } -static void +static _PyInitError calculate_exec_prefix(const _PyCoreConfig *core_config, PyCalculatePath *calculate, wchar_t *exec_prefix) { - calculate->exec_prefix_found = search_for_exec_prefix(core_config, - calculate, - exec_prefix); + _PyInitError err; + + err = search_for_exec_prefix(core_config, calculate, exec_prefix, + &calculate->exec_prefix_found); + if (_Py_INIT_FAILED(err)) { + return err; + } + if (!calculate->exec_prefix_found) { if (!core_config->_frozen) { fprintf(stderr, "Could not find platform dependent libraries \n"); } wcsncpy(exec_prefix, calculate->exec_prefix, MAXPATHLEN); - joinpath(exec_prefix, L"lib/lib-dynload"); + err = joinpath(exec_prefix, L"lib/lib-dynload"); + if (_Py_INIT_FAILED(err)) { + return err; + } } /* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */ + return _Py_INIT_OK(); } @@ -564,6 +678,7 @@ static _PyInitError calculate_program_full_path(const _PyCoreConfig *core_config, PyCalculatePath *calculate, _PyPathConfig *config) { + _PyInitError err; wchar_t program_full_path[MAXPATHLEN+1]; memset(program_full_path, 0, sizeof(program_full_path)); @@ -624,7 +739,11 @@ calculate_program_full_path(const _PyCoreConfig *core_config, wcsncpy(program_full_path, path, MAXPATHLEN); } - joinpath(program_full_path, core_config->program_name); + err = joinpath(program_full_path, core_config->program_name); + if (_Py_INIT_FAILED(err)) { + return err; + } + if (isxfile(program_full_path)) { break; } @@ -640,7 +759,10 @@ calculate_program_full_path(const _PyCoreConfig *core_config, program_full_path[0] = '\0'; } if (program_full_path[0] != SEP && program_full_path[0] != '\0') { - absolutize(program_full_path); + err = absolutize(program_full_path); + if (_Py_INIT_FAILED(err)) { + return err; + } } #if defined(__CYGWIN__) || defined(__MINGW32__) /* For these platforms it is necessary to ensure that the .exe suffix @@ -649,7 +771,10 @@ calculate_program_full_path(const _PyCoreConfig *core_config, * path (bpo-28441). */ if (program_full_path[0] != '\0') { - add_exe_suffix(program_full_path); + err = add_exe_suffix(program_full_path); + if (_Py_INIT_FAILED(err)) { + return err; + } } #endif @@ -687,6 +812,7 @@ calculate_argv0_path(PyCalculatePath *calculate, const wchar_t *program_full_pat ** be running the interpreter in the build directory, so we use the ** build-directory-specific logic to find Lib and such. */ + _PyInitError err; size_t len; wchar_t* wbuf = Py_DecodeLocale(modPath, &len); if (wbuf == NULL) { @@ -695,8 +821,16 @@ calculate_argv0_path(PyCalculatePath *calculate, const wchar_t *program_full_pat wcsncpy(calculate->argv0_path, wbuf, MAXPATHLEN); reduce(calculate->argv0_path); - joinpath(calculate->argv0_path, calculate->lib_python); - joinpath(calculate->argv0_path, LANDMARK); + err = joinpath(calculate->argv0_path, calculate->lib_python); + if (_Py_INIT_FAILED(err)) { + PyMem_RawFree(wbuf); + return err; + } + err = joinpath(calculate->argv0_path, LANDMARK); + if (_Py_INIT_FAILED(err)) { + PyMem_RawFree(wbuf); + return err; + } if (!ismodule(calculate->argv0_path)) { /* We are in the build directory so use the name of the executable - we know that the absolute path is passed */ @@ -721,8 +855,12 @@ calculate_argv0_path(PyCalculatePath *calculate, const wchar_t *program_full_pat } else { /* Interpret relative to program_full_path */ + _PyInitError err; reduce(calculate->argv0_path); - joinpath(calculate->argv0_path, tmpbuffer); + err = joinpath(calculate->argv0_path, tmpbuffer); + if (_Py_INIT_FAILED(err)) { + return err; + } } linklen = _Py_wreadlink(calculate->argv0_path, tmpbuffer, MAXPATHLEN); } @@ -739,23 +877,30 @@ calculate_argv0_path(PyCalculatePath *calculate, const wchar_t *program_full_pat executable's directory and then in the parent directory. If found, open it for use when searching for prefixes. */ -static void +static _PyInitError calculate_read_pyenv(PyCalculatePath *calculate) { + _PyInitError err; wchar_t tmpbuffer[MAXPATHLEN+1]; wchar_t *env_cfg = L"pyvenv.cfg"; FILE *env_file; wcscpy(tmpbuffer, calculate->argv0_path); - joinpath(tmpbuffer, env_cfg); + err = joinpath(tmpbuffer, env_cfg); + if (_Py_INIT_FAILED(err)) { + return err; + } env_file = _Py_wfopen(tmpbuffer, L"r"); if (env_file == NULL) { errno = 0; reduce(tmpbuffer); reduce(tmpbuffer); - joinpath(tmpbuffer, env_cfg); + err = joinpath(tmpbuffer, env_cfg); + if (_Py_INIT_FAILED(err)) { + return err; + } env_file = _Py_wfopen(tmpbuffer, L"r"); if (env_file == NULL) { @@ -764,7 +909,7 @@ calculate_read_pyenv(PyCalculatePath *calculate) } if (env_file == NULL) { - return; + return _Py_INIT_OK(); } /* Look for a 'home' variable and set argv0_path to it, if found */ @@ -772,12 +917,14 @@ calculate_read_pyenv(PyCalculatePath *calculate) wcscpy(calculate->argv0_path, tmpbuffer); } fclose(env_file); + return _Py_INIT_OK(); } -static void +static _PyInitError calculate_zip_path(PyCalculatePath *calculate, const wchar_t *prefix) { + _PyInitError err; wcsncpy(calculate->zip_path, prefix, MAXPATHLEN); calculate->zip_path[MAXPATHLEN] = L'\0'; @@ -789,12 +936,16 @@ calculate_zip_path(PyCalculatePath *calculate, const wchar_t *prefix) else { wcsncpy(calculate->zip_path, calculate->prefix, MAXPATHLEN); } - joinpath(calculate->zip_path, L"lib/python00.zip"); + err = joinpath(calculate->zip_path, L"lib/python00.zip"); + if (_Py_INIT_FAILED(err)) { + return err; + } /* Replace "00" with version */ size_t bufsz = wcslen(calculate->zip_path); calculate->zip_path[bufsz - 6] = VERSION[0]; calculate->zip_path[bufsz - 5] = VERSION[2]; + return _Py_INIT_OK(); } @@ -949,17 +1100,29 @@ calculate_path_impl(const _PyCoreConfig *core_config, return err; } - calculate_read_pyenv(calculate); + err = calculate_read_pyenv(calculate); + if (_Py_INIT_FAILED(err)) { + return err; + } wchar_t prefix[MAXPATHLEN+1]; memset(prefix, 0, sizeof(prefix)); - calculate_prefix(core_config, calculate, prefix); + err = calculate_prefix(core_config, calculate, prefix); + if (_Py_INIT_FAILED(err)) { + return err; + } - calculate_zip_path(calculate, prefix); + err = calculate_zip_path(calculate, prefix); + if (_Py_INIT_FAILED(err)) { + return err; + } wchar_t exec_prefix[MAXPATHLEN+1]; memset(exec_prefix, 0, sizeof(exec_prefix)); - calculate_exec_prefix(core_config, calculate, exec_prefix); + err = calculate_exec_prefix(core_config, calculate, exec_prefix); + if (_Py_INIT_FAILED(err)) { + return err; + } if ((!calculate->prefix_found || !calculate->exec_prefix_found) && !core_config->_frozen) @@ -995,10 +1158,11 @@ calculate_path_impl(const _PyCoreConfig *core_config, _PyInitError _PyPathConfig_Calculate_impl(_PyPathConfig *config, const _PyCoreConfig *core_config) { + _PyInitError err; PyCalculatePath calculate; memset(&calculate, 0, sizeof(calculate)); - _PyInitError err = calculate_init(&calculate, core_config); + err = calculate_init(&calculate, core_config); if (_Py_INIT_FAILED(err)) { goto done; } From webhook-mailer at python.org Mon Mar 18 20:46:28 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 19 Mar 2019 00:46:28 -0000 Subject: [Python-checkins] bpo-36301: Error if decoding pybuilddir.txt fails (GH-12422) Message-ID: https://github.com/python/cpython/commit/5f9cf23502febe0eb3bc02e45c7d2bfc79424757 commit: 5f9cf23502febe0eb3bc02e45c7d2bfc79424757 branch: master author: Victor Stinner committer: GitHub date: 2019-03-19T01:46:25+01:00 summary: bpo-36301: Error if decoding pybuilddir.txt fails (GH-12422) Python initialization now fails if decoding pybuilddir.txt configuration file fails at startup. _PyPathConfig_Calculate() now reports memory allocation failure and decoding error on decoding pybuilddir.txt content from UTF-8/surrogateescape. files: A Misc/NEWS.d/next/Core and Builtins/2019-03-19-00-54-31.bpo-36301.xvOCJb.rst M Include/internal/pycore_fileutils.h M Modules/getpath.c M Objects/unicodeobject.c M Python/pathconfig.c diff --git a/Include/internal/pycore_fileutils.h b/Include/internal/pycore_fileutils.h index 23ae2013c0ee..bbee58617fd0 100644 --- a/Include/internal/pycore_fileutils.h +++ b/Include/internal/pycore_fileutils.h @@ -30,7 +30,8 @@ PyAPI_FUNC(int) _Py_EncodeUTF8Ex( PyAPI_FUNC(wchar_t*) _Py_DecodeUTF8_surrogateescape( const char *arg, - Py_ssize_t arglen); + Py_ssize_t arglen, + size_t *wlen); PyAPI_FUNC(int) _Py_GetForceASCII(void); diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-19-00-54-31.bpo-36301.xvOCJb.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-19-00-54-31.bpo-36301.xvOCJb.rst new file mode 100644 index 000000000000..84e4b8a85233 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-19-00-54-31.bpo-36301.xvOCJb.rst @@ -0,0 +1,2 @@ +Python initialization now fails if decoding ``pybuilddir.txt`` configuration +file fails at startup. diff --git a/Modules/getpath.c b/Modules/getpath.c index 4dafc8b24e46..436431749494 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -563,23 +563,27 @@ search_for_exec_prefix(const _PyCoreConfig *core_config, } else { char buf[MAXPATHLEN+1]; - wchar_t *rel_builddir_path; n = fread(buf, 1, MAXPATHLEN, f); buf[n] = '\0'; fclose(f); - rel_builddir_path = _Py_DecodeUTF8_surrogateescape(buf, n); - if (rel_builddir_path) { - wcsncpy(exec_prefix, calculate->argv0_path, MAXPATHLEN); - exec_prefix[MAXPATHLEN] = L'\0'; - err = joinpath(exec_prefix, rel_builddir_path); - PyMem_RawFree(rel_builddir_path ); - if (_Py_INIT_FAILED(err)) { - return err; - } - *found = -1; - return _Py_INIT_OK(); + size_t dec_len; + wchar_t *pybuilddir; + pybuilddir = _Py_DecodeUTF8_surrogateescape(buf, n, &dec_len); + if (!pybuilddir) { + return DECODE_LOCALE_ERR("pybuilddir.txt", dec_len); } + + wcsncpy(exec_prefix, calculate->argv0_path, MAXPATHLEN); + exec_prefix[MAXPATHLEN] = L'\0'; + err = joinpath(exec_prefix, pybuilddir); + PyMem_RawFree(pybuilddir ); + if (_Py_INIT_FAILED(err)) { + return err; + } + + *found = -1; + return _Py_INIT_OK(); } } diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index b3a851a9f814..9d3ed0d18b15 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -5064,12 +5064,21 @@ _Py_DecodeUTF8Ex(const char *s, Py_ssize_t size, wchar_t **wstr, size_t *wlen, return 0; } + wchar_t* -_Py_DecodeUTF8_surrogateescape(const char *arg, Py_ssize_t arglen) +_Py_DecodeUTF8_surrogateescape(const char *arg, Py_ssize_t arglen, + size_t *wlen) { wchar_t *wstr; - int res = _Py_DecodeUTF8Ex(arg, arglen, &wstr, NULL, NULL, 1); + int res = _Py_DecodeUTF8Ex(arg, arglen, + &wstr, wlen, + NULL, _Py_ERROR_SURROGATEESCAPE); if (res != 0) { + /* _Py_DecodeUTF8Ex() must support _Py_ERROR_SURROGATEESCAPE */ + assert(res != -3); + if (wlen) { + *wlen = (size_t)res; + } return NULL; } return wstr; diff --git a/Python/pathconfig.c b/Python/pathconfig.c index 0ee87c42525f..87db66b7528c 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -712,7 +712,7 @@ _Py_FindEnvConfigValue(FILE *env_file, const wchar_t *key, continue; } - wchar_t *tmpbuffer = _Py_DecodeUTF8_surrogateescape(buffer, n); + wchar_t *tmpbuffer = _Py_DecodeUTF8_surrogateescape(buffer, n, NULL); if (tmpbuffer) { wchar_t * state; wchar_t * tok = WCSTOK(tmpbuffer, L" \t\r\n", &state); From webhook-mailer at python.org Mon Mar 18 21:56:32 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 19 Mar 2019 01:56:32 -0000 Subject: [Python-checkins] bpo-36337: socket.send()/sendall() use Py_ssize_t (GH-12397) Message-ID: https://github.com/python/cpython/commit/f70b884ad70e2ce762842ae469f88bd48fe13998 commit: f70b884ad70e2ce762842ae469f88bd48fe13998 branch: 2.7 author: St?phane Wirtel committer: Victor Stinner date: 2019-03-19T02:56:28+01:00 summary: bpo-36337: socket.send()/sendall() use Py_ssize_t (GH-12397) Fix buffer overflow in send() and sendall() methods of socket.socket for data larger than 2 GiB. files: A Misc/NEWS.d/next/Library/2019-03-18-10-08-30.bpo-36337.QhJnXy.rst M Modules/socketmodule.c diff --git a/Misc/NEWS.d/next/Library/2019-03-18-10-08-30.bpo-36337.QhJnXy.rst b/Misc/NEWS.d/next/Library/2019-03-18-10-08-30.bpo-36337.QhJnXy.rst new file mode 100644 index 000000000000..07cd8e2bd611 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-18-10-08-30.bpo-36337.QhJnXy.rst @@ -0,0 +1,3 @@ +Fix buffer overflow in :meth:`~socket.socket.send` and +:meth:`~socket.socket.sendall` methods of :func:`socket.socket` for data larger +than 2 GiB. diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 013975455c45..4d5a8f6f0170 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -625,16 +625,16 @@ set_gaierror(int error) #ifdef __VMS /* Function to send in segments */ -static int -sendsegmented(int sock_fd, char *buf, int len, int flags) +static Py_ssize_t +sendsegmented(int sock_fd, char *buf, Py_ssize_t len, int flags) { int n = 0; - int remaining = len; + Py_ssize_t remaining = len; while (remaining > 0) { unsigned int segment; - segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining); + segment = ((size_t)remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : (unsigned int) remaining); n = send(sock_fd, buf, segment, flags); if (n < 0) { return n; @@ -2797,7 +2797,8 @@ static PyObject * sock_send(PySocketSockObject *s, PyObject *args) { char *buf; - int len, n = -1, flags = 0, timeout; + int flags = 0, timeout; + Py_ssize_t len, n = -1; Py_buffer pbuf; if (!PyArg_ParseTuple(args, "s*|i:send", &pbuf, &flags)) @@ -2813,12 +2814,18 @@ sock_send(PySocketSockObject *s, PyObject *args) BEGIN_SELECT_LOOP(s) Py_BEGIN_ALLOW_THREADS timeout = internal_select_ex(s, 1, interval); - if (!timeout) + if (!timeout) { #ifdef __VMS n = sendsegmented(s->sock_fd, buf, len, flags); +#elif defined(MS_WINDOWS) + if (len > INT_MAX) { + len = INT_MAX; + } + n = send(s->sock_fd, buf, (int)len, flags); #else n = send(s->sock_fd, buf, len, flags); #endif + } Py_END_ALLOW_THREADS if (timeout == 1) { PyBuffer_Release(&pbuf); @@ -2830,7 +2837,7 @@ sock_send(PySocketSockObject *s, PyObject *args) PyBuffer_Release(&pbuf); if (n < 0) return s->errorhandler(); - return PyInt_FromLong((long)n); + return PyInt_FromSsize_t(n); } PyDoc_STRVAR(send_doc, @@ -2847,7 +2854,8 @@ static PyObject * sock_sendall(PySocketSockObject *s, PyObject *args) { char *buf; - int len, n = -1, flags = 0, timeout, saved_errno; + int flags = 0, timeout, saved_errno; + Py_ssize_t len, n = -1; Py_buffer pbuf; if (!PyArg_ParseTuple(args, "s*|i:sendall", &pbuf, &flags)) @@ -2868,6 +2876,11 @@ sock_sendall(PySocketSockObject *s, PyObject *args) if (!timeout) { #ifdef __VMS n = sendsegmented(s->sock_fd, buf, len, flags); +#elif defined(MS_WINDOWS) + if (len > INT_MAX) { + len = INT_MAX; + } + n = send(s->sock_fd, buf, (int)len, flags); #else n = send(s->sock_fd, buf, len, flags); #endif From webhook-mailer at python.org Mon Mar 18 21:58:17 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 19 Mar 2019 01:58:17 -0000 Subject: [Python-checkins] bpo-36352: Avoid hardcoded MAXPATHLEN size in getpath.c (GH-12423) Message-ID: https://github.com/python/cpython/commit/faddaedd05ca81a9fed3f315e7bc8dcf455824a2 commit: faddaedd05ca81a9fed3f315e7bc8dcf455824a2 branch: master author: Victor Stinner committer: GitHub date: 2019-03-19T02:58:14+01:00 summary: bpo-36352: Avoid hardcoded MAXPATHLEN size in getpath.c (GH-12423) * Use Py_ARRAY_LENGTH() rather than hardcoded MAXPATHLEN in getpath.c. * Pass string length to functions modifying strings. files: A Misc/NEWS.d/next/Core and Builtins/2019-03-19-02-36-40.bpo-36352.qj2trz.rst M Modules/getpath.c M Python/fileutils.c M Python/pathconfig.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-19-02-36-40.bpo-36352.qj2trz.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-19-02-36-40.bpo-36352.qj2trz.rst new file mode 100644 index 000000000000..148201cd1b6e --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-19-02-36-40.bpo-36352.qj2trz.rst @@ -0,0 +1,2 @@ +Python initialization now fails with an error, rather than silently +truncating paths, if a path is too long. diff --git a/Modules/getpath.c b/Modules/getpath.c index 436431749494..dd188c612893 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -159,14 +159,16 @@ static void reduce(wchar_t *dir) { size_t i = wcslen(dir); - while (i > 0 && dir[i] != SEP) + while (i > 0 && dir[i] != SEP) { --i; + } dir[i] = '\0'; } +/* Is file, not directory */ static int -isfile(wchar_t *filename) /* Is file, not directory */ +isfile(const wchar_t *filename) { struct stat buf; if (_Py_wstat(filename, &buf) != 0) { @@ -179,15 +181,16 @@ isfile(wchar_t *filename) /* Is file, not directory */ } +/* Is module -- check for .pyc too */ static int -ismodule(wchar_t *filename) /* Is module -- check for .pyc too */ +ismodule(wchar_t *filename, size_t filename_len) { if (isfile(filename)) { return 1; } /* Check for the compiled version of prefix. */ - if (wcslen(filename) < MAXPATHLEN) { + if (wcslen(filename) + 2 <= filename_len) { wcscat(filename, L"c"); if (isfile(filename)) { return 1; @@ -199,7 +202,7 @@ ismodule(wchar_t *filename) /* Is module -- check for .pyc too */ /* Is executable file */ static int -isxfile(wchar_t *filename) +isxfile(const wchar_t *filename) { struct stat buf; if (_Py_wstat(filename, &buf) != 0) { @@ -231,58 +234,71 @@ isdir(wchar_t *filename) /* Add a path component, by appending stuff to buffer. - buffer must have at least MAXPATHLEN + 1 bytes allocated, and contain a - NUL-terminated string with no more than MAXPATHLEN characters (not counting - the trailing NUL). It's a fatal error if it contains a string longer than - that (callers must be careful!). If these requirements are met, it's - guaranteed that buffer will still be a NUL-terminated string with no more - than MAXPATHLEN characters at exit. If stuff is too long, only as much of - stuff as fits will be appended. -*/ + buflen: 'buffer' length in characters including trailing NUL. */ static _PyInitError -joinpath(wchar_t *buffer, wchar_t *stuff) +joinpath(wchar_t *buffer, const wchar_t *stuff, size_t buflen) { size_t n, k; - if (stuff[0] == SEP) { - n = 0; - } - else { + if (stuff[0] != SEP) { n = wcslen(buffer); - if (n > 0 && buffer[n-1] != SEP && n < MAXPATHLEN) { + if (n >= buflen) { + return PATHLEN_ERR(); + } + + if (n > 0 && buffer[n-1] != SEP) { buffer[n++] = SEP; } } - if (n > MAXPATHLEN) { - return PATHLEN_ERR(); + else { + n = 0; } + k = wcslen(stuff); - if (n + k > MAXPATHLEN) { - k = MAXPATHLEN - n; + if (n + k >= buflen) { + return PATHLEN_ERR(); } wcsncpy(buffer+n, stuff, k); buffer[n+k] = '\0'; + return _Py_INIT_OK(); } +static inline int +safe_wcscpy(wchar_t *dst, const wchar_t *src, size_t n) +{ + size_t srclen = wcslen(src); + if (n <= srclen) { + dst[0] = L'\0'; + return -1; + } + memcpy(dst, src, (srclen + 1) * sizeof(wchar_t)); + return 0; +} + + /* copy_absolute requires that path be allocated at least - MAXPATHLEN + 1 bytes and that p be no more than MAXPATHLEN bytes. */ + 'pathlen' characters (including trailing NUL). */ static _PyInitError -copy_absolute(wchar_t *path, wchar_t *p, size_t pathlen) +copy_absolute(wchar_t *path, const wchar_t *p, size_t pathlen) { if (p[0] == SEP) { - wcscpy(path, p); + if (safe_wcscpy(path, p, pathlen) < 0) { + return PATHLEN_ERR(); + } } else { if (!_Py_wgetcwd(path, pathlen)) { /* unable to get the current directory */ - wcscpy(path, p); + if (safe_wcscpy(path, p, pathlen) < 0) { + return PATHLEN_ERR(); + } return _Py_INIT_OK(); } if (p[0] == '.' && p[1] == SEP) { p += 2; } - _PyInitError err = joinpath(path, p); + _PyInitError err = joinpath(path, p, pathlen); if (_Py_INIT_FAILED(err)) { return err; } @@ -291,56 +307,54 @@ copy_absolute(wchar_t *path, wchar_t *p, size_t pathlen) } -/* absolutize() requires that path be allocated at least MAXPATHLEN+1 bytes. */ +/* path_len: path length in characters including trailing NUL */ static _PyInitError -absolutize(wchar_t *path) +absolutize(wchar_t *path, size_t path_len) { - wchar_t buffer[MAXPATHLEN+1]; - if (path[0] == SEP) { return _Py_INIT_OK(); } - _PyInitError err = copy_absolute(buffer, path, MAXPATHLEN+1); + wchar_t abs_path[MAXPATHLEN+1]; + _PyInitError err = copy_absolute(abs_path, path, Py_ARRAY_LENGTH(abs_path)); if (_Py_INIT_FAILED(err)) { return err; } - wcscpy(path, buffer); + + if (safe_wcscpy(path, abs_path, path_len) < 0) { + return PATHLEN_ERR(); + } return _Py_INIT_OK(); } #if defined(__CYGWIN__) || defined(__MINGW32__) -/* add_exe_suffix requires that progpath be allocated at least - MAXPATHLEN + 1 bytes. -*/ - #ifndef EXE_SUFFIX #define EXE_SUFFIX L".exe" #endif +/* pathlen: 'path' length in characters including trailing NUL */ static _PyInitError -add_exe_suffix(wchar_t *progpath) +add_exe_suffix(wchar_t *progpath, size_t progpathlen) { /* Check for already have an executable suffix */ size_t n = wcslen(progpath); size_t s = wcslen(EXE_SUFFIX); - if (wcsncasecmp(EXE_SUFFIX, progpath+n-s, s) != 0) { - if (n + s > MAXPATHLEN) { - return PATHLEN_ERR(); - } - /* Save original path for revert */ - wchar_t orig[MAXPATHLEN+1]; - wcsncpy(orig, progpath, MAXPATHLEN); + if (wcsncasecmp(EXE_SUFFIX, progpath + n - s, s) == 0) { + return _Py_INIT_OK(); + } - wcsncpy(progpath+n, EXE_SUFFIX, s); - progpath[n+s] = '\0'; + if (n + s >= progpathlen) { + return PATHLEN_ERR(); + } + wcsncpy(progpath + n, EXE_SUFFIX, s); + progpath[n+s] = '\0'; - if (!isxfile(progpath)) { - /* Path that added suffix is invalid */ - wcsncpy(progpath, orig, MAXPATHLEN); - } + if (!isxfile(progpath)) { + /* Path that added suffix is invalid: truncate (remove suffix) */ + progpath[n] = '\0'; } + return _Py_INIT_OK(); } #endif @@ -350,8 +364,9 @@ add_exe_suffix(wchar_t *progpath) bytes long. */ static _PyInitError -search_for_prefix(const _PyCoreConfig *core_config, - PyCalculatePath *calculate, wchar_t *prefix, int *found) +search_for_prefix(const _PyCoreConfig *core_config, PyCalculatePath *calculate, + wchar_t *prefix, size_t prefix_len, + int *found) { _PyInitError err; size_t n; @@ -359,17 +374,18 @@ search_for_prefix(const _PyCoreConfig *core_config, /* If PYTHONHOME is set, we believe it unconditionally */ if (core_config->home) { - wcsncpy(prefix, core_config->home, MAXPATHLEN); - prefix[MAXPATHLEN] = L'\0'; + if (safe_wcscpy(prefix, core_config->home, prefix_len) < 0) { + return PATHLEN_ERR(); + } wchar_t *delim = wcschr(prefix, DELIM); if (delim) { *delim = L'\0'; } - err = joinpath(prefix, calculate->lib_python); + err = joinpath(prefix, calculate->lib_python, prefix_len); if (_Py_INIT_FAILED(err)) { return err; } - err = joinpath(prefix, LANDMARK); + err = joinpath(prefix, LANDMARK, prefix_len); if (_Py_INIT_FAILED(err)) { return err; } @@ -378,9 +394,10 @@ search_for_prefix(const _PyCoreConfig *core_config, } /* Check to see if argv[0] is in the build directory */ - wcsncpy(prefix, calculate->argv0_path, MAXPATHLEN); - prefix[MAXPATHLEN] = L'\0'; - err = joinpath(prefix, L"Modules/Setup.local"); + if (safe_wcscpy(prefix, calculate->argv0_path, prefix_len) < 0) { + return PATHLEN_ERR(); + } + err = joinpath(prefix, L"Modules/Setup.local", prefix_len); if (_Py_INIT_FAILED(err)) { return err; } @@ -389,24 +406,25 @@ search_for_prefix(const _PyCoreConfig *core_config, /* Check VPATH to see if argv0_path is in the build directory. */ vpath = Py_DecodeLocale(VPATH, NULL); if (vpath != NULL) { - wcsncpy(prefix, calculate->argv0_path, MAXPATHLEN); - prefix[MAXPATHLEN] = L'\0'; - err = joinpath(prefix, vpath); + if (safe_wcscpy(prefix, calculate->argv0_path, prefix_len) < 0) { + return PATHLEN_ERR(); + } + err = joinpath(prefix, vpath, prefix_len); PyMem_RawFree(vpath); if (_Py_INIT_FAILED(err)) { return err; } - err = joinpath(prefix, L"Lib"); + err = joinpath(prefix, L"Lib", prefix_len); if (_Py_INIT_FAILED(err)) { return err; } - err = joinpath(prefix, LANDMARK); + err = joinpath(prefix, LANDMARK, prefix_len); if (_Py_INIT_FAILED(err)) { return err; } - if (ismodule(prefix)) { + if (ismodule(prefix, prefix_len)) { *found = -1; return _Py_INIT_OK(); } @@ -414,23 +432,23 @@ search_for_prefix(const _PyCoreConfig *core_config, } /* Search from argv0_path, until root is found */ - err = copy_absolute(prefix, calculate->argv0_path, MAXPATHLEN+1); + err = copy_absolute(prefix, calculate->argv0_path, prefix_len); if (_Py_INIT_FAILED(err)) { return err; } do { n = wcslen(prefix); - err = joinpath(prefix, calculate->lib_python); + err = joinpath(prefix, calculate->lib_python, prefix_len); if (_Py_INIT_FAILED(err)) { return err; } - err = joinpath(prefix, LANDMARK); + err = joinpath(prefix, LANDMARK, prefix_len); if (_Py_INIT_FAILED(err)) { return err; } - if (ismodule(prefix)) { + if (ismodule(prefix, prefix_len)) { *found = 1; return _Py_INIT_OK(); } @@ -439,18 +457,19 @@ search_for_prefix(const _PyCoreConfig *core_config, } while (prefix[0]); /* Look at configure's PREFIX */ - wcsncpy(prefix, calculate->prefix, MAXPATHLEN); - prefix[MAXPATHLEN] = L'\0'; - err = joinpath(prefix, calculate->lib_python); + if (safe_wcscpy(prefix, calculate->prefix, prefix_len) < 0) { + return PATHLEN_ERR(); + } + err = joinpath(prefix, calculate->lib_python, prefix_len); if (_Py_INIT_FAILED(err)) { return err; } - err = joinpath(prefix, LANDMARK); + err = joinpath(prefix, LANDMARK, prefix_len); if (_Py_INIT_FAILED(err)) { return err; } - if (ismodule(prefix)) { + if (ismodule(prefix, prefix_len)) { *found = 1; return _Py_INIT_OK(); } @@ -463,11 +482,12 @@ search_for_prefix(const _PyCoreConfig *core_config, static _PyInitError calculate_prefix(const _PyCoreConfig *core_config, - PyCalculatePath *calculate, wchar_t *prefix) + PyCalculatePath *calculate, wchar_t *prefix, size_t prefix_len) { _PyInitError err; - err = search_for_prefix(core_config, calculate, prefix, &calculate->prefix_found); + err = search_for_prefix(core_config, calculate, prefix, prefix_len, + &calculate->prefix_found); if (_Py_INIT_FAILED(err)) { return err; } @@ -477,8 +497,10 @@ calculate_prefix(const _PyCoreConfig *core_config, fprintf(stderr, "Could not find platform independent libraries \n"); } - wcsncpy(prefix, calculate->prefix, MAXPATHLEN); - err = joinpath(prefix, calculate->lib_python); + if (safe_wcscpy(prefix, calculate->prefix, prefix_len) < 0) { + return PATHLEN_ERR(); + } + err = joinpath(prefix, calculate->lib_python, prefix_len); if (_Py_INIT_FAILED(err)) { return err; } @@ -490,8 +512,9 @@ calculate_prefix(const _PyCoreConfig *core_config, } -static void -calculate_reduce_prefix(PyCalculatePath *calculate, wchar_t *prefix) +static _PyInitError +calculate_reduce_prefix(PyCalculatePath *calculate, + wchar_t *prefix, size_t prefix_len) { /* Reduce prefix and exec_prefix to their essence, * e.g. /usr/local/lib/python1.5 is reduced to /usr/local. @@ -508,8 +531,11 @@ calculate_reduce_prefix(PyCalculatePath *calculate, wchar_t *prefix) } } else { - wcsncpy(prefix, calculate->prefix, MAXPATHLEN); + if (safe_wcscpy(prefix, calculate->prefix, prefix_len) < 0) { + return PATHLEN_ERR(); + } } + return _Py_INIT_OK(); } @@ -518,7 +544,8 @@ calculate_reduce_prefix(PyCalculatePath *calculate, wchar_t *prefix) */ static _PyInitError search_for_exec_prefix(const _PyCoreConfig *core_config, - PyCalculatePath *calculate, wchar_t *exec_prefix, + PyCalculatePath *calculate, + wchar_t *exec_prefix, size_t exec_prefix_len, int *found) { _PyInitError err; @@ -528,17 +555,20 @@ search_for_exec_prefix(const _PyCoreConfig *core_config, if (core_config->home) { wchar_t *delim = wcschr(core_config->home, DELIM); if (delim) { - wcsncpy(exec_prefix, delim+1, MAXPATHLEN); + if (safe_wcscpy(exec_prefix, delim+1, exec_prefix_len) < 0) { + return PATHLEN_ERR(); + } } else { - wcsncpy(exec_prefix, core_config->home, MAXPATHLEN); + if (safe_wcscpy(exec_prefix, core_config->home, exec_prefix_len) < 0) { + return PATHLEN_ERR(); + } } - exec_prefix[MAXPATHLEN] = L'\0'; - err = joinpath(exec_prefix, calculate->lib_python); + err = joinpath(exec_prefix, calculate->lib_python, exec_prefix_len); if (_Py_INIT_FAILED(err)) { return err; } - err = joinpath(exec_prefix, L"lib-dynload"); + err = joinpath(exec_prefix, L"lib-dynload", exec_prefix_len); if (_Py_INIT_FAILED(err)) { return err; } @@ -549,9 +579,10 @@ search_for_exec_prefix(const _PyCoreConfig *core_config, /* Check to see if argv[0] is in the build directory. "pybuilddir.txt" is written by setup.py and contains the relative path to the location of shared library modules. */ - wcsncpy(exec_prefix, calculate->argv0_path, MAXPATHLEN); - exec_prefix[MAXPATHLEN] = L'\0'; - err = joinpath(exec_prefix, L"pybuilddir.txt"); + if (safe_wcscpy(exec_prefix, calculate->argv0_path, exec_prefix_len) < 0) { + return PATHLEN_ERR(); + } + err = joinpath(exec_prefix, L"pybuilddir.txt", exec_prefix_len); if (_Py_INIT_FAILED(err)) { return err; } @@ -562,21 +593,22 @@ search_for_exec_prefix(const _PyCoreConfig *core_config, errno = 0; } else { - char buf[MAXPATHLEN+1]; - n = fread(buf, 1, MAXPATHLEN, f); + char buf[MAXPATHLEN + 1]; + n = fread(buf, 1, Py_ARRAY_LENGTH(buf) - 1, f); buf[n] = '\0'; fclose(f); - size_t dec_len; wchar_t *pybuilddir; + size_t dec_len; pybuilddir = _Py_DecodeUTF8_surrogateescape(buf, n, &dec_len); if (!pybuilddir) { return DECODE_LOCALE_ERR("pybuilddir.txt", dec_len); } - wcsncpy(exec_prefix, calculate->argv0_path, MAXPATHLEN); - exec_prefix[MAXPATHLEN] = L'\0'; - err = joinpath(exec_prefix, pybuilddir); + if (safe_wcscpy(exec_prefix, calculate->argv0_path, exec_prefix_len) < 0) { + return PATHLEN_ERR(); + } + err = joinpath(exec_prefix, pybuilddir, exec_prefix_len); PyMem_RawFree(pybuilddir ); if (_Py_INIT_FAILED(err)) { return err; @@ -588,18 +620,18 @@ search_for_exec_prefix(const _PyCoreConfig *core_config, } /* Search from argv0_path, until root is found */ - err = copy_absolute(exec_prefix, calculate->argv0_path, MAXPATHLEN+1); + err = copy_absolute(exec_prefix, calculate->argv0_path, exec_prefix_len); if (_Py_INIT_FAILED(err)) { return err; } do { n = wcslen(exec_prefix); - err = joinpath(exec_prefix, calculate->lib_python); + err = joinpath(exec_prefix, calculate->lib_python, exec_prefix_len); if (_Py_INIT_FAILED(err)) { return err; } - err = joinpath(exec_prefix, L"lib-dynload"); + err = joinpath(exec_prefix, L"lib-dynload", exec_prefix_len); if (_Py_INIT_FAILED(err)) { return err; } @@ -612,13 +644,14 @@ search_for_exec_prefix(const _PyCoreConfig *core_config, } while (exec_prefix[0]); /* Look at configure's EXEC_PREFIX */ - wcsncpy(exec_prefix, calculate->exec_prefix, MAXPATHLEN); - exec_prefix[MAXPATHLEN] = L'\0'; - err = joinpath(exec_prefix, calculate->lib_python); + if (safe_wcscpy(exec_prefix, calculate->exec_prefix, exec_prefix_len) < 0) { + return PATHLEN_ERR(); + } + err = joinpath(exec_prefix, calculate->lib_python, exec_prefix_len); if (_Py_INIT_FAILED(err)) { return err; } - err = joinpath(exec_prefix, L"lib-dynload"); + err = joinpath(exec_prefix, L"lib-dynload", exec_prefix_len); if (_Py_INIT_FAILED(err)) { return err; } @@ -635,11 +668,13 @@ search_for_exec_prefix(const _PyCoreConfig *core_config, static _PyInitError calculate_exec_prefix(const _PyCoreConfig *core_config, - PyCalculatePath *calculate, wchar_t *exec_prefix) + PyCalculatePath *calculate, + wchar_t *exec_prefix, size_t exec_prefix_len) { _PyInitError err; - err = search_for_exec_prefix(core_config, calculate, exec_prefix, + err = search_for_exec_prefix(core_config, calculate, + exec_prefix, exec_prefix_len, &calculate->exec_prefix_found); if (_Py_INIT_FAILED(err)) { return err; @@ -650,8 +685,10 @@ calculate_exec_prefix(const _PyCoreConfig *core_config, fprintf(stderr, "Could not find platform dependent libraries \n"); } - wcsncpy(exec_prefix, calculate->exec_prefix, MAXPATHLEN); - err = joinpath(exec_prefix, L"lib/lib-dynload"); + if (safe_wcscpy(exec_prefix, calculate->exec_prefix, exec_prefix_len) < 0) { + return PATHLEN_ERR(); + } + err = joinpath(exec_prefix, L"lib/lib-dynload", exec_prefix_len); if (_Py_INIT_FAILED(err)) { return err; } @@ -661,8 +698,9 @@ calculate_exec_prefix(const _PyCoreConfig *core_config, } -static void -calculate_reduce_exec_prefix(PyCalculatePath *calculate, wchar_t *exec_prefix) +static _PyInitError +calculate_reduce_exec_prefix(PyCalculatePath *calculate, + wchar_t *exec_prefix, size_t exec_prefix_len) { if (calculate->exec_prefix_found > 0) { reduce(exec_prefix); @@ -673,8 +711,11 @@ calculate_reduce_exec_prefix(PyCalculatePath *calculate, wchar_t *exec_prefix) } } else { - wcsncpy(exec_prefix, calculate->exec_prefix, MAXPATHLEN); + if (safe_wcscpy(exec_prefix, calculate->exec_prefix, exec_prefix_len) < 0) { + return PATHLEN_ERR(); + } } + return _Py_INIT_OK(); } @@ -683,16 +724,17 @@ calculate_program_full_path(const _PyCoreConfig *core_config, PyCalculatePath *calculate, _PyPathConfig *config) { _PyInitError err; - wchar_t program_full_path[MAXPATHLEN+1]; + wchar_t program_full_path[MAXPATHLEN + 1]; + const size_t program_full_path_len = Py_ARRAY_LENGTH(program_full_path); memset(program_full_path, 0, sizeof(program_full_path)); #ifdef __APPLE__ + char execpath[MAXPATHLEN + 1]; #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 - uint32_t nsexeclength = MAXPATHLEN; + uint32_t nsexeclength = Py_ARRAY_LENGTH(execpath) - 1; #else - unsigned long nsexeclength = MAXPATHLEN; + unsigned long nsexeclength = Py_ARRAY_LENGTH(execpath) - 1; #endif - char execpath[MAXPATHLEN+1]; #endif /* If there is no slash in the argv0 path, then we have to @@ -701,7 +743,10 @@ calculate_program_full_path(const _PyCoreConfig *core_config, * $PATH isn't exported, you lose. */ if (wcschr(core_config->program_name, SEP)) { - wcsncpy(program_full_path, core_config->program_name, MAXPATHLEN); + if (safe_wcscpy(program_full_path, core_config->program_name, + program_full_path_len) < 0) { + return PATHLEN_ERR(); + } } #ifdef __APPLE__ /* On Mac OS X, if a script uses an interpreter of the form @@ -722,7 +767,10 @@ calculate_program_full_path(const _PyCoreConfig *core_config, if (path == NULL) { return DECODE_LOCALE_ERR("executable path", len); } - wcsncpy(program_full_path, path, MAXPATHLEN); + if (safe_wcscpy(program_full_path, path, program_full_path_len) < 0) { + PyMem_RawFree(path); + return PATHLEN_ERR(); + } PyMem_RawFree(path); } #endif /* __APPLE__ */ @@ -733,17 +781,21 @@ calculate_program_full_path(const _PyCoreConfig *core_config, if (delim) { size_t len = delim - path; - if (len > MAXPATHLEN) { - len = MAXPATHLEN; + if (len >= program_full_path_len) { + return PATHLEN_ERR(); } wcsncpy(program_full_path, path, len); program_full_path[len] = '\0'; } else { - wcsncpy(program_full_path, path, MAXPATHLEN); + if (safe_wcscpy(program_full_path, path, + program_full_path_len) < 0) { + return PATHLEN_ERR(); + } } - err = joinpath(program_full_path, core_config->program_name); + err = joinpath(program_full_path, core_config->program_name, + program_full_path_len); if (_Py_INIT_FAILED(err)) { return err; } @@ -763,7 +815,7 @@ calculate_program_full_path(const _PyCoreConfig *core_config, program_full_path[0] = '\0'; } if (program_full_path[0] != SEP && program_full_path[0] != '\0') { - err = absolutize(program_full_path); + err = absolutize(program_full_path, program_full_path_len); if (_Py_INIT_FAILED(err)) { return err; } @@ -775,7 +827,7 @@ calculate_program_full_path(const _PyCoreConfig *core_config, * path (bpo-28441). */ if (program_full_path[0] != '\0') { - err = add_exe_suffix(program_full_path); + err = add_exe_suffix(program_full_path, program_full_path_len); if (_Py_INIT_FAILED(err)) { return err; } @@ -793,8 +845,10 @@ calculate_program_full_path(const _PyCoreConfig *core_config, static _PyInitError calculate_argv0_path(PyCalculatePath *calculate, const wchar_t *program_full_path) { - wcsncpy(calculate->argv0_path, program_full_path, MAXPATHLEN); - calculate->argv0_path[MAXPATHLEN] = '\0'; + const size_t argv0_path_len = Py_ARRAY_LENGTH(calculate->argv0_path); + if (safe_wcscpy(calculate->argv0_path, program_full_path, argv0_path_len) < 0) { + return PATHLEN_ERR(); + } #ifdef WITH_NEXT_FRAMEWORK NSModule pythonModule; @@ -823,50 +877,61 @@ calculate_argv0_path(PyCalculatePath *calculate, const wchar_t *program_full_pat return DECODE_LOCALE_ERR("framework location", len); } - wcsncpy(calculate->argv0_path, wbuf, MAXPATHLEN); + if (safe_wcscpy(calculate->argv0_path, wbuf, argv0_path_len) < 0) { + return PATHLEN_ERR(); + } reduce(calculate->argv0_path); - err = joinpath(calculate->argv0_path, calculate->lib_python); + err = joinpath(calculate->argv0_path, calculate->lib_python, argv0_path_len); if (_Py_INIT_FAILED(err)) { PyMem_RawFree(wbuf); return err; } - err = joinpath(calculate->argv0_path, LANDMARK); + err = joinpath(calculate->argv0_path, LANDMARK, argv0_path_len); if (_Py_INIT_FAILED(err)) { PyMem_RawFree(wbuf); return err; } - if (!ismodule(calculate->argv0_path)) { + if (!ismodule(calculate->argv0_path, + Py_ARRAY_LENGTH(calculate->argv0_path))) { /* We are in the build directory so use the name of the executable - we know that the absolute path is passed */ - wcsncpy(calculate->argv0_path, program_full_path, MAXPATHLEN); + if (safe_wcscpy(calculate->argv0_path, program_full_path, + argv0_path_len) < 0) { + return PATHLEN_ERR(); + } } else { /* Use the location of the library as the program_full_path */ - wcsncpy(calculate->argv0_path, wbuf, MAXPATHLEN); + if (safe_wcscpy(calculate->argv0_path, wbuf, argv0_path_len) < 0) { + return PATHLEN_ERR(); + } } PyMem_RawFree(wbuf); } #endif #if HAVE_READLINK - wchar_t tmpbuffer[MAXPATHLEN+1]; - int linklen = _Py_wreadlink(program_full_path, tmpbuffer, MAXPATHLEN); + wchar_t tmpbuffer[MAXPATHLEN + 1]; + const size_t buflen = Py_ARRAY_LENGTH(tmpbuffer); + int linklen = _Py_wreadlink(program_full_path, tmpbuffer, buflen); while (linklen != -1) { if (tmpbuffer[0] == SEP) { /* tmpbuffer should never be longer than MAXPATHLEN, but extra check does not hurt */ - wcsncpy(calculate->argv0_path, tmpbuffer, MAXPATHLEN); + if (safe_wcscpy(calculate->argv0_path, tmpbuffer, argv0_path_len) < 0) { + return PATHLEN_ERR(); + } } else { /* Interpret relative to program_full_path */ _PyInitError err; reduce(calculate->argv0_path); - err = joinpath(calculate->argv0_path, tmpbuffer); + err = joinpath(calculate->argv0_path, tmpbuffer, argv0_path_len); if (_Py_INIT_FAILED(err)) { return err; } } - linklen = _Py_wreadlink(calculate->argv0_path, tmpbuffer, MAXPATHLEN); + linklen = _Py_wreadlink(calculate->argv0_path, tmpbuffer, buflen); } #endif /* HAVE_READLINK */ @@ -886,12 +951,15 @@ calculate_read_pyenv(PyCalculatePath *calculate) { _PyInitError err; wchar_t tmpbuffer[MAXPATHLEN+1]; + const size_t buflen = Py_ARRAY_LENGTH(tmpbuffer); wchar_t *env_cfg = L"pyvenv.cfg"; FILE *env_file; - wcscpy(tmpbuffer, calculate->argv0_path); + if (safe_wcscpy(tmpbuffer, calculate->argv0_path, buflen) < 0) { + return PATHLEN_ERR(); + } - err = joinpath(tmpbuffer, env_cfg); + err = joinpath(tmpbuffer, env_cfg, buflen); if (_Py_INIT_FAILED(err)) { return err; } @@ -901,7 +969,7 @@ calculate_read_pyenv(PyCalculatePath *calculate) reduce(tmpbuffer); reduce(tmpbuffer); - err = joinpath(tmpbuffer, env_cfg); + err = joinpath(tmpbuffer, env_cfg, buflen); if (_Py_INIT_FAILED(err)) { return err; } @@ -917,8 +985,11 @@ calculate_read_pyenv(PyCalculatePath *calculate) } /* Look for a 'home' variable and set argv0_path to it, if found */ - if (_Py_FindEnvConfigValue(env_file, L"home", tmpbuffer, MAXPATHLEN)) { - wcscpy(calculate->argv0_path, tmpbuffer); + if (_Py_FindEnvConfigValue(env_file, L"home", tmpbuffer, buflen)) { + if (safe_wcscpy(calculate->argv0_path, tmpbuffer, + Py_ARRAY_LENGTH(calculate->argv0_path)) < 0) { + return PATHLEN_ERR(); + } } fclose(env_file); return _Py_INIT_OK(); @@ -929,8 +1000,10 @@ static _PyInitError calculate_zip_path(PyCalculatePath *calculate, const wchar_t *prefix) { _PyInitError err; - wcsncpy(calculate->zip_path, prefix, MAXPATHLEN); - calculate->zip_path[MAXPATHLEN] = L'\0'; + const size_t zip_path_len = Py_ARRAY_LENGTH(calculate->zip_path); + if (safe_wcscpy(calculate->zip_path, prefix, zip_path_len) < 0) { + return PATHLEN_ERR(); + } if (calculate->prefix_found > 0) { /* Use the reduced prefix returned by Py_GetPrefix() */ @@ -938,9 +1011,11 @@ calculate_zip_path(PyCalculatePath *calculate, const wchar_t *prefix) reduce(calculate->zip_path); } else { - wcsncpy(calculate->zip_path, calculate->prefix, MAXPATHLEN); + if (safe_wcscpy(calculate->zip_path, calculate->prefix, zip_path_len) < 0) { + return PATHLEN_ERR(); + } } - err = joinpath(calculate->zip_path, L"lib/python00.zip"); + err = joinpath(calculate->zip_path, L"lib/python00.zip", zip_path_len); if (_Py_INIT_FAILED(err)) { return err; } @@ -1111,7 +1186,8 @@ calculate_path_impl(const _PyCoreConfig *core_config, wchar_t prefix[MAXPATHLEN+1]; memset(prefix, 0, sizeof(prefix)); - err = calculate_prefix(core_config, calculate, prefix); + err = calculate_prefix(core_config, calculate, + prefix, Py_ARRAY_LENGTH(prefix)); if (_Py_INIT_FAILED(err)) { return err; } @@ -1123,7 +1199,8 @@ calculate_path_impl(const _PyCoreConfig *core_config, wchar_t exec_prefix[MAXPATHLEN+1]; memset(exec_prefix, 0, sizeof(exec_prefix)); - err = calculate_exec_prefix(core_config, calculate, exec_prefix); + err = calculate_exec_prefix(core_config, calculate, + exec_prefix, Py_ARRAY_LENGTH(exec_prefix)); if (_Py_INIT_FAILED(err)) { return err; } @@ -1141,14 +1218,21 @@ calculate_path_impl(const _PyCoreConfig *core_config, return err; } - calculate_reduce_prefix(calculate, prefix); + err = calculate_reduce_prefix(calculate, prefix, Py_ARRAY_LENGTH(prefix)); + if (_Py_INIT_FAILED(err)) { + return err; + } config->prefix = _PyMem_RawWcsdup(prefix); if (config->prefix == NULL) { return _Py_INIT_NO_MEMORY(); } - calculate_reduce_exec_prefix(calculate, exec_prefix); + err = calculate_reduce_exec_prefix(calculate, + exec_prefix, Py_ARRAY_LENGTH(exec_prefix)); + if (_Py_INIT_FAILED(err)) { + return err; + } config->exec_prefix = _PyMem_RawWcsdup(exec_prefix); if (config->exec_prefix == NULL) { diff --git a/Python/fileutils.c b/Python/fileutils.c index 0ac690a211cf..b933874193b4 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -1716,7 +1716,7 @@ _Py_wrealpath(const wchar_t *path, } #endif -/* Get the current directory. size is the buffer size in wide characters +/* Get the current directory. buflen is the buffer size in wide characters including the null character. Decode the path from the locale encoding. Return NULL on getcwd() error, on decoding error, or if 'buf' is diff --git a/Python/pathconfig.c b/Python/pathconfig.c index 87db66b7528c..f1818eb30765 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -578,8 +578,8 @@ _PyPathConfig_ComputeArgv0(const _PyWstrList *argv) int have_script_arg = 0; int have_module_arg = 0; #ifdef HAVE_READLINK - wchar_t link[MAXPATHLEN+1]; - wchar_t argv0copy[2*MAXPATHLEN+1]; + wchar_t link[MAXPATHLEN + 1]; + wchar_t argv0copy[2 * MAXPATHLEN + 1]; int nr = 0; #endif #if defined(HAVE_REALPATH) @@ -607,7 +607,7 @@ _PyPathConfig_ComputeArgv0(const _PyWstrList *argv) #ifdef HAVE_READLINK if (have_script_arg) - nr = _Py_wreadlink(argv0, link, MAXPATHLEN); + nr = _Py_wreadlink(argv0, link, Py_ARRAY_LENGTH(link)); if (nr > 0) { /* It's a symlink */ link[nr] = '\0'; @@ -692,11 +692,12 @@ _Py_FindEnvConfigValue(FILE *env_file, const wchar_t *key, wchar_t *value, size_t value_size) { int result = 0; /* meaning not found */ - char buffer[MAXPATHLEN*2+1]; /* allow extra for key, '=', etc. */ + char buffer[MAXPATHLEN * 2 + 1]; /* allow extra for key, '=', etc. */ + buffer[Py_ARRAY_LENGTH(buffer)-1] = '\0'; fseek(env_file, 0, SEEK_SET); while (!feof(env_file)) { - char * p = fgets(buffer, MAXPATHLEN*2, env_file); + char * p = fgets(buffer, Py_ARRAY_LENGTH(buffer) - 1, env_file); if (p == NULL) { break; @@ -721,7 +722,8 @@ _Py_FindEnvConfigValue(FILE *env_file, const wchar_t *key, if ((tok != NULL) && !wcscmp(tok, L"=")) { tok = WCSTOK(NULL, L"\r\n", &state); if (tok != NULL) { - wcsncpy(value, tok, MAXPATHLEN); + wcsncpy(value, tok, value_size - 1); + value[value_size - 1] = L'\0'; result = 1; PyMem_RawFree(tmpbuffer); break; From webhook-mailer at python.org Mon Mar 18 23:17:18 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Tue, 19 Mar 2019 03:17:18 -0000 Subject: [Python-checkins] bpo-36324: Add inv_cdf() to statistics.NormalDist() (GH-12377) Message-ID: https://github.com/python/cpython/commit/714c60d7aca6d0f6d73ad2d7c876d2d683a7fce3 commit: 714c60d7aca6d0f6d73ad2d7c876d2d683a7fce3 branch: master author: Raymond Hettinger committer: GitHub date: 2019-03-18T20:17:14-07:00 summary: bpo-36324: Add inv_cdf() to statistics.NormalDist() (GH-12377) files: A Misc/NEWS.d/next/Library/2019-03-17-01-17-45.bpo-36324.dvNrRe.rst M Doc/library/statistics.rst M Lib/statistics.py M Lib/test/test_statistics.py diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst index b5521b772b3a..1d52d98b2997 100644 --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -569,6 +569,18 @@ of applications in statistics. compute the probability that a random variable *X* will be less than or equal to *x*. Mathematically, it is written ``P(X <= x)``. + .. method:: NormalDist.inv_cdf(p) + + Compute the inverse cumulative distribution function, also known as the + `quantile function `_ + or the `percent-point + `_ + function. Mathematically, it is written ``x : P(X <= x) = p``. + + Finds the value *x* of the random variable *X* such that the + probability of the variable being less than or equal to that value + equals the given probability *p*. + .. method:: NormalDist.overlap(other) Compute the `overlapping coefficient (OVL) @@ -628,6 +640,16 @@ rounding to the nearest whole number: >>> round(fraction * 100.0, 1) 18.4 +Find the `quartiles `_ and `deciles +`_ for the SAT scores: + +.. doctest:: + + >>> [round(sat.inv_cdf(p)) for p in (0.25, 0.50, 0.75)] + [928, 1060, 1192] + >>> [round(sat.inv_cdf(p / 10)) for p in range(1, 10)] + [810, 896, 958, 1011, 1060, 1109, 1162, 1224, 1310] + What percentage of men and women will have the same height in `two normally distributed populations with known means and standard deviations `_? diff --git a/Lib/statistics.py b/Lib/statistics.py index 8d79eed6b1aa..fe68e5857c31 100644 --- a/Lib/statistics.py +++ b/Lib/statistics.py @@ -745,6 +745,101 @@ def cdf(self, x): raise StatisticsError('cdf() not defined when sigma is zero') return 0.5 * (1.0 + erf((x - self.mu) / (self.sigma * sqrt(2.0)))) + def inv_cdf(self, p): + ''' Inverse cumulative distribution function: x : P(X <= x) = p + + Finds the value of the random variable such that the probability of the + variable being less than or equal to that value equals the given probability. + + This function is also called the percent-point function or quantile function. + + ''' + if (p <= 0.0 or p >= 1.0): + raise StatisticsError('p must be in the range 0.0 < p < 1.0') + if self.sigma <= 0.0: + raise StatisticsError('cdf() not defined when sigma at or below zero') + + # There is no closed-form solution to the inverse CDF for the normal + # distribution, so we use a rational approximation instead: + # Wichura, M.J. (1988). "Algorithm AS241: The Percentage Points of the + # Normal Distribution". Applied Statistics. Blackwell Publishing. 37 + # (3): 477?484. doi:10.2307/2347330. JSTOR 2347330. + + q = p - 0.5 + if fabs(q) <= 0.425: + a0 = 3.38713_28727_96366_6080e+0 + a1 = 1.33141_66789_17843_7745e+2 + a2 = 1.97159_09503_06551_4427e+3 + a3 = 1.37316_93765_50946_1125e+4 + a4 = 4.59219_53931_54987_1457e+4 + a5 = 6.72657_70927_00870_0853e+4 + a6 = 3.34305_75583_58812_8105e+4 + a7 = 2.50908_09287_30122_6727e+3 + b1 = 4.23133_30701_60091_1252e+1 + b2 = 6.87187_00749_20579_0830e+2 + b3 = 5.39419_60214_24751_1077e+3 + b4 = 2.12137_94301_58659_5867e+4 + b5 = 3.93078_95800_09271_0610e+4 + b6 = 2.87290_85735_72194_2674e+4 + b7 = 5.22649_52788_52854_5610e+3 + r = 0.180625 - q * q + num = (q * (((((((a7 * r + a6) * r + a5) * r + a4) * r + a3) + * r + a2) * r + a1) * r + a0)) + den = ((((((((b7 * r + b6) * r + b5) * r + b4) * r + b3) + * r + b2) * r + b1) * r + 1.0)) + x = num / den + return self.mu + (x * self.sigma) + + r = p if q <= 0.0 else 1.0 - p + r = sqrt(-log(r)) + if r <= 5.0: + c0 = 1.42343_71107_49683_57734e+0 + c1 = 4.63033_78461_56545_29590e+0 + c2 = 5.76949_72214_60691_40550e+0 + c3 = 3.64784_83247_63204_60504e+0 + c4 = 1.27045_82524_52368_38258e+0 + c5 = 2.41780_72517_74506_11770e-1 + c6 = 2.27238_44989_26918_45833e-2 + c7 = 7.74545_01427_83414_07640e-4 + d1 = 2.05319_16266_37758_82187e+0 + d2 = 1.67638_48301_83803_84940e+0 + d3 = 6.89767_33498_51000_04550e-1 + d4 = 1.48103_97642_74800_74590e-1 + d5 = 1.51986_66563_61645_71966e-2 + d6 = 5.47593_80849_95344_94600e-4 + d7 = 1.05075_00716_44416_84324e-9 + r = r - 1.6 + num = ((((((((c7 * r + c6) * r + c5) * r + c4) * r + c3) + * r + c2) * r + c1) * r + c0)) + den = ((((((((d7 * r + d6) * r + d5) * r + d4) * r + d3) + * r + d2) * r + d1) * r + 1.0)) + else: + e0 = 6.65790_46435_01103_77720e+0 + e1 = 5.46378_49111_64114_36990e+0 + e2 = 1.78482_65399_17291_33580e+0 + e3 = 2.96560_57182_85048_91230e-1 + e4 = 2.65321_89526_57612_30930e-2 + e5 = 1.24266_09473_88078_43860e-3 + e6 = 2.71155_55687_43487_57815e-5 + e7 = 2.01033_43992_92288_13265e-7 + f1 = 5.99832_20655_58879_37690e-1 + f2 = 1.36929_88092_27358_05310e-1 + f3 = 1.48753_61290_85061_48525e-2 + f4 = 7.86869_13114_56132_59100e-4 + f5 = 1.84631_83175_10054_68180e-5 + f6 = 1.42151_17583_16445_88870e-7 + f7 = 2.04426_31033_89939_78564e-15 + r = r - 5.0 + num = ((((((((e7 * r + e6) * r + e5) * r + e4) * r + e3) + * r + e2) * r + e1) * r + e0)) + den = ((((((((f7 * r + f6) * r + f5) * r + f4) * r + f3) + * r + f2) * r + f1) * r + 1.0)) + + x = num / den + if q < 0.0: + x = -x + return self.mu + (x * self.sigma) + def overlap(self, other): '''Compute the overlapping coefficient (OVL) between two normal distributions. diff --git a/Lib/test/test_statistics.py b/Lib/test/test_statistics.py index 26b22a1c4080..02cbebdcea9c 100644 --- a/Lib/test/test_statistics.py +++ b/Lib/test/test_statistics.py @@ -2174,6 +2174,69 @@ def test_cdf(self): self.assertEqual(X.cdf(float('Inf')), 1.0) self.assertTrue(math.isnan(X.cdf(float('NaN')))) + def test_inv_cdf(self): + NormalDist = statistics.NormalDist + + # Center case should be exact. + iq = NormalDist(100, 15) + self.assertEqual(iq.inv_cdf(0.50), iq.mean) + + # Test versus a published table of known percentage points. + # See the second table at the bottom of the page here: + # http://people.bath.ac.uk/masss/tables/normaltable.pdf + Z = NormalDist() + pp = {5.0: (0.000, 1.645, 2.576, 3.291, 3.891, + 4.417, 4.892, 5.327, 5.731, 6.109), + 2.5: (0.674, 1.960, 2.807, 3.481, 4.056, + 4.565, 5.026, 5.451, 5.847, 6.219), + 1.0: (1.282, 2.326, 3.090, 3.719, 4.265, + 4.753, 5.199, 5.612, 5.998, 6.361)} + for base, row in pp.items(): + for exp, x in enumerate(row, start=1): + p = base * 10.0 ** (-exp) + self.assertAlmostEqual(-Z.inv_cdf(p), x, places=3) + p = 1.0 - p + self.assertAlmostEqual(Z.inv_cdf(p), x, places=3) + + # Match published example for MS Excel + # https://support.office.com/en-us/article/norm-inv-function-54b30935-fee7-493c-bedb-2278a9db7e13 + self.assertAlmostEqual(NormalDist(40, 1.5).inv_cdf(0.908789), 42.000002) + + # One million equally spaced probabilities + n = 2**20 + for p in range(1, n): + p /= n + self.assertAlmostEqual(iq.cdf(iq.inv_cdf(p)), p) + + # One hundred ever smaller probabilities to test tails out to + # extreme probabilities: 1 / 2**50 and (2**50-1) / 2 ** 50 + for e in range(1, 51): + p = 2.0 ** (-e) + self.assertAlmostEqual(iq.cdf(iq.inv_cdf(p)), p) + p = 1.0 - p + self.assertAlmostEqual(iq.cdf(iq.inv_cdf(p)), p) + + # Now apply cdf() first. At six sigmas, the round-trip + # loses a lot of precision, so only check to 6 places. + for x in range(10, 190): + self.assertAlmostEqual(iq.inv_cdf(iq.cdf(x)), x, places=6) + + # Error cases: + with self.assertRaises(statistics.StatisticsError): + iq.inv_cdf(0.0) # p is zero + with self.assertRaises(statistics.StatisticsError): + iq.inv_cdf(-0.1) # p under zero + with self.assertRaises(statistics.StatisticsError): + iq.inv_cdf(1.0) # p is one + with self.assertRaises(statistics.StatisticsError): + iq.inv_cdf(1.1) # p over one + with self.assertRaises(statistics.StatisticsError): + iq.sigma = 0.0 # sigma is zero + iq.inv_cdf(0.5) + with self.assertRaises(statistics.StatisticsError): + iq.sigma = -0.1 # sigma under zero + iq.inv_cdf(0.5) + def test_overlap(self): NormalDist = statistics.NormalDist diff --git a/Misc/NEWS.d/next/Library/2019-03-17-01-17-45.bpo-36324.dvNrRe.rst b/Misc/NEWS.d/next/Library/2019-03-17-01-17-45.bpo-36324.dvNrRe.rst new file mode 100644 index 000000000000..536b2b8739df --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-17-01-17-45.bpo-36324.dvNrRe.rst @@ -0,0 +1,2 @@ +Add method to statistics.NormalDist for computing the inverse cumulative +normal distribution. From webhook-mailer at python.org Tue Mar 19 01:24:21 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 19 Mar 2019 05:24:21 -0000 Subject: [Python-checkins] Add docstrings to the arithmetic methods in NormalDist() (GH-12426) Message-ID: https://github.com/python/cpython/commit/5f1e8b4d249f62dfd81191bcadc4960d01e67ead commit: 5f1e8b4d249f62dfd81191bcadc4960d01e67ead branch: master author: Raymond Hettinger committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-18T22:24:15-07:00 summary: Add docstrings to the arithmetic methods in NormalDist() (GH-12426) files: M Lib/statistics.py diff --git a/Lib/statistics.py b/Lib/statistics.py index fe68e5857c31..d75bf4e2c387 100644 --- a/Lib/statistics.py +++ b/Lib/statistics.py @@ -712,7 +712,7 @@ class NormalDist: __slots__ = ('mu', 'sigma') def __init__(self, mu=0.0, sigma=1.0): - 'NormalDist where mu is the mean and sigma is the standard deviation' + 'NormalDist where mu is the mean and sigma is the standard deviation.' if sigma < 0.0: raise StatisticsError('sigma must be non-negative') self.mu = mu @@ -720,39 +720,38 @@ def __init__(self, mu=0.0, sigma=1.0): @classmethod def from_samples(cls, data): - 'Make a normal distribution instance from sample data' + 'Make a normal distribution instance from sample data.' if not isinstance(data, (list, tuple)): data = list(data) xbar = fmean(data) return cls(xbar, stdev(data, xbar)) def samples(self, n, seed=None): - 'Generate *n* samples for a given mean and standard deviation' + 'Generate *n* samples for a given mean and standard deviation.' gauss = random.gauss if seed is None else random.Random(seed).gauss mu, sigma = self.mu, self.sigma return [gauss(mu, sigma) for i in range(n)] def pdf(self, x): - 'Probability density function: P(x <= X < x+dx) / dx' + 'Probability density function. P(x <= X < x+dx) / dx' variance = self.sigma ** 2.0 if not variance: raise StatisticsError('pdf() not defined when sigma is zero') return exp((x - self.mu)**2.0 / (-2.0*variance)) / sqrt(tau * variance) def cdf(self, x): - 'Cumulative distribution function: P(X <= x)' + 'Cumulative distribution function. P(X <= x)' if not self.sigma: raise StatisticsError('cdf() not defined when sigma is zero') return 0.5 * (1.0 + erf((x - self.mu) / (self.sigma * sqrt(2.0)))) def inv_cdf(self, p): - ''' Inverse cumulative distribution function: x : P(X <= x) = p + '''Inverse cumulative distribution function. x : P(X <= x) = p - Finds the value of the random variable such that the probability of the - variable being less than or equal to that value equals the given probability. - - This function is also called the percent-point function or quantile function. + Finds the value of the random variable such that the probability of the + variable being less than or equal to that value equals the given probability. + This function is also called the percent point function or quantile function. ''' if (p <= 0.0 or p >= 1.0): raise StatisticsError('p must be in the range 0.0 < p < 1.0') @@ -851,7 +850,6 @@ def overlap(self, other): >>> N2 = NormalDist(3.2, 2.0) >>> N1.overlap(N2) 0.8035050657330205 - ''' # See: "The overlapping coefficient as a measure of agreement between # probability distributions and point estimation of the overlap of two @@ -877,49 +875,81 @@ def overlap(self, other): @property def mean(self): - 'Arithmetic mean of the normal distribution' + 'Arithmetic mean of the normal distribution.' return self.mu @property def stdev(self): - 'Standard deviation of the normal distribution' + 'Standard deviation of the normal distribution.' return self.sigma @property def variance(self): - 'Square of the standard deviation' + 'Square of the standard deviation.' return self.sigma ** 2.0 def __add__(x1, x2): + '''Add a constant or another NormalDist instance. + + If *other* is a constant, translate mu by the constant, + leaving sigma unchanged. + + If *other* is a NormalDist, add both the means and the variances. + Mathematically, this works only if the two distributions are + independent or if they are jointly normally distributed. + ''' if isinstance(x2, NormalDist): return NormalDist(x1.mu + x2.mu, hypot(x1.sigma, x2.sigma)) return NormalDist(x1.mu + x2, x1.sigma) def __sub__(x1, x2): + '''Subtract a constant or another NormalDist instance. + + If *other* is a constant, translate by the constant mu, + leaving sigma unchanged. + + If *other* is a NormalDist, subtract the means and add the variances. + Mathematically, this works only if the two distributions are + independent or if they are jointly normally distributed. + ''' if isinstance(x2, NormalDist): return NormalDist(x1.mu - x2.mu, hypot(x1.sigma, x2.sigma)) return NormalDist(x1.mu - x2, x1.sigma) def __mul__(x1, x2): + '''Multiply both mu and sigma by a constant. + + Used for rescaling, perhaps to change measurement units. + Sigma is scaled with the absolute value of the constant. + ''' return NormalDist(x1.mu * x2, x1.sigma * fabs(x2)) def __truediv__(x1, x2): + '''Divide both mu and sigma by a constant. + + Used for rescaling, perhaps to change measurement units. + Sigma is scaled with the absolute value of the constant. + ''' return NormalDist(x1.mu / x2, x1.sigma / fabs(x2)) def __pos__(x1): + 'Return a copy of the instance.' return NormalDist(x1.mu, x1.sigma) def __neg__(x1): + 'Negates mu while keeping sigma the same.' return NormalDist(-x1.mu, x1.sigma) __radd__ = __add__ def __rsub__(x1, x2): + 'Subtract a NormalDist from a constant or another NormalDist.' return -(x1 - x2) __rmul__ = __mul__ def __eq__(x1, x2): + 'Two NormalDist objects are equal if their mu and sigma are both equal.' if not isinstance(x2, NormalDist): return NotImplemented return (x1.mu, x2.sigma) == (x2.mu, x2.sigma) From webhook-mailer at python.org Tue Mar 19 04:31:07 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Tue, 19 Mar 2019 08:31:07 -0000 Subject: [Python-checkins] bpo-36307: Travis: upgrade to Xenial environment (GH-12356) Message-ID: https://github.com/python/cpython/commit/09e5877cb1191fe09af7a2139780d377bdf19092 commit: 09e5877cb1191fe09af7a2139780d377bdf19092 branch: 3.7 author: Inada Naoki committer: GitHub date: 2019-03-19T17:30:58+09:00 summary: bpo-36307: Travis: upgrade to Xenial environment (GH-12356) (cherry picked from commit 74ae50e53e59bbe39d6287b902757f0cd01327dc) Co-authored-by: CAM Gerlach files: M .travis.yml diff --git a/.travis.yml b/.travis.yml index f44cc741ef46..07d26412333c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,5 @@ language: c -dist: trusty -sudo: false +dist: xenial group: beta # To cache doc-building dependencies and C compiler output. @@ -21,6 +20,8 @@ env: # Set rpath with env var instead of -Wl,-rpath linker flag # OpenSSL ignores LDFLAGS when linking bin/openssl - LD_RUN_PATH="${OPENSSL_DIR}/lib" + # python3.x in PATH may be pyenv shims, not real python. + - PYTHON_FOR_REGEN=python3 branches: only: @@ -82,6 +83,7 @@ matrix: before_install: - set -e + - pyenv global 3.7.1 # If this fails, try pyenv versions - | # Check short-circuit conditions if [ "${TESTING}" != "docs" ] From webhook-mailer at python.org Tue Mar 19 05:08:41 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Tue, 19 Mar 2019 09:08:41 -0000 Subject: [Python-checkins] bpo-36307: Travis: upgrade to Xenial environment (GH-12356) Message-ID: https://github.com/python/cpython/commit/0f68d4af3b9410821ee67cbb5a445b341d5c82e4 commit: 0f68d4af3b9410821ee67cbb5a445b341d5c82e4 branch: 2.7 author: Inada Naoki committer: GitHub date: 2019-03-19T18:08:36+09:00 summary: bpo-36307: Travis: upgrade to Xenial environment (GH-12356) (cherry picked from commit 74ae50e53e59bbe39d6287b902757f0cd01327dc) Co-authored-by: CAM Gerlach files: M .travis.yml diff --git a/.travis.yml b/.travis.yml index 7e1c2ef8756e..80e9be7c1962 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,5 @@ language: c -dist: trusty -sudo: false +dist: xenial group: beta # To cache doc-building dependencies and C compiler output. From webhook-mailer at python.org Tue Mar 19 06:43:34 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 19 Mar 2019 10:43:34 -0000 Subject: [Python-checkins] [2.7] bpo-18368: Fix memory leaks in PyOS_StdioReadline() when realloc() fails (GH-12334) Message-ID: https://github.com/python/cpython/commit/d9c6564f90ead067c2e288f01825684821b7a129 commit: d9c6564f90ead067c2e288f01825684821b7a129 branch: 2.7 author: stratakis committer: Victor Stinner date: 2019-03-19T11:43:20+01:00 summary: [2.7] bpo-18368: Fix memory leaks in PyOS_StdioReadline() when realloc() fails (GH-12334) (cherry picked from commit 9ae513caa74a05970458dee17fb995ea49965bb5) files: A Misc/NEWS.d/next/Core and Builtins/2019-03-14-17-30-46.bpo-18368.WXaHAo.rst M Parser/myreadline.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-14-17-30-46.bpo-18368.WXaHAo.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-14-17-30-46.bpo-18368.WXaHAo.rst new file mode 100644 index 000000000000..7f2fb898fbc6 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-14-17-30-46.bpo-18368.WXaHAo.rst @@ -0,0 +1 @@ +PyOS_StdioReadline() no longer leaks memory when realloc() fails. diff --git a/Parser/myreadline.c b/Parser/myreadline.c index 59db41ab1696..537621402b8d 100644 --- a/Parser/myreadline.c +++ b/Parser/myreadline.c @@ -108,7 +108,7 @@ char * PyOS_StdioReadline(FILE *sys_stdin, FILE *sys_stdout, char *prompt) { size_t n; - char *p; + char *p, *pr; n = 100; if ((p = (char *)PyMem_MALLOC(n)) == NULL) return NULL; @@ -140,17 +140,29 @@ PyOS_StdioReadline(FILE *sys_stdin, FILE *sys_stdout, char *prompt) n = strlen(p); while (n > 0 && p[n-1] != '\n') { size_t incr = n+2; - p = (char *)PyMem_REALLOC(p, n + incr); - if (p == NULL) - return NULL; if (incr > INT_MAX) { + PyMem_FREE(p); PyErr_SetString(PyExc_OverflowError, "input line too long"); + return NULL; + } + pr = (char *)PyMem_REALLOC(p, n + incr); + if (pr == NULL) { + PyMem_FREE(p); + PyErr_NoMemory(); + return NULL; } + p = pr; if (my_fgets(p+n, (int)incr, sys_stdin) != 0) break; n += strlen(p+n); } - return (char *)PyMem_REALLOC(p, n+1); + pr = (char *)PyMem_REALLOC(p, n+1); + if (pr == NULL) { + PyMem_FREE(p); + PyErr_NoMemory(); + return NULL; + } + return pr; } From webhook-mailer at python.org Tue Mar 19 06:50:30 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 19 Mar 2019 10:50:30 -0000 Subject: [Python-checkins] bpo-36356: Fix memory leak in _PyPreConfig_Read() (GH-12425) Message-ID: https://github.com/python/cpython/commit/e130a07eb20c4b655d182d5d10d778c7584efe55 commit: e130a07eb20c4b655d182d5d10d778c7584efe55 branch: master author: btharper committer: Victor Stinner date: 2019-03-19T11:50:25+01:00 summary: bpo-36356: Fix memory leak in _PyPreConfig_Read() (GH-12425) _PyPreConfig_Read() now free 'old_old' at exit. files: A Misc/NEWS.d/next/Build/2019-03-18-23-49-15.bpo-36356.WNrwYI.rst M Python/preconfig.c diff --git a/Misc/NEWS.d/next/Build/2019-03-18-23-49-15.bpo-36356.WNrwYI.rst b/Misc/NEWS.d/next/Build/2019-03-18-23-49-15.bpo-36356.WNrwYI.rst new file mode 100644 index 000000000000..d30f5d586b7c --- /dev/null +++ b/Misc/NEWS.d/next/Build/2019-03-18-23-49-15.bpo-36356.WNrwYI.rst @@ -0,0 +1 @@ +Fix leaks that led to build failure when configured with address sanitizer. diff --git a/Python/preconfig.c b/Python/preconfig.c index 1efc7ee5c56e..b03436181c86 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -514,6 +514,7 @@ _PyPreConfig_Read(_PyPreConfig *config) err = preconfig_read(config, NULL); setlocale(LC_CTYPE, old_loc); + PyMem_RawFree(old_loc); return err; } From webhook-mailer at python.org Tue Mar 19 06:51:36 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 19 Mar 2019 10:51:36 -0000 Subject: [Python-checkins] bpo-36333: Fix leak _PyRuntimeState_Fini (GH-12400) Message-ID: https://github.com/python/cpython/commit/943395fab925a11ea90d078e771cdfc4443e8c34 commit: 943395fab925a11ea90d078e771cdfc4443e8c34 branch: master author: St?phane Wirtel committer: Victor Stinner date: 2019-03-19T11:51:32+01:00 summary: bpo-36333: Fix leak _PyRuntimeState_Fini (GH-12400) files: A Misc/NEWS.d/next/Core and Builtins/2019-03-18-10-56-53.bpo-36333.4dqemZ.rst M Python/pystate.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-18-10-56-53.bpo-36333.4dqemZ.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-18-10-56-53.bpo-36333.4dqemZ.rst new file mode 100644 index 000000000000..e5af44fda409 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-18-10-56-53.bpo-36333.4dqemZ.rst @@ -0,0 +1 @@ +Fix leak in _PyRuntimeState_Fini. Contributed by St?phane Wirtel. diff --git a/Python/pystate.c b/Python/pystate.c index 6a2dc102ecfe..36566b767155 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -92,6 +92,11 @@ _PyRuntimeState_Fini(_PyRuntimeState *runtime) runtime->interpreters.mutex = NULL; } + if (runtime->xidregistry.mutex != NULL) { + PyThread_free_lock(runtime->xidregistry.mutex); + runtime->xidregistry.mutex = NULL; + } + PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); } From webhook-mailer at python.org Tue Mar 19 09:10:25 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Tue, 19 Mar 2019 13:10:25 -0000 Subject: [Python-checkins] bpo-8677: use PY_SSIZE_T_CLEAN in sqlite (GH-12434) Message-ID: https://github.com/python/cpython/commit/29198ea1c6d58f87389136b0ac0b8b2318dbac24 commit: 29198ea1c6d58f87389136b0ac0b8b2318dbac24 branch: master author: Inada Naoki committer: GitHub date: 2019-03-19T22:10:18+09:00 summary: bpo-8677: use PY_SSIZE_T_CLEAN in sqlite (GH-12434) Modules/_sqlite/cursor.c uses "y#" format. It didn't declare PY_SSIZE_T_CLEAN, but the argument is Py_ssize_t already. files: M Modules/_sqlite/cache.h M Modules/_sqlite/connection.h M Modules/_sqlite/cursor.h M Modules/_sqlite/microprotocols.h M Modules/_sqlite/module.h M Modules/_sqlite/prepare_protocol.h M Modules/_sqlite/row.h M Modules/_sqlite/statement.h M Modules/_sqlite/util.h diff --git a/Modules/_sqlite/cache.h b/Modules/_sqlite/cache.h index a133903961da..529010967c4f 100644 --- a/Modules/_sqlite/cache.h +++ b/Modules/_sqlite/cache.h @@ -23,6 +23,7 @@ #ifndef PYSQLITE_CACHE_H #define PYSQLITE_CACHE_H +#define PY_SSIZE_T_CLEAN #include "Python.h" /* The LRU cache is implemented as a combination of a doubly-linked with a diff --git a/Modules/_sqlite/connection.h b/Modules/_sqlite/connection.h index 5fb410a62e53..4e9d94c5f308 100644 --- a/Modules/_sqlite/connection.h +++ b/Modules/_sqlite/connection.h @@ -23,6 +23,7 @@ #ifndef PYSQLITE_CONNECTION_H #define PYSQLITE_CONNECTION_H +#define PY_SSIZE_T_CLEAN #include "Python.h" #include "pythread.h" #include "structmember.h" diff --git a/Modules/_sqlite/cursor.h b/Modules/_sqlite/cursor.h index 28bbd5f91175..4a20e756f782 100644 --- a/Modules/_sqlite/cursor.h +++ b/Modules/_sqlite/cursor.h @@ -23,6 +23,7 @@ #ifndef PYSQLITE_CURSOR_H #define PYSQLITE_CURSOR_H +#define PY_SSIZE_T_CLEAN #include "Python.h" #include "statement.h" diff --git a/Modules/_sqlite/microprotocols.h b/Modules/_sqlite/microprotocols.h index 99ff6f642b25..5418c2b98fd7 100644 --- a/Modules/_sqlite/microprotocols.h +++ b/Modules/_sqlite/microprotocols.h @@ -26,6 +26,7 @@ #ifndef PSYCOPG_MICROPROTOCOLS_H #define PSYCOPG_MICROPROTOCOLS_H 1 +#define PY_SSIZE_T_CLEAN #include /** the names of the three mandatory methods **/ diff --git a/Modules/_sqlite/module.h b/Modules/_sqlite/module.h index 6f90934b325d..3185ec978885 100644 --- a/Modules/_sqlite/module.h +++ b/Modules/_sqlite/module.h @@ -23,6 +23,7 @@ #ifndef PYSQLITE_MODULE_H #define PYSQLITE_MODULE_H +#define PY_SSIZE_T_CLEAN #include "Python.h" #define PYSQLITE_VERSION "2.6.0" diff --git a/Modules/_sqlite/prepare_protocol.h b/Modules/_sqlite/prepare_protocol.h index 924e16223acf..3998a55e51ca 100644 --- a/Modules/_sqlite/prepare_protocol.h +++ b/Modules/_sqlite/prepare_protocol.h @@ -23,6 +23,7 @@ #ifndef PYSQLITE_PREPARE_PROTOCOL_H #define PYSQLITE_PREPARE_PROTOCOL_H +#define PY_SSIZE_T_CLEAN #include "Python.h" typedef struct diff --git a/Modules/_sqlite/row.h b/Modules/_sqlite/row.h index d014109032ad..4ad506f8dd96 100644 --- a/Modules/_sqlite/row.h +++ b/Modules/_sqlite/row.h @@ -23,6 +23,7 @@ #ifndef PYSQLITE_ROW_H #define PYSQLITE_ROW_H +#define PY_SSIZE_T_CLEAN #include "Python.h" typedef struct _Row diff --git a/Modules/_sqlite/statement.h b/Modules/_sqlite/statement.h index fd88d7d6622c..5002f02dc5b3 100644 --- a/Modules/_sqlite/statement.h +++ b/Modules/_sqlite/statement.h @@ -23,6 +23,7 @@ #ifndef PYSQLITE_STATEMENT_H #define PYSQLITE_STATEMENT_H +#define PY_SSIZE_T_CLEAN #include "Python.h" #include "connection.h" diff --git a/Modules/_sqlite/util.h b/Modules/_sqlite/util.h index abaefd8b87b8..626191118f92 100644 --- a/Modules/_sqlite/util.h +++ b/Modules/_sqlite/util.h @@ -23,6 +23,7 @@ #ifndef PYSQLITE_UTIL_H #define PYSQLITE_UTIL_H +#define PY_SSIZE_T_CLEAN #include "Python.h" #include "pythread.h" #include "sqlite3.h" From webhook-mailer at python.org Tue Mar 19 09:19:44 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 19 Mar 2019 13:19:44 -0000 Subject: [Python-checkins] bpo-36333, bpo-36356: Fix _PyEval_FiniThreads() (GH-12432) Message-ID: https://github.com/python/cpython/commit/a712679a2bffffefaacdc05f788d6ea50f72a561 commit: a712679a2bffffefaacdc05f788d6ea50f72a561 branch: master author: Victor Stinner committer: GitHub date: 2019-03-19T14:19:38+01:00 summary: bpo-36333, bpo-36356: Fix _PyEval_FiniThreads() (GH-12432) _PyEval_FiniThreads() now free the pending lock. files: M Python/ceval.c diff --git a/Python/ceval.c b/Python/ceval.c index d6a0b335955e..40320bf35703 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -169,8 +169,10 @@ PyEval_ThreadsInitialized(void) void PyEval_InitThreads(void) { - if (gil_created()) + if (gil_created()) { return; + } + PyThread_init_thread(); create_gil(); take_gil(_PyThreadState_GET()); @@ -184,10 +186,17 @@ PyEval_InitThreads(void) void _PyEval_FiniThreads(void) { - if (!gil_created()) + if (!gil_created()) { return; + } + destroy_gil(); assert(!gil_created()); + + if (_PyRuntime.ceval.pending.lock != NULL) { + PyThread_free_lock(_PyRuntime.ceval.pending.lock); + _PyRuntime.ceval.pending.lock = NULL; + } } void From webhook-mailer at python.org Tue Mar 19 09:20:33 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 19 Mar 2019 13:20:33 -0000 Subject: [Python-checkins] bpo-36356: Release Unicode interned strings on Valgrind (#12431) Message-ID: https://github.com/python/cpython/commit/fecc4f2b474f16062514e95a67e66080fd626e14 commit: fecc4f2b474f16062514e95a67e66080fd626e14 branch: master author: Victor Stinner committer: GitHub date: 2019-03-19T14:20:29+01:00 summary: bpo-36356: Release Unicode interned strings on Valgrind (#12431) When Python is compiled with Valgrind support, release Unicode interned strings at exit in _PyUnicode_Fini(). * Rename _Py_ReleaseInternedUnicodeStrings() to unicode_release_interned() and make it private. * unicode_release_interned() is now called from _PyUnicode_Fini(): it must be called with a running Python thread state for TRASHCAN, it cannot be called from pymain_free(). * Don't display statistics on interned strings at exit anymore files: M Include/cpython/unicodeobject.h M Modules/main.c M Objects/unicodeobject.c diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index 4eecc963ae2d..806c3aa7cedb 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -722,8 +722,6 @@ PyAPI_FUNC(int) _PyUnicode_FormatAdvancedWriter( Py_ssize_t start, Py_ssize_t end); -PyAPI_FUNC(void) _Py_ReleaseInternedUnicodeStrings(void); - /* --- wchar_t support for platforms which support it --------------------- */ #ifdef HAVE_WCHAR_H diff --git a/Modules/main.c b/Modules/main.c index 50fecc9103d9..8f7a1bfa8308 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -839,18 +839,6 @@ pymain_free(void) _PyPathConfig_ClearGlobal(); _Py_ClearStandardStreamEncoding(); _Py_ClearArgcArgv(); -#ifdef __INSURE__ - /* Insure++ is a memory analysis tool that aids in discovering - * memory leaks and other memory problems. On Python exit, the - * interned string dictionaries are flagged as being in use at exit - * (which it is). Under normal circumstances, this is fine because - * the memory will be automatically reclaimed by the system. Under - * memory debugging, it's a huge source of useless noise, so we - * trade off slower shutdown for less distraction in the memory - * reports. -baw - */ - _Py_ReleaseInternedUnicodeStrings(); -#endif /* __INSURE__ */ } diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 9d3ed0d18b15..6e83ed6bdd43 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -51,6 +51,11 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #endif +/* Uncomment to display statistics on interned strings at exit when + using Valgrind or Insecure++. */ +/* #define INTERNED_STATS 1 */ + + /*[clinic input] class str "PyObject *" "&PyUnicode_Type" [clinic start generated code]*/ @@ -15157,18 +15162,6 @@ PyUnicode_ClearFreeList(void) return 0; } -void -_PyUnicode_Fini(void) -{ - int i; - - Py_CLEAR(unicode_empty); - - for (i = 0; i < 256; i++) - Py_CLEAR(unicode_latin1[i]); - _PyUnicode_ClearStaticStrings(); - (void)PyUnicode_ClearFreeList(); -} void PyUnicode_InternInPlace(PyObject **p) @@ -15233,8 +15226,10 @@ PyUnicode_InternFromString(const char *cp) return s; } -void -_Py_ReleaseInternedUnicodeStrings(void) + +#if defined(WITH_VALGRIND) || defined(__INSURE__) +static void +unicode_release_interned(void) { PyObject *keys; PyObject *s; @@ -15249,14 +15244,16 @@ _Py_ReleaseInternedUnicodeStrings(void) return; } - /* Since _Py_ReleaseInternedUnicodeStrings() is intended to help a leak + /* Since unicode_release_interned() is intended to help a leak detector, interned unicode strings are not forcibly deallocated; rather, we give them their stolen references back, and then clear and DECREF the interned dict. */ n = PyList_GET_SIZE(keys); +#ifdef INTERNED_STATS fprintf(stderr, "releasing %" PY_FORMAT_SIZE_T "d interned strings\n", n); +#endif for (i = 0; i < n; i++) { s = PyList_GET_ITEM(keys, i); if (PyUnicode_READY(s) == -1) { @@ -15279,13 +15276,16 @@ _Py_ReleaseInternedUnicodeStrings(void) } _PyUnicode_STATE(s).interned = SSTATE_NOT_INTERNED; } +#ifdef INTERNED_STATS fprintf(stderr, "total size of all interned strings: " "%" PY_FORMAT_SIZE_T "d/%" PY_FORMAT_SIZE_T "d " "mortal/immortal\n", mortal_size, immortal_size); +#endif Py_DECREF(keys); PyDict_Clear(interned); Py_CLEAR(interned); } +#endif /********************* Unicode Iterator **************************/ @@ -15564,6 +15564,33 @@ PyUnicode_AsUnicodeCopy(PyObject *unicode) return copy; } + +void +_PyUnicode_Fini(void) +{ +#if defined(WITH_VALGRIND) || defined(__INSURE__) + /* Insure++ is a memory analysis tool that aids in discovering + * memory leaks and other memory problems. On Python exit, the + * interned string dictionaries are flagged as being in use at exit + * (which it is). Under normal circumstances, this is fine because + * the memory will be automatically reclaimed by the system. Under + * memory debugging, it's a huge source of useless noise, so we + * trade off slower shutdown for less distraction in the memory + * reports. -baw + */ + unicode_release_interned(); +#endif /* __INSURE__ */ + + Py_CLEAR(unicode_empty); + + for (Py_ssize_t i = 0; i < 256; i++) { + Py_CLEAR(unicode_latin1[i]); + } + _PyUnicode_ClearStaticStrings(); + (void)PyUnicode_ClearFreeList(); +} + + /* A _string module, to export formatter_parser and formatter_field_name_split to the string.Formatter class implemented in Python. */ From webhook-mailer at python.org Tue Mar 19 09:54:02 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 19 Mar 2019 13:54:02 -0000 Subject: [Python-checkins] bpo-36356: pymain_free() calls _PyRuntime_Finalize() (GH-12435) Message-ID: https://github.com/python/cpython/commit/f5f336a819a3d881bb217bf8f9b5cacba03a4e45 commit: f5f336a819a3d881bb217bf8f9b5cacba03a4e45 branch: master author: Victor Stinner committer: GitHub date: 2019-03-19T14:53:58+01:00 summary: bpo-36356: pymain_free() calls _PyRuntime_Finalize() (GH-12435) Ensure that _PyRuntime_Finalize() is always call. This change fix a few memory leaks when running "python3 -V". files: M Include/internal/pycore_pystate.h M Modules/main.c diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 703a85b96b4e..7c9d11aec36c 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -184,6 +184,8 @@ PyAPI_FUNC(void) _PyRuntimeState_ReInitThreads(void); Return NULL on success, or return an error message on failure. */ PyAPI_FUNC(_PyInitError) _PyRuntime_Initialize(void); +PyAPI_FUNC(void) _PyRuntime_Finalize(void); + #define _Py_CURRENTLY_FINALIZING(tstate) \ (_PyRuntime.finalizing == tstate) diff --git a/Modules/main.c b/Modules/main.c index 8f7a1bfa8308..99396b73c650 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -839,6 +839,7 @@ pymain_free(void) _PyPathConfig_ClearGlobal(); _Py_ClearStandardStreamEncoding(); _Py_ClearArgcArgv(); + _PyRuntime_Finalize(); } From webhook-mailer at python.org Tue Mar 19 10:08:23 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 19 Mar 2019 14:08:23 -0000 Subject: [Python-checkins] bpo-36356: pymain_free() calls _PyRuntime_Finalize() (GH-12436) Message-ID: https://github.com/python/cpython/commit/935250d6f3ac7ba91e1ea8e6ca63aaf7f605e291 commit: 935250d6f3ac7ba91e1ea8e6ca63aaf7f605e291 branch: 3.7 author: Victor Stinner committer: GitHub date: 2019-03-19T15:08:17+01:00 summary: bpo-36356: pymain_free() calls _PyRuntime_Finalize() (GH-12436) Ensure that _PyRuntime_Finalize() is always call. This change fix a few memory leaks when running "python3 -V". files: M Include/internal/pystate.h M Modules/main.c diff --git a/Include/internal/pystate.h b/Include/internal/pystate.h index 721d34fa4c19..5891339b5434 100644 --- a/Include/internal/pystate.h +++ b/Include/internal/pystate.h @@ -118,6 +118,9 @@ PyAPI_FUNC(void) _PyRuntimeState_Fini(_PyRuntimeState *); Return NULL on success, or return an error message on failure. */ PyAPI_FUNC(_PyInitError) _PyRuntime_Initialize(void); +PyAPI_FUNC(void) _PyRuntime_Finalize(void); + + #define _Py_CURRENTLY_FINALIZING(tstate) \ (_PyRuntime.finalizing == tstate) diff --git a/Modules/main.c b/Modules/main.c index a745381109d3..f94689496a38 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -660,6 +660,8 @@ pymain_free_raw(_PyMain *pymain) orig_argc = 0; orig_argv = NULL; + _PyRuntime_Finalize(); + PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); } From webhook-mailer at python.org Tue Mar 19 11:09:37 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 19 Mar 2019 15:09:37 -0000 Subject: [Python-checkins] bpo-36236: Handle removed cwd at Python init (GH-12424) Message-ID: https://github.com/python/cpython/commit/dcf617152e1d4c4a5e7965733928858a9c0936ca commit: dcf617152e1d4c4a5e7965733928858a9c0936ca branch: master author: Victor Stinner committer: GitHub date: 2019-03-19T16:09:27+01:00 summary: bpo-36236: Handle removed cwd at Python init (GH-12424) At Python initialization, the current directory is no longer prepended to sys.path if it has been removed. Rename _PyPathConfig_ComputeArgv0() to _PyPathConfig_ComputeSysPath0() to avoid confusion between argv[0] and sys.path[0]. files: A Misc/NEWS.d/next/Core and Builtins/2019-03-19-03-08-26.bpo-36236.5qN9qK.rst M Include/internal/pycore_pathconfig.h M Modules/main.c M Python/pathconfig.c M Python/sysmodule.c diff --git a/Include/internal/pycore_pathconfig.h b/Include/internal/pycore_pathconfig.h index d0938df54145..80d86a0dd1b5 100644 --- a/Include/internal/pycore_pathconfig.h +++ b/Include/internal/pycore_pathconfig.h @@ -44,7 +44,9 @@ PyAPI_FUNC(_PyInitError) _PyPathConfig_SetGlobal( PyAPI_FUNC(_PyInitError) _PyPathConfig_Calculate_impl( _PyPathConfig *config, const _PyCoreConfig *core_config); -PyAPI_FUNC(PyObject*) _PyPathConfig_ComputeArgv0(const _PyWstrList *argv); +PyAPI_FUNC(int) _PyPathConfig_ComputeSysPath0( + const _PyWstrList *argv, + PyObject **path0); PyAPI_FUNC(int) _Py_FindEnvConfigValue( FILE *env_file, const wchar_t *key, diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-19-03-08-26.bpo-36236.5qN9qK.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-19-03-08-26.bpo-36236.5qN9qK.rst new file mode 100644 index 000000000000..e1c1182d181a --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-19-03-08-26.bpo-36236.5qN9qK.rst @@ -0,0 +1,2 @@ +At Python initialization, the current directory is no longer prepended to +:data:`sys.path` if it has been removed. diff --git a/Modules/main.c b/Modules/main.c index 99396b73c650..df4eca5aae84 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -780,18 +780,20 @@ pymain_run_python(PyInterpreterState *interp, int *exitcode) } } else if (!config->preconfig.isolated) { - PyObject *path0 = _PyPathConfig_ComputeArgv0(&config->argv); - if (path0 == NULL) { - err = _Py_INIT_NO_MEMORY(); - goto done; - } + PyObject *path0 = NULL; + if (_PyPathConfig_ComputeSysPath0(&config->argv, &path0)) { + if (path0 == NULL) { + err = _Py_INIT_NO_MEMORY(); + goto done; + } - if (pymain_sys_path_add_path0(interp, path0) < 0) { + if (pymain_sys_path_add_path0(interp, path0) < 0) { + Py_DECREF(path0); + err = _Py_INIT_EXIT(1); + goto done; + } Py_DECREF(path0); - err = _Py_INIT_EXIT(1); - goto done; } - Py_DECREF(path0); } PyCompilerFlags cf = {.cf_flags = 0, .cf_feature_version = PY_MINOR_VERSION}; diff --git a/Python/pathconfig.c b/Python/pathconfig.c index f1818eb30765..743e1cd1ac0b 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -566,9 +566,18 @@ Py_GetProgramName(void) return _Py_path_config.program_name; } -/* Compute argv[0] which will be prepended to sys.argv */ -PyObject* -_PyPathConfig_ComputeArgv0(const _PyWstrList *argv) +/* Compute module search path from argv[0] or the current working + directory ("-m module" case) which will be prepended to sys.argv: + sys.path[0]. + + Return 1 if the path is correctly resolved, but *path0_p can be NULL + if the Unicode object fail to be created. + + Return 0 if it fails to resolve the full path (and *path0_p will be NULL), + for example if the current working directory has been removed (bpo-36236). + */ +int +_PyPathConfig_ComputeSysPath0(const _PyWstrList *argv, PyObject **path0_p) { assert(_PyWstrList_CheckConsistency(argv)); @@ -588,6 +597,8 @@ _PyPathConfig_ComputeArgv0(const _PyWstrList *argv) wchar_t fullpath[MAX_PATH]; #endif + assert(*path0_p == NULL); + if (argv->length > 0) { argv0 = argv->items[0]; have_module_arg = (wcscmp(argv0, L"-m") == 0); @@ -595,14 +606,17 @@ _PyPathConfig_ComputeArgv0(const _PyWstrList *argv) } if (have_module_arg) { - #if defined(HAVE_REALPATH) || defined(MS_WINDOWS) - _Py_wgetcwd(fullpath, Py_ARRAY_LENGTH(fullpath)); +#if defined(HAVE_REALPATH) || defined(MS_WINDOWS) + if (!_Py_wgetcwd(fullpath, Py_ARRAY_LENGTH(fullpath))) { + *path0_p = NULL; + return 0; + } argv0 = fullpath; n = wcslen(argv0); - #else +#else argv0 = L"."; n = 1; - #endif +#endif } #ifdef HAVE_READLINK @@ -675,7 +689,8 @@ _PyPathConfig_ComputeArgv0(const _PyWstrList *argv) } #endif /* All others */ - return PyUnicode_FromWideChar(argv0, n); + *path0_p = PyUnicode_FromWideChar(argv0, n); + return 1; } diff --git a/Python/sysmodule.c b/Python/sysmodule.c index b3330a01f7c1..4351a7fb370d 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -2781,19 +2781,21 @@ PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath) /* If argv[0] is not '-c' nor '-m', prepend argv[0] to sys.path. If argv[0] is a symlink, use the real path. */ const _PyWstrList argv_list = {.length = argc, .items = argv}; - PyObject *argv0 = _PyPathConfig_ComputeArgv0(&argv_list); - if (argv0 == NULL) { - Py_FatalError("can't compute path0 from argv"); - } + PyObject *path0 = NULL; + if (_PyPathConfig_ComputeSysPath0(&argv_list, &path0)) { + if (path0 == NULL) { + Py_FatalError("can't compute path0 from argv"); + } - PyObject *sys_path = _PySys_GetObjectId(&PyId_path); - if (sys_path != NULL) { - if (PyList_Insert(sys_path, 0, argv0) < 0) { - Py_DECREF(argv0); - Py_FatalError("can't prepend path0 to sys.path"); + PyObject *sys_path = _PySys_GetObjectId(&PyId_path); + if (sys_path != NULL) { + if (PyList_Insert(sys_path, 0, path0) < 0) { + Py_DECREF(path0); + Py_FatalError("can't prepend path0 to sys.path"); + } } + Py_DECREF(path0); } - Py_DECREF(argv0); } } From webhook-mailer at python.org Tue Mar 19 13:18:07 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Tue, 19 Mar 2019 17:18:07 -0000 Subject: [Python-checkins] bpo-36367: Free buffer if realloc fails in tokenize.c (GH-12442) Message-ID: https://github.com/python/cpython/commit/cb90c89de14aab636739b3e810cf949e47b54a0c commit: cb90c89de14aab636739b3e810cf949e47b54a0c branch: master author: Pablo Galindo committer: GitHub date: 2019-03-19T17:17:58Z summary: bpo-36367: Free buffer if realloc fails in tokenize.c (GH-12442) files: M Parser/tokenizer.c diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index 8f0a9c810053..ad054975689e 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -649,9 +649,14 @@ translate_newlines(const char *s, int exec_input, struct tok_state *tok) { } *current = '\0'; final_length = current - buf + 1; - if (final_length < needed_length && final_length) + if (final_length < needed_length && final_length) { /* should never fail */ - buf = PyMem_REALLOC(buf, final_length); + char* result = PyMem_REALLOC(buf, final_length); + if (result == NULL) { + PyMem_FREE(buf); + } + buf = result; + } return buf; } @@ -958,6 +963,7 @@ tok_nextc(struct tok_state *tok) newbuf = (char *)PyMem_REALLOC(newbuf, newsize); if (newbuf == NULL) { + PyMem_FREE(tok->buf); tok->done = E_NOMEM; tok->cur = tok->inp; return EOF; From webhook-mailer at python.org Tue Mar 19 13:22:59 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 19 Mar 2019 17:22:59 -0000 Subject: [Python-checkins] bpo-36236: Fix _PyPathConfig_ComputeSysPath0() for empty argv (GH-12441) Message-ID: https://github.com/python/cpython/commit/fc96e5474a7bda1c5dec66420e4467fc9f7ca968 commit: fc96e5474a7bda1c5dec66420e4467fc9f7ca968 branch: master author: Victor Stinner committer: GitHub date: 2019-03-19T18:22:55+01:00 summary: bpo-36236: Fix _PyPathConfig_ComputeSysPath0() for empty argv (GH-12441) * _PyPathConfig_ComputeSysPath0() now returns 0 if argv is empty. * Cleanup also _PyPathConfig_ComputeSysPath0() code: move variables definitions closer to where they are used. files: M Python/pathconfig.c diff --git a/Python/pathconfig.c b/Python/pathconfig.c index 743e1cd1ac0b..0ccb898e4290 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -573,79 +573,84 @@ Py_GetProgramName(void) Return 1 if the path is correctly resolved, but *path0_p can be NULL if the Unicode object fail to be created. - Return 0 if it fails to resolve the full path (and *path0_p will be NULL), - for example if the current working directory has been removed (bpo-36236). + Return 0 if it fails to resolve the full path (and *path0_p will be NULL). + For example, return 0 if the current working directory has been removed + (bpo-36236) or if argv is empty. */ int _PyPathConfig_ComputeSysPath0(const _PyWstrList *argv, PyObject **path0_p) { assert(_PyWstrList_CheckConsistency(argv)); + assert(*path0_p == NULL); - wchar_t *argv0; - wchar_t *p = NULL; + if (argv->length == 0) { + /* Leave sys.path unchanged if sys.argv is empty */ + return 0; + } + + wchar_t *argv0 = argv->items[0]; + int have_module_arg = (wcscmp(argv0, L"-m") == 0); + int have_script_arg = (!have_module_arg && (wcscmp(argv0, L"-c") != 0)); + + wchar_t *path0 = argv0; Py_ssize_t n = 0; - int have_script_arg = 0; - int have_module_arg = 0; -#ifdef HAVE_READLINK - wchar_t link[MAXPATHLEN + 1]; - wchar_t argv0copy[2 * MAXPATHLEN + 1]; - int nr = 0; -#endif -#if defined(HAVE_REALPATH) + +#ifdef HAVE_REALPATH wchar_t fullpath[MAXPATHLEN]; #elif defined(MS_WINDOWS) wchar_t fullpath[MAX_PATH]; #endif - assert(*path0_p == NULL); - - if (argv->length > 0) { - argv0 = argv->items[0]; - have_module_arg = (wcscmp(argv0, L"-m") == 0); - have_script_arg = !have_module_arg && (wcscmp(argv0, L"-c") != 0); - } - if (have_module_arg) { #if defined(HAVE_REALPATH) || defined(MS_WINDOWS) - if (!_Py_wgetcwd(fullpath, Py_ARRAY_LENGTH(fullpath))) { - *path0_p = NULL; - return 0; - } - argv0 = fullpath; - n = wcslen(argv0); + if (!_Py_wgetcwd(fullpath, Py_ARRAY_LENGTH(fullpath))) { + return 0; + } + path0 = fullpath; #else - argv0 = L"."; - n = 1; + path0 = L"."; #endif + n = wcslen(path0); } #ifdef HAVE_READLINK - if (have_script_arg) - nr = _Py_wreadlink(argv0, link, Py_ARRAY_LENGTH(link)); + wchar_t link[MAXPATHLEN + 1]; + int nr = 0; + + if (have_script_arg) { + nr = _Py_wreadlink(path0, link, Py_ARRAY_LENGTH(link)); + } if (nr > 0) { /* It's a symlink */ link[nr] = '\0'; - if (link[0] == SEP) - argv0 = link; /* Link to absolute path */ - else if (wcschr(link, SEP) == NULL) - ; /* Link without path */ + if (link[0] == SEP) { + path0 = link; /* Link to absolute path */ + } + else if (wcschr(link, SEP) == NULL) { + /* Link without path */ + } else { - /* Must join(dirname(argv0), link) */ - wchar_t *q = wcsrchr(argv0, SEP); - if (q == NULL) - argv0 = link; /* argv0 without path */ + /* Must join(dirname(path0), link) */ + wchar_t *q = wcsrchr(path0, SEP); + if (q == NULL) { + /* path0 without path */ + path0 = link; + } else { - /* Must make a copy, argv0copy has room for 2 * MAXPATHLEN */ - wcsncpy(argv0copy, argv0, MAXPATHLEN); - q = wcsrchr(argv0copy, SEP); + /* Must make a copy, path0copy has room for 2 * MAXPATHLEN */ + wchar_t path0copy[2 * MAXPATHLEN + 1]; + wcsncpy(path0copy, path0, MAXPATHLEN); + q = wcsrchr(path0copy, SEP); wcsncpy(q+1, link, MAXPATHLEN); q[MAXPATHLEN + 1] = L'\0'; - argv0 = argv0copy; + path0 = path0copy; } } } #endif /* HAVE_READLINK */ + wchar_t *p = NULL; + #if SEP == '\\' /* Special case for Microsoft filename syntax */ if (have_script_arg) { @@ -653,43 +658,46 @@ _PyPathConfig_ComputeSysPath0(const _PyWstrList *argv, PyObject **path0_p) #if defined(MS_WINDOWS) /* Replace the first element in argv with the full path. */ wchar_t *ptemp; - if (GetFullPathNameW(argv0, + if (GetFullPathNameW(path0, Py_ARRAY_LENGTH(fullpath), fullpath, &ptemp)) { - argv0 = fullpath; + path0 = fullpath; } #endif - p = wcsrchr(argv0, SEP); + p = wcsrchr(path0, SEP); /* Test for alternate separator */ - q = wcsrchr(p ? p : argv0, '/'); + q = wcsrchr(p ? p : path0, '/'); if (q != NULL) p = q; if (p != NULL) { - n = p + 1 - argv0; + n = p + 1 - path0; if (n > 1 && p[-1] != ':') n--; /* Drop trailing separator */ } } -#else /* All other filename syntaxes */ +#else + /* All other filename syntaxes */ if (have_script_arg) { #if defined(HAVE_REALPATH) - if (_Py_wrealpath(argv0, fullpath, Py_ARRAY_LENGTH(fullpath))) { - argv0 = fullpath; + if (_Py_wrealpath(path0, fullpath, Py_ARRAY_LENGTH(fullpath))) { + path0 = fullpath; } #endif - p = wcsrchr(argv0, SEP); + p = wcsrchr(path0, SEP); } if (p != NULL) { - n = p + 1 - argv0; + n = p + 1 - path0; #if SEP == '/' /* Special case for Unix filename syntax */ - if (n > 1) - n--; /* Drop trailing separator */ + if (n > 1) { + /* Drop trailing separator */ + n--; + } #endif /* Unix */ } #endif /* All others */ - *path0_p = PyUnicode_FromWideChar(argv0, n); + *path0_p = PyUnicode_FromWideChar(path0, n); return 1; } From webhook-mailer at python.org Tue Mar 19 15:48:10 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 19 Mar 2019 19:48:10 -0000 Subject: [Python-checkins] NormalDist.inv_cdf(): In-line constants because the variable names were not informative (GH-12446) Message-ID: https://github.com/python/cpython/commit/52a594bd0df82f28b1bdb71a75e9c6fc1447f8ae commit: 52a594bd0df82f28b1bdb71a75e9c6fc1447f8ae branch: master author: Raymond Hettinger committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-19T12:48:04-07:00 summary: NormalDist.inv_cdf(): In-line constants because the variable names were not informative (GH-12446) files: M Lib/statistics.py diff --git a/Lib/statistics.py b/Lib/statistics.py index d75bf4e2c387..5ae122a4add9 100644 --- a/Lib/statistics.py +++ b/Lib/statistics.py @@ -766,74 +766,61 @@ def inv_cdf(self, p): q = p - 0.5 if fabs(q) <= 0.425: - a0 = 3.38713_28727_96366_6080e+0 - a1 = 1.33141_66789_17843_7745e+2 - a2 = 1.97159_09503_06551_4427e+3 - a3 = 1.37316_93765_50946_1125e+4 - a4 = 4.59219_53931_54987_1457e+4 - a5 = 6.72657_70927_00870_0853e+4 - a6 = 3.34305_75583_58812_8105e+4 - a7 = 2.50908_09287_30122_6727e+3 - b1 = 4.23133_30701_60091_1252e+1 - b2 = 6.87187_00749_20579_0830e+2 - b3 = 5.39419_60214_24751_1077e+3 - b4 = 2.12137_94301_58659_5867e+4 - b5 = 3.93078_95800_09271_0610e+4 - b6 = 2.87290_85735_72194_2674e+4 - b7 = 5.22649_52788_52854_5610e+3 r = 0.180625 - q * q - num = (q * (((((((a7 * r + a6) * r + a5) * r + a4) * r + a3) - * r + a2) * r + a1) * r + a0)) - den = ((((((((b7 * r + b6) * r + b5) * r + b4) * r + b3) - * r + b2) * r + b1) * r + 1.0)) + num = (q * (((((((2.50908_09287_30122_6727e+3 * r + + 3.34305_75583_58812_8105e+4) * r + + 6.72657_70927_00870_0853e+4) * r + + 4.59219_53931_54987_1457e+4) * r + + 1.37316_93765_50946_1125e+4) * r + + 1.97159_09503_06551_4427e+3) * r + + 1.33141_66789_17843_7745e+2) * r + + 3.38713_28727_96366_6080e+0)) + den = ((((((((5.22649_52788_52854_5610e+3 * r + + 2.87290_85735_72194_2674e+4) * r + + 3.93078_95800_09271_0610e+4) * r + + 2.12137_94301_58659_5867e+4) * r + + 5.39419_60214_24751_1077e+3) * r + + 6.87187_00749_20579_0830e+2) * r + + 4.23133_30701_60091_1252e+1) * r + 1.0)) x = num / den return self.mu + (x * self.sigma) - r = p if q <= 0.0 else 1.0 - p r = sqrt(-log(r)) if r <= 5.0: - c0 = 1.42343_71107_49683_57734e+0 - c1 = 4.63033_78461_56545_29590e+0 - c2 = 5.76949_72214_60691_40550e+0 - c3 = 3.64784_83247_63204_60504e+0 - c4 = 1.27045_82524_52368_38258e+0 - c5 = 2.41780_72517_74506_11770e-1 - c6 = 2.27238_44989_26918_45833e-2 - c7 = 7.74545_01427_83414_07640e-4 - d1 = 2.05319_16266_37758_82187e+0 - d2 = 1.67638_48301_83803_84940e+0 - d3 = 6.89767_33498_51000_04550e-1 - d4 = 1.48103_97642_74800_74590e-1 - d5 = 1.51986_66563_61645_71966e-2 - d6 = 5.47593_80849_95344_94600e-4 - d7 = 1.05075_00716_44416_84324e-9 r = r - 1.6 - num = ((((((((c7 * r + c6) * r + c5) * r + c4) * r + c3) - * r + c2) * r + c1) * r + c0)) - den = ((((((((d7 * r + d6) * r + d5) * r + d4) * r + d3) - * r + d2) * r + d1) * r + 1.0)) + num = ((((((((7.74545_01427_83414_07640e-4 * r + + 2.27238_44989_26918_45833e-2) * r + + 2.41780_72517_74506_11770e-1) * r + + 1.27045_82524_52368_38258e+0) * r + + 3.64784_83247_63204_60504e+0) * r + + 5.76949_72214_60691_40550e+0) * r + + 4.63033_78461_56545_29590e+0) * r + + 1.42343_71107_49683_57734e+0)) + + den = ((((((((1.05075_00716_44416_84324e-9 * r + + 5.47593_80849_95344_94600e-4) * r + + 1.51986_66563_61645_71966e-2) * r + + 1.48103_97642_74800_74590e-1) * r + + 6.89767_33498_51000_04550e-1) * r + + 1.67638_48301_83803_84940e+0) * r + + 2.05319_16266_37758_82187e+0) * r + 1.0)) else: - e0 = 6.65790_46435_01103_77720e+0 - e1 = 5.46378_49111_64114_36990e+0 - e2 = 1.78482_65399_17291_33580e+0 - e3 = 2.96560_57182_85048_91230e-1 - e4 = 2.65321_89526_57612_30930e-2 - e5 = 1.24266_09473_88078_43860e-3 - e6 = 2.71155_55687_43487_57815e-5 - e7 = 2.01033_43992_92288_13265e-7 - f1 = 5.99832_20655_58879_37690e-1 - f2 = 1.36929_88092_27358_05310e-1 - f3 = 1.48753_61290_85061_48525e-2 - f4 = 7.86869_13114_56132_59100e-4 - f5 = 1.84631_83175_10054_68180e-5 - f6 = 1.42151_17583_16445_88870e-7 - f7 = 2.04426_31033_89939_78564e-15 r = r - 5.0 - num = ((((((((e7 * r + e6) * r + e5) * r + e4) * r + e3) - * r + e2) * r + e1) * r + e0)) - den = ((((((((f7 * r + f6) * r + f5) * r + f4) * r + f3) - * r + f2) * r + f1) * r + 1.0)) - + num = ((((((((2.01033_43992_92288_13265e-7 * r + + 2.71155_55687_43487_57815e-5) * r + + 1.24266_09473_88078_43860e-3) * r + + 2.65321_89526_57612_30930e-2) * r + + 2.96560_57182_85048_91230e-1) * r + + 1.78482_65399_17291_33580e+0) * r + + 5.46378_49111_64114_36990e+0) * r + + 6.65790_46435_01103_77720e+0)) + den = ((((((((2.04426_31033_89939_78564e-15 * r + + 1.42151_17583_16445_88870e-7) * r + + 1.84631_83175_10054_68180e-5) * r + + 7.86869_13114_56132_59100e-4) * r + + 1.48753_61290_85061_48525e-2) * r + + 1.36929_88092_27358_05310e-1) * r + + 5.99832_20655_58879_37690e-1) * r + 1.0)) x = num / den if q < 0.0: x = -x From webhook-mailer at python.org Tue Mar 19 17:29:19 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 19 Mar 2019 21:29:19 -0000 Subject: [Python-checkins] bpo-36324: Improved code formatting for the NormalDist.inv_cdf rational approximation (GH-12448) Message-ID: https://github.com/python/cpython/commit/fe13883f01da855967403acab77e0f16707a56cb commit: fe13883f01da855967403acab77e0f16707a56cb branch: master author: Raymond Hettinger committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-19T14:29:13-07:00 summary: bpo-36324: Improved code formatting for the NormalDist.inv_cdf rational approximation (GH-12448) https://bugs.python.org/issue36324 files: M Lib/statistics.py diff --git a/Lib/statistics.py b/Lib/statistics.py index 5ae122a4add9..e5a62463f015 100644 --- a/Lib/statistics.py +++ b/Lib/statistics.py @@ -767,60 +767,62 @@ def inv_cdf(self, p): q = p - 0.5 if fabs(q) <= 0.425: r = 0.180625 - q * q - num = (q * (((((((2.50908_09287_30122_6727e+3 * r + - 3.34305_75583_58812_8105e+4) * r + - 6.72657_70927_00870_0853e+4) * r + - 4.59219_53931_54987_1457e+4) * r + - 1.37316_93765_50946_1125e+4) * r + - 1.97159_09503_06551_4427e+3) * r + - 1.33141_66789_17843_7745e+2) * r + - 3.38713_28727_96366_6080e+0)) - den = ((((((((5.22649_52788_52854_5610e+3 * r + - 2.87290_85735_72194_2674e+4) * r + - 3.93078_95800_09271_0610e+4) * r + - 2.12137_94301_58659_5867e+4) * r + - 5.39419_60214_24751_1077e+3) * r + - 6.87187_00749_20579_0830e+2) * r + - 4.23133_30701_60091_1252e+1) * r + 1.0)) + num = (((((((2.50908_09287_30122_6727e+3 * r + + 3.34305_75583_58812_8105e+4) * r + + 6.72657_70927_00870_0853e+4) * r + + 4.59219_53931_54987_1457e+4) * r + + 1.37316_93765_50946_1125e+4) * r + + 1.97159_09503_06551_4427e+3) * r + + 1.33141_66789_17843_7745e+2) * r + + 3.38713_28727_96366_6080e+0) * q + den = (((((((5.22649_52788_52854_5610e+3 * r + + 2.87290_85735_72194_2674e+4) * r + + 3.93078_95800_09271_0610e+4) * r + + 2.12137_94301_58659_5867e+4) * r + + 5.39419_60214_24751_1077e+3) * r + + 6.87187_00749_20579_0830e+2) * r + + 4.23133_30701_60091_1252e+1) * r + + 1.0) x = num / den return self.mu + (x * self.sigma) r = p if q <= 0.0 else 1.0 - p r = sqrt(-log(r)) if r <= 5.0: r = r - 1.6 - num = ((((((((7.74545_01427_83414_07640e-4 * r + - 2.27238_44989_26918_45833e-2) * r + - 2.41780_72517_74506_11770e-1) * r + - 1.27045_82524_52368_38258e+0) * r + - 3.64784_83247_63204_60504e+0) * r + - 5.76949_72214_60691_40550e+0) * r + - 4.63033_78461_56545_29590e+0) * r + - 1.42343_71107_49683_57734e+0)) - - den = ((((((((1.05075_00716_44416_84324e-9 * r + - 5.47593_80849_95344_94600e-4) * r + - 1.51986_66563_61645_71966e-2) * r + - 1.48103_97642_74800_74590e-1) * r + - 6.89767_33498_51000_04550e-1) * r + - 1.67638_48301_83803_84940e+0) * r + - 2.05319_16266_37758_82187e+0) * r + 1.0)) + num = (((((((7.74545_01427_83414_07640e-4 * r + + 2.27238_44989_26918_45833e-2) * r + + 2.41780_72517_74506_11770e-1) * r + + 1.27045_82524_52368_38258e+0) * r + + 3.64784_83247_63204_60504e+0) * r + + 5.76949_72214_60691_40550e+0) * r + + 4.63033_78461_56545_29590e+0) * r + + 1.42343_71107_49683_57734e+0) + den = (((((((1.05075_00716_44416_84324e-9 * r + + 5.47593_80849_95344_94600e-4) * r + + 1.51986_66563_61645_71966e-2) * r + + 1.48103_97642_74800_74590e-1) * r + + 6.89767_33498_51000_04550e-1) * r + + 1.67638_48301_83803_84940e+0) * r + + 2.05319_16266_37758_82187e+0) * r + + 1.0) else: r = r - 5.0 - num = ((((((((2.01033_43992_92288_13265e-7 * r + - 2.71155_55687_43487_57815e-5) * r + - 1.24266_09473_88078_43860e-3) * r + - 2.65321_89526_57612_30930e-2) * r + - 2.96560_57182_85048_91230e-1) * r + - 1.78482_65399_17291_33580e+0) * r + - 5.46378_49111_64114_36990e+0) * r + - 6.65790_46435_01103_77720e+0)) - den = ((((((((2.04426_31033_89939_78564e-15 * r + - 1.42151_17583_16445_88870e-7) * r + - 1.84631_83175_10054_68180e-5) * r + - 7.86869_13114_56132_59100e-4) * r + - 1.48753_61290_85061_48525e-2) * r + - 1.36929_88092_27358_05310e-1) * r + - 5.99832_20655_58879_37690e-1) * r + 1.0)) + num = (((((((2.01033_43992_92288_13265e-7 * r + + 2.71155_55687_43487_57815e-5) * r + + 1.24266_09473_88078_43860e-3) * r + + 2.65321_89526_57612_30930e-2) * r + + 2.96560_57182_85048_91230e-1) * r + + 1.78482_65399_17291_33580e+0) * r + + 5.46378_49111_64114_36990e+0) * r + + 6.65790_46435_01103_77720e+0) + den = (((((((2.04426_31033_89939_78564e-15 * r + + 1.42151_17583_16445_88870e-7) * r + + 1.84631_83175_10054_68180e-5) * r + + 7.86869_13114_56132_59100e-4) * r + + 1.48753_61290_85061_48525e-2) * r + + 1.36929_88092_27358_05310e-1) * r + + 5.99832_20655_58879_37690e-1) * r + + 1.0) x = num / den if q < 0.0: x = -x From webhook-mailer at python.org Tue Mar 19 19:03:06 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 19 Mar 2019 23:03:06 -0000 Subject: [Python-checkins] bpo-35388: Fix _PyRuntime_Finalize() (GH-12443) Message-ID: https://github.com/python/cpython/commit/fd23cfa464ab93273370475900819c1ea37c852f commit: fd23cfa464ab93273370475900819c1ea37c852f branch: master author: Victor Stinner committer: GitHub date: 2019-03-20T00:03:01+01:00 summary: bpo-35388: Fix _PyRuntime_Finalize() (GH-12443) Calling _PyRuntime_Initialize() after _PyRuntime_Finalize() now re-initializes _PyRuntime structure. Previously, _PyRuntime_Initialize() did nothing in that case. files: M Python/pylifecycle.c diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 49a2f18e49fa..df9570b2e487 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -69,6 +69,7 @@ static void call_ll_exitfuncs(void); int _Py_UnhandledKeyboardInterrupt = 0; _PyRuntimeState _PyRuntime = _PyRuntimeState_INIT; +static int runtime_initialized = 0; _PyInitError _PyRuntime_Initialize(void) @@ -79,11 +80,10 @@ _PyRuntime_Initialize(void) every Py_Initialize() call, but doing so breaks the runtime. This is because the runtime state is not properly finalized currently. */ - static int initialized = 0; - if (initialized) { + if (runtime_initialized) { return _Py_INIT_OK(); } - initialized = 1; + runtime_initialized = 1; return _PyRuntimeState_Init(&_PyRuntime); } @@ -92,6 +92,7 @@ void _PyRuntime_Finalize(void) { _PyRuntimeState_Fini(&_PyRuntime); + runtime_initialized = 0; } int From webhook-mailer at python.org Tue Mar 19 19:05:55 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 19 Mar 2019 23:05:55 -0000 Subject: [Python-checkins] bpo-36365: Rewrite structseq_repr() using _PyUnicodeWriter (GH-12440) Message-ID: https://github.com/python/cpython/commit/c70ab02df2894c34da2223fc3798c0404b41fd79 commit: c70ab02df2894c34da2223fc3798c0404b41fd79 branch: master author: Victor Stinner committer: GitHub date: 2019-03-20T00:05:51+01:00 summary: bpo-36365: Rewrite structseq_repr() using _PyUnicodeWriter (GH-12440) No longer limit repr(structseq) to 512 bytes. Use _PyUnicodeWriter for better performance and to write directly Unicode rather than encoding repr() value to UTF-8 and then decoding from UTF-8. files: A Misc/NEWS.d/next/Core and Builtins/2019-03-19-15-58-23.bpo-36365.jHaErz.rst M Objects/structseq.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-19-15-58-23.bpo-36365.jHaErz.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-19-15-58-23.bpo-36365.jHaErz.rst new file mode 100644 index 000000000000..206de56f08fb --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-19-15-58-23.bpo-36365.jHaErz.rst @@ -0,0 +1 @@ +repr(structseq) is no longer limited to 512 bytes. diff --git a/Objects/structseq.c b/Objects/structseq.c index 1c37845950fe..5278313ffdce 100644 --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -168,78 +168,88 @@ structseq_new_impl(PyTypeObject *type, PyObject *arg, PyObject *dict) static PyObject * structseq_repr(PyStructSequence *obj) { - /* buffer and type size were chosen well considered. */ -#define REPR_BUFFER_SIZE 512 -#define TYPE_MAXSIZE 100 - PyTypeObject *typ = Py_TYPE(obj); - Py_ssize_t i; - int removelast = 0; - Py_ssize_t len; - char buf[REPR_BUFFER_SIZE]; - char *endofbuf, *pbuf = buf; - - /* pointer to end of writeable buffer; safes space for "...)\0" */ - endofbuf= &buf[REPR_BUFFER_SIZE-5]; - - /* "typename(", limited to TYPE_MAXSIZE */ - len = strlen(typ->tp_name); - len = Py_MIN(len, TYPE_MAXSIZE); - memcpy(pbuf, typ->tp_name, len); - pbuf += len; - *pbuf++ = '('; - - for (i=0; i < VISIBLE_SIZE(obj); i++) { - PyObject *val, *repr; - const char *cname, *crepr; - - cname = typ->tp_members[i].name; - if (cname == NULL) { + _PyUnicodeWriter writer; + + /* Write "typename(" */ + PyObject *type_name = PyUnicode_DecodeUTF8(typ->tp_name, + strlen(typ->tp_name), + NULL); + if (type_name == NULL) { + goto error; + } + + _PyUnicodeWriter_Init(&writer); + writer.overallocate = 1; + /* count 5 characters per item: "x=1, " */ + writer.min_length = (PyUnicode_GET_LENGTH(type_name) + 1 + + VISIBLE_SIZE(obj) * 5 + 1); + + if (_PyUnicodeWriter_WriteStr(&writer, type_name) < 0) { + Py_DECREF(type_name); + goto error; + } + Py_DECREF(type_name); + + if (_PyUnicodeWriter_WriteChar(&writer, '(') < 0) { + goto error; + } + + for (Py_ssize_t i=0; i < VISIBLE_SIZE(obj); i++) { + if (i > 0) { + /* Write ", " */ + if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0) { + goto error; + } + } + + /* Write "name=repr" */ + const char *name_utf8 = typ->tp_members[i].name; + if (name_utf8 == NULL) { PyErr_Format(PyExc_SystemError, "In structseq_repr(), member %zd name is NULL" " for type %.500s", i, typ->tp_name); - return NULL; + goto error; } - val = PyStructSequence_GET_ITEM(obj, i); - repr = PyObject_Repr(val); - if (repr == NULL) - return NULL; - crepr = PyUnicode_AsUTF8(repr); - if (crepr == NULL) { - Py_DECREF(repr); - return NULL; + + PyObject *name = PyUnicode_DecodeUTF8(name_utf8, strlen(name_utf8), NULL); + if (name == NULL) { + goto error; + } + if (_PyUnicodeWriter_WriteStr(&writer, name) < 0) { + Py_DECREF(name); + goto error; } + Py_DECREF(name); - /* + 3: keep space for "=" and ", " */ - len = strlen(cname) + strlen(crepr) + 3; - if ((pbuf+len) <= endofbuf) { - strcpy(pbuf, cname); - pbuf += strlen(cname); - *pbuf++ = '='; - strcpy(pbuf, crepr); - pbuf += strlen(crepr); - *pbuf++ = ','; - *pbuf++ = ' '; - removelast = 1; - Py_DECREF(repr); + if (_PyUnicodeWriter_WriteChar(&writer, '=') < 0) { + goto error; } - else { - strcpy(pbuf, "..."); - pbuf += 3; - removelast = 0; + + PyObject *value = PyStructSequence_GET_ITEM(obj, i); + assert(value != NULL); + PyObject *repr = PyObject_Repr(value); + if (repr == NULL) { + goto error; + } + if (_PyUnicodeWriter_WriteStr(&writer, repr) < 0) { Py_DECREF(repr); - break; + goto error; } + Py_DECREF(repr); } - if (removelast) { - /* overwrite last ", " */ - pbuf-=2; + + if (_PyUnicodeWriter_WriteChar(&writer, ')') < 0) { + goto error; } - *pbuf++ = ')'; - *pbuf = '\0'; - return PyUnicode_FromString(buf); + return _PyUnicodeWriter_Finish(&writer); + +error: + _PyUnicodeWriter_Dealloc(&writer); + return NULL; } + static PyObject * structseq_reduce(PyStructSequence* self, PyObject *Py_UNUSED(ignored)) { From webhook-mailer at python.org Tue Mar 19 19:30:51 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 19 Mar 2019 23:30:51 -0000 Subject: [Python-checkins] bpo-36236: Handle removed cwd at Python init (GH-12450) Message-ID: https://github.com/python/cpython/commit/f7959a9fe7e7e316899c60251e29390c4ed0307a commit: f7959a9fe7e7e316899c60251e29390c4ed0307a branch: 3.7 author: Victor Stinner committer: GitHub date: 2019-03-20T00:30:45+01:00 summary: bpo-36236: Handle removed cwd at Python init (GH-12450) At Python initialization, the current directory is no longer prepended to sys.path if it has been removed. files: A Misc/NEWS.d/next/Core and Builtins/2019-03-19-23-55-00.bpo-36236.5qN9qK.rst M Include/pylifecycle.h M Modules/main.c M Python/pathconfig.c M Python/sysmodule.c diff --git a/Include/pylifecycle.h b/Include/pylifecycle.h index 05f17dc73f08..5d9f049d8a1d 100644 --- a/Include/pylifecycle.h +++ b/Include/pylifecycle.h @@ -139,7 +139,9 @@ PyAPI_FUNC(wchar_t *) Py_GetExecPrefix(void); PyAPI_FUNC(wchar_t *) Py_GetPath(void); #ifdef Py_BUILD_CORE PyAPI_FUNC(_PyInitError) _PyPathConfig_Init(const _PyCoreConfig *core_config); -PyAPI_FUNC(PyObject*) _PyPathConfig_ComputeArgv0(int argc, wchar_t **argv); +PyAPI_FUNC(int) _PyPathConfig_ComputeArgv0( + int argc, wchar_t **argv, + PyObject **argv0_p); PyAPI_FUNC(int) _Py_FindEnvConfigValue( FILE *env_file, const wchar_t *key, diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-19-23-55-00.bpo-36236.5qN9qK.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-19-23-55-00.bpo-36236.5qN9qK.rst new file mode 100644 index 000000000000..e1c1182d181a --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-19-23-55-00.bpo-36236.5qN9qK.rst @@ -0,0 +1,2 @@ +At Python initialization, the current directory is no longer prepended to +:data:`sys.path` if it has been removed. diff --git a/Modules/main.c b/Modules/main.c index f94689496a38..9011bd1f69cb 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -1339,29 +1339,6 @@ _Py_wstrlist_as_pylist(int len, wchar_t **list) } -static int -pymain_compute_path0(_PyMain *pymain, _PyCoreConfig *config, PyObject **path0) -{ - if (pymain->main_importer_path != NULL) { - /* Let pymain_run_main_from_importer() adjust sys.path[0] later */ - *path0 = NULL; - return 0; - } - - if (Py_IsolatedFlag) { - *path0 = NULL; - return 0; - } - - *path0 = _PyPathConfig_ComputeArgv0(config->argc, config->argv); - if (*path0 == NULL) { - pymain->err = _Py_INIT_NO_MEMORY(); - return -1; - } - return 0; -} - - static int pymain_update_sys_path(_PyMain *pymain, PyObject *path0) { @@ -2845,18 +2822,29 @@ pymain_init_sys_path(_PyMain *pymain, _PyCoreConfig *config) pymain->main_importer_path = pymain_get_importer(pymain->filename); } - PyObject *path0; - if (pymain_compute_path0(pymain, config, &path0) < 0) { + if (pymain->main_importer_path != NULL) { + /* Let pymain_run_main_from_importer() adjust sys.path[0] later */ + return 0; + } + + if (Py_IsolatedFlag) { + return 0; + } + + PyObject *path0 = NULL; + if (!_PyPathConfig_ComputeArgv0(config->argc, config->argv, &path0)) { + return 0; + } + if (path0 == NULL) { + pymain->err = _Py_INIT_NO_MEMORY(); return -1; } - if (path0 != NULL) { - if (pymain_update_sys_path(pymain, path0) < 0) { - Py_DECREF(path0); - return -1; - } + if (pymain_update_sys_path(pymain, path0) < 0) { Py_DECREF(path0); + return -1; } + Py_DECREF(path0); return 0; } diff --git a/Python/pathconfig.c b/Python/pathconfig.c index aacc5f5a5f02..3a431431351b 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -278,8 +278,8 @@ Py_GetProgramName(void) } /* Compute argv[0] which will be prepended to sys.argv */ -PyObject* -_PyPathConfig_ComputeArgv0(int argc, wchar_t **argv) +int +_PyPathConfig_ComputeArgv0(int argc, wchar_t **argv, PyObject **argv0_p) { wchar_t *argv0; wchar_t *p = NULL; @@ -297,6 +297,8 @@ _PyPathConfig_ComputeArgv0(int argc, wchar_t **argv) wchar_t fullpath[MAX_PATH]; #endif + assert(*argv0_p == NULL); + argv0 = argv[0]; if (argc > 0 && argv0 != NULL) { have_module_arg = (wcscmp(argv0, L"-m") == 0); @@ -305,7 +307,9 @@ _PyPathConfig_ComputeArgv0(int argc, wchar_t **argv) if (have_module_arg) { #if defined(HAVE_REALPATH) || defined(MS_WINDOWS) - _Py_wgetcwd(fullpath, Py_ARRAY_LENGTH(fullpath)); + if (!_Py_wgetcwd(fullpath, Py_ARRAY_LENGTH(fullpath))) { + return 0; + } argv0 = fullpath; n = wcslen(argv0); #else @@ -384,7 +388,8 @@ _PyPathConfig_ComputeArgv0(int argc, wchar_t **argv) } #endif /* All others */ - return PyUnicode_FromWideChar(argv0, n); + *argv0_p = PyUnicode_FromWideChar(argv0, n); + return 1; } diff --git a/Python/sysmodule.c b/Python/sysmodule.c index cdc2edf038a1..c01a04e6c030 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -2615,7 +2615,10 @@ PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath) if (updatepath) { /* If argv[0] is not '-c' nor '-m', prepend argv[0] to sys.path. If argv[0] is a symlink, use the real path. */ - PyObject *argv0 = _PyPathConfig_ComputeArgv0(argc, argv); + PyObject *argv0 = NULL; + if (!_PyPathConfig_ComputeArgv0(argc, argv, &argv0)) { + return; + } if (argv0 == NULL) { Py_FatalError("can't compute path0 from argv"); } From webhook-mailer at python.org Tue Mar 19 19:32:22 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 19 Mar 2019 23:32:22 -0000 Subject: [Python-checkins] bpo-36365: Fix compiler warning in structseq.c (GH-12451) Message-ID: https://github.com/python/cpython/commit/ea3592d7ef6308bf9f6c7d86556f9b36f5ca0060 commit: ea3592d7ef6308bf9f6c7d86556f9b36f5ca0060 branch: 3.7 author: Victor Stinner committer: GitHub date: 2019-03-20T00:32:11+01:00 summary: bpo-36365: Fix compiler warning in structseq.c (GH-12451) files: M Objects/structseq.c diff --git a/Objects/structseq.c b/Objects/structseq.c index 900aaba7c150..e48165dcd008 100644 --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -182,10 +182,16 @@ structseq_repr(PyStructSequence *obj) endofbuf= &buf[REPR_BUFFER_SIZE-5]; /* "typename(", limited to TYPE_MAXSIZE */ - len = strlen(typ->tp_name) > TYPE_MAXSIZE ? TYPE_MAXSIZE : - strlen(typ->tp_name); - strncpy(pbuf, typ->tp_name, len); - pbuf += len; + assert(TYPE_MAXSIZE < sizeof(buf)); + len = strlen(typ->tp_name); + if (len <= TYPE_MAXSIZE) { + strcpy(pbuf, typ->tp_name); + pbuf += len; + } + else { + strncpy(pbuf, typ->tp_name, TYPE_MAXSIZE); + pbuf += TYPE_MAXSIZE; + } *pbuf++ = '('; for (i=0; i < VISIBLE_SIZE(obj); i++) { From webhook-mailer at python.org Tue Mar 19 19:37:26 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 19 Mar 2019 23:37:26 -0000 Subject: [Python-checkins] bpo-36362: Avoid unused variables when HAVE_DYNAMIC_LOADING is not defined (GH-12430) Message-ID: https://github.com/python/cpython/commit/0d765e3849f1010276bb349b557b79ed94befa0b commit: 0d765e3849f1010276bb349b557b79ed94befa0b branch: master author: St?phane Wirtel committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-19T16:37:20-07:00 summary: bpo-36362: Avoid unused variables when HAVE_DYNAMIC_LOADING is not defined (GH-12430) https://bugs.python.org/issue36362 files: M Python/import.c diff --git a/Python/import.c b/Python/import.c index 898321ac3b47..bf3a99414fb8 100644 --- a/Python/import.c +++ b/Python/import.c @@ -1983,13 +1983,14 @@ _imp_extension_suffixes_impl(PyObject *module) /*[clinic end generated code: output=0bf346e25a8f0cd3 input=ecdeeecfcb6f839e]*/ { PyObject *list; - const char *suffix; - unsigned int index = 0; list = PyList_New(0); if (list == NULL) return NULL; #ifdef HAVE_DYNAMIC_LOADING + const char *suffix; + unsigned int index = 0; + while ((suffix = _PyImport_DynLoadFiletab[index])) { PyObject *item = PyUnicode_FromString(suffix); if (item == NULL) { From webhook-mailer at python.org Tue Mar 19 20:00:44 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 20 Mar 2019 00:00:44 -0000 Subject: [Python-checkins] Fix compiler warning in call_readline() (GH-10820) (GH-12452) Message-ID: https://github.com/python/cpython/commit/ef10f886ae21787ba88b04a2d4125727c9d15f59 commit: ef10f886ae21787ba88b04a2d4125727c9d15f59 branch: 3.7 author: Victor Stinner committer: GitHub date: 2019-03-20T01:00:41+01:00 summary: Fix compiler warning in call_readline() (GH-10820) (GH-12452) Replace strncpy() with memcpy() in call_readline() to fix the following warning, the NUL byte is written manually just after: Modules/readline.c: In function ?call_readline?: Modules/readline.c:1303:9: warning: ?strncpy? output truncated before terminating nul copying as many bytes from a string as its length [-Wstringop-truncation] strncpy(p, q, n); ^~~~~~~~~~~~~~~~ Modules/readline.c:1279:9: note: length computed here n = strlen(p); ^~~~~~~~~ (cherry picked from commit 1600f60414e620c4298c15dac803427d8f0a977c) files: M Modules/readline.c diff --git a/Modules/readline.c b/Modules/readline.c index fa7e7d18e59e..57335fe911bf 100644 --- a/Modules/readline.c +++ b/Modules/readline.c @@ -1239,7 +1239,7 @@ static char * call_readline(FILE *sys_stdin, FILE *sys_stdout, const char *prompt) { size_t n; - char *p, *q; + char *p; int signal; #ifdef SAVE_LOCALE @@ -1296,10 +1296,10 @@ call_readline(FILE *sys_stdin, FILE *sys_stdout, const char *prompt) } /* Copy the malloc'ed buffer into a PyMem_Malloc'ed one and release the original. */ - q = p; + char *q = p; p = PyMem_RawMalloc(n+2); if (p != NULL) { - strncpy(p, q, n); + memcpy(p, q, n); p[n] = '\n'; p[n+1] = '\0'; } From webhook-mailer at python.org Tue Mar 19 21:20:17 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 20 Mar 2019 01:20:17 -0000 Subject: [Python-checkins] bpo-36301: Add _PyRuntime.pre_initialized (GH-12457) Message-ID: https://github.com/python/cpython/commit/f29084d611a6ca504c99a0967371374febf0ccc3 commit: f29084d611a6ca504c99a0967371374febf0ccc3 branch: master author: Victor Stinner committer: GitHub date: 2019-03-20T02:20:13+01:00 summary: bpo-36301: Add _PyRuntime.pre_initialized (GH-12457) * Add _PyRuntime.pre_initialized: set to 1 when Python is pre-initialized * Add _Py_PreInitialize() and _Py_PreInitializeFromPreConfig(). * _PyCoreConfig_Read() now calls _Py_PreInitialize(). * Move _PyPreConfig_GetGlobalConfig() and _PyCoreConfig_GetGlobalConfig() calls from main.c to preconfig.c and coreconfig.c. files: M Include/cpython/pylifecycle.h M Include/internal/pycore_pystate.h M Modules/main.c M Python/coreconfig.c M Python/preconfig.c M Python/pylifecycle.c diff --git a/Include/cpython/pylifecycle.h b/Include/cpython/pylifecycle.h index 3bffc80c9376..1caeb98e9933 100644 --- a/Include/cpython/pylifecycle.h +++ b/Include/cpython/pylifecycle.h @@ -14,6 +14,10 @@ PyAPI_FUNC(int) Py_SetStandardStreamEncoding(const char *encoding, /* PEP 432 Multi-phase initialization API (Private while provisional!) */ +PyAPI_FUNC(_PyInitError) _Py_PreInitialize(void); +PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromPreConfig( + _PyPreConfig *preconfig); + PyAPI_FUNC(_PyInitError) _Py_InitializeCore( PyInterpreterState **interp, const _PyCoreConfig *); diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 7c9d11aec36c..911e7ee33baf 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -134,8 +134,15 @@ struct _gilstate_runtime_state { /* Full Python runtime state */ typedef struct pyruntimestate { - int initialized; + /* Is Python pre-initialized? Set to 1 by _Py_PreInitialize() */ + int pre_initialized; + + /* Is Python core initialized? Set to 1 by _Py_InitializeCore() */ int core_initialized; + + /* Is Python fully initialized? Set to 1 by Py_Initialize() */ + int initialized; + PyThreadState *finalizing; struct pyinterpreters { @@ -172,7 +179,8 @@ typedef struct pyruntimestate { // XXX Consolidate globals found via the check-c-globals script. } _PyRuntimeState; -#define _PyRuntimeState_INIT {.initialized = 0, .core_initialized = 0} +#define _PyRuntimeState_INIT \ + {.pre_initialized = 0, .core_initialized = 0, .initialized = 0} /* Note: _PyRuntimeState_INIT sets other fields to 0/NULL */ PyAPI_DATA(_PyRuntimeState) _PyRuntime; diff --git a/Modules/main.c b/Modules/main.c index df4eca5aae84..57cf862a30b7 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -283,32 +283,30 @@ _PyMainInterpreterConfig_Read(_PyMainInterpreterConfig *main_config, /* --- pymain_init() ---------------------------------------------- */ static _PyInitError -preconfig_read_write(_PyPreConfig *config, const _PyArgv *args) +pymain_init_preconfig(_PyPreConfig *config, const _PyArgv *args) { - _PyPreConfig_GetGlobalConfig(config); - _PyInitError err = _PyPreConfig_ReadFromArgv(config, args); if (_Py_INIT_FAILED(err)) { return err; } - return _PyPreConfig_Write(config); + return _Py_PreInitializeFromPreConfig(config); } static _PyInitError -config_read_write(_PyCoreConfig *config, const _PyArgv *args, - const _PyPreConfig *preconfig) +pymain_init_coreconfig(_PyCoreConfig *config, const _PyArgv *args, + const _PyPreConfig *preconfig, + PyInterpreterState **interp_p) { - _PyCoreConfig_GetGlobalConfig(config); - _PyInitError err = _PyCoreConfig_ReadFromArgv(config, args, preconfig); if (_Py_INIT_FAILED(err)) { return err; } _PyCoreConfig_Write(config); - return _Py_INIT_OK(); + + return _Py_InitializeCore(interp_p, config); } @@ -356,24 +354,17 @@ pymain_init(const _PyArgv *args, PyInterpreterState **interp_p) _PyCoreConfig local_config = _PyCoreConfig_INIT; _PyCoreConfig *config = &local_config; - err = preconfig_read_write(preconfig, args); + err = pymain_init_preconfig(preconfig, args); if (_Py_INIT_FAILED(err)) { goto done; } - err = config_read_write(config, args, preconfig); - if (_Py_INIT_FAILED(err)) { - goto done; - } - - PyInterpreterState *interp; - err = _Py_InitializeCore(&interp, config); + err = pymain_init_coreconfig(config, args, preconfig, interp_p); if (_Py_INIT_FAILED(err)) { goto done; } - *interp_p = interp; - err = pymain_init_python_main(interp); + err = pymain_init_python_main(*interp_p); if (_Py_INIT_FAILED(err)) { goto done; } diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 08273765098e..de2058c0f342 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -1367,6 +1367,11 @@ _PyCoreConfig_Read(_PyCoreConfig *config, const _PyPreConfig *preconfig) { _PyInitError err; + err = _Py_PreInitialize(); + if (_Py_INIT_FAILED(err)) { + return err; + } + _PyCoreConfig_GetGlobalConfig(config); if (preconfig != NULL) { @@ -2025,6 +2030,8 @@ config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, int need_usage = 0; _PyInitError err; + _PyCoreConfig_GetGlobalConfig(config); + err = config_init_program(config, cmdline); if (_Py_INIT_FAILED(err)) { return err; diff --git a/Python/preconfig.c b/Python/preconfig.c index b03436181c86..a149ea54f65a 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -672,6 +672,8 @@ _PyPreConfig_ReadFromArgv(_PyPreConfig *config, const _PyArgv *args) goto done; } + _PyPreConfig_GetGlobalConfig(config); + if (_PyPreConfig_Copy(&save_config, config) < 0) { err = _Py_INIT_NO_MEMORY(); goto done; diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index df9570b2e487..994a94f1402a 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -714,19 +714,57 @@ _Py_InitializeCore_impl(PyInterpreterState **interp_p, } +_PyInitError +_Py_PreInitializeFromPreConfig(_PyPreConfig *config) +{ + if (config != NULL) { + _PyInitError err = _PyPreConfig_Write(config); + if (_Py_INIT_FAILED(err)) { + return err; + } + } + + _PyRuntime.pre_initialized = 1; + return _Py_INIT_OK(); +} + + static _PyInitError -pyinit_preconfig(_PyPreConfig *preconfig, const _PyPreConfig *src_preconfig) +pyinit_preconfig(_PyPreConfig *config, const _PyPreConfig *src_config) { - if (_PyPreConfig_Copy(preconfig, src_preconfig) < 0) { + _PyInitError err; + + err = _PyRuntime_Initialize(); + if (_Py_INIT_FAILED(err)) { + return err; + } + + if (_PyPreConfig_Copy(config, src_config) < 0) { return _Py_INIT_ERR("failed to copy pre config"); } - _PyInitError err = _PyPreConfig_Read(preconfig); + err = _PyPreConfig_Read(config); if (_Py_INIT_FAILED(err)) { return err; } - return _PyPreConfig_Write(preconfig); + return _Py_PreInitializeFromPreConfig(config); +} + + +_PyInitError +_Py_PreInitialize(void) +{ + _PyInitError err = _PyRuntime_Initialize(); + if (_Py_INIT_FAILED(err)) { + return err; + } + + if (_PyRuntime.pre_initialized) { + return _Py_INIT_OK(); + } + + return _Py_PreInitializeFromPreConfig(NULL); } From webhook-mailer at python.org Tue Mar 19 22:11:43 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 20 Mar 2019 02:11:43 -0000 Subject: [Python-checkins] bpo-36356: Fix _PyCoreConfig_Read() (GH-12454) Message-ID: https://github.com/python/cpython/commit/4a1468e593c4b67d8c78b78070fff9e18ec5d790 commit: 4a1468e593c4b67d8c78b78070fff9e18ec5d790 branch: master author: Victor Stinner committer: GitHub date: 2019-03-20T03:11:38+01:00 summary: bpo-36356: Fix _PyCoreConfig_Read() (GH-12454) Don't override parameters which are already set by the user. files: M Python/coreconfig.c diff --git a/Python/coreconfig.c b/Python/coreconfig.c index de2058c0f342..e1d883c51cbf 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -961,13 +961,15 @@ config_read_env_vars(_PyCoreConfig *config) config->malloc_stats = 1; } - wchar_t *path; - int res = _PyCoreConfig_GetEnvDup(config, &path, - L"PYTHONPATH", "PYTHONPATH"); - if (res < 0) { - return DECODE_LOCALE_ERR("PYTHONPATH", res); + if (config->module_search_path_env == NULL) { + wchar_t *path; + int res = _PyCoreConfig_GetEnvDup(config, &path, + L"PYTHONPATH", "PYTHONPATH"); + if (res < 0) { + return DECODE_LOCALE_ERR("PYTHONPATH", res); + } + config->module_search_path_env = path; } - config->module_search_path_env = path; if (config->use_hash_seed < 0) { _PyInitError err = config_init_hash_seed(config); @@ -1689,18 +1691,20 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, } if (c == 'c') { - /* -c is the last option; following arguments - that look like options are left for the - command to interpret. */ - size_t len = wcslen(_PyOS_optarg) + 1 + 1; - wchar_t *command = PyMem_RawMalloc(sizeof(wchar_t) * len); - if (command == NULL) { - return _Py_INIT_NO_MEMORY(); + if (config->run_command == NULL) { + /* -c is the last option; following arguments + that look like options are left for the + command to interpret. */ + size_t len = wcslen(_PyOS_optarg) + 1 + 1; + wchar_t *command = PyMem_RawMalloc(sizeof(wchar_t) * len); + if (command == NULL) { + return _Py_INIT_NO_MEMORY(); + } + memcpy(command, _PyOS_optarg, (len - 2) * sizeof(wchar_t)); + command[len - 2] = '\n'; + command[len - 1] = 0; + config->run_command = command; } - memcpy(command, _PyOS_optarg, (len - 2) * sizeof(wchar_t)); - command[len - 2] = '\n'; - command[len - 1] = 0; - config->run_command = command; break; } @@ -1708,9 +1712,11 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, /* -m is the last option; following arguments that look like options are left for the module to interpret. */ - config->run_module = _PyMem_RawWcsdup(_PyOS_optarg); if (config->run_module == NULL) { - return _Py_INIT_NO_MEMORY(); + config->run_module = _PyMem_RawWcsdup(_PyOS_optarg); + if (config->run_module == NULL) { + return _Py_INIT_NO_MEMORY(); + } } break; } @@ -1825,7 +1831,8 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, if (config->run_command == NULL && config->run_module == NULL && _PyOS_optind < cmdline->argv.length - && wcscmp(cmdline->argv.items[_PyOS_optind], L"-") != 0) + && wcscmp(cmdline->argv.items[_PyOS_optind], L"-") != 0 + && config->run_filename == NULL) { config->run_filename = _PyMem_RawWcsdup(cmdline->argv.items[_PyOS_optind]); if (config->run_filename == NULL) { @@ -2032,9 +2039,11 @@ config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, _PyCoreConfig_GetGlobalConfig(config); - err = config_init_program(config, cmdline); - if (_Py_INIT_FAILED(err)) { - return err; + if (config->program == NULL) { + err = config_init_program(config, cmdline); + if (_Py_INIT_FAILED(err)) { + return err; + } } err = config_parse_cmdline(config, cmdline, &need_usage); From webhook-mailer at python.org Tue Mar 19 22:56:09 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 20 Mar 2019 02:56:09 -0000 Subject: [Python-checkins] bpo-23984: Improve descriptor documentation (GH-1034) Message-ID: https://github.com/python/cpython/commit/abbdd1fc5c2017683da8d2ed3e8843e8c159bc8c commit: abbdd1fc5c2017683da8d2ed3e8843e8c159bc8c branch: master author: Shubham Aggarwal committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-19T19:55:55-07:00 summary: bpo-23984: Improve descriptor documentation (GH-1034) https://bugs.python.org/issue23984 files: M Doc/howto/descriptor.rst diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index 672324b17238..b29e590b20cb 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -372,9 +372,9 @@ calls are unexciting:: ... print(x) ... f = staticmethod(f) ... - >>> print(E.f(3)) + >>> E.f(3) 3 - >>> print(E().f(3)) + >>> E().f(3) 3 Using the non-data descriptor protocol, a pure Python version of From webhook-mailer at python.org Tue Mar 19 23:25:41 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 20 Mar 2019 03:25:41 -0000 Subject: [Python-checkins] bpo-36301: Add _PyPreCmdline internal API (GH-12458) Message-ID: https://github.com/python/cpython/commit/fa1537684869186da7938e4330361bf02363bac8 commit: fa1537684869186da7938e4330361bf02363bac8 branch: master author: Victor Stinner committer: GitHub date: 2019-03-20T04:25:38+01:00 summary: bpo-36301: Add _PyPreCmdline internal API (GH-12458) _PyCoreConfig_ReadFromArgv() now reuses the code parsing command line options from preconfig.c. files: M Include/internal/pycore_coreconfig.h M Python/coreconfig.c M Python/preconfig.c diff --git a/Include/internal/pycore_coreconfig.h b/Include/internal/pycore_coreconfig.h index 8c5a072e5677..29261df5af75 100644 --- a/Include/internal/pycore_coreconfig.h +++ b/Include/internal/pycore_coreconfig.h @@ -9,6 +9,30 @@ extern "C" { #endif +/* --- _PyPreCmdline ------------------------------------------------- */ + +typedef struct { + _PyWstrList argv; + _PyWstrList xoptions; /* "-X value" option */ + int use_environment; /* -E option */ + int isolated; /* -I option */ +} _PyPreCmdline; + +#define _PyPreCmdline_INIT \ + (_PyPreCmdline){ \ + .use_environment = -1, \ + .isolated = -1} +/* Note: _PyPreCmdline_INIT sets other fields to 0/NULL */ + +PyAPI_FUNC(void) _PyPreCmdline_Clear(_PyPreCmdline *cmdline); +PyAPI_FUNC(_PyInitError) _PyPreCmdline_Init(_PyPreCmdline *cmdline, + const _PyArgv *args); +PyAPI_FUNC(_PyInitError) _PyPreCmdline_Read(_PyPreCmdline *cmdline); +PyAPI_FUNC(void) _PyPreCmdline_SetPreConfig( + const _PyPreCmdline *cmdline, + _PyPreConfig *config); + + /* --- _PyWstrList ------------------------------------------------ */ #ifndef NDEBUG diff --git a/Python/coreconfig.c b/Python/coreconfig.c index e1d883c51cbf..1881f00bf2f5 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -1658,7 +1658,7 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) /* --- _PyCmdline ------------------------------------------------- */ typedef struct { - _PyWstrList argv; + _PyPreCmdline precmdline; _PyWstrList warnoptions; /* Command line -W options */ _PyWstrList env_warnoptions; /* PYTHONWARNINGS environment variables */ int print_help; /* -h, -? options */ @@ -1669,9 +1669,9 @@ typedef struct { static void cmdline_clear(_PyCmdline *cmdline) { + _PyPreCmdline_Clear(&cmdline->precmdline); _PyWstrList_Clear(&cmdline->warnoptions); _PyWstrList_Clear(&cmdline->env_warnoptions); - _PyWstrList_Clear(&cmdline->argv); } @@ -1682,10 +1682,12 @@ static _PyInitError config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, int *need_usage) { + const _PyWstrList *argv = &cmdline->precmdline.argv; + _PyOS_ResetGetOpt(); do { int longindex = -1; - int c = _PyOS_GetOpt(cmdline->argv.length, cmdline->argv.items, &longindex); + int c = _PyOS_GetOpt(argv->length, argv->items, &longindex); if (c == EOF) { break; } @@ -1754,6 +1756,7 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, case 'E': case 'I': + case 'X': /* option handled by _PyPreConfig_ReadFromArgv() */ break; @@ -1806,12 +1809,6 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, } break; - case 'X': - if (_PyWstrList_Append(&config->xoptions, _PyOS_optarg) < 0) { - return _Py_INIT_NO_MEMORY(); - } - break; - case 'q': config->quiet++; break; @@ -1830,11 +1827,11 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, } while (1); if (config->run_command == NULL && config->run_module == NULL - && _PyOS_optind < cmdline->argv.length - && wcscmp(cmdline->argv.items[_PyOS_optind], L"-") != 0 + && _PyOS_optind < argv->length + && wcscmp(argv->items[_PyOS_optind], L"-") != 0 && config->run_filename == NULL) { - config->run_filename = _PyMem_RawWcsdup(cmdline->argv.items[_PyOS_optind]); + config->run_filename = _PyMem_RawWcsdup(argv->items[_PyOS_optind]); if (config->run_filename == NULL) { return _Py_INIT_NO_MEMORY(); } @@ -1892,9 +1889,10 @@ cmdline_init_env_warnoptions(_PyCmdline *cmdline, const _PyCoreConfig *config) static _PyInitError config_init_program(_PyCoreConfig *config, const _PyCmdline *cmdline) { + const _PyWstrList *argv = &cmdline->precmdline.argv; wchar_t *program; - if (cmdline->argv.length >= 1) { - program = cmdline->argv.items[0]; + if (argv->length >= 1) { + program = argv->items[0]; } else { program = L""; @@ -1965,24 +1963,25 @@ config_init_warnoptions(_PyCoreConfig *config, const _PyCmdline *cmdline) static _PyInitError config_init_argv(_PyCoreConfig *config, const _PyCmdline *cmdline) { - _PyWstrList wargv = _PyWstrList_INIT; + const _PyWstrList *cmdline_argv = &cmdline->precmdline.argv; + _PyWstrList config_argv = _PyWstrList_INIT; /* Copy argv to be able to modify it (to force -c/-m) */ - if (cmdline->argv.length <= _PyOS_optind) { + if (cmdline_argv->length <= _PyOS_optind) { /* Ensure at least one (empty) argument is seen */ - if (_PyWstrList_Append(&wargv, L"") < 0) { + if (_PyWstrList_Append(&config_argv, L"") < 0) { return _Py_INIT_NO_MEMORY(); } } else { _PyWstrList slice; - slice.length = cmdline->argv.length - _PyOS_optind; - slice.items = &cmdline->argv.items[_PyOS_optind]; - if (_PyWstrList_Copy(&wargv, &slice) < 0) { + slice.length = cmdline_argv->length - _PyOS_optind; + slice.items = &cmdline_argv->items[_PyOS_optind]; + if (_PyWstrList_Copy(&config_argv, &slice) < 0) { return _Py_INIT_NO_MEMORY(); } } - assert(wargv.length >= 1); + assert(config_argv.length >= 1); wchar_t *arg0 = NULL; if (config->run_command != NULL) { @@ -1996,16 +1995,16 @@ config_init_argv(_PyCoreConfig *config, const _PyCmdline *cmdline) if (arg0 != NULL) { arg0 = _PyMem_RawWcsdup(arg0); if (arg0 == NULL) { - _PyWstrList_Clear(&wargv); + _PyWstrList_Clear(&config_argv); return _Py_INIT_NO_MEMORY(); } - PyMem_RawFree(wargv.items[0]); - wargv.items[0] = arg0; + PyMem_RawFree(config_argv.items[0]); + config_argv.items[0] = arg0; } _PyWstrList_Clear(&config->argv); - config->argv = wargv; + config->argv = config_argv; return _Py_INIT_OK(); } @@ -2046,6 +2045,16 @@ config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, } } + err = _PyPreCmdline_Read(&cmdline->precmdline); + if (_Py_INIT_FAILED(err)) { + return err; + } + + _PyPreCmdline_SetPreConfig(&cmdline->precmdline, &config->preconfig); + if (_PyWstrList_Extend(&config->xoptions, &cmdline->precmdline.xoptions) < 0) { + return _Py_INIT_NO_MEMORY(); + } + err = config_parse_cmdline(config, cmdline, &need_usage); if (_Py_INIT_FAILED(err)) { return err; @@ -2089,7 +2098,8 @@ config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, return err; } - if (_Py_SetArgcArgv(cmdline->argv.length, cmdline->argv.items) < 0) { + const _PyWstrList *argv = &cmdline->precmdline.argv; + if (_Py_SetArgcArgv(argv->length, argv->items) < 0) { return _Py_INIT_NO_MEMORY(); } return _Py_INIT_OK(); @@ -2107,10 +2117,9 @@ _PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, const _PyArgv *args, { _PyInitError err; - _PyCmdline cmdline; - memset(&cmdline, 0, sizeof(cmdline)); + _PyCmdline cmdline = {.precmdline = _PyPreCmdline_INIT}; - err = _PyArgv_AsWstrList(args, &cmdline.argv); + err = _PyPreCmdline_Init(&cmdline.precmdline, args); if (_Py_INIT_FAILED(err)) { goto done; } diff --git a/Python/preconfig.c b/Python/preconfig.c index a149ea54f65a..d856c124f3e9 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -102,20 +102,21 @@ _PyArgv_AsWstrList(const _PyArgv *args, _PyWstrList *list) /* --- _PyPreCmdline ------------------------------------------------- */ -typedef struct { - _PyWstrList argv; - _PyWstrList xoptions; /* -X options */ -} _PyPreCmdline; - - -static void -precmdline_clear(_PyPreCmdline *cmdline) +void +_PyPreCmdline_Clear(_PyPreCmdline *cmdline) { _PyWstrList_Clear(&cmdline->argv); _PyWstrList_Clear(&cmdline->xoptions); } +_PyInitError +_PyPreCmdline_Init(_PyPreCmdline *cmdline, const _PyArgv *args) +{ + return _PyArgv_AsWstrList(args, &cmdline->argv); +} + + /* --- _PyPreConfig ----------------------------------------------- */ void @@ -520,6 +521,21 @@ _PyPreConfig_Read(_PyPreConfig *config) } +void +_PyPreCmdline_SetPreConfig(const _PyPreCmdline *cmdline, _PyPreConfig *config) +{ +#define COPY_ATTR(ATTR) \ + if (cmdline->ATTR != -1) { \ + config->ATTR = cmdline->ATTR; \ + } + + COPY_ATTR(use_environment); + COPY_ATTR(isolated); + +#undef COPY_ATTR +} + + int _PyPreConfig_AsDict(const _PyPreConfig *config, PyObject *dict) { @@ -567,16 +583,18 @@ _PyPreConfig_AsDict(const _PyPreConfig *config, PyObject *dict) /* Parse the command line arguments */ -static _PyInitError -preconfig_parse_cmdline(_PyPreConfig *config, _PyPreCmdline *cmdline) +_PyInitError +_PyPreCmdline_Read(_PyPreCmdline *cmdline) { + _PyWstrList *argv = &cmdline->argv; + _PyOS_ResetGetOpt(); /* Don't log parsing errors into stderr here: _PyCoreConfig_ReadFromArgv() is responsible for that */ _PyOS_opterr = 0; do { int longindex = -1; - int c = _PyOS_GetOpt(cmdline->argv.length, cmdline->argv.items, &longindex); + int c = _PyOS_GetOpt(argv->length, argv->items, &longindex); if (c == EOF || c == 'c' || c == 'm') { break; @@ -584,11 +602,11 @@ preconfig_parse_cmdline(_PyPreConfig *config, _PyPreCmdline *cmdline) switch (c) { case 'E': - config->use_environment = 0; + cmdline->use_environment = 0; break; case 'I': - config->isolated++; + cmdline->isolated = 1; break; case 'X': @@ -615,19 +633,20 @@ preconfig_from_argv(_PyPreConfig *config, const _PyArgv *args) { _PyInitError err; - _PyPreCmdline cmdline; - memset(&cmdline, 0, sizeof(cmdline)); + _PyPreCmdline cmdline = _PyPreCmdline_INIT; - err = _PyArgv_AsWstrList(args, &cmdline.argv); + err = _PyPreCmdline_Init(&cmdline, args); if (_Py_INIT_FAILED(err)) { goto done; } - err = preconfig_parse_cmdline(config, &cmdline); + err = _PyPreCmdline_Read(&cmdline); if (_Py_INIT_FAILED(err)) { goto done; } + _PyPreCmdline_SetPreConfig(&cmdline, config); + err = preconfig_read(config, &cmdline); if (_Py_INIT_FAILED(err)) { goto done; @@ -635,7 +654,7 @@ preconfig_from_argv(_PyPreConfig *config, const _PyArgv *args) err = _Py_INIT_OK(); done: - precmdline_clear(&cmdline); + _PyPreCmdline_Clear(&cmdline); return err; } From webhook-mailer at python.org Wed Mar 20 05:16:30 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 20 Mar 2019 09:16:30 -0000 Subject: [Python-checkins] bpo-36374: Fix a possible null pointer dereference (GH-12449) Message-ID: https://github.com/python/cpython/commit/9b4a1b1e23d4a7cb18ad26f405bdc741af69f342 commit: 9b4a1b1e23d4a7cb18ad26f405bdc741af69f342 branch: master author: Zackery Spytz committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-20T02:16:25-07:00 summary: bpo-36374: Fix a possible null pointer dereference (GH-12449) https://bugs.python.org/issue36374 files: A Misc/NEWS.d/next/Core and Builtins/2019-03-19-15-46-42.bpo-36374.EWKMZE.rst M Python/compile.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-19-15-46-42.bpo-36374.EWKMZE.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-19-15-46-42.bpo-36374.EWKMZE.rst new file mode 100644 index 000000000000..2eac30136854 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-19-15-46-42.bpo-36374.EWKMZE.rst @@ -0,0 +1,2 @@ +Fix a possible null pointer dereference in ``merge_consts_recursive()``. +Patch by Zackery Spytz. diff --git a/Python/compile.c b/Python/compile.c index 697833752bb0..3656a7e00efd 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1210,7 +1210,7 @@ merge_consts_recursive(struct compiler *c, PyObject *o) PyObject *t = PyDict_SetDefault(c->c_const_cache, key, key); if (t != key) { // o is registered in c_const_cache. Just use it. - Py_INCREF(t); + Py_XINCREF(t); Py_DECREF(key); return t; } From webhook-mailer at python.org Wed Mar 20 05:40:35 2019 From: webhook-mailer at python.org (Julien Palard) Date: Wed, 20 Mar 2019 09:40:35 -0000 Subject: [Python-checkins] [3.7] bpo-35564: add master_doc='contents' to conf.py (GH-12460) Message-ID: https://github.com/python/cpython/commit/756cfd88920c2349d4546024856c406409b0ab7b commit: 756cfd88920c2349d4546024856c406409b0ab7b branch: 3.7 author: Julien Palard committer: GitHub date: 2019-03-20T10:40:30+01:00 summary: [3.7] bpo-35564: add master_doc='contents' to conf.py (GH-12460) (cherry picked from commit fc8284e22074af8154e9865c8391b955f13a308b) Co-authored-by: Jean-Fran?ois B files: A Misc/NEWS.d/next/Documentation/2018-12-22-22-52-05.bpo-35564.TuEU_D.rst M Doc/conf.py diff --git a/Doc/conf.py b/Doc/conf.py index eab3c39cfb7c..da8b9d7b2a65 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -46,6 +46,8 @@ 'languages': ['ja', 'fr', 'zh_TW', 'zh_CN'], 'builders': ['man', 'text'], } +# Avoid a warning with Sphinx >= 2.0 +master_doc = 'contents' # Options for HTML output # ----------------------- diff --git a/Misc/NEWS.d/next/Documentation/2018-12-22-22-52-05.bpo-35564.TuEU_D.rst b/Misc/NEWS.d/next/Documentation/2018-12-22-22-52-05.bpo-35564.TuEU_D.rst new file mode 100644 index 000000000000..8ca95eed4c56 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2018-12-22-22-52-05.bpo-35564.TuEU_D.rst @@ -0,0 +1 @@ +Explicitly set master_doc variable in conf.py for compliance with Sphinx 2.0 From webhook-mailer at python.org Wed Mar 20 05:41:02 2019 From: webhook-mailer at python.org (Julien Palard) Date: Wed, 20 Mar 2019 09:41:02 -0000 Subject: [Python-checkins] [2.7] bpo-35564: add master_doc='contents' to conf.py (GH-12462) Message-ID: https://github.com/python/cpython/commit/07b8018d75f3d4495708cf1d4175f33b40e13d30 commit: 07b8018d75f3d4495708cf1d4175f33b40e13d30 branch: 2.7 author: Julien Palard committer: GitHub date: 2019-03-20T10:40:59+01:00 summary: [2.7] bpo-35564: add master_doc='contents' to conf.py (GH-12462) (cherry picked from commit fc8284e22074af8154e9865c8391b955f13a308b) Co-authored-by: Jean-Fran?ois B files: A Misc/NEWS.d/next/Documentation/2018-12-22-22-52-05.bpo-35564.TuEU_D.rst M Doc/conf.py diff --git a/Doc/conf.py b/Doc/conf.py index df76b943b794..d82514f60519 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -41,6 +41,8 @@ # Require Sphinx 1.2 for build. needs_sphinx = '1.2' +# Avoid a warning with Sphinx >= 2.0 +master_doc = 'contents' # Options for HTML output # ----------------------- diff --git a/Misc/NEWS.d/next/Documentation/2018-12-22-22-52-05.bpo-35564.TuEU_D.rst b/Misc/NEWS.d/next/Documentation/2018-12-22-22-52-05.bpo-35564.TuEU_D.rst new file mode 100644 index 000000000000..8ca95eed4c56 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2018-12-22-22-52-05.bpo-35564.TuEU_D.rst @@ -0,0 +1 @@ +Explicitly set master_doc variable in conf.py for compliance with Sphinx 2.0 From webhook-mailer at python.org Wed Mar 20 06:02:04 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Wed, 20 Mar 2019 10:02:04 -0000 Subject: [Python-checkins] bpo-8677: use PY_SSIZE_T_CLEAN in Modules/_gdbmodule.c (GH-12464) Message-ID: https://github.com/python/cpython/commit/c5a216e0b97712bf19b4a6b7655c6bf22a367edd commit: c5a216e0b97712bf19b4a6b7655c6bf22a367edd branch: master author: Inada Naoki committer: GitHub date: 2019-03-20T19:01:55+09:00 summary: bpo-8677: use PY_SSIZE_T_CLEAN in Modules/_gdbmodule.c (GH-12464) files: M Modules/_gdbmmodule.c diff --git a/Modules/_gdbmmodule.c b/Modules/_gdbmmodule.c index cc94e60745c8..adf2a5865bfb 100644 --- a/Modules/_gdbmmodule.c +++ b/Modules/_gdbmmodule.c @@ -3,7 +3,7 @@ /* Author: Anthony Baxter, after dbmmodule.c */ /* Doc strings: Mitch Chapman */ - +#define PY_SSIZE_T_CLEAN #include "Python.h" #include @@ -119,15 +119,36 @@ dbm_length(dbmobject *dp) return dp->di_size; } +// Wrapper function for PyArg_Parse(o, "s#", &d.dptr, &d.size). +// This function is needed to support PY_SSIZE_T_CLEAN. +// Return 1 on success, same to PyArg_Parse(). +static int +parse_datum(PyObject *o, datum *d, const char *failmsg) +{ + Py_ssize_t size; + if (!PyArg_Parse(o, "s#", &d->dptr, &size)) { + if (failmsg != NULL) { + PyErr_SetString(PyExc_TypeError, failmsg); + } + return 0; + } + if (INT_MAX < size) { + PyErr_SetString(PyExc_OverflowError, "size does not fit in an int"); + return 0; + } + d->dsize = size; + return 1; +} + static PyObject * dbm_subscript(dbmobject *dp, PyObject *key) { PyObject *v; datum drec, krec; - if (!PyArg_Parse(key, "s#", &krec.dptr, &krec.dsize) ) + if (!parse_datum(key, &krec, NULL)) { return NULL; - + } if (dp->di_dbm == NULL) { PyErr_SetString(DbmError, "GDBM object has already been closed"); @@ -172,10 +193,9 @@ static int dbm_ass_sub(dbmobject *dp, PyObject *v, PyObject *w) { datum krec, drec; + const char *failmsg = "gdbm mappings have bytes or string indices only"; - if (!PyArg_Parse(v, "s#", &krec.dptr, &krec.dsize) ) { - PyErr_SetString(PyExc_TypeError, - "gdbm mappings have bytes or string indices only"); + if (!parse_datum(v, &krec, failmsg)) { return -1; } if (dp->di_dbm == NULL) { @@ -196,9 +216,7 @@ dbm_ass_sub(dbmobject *dp, PyObject *v, PyObject *w) } } else { - if (!PyArg_Parse(w, "s#", &drec.dptr, &drec.dsize)) { - PyErr_SetString(PyExc_TypeError, - "gdbm mappings have bytes or string elements only"); + if (!parse_datum(w, &drec, failmsg)) { return -1; } errno = 0; From webhook-mailer at python.org Wed Mar 20 06:02:49 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Wed, 20 Mar 2019 10:02:49 -0000 Subject: [Python-checkins] bpo-8677: use PY_SSIZE_T_CLEAN in socketmodule.c (GH-12467) Message-ID: https://github.com/python/cpython/commit/e9a1dcb4237cb2be71ab05883d472038ea9caf62 commit: e9a1dcb4237cb2be71ab05883d472038ea9caf62 branch: master author: Inada Naoki committer: GitHub date: 2019-03-20T19:02:46+09:00 summary: bpo-8677: use PY_SSIZE_T_CLEAN in socketmodule.c (GH-12467) files: M Modules/socketmodule.c diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 1120f6b51325..b48f8a9c3093 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -99,6 +99,7 @@ Local naming conventions: # pragma weak inet_aton #endif +#define PY_SSIZE_T_CLEAN #include "Python.h" #include "structmember.h" @@ -1414,7 +1415,7 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto) a->sll_pkttype, a->sll_hatype, a->sll_addr, - a->sll_halen); + (Py_ssize_t)a->sll_halen); } #endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFNAME */ From webhook-mailer at python.org Wed Mar 20 06:10:21 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Wed, 20 Mar 2019 10:10:21 -0000 Subject: [Python-checkins] bpo-8677: use PY_SSIZE_T_CLEAN in PC/winreg.c (GH-12466) Message-ID: https://github.com/python/cpython/commit/d5f18a63cc2dfe8d0adec8bce384a8c569b0f3dc commit: d5f18a63cc2dfe8d0adec8bce384a8c569b0f3dc branch: master author: Inada Naoki committer: GitHub date: 2019-03-20T19:10:17+09:00 summary: bpo-8677: use PY_SSIZE_T_CLEAN in PC/winreg.c (GH-12466) files: M PC/winreg.c diff --git a/PC/winreg.c b/PC/winreg.c index 3a6ea3689fd1..4dc4e0c281bd 100644 --- a/PC/winreg.c +++ b/PC/winreg.c @@ -12,6 +12,7 @@ */ +#define PY_SSIZE_T_CLEAN #include "Python.h" #include "structmember.h" #include "windows.h" @@ -1608,6 +1609,11 @@ winreg_SetValue_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key, "Type must be winreg.REG_SZ"); return NULL; } + if (value_length >= INT_MAX) { + PyErr_SetString(PyExc_OverflowError, + "the value is too long"); + return NULL; + } Py_BEGIN_ALLOW_THREADS rc = RegSetValueW(key, sub_key, REG_SZ, value, value_length+1); From webhook-mailer at python.org Wed Mar 20 07:53:18 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Wed, 20 Mar 2019 11:53:18 -0000 Subject: [Python-checkins] bpo-8677: use PY_DWORD_MAX instead of INT_MAX (GH-12469) Message-ID: https://github.com/python/cpython/commit/cc60cdd9c44dd15e441603ee5f78e09ea3e76929 commit: cc60cdd9c44dd15e441603ee5f78e09ea3e76929 branch: master author: Inada Naoki committer: GitHub date: 2019-03-20T20:53:08+09:00 summary: bpo-8677: use PY_DWORD_MAX instead of INT_MAX (GH-12469) files: M PC/winreg.c diff --git a/PC/winreg.c b/PC/winreg.c index 4dc4e0c281bd..ae0c292b7172 100644 --- a/PC/winreg.c +++ b/PC/winreg.c @@ -1605,13 +1605,11 @@ winreg_SetValue_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key, long rc; if (type != REG_SZ) { - PyErr_SetString(PyExc_TypeError, - "Type must be winreg.REG_SZ"); + PyErr_SetString(PyExc_TypeError, "type must be winreg.REG_SZ"); return NULL; } - if (value_length >= INT_MAX) { - PyErr_SetString(PyExc_OverflowError, - "the value is too long"); + if ((size_t)value_length >= PY_DWORD_MAX) { + PyErr_SetString(PyExc_OverflowError, "value is too long"); return NULL; } From webhook-mailer at python.org Wed Mar 20 08:03:19 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 20 Mar 2019 12:03:19 -0000 Subject: [Python-checkins] bpo-36367: Free buffer if realloc fails in tokenize.c (GH-12442) (GH-12471) Message-ID: https://github.com/python/cpython/commit/65b9849f0f07a000d751c96d9d711aeb24c95224 commit: 65b9849f0f07a000d751c96d9d711aeb24c95224 branch: 3.7 author: Victor Stinner committer: GitHub date: 2019-03-20T13:03:11+01:00 summary: bpo-36367: Free buffer if realloc fails in tokenize.c (GH-12442) (GH-12471) files: M Parser/tokenizer.c diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index 1a36f1c3840a..34722f85b94a 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -733,9 +733,14 @@ translate_newlines(const char *s, int exec_input, struct tok_state *tok) { } *current = '\0'; final_length = current - buf + 1; - if (final_length < needed_length && final_length) + if (final_length < needed_length && final_length) { /* should never fail */ - buf = PyMem_REALLOC(buf, final_length); + char* result = PyMem_REALLOC(buf, final_length); + if (result == NULL) { + PyMem_FREE(buf); + } + buf = result; + } return buf; } @@ -1050,6 +1055,7 @@ tok_nextc(struct tok_state *tok) newbuf = (char *)PyMem_REALLOC(newbuf, newsize); if (newbuf == NULL) { + PyMem_FREE(tok->buf); tok->done = E_NOMEM; tok->cur = tok->inp; return EOF; From webhook-mailer at python.org Wed Mar 20 08:03:44 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 20 Mar 2019 12:03:44 -0000 Subject: [Python-checkins] bpo-36367: Free buffer if realloc fails in tokenize.c (GH-12442) (GH-12470) Message-ID: https://github.com/python/cpython/commit/469b0a50d990bcb441910b23194c131e403c2833 commit: 469b0a50d990bcb441910b23194c131e403c2833 branch: 2.7 author: Victor Stinner committer: GitHub date: 2019-03-20T13:03:41+01:00 summary: bpo-36367: Free buffer if realloc fails in tokenize.c (GH-12442) (GH-12470) (cherry picked from commit cb90c89de14aab636739b3e810cf949e47b54a0c) files: M Parser/tokenizer.c diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index c6e61df533e2..6d7869c88e22 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -656,9 +656,14 @@ translate_newlines(const char *s, int exec_input, struct tok_state *tok) { } *current = '\0'; final_length = current - buf + 1; - if (final_length < needed_length && final_length) + if (final_length < needed_length && final_length) { /* should never fail */ - buf = PyMem_REALLOC(buf, final_length); + char* result = PyMem_REALLOC(buf, final_length); + if (result == NULL) { + PyMem_FREE(buf); + } + buf = result; + } return buf; } @@ -974,6 +979,7 @@ tok_nextc(register struct tok_state *tok) newbuf = (char *)PyMem_REALLOC(newbuf, newsize); if (newbuf == NULL) { + PyMem_FREE(tok->buf); tok->done = E_NOMEM; tok->cur = tok->inp; return EOF; From webhook-mailer at python.org Wed Mar 20 11:41:40 2019 From: webhook-mailer at python.org (Ned Deily) Date: Wed, 20 Mar 2019 15:41:40 -0000 Subject: [Python-checkins] [3.6] bpo-35564: add master_doc='contents' to conf.py (GH-11290). (GH-12461) Message-ID: https://github.com/python/cpython/commit/4508bc37dd80c71adfaa0925a67c438389817076 commit: 4508bc37dd80c71adfaa0925a67c438389817076 branch: 3.6 author: Julien Palard committer: Ned Deily date: 2019-03-20T11:41:20-04:00 summary: [3.6] bpo-35564: add master_doc='contents' to conf.py (GH-11290). (GH-12461) (cherry picked from commit fc8284e22074af8154e9865c8391b955f13a308b) Co-authored-by: Jean-Fran?ois B files: A Misc/NEWS.d/next/Documentation/2018-12-22-22-52-05.bpo-35564.TuEU_D.rst M Doc/conf.py diff --git a/Doc/conf.py b/Doc/conf.py index e2758bcd00b5..fab963e23a0f 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -40,6 +40,8 @@ venvdir = os.getenv('VENVDIR', 'venv') exclude_patterns = [venvdir+'/*', 'README.rst'] +# Avoid a warning with Sphinx >= 2.0 +master_doc = 'contents' # Options for HTML output # ----------------------- diff --git a/Misc/NEWS.d/next/Documentation/2018-12-22-22-52-05.bpo-35564.TuEU_D.rst b/Misc/NEWS.d/next/Documentation/2018-12-22-22-52-05.bpo-35564.TuEU_D.rst new file mode 100644 index 000000000000..8ca95eed4c56 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2018-12-22-22-52-05.bpo-35564.TuEU_D.rst @@ -0,0 +1 @@ +Explicitly set master_doc variable in conf.py for compliance with Sphinx 2.0 From webhook-mailer at python.org Wed Mar 20 15:45:22 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Wed, 20 Mar 2019 19:45:22 -0000 Subject: [Python-checkins] bpo-36312: Fix decoders for some code pages. (GH-12369) Message-ID: https://github.com/python/cpython/commit/c1e2c288f41cdc1c6e6e09d9a5277a58232ceb03 commit: c1e2c288f41cdc1c6e6e09d9a5277a58232ceb03 branch: master author: Serhiy Storchaka committer: GitHub date: 2019-03-20T21:45:18+02:00 summary: bpo-36312: Fix decoders for some code pages. (GH-12369) files: A Misc/NEWS.d/next/Windows/2019-03-16-16-51-17.bpo-36312.Niwm-T.rst M Lib/test/test_codecs.py M Objects/unicodeobject.c diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index e8c7d76544e1..331449397e37 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -3066,6 +3066,15 @@ def test_multibyte_encoding(self): ('[\U0010ffff\uDC80]', 'replace', b'[\xf4\x8f\xbf\xbf?]'), )) + def test_code_page_decode_flags(self): + # Issue #36312: For some code pages (e.g. UTF-7) flags for + # MultiByteToWideChar() must be set to 0. + for cp in (50220, 50221, 50222, 50225, 50227, 50229, + *range(57002, 57011+1), 65000): + self.assertEqual(codecs.code_page_decode(cp, b'abc'), ('abc', 3)) + self.assertEqual(codecs.code_page_decode(42, b'abc'), + ('\uf061\uf062\uf063', 3)) + def test_incremental(self): decoded = codecs.code_page_decode(932, b'\x82', 'strict', False) self.assertEqual(decoded, ('', 0)) diff --git a/Misc/NEWS.d/next/Windows/2019-03-16-16-51-17.bpo-36312.Niwm-T.rst b/Misc/NEWS.d/next/Windows/2019-03-16-16-51-17.bpo-36312.Niwm-T.rst new file mode 100644 index 000000000000..8b325db3a989 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-03-16-16-51-17.bpo-36312.Niwm-T.rst @@ -0,0 +1,2 @@ +Fixed decoders for the following code pages: 50220, 50221, 50222, 50225, +50227, 50229, 57002 through 57011, 65000 and 42. diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 6e83ed6bdd43..8ab3943e61b2 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -7083,15 +7083,21 @@ decode_code_page_strict(UINT code_page, const char *in, int insize) { - const DWORD flags = decode_code_page_flags(code_page); + DWORD flags = MB_ERR_INVALID_CHARS; wchar_t *out; DWORD outsize; /* First get the size of the result */ assert(insize > 0); - outsize = MultiByteToWideChar(code_page, flags, in, insize, NULL, 0); - if (outsize <= 0) - goto error; + while ((outsize = MultiByteToWideChar(code_page, flags, + in, insize, NULL, 0)) <= 0) + { + if (!flags || GetLastError() != ERROR_INVALID_FLAGS) { + goto error; + } + /* For some code pages (e.g. UTF-7) flags must be set to 0. */ + flags = 0; + } /* Extend a wchar_t* buffer */ Py_ssize_t n = *bufsize; /* Get the current length */ @@ -7129,7 +7135,7 @@ decode_code_page_errors(UINT code_page, { const char *startin = in; const char *endin = in + size; - const DWORD flags = decode_code_page_flags(code_page); + DWORD flags = MB_ERR_INVALID_CHARS; /* Ideally, we should get reason from FormatMessage. This is the Windows 2000 English version of the message. */ const char *reason = "No mapping for the Unicode character exists " @@ -7187,6 +7193,11 @@ decode_code_page_errors(UINT code_page, if (outsize > 0) break; err = GetLastError(); + if (err == ERROR_INVALID_FLAGS && flags) { + /* For some code pages (e.g. UTF-7) flags must be set to 0. */ + flags = 0; + continue; + } if (err != ERROR_NO_UNICODE_TRANSLATION && err != ERROR_INSUFFICIENT_BUFFER) { From webhook-mailer at python.org Wed Mar 20 15:49:43 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Wed, 20 Mar 2019 19:49:43 -0000 Subject: [Python-checkins] bpo-36285: Fix integer overflow in the array module. (GH-12317) Message-ID: https://github.com/python/cpython/commit/aa3ecb80416958eb6fe8cc1b0dfbbfdfbcccead1 commit: aa3ecb80416958eb6fe8cc1b0dfbbfdfbcccead1 branch: master author: sth committer: Serhiy Storchaka date: 2019-03-20T21:49:39+02:00 summary: bpo-36285: Fix integer overflow in the array module. (GH-12317) files: A Misc/NEWS.d/next/Library/2019-03-14-01-09-59.bpo-36285.G-usj8.rst M Lib/test/test_array.py M Modules/arraymodule.c diff --git a/Lib/test/test_array.py b/Lib/test/test_array.py index 2399980d134c..57c396d610b7 100644 --- a/Lib/test/test_array.py +++ b/Lib/test/test_array.py @@ -4,6 +4,7 @@ import unittest from test import support +from test.support import _2G import weakref import pickle import operator @@ -1396,5 +1397,145 @@ def test_alloc_overflow(self): self.fail("Array of size > maxsize created - MemoryError expected") +class LargeArrayTest(unittest.TestCase): + typecode = 'b' + + def example(self, size): + # We assess a base memuse of <=2.125 for constructing this array + base = array.array(self.typecode, [0, 1, 2, 3, 4, 5, 6, 7]) * (size // 8) + base += array.array(self.typecode, [99]*(size % 8) + [8, 9, 10, 11]) + return base + + @support.bigmemtest(_2G, memuse=2.125) + def test_example_data(self, size): + example = self.example(size) + self.assertEqual(len(example), size+4) + + @support.bigmemtest(_2G, memuse=2.125) + def test_access(self, size): + example = self.example(size) + self.assertEqual(example[0], 0) + self.assertEqual(example[-(size+4)], 0) + self.assertEqual(example[size], 8) + self.assertEqual(example[-4], 8) + self.assertEqual(example[size+3], 11) + self.assertEqual(example[-1], 11) + + @support.bigmemtest(_2G, memuse=2.125+1) + def test_slice(self, size): + example = self.example(size) + self.assertEqual(list(example[:4]), [0, 1, 2, 3]) + self.assertEqual(list(example[-4:]), [8, 9, 10, 11]) + part = example[1:-1] + self.assertEqual(len(part), size+2) + self.assertEqual(part[0], 1) + self.assertEqual(part[-1], 10) + del part + part = example[::2] + self.assertEqual(len(part), (size+5)//2) + self.assertEqual(list(part[:4]), [0, 2, 4, 6]) + if size % 2: + self.assertEqual(list(part[-2:]), [9, 11]) + else: + self.assertEqual(list(part[-2:]), [8, 10]) + + @support.bigmemtest(_2G, memuse=2.125) + def test_count(self, size): + example = self.example(size) + self.assertEqual(example.count(0), size//8) + self.assertEqual(example.count(11), 1) + + @support.bigmemtest(_2G, memuse=2.125) + def test_append(self, size): + example = self.example(size) + example.append(12) + self.assertEqual(example[-1], 12) + + @support.bigmemtest(_2G, memuse=2.125) + def test_extend(self, size): + example = self.example(size) + example.extend(iter([12, 13, 14, 15])) + self.assertEqual(len(example), size+8) + self.assertEqual(list(example[-8:]), [8, 9, 10, 11, 12, 13, 14, 15]) + + @support.bigmemtest(_2G, memuse=2.125) + def test_frombytes(self, size): + example = self.example(size) + example.frombytes(b'abcd') + self.assertEqual(len(example), size+8) + self.assertEqual(list(example[-8:]), [8, 9, 10, 11] + list(b'abcd')) + + @support.bigmemtest(_2G, memuse=2.125) + def test_fromlist(self, size): + example = self.example(size) + example.fromlist([12, 13, 14, 15]) + self.assertEqual(len(example), size+8) + self.assertEqual(list(example[-8:]), [8, 9, 10, 11, 12, 13, 14, 15]) + + @support.bigmemtest(_2G, memuse=2.125) + def test_index(self, size): + example = self.example(size) + self.assertEqual(example.index(0), 0) + self.assertEqual(example.index(1), 1) + self.assertEqual(example.index(7), 7) + self.assertEqual(example.index(11), size+3) + + @support.bigmemtest(_2G, memuse=2.125) + def test_insert(self, size): + example = self.example(size) + example.insert(0, 12) + example.insert(10, 13) + example.insert(size+1, 14) + self.assertEqual(len(example), size+7) + self.assertEqual(example[0], 12) + self.assertEqual(example[10], 13) + self.assertEqual(example[size+1], 14) + + @support.bigmemtest(_2G, memuse=2.125) + def test_pop(self, size): + example = self.example(size) + self.assertEqual(example.pop(0), 0) + self.assertEqual(example[0], 1) + self.assertEqual(example.pop(size+1), 10) + self.assertEqual(example[size+1], 11) + self.assertEqual(example.pop(1), 2) + self.assertEqual(example[1], 3) + self.assertEqual(len(example), size+1) + self.assertEqual(example.pop(), 11) + self.assertEqual(len(example), size) + + @support.bigmemtest(_2G, memuse=2.125) + def test_remove(self, size): + example = self.example(size) + example.remove(0) + self.assertEqual(len(example), size+3) + self.assertEqual(example[0], 1) + example.remove(10) + self.assertEqual(len(example), size+2) + self.assertEqual(example[size], 9) + self.assertEqual(example[size+1], 11) + + @support.bigmemtest(_2G, memuse=2.125) + def test_reverse(self, size): + example = self.example(size) + example.reverse() + self.assertEqual(len(example), size+4) + self.assertEqual(example[0], 11) + self.assertEqual(example[3], 8) + self.assertEqual(example[-1], 0) + example.reverse() + self.assertEqual(len(example), size+4) + self.assertEqual(list(example[:4]), [0, 1, 2, 3]) + self.assertEqual(list(example[-4:]), [8, 9, 10, 11]) + + # list takes about 9 bytes per element + @support.bigmemtest(_2G, memuse=2.125+9) + def test_tolist(self, size): + example = self.example(size) + ls = example.tolist() + self.assertEqual(len(ls), len(example)) + self.assertEqual(ls[:8], list(example[:8])) + self.assertEqual(ls[-8:], list(example[-8:])) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2019-03-14-01-09-59.bpo-36285.G-usj8.rst b/Misc/NEWS.d/next/Library/2019-03-14-01-09-59.bpo-36285.G-usj8.rst new file mode 100644 index 000000000000..bf16170c5f6f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-14-01-09-59.bpo-36285.G-usj8.rst @@ -0,0 +1 @@ +Fix integer overflows in the array module. Patch by Stephan Hohe. diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index a5ba27cb36e2..4be3beb29ccb 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -1174,7 +1174,7 @@ static PyObject * array_array_remove(arrayobject *self, PyObject *v) /*[clinic end generated code: output=bef06be9fdf9dceb input=0b1e5aed25590027]*/ { - int i; + Py_ssize_t i; for (i = 0; i < Py_SIZE(self); i++) { PyObject *selfi; @@ -2029,7 +2029,7 @@ array__array_reconstructor_impl(PyObject *module, PyTypeObject *arraytype, switch (mformat_code) { case IEEE_754_FLOAT_LE: case IEEE_754_FLOAT_BE: { - int i; + Py_ssize_t i; int le = (mformat_code == IEEE_754_FLOAT_LE) ? 1 : 0; Py_ssize_t itemcount = Py_SIZE(items) / 4; const unsigned char *memstr = @@ -2051,7 +2051,7 @@ array__array_reconstructor_impl(PyObject *module, PyTypeObject *arraytype, } case IEEE_754_DOUBLE_LE: case IEEE_754_DOUBLE_BE: { - int i; + Py_ssize_t i; int le = (mformat_code == IEEE_754_DOUBLE_LE) ? 1 : 0; Py_ssize_t itemcount = Py_SIZE(items) / 8; const unsigned char *memstr = @@ -2106,7 +2106,7 @@ array__array_reconstructor_impl(PyObject *module, PyTypeObject *arraytype, case UNSIGNED_INT64_BE: case SIGNED_INT64_LE: case SIGNED_INT64_BE: { - int i; + Py_ssize_t i; const struct mformatdescr mf_descr = mformat_descriptors[mformat_code]; Py_ssize_t itemcount = Py_SIZE(items) / mf_descr.size; From webhook-mailer at python.org Wed Mar 20 16:29:11 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 20 Mar 2019 20:29:11 -0000 Subject: [Python-checkins] bpo-36324: NormalDist() add more tests and update comments (GH-12476) Message-ID: https://github.com/python/cpython/commit/2afb59861827a23c1b50e44022bb77291351c2f1 commit: 2afb59861827a23c1b50e44022bb77291351c2f1 branch: master author: Raymond Hettinger committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-20T13:28:59-07:00 summary: bpo-36324: NormalDist() add more tests and update comments (GH-12476) * Improve coverage. * Note inherent limitations of the accuracy tests https://bugs.python.org/issue36324 files: M Lib/test/test_statistics.py diff --git a/Lib/test/test_statistics.py b/Lib/test/test_statistics.py index 02cbebdcea9c..485ffe24036d 100644 --- a/Lib/test/test_statistics.py +++ b/Lib/test/test_statistics.py @@ -2040,6 +2040,13 @@ def test_compare_to_variance(self): class TestNormalDist(unittest.TestCase): + # General note on precision: The pdf(), cdf(), and overlap() methods + # depend on functions in the math libraries that do not make + # explicit accuracy guarantees. Accordingly, some of the accuracy + # tests below may fail if the underlying math functions are + # inaccurate. There isn't much we can do about this short of + # implementing our own implementations from scratch. + def test_slots(self): nd = statistics.NormalDist(300, 23) with self.assertRaises(TypeError): @@ -2062,6 +2069,12 @@ def test_instantiation_and_attributes(self): with self.assertRaises(statistics.StatisticsError): statistics.NormalDist(500, -10) + # verify that subclass type is honored + class NewNormalDist(statistics.NormalDist): + pass + nnd = NewNormalDist(200, 5) + self.assertEqual(type(nnd), NewNormalDist) + def test_alternative_constructor(self): NormalDist = statistics.NormalDist data = [96, 107, 90, 92, 110] @@ -2077,6 +2090,12 @@ def test_alternative_constructor(self): with self.assertRaises(statistics.StatisticsError): NormalDist.from_samples([10]) # only one input + # verify that subclass type is honored + class NewNormalDist(NormalDist): + pass + nnd = NewNormalDist.from_samples(data) + self.assertEqual(type(nnd), NewNormalDist) + def test_sample_generation(self): NormalDist = statistics.NormalDist mu, sigma = 10_000, 3.0 @@ -2099,12 +2118,6 @@ def test_sample_generation(self): self.assertEqual(data2, data4) self.assertNotEqual(data1, data2) - # verify that subclass type is honored - class NewNormalDist(NormalDist): - pass - nnd = NewNormalDist(200, 5) - self.assertEqual(type(nnd), NewNormalDist) - def test_pdf(self): NormalDist = statistics.NormalDist X = NormalDist(100, 15) @@ -2151,8 +2164,8 @@ def test_cdf(self): self.assertEqual(set(map(type, cdfs)), {float}) # Verify montonic self.assertEqual(cdfs, sorted(cdfs)) - # Verify center - self.assertAlmostEqual(X.cdf(100), 0.50) + # Verify center (should be exact) + self.assertEqual(X.cdf(100), 0.50) # Check against a table of known values # https://en.wikipedia.org/wiki/Standard_normal_table#Cumulative Z = NormalDist() @@ -2216,10 +2229,11 @@ def test_inv_cdf(self): p = 1.0 - p self.assertAlmostEqual(iq.cdf(iq.inv_cdf(p)), p) - # Now apply cdf() first. At six sigmas, the round-trip - # loses a lot of precision, so only check to 6 places. - for x in range(10, 190): - self.assertAlmostEqual(iq.inv_cdf(iq.cdf(x)), x, places=6) + # Now apply cdf() first. Near the tails, the round-trip loses + # precision and is ill-conditioned (small changes in the inputs + # give large changes in the output), so only check to 5 places. + for x in range(200): + self.assertAlmostEqual(iq.inv_cdf(iq.cdf(x)), x, places=5) # Error cases: with self.assertRaises(statistics.StatisticsError): @@ -2237,6 +2251,9 @@ def test_inv_cdf(self): iq.sigma = -0.1 # sigma under zero iq.inv_cdf(0.5) + # Special values + self.assertTrue(math.isnan(Z.inv_cdf(float('NaN')))) + def test_overlap(self): NormalDist = statistics.NormalDist @@ -2275,6 +2292,7 @@ def overlap_numeric(X, Y, *, steps=8_192, z=5): (NormalDist(-100, 15), NormalDist(110, 15)), (NormalDist(-100, 15), NormalDist(-110, 15)), # Misc cases with unequal standard deviations + (NormalDist(100, 12), NormalDist(100, 15)), (NormalDist(100, 12), NormalDist(110, 15)), (NormalDist(100, 12), NormalDist(150, 15)), (NormalDist(100, 12), NormalDist(150, 35)), @@ -2305,18 +2323,6 @@ def test_properties(self): self.assertEqual(X.stdev, 15) self.assertEqual(X.variance, 225) - def test_unary_operations(self): - NormalDist = statistics.NormalDist - X = NormalDist(100, 12) - Y = +X - self.assertIsNot(X, Y) - self.assertEqual(X.mu, Y.mu) - self.assertEqual(X.sigma, Y.sigma) - Y = -X - self.assertIsNot(X, Y) - self.assertEqual(X.mu, -Y.mu) - self.assertEqual(X.sigma, Y.sigma) - def test_same_type_addition_and_subtraction(self): NormalDist = statistics.NormalDist X = NormalDist(100, 12) @@ -2340,13 +2346,27 @@ def test_translation_and_scaling(self): with self.assertRaises(TypeError): # __rtruediv__ y / X + def test_unary_operations(self): + NormalDist = statistics.NormalDist + X = NormalDist(100, 12) + Y = +X + self.assertIsNot(X, Y) + self.assertEqual(X.mu, Y.mu) + self.assertEqual(X.sigma, Y.sigma) + Y = -X + self.assertIsNot(X, Y) + self.assertEqual(X.mu, -Y.mu) + self.assertEqual(X.sigma, Y.sigma) + def test_equality(self): NormalDist = statistics.NormalDist nd1 = NormalDist() nd2 = NormalDist(2, 4) nd3 = NormalDist() + nd4 = NormalDist(2, 4) self.assertNotEqual(nd1, nd2) self.assertEqual(nd1, nd3) + self.assertEqual(nd2, nd4) # Test NotImplemented when types are different class A: From webhook-mailer at python.org Wed Mar 20 23:45:49 2019 From: webhook-mailer at python.org (Larry Hastings) Date: Thu, 21 Mar 2019 03:45:49 -0000 Subject: [Python-checkins] Blurb release and pydoc-topics for 3.5.7 final. Message-ID: https://github.com/python/cpython/commit/6c4214d3b59a2eefb897ed267d674d1425f5645e commit: 6c4214d3b59a2eefb897ed267d674d1425f5645e branch: 3.5 author: Larry Hastings committer: Larry Hastings date: 2019-03-17T16:39:54-07:00 summary: Blurb release and pydoc-topics for 3.5.7 final. files: A Misc/NEWS.d/3.5.7.rst D Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst D Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst D Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst M Lib/pydoc_data/topics.py diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index 5fa3c4ed2b32..f46c421fb002 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Sun Mar 3 17:52:40 2019 +# Autogenerated by Sphinx on Sun Mar 17 16:30:44 2019 topics = {'assert': u'\nThe "assert" statement\n**********************\n\nAssert statements are a convenient way to insert debugging assertions\ninto a program:\n\n assert_stmt ::= "assert" expression ["," expression]\n\nThe simple form, "assert expression", is equivalent to\n\n if __debug__:\n if not expression: raise AssertionError\n\nThe extended form, "assert expression1, expression2", is equivalent to\n\n if __debug__:\n if not expression1: raise AssertionError(expression2)\n\nThese equivalences assume that "__debug__" and "AssertionError" refer\nto the built-in variables with those names. In the current\nimplementation, the built-in variable "__debug__" is "True" under\nnormal circumstances, "False" when optimization is requested (command\nline option -O). The current code generator emits no code for an\nassert statement when optimization is requested at compile time. Note\nthat it is unnecessary to include the source code for the expression\nthat failed in the error message; it will be displayed as part of the\nstack trace.\n\nAssignments to "__debug__" are illegal. The value for the built-in\nvariable is determined when the interpreter starts.\n', 'assignment': u'\nAssignment statements\n*********************\n\nAssignment statements are used to (re)bind names to values and to\nmodify attributes or items of mutable objects:\n\n assignment_stmt ::= (target_list "=")+ (starred_expression | yield_expression)\n target_list ::= target ("," target)* [","]\n target ::= identifier\n | "(" target_list ")"\n | "[" [target_list] "]"\n | attributeref\n | subscription\n | slicing\n | "*" target\n\n(See section *Primaries* for the syntax definitions for\n*attributeref*, *subscription*, and *slicing*.)\n\nAn assignment statement evaluates the expression list (remember that\nthis can be a single expression or a comma-separated list, the latter\nyielding a tuple) and assigns the single resulting object to each of\nthe target lists, from left to right.\n\nAssignment is defined recursively depending on the form of the target\n(list). When a target is part of a mutable object (an attribute\nreference, subscription or slicing), the mutable object must\nultimately perform the assignment and decide about its validity, and\nmay raise an exception if the assignment is unacceptable. The rules\nobserved by various types and the exceptions raised are given with the\ndefinition of the object types (see section *The standard type\nhierarchy*).\n\nAssignment of an object to a target list, optionally enclosed in\nparentheses or square brackets, is recursively defined as follows.\n\n* If the target list is empty: The object must also be an empty\n iterable.\n\n* If the target list is a single target in parentheses: The object\n is assigned to that target.\n\n* If the target list is a comma-separated list of targets, or a\n single target in square brackets: The object must be an iterable\n with the same number of items as there are targets in the target\n list, and the items are assigned, from left to right, to the\n corresponding targets.\n\n * If the target list contains one target prefixed with an\n asterisk, called a "starred" target: The object must be an\n iterable with at least as many items as there are targets in the\n target list, minus one. The first items of the iterable are\n assigned, from left to right, to the targets before the starred\n target. The final items of the iterable are assigned to the\n targets after the starred target. A list of the remaining items\n in the iterable is then assigned to the starred target (the list\n can be empty).\n\n * Else: The object must be an iterable with the same number of\n items as there are targets in the target list, and the items are\n assigned, from left to right, to the corresponding targets.\n\nAssignment of an object to a single target is recursively defined as\nfollows.\n\n* If the target is an identifier (name):\n\n * If the name does not occur in a "global" or "nonlocal" statement\n in the current code block: the name is bound to the object in the\n current local namespace.\n\n * Otherwise: the name is bound to the object in the global\n namespace or the outer namespace determined by "nonlocal",\n respectively.\n\n The name is rebound if it was already bound. This may cause the\n reference count for the object previously bound to the name to reach\n zero, causing the object to be deallocated and its destructor (if it\n has one) to be called.\n\n* If the target is an attribute reference: The primary expression in\n the reference is evaluated. It should yield an object with\n assignable attributes; if this is not the case, "TypeError" is\n raised. That object is then asked to assign the assigned object to\n the given attribute; if it cannot perform the assignment, it raises\n an exception (usually but not necessarily "AttributeError").\n\n Note: If the object is a class instance and the attribute reference\n occurs on both sides of the assignment operator, the RHS expression,\n "a.x" can access either an instance attribute or (if no instance\n attribute exists) a class attribute. The LHS target "a.x" is always\n set as an instance attribute, creating it if necessary. Thus, the\n two occurrences of "a.x" do not necessarily refer to the same\n attribute: if the RHS expression refers to a class attribute, the\n LHS creates a new instance attribute as the target of the\n assignment:\n\n class Cls:\n x = 3 # class variable\n inst = Cls()\n inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 3\n\n This description does not necessarily apply to descriptor\n attributes, such as properties created with "property()".\n\n* If the target is a subscription: The primary expression in the\n reference is evaluated. It should yield either a mutable sequence\n object (such as a list) or a mapping object (such as a dictionary).\n Next, the subscript expression is evaluated.\n\n If the primary is a mutable sequence object (such as a list), the\n subscript must yield an integer. If it is negative, the sequence\'s\n length is added to it. The resulting value must be a nonnegative\n integer less than the sequence\'s length, and the sequence is asked\n to assign the assigned object to its item with that index. If the\n index is out of range, "IndexError" is raised (assignment to a\n subscripted sequence cannot add new items to a list).\n\n If the primary is a mapping object (such as a dictionary), the\n subscript must have a type compatible with the mapping\'s key type,\n and the mapping is then asked to create a key/datum pair which maps\n the subscript to the assigned object. This can either replace an\n existing key/value pair with the same key value, or insert a new\n key/value pair (if no key with the same value existed).\n\n For user-defined objects, the "__setitem__()" method is called with\n appropriate arguments.\n\n* If the target is a slicing: The primary expression in the\n reference is evaluated. It should yield a mutable sequence object\n (such as a list). The assigned object should be a sequence object\n of the same type. Next, the lower and upper bound expressions are\n evaluated, insofar they are present; defaults are zero and the\n sequence\'s length. The bounds should evaluate to integers. If\n either bound is negative, the sequence\'s length is added to it. The\n resulting bounds are clipped to lie between zero and the sequence\'s\n length, inclusive. Finally, the sequence object is asked to replace\n the slice with the items of the assigned sequence. The length of\n the slice may be different from the length of the assigned sequence,\n thus changing the length of the target sequence, if the target\n sequence allows it.\n\n**CPython implementation detail:** In the current implementation, the\nsyntax for targets is taken to be the same as for expressions, and\ninvalid syntax is rejected during the code generation phase, causing\nless detailed error messages.\n\nAlthough the definition of assignment implies that overlaps between\nthe left-hand side and the right-hand side are \'simultaneous\' (for\nexample "a, b = b, a" swaps two variables), overlaps *within* the\ncollection of assigned-to variables occur left-to-right, sometimes\nresulting in confusion. For instance, the following program prints\n"[0, 2]":\n\n x = [0, 1]\n i = 0\n i, x[i] = 1, 2 # i is updated, then x[i] is updated\n print(x)\n\nSee also: **PEP 3132** - Extended Iterable Unpacking\n\n The specification for the "*target" feature.\n\n\nAugmented assignment statements\n===============================\n\nAugmented assignment is the combination, in a single statement, of a\nbinary operation and an assignment statement:\n\n augmented_assignment_stmt ::= augtarget augop (expression_list | yield_expression)\n augtarget ::= identifier | attributeref | subscription | slicing\n augop ::= "+=" | "-=" | "*=" | "@=" | "/=" | "//=" | "%=" | "**="\n | ">>=" | "<<=" | "&=" | "^=" | "|="\n\n(See section *Primaries* for the syntax definitions of the last three\nsymbols.)\n\nAn augmented assignment evaluates the target (which, unlike normal\nassignment statements, cannot be an unpacking) and the expression\nlist, performs the binary operation specific to the type of assignment\non the two operands, and assigns the result to the original target.\nThe target is only evaluated once.\n\nAn augmented assignment expression like "x += 1" can be rewritten as\n"x = x + 1" to achieve a similar, but not exactly equal effect. In the\naugmented version, "x" is only evaluated once. Also, when possible,\nthe actual operation is performed *in-place*, meaning that rather than\ncreating a new object and assigning that to the target, the old object\nis modified instead.\n\nUnlike normal assignments, augmented assignments evaluate the left-\nhand side *before* evaluating the right-hand side. For example, "a[i]\n+= f(x)" first looks-up "a[i]", then it evaluates "f(x)" and performs\nthe addition, and lastly, it writes the result back to "a[i]".\n\nWith the exception of assigning to tuples and multiple targets in a\nsingle statement, the assignment done by augmented assignment\nstatements is handled the same way as normal assignments. Similarly,\nwith the exception of the possible *in-place* behavior, the binary\noperation performed by augmented assignment is the same as the normal\nbinary operations.\n\nFor targets which are attribute references, the same *caveat about\nclass and instance attributes* applies as for regular assignments.\n', 'atom-identifiers': u'\nIdentifiers (Names)\n*******************\n\nAn identifier occurring as an atom is a name. See section\n*Identifiers and keywords* for lexical definition and section *Naming\nand binding* for documentation of naming and binding.\n\nWhen the name is bound to an object, evaluation of the atom yields\nthat object. When a name is not bound, an attempt to evaluate it\nraises a "NameError" exception.\n\n**Private name mangling:** When an identifier that textually occurs in\na class definition begins with two or more underscore characters and\ndoes not end in two or more underscores, it is considered a *private\nname* of that class. Private names are transformed to a longer form\nbefore code is generated for them. The transformation inserts the\nclass name, with leading underscores removed and a single underscore\ninserted, in front of the name. For example, the identifier "__spam"\noccurring in a class named "Ham" will be transformed to "_Ham__spam".\nThis transformation is independent of the syntactical context in which\nthe identifier is used. If the transformed name is extremely long\n(longer than 255 characters), implementation defined truncation may\nhappen. If the class name consists only of underscores, no\ntransformation is done.\n', diff --git a/Misc/NEWS.d/3.5.7.rst b/Misc/NEWS.d/3.5.7.rst new file mode 100644 index 000000000000..88a69dd2e5ab --- /dev/null +++ b/Misc/NEWS.d/3.5.7.rst @@ -0,0 +1,32 @@ +.. bpo: 36216 +.. date: 2019-03-06-09-38-40 +.. nonce: 6q1m4a +.. release date: 2019-03-17 +.. section: Security + +Changes urlsplit() to raise ValueError when the URL contains characters that +decompose under IDNA encoding (NFKC-normalization) into characters that +affect how the URL is parsed. + +.. + +.. bpo: 35121 +.. date: 2018-10-31-15-39-17 +.. nonce: EgHv9k +.. section: Security + +Don't send cookies of domain A without Domain attribute to domain B when +domain A is a suffix match of domain B while using a cookiejar with +:class:`http.cookiejar.DefaultCookiePolicy` policy. Patch by Karthikeyan +Singaravelan. + +.. + +.. bpo: 35121 +.. date: 2018-12-30-14-35-19 +.. nonce: oWmiGU +.. section: Library + +Don't set cookie for a request when the request path is a prefix match of +the cookie's path attribute but doesn't end with "/". Patch by Karthikeyan +Singaravelan. diff --git a/Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst b/Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst deleted file mode 100644 index 032e1e2c00bc..000000000000 --- a/Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst +++ /dev/null @@ -1,3 +0,0 @@ -Don't set cookie for a request when the request path is a prefix match of -the cookie's path attribute but doesn't end with "/". Patch by Karthikeyan -Singaravelan. diff --git a/Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst b/Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst deleted file mode 100644 index d2eb8f1f352c..000000000000 --- a/Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst +++ /dev/null @@ -1,4 +0,0 @@ -Don't send cookies of domain A without Domain attribute to domain B -when domain A is a suffix match of domain B while using a cookiejar -with :class:`http.cookiejar.DefaultCookiePolicy` policy. Patch by -Karthikeyan Singaravelan. diff --git a/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst b/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst deleted file mode 100644 index 5546394157f9..000000000000 --- a/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst +++ /dev/null @@ -1,3 +0,0 @@ -Changes urlsplit() to raise ValueError when the URL contains characters that -decompose under IDNA encoding (NFKC-normalization) into characters that -affect how the URL is parsed. From webhook-mailer at python.org Thu Mar 21 00:32:01 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 21 Mar 2019 04:32:01 -0000 Subject: [Python-checkins] bpo-36312: Fix decoders for some code pages. (GH-12369) Message-ID: https://github.com/python/cpython/commit/74829b7323642739cdc439c2c88d406daf92075b commit: 74829b7323642739cdc439c2c88d406daf92075b branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-20T21:31:57-07:00 summary: bpo-36312: Fix decoders for some code pages. (GH-12369) (cherry picked from commit c1e2c288f41cdc1c6e6e09d9a5277a58232ceb03) Co-authored-by: Serhiy Storchaka files: A Misc/NEWS.d/next/Windows/2019-03-16-16-51-17.bpo-36312.Niwm-T.rst M Lib/test/test_codecs.py M Objects/unicodeobject.c diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index 5c2de212b199..293dfbc61aba 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -3159,6 +3159,15 @@ def test_multibyte_encoding(self): ('[\U0010ffff\uDC80]', 'replace', b'[\xf4\x8f\xbf\xbf?]'), )) + def test_code_page_decode_flags(self): + # Issue #36312: For some code pages (e.g. UTF-7) flags for + # MultiByteToWideChar() must be set to 0. + for cp in (50220, 50221, 50222, 50225, 50227, 50229, + *range(57002, 57011+1), 65000): + self.assertEqual(codecs.code_page_decode(cp, b'abc'), ('abc', 3)) + self.assertEqual(codecs.code_page_decode(42, b'abc'), + ('\uf061\uf062\uf063', 3)) + def test_incremental(self): decoded = codecs.code_page_decode(932, b'\x82', 'strict', False) self.assertEqual(decoded, ('', 0)) diff --git a/Misc/NEWS.d/next/Windows/2019-03-16-16-51-17.bpo-36312.Niwm-T.rst b/Misc/NEWS.d/next/Windows/2019-03-16-16-51-17.bpo-36312.Niwm-T.rst new file mode 100644 index 000000000000..8b325db3a989 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-03-16-16-51-17.bpo-36312.Niwm-T.rst @@ -0,0 +1,2 @@ +Fixed decoders for the following code pages: 50220, 50221, 50222, 50225, +50227, 50229, 57002 through 57011, 65000 and 42. diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index b67ffac4e9fb..adcf69d4e539 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -7123,15 +7123,21 @@ decode_code_page_strict(UINT code_page, const char *in, int insize) { - const DWORD flags = decode_code_page_flags(code_page); + DWORD flags = MB_ERR_INVALID_CHARS; wchar_t *out; DWORD outsize; /* First get the size of the result */ assert(insize > 0); - outsize = MultiByteToWideChar(code_page, flags, in, insize, NULL, 0); - if (outsize <= 0) - goto error; + while ((outsize = MultiByteToWideChar(code_page, flags, + in, insize, NULL, 0)) <= 0) + { + if (!flags || GetLastError() != ERROR_INVALID_FLAGS) { + goto error; + } + /* For some code pages (e.g. UTF-7) flags must be set to 0. */ + flags = 0; + } if (*v == NULL) { /* Create unicode object */ @@ -7177,7 +7183,7 @@ decode_code_page_errors(UINT code_page, { const char *startin = in; const char *endin = in + size; - const DWORD flags = decode_code_page_flags(code_page); + DWORD flags = MB_ERR_INVALID_CHARS; /* Ideally, we should get reason from FormatMessage. This is the Windows 2000 English version of the message. */ const char *reason = "No mapping for the Unicode character exists " @@ -7248,6 +7254,11 @@ decode_code_page_errors(UINT code_page, if (outsize > 0) break; err = GetLastError(); + if (err == ERROR_INVALID_FLAGS && flags) { + /* For some code pages (e.g. UTF-7) flags must be set to 0. */ + flags = 0; + continue; + } if (err != ERROR_NO_UNICODE_TRANSLATION && err != ERROR_INSUFFICIENT_BUFFER) { From webhook-mailer at python.org Thu Mar 21 00:39:21 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 21 Mar 2019 04:39:21 -0000 Subject: [Python-checkins] bpo-36385: Add ``elif`` sentence on to avoid multiple ``if`` (GH-12478) Message-ID: https://github.com/python/cpython/commit/ed5e29cba500c2336aacdb7c77953f1064235b72 commit: ed5e29cba500c2336aacdb7c77953f1064235b72 branch: master author: Emmanuel Arias committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-20T21:39:17-07:00 summary: bpo-36385: Add ``elif`` sentence on to avoid multiple ``if`` (GH-12478) Currently, when arguments on Parser/asdl_c.py are parsed ``?f`` sentence is used. This PR Propose to use ``elif`` to avoid multiple evaluting of the ifs. https://bugs.python.org/issue36385 files: M Parser/asdl_c.py diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index 52247559d1a9..4091b6db638c 100644 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -1313,9 +1313,9 @@ def main(srcfile, dump_module=False): for o, v in opts: if o == '-h': H_FILE = v - if o == '-c': + elif o == '-c': C_FILE = v - if o == '-d': + elif o == '-d': dump_module = True if H_FILE and C_FILE: print('Must specify exactly one output file') From webhook-mailer at python.org Thu Mar 21 10:45:06 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Thu, 21 Mar 2019 14:45:06 -0000 Subject: [Python-checkins] bpo-36268: Change default tar format to pax from GNU. (GH-12355) Message-ID: https://github.com/python/cpython/commit/e680c3db80efc4a1d637dd871af21276db45ae03 commit: e680c3db80efc4a1d637dd871af21276db45ae03 branch: master author: CAM Gerlach committer: Serhiy Storchaka date: 2019-03-21T16:44:51+02:00 summary: bpo-36268: Change default tar format to pax from GNU. (GH-12355) files: A Misc/NEWS.d/next/Library/2019-03-14-16-25-17.bpo-36268.MDXLw6.rst M Doc/library/tarfile.rst M Doc/whatsnew/3.8.rst M Lib/tarfile.py M Lib/test/test_tarfile.py diff --git a/Doc/library/tarfile.rst b/Doc/library/tarfile.rst index 9cd07158e7f6..c7012a7d48f6 100644 --- a/Doc/library/tarfile.rst +++ b/Doc/library/tarfile.rst @@ -229,7 +229,11 @@ details. .. data:: DEFAULT_FORMAT - The default format for creating archives. This is currently :const:`GNU_FORMAT`. + The default format for creating archives. This is currently :const:`PAX_FORMAT`. + + .. versionchanged:: 3.8 + The default format for new archives was changed to + :const:`PAX_FORMAT` from :const:`GNU_FORMAT`. .. seealso:: @@ -820,8 +824,10 @@ There are three tar formats that can be created with the :mod:`tarfile` module: * The POSIX.1-2001 pax format (:const:`PAX_FORMAT`). It is the most flexible format with virtually no limits. It supports long filenames and linknames, large - files and stores pathnames in a portable way. However, not all tar - implementations today are able to handle pax archives properly. + files and stores pathnames in a portable way. Modern tar implementations, + including GNU tar, bsdtar/libarchive and star, fully support extended *pax* + features; some older or unmaintained libraries may not, but should treat + *pax* archives as if they were in the universally-supported *ustar* format. The *pax* format is an extension to the existing *ustar* format. It uses extra headers for information that cannot be stored otherwise. There are two flavours @@ -871,7 +877,7 @@ converted. Possible values are listed in section :ref:`error-handlers`. The default scheme is ``'surrogateescape'`` which Python also uses for its file system calls, see :ref:`os-filenames`. -In case of :const:`PAX_FORMAT` archives, *encoding* is generally not needed +For :const:`PAX_FORMAT` archives (the default), *encoding* is generally not needed because all the metadata is stored using *UTF-8*. *encoding* is only used in the rare cases when binary pax headers are decoded or when strings with surrogate characters are stored. diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 2e311ab1c1f5..18ec2c2f662d 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -316,6 +316,16 @@ and manipulating normal distributions of a random variable. [7.672102882379219, 12.000027119750287, 4.647488369766392] +tarfile +------- + +The :mod:`tarfile` module now defaults to the modern pax (POSIX.1-2001) +format for new archives, instead of the previous GNU-specific one. +This improves cross-platform portability with a consistent encoding (UTF-8) +in a standardized and extensible format, and offers several other benefits. +(Contributed by C.A.M. Gerlach in :issue:`36268`.) + + tokenize -------- diff --git a/Lib/tarfile.py b/Lib/tarfile.py index bb09d10925b2..30cecffd1a84 100755 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -105,7 +105,7 @@ USTAR_FORMAT = 0 # POSIX.1-1988 (ustar) format GNU_FORMAT = 1 # GNU tar format PAX_FORMAT = 2 # POSIX.1-2001 (pax) format -DEFAULT_FORMAT = GNU_FORMAT +DEFAULT_FORMAT = PAX_FORMAT #--------------------------------------------------------- # tarfile constants diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index 5e5a3c3cea83..7e32cbccd6c5 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -2136,15 +2136,16 @@ def test_read_number_fields(self): def test_write_number_fields(self): self.assertEqual(tarfile.itn(1), b"0000001\x00") self.assertEqual(tarfile.itn(0o7777777), b"7777777\x00") - self.assertEqual(tarfile.itn(0o10000000), + self.assertEqual(tarfile.itn(0o10000000, format=tarfile.GNU_FORMAT), b"\x80\x00\x00\x00\x00\x20\x00\x00") - self.assertEqual(tarfile.itn(0xffffffff), + self.assertEqual(tarfile.itn(0xffffffff, format=tarfile.GNU_FORMAT), b"\x80\x00\x00\x00\xff\xff\xff\xff") - self.assertEqual(tarfile.itn(-1), + self.assertEqual(tarfile.itn(-1, format=tarfile.GNU_FORMAT), b"\xff\xff\xff\xff\xff\xff\xff\xff") - self.assertEqual(tarfile.itn(-100), + self.assertEqual(tarfile.itn(-100, format=tarfile.GNU_FORMAT), b"\xff\xff\xff\xff\xff\xff\xff\x9c") - self.assertEqual(tarfile.itn(-0x100000000000000), + self.assertEqual(tarfile.itn(-0x100000000000000, + format=tarfile.GNU_FORMAT), b"\xff\x00\x00\x00\x00\x00\x00\x00") # Issue 32713: Test if itn() supports float values outside the diff --git a/Misc/NEWS.d/next/Library/2019-03-14-16-25-17.bpo-36268.MDXLw6.rst b/Misc/NEWS.d/next/Library/2019-03-14-16-25-17.bpo-36268.MDXLw6.rst new file mode 100644 index 000000000000..55f4e0f0d051 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-14-16-25-17.bpo-36268.MDXLw6.rst @@ -0,0 +1,3 @@ +Switch the default format used for writing tars with mod:`tarfile` to +the modern POSIX.1-2001 pax standard, from the vendor-specific GNU. +Contributed by C.A.M. Gerlach. From webhook-mailer at python.org Thu Mar 21 11:28:55 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Thu, 21 Mar 2019 15:28:55 -0000 Subject: [Python-checkins] Fix table formatting in itertools doc (GH-12228) Message-ID: https://github.com/python/cpython/commit/14e3c447c1cdd386bc93ac884e8c8b7f297817df commit: 14e3c447c1cdd386bc93ac884e8c8b7f297817df branch: master author: Benedikt Werner <1benediktwerner at gmail.com> committer: Raymond Hettinger date: 2019-03-21T08:28:49-07:00 summary: Fix table formatting in itertools doc (GH-12228) files: M Doc/library/itertools.rst diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index b1513cd8b1b9..3d4e5836cf20 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -70,12 +70,17 @@ Iterator Arguments Resu :func:`permutations` p[, r] r-length tuples, all possible orderings, no repeated elements :func:`combinations` p, r r-length tuples, in sorted order, no repeated elements :func:`combinations_with_replacement` p, r r-length tuples, in sorted order, with repeated elements -``product('ABCD', repeat=2)`` ``AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD`` -``permutations('ABCD', 2)`` ``AB AC AD BA BC BD CA CB CD DA DB DC`` -``combinations('ABCD', 2)`` ``AB AC AD BC BD CD`` -``combinations_with_replacement('ABCD', 2)`` ``AA AB AC AD BB BC BD CC CD DD`` ============================================== ==================== ============================================================= +============================================== ============================================================= +Examples Results +============================================== ============================================================= +``product('ABCD', repeat=2)`` ``AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD`` +``permutations('ABCD', 2)`` ``AB AC AD BA BC BD CA CB CD DA DB DC`` +``combinations('ABCD', 2)`` ``AB AC AD BC BD CD`` +``combinations_with_replacement('ABCD',?2)`` ``AA AB AC AD BB BC BD CC CD DD`` +============================================== ============================================================= + .. _itertools-functions: From webhook-mailer at python.org Thu Mar 21 12:03:10 2019 From: webhook-mailer at python.org (Steve Dower) Date: Thu, 21 Mar 2019 16:03:10 -0000 Subject: [Python-checkins] bpo-36245: Avoid problems when building in a directory containing spaces. (GH-12241) Message-ID: https://github.com/python/cpython/commit/7ee88bf3e59493137a775368165c5c5fe1ed7f46 commit: 7ee88bf3e59493137a775368165c5c5fe1ed7f46 branch: master author: Jess committer: Steve Dower date: 2019-03-21T09:02:59-07:00 summary: bpo-36245: Avoid problems when building in a directory containing spaces. (GH-12241) files: M PCbuild/get_externals.bat diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat index 175a0513e77c..cbeb5a19b55b 100644 --- a/PCbuild/get_externals.bat +++ b/PCbuild/get_externals.bat @@ -41,7 +41,7 @@ if "%DO_FETCH%"=="false" goto end if "%ORG%"=="" (set ORG=python) call "%PCBUILD%\find_python.bat" "%PYTHON%" -if "%PYTHON%"=="" ( +if NOT DEFINED PYTHON ( where /Q git || echo Python 3.6 could not be found or installed, and git.exe is not on your PATH && exit /B 1 ) @@ -60,7 +60,7 @@ set libraries=%libraries% zlib-1.2.11 for %%e in (%libraries%) do ( if exist "%EXTERNALS_DIR%\%%e" ( echo.%%e already exists, skipping. - ) else if "%PYTHON%"=="" ( + ) else if NOT DEFINED PYTHON ( echo.Fetching %%e with git... git clone --depth 1 https://github.com/%ORG%/cpython-source-deps --branch %%e "%EXTERNALS_DIR%\%%e" ) else ( @@ -79,7 +79,7 @@ if NOT "%IncludeSSLSrc%"=="false" set binaries=%binaries% nasm-2.11.06 for %%b in (%binaries%) do ( if exist "%EXTERNALS_DIR%\%%b" ( echo.%%b already exists, skipping. - ) else if "%PYTHON%"=="" ( + ) else if NOT DEFINED PYTHON ( echo.Fetching %%b with git... git clone --depth 1 https://github.com/%ORG%/cpython-bin-deps --branch %%b "%EXTERNALS_DIR%\%%b" ) else ( From webhook-mailer at python.org Thu Mar 21 12:25:26 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 21 Mar 2019 16:25:26 -0000 Subject: [Python-checkins] bpo-36245: Avoid problems when building in a directory containing spaces. (GH-12241) Message-ID: https://github.com/python/cpython/commit/b058a97c90c3144cc602b719483572916b3918bb commit: b058a97c90c3144cc602b719483572916b3918bb branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-21T09:25:11-07:00 summary: bpo-36245: Avoid problems when building in a directory containing spaces. (GH-12241) (cherry picked from commit 7ee88bf3e59493137a775368165c5c5fe1ed7f46) Co-authored-by: Jess files: M PCbuild/get_externals.bat diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat index 175a0513e77c..cbeb5a19b55b 100644 --- a/PCbuild/get_externals.bat +++ b/PCbuild/get_externals.bat @@ -41,7 +41,7 @@ if "%DO_FETCH%"=="false" goto end if "%ORG%"=="" (set ORG=python) call "%PCBUILD%\find_python.bat" "%PYTHON%" -if "%PYTHON%"=="" ( +if NOT DEFINED PYTHON ( where /Q git || echo Python 3.6 could not be found or installed, and git.exe is not on your PATH && exit /B 1 ) @@ -60,7 +60,7 @@ set libraries=%libraries% zlib-1.2.11 for %%e in (%libraries%) do ( if exist "%EXTERNALS_DIR%\%%e" ( echo.%%e already exists, skipping. - ) else if "%PYTHON%"=="" ( + ) else if NOT DEFINED PYTHON ( echo.Fetching %%e with git... git clone --depth 1 https://github.com/%ORG%/cpython-source-deps --branch %%e "%EXTERNALS_DIR%\%%e" ) else ( @@ -79,7 +79,7 @@ if NOT "%IncludeSSLSrc%"=="false" set binaries=%binaries% nasm-2.11.06 for %%b in (%binaries%) do ( if exist "%EXTERNALS_DIR%\%%b" ( echo.%%b already exists, skipping. - ) else if "%PYTHON%"=="" ( + ) else if NOT DEFINED PYTHON ( echo.Fetching %%b with git... git clone --depth 1 https://github.com/%ORG%/cpython-bin-deps --branch %%b "%EXTERNALS_DIR%\%%b" ) else ( From webhook-mailer at python.org Thu Mar 21 13:04:47 2019 From: webhook-mailer at python.org (Steve Dower) Date: Thu, 21 Mar 2019 17:04:47 -0000 Subject: [Python-checkins] bpo-35978: Correctly skips venv tests in venvs (GH-12220) Message-ID: https://github.com/python/cpython/commit/8bba81fd55873148c65b7d0e6a6effbd63048c76 commit: 8bba81fd55873148c65b7d0e6a6effbd63048c76 branch: master author: Steve Dower committer: GitHub date: 2019-03-21T10:04:21-07:00 summary: bpo-35978: Correctly skips venv tests in venvs (GH-12220) Also fixes venvs from the build directory on Windows. files: M Lib/test/test_venv.py M Lib/venv/__init__.py diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index 0b2c7a0258df..6822d567e42b 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -24,8 +24,12 @@ except ImportError: ctypes = None -skipInVenv = unittest.skipIf(sys.prefix != sys.base_prefix, - 'Test not appropriate in a venv') +# Platforms that set sys._base_executable can create venvs from within +# another venv, so no need to skip tests that require venv.create(). +requireVenvCreate = unittest.skipUnless( + hasattr(sys, '_base_executable') + or sys.prefix == sys.base_prefix, + 'cannot run venv.create from within a venv on this platform') def check_output(cmd, encoding=None): p = subprocess.Popen(cmd, @@ -126,7 +130,7 @@ def test_prompt(self): self.assertEqual(context.prompt, '(My prompt) ') self.assertIn("prompt = 'My prompt'\n", data) - @skipInVenv + @requireVenvCreate def test_prefixes(self): """ Test that the prefix values are as expected. @@ -262,7 +266,7 @@ def test_symlinking(self): # run the test, the pyvenv.cfg in the venv created in the test will # point to the venv being used to run the test, and we lose the link # to the source build - so Python can't initialise properly. - @skipInVenv + @requireVenvCreate def test_executable(self): """ Test that the sys.executable value is as expected. @@ -306,6 +310,7 @@ def test_unicode_in_batch_file(self): ) self.assertEqual(out.strip(), '0') + @requireVenvCreate def test_multiprocessing(self): """ Test that the multiprocessing is able to spawn. @@ -319,7 +324,7 @@ def test_multiprocessing(self): 'print(Pool(1).apply_async("Python".lower).get(3))']) self.assertEqual(out.strip(), "python".encode()) - at skipInVenv + at requireVenvCreate class EnsurePipTest(BaseTest): """Test venv module installation of pip.""" def assert_pip_not_installed(self): diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py index a309b861c5f4..5e6d375e95a7 100644 --- a/Lib/venv/__init__.py +++ b/Lib/venv/__init__.py @@ -178,18 +178,23 @@ def symlink_or_copy(self, src, dst, relative_symlinks_ok=False): # On Windows, we rewrite symlinks to our base python.exe into # copies of venvlauncher.exe basename, ext = os.path.splitext(os.path.basename(src)) - if basename.endswith('_d'): - ext = '_d' + ext - basename = basename[:-2] - if sysconfig.is_python_build(True): + srcfn = os.path.join(os.path.dirname(__file__), + "scripts", + "nt", + basename + ext) + # Builds or venv's from builds need to remap source file + # locations, as we do not put them into Lib/venv/scripts + if sysconfig.is_python_build(True) or not os.path.isfile(srcfn): + if basename.endswith('_d'): + ext = '_d' + ext + basename = basename[:-2] if basename == 'python': basename = 'venvlauncher' elif basename == 'pythonw': basename = 'venvwlauncher' - scripts = os.path.dirname(src) + src = os.path.join(os.path.dirname(src), basename + ext) else: - scripts = os.path.join(os.path.dirname(__file__), "scripts", "nt") - src = os.path.join(scripts, basename + ext) + src = srcfn shutil.copyfile(src, dst) From webhook-mailer at python.org Thu Mar 21 13:33:58 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 21 Mar 2019 17:33:58 -0000 Subject: [Python-checkins] bpo-35978: Correctly skips venv tests in venvs (GH-12220) Message-ID: https://github.com/python/cpython/commit/b0967fe4ed2e0e15f14ea574f82970a3fd4a5556 commit: b0967fe4ed2e0e15f14ea574f82970a3fd4a5556 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-21T10:33:40-07:00 summary: bpo-35978: Correctly skips venv tests in venvs (GH-12220) Also fixes venvs from the build directory on Windows. (cherry picked from commit 8bba81fd55873148c65b7d0e6a6effbd63048c76) Co-authored-by: Steve Dower files: M Lib/test/test_venv.py M Lib/venv/__init__.py diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index 347544a67722..19a5aab7a210 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -24,8 +24,12 @@ except ImportError: ctypes = None -skipInVenv = unittest.skipIf(sys.prefix != sys.base_prefix, - 'Test not appropriate in a venv') +# Platforms that set sys._base_executable can create venvs from within +# another venv, so no need to skip tests that require venv.create(). +requireVenvCreate = unittest.skipUnless( + hasattr(sys, '_base_executable') + or sys.prefix == sys.base_prefix, + 'cannot run venv.create from within a venv on this platform') def check_output(cmd, encoding=None): p = subprocess.Popen(cmd, @@ -118,7 +122,7 @@ def test_prompt(self): context = builder.ensure_directories(self.env_dir) self.assertEqual(context.prompt, '(My prompt) ') - @skipInVenv + @requireVenvCreate def test_prefixes(self): """ Test that the prefix values are as expected. @@ -254,7 +258,7 @@ def test_symlinking(self): # run the test, the pyvenv.cfg in the venv created in the test will # point to the venv being used to run the test, and we lose the link # to the source build - so Python can't initialise properly. - @skipInVenv + @requireVenvCreate def test_executable(self): """ Test that the sys.executable value is as expected. @@ -298,6 +302,7 @@ def test_unicode_in_batch_file(self): ) self.assertEqual(out.strip(), '0') + @requireVenvCreate def test_multiprocessing(self): """ Test that the multiprocessing is able to spawn. @@ -311,7 +316,7 @@ def test_multiprocessing(self): 'print(Pool(1).apply_async("Python".lower).get(3))']) self.assertEqual(out.strip(), "python".encode()) - at skipInVenv + at requireVenvCreate class EnsurePipTest(BaseTest): """Test venv module installation of pip.""" def assert_pip_not_installed(self): diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py index d5ab38958bb2..4fbd954f200d 100644 --- a/Lib/venv/__init__.py +++ b/Lib/venv/__init__.py @@ -176,18 +176,23 @@ def symlink_or_copy(self, src, dst, relative_symlinks_ok=False): # On Windows, we rewrite symlinks to our base python.exe into # copies of venvlauncher.exe basename, ext = os.path.splitext(os.path.basename(src)) - if basename.endswith('_d'): - ext = '_d' + ext - basename = basename[:-2] - if sysconfig.is_python_build(True): + srcfn = os.path.join(os.path.dirname(__file__), + "scripts", + "nt", + basename + ext) + # Builds or venv's from builds need to remap source file + # locations, as we do not put them into Lib/venv/scripts + if sysconfig.is_python_build(True) or not os.path.isfile(srcfn): + if basename.endswith('_d'): + ext = '_d' + ext + basename = basename[:-2] if basename == 'python': basename = 'venvlauncher' elif basename == 'pythonw': basename = 'venvwlauncher' - scripts = os.path.dirname(src) + src = os.path.join(os.path.dirname(src), basename + ext) else: - scripts = os.path.join(os.path.dirname(__file__), "scripts", "nt") - src = os.path.join(scripts, basename + ext) + src = srcfn shutil.copyfile(src, dst) From webhook-mailer at python.org Thu Mar 21 13:53:14 2019 From: webhook-mailer at python.org (Steve Dower) Date: Thu, 21 Mar 2019 17:53:14 -0000 Subject: [Python-checkins] Fix registry key for Windows SDK detection (GH-12445) Message-ID: https://github.com/python/cpython/commit/aedc273fd90e31c7a20904568de3115f8957395b commit: aedc273fd90e31c7a20904568de3115f8957395b branch: master author: Isuru Fernando committer: Steve Dower date: 2019-03-21T10:52:57-07:00 summary: Fix registry key for Windows SDK detection (GH-12445) files: M PCbuild/python.props diff --git a/PCbuild/python.props b/PCbuild/python.props index a9dc9db4863f..3a0ddceda664 100644 --- a/PCbuild/python.props +++ b/PCbuild/python.props @@ -85,7 +85,7 @@ matter which WinSDK version we use. --> <_RegistryVersion>$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v10.0 at ProductVersion) - <_RegistryVersion Condition="$(_RegistryVersion) == ''">$(Registry:HKEY_LOCAL_MACHINE\WOW6432Node\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v10.0 at ProductVersion) + <_RegistryVersion Condition="$(_RegistryVersion) == ''">$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft SDKs\Windows\v10.0 at ProductVersion) <_RegistryVersion Condition="$(_RegistryVersion) != '' and !$(_RegistryVersion.EndsWith('.0'))">$(_RegistryVersion).0 From webhook-mailer at python.org Thu Mar 21 17:55:08 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 21 Mar 2019 21:55:08 -0000 Subject: [Python-checkins] Fix registry key for Windows SDK detection (GH-12445) Message-ID: https://github.com/python/cpython/commit/cba5ddf088683859dd022d04cb3726d56f5f0297 commit: cba5ddf088683859dd022d04cb3726d56f5f0297 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-21T14:54:59-07:00 summary: Fix registry key for Windows SDK detection (GH-12445) (cherry picked from commit aedc273fd90e31c7a20904568de3115f8957395b) Co-authored-by: Isuru Fernando files: M PCbuild/python.props diff --git a/PCbuild/python.props b/PCbuild/python.props index f83d4df0d59f..683fbb6e6f84 100644 --- a/PCbuild/python.props +++ b/PCbuild/python.props @@ -76,7 +76,7 @@ matter which WinSDK version we use. --> <_RegistryVersion>$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v10.0 at ProductVersion) - <_RegistryVersion Condition="$(_RegistryVersion) == ''">$(Registry:HKEY_LOCAL_MACHINE\WOW6432Node\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v10.0 at ProductVersion) + <_RegistryVersion Condition="$(_RegistryVersion) == ''">$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft SDKs\Windows\v10.0 at ProductVersion) <_RegistryVersion Condition="$(_RegistryVersion) != '' and !$(_RegistryVersion.EndsWith('.0'))">$(_RegistryVersion).0 From webhook-mailer at python.org Thu Mar 21 19:33:16 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Thu, 21 Mar 2019 23:33:16 -0000 Subject: [Python-checkins] bpo-36256: Fix bug in parsermodule when parsing if statements (GH-12477) Message-ID: https://github.com/python/cpython/commit/9a0000d15d27361eaa47b77600c7c00a9787a894 commit: 9a0000d15d27361eaa47b77600c7c00a9787a894 branch: master author: Pablo Galindo committer: GitHub date: 2019-03-21T23:33:02Z summary: bpo-36256: Fix bug in parsermodule when parsing if statements (GH-12477) bpo-36256: Fix bug in parsermodule when parsing if statements In the parser module, when validating nodes before starting the parsing with to create a ST in "parser_newstobject" there is a problem that appears when two arcs in the same DFA state has transitions with labels with the same type. For example, the DFA for if_stmt has a state with two labels with the same type: "elif" and "else" (type NAME). The algorithm tries one by one the arcs until the label that starts the arc transition has a label with the same type of the current child label we are trying to accept. In this case, the arc for "elif" comes before the arc for "else"and passes this test (because the current child label is "else" and has the same type as "elif"). This lead to expecting a namedexpr_test (305) instead of a colon (11). The solution is to compare also the string representation (in case there is one) of the labels to see if the transition that we have is the correct one. files: A Misc/NEWS.d/next/Core and Builtins/2019-03-21-00-24-18.bpo-12477.OZHa0t.rst M Lib/test/test_parser.py M Modules/parsermodule.c diff --git a/Lib/test/test_parser.py b/Lib/test/test_parser.py index 5548a871c024..bfa0a5a34e2d 100644 --- a/Lib/test/test_parser.py +++ b/Lib/test/test_parser.py @@ -319,6 +319,10 @@ def test_try_stmt(self): self.check_suite("try: pass\nexcept: pass\nelse: pass\n" "finally: pass\n") + def test_if_stmt(self): + self.check_suite("if True:\n pass\nelse:\n pass\n") + self.check_suite("if True:\n pass\nelif True:\n pass\nelse:\n pass\n") + def test_position(self): # An absolutely minimal test of position information. Better # tests would be a big project. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-21-00-24-18.bpo-12477.OZHa0t.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-21-00-24-18.bpo-12477.OZHa0t.rst new file mode 100644 index 000000000000..aada7f912a6c --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-21-00-24-18.bpo-12477.OZHa0t.rst @@ -0,0 +1,2 @@ +Fix bug in parsermodule when parsing a state in a DFA that has two or more +arcs with labels of the same type. Patch by Pablo Galindo. diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c index b0a749a3bc17..fd330b5fbe02 100644 --- a/Modules/parsermodule.c +++ b/Modules/parsermodule.c @@ -675,7 +675,12 @@ validate_node(node *tree) for (arc = 0; arc < dfa_state->s_narcs; ++arc) { short a_label = dfa_state->s_arc[arc].a_lbl; assert(a_label < _PyParser_Grammar.g_ll.ll_nlabels); - if (_PyParser_Grammar.g_ll.ll_label[a_label].lb_type == ch_type) { + + const char *label_str = _PyParser_Grammar.g_ll.ll_label[a_label].lb_str; + if ((_PyParser_Grammar.g_ll.ll_label[a_label].lb_type == ch_type) + && ((ch->n_str == NULL) || (label_str == NULL) + || (strcmp(ch->n_str, label_str) == 0)) + ) { /* The child is acceptable; if non-terminal, validate it recursively. */ if (ISNONTERMINAL(ch_type) && !validate_node(ch)) return 0; @@ -688,17 +693,24 @@ validate_node(node *tree) /* What would this state have accepted? */ { short a_label = dfa_state->s_arc->a_lbl; - int next_type; if (!a_label) /* Wouldn't accept any more children */ goto illegal_num_children; - next_type = _PyParser_Grammar.g_ll.ll_label[a_label].lb_type; - if (ISNONTERMINAL(next_type)) + int next_type = _PyParser_Grammar.g_ll.ll_label[a_label].lb_type; + const char *expected_str = _PyParser_Grammar.g_ll.ll_label[a_label].lb_str; + + if (ISNONTERMINAL(next_type)) { PyErr_Format(parser_error, "Expected node type %d, got %d.", next_type, ch_type); - else + } + else if (expected_str != NULL) { + PyErr_Format(parser_error, "Illegal terminal: expected '%s'.", + expected_str); + } + else { PyErr_Format(parser_error, "Illegal terminal: expected %s.", _PyParser_TokenNames[next_type]); + } return 0; } From webhook-mailer at python.org Thu Mar 21 19:56:25 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Thu, 21 Mar 2019 23:56:25 -0000 Subject: [Python-checkins] bpo-36256: Fix bug in parsermodule when parsing if statements (GH-12488) Message-ID: https://github.com/python/cpython/commit/00eb97b4a7d9a73b88ed7c76faee4e49204d5a00 commit: 00eb97b4a7d9a73b88ed7c76faee4e49204d5a00 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Pablo Galindo date: 2019-03-21T23:56:20Z summary: bpo-36256: Fix bug in parsermodule when parsing if statements (GH-12488) bpo-36256: Fix bug in parsermodule when parsing if statements In the parser module, when validating nodes before starting the parsing with to create a ST in "parser_newstobject" there is a problem that appears when two arcs in the same DFA state has transitions with labels with the same type. For example, the DFA for if_stmt has a state with two labels with the same type: "elif" and "else" (type NAME). The algorithm tries one by one the arcs until the label that starts the arc transition has a label with the same type of the current child label we are trying to accept. In this case, the arc for "elif" comes before the arc for "else"and passes this test (because the current child label is "else" and has the same type as "elif"). This lead to expecting a namedexpr_test (305) instead of a colon (11). The solution is to compare also the string representation (in case there is one) of the labels to see if the transition that we have is the correct one. (cherry picked from commit 9a0000d15d27361eaa47b77600c7c00a9787a894) Co-authored-by: Pablo Galindo files: A Misc/NEWS.d/next/Core and Builtins/2019-03-21-00-24-18.bpo-12477.OZHa0t.rst M Lib/test/test_parser.py M Modules/parsermodule.c diff --git a/Lib/test/test_parser.py b/Lib/test/test_parser.py index 274e26061a19..94e454663573 100644 --- a/Lib/test/test_parser.py +++ b/Lib/test/test_parser.py @@ -318,6 +318,10 @@ def test_try_stmt(self): self.check_suite("try: pass\nexcept: pass\nelse: pass\n" "finally: pass\n") + def test_if_stmt(self): + self.check_suite("if True:\n pass\nelse:\n pass\n") + self.check_suite("if True:\n pass\nelif True:\n pass\nelse:\n pass\n") + def test_position(self): # An absolutely minimal test of position information. Better # tests would be a big project. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-21-00-24-18.bpo-12477.OZHa0t.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-21-00-24-18.bpo-12477.OZHa0t.rst new file mode 100644 index 000000000000..aada7f912a6c --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-21-00-24-18.bpo-12477.OZHa0t.rst @@ -0,0 +1,2 @@ +Fix bug in parsermodule when parsing a state in a DFA that has two or more +arcs with labels of the same type. Patch by Pablo Galindo. diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c index 38e5f750d572..67c874267f24 100644 --- a/Modules/parsermodule.c +++ b/Modules/parsermodule.c @@ -666,7 +666,12 @@ validate_node(node *tree) for (arc = 0; arc < dfa_state->s_narcs; ++arc) { short a_label = dfa_state->s_arc[arc].a_lbl; assert(a_label < _PyParser_Grammar.g_ll.ll_nlabels); - if (_PyParser_Grammar.g_ll.ll_label[a_label].lb_type == ch_type) { + + const char *label_str = _PyParser_Grammar.g_ll.ll_label[a_label].lb_str; + if ((_PyParser_Grammar.g_ll.ll_label[a_label].lb_type == ch_type) + && ((ch->n_str == NULL) || (label_str == NULL) + || (strcmp(ch->n_str, label_str) == 0)) + ) { /* The child is acceptable; if non-terminal, validate it recursively. */ if (ISNONTERMINAL(ch_type) && !validate_node(ch)) return 0; @@ -679,17 +684,24 @@ validate_node(node *tree) /* What would this state have accepted? */ { short a_label = dfa_state->s_arc->a_lbl; - int next_type; if (!a_label) /* Wouldn't accept any more children */ goto illegal_num_children; - next_type = _PyParser_Grammar.g_ll.ll_label[a_label].lb_type; - if (ISNONTERMINAL(next_type)) + int next_type = _PyParser_Grammar.g_ll.ll_label[a_label].lb_type; + const char *expected_str = _PyParser_Grammar.g_ll.ll_label[a_label].lb_str; + + if (ISNONTERMINAL(next_type)) { PyErr_Format(parser_error, "Expected node type %d, got %d.", next_type, ch_type); - else + } + else if (expected_str != NULL) { + PyErr_Format(parser_error, "Illegal terminal: expected '%s'.", + expected_str); + } + else { PyErr_Format(parser_error, "Illegal terminal: expected %s.", _PyParser_TokenNames[next_type]); + } return 0; } From webhook-mailer at python.org Fri Mar 22 03:24:43 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Fri, 22 Mar 2019 07:24:43 -0000 Subject: [Python-checkins] bpo-36398: Fix a possible crash in structseq_repr(). (GH-12492) Message-ID: https://github.com/python/cpython/commit/93e8012f2cabd84f30b52e19fd3dc557efa9f8af commit: 93e8012f2cabd84f30b52e19fd3dc557efa9f8af branch: master author: Zackery Spytz committer: Serhiy Storchaka date: 2019-03-22T09:24:34+02:00 summary: bpo-36398: Fix a possible crash in structseq_repr(). (GH-12492) If the first PyUnicode_DecodeUTF8() call fails in structseq_repr(), _PyUnicodeWriter_Dealloc() will be called on an uninitialized _PyUnicodeWriter. files: A Misc/NEWS.d/next/Core and Builtins/2019-03-21-22-19-38.bpo-36398.B_jXGe.rst M Objects/structseq.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-21-22-19-38.bpo-36398.B_jXGe.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-21-22-19-38.bpo-36398.B_jXGe.rst new file mode 100644 index 000000000000..2b00283096f2 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-21-22-19-38.bpo-36398.B_jXGe.rst @@ -0,0 +1 @@ +Fix a possible crash in ``structseq_repr()``. diff --git a/Objects/structseq.c b/Objects/structseq.c index 5278313ffdce..cf36fa7f97c0 100644 --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -176,7 +176,7 @@ structseq_repr(PyStructSequence *obj) strlen(typ->tp_name), NULL); if (type_name == NULL) { - goto error; + return NULL; } _PyUnicodeWriter_Init(&writer); From webhook-mailer at python.org Fri Mar 22 03:30:39 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Fri, 22 Mar 2019 07:30:39 -0000 Subject: [Python-checkins] bpo-35284: Fix the error handling in the compiler's compiler_call(). (GH-10625) Message-ID: https://github.com/python/cpython/commit/97f5de01adf993aee17dcd26e22ae421d013f372 commit: 97f5de01adf993aee17dcd26e22ae421d013f372 branch: master author: Zackery Spytz committer: Serhiy Storchaka date: 2019-03-22T09:30:32+02:00 summary: bpo-35284: Fix the error handling in the compiler's compiler_call(). (GH-10625) compiler_call() needs to check if an error occurred during the maybe_optimize_method_call() call. files: M Python/compile.c diff --git a/Python/compile.c b/Python/compile.c index 3656a7e00efd..a992e4b4653c 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -3879,6 +3879,7 @@ check_index(struct compiler *c, expr_ty e, slice_ty s) } } +// Return 1 if the method call was optimized, -1 if not, and 0 on error. static int maybe_optimize_method_call(struct compiler *c, expr_ty e) { @@ -3912,8 +3913,10 @@ maybe_optimize_method_call(struct compiler *c, expr_ty e) static int compiler_call(struct compiler *c, expr_ty e) { - if (maybe_optimize_method_call(c, e) > 0) - return 1; + int ret = maybe_optimize_method_call(c, e); + if (ret >= 0) { + return ret; + } if (!check_caller(c, e->v.Call.func)) { return 0; } From webhook-mailer at python.org Fri Mar 22 03:37:07 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 22 Mar 2019 07:37:07 -0000 Subject: [Python-checkins] Raise the timeout in test_multiprocessing_* for slow buildbots (GH-12489) Message-ID: https://github.com/python/cpython/commit/40b6907b377cfc8c4743007894364ac8c5a1c113 commit: 40b6907b377cfc8c4743007894364ac8c5a1c113 branch: master author: Pablo Galindo committer: Victor Stinner date: 2019-03-22T08:36:56+01:00 summary: Raise the timeout in test_multiprocessing_* for slow buildbots (GH-12489) files: M Lib/test/_test_multiprocessing.py diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index a860d9db44fb..f4239badfe8b 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -70,7 +70,7 @@ # # Timeout to wait until a process completes -TIMEOUT = 30.0 # seconds +TIMEOUT = 60.0 # seconds def latin(s): return s.encode('latin') From webhook-mailer at python.org Fri Mar 22 03:54:52 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 22 Mar 2019 07:54:52 -0000 Subject: [Python-checkins] Raise the timeout in test_multiprocessing_* for slow buildbots (GH-12489) Message-ID: https://github.com/python/cpython/commit/fdd82338a34d3c6a2e014a4a4a32d7241448734b commit: fdd82338a34d3c6a2e014a4a4a32d7241448734b branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-22T00:54:32-07:00 summary: Raise the timeout in test_multiprocessing_* for slow buildbots (GH-12489) (cherry picked from commit 40b6907b377cfc8c4743007894364ac8c5a1c113) Co-authored-by: Pablo Galindo files: M Lib/test/_test_multiprocessing.py diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 821bfa178304..fb65e5e1aba5 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -65,7 +65,7 @@ # # Timeout to wait until a process completes -TIMEOUT = 30.0 # seconds +TIMEOUT = 60.0 # seconds def latin(s): return s.encode('latin') From webhook-mailer at python.org Fri Mar 22 04:04:27 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Fri, 22 Mar 2019 08:04:27 -0000 Subject: [Python-checkins] bpo-23984: Improve descriptor documentation (GH-1034) (GH-12459) Message-ID: https://github.com/python/cpython/commit/cb2d71b28e5cac04bbd59b8b6dbec220c4da7beb commit: cb2d71b28e5cac04bbd59b8b6dbec220c4da7beb branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Raymond Hettinger date: 2019-03-22T01:04:21-07:00 summary: bpo-23984: Improve descriptor documentation (GH-1034) (GH-12459) files: M Doc/howto/descriptor.rst diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index 51520b720328..3d1da5ac1b7b 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -372,9 +372,9 @@ calls are unexciting:: ... print(x) ... f = staticmethod(f) ... - >>> print(E.f(3)) + >>> E.f(3) 3 - >>> print(E().f(3)) + >>> E().f(3) 3 Using the non-data descriptor protocol, a pure Python version of From webhook-mailer at python.org Fri Mar 22 04:10:50 2019 From: webhook-mailer at python.org (Chris Withers) Date: Fri, 22 Mar 2019 08:10:50 -0000 Subject: [Python-checkins] bpo-21269: Provide args and kwargs attributes on mock call objects GH11807 Message-ID: https://github.com/python/cpython/commit/b0df45e55dc8304bac0e3cad0225472b84190964 commit: b0df45e55dc8304bac0e3cad0225472b84190964 branch: master author: Kumar Akshay committer: Chris Withers date: 2019-03-22T08:10:40Z summary: bpo-21269: Provide args and kwargs attributes on mock call objects GH11807 files: A Misc/NEWS.d/next/Library/2019-02-10-16-49-16.bpo-21269.Fqi7VH.rst M Doc/library/unittest.mock.rst M Lib/unittest/mock.py M Lib/unittest/test/testmock/testhelpers.py M Lib/unittest/test/testmock/testmock.py diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst index ff7a54c51fba..ed00ee6d0c2d 100644 --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -609,9 +609,11 @@ the *new_callable* argument to :func:`patch`. This is either ``None`` (if the mock hasn't been called), or the arguments that the mock was last called with. This will be in the - form of a tuple: the first member is any ordered arguments the mock - was called with (or an empty tuple) and the second member is any - keyword arguments (or an empty dictionary). + form of a tuple: the first member, which can also be accessed through + the ``args`` property, is any ordered arguments the mock was + called with (or an empty tuple) and the second member, which can + also be accessed through the ``kwargs`` property, is any keyword + arguments (or an empty dictionary). >>> mock = Mock(return_value=None) >>> print(mock.call_args) @@ -626,9 +628,17 @@ the *new_callable* argument to :func:`patch`. call(3, 4) >>> mock.call_args == ((3, 4),) True + >>> mock.call_args.args + (3, 4) + >>> mock.call_args.kwargs + {} >>> mock(3, 4, 5, key='fish', next='w00t!') >>> mock.call_args call(3, 4, 5, key='fish', next='w00t!') + >>> mock.call_args.args + (3, 4, 5) + >>> mock.call_args.kwargs + {'key': 'fish', 'next': 'w00t!'} :attr:`call_args`, along with members of the lists :attr:`call_args_list`, :attr:`method_calls` and :attr:`mock_calls` are :data:`call` objects. @@ -1987,14 +1997,13 @@ arguments are a dictionary: >>> m = MagicMock(return_value=None) >>> m(1, 2, 3, arg='one', arg2='two') >>> kall = m.call_args - >>> args, kwargs = kall - >>> args + >>> kall.args (1, 2, 3) - >>> kwargs + >>> kall.kwargs {'arg': 'one', 'arg2': 'two'} - >>> args is kall[0] + >>> kall.args is kall[0] True - >>> kwargs is kall[1] + >>> kall.kwargs is kall[1] True >>> m = MagicMock() diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 2ccf0d82ce23..fdde16be03a3 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -2135,6 +2135,22 @@ def count(self, *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 + else: + name, args, kwargs = self + + return args, kwargs + + @property + def args(self): + return self._get_call_arguments()[0] + + @property + def kwargs(self): + return self._get_call_arguments()[1] + def __repr__(self): if not self._mock_from_kall: name = self._mock_name or 'call' diff --git a/Lib/unittest/test/testmock/testhelpers.py b/Lib/unittest/test/testmock/testhelpers.py index 745580ef79db..9f1bf2676bf5 100644 --- a/Lib/unittest/test/testmock/testhelpers.py +++ b/Lib/unittest/test/testmock/testhelpers.py @@ -146,6 +146,8 @@ def test_call_with_args(self): self.assertEqual(args, ('foo', (1, 2, 3))) self.assertEqual(args, ('foo', (1, 2, 3), {})) self.assertEqual(args, ((1, 2, 3), {})) + self.assertEqual(args.args, (1, 2, 3)) + self.assertEqual(args.kwargs, {}) def test_named_call_with_args(self): @@ -153,6 +155,8 @@ def test_named_call_with_args(self): self.assertEqual(args, ('foo', (1, 2, 3))) self.assertEqual(args, ('foo', (1, 2, 3), {})) + self.assertEqual(args.args, (1, 2, 3)) + self.assertEqual(args.kwargs, {}) self.assertNotEqual(args, ((1, 2, 3),)) self.assertNotEqual(args, ((1, 2, 3), {})) @@ -165,6 +169,8 @@ def test_call_with_kwargs(self): self.assertEqual(args, ('foo', dict(a=3, b=4))) self.assertEqual(args, ('foo', (), dict(a=3, b=4))) self.assertEqual(args, ((), dict(a=3, b=4))) + self.assertEqual(args.args, ()) + self.assertEqual(args.kwargs, dict(a=3, b=4)) def test_named_call_with_kwargs(self): @@ -172,6 +178,8 @@ def test_named_call_with_kwargs(self): self.assertEqual(args, ('foo', dict(a=3, b=4))) self.assertEqual(args, ('foo', (), dict(a=3, b=4))) + self.assertEqual(args.args, ()) + self.assertEqual(args.kwargs, dict(a=3, b=4)) self.assertNotEqual(args, (dict(a=3, b=4),)) self.assertNotEqual(args, ((), dict(a=3, b=4))) @@ -179,6 +187,7 @@ def test_named_call_with_kwargs(self): def test_call_with_args_call_empty_name(self): args = _Call(((1, 2, 3), {})) + self.assertEqual(args, call(1, 2, 3)) self.assertEqual(call(1, 2, 3), args) self.assertIn(call(1, 2, 3), [args]) diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index 2ad90ea81ec7..66a5720d1432 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -267,6 +267,10 @@ def test_call(self): self.assertEqual(mock.call_count, 1, "call_count incoreect") self.assertEqual(mock.call_args, ((sentinel.Arg,), {}), "call_args not set") + self.assertEqual(mock.call_args.args, (sentinel.Arg,), + "call_args not set") + self.assertEqual(mock.call_args.kwargs, {}, + "call_args not set") self.assertEqual(mock.call_args_list, [((sentinel.Arg,), {})], "call_args_list not initialised correctly") @@ -300,6 +304,8 @@ def test_call_args_comparison(self): ]) self.assertEqual(mock.call_args, ((sentinel.Arg,), {"kw": sentinel.Kwarg})) + self.assertEqual(mock.call_args.args, (sentinel.Arg,)) + self.assertEqual(mock.call_args.kwargs, {"kw": sentinel.Kwarg}) # Comparing call_args to a long sequence should not raise # an exception. See issue 24857. @@ -1157,9 +1163,8 @@ def test_call_args_two_tuple(self): mock(2, b=4) self.assertEqual(len(mock.call_args), 2) - args, kwargs = mock.call_args - self.assertEqual(args, (2,)) - self.assertEqual(kwargs, dict(b=4)) + self.assertEqual(mock.call_args.args, (2,)) + self.assertEqual(mock.call_args.kwargs, dict(b=4)) expected_list = [((1,), dict(a=3)), ((2,), dict(b=4))] for expected, call_args in zip(expected_list, mock.call_args_list): diff --git a/Misc/NEWS.d/next/Library/2019-02-10-16-49-16.bpo-21269.Fqi7VH.rst b/Misc/NEWS.d/next/Library/2019-02-10-16-49-16.bpo-21269.Fqi7VH.rst new file mode 100644 index 000000000000..15ad636a5e80 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-02-10-16-49-16.bpo-21269.Fqi7VH.rst @@ -0,0 +1 @@ +Add ``args`` and ``kwargs`` properties to mock call objects. Contributed by Kumar Akshay. From webhook-mailer at python.org Fri Mar 22 07:07:37 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 22 Mar 2019 11:07:37 -0000 Subject: [Python-checkins] asyncio: PendingDeprecationWarning -> DeprecationWarning (GH-12494) Message-ID: https://github.com/python/cpython/commit/c5c6cdada3d41148bdeeacfe7528327b481c5d18 commit: c5c6cdada3d41148bdeeacfe7528327b481c5d18 branch: master author: Inada Naoki committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-22T04:07:32-07:00 summary: asyncio: PendingDeprecationWarning -> DeprecationWarning (GH-12494) `Task.current_task()` and `Task.all_tasks()` will be removed in 3.9. files: M Lib/asyncio/tasks.py M Lib/test/test_asyncio/test_tasks.py M Modules/_asynciomodule.c diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 15422da1b3b2..d8508376d92a 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -97,7 +97,7 @@ def current_task(cls, loop=None): """ warnings.warn("Task.current_task() is deprecated, " "use asyncio.current_task() instead", - PendingDeprecationWarning, + DeprecationWarning, stacklevel=2) if loop is None: loop = events.get_event_loop() @@ -111,7 +111,7 @@ def all_tasks(cls, loop=None): """ warnings.warn("Task.all_tasks() is deprecated, " "use asyncio.all_tasks() instead", - PendingDeprecationWarning, + DeprecationWarning, stacklevel=2) return _all_tasks_compat(loop) diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index 22f14f87624e..1cdff528def4 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -1634,26 +1634,26 @@ def coro(): def test_current_task_deprecated(self): Task = self.__class__.Task - with self.assertWarns(PendingDeprecationWarning): + with self.assertWarns(DeprecationWarning): self.assertIsNone(Task.current_task(loop=self.loop)) async def coro(loop): - with self.assertWarns(PendingDeprecationWarning): + with self.assertWarns(DeprecationWarning): self.assertIs(Task.current_task(loop=loop), task) # See http://bugs.python.org/issue29271 for details: asyncio.set_event_loop(loop) try: - with self.assertWarns(PendingDeprecationWarning): + with self.assertWarns(DeprecationWarning): self.assertIs(Task.current_task(None), task) - with self.assertWarns(PendingDeprecationWarning): + with self.assertWarns(DeprecationWarning): self.assertIs(Task.current_task(), task) finally: asyncio.set_event_loop(None) task = self.new_task(self.loop, coro(self.loop)) self.loop.run_until_complete(task) - with self.assertWarns(PendingDeprecationWarning): + with self.assertWarns(DeprecationWarning): self.assertIsNone(Task.current_task(loop=self.loop)) def test_current_task(self): @@ -1982,7 +1982,7 @@ def test_all_tasks_deprecated(self): Task = self.__class__.Task async def coro(): - with self.assertWarns(PendingDeprecationWarning): + with self.assertWarns(DeprecationWarning): assert Task.all_tasks(self.loop) == {t} t = self.new_task(self.loop, coro()) @@ -2012,9 +2012,9 @@ def kill_me(loop): # See http://bugs.python.org/issue29271 for details: asyncio.set_event_loop(self.loop) try: - with self.assertWarns(PendingDeprecationWarning): + with self.assertWarns(DeprecationWarning): self.assertEqual(Task.all_tasks(), {task}) - with self.assertWarns(PendingDeprecationWarning): + with self.assertWarns(DeprecationWarning): self.assertEqual(Task.all_tasks(None), {task}) finally: asyncio.set_event_loop(None) @@ -2692,7 +2692,7 @@ def done(self): self.assertEqual(asyncio.all_tasks(loop), set()) self._register_task(task) self.assertEqual(asyncio.all_tasks(loop), set()) - with self.assertWarns(PendingDeprecationWarning): + with self.assertWarns(DeprecationWarning): self.assertEqual(asyncio.Task.all_tasks(loop), {task}) self._unregister_task(task) diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index 7637cb75d63f..f9037c279ac9 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -2088,7 +2088,7 @@ _asyncio_Task_current_task_impl(PyTypeObject *type, PyObject *loop) PyObject *ret; PyObject *current_task_func; - if (PyErr_WarnEx(PyExc_PendingDeprecationWarning, + if (PyErr_WarnEx(PyExc_DeprecationWarning, "Task.current_task() is deprecated, " \ "use asyncio.current_task() instead", 1) < 0) { @@ -2136,7 +2136,7 @@ _asyncio_Task_all_tasks_impl(PyTypeObject *type, PyObject *loop) PyObject *res; PyObject *all_tasks_func; - if (PyErr_WarnEx(PyExc_PendingDeprecationWarning, + if (PyErr_WarnEx(PyExc_DeprecationWarning, "Task.all_tasks() is deprecated, " \ "use asyncio.all_tasks() instead", 1) < 0) { From webhook-mailer at python.org Fri Mar 22 09:21:02 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Fri, 22 Mar 2019 13:21:02 -0000 Subject: [Python-checkins] bpo-35284: Fix the error handling in the compiler's compiler_call(). (GH-10625) (GH-12496) Message-ID: https://github.com/python/cpython/commit/bdb9c497e177cdf881892de289b9d8a2b132f138 commit: bdb9c497e177cdf881892de289b9d8a2b132f138 branch: 3.7 author: Zackery Spytz committer: Serhiy Storchaka date: 2019-03-22T15:20:49+02:00 summary: bpo-35284: Fix the error handling in the compiler's compiler_call(). (GH-10625) (GH-12496) compiler_call() needs to check if an error occurred during the maybe_optimize_method_call() call. (cherry picked from commit 97f5de01adf993aee17dcd26e22ae421d013f372) files: M Python/compile.c diff --git a/Python/compile.c b/Python/compile.c index 3564ca2b904f..5688ef8479c0 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -3536,6 +3536,7 @@ compiler_compare(struct compiler *c, expr_ty e) return 1; } +// Return 1 if the method call was optimized, -1 if not, and 0 on error. static int maybe_optimize_method_call(struct compiler *c, expr_ty e) { @@ -3569,9 +3570,10 @@ maybe_optimize_method_call(struct compiler *c, expr_ty e) static int compiler_call(struct compiler *c, expr_ty e) { - if (maybe_optimize_method_call(c, e) > 0) - return 1; - + int ret = maybe_optimize_method_call(c, e); + if (ret >= 0) { + return ret; + } VISIT(c, expr, e->v.Call.func); return compiler_call_helper(c, 0, e->v.Call.args, From webhook-mailer at python.org Fri Mar 22 13:22:24 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Fri, 22 Mar 2019 17:22:24 -0000 Subject: [Python-checkins] bpo-30670: Add pp function to the pprint module (GH-11769) Message-ID: https://github.com/python/cpython/commit/96831c7fcf888af187bbae8254608cccb4d6a03c commit: 96831c7fcf888af187bbae8254608cccb4d6a03c branch: master author: R?mi Lapeyre committer: Raymond Hettinger date: 2019-03-22T10:22:20-07:00 summary: bpo-30670: Add pp function to the pprint module (GH-11769) files: A Misc/NEWS.d/next/Library/2019-02-06-12-07-46.bpo-30670.yffB3F.rst M Doc/library/pprint.rst M Doc/tools/susp-ignored.csv M Lib/pprint.py M Lib/test/test_pprint.py diff --git a/Doc/library/pprint.rst b/Doc/library/pprint.rst index deadf1820851..988f85bed103 100644 --- a/Doc/library/pprint.rst +++ b/Doc/library/pprint.rst @@ -33,7 +33,7 @@ The :mod:`pprint` module defines one class: .. index:: single: ...; placeholder .. class:: PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, \ - compact=False) + compact=False, sort_dicts=True) Construct a :class:`PrettyPrinter` instance. This constructor understands several keyword parameters. An output stream may be set using the *stream* @@ -50,11 +50,17 @@ The :mod:`pprint` module defines one class: structure cannot be formatted within the constrained width, a best effort will be made. If *compact* is false (the default) each item of a long sequence will be formatted on a separate line. If *compact* is true, as many items - as will fit within the *width* will be formatted on each output line. + as will fit within the *width* will be formatted on each output line. If + *sort_dicts* is true (the default), dictionaries will be formatted with their + keys sorted, otherwise they will display in insertion order. .. versionchanged:: 3.4 Added the *compact* parameter. + .. versionchanged:: 3.8 + Added the *sort_dicts* parameter. + + >>> import pprint >>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni'] >>> stuff.insert(0, stuff[:]) @@ -81,29 +87,47 @@ The :mod:`pprint` module defines one class: The :mod:`pprint` module also provides several shortcut functions: -.. function:: pformat(object, indent=1, width=80, depth=None, *, compact=False) +.. function:: pformat(object, indent=1, width=80, depth=None, *, \ + compact=False, sort_dicts=True) Return the formatted representation of *object* as a string. *indent*, - *width*, *depth* and *compact* will be passed to the :class:`PrettyPrinter` - constructor as formatting parameters. + *width*, *depth*, *compact* and *sort_dicts* will be passed to the + :class:`PrettyPrinter` constructor as formatting parameters. .. versionchanged:: 3.4 Added the *compact* parameter. + .. versionchanged:: 3.8 + Added the *sort_dicts* parameter. + + +.. function:: pp(object, *args, sort_dicts=False, **kwargs) + + Prints the formatted representation of *object* followed by a newline. + If *sort_dicts* is false (the default), dictionaries will be displayed with + their keys in insertion order, otherwise the dict keys will be sorted. + *args* an *kwargs* will be passed to :func:`pprint` as formatting + parameters. + + .. versionadded:: 3.8 + .. function:: pprint(object, stream=None, indent=1, width=80, depth=None, *, \ - compact=False) + compact=False, sort_dicts=True) Prints the formatted representation of *object* on *stream*, followed by a newline. If *stream* is ``None``, ``sys.stdout`` is used. This may be used in the interactive interpreter instead of the :func:`print` function for inspecting values (you can even reassign ``print = pprint.pprint`` for use - within a scope). *indent*, *width*, *depth* and *compact* will be passed - to the :class:`PrettyPrinter` constructor as formatting parameters. + within a scope). *indent*, *width*, *depth*, *compact* and *sort_dicts* will + be passed to the :class:`PrettyPrinter` constructor as formatting parameters. .. versionchanged:: 3.4 Added the *compact* parameter. + .. versionchanged:: 3.8 + Added the *sort_dicts* parameter. + >>> import pprint >>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni'] >>> stuff.insert(0, stuff) diff --git a/Doc/tools/susp-ignored.csv b/Doc/tools/susp-ignored.csv index 68a278c1f4a7..3672955bf55b 100644 --- a/Doc/tools/susp-ignored.csv +++ b/Doc/tools/susp-ignored.csv @@ -180,15 +180,15 @@ library/pickle,,:memory,"conn = sqlite3.connect("":memory:"")" library/posix,,`,"CFLAGS=""`getconf LFS_CFLAGS`"" OPT=""-g -O2 $CFLAGS""" library/pprint,,::,"'Programming Language :: Python :: 2.6'," library/pprint,,::,"'Programming Language :: Python :: 2.7'," -library/pprint,225,::,"'classifiers': ['Development Status :: 3 - Alpha'," -library/pprint,225,::,"'Intended Audience :: Developers'," -library/pprint,225,::,"'License :: OSI Approved :: MIT License'," -library/pprint,225,::,"'Programming Language :: Python :: 2'," -library/pprint,225,::,"'Programming Language :: Python :: 3'," -library/pprint,225,::,"'Programming Language :: Python :: 3.2'," -library/pprint,225,::,"'Programming Language :: Python :: 3.3'," -library/pprint,225,::,"'Programming Language :: Python :: 3.4'," -library/pprint,225,::,"'Topic :: Software Development :: Build Tools']," +library/pprint,,::,"'classifiers': ['Development Status :: 3 - Alpha'," +library/pprint,,::,"'Intended Audience :: Developers'," +library/pprint,,::,"'License :: OSI Approved :: MIT License'," +library/pprint,,::,"'Programming Language :: Python :: 2'," +library/pprint,,::,"'Programming Language :: Python :: 3'," +library/pprint,,::,"'Programming Language :: Python :: 3.2'," +library/pprint,,::,"'Programming Language :: Python :: 3.3'," +library/pprint,,::,"'Programming Language :: Python :: 3.4'," +library/pprint,,::,"'Topic :: Software Development :: Build Tools']," library/profile,,:lineno,filename:lineno(function) library/pyexpat,,:elem1, library/pyexpat,,:py,"xmlns:py = ""http://www.python.org/ns/"">" diff --git a/Lib/pprint.py b/Lib/pprint.py index f2a117864e5e..4bfcc31b25ea 100644 --- a/Lib/pprint.py +++ b/Lib/pprint.py @@ -41,33 +41,38 @@ from io import StringIO as _StringIO __all__ = ["pprint","pformat","isreadable","isrecursive","saferepr", - "PrettyPrinter"] + "PrettyPrinter", "pp"] def pprint(object, stream=None, indent=1, width=80, depth=None, *, - compact=False): + compact=False, sort_dicts=True): """Pretty-print a Python object to a stream [default is sys.stdout].""" printer = PrettyPrinter( stream=stream, indent=indent, width=width, depth=depth, - compact=compact) + compact=compact, sort_dicts=sort_dicts) printer.pprint(object) -def pformat(object, indent=1, width=80, depth=None, *, compact=False): +def pformat(object, indent=1, width=80, depth=None, *, + compact=False, sort_dicts=True): """Format a Python object into a pretty-printed representation.""" return PrettyPrinter(indent=indent, width=width, depth=depth, - compact=compact).pformat(object) + compact=compact, sort_dicts=sort_dicts).pformat(object) + +def pp(object, *args, sort_dicts=False, **kwargs): + """Pretty-print a Python object""" + pprint(object, *args, sort_dicts=sort_dicts, **kwargs) def saferepr(object): """Version of repr() which can handle recursive data structures.""" - return _safe_repr(object, {}, None, 0)[0] + return _safe_repr(object, {}, None, 0, True)[0] def isreadable(object): """Determine if saferepr(object) is readable by eval().""" - return _safe_repr(object, {}, None, 0)[1] + return _safe_repr(object, {}, None, 0, True)[1] def isrecursive(object): """Determine if object requires a recursive representation.""" - return _safe_repr(object, {}, None, 0)[2] + return _safe_repr(object, {}, None, 0, True)[2] class _safe_key: """Helper function for key functions when sorting unorderable objects. @@ -97,7 +102,7 @@ def _safe_tuple(t): class PrettyPrinter: def __init__(self, indent=1, width=80, depth=None, stream=None, *, - compact=False): + compact=False, sort_dicts=True): """Handle pretty printing operations onto a stream using a set of configured parameters. @@ -117,6 +122,9 @@ def __init__(self, indent=1, width=80, depth=None, stream=None, *, compact If true, several items will be combined in one line. + sort_dicts + If true, dict keys are sorted. + """ indent = int(indent) width = int(width) @@ -134,6 +142,7 @@ def __init__(self, indent=1, width=80, depth=None, stream=None, *, else: self._stream = _sys.stdout self._compact = bool(compact) + self._sort_dicts = sort_dicts def pprint(self, object): self._format(object, self._stream, 0, 0, {}, 0) @@ -184,7 +193,10 @@ def _pprint_dict(self, object, stream, indent, allowance, context, level): write((self._indent_per_level - 1) * ' ') length = len(object) if length: - items = sorted(object.items(), key=_safe_tuple) + if self._sort_dicts: + items = sorted(object.items(), key=_safe_tuple) + else: + items = object.items() self._format_dict_items(items, stream, indent, allowance + 1, context, level) write('}') @@ -402,7 +414,7 @@ def format(self, object, context, maxlevels, level): and flags indicating whether the representation is 'readable' and whether the object represents a recursive construct. """ - return _safe_repr(object, context, maxlevels, level) + return _safe_repr(object, context, maxlevels, level, self._sort_dicts) def _pprint_default_dict(self, object, stream, indent, allowance, context, level): if not len(object): @@ -487,7 +499,7 @@ def _pprint_user_string(self, object, stream, indent, allowance, context, level) # Return triple (repr_string, isreadable, isrecursive). -def _safe_repr(object, context, maxlevels, level): +def _safe_repr(object, context, maxlevels, level, sort_dicts): typ = type(object) if typ in _builtin_scalars: return repr(object), True, False @@ -507,11 +519,13 @@ def _safe_repr(object, context, maxlevels, level): components = [] append = components.append level += 1 - saferepr = _safe_repr - items = sorted(object.items(), key=_safe_tuple) + if sort_dicts: + items = sorted(object.items(), key=_safe_tuple) + else: + items = object.items() for k, v in items: - krepr, kreadable, krecur = saferepr(k, context, maxlevels, level) - vrepr, vreadable, vrecur = saferepr(v, context, maxlevels, level) + krepr, kreadable, krecur = _safe_repr(k, context, maxlevels, level, sort_dicts) + vrepr, vreadable, vrecur = _safe_repr(v, context, maxlevels, level, sort_dicts) append("%s: %s" % (krepr, vrepr)) readable = readable and kreadable and vreadable if krecur or vrecur: @@ -543,7 +557,7 @@ def _safe_repr(object, context, maxlevels, level): append = components.append level += 1 for o in object: - orepr, oreadable, orecur = _safe_repr(o, context, maxlevels, level) + orepr, oreadable, orecur = _safe_repr(o, context, maxlevels, level, sort_dicts) append(orepr) if not oreadable: readable = False @@ -569,7 +583,7 @@ def _perfcheck(object=None): object = [("string", (1, 2), [3, 4], {5: 6, 7: 8})] * 100000 p = PrettyPrinter() t1 = time.perf_counter() - _safe_repr(object, {}, None, 0) + _safe_repr(object, {}, None, 0, True) t2 = time.perf_counter() p.pformat(object) t3 = time.perf_counter() diff --git a/Lib/test/test_pprint.py b/Lib/test/test_pprint.py index 7ebc298337ad..269ac0624eeb 100644 --- a/Lib/test/test_pprint.py +++ b/Lib/test/test_pprint.py @@ -81,6 +81,7 @@ def test_init(self): pp = pprint.PrettyPrinter(indent=4, width=40, depth=5, stream=io.StringIO(), compact=True) pp = pprint.PrettyPrinter(4, 40, 5, io.StringIO()) + pp = pprint.PrettyPrinter(sort_dicts=False) with self.assertRaises(TypeError): pp = pprint.PrettyPrinter(4, 40, 5, io.StringIO(), True) self.assertRaises(ValueError, pprint.PrettyPrinter, indent=-1) @@ -293,6 +294,12 @@ def test_sorted_dict(self): self.assertEqual(pprint.pformat({"xy\tab\n": (3,), 5: [[]], (): {}}), r"{5: [[]], 'xy\tab\n': (3,), (): {}}") + def test_sort_dict(self): + d = dict.fromkeys('cba') + self.assertEqual(pprint.pformat(d, sort_dicts=False), "{'c': None, 'b': None, 'a': None}") + self.assertEqual(pprint.pformat([d, d], sort_dicts=False), + "[{'c': None, 'b': None, 'a': None}, {'c': None, 'b': None, 'a': None}]") + def test_ordered_dict(self): d = collections.OrderedDict() self.assertEqual(pprint.pformat(d, width=1), 'OrderedDict()') diff --git a/Misc/NEWS.d/next/Library/2019-02-06-12-07-46.bpo-30670.yffB3F.rst b/Misc/NEWS.d/next/Library/2019-02-06-12-07-46.bpo-30670.yffB3F.rst new file mode 100644 index 000000000000..63cdbb363f76 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-02-06-12-07-46.bpo-30670.yffB3F.rst @@ -0,0 +1,4 @@ +`pprint.pp` has been added to pretty-print objects with dictionary +keys being sorted with their insertion order by default. Parameter +*sort_dicts* has been added to `pprint.pprint`, `pprint.pformat` and +`pprint.PrettyPrinter`. Contributed by R?mi Lapeyre. From webhook-mailer at python.org Fri Mar 22 17:49:58 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 22 Mar 2019 21:49:58 -0000 Subject: [Python-checkins] bpo-35155: clarify protocol handler method naming (GH-10313) Message-ID: https://github.com/python/cpython/commit/dd7c4ceed90792f711347024852d4cf883a9ab9e commit: dd7c4ceed90792f711347024852d4cf883a9ab9e branch: master author: Denton Liu committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-22T14:49:55-07:00 summary: bpo-35155: clarify protocol handler method naming (GH-10313) Clarify that the naming of protocol handler methods shouldn't be literally called "protocol" but should be named after the actual protocol. https://bugs.python.org/issue35155 files: M Doc/library/urllib.request.rst diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst index 982f57f1fe61..289bfcaebc3d 100644 --- a/Doc/library/urllib.request.rst +++ b/Doc/library/urllib.request.rst @@ -608,23 +608,39 @@ OpenerDirector Objects *handler* should be an instance of :class:`BaseHandler`. The following methods are searched, and added to the possible chains (note that HTTP errors are a - special case). + special case). Note that, in the following, *protocol* should be replaced + with the actual protocol to handle, for example :meth:`http_response` would + be the HTTP protocol response handler. Also *type* should be replaced with + the actual HTTP code, for example :meth:`http_error_404` would handle HTTP + 404 errors. - * :meth:`protocol_open` --- signal that the handler knows how to open *protocol* + * :meth:`_open` --- signal that the handler knows how to open *protocol* URLs. - * :meth:`http_error_type` --- signal that the handler knows how to handle HTTP + See |protocol_open|_ for more information. + + * :meth:`http_error_\` --- signal that the handler knows how to handle HTTP errors with HTTP error code *type*. - * :meth:`protocol_error` --- signal that the handler knows how to handle errors + See |http_error_nnn|_ for more information. + + * :meth:`_error` --- signal that the handler knows how to handle errors from (non-\ ``http``) *protocol*. - * :meth:`protocol_request` --- signal that the handler knows how to pre-process + * :meth:`_request` --- signal that the handler knows how to pre-process *protocol* requests. - * :meth:`protocol_response` --- signal that the handler knows how to + See |protocol_request|_ for more information. + + * :meth:`_response` --- signal that the handler knows how to post-process *protocol* responses. + See |protocol_response|_ for more information. + +.. |protocol_open| replace:: :meth:`BaseHandler._open` +.. |http_error_nnn| replace:: :meth:`BaseHandler.http_error_\` +.. |protocol_request| replace:: :meth:`BaseHandler._request` +.. |protocol_response| replace:: :meth:`BaseHandler._response` .. method:: OpenerDirector.open(url, data=None[, timeout]) @@ -643,7 +659,7 @@ OpenerDirector Objects Handle an error of the given protocol. This will call the registered error handlers for the given protocol with the given arguments (which are protocol specific). The HTTP protocol is a special case which uses the HTTP response - code to determine the specific error handler; refer to the :meth:`http_error_\*` + code to determine the specific error handler; refer to the :meth:`http_error_\` methods of the handler classes. Return values and exceptions raised are the same as those of :func:`urlopen`. @@ -653,17 +669,17 @@ OpenerDirector objects open URLs in three stages: The order in which these methods are called within each stage is determined by sorting the handler instances. -#. Every handler with a method named like :meth:`protocol_request` has that +#. Every handler with a method named like :meth:`_request` has that method called to pre-process the request. -#. Handlers with a method named like :meth:`protocol_open` are called to handle +#. Handlers with a method named like :meth:`_open` are called to handle the request. This stage ends when a handler either returns a non-\ :const:`None` value (ie. a response), or raises an exception (usually :exc:`~urllib.error.URLError`). Exceptions are allowed to propagate. In fact, the above algorithm is first tried for methods named :meth:`default_open`. If all such methods return :const:`None`, the algorithm - is repeated for methods named like :meth:`protocol_open`. If all such methods + is repeated for methods named like :meth:`_open`. If all such methods return :const:`None`, the algorithm is repeated for methods named :meth:`unknown_open`. @@ -671,7 +687,7 @@ sorting the handler instances. :class:`OpenerDirector` instance's :meth:`~OpenerDirector.open` and :meth:`~OpenerDirector.error` methods. -#. Every handler with a method named like :meth:`protocol_response` has that +#. Every handler with a method named like :meth:`_response` has that method called to post-process the response. @@ -700,7 +716,7 @@ The following attribute and methods should only be used by classes derived from .. note:: The convention has been adopted that subclasses defining - :meth:`protocol_request` or :meth:`protocol_response` methods are named + :meth:`_request` or :meth:`_response` methods are named :class:`\*Processor`; all others are named :class:`\*Handler`. @@ -725,7 +741,8 @@ The following attribute and methods should only be used by classes derived from This method will be called before any protocol-specific open method. -.. method:: BaseHandler.protocol_open(req) +.. _protocol_open: +.. method:: BaseHandler._open(req) :noindex: This method is *not* defined in :class:`BaseHandler`, but subclasses should @@ -762,7 +779,8 @@ The following attribute and methods should only be used by classes derived from :func:`urlopen`. -.. method:: BaseHandler.http_error_nnn(req, fp, code, msg, hdrs) +.. _http_error_nnn: +.. method:: BaseHandler.http_error_(req, fp, code, msg, hdrs) *nnn* should be a three-digit HTTP error code. This method is also not defined in :class:`BaseHandler`, but will be called, if it exists, on an instance of a @@ -774,7 +792,8 @@ The following attribute and methods should only be used by classes derived from :meth:`http_error_default`. -.. method:: BaseHandler.protocol_request(req) +.. _protocol_request: +.. method:: BaseHandler._request(req) :noindex: This method is *not* defined in :class:`BaseHandler`, but subclasses should @@ -785,7 +804,8 @@ The following attribute and methods should only be used by classes derived from :class:`Request` object. -.. method:: BaseHandler.protocol_response(req, response) +.. _protocol_response: +.. method:: BaseHandler._response(req, response) :noindex: This method is *not* defined in :class:`BaseHandler`, but subclasses should @@ -873,10 +893,10 @@ ProxyHandler Objects -------------------- -.. method:: ProxyHandler.protocol_open(request) +.. method:: ProxyHandler._open(request) :noindex: - The :class:`ProxyHandler` will have a method :meth:`protocol_open` for every + The :class:`ProxyHandler` will have a method :meth:`_open` for every *protocol* which has a proxy in the *proxies* dictionary given in the constructor. The method will modify requests to go through the proxy, by calling ``request.set_proxy()``, and call the next handler in the chain to @@ -1132,7 +1152,7 @@ HTTPErrorProcessor Objects For 200 error codes, the response object is returned immediately. For non-200 error codes, this simply passes the job on to the - :meth:`protocol_error_code` handler methods, via :meth:`OpenerDirector.error`. + :meth:`http_error_\` handler methods, via :meth:`OpenerDirector.error`. Eventually, :class:`HTTPDefaultErrorHandler` will raise an :exc:`~urllib.error.HTTPError` if no other handler handles the error. From webhook-mailer at python.org Fri Mar 22 18:16:53 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 22 Mar 2019 22:16:53 -0000 Subject: [Python-checkins] bpo-36298: Raise ModuleNotFoundError in pyclbr when a module can't be found (GH-12358) Message-ID: https://github.com/python/cpython/commit/5086589305ff5538709856b27314b68f06ae93db commit: 5086589305ff5538709856b27314b68f06ae93db branch: master author: Brett Cannon committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-22T15:16:50-07:00 summary: bpo-36298: Raise ModuleNotFoundError in pyclbr when a module can't be found (GH-12358) Before, an `AttributeError` was raised due to trying to access an attribute that exists on specs but having received `None` instead for a non-existent module. https://bugs.python.org/issue36298 files: A Misc/NEWS.d/next/Library/2019-03-15-13-54-07.bpo-36298.amEVK2.rst M Lib/pyclbr.py M Lib/test/test_pyclbr.py diff --git a/Lib/pyclbr.py b/Lib/pyclbr.py index 2c798df233b8..8fd0523b7e3b 100644 --- a/Lib/pyclbr.py +++ b/Lib/pyclbr.py @@ -160,17 +160,20 @@ def _readmodule(module, path, inpackage=None): else: search_path = path + sys.path spec = importlib.util._find_spec_from_path(fullmodule, search_path) + if spec is None: + raise ModuleNotFoundError(f"no module named {fullmodule!r}", name=fullmodule) _modules[fullmodule] = tree # Is module a package? if spec.submodule_search_locations is not None: tree['__path__'] = spec.submodule_search_locations try: source = spec.loader.get_source(fullmodule) - if source is None: - return tree except (AttributeError, ImportError): # If module is not Python source, we cannot do anything. return tree + else: + if source is None: + return tree fname = spec.loader.get_filename(fullmodule) return _create_tree(fullmodule, path, fname, source, tree, inpackage) diff --git a/Lib/test/test_pyclbr.py b/Lib/test/test_pyclbr.py index 9e970d9df041..839c58f0fde5 100644 --- a/Lib/test/test_pyclbr.py +++ b/Lib/test/test_pyclbr.py @@ -10,6 +10,7 @@ import pyclbr from unittest import TestCase, main as unittest_main from test import support +from test.test_importlib import util as test_importlib_util from functools import partial StaticMethodType = type(staticmethod(lambda: None)) @@ -235,11 +236,30 @@ def test_others(self): cm('email.parser') cm('test.test_pyclbr') - def test_issue_14798(self): + +class ReadmoduleTests(TestCase): + + def setUp(self): + self._modules = pyclbr._modules.copy() + + def tearDown(self): + pyclbr._modules = self._modules + + + def test_dotted_name_not_a_package(self): # test ImportError is raised when the first part of a dotted name is - # not a package + # not a package. + # + # Issue #14798. self.assertRaises(ImportError, pyclbr.readmodule_ex, 'asyncore.foo') + def test_module_has_no_spec(self): + module_name = "doesnotexist" + assert module_name not in pyclbr._modules + with test_importlib_util.uncache(module_name): + with self.assertRaises(ModuleNotFoundError): + pyclbr.readmodule_ex(module_name) + if __name__ == "__main__": unittest_main() diff --git a/Misc/NEWS.d/next/Library/2019-03-15-13-54-07.bpo-36298.amEVK2.rst b/Misc/NEWS.d/next/Library/2019-03-15-13-54-07.bpo-36298.amEVK2.rst new file mode 100644 index 000000000000..14be079ddb92 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-15-13-54-07.bpo-36298.amEVK2.rst @@ -0,0 +1,2 @@ +Raise ModuleNotFoundError in pyclbr when a module can't be found. +Thanks to 'mental' for the bug report. From webhook-mailer at python.org Fri Mar 22 18:23:43 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Fri, 22 Mar 2019 22:23:43 -0000 Subject: [Python-checkins] bpo-36396: Remove fgBg param of idlelib.config.GetHighlight() (GH-12491) Message-ID: https://github.com/python/cpython/commit/c1419578a18d787393c7ccee149e7c1fff17a99e commit: c1419578a18d787393c7ccee149e7c1fff17a99e branch: master author: Terry Jan Reedy committer: GitHub date: 2019-03-22T18:23:41-04:00 summary: bpo-36396: Remove fgBg param of idlelib.config.GetHighlight() (GH-12491) This param was only used once and changed the return type. files: A Misc/NEWS.d/next/IDLE/2019-03-21-22-43-21.bpo-36396.xSTX-I.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/colorizer.py M Lib/idlelib/config.py M Lib/idlelib/configdialog.py M Lib/idlelib/idle_test/test_config.py M Lib/idlelib/idle_test/test_configdialog.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index c771dd0d41eb..d79d9ce648f5 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,11 @@ Released on 2019-10-20? ====================================== +bpo-36396: Remove fgBg param of idlelib.config.GetHighlight(). +This param was only used twice and changed the return type. + +bpo-23216: IDLE: Add docstrings to search modules. + bpo-36176: Fix IDLE autocomplete & calltip popup colors. Prevent conflicts with Linux dark themes (and slightly darken calltip background). diff --git a/Lib/idlelib/colorizer.py b/Lib/idlelib/colorizer.py index facbef8bb189..db1266fed3b6 100644 --- a/Lib/idlelib/colorizer.py +++ b/Lib/idlelib/colorizer.py @@ -40,7 +40,7 @@ def color_config(text): # Not automatic because ColorDelegator does not know 'text'. theme = idleConf.CurrentTheme() normal_colors = idleConf.GetHighlight(theme, 'normal') - cursor_color = idleConf.GetHighlight(theme, 'cursor', fgBg='fg') + cursor_color = idleConf.GetHighlight(theme, 'cursor')['foreground'] select_colors = idleConf.GetHighlight(theme, 'hilite') text.config( foreground=normal_colors['foreground'], diff --git a/Lib/idlelib/config.py b/Lib/idlelib/config.py index 79d988f9a186..aa94d6535be6 100644 --- a/Lib/idlelib/config.py +++ b/Lib/idlelib/config.py @@ -34,7 +34,6 @@ class InvalidConfigType(Exception): pass class InvalidConfigSet(Exception): pass -class InvalidFgBg(Exception): pass class InvalidTheme(Exception): pass class IdleConfParser(ConfigParser): @@ -283,34 +282,20 @@ def GetSectionList(self, configSet, configType): raise InvalidConfigSet('Invalid configSet specified') return cfgParser.sections() - def GetHighlight(self, theme, element, fgBg=None): - """Return individual theme element highlight color(s). + def GetHighlight(self, theme, element): + """Return dict of theme element highlight colors. - fgBg - string ('fg' or 'bg') or None. - If None, return a dictionary containing fg and bg colors with - keys 'foreground' and 'background'. Otherwise, only return - fg or bg color, as specified. Colors are intended to be - appropriate for passing to Tkinter in, e.g., a tag_config call). + The keys are 'foreground' and 'background'. The values are + tkinter color strings for configuring backgrounds and tags. """ - if self.defaultCfg['highlight'].has_section(theme): - themeDict = self.GetThemeDict('default', theme) - else: - themeDict = self.GetThemeDict('user', theme) - fore = themeDict[element + '-foreground'] - if element == 'cursor': # There is no config value for cursor bg - back = themeDict['normal-background'] - else: - back = themeDict[element + '-background'] - highlight = {"foreground": fore, "background": back} - if not fgBg: # Return dict of both colors - return highlight - else: # Return specified color only - if fgBg == 'fg': - return highlight["foreground"] - if fgBg == 'bg': - return highlight["background"] - else: - raise InvalidFgBg('Invalid fgBg specified') + cfg = ('default' if self.defaultCfg['highlight'].has_section(theme) + else 'user') + theme_dict = self.GetThemeDict(cfg, theme) + fore = theme_dict[element + '-foreground'] + if element == 'cursor': + element = 'normal' + back = theme_dict[element + '-background'] + return {"foreground": fore, "background": back} def GetThemeDict(self, type, themeName): """Return {option:value} dict for elements in themeName. diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index 5fdaf82de4de..31520a3b0d1e 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -1252,7 +1252,7 @@ def paint_theme_sample(self): colors = idleConf.GetHighlight(theme, element) if element == 'cursor': # Cursor sample needs special painting. colors['background'] = idleConf.GetHighlight( - theme, 'normal', fgBg='bg') + theme, 'normal')['background'] # Handle any unsaved changes to this theme. if theme in changes['highlight']: theme_dict = changes['highlight'][theme] diff --git a/Lib/idlelib/idle_test/test_config.py b/Lib/idlelib/idle_test/test_config.py index 169d054efd08..7e2c1fd2958c 100644 --- a/Lib/idlelib/idle_test/test_config.py +++ b/Lib/idlelib/idle_test/test_config.py @@ -373,10 +373,6 @@ def test_get_highlight(self): eq = self.assertEqual eq(conf.GetHighlight('IDLE Classic', 'normal'), {'foreground': '#000000', 'background': '#ffffff'}) - eq(conf.GetHighlight('IDLE Classic', 'normal', 'fg'), '#000000') - eq(conf.GetHighlight('IDLE Classic', 'normal', 'bg'), '#ffffff') - with self.assertRaises(config.InvalidFgBg): - conf.GetHighlight('IDLE Classic', 'normal', 'fb') # Test cursor (this background should be normal-background) eq(conf.GetHighlight('IDLE Classic', 'cursor'), {'foreground': 'black', diff --git a/Lib/idlelib/idle_test/test_configdialog.py b/Lib/idlelib/idle_test/test_configdialog.py index 5472a04c187c..37e83439c471 100644 --- a/Lib/idlelib/idle_test/test_configdialog.py +++ b/Lib/idlelib/idle_test/test_configdialog.py @@ -606,40 +606,35 @@ def test_set_color_sample(self): def test_paint_theme_sample(self): eq = self.assertEqual - d = self.page - del d.paint_theme_sample - hs_tag = d.highlight_sample.tag_cget + page = self.page + del page.paint_theme_sample # Delete masking mock. + hs_tag = page.highlight_sample.tag_cget gh = idleConf.GetHighlight - fg = 'foreground' - bg = 'background' # Create custom theme based on IDLE Dark. - d.theme_source.set(True) - d.builtin_name.set('IDLE Dark') + page.theme_source.set(True) + page.builtin_name.set('IDLE Dark') theme = 'IDLE Test' - d.create_new(theme) - d.set_color_sample.called = 0 + page.create_new(theme) + page.set_color_sample.called = 0 # Base theme with nothing in `changes`. - d.paint_theme_sample() - eq(hs_tag('break', fg), gh(theme, 'break', fgBg='fg')) - eq(hs_tag('cursor', bg), gh(theme, 'normal', fgBg='bg')) - self.assertNotEqual(hs_tag('console', fg), 'blue') - self.assertNotEqual(hs_tag('console', bg), 'yellow') - eq(d.set_color_sample.called, 1) + page.paint_theme_sample() + new_console = {'foreground': 'blue', + 'background': 'yellow',} + for key, value in new_console.items(): + self.assertNotEqual(hs_tag('console', key), value) + eq(page.set_color_sample.called, 1) # Apply changes. - changes.add_option('highlight', theme, 'console-foreground', 'blue') - changes.add_option('highlight', theme, 'console-background', 'yellow') - d.paint_theme_sample() - - eq(hs_tag('break', fg), gh(theme, 'break', fgBg='fg')) - eq(hs_tag('cursor', bg), gh(theme, 'normal', fgBg='bg')) - eq(hs_tag('console', fg), 'blue') - eq(hs_tag('console', bg), 'yellow') - eq(d.set_color_sample.called, 2) + for key, value in new_console.items(): + changes.add_option('highlight', theme, 'console-'+key, value) + page.paint_theme_sample() + for key, value in new_console.items(): + eq(hs_tag('console', key), value) + eq(page.set_color_sample.called, 2) - d.paint_theme_sample = Func() + page.paint_theme_sample = Func() def test_delete_custom(self): eq = self.assertEqual diff --git a/Misc/NEWS.d/next/IDLE/2019-03-21-22-43-21.bpo-36396.xSTX-I.rst b/Misc/NEWS.d/next/IDLE/2019-03-21-22-43-21.bpo-36396.xSTX-I.rst new file mode 100644 index 000000000000..1d142b5c30ff --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-03-21-22-43-21.bpo-36396.xSTX-I.rst @@ -0,0 +1,2 @@ +Remove fgBg param of idlelib.config.GetHighlight(). This param was only used +twice and changed the return type. From webhook-mailer at python.org Fri Mar 22 18:43:04 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 22 Mar 2019 22:43:04 -0000 Subject: [Python-checkins] bpo-36396: Remove fgBg param of idlelib.config.GetHighlight() (GH-12491) Message-ID: https://github.com/python/cpython/commit/2d7798ad12456e137b3e3bc82a9824d0d3d45af0 commit: 2d7798ad12456e137b3e3bc82a9824d0d3d45af0 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-22T15:42:51-07:00 summary: bpo-36396: Remove fgBg param of idlelib.config.GetHighlight() (GH-12491) This param was only used once and changed the return type. (cherry picked from commit c1419578a18d787393c7ccee149e7c1fff17a99e) Co-authored-by: Terry Jan Reedy files: A Misc/NEWS.d/next/IDLE/2019-03-21-22-43-21.bpo-36396.xSTX-I.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/colorizer.py M Lib/idlelib/config.py M Lib/idlelib/configdialog.py M Lib/idlelib/idle_test/test_config.py M Lib/idlelib/idle_test/test_configdialog.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index c343538a29c2..0cbd3ff935f8 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,11 @@ Released on 2019-??-?? ====================================== +bpo-36396: Remove fgBg param of idlelib.config.GetHighlight(). +This param was only used twice and changed the return type. + +bpo-23216: IDLE: Add docstrings to search modules. + bpo-36176: Fix IDLE autocomplete & calltip popup colors. Prevent conflicts with Linux dark themes (and slightly darken calltip background). diff --git a/Lib/idlelib/colorizer.py b/Lib/idlelib/colorizer.py index facbef8bb189..db1266fed3b6 100644 --- a/Lib/idlelib/colorizer.py +++ b/Lib/idlelib/colorizer.py @@ -40,7 +40,7 @@ def color_config(text): # Not automatic because ColorDelegator does not know 'text'. theme = idleConf.CurrentTheme() normal_colors = idleConf.GetHighlight(theme, 'normal') - cursor_color = idleConf.GetHighlight(theme, 'cursor', fgBg='fg') + cursor_color = idleConf.GetHighlight(theme, 'cursor')['foreground'] select_colors = idleConf.GetHighlight(theme, 'hilite') text.config( foreground=normal_colors['foreground'], diff --git a/Lib/idlelib/config.py b/Lib/idlelib/config.py index 79d988f9a186..aa94d6535be6 100644 --- a/Lib/idlelib/config.py +++ b/Lib/idlelib/config.py @@ -34,7 +34,6 @@ class InvalidConfigType(Exception): pass class InvalidConfigSet(Exception): pass -class InvalidFgBg(Exception): pass class InvalidTheme(Exception): pass class IdleConfParser(ConfigParser): @@ -283,34 +282,20 @@ def GetSectionList(self, configSet, configType): raise InvalidConfigSet('Invalid configSet specified') return cfgParser.sections() - def GetHighlight(self, theme, element, fgBg=None): - """Return individual theme element highlight color(s). + def GetHighlight(self, theme, element): + """Return dict of theme element highlight colors. - fgBg - string ('fg' or 'bg') or None. - If None, return a dictionary containing fg and bg colors with - keys 'foreground' and 'background'. Otherwise, only return - fg or bg color, as specified. Colors are intended to be - appropriate for passing to Tkinter in, e.g., a tag_config call). + The keys are 'foreground' and 'background'. The values are + tkinter color strings for configuring backgrounds and tags. """ - if self.defaultCfg['highlight'].has_section(theme): - themeDict = self.GetThemeDict('default', theme) - else: - themeDict = self.GetThemeDict('user', theme) - fore = themeDict[element + '-foreground'] - if element == 'cursor': # There is no config value for cursor bg - back = themeDict['normal-background'] - else: - back = themeDict[element + '-background'] - highlight = {"foreground": fore, "background": back} - if not fgBg: # Return dict of both colors - return highlight - else: # Return specified color only - if fgBg == 'fg': - return highlight["foreground"] - if fgBg == 'bg': - return highlight["background"] - else: - raise InvalidFgBg('Invalid fgBg specified') + cfg = ('default' if self.defaultCfg['highlight'].has_section(theme) + else 'user') + theme_dict = self.GetThemeDict(cfg, theme) + fore = theme_dict[element + '-foreground'] + if element == 'cursor': + element = 'normal' + back = theme_dict[element + '-background'] + return {"foreground": fore, "background": back} def GetThemeDict(self, type, themeName): """Return {option:value} dict for elements in themeName. diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index 5fdaf82de4de..31520a3b0d1e 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -1252,7 +1252,7 @@ def paint_theme_sample(self): colors = idleConf.GetHighlight(theme, element) if element == 'cursor': # Cursor sample needs special painting. colors['background'] = idleConf.GetHighlight( - theme, 'normal', fgBg='bg') + theme, 'normal')['background'] # Handle any unsaved changes to this theme. if theme in changes['highlight']: theme_dict = changes['highlight'][theme] diff --git a/Lib/idlelib/idle_test/test_config.py b/Lib/idlelib/idle_test/test_config.py index 169d054efd08..7e2c1fd2958c 100644 --- a/Lib/idlelib/idle_test/test_config.py +++ b/Lib/idlelib/idle_test/test_config.py @@ -373,10 +373,6 @@ def test_get_highlight(self): eq = self.assertEqual eq(conf.GetHighlight('IDLE Classic', 'normal'), {'foreground': '#000000', 'background': '#ffffff'}) - eq(conf.GetHighlight('IDLE Classic', 'normal', 'fg'), '#000000') - eq(conf.GetHighlight('IDLE Classic', 'normal', 'bg'), '#ffffff') - with self.assertRaises(config.InvalidFgBg): - conf.GetHighlight('IDLE Classic', 'normal', 'fb') # Test cursor (this background should be normal-background) eq(conf.GetHighlight('IDLE Classic', 'cursor'), {'foreground': 'black', diff --git a/Lib/idlelib/idle_test/test_configdialog.py b/Lib/idlelib/idle_test/test_configdialog.py index 5472a04c187c..37e83439c471 100644 --- a/Lib/idlelib/idle_test/test_configdialog.py +++ b/Lib/idlelib/idle_test/test_configdialog.py @@ -606,40 +606,35 @@ def test_set_color_sample(self): def test_paint_theme_sample(self): eq = self.assertEqual - d = self.page - del d.paint_theme_sample - hs_tag = d.highlight_sample.tag_cget + page = self.page + del page.paint_theme_sample # Delete masking mock. + hs_tag = page.highlight_sample.tag_cget gh = idleConf.GetHighlight - fg = 'foreground' - bg = 'background' # Create custom theme based on IDLE Dark. - d.theme_source.set(True) - d.builtin_name.set('IDLE Dark') + page.theme_source.set(True) + page.builtin_name.set('IDLE Dark') theme = 'IDLE Test' - d.create_new(theme) - d.set_color_sample.called = 0 + page.create_new(theme) + page.set_color_sample.called = 0 # Base theme with nothing in `changes`. - d.paint_theme_sample() - eq(hs_tag('break', fg), gh(theme, 'break', fgBg='fg')) - eq(hs_tag('cursor', bg), gh(theme, 'normal', fgBg='bg')) - self.assertNotEqual(hs_tag('console', fg), 'blue') - self.assertNotEqual(hs_tag('console', bg), 'yellow') - eq(d.set_color_sample.called, 1) + page.paint_theme_sample() + new_console = {'foreground': 'blue', + 'background': 'yellow',} + for key, value in new_console.items(): + self.assertNotEqual(hs_tag('console', key), value) + eq(page.set_color_sample.called, 1) # Apply changes. - changes.add_option('highlight', theme, 'console-foreground', 'blue') - changes.add_option('highlight', theme, 'console-background', 'yellow') - d.paint_theme_sample() - - eq(hs_tag('break', fg), gh(theme, 'break', fgBg='fg')) - eq(hs_tag('cursor', bg), gh(theme, 'normal', fgBg='bg')) - eq(hs_tag('console', fg), 'blue') - eq(hs_tag('console', bg), 'yellow') - eq(d.set_color_sample.called, 2) + for key, value in new_console.items(): + changes.add_option('highlight', theme, 'console-'+key, value) + page.paint_theme_sample() + for key, value in new_console.items(): + eq(hs_tag('console', key), value) + eq(page.set_color_sample.called, 2) - d.paint_theme_sample = Func() + page.paint_theme_sample = Func() def test_delete_custom(self): eq = self.assertEqual diff --git a/Misc/NEWS.d/next/IDLE/2019-03-21-22-43-21.bpo-36396.xSTX-I.rst b/Misc/NEWS.d/next/IDLE/2019-03-21-22-43-21.bpo-36396.xSTX-I.rst new file mode 100644 index 000000000000..1d142b5c30ff --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-03-21-22-43-21.bpo-36396.xSTX-I.rst @@ -0,0 +1,2 @@ +Remove fgBg param of idlelib.config.GetHighlight(). This param was only used +twice and changed the return type. From webhook-mailer at python.org Fri Mar 22 19:30:07 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 22 Mar 2019 23:30:07 -0000 Subject: [Python-checkins] bpo-35155: clarify protocol handler method naming (GH-10313) Message-ID: https://github.com/python/cpython/commit/868581ee7687ad25af70c0cb9cd6a0f2077e6422 commit: 868581ee7687ad25af70c0cb9cd6a0f2077e6422 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-22T16:30:04-07:00 summary: bpo-35155: clarify protocol handler method naming (GH-10313) Clarify that the naming of protocol handler methods shouldn't be literally called "protocol" but should be named after the actual protocol. https://bugs.python.org/issue35155 (cherry picked from commit dd7c4ceed90792f711347024852d4cf883a9ab9e) Co-authored-by: Denton Liu files: M Doc/library/urllib.request.rst diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst index 982f57f1fe61..289bfcaebc3d 100644 --- a/Doc/library/urllib.request.rst +++ b/Doc/library/urllib.request.rst @@ -608,23 +608,39 @@ OpenerDirector Objects *handler* should be an instance of :class:`BaseHandler`. The following methods are searched, and added to the possible chains (note that HTTP errors are a - special case). + special case). Note that, in the following, *protocol* should be replaced + with the actual protocol to handle, for example :meth:`http_response` would + be the HTTP protocol response handler. Also *type* should be replaced with + the actual HTTP code, for example :meth:`http_error_404` would handle HTTP + 404 errors. - * :meth:`protocol_open` --- signal that the handler knows how to open *protocol* + * :meth:`_open` --- signal that the handler knows how to open *protocol* URLs. - * :meth:`http_error_type` --- signal that the handler knows how to handle HTTP + See |protocol_open|_ for more information. + + * :meth:`http_error_\` --- signal that the handler knows how to handle HTTP errors with HTTP error code *type*. - * :meth:`protocol_error` --- signal that the handler knows how to handle errors + See |http_error_nnn|_ for more information. + + * :meth:`_error` --- signal that the handler knows how to handle errors from (non-\ ``http``) *protocol*. - * :meth:`protocol_request` --- signal that the handler knows how to pre-process + * :meth:`_request` --- signal that the handler knows how to pre-process *protocol* requests. - * :meth:`protocol_response` --- signal that the handler knows how to + See |protocol_request|_ for more information. + + * :meth:`_response` --- signal that the handler knows how to post-process *protocol* responses. + See |protocol_response|_ for more information. + +.. |protocol_open| replace:: :meth:`BaseHandler._open` +.. |http_error_nnn| replace:: :meth:`BaseHandler.http_error_\` +.. |protocol_request| replace:: :meth:`BaseHandler._request` +.. |protocol_response| replace:: :meth:`BaseHandler._response` .. method:: OpenerDirector.open(url, data=None[, timeout]) @@ -643,7 +659,7 @@ OpenerDirector Objects Handle an error of the given protocol. This will call the registered error handlers for the given protocol with the given arguments (which are protocol specific). The HTTP protocol is a special case which uses the HTTP response - code to determine the specific error handler; refer to the :meth:`http_error_\*` + code to determine the specific error handler; refer to the :meth:`http_error_\` methods of the handler classes. Return values and exceptions raised are the same as those of :func:`urlopen`. @@ -653,17 +669,17 @@ OpenerDirector objects open URLs in three stages: The order in which these methods are called within each stage is determined by sorting the handler instances. -#. Every handler with a method named like :meth:`protocol_request` has that +#. Every handler with a method named like :meth:`_request` has that method called to pre-process the request. -#. Handlers with a method named like :meth:`protocol_open` are called to handle +#. Handlers with a method named like :meth:`_open` are called to handle the request. This stage ends when a handler either returns a non-\ :const:`None` value (ie. a response), or raises an exception (usually :exc:`~urllib.error.URLError`). Exceptions are allowed to propagate. In fact, the above algorithm is first tried for methods named :meth:`default_open`. If all such methods return :const:`None`, the algorithm - is repeated for methods named like :meth:`protocol_open`. If all such methods + is repeated for methods named like :meth:`_open`. If all such methods return :const:`None`, the algorithm is repeated for methods named :meth:`unknown_open`. @@ -671,7 +687,7 @@ sorting the handler instances. :class:`OpenerDirector` instance's :meth:`~OpenerDirector.open` and :meth:`~OpenerDirector.error` methods. -#. Every handler with a method named like :meth:`protocol_response` has that +#. Every handler with a method named like :meth:`_response` has that method called to post-process the response. @@ -700,7 +716,7 @@ The following attribute and methods should only be used by classes derived from .. note:: The convention has been adopted that subclasses defining - :meth:`protocol_request` or :meth:`protocol_response` methods are named + :meth:`_request` or :meth:`_response` methods are named :class:`\*Processor`; all others are named :class:`\*Handler`. @@ -725,7 +741,8 @@ The following attribute and methods should only be used by classes derived from This method will be called before any protocol-specific open method. -.. method:: BaseHandler.protocol_open(req) +.. _protocol_open: +.. method:: BaseHandler._open(req) :noindex: This method is *not* defined in :class:`BaseHandler`, but subclasses should @@ -762,7 +779,8 @@ The following attribute and methods should only be used by classes derived from :func:`urlopen`. -.. method:: BaseHandler.http_error_nnn(req, fp, code, msg, hdrs) +.. _http_error_nnn: +.. method:: BaseHandler.http_error_(req, fp, code, msg, hdrs) *nnn* should be a three-digit HTTP error code. This method is also not defined in :class:`BaseHandler`, but will be called, if it exists, on an instance of a @@ -774,7 +792,8 @@ The following attribute and methods should only be used by classes derived from :meth:`http_error_default`. -.. method:: BaseHandler.protocol_request(req) +.. _protocol_request: +.. method:: BaseHandler._request(req) :noindex: This method is *not* defined in :class:`BaseHandler`, but subclasses should @@ -785,7 +804,8 @@ The following attribute and methods should only be used by classes derived from :class:`Request` object. -.. method:: BaseHandler.protocol_response(req, response) +.. _protocol_response: +.. method:: BaseHandler._response(req, response) :noindex: This method is *not* defined in :class:`BaseHandler`, but subclasses should @@ -873,10 +893,10 @@ ProxyHandler Objects -------------------- -.. method:: ProxyHandler.protocol_open(request) +.. method:: ProxyHandler._open(request) :noindex: - The :class:`ProxyHandler` will have a method :meth:`protocol_open` for every + The :class:`ProxyHandler` will have a method :meth:`_open` for every *protocol* which has a proxy in the *proxies* dictionary given in the constructor. The method will modify requests to go through the proxy, by calling ``request.set_proxy()``, and call the next handler in the chain to @@ -1132,7 +1152,7 @@ HTTPErrorProcessor Objects For 200 error codes, the response object is returned immediately. For non-200 error codes, this simply passes the job on to the - :meth:`protocol_error_code` handler methods, via :meth:`OpenerDirector.error`. + :meth:`http_error_\` handler methods, via :meth:`OpenerDirector.error`. Eventually, :class:`HTTPDefaultErrorHandler` will raise an :exc:`~urllib.error.HTTPError` if no other handler handles the error. From webhook-mailer at python.org Fri Mar 22 21:17:32 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Sat, 23 Mar 2019 01:17:32 -0000 Subject: [Python-checkins] Fix typo in doc for pprint.pp (GH-12500) Message-ID: https://github.com/python/cpython/commit/7c822e50f04b551f74cde4ee163a3fe261b08f47 commit: 7c822e50f04b551f74cde4ee163a3fe261b08f47 branch: master author: Xavier GUIHOT committer: Raymond Hettinger date: 2019-03-22T18:17:29-07:00 summary: Fix typo in doc for pprint.pp (GH-12500) files: M Doc/library/pprint.rst diff --git a/Doc/library/pprint.rst b/Doc/library/pprint.rst index 988f85bed103..9abf2865ef61 100644 --- a/Doc/library/pprint.rst +++ b/Doc/library/pprint.rst @@ -106,7 +106,7 @@ The :mod:`pprint` module also provides several shortcut functions: Prints the formatted representation of *object* followed by a newline. If *sort_dicts* is false (the default), dictionaries will be displayed with their keys in insertion order, otherwise the dict keys will be sorted. - *args* an *kwargs* will be passed to :func:`pprint` as formatting + *args* and *kwargs* will be passed to :func:`pprint` as formatting parameters. .. versionadded:: 3.8 From webhook-mailer at python.org Sat Mar 23 03:40:33 2019 From: webhook-mailer at python.org (Gregory P. Smith) Date: Sat, 23 Mar 2019 07:40:33 -0000 Subject: [Python-checkins] bpo-33319: Clarify subprocess call docs. (GH-12508) Message-ID: https://github.com/python/cpython/commit/7a2e84c3488cfd6c108c6b41ff040825f1757566 commit: 7a2e84c3488cfd6c108c6b41ff040825f1757566 branch: master author: Gregory P. Smith committer: GitHub date: 2019-03-23T00:40:28-07:00 summary: bpo-33319: Clarify subprocess call docs. (GH-12508) Clarify capturing or suppressing stdout and stderr on the old call APIs. Do not state that they are equivalent to run() calls when they are not implemented using run as that was misleading. Unlike run they cannot handle stdout or stderr being set to PIPE without a risk of deadlock. files: M Doc/library/subprocess.rst diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index 9ba0d30da569..ca0813c7830a 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -55,7 +55,7 @@ compatibility with older versions, see the :ref:`call-function-trio` section. If *capture_output* is true, stdout and stderr will be captured. When used, the internal :class:`Popen` object is automatically created with ``stdout=PIPE`` and ``stderr=PIPE``. The *stdout* and *stderr* arguments may - not be used as well. + not be supplied at the same time as *capture_output*. The *timeout* argument is passed to :meth:`Popen.communicate`. If the timeout expires, the child process will be killed and waited for. The @@ -1002,14 +1002,14 @@ calls these functions. Run the command described by *args*. Wait for command to complete, then return the :attr:`~Popen.returncode` attribute. - This is equivalent to:: + Code needing to capture stdout or stderr should use :func:`run` instead: run(...).returncode - (except that the *input* and *check* parameters are not supported) + To suppress stdout or stderr, supply a value of :data:`DEVNULL`. - The arguments shown above are merely the most - common ones. The full function signature is largely the + The arguments shown above are merely some common ones. + The full function signature is the same as that of the :class:`Popen` constructor - this function passes all supplied arguments other than *timeout* directly through to that interface. @@ -1030,14 +1030,14 @@ calls these functions. :exc:`CalledProcessError` object will have the return code in the :attr:`~CalledProcessError.returncode` attribute. - This is equivalent to:: + Code needing to capture stdout or stderr should use :func:`run` instead: run(..., check=True) - (except that the *input* parameter is not supported) + To suppress stdout or stderr, supply a value of :data:`DEVNULL`. - The arguments shown above are merely the most - common ones. The full function signature is largely the + The arguments shown above are merely some common ones. + The full function signature is the same as that of the :class:`Popen` constructor - this function passes all supplied arguments other than *timeout* directly through to that interface. @@ -1067,7 +1067,7 @@ calls these functions. run(..., check=True, stdout=PIPE).stdout - The arguments shown above are merely the most common ones. + The arguments shown above are merely some common ones. The full function signature is largely the same as that of :func:`run` - most arguments are passed directly through to that interface. However, explicitly passing ``input=None`` to inherit the parent's @@ -1077,8 +1077,9 @@ calls these functions. encoding of the output data may depend on the command being invoked, so the decoding to text will often need to be handled at the application level. - This behaviour may be overridden by setting *universal_newlines* to - ``True`` as described above in :ref:`frequently-used-arguments`. + This behaviour may be overridden by setting *text*, *encoding*, *errors*, + or *universal_newlines* to ``True`` as described in + :ref:`frequently-used-arguments` and :func:`run`. To also capture standard error in the result, use ``stderr=subprocess.STDOUT``:: From webhook-mailer at python.org Sat Mar 23 03:46:18 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 23 Mar 2019 07:46:18 -0000 Subject: [Python-checkins] bpo-33319: Clarify subprocess call docs. (GH-12508) Message-ID: https://github.com/python/cpython/commit/9cdac5ced68f1d6ef5e1eee7552bb200b46adc23 commit: 9cdac5ced68f1d6ef5e1eee7552bb200b46adc23 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-23T00:46:15-07:00 summary: bpo-33319: Clarify subprocess call docs. (GH-12508) Clarify capturing or suppressing stdout and stderr on the old call APIs. Do not state that they are equivalent to run() calls when they are not implemented using run as that was misleading. Unlike run they cannot handle stdout or stderr being set to PIPE without a risk of deadlock. (cherry picked from commit 7a2e84c3488cfd6c108c6b41ff040825f1757566) Co-authored-by: Gregory P. Smith files: M Doc/library/subprocess.rst diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index 18be75c10ce4..0c1d892a34d8 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -55,7 +55,7 @@ compatibility with older versions, see the :ref:`call-function-trio` section. If *capture_output* is true, stdout and stderr will be captured. When used, the internal :class:`Popen` object is automatically created with ``stdout=PIPE`` and ``stderr=PIPE``. The *stdout* and *stderr* arguments may - not be used as well. + not be supplied at the same time as *capture_output*. The *timeout* argument is passed to :meth:`Popen.communicate`. If the timeout expires, the child process will be killed and waited for. The @@ -1002,14 +1002,14 @@ calls these functions. Run the command described by *args*. Wait for command to complete, then return the :attr:`~Popen.returncode` attribute. - This is equivalent to:: + Code needing to capture stdout or stderr should use :func:`run` instead: run(...).returncode - (except that the *input* and *check* parameters are not supported) + To suppress stdout or stderr, supply a value of :data:`DEVNULL`. - The arguments shown above are merely the most - common ones. The full function signature is largely the + The arguments shown above are merely some common ones. + The full function signature is the same as that of the :class:`Popen` constructor - this function passes all supplied arguments other than *timeout* directly through to that interface. @@ -1030,14 +1030,14 @@ calls these functions. :exc:`CalledProcessError` object will have the return code in the :attr:`~CalledProcessError.returncode` attribute. - This is equivalent to:: + Code needing to capture stdout or stderr should use :func:`run` instead: run(..., check=True) - (except that the *input* parameter is not supported) + To suppress stdout or stderr, supply a value of :data:`DEVNULL`. - The arguments shown above are merely the most - common ones. The full function signature is largely the + The arguments shown above are merely some common ones. + The full function signature is the same as that of the :class:`Popen` constructor - this function passes all supplied arguments other than *timeout* directly through to that interface. @@ -1067,7 +1067,7 @@ calls these functions. run(..., check=True, stdout=PIPE).stdout - The arguments shown above are merely the most common ones. + The arguments shown above are merely some common ones. The full function signature is largely the same as that of :func:`run` - most arguments are passed directly through to that interface. However, explicitly passing ``input=None`` to inherit the parent's @@ -1077,8 +1077,9 @@ calls these functions. encoding of the output data may depend on the command being invoked, so the decoding to text will often need to be handled at the application level. - This behaviour may be overridden by setting *universal_newlines* to - ``True`` as described above in :ref:`frequently-used-arguments`. + This behaviour may be overridden by setting *text*, *encoding*, *errors*, + or *universal_newlines* to ``True`` as described in + :ref:`frequently-used-arguments` and :func:`run`. To also capture standard error in the result, use ``stderr=subprocess.STDOUT``:: From webhook-mailer at python.org Sat Mar 23 03:50:18 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Sat, 23 Mar 2019 07:50:18 -0000 Subject: [Python-checkins] bpo-36405: Use dict unpacking in idlelib (#12507) Message-ID: https://github.com/python/cpython/commit/2b75155590eb42d25e474b776ee9fdcc4b3dc840 commit: 2b75155590eb42d25e474b776ee9fdcc4b3dc840 branch: master author: Terry Jan Reedy committer: GitHub date: 2019-03-23T03:50:15-04:00 summary: bpo-36405: Use dict unpacking in idlelib (#12507) Remove now unneeded imports. files: A Misc/NEWS.d/next/IDLE/2019-03-23-01-45-56.bpo-36405.m7Wv1F.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/autocomplete.py M Lib/idlelib/calltip.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index d79d9ce648f5..d31ca83b0aac 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,8 @@ Released on 2019-10-20? ====================================== +bpo-36405: Use dict unpacking in idlelib and remove unneeded __main__ imports. + bpo-36396: Remove fgBg param of idlelib.config.GetHighlight(). This param was only used twice and changed the return type. diff --git a/Lib/idlelib/autocomplete.py b/Lib/idlelib/autocomplete.py index 9caf50d5d0c2..6751928f0450 100644 --- a/Lib/idlelib/autocomplete.py +++ b/Lib/idlelib/autocomplete.py @@ -14,7 +14,6 @@ from idlelib import autocomplete_w from idlelib.config import idleConf from idlelib.hyperparser import HyperParser -import __main__ # This string includes all chars that may be in an identifier. # TODO Update this here and elsewhere. @@ -182,8 +181,7 @@ def fetch_completions(self, what, mode): else: if mode == COMPLETE_ATTRIBUTES: if what == "": - namespace = __main__.__dict__.copy() - namespace.update(__main__.__builtins__.__dict__) + namespace = {**__builtins__.__dict__, **globals()} bigl = eval("dir()", namespace) bigl.sort() if "__all__" in bigl: @@ -218,10 +216,8 @@ def fetch_completions(self, what, mode): return smalll, bigl def get_entity(self, name): - """Lookup name in a namespace spanning sys.modules and __main.dict__""" - namespace = sys.modules.copy() - namespace.update(__main__.__dict__) - return eval(name, namespace) + "Lookup name in a namespace spanning sys.modules and globals()." + return eval(name, {**sys.modules, **globals()}) AutoComplete.reload() diff --git a/Lib/idlelib/calltip.py b/Lib/idlelib/calltip.py index 2a9a131ed96b..4b78917d7d98 100644 --- a/Lib/idlelib/calltip.py +++ b/Lib/idlelib/calltip.py @@ -12,7 +12,6 @@ from idlelib import calltip_w from idlelib.hyperparser import HyperParser -import __main__ class Calltip: @@ -100,13 +99,12 @@ def fetch_tip(self, expression): def get_entity(expression): """Return the object corresponding to expression evaluated - in a namespace spanning sys.modules and __main.dict__. + in a namespace spanning sys.modules and globals(). """ if expression: - namespace = sys.modules.copy() - namespace.update(__main__.__dict__) + namespace = {**sys.modules, **globals()} try: - return eval(expression, namespace) + return eval(expression, namespace) # Only protect user code. except BaseException: # An uncaught exception closes idle, and eval can raise any # exception, especially if user classes are involved. diff --git a/Misc/NEWS.d/next/IDLE/2019-03-23-01-45-56.bpo-36405.m7Wv1F.rst b/Misc/NEWS.d/next/IDLE/2019-03-23-01-45-56.bpo-36405.m7Wv1F.rst new file mode 100644 index 000000000000..619ab6af80c9 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-03-23-01-45-56.bpo-36405.m7Wv1F.rst @@ -0,0 +1 @@ +Use dict unpacking in idlelib and remove unneeded __main__ imports. From webhook-mailer at python.org Sat Mar 23 04:08:58 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 23 Mar 2019 08:08:58 -0000 Subject: [Python-checkins] bpo-36405: Use dict unpacking in idlelib (GH-12507) Message-ID: https://github.com/python/cpython/commit/00986ec5530f004fca2c2675a822c73f06283bdf commit: 00986ec5530f004fca2c2675a822c73f06283bdf branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-23T01:08:37-07:00 summary: bpo-36405: Use dict unpacking in idlelib (GH-12507) Remove now unneeded imports. (cherry picked from commit 2b75155590eb42d25e474b776ee9fdcc4b3dc840) Co-authored-by: Terry Jan Reedy files: A Misc/NEWS.d/next/IDLE/2019-03-23-01-45-56.bpo-36405.m7Wv1F.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/autocomplete.py M Lib/idlelib/calltip.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 0cbd3ff935f8..9ae2b0a97239 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,8 @@ Released on 2019-??-?? ====================================== +bpo-36405: Use dict unpacking in idlelib and remove unneeded __main__ imports. + bpo-36396: Remove fgBg param of idlelib.config.GetHighlight(). This param was only used twice and changed the return type. diff --git a/Lib/idlelib/autocomplete.py b/Lib/idlelib/autocomplete.py index 9caf50d5d0c2..6751928f0450 100644 --- a/Lib/idlelib/autocomplete.py +++ b/Lib/idlelib/autocomplete.py @@ -14,7 +14,6 @@ from idlelib import autocomplete_w from idlelib.config import idleConf from idlelib.hyperparser import HyperParser -import __main__ # This string includes all chars that may be in an identifier. # TODO Update this here and elsewhere. @@ -182,8 +181,7 @@ def fetch_completions(self, what, mode): else: if mode == COMPLETE_ATTRIBUTES: if what == "": - namespace = __main__.__dict__.copy() - namespace.update(__main__.__builtins__.__dict__) + namespace = {**__builtins__.__dict__, **globals()} bigl = eval("dir()", namespace) bigl.sort() if "__all__" in bigl: @@ -218,10 +216,8 @@ def fetch_completions(self, what, mode): return smalll, bigl def get_entity(self, name): - """Lookup name in a namespace spanning sys.modules and __main.dict__""" - namespace = sys.modules.copy() - namespace.update(__main__.__dict__) - return eval(name, namespace) + "Lookup name in a namespace spanning sys.modules and globals()." + return eval(name, {**sys.modules, **globals()}) AutoComplete.reload() diff --git a/Lib/idlelib/calltip.py b/Lib/idlelib/calltip.py index 2a9a131ed96b..4b78917d7d98 100644 --- a/Lib/idlelib/calltip.py +++ b/Lib/idlelib/calltip.py @@ -12,7 +12,6 @@ from idlelib import calltip_w from idlelib.hyperparser import HyperParser -import __main__ class Calltip: @@ -100,13 +99,12 @@ def fetch_tip(self, expression): def get_entity(expression): """Return the object corresponding to expression evaluated - in a namespace spanning sys.modules and __main.dict__. + in a namespace spanning sys.modules and globals(). """ if expression: - namespace = sys.modules.copy() - namespace.update(__main__.__dict__) + namespace = {**sys.modules, **globals()} try: - return eval(expression, namespace) + return eval(expression, namespace) # Only protect user code. except BaseException: # An uncaught exception closes idle, and eval can raise any # exception, especially if user classes are involved. diff --git a/Misc/NEWS.d/next/IDLE/2019-03-23-01-45-56.bpo-36405.m7Wv1F.rst b/Misc/NEWS.d/next/IDLE/2019-03-23-01-45-56.bpo-36405.m7Wv1F.rst new file mode 100644 index 000000000000..619ab6af80c9 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-03-23-01-45-56.bpo-36405.m7Wv1F.rst @@ -0,0 +1 @@ +Use dict unpacking in idlelib and remove unneeded __main__ imports. From webhook-mailer at python.org Sat Mar 23 07:06:04 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Sat, 23 Mar 2019 11:06:04 -0000 Subject: [Python-checkins] bpo-36301: Add _PyRuntimeState.preconfig (GH-12506) Message-ID: https://github.com/python/cpython/commit/6d5ee973f0600a3a9444f569dcf0dd346bfa2a11 commit: 6d5ee973f0600a3a9444f569dcf0dd346bfa2a11 branch: master author: Victor Stinner committer: GitHub date: 2019-03-23T12:05:43+01:00 summary: bpo-36301: Add _PyRuntimeState.preconfig (GH-12506) _PyPreConfig_Write() now writes the applied pre-configuration into _PyRuntimeState.preconfig. files: M Include/internal/pycore_pystate.h M Python/coreconfig.c M Python/preconfig.c M Python/pystate.c diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 911e7ee33baf..27c6eea6aa8c 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -8,6 +8,7 @@ extern "C" { # error "this header requires Py_BUILD_CORE or Py_BUILD_CORE_BUILTIN define" #endif +#include "cpython/coreconfig.h" #include "pystate.h" #include "pythread.h" @@ -176,6 +177,7 @@ typedef struct pyruntimestate { struct _ceval_runtime_state ceval; struct _gilstate_runtime_state gilstate; + _PyPreConfig preconfig; // XXX Consolidate globals found via the check-c-globals script. } _PyRuntimeState; diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 1881f00bf2f5..540e608fb01f 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -5,6 +5,7 @@ #include "pycore_getopt.h" #include "pycore_pylifecycle.h" #include "pycore_pymem.h" +#include "pycore_pystate.h" /* _PyRuntime */ #include "pycore_pathconfig.h" #include /* setlocale() */ #ifdef HAVE_LANGINFO_H @@ -1358,6 +1359,17 @@ _PyCoreConfig_ReadPreConfig(_PyCoreConfig *config) } +static _PyInitError +_PyCoreConfig_GetPreConfig(_PyCoreConfig *config) +{ + /* Read config written by _PyPreConfig_Write() */ + if (_PyPreConfig_Copy(&config->preconfig, &_PyRuntime.preconfig) < 0) { + return _Py_INIT_NO_MEMORY(); + } + return _Py_INIT_OK(); +} + + /* Read the configuration into _PyCoreConfig from: * Environment variables @@ -1374,6 +1386,11 @@ _PyCoreConfig_Read(_PyCoreConfig *config, const _PyPreConfig *preconfig) return err; } + err = _PyCoreConfig_GetPreConfig(config); + if (_Py_INIT_FAILED(err)) { + return err; + } + _PyCoreConfig_GetGlobalConfig(config); if (preconfig != NULL) { @@ -2117,6 +2134,11 @@ _PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, const _PyArgv *args, { _PyInitError err; + err = _Py_PreInitialize(); + if (_Py_INIT_FAILED(err)) { + return err; + } + _PyCmdline cmdline = {.precmdline = _PyPreCmdline_INIT}; err = _PyPreCmdline_Init(&cmdline.precmdline, args); diff --git a/Python/preconfig.c b/Python/preconfig.c index d856c124f3e9..13e5e1e85790 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -862,5 +862,14 @@ _PyPreConfig_Write(_PyPreConfig *config) /* Set LC_CTYPE to the user preferred locale */ _Py_SetLocaleFromEnv(LC_CTYPE); + /* Write the new pre-configuration into _PyRuntime */ + PyMemAllocatorEx old_alloc; + _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); + int res = _PyPreConfig_Copy(&_PyRuntime.preconfig, config); + PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); + if (res < 0) { + return _Py_INIT_NO_MEMORY(); + } + return _Py_INIT_OK(); } diff --git a/Python/pystate.c b/Python/pystate.c index 36566b767155..6fe3dd1ff3fa 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -41,6 +41,7 @@ _PyRuntimeState_Init_impl(_PyRuntimeState *runtime) _PyGC_Initialize(&runtime->gc); _PyEval_Initialize(&runtime->ceval); + runtime->preconfig = _PyPreConfig_INIT; runtime->gilstate.check_enabled = 1; @@ -97,6 +98,8 @@ _PyRuntimeState_Fini(_PyRuntimeState *runtime) runtime->xidregistry.mutex = NULL; } + _PyPreConfig_Clear(&runtime->preconfig); + PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); } From webhook-mailer at python.org Sat Mar 23 07:33:53 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Sat, 23 Mar 2019 11:33:53 -0000 Subject: [Python-checkins] bpo-23205: IDLE: Add tests and refactor grep's findfiles (GH-12203) Message-ID: https://github.com/python/cpython/commit/d60f658fc0278f3fcdadec8ddcab35b8ae03e1d1 commit: d60f658fc0278f3fcdadec8ddcab35b8ae03e1d1 branch: master author: Cheryl Sabella committer: GitHub date: 2019-03-23T07:33:42-04:00 summary: bpo-23205: IDLE: Add tests and refactor grep's findfiles (GH-12203) * Add tests for grep findfiles. * Move findfiles to module function. * Change findfiles to use os.walk. Based on a patch by Al Sweigart. files: A Misc/NEWS.d/next/IDLE/2019-03-06-14-47-57.bpo-23205.Vv0gfH.rst M Lib/idlelib/grep.py M Lib/idlelib/idle_test/test_grep.py diff --git a/Lib/idlelib/grep.py b/Lib/idlelib/grep.py index 6068d7e4dfce..12513594b76f 100644 --- a/Lib/idlelib/grep.py +++ b/Lib/idlelib/grep.py @@ -40,6 +40,27 @@ def grep(text, io=None, flist=None): dialog.open(text, searchphrase, io) +def walk_error(msg): + "Handle os.walk error." + print(msg) + + +def findfiles(folder, pattern, recursive): + """Generate file names in dir that match pattern. + + Args: + folder: Root directory to search. + pattern: File pattern to match. + recursive: True to include subdirectories. + """ + for dirpath, _, filenames in os.walk(folder, onerror=walk_error): + yield from (os.path.join(dirpath, name) + for name in filenames + if fnmatch.fnmatch(name, pattern)) + if not recursive: + break + + class GrepDialog(SearchDialogBase): "Dialog for searching multiple files." @@ -140,15 +161,16 @@ def grep_it(self, prog, path): prog: The compiled, cooked search pattern. path: String containing the search path. """ - dir, base = os.path.split(path) - list = self.findfiles(dir, base, self.recvar.get()) - list.sort() + folder, filepat = os.path.split(path) + if not folder: + folder = os.curdir + filelist = sorted(findfiles(folder, filepat, self.recvar.get())) self.close() pat = self.engine.getpat() print(f"Searching {pat!r} in {path} ...") hits = 0 try: - for fn in list: + for fn in filelist: try: with open(fn, errors='replace') as f: for lineno, line in enumerate(f, 1): @@ -166,36 +188,6 @@ def grep_it(self, prog, path): # so in OW.write, OW.text.insert fails. pass - def findfiles(self, dir, base, rec): - """Return list of files in the dir that match the base pattern. - - Use the current directory if dir has no value. - If rec is True, recursively iterate through subdirectories. - - Args: - dir: Directory path to search. - base: File search pattern. - rec: Boolean for recursive search through subdirectories. - """ - try: - names = os.listdir(dir or os.curdir) - except OSError as msg: - print(msg) - return [] - list = [] - subdirs = [] - for name in names: - fn = os.path.join(dir, name) - if os.path.isdir(fn): - subdirs.append(fn) - else: - if fnmatch.fnmatch(name, base): - list.append(fn) - if rec: - for subdir in subdirs: - list.extend(self.findfiles(subdir, base, rec)) - return list - def _grep_dialog(parent): # htest # from tkinter import Toplevel, Text, SEL, END diff --git a/Lib/idlelib/idle_test/test_grep.py b/Lib/idlelib/idle_test/test_grep.py index ab0d7860f789..a0b5b6917187 100644 --- a/Lib/idlelib/idle_test/test_grep.py +++ b/Lib/idlelib/idle_test/test_grep.py @@ -5,10 +5,11 @@ Otherwise, tests are mostly independent. Currently only test grep_it, coverage 51%. """ -from idlelib.grep import GrepDialog +from idlelib import grep import unittest from test.support import captured_stdout from idlelib.idle_test.mock_tk import Var +import os import re @@ -26,23 +27,92 @@ def getpat(self): class Dummy_grep: # Methods tested #default_command = GrepDialog.default_command - grep_it = GrepDialog.grep_it - findfiles = GrepDialog.findfiles + grep_it = grep.GrepDialog.grep_it # Other stuff needed recvar = Var(False) engine = searchengine def close(self): # gui method pass -grep = Dummy_grep() +_grep = Dummy_grep() class FindfilesTest(unittest.TestCase): - # findfiles is really a function, not a method, could be iterator - # test that filename return filename - # test that idlelib has many .py files - # test that recursive flag adds idle_test .py files - pass + + @classmethod + def setUpClass(cls): + cls.realpath = os.path.realpath(__file__) + cls.path = os.path.dirname(cls.realpath) + + @classmethod + def tearDownClass(cls): + del cls.realpath, cls.path + + def test_invaliddir(self): + with captured_stdout() as s: + filelist = list(grep.findfiles('invaliddir', '*.*', False)) + self.assertEqual(filelist, []) + self.assertIn('invalid', s.getvalue()) + + def test_curdir(self): + # Test os.curdir. + ff = grep.findfiles + save_cwd = os.getcwd() + os.chdir(self.path) + filename = 'test_grep.py' + filelist = list(ff(os.curdir, filename, False)) + self.assertIn(os.path.join(os.curdir, filename), filelist) + os.chdir(save_cwd) + + def test_base(self): + ff = grep.findfiles + readme = os.path.join(self.path, 'README.txt') + + # Check for Python files in path where this file lives. + filelist = list(ff(self.path, '*.py', False)) + # This directory has many Python files. + self.assertGreater(len(filelist), 10) + self.assertIn(self.realpath, filelist) + self.assertNotIn(readme, filelist) + + # Look for .txt files in path where this file lives. + filelist = list(ff(self.path, '*.txt', False)) + self.assertNotEqual(len(filelist), 0) + self.assertNotIn(self.realpath, filelist) + self.assertIn(readme, filelist) + + # Look for non-matching pattern. + filelist = list(ff(self.path, 'grep.*', False)) + self.assertEqual(len(filelist), 0) + self.assertNotIn(self.realpath, filelist) + + def test_recurse(self): + ff = grep.findfiles + parent = os.path.dirname(self.path) + grepfile = os.path.join(parent, 'grep.py') + pat = '*.py' + + # Get Python files only in parent directory. + filelist = list(ff(parent, pat, False)) + parent_size = len(filelist) + # Lots of Python files in idlelib. + self.assertGreater(parent_size, 20) + self.assertIn(grepfile, filelist) + # Without subdirectories, this file isn't returned. + self.assertNotIn(self.realpath, filelist) + + # Include subdirectories. + filelist = list(ff(parent, pat, True)) + # More files found now. + self.assertGreater(len(filelist), parent_size) + self.assertIn(grepfile, filelist) + # This file exists in list now. + self.assertIn(self.realpath, filelist) + + # Check another level up the tree. + parent = os.path.dirname(parent) + filelist = list(ff(parent, '*.py', True)) + self.assertIn(self.realpath, filelist) class Grep_itTest(unittest.TestCase): @@ -51,9 +121,9 @@ class Grep_itTest(unittest.TestCase): # from incomplete replacement, so 'later'. def report(self, pat): - grep.engine._pat = pat + _grep.engine._pat = pat with captured_stdout() as s: - grep.grep_it(re.compile(pat), __file__) + _grep.grep_it(re.compile(pat), __file__) lines = s.getvalue().split('\n') lines.pop() # remove bogus '' after last \n return lines diff --git a/Misc/NEWS.d/next/IDLE/2019-03-06-14-47-57.bpo-23205.Vv0gfH.rst b/Misc/NEWS.d/next/IDLE/2019-03-06-14-47-57.bpo-23205.Vv0gfH.rst new file mode 100644 index 000000000000..9e7c222ffc45 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-03-06-14-47-57.bpo-23205.Vv0gfH.rst @@ -0,0 +1,2 @@ +For the grep module, add tests for findfiles, refactor findfiles to be a +module-level function, and refactor findfiles to use os.walk. From webhook-mailer at python.org Sat Mar 23 08:04:44 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Sat, 23 Mar 2019 12:04:44 -0000 Subject: [Python-checkins] bpo-36381: warn when no PY_SSIZE_T_CLEAN defined (GH-12473) Message-ID: https://github.com/python/cpython/commit/d3c72a223a5f771f964fc34557c55eb5bfa0f5a0 commit: d3c72a223a5f771f964fc34557c55eb5bfa0f5a0 branch: master author: Inada Naoki committer: GitHub date: 2019-03-23T21:04:40+09:00 summary: bpo-36381: warn when no PY_SSIZE_T_CLEAN defined (GH-12473) We will remove int support from 3.10 or 4.0. files: A Misc/NEWS.d/next/C API/2019-03-20-22-02-40.bpo-36381.xlzDJ2.rst M Doc/whatsnew/3.8.rst M Python/getargs.c M Python/modsupport.c diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 18ec2c2f662d..3855d3604e1c 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -708,6 +708,16 @@ Changes in the Python API set for regular user accounts. +Changes in the C API +-------------------- + +* Use of ``#`` variants of formats in parsing or building value (e.g. + :c:func:`PyArg_ParseTuple`, :c:func:`Py_BuildValue`, :c:func:`PyObject_CallFunction`, + etc.) without ``PY_SSIZE_T_CLEAN`` defined raises ``DeprecationWarning`` now. + It will be removed in 3.10 or 4.0. Read :ref:`arg-parsing` for detail. + (Contributed by Inada Naoki in :issue:`36381`.) + + CPython bytecode changes ------------------------ diff --git a/Misc/NEWS.d/next/C API/2019-03-20-22-02-40.bpo-36381.xlzDJ2.rst b/Misc/NEWS.d/next/C API/2019-03-20-22-02-40.bpo-36381.xlzDJ2.rst new file mode 100644 index 000000000000..66982aa7eaf4 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2019-03-20-22-02-40.bpo-36381.xlzDJ2.rst @@ -0,0 +1,2 @@ +Raise ``DeprecationWarning`` when '#' formats are used for building or +parsing values without ``PY_SSIZE_T_CLEAN``. diff --git a/Python/getargs.c b/Python/getargs.c index e50f9b5f5c9d..59f0fdabb74a 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -681,7 +681,13 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, /* For # codes */ #define FETCH_SIZE int *q=NULL;Py_ssize_t *q2=NULL;\ if (flags & FLAG_SIZE_T) q2=va_arg(*p_va, Py_ssize_t*); \ - else q=va_arg(*p_va, int*); + else { \ + if (PyErr_WarnEx(PyExc_DeprecationWarning, \ + "PY_SSIZE_T_CLEAN will be required for '#' formats", 1)) { \ + return NULL; \ + } \ + q=va_arg(*p_va, int*); \ + } #define STORE_SIZE(s) \ if (flags & FLAG_SIZE_T) \ *q2=s; \ @@ -2591,8 +2597,13 @@ skipitem(const char **p_format, va_list *p_va, int flags) if (p_va != NULL) { if (flags & FLAG_SIZE_T) (void) va_arg(*p_va, Py_ssize_t *); - else + else { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "PY_SSIZE_T_CLEAN will be required for '#' formats", 1)) { + return NULL; + } (void) va_arg(*p_va, int *); + } } format++; } else if ((c == 's' || c == 'z' || c == 'y' || c == 'w') diff --git a/Python/modsupport.c b/Python/modsupport.c index 8a77a7b06dc5..625582210774 100644 --- a/Python/modsupport.c +++ b/Python/modsupport.c @@ -342,8 +342,13 @@ do_mkvalue(const char **p_format, va_list *p_va, int flags) ++*p_format; if (flags & FLAG_SIZE_T) n = va_arg(*p_va, Py_ssize_t); - else + else { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "PY_SSIZE_T_CLEAN will be required for '#' formats", 1)) { + return NULL; + } n = va_arg(*p_va, int); + } } else n = -1; @@ -390,8 +395,13 @@ do_mkvalue(const char **p_format, va_list *p_va, int flags) ++*p_format; if (flags & FLAG_SIZE_T) n = va_arg(*p_va, Py_ssize_t); - else + else { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "PY_SSIZE_T_CLEAN will be required for '#' formats", 1)) { + return NULL; + } n = va_arg(*p_va, int); + } } else n = -1; @@ -423,8 +433,13 @@ do_mkvalue(const char **p_format, va_list *p_va, int flags) ++*p_format; if (flags & FLAG_SIZE_T) n = va_arg(*p_va, Py_ssize_t); - else + else { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "PY_SSIZE_T_CLEAN will be required for '#' formats", 1)) { + return NULL; + } n = va_arg(*p_va, int); + } } else n = -1; From webhook-mailer at python.org Sat Mar 23 08:21:50 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 23 Mar 2019 12:21:50 -0000 Subject: [Python-checkins] bpo-23205: IDLE: Add tests and refactor grep's findfiles (GH-12203) Message-ID: https://github.com/python/cpython/commit/5ab665005b7f8a21c133208f140389e3bb1a3294 commit: 5ab665005b7f8a21c133208f140389e3bb1a3294 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-23T05:21:46-07:00 summary: bpo-23205: IDLE: Add tests and refactor grep's findfiles (GH-12203) * Add tests for grep findfiles. * Move findfiles to module function. * Change findfiles to use os.walk. Based on a patch by Al Sweigart. (cherry picked from commit d60f658fc0278f3fcdadec8ddcab35b8ae03e1d1) Co-authored-by: Cheryl Sabella files: A Misc/NEWS.d/next/IDLE/2019-03-06-14-47-57.bpo-23205.Vv0gfH.rst M Lib/idlelib/grep.py M Lib/idlelib/idle_test/test_grep.py diff --git a/Lib/idlelib/grep.py b/Lib/idlelib/grep.py index 6068d7e4dfce..12513594b76f 100644 --- a/Lib/idlelib/grep.py +++ b/Lib/idlelib/grep.py @@ -40,6 +40,27 @@ def grep(text, io=None, flist=None): dialog.open(text, searchphrase, io) +def walk_error(msg): + "Handle os.walk error." + print(msg) + + +def findfiles(folder, pattern, recursive): + """Generate file names in dir that match pattern. + + Args: + folder: Root directory to search. + pattern: File pattern to match. + recursive: True to include subdirectories. + """ + for dirpath, _, filenames in os.walk(folder, onerror=walk_error): + yield from (os.path.join(dirpath, name) + for name in filenames + if fnmatch.fnmatch(name, pattern)) + if not recursive: + break + + class GrepDialog(SearchDialogBase): "Dialog for searching multiple files." @@ -140,15 +161,16 @@ def grep_it(self, prog, path): prog: The compiled, cooked search pattern. path: String containing the search path. """ - dir, base = os.path.split(path) - list = self.findfiles(dir, base, self.recvar.get()) - list.sort() + folder, filepat = os.path.split(path) + if not folder: + folder = os.curdir + filelist = sorted(findfiles(folder, filepat, self.recvar.get())) self.close() pat = self.engine.getpat() print(f"Searching {pat!r} in {path} ...") hits = 0 try: - for fn in list: + for fn in filelist: try: with open(fn, errors='replace') as f: for lineno, line in enumerate(f, 1): @@ -166,36 +188,6 @@ def grep_it(self, prog, path): # so in OW.write, OW.text.insert fails. pass - def findfiles(self, dir, base, rec): - """Return list of files in the dir that match the base pattern. - - Use the current directory if dir has no value. - If rec is True, recursively iterate through subdirectories. - - Args: - dir: Directory path to search. - base: File search pattern. - rec: Boolean for recursive search through subdirectories. - """ - try: - names = os.listdir(dir or os.curdir) - except OSError as msg: - print(msg) - return [] - list = [] - subdirs = [] - for name in names: - fn = os.path.join(dir, name) - if os.path.isdir(fn): - subdirs.append(fn) - else: - if fnmatch.fnmatch(name, base): - list.append(fn) - if rec: - for subdir in subdirs: - list.extend(self.findfiles(subdir, base, rec)) - return list - def _grep_dialog(parent): # htest # from tkinter import Toplevel, Text, SEL, END diff --git a/Lib/idlelib/idle_test/test_grep.py b/Lib/idlelib/idle_test/test_grep.py index ab0d7860f789..a0b5b6917187 100644 --- a/Lib/idlelib/idle_test/test_grep.py +++ b/Lib/idlelib/idle_test/test_grep.py @@ -5,10 +5,11 @@ Otherwise, tests are mostly independent. Currently only test grep_it, coverage 51%. """ -from idlelib.grep import GrepDialog +from idlelib import grep import unittest from test.support import captured_stdout from idlelib.idle_test.mock_tk import Var +import os import re @@ -26,23 +27,92 @@ def getpat(self): class Dummy_grep: # Methods tested #default_command = GrepDialog.default_command - grep_it = GrepDialog.grep_it - findfiles = GrepDialog.findfiles + grep_it = grep.GrepDialog.grep_it # Other stuff needed recvar = Var(False) engine = searchengine def close(self): # gui method pass -grep = Dummy_grep() +_grep = Dummy_grep() class FindfilesTest(unittest.TestCase): - # findfiles is really a function, not a method, could be iterator - # test that filename return filename - # test that idlelib has many .py files - # test that recursive flag adds idle_test .py files - pass + + @classmethod + def setUpClass(cls): + cls.realpath = os.path.realpath(__file__) + cls.path = os.path.dirname(cls.realpath) + + @classmethod + def tearDownClass(cls): + del cls.realpath, cls.path + + def test_invaliddir(self): + with captured_stdout() as s: + filelist = list(grep.findfiles('invaliddir', '*.*', False)) + self.assertEqual(filelist, []) + self.assertIn('invalid', s.getvalue()) + + def test_curdir(self): + # Test os.curdir. + ff = grep.findfiles + save_cwd = os.getcwd() + os.chdir(self.path) + filename = 'test_grep.py' + filelist = list(ff(os.curdir, filename, False)) + self.assertIn(os.path.join(os.curdir, filename), filelist) + os.chdir(save_cwd) + + def test_base(self): + ff = grep.findfiles + readme = os.path.join(self.path, 'README.txt') + + # Check for Python files in path where this file lives. + filelist = list(ff(self.path, '*.py', False)) + # This directory has many Python files. + self.assertGreater(len(filelist), 10) + self.assertIn(self.realpath, filelist) + self.assertNotIn(readme, filelist) + + # Look for .txt files in path where this file lives. + filelist = list(ff(self.path, '*.txt', False)) + self.assertNotEqual(len(filelist), 0) + self.assertNotIn(self.realpath, filelist) + self.assertIn(readme, filelist) + + # Look for non-matching pattern. + filelist = list(ff(self.path, 'grep.*', False)) + self.assertEqual(len(filelist), 0) + self.assertNotIn(self.realpath, filelist) + + def test_recurse(self): + ff = grep.findfiles + parent = os.path.dirname(self.path) + grepfile = os.path.join(parent, 'grep.py') + pat = '*.py' + + # Get Python files only in parent directory. + filelist = list(ff(parent, pat, False)) + parent_size = len(filelist) + # Lots of Python files in idlelib. + self.assertGreater(parent_size, 20) + self.assertIn(grepfile, filelist) + # Without subdirectories, this file isn't returned. + self.assertNotIn(self.realpath, filelist) + + # Include subdirectories. + filelist = list(ff(parent, pat, True)) + # More files found now. + self.assertGreater(len(filelist), parent_size) + self.assertIn(grepfile, filelist) + # This file exists in list now. + self.assertIn(self.realpath, filelist) + + # Check another level up the tree. + parent = os.path.dirname(parent) + filelist = list(ff(parent, '*.py', True)) + self.assertIn(self.realpath, filelist) class Grep_itTest(unittest.TestCase): @@ -51,9 +121,9 @@ class Grep_itTest(unittest.TestCase): # from incomplete replacement, so 'later'. def report(self, pat): - grep.engine._pat = pat + _grep.engine._pat = pat with captured_stdout() as s: - grep.grep_it(re.compile(pat), __file__) + _grep.grep_it(re.compile(pat), __file__) lines = s.getvalue().split('\n') lines.pop() # remove bogus '' after last \n return lines diff --git a/Misc/NEWS.d/next/IDLE/2019-03-06-14-47-57.bpo-23205.Vv0gfH.rst b/Misc/NEWS.d/next/IDLE/2019-03-06-14-47-57.bpo-23205.Vv0gfH.rst new file mode 100644 index 000000000000..9e7c222ffc45 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-03-06-14-47-57.bpo-23205.Vv0gfH.rst @@ -0,0 +1,2 @@ +For the grep module, add tests for findfiles, refactor findfiles to be a +module-level function, and refactor findfiles to use os.walk. From webhook-mailer at python.org Sat Mar 23 12:29:54 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Sat, 23 Mar 2019 16:29:54 -0000 Subject: [Python-checkins] bpo-32217: Correct usage of ABI tags in freeze. (GH-4719) Message-ID: https://github.com/python/cpython/commit/a7987e71939fa631296f83861fb376361ddd59ee commit: a7987e71939fa631296f83861fb376361ddd59ee branch: master author: AraHaan <15173749+AraHaan at users.noreply.github.com> committer: Cheryl Sabella date: 2019-03-23T12:29:49-04:00 summary: bpo-32217: Correct usage of ABI tags in freeze. (GH-4719) Check for sys.abiflags before using since not all platforms have it defined. files: A Misc/NEWS.d/next/Tools-Demos/2017-12-19-20-42-36.bpo-32217.axXcjA.rst M Tools/freeze/freeze.py diff --git a/Misc/NEWS.d/next/Tools-Demos/2017-12-19-20-42-36.bpo-32217.axXcjA.rst b/Misc/NEWS.d/next/Tools-Demos/2017-12-19-20-42-36.bpo-32217.axXcjA.rst new file mode 100644 index 000000000000..67feb9e9c3c5 --- /dev/null +++ b/Misc/NEWS.d/next/Tools-Demos/2017-12-19-20-42-36.bpo-32217.axXcjA.rst @@ -0,0 +1 @@ +Fix freeze script on Windows. diff --git a/Tools/freeze/freeze.py b/Tools/freeze/freeze.py index 08d09e706205..3ab56fd0fe1d 100755 --- a/Tools/freeze/freeze.py +++ b/Tools/freeze/freeze.py @@ -217,7 +217,10 @@ def main(): # locations derived from options version = '%d.%d' % sys.version_info[:2] - flagged_version = version + sys.abiflags + if hasattr(sys, 'abiflags'): + flagged_version = version + sys.abiflags + else: + flagged_version = version if win: extensions_c = 'frozen_extensions.c' if ishome: From webhook-mailer at python.org Sat Mar 23 12:47:43 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 23 Mar 2019 16:47:43 -0000 Subject: [Python-checkins] bpo-32217: Correct usage of ABI tags in freeze. (GH-4719) Message-ID: https://github.com/python/cpython/commit/d93de028e84c762d7e30b0b93d149b66c85d421f commit: d93de028e84c762d7e30b0b93d149b66c85d421f branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-23T09:47:40-07:00 summary: bpo-32217: Correct usage of ABI tags in freeze. (GH-4719) Check for sys.abiflags before using since not all platforms have it defined. (cherry picked from commit a7987e71939fa631296f83861fb376361ddd59ee) Co-authored-by: AraHaan <15173749+AraHaan at users.noreply.github.com> files: A Misc/NEWS.d/next/Tools-Demos/2017-12-19-20-42-36.bpo-32217.axXcjA.rst M Tools/freeze/freeze.py diff --git a/Misc/NEWS.d/next/Tools-Demos/2017-12-19-20-42-36.bpo-32217.axXcjA.rst b/Misc/NEWS.d/next/Tools-Demos/2017-12-19-20-42-36.bpo-32217.axXcjA.rst new file mode 100644 index 000000000000..67feb9e9c3c5 --- /dev/null +++ b/Misc/NEWS.d/next/Tools-Demos/2017-12-19-20-42-36.bpo-32217.axXcjA.rst @@ -0,0 +1 @@ +Fix freeze script on Windows. diff --git a/Tools/freeze/freeze.py b/Tools/freeze/freeze.py index d602f5853975..a09bfa8abb0f 100755 --- a/Tools/freeze/freeze.py +++ b/Tools/freeze/freeze.py @@ -217,7 +217,10 @@ def main(): # locations derived from options version = '%d.%d' % sys.version_info[:2] - flagged_version = version + sys.abiflags + if hasattr(sys, 'abiflags'): + flagged_version = version + sys.abiflags + else: + flagged_version = version if win: extensions_c = 'frozen_extensions.c' if ishome: From webhook-mailer at python.org Sat Mar 23 22:23:37 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Sun, 24 Mar 2019 02:23:37 -0000 Subject: [Python-checkins] bpo-36412: fix a possible crash in dictobject.c's new_dict() (GH-12519) Message-ID: https://github.com/python/cpython/commit/3d07c1ee1d2d475b74816117981d6ec752c26c23 commit: 3d07c1ee1d2d475b74816117981d6ec752c26c23 branch: master author: Zackery Spytz committer: Inada Naoki date: 2019-03-24T11:23:29+09:00 summary: bpo-36412: fix a possible crash in dictobject.c's new_dict() (GH-12519) files: A Misc/NEWS.d/next/Core and Builtins/2019-03-23-19-51-09.bpo-36412.C7acGn.rst M Objects/dictobject.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-23-19-51-09.bpo-36412.C7acGn.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-23-19-51-09.bpo-36412.C7acGn.rst new file mode 100644 index 000000000000..0146988151ee --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-23-19-51-09.bpo-36412.C7acGn.rst @@ -0,0 +1 @@ +Fix a possible crash when creating a new dictionary. diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 524ff67837bc..e2603e190b62 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -604,7 +604,9 @@ new_dict(PyDictKeysObject *keys, PyObject **values) mp = PyObject_GC_New(PyDictObject, &PyDict_Type); if (mp == NULL) { dictkeys_decref(keys); - free_values(values); + if (values != empty_values) { + free_values(values); + } return NULL; } } From webhook-mailer at python.org Sun Mar 24 15:04:02 2019 From: webhook-mailer at python.org (Ned Deily) Date: Sun, 24 Mar 2019 19:04:02 -0000 Subject: [Python-checkins] Replace "DOS box" with link to Windows FAQ. (GH-12390) Message-ID: https://github.com/python/cpython/commit/6661c1720ebd322e2cb6995a243e8dc6e588d931 commit: 6661c1720ebd322e2cb6995a243e8dc6e588d931 branch: master author: Ned Deily committer: GitHub date: 2019-03-24T15:03:54-04:00 summary: Replace "DOS box" with link to Windows FAQ. (GH-12390) files: M Doc/faq/windows.rst M Doc/tutorial/interpreter.rst diff --git a/Doc/faq/windows.rst b/Doc/faq/windows.rst index 75ebe603cb5b..ad97cd0932ac 100644 --- a/Doc/faq/windows.rst +++ b/Doc/faq/windows.rst @@ -15,6 +15,8 @@ Python on Windows FAQ .. XXX need review for Python 3. XXX need review for Windows Vista/Seven? +.. _faq-run-program-under-windows: + How do I run a Python program under Windows? -------------------------------------------- diff --git a/Doc/tutorial/interpreter.rst b/Doc/tutorial/interpreter.rst index 6cdc6c8419af..ab92af044e7c 100644 --- a/Doc/tutorial/interpreter.rst +++ b/Doc/tutorial/interpreter.rst @@ -26,7 +26,7 @@ popular alternative location.) On Windows machines, the Python installation is usually placed in :file:`C:\\Python36`, though you can change this when you're running the installer. To add this directory to your path, you can type the following -command into the command prompt in a DOS box:: +command into :ref:`a command prompt window `:: set path=%path%;C:\python36 From webhook-mailer at python.org Sun Mar 24 15:12:08 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 24 Mar 2019 19:12:08 -0000 Subject: [Python-checkins] [3.7] Replace "DOS box" with link to Windows FAQ. (GH-12390) (GH-12525) Message-ID: https://github.com/python/cpython/commit/4d5f1a4bb98a6f1b20c61e06d78c53cef18fbbde commit: 4d5f1a4bb98a6f1b20c61e06d78c53cef18fbbde branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-24T12:12:05-07:00 summary: [3.7] Replace "DOS box" with link to Windows FAQ. (GH-12390) (GH-12525) (cherry picked from commit 6661c1720ebd322e2cb6995a243e8dc6e588d931) Co-authored-by: Ned Deily files: M Doc/faq/windows.rst M Doc/tutorial/interpreter.rst diff --git a/Doc/faq/windows.rst b/Doc/faq/windows.rst index a46d4c1725ac..a92ec1b52ad4 100644 --- a/Doc/faq/windows.rst +++ b/Doc/faq/windows.rst @@ -15,6 +15,8 @@ Python on Windows FAQ .. XXX need review for Python 3. XXX need review for Windows Vista/Seven? +.. _faq-run-program-under-windows: + How do I run a Python program under Windows? -------------------------------------------- diff --git a/Doc/tutorial/interpreter.rst b/Doc/tutorial/interpreter.rst index 6812f6489136..b8ce525db9ce 100644 --- a/Doc/tutorial/interpreter.rst +++ b/Doc/tutorial/interpreter.rst @@ -26,7 +26,7 @@ popular alternative location.) On Windows machines, the Python installation is usually placed in :file:`C:\\Python37`, though you can change this when you're running the installer. To add this directory to your path, you can type the following -command into the command prompt in a DOS box:: +command into :ref:`a command prompt window `:: set path=%path%;C:\python37 From webhook-mailer at python.org Sun Mar 24 17:12:31 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Sun, 24 Mar 2019 21:12:31 -0000 Subject: [Python-checkins] bpo-36405: IDLE - Restore __main__ and add tests (#12518) Message-ID: https://github.com/python/cpython/commit/0fe4513d9a5510ae91c0da7eb0433f79a6d4dda9 commit: 0fe4513d9a5510ae91c0da7eb0433f79a6d4dda9 branch: master author: Terry Jan Reedy committer: GitHub date: 2019-03-24T17:12:28-04:00 summary: bpo-36405: IDLE - Restore __main__ and add tests (#12518) Fix error in commit 2b75155 noticed by Serhiy Storchaka. files: M Lib/idlelib/NEWS.txt M Lib/idlelib/autocomplete.py M Lib/idlelib/calltip.py M Lib/idlelib/idle_test/test_autocomplete.py M Misc/NEWS.d/next/IDLE/2019-03-23-01-45-56.bpo-36405.m7Wv1F.rst diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index d31ca83b0aac..dbb3653bb4f4 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,7 +3,7 @@ Released on 2019-10-20? ====================================== -bpo-36405: Use dict unpacking in idlelib and remove unneeded __main__ imports. +bpo-36405: Use dict unpacking in idlelib. bpo-36396: Remove fgBg param of idlelib.config.GetHighlight(). This param was only used twice and changed the return type. diff --git a/Lib/idlelib/autocomplete.py b/Lib/idlelib/autocomplete.py index 6751928f0450..d57e9c9000fa 100644 --- a/Lib/idlelib/autocomplete.py +++ b/Lib/idlelib/autocomplete.py @@ -3,6 +3,7 @@ Either on demand or after a user-selected delay after a key character, pop up a list of candidates. """ +import __main__ import os import string import sys @@ -181,7 +182,8 @@ def fetch_completions(self, what, mode): else: if mode == COMPLETE_ATTRIBUTES: if what == "": - namespace = {**__builtins__.__dict__, **globals()} + namespace = {**__main__.__builtins__.__dict__, + **__main__.__dict__} bigl = eval("dir()", namespace) bigl.sort() if "__all__" in bigl: @@ -216,8 +218,8 @@ def fetch_completions(self, what, mode): return smalll, bigl def get_entity(self, name): - "Lookup name in a namespace spanning sys.modules and globals()." - return eval(name, {**sys.modules, **globals()}) + "Lookup name in a namespace spanning sys.modules and __main.dict__." + return eval(name, {**sys.modules, **__main__.__dict__}) AutoComplete.reload() diff --git a/Lib/idlelib/calltip.py b/Lib/idlelib/calltip.py index 4b78917d7d98..b013a7f6ec0f 100644 --- a/Lib/idlelib/calltip.py +++ b/Lib/idlelib/calltip.py @@ -4,6 +4,7 @@ parameter and docstring information when you type an opening parenthesis, and which disappear when you type a closing parenthesis. """ +import __main__ import inspect import re import sys @@ -99,10 +100,10 @@ def fetch_tip(self, expression): def get_entity(expression): """Return the object corresponding to expression evaluated - in a namespace spanning sys.modules and globals(). + in a namespace spanning sys.modules and __main.dict__. """ if expression: - namespace = {**sys.modules, **globals()} + namespace = {**sys.modules, **__main__.__dict__} try: return eval(expression, namespace) # Only protect user code. except BaseException: diff --git a/Lib/idlelib/idle_test/test_autocomplete.py b/Lib/idlelib/idle_test/test_autocomplete.py index d7ee00af94b4..89a9ed11df40 100644 --- a/Lib/idlelib/idle_test/test_autocomplete.py +++ b/Lib/idlelib/idle_test/test_autocomplete.py @@ -3,6 +3,7 @@ import unittest from test.support import requires from tkinter import Tk, Text +import __main__ import idlelib.autocomplete as ac import idlelib.autocomplete_w as acw @@ -35,7 +36,7 @@ def tearDownClass(cls): del cls.root def setUp(self): - self.editor.text.delete('1.0', 'end') + self.text.delete('1.0', 'end') self.autocomplete = ac.AutoComplete(self.editor) def test_init(self): @@ -132,12 +133,16 @@ def test_fetch_completions(self): # a small list containing non-private variables. # For file completion, a large list containing all files in the path, # and a small list containing files that do not start with '.' - pass + small, large = self.autocomplete.fetch_completions( + '', ac.COMPLETE_ATTRIBUTES) + self.assertLess(len(small), len(large)) + if __main__.__file__ != ac.__file__: + self.assertNotIn('AutoComplete', small) # See issue 36405. def test_get_entity(self): # Test that a name is in the namespace of sys.modules and # __main__.__dict__ - pass + self.assertEqual(self.autocomplete.get_entity('int'), int) if __name__ == '__main__': diff --git a/Misc/NEWS.d/next/IDLE/2019-03-23-01-45-56.bpo-36405.m7Wv1F.rst b/Misc/NEWS.d/next/IDLE/2019-03-23-01-45-56.bpo-36405.m7Wv1F.rst index 619ab6af80c9..bef438d5a5a7 100644 --- a/Misc/NEWS.d/next/IDLE/2019-03-23-01-45-56.bpo-36405.m7Wv1F.rst +++ b/Misc/NEWS.d/next/IDLE/2019-03-23-01-45-56.bpo-36405.m7Wv1F.rst @@ -1 +1 @@ -Use dict unpacking in idlelib and remove unneeded __main__ imports. +Use dict unpacking in idlelib. From webhook-mailer at python.org Sun Mar 24 17:28:51 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Sun, 24 Mar 2019 21:28:51 -0000 Subject: [Python-checkins] bpo-31822: Document that urllib.parse.{Defrag, Split, Parse}Result are namedtuples (GH-4434) Message-ID: https://github.com/python/cpython/commit/13c1f72cd1d91fdc2654f2f57356b2eacb75f164 commit: 13c1f72cd1d91fdc2654f2f57356b2eacb75f164 branch: master author: Lisa Roach committer: Cheryl Sabella date: 2019-03-24T17:28:48-04:00 summary: bpo-31822: Document that urllib.parse.{Defrag,Split,Parse}Result are namedtuples (GH-4434) files: M Doc/library/urllib.parse.rst diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst index af15f5bbfff3..f9936288fd42 100644 --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -39,8 +39,9 @@ or on combining URL components into a URL string. .. function:: urlparse(urlstring, scheme='', allow_fragments=True) - Parse a URL into six components, returning a 6-tuple. This corresponds to the - general structure of a URL: ``scheme://netloc/path;parameters?query#fragment``. + Parse a URL into six components, returning a 6-item :term:`named tuple`. This + corresponds to the general structure of a URL: + ``scheme://netloc/path;parameters?query#fragment``. Each tuple item is a string, possibly empty. The components are not broken up in smaller parts (for example, the network location is a single string), and % escapes are not expanded. The delimiters as shown above are not part of the @@ -88,8 +89,8 @@ or on combining URL components into a URL string. or query component, and :attr:`fragment` is set to the empty string in the return value. - The return value is actually an instance of a subclass of :class:`tuple`. This - class has the following additional read-only convenience attributes: + The return value is a :term:`named tuple`, which means that its items can + be accessed by index or as named attributes, which are: +------------------+-------+--------------------------+----------------------+ | Attribute | Index | Value | Value if not present | @@ -129,6 +130,24 @@ or on combining URL components into a URL string. ``#``, ``@``, or ``:`` will raise a :exc:`ValueError`. If the URL is decomposed before parsing, no error will be raised. + As is the case with all named tuples, the subclass has a few additional methods + and attributes that are particularly useful. One such method is :meth:`_replace`. + The :meth:`_replace` method will return a new ParseResult object replacing specified + fields with new values. + + .. doctest:: + :options: +NORMALIZE_WHITESPACE + + >>> from urllib.parse import urlparse + >>> u = urlparse('//www.cwi.nl:80/%7Eguido/Python.html') + >>> u + ParseResult(scheme='', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html', + params='', query='', fragment='') + >>> u._replace(scheme='http') + ParseResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html', + params='', query='', fragment='') + + .. versionchanged:: 3.2 Added IPv6 URL parsing capabilities. @@ -232,11 +251,13 @@ or on combining URL components into a URL string. This should generally be used instead of :func:`urlparse` if the more recent URL syntax allowing parameters to be applied to each segment of the *path* portion of the URL (see :rfc:`2396`) is wanted. A separate function is needed to - separate the path segments and parameters. This function returns a 5-tuple: - (addressing scheme, network location, path, query, fragment identifier). + separate the path segments and parameters. This function returns a 5-item + :term:`named tuple`:: + + (addressing scheme, network location, path, query, fragment identifier). - The return value is actually an instance of a subclass of :class:`tuple`. This - class has the following additional read-only convenience attributes: + The return value is a :term:`named tuple`, its items can be accessed by index + or as named attributes: +------------------+-------+-------------------------+----------------------+ | Attribute | Index | Value | Value if not present | @@ -332,8 +353,8 @@ or on combining URL components into a URL string. string. If there is no fragment identifier in *url*, return *url* unmodified and an empty string. - The return value is actually an instance of a subclass of :class:`tuple`. This - class has the following additional read-only convenience attributes: + The return value is a :term:`named tuple`, its items can be accessed by index + or as named attributes: +------------------+-------+-------------------------+----------------------+ | Attribute | Index | Value | Value if not present | From webhook-mailer at python.org Sun Mar 24 17:32:43 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 24 Mar 2019 21:32:43 -0000 Subject: [Python-checkins] bpo-36405: IDLE - Restore __main__ and add tests (GH-12518) Message-ID: https://github.com/python/cpython/commit/2b580146a53311e4202b0be63040740cdc01f1f5 commit: 2b580146a53311e4202b0be63040740cdc01f1f5 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-24T14:32:40-07:00 summary: bpo-36405: IDLE - Restore __main__ and add tests (GH-12518) Fix error in commit 2b75155 noticed by Serhiy Storchaka. (cherry picked from commit 0fe4513d9a5510ae91c0da7eb0433f79a6d4dda9) Co-authored-by: Terry Jan Reedy files: M Lib/idlelib/NEWS.txt M Lib/idlelib/autocomplete.py M Lib/idlelib/calltip.py M Lib/idlelib/idle_test/test_autocomplete.py M Misc/NEWS.d/next/IDLE/2019-03-23-01-45-56.bpo-36405.m7Wv1F.rst diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 9ae2b0a97239..f136810e7a86 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,7 +3,7 @@ Released on 2019-??-?? ====================================== -bpo-36405: Use dict unpacking in idlelib and remove unneeded __main__ imports. +bpo-36405: Use dict unpacking in idlelib. bpo-36396: Remove fgBg param of idlelib.config.GetHighlight(). This param was only used twice and changed the return type. diff --git a/Lib/idlelib/autocomplete.py b/Lib/idlelib/autocomplete.py index 6751928f0450..d57e9c9000fa 100644 --- a/Lib/idlelib/autocomplete.py +++ b/Lib/idlelib/autocomplete.py @@ -3,6 +3,7 @@ Either on demand or after a user-selected delay after a key character, pop up a list of candidates. """ +import __main__ import os import string import sys @@ -181,7 +182,8 @@ def fetch_completions(self, what, mode): else: if mode == COMPLETE_ATTRIBUTES: if what == "": - namespace = {**__builtins__.__dict__, **globals()} + namespace = {**__main__.__builtins__.__dict__, + **__main__.__dict__} bigl = eval("dir()", namespace) bigl.sort() if "__all__" in bigl: @@ -216,8 +218,8 @@ def fetch_completions(self, what, mode): return smalll, bigl def get_entity(self, name): - "Lookup name in a namespace spanning sys.modules and globals()." - return eval(name, {**sys.modules, **globals()}) + "Lookup name in a namespace spanning sys.modules and __main.dict__." + return eval(name, {**sys.modules, **__main__.__dict__}) AutoComplete.reload() diff --git a/Lib/idlelib/calltip.py b/Lib/idlelib/calltip.py index 4b78917d7d98..b013a7f6ec0f 100644 --- a/Lib/idlelib/calltip.py +++ b/Lib/idlelib/calltip.py @@ -4,6 +4,7 @@ parameter and docstring information when you type an opening parenthesis, and which disappear when you type a closing parenthesis. """ +import __main__ import inspect import re import sys @@ -99,10 +100,10 @@ def fetch_tip(self, expression): def get_entity(expression): """Return the object corresponding to expression evaluated - in a namespace spanning sys.modules and globals(). + in a namespace spanning sys.modules and __main.dict__. """ if expression: - namespace = {**sys.modules, **globals()} + namespace = {**sys.modules, **__main__.__dict__} try: return eval(expression, namespace) # Only protect user code. except BaseException: diff --git a/Lib/idlelib/idle_test/test_autocomplete.py b/Lib/idlelib/idle_test/test_autocomplete.py index d7ee00af94b4..89a9ed11df40 100644 --- a/Lib/idlelib/idle_test/test_autocomplete.py +++ b/Lib/idlelib/idle_test/test_autocomplete.py @@ -3,6 +3,7 @@ import unittest from test.support import requires from tkinter import Tk, Text +import __main__ import idlelib.autocomplete as ac import idlelib.autocomplete_w as acw @@ -35,7 +36,7 @@ def tearDownClass(cls): del cls.root def setUp(self): - self.editor.text.delete('1.0', 'end') + self.text.delete('1.0', 'end') self.autocomplete = ac.AutoComplete(self.editor) def test_init(self): @@ -132,12 +133,16 @@ def test_fetch_completions(self): # a small list containing non-private variables. # For file completion, a large list containing all files in the path, # and a small list containing files that do not start with '.' - pass + small, large = self.autocomplete.fetch_completions( + '', ac.COMPLETE_ATTRIBUTES) + self.assertLess(len(small), len(large)) + if __main__.__file__ != ac.__file__: + self.assertNotIn('AutoComplete', small) # See issue 36405. def test_get_entity(self): # Test that a name is in the namespace of sys.modules and # __main__.__dict__ - pass + self.assertEqual(self.autocomplete.get_entity('int'), int) if __name__ == '__main__': diff --git a/Misc/NEWS.d/next/IDLE/2019-03-23-01-45-56.bpo-36405.m7Wv1F.rst b/Misc/NEWS.d/next/IDLE/2019-03-23-01-45-56.bpo-36405.m7Wv1F.rst index 619ab6af80c9..bef438d5a5a7 100644 --- a/Misc/NEWS.d/next/IDLE/2019-03-23-01-45-56.bpo-36405.m7Wv1F.rst +++ b/Misc/NEWS.d/next/IDLE/2019-03-23-01-45-56.bpo-36405.m7Wv1F.rst @@ -1 +1 @@ -Use dict unpacking in idlelib and remove unneeded __main__ imports. +Use dict unpacking in idlelib. From webhook-mailer at python.org Sun Mar 24 17:56:31 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 24 Mar 2019 21:56:31 -0000 Subject: [Python-checkins] bpo-31822: Document that urllib.parse.{Defrag, Split, Parse}Result are namedtuples (GH-4434) Message-ID: https://github.com/python/cpython/commit/fc0010236341a32db7a3703f21e0bddbb36103dd commit: fc0010236341a32db7a3703f21e0bddbb36103dd branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-24T14:56:27-07:00 summary: bpo-31822: Document that urllib.parse.{Defrag,Split,Parse}Result are namedtuples (GH-4434) (cherry picked from commit 13c1f72cd1d91fdc2654f2f57356b2eacb75f164) Co-authored-by: Lisa Roach files: M Doc/library/urllib.parse.rst diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst index b565e1edd321..ddc3ee23f48a 100644 --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -39,8 +39,9 @@ or on combining URL components into a URL string. .. function:: urlparse(urlstring, scheme='', allow_fragments=True) - Parse a URL into six components, returning a 6-tuple. This corresponds to the - general structure of a URL: ``scheme://netloc/path;parameters?query#fragment``. + Parse a URL into six components, returning a 6-item :term:`named tuple`. This + corresponds to the general structure of a URL: + ``scheme://netloc/path;parameters?query#fragment``. Each tuple item is a string, possibly empty. The components are not broken up in smaller parts (for example, the network location is a single string), and % escapes are not expanded. The delimiters as shown above are not part of the @@ -88,8 +89,8 @@ or on combining URL components into a URL string. or query component, and :attr:`fragment` is set to the empty string in the return value. - The return value is actually an instance of a subclass of :class:`tuple`. This - class has the following additional read-only convenience attributes: + The return value is a :term:`named tuple`, which means that its items can + be accessed by index or as named attributes, which are: +------------------+-------+--------------------------+----------------------+ | Attribute | Index | Value | Value if not present | @@ -129,6 +130,24 @@ or on combining URL components into a URL string. ``#``, ``@``, or ``:`` will raise a :exc:`ValueError`. If the URL is decomposed before parsing, no error will be raised. + As is the case with all named tuples, the subclass has a few additional methods + and attributes that are particularly useful. One such method is :meth:`_replace`. + The :meth:`_replace` method will return a new ParseResult object replacing specified + fields with new values. + + .. doctest:: + :options: +NORMALIZE_WHITESPACE + + >>> from urllib.parse import urlparse + >>> u = urlparse('//www.cwi.nl:80/%7Eguido/Python.html') + >>> u + ParseResult(scheme='', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html', + params='', query='', fragment='') + >>> u._replace(scheme='http') + ParseResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html', + params='', query='', fragment='') + + .. versionchanged:: 3.2 Added IPv6 URL parsing capabilities. @@ -230,11 +249,13 @@ or on combining URL components into a URL string. This should generally be used instead of :func:`urlparse` if the more recent URL syntax allowing parameters to be applied to each segment of the *path* portion of the URL (see :rfc:`2396`) is wanted. A separate function is needed to - separate the path segments and parameters. This function returns a 5-tuple: - (addressing scheme, network location, path, query, fragment identifier). + separate the path segments and parameters. This function returns a 5-item + :term:`named tuple`:: + + (addressing scheme, network location, path, query, fragment identifier). - The return value is actually an instance of a subclass of :class:`tuple`. This - class has the following additional read-only convenience attributes: + The return value is a :term:`named tuple`, its items can be accessed by index + or as named attributes: +------------------+-------+-------------------------+----------------------+ | Attribute | Index | Value | Value if not present | @@ -330,8 +351,8 @@ or on combining URL components into a URL string. string. If there is no fragment identifier in *url*, return *url* unmodified and an empty string. - The return value is actually an instance of a subclass of :class:`tuple`. This - class has the following additional read-only convenience attributes: + The return value is a :term:`named tuple`, its items can be accessed by index + or as named attributes: +------------------+-------+-------------------------+----------------------+ | Attribute | Index | Value | Value if not present | From webhook-mailer at python.org Sun Mar 24 19:33:17 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Sun, 24 Mar 2019 23:33:17 -0000 Subject: [Python-checkins] bpo-30348: IDLE: Add test_autocomplete unittest (GH-2209) Message-ID: https://github.com/python/cpython/commit/113d735e2091427f9623097d2a222dd99b16b568 commit: 113d735e2091427f9623097d2a222dd99b16b568 branch: master author: Louie Lu committer: Terry Jan Reedy date: 2019-03-24T19:33:12-04:00 summary: bpo-30348: IDLE: Add test_autocomplete unittest (GH-2209) files: A Misc/NEWS.d/next/IDLE/2018-06-27-21-18-41.bpo-30348.WbaRJW.rst M Lib/idlelib/autocomplete.py M Lib/idlelib/idle_test/test_autocomplete.py diff --git a/Lib/idlelib/autocomplete.py b/Lib/idlelib/autocomplete.py index d57e9c9000fa..e20b757d8710 100644 --- a/Lib/idlelib/autocomplete.py +++ b/Lib/idlelib/autocomplete.py @@ -104,9 +104,14 @@ def _delayed_open_completions(self, *args): def open_completions(self, evalfuncs, complete, userWantsWin, mode=None): """Find the completions and create the AutoCompleteWindow. Return True if successful (no syntax error or so found). - if complete is True, then if there's nothing to complete and no + If complete is True, then if there's nothing to complete and no start of completion, won't open completions and return False. If mode is given, will open a completion list only in this mode. + + Action Function Eval Complete WantWin Mode + ^space force_open_completions True, False, True no + . or / try_open_completions False, False, False yes + tab autocomplete False, True, True no """ # Cancel another delayed call, if it exists. if self._delayed_completion_id is not None: @@ -117,11 +122,11 @@ def open_completions(self, evalfuncs, complete, userWantsWin, mode=None): curline = self.text.get("insert linestart", "insert") i = j = len(curline) if hp.is_in_string() and (not mode or mode==COMPLETE_FILES): - # Find the beginning of the string - # fetch_completions will look at the file system to determine whether the - # string value constitutes an actual file name - # XXX could consider raw strings here and unescape the string value if it's - # not raw. + # Find the beginning of the string. + # fetch_completions will look at the file system to determine + # whether the string value constitutes an actual file name + # XXX could consider raw strings here and unescape the string + # value if it's not raw. self._remove_autocomplete_window() mode = COMPLETE_FILES # Find last separator or string start diff --git a/Lib/idlelib/idle_test/test_autocomplete.py b/Lib/idlelib/idle_test/test_autocomplete.py index 89a9ed11df40..398cb359e093 100644 --- a/Lib/idlelib/idle_test/test_autocomplete.py +++ b/Lib/idlelib/idle_test/test_autocomplete.py @@ -1,8 +1,10 @@ -"Test autocomplete, coverage 57%." +"Test autocomplete, coverage 87%." import unittest +from unittest.mock import Mock, patch from test.support import requires from tkinter import Tk, Text +import os import __main__ import idlelib.autocomplete as ac @@ -26,12 +28,14 @@ class AutoCompleteTest(unittest.TestCase): def setUpClass(cls): requires('gui') cls.root = Tk() + cls.root.withdraw() cls.text = Text(cls.root) cls.editor = DummyEditwin(cls.root, cls.text) @classmethod def tearDownClass(cls): del cls.editor, cls.text + cls.root.update_idletasks() cls.root.destroy() del cls.root @@ -53,7 +57,7 @@ def test_remove_autocomplete_window(self): self.assertIsNone(self.autocomplete.autocompletewindow) def test_force_open_completions_event(self): - # Test that force_open_completions_event calls _open_completions + # Test that force_open_completions_event calls _open_completions. o_cs = Func() self.autocomplete.open_completions = o_cs self.autocomplete.force_open_completions_event('event') @@ -66,16 +70,16 @@ def test_try_open_completions_event(self): o_c_l = Func() autocomplete._open_completions_later = o_c_l - # _open_completions_later should not be called with no text in editor + # _open_completions_later should not be called with no text in editor. trycompletions('event') Equal(o_c_l.args, None) - # _open_completions_later should be called with COMPLETE_ATTRIBUTES (1) + # _open_completions_later should be called with COMPLETE_ATTRIBUTES (1). self.text.insert('1.0', 're.') trycompletions('event') Equal(o_c_l.args, (False, False, False, 1)) - # _open_completions_later should be called with COMPLETE_FILES (2) + # _open_completions_later should be called with COMPLETE_FILES (2). self.text.delete('1.0', 'end') self.text.insert('1.0', '"./Lib/') trycompletions('event') @@ -86,7 +90,7 @@ def test_autocomplete_event(self): autocomplete = self.autocomplete # Test that the autocomplete event is ignored if user is pressing a - # modifier key in addition to the tab key + # modifier key in addition to the tab key. ev = Event(mc_state=True) self.assertIsNone(autocomplete.autocomplete_event(ev)) del ev.mc_state @@ -96,15 +100,15 @@ def test_autocomplete_event(self): self.assertIsNone(autocomplete.autocomplete_event(ev)) self.text.delete('1.0', 'end') - # If autocomplete window is open, complete() method is called + # If autocomplete window is open, complete() method is called. self.text.insert('1.0', 're.') - # This must call autocomplete._make_autocomplete_window() + # This must call autocomplete._make_autocomplete_window(). Equal(self.autocomplete.autocomplete_event(ev), 'break') # If autocomplete window is not active or does not exist, # open_completions is called. Return depends on its return. autocomplete._remove_autocomplete_window() - o_cs = Func() # .result = None + o_cs = Func() # .result = None. autocomplete.open_completions = o_cs Equal(self.autocomplete.autocomplete_event(ev), None) Equal(o_cs.args, (False, True, True)) @@ -113,36 +117,130 @@ def test_autocomplete_event(self): Equal(o_cs.args, (False, True, True)) def test_open_completions_later(self): - # Test that autocomplete._delayed_completion_id is set - pass + # Test that autocomplete._delayed_completion_id is set. + acp = self.autocomplete + acp._delayed_completion_id = None + acp._open_completions_later(False, False, False, ac.COMPLETE_ATTRIBUTES) + cb1 = acp._delayed_completion_id + self.assertTrue(cb1.startswith('after')) + + # Test that cb1 is cancelled and cb2 is new. + acp._open_completions_later(False, False, False, ac.COMPLETE_FILES) + self.assertNotIn(cb1, self.root.tk.call('after', 'info')) + cb2 = acp._delayed_completion_id + self.assertTrue(cb2.startswith('after') and cb2 != cb1) + self.text.after_cancel(cb2) def test_delayed_open_completions(self): - # Test that autocomplete._delayed_completion_id set to None and that - # open_completions only called if insertion index is the same as - # _delayed_completion_index - pass + # Test that autocomplete._delayed_completion_id set to None + # and that open_completions is not called if the index is not + # equal to _delayed_completion_index. + acp = self.autocomplete + acp.open_completions = Func() + acp._delayed_completion_id = 'after' + acp._delayed_completion_index = self.text.index('insert+1c') + acp._delayed_open_completions(1, 2, 3) + self.assertIsNone(acp._delayed_completion_id) + self.assertEqual(acp.open_completions.called, 0) + + # Test that open_completions is called if indexes match. + acp._delayed_completion_index = self.text.index('insert') + acp._delayed_open_completions(1, 2, 3, ac.COMPLETE_FILES) + self.assertEqual(acp.open_completions.args, (1, 2, 3, 2)) def test_open_completions(self): # Test completions of files and attributes as well as non-completion - # of errors - pass + # of errors. + self.text.insert('1.0', 'pr') + self.assertTrue(self.autocomplete.open_completions(False, True, True)) + self.text.delete('1.0', 'end') + + # Test files. + self.text.insert('1.0', '"t') + #self.assertTrue(self.autocomplete.open_completions(False, True, True)) + self.text.delete('1.0', 'end') + + # Test with blank will fail. + self.assertFalse(self.autocomplete.open_completions(False, True, True)) + + # Test with only string quote will fail. + self.text.insert('1.0', '"') + self.assertFalse(self.autocomplete.open_completions(False, True, True)) + self.text.delete('1.0', 'end') def test_fetch_completions(self): # Test that fetch_completions returns 2 lists: # For attribute completion, a large list containing all variables, and # a small list containing non-private variables. # For file completion, a large list containing all files in the path, - # and a small list containing files that do not start with '.' + # and a small list containing files that do not start with '.'. + autocomplete = self.autocomplete small, large = self.autocomplete.fetch_completions( '', ac.COMPLETE_ATTRIBUTES) - self.assertLess(len(small), len(large)) if __main__.__file__ != ac.__file__: self.assertNotIn('AutoComplete', small) # See issue 36405. + # Test attributes + s, b = autocomplete.fetch_completions('', ac.COMPLETE_ATTRIBUTES) + self.assertLess(len(small), len(large)) + self.assertTrue(all(filter(lambda x: x.startswith('_'), s))) + self.assertTrue(any(filter(lambda x: x.startswith('_'), b))) + + # Test smalll should respect to __all__. + with patch.dict('__main__.__dict__', {'__all__': ['a', 'b']}): + s, b = autocomplete.fetch_completions('', ac.COMPLETE_ATTRIBUTES) + self.assertEqual(s, ['a', 'b']) + self.assertIn('__name__', b) # From __main__.__dict__ + self.assertIn('sum', b) # From __main__.__builtins__.__dict__ + + # Test attributes with name entity. + mock = Mock() + mock._private = Mock() + with patch.dict('__main__.__dict__', {'foo': mock}): + s, b = autocomplete.fetch_completions('foo', ac.COMPLETE_ATTRIBUTES) + self.assertNotIn('_private', s) + self.assertIn('_private', b) + self.assertEqual(s, [i for i in sorted(dir(mock)) if i[:1] != '_']) + self.assertEqual(b, sorted(dir(mock))) + + # Test files + def _listdir(path): + # This will be patch and used in fetch_completions. + if path == '.': + return ['foo', 'bar', '.hidden'] + return ['monty', 'python', '.hidden'] + + with patch.object(os, 'listdir', _listdir): + s, b = autocomplete.fetch_completions('', ac.COMPLETE_FILES) + self.assertEqual(s, ['bar', 'foo']) + self.assertEqual(b, ['.hidden', 'bar', 'foo']) + + s, b = autocomplete.fetch_completions('~', ac.COMPLETE_FILES) + self.assertEqual(s, ['monty', 'python']) + self.assertEqual(b, ['.hidden', 'monty', 'python']) + def test_get_entity(self): # Test that a name is in the namespace of sys.modules and - # __main__.__dict__ - self.assertEqual(self.autocomplete.get_entity('int'), int) + # __main__.__dict__. + autocomplete = self.autocomplete + Equal = self.assertEqual + + Equal(self.autocomplete.get_entity('int'), int) + + # Test name from sys.modules. + mock = Mock() + with patch.dict('sys.modules', {'tempfile': mock}): + Equal(autocomplete.get_entity('tempfile'), mock) + + # Test name from __main__.__dict__. + di = {'foo': 10, 'bar': 20} + with patch.dict('__main__.__dict__', {'d': di}): + Equal(autocomplete.get_entity('d'), di) + + # Test name not in namespace. + with patch.dict('__main__.__dict__', {}): + with self.assertRaises(NameError): + autocomplete.get_entity('not_exist') if __name__ == '__main__': diff --git a/Misc/NEWS.d/next/IDLE/2018-06-27-21-18-41.bpo-30348.WbaRJW.rst b/Misc/NEWS.d/next/IDLE/2018-06-27-21-18-41.bpo-30348.WbaRJW.rst new file mode 100644 index 000000000000..f665241670c7 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2018-06-27-21-18-41.bpo-30348.WbaRJW.rst @@ -0,0 +1 @@ +Increase test coverage of idlelib.autocomplete by 30%. From webhook-mailer at python.org Sun Mar 24 19:53:16 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 24 Mar 2019 23:53:16 -0000 Subject: [Python-checkins] bpo-30348: IDLE: Add test_autocomplete unittest (GH-2209) Message-ID: https://github.com/python/cpython/commit/0e05d8a82dedf6f020b71a780507fb45ad5fd00f commit: 0e05d8a82dedf6f020b71a780507fb45ad5fd00f branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-24T16:53:13-07:00 summary: bpo-30348: IDLE: Add test_autocomplete unittest (GH-2209) (cherry picked from commit 113d735e2091427f9623097d2a222dd99b16b568) Co-authored-by: Louie Lu files: A Misc/NEWS.d/next/IDLE/2018-06-27-21-18-41.bpo-30348.WbaRJW.rst M Lib/idlelib/autocomplete.py M Lib/idlelib/idle_test/test_autocomplete.py diff --git a/Lib/idlelib/autocomplete.py b/Lib/idlelib/autocomplete.py index d57e9c9000fa..e20b757d8710 100644 --- a/Lib/idlelib/autocomplete.py +++ b/Lib/idlelib/autocomplete.py @@ -104,9 +104,14 @@ def _delayed_open_completions(self, *args): def open_completions(self, evalfuncs, complete, userWantsWin, mode=None): """Find the completions and create the AutoCompleteWindow. Return True if successful (no syntax error or so found). - if complete is True, then if there's nothing to complete and no + If complete is True, then if there's nothing to complete and no start of completion, won't open completions and return False. If mode is given, will open a completion list only in this mode. + + Action Function Eval Complete WantWin Mode + ^space force_open_completions True, False, True no + . or / try_open_completions False, False, False yes + tab autocomplete False, True, True no """ # Cancel another delayed call, if it exists. if self._delayed_completion_id is not None: @@ -117,11 +122,11 @@ def open_completions(self, evalfuncs, complete, userWantsWin, mode=None): curline = self.text.get("insert linestart", "insert") i = j = len(curline) if hp.is_in_string() and (not mode or mode==COMPLETE_FILES): - # Find the beginning of the string - # fetch_completions will look at the file system to determine whether the - # string value constitutes an actual file name - # XXX could consider raw strings here and unescape the string value if it's - # not raw. + # Find the beginning of the string. + # fetch_completions will look at the file system to determine + # whether the string value constitutes an actual file name + # XXX could consider raw strings here and unescape the string + # value if it's not raw. self._remove_autocomplete_window() mode = COMPLETE_FILES # Find last separator or string start diff --git a/Lib/idlelib/idle_test/test_autocomplete.py b/Lib/idlelib/idle_test/test_autocomplete.py index 89a9ed11df40..398cb359e093 100644 --- a/Lib/idlelib/idle_test/test_autocomplete.py +++ b/Lib/idlelib/idle_test/test_autocomplete.py @@ -1,8 +1,10 @@ -"Test autocomplete, coverage 57%." +"Test autocomplete, coverage 87%." import unittest +from unittest.mock import Mock, patch from test.support import requires from tkinter import Tk, Text +import os import __main__ import idlelib.autocomplete as ac @@ -26,12 +28,14 @@ class AutoCompleteTest(unittest.TestCase): def setUpClass(cls): requires('gui') cls.root = Tk() + cls.root.withdraw() cls.text = Text(cls.root) cls.editor = DummyEditwin(cls.root, cls.text) @classmethod def tearDownClass(cls): del cls.editor, cls.text + cls.root.update_idletasks() cls.root.destroy() del cls.root @@ -53,7 +57,7 @@ def test_remove_autocomplete_window(self): self.assertIsNone(self.autocomplete.autocompletewindow) def test_force_open_completions_event(self): - # Test that force_open_completions_event calls _open_completions + # Test that force_open_completions_event calls _open_completions. o_cs = Func() self.autocomplete.open_completions = o_cs self.autocomplete.force_open_completions_event('event') @@ -66,16 +70,16 @@ def test_try_open_completions_event(self): o_c_l = Func() autocomplete._open_completions_later = o_c_l - # _open_completions_later should not be called with no text in editor + # _open_completions_later should not be called with no text in editor. trycompletions('event') Equal(o_c_l.args, None) - # _open_completions_later should be called with COMPLETE_ATTRIBUTES (1) + # _open_completions_later should be called with COMPLETE_ATTRIBUTES (1). self.text.insert('1.0', 're.') trycompletions('event') Equal(o_c_l.args, (False, False, False, 1)) - # _open_completions_later should be called with COMPLETE_FILES (2) + # _open_completions_later should be called with COMPLETE_FILES (2). self.text.delete('1.0', 'end') self.text.insert('1.0', '"./Lib/') trycompletions('event') @@ -86,7 +90,7 @@ def test_autocomplete_event(self): autocomplete = self.autocomplete # Test that the autocomplete event is ignored if user is pressing a - # modifier key in addition to the tab key + # modifier key in addition to the tab key. ev = Event(mc_state=True) self.assertIsNone(autocomplete.autocomplete_event(ev)) del ev.mc_state @@ -96,15 +100,15 @@ def test_autocomplete_event(self): self.assertIsNone(autocomplete.autocomplete_event(ev)) self.text.delete('1.0', 'end') - # If autocomplete window is open, complete() method is called + # If autocomplete window is open, complete() method is called. self.text.insert('1.0', 're.') - # This must call autocomplete._make_autocomplete_window() + # This must call autocomplete._make_autocomplete_window(). Equal(self.autocomplete.autocomplete_event(ev), 'break') # If autocomplete window is not active or does not exist, # open_completions is called. Return depends on its return. autocomplete._remove_autocomplete_window() - o_cs = Func() # .result = None + o_cs = Func() # .result = None. autocomplete.open_completions = o_cs Equal(self.autocomplete.autocomplete_event(ev), None) Equal(o_cs.args, (False, True, True)) @@ -113,36 +117,130 @@ def test_autocomplete_event(self): Equal(o_cs.args, (False, True, True)) def test_open_completions_later(self): - # Test that autocomplete._delayed_completion_id is set - pass + # Test that autocomplete._delayed_completion_id is set. + acp = self.autocomplete + acp._delayed_completion_id = None + acp._open_completions_later(False, False, False, ac.COMPLETE_ATTRIBUTES) + cb1 = acp._delayed_completion_id + self.assertTrue(cb1.startswith('after')) + + # Test that cb1 is cancelled and cb2 is new. + acp._open_completions_later(False, False, False, ac.COMPLETE_FILES) + self.assertNotIn(cb1, self.root.tk.call('after', 'info')) + cb2 = acp._delayed_completion_id + self.assertTrue(cb2.startswith('after') and cb2 != cb1) + self.text.after_cancel(cb2) def test_delayed_open_completions(self): - # Test that autocomplete._delayed_completion_id set to None and that - # open_completions only called if insertion index is the same as - # _delayed_completion_index - pass + # Test that autocomplete._delayed_completion_id set to None + # and that open_completions is not called if the index is not + # equal to _delayed_completion_index. + acp = self.autocomplete + acp.open_completions = Func() + acp._delayed_completion_id = 'after' + acp._delayed_completion_index = self.text.index('insert+1c') + acp._delayed_open_completions(1, 2, 3) + self.assertIsNone(acp._delayed_completion_id) + self.assertEqual(acp.open_completions.called, 0) + + # Test that open_completions is called if indexes match. + acp._delayed_completion_index = self.text.index('insert') + acp._delayed_open_completions(1, 2, 3, ac.COMPLETE_FILES) + self.assertEqual(acp.open_completions.args, (1, 2, 3, 2)) def test_open_completions(self): # Test completions of files and attributes as well as non-completion - # of errors - pass + # of errors. + self.text.insert('1.0', 'pr') + self.assertTrue(self.autocomplete.open_completions(False, True, True)) + self.text.delete('1.0', 'end') + + # Test files. + self.text.insert('1.0', '"t') + #self.assertTrue(self.autocomplete.open_completions(False, True, True)) + self.text.delete('1.0', 'end') + + # Test with blank will fail. + self.assertFalse(self.autocomplete.open_completions(False, True, True)) + + # Test with only string quote will fail. + self.text.insert('1.0', '"') + self.assertFalse(self.autocomplete.open_completions(False, True, True)) + self.text.delete('1.0', 'end') def test_fetch_completions(self): # Test that fetch_completions returns 2 lists: # For attribute completion, a large list containing all variables, and # a small list containing non-private variables. # For file completion, a large list containing all files in the path, - # and a small list containing files that do not start with '.' + # and a small list containing files that do not start with '.'. + autocomplete = self.autocomplete small, large = self.autocomplete.fetch_completions( '', ac.COMPLETE_ATTRIBUTES) - self.assertLess(len(small), len(large)) if __main__.__file__ != ac.__file__: self.assertNotIn('AutoComplete', small) # See issue 36405. + # Test attributes + s, b = autocomplete.fetch_completions('', ac.COMPLETE_ATTRIBUTES) + self.assertLess(len(small), len(large)) + self.assertTrue(all(filter(lambda x: x.startswith('_'), s))) + self.assertTrue(any(filter(lambda x: x.startswith('_'), b))) + + # Test smalll should respect to __all__. + with patch.dict('__main__.__dict__', {'__all__': ['a', 'b']}): + s, b = autocomplete.fetch_completions('', ac.COMPLETE_ATTRIBUTES) + self.assertEqual(s, ['a', 'b']) + self.assertIn('__name__', b) # From __main__.__dict__ + self.assertIn('sum', b) # From __main__.__builtins__.__dict__ + + # Test attributes with name entity. + mock = Mock() + mock._private = Mock() + with patch.dict('__main__.__dict__', {'foo': mock}): + s, b = autocomplete.fetch_completions('foo', ac.COMPLETE_ATTRIBUTES) + self.assertNotIn('_private', s) + self.assertIn('_private', b) + self.assertEqual(s, [i for i in sorted(dir(mock)) if i[:1] != '_']) + self.assertEqual(b, sorted(dir(mock))) + + # Test files + def _listdir(path): + # This will be patch and used in fetch_completions. + if path == '.': + return ['foo', 'bar', '.hidden'] + return ['monty', 'python', '.hidden'] + + with patch.object(os, 'listdir', _listdir): + s, b = autocomplete.fetch_completions('', ac.COMPLETE_FILES) + self.assertEqual(s, ['bar', 'foo']) + self.assertEqual(b, ['.hidden', 'bar', 'foo']) + + s, b = autocomplete.fetch_completions('~', ac.COMPLETE_FILES) + self.assertEqual(s, ['monty', 'python']) + self.assertEqual(b, ['.hidden', 'monty', 'python']) + def test_get_entity(self): # Test that a name is in the namespace of sys.modules and - # __main__.__dict__ - self.assertEqual(self.autocomplete.get_entity('int'), int) + # __main__.__dict__. + autocomplete = self.autocomplete + Equal = self.assertEqual + + Equal(self.autocomplete.get_entity('int'), int) + + # Test name from sys.modules. + mock = Mock() + with patch.dict('sys.modules', {'tempfile': mock}): + Equal(autocomplete.get_entity('tempfile'), mock) + + # Test name from __main__.__dict__. + di = {'foo': 10, 'bar': 20} + with patch.dict('__main__.__dict__', {'d': di}): + Equal(autocomplete.get_entity('d'), di) + + # Test name not in namespace. + with patch.dict('__main__.__dict__', {}): + with self.assertRaises(NameError): + autocomplete.get_entity('not_exist') if __name__ == '__main__': diff --git a/Misc/NEWS.d/next/IDLE/2018-06-27-21-18-41.bpo-30348.WbaRJW.rst b/Misc/NEWS.d/next/IDLE/2018-06-27-21-18-41.bpo-30348.WbaRJW.rst new file mode 100644 index 000000000000..f665241670c7 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2018-06-27-21-18-41.bpo-30348.WbaRJW.rst @@ -0,0 +1 @@ +Increase test coverage of idlelib.autocomplete by 30%. From webhook-mailer at python.org Sun Mar 24 20:07:50 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Mon, 25 Mar 2019 00:07:50 -0000 Subject: [Python-checkins] bpo-36401: Have help() show readonly properties separately (GH-12517) Message-ID: https://github.com/python/cpython/commit/62be33870e2f8517314bf9c7275548e799296f7e commit: 62be33870e2f8517314bf9c7275548e799296f7e branch: master author: Raymond Hettinger committer: GitHub date: 2019-03-24T17:07:47-07:00 summary: bpo-36401: Have help() show readonly properties separately (GH-12517) files: A Misc/NEWS.d/next/Library/2019-03-23-10-25-07.bpo-36401.hYpVBS.rst M Lib/pydoc.py M Lib/test/test_enum.py diff --git a/Lib/pydoc.py b/Lib/pydoc.py index daa7205bd74e..2f570e4dc5de 100644 --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -203,6 +203,8 @@ def classify_class_attrs(object): for (name, kind, cls, value) in inspect.classify_class_attrs(object): if inspect.isdatadescriptor(value): kind = 'data descriptor' + if isinstance(value, property) and value.fset is None: + kind = 'readonly property' results.append((name, kind, cls, value)) return results @@ -884,6 +886,8 @@ def spilldata(msg, attrs, predicate): lambda t: t[1] == 'class method') attrs = spill('Static methods %s' % tag, attrs, lambda t: t[1] == 'static method') + attrs = spilldescriptors("Readonly properties %s:\n" % tag, attrs, + lambda t: t[1] == 'readonly property') attrs = spilldescriptors('Data descriptors %s' % tag, attrs, lambda t: t[1] == 'data descriptor') attrs = spilldata('Data and other attributes %s' % tag, attrs, @@ -1341,6 +1345,8 @@ def spilldata(msg, attrs, predicate): lambda t: t[1] == 'class method') attrs = spill("Static methods %s:\n" % tag, attrs, lambda t: t[1] == 'static method') + attrs = spilldescriptors("Readonly properties %s:\n" % tag, attrs, + lambda t: t[1] == 'readonly property') attrs = spilldescriptors("Data descriptors %s:\n" % tag, attrs, lambda t: t[1] == 'data descriptor') attrs = spilldata("Data and other attributes %s:\n" % tag, attrs, diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index 770decf2f4bf..47081cf75ca0 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -2825,7 +2825,7 @@ class Color(enum.Enum) | The value of the Enum member. |\x20\x20 | ---------------------------------------------------------------------- - | Data descriptors inherited from enum.EnumMeta: + | Readonly properties inherited from enum.EnumMeta: |\x20\x20 | __members__ | Returns a mapping of member name->value. diff --git a/Misc/NEWS.d/next/Library/2019-03-23-10-25-07.bpo-36401.hYpVBS.rst b/Misc/NEWS.d/next/Library/2019-03-23-10-25-07.bpo-36401.hYpVBS.rst new file mode 100644 index 000000000000..cf097d7ed4ad --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-23-10-25-07.bpo-36401.hYpVBS.rst @@ -0,0 +1,2 @@ +The class documentation created by pydoc now has a separate section for +readonly properties. From webhook-mailer at python.org Mon Mar 25 03:23:57 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Mon, 25 Mar 2019 07:23:57 -0000 Subject: [Python-checkins] Fix line ending (GH-12531) Message-ID: https://github.com/python/cpython/commit/9dcc095f45278eed465f54f324327d0375d73b19 commit: 9dcc095f45278eed465f54f324327d0375d73b19 branch: master author: Raymond Hettinger committer: GitHub date: 2019-03-25T00:23:39-07:00 summary: Fix line ending (GH-12531) files: M Lib/pydoc.py diff --git a/Lib/pydoc.py b/Lib/pydoc.py index 2f570e4dc5de..0cf3d3359624 100644 --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -886,7 +886,7 @@ def spilldata(msg, attrs, predicate): lambda t: t[1] == 'class method') attrs = spill('Static methods %s' % tag, attrs, lambda t: t[1] == 'static method') - attrs = spilldescriptors("Readonly properties %s:\n" % tag, attrs, + attrs = spilldescriptors("Readonly properties %s" % tag, attrs, lambda t: t[1] == 'readonly property') attrs = spilldescriptors('Data descriptors %s' % tag, attrs, lambda t: t[1] == 'data descriptor') From webhook-mailer at python.org Mon Mar 25 03:25:40 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Mon, 25 Mar 2019 07:25:40 -0000 Subject: [Python-checkins] bpo-36218: Fix handling of heterogeneous values in list.sort (GH-12209) Message-ID: https://github.com/python/cpython/commit/dd5417afcf8924bcdd7077351941ad21727ef644 commit: dd5417afcf8924bcdd7077351941ad21727ef644 branch: master author: R?mi Lapeyre committer: Raymond Hettinger date: 2019-03-25T00:25:37-07:00 summary: bpo-36218: Fix handling of heterogeneous values in list.sort (GH-12209) files: A Misc/NEWS.d/next/Core and Builtins/2019-03-07-13-05-43.bpo-36218.dZemNt.rst M Lib/test/test_sort.py M Objects/listobject.c diff --git a/Lib/test/test_sort.py b/Lib/test/test_sort.py index f2f53cb1a72f..41de4b684f62 100644 --- a/Lib/test/test_sort.py +++ b/Lib/test/test_sort.py @@ -373,6 +373,11 @@ def test_unsafe_tuple_compare(self): check_against_PyObject_RichCompareBool(self, [float('nan')]*100) check_against_PyObject_RichCompareBool(self, [float('nan') for _ in range(100)]) + + def test_not_all_tuples(self): + self.assertRaises(TypeError, [(1.0, 1.0), (False, "A"), 6].sort) + self.assertRaises(TypeError, [('a', 1), (1, 'a')].sort) + self.assertRaises(TypeError, [(1, 'a'), ('a', 1)].sort) #============================================================================== if __name__ == "__main__": diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-07-13-05-43.bpo-36218.dZemNt.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-07-13-05-43.bpo-36218.dZemNt.rst new file mode 100644 index 000000000000..ab6d207f37e2 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-07-13-05-43.bpo-36218.dZemNt.rst @@ -0,0 +1,2 @@ +Fix a segfault occuring when sorting a list of heterogeneous values. Patch +contributed by R?mi Lapeyre and Elliot Gorokhovsky. \ No newline at end of file diff --git a/Objects/listobject.c b/Objects/listobject.c index b6524e8bd7fc..c29954283c48 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -2306,19 +2306,28 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse) if (key->ob_type != key_type) { keys_are_all_same_type = 0; - break; + /* If keys are in tuple we must loop over the whole list to make + sure all items are tuples */ + if (!keys_are_in_tuples) { + break; + } } - if (key_type == &PyLong_Type) { - if (ints_are_bounded && Py_ABS(Py_SIZE(key)) > 1) + if (keys_are_all_same_type) { + if (key_type == &PyLong_Type && + ints_are_bounded && + Py_ABS(Py_SIZE(key)) > 1) { + ints_are_bounded = 0; + } + else if (key_type == &PyUnicode_Type && + strings_are_latin && + PyUnicode_KIND(key) != PyUnicode_1BYTE_KIND) { + + strings_are_latin = 0; + } + } } - else if (key_type == &PyUnicode_Type){ - if (strings_are_latin && - PyUnicode_KIND(key) != PyUnicode_1BYTE_KIND) - strings_are_latin = 0; - } - } /* Choose the best compare, given what we now know about the keys. */ if (keys_are_all_same_type) { @@ -2346,10 +2355,12 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse) if (keys_are_in_tuples) { /* Make sure we're not dealing with tuples of tuples * (remember: here, key_type refers list [key[0] for key in keys]) */ - if (key_type == &PyTuple_Type) + if (key_type == &PyTuple_Type) { ms.tuple_elem_compare = safe_object_compare; - else + } + else { ms.tuple_elem_compare = ms.key_compare; + } ms.key_compare = unsafe_tuple_compare; } From webhook-mailer at python.org Mon Mar 25 03:48:04 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Mon, 25 Mar 2019 07:48:04 -0000 Subject: [Python-checkins] bpo-36218: Fix handling of heterogeneous values in list.sort (GH-12209) GH-12532) Message-ID: https://github.com/python/cpython/commit/9dbb09fc27b99d2c08b8f56db71018eb828cc7cd commit: 9dbb09fc27b99d2c08b8f56db71018eb828cc7cd branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Raymond Hettinger date: 2019-03-25T00:47:55-07:00 summary: bpo-36218: Fix handling of heterogeneous values in list.sort (GH-12209) GH-12532) (cherry picked from commit dd5417afcf8924bcdd7077351941ad21727ef644) Co-authored-by: R?mi Lapeyre files: A Misc/NEWS.d/next/Core and Builtins/2019-03-07-13-05-43.bpo-36218.dZemNt.rst M Lib/test/test_sort.py M Objects/listobject.c diff --git a/Lib/test/test_sort.py b/Lib/test/test_sort.py index f2f53cb1a72f..41de4b684f62 100644 --- a/Lib/test/test_sort.py +++ b/Lib/test/test_sort.py @@ -373,6 +373,11 @@ def test_unsafe_tuple_compare(self): check_against_PyObject_RichCompareBool(self, [float('nan')]*100) check_against_PyObject_RichCompareBool(self, [float('nan') for _ in range(100)]) + + def test_not_all_tuples(self): + self.assertRaises(TypeError, [(1.0, 1.0), (False, "A"), 6].sort) + self.assertRaises(TypeError, [('a', 1), (1, 'a')].sort) + self.assertRaises(TypeError, [(1, 'a'), ('a', 1)].sort) #============================================================================== if __name__ == "__main__": diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-07-13-05-43.bpo-36218.dZemNt.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-07-13-05-43.bpo-36218.dZemNt.rst new file mode 100644 index 000000000000..ab6d207f37e2 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-07-13-05-43.bpo-36218.dZemNt.rst @@ -0,0 +1,2 @@ +Fix a segfault occuring when sorting a list of heterogeneous values. Patch +contributed by R?mi Lapeyre and Elliot Gorokhovsky. \ No newline at end of file diff --git a/Objects/listobject.c b/Objects/listobject.c index 7dc68a73bdb6..d795f66e6e05 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -2250,19 +2250,28 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse) if (key->ob_type != key_type) { keys_are_all_same_type = 0; - break; + /* If keys are in tuple we must loop over the whole list to make + sure all items are tuples */ + if (!keys_are_in_tuples) { + break; + } } - if (key_type == &PyLong_Type) { - if (ints_are_bounded && Py_ABS(Py_SIZE(key)) > 1) + if (keys_are_all_same_type) { + if (key_type == &PyLong_Type && + ints_are_bounded && + Py_ABS(Py_SIZE(key)) > 1) { + ints_are_bounded = 0; + } + else if (key_type == &PyUnicode_Type && + strings_are_latin && + PyUnicode_KIND(key) != PyUnicode_1BYTE_KIND) { + + strings_are_latin = 0; + } + } } - else if (key_type == &PyUnicode_Type){ - if (strings_are_latin && - PyUnicode_KIND(key) != PyUnicode_1BYTE_KIND) - strings_are_latin = 0; - } - } /* Choose the best compare, given what we now know about the keys. */ if (keys_are_all_same_type) { @@ -2290,10 +2299,12 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse) if (keys_are_in_tuples) { /* Make sure we're not dealing with tuples of tuples * (remember: here, key_type refers list [key[0] for key in keys]) */ - if (key_type == &PyTuple_Type) + if (key_type == &PyTuple_Type) { ms.tuple_elem_compare = safe_object_compare; - else + } + else { ms.tuple_elem_compare = ms.key_compare; + } ms.key_compare = unsafe_tuple_compare; } From webhook-mailer at python.org Mon Mar 25 04:07:55 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Mon, 25 Mar 2019 08:07:55 -0000 Subject: [Python-checkins] bpo-36421: Fix a possible double decref in _ctypes.c's PyCArrayType_new(). (GH-12530) Message-ID: https://github.com/python/cpython/commit/5e333784f007950f22de44c1ffab5b0c03d6691f commit: 5e333784f007950f22de44c1ffab5b0c03d6691f branch: master author: Zackery Spytz committer: Serhiy Storchaka date: 2019-03-25T10:07:47+02:00 summary: bpo-36421: Fix a possible double decref in _ctypes.c's PyCArrayType_new(). (GH-12530) Set type_attr to NULL after the assignment to stgdict->proto (like what is done with stgdict after the Py_SETREF() call) so that it is not decrefed twice on error. files: A Misc/NEWS.d/next/Core and Builtins/2019-03-24-21-33-22.bpo-36421.gJ2Pv9.rst M Modules/_ctypes/_ctypes.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-24-21-33-22.bpo-36421.gJ2Pv9.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-24-21-33-22.bpo-36421.gJ2Pv9.rst new file mode 100644 index 000000000000..2577511de2e2 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-24-21-33-22.bpo-36421.gJ2Pv9.rst @@ -0,0 +1 @@ +Fix a possible double decref in _ctypes.c's ``PyCArrayType_new()``. diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 0d95d2b6f76e..45102f3304ec 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -1522,6 +1522,7 @@ PyCArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) stgdict->align = itemalign; stgdict->length = length; stgdict->proto = type_attr; + type_attr = NULL; stgdict->paramfunc = &PyCArrayType_paramfunc; From webhook-mailer at python.org Mon Mar 25 04:21:02 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Mon, 25 Mar 2019 08:21:02 -0000 Subject: [Python-checkins] bpo-35884: Add string-keys-only microbenchmark for dict access to var_access_benchmark.py (GH-11905) Message-ID: https://github.com/python/cpython/commit/68d228f174ceed151200e7e0b44ffc5edd4e0ea2 commit: 68d228f174ceed151200e7e0b44ffc5edd4e0ea2 branch: master author: Stefan Behnel committer: Raymond Hettinger date: 2019-03-25T01:20:53-07:00 summary: bpo-35884: Add string-keys-only microbenchmark for dict access to var_access_benchmark.py (GH-11905) files: M Tools/scripts/var_access_benchmark.py diff --git a/Tools/scripts/var_access_benchmark.py b/Tools/scripts/var_access_benchmark.py index 44cb200da7a7..03b712d304ff 100644 --- a/Tools/scripts/var_access_benchmark.py +++ b/Tools/scripts/var_access_benchmark.py @@ -196,23 +196,31 @@ def read_dict(trials=trials, a={0: 1}): a[0]; a[0]; a[0]; a[0]; a[0] a[0]; a[0]; a[0]; a[0]; a[0] +def read_strdict(trials=trials, a={'key': 1}): + for t in trials: + a['key']; a['key']; a['key']; a['key']; a['key'] + a['key']; a['key']; a['key']; a['key']; a['key'] + a['key']; a['key']; a['key']; a['key']; a['key'] + a['key']; a['key']; a['key']; a['key']; a['key'] + a['key']; a['key']; a['key']; a['key']; a['key'] + def list_append_pop(trials=trials, a=[1]): ap, pop = a.append, a.pop for t in trials: - ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); - ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); - ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); - ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); - ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); + ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop() + ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop() + ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop() + ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop() + ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop() def deque_append_pop(trials=trials, a=deque([1])): ap, pop = a.append, a.pop for t in trials: - ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); - ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); - ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); - ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); - ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); + ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop() + ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop() + ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop() + ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop() + ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop() def deque_append_popleft(trials=trials, a=deque([1])): ap, pop = a.append, a.popleft @@ -247,6 +255,14 @@ def write_dict(trials=trials, a={0: 1}): a[0]=1; a[0]=1; a[0]=1; a[0]=1; a[0]=1 a[0]=1; a[0]=1; a[0]=1; a[0]=1; a[0]=1 +def write_strdict(trials=trials, a={'key': 1}): + for t in trials: + a['key']=1; a['key']=1; a['key']=1; a['key']=1; a['key']=1 + a['key']=1; a['key']=1; a['key']=1; a['key']=1; a['key']=1 + a['key']=1; a['key']=1; a['key']=1; a['key']=1; a['key']=1 + a['key']=1; a['key']=1; a['key']=1; a['key']=1; a['key']=1 + a['key']=1; a['key']=1; a['key']=1; a['key']=1; a['key']=1 + def loop_overhead(trials=trials): for t in trials: pass @@ -266,9 +282,9 @@ def loop_overhead(trials=trials): write_local, write_nonlocal, write_global, write_classvar, write_instancevar, write_instancevar_slots, '\nData structure read access:', - read_list, read_deque, read_dict, + read_list, read_deque, read_dict, read_strdict, '\nData structure write access:', - write_list, write_deque, write_dict, + write_list, write_deque, write_dict, write_strdict, '\nStack (or queue) operations:', list_append_pop, deque_append_pop, deque_append_popleft, '\nTiming loop overhead:', From webhook-mailer at python.org Mon Mar 25 04:34:31 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 25 Mar 2019 08:34:31 -0000 Subject: [Python-checkins] bpo-36421: Fix a possible double decref in _ctypes.c's PyCArrayType_new(). (GH-12530) Message-ID: https://github.com/python/cpython/commit/fa27870992a7228c8bf378d53649ee22333b69db commit: fa27870992a7228c8bf378d53649ee22333b69db branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-25T01:34:26-07:00 summary: bpo-36421: Fix a possible double decref in _ctypes.c's PyCArrayType_new(). (GH-12530) Set type_attr to NULL after the assignment to stgdict->proto (like what is done with stgdict after the Py_SETREF() call) so that it is not decrefed twice on error. (cherry picked from commit 5e333784f007950f22de44c1ffab5b0c03d6691f) Co-authored-by: Zackery Spytz files: A Misc/NEWS.d/next/Core and Builtins/2019-03-24-21-33-22.bpo-36421.gJ2Pv9.rst M Modules/_ctypes/_ctypes.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-24-21-33-22.bpo-36421.gJ2Pv9.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-24-21-33-22.bpo-36421.gJ2Pv9.rst new file mode 100644 index 000000000000..2577511de2e2 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-24-21-33-22.bpo-36421.gJ2Pv9.rst @@ -0,0 +1 @@ +Fix a possible double decref in _ctypes.c's ``PyCArrayType_new()``. diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index f98eabbb370b..48ad696e1078 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -1481,6 +1481,7 @@ PyCArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) stgdict->align = itemalign; stgdict->length = length; stgdict->proto = type_attr; + type_attr = NULL; stgdict->paramfunc = &PyCArrayType_paramfunc; From webhook-mailer at python.org Mon Mar 25 10:16:02 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Mon, 25 Mar 2019 14:16:02 -0000 Subject: [Python-checkins] [2.7] bpo-36421: Fix ref counting bugs in _ctypes.c's PyCArrayType_new(). (GH-12534) Message-ID: https://github.com/python/cpython/commit/0516f81828887a8ec34a3d5ed342dd396f367dcd commit: 0516f81828887a8ec34a3d5ed342dd396f367dcd branch: 2.7 author: Zackery Spytz committer: Serhiy Storchaka date: 2019-03-25T16:15:36+02:00 summary: [2.7] bpo-36421: Fix ref counting bugs in _ctypes.c's PyCArrayType_new(). (GH-12534) Add missing Py_DECREF()s. files: M Modules/_ctypes/_ctypes.c diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 8abcd30753a4..3a3aabbb6cb5 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -1537,6 +1537,7 @@ PyCArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) if (length * itemsize < 0) { PyErr_SetString(PyExc_OverflowError, "array too large"); + Py_DECREF(stgdict); return NULL; } @@ -1559,8 +1560,10 @@ PyCArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) /* create the new instance (which is a class, since we are a metatype!) */ result = (PyTypeObject *)PyType_Type.tp_new(type, args, kwds); - if (result == NULL) + if (result == NULL) { + Py_DECREF(stgdict); return NULL; + } /* replace the class dict by our updated spam dict */ if (-1 == PyDict_Update((PyObject *)stgdict, result->tp_dict)) { @@ -1574,12 +1577,16 @@ PyCArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) A permanent annoyance: char arrays are also strings! */ if (itemdict->getfunc == _ctypes_get_fielddesc("c")->getfunc) { - if (-1 == add_getset(result, CharArray_getsets)) + if (-1 == add_getset(result, CharArray_getsets)) { + Py_DECREF(result); return NULL; + } #ifdef CTYPES_UNICODE } else if (itemdict->getfunc == _ctypes_get_fielddesc("u")->getfunc) { - if (-1 == add_getset(result, WCharArray_getsets)) + if (-1 == add_getset(result, WCharArray_getsets)) { + Py_DECREF(result); return NULL; + } #endif } From webhook-mailer at python.org Mon Mar 25 12:55:11 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 25 Mar 2019 16:55:11 -0000 Subject: [Python-checkins] bpo-36301: Cleanup preconfig code (GH-12535) Message-ID: https://github.com/python/cpython/commit/f72346c47537657a287a862305f65eb5d7594fbf commit: f72346c47537657a287a862305f65eb5d7594fbf branch: master author: Victor Stinner committer: GitHub date: 2019-03-25T17:54:58+01:00 summary: bpo-36301: Cleanup preconfig code (GH-12535) Prepare code to move some _PyPreConfig parameters into _PyPreCmdline. Changes: * _PyCoreConfig_ReadFromArgv(): remove preconfig parameter, use _PyRuntime.preconfig. * Add _PyPreCmdline_GetPreConfig() (called by _PyPreConfig_Read()). * Rename _PyPreCmdline_Init() to _PyPreCmdline_SetArgv() * Factorize _Py_PreInitializeFromPreConfig() code: add pyinit_preinit(). * _PyPreConfig_Read() now sets coerce_c_locale to 2 if it must be coerced. * Remove _PyCoreConfig_ReadPreConfig(). * _PyCoreConfig_Write() now copies updated preconfig into _PyRuntime. files: M Include/cpython/coreconfig.h M Include/internal/pycore_coreconfig.h M Modules/main.c M Python/coreconfig.c M Python/pathconfig.c M Python/preconfig.c M Python/pylifecycle.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index bd28c371ce52..83622094f2ab 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -73,7 +73,12 @@ typedef struct { set to !Py_IgnoreEnvironmentFlag. */ int use_environment; - int coerce_c_locale; /* PYTHONCOERCECLOCALE, -1 means unknown */ + /* PYTHONCOERCECLOCALE, -1 means unknown. + + If it is equal to 1, LC_CTYPE locale is read to decide it it should be + coerced or not (ex: PYTHONCOERCECLOCALE=1). Internally, it is set to 2 + if the LC_CTYPE locale must be coerced. */ + int coerce_c_locale; int coerce_c_locale_warn; /* PYTHONCOERCECLOCALE=warn */ #ifdef MS_WINDOWS diff --git a/Include/internal/pycore_coreconfig.h b/Include/internal/pycore_coreconfig.h index 29261df5af75..949bc9b864d6 100644 --- a/Include/internal/pycore_coreconfig.h +++ b/Include/internal/pycore_coreconfig.h @@ -25,12 +25,12 @@ typedef struct { /* Note: _PyPreCmdline_INIT sets other fields to 0/NULL */ PyAPI_FUNC(void) _PyPreCmdline_Clear(_PyPreCmdline *cmdline); -PyAPI_FUNC(_PyInitError) _PyPreCmdline_Init(_PyPreCmdline *cmdline, +PyAPI_FUNC(_PyInitError) _PyPreCmdline_SetArgv(_PyPreCmdline *cmdline, const _PyArgv *args); -PyAPI_FUNC(_PyInitError) _PyPreCmdline_Read(_PyPreCmdline *cmdline); PyAPI_FUNC(void) _PyPreCmdline_SetPreConfig( const _PyPreCmdline *cmdline, _PyPreConfig *config); +PyAPI_FUNC(_PyInitError) _PyPreCmdline_Read(_PyPreCmdline *cmdline); /* --- _PyWstrList ------------------------------------------------ */ @@ -76,7 +76,8 @@ PyAPI_FUNC(const char*) _PyPreConfig_GetEnv(const _PyPreConfig *config, PyAPI_FUNC(void) _Py_get_env_flag(_PyPreConfig *config, int *flag, const char *name); -PyAPI_FUNC(_PyInitError) _PyPreConfig_Read(_PyPreConfig *config); +PyAPI_FUNC(_PyInitError) _PyPreConfig_Read(_PyPreConfig *config, + const _PyArgv *args); PyAPI_FUNC(int) _PyPreConfig_AsDict(const _PyPreConfig *config, PyObject *dict); PyAPI_FUNC(_PyInitError) _PyPreConfig_ReadFromArgv(_PyPreConfig *config, @@ -103,12 +104,10 @@ PyAPI_FUNC(int) _PyCoreConfig_GetEnvDup( wchar_t **dest, wchar_t *wname, char *name); -PyAPI_FUNC(_PyInitError) _PyCoreConfig_Read(_PyCoreConfig *config, - const _PyPreConfig *preconfig); +PyAPI_FUNC(_PyInitError) _PyCoreConfig_Read(_PyCoreConfig *config); PyAPI_FUNC(_PyInitError) _PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, - const _PyArgv *args, - const _PyPreConfig *preconfig); -PyAPI_FUNC(void) _PyCoreConfig_Write(const _PyCoreConfig *config); + const _PyArgv *args); +PyAPI_FUNC(_PyInitError) _PyCoreConfig_Write(const _PyCoreConfig *config); #ifdef __cplusplus } diff --git a/Modules/main.c b/Modules/main.c index 57cf862a30b7..197c9b39ebf0 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -283,28 +283,38 @@ _PyMainInterpreterConfig_Read(_PyMainInterpreterConfig *main_config, /* --- pymain_init() ---------------------------------------------- */ static _PyInitError -pymain_init_preconfig(_PyPreConfig *config, const _PyArgv *args) +pymain_init_preconfig(const _PyArgv *args) { - _PyInitError err = _PyPreConfig_ReadFromArgv(config, args); + _PyInitError err; + + _PyPreConfig config = _PyPreConfig_INIT; + + err = _PyPreConfig_ReadFromArgv(&config, args); if (_Py_INIT_FAILED(err)) { - return err; + goto done; } - return _Py_PreInitializeFromPreConfig(config); + err = _Py_PreInitializeFromPreConfig(&config); + +done: + _PyPreConfig_Clear(&config); + return err; } static _PyInitError pymain_init_coreconfig(_PyCoreConfig *config, const _PyArgv *args, - const _PyPreConfig *preconfig, PyInterpreterState **interp_p) { - _PyInitError err = _PyCoreConfig_ReadFromArgv(config, args, preconfig); + _PyInitError err = _PyCoreConfig_ReadFromArgv(config, args); if (_Py_INIT_FAILED(err)) { return err; } - _PyCoreConfig_Write(config); + err = _PyCoreConfig_Write(config); + if (_Py_INIT_FAILED(err)) { + return err; + } return _Py_InitializeCore(interp_p, config); } @@ -348,18 +358,14 @@ pymain_init(const _PyArgv *args, PyInterpreterState **interp_p) fedisableexcept(FE_OVERFLOW); #endif - _PyPreConfig local_preconfig = _PyPreConfig_INIT; - _PyPreConfig *preconfig = &local_preconfig; - - _PyCoreConfig local_config = _PyCoreConfig_INIT; - _PyCoreConfig *config = &local_config; - - err = pymain_init_preconfig(preconfig, args); + err = pymain_init_preconfig(args); if (_Py_INIT_FAILED(err)) { - goto done; + return err; } - err = pymain_init_coreconfig(config, args, preconfig, interp_p); + _PyCoreConfig config = _PyCoreConfig_INIT; + + err = pymain_init_coreconfig(&config, args, interp_p); if (_Py_INIT_FAILED(err)) { goto done; } @@ -372,8 +378,7 @@ pymain_init(const _PyArgv *args, PyInterpreterState **interp_p) err = _Py_INIT_OK(); done: - _PyPreConfig_Clear(preconfig); - _PyCoreConfig_Clear(config); + _PyCoreConfig_Clear(&config); return err; } diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 540e608fb01f..130dfccc4dd9 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -1330,46 +1330,6 @@ config_init_fs_encoding(_PyCoreConfig *config) } -static _PyInitError -_PyCoreConfig_ReadPreConfig(_PyCoreConfig *config) -{ - _PyInitError err; - _PyPreConfig local_preconfig = _PyPreConfig_INIT; - _PyPreConfig_GetGlobalConfig(&local_preconfig); - - if (_PyPreConfig_Copy(&local_preconfig, &config->preconfig) < 0) { - err = _Py_INIT_NO_MEMORY(); - goto done; - } - - err = _PyPreConfig_Read(&local_preconfig); - if (_Py_INIT_FAILED(err)) { - goto done; - } - - if (_PyPreConfig_Copy(&config->preconfig, &local_preconfig) < 0) { - err = _Py_INIT_NO_MEMORY(); - goto done; - } - err = _Py_INIT_OK(); - -done: - _PyPreConfig_Clear(&local_preconfig); - return err; -} - - -static _PyInitError -_PyCoreConfig_GetPreConfig(_PyCoreConfig *config) -{ - /* Read config written by _PyPreConfig_Write() */ - if (_PyPreConfig_Copy(&config->preconfig, &_PyRuntime.preconfig) < 0) { - return _Py_INIT_NO_MEMORY(); - } - return _Py_INIT_OK(); -} - - /* Read the configuration into _PyCoreConfig from: * Environment variables @@ -1377,7 +1337,7 @@ _PyCoreConfig_GetPreConfig(_PyCoreConfig *config) See _PyCoreConfig_ReadFromArgv() to parse also command line arguments. */ _PyInitError -_PyCoreConfig_Read(_PyCoreConfig *config, const _PyPreConfig *preconfig) +_PyCoreConfig_Read(_PyCoreConfig *config) { _PyInitError err; @@ -1386,25 +1346,12 @@ _PyCoreConfig_Read(_PyCoreConfig *config, const _PyPreConfig *preconfig) return err; } - err = _PyCoreConfig_GetPreConfig(config); - if (_Py_INIT_FAILED(err)) { - return err; + if (_PyPreConfig_Copy(&config->preconfig, &_PyRuntime.preconfig) < 0) { + return _Py_INIT_NO_MEMORY(); } _PyCoreConfig_GetGlobalConfig(config); - if (preconfig != NULL) { - if (_PyPreConfig_Copy(&config->preconfig, preconfig) < 0) { - return _Py_INIT_NO_MEMORY(); - } - } - else { - err = _PyCoreConfig_ReadPreConfig(config); - if (_Py_INIT_FAILED(err)) { - return err; - } - } - assert(config->preconfig.use_environment >= 0); if (config->preconfig.isolated > 0) { @@ -1548,11 +1495,22 @@ config_init_stdio(const _PyCoreConfig *config) - set Py_xxx global configuration variables - initialize C standard streams (stdin, stdout, stderr) */ -void +_PyInitError _PyCoreConfig_Write(const _PyCoreConfig *config) { _PyCoreConfig_SetGlobalConfig(config); config_init_stdio(config); + + /* Write the new pre-configuration into _PyRuntime */ + PyMemAllocatorEx old_alloc; + _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); + int res = _PyPreConfig_Copy(&_PyRuntime.preconfig, &config->preconfig); + PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); + if (res < 0) { + return _Py_INIT_NO_MEMORY(); + } + + return _Py_INIT_OK(); } @@ -2047,8 +2005,7 @@ config_usage(int error, const wchar_t* program) /* Parse command line options and environment variables. */ static _PyInitError -config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, - const _PyPreConfig *preconfig) +config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline) { int need_usage = 0; _PyInitError err; @@ -2067,7 +2024,7 @@ config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, return err; } - _PyPreCmdline_SetPreConfig(&cmdline->precmdline, &config->preconfig); + _PyPreCmdline_SetPreConfig(&cmdline->precmdline, &_PyRuntime.preconfig); if (_PyWstrList_Extend(&config->xoptions, &cmdline->precmdline.xoptions) < 0) { return _Py_INIT_NO_MEMORY(); } @@ -2098,7 +2055,7 @@ config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, return err; } - err = _PyCoreConfig_Read(config, preconfig); + err = _PyCoreConfig_Read(config); if (_Py_INIT_FAILED(err)) { return err; } @@ -2129,8 +2086,7 @@ config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, * Environment variables * Py_xxx global configuration variables */ _PyInitError -_PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, const _PyArgv *args, - const _PyPreConfig *preconfig) +_PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, const _PyArgv *args) { _PyInitError err; @@ -2141,12 +2097,12 @@ _PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, const _PyArgv *args, _PyCmdline cmdline = {.precmdline = _PyPreCmdline_INIT}; - err = _PyPreCmdline_Init(&cmdline.precmdline, args); + err = _PyPreCmdline_SetArgv(&cmdline.precmdline, args); if (_Py_INIT_FAILED(err)) { goto done; } - err = config_from_cmdline(config, &cmdline, preconfig); + err = config_from_cmdline(config, &cmdline); if (_Py_INIT_FAILED(err)) { goto done; } diff --git a/Python/pathconfig.c b/Python/pathconfig.c index 0ccb898e4290..f0b13fd1b001 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -394,7 +394,7 @@ pathconfig_global_init(void) _PyInitError err; _PyCoreConfig config = _PyCoreConfig_INIT; - err = _PyCoreConfig_Read(&config, NULL); + err = _PyCoreConfig_Read(&config); if (_Py_INIT_FAILED(err)) { goto error; } diff --git a/Python/preconfig.c b/Python/preconfig.c index 13e5e1e85790..c16f34083ed6 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -111,12 +111,27 @@ _PyPreCmdline_Clear(_PyPreCmdline *cmdline) _PyInitError -_PyPreCmdline_Init(_PyPreCmdline *cmdline, const _PyArgv *args) +_PyPreCmdline_SetArgv(_PyPreCmdline *cmdline, const _PyArgv *args) { return _PyArgv_AsWstrList(args, &cmdline->argv); } +static void +_PyPreCmdline_GetPreConfig(_PyPreCmdline *cmdline, const _PyPreConfig *config) +{ +#define COPY_ATTR(ATTR) \ + if (config->ATTR != -1) { \ + cmdline->ATTR = config->ATTR; \ + } + + COPY_ATTR(use_environment); + COPY_ATTR(isolated); + +#undef COPY_ATTR +} + + /* --- _PyPreConfig ----------------------------------------------- */ void @@ -336,24 +351,28 @@ preconfig_init_utf8_mode(_PyPreConfig *config, const _PyPreCmdline *cmdline) static void preconfig_init_locale(_PyPreConfig *config) { - /* Test also if coerce_c_locale equals 1: PYTHONCOERCECLOCALE=1 doesn't - imply that the C locale is always coerced. It is only coerced if - if the LC_CTYPE locale is "C". */ - if (config->coerce_c_locale != 0) { - /* The C locale enables the C locale coercion (PEP 538) */ - if (_Py_LegacyLocaleDetected()) { - config->coerce_c_locale = 1; - } - else { - config->coerce_c_locale = 0; - } + /* The C locale enables the C locale coercion (PEP 538) */ + if (_Py_LegacyLocaleDetected()) { + config->coerce_c_locale = 2; + } + else { + config->coerce_c_locale = 0; } } static _PyInitError -preconfig_read(_PyPreConfig *config, const _PyPreCmdline *cmdline) +preconfig_read(_PyPreConfig *config, _PyPreCmdline *cmdline) { + _PyInitError err; + + err = _PyPreCmdline_Read(cmdline); + if (_Py_INIT_FAILED(err)) { + return err; + } + + _PyPreCmdline_SetPreConfig(cmdline, config); + _PyPreConfig_GetGlobalConfig(config); /* isolated and use_environment */ @@ -398,13 +417,16 @@ preconfig_read(_PyPreConfig *config, const _PyPreCmdline *cmdline) #endif if (config->utf8_mode < 0) { - _PyInitError err = preconfig_init_utf8_mode(config, cmdline); + err = preconfig_init_utf8_mode(config, cmdline); if (_Py_INIT_FAILED(err)) { return err; } } - if (config->coerce_c_locale != 0) { + /* Test also if coerce_c_locale equals 1: PYTHONCOERCECLOCALE=1 doesn't + imply that the C locale is always coerced. It is only coerced if + if the LC_CTYPE locale is "C". */ + if (config->coerce_c_locale != 0 && config->coerce_c_locale != 2) { preconfig_init_locale(config); } @@ -491,36 +513,6 @@ get_ctype_locale(char **locale_p) } -/* Read the configuration from: - - - environment variables - - Py_xxx global configuration variables - - the LC_CTYPE locale - - See _PyPreConfig_ReadFromArgv() to parse also command line arguments. */ -_PyInitError -_PyPreConfig_Read(_PyPreConfig *config) -{ - _PyInitError err; - char *old_loc; - - err = get_ctype_locale(&old_loc); - if (_Py_INIT_FAILED(err)) { - return err; - } - - /* Set LC_CTYPE to the user preferred locale */ - _Py_SetLocaleFromEnv(LC_CTYPE); - - err = preconfig_read(config, NULL); - - setlocale(LC_CTYPE, old_loc); - PyMem_RawFree(old_loc); - - return err; -} - - void _PyPreCmdline_SetPreConfig(const _PyPreCmdline *cmdline, _PyPreConfig *config) { @@ -628,33 +620,46 @@ _PyPreCmdline_Read(_PyPreCmdline *cmdline) } -static _PyInitError -preconfig_from_argv(_PyPreConfig *config, const _PyArgv *args) +/* Read the configuration from: + + - environment variables + - Py_xxx global configuration variables + - the LC_CTYPE locale + + See _PyPreConfig_ReadFromArgv() to parse also command line arguments. */ +_PyInitError +_PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args) { _PyInitError err; - _PyPreCmdline cmdline = _PyPreCmdline_INIT; + char *old_loc = NULL; - err = _PyPreCmdline_Init(&cmdline, args); + err = get_ctype_locale(&old_loc); if (_Py_INIT_FAILED(err)) { goto done; } - err = _PyPreCmdline_Read(&cmdline); - if (_Py_INIT_FAILED(err)) { - goto done; - } + /* Set LC_CTYPE to the user preferred locale */ + _Py_SetLocaleFromEnv(LC_CTYPE); - _PyPreCmdline_SetPreConfig(&cmdline, config); + _PyPreCmdline_GetPreConfig(&cmdline, config); - err = preconfig_read(config, &cmdline); - if (_Py_INIT_FAILED(err)) { - goto done; + if (args) { + err = _PyPreCmdline_SetArgv(&cmdline, args); + if (_Py_INIT_FAILED(err)) { + goto done; + } } - err = _Py_INIT_OK(); + + err = preconfig_read(config, &cmdline); done: + if (old_loc != NULL) { + setlocale(LC_CTYPE, old_loc); + PyMem_RawFree(old_loc); + } _PyPreCmdline_Clear(&cmdline); + return err; } @@ -719,15 +724,11 @@ _PyPreConfig_ReadFromArgv(_PyPreConfig *config, const _PyArgv *args) Py_LegacyWindowsFSEncodingFlag = config->legacy_windows_fs_encoding; #endif - err = preconfig_from_argv(config, args); + err = _PyPreConfig_Read(config, args); if (_Py_INIT_FAILED(err)) { goto done; } - if (locale_coerced) { - config->coerce_c_locale = 1; - } - /* The legacy C locale assumes ASCII as the default text encoding, which * causes problems not only for the CPython runtime, but also other * components like GNU readline. diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 994a94f1402a..ea1b731a56b2 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -714,23 +714,8 @@ _Py_InitializeCore_impl(PyInterpreterState **interp_p, } -_PyInitError -_Py_PreInitializeFromPreConfig(_PyPreConfig *config) -{ - if (config != NULL) { - _PyInitError err = _PyPreConfig_Write(config); - if (_Py_INIT_FAILED(err)) { - return err; - } - } - - _PyRuntime.pre_initialized = 1; - return _Py_INIT_OK(); -} - - static _PyInitError -pyinit_preconfig(_PyPreConfig *config, const _PyPreConfig *src_config) +pyinit_preinit(_PyPreConfig *config, const _PyPreConfig *src_config) { _PyInitError err; @@ -739,32 +724,46 @@ pyinit_preconfig(_PyPreConfig *config, const _PyPreConfig *src_config) return err; } - if (_PyPreConfig_Copy(config, src_config) < 0) { - return _Py_INIT_ERR("failed to copy pre config"); + if (_PyRuntime.pre_initialized) { + /* If it's already configured: ignored the new configuration */ + return _Py_INIT_OK(); + } + + if (src_config) { + if (_PyPreConfig_Copy(config, src_config) < 0) { + return _Py_INIT_ERR("failed to copy pre config"); + } + } + + err = _PyPreConfig_Read(config, NULL); + if (_Py_INIT_FAILED(err)) { + return err; } - err = _PyPreConfig_Read(config); + err = _PyPreConfig_Write(config); if (_Py_INIT_FAILED(err)) { return err; } - return _Py_PreInitializeFromPreConfig(config); + _PyRuntime.pre_initialized = 1; + return _Py_INIT_OK(); } _PyInitError -_Py_PreInitialize(void) +_Py_PreInitializeFromPreConfig(_PyPreConfig *config) { - _PyInitError err = _PyRuntime_Initialize(); - if (_Py_INIT_FAILED(err)) { - return err; - } + return pyinit_preinit(config, NULL); +} - if (_PyRuntime.pre_initialized) { - return _Py_INIT_OK(); - } - return _Py_PreInitializeFromPreConfig(NULL); +_PyInitError +_Py_PreInitialize(void) +{ + _PyPreConfig config = _PyPreConfig_INIT; + _PyInitError err = pyinit_preinit(&config, NULL); + _PyPreConfig_Clear(&config); + return err; } @@ -776,7 +775,7 @@ pyinit_coreconfig(_PyCoreConfig *config, const _PyCoreConfig *src_config, return _Py_INIT_ERR("failed to copy core config"); } - _PyInitError err = _PyCoreConfig_Read(config, NULL); + _PyInitError err = _PyCoreConfig_Read(config); if (_Py_INIT_FAILED(err)) { return err; } @@ -817,7 +816,7 @@ _Py_InitializeCore(PyInterpreterState **interp_p, _PyCoreConfig local_config = _PyCoreConfig_INIT; - err = pyinit_preconfig(&local_config.preconfig, &src_config->preconfig); + err = pyinit_preinit(&local_config.preconfig, &src_config->preconfig); if (_Py_INIT_FAILED(err)) { goto done; } From webhook-mailer at python.org Mon Mar 25 13:37:16 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 25 Mar 2019 17:37:16 -0000 Subject: [Python-checkins] bpo-36301: Add _Py_PreInitializeFromConfig() (GH-12536) Message-ID: https://github.com/python/cpython/commit/a6fbc4e25e1dc7d1c9a26888b9115bc6c2afc101 commit: a6fbc4e25e1dc7d1c9a26888b9115bc6c2afc101 branch: master author: Victor Stinner committer: GitHub date: 2019-03-25T18:37:10+01:00 summary: bpo-36301: Add _Py_PreInitializeFromConfig() (GH-12536) * Initialize _PyPreConfig.dev_mode to -1. * _PyPreConfig_Read(): coreconfig has the priority over preconfig. * _PyCoreConfig_Read() now calls _PyPreCmdline_Read() internally. * config_from_cmdline() now pass _PyPreCmdline to config_read(). * Add _PyPreCmdline_Copy(). files: M Include/cpython/coreconfig.h M Include/cpython/pylifecycle.h M Include/internal/pycore_coreconfig.h M Python/coreconfig.c M Python/preconfig.c M Python/pylifecycle.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index 83622094f2ab..bb086cbd125a 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -115,7 +115,9 @@ typedef struct { .isolated = -1, \ .use_environment = -1, \ .coerce_c_locale = -1, \ - .utf8_mode = -1} + .utf8_mode = -1, \ + .dev_mode = -1, \ + .allocator = NULL} /* --- _PyCoreConfig ---------------------------------------------- */ diff --git a/Include/cpython/pylifecycle.h b/Include/cpython/pylifecycle.h index 1caeb98e9933..a226de8446c6 100644 --- a/Include/cpython/pylifecycle.h +++ b/Include/cpython/pylifecycle.h @@ -17,6 +17,8 @@ PyAPI_FUNC(int) Py_SetStandardStreamEncoding(const char *encoding, PyAPI_FUNC(_PyInitError) _Py_PreInitialize(void); PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromPreConfig( _PyPreConfig *preconfig); +PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromConfig( + const _PyCoreConfig *coreconfig); PyAPI_FUNC(_PyInitError) _Py_InitializeCore( PyInterpreterState **interp, diff --git a/Include/internal/pycore_coreconfig.h b/Include/internal/pycore_coreconfig.h index 949bc9b864d6..d44172e0dd8d 100644 --- a/Include/internal/pycore_coreconfig.h +++ b/Include/internal/pycore_coreconfig.h @@ -25,11 +25,22 @@ typedef struct { /* Note: _PyPreCmdline_INIT sets other fields to 0/NULL */ PyAPI_FUNC(void) _PyPreCmdline_Clear(_PyPreCmdline *cmdline); +PyAPI_FUNC(int) _PyPreCmdline_Copy(_PyPreCmdline *cmdline, + const _PyPreCmdline *cmdline2); PyAPI_FUNC(_PyInitError) _PyPreCmdline_SetArgv(_PyPreCmdline *cmdline, const _PyArgv *args); +PyAPI_FUNC(void) _PyPreCmdline_GetPreConfig( + _PyPreCmdline *cmdline, + const _PyPreConfig *config); PyAPI_FUNC(void) _PyPreCmdline_SetPreConfig( const _PyPreCmdline *cmdline, _PyPreConfig *config); +PyAPI_FUNC(void) _PyPreCmdline_GetCoreConfig( + _PyPreCmdline *cmdline, + const _PyCoreConfig *config); +PyAPI_FUNC(void) _PyPreCmdline_SetCoreConfig( + const _PyPreCmdline *cmdline, + _PyCoreConfig *config); PyAPI_FUNC(_PyInitError) _PyPreCmdline_Read(_PyPreCmdline *cmdline); @@ -77,7 +88,8 @@ PyAPI_FUNC(void) _Py_get_env_flag(_PyPreConfig *config, int *flag, const char *name); PyAPI_FUNC(_PyInitError) _PyPreConfig_Read(_PyPreConfig *config, - const _PyArgv *args); + const _PyArgv *args, + const _PyCoreConfig *coreconfig); PyAPI_FUNC(int) _PyPreConfig_AsDict(const _PyPreConfig *config, PyObject *dict); PyAPI_FUNC(_PyInitError) _PyPreConfig_ReadFromArgv(_PyPreConfig *config, diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 130dfccc4dd9..ba5abb6ca403 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -1336,16 +1336,30 @@ config_init_fs_encoding(_PyCoreConfig *config) * Py_xxx global configuration variables See _PyCoreConfig_ReadFromArgv() to parse also command line arguments. */ -_PyInitError -_PyCoreConfig_Read(_PyCoreConfig *config) +static _PyInitError +config_read_impl(_PyCoreConfig *config, _PyPreCmdline *cmdline) { _PyInitError err; - err = _Py_PreInitialize(); + err = _Py_PreInitializeFromConfig(config); + if (_Py_INIT_FAILED(err)) { + return err; + } + + _PyPreCmdline_GetPreConfig(cmdline, &_PyRuntime.preconfig); + _PyPreCmdline_GetCoreConfig(cmdline, config); + + err = _PyPreCmdline_Read(cmdline); if (_Py_INIT_FAILED(err)) { return err; } + _PyPreCmdline_SetCoreConfig(cmdline, config); + + if (_PyWstrList_Extend(&config->xoptions, &cmdline->xoptions) < 0) { + return _Py_INIT_NO_MEMORY(); + } + if (_PyPreConfig_Copy(&config->preconfig, &_PyRuntime.preconfig) < 0) { return _Py_INIT_NO_MEMORY(); } @@ -1454,6 +1468,41 @@ _PyCoreConfig_Read(_PyCoreConfig *config) } +static _PyInitError +config_read(_PyCoreConfig *config, const _PyPreCmdline *src_cmdline) +{ + _PyInitError err; + + err = _Py_PreInitializeFromConfig(config); + if (_Py_INIT_FAILED(err)) { + return err; + } + + _PyPreCmdline cmdline = _PyPreCmdline_INIT; + + if (src_cmdline) { + if (_PyPreCmdline_Copy(&cmdline, src_cmdline) < 0) { + err = _Py_INIT_NO_MEMORY(); + goto done; + } + } + + err = config_read_impl(config, &cmdline); + +done: + _PyPreCmdline_Clear(&cmdline); + return err; + +} + + +_PyInitError +_PyCoreConfig_Read(_PyCoreConfig *config) +{ + return config_read(config, NULL); +} + + static void config_init_stdio(const _PyCoreConfig *config) { @@ -2025,9 +2074,6 @@ config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline) } _PyPreCmdline_SetPreConfig(&cmdline->precmdline, &_PyRuntime.preconfig); - if (_PyWstrList_Extend(&config->xoptions, &cmdline->precmdline.xoptions) < 0) { - return _Py_INIT_NO_MEMORY(); - } err = config_parse_cmdline(config, cmdline, &need_usage); if (_Py_INIT_FAILED(err)) { @@ -2055,7 +2101,7 @@ config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline) return err; } - err = _PyCoreConfig_Read(config); + err = config_read(config, &cmdline->precmdline); if (_Py_INIT_FAILED(err)) { return err; } @@ -2090,7 +2136,7 @@ _PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, const _PyArgv *args) { _PyInitError err; - err = _Py_PreInitialize(); + err = _Py_PreInitializeFromConfig(config); if (_Py_INIT_FAILED(err)) { return err; } diff --git a/Python/preconfig.c b/Python/preconfig.c index c16f34083ed6..ac87a7a3c7e9 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -110,6 +110,22 @@ _PyPreCmdline_Clear(_PyPreCmdline *cmdline) } +int +_PyPreCmdline_Copy(_PyPreCmdline *cmdline, const _PyPreCmdline *cmdline2) +{ + _PyPreCmdline_Clear(cmdline); + if (_PyWstrList_Copy(&cmdline->argv, &cmdline2->argv) < 0) { + return -1; + } + if (_PyWstrList_Copy(&cmdline->xoptions, &cmdline2->xoptions) < 0) { + return -1; + } + cmdline->use_environment = cmdline2->use_environment; + cmdline->isolated = cmdline2->isolated; + return 0; +} + + _PyInitError _PyPreCmdline_SetArgv(_PyPreCmdline *cmdline, const _PyArgv *args) { @@ -117,7 +133,7 @@ _PyPreCmdline_SetArgv(_PyPreCmdline *cmdline, const _PyArgv *args) } -static void +void _PyPreCmdline_GetPreConfig(_PyPreCmdline *cmdline, const _PyPreConfig *config) { #define COPY_ATTR(ATTR) \ @@ -132,6 +148,36 @@ _PyPreCmdline_GetPreConfig(_PyPreCmdline *cmdline, const _PyPreConfig *config) } +void +_PyPreCmdline_GetCoreConfig(_PyPreCmdline *cmdline, const _PyCoreConfig *config) +{ +#define COPY_ATTR(ATTR) \ + if (config->preconfig.ATTR != -1) { \ + cmdline->ATTR = config->preconfig.ATTR; \ + } + + COPY_ATTR(use_environment); + COPY_ATTR(isolated); + +#undef COPY_ATTR +} + + +void +_PyPreCmdline_SetCoreConfig(const _PyPreCmdline *cmdline, _PyCoreConfig *config) +{ +#define COPY_ATTR(ATTR) \ + if (config->preconfig.ATTR == -1 && cmdline->ATTR != -1) { \ + config->preconfig.ATTR = cmdline->ATTR; \ + } + + COPY_ATTR(use_environment); + COPY_ATTR(isolated); + +#undef COPY_ATTR +} + + /* --- _PyPreConfig ----------------------------------------------- */ void @@ -628,7 +674,8 @@ _PyPreCmdline_Read(_PyPreCmdline *cmdline) See _PyPreConfig_ReadFromArgv() to parse also command line arguments. */ _PyInitError -_PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args) +_PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args, + const _PyCoreConfig *coreconfig) { _PyInitError err; _PyPreCmdline cmdline = _PyPreCmdline_INIT; @@ -642,8 +689,17 @@ _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args) /* Set LC_CTYPE to the user preferred locale */ _Py_SetLocaleFromEnv(LC_CTYPE); + _PyPreConfig_GetGlobalConfig(config); + _PyPreCmdline_GetPreConfig(&cmdline, config); + if (coreconfig) { + _PyPreCmdline_GetCoreConfig(&cmdline, coreconfig); + if (config->dev_mode == -1) { + config->dev_mode = coreconfig->preconfig.dev_mode; + } + } + if (args) { err = _PyPreCmdline_SetArgv(&cmdline, args); if (_Py_INIT_FAILED(err)) { @@ -724,7 +780,7 @@ _PyPreConfig_ReadFromArgv(_PyPreConfig *config, const _PyArgv *args) Py_LegacyWindowsFSEncodingFlag = config->legacy_windows_fs_encoding; #endif - err = _PyPreConfig_Read(config, args); + err = _PyPreConfig_Read(config, args, NULL); if (_Py_INIT_FAILED(err)) { goto done; } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index ea1b731a56b2..66cadc99c7ba 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -715,7 +715,9 @@ _Py_InitializeCore_impl(PyInterpreterState **interp_p, static _PyInitError -pyinit_preinit(_PyPreConfig *config, const _PyPreConfig *src_config) +pyinit_preinit(_PyPreConfig *config, + const _PyPreConfig *src_config, + const _PyCoreConfig *coreconfig) { _PyInitError err; @@ -729,13 +731,17 @@ pyinit_preinit(_PyPreConfig *config, const _PyPreConfig *src_config) return _Py_INIT_OK(); } + if (!src_config && coreconfig) { + src_config = &coreconfig->preconfig; + } + if (src_config) { if (_PyPreConfig_Copy(config, src_config) < 0) { return _Py_INIT_ERR("failed to copy pre config"); } } - err = _PyPreConfig_Read(config, NULL); + err = _PyPreConfig_Read(config, NULL, coreconfig); if (_Py_INIT_FAILED(err)) { return err; } @@ -750,18 +756,28 @@ pyinit_preinit(_PyPreConfig *config, const _PyPreConfig *src_config) } +_PyInitError +_Py_PreInitialize(void) +{ + _PyPreConfig config = _PyPreConfig_INIT; + _PyInitError err = pyinit_preinit(&config, NULL, NULL); + _PyPreConfig_Clear(&config); + return err; +} + + _PyInitError _Py_PreInitializeFromPreConfig(_PyPreConfig *config) { - return pyinit_preinit(config, NULL); + return pyinit_preinit(config, NULL, NULL); } _PyInitError -_Py_PreInitialize(void) +_Py_PreInitializeFromConfig(const _PyCoreConfig *coreconfig) { _PyPreConfig config = _PyPreConfig_INIT; - _PyInitError err = pyinit_preinit(&config, NULL); + _PyInitError err = pyinit_preinit(&config, NULL, coreconfig); _PyPreConfig_Clear(&config); return err; } @@ -814,16 +830,13 @@ _Py_InitializeCore(PyInterpreterState **interp_p, assert(src_config != NULL); - _PyCoreConfig local_config = _PyCoreConfig_INIT; - - err = pyinit_preinit(&local_config.preconfig, &src_config->preconfig); + err = _Py_PreInitializeFromConfig(src_config); if (_Py_INIT_FAILED(err)) { - goto done; + return err; } + _PyCoreConfig local_config = _PyCoreConfig_INIT; err = pyinit_coreconfig(&local_config, src_config, interp_p); - -done: _PyCoreConfig_Clear(&local_config); return err; } From webhook-mailer at python.org Mon Mar 25 15:55:23 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Mon, 25 Mar 2019 19:55:23 -0000 Subject: [Python-checkins] Add note to Queue.get() docs about block=True (GH-2223) Message-ID: https://github.com/python/cpython/commit/713a8ae7926472b02ee1a394633eb54aaa7912d1 commit: 713a8ae7926472b02ee1a394633eb54aaa7912d1 branch: master author: Stephen Rosen committer: Raymond Hettinger date: 2019-03-25T12:55:20-07:00 summary: Add note to Queue.get() docs about block=True (GH-2223) files: M Doc/library/queue.rst diff --git a/Doc/library/queue.rst b/Doc/library/queue.rst index f99f6ffb05f6..2eeab5e26266 100644 --- a/Doc/library/queue.rst +++ b/Doc/library/queue.rst @@ -150,6 +150,11 @@ provide the public methods described below. Otherwise (*block* is false), return an item if one is immediately available, else raise the :exc:`Empty` exception (*timeout* is ignored in that case). + Prior to 3.0 on POSIX systems, and for all versions on Windows, if + *block* is true and *timeout* is ``None``, this operation goes into + an uninterruptible wait on an underlying lock. This means that no exceptions + can occur, and in particular a SIGINT will not trigger a :exc:`KeyboardInterrupt`. + .. method:: Queue.get_nowait() From webhook-mailer at python.org Mon Mar 25 16:01:19 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Mon, 25 Mar 2019 20:01:19 -0000 Subject: [Python-checkins] bpo-36326: Let inspect.getdoc() find docstrings for __slots__ (GH-12498) Message-ID: https://github.com/python/cpython/commit/d1e768a67707bf7bb426c1537e1a764e89eaff78 commit: d1e768a67707bf7bb426c1537e1a764e89eaff78 branch: master author: Raymond Hettinger committer: GitHub date: 2019-03-25T13:01:13-07:00 summary: bpo-36326: Let inspect.getdoc() find docstrings for __slots__ (GH-12498) files: A Misc/NEWS.d/next/Library/2019-03-22-13-47-52.bpo-36326.WCnEI5.rst M Doc/whatsnew/3.8.rst M Lib/inspect.py M Lib/statistics.py M Lib/test/test_inspect.py M Lib/test/test_statistics.py diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 3855d3604e1c..6ab7991d8d4c 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -174,6 +174,20 @@ gettext Added :func:`~gettext.pgettext` and its variants. (Contributed by Franz Glasner, ?ric Araujo, and Cheryl Sabella in :issue:`2504`.) +inspect +------- + +The :func:`inspect.getdoc` function can now find docstrings for ``__slots__`` +if that attribute is a :class:`dict` where the values are docstrings. +This provides documentation options similar to what we already have +for :func:`property`, :func:`classmethod`, and :func:`staticmethod`:: + + class AudioClip: + __slots__ = {'bit_rate': 'expressed in kilohertz to one decimal place', + 'duration': 'in seconds, rounded up to an integer'} + def __init__(self, bit_rate, duration): + self.bit_rate = round(bit_rate / 1000.0, 1) + self.duration = ceil(duration) gc -- diff --git a/Lib/inspect.py b/Lib/inspect.py index b8a142232b88..8c398bd3534c 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -582,9 +582,12 @@ def _finddoc(obj): cls = obj.__objclass__ if getattr(cls, name) is not obj: return None + if ismemberdescriptor(obj): + slots = getattr(cls, '__slots__', None) + if isinstance(slots, dict) and name in slots: + return slots[name] else: return None - for base in cls.__mro__: try: doc = getattr(base, name).__doc__ diff --git a/Lib/statistics.py b/Lib/statistics.py index e5a62463f015..bd8a6f96381a 100644 --- a/Lib/statistics.py +++ b/Lib/statistics.py @@ -709,7 +709,8 @@ class NormalDist: # https://en.wikipedia.org/wiki/Normal_distribution # https://en.wikipedia.org/wiki/Variance#Properties - __slots__ = ('mu', 'sigma') + __slots__ = {'mu': 'Arithmetic mean of a normal distribution', + 'sigma': 'Standard deviation of a normal distribution'} def __init__(self, mu=0.0, sigma=1.0): 'NormalDist where mu is the mean and sigma is the standard deviation.' diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index b9072e0137eb..bc675aa5df21 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -375,6 +375,11 @@ def assertSourceEqual(self, obj, top, bottom): self.assertEqual(inspect.getsource(obj), self.sourcerange(top, bottom)) +class SlotUser: + 'Docstrings for __slots__' + __slots__ = {'power': 'measured in kilowatts', + 'distance': 'measured in kilometers'} + class TestRetrievingSourceCode(GetSourceBase): fodderModule = mod @@ -429,6 +434,10 @@ def test_getdoc(self): 'A longer,\n\nindented\n\ndocstring.') self.assertEqual(inspect.getdoc(git.abuse), 'Another\n\ndocstring\n\ncontaining\n\ntabs') + self.assertEqual(inspect.getdoc(SlotUser.power), + 'measured in kilowatts') + self.assertEqual(inspect.getdoc(SlotUser.distance), + 'measured in kilometers') @unittest.skipIf(sys.flags.optimize >= 2, "Docstrings are omitted with -O2 and above") diff --git a/Lib/test/test_statistics.py b/Lib/test/test_statistics.py index 485ffe24036d..7f7839de4600 100644 --- a/Lib/test/test_statistics.py +++ b/Lib/test/test_statistics.py @@ -2051,7 +2051,7 @@ def test_slots(self): nd = statistics.NormalDist(300, 23) with self.assertRaises(TypeError): vars(nd) - self.assertEqual(nd.__slots__, ('mu', 'sigma')) + self.assertEqual(tuple(nd.__slots__), ('mu', 'sigma')) def test_instantiation_and_attributes(self): nd = statistics.NormalDist(500, 17) diff --git a/Misc/NEWS.d/next/Library/2019-03-22-13-47-52.bpo-36326.WCnEI5.rst b/Misc/NEWS.d/next/Library/2019-03-22-13-47-52.bpo-36326.WCnEI5.rst new file mode 100644 index 000000000000..e458a7024da5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-22-13-47-52.bpo-36326.WCnEI5.rst @@ -0,0 +1,2 @@ +inspect.getdoc() can now find docstrings for member objects when __slots__ +is a dictionary. From webhook-mailer at python.org Mon Mar 25 16:03:24 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Mon, 25 Mar 2019 20:03:24 -0000 Subject: [Python-checkins] Add note to Queue.get() docs about block=True (GH-2223) (GH-12538) Message-ID: https://github.com/python/cpython/commit/f3c5535f63e7cd49166ab33b7b0ebb3285ef4ed0 commit: f3c5535f63e7cd49166ab33b7b0ebb3285ef4ed0 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Raymond Hettinger date: 2019-03-25T13:03:16-07:00 summary: Add note to Queue.get() docs about block=True (GH-2223) (GH-12538) (cherry picked from commit 713a8ae7926472b02ee1a394633eb54aaa7912d1) Co-authored-by: Stephen Rosen files: M Doc/library/queue.rst diff --git a/Doc/library/queue.rst b/Doc/library/queue.rst index 7335a64bef84..0a42da1d74a4 100644 --- a/Doc/library/queue.rst +++ b/Doc/library/queue.rst @@ -152,6 +152,11 @@ provide the public methods described below. Otherwise (*block* is false), return an item if one is immediately available, else raise the :exc:`Empty` exception (*timeout* is ignored in that case). + Prior to 3.0 on POSIX systems, and for all versions on Windows, if + *block* is true and *timeout* is ``None``, this operation goes into + an uninterruptible wait on an underlying lock. This means that no exceptions + can occur, and in particular a SIGINT will not trigger a :exc:`KeyboardInterrupt`. + .. method:: Queue.get_nowait() From webhook-mailer at python.org Mon Mar 25 16:51:05 2019 From: webhook-mailer at python.org (Stefan Krah) Date: Mon, 25 Mar 2019 20:51:05 -0000 Subject: [Python-checkins] bpo-36370: Check for PyErr_Occurred() after PyImport_GetModule() (GH-12504) Message-ID: https://github.com/python/cpython/commit/027b09c5a13aac9e14a3b43bb385298d549c3833 commit: 027b09c5a13aac9e14a3b43bb385298d549c3833 branch: master author: Stefan Krah committer: GitHub date: 2019-03-25T21:50:58+01:00 summary: bpo-36370: Check for PyErr_Occurred() after PyImport_GetModule() (GH-12504) files: M Python/ceval.c M Python/import.c M Python/pylifecycle.c M Python/sysmodule.c diff --git a/Python/ceval.c b/Python/ceval.c index 40320bf35703..28e923219d38 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4948,7 +4948,7 @@ import_from(PyObject *v, PyObject *name) } x = PyImport_GetModule(fullmodname); Py_DECREF(fullmodname); - if (x == NULL) { + if (x == NULL && !PyErr_Occurred()) { goto error; } Py_DECREF(pkgname); @@ -4971,7 +4971,7 @@ import_from(PyObject *v, PyObject *name) "cannot import name %R from %R (unknown location)", name, pkgname_or_unknown ); - /* NULL check for errmsg done by PyErr_SetImportError. */ + /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */ PyErr_SetImportError(errmsg, pkgname, NULL); } else { @@ -4979,7 +4979,7 @@ import_from(PyObject *v, PyObject *name) "cannot import name %R from %R (%S)", name, pkgname_or_unknown, pkgpath ); - /* NULL check for errmsg done by PyErr_SetImportError. */ + /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */ PyErr_SetImportError(errmsg, pkgname, pkgpath); } diff --git a/Python/import.c b/Python/import.c index bf3a99414fb8..c00c3aa640b0 100644 --- a/Python/import.c +++ b/Python/import.c @@ -966,11 +966,10 @@ exec_code_in_module(PyObject *name, PyObject *module_dict, PyObject *code_object Py_DECREF(v); m = PyImport_GetModule(name); - if (m == NULL) { + if (m == NULL && !PyErr_Occurred()) { PyErr_Format(PyExc_ImportError, "Loaded module %R not found in sys.modules", name); - return NULL; } return m; @@ -1735,6 +1734,10 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, } mod = PyImport_GetModule(abs_name); + if (mod == NULL && PyErr_Occurred()) { + goto error; + } + if (mod != NULL && mod != Py_None) { _Py_IDENTIFIER(__spec__); _Py_IDENTIFIER(_lock_unlock_module); @@ -1810,9 +1813,11 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, final_mod = PyImport_GetModule(to_return); Py_DECREF(to_return); if (final_mod == NULL) { - PyErr_Format(PyExc_KeyError, - "%R not in sys.modules as expected", - to_return); + if (!PyErr_Occurred()) { + PyErr_Format(PyExc_KeyError, + "%R not in sys.modules as expected", + to_return); + } goto error; } } @@ -1875,6 +1880,10 @@ PyImport_ReloadModule(PyObject *m) PyObject *reloaded_module = NULL; PyObject *imp = _PyImport_GetModuleId(&PyId_imp); if (imp == NULL) { + if (PyErr_Occurred()) { + return NULL; + } + imp = PyImport_ImportModule("imp"); if (imp == NULL) { return NULL; diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 66cadc99c7ba..e08f290d8d14 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -2157,8 +2157,10 @@ wait_for_thread_shutdown(void) PyObject *result; PyObject *threading = _PyImport_GetModuleId(&PyId_threading); if (threading == NULL) { - /* threading not imported */ - PyErr_Clear(); + if (PyErr_Occurred()) { + PyErr_WriteUnraisable(NULL); + } + /* else: threading not imported */ return; } result = _PyObject_CallMethodId(threading, &PyId__shutdown, NULL); diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 4351a7fb370d..3df4d44a7ce7 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -283,7 +283,9 @@ sys_displayhook(PyObject *module, PyObject *o) builtins = _PyImport_GetModuleId(&PyId_builtins); if (builtins == NULL) { - PyErr_SetString(PyExc_RuntimeError, "lost builtins module"); + if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_RuntimeError, "lost builtins module"); + } return NULL; } Py_DECREF(builtins); From webhook-mailer at python.org Mon Mar 25 17:36:49 2019 From: webhook-mailer at python.org (Stefan Krah) Date: Mon, 25 Mar 2019 21:36:49 -0000 Subject: [Python-checkins] bpo-36370: Check for PyErr_Occurred() after PyImport_GetModule() (GH-12504) Message-ID: https://github.com/python/cpython/commit/cdd8d4d6dd57f4c9429566706009d4613277d391 commit: cdd8d4d6dd57f4c9429566706009d4613277d391 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Stefan Krah date: 2019-03-25T22:36:43+01:00 summary: bpo-36370: Check for PyErr_Occurred() after PyImport_GetModule() (GH-12504) files: M Python/ceval.c M Python/import.c M Python/pylifecycle.c M Python/sysmodule.c diff --git a/Python/ceval.c b/Python/ceval.c index c394b9b4827b..634edbaec07c 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4816,7 +4816,7 @@ import_from(PyObject *v, PyObject *name) } x = PyImport_GetModule(fullmodname); Py_DECREF(fullmodname); - if (x == NULL) { + if (x == NULL && !PyErr_Occurred()) { goto error; } Py_DECREF(pkgname); @@ -4839,7 +4839,7 @@ import_from(PyObject *v, PyObject *name) "cannot import name %R from %R (unknown location)", name, pkgname_or_unknown ); - /* NULL check for errmsg done by PyErr_SetImportError. */ + /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */ PyErr_SetImportError(errmsg, pkgname, NULL); } else { @@ -4847,7 +4847,7 @@ import_from(PyObject *v, PyObject *name) "cannot import name %R from %R (%S)", name, pkgname_or_unknown, pkgpath ); - /* NULL check for errmsg done by PyErr_SetImportError. */ + /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */ PyErr_SetImportError(errmsg, pkgname, pkgpath); } diff --git a/Python/import.c b/Python/import.c index ccdd59930505..63c99ea5c1ab 100644 --- a/Python/import.c +++ b/Python/import.c @@ -953,11 +953,10 @@ exec_code_in_module(PyObject *name, PyObject *module_dict, PyObject *code_object Py_DECREF(v); m = PyImport_GetModule(name); - if (m == NULL) { + if (m == NULL && !PyErr_Occurred()) { PyErr_Format(PyExc_ImportError, "Loaded module %R not found in sys.modules", name); - return NULL; } return m; @@ -1714,6 +1713,10 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, } mod = PyImport_GetModule(abs_name); + if (mod == NULL && PyErr_Occurred()) { + goto error; + } + if (mod != NULL && mod != Py_None) { _Py_IDENTIFIER(__spec__); _Py_IDENTIFIER(_initializing); @@ -1801,9 +1804,11 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, final_mod = PyImport_GetModule(to_return); Py_DECREF(to_return); if (final_mod == NULL) { - PyErr_Format(PyExc_KeyError, - "%R not in sys.modules as expected", - to_return); + if (!PyErr_Occurred()) { + PyErr_Format(PyExc_KeyError, + "%R not in sys.modules as expected", + to_return); + } goto error; } } @@ -1855,6 +1860,10 @@ PyImport_ReloadModule(PyObject *m) PyObject *reloaded_module = NULL; PyObject *imp = _PyImport_GetModuleId(&PyId_imp); if (imp == NULL) { + if (PyErr_Occurred()) { + return NULL; + } + imp = PyImport_ImportModule("imp"); if (imp == NULL) { return NULL; diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 94b6d43c0e51..d8e6f8fa8995 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -2239,8 +2239,10 @@ wait_for_thread_shutdown(void) PyObject *result; PyObject *threading = _PyImport_GetModuleId(&PyId_threading); if (threading == NULL) { - /* threading not imported */ - PyErr_Clear(); + if (PyErr_Occurred()) { + PyErr_WriteUnraisable(NULL); + } + /* else: threading not imported */ return; } result = _PyObject_CallMethodId(threading, &PyId__shutdown, NULL); diff --git a/Python/sysmodule.c b/Python/sysmodule.c index c01a04e6c030..d87b4e2c01b3 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -274,7 +274,9 @@ sys_displayhook(PyObject *self, PyObject *o) builtins = _PyImport_GetModuleId(&PyId_builtins); if (builtins == NULL) { - PyErr_SetString(PyExc_RuntimeError, "lost builtins module"); + if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_RuntimeError, "lost builtins module"); + } return NULL; } Py_DECREF(builtins); From webhook-mailer at python.org Mon Mar 25 18:01:33 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Mon, 25 Mar 2019 22:01:33 -0000 Subject: [Python-checkins] bpo-36143: Regenerate Lib/keyword.py from the Grammar and Tokens file using pgen (GH-12456) Message-ID: https://github.com/python/cpython/commit/91759d98015e1d6d5e1367cff60592ab548e7806 commit: 91759d98015e1d6d5e1367cff60592ab548e7806 branch: master author: Pablo Galindo committer: GitHub date: 2019-03-25T22:01:12Z summary: bpo-36143: Regenerate Lib/keyword.py from the Grammar and Tokens file using pgen (GH-12456) Now that the parser generator is written in Python (Parser/pgen) we can make use of it to regenerate the Lib/keyword file that contains the language keywords instead of parsing the autogenerated grammar files. This also allows checking in the CI that the autogenerated files are up to date. files: A Misc/NEWS.d/next/Core and Builtins/2019-03-20-00-37-24.bpo-12456.fnKoKo.rst A Parser/pgen/keywordgen.py M Lib/keyword.py M Lib/test/test_keyword.py M Makefile.pre.in diff --git a/Lib/keyword.py b/Lib/keyword.py old mode 100755 new mode 100644 index 150c2bc46d22..ddcbb25d3d3f --- a/Lib/keyword.py +++ b/Lib/keyword.py @@ -1,98 +1,55 @@ -#! /usr/bin/env python3 - -"""Keywords (from "graminit.c") +"""Keywords (from "Grammar/Grammar") This file is automatically generated; please don't muck it up! To update the symbols in this file, 'cd' to the top directory of -the python source tree after building the interpreter and run: +the python source tree and run: + + python3 -m Parser.pgen.keywordgen Grammar/Grammar \ + Grammar/Tokens \ + Lib/keyword.py - ./python Lib/keyword.py +Alternatively, you can run 'make regen-keyword'. """ __all__ = ["iskeyword", "kwlist"] kwlist = [ -#--start keywords-- - 'False', - 'None', - 'True', - 'and', - 'as', - 'assert', - 'break', - 'class', - 'continue', - 'def', - 'del', - 'elif', - 'else', - 'except', - 'finally', - 'for', - 'from', - 'global', - 'if', - 'import', - 'in', - 'is', - 'lambda', - 'nonlocal', - 'not', - 'or', - 'pass', - 'raise', - 'return', - 'try', - 'while', - 'with', - 'yield', -#--end keywords-- - ] - -kwlist.append('async') -kwlist.append('await') -kwlist.sort() + 'False', + 'None', + 'True', + 'and', + 'as', + 'assert', + 'async', + 'await', + 'break', + 'class', + 'continue', + 'def', + 'del', + 'elif', + 'else', + 'except', + 'finally', + 'for', + 'from', + 'global', + 'if', + 'import', + 'in', + 'is', + 'lambda', + 'nonlocal', + 'not', + 'or', + 'pass', + 'raise', + 'return', + 'try', + 'while', + 'with', + 'yield' +] iskeyword = frozenset(kwlist).__contains__ - -def main(): - import sys, re - - args = sys.argv[1:] - iptfile = args and args[0] or "Python/graminit.c" - if len(args) > 1: optfile = args[1] - else: optfile = "Lib/keyword.py" - - # load the output skeleton from the target, taking care to preserve its - # newline convention. - with open(optfile, newline='') as fp: - format = fp.readlines() - nl = format[0][len(format[0].strip()):] if format else '\n' - - # scan the source file for keywords - with open(iptfile) as fp: - strprog = re.compile('"([^"]+)"') - lines = [] - for line in fp: - if '{1, "' in line: - match = strprog.search(line) - if match: - lines.append(" '" + match.group(1) + "'," + nl) - lines.sort() - - # insert the lines of keywords into the skeleton - try: - start = format.index("#--start keywords--" + nl) + 1 - end = format.index("#--end keywords--" + nl) - format[start:end] = lines - except ValueError: - sys.stderr.write("target does not contain format markers\n") - sys.exit(1) - - # write the output file - with open(optfile, 'w', newline='') as fp: - fp.writelines(format) - -if __name__ == "__main__": - main() diff --git a/Lib/test/test_keyword.py b/Lib/test/test_keyword.py index af99f52c630d..3e2a8b3fb7f4 100644 --- a/Lib/test/test_keyword.py +++ b/Lib/test/test_keyword.py @@ -1,20 +1,5 @@ import keyword import unittest -from test import support -import filecmp -import os -import sys -import subprocess -import shutil -import textwrap - -KEYWORD_FILE = support.findfile('keyword.py') -GRAMMAR_FILE = os.path.join(os.path.split(__file__)[0], - '..', '..', 'Python', 'graminit.c') -TEST_PY_FILE = 'keyword_test.py' -GRAMMAR_TEST_FILE = 'graminit_test.c' -PY_FILE_WITHOUT_KEYWORDS = 'minimal_keyword.py' -NONEXISTENT_FILE = 'not_here.txt' class Test_iskeyword(unittest.TestCase): @@ -35,103 +20,17 @@ def test_changing_the_kwlist_does_not_affect_iskeyword(self): keyword.kwlist = ['its', 'all', 'eggs', 'beans', 'and', 'a', 'slice'] self.assertFalse(keyword.iskeyword('eggs')) + def test_all_keywords_fail_to_be_used_as_names(self): + for key in keyword.kwlist: + with self.assertRaises(SyntaxError): + exec(f"{key} = 42") -class TestKeywordGeneration(unittest.TestCase): - - def _copy_file_without_generated_keywords(self, source_file, dest_file): - with open(source_file, 'rb') as fp: - lines = fp.readlines() - nl = lines[0][len(lines[0].strip()):] - with open(dest_file, 'wb') as fp: - fp.writelines(lines[:lines.index(b"#--start keywords--" + nl) + 1]) - fp.writelines(lines[lines.index(b"#--end keywords--" + nl):]) - - def _generate_keywords(self, grammar_file, target_keyword_py_file): - proc = subprocess.Popen([sys.executable, - KEYWORD_FILE, - grammar_file, - target_keyword_py_file], stderr=subprocess.PIPE) - stderr = proc.communicate()[1] - return proc.returncode, stderr - - @unittest.skipIf(not os.path.exists(GRAMMAR_FILE), - 'test only works from source build directory') - def test_real_grammar_and_keyword_file(self): - self._copy_file_without_generated_keywords(KEYWORD_FILE, TEST_PY_FILE) - self.addCleanup(support.unlink, TEST_PY_FILE) - self.assertFalse(filecmp.cmp(KEYWORD_FILE, TEST_PY_FILE)) - self.assertEqual((0, b''), self._generate_keywords(GRAMMAR_FILE, - TEST_PY_FILE)) - self.assertTrue(filecmp.cmp(KEYWORD_FILE, TEST_PY_FILE)) - - def test_grammar(self): - self._copy_file_without_generated_keywords(KEYWORD_FILE, TEST_PY_FILE) - self.addCleanup(support.unlink, TEST_PY_FILE) - with open(GRAMMAR_TEST_FILE, 'w') as fp: - # Some of these are probably implementation accidents. - fp.writelines(textwrap.dedent("""\ - {2, 1}, - {11, "encoding_decl", 0, 2, states_79, - "\000\000\040\000\000\000\000\000\000\000\000\000" - "\000\000\000\000\000\000\000\000\000"}, - {1, "jello"}, - {326, 0}, - {1, "turnip"}, - \t{1, "This one is tab indented" - {278, 0}, - {1, "crazy but legal" - "also legal" {1, " - {1, "continue"}, - {1, "lemon"}, - {1, "tomato"}, - {1, "wigii"}, - {1, 'no good'} - {283, 0}, - {1, "too many spaces"}""")) - self.addCleanup(support.unlink, GRAMMAR_TEST_FILE) - self._generate_keywords(GRAMMAR_TEST_FILE, TEST_PY_FILE) - expected = [ - " 'This one is tab indented',", - " 'also legal',", - " 'continue',", - " 'crazy but legal',", - " 'jello',", - " 'lemon',", - " 'tomato',", - " 'turnip',", - " 'wigii',", - ] - with open(TEST_PY_FILE) as fp: - lines = fp.read().splitlines() - start = lines.index("#--start keywords--") + 1 - end = lines.index("#--end keywords--") - actual = lines[start:end] - self.assertEqual(actual, expected) - - def test_empty_grammar_results_in_no_keywords(self): - self._copy_file_without_generated_keywords(KEYWORD_FILE, - PY_FILE_WITHOUT_KEYWORDS) - self.addCleanup(support.unlink, PY_FILE_WITHOUT_KEYWORDS) - shutil.copyfile(KEYWORD_FILE, TEST_PY_FILE) - self.addCleanup(support.unlink, TEST_PY_FILE) - self.assertEqual((0, b''), self._generate_keywords(os.devnull, - TEST_PY_FILE)) - self.assertTrue(filecmp.cmp(TEST_PY_FILE, PY_FILE_WITHOUT_KEYWORDS)) - - def test_keywords_py_without_markers_produces_error(self): - rc, stderr = self._generate_keywords(os.devnull, os.devnull) - self.assertNotEqual(rc, 0) - self.assertRegex(stderr, b'does not contain format markers') - - def test_missing_grammar_file_produces_error(self): - rc, stderr = self._generate_keywords(NONEXISTENT_FILE, KEYWORD_FILE) - self.assertNotEqual(rc, 0) - self.assertRegex(stderr, b'(?ms)' + NONEXISTENT_FILE.encode()) + def test_async_and_await_are_keywords(self): + self.assertIn("async", keyword.kwlist) + self.assertIn("await", keyword.kwlist) - def test_missing_keywords_py_file_produces_error(self): - rc, stderr = self._generate_keywords(os.devnull, NONEXISTENT_FILE) - self.assertNotEqual(rc, 0) - self.assertRegex(stderr, b'(?ms)' + NONEXISTENT_FILE.encode()) + def test_keywords_are_sorted(self): + self.assertListEqual(sorted(keyword.kwlist), keyword.kwlist) if __name__ == "__main__": diff --git a/Makefile.pre.in b/Makefile.pre.in index 8042e8e81a05..174b12c5de8b 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -724,7 +724,7 @@ regen-importlib: Programs/_freeze_importlib # Regenerate all generated files regen-all: regen-opcode regen-opcode-targets regen-typeslots regen-grammar \ - regen-token regen-symbol regen-ast regen-importlib clinic + regen-token regen-keyword regen-symbol regen-ast regen-importlib clinic ############################################################################ # Special rules for object files @@ -843,6 +843,15 @@ regen-token: $(srcdir)/Grammar/Tokens \ $(srcdir)/Lib/token.py +.PHONY: regen-keyword +regen-keyword: + # Regenerate Lib/keyword.py from Grammar/Grammar and Grammar/Tokens + # using Parser/pgen + $(PYTHON_FOR_REGEN) -m Parser.pgen.keywordgen $(srcdir)/Grammar/Grammar \ + $(srcdir)/Grammar/Tokens \ + $(srcdir)/Lib/keyword.py.new + $(UPDATE_FILE) $(srcdir)/Lib/keyword.py $(srcdir)/Lib/keyword.py.new + .PHONY: regen-symbol regen-symbol: $(srcdir)/Include/graminit.h # Regenerate Lib/symbol.py from Include/graminit.h diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-20-00-37-24.bpo-12456.fnKoKo.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-20-00-37-24.bpo-12456.fnKoKo.rst new file mode 100644 index 000000000000..10d6c4962734 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-20-00-37-24.bpo-12456.fnKoKo.rst @@ -0,0 +1,2 @@ +Regenerate :mod:`keyword` from the Grammar and Tokens file using pgen. Patch +by Pablo Galindo. diff --git a/Parser/pgen/keywordgen.py b/Parser/pgen/keywordgen.py new file mode 100644 index 000000000000..eeb3ef739fad --- /dev/null +++ b/Parser/pgen/keywordgen.py @@ -0,0 +1,60 @@ +"""Generate Lib/keyword.py from the Grammar and Tokens files using pgen""" + +import argparse + +from .pgen import ParserGenerator + +TEMPLATE = r''' +"""Keywords (from "Grammar/Grammar") + +This file is automatically generated; please don't muck it up! + +To update the symbols in this file, 'cd' to the top directory of +the python source tree and run: + + python3 -m Parser.pgen.keywordgen Grammar/Grammar \ + Grammar/Tokens \ + Lib/keyword.py + +Alternatively, you can run 'make regen-keyword'. +""" + +__all__ = ["iskeyword", "kwlist"] + +kwlist = [ + {keywords} +] + +iskeyword = frozenset(kwlist).__contains__ +'''.lstrip() + +EXTRA_KEYWORDS = ["async", "await"] + + +def main(): + parser = argparse.ArgumentParser(description="Generate the Lib/keywords.py " + "file from the grammar.") + parser.add_argument( + "grammar", type=str, help="The file with the grammar definition in EBNF format" + ) + parser.add_argument( + "tokens", type=str, help="The file with the token definitions" + ) + parser.add_argument( + "keyword_file", + type=argparse.FileType('w'), + help="The path to write the keyword definitions", + ) + args = parser.parse_args() + p = ParserGenerator(args.grammar, args.tokens) + grammar = p.make_grammar() + + with args.keyword_file as thefile: + all_keywords = sorted(list(grammar.keywords) + EXTRA_KEYWORDS) + + keywords = ",\n ".join(map(repr, all_keywords)) + thefile.write(TEMPLATE.format(keywords=keywords)) + + +if __name__ == "__main__": + main() From webhook-mailer at python.org Mon Mar 25 18:20:00 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 25 Mar 2019 22:20:00 -0000 Subject: [Python-checkins] bpo-36301: Add _Py_GetConfigsAsDict() function (GH-12540) Message-ID: https://github.com/python/cpython/commit/1075d1684ab84dc7c28d93cfb46e95e70d3b6d3b commit: 1075d1684ab84dc7c28d93cfb46e95e70d3b6d3b branch: master author: Victor Stinner committer: GitHub date: 2019-03-25T23:19:57+01:00 summary: bpo-36301: Add _Py_GetConfigsAsDict() function (GH-12540) * Add _Py_GetConfigsAsDict() function to get all configurations as a dict. * dump_config() of _testembed.c now dumps preconfig as a separated key: call _Py_GetConfigsAsDict(). * Make _PyMainInterpreterConfig_AsDict() private. files: M Include/cpython/coreconfig.h M Include/cpython/pylifecycle.h M Include/internal/pycore_coreconfig.h M Lib/test/pythoninfo.py M Lib/test/test_embed.py M Modules/_testcapimodule.c M Programs/_testembed.c M Python/coreconfig.c M Python/preconfig.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index bb086cbd125a..621a09fa79ec 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -400,8 +400,7 @@ typedef struct { /* --- Function used for testing ---------------------------------- */ -PyAPI_FUNC(PyObject *) _Py_GetGlobalVariablesAsDict(void); -PyAPI_FUNC(PyObject *) _PyCoreConfig_AsDict(const _PyCoreConfig *config); +PyAPI_FUNC(PyObject*) _Py_GetConfigsAsDict(void); #ifdef __cplusplus } diff --git a/Include/cpython/pylifecycle.h b/Include/cpython/pylifecycle.h index a226de8446c6..5f3a522a600a 100644 --- a/Include/cpython/pylifecycle.h +++ b/Include/cpython/pylifecycle.h @@ -33,9 +33,6 @@ PyAPI_FUNC(void) _PyMainInterpreterConfig_Clear(_PyMainInterpreterConfig *); PyAPI_FUNC(int) _PyMainInterpreterConfig_Copy( _PyMainInterpreterConfig *config, const _PyMainInterpreterConfig *config2); -/* Used by _testcapi.get_main_config() */ -PyAPI_FUNC(PyObject*) _PyMainInterpreterConfig_AsDict( - const _PyMainInterpreterConfig *config); PyAPI_FUNC(_PyInitError) _Py_InitializeMainInterpreter( PyInterpreterState *interp, diff --git a/Include/internal/pycore_coreconfig.h b/Include/internal/pycore_coreconfig.h index d44172e0dd8d..3c840101b843 100644 --- a/Include/internal/pycore_coreconfig.h +++ b/Include/internal/pycore_coreconfig.h @@ -90,8 +90,7 @@ PyAPI_FUNC(void) _Py_get_env_flag(_PyPreConfig *config, PyAPI_FUNC(_PyInitError) _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args, const _PyCoreConfig *coreconfig); -PyAPI_FUNC(int) _PyPreConfig_AsDict(const _PyPreConfig *config, - PyObject *dict); +PyAPI_FUNC(PyObject*) _PyPreConfig_AsDict(const _PyPreConfig *config); PyAPI_FUNC(_PyInitError) _PyPreConfig_ReadFromArgv(_PyPreConfig *config, const _PyArgv *args); PyAPI_FUNC(_PyInitError) _PyPreConfig_Write(_PyPreConfig *config); @@ -121,6 +120,11 @@ PyAPI_FUNC(_PyInitError) _PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, const _PyArgv *args); PyAPI_FUNC(_PyInitError) _PyCoreConfig_Write(const _PyCoreConfig *config); +/* --- _PyMainInterpreterConfig ----------------------------------- */ + +PyAPI_FUNC(PyObject*) _PyMainInterpreterConfig_AsDict( + const _PyMainInterpreterConfig *config); + #ifdef __cplusplus } #endif diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py index 07f3cb3bea42..79f7e82e0006 100644 --- a/Lib/test/pythoninfo.py +++ b/Lib/test/pythoninfo.py @@ -598,18 +598,15 @@ def collect_get_config(info_add): # Dump global configuration variables, _PyCoreConfig # and _PyMainInterpreterConfig try: - from _testcapi import get_global_config, get_core_config, get_main_config + from _testcapi import get_configs except ImportError: return - for prefix, get_config_func in ( - ('global_config', get_global_config), - ('core_config', get_core_config), - ('main_config', get_main_config), - ): - config = get_config_func() + all_configs = get_configs() + for config_type in sorted(all_configs): + config = all_configs[config_type] for key in sorted(config): - info_add('%s[%s]' % (prefix, key), repr(config[key])) + info_add('%s[%s]' % (config_type, key), repr(config[key])) def collect_subprocess(info_add): diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 374346e3cc89..6e145a5aa136 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -268,13 +268,19 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): ) # Mark config which should be get by get_default_config() GET_DEFAULT_CONFIG = object() + DEFAULT_PRE_CONFIG = { + 'allocator': None, + 'coerce_c_locale': 0, + 'coerce_c_locale_warn': 0, + 'dev_mode': 0, + 'isolated': 0, + 'use_environment': 1, + 'utf8_mode': 0, + } DEFAULT_CORE_CONFIG = { 'install_signal_handlers': 1, - 'use_environment': 1, 'use_hash_seed': 0, 'hash_seed': 0, - 'allocator': None, - 'dev_mode': 0, 'faulthandler': 0, 'tracemalloc': 0, 'import_time': 0, @@ -286,10 +292,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'filesystem_encoding': GET_DEFAULT_CONFIG, 'filesystem_errors': GET_DEFAULT_CONFIG, - 'utf8_mode': 0, - 'coerce_c_locale': 0, - 'coerce_c_locale_warn': 0, - 'pycache_prefix': None, 'program_name': './_testembed', 'argv': [""], @@ -306,7 +308,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'exec_prefix': GET_DEFAULT_CONFIG, 'base_exec_prefix': GET_DEFAULT_CONFIG, - 'isolated': 0, 'site_import': 1, 'bytes_warning': 0, 'inspect': 0, @@ -332,8 +333,10 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): '_frozen': 0, } if MS_WINDOWS: - DEFAULT_CORE_CONFIG.update({ + DEFAULT_PRE_CONFIG.update({ 'legacy_windows_fs_encoding': 0, + }) + DEFAULT_CORE_CONFIG.update({ 'legacy_windows_stdio': 0, }) @@ -359,6 +362,11 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'Py_HashRandomizationFlag': 1, '_Py_HasFileSystemDefaultEncodeErrors': 0, } + COPY_GLOBAL_PRE_CONFIG = [ + ('Py_IgnoreEnvironmentFlag', 'use_environment', True), + ('Py_IsolatedFlag', 'isolated'), + ('Py_UTF8Mode', 'utf8_mode'), + ] COPY_GLOBAL_CONFIG = [ # Copy core config to global config for expected values # True means that the core config value is inverted (0 => 1 and 1 => 0) @@ -368,21 +376,20 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): ('Py_FileSystemDefaultEncodeErrors', 'filesystem_errors'), ('Py_FileSystemDefaultEncoding', 'filesystem_encoding'), ('Py_FrozenFlag', '_frozen'), - ('Py_IgnoreEnvironmentFlag', 'use_environment', True), ('Py_InspectFlag', 'inspect'), ('Py_InteractiveFlag', 'interactive'), - ('Py_IsolatedFlag', 'isolated'), ('Py_NoSiteFlag', 'site_import', True), ('Py_NoUserSiteDirectory', 'user_site_directory', True), ('Py_OptimizeFlag', 'optimization_level'), ('Py_QuietFlag', 'quiet'), - ('Py_UTF8Mode', 'utf8_mode'), ('Py_UnbufferedStdioFlag', 'buffered_stdio', True), ('Py_VerboseFlag', 'verbose'), ] if MS_WINDOWS: - COPY_GLOBAL_CONFIG.extend(( + COPY_GLOBAL_PRE_CONFIG.extend(( ('Py_LegacyWindowsFSEncodingFlag', 'legacy_windows_fs_encoding'), + )) + COPY_GLOBAL_CONFIG.extend(( ('Py_LegacyWindowsStdioFlag', 'legacy_windows_stdio'), )) @@ -408,7 +415,7 @@ def check_main_config(self, config): expected['xoptions'] = self.main_xoptions(core_config['xoptions']) self.assertEqual(main_config, expected) - def get_expected_config(self, expected, env): + def get_expected_config(self, expected, expected_preconfig, env): expected = dict(self.DEFAULT_CORE_CONFIG, **expected) code = textwrap.dedent(''' @@ -436,7 +443,7 @@ def get_expected_config(self, expected, env): # when test_embed is run from a venv (bpo-35313) args = (sys.executable, '-S', '-c', code) env = dict(env) - if not expected['isolated']: + if not expected_preconfig['isolated']: env['PYTHONCOERCECLOCALE'] = '0' env['PYTHONUTF8'] = '0' proc = subprocess.run(args, env=env, @@ -453,6 +460,11 @@ def get_expected_config(self, expected, env): expected[key] = config[key] return expected + def check_pre_config(self, config, expected): + pre_config = dict(config['pre_config']) + core_config = dict(config['core_config']) + self.assertEqual(pre_config, expected) + def check_core_config(self, config, expected): core_config = dict(config['core_config']) for key in self.UNTESTED_CORE_CONFIG: @@ -460,6 +472,7 @@ def check_core_config(self, config, expected): self.assertEqual(core_config, expected) def check_global_config(self, config): + pre_config = config['pre_config'] core_config = config['core_config'] expected = dict(self.DEFAULT_GLOBAL_CONFIG) @@ -470,10 +483,17 @@ def check_global_config(self, config): else: global_key, core_key = item expected[global_key] = core_config[core_key] + for item in self.COPY_GLOBAL_PRE_CONFIG: + if len(item) == 3: + global_key, core_key, opposite = item + expected[global_key] = 0 if pre_config[core_key] else 1 + else: + global_key, core_key = item + expected[global_key] = pre_config[core_key] self.assertEqual(config['global_config'], expected) - def check_config(self, testname, expected): + def check_config(self, testname, expected_config, expected_preconfig): env = dict(os.environ) # Remove PYTHON* environment variables to get deterministic environment for key in list(env): @@ -488,15 +508,21 @@ def check_config(self, testname, expected): # Ignore err config = json.loads(out) - expected = self.get_expected_config(expected, env) - self.check_core_config(config, expected) + expected_preconfig = dict(self.DEFAULT_PRE_CONFIG, **expected_preconfig) + expected_config = self.get_expected_config(expected_config, expected_preconfig, env) + + self.check_core_config(config, expected_config) + self.check_pre_config(config, expected_preconfig) self.check_main_config(config) self.check_global_config(config) def test_init_default_config(self): - self.check_config("init_default_config", {}) + self.check_config("init_default_config", {}, {}) def test_init_global_config(self): + preconfig = { + 'utf8_mode': 1, + } config = { 'program_name': './globalvar', 'site_import': 0, @@ -509,7 +535,6 @@ def test_init_global_config(self): 'quiet': 1, 'buffered_stdio': 0, - 'utf8_mode': 1, 'stdio_encoding': 'utf-8', 'stdio_errors': 'surrogateescape', 'filesystem_encoding': 'utf-8', @@ -517,21 +542,23 @@ def test_init_global_config(self): 'user_site_directory': 0, '_frozen': 1, } - self.check_config("init_global_config", config) + self.check_config("init_global_config", config, preconfig) def test_init_from_config(self): + preconfig = { + 'allocator': 'malloc', + 'utf8_mode': 1, + } config = { 'install_signal_handlers': 0, 'use_hash_seed': 1, 'hash_seed': 123, - 'allocator': 'malloc', 'tracemalloc': 2, 'import_time': 1, 'show_ref_count': 1, 'show_alloc_count': 1, 'malloc_stats': 1, - 'utf8_mode': 1, 'stdio_encoding': 'iso8859-1', 'stdio_errors': 'replace', 'filesystem_encoding': 'utf-8', @@ -559,16 +586,18 @@ def test_init_from_config(self): '_check_hash_pycs_mode': 'always', '_frozen': 1, } - self.check_config("init_from_config", config) + self.check_config("init_from_config", config, preconfig) + INIT_ENV_PRECONFIG = { + 'allocator': 'malloc', + 'utf8_mode': 1, + } INIT_ENV_CONFIG = { 'use_hash_seed': 1, 'hash_seed': 42, - 'allocator': 'malloc', 'tracemalloc': 2, 'import_time': 1, 'malloc_stats': 1, - 'utf8_mode': 1, 'filesystem_encoding': 'utf-8', 'filesystem_errors': UTF8_MODE_ERRORS, 'inspect': 1, @@ -584,35 +613,42 @@ def test_init_from_config(self): } def test_init_env(self): - self.check_config("init_env", self.INIT_ENV_CONFIG) + self.check_config("init_env", self.INIT_ENV_CONFIG, self.INIT_ENV_PRECONFIG) def test_init_env_dev_mode(self): - config = dict(self.INIT_ENV_CONFIG, + preconfig = dict(self.INIT_ENV_PRECONFIG, allocator='debug', dev_mode=1) - self.check_config("init_env_dev_mode", config) - - def test_init_env_dev_mode(self): config = dict(self.INIT_ENV_CONFIG, - allocator='malloc', dev_mode=1) - self.check_config("init_env_dev_mode_alloc", config) + self.check_config("init_env_dev_mode", config, preconfig) + + def test_init_env_dev_mode(self): + preconfig = dict(self.INIT_ENV_PRECONFIG, + allocator='malloc', + dev_mode=1) + config = dict(self.INIT_ENV_CONFIG) + self.check_config("init_env_dev_mode_alloc", config, preconfig) def test_init_dev_mode(self): - config = { + preconfig = { + 'allocator': 'debug', 'dev_mode': 1, + } + config = { 'faulthandler': 1, - 'allocator': 'debug', } - self.check_config("init_dev_mode", config) + self.check_config("init_dev_mode", config, preconfig) def test_init_isolated(self): - config = { + preconfig = { 'isolated': 1, 'use_environment': 0, + } + config = { 'user_site_directory': 0, } - self.check_config("init_isolated", config) + self.check_config("init_isolated", config, preconfig) if __name__ == "__main__": diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 350ef771630e..c82ba0cfd0d6 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -4675,27 +4675,9 @@ decode_locale_ex(PyObject *self, PyObject *args) static PyObject * -get_global_config(PyObject *self, PyObject *Py_UNUSED(args)) +get_configs(PyObject *self, PyObject *Py_UNUSED(args)) { - return _Py_GetGlobalVariablesAsDict(); -} - - -static PyObject * -get_core_config(PyObject *self, PyObject *Py_UNUSED(args)) -{ - PyInterpreterState *interp = _PyInterpreterState_Get(); - const _PyCoreConfig *config = _PyInterpreterState_GetCoreConfig(interp); - return _PyCoreConfig_AsDict(config); -} - - -static PyObject * -get_main_config(PyObject *self, PyObject *Py_UNUSED(args)) -{ - PyInterpreterState *interp = _PyInterpreterState_Get(); - const _PyMainInterpreterConfig *config = _PyInterpreterState_GetMainConfig(interp); - return _PyMainInterpreterConfig_AsDict(config); + return _Py_GetConfigsAsDict(); } @@ -4942,9 +4924,7 @@ static PyMethodDef TestMethods[] = { {"bad_get", (PyCFunction)(void(*)(void))bad_get, METH_FASTCALL}, {"EncodeLocaleEx", encode_locale_ex, METH_VARARGS}, {"DecodeLocaleEx", decode_locale_ex, METH_VARARGS}, - {"get_global_config", get_global_config, METH_NOARGS}, - {"get_core_config", get_core_config, METH_NOARGS}, - {"get_main_config", get_main_config, METH_NOARGS}, + {"get_configs", get_configs, METH_NOARGS}, #ifdef Py_REF_DEBUG {"negative_refcount", negative_refcount, METH_NOARGS}, #endif diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 7c143f1ef387..ab5802da3630 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -301,64 +301,29 @@ static int test_initialize_pymain(void) static int dump_config_impl(void) { - PyObject *config = NULL; - PyObject *dict = NULL; - - config = PyDict_New(); + PyObject *config = _Py_GetConfigsAsDict(); if (config == NULL) { - goto error; - } - - /* global config */ - dict = _Py_GetGlobalVariablesAsDict(); - if (dict == NULL) { - goto error; - } - if (PyDict_SetItemString(config, "global_config", dict) < 0) { - goto error; - } - Py_CLEAR(dict); - - /* core config */ - PyInterpreterState *interp = _PyInterpreterState_Get(); - const _PyCoreConfig *core_config = _PyInterpreterState_GetCoreConfig(interp); - dict = _PyCoreConfig_AsDict(core_config); - if (dict == NULL) { - goto error; - } - if (PyDict_SetItemString(config, "core_config", dict) < 0) { - goto error; + return -1; } - Py_CLEAR(dict); - /* main config */ - const _PyMainInterpreterConfig *main_config = _PyInterpreterState_GetMainConfig(interp); - dict = _PyMainInterpreterConfig_AsDict(main_config); - if (dict == NULL) { - goto error; + PyObject *res; + PyObject *json = PyImport_ImportModule("json"); + if (json) { + res = PyObject_CallMethod(json, "dumps", "O", config); + Py_DECREF(json); } - if (PyDict_SetItemString(config, "main_config", dict) < 0) { - goto error; + else { + res = NULL; } - Py_CLEAR(dict); - - PyObject *json = PyImport_ImportModule("json"); - PyObject *res = PyObject_CallMethod(json, "dumps", "O", config); - Py_DECREF(json); Py_CLEAR(config); if (res == NULL) { - goto error; + return -1; } PySys_FormatStdout("%S\n", res); Py_DECREF(res); return 0; - -error: - Py_XDECREF(config); - Py_XDECREF(dict); - return -1; } diff --git a/Python/coreconfig.c b/Python/coreconfig.c index ba5abb6ca403..a434b258f2aa 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -131,7 +131,7 @@ int Py_LegacyWindowsStdioFlag = 0; /* Uses FileIO instead of WindowsConsoleIO */ #endif -PyObject * +static PyObject * _Py_GetGlobalVariablesAsDict(void) { PyObject *dict, *obj; @@ -1563,7 +1563,7 @@ _PyCoreConfig_Write(const _PyCoreConfig *config) } -PyObject * +static PyObject * _PyCoreConfig_AsDict(const _PyCoreConfig *config) { PyObject *dict; @@ -1573,11 +1573,6 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) return NULL; } - if (_PyPreConfig_AsDict(&config->preconfig, dict) < 0) { - Py_DECREF(dict); - return NULL; - } - #define SET_ITEM(KEY, EXPR) \ do { \ PyObject *obj = (EXPR); \ @@ -2158,3 +2153,67 @@ _PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, const _PyArgv *args) cmdline_clear(&cmdline); return err; } + + +PyObject* +_Py_GetConfigsAsDict(void) +{ + PyObject *config = NULL; + PyObject *dict = NULL; + + config = PyDict_New(); + if (config == NULL) { + goto error; + } + + /* global config */ + dict = _Py_GetGlobalVariablesAsDict(); + if (dict == NULL) { + goto error; + } + if (PyDict_SetItemString(config, "global_config", dict) < 0) { + goto error; + } + Py_CLEAR(dict); + + /* pre config */ + PyInterpreterState *interp = _PyInterpreterState_Get(); + const _PyCoreConfig *core_config = _PyInterpreterState_GetCoreConfig(interp); + const _PyPreConfig *pre_config = &core_config->preconfig; + dict = _PyPreConfig_AsDict(pre_config); + if (dict == NULL) { + goto error; + } + if (PyDict_SetItemString(config, "pre_config", dict) < 0) { + goto error; + } + Py_CLEAR(dict); + + /* core config */ + dict = _PyCoreConfig_AsDict(core_config); + if (dict == NULL) { + goto error; + } + if (PyDict_SetItemString(config, "core_config", dict) < 0) { + goto error; + } + Py_CLEAR(dict); + + /* main config */ + const _PyMainInterpreterConfig *main_config = _PyInterpreterState_GetMainConfig(interp); + dict = _PyMainInterpreterConfig_AsDict(main_config); + if (dict == NULL) { + goto error; + } + if (PyDict_SetItemString(config, "main_config", dict) < 0) { + goto error; + } + Py_CLEAR(dict); + + return config; + +error: + Py_XDECREF(config); + Py_XDECREF(dict); + return NULL; +} diff --git a/Python/preconfig.c b/Python/preconfig.c index ac87a7a3c7e9..c65ee28f73ae 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -574,9 +574,16 @@ _PyPreCmdline_SetPreConfig(const _PyPreCmdline *cmdline, _PyPreConfig *config) } -int -_PyPreConfig_AsDict(const _PyPreConfig *config, PyObject *dict) +PyObject* +_PyPreConfig_AsDict(const _PyPreConfig *config) { + PyObject *dict; + + dict = PyDict_New(); + if (dict == NULL) { + return NULL; + } + #define SET_ITEM(KEY, EXPR) \ do { \ PyObject *obj = (EXPR); \ @@ -608,10 +615,11 @@ _PyPreConfig_AsDict(const _PyPreConfig *config, PyObject *dict) #endif SET_ITEM_INT(dev_mode); SET_ITEM_STR(allocator); - return 0; + return dict; fail: - return -1; + Py_DECREF(dict); + return NULL; #undef FROM_STRING #undef SET_ITEM From webhook-mailer at python.org Mon Mar 25 18:53:06 2019 From: webhook-mailer at python.org (Brett Cannon) Date: Mon, 25 Mar 2019 22:53:06 -0000 Subject: [Python-checkins] bpo-36345: Add a new example in the documentation of wsgiref (#12511) Message-ID: https://github.com/python/cpython/commit/360e1e4c519cfc139de707bcdd1e6c871eec79ee commit: 360e1e4c519cfc139de707bcdd1e6c871eec79ee branch: master author: St?phane Wirtel committer: Brett Cannon date: 2019-03-25T15:52:56-07:00 summary: bpo-36345: Add a new example in the documentation of wsgiref (#12511) files: A Misc/NEWS.d/next/Documentation/2019-03-23-09-25-12.bpo-36345.L704Zv.rst M Doc/library/wsgiref.rst diff --git a/Doc/library/wsgiref.rst b/Doc/library/wsgiref.rst index ffca1fc8168f..b85ec53c8ae5 100644 --- a/Doc/library/wsgiref.rst +++ b/Doc/library/wsgiref.rst @@ -781,3 +781,35 @@ This is a working "Hello World" WSGI application:: # Serve until process is killed httpd.serve_forever() + + +Example of a small wsgiref-based web server:: + + # Takes a path to serve from and an optional port number (defaults to 8000), + # then tries to serve files. Mime types are guessed from the file names, 404 + # errors are raised if the file is not found. + import sys + import os + import mimetypes + from wsgiref import simple_server, util + + def app(environ, respond): + fn = os.path.join(path, environ['PATH_INFO'][1:]) + if '.' not in fn.split(os.path.sep)[-1]: + fn = os.path.join(fn, 'index.html') + type = mimetypes.guess_type(fn)[0] + + if os.path.exists(fn): + respond('200 OK', [('Content-Type', type)]) + return util.FileWrapper(open(fn, "rb")) + else: + respond('404 Not Found', [('Content-Type', 'text/plain')]) + return [b'not found'] + + path = sys.argv[1] + port = int(sys.argv[2]) if len(sys.argv) > 2 else 8000 + with simple_server.make_server('', port, app) as httpd: + print("Serving {} on port {}, control-C to stop".format(path, port)) + + # Serve until process is killed + httpd.serve_forever() diff --git a/Misc/NEWS.d/next/Documentation/2019-03-23-09-25-12.bpo-36345.L704Zv.rst b/Misc/NEWS.d/next/Documentation/2019-03-23-09-25-12.bpo-36345.L704Zv.rst new file mode 100644 index 000000000000..c6206a74ab29 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-03-23-09-25-12.bpo-36345.L704Zv.rst @@ -0,0 +1,2 @@ +Using the code of the ``Tools/scripts/serve.py`` script as an example in the +:mod:`wsgiref` documentation. Contributed by St?phane Wirtel. From webhook-mailer at python.org Mon Mar 25 18:53:47 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Mon, 25 Mar 2019 22:53:47 -0000 Subject: [Python-checkins] bpo-34085: Improve wording on classmethod/staticmethod (#8228) Message-ID: https://github.com/python/cpython/commit/548cb6060ab9d5a66931ea2be4da08c2c72c9176 commit: 548cb6060ab9d5a66931ea2be4da08c2c72c9176 branch: master author: Andre Delfino committer: Cheryl Sabella date: 2019-03-25T18:53:43-04:00 summary: bpo-34085: Improve wording on classmethod/staticmethod (#8228) * bpo-34085: Improve wording on classmethod/staticmethod * Address comments from ?ric * Address comments from ?ric files: M Doc/library/functions.rst diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index ae0c9fb55a75..6342ee3bb08f 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -211,19 +211,18 @@ are always available. They are listed here in alphabetical order. @classmethod def f(cls, arg1, arg2, ...): ... - The ``@classmethod`` form is a function :term:`decorator` -- see the description - of function definitions in :ref:`function` for details. + The ``@classmethod`` form is a function :term:`decorator` -- see + :ref:`function` for details. - It can be called either on the class (such as ``C.f()``) or on an instance (such + A class method can be called either on the class (such as ``C.f()``) or on an instance (such as ``C().f()``). The instance is ignored except for its class. If a class method is called for a derived class, the derived class object is passed as the implied first argument. Class methods are different than C++ or Java static methods. If you want those, - see :func:`staticmethod` in this section. + see :func:`staticmethod`. - For more information on class methods, consult the documentation on the standard - type hierarchy in :ref:`types`. + For more information on class methods, see :ref:`types`. .. function:: compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1) @@ -1452,11 +1451,11 @@ are always available. They are listed here in alphabetical order. @staticmethod def f(arg1, arg2, ...): ... - The ``@staticmethod`` form is a function :term:`decorator` -- see the - description of function definitions in :ref:`function` for details. + The ``@staticmethod`` form is a function :term:`decorator` -- see + :ref:`function` for details. - It can be called either on the class (such as ``C.f()``) or on an instance (such - as ``C().f()``). The instance is ignored except for its class. + A static method can be called either on the class (such as ``C.f()``) or on an instance (such + as ``C().f()``). Static methods in Python are similar to those found in Java or C++. Also see :func:`classmethod` for a variant that is useful for creating alternate class @@ -1471,8 +1470,7 @@ are always available. They are listed here in alphabetical order. class C: builtin_open = staticmethod(open) - For more information on static methods, consult the documentation on the - standard type hierarchy in :ref:`types`. + For more information on static methods, see :ref:`types`. .. index:: From webhook-mailer at python.org Mon Mar 25 18:58:44 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 25 Mar 2019 22:58:44 -0000 Subject: [Python-checkins] bpo-34085: Improve wording on classmethod/staticmethod (GH-8228) Message-ID: https://github.com/python/cpython/commit/bd96393cda54044d81054225dcfc1b26374589a8 commit: bd96393cda54044d81054225dcfc1b26374589a8 branch: 2.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-25T15:58:40-07:00 summary: bpo-34085: Improve wording on classmethod/staticmethod (GH-8228) * bpo-34085: Improve wording on classmethod/staticmethod * Address comments from ?ric * Address comments from ?ric (cherry picked from commit 548cb6060ab9d5a66931ea2be4da08c2c72c9176) Co-authored-by: Andre Delfino files: M Doc/library/functions.rst diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 4386e603add1..8701f9d8ffb0 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -175,19 +175,18 @@ section. def f(cls, arg1, arg2, ...): ... - The ``@classmethod`` form is a function :term:`decorator` -- see the description - of function definitions in :ref:`function` for details. + The ``@classmethod`` form is a function :term:`decorator` -- see + :ref:`function` for details. - It can be called either on the class (such as ``C.f()``) or on an instance (such + A class method can be called either on the class (such as ``C.f()``) or on an instance (such as ``C().f()``). The instance is ignored except for its class. If a class method is called for a derived class, the derived class object is passed as the implied first argument. Class methods are different than C++ or Java static methods. If you want those, - see :func:`staticmethod` in this section. + see :func:`staticmethod`. - For more information on class methods, consult the documentation on the standard - type hierarchy in :ref:`types`. + For more information on class methods, see :ref:`types`. .. versionadded:: 2.2 @@ -1346,18 +1345,17 @@ section. def f(arg1, arg2, ...): ... - The ``@staticmethod`` form is a function :term:`decorator` -- see the - description of function definitions in :ref:`function` for details. + The ``@staticmethod`` form is a function :term:`decorator` -- see + :ref:`function` for details. - It can be called either on the class (such as ``C.f()``) or on an instance (such - as ``C().f()``). The instance is ignored except for its class. + A static method can be called either on the class (such as ``C.f()``) or on an instance (such + as ``C().f()``). Static methods in Python are similar to those found in Java or C++. Also see :func:`classmethod` for a variant that is useful for creating alternate class constructors. - For more information on static methods, consult the documentation on the - standard type hierarchy in :ref:`types`. + For more information on static methods, see :ref:`types`. .. versionadded:: 2.2 From webhook-mailer at python.org Mon Mar 25 19:00:06 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 25 Mar 2019 23:00:06 -0000 Subject: [Python-checkins] bpo-34085: Improve wording on classmethod/staticmethod (GH-8228) Message-ID: https://github.com/python/cpython/commit/b23b08623a46cef841038ee32948020692ef1b35 commit: b23b08623a46cef841038ee32948020692ef1b35 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-25T16:00:00-07:00 summary: bpo-34085: Improve wording on classmethod/staticmethod (GH-8228) * bpo-34085: Improve wording on classmethod/staticmethod * Address comments from ?ric * Address comments from ?ric (cherry picked from commit 548cb6060ab9d5a66931ea2be4da08c2c72c9176) Co-authored-by: Andre Delfino files: M Doc/library/functions.rst diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 9326b8d0fe7d..2ed6fb3ba2b0 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -210,19 +210,18 @@ are always available. They are listed here in alphabetical order. @classmethod def f(cls, arg1, arg2, ...): ... - The ``@classmethod`` form is a function :term:`decorator` -- see the description - of function definitions in :ref:`function` for details. + The ``@classmethod`` form is a function :term:`decorator` -- see + :ref:`function` for details. - It can be called either on the class (such as ``C.f()``) or on an instance (such + A class method can be called either on the class (such as ``C.f()``) or on an instance (such as ``C().f()``). The instance is ignored except for its class. If a class method is called for a derived class, the derived class object is passed as the implied first argument. Class methods are different than C++ or Java static methods. If you want those, - see :func:`staticmethod` in this section. + see :func:`staticmethod`. - For more information on class methods, consult the documentation on the standard - type hierarchy in :ref:`types`. + For more information on class methods, see :ref:`types`. .. function:: compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1) @@ -1445,11 +1444,11 @@ are always available. They are listed here in alphabetical order. @staticmethod def f(arg1, arg2, ...): ... - The ``@staticmethod`` form is a function :term:`decorator` -- see the - description of function definitions in :ref:`function` for details. + The ``@staticmethod`` form is a function :term:`decorator` -- see + :ref:`function` for details. - It can be called either on the class (such as ``C.f()``) or on an instance (such - as ``C().f()``). The instance is ignored except for its class. + A static method can be called either on the class (such as ``C.f()``) or on an instance (such + as ``C().f()``). Static methods in Python are similar to those found in Java or C++. Also see :func:`classmethod` for a variant that is useful for creating alternate class @@ -1464,8 +1463,7 @@ are always available. They are listed here in alphabetical order. class C: builtin_open = staticmethod(open) - For more information on static methods, consult the documentation on the - standard type hierarchy in :ref:`types`. + For more information on static methods, see :ref:`types`. .. index:: From webhook-mailer at python.org Mon Mar 25 19:03:17 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 25 Mar 2019 23:03:17 -0000 Subject: [Python-checkins] bpo-36301: Add _Py_GetEnv() function (GH-12542) Message-ID: https://github.com/python/cpython/commit/f78a5e9ce8f32a195f5f788aade79578437f30a6 commit: f78a5e9ce8f32a195f5f788aade79578437f30a6 branch: master author: Victor Stinner committer: GitHub date: 2019-03-26T00:03:15+01:00 summary: bpo-36301: Add _Py_GetEnv() function (GH-12542) * Make _PyPreConfig_GetEnv(), _PyCoreConfig_GetEnv() and _PyCoreConfig_GetEnvDup() private * _Py_get_env_flag() first parameter becomes "int use_environment" files: M Include/internal/pycore_coreconfig.h M Modules/main.c M Python/coreconfig.c M Python/preconfig.c diff --git a/Include/internal/pycore_coreconfig.h b/Include/internal/pycore_coreconfig.h index 3c840101b843..829ff3109fda 100644 --- a/Include/internal/pycore_coreconfig.h +++ b/Include/internal/pycore_coreconfig.h @@ -76,15 +76,17 @@ PyAPI_FUNC(int) _Py_str_to_int( PyAPI_FUNC(const wchar_t*) _Py_get_xoption( const _PyWstrList *xoptions, const wchar_t *name); +PyAPI_FUNC(const char*) _Py_GetEnv( + int use_environment, + const char *name); PyAPI_FUNC(void) _PyPreConfig_Clear(_PyPreConfig *config); PyAPI_FUNC(int) _PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2); PyAPI_FUNC(void) _PyPreConfig_GetGlobalConfig(_PyPreConfig *config); PyAPI_FUNC(void) _PyPreConfig_SetGlobalConfig(const _PyPreConfig *config); -PyAPI_FUNC(const char*) _PyPreConfig_GetEnv(const _PyPreConfig *config, - const char *name); -PyAPI_FUNC(void) _Py_get_env_flag(_PyPreConfig *config, +PyAPI_FUNC(void) _Py_get_env_flag( + int use_environment, int *flag, const char *name); PyAPI_FUNC(_PyInitError) _PyPreConfig_Read(_PyPreConfig *config, @@ -107,14 +109,6 @@ PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetPathConfig( const _PyCoreConfig *config); PyAPI_FUNC(void) _PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config); PyAPI_FUNC(void) _PyCoreConfig_SetGlobalConfig(const _PyCoreConfig *config); -PyAPI_FUNC(const char*) _PyCoreConfig_GetEnv( - const _PyCoreConfig *config, - const char *name); -PyAPI_FUNC(int) _PyCoreConfig_GetEnvDup( - const _PyCoreConfig *config, - wchar_t **dest, - wchar_t *wname, - char *name); PyAPI_FUNC(_PyInitError) _PyCoreConfig_Read(_PyCoreConfig *config); PyAPI_FUNC(_PyInitError) _PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, const _PyArgv *args); diff --git a/Modules/main.c b/Modules/main.c index 197c9b39ebf0..46bc72af46dd 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -655,7 +655,7 @@ pymain_run_file(_PyCoreConfig *config, PyCompilerFlags *cf) static void pymain_run_startup(_PyCoreConfig *config, PyCompilerFlags *cf) { - const char *startup = _PyCoreConfig_GetEnv(config, "PYTHONSTARTUP"); + const char *startup = _Py_GetEnv(config->preconfig.use_environment, "PYTHONSTARTUP"); if (startup == NULL) { return; } @@ -735,7 +735,7 @@ pymain_repl(_PyCoreConfig *config, PyCompilerFlags *cf, int *exitcode) { /* Check this environment variable at the end, to give programs the opportunity to set it from Python. */ - if (!Py_InspectFlag && _PyCoreConfig_GetEnv(config, "PYTHONINSPECT")) { + if (!Py_InspectFlag && _Py_GetEnv(config->preconfig.use_environment, "PYTHONINSPECT")) { Py_InspectFlag = 1; config->inspect = 1; } diff --git a/Python/coreconfig.c b/Python/coreconfig.c index a434b258f2aa..1245aef54b87 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -610,14 +610,14 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) } -const char* +static const char* _PyCoreConfig_GetEnv(const _PyCoreConfig *config, const char *name) { - return _PyPreConfig_GetEnv(&config->preconfig, name); + return _Py_GetEnv(config->preconfig.use_environment, name); } -int +static int _PyCoreConfig_GetEnvDup(const _PyCoreConfig *config, wchar_t **dest, wchar_t *wname, char *name) @@ -924,34 +924,34 @@ config_wstr_to_int(const wchar_t *wstr, int *result) static _PyInitError config_read_env_vars(_PyCoreConfig *config) { - _PyPreConfig *preconfig = &config->preconfig; + int use_env = config->preconfig.use_environment; /* Get environment variables */ - _Py_get_env_flag(preconfig, &config->parser_debug, "PYTHONDEBUG"); - _Py_get_env_flag(preconfig, &config->verbose, "PYTHONVERBOSE"); - _Py_get_env_flag(preconfig, &config->optimization_level, "PYTHONOPTIMIZE"); - _Py_get_env_flag(preconfig, &config->inspect, "PYTHONINSPECT"); + _Py_get_env_flag(use_env, &config->parser_debug, "PYTHONDEBUG"); + _Py_get_env_flag(use_env, &config->verbose, "PYTHONVERBOSE"); + _Py_get_env_flag(use_env, &config->optimization_level, "PYTHONOPTIMIZE"); + _Py_get_env_flag(use_env, &config->inspect, "PYTHONINSPECT"); int dont_write_bytecode = 0; - _Py_get_env_flag(preconfig, &dont_write_bytecode, "PYTHONDONTWRITEBYTECODE"); + _Py_get_env_flag(use_env, &dont_write_bytecode, "PYTHONDONTWRITEBYTECODE"); if (dont_write_bytecode) { config->write_bytecode = 0; } int no_user_site_directory = 0; - _Py_get_env_flag(preconfig, &no_user_site_directory, "PYTHONNOUSERSITE"); + _Py_get_env_flag(use_env, &no_user_site_directory, "PYTHONNOUSERSITE"); if (no_user_site_directory) { config->user_site_directory = 0; } int unbuffered_stdio = 0; - _Py_get_env_flag(preconfig, &unbuffered_stdio, "PYTHONUNBUFFERED"); + _Py_get_env_flag(use_env, &unbuffered_stdio, "PYTHONUNBUFFERED"); if (unbuffered_stdio) { config->buffered_stdio = 0; } #ifdef MS_WINDOWS - _Py_get_env_flag(preconfig, &config->legacy_windows_stdio, + _Py_get_env_flag(use_env, &config->legacy_windows_stdio, "PYTHONLEGACYWINDOWSSTDIO"); #endif diff --git a/Python/preconfig.c b/Python/preconfig.c index c65ee28f73ae..8b685ce42d04 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -270,11 +270,11 @@ _PyPreConfig_SetGlobalConfig(const _PyPreConfig *config) const char* -_PyPreConfig_GetEnv(const _PyPreConfig *config, const char *name) +_Py_GetEnv(int use_environment, const char *name) { - assert(config->use_environment >= 0); + assert(use_environment >= 0); - if (!config->use_environment) { + if (!use_environment) { return NULL; } @@ -288,6 +288,13 @@ _PyPreConfig_GetEnv(const _PyPreConfig *config, const char *name) } +static const char* +_PyPreConfig_GetEnv(const _PyPreConfig *config, const char *name) +{ + return _Py_GetEnv(config->use_environment, name); +} + + int _Py_str_to_int(const char *str, int *result) { @@ -307,9 +314,9 @@ _Py_str_to_int(const char *str, int *result) void -_Py_get_env_flag(_PyPreConfig *config, int *flag, const char *name) +_Py_get_env_flag(int use_environment, int *flag, const char *name) { - const char *var = _PyPreConfig_GetEnv(config, name); + const char *var = _Py_GetEnv(use_environment, name); if (!var) { return; } @@ -434,8 +441,9 @@ preconfig_read(_PyPreConfig *config, _PyPreCmdline *cmdline) /* legacy_windows_fs_encoding, utf8_mode, coerce_c_locale */ if (config->use_environment) { #ifdef MS_WINDOWS - _Py_get_env_flag(config, &config->legacy_windows_fs_encoding, - "PYTHONLEGACYWINDOWSFSENCODING"); + _Py_get_env_flag(config->use_environment, + &config->legacy_windows_fs_encoding, + "PYTHONLEGACYWINDOWSFSENCODING"); #endif const char *env = _PyPreConfig_GetEnv(config, "PYTHONCOERCECLOCALE"); From webhook-mailer at python.org Mon Mar 25 19:32:10 2019 From: webhook-mailer at python.org (Ned Deily) Date: Mon, 25 Mar 2019 23:32:10 -0000 Subject: [Python-checkins] Correct minor edit to news entry. (GH-12299) Message-ID: https://github.com/python/cpython/commit/ab48fc0b9fd5371894ba43e246459bfc2d4e10e1 commit: ab48fc0b9fd5371894ba43e246459bfc2d4e10e1 branch: 3.7 author: Ned Deily committer: Ned Deily date: 2019-03-24T22:21:46-04:00 summary: Correct minor edit to news entry. (GH-12299) files: M Misc/NEWS.d/3.7.3rc1.rst diff --git a/Misc/NEWS.d/3.7.3rc1.rst b/Misc/NEWS.d/3.7.3rc1.rst index 4ddf900a7e58..37e50d212943 100644 --- a/Misc/NEWS.d/3.7.3rc1.rst +++ b/Misc/NEWS.d/3.7.3rc1.rst @@ -1187,7 +1187,7 @@ Squeezer now properly counts wrapped lines before newlines. .. nonce: M58_K3 .. section: IDLE -Gray out Code Context menu entry on macOS when it's not applicable. +Gray out Code Context menu entry when it's not applicable. .. From webhook-mailer at python.org Mon Mar 25 21:31:16 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 26 Mar 2019 01:31:16 -0000 Subject: [Python-checkins] bpo-36301: Remove _PyCoreConfig.preconfig (GH-12546) Message-ID: https://github.com/python/cpython/commit/20004959d23d07ac784eef51ecb161012180faa8 commit: 20004959d23d07ac784eef51ecb161012180faa8 branch: master author: Victor Stinner committer: GitHub date: 2019-03-26T02:31:11+01:00 summary: bpo-36301: Remove _PyCoreConfig.preconfig (GH-12546) * Replace _PyCoreConfig.preconfig with 3 new fields in _PyCoreConfig: isolated, use_environment, dev_mode. * Add _PyPreCmdline.dev_mode. * Add _Py_PreInitializeFromPreConfigInPlace(). files: M Include/cpython/coreconfig.h M Include/cpython/pylifecycle.h M Include/internal/pycore_coreconfig.h M Include/internal/pycore_pylifecycle.h M Lib/test/test_embed.py M Modules/main.c M Programs/_freeze_importlib.c M Programs/_testembed.c M Python/coreconfig.c M Python/pathconfig.c M Python/preconfig.c M Python/pylifecycle.c M Python/sysmodule.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index 621a09fa79ec..827a19a145d0 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -123,7 +123,9 @@ typedef struct { /* --- _PyCoreConfig ---------------------------------------------- */ typedef struct { - _PyPreConfig preconfig; + int isolated; + int use_environment; + int dev_mode; /* Install signal handlers? Yes by default. */ int install_signal_handlers; @@ -375,7 +377,9 @@ typedef struct { #define _PyCoreConfig_INIT \ (_PyCoreConfig){ \ _PyCoreConfig_WINDOWS_INIT \ - .preconfig = _PyPreConfig_INIT, \ + .isolated = -1, \ + .use_environment = -1, \ + .dev_mode = -1, \ .install_signal_handlers = 1, \ .use_hash_seed = -1, \ .faulthandler = -1, \ diff --git a/Include/cpython/pylifecycle.h b/Include/cpython/pylifecycle.h index 5f3a522a600a..e32e54cba07f 100644 --- a/Include/cpython/pylifecycle.h +++ b/Include/cpython/pylifecycle.h @@ -16,7 +16,7 @@ PyAPI_FUNC(int) Py_SetStandardStreamEncoding(const char *encoding, PyAPI_FUNC(_PyInitError) _Py_PreInitialize(void); PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromPreConfig( - _PyPreConfig *preconfig); + const _PyPreConfig *preconfig); PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromConfig( const _PyCoreConfig *coreconfig); diff --git a/Include/internal/pycore_coreconfig.h b/Include/internal/pycore_coreconfig.h index 829ff3109fda..d79f590d68d2 100644 --- a/Include/internal/pycore_coreconfig.h +++ b/Include/internal/pycore_coreconfig.h @@ -16,12 +16,14 @@ typedef struct { _PyWstrList xoptions; /* "-X value" option */ int use_environment; /* -E option */ int isolated; /* -I option */ + int dev_mode; /* -X dev and PYTHONDEVMODE */ } _PyPreCmdline; #define _PyPreCmdline_INIT \ (_PyPreCmdline){ \ .use_environment = -1, \ - .isolated = -1} + .isolated = -1, \ + .dev_mode = -1} /* Note: _PyPreCmdline_INIT sets other fields to 0/NULL */ PyAPI_FUNC(void) _PyPreCmdline_Clear(_PyPreCmdline *cmdline); @@ -112,7 +114,7 @@ PyAPI_FUNC(void) _PyCoreConfig_SetGlobalConfig(const _PyCoreConfig *config); PyAPI_FUNC(_PyInitError) _PyCoreConfig_Read(_PyCoreConfig *config); PyAPI_FUNC(_PyInitError) _PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, const _PyArgv *args); -PyAPI_FUNC(_PyInitError) _PyCoreConfig_Write(const _PyCoreConfig *config); +PyAPI_FUNC(void) _PyCoreConfig_Write(const _PyCoreConfig *config); /* --- _PyMainInterpreterConfig ----------------------------------- */ diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index 9514b1c46a2a..3214d6b06bd6 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -77,6 +77,9 @@ extern void _PyGILState_Fini(void); PyAPI_FUNC(void) _PyGC_DumpShutdownStats(void); +PyAPI_FUNC(_PyInitError) _Py_PreInitializeInPlace( + _PyPreConfig *config); + #ifdef __cplusplus } #endif diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 6e145a5aa136..ff3cfb1ea49d 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -272,12 +272,19 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'allocator': None, 'coerce_c_locale': 0, 'coerce_c_locale_warn': 0, - 'dev_mode': 0, - 'isolated': 0, - 'use_environment': 1, 'utf8_mode': 0, } + COPY_PRE_CONFIG = [ + 'dev_mode', + 'isolated', + 'use_environment', + ] + DEFAULT_CORE_CONFIG = { + 'isolated': 0, + 'use_environment': 1, + 'dev_mode': 0, + 'install_signal_handlers': 1, 'use_hash_seed': 0, 'hash_seed': 0, @@ -363,8 +370,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): '_Py_HasFileSystemDefaultEncodeErrors': 0, } COPY_GLOBAL_PRE_CONFIG = [ - ('Py_IgnoreEnvironmentFlag', 'use_environment', True), - ('Py_IsolatedFlag', 'isolated'), ('Py_UTF8Mode', 'utf8_mode'), ] COPY_GLOBAL_CONFIG = [ @@ -376,8 +381,10 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): ('Py_FileSystemDefaultEncodeErrors', 'filesystem_errors'), ('Py_FileSystemDefaultEncoding', 'filesystem_encoding'), ('Py_FrozenFlag', '_frozen'), + ('Py_IgnoreEnvironmentFlag', 'use_environment', True), ('Py_InspectFlag', 'inspect'), ('Py_InteractiveFlag', 'interactive'), + ('Py_IsolatedFlag', 'isolated'), ('Py_NoSiteFlag', 'site_import', True), ('Py_NoUserSiteDirectory', 'user_site_directory', True), ('Py_OptimizeFlag', 'optimization_level'), @@ -415,7 +422,7 @@ def check_main_config(self, config): expected['xoptions'] = self.main_xoptions(core_config['xoptions']) self.assertEqual(main_config, expected) - def get_expected_config(self, expected, expected_preconfig, env): + def get_expected_config(self, expected, env): expected = dict(self.DEFAULT_CORE_CONFIG, **expected) code = textwrap.dedent(''' @@ -443,7 +450,7 @@ def get_expected_config(self, expected, expected_preconfig, env): # when test_embed is run from a venv (bpo-35313) args = (sys.executable, '-S', '-c', code) env = dict(env) - if not expected_preconfig['isolated']: + if not expected['isolated']: env['PYTHONCOERCECLOCALE'] = '0' env['PYTHONUTF8'] = '0' proc = subprocess.run(args, env=env, @@ -509,7 +516,10 @@ def check_config(self, testname, expected_config, expected_preconfig): config = json.loads(out) expected_preconfig = dict(self.DEFAULT_PRE_CONFIG, **expected_preconfig) - expected_config = self.get_expected_config(expected_config, expected_preconfig, env) + expected_config = self.get_expected_config(expected_config, env) + for key in self.COPY_PRE_CONFIG: + if key not in expected_preconfig: + expected_preconfig[key] = expected_config[key] self.check_core_config(config, expected_config) self.check_pre_config(config, expected_preconfig) @@ -617,35 +627,36 @@ def test_init_env(self): def test_init_env_dev_mode(self): preconfig = dict(self.INIT_ENV_PRECONFIG, - allocator='debug', - dev_mode=1) + allocator='debug') config = dict(self.INIT_ENV_CONFIG, dev_mode=1) self.check_config("init_env_dev_mode", config, preconfig) - def test_init_env_dev_mode(self): + def test_init_env_dev_mode_alloc(self): preconfig = dict(self.INIT_ENV_PRECONFIG, - allocator='malloc', - dev_mode=1) - config = dict(self.INIT_ENV_CONFIG) + allocator='malloc') + config = dict(self.INIT_ENV_CONFIG, + dev_mode=1) self.check_config("init_env_dev_mode_alloc", config, preconfig) def test_init_dev_mode(self): preconfig = { 'allocator': 'debug', - 'dev_mode': 1, } config = { 'faulthandler': 1, + 'dev_mode': 1, } self.check_config("init_dev_mode", config, preconfig) def test_init_isolated(self): preconfig = { - 'isolated': 1, - 'use_environment': 0, + 'isolated': 0, + 'use_environment': 1, } config = { + 'isolated': 1, + 'use_environment': 0, 'user_site_directory': 0, } self.check_config("init_isolated", config, preconfig) diff --git a/Modules/main.c b/Modules/main.c index 46bc72af46dd..9fcc76e58a6a 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -294,7 +294,7 @@ pymain_init_preconfig(const _PyArgv *args) goto done; } - err = _Py_PreInitializeFromPreConfig(&config); + err = _Py_PreInitializeInPlace(&config); done: _PyPreConfig_Clear(&config); @@ -311,11 +311,6 @@ pymain_init_coreconfig(_PyCoreConfig *config, const _PyArgv *args, return err; } - err = _PyCoreConfig_Write(config); - if (_Py_INIT_FAILED(err)) { - return err; - } - return _Py_InitializeCore(interp_p, config); } @@ -483,7 +478,7 @@ pymain_header(const _PyCoreConfig *config) static void pymain_import_readline(const _PyCoreConfig *config) { - if (config->preconfig.isolated) { + if (config->isolated) { return; } if (!config->inspect && RUN_CODE(config)) { @@ -655,7 +650,7 @@ pymain_run_file(_PyCoreConfig *config, PyCompilerFlags *cf) static void pymain_run_startup(_PyCoreConfig *config, PyCompilerFlags *cf) { - const char *startup = _Py_GetEnv(config->preconfig.use_environment, "PYTHONSTARTUP"); + const char *startup = _Py_GetEnv(config->use_environment, "PYTHONSTARTUP"); if (startup == NULL) { return; } @@ -735,7 +730,7 @@ pymain_repl(_PyCoreConfig *config, PyCompilerFlags *cf, int *exitcode) { /* Check this environment variable at the end, to give programs the opportunity to set it from Python. */ - if (!Py_InspectFlag && _Py_GetEnv(config->preconfig.use_environment, "PYTHONINSPECT")) { + if (!Py_InspectFlag && _Py_GetEnv(config->use_environment, "PYTHONINSPECT")) { Py_InspectFlag = 1; config->inspect = 1; } @@ -775,7 +770,7 @@ pymain_run_python(PyInterpreterState *interp, int *exitcode) goto done; } } - else if (!config->preconfig.isolated) { + else if (!config->isolated) { PyObject *path0 = NULL; if (_PyPathConfig_ComputeSysPath0(&config->argv, &path0)) { if (path0 == NULL) { diff --git a/Programs/_freeze_importlib.c b/Programs/_freeze_importlib.c index e6c51a4a1dfb..0818012d8c5a 100644 --- a/Programs/_freeze_importlib.c +++ b/Programs/_freeze_importlib.c @@ -77,7 +77,7 @@ main(int argc, char *argv[]) text[text_size] = '\0'; _PyCoreConfig config = _PyCoreConfig_INIT; - config.preconfig.use_environment = 0; + config.use_environment = 0; config.user_site_directory = 0; config.site_import = 0; config.program_name = L"./_freeze_importlib"; diff --git a/Programs/_testembed.c b/Programs/_testembed.c index ab5802da3630..70ef45f9281c 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -397,6 +397,22 @@ static int test_init_global_config(void) static int test_init_from_config(void) { + _PyInitError err; + + _PyPreConfig preconfig = _PyPreConfig_INIT; + + putenv("PYTHONMALLOC=malloc_debug"); + preconfig.allocator = "malloc"; + + putenv("PYTHONUTF8=0"); + Py_UTF8Mode = 0; + preconfig.utf8_mode = 1; + + err = _Py_PreInitializeFromPreConfig(&preconfig); + if (_Py_INIT_FAILED(err)) { + _Py_ExitInitError(err); + } + /* Test _Py_InitializeFromConfig() */ _PyCoreConfig config = _PyCoreConfig_INIT; config.install_signal_handlers = 0; @@ -407,9 +423,6 @@ static int test_init_from_config(void) config.use_hash_seed = 1; config.hash_seed = 123; - putenv("PYTHONMALLOC=malloc_debug"); - config.preconfig.allocator = "malloc"; - /* dev_mode=1 is tested in test_init_dev_mode() */ putenv("PYTHONFAULTHANDLER="); @@ -430,10 +443,6 @@ static int test_init_from_config(void) /* FIXME: test coerce_c_locale and coerce_c_locale_warn */ - putenv("PYTHONUTF8=0"); - Py_UTF8Mode = 0; - config.preconfig.utf8_mode = 1; - putenv("PYTHONPYCACHEPREFIX=env_pycache_prefix"); config.pycache_prefix = L"conf_pycache_prefix"; @@ -521,7 +530,7 @@ static int test_init_from_config(void) Py_FrozenFlag = 0; config._frozen = 1; - _PyInitError err = _Py_InitializeFromConfig(&config); + err = _Py_InitializeFromConfig(&config); /* Don't call _PyCoreConfig_Clear() since all strings are static */ if (_Py_INIT_FAILED(err)) { _Py_ExitInitError(err); @@ -607,20 +616,30 @@ static int test_init_env_dev_mode_alloc(void) static int test_init_isolated(void) { + _PyInitError err; + + _PyPreConfig preconfig = _PyPreConfig_INIT; + + /* Set coerce_c_locale and utf8_mode to not depend on the locale */ + preconfig.coerce_c_locale = 0; + preconfig.utf8_mode = 0; + + err = _Py_PreInitializeFromPreConfig(&preconfig); + if (_Py_INIT_FAILED(err)) { + _Py_ExitInitError(err); + } + /* Test _PyCoreConfig.isolated=1 */ _PyCoreConfig config = _PyCoreConfig_INIT; Py_IsolatedFlag = 0; - config.preconfig.isolated = 1; + config.isolated = 1; - /* Set coerce_c_locale and utf8_mode to not depend on the locale */ - config.preconfig.coerce_c_locale = 0; - config.preconfig.utf8_mode = 0; /* Use path starting with "./" avoids a search along the PATH */ config.program_name = L"./_testembed"; test_init_env_dev_mode_putenvs(); - _PyInitError err = _Py_InitializeFromConfig(&config); + err = _Py_InitializeFromConfig(&config); if (_Py_INIT_FAILED(err)) { _Py_ExitInitError(err); } @@ -635,7 +654,7 @@ static int test_init_dev_mode(void) _PyCoreConfig config = _PyCoreConfig_INIT; putenv("PYTHONFAULTHANDLER="); putenv("PYTHONMALLOC="); - config.preconfig.dev_mode = 1; + config.dev_mode = 1; config.program_name = L"./_testembed"; _PyInitError err = _Py_InitializeFromConfig(&config); if (_Py_INIT_FAILED(err)) { diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 1245aef54b87..2e6eb4029879 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -469,8 +469,6 @@ Py_GetArgcArgv(int *argc, wchar_t ***argv) void _PyCoreConfig_Clear(_PyCoreConfig *config) { - _PyPreConfig_Clear(&config->preconfig); - #define CLEAR(ATTR) \ do { \ PyMem_RawFree(ATTR); \ @@ -514,10 +512,6 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) { _PyCoreConfig_Clear(config); - if (_PyPreConfig_Copy(&config->preconfig, &config2->preconfig) < 0) { - return -1; - } - #define COPY_ATTR(ATTR) config->ATTR = config2->ATTR #define COPY_STR_ATTR(ATTR) \ do { \ @@ -544,6 +538,9 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) } \ } while (0) + COPY_ATTR(isolated); + COPY_ATTR(use_environment); + COPY_ATTR(dev_mode); COPY_ATTR(install_signal_handlers); COPY_ATTR(use_hash_seed); COPY_ATTR(hash_seed); @@ -613,7 +610,7 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) static const char* _PyCoreConfig_GetEnv(const _PyCoreConfig *config, const char *name) { - return _Py_GetEnv(config->preconfig.use_environment, name); + return _Py_GetEnv(config->use_environment, name); } @@ -622,9 +619,9 @@ _PyCoreConfig_GetEnvDup(const _PyCoreConfig *config, wchar_t **dest, wchar_t *wname, char *name) { - assert(config->preconfig.use_environment >= 0); + assert(config->use_environment >= 0); - if (!config->preconfig.use_environment) { + if (!config->use_environment) { *dest = NULL; return 0; } @@ -668,8 +665,6 @@ _PyCoreConfig_GetEnvDup(const _PyCoreConfig *config, void _PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config) { - _PyPreConfig_GetGlobalConfig(&config->preconfig); - #define COPY_FLAG(ATTR, VALUE) \ if (config->ATTR == -1) { \ config->ATTR = VALUE; \ @@ -679,6 +674,8 @@ _PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config) config->ATTR = !(VALUE); \ } + COPY_FLAG(isolated, Py_IsolatedFlag); + COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); COPY_FLAG(bytes_warning, Py_BytesWarningFlag); COPY_FLAG(inspect, Py_InspectFlag); COPY_FLAG(interactive, Py_InteractiveFlag); @@ -714,6 +711,8 @@ _PyCoreConfig_SetGlobalConfig(const _PyCoreConfig *config) VAR = !config->ATTR; \ } + COPY_FLAG(isolated, Py_IsolatedFlag); + COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); COPY_FLAG(bytes_warning, Py_BytesWarningFlag); COPY_FLAG(inspect, Py_InspectFlag); COPY_FLAG(interactive, Py_InteractiveFlag); @@ -924,7 +923,7 @@ config_wstr_to_int(const wchar_t *wstr, int *result) static _PyInitError config_read_env_vars(_PyCoreConfig *config) { - int use_env = config->preconfig.use_environment; + int use_env = config->use_environment; /* Get environment variables */ _Py_get_env_flag(use_env, &config->parser_debug, "PYTHONDEBUG"); @@ -1149,7 +1148,8 @@ get_locale_encoding(char **locale_encoding) static _PyInitError -config_init_stdio_encoding(_PyCoreConfig *config) +config_init_stdio_encoding(_PyCoreConfig *config, + const _PyPreConfig *preconfig) { /* If Py_SetStandardStreamEncoding() have been called, use these parameters. */ @@ -1219,7 +1219,7 @@ config_init_stdio_encoding(_PyCoreConfig *config) } /* UTF-8 Mode uses UTF-8/surrogateescape */ - if (config->preconfig.utf8_mode) { + if (preconfig->utf8_mode) { if (config->stdio_encoding == NULL) { config->stdio_encoding = _PyMem_RawStrdup("utf-8"); if (config->stdio_encoding == NULL) { @@ -1254,10 +1254,10 @@ config_init_stdio_encoding(_PyCoreConfig *config) static _PyInitError -config_init_fs_encoding(_PyCoreConfig *config) +config_init_fs_encoding(_PyCoreConfig *config, const _PyPreConfig *preconfig) { #ifdef MS_WINDOWS - if (config->preconfig.legacy_windows_fs_encoding) { + if (preconfig->legacy_windows_fs_encoding) { /* Legacy Windows filesystem encoding: mbcs/replace */ if (config->filesystem_encoding == NULL) { config->filesystem_encoding = _PyMem_RawStrdup("mbcs"); @@ -1292,7 +1292,7 @@ config_init_fs_encoding(_PyCoreConfig *config) } #else if (config->filesystem_encoding == NULL) { - if (config->preconfig.utf8_mode) { + if (preconfig->utf8_mode) { /* UTF-8 Mode use: utf-8/surrogateescape */ config->filesystem_encoding = _PyMem_RawStrdup("utf-8"); /* errors defaults to surrogateescape above */ @@ -1341,12 +1341,8 @@ config_read_impl(_PyCoreConfig *config, _PyPreCmdline *cmdline) { _PyInitError err; - err = _Py_PreInitializeFromConfig(config); - if (_Py_INIT_FAILED(err)) { - return err; - } - - _PyPreCmdline_GetPreConfig(cmdline, &_PyRuntime.preconfig); + const _PyPreConfig *preconfig = &_PyRuntime.preconfig; + _PyPreCmdline_GetPreConfig(cmdline, preconfig); _PyPreCmdline_GetCoreConfig(cmdline, config); err = _PyPreCmdline_Read(cmdline); @@ -1360,19 +1356,16 @@ config_read_impl(_PyCoreConfig *config, _PyPreCmdline *cmdline) return _Py_INIT_NO_MEMORY(); } - if (_PyPreConfig_Copy(&config->preconfig, &_PyRuntime.preconfig) < 0) { - return _Py_INIT_NO_MEMORY(); - } - _PyCoreConfig_GetGlobalConfig(config); - assert(config->preconfig.use_environment >= 0); + assert(config->use_environment >= 0); - if (config->preconfig.isolated > 0) { + if (config->isolated > 0) { + config->use_environment = 0; config->user_site_directory = 0; } - if (config->preconfig.use_environment) { + if (config->use_environment) { err = config_read_env_vars(config); if (_Py_INIT_FAILED(err)) { return err; @@ -1421,7 +1414,7 @@ config_read_impl(_PyCoreConfig *config, _PyPreCmdline *cmdline) } /* default values */ - if (config->preconfig.dev_mode) { + if (config->dev_mode) { if (config->faulthandler < 0) { config->faulthandler = 1; } @@ -1438,13 +1431,13 @@ config_read_impl(_PyCoreConfig *config, _PyPreCmdline *cmdline) } if (config->filesystem_encoding == NULL || config->filesystem_errors == NULL) { - err = config_init_fs_encoding(config); + err = config_init_fs_encoding(config, preconfig); if (_Py_INIT_FAILED(err)) { return err; } } - err = config_init_stdio_encoding(config); + err = config_init_stdio_encoding(config, preconfig); if (_Py_INIT_FAILED(err)) { return err; } @@ -1456,7 +1449,7 @@ config_read_impl(_PyCoreConfig *config, _PyPreCmdline *cmdline) } } - assert(config->preconfig.use_environment >= 0); + assert(config->use_environment >= 0); assert(config->filesystem_encoding != NULL); assert(config->filesystem_errors != NULL); assert(config->stdio_encoding != NULL); @@ -1544,22 +1537,11 @@ config_init_stdio(const _PyCoreConfig *config) - set Py_xxx global configuration variables - initialize C standard streams (stdin, stdout, stderr) */ -_PyInitError +void _PyCoreConfig_Write(const _PyCoreConfig *config) { _PyCoreConfig_SetGlobalConfig(config); config_init_stdio(config); - - /* Write the new pre-configuration into _PyRuntime */ - PyMemAllocatorEx old_alloc; - _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - int res = _PyPreConfig_Copy(&_PyRuntime.preconfig, &config->preconfig); - PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - if (res < 0) { - return _Py_INIT_NO_MEMORY(); - } - - return _Py_INIT_OK(); } @@ -1604,6 +1586,9 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) #define SET_ITEM_WSTRLIST(LIST) \ SET_ITEM(#LIST, _PyWstrList_AsList(&config->LIST)) + SET_ITEM_INT(isolated); + SET_ITEM_INT(use_environment); + SET_ITEM_INT(dev_mode); SET_ITEM_INT(install_signal_handlers); SET_ITEM_INT(use_hash_seed); SET_ITEM_UINT(hash_seed); @@ -1945,7 +1930,7 @@ config_init_warnoptions(_PyCoreConfig *config, const _PyCmdline *cmdline) * the lowest precedence entries first so that later entries override them. */ - if (config->preconfig.dev_mode) { + if (config->dev_mode) { if (_PyWstrList_Append(&config->warnoptions, L"default")) { return _Py_INIT_NO_MEMORY(); } @@ -2101,7 +2086,7 @@ config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline) return err; } - if (config->preconfig.use_environment) { + if (config->use_environment) { err = cmdline_init_env_warnoptions(cmdline, config); if (_Py_INIT_FAILED(err)) { return err; @@ -2178,8 +2163,7 @@ _Py_GetConfigsAsDict(void) /* pre config */ PyInterpreterState *interp = _PyInterpreterState_Get(); - const _PyCoreConfig *core_config = _PyInterpreterState_GetCoreConfig(interp); - const _PyPreConfig *pre_config = &core_config->preconfig; + const _PyPreConfig *pre_config = &_PyRuntime.preconfig; dict = _PyPreConfig_AsDict(pre_config); if (dict == NULL) { goto error; @@ -2190,6 +2174,7 @@ _Py_GetConfigsAsDict(void) Py_CLEAR(dict); /* core config */ + const _PyCoreConfig *core_config = _PyInterpreterState_GetCoreConfig(interp); dict = _PyCoreConfig_AsDict(core_config); if (dict == NULL) { goto error; diff --git a/Python/pathconfig.c b/Python/pathconfig.c index f0b13fd1b001..7fea7c366786 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -331,7 +331,7 @@ _PyCoreConfig_CalculatePathConfig(_PyCoreConfig *config) #endif if (path_config.isolated != -1) { - config->preconfig.isolated = path_config.isolated; + config->isolated = path_config.isolated; } if (path_config.site_import != -1) { config->site_import = path_config.site_import; diff --git a/Python/preconfig.c b/Python/preconfig.c index 8b685ce42d04..d336352d93c2 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -143,6 +143,23 @@ _PyPreCmdline_GetPreConfig(_PyPreCmdline *cmdline, const _PyPreConfig *config) COPY_ATTR(use_environment); COPY_ATTR(isolated); + COPY_ATTR(dev_mode); + +#undef COPY_ATTR +} + + +void +_PyPreCmdline_SetPreConfig(const _PyPreCmdline *cmdline, _PyPreConfig *config) +{ +#define COPY_ATTR(ATTR) \ + if (cmdline->ATTR != -1) { \ + config->ATTR = cmdline->ATTR; \ + } + + COPY_ATTR(use_environment); + COPY_ATTR(isolated); + COPY_ATTR(dev_mode); #undef COPY_ATTR } @@ -152,12 +169,13 @@ void _PyPreCmdline_GetCoreConfig(_PyPreCmdline *cmdline, const _PyCoreConfig *config) { #define COPY_ATTR(ATTR) \ - if (config->preconfig.ATTR != -1) { \ - cmdline->ATTR = config->preconfig.ATTR; \ + if (config->ATTR != -1) { \ + cmdline->ATTR = config->ATTR; \ } COPY_ATTR(use_environment); COPY_ATTR(isolated); + COPY_ATTR(dev_mode); #undef COPY_ATTR } @@ -167,12 +185,13 @@ void _PyPreCmdline_SetCoreConfig(const _PyPreCmdline *cmdline, _PyCoreConfig *config) { #define COPY_ATTR(ATTR) \ - if (config->preconfig.ATTR == -1 && cmdline->ATTR != -1) { \ - config->preconfig.ATTR = cmdline->ATTR; \ + if (config->ATTR == -1 && cmdline->ATTR != -1) { \ + config->ATTR = cmdline->ATTR; \ } COPY_ATTR(use_environment); COPY_ATTR(isolated); + COPY_ATTR(dev_mode); #undef COPY_ATTR } @@ -206,13 +225,13 @@ _PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2) COPY_ATTR(isolated); COPY_ATTR(use_environment); + COPY_ATTR(dev_mode); COPY_ATTR(coerce_c_locale); COPY_ATTR(coerce_c_locale_warn); #ifdef MS_WINDOWS COPY_ATTR(legacy_windows_fs_encoding); #endif COPY_ATTR(utf8_mode); - COPY_ATTR(dev_mode); COPY_STR_ATTR(allocator); #undef COPY_ATTR @@ -567,21 +586,6 @@ get_ctype_locale(char **locale_p) } -void -_PyPreCmdline_SetPreConfig(const _PyPreCmdline *cmdline, _PyPreConfig *config) -{ -#define COPY_ATTR(ATTR) \ - if (cmdline->ATTR != -1) { \ - config->ATTR = cmdline->ATTR; \ - } - - COPY_ATTR(use_environment); - COPY_ATTR(isolated); - -#undef COPY_ATTR -} - - PyObject* _PyPreConfig_AsDict(const _PyPreConfig *config) { @@ -712,7 +716,7 @@ _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args, if (coreconfig) { _PyPreCmdline_GetCoreConfig(&cmdline, coreconfig); if (config->dev_mode == -1) { - config->dev_mode = coreconfig->preconfig.dev_mode; + config->dev_mode = coreconfig->dev_mode; } } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index e08f290d8d14..b12fa820e9ca 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -286,9 +286,10 @@ static const char *_C_LOCALE_WARNING = "locales is recommended.\n"; static void -_emit_stderr_warning_for_legacy_locale(const _PyCoreConfig *core_config) +_emit_stderr_warning_for_legacy_locale(void) { - if (core_config->preconfig.coerce_c_locale_warn && _Py_LegacyLocaleDetected()) { + const _PyPreConfig *preconfig = &_PyRuntime.preconfig; + if (preconfig->coerce_c_locale_warn && _Py_LegacyLocaleDetected()) { PySys_FormatStderr("%s", _C_LOCALE_WARNING); } } @@ -675,6 +676,8 @@ _Py_InitializeCore_impl(PyInterpreterState **interp_p, { PyInterpreterState *interp; + _PyCoreConfig_Write(core_config); + _PyInitError err = pycore_init_runtime(core_config); if (_Py_INIT_FAILED(err)) { return err; @@ -720,54 +723,64 @@ pyinit_preinit(_PyPreConfig *config, const _PyCoreConfig *coreconfig) { _PyInitError err; + _PyPreConfig local_config = _PyPreConfig_INIT; + if (!config) { + config = &local_config; + } err = _PyRuntime_Initialize(); if (_Py_INIT_FAILED(err)) { - return err; + goto done; } if (_PyRuntime.pre_initialized) { /* If it's already configured: ignored the new configuration */ - return _Py_INIT_OK(); - } - - if (!src_config && coreconfig) { - src_config = &coreconfig->preconfig; + err = _Py_INIT_OK(); + goto done; } if (src_config) { if (_PyPreConfig_Copy(config, src_config) < 0) { - return _Py_INIT_ERR("failed to copy pre config"); + err = _Py_INIT_ERR("failed to copy pre config"); + goto done; } } err = _PyPreConfig_Read(config, NULL, coreconfig); if (_Py_INIT_FAILED(err)) { - return err; + goto done; } err = _PyPreConfig_Write(config); if (_Py_INIT_FAILED(err)) { - return err; + goto done; } _PyRuntime.pre_initialized = 1; - return _Py_INIT_OK(); + err = _Py_INIT_OK(); + +done: + _PyPreConfig_Clear(&local_config); + return err; } _PyInitError _Py_PreInitialize(void) { - _PyPreConfig config = _PyPreConfig_INIT; - _PyInitError err = pyinit_preinit(&config, NULL, NULL); - _PyPreConfig_Clear(&config); - return err; + return pyinit_preinit(NULL, NULL, NULL); } _PyInitError -_Py_PreInitializeFromPreConfig(_PyPreConfig *config) +_Py_PreInitializeFromPreConfig(const _PyPreConfig *src_config) +{ + return pyinit_preinit(NULL, src_config, NULL); +} + + +_PyInitError +_Py_PreInitializeInPlace(_PyPreConfig *config) { return pyinit_preinit(config, NULL, NULL); } @@ -776,10 +789,7 @@ _Py_PreInitializeFromPreConfig(_PyPreConfig *config) _PyInitError _Py_PreInitializeFromConfig(const _PyCoreConfig *coreconfig) { - _PyPreConfig config = _PyPreConfig_INIT; - _PyInitError err = pyinit_preinit(&config, NULL, coreconfig); - _PyPreConfig_Clear(&config); - return err; + return pyinit_preinit(NULL, NULL, coreconfig); } @@ -964,7 +974,7 @@ _Py_InitializeMainInterpreter(PyInterpreterState *interp, } #ifndef MS_WINDOWS - _emit_stderr_warning_for_legacy_locale(core_config); + _emit_stderr_warning_for_legacy_locale(); #endif return _Py_INIT_OK(); diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 3df4d44a7ce7..12ec7d5918ed 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -2158,6 +2158,7 @@ make_flags(void) { int pos = 0; PyObject *seq; + const _PyPreConfig *preconfig = &_PyRuntime.preconfig; const _PyCoreConfig *config = &_PyInterpreterState_GET_UNSAFE()->core_config; seq = PyStructSequence_New(&FlagsType); @@ -2174,16 +2175,16 @@ make_flags(void) SetFlag(!config->write_bytecode); SetFlag(!config->user_site_directory); SetFlag(!config->site_import); - SetFlag(!config->preconfig.use_environment); + SetFlag(!config->use_environment); SetFlag(config->verbose); /* SetFlag(saw_unbuffered_flag); */ /* SetFlag(skipfirstline); */ SetFlag(config->bytes_warning); SetFlag(config->quiet); SetFlag(config->use_hash_seed == 0 || config->hash_seed != 0); - SetFlag(config->preconfig.isolated); - PyStructSequence_SET_ITEM(seq, pos++, PyBool_FromLong(config->preconfig.dev_mode)); - SetFlag(config->preconfig.utf8_mode); + SetFlag(config->isolated); + PyStructSequence_SET_ITEM(seq, pos++, PyBool_FromLong(config->dev_mode)); + SetFlag(preconfig->utf8_mode); #undef SetFlag if (PyErr_Occurred()) { From webhook-mailer at python.org Tue Mar 26 00:46:39 2019 From: webhook-mailer at python.org (Benjamin Peterson) Date: Tue, 26 Mar 2019 04:46:39 -0000 Subject: [Python-checkins] Fix "the the" in the idle docs. (GH-12549) Message-ID: https://github.com/python/cpython/commit/577277f669a6d5c626c142358a940a10d32813ff commit: 577277f669a6d5c626c142358a940a10d32813ff branch: master author: Benjamin Peterson committer: GitHub date: 2019-03-25T21:46:35-07:00 summary: Fix "the the" in the idle docs. (GH-12549) files: M Doc/library/idle.rst diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index 8ef9e2eed534..11e137bf1092 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -356,8 +356,8 @@ Shell and Output windows also have the following. Go to file/line Same as in Debug menu. -The Shell window also has an output squeezing facility explained in the -the *Python Shell window* subsection below. +The Shell window also has an output squeezing facility explained in the *Python +Shell window* subsection below. Squeeze If the cursor is over an output line, squeeze all the output between @@ -716,17 +716,15 @@ In contrast, some system text windows only keep the last n lines of output. A Windows console, for instance, keeps a user-settable 1 to 9999 lines, with 300 the default. -A Tk Text widget, and hence IDLE's Shell, displays characters (codepoints) -in the the BMP (Basic Multilingual Plane) subset of Unicode. -Which characters are displayed with a proper glyph and which with a -replacement box depends on the operating system and installed fonts. -Tab characters cause the following text to begin after -the next tab stop. (They occur every 8 'characters'). -Newline characters cause following text to appear on a new line. -Other control characters are ignored or displayed as a space, box, or -something else, depending on the operating system and font. -(Moving the text cursor through such output with arrow keys may exhibit -some surprising spacing behavior.) +A Tk Text widget, and hence IDLE's Shell, displays characters (codepoints) in +the BMP (Basic Multilingual Plane) subset of Unicode. Which characters are +displayed with a proper glyph and which with a replacement box depends on the +operating system and installed fonts. Tab characters cause the following text +to begin after the next tab stop. (They occur every 8 'characters'). Newline +characters cause following text to appear on a new line. Other control +characters are ignored or displayed as a space, box, or something else, +depending on the operating system and font. (Moving the text cursor through +such output with arrow keys may exhibit some surprising spacing behavior.) .. code-block:: none From webhook-mailer at python.org Tue Mar 26 00:52:42 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 26 Mar 2019 04:52:42 -0000 Subject: [Python-checkins] Fix "the the" in the idle docs. (GH-12549) Message-ID: https://github.com/python/cpython/commit/eb94e5b3ec01a34af1087c4c85568b5d20325892 commit: eb94e5b3ec01a34af1087c4c85568b5d20325892 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-25T21:52:39-07:00 summary: Fix "the the" in the idle docs. (GH-12549) (cherry picked from commit 577277f669a6d5c626c142358a940a10d32813ff) Co-authored-by: Benjamin Peterson files: M Doc/library/idle.rst diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index 8ef9e2eed534..11e137bf1092 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -356,8 +356,8 @@ Shell and Output windows also have the following. Go to file/line Same as in Debug menu. -The Shell window also has an output squeezing facility explained in the -the *Python Shell window* subsection below. +The Shell window also has an output squeezing facility explained in the *Python +Shell window* subsection below. Squeeze If the cursor is over an output line, squeeze all the output between @@ -716,17 +716,15 @@ In contrast, some system text windows only keep the last n lines of output. A Windows console, for instance, keeps a user-settable 1 to 9999 lines, with 300 the default. -A Tk Text widget, and hence IDLE's Shell, displays characters (codepoints) -in the the BMP (Basic Multilingual Plane) subset of Unicode. -Which characters are displayed with a proper glyph and which with a -replacement box depends on the operating system and installed fonts. -Tab characters cause the following text to begin after -the next tab stop. (They occur every 8 'characters'). -Newline characters cause following text to appear on a new line. -Other control characters are ignored or displayed as a space, box, or -something else, depending on the operating system and font. -(Moving the text cursor through such output with arrow keys may exhibit -some surprising spacing behavior.) +A Tk Text widget, and hence IDLE's Shell, displays characters (codepoints) in +the BMP (Basic Multilingual Plane) subset of Unicode. Which characters are +displayed with a proper glyph and which with a replacement box depends on the +operating system and installed fonts. Tab characters cause the following text +to begin after the next tab stop. (They occur every 8 'characters'). Newline +characters cause following text to appear on a new line. Other control +characters are ignored or displayed as a space, box, or something else, +depending on the operating system and font. (Moving the text cursor through +such output with arrow keys may exhibit some surprising spacing behavior.) .. code-block:: none From webhook-mailer at python.org Tue Mar 26 01:42:29 2019 From: webhook-mailer at python.org (Vinay Sajip) Date: Tue, 26 Mar 2019 05:42:29 -0000 Subject: [Python-checkins] Document that logging registers shutdown as an atexit handler (GH-12378) Message-ID: https://github.com/python/cpython/commit/3e700e4ca3922337a24dc150238a6da724cfe873 commit: 3e700e4ca3922337a24dc150238a6da724cfe873 branch: master author: Andre Delfino committer: Vinay Sajip date: 2019-03-26T05:42:26Z summary: Document that logging registers shutdown as an atexit handler (GH-12378) files: M Doc/library/logging.rst diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst index 5adde29f5085..08555c3a3576 100644 --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -1215,6 +1215,10 @@ functions. closing all handlers. This should be called at application exit and no further use of the logging system should be made after this call. + When the logging module is imported, it registers this function as an exit + handler (see :mod:`atexit`), so normally there's no need to do that + manually. + .. function:: setLoggerClass(klass) From webhook-mailer at python.org Tue Mar 26 02:05:38 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Tue, 26 Mar 2019 06:05:38 -0000 Subject: [Python-checkins] bpo-36430: Fix a possible reference leak in itertools.count(). (GH-12551) Message-ID: https://github.com/python/cpython/commit/0523c39e7720b82b38ad793d3f1a5681adcdf873 commit: 0523c39e7720b82b38ad793d3f1a5681adcdf873 branch: master author: Zackery Spytz committer: Serhiy Storchaka date: 2019-03-26T08:05:29+02:00 summary: bpo-36430: Fix a possible reference leak in itertools.count(). (GH-12551) files: A Misc/NEWS.d/next/Core and Builtins/2019-03-25-23-37-26.bpo-36430.sd9xxQ.rst M Modules/itertoolsmodule.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-25-23-37-26.bpo-36430.sd9xxQ.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-25-23-37-26.bpo-36430.sd9xxQ.rst new file mode 100644 index 000000000000..a65ee096efc4 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-25-23-37-26.bpo-36430.sd9xxQ.rst @@ -0,0 +1 @@ +Fix a possible reference leak in :func:`itertools.count`. diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c index 536f7fa6253a..103029d251e0 100644 --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -4089,6 +4089,7 @@ itertools_count_impl(PyTypeObject *type, PyObject *long_cnt, lz = (countobject *)type->tp_alloc(type, 0); if (lz == NULL) { Py_XDECREF(long_cnt); + Py_DECREF(long_step); return NULL; } lz->cnt = cnt; From webhook-mailer at python.org Tue Mar 26 02:26:45 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 26 Mar 2019 06:26:45 -0000 Subject: [Python-checkins] bpo-36430: Fix a possible reference leak in itertools.count(). (GH-12551) Message-ID: https://github.com/python/cpython/commit/e0fe25be1ecbdf4abd1b0edd4aabacc4d75dec41 commit: e0fe25be1ecbdf4abd1b0edd4aabacc4d75dec41 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-25T23:26:42-07:00 summary: bpo-36430: Fix a possible reference leak in itertools.count(). (GH-12551) (cherry picked from commit 0523c39e7720b82b38ad793d3f1a5681adcdf873) Co-authored-by: Zackery Spytz files: A Misc/NEWS.d/next/Core and Builtins/2019-03-25-23-37-26.bpo-36430.sd9xxQ.rst M Modules/itertoolsmodule.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-25-23-37-26.bpo-36430.sd9xxQ.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-25-23-37-26.bpo-36430.sd9xxQ.rst new file mode 100644 index 000000000000..a65ee096efc4 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-25-23-37-26.bpo-36430.sd9xxQ.rst @@ -0,0 +1 @@ +Fix a possible reference leak in :func:`itertools.count`. diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c index 1113fb6b76c0..bff9df608304 100644 --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -4027,6 +4027,7 @@ count_new(PyTypeObject *type, PyObject *args, PyObject *kwds) lz = (countobject *)type->tp_alloc(type, 0); if (lz == NULL) { Py_XDECREF(long_cnt); + Py_DECREF(long_step); return NULL; } lz->cnt = cnt; From webhook-mailer at python.org Tue Mar 26 03:55:42 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Tue, 26 Mar 2019 07:55:42 -0000 Subject: [Python-checkins] bpo-36430: Fix a possible reference leak in itertools.count(). (GH-12551) (GH-12554) Message-ID: https://github.com/python/cpython/commit/c0dce6aa2ce1ff408170bb8de2ebde3bfd8aa6cf commit: c0dce6aa2ce1ff408170bb8de2ebde3bfd8aa6cf branch: 2.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Raymond Hettinger date: 2019-03-26T00:55:35-07:00 summary: bpo-36430: Fix a possible reference leak in itertools.count(). (GH-12551) (GH-12554) (cherry picked from commit 0523c39e7720b82b38ad793d3f1a5681adcdf873) Co-authored-by: Zackery Spytz files: A Misc/NEWS.d/next/Core and Builtins/2019-03-25-23-37-26.bpo-36430.sd9xxQ.rst M Modules/itertoolsmodule.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-25-23-37-26.bpo-36430.sd9xxQ.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-25-23-37-26.bpo-36430.sd9xxQ.rst new file mode 100644 index 000000000000..a65ee096efc4 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-25-23-37-26.bpo-36430.sd9xxQ.rst @@ -0,0 +1 @@ +Fix a possible reference leak in :func:`itertools.count`. diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c index 47db7affb059..04076fd08709 100644 --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -3321,6 +3321,7 @@ count_new(PyTypeObject *type, PyObject *args, PyObject *kwds) lz = (countobject *)type->tp_alloc(type, 0); if (lz == NULL) { Py_XDECREF(long_cnt); + Py_DECREF(long_step); return NULL; } lz->cnt = cnt; From webhook-mailer at python.org Tue Mar 26 05:09:57 2019 From: webhook-mailer at python.org (=?utf-8?q?=C5=81ukasz?= Langa) Date: Tue, 26 Mar 2019 09:09:57 -0000 Subject: [Python-checkins] v3.8.0a3 Message-ID: https://github.com/python/cpython/commit/9a448855b51b264d678e3ba3c168034c221806e2 commit: 9a448855b51b264d678e3ba3c168034c221806e2 branch: master author: ?ukasz Langa committer: ?ukasz Langa date: 2019-03-25T20:36:40+01:00 summary: v3.8.0a3 files: A Misc/NEWS.d/3.8.0a3.rst D Misc/NEWS.d/next/Build/2019-02-21-14-48-31.bpo-31904.J82jY2.rst D Misc/NEWS.d/next/Build/2019-02-28-18-09-01.bpo-36146.IwPJVT.rst D Misc/NEWS.d/next/Build/2019-03-01-17-49-22.bpo-36146.VeoyG7.rst D Misc/NEWS.d/next/Build/2019-03-18-23-49-15.bpo-36356.WNrwYI.rst D Misc/NEWS.d/next/C API/2019-03-01-03-23-48.bpo-36142.7F6wJd.rst D Misc/NEWS.d/next/C API/2019-03-20-22-02-40.bpo-36381.xlzDJ2.rst D Misc/NEWS.d/next/Core and Builtins/2019-02-11-00-50-03.bpo-11814.M12CMH.rst D Misc/NEWS.d/next/Core and Builtins/2019-02-20-08-51-04.bpo-36048.I3LJt9.rst D Misc/NEWS.d/next/Core and Builtins/2019-02-26-17-34-49.bpo-31904.R4KSj6.rst D Misc/NEWS.d/next/Core and Builtins/2019-02-27-16-49-08.bpo-35975.IescLY.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-01-13-48-01.bpo-36124.Blzxq1.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-04-18-05-31.bpo-36188.EuUZNz.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-07-13-05-43.bpo-36218.dZemNt.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-09-15-47-05.bpo-36252.sCQFKq.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-11-15-37-33.bpo-36262.v3N6Fz.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-11-22-30-56.bpo-30040.W9z8X7.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-13-22-47-28.bpo-36282.zs7RKP.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-18-09-27-54.bpo-36332.yEC-Vz.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-18-10-56-53.bpo-36333.4dqemZ.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-19-00-54-31.bpo-36301.xvOCJb.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-19-02-36-40.bpo-36352.qj2trz.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-19-03-08-26.bpo-36236.5qN9qK.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-19-15-46-42.bpo-36374.EWKMZE.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-19-15-58-23.bpo-36365.jHaErz.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-21-00-24-18.bpo-12477.OZHa0t.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-21-22-19-38.bpo-36398.B_jXGe.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-23-19-51-09.bpo-36412.C7acGn.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-24-21-33-22.bpo-36421.gJ2Pv9.rst D Misc/NEWS.d/next/Documentation/2018-11-21-23-01-37.bpo-21314.PG33VT.rst D Misc/NEWS.d/next/Documentation/2019-03-02-00-40-57.bpo-36138.yfjNzG.rst D Misc/NEWS.d/next/Documentation/2019-03-17-20-01-41.bpo-36329.L5dJPD.rst D Misc/NEWS.d/next/IDLE/2018-06-27-21-18-41.bpo-30348.WbaRJW.rst D Misc/NEWS.d/next/IDLE/2019-02-23-17-53-53.bpo-36096.mN5Ly3.rst D Misc/NEWS.d/next/IDLE/2019-02-25-11-40-14.bpo-32129.4qVCzD.rst D Misc/NEWS.d/next/IDLE/2019-02-28-18-52-40.bpo-36152.9pkHIU.rst D Misc/NEWS.d/next/IDLE/2019-03-02-19-39-53.bpo-23216.ZA7H8H.rst D Misc/NEWS.d/next/IDLE/2019-03-06-14-47-57.bpo-23205.Vv0gfH.rst D Misc/NEWS.d/next/IDLE/2019-03-10-00-07-46.bpo-36176.jk_vv6.rst D Misc/NEWS.d/next/IDLE/2019-03-21-22-43-21.bpo-36396.xSTX-I.rst D Misc/NEWS.d/next/IDLE/2019-03-23-01-45-56.bpo-36405.m7Wv1F.rst D Misc/NEWS.d/next/Library/2018-11-09-12-45-28.bpo-35198.EJ8keW.rst D Misc/NEWS.d/next/Library/2018-12-21-09-54-30.bpo-21478.5gsXtc.rst D Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst D Misc/NEWS.d/next/Library/2019-01-05-16-16-20.bpo-35661.H_UOXc.rst D Misc/NEWS.d/next/Library/2019-01-09-23-43-08.bpo-35493.kEcRGE.rst D Misc/NEWS.d/next/Library/2019-01-11-08-47-58.bpo-35715.Wi3gl0.rst D Misc/NEWS.d/next/Library/2019-01-21-13-56-55.bpo-35802.6633PE.rst D Misc/NEWS.d/next/Library/2019-01-28-10-19-40.bpo-35843.7rXGQE.rst D Misc/NEWS.d/next/Library/2019-02-06-12-07-46.bpo-30670.yffB3F.rst D Misc/NEWS.d/next/Library/2019-02-10-16-49-16.bpo-21269.Fqi7VH.rst D Misc/NEWS.d/next/Library/2019-02-16-07-11-02.bpo-35899.cjfn5a.rst D Misc/NEWS.d/next/Library/2019-02-19-19-53-46.bpo-36043.l867v0.rst D Misc/NEWS.d/next/Library/2019-02-23-06-49-06.bpo-36091.26o4Lc.rst D Misc/NEWS.d/next/Library/2019-02-25-13-21-43.bpo-36106.VuhEiQ.rst D Misc/NEWS.d/next/Library/2019-02-25-23-04-00.bpo-35178.NA_rXa.rst D Misc/NEWS.d/next/Library/2019-02-26-11-34-44.bpo-35652.6KRJu_.rst D Misc/NEWS.d/next/Library/2019-02-26-22-41-38.bpo-36130._BnZOo.rst D Misc/NEWS.d/next/Library/2019-03-01-16-10-01.bpo-36103.n6VgXL.rst D Misc/NEWS.d/next/Library/2019-03-03-11-37-09.bpo-36169.8nWJy7.rst D Misc/NEWS.d/next/Library/2019-03-04-10-42-46.bpo-36179.jEyuI-.rst D Misc/NEWS.d/next/Library/2019-03-06-13-07-29.bpo-36139.6kedum.rst D Misc/NEWS.d/next/Library/2019-03-06-13-21-33.bpo-35807.W7mmu3.rst D Misc/NEWS.d/next/Library/2019-03-08-13-32-21.bpo-36235._M72wU.rst D Misc/NEWS.d/next/Library/2019-03-09-18-01-24.bpo-36251.zOp9l0.rst D Misc/NEWS.d/next/Library/2019-03-11-22-06-36.bpo-35931.Qp_Tbe.rst D Misc/NEWS.d/next/Library/2019-03-12-21-02-55.bpo-36280.mOd3iH.rst D Misc/NEWS.d/next/Library/2019-03-13-14-14-36.bpo-36272.f3l2IG.rst D Misc/NEWS.d/next/Library/2019-03-13-14-55-02.bpo-31904.834kfY.rst D Misc/NEWS.d/next/Library/2019-03-14-01-09-59.bpo-36285.G-usj8.rst D Misc/NEWS.d/next/Library/2019-03-14-16-25-17.bpo-36268.MDXLw6.rst D Misc/NEWS.d/next/Library/2019-03-15-13-54-07.bpo-36298.amEVK2.rst D Misc/NEWS.d/next/Library/2019-03-15-21-41-22.bpo-36297.Gz9ZfU.rst D Misc/NEWS.d/next/Library/2019-03-16-13-40-59.bpo-36321.s6crQx.rst D Misc/NEWS.d/next/Library/2019-03-17-01-17-45.bpo-36324.dvNrRe.rst D Misc/NEWS.d/next/Library/2019-03-17-16-43-29.bpo-34745.nOfm7_.rst D Misc/NEWS.d/next/Library/2019-03-18-01-08-14.bpo-36320.-06b9_.rst D Misc/NEWS.d/next/Library/2019-03-23-10-25-07.bpo-36401.hYpVBS.rst D Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst D Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst D Misc/NEWS.d/next/Tests/2019-02-26-12-51-35.bpo-36123.QRhhRS.rst D Misc/NEWS.d/next/Tests/2019-02-28-18-33-29.bpo-29571.r6b9fr.rst D Misc/NEWS.d/next/Tests/2019-03-08-12-53-37.bpo-36234.NRVK6W.rst D Misc/NEWS.d/next/Tools-Demos/2017-12-19-20-42-36.bpo-32217.axXcjA.rst D Misc/NEWS.d/next/Tools-Demos/2019-03-04-02-09-09.bpo-35132.1R_pnL.rst D Misc/NEWS.d/next/Windows/2019-02-24-07-52-39.bpo-24643.PofyiS.rst D Misc/NEWS.d/next/Windows/2019-03-11-09-33-47.bpo-36264.rTzWce.rst D Misc/NEWS.d/next/Windows/2019-03-16-16-51-17.bpo-36312.Niwm-T.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 e9edf462b143..610c8a98edd4 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -20,10 +20,10 @@ #define PY_MINOR_VERSION 8 #define PY_MICRO_VERSION 0 #define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_ALPHA -#define PY_RELEASE_SERIAL 2 +#define PY_RELEASE_SERIAL 3 /* Version as a string */ -#define PY_VERSION "3.8.0a2+" +#define PY_VERSION "3.8.0a3" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index c2f9fa8e2fa6..3e11f54fd78a 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Mon Feb 25 13:03:43 2019 +# Autogenerated by Sphinx on Mon Mar 25 20:32:23 2019 topics = {'assert': 'The "assert" statement\n' '**********************\n' '\n' @@ -11436,15 +11436,6 @@ 'is\n' ' the original function object.\n' '\n' - ' When a user-defined method object is created by retrieving\n' - ' another method object from a class or instance, the behaviour ' - 'is\n' - ' the same as for a function object, except that the ' - '"__func__"\n' - ' attribute of the new instance is not the original method ' - 'object\n' - ' but its "__func__" attribute.\n' - '\n' ' When an instance method object is created by retrieving a ' 'class\n' ' method object from a class or instance, its "__self__" ' diff --git a/Misc/NEWS.d/3.8.0a3.rst b/Misc/NEWS.d/3.8.0a3.rst new file mode 100644 index 000000000000..4962464a10b5 --- /dev/null +++ b/Misc/NEWS.d/3.8.0a3.rst @@ -0,0 +1,871 @@ +.. bpo: 36216 +.. date: 2019-03-06-09-38-40 +.. nonce: 6q1m4a +.. release date: 2019-03-25 +.. section: Security + +Changes urlsplit() to raise ValueError when the URL contains characters that +decompose under IDNA encoding (NFKC-normalization) into characters that +affect how the URL is parsed. + +.. + +.. bpo: 35121 +.. date: 2018-10-31-15-39-17 +.. nonce: EgHv9k +.. section: Security + +Don't send cookies of domain A without Domain attribute to domain B when +domain A is a suffix match of domain B while using a cookiejar with +:class:`http.cookiejar.DefaultCookiePolicy` policy. Patch by Karthikeyan +Singaravelan. + +.. + +.. bpo: 36421 +.. date: 2019-03-24-21-33-22 +.. nonce: gJ2Pv9 +.. section: Core and Builtins + +Fix a possible double decref in _ctypes.c's ``PyCArrayType_new()``. + +.. + +.. bpo: 36412 +.. date: 2019-03-23-19-51-09 +.. nonce: C7acGn +.. section: Core and Builtins + +Fix a possible crash when creating a new dictionary. + +.. + +.. bpo: 36398 +.. date: 2019-03-21-22-19-38 +.. nonce: B_jXGe +.. section: Core and Builtins + +Fix a possible crash in ``structseq_repr()``. + +.. + +.. bpo: 12477 +.. date: 2019-03-21-00-24-18 +.. nonce: OZHa0t +.. section: Core and Builtins + +Fix bug in parsermodule when parsing a state in a DFA that has two or more +arcs with labels of the same type. Patch by Pablo Galindo. + +.. + +.. bpo: 36365 +.. date: 2019-03-19-15-58-23 +.. nonce: jHaErz +.. section: Core and Builtins + +repr(structseq) is no longer limited to 512 bytes. + +.. + +.. bpo: 36374 +.. date: 2019-03-19-15-46-42 +.. nonce: EWKMZE +.. section: Core and Builtins + +Fix a possible null pointer dereference in ``merge_consts_recursive()``. +Patch by Zackery Spytz. + +.. + +.. bpo: 36236 +.. date: 2019-03-19-03-08-26 +.. nonce: 5qN9qK +.. section: Core and Builtins + +At Python initialization, the current directory is no longer prepended to +:data:`sys.path` if it has been removed. + +.. + +.. bpo: 36352 +.. date: 2019-03-19-02-36-40 +.. nonce: qj2trz +.. section: Core and Builtins + +Python initialization now fails with an error, rather than silently +truncating paths, if a path is too long. + +.. + +.. bpo: 36301 +.. date: 2019-03-19-00-54-31 +.. nonce: xvOCJb +.. section: Core and Builtins + +Python initialization now fails if decoding ``pybuilddir.txt`` configuration +file fails at startup. + +.. + +.. bpo: 36333 +.. date: 2019-03-18-10-56-53 +.. nonce: 4dqemZ +.. section: Core and Builtins + +Fix leak in _PyRuntimeState_Fini. Contributed by St?phane Wirtel. + +.. + +.. bpo: 36332 +.. date: 2019-03-18-09-27-54 +.. nonce: yEC-Vz +.. section: Core and Builtins + +The builtin :func:`compile` can now handle AST objects that contain +assignment expressions. Patch by Pablo Galindo. + +.. + +.. bpo: 36282 +.. date: 2019-03-13-22-47-28 +.. nonce: zs7RKP +.. section: Core and Builtins + +Improved error message for too much positional arguments in some builtin +functions. + +.. + +.. bpo: 30040 +.. date: 2019-03-11-22-30-56 +.. nonce: W9z8X7 +.. section: Core and Builtins + +New empty dict uses fewer memory for now. It used more memory than empty +dict created by ``dict.clear()``. And empty dict creation and deletion is +about 2x faster. Patch by Inada Naoki. + +.. + +.. bpo: 36262 +.. date: 2019-03-11-15-37-33 +.. nonce: v3N6Fz +.. section: Core and Builtins + +Fix an unlikely memory leak on conversion from string to float in the +function ``_Py_dg_strtod()`` used by ``float(str)``, ``complex(str)``, +:func:`pickle.load`, :func:`marshal.load`, etc. + +.. + +.. bpo: 36252 +.. date: 2019-03-09-15-47-05 +.. nonce: sCQFKq +.. section: Core and Builtins + +Update Unicode databases to version 12.0.0. + +.. + +.. bpo: 36218 +.. date: 2019-03-07-13-05-43 +.. nonce: dZemNt +.. section: Core and Builtins + +Fix a segfault occuring when sorting a list of heterogeneous values. Patch +contributed by R?mi Lapeyre and Elliot Gorokhovsky. + +.. + +.. bpo: 36188 +.. date: 2019-03-04-18-05-31 +.. nonce: EuUZNz +.. section: Core and Builtins + +Cleaned up left-over vestiges of Python 2 unbound method handling in method +objects and documentation. Patch by Martijn Pieters + +.. + +.. bpo: 36124 +.. date: 2019-03-01-13-48-01 +.. nonce: Blzxq1 +.. section: Core and Builtins + +Add a new interpreter-specific dict and expose it in the C-API via +PyInterpreterState_GetDict(). This parallels PyThreadState_GetDict(). +However, extension modules should continue using PyModule_GetState() for +their own internal per-interpreter state. + +.. + +.. bpo: 35975 +.. date: 2019-02-27-16-49-08 +.. nonce: IescLY +.. section: Core and Builtins + +Add a ``feature_version`` flag to ``ast.parse()`` (documented) and +``compile()`` (hidden) that allows tweaking the parser to support older +versions of the grammar. In particular, if ``feature_version`` is 5 or 6, +the hacks for the ``async`` and ``await`` keyword from PEP 492 are +reinstated. (For 7 or higher, these are unconditionally treated as keywords, +but they are still special tokens rather than ``NAME`` tokens that the +parser driver recognizes.) + +.. + +.. bpo: 31904 +.. date: 2019-02-26-17-34-49 +.. nonce: R4KSj6 +.. section: Core and Builtins + +Use UTF-8 as the system encoding on VxWorks. + +.. + +.. bpo: 36048 +.. date: 2019-02-20-08-51-04 +.. nonce: I3LJt9 +.. section: Core and Builtins + +The :meth:`~object.__index__` special method will be used instead of +:meth:`~object.__int__` for implicit conversion of Python numbers to C +integers. Using the ``__int__()`` method in implicit conversions has been +deprecated. + +.. + +.. bpo: 11814 +.. date: 2019-02-11-00-50-03 +.. nonce: M12CMH +.. section: Core and Builtins + +Retire pgen and use a modified version of pgen2 to generate the parser. +Patch by Pablo Galindo. + +.. + +.. bpo: 36401 +.. date: 2019-03-23-10-25-07 +.. nonce: hYpVBS +.. section: Library + +The class documentation created by pydoc now has a separate section for +readonly properties. + +.. + +.. bpo: 36320 +.. date: 2019-03-18-01-08-14 +.. nonce: -06b9_ +.. section: Library + +The typing.NamedTuple() class has deprecated the _field_types attribute in +favor of the __annotations__ attribute which carried the same information. +Also, both attributes were converted from OrderedDict to a regular dict. + +.. + +.. bpo: 34745 +.. date: 2019-03-17-16-43-29 +.. nonce: nOfm7_ +.. section: Library + +Fix :mod:`asyncio` ssl memory issues caused by circular references + +.. + +.. bpo: 36324 +.. date: 2019-03-17-01-17-45 +.. nonce: dvNrRe +.. section: Library + +Add method to statistics.NormalDist for computing the inverse cumulative +normal distribution. + +.. + +.. bpo: 36321 +.. date: 2019-03-16-13-40-59 +.. nonce: s6crQx +.. section: Library + +collections.namedtuple() misspelled the name of an attribute. To be +consistent with typing.NamedTuple, the attribute name should have been +"_field_defaults" instead of "_fields_defaults". For backwards +compatibility, both spellings are now created. The misspelled version may +be removed in the future. + +.. + +.. bpo: 36297 +.. date: 2019-03-15-21-41-22 +.. nonce: Gz9ZfU +.. section: Library + +"unicode_internal" codec is removed. It was deprecated since Python 3.3. +Patch by Inada Naoki. + +.. + +.. bpo: 36298 +.. date: 2019-03-15-13-54-07 +.. nonce: amEVK2 +.. section: Library + +Raise ModuleNotFoundError in pyclbr when a module can't be found. Thanks to +'mental' for the bug report. + +.. + +.. bpo: 36268 +.. date: 2019-03-14-16-25-17 +.. nonce: MDXLw6 +.. section: Library + +Switch the default format used for writing tars with mod:`tarfile` to the +modern POSIX.1-2001 pax standard, from the vendor-specific GNU. Contributed +by C.A.M. Gerlach. + +.. + +.. bpo: 36285 +.. date: 2019-03-14-01-09-59 +.. nonce: G-usj8 +.. section: Library + +Fix integer overflows in the array module. Patch by Stephan Hohe. + +.. + +.. bpo: 31904 +.. date: 2019-03-13-14-55-02 +.. nonce: 834kfY +.. section: Library + +Add _signal module support for VxWorks. + +.. + +.. bpo: 36272 +.. date: 2019-03-13-14-14-36 +.. nonce: f3l2IG +.. section: Library + +:mod:`logging` does not silently ignore RecursionError anymore. Patch +contributed by R?mi Lapeyre. + +.. + +.. bpo: 36280 +.. date: 2019-03-12-21-02-55 +.. nonce: mOd3iH +.. section: Library + +Add a kind field to ast.Constant. It is 'u' if the literal has a 'u' prefix +(i.e. a Python 2 style unicode literal), else None. + +.. + +.. bpo: 35931 +.. date: 2019-03-11-22-06-36 +.. nonce: Qp_Tbe +.. section: Library + +The :mod:`pdb` ``debug`` command now gracefully handles all exceptions. + +.. + +.. bpo: 36251 +.. date: 2019-03-09-18-01-24 +.. nonce: zOp9l0 +.. section: Library + +Fix format strings used for stderrprinter and re.Match reprs. Patch by +Stephan Hohe. + +.. + +.. bpo: 36235 +.. date: 2019-03-08-13-32-21 +.. nonce: _M72wU +.. section: Library + +Fix ``CFLAGS`` in ``customize_compiler()`` of ``distutils.sysconfig``: when +the ``CFLAGS`` environment variable is defined, don't override ``CFLAGS`` +variable with the ``OPT`` variable anymore. Initial patch written by David +Malcolm. + +.. + +.. bpo: 35807 +.. date: 2019-03-06-13-21-33 +.. nonce: W7mmu3 +.. section: Library + +Update ensurepip to install pip 19.0.3 and setuptools 40.8.0. + +.. + +.. bpo: 36139 +.. date: 2019-03-06-13-07-29 +.. nonce: 6kedum +.. section: Library + +Release GIL when closing :class:`~mmap.mmap` objects. + +.. + +.. bpo: 36179 +.. date: 2019-03-04-10-42-46 +.. nonce: jEyuI- +.. section: Library + +Fix two unlikely reference leaks in _hashopenssl. The leaks only occur in +out-of-memory cases. + +.. + +.. bpo: 36169 +.. date: 2019-03-03-11-37-09 +.. nonce: 8nWJy7 +.. section: Library + +Add overlap() method to statistics.NormalDist. Computes the overlapping +coefficient for two normal distributions. + +.. + +.. bpo: 36103 +.. date: 2019-03-01-16-10-01 +.. nonce: n6VgXL +.. section: Library + +Default buffer size used by ``shutil.copyfileobj()`` is changed from 16 KiB +to 64 KiB on non-Windows platform to reduce system call overhead. +Contributed by Inada Naoki. + +.. + +.. bpo: 36130 +.. date: 2019-02-26-22-41-38 +.. nonce: _BnZOo +.. section: Library + +Fix ``pdb`` with ``skip=...`` when stepping into a frame without a +``__name__`` global. Patch by Anthony Sottile. + +.. + +.. bpo: 35652 +.. date: 2019-02-26-11-34-44 +.. nonce: 6KRJu_ +.. section: Library + +shutil.copytree(copy_function=...) erroneously pass DirEntry instead of a +path string. + +.. + +.. bpo: 35178 +.. date: 2019-02-25-23-04-00 +.. nonce: NA_rXa +.. section: Library + +Ensure custom :func:`warnings.formatwarning` function can receive `line` as +positional argument. Based on patch by Tashrif Billah. + +.. + +.. bpo: 36106 +.. date: 2019-02-25-13-21-43 +.. nonce: VuhEiQ +.. section: Library + +Resolve potential name clash with libm's sinpi(). Patch by Dmitrii +Pasechnik. + +.. + +.. bpo: 36091 +.. date: 2019-02-23-06-49-06 +.. nonce: 26o4Lc +.. section: Library + +Clean up reference to async generator in Lib/types. Patch by Henry Chen. + +.. + +.. bpo: 36043 +.. date: 2019-02-19-19-53-46 +.. nonce: l867v0 +.. section: Library + +:class:`FileCookieJar` supports :term:`path-like object`. Contributed by +St?phane Wirtel + +.. + +.. bpo: 35899 +.. date: 2019-02-16-07-11-02 +.. nonce: cjfn5a +.. section: Library + +Enum has been fixed to correctly handle empty strings and strings with +non-Latin characters (ie. '?', '?') without crashing. Original patch +contributed by Maxwell. Assisted by St?phane Wirtel. + +.. + +.. bpo: 21269 +.. date: 2019-02-10-16-49-16 +.. nonce: Fqi7VH +.. section: Library + +Add ``args`` and ``kwargs`` properties to mock call objects. Contributed by +Kumar Akshay. + +.. + +.. bpo: 30670 +.. date: 2019-02-06-12-07-46 +.. nonce: yffB3F +.. section: Library + +`pprint.pp` has been added to pretty-print objects with dictionary keys +being sorted with their insertion order by default. Parameter *sort_dicts* +has been added to `pprint.pprint`, `pprint.pformat` and +`pprint.PrettyPrinter`. Contributed by R?mi Lapeyre. + +.. + +.. bpo: 35843 +.. date: 2019-01-28-10-19-40 +.. nonce: 7rXGQE +.. section: Library + +Implement ``__getitem__`` for ``_NamespacePath``. Patch by Anthony Sottile. + +.. + +.. bpo: 35802 +.. date: 2019-01-21-13-56-55 +.. nonce: 6633PE +.. section: Library + +Clean up code which checked presence of ``os.stat`` / ``os.lstat`` / +``os.chmod`` which are always present. Patch by Anthony Sottile. + +.. + +.. bpo: 35715 +.. date: 2019-01-11-08-47-58 +.. nonce: Wi3gl0 +.. section: Library + +Librates the return value of a ProcessPoolExecutor _process_worker after +it's no longer needed to free memory + +.. + +.. bpo: 35493 +.. date: 2019-01-09-23-43-08 +.. nonce: kEcRGE +.. section: Library + +Use :func:`multiprocessing.connection.wait` instead of polling each 0.2 +seconds for worker updates in :class:`multiprocessing.Pool`. Patch by Pablo +Galindo. + +.. + +.. bpo: 35661 +.. date: 2019-01-05-16-16-20 +.. nonce: H_UOXc +.. section: Library + +Store the venv prompt in pyvenv.cfg. + +.. + +.. bpo: 35121 +.. date: 2018-12-30-14-35-19 +.. nonce: oWmiGU +.. section: Library + +Don't set cookie for a request when the request path is a prefix match of +the cookie's path attribute but doesn't end with "/". Patch by Karthikeyan +Singaravelan. + +.. + +.. bpo: 21478 +.. date: 2018-12-21-09-54-30 +.. nonce: 5gsXtc +.. section: Library + +Calls to a child function created with :func:`unittest.mock.create_autospec` +should propagate to the parent. Patch by Karthikeyan Singaravelan. + +.. + +.. bpo: 35198 +.. date: 2018-11-09-12-45-28 +.. nonce: EJ8keW +.. section: Library + +Fix C++ extension compilation on AIX + +.. + +.. bpo: 36329 +.. date: 2019-03-17-20-01-41 +.. nonce: L5dJPD +.. section: Documentation + +Declare the path of the Python binary for the usage of +``Tools/scripts/serve.py`` when executing ``make -C Doc/ serve``. +Contributed by St?phane Wirtel + +.. + +.. bpo: 36138 +.. date: 2019-03-02-00-40-57 +.. nonce: yfjNzG +.. section: Documentation + +Improve documentation about converting datetime.timedelta to scalars. + +.. + +.. bpo: 21314 +.. date: 2018-11-21-23-01-37 +.. nonce: PG33VT +.. section: Documentation + +A new entry was added to the Core Language Section of the Programming FAQ, +which explaines the usage of slash(/) in the signature of a function. Patch +by Lysandros Nikolaou + +.. + +.. bpo: 36234 +.. date: 2019-03-08-12-53-37 +.. nonce: NRVK6W +.. section: Tests + +test_posix.PosixUidGidTests: add tests for invalid uid/gid type (str). +Initial patch written by David Malcolm. + +.. + +.. bpo: 29571 +.. date: 2019-02-28-18-33-29 +.. nonce: r6b9fr +.. section: Tests + +Fix ``test_re.test_locale_flag()``: use ``locale.getpreferredencoding()`` +rather than ``locale.getlocale()`` to get the locale encoding. With some +locales, ``locale.getlocale()`` returns the wrong encoding. + +.. + +.. bpo: 36123 +.. date: 2019-02-26-12-51-35 +.. nonce: QRhhRS +.. section: Tests + +Fix race condition in test_socket. + +.. + +.. bpo: 36356 +.. date: 2019-03-18-23-49-15 +.. nonce: WNrwYI +.. section: Build + +Fix leaks that led to build failure when configured with address sanitizer. + +.. + +.. bpo: 36146 +.. date: 2019-03-01-17-49-22 +.. nonce: VeoyG7 +.. section: Build + +Add ``TEST_EXTENSIONS`` constant to ``setup.py`` to allow to not build test +extensions like ``_testcapi``. + +.. + +.. bpo: 36146 +.. date: 2019-02-28-18-09-01 +.. nonce: IwPJVT +.. section: Build + +Fix setup.py on macOS: only add ``/usr/include/ffi`` to include directories +of _ctypes, not for all extensions. + +.. + +.. bpo: 31904 +.. date: 2019-02-21-14-48-31 +.. nonce: J82jY2 +.. section: Build + +Enable build system to cross-build for VxWorks RTOS. + +.. + +.. bpo: 36312 +.. date: 2019-03-16-16-51-17 +.. nonce: Niwm-T +.. section: Windows + +Fixed decoders for the following code pages: 50220, 50221, 50222, 50225, +50227, 50229, 57002 through 57011, 65000 and 42. + +.. + +.. bpo: 36264 +.. date: 2019-03-11-09-33-47 +.. nonce: rTzWce +.. section: Windows + +Don't honor POSIX ``HOME`` in ``os.path.expanduser`` on windows. Patch by +Anthony Sottile. + +.. + +.. bpo: 24643 +.. date: 2019-02-24-07-52-39 +.. nonce: PofyiS +.. section: Windows + +Fix name collisions due to ``#define timezone _timezone`` in PC/pyconfig.h. + +.. + +.. bpo: 36405 +.. date: 2019-03-23-01-45-56 +.. nonce: m7Wv1F +.. section: IDLE + +Use dict unpacking in idlelib. + +.. + +.. bpo: 36396 +.. date: 2019-03-21-22-43-21 +.. nonce: xSTX-I +.. section: IDLE + +Remove fgBg param of idlelib.config.GetHighlight(). This param was only used +twice and changed the return type. + +.. + +.. bpo: 36176 +.. date: 2019-03-10-00-07-46 +.. nonce: jk_vv6 +.. section: IDLE + +Fix IDLE autocomplete & calltip popup colors. Prevent conflicts with Linux +dark themes (and slightly darken calltip background). + +.. + +.. bpo: 23205 +.. date: 2019-03-06-14-47-57 +.. nonce: Vv0gfH +.. section: IDLE + +For the grep module, add tests for findfiles, refactor findfiles to be a +module-level function, and refactor findfiles to use os.walk. + +.. + +.. bpo: 23216 +.. date: 2019-03-02-19-39-53 +.. nonce: ZA7H8H +.. section: IDLE + +Add docstrings to IDLE search modules. + +.. + +.. bpo: 36152 +.. date: 2019-02-28-18-52-40 +.. nonce: 9pkHIU +.. section: IDLE + +Remove colorizer.ColorDelegator.close_when_done and the corresponding +argument of .close(). In IDLE, both have always been None or False since +2007. + +.. + +.. bpo: 32129 +.. date: 2019-02-25-11-40-14 +.. nonce: 4qVCzD +.. section: IDLE + +Avoid blurry IDLE application icon on macOS with Tk 8.6. Patch by Kevin +Walzer. + +.. + +.. bpo: 36096 +.. date: 2019-02-23-17-53-53 +.. nonce: mN5Ly3 +.. section: IDLE + +Refactor class variables to instance variables in colorizer. + +.. + +.. bpo: 30348 +.. date: 2018-06-27-21-18-41 +.. nonce: WbaRJW +.. section: IDLE + +Increase test coverage of idlelib.autocomplete by 30%. + +.. + +.. bpo: 35132 +.. date: 2019-03-04-02-09-09 +.. nonce: 1R_pnL +.. section: Tools/Demos + +Fix py-list and py-bt commands of python-gdb.py on gdb7. + +.. + +.. bpo: 32217 +.. date: 2017-12-19-20-42-36 +.. nonce: axXcjA +.. section: Tools/Demos + +Fix freeze script on Windows. + +.. + +.. bpo: 36381 +.. date: 2019-03-20-22-02-40 +.. nonce: xlzDJ2 +.. section: C API + +Raise ``DeprecationWarning`` when '#' formats are used for building or +parsing values without ``PY_SSIZE_T_CLEAN``. + +.. + +.. bpo: 36142 +.. date: 2019-03-01-03-23-48 +.. nonce: 7F6wJd +.. section: C API + +The whole coreconfig.h header is now excluded from Py_LIMITED_API. Move +functions definitions into a new internal pycore_coreconfig.h header. diff --git a/Misc/NEWS.d/next/Build/2019-02-21-14-48-31.bpo-31904.J82jY2.rst b/Misc/NEWS.d/next/Build/2019-02-21-14-48-31.bpo-31904.J82jY2.rst deleted file mode 100644 index 1292193b729c..000000000000 --- a/Misc/NEWS.d/next/Build/2019-02-21-14-48-31.bpo-31904.J82jY2.rst +++ /dev/null @@ -1 +0,0 @@ -Enable build system to cross-build for VxWorks RTOS. diff --git a/Misc/NEWS.d/next/Build/2019-02-28-18-09-01.bpo-36146.IwPJVT.rst b/Misc/NEWS.d/next/Build/2019-02-28-18-09-01.bpo-36146.IwPJVT.rst deleted file mode 100644 index 93c1e1afac87..000000000000 --- a/Misc/NEWS.d/next/Build/2019-02-28-18-09-01.bpo-36146.IwPJVT.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix setup.py on macOS: only add ``/usr/include/ffi`` to include -directories of _ctypes, not for all extensions. diff --git a/Misc/NEWS.d/next/Build/2019-03-01-17-49-22.bpo-36146.VeoyG7.rst b/Misc/NEWS.d/next/Build/2019-03-01-17-49-22.bpo-36146.VeoyG7.rst deleted file mode 100644 index f32a821302c5..000000000000 --- a/Misc/NEWS.d/next/Build/2019-03-01-17-49-22.bpo-36146.VeoyG7.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add ``TEST_EXTENSIONS`` constant to ``setup.py`` to allow to not build test -extensions like ``_testcapi``. diff --git a/Misc/NEWS.d/next/Build/2019-03-18-23-49-15.bpo-36356.WNrwYI.rst b/Misc/NEWS.d/next/Build/2019-03-18-23-49-15.bpo-36356.WNrwYI.rst deleted file mode 100644 index d30f5d586b7c..000000000000 --- a/Misc/NEWS.d/next/Build/2019-03-18-23-49-15.bpo-36356.WNrwYI.rst +++ /dev/null @@ -1 +0,0 @@ -Fix leaks that led to build failure when configured with address sanitizer. diff --git a/Misc/NEWS.d/next/C API/2019-03-01-03-23-48.bpo-36142.7F6wJd.rst b/Misc/NEWS.d/next/C API/2019-03-01-03-23-48.bpo-36142.7F6wJd.rst deleted file mode 100644 index 0005270c22d9..000000000000 --- a/Misc/NEWS.d/next/C API/2019-03-01-03-23-48.bpo-36142.7F6wJd.rst +++ /dev/null @@ -1,2 +0,0 @@ -The whole coreconfig.h header is now excluded from Py_LIMITED_API. Move -functions definitions into a new internal pycore_coreconfig.h header. diff --git a/Misc/NEWS.d/next/C API/2019-03-20-22-02-40.bpo-36381.xlzDJ2.rst b/Misc/NEWS.d/next/C API/2019-03-20-22-02-40.bpo-36381.xlzDJ2.rst deleted file mode 100644 index 66982aa7eaf4..000000000000 --- a/Misc/NEWS.d/next/C API/2019-03-20-22-02-40.bpo-36381.xlzDJ2.rst +++ /dev/null @@ -1,2 +0,0 @@ -Raise ``DeprecationWarning`` when '#' formats are used for building or -parsing values without ``PY_SSIZE_T_CLEAN``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-02-11-00-50-03.bpo-11814.M12CMH.rst b/Misc/NEWS.d/next/Core and Builtins/2019-02-11-00-50-03.bpo-11814.M12CMH.rst deleted file mode 100644 index b3bec728d9dd..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-02-11-00-50-03.bpo-11814.M12CMH.rst +++ /dev/null @@ -1,2 +0,0 @@ -Retire pgen and use a modified version of pgen2 to generate the parser. -Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-02-20-08-51-04.bpo-36048.I3LJt9.rst b/Misc/NEWS.d/next/Core and Builtins/2019-02-20-08-51-04.bpo-36048.I3LJt9.rst deleted file mode 100644 index d032e84341c9..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-02-20-08-51-04.bpo-36048.I3LJt9.rst +++ /dev/null @@ -1,4 +0,0 @@ -The :meth:`~object.__index__` special method will be used instead of -:meth:`~object.__int__` for implicit conversion of Python numbers to C -integers. Using the ``__int__()`` method in implicit conversions has been -deprecated. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-02-26-17-34-49.bpo-31904.R4KSj6.rst b/Misc/NEWS.d/next/Core and Builtins/2019-02-26-17-34-49.bpo-31904.R4KSj6.rst deleted file mode 100644 index 29514952fd74..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-02-26-17-34-49.bpo-31904.R4KSj6.rst +++ /dev/null @@ -1 +0,0 @@ -Use UTF-8 as the system encoding on VxWorks. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-02-27-16-49-08.bpo-35975.IescLY.rst b/Misc/NEWS.d/next/Core and Builtins/2019-02-27-16-49-08.bpo-35975.IescLY.rst deleted file mode 100644 index 3bbfc74469c9..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-02-27-16-49-08.bpo-35975.IescLY.rst +++ /dev/null @@ -1,7 +0,0 @@ -Add a ``feature_version`` flag to ``ast.parse()`` (documented) and -``compile()`` (hidden) that allows tweaking the parser to support older -versions of the grammar. In particular, if ``feature_version`` is 5 or 6, -the hacks for the ``async`` and ``await`` keyword from PEP 492 are -reinstated. (For 7 or higher, these are unconditionally treated as keywords, -but they are still special tokens rather than ``NAME`` tokens that the -parser driver recognizes.) diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-01-13-48-01.bpo-36124.Blzxq1.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-01-13-48-01.bpo-36124.Blzxq1.rst deleted file mode 100644 index ee9b0c110241..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-01-13-48-01.bpo-36124.Blzxq1.rst +++ /dev/null @@ -1,4 +0,0 @@ -Add a new interpreter-specific dict and expose it in the C-API via -PyInterpreterState_GetDict(). This parallels PyThreadState_GetDict(). -However, extension modules should continue using PyModule_GetState() for -their own internal per-interpreter state. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-04-18-05-31.bpo-36188.EuUZNz.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-04-18-05-31.bpo-36188.EuUZNz.rst deleted file mode 100644 index f018e31ede91..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-04-18-05-31.bpo-36188.EuUZNz.rst +++ /dev/null @@ -1,2 +0,0 @@ -Cleaned up left-over vestiges of Python 2 unbound method handling in method objects and documentation. -Patch by Martijn Pieters \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-07-13-05-43.bpo-36218.dZemNt.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-07-13-05-43.bpo-36218.dZemNt.rst deleted file mode 100644 index ab6d207f37e2..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-07-13-05-43.bpo-36218.dZemNt.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a segfault occuring when sorting a list of heterogeneous values. Patch -contributed by R?mi Lapeyre and Elliot Gorokhovsky. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-09-15-47-05.bpo-36252.sCQFKq.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-09-15-47-05.bpo-36252.sCQFKq.rst deleted file mode 100644 index b79bc493f4fc..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-09-15-47-05.bpo-36252.sCQFKq.rst +++ /dev/null @@ -1 +0,0 @@ -Update Unicode databases to version 12.0.0. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-11-15-37-33.bpo-36262.v3N6Fz.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-11-15-37-33.bpo-36262.v3N6Fz.rst deleted file mode 100644 index b5ccc95fd705..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-11-15-37-33.bpo-36262.v3N6Fz.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix an unlikely memory leak on conversion from string to float in the function -``_Py_dg_strtod()`` used by ``float(str)``, ``complex(str)``, -:func:`pickle.load`, :func:`marshal.load`, etc. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-11-22-30-56.bpo-30040.W9z8X7.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-11-22-30-56.bpo-30040.W9z8X7.rst deleted file mode 100644 index 0975dba1f37e..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-11-22-30-56.bpo-30040.W9z8X7.rst +++ /dev/null @@ -1,3 +0,0 @@ -New empty dict uses fewer memory for now. It used more memory than empty -dict created by ``dict.clear()``. And empty dict creation and deletion -is about 2x faster. Patch by Inada Naoki. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-13-22-47-28.bpo-36282.zs7RKP.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-13-22-47-28.bpo-36282.zs7RKP.rst deleted file mode 100644 index f9ec51e381d0..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-13-22-47-28.bpo-36282.zs7RKP.rst +++ /dev/null @@ -1,2 +0,0 @@ -Improved error message for too much positional arguments in some builtin -functions. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-18-09-27-54.bpo-36332.yEC-Vz.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-18-09-27-54.bpo-36332.yEC-Vz.rst deleted file mode 100644 index 2c69c1c56527..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-18-09-27-54.bpo-36332.yEC-Vz.rst +++ /dev/null @@ -1,2 +0,0 @@ -The builtin :func:`compile` can now handle AST objects that contain -assignment expressions. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-18-10-56-53.bpo-36333.4dqemZ.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-18-10-56-53.bpo-36333.4dqemZ.rst deleted file mode 100644 index e5af44fda409..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-18-10-56-53.bpo-36333.4dqemZ.rst +++ /dev/null @@ -1 +0,0 @@ -Fix leak in _PyRuntimeState_Fini. Contributed by St?phane Wirtel. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-19-00-54-31.bpo-36301.xvOCJb.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-19-00-54-31.bpo-36301.xvOCJb.rst deleted file mode 100644 index 84e4b8a85233..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-19-00-54-31.bpo-36301.xvOCJb.rst +++ /dev/null @@ -1,2 +0,0 @@ -Python initialization now fails if decoding ``pybuilddir.txt`` configuration -file fails at startup. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-19-02-36-40.bpo-36352.qj2trz.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-19-02-36-40.bpo-36352.qj2trz.rst deleted file mode 100644 index 148201cd1b6e..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-19-02-36-40.bpo-36352.qj2trz.rst +++ /dev/null @@ -1,2 +0,0 @@ -Python initialization now fails with an error, rather than silently -truncating paths, if a path is too long. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-19-03-08-26.bpo-36236.5qN9qK.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-19-03-08-26.bpo-36236.5qN9qK.rst deleted file mode 100644 index e1c1182d181a..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-19-03-08-26.bpo-36236.5qN9qK.rst +++ /dev/null @@ -1,2 +0,0 @@ -At Python initialization, the current directory is no longer prepended to -:data:`sys.path` if it has been removed. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-19-15-46-42.bpo-36374.EWKMZE.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-19-15-46-42.bpo-36374.EWKMZE.rst deleted file mode 100644 index 2eac30136854..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-19-15-46-42.bpo-36374.EWKMZE.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a possible null pointer dereference in ``merge_consts_recursive()``. -Patch by Zackery Spytz. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-19-15-58-23.bpo-36365.jHaErz.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-19-15-58-23.bpo-36365.jHaErz.rst deleted file mode 100644 index 206de56f08fb..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-19-15-58-23.bpo-36365.jHaErz.rst +++ /dev/null @@ -1 +0,0 @@ -repr(structseq) is no longer limited to 512 bytes. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-21-00-24-18.bpo-12477.OZHa0t.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-21-00-24-18.bpo-12477.OZHa0t.rst deleted file mode 100644 index aada7f912a6c..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-21-00-24-18.bpo-12477.OZHa0t.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix bug in parsermodule when parsing a state in a DFA that has two or more -arcs with labels of the same type. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-21-22-19-38.bpo-36398.B_jXGe.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-21-22-19-38.bpo-36398.B_jXGe.rst deleted file mode 100644 index 2b00283096f2..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-21-22-19-38.bpo-36398.B_jXGe.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a possible crash in ``structseq_repr()``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-23-19-51-09.bpo-36412.C7acGn.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-23-19-51-09.bpo-36412.C7acGn.rst deleted file mode 100644 index 0146988151ee..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-23-19-51-09.bpo-36412.C7acGn.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a possible crash when creating a new dictionary. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-24-21-33-22.bpo-36421.gJ2Pv9.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-24-21-33-22.bpo-36421.gJ2Pv9.rst deleted file mode 100644 index 2577511de2e2..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-24-21-33-22.bpo-36421.gJ2Pv9.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a possible double decref in _ctypes.c's ``PyCArrayType_new()``. diff --git a/Misc/NEWS.d/next/Documentation/2018-11-21-23-01-37.bpo-21314.PG33VT.rst b/Misc/NEWS.d/next/Documentation/2018-11-21-23-01-37.bpo-21314.PG33VT.rst deleted file mode 100644 index 83080a3a580b..000000000000 --- a/Misc/NEWS.d/next/Documentation/2018-11-21-23-01-37.bpo-21314.PG33VT.rst +++ /dev/null @@ -1,3 +0,0 @@ -A new entry was added to the Core Language Section of the Programming FAQ, -which explaines the usage of slash(/) in the signature of a function. Patch -by Lysandros Nikolaou diff --git a/Misc/NEWS.d/next/Documentation/2019-03-02-00-40-57.bpo-36138.yfjNzG.rst b/Misc/NEWS.d/next/Documentation/2019-03-02-00-40-57.bpo-36138.yfjNzG.rst deleted file mode 100644 index f5352bb3958f..000000000000 --- a/Misc/NEWS.d/next/Documentation/2019-03-02-00-40-57.bpo-36138.yfjNzG.rst +++ /dev/null @@ -1 +0,0 @@ -Improve documentation about converting datetime.timedelta to scalars. diff --git a/Misc/NEWS.d/next/Documentation/2019-03-17-20-01-41.bpo-36329.L5dJPD.rst b/Misc/NEWS.d/next/Documentation/2019-03-17-20-01-41.bpo-36329.L5dJPD.rst deleted file mode 100644 index 94e5884cc9ad..000000000000 --- a/Misc/NEWS.d/next/Documentation/2019-03-17-20-01-41.bpo-36329.L5dJPD.rst +++ /dev/null @@ -1,3 +0,0 @@ -Declare the path of the Python binary for the usage of -``Tools/scripts/serve.py`` when executing ``make -C Doc/ serve``. -Contributed by St?phane Wirtel diff --git a/Misc/NEWS.d/next/IDLE/2018-06-27-21-18-41.bpo-30348.WbaRJW.rst b/Misc/NEWS.d/next/IDLE/2018-06-27-21-18-41.bpo-30348.WbaRJW.rst deleted file mode 100644 index f665241670c7..000000000000 --- a/Misc/NEWS.d/next/IDLE/2018-06-27-21-18-41.bpo-30348.WbaRJW.rst +++ /dev/null @@ -1 +0,0 @@ -Increase test coverage of idlelib.autocomplete by 30%. diff --git a/Misc/NEWS.d/next/IDLE/2019-02-23-17-53-53.bpo-36096.mN5Ly3.rst b/Misc/NEWS.d/next/IDLE/2019-02-23-17-53-53.bpo-36096.mN5Ly3.rst deleted file mode 100644 index cd6f76e9ac2b..000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-02-23-17-53-53.bpo-36096.mN5Ly3.rst +++ /dev/null @@ -1 +0,0 @@ -Refactor class variables to instance variables in colorizer. diff --git a/Misc/NEWS.d/next/IDLE/2019-02-25-11-40-14.bpo-32129.4qVCzD.rst b/Misc/NEWS.d/next/IDLE/2019-02-25-11-40-14.bpo-32129.4qVCzD.rst deleted file mode 100644 index 54a5c7244140..000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-02-25-11-40-14.bpo-32129.4qVCzD.rst +++ /dev/null @@ -1,2 +0,0 @@ -Avoid blurry IDLE application icon on macOS with Tk 8.6. Patch by Kevin -Walzer. diff --git a/Misc/NEWS.d/next/IDLE/2019-02-28-18-52-40.bpo-36152.9pkHIU.rst b/Misc/NEWS.d/next/IDLE/2019-02-28-18-52-40.bpo-36152.9pkHIU.rst deleted file mode 100644 index b75ae89ef30a..000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-02-28-18-52-40.bpo-36152.9pkHIU.rst +++ /dev/null @@ -1,3 +0,0 @@ -Remove colorizer.ColorDelegator.close_when_done and the -corresponding argument of .close(). In IDLE, both have -always been None or False since 2007. diff --git a/Misc/NEWS.d/next/IDLE/2019-03-02-19-39-53.bpo-23216.ZA7H8H.rst b/Misc/NEWS.d/next/IDLE/2019-03-02-19-39-53.bpo-23216.ZA7H8H.rst deleted file mode 100644 index ec091615a190..000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-03-02-19-39-53.bpo-23216.ZA7H8H.rst +++ /dev/null @@ -1 +0,0 @@ -Add docstrings to IDLE search modules. diff --git a/Misc/NEWS.d/next/IDLE/2019-03-06-14-47-57.bpo-23205.Vv0gfH.rst b/Misc/NEWS.d/next/IDLE/2019-03-06-14-47-57.bpo-23205.Vv0gfH.rst deleted file mode 100644 index 9e7c222ffc45..000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-03-06-14-47-57.bpo-23205.Vv0gfH.rst +++ /dev/null @@ -1,2 +0,0 @@ -For the grep module, add tests for findfiles, refactor findfiles to be a -module-level function, and refactor findfiles to use os.walk. diff --git a/Misc/NEWS.d/next/IDLE/2019-03-10-00-07-46.bpo-36176.jk_vv6.rst b/Misc/NEWS.d/next/IDLE/2019-03-10-00-07-46.bpo-36176.jk_vv6.rst deleted file mode 100644 index 5998c6fadfc7..000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-03-10-00-07-46.bpo-36176.jk_vv6.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix IDLE autocomplete & calltip popup colors. Prevent conflicts with Linux -dark themes (and slightly darken calltip background). diff --git a/Misc/NEWS.d/next/IDLE/2019-03-21-22-43-21.bpo-36396.xSTX-I.rst b/Misc/NEWS.d/next/IDLE/2019-03-21-22-43-21.bpo-36396.xSTX-I.rst deleted file mode 100644 index 1d142b5c30ff..000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-03-21-22-43-21.bpo-36396.xSTX-I.rst +++ /dev/null @@ -1,2 +0,0 @@ -Remove fgBg param of idlelib.config.GetHighlight(). This param was only used -twice and changed the return type. diff --git a/Misc/NEWS.d/next/IDLE/2019-03-23-01-45-56.bpo-36405.m7Wv1F.rst b/Misc/NEWS.d/next/IDLE/2019-03-23-01-45-56.bpo-36405.m7Wv1F.rst deleted file mode 100644 index bef438d5a5a7..000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-03-23-01-45-56.bpo-36405.m7Wv1F.rst +++ /dev/null @@ -1 +0,0 @@ -Use dict unpacking in idlelib. diff --git a/Misc/NEWS.d/next/Library/2018-11-09-12-45-28.bpo-35198.EJ8keW.rst b/Misc/NEWS.d/next/Library/2018-11-09-12-45-28.bpo-35198.EJ8keW.rst deleted file mode 100644 index 4ce7a7e3423c..000000000000 --- a/Misc/NEWS.d/next/Library/2018-11-09-12-45-28.bpo-35198.EJ8keW.rst +++ /dev/null @@ -1 +0,0 @@ -Fix C++ extension compilation on AIX diff --git a/Misc/NEWS.d/next/Library/2018-12-21-09-54-30.bpo-21478.5gsXtc.rst b/Misc/NEWS.d/next/Library/2018-12-21-09-54-30.bpo-21478.5gsXtc.rst deleted file mode 100644 index 1000748c9c48..000000000000 --- a/Misc/NEWS.d/next/Library/2018-12-21-09-54-30.bpo-21478.5gsXtc.rst +++ /dev/null @@ -1,2 +0,0 @@ -Calls to a child function created with :func:`unittest.mock.create_autospec` -should propagate to the parent. Patch by Karthikeyan Singaravelan. diff --git a/Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst b/Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst deleted file mode 100644 index 032e1e2c00bc..000000000000 --- a/Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst +++ /dev/null @@ -1,3 +0,0 @@ -Don't set cookie for a request when the request path is a prefix match of -the cookie's path attribute but doesn't end with "/". Patch by Karthikeyan -Singaravelan. diff --git a/Misc/NEWS.d/next/Library/2019-01-05-16-16-20.bpo-35661.H_UOXc.rst b/Misc/NEWS.d/next/Library/2019-01-05-16-16-20.bpo-35661.H_UOXc.rst deleted file mode 100644 index 431898686115..000000000000 --- a/Misc/NEWS.d/next/Library/2019-01-05-16-16-20.bpo-35661.H_UOXc.rst +++ /dev/null @@ -1 +0,0 @@ -Store the venv prompt in pyvenv.cfg. diff --git a/Misc/NEWS.d/next/Library/2019-01-09-23-43-08.bpo-35493.kEcRGE.rst b/Misc/NEWS.d/next/Library/2019-01-09-23-43-08.bpo-35493.kEcRGE.rst deleted file mode 100644 index fa408c8163b7..000000000000 --- a/Misc/NEWS.d/next/Library/2019-01-09-23-43-08.bpo-35493.kEcRGE.rst +++ /dev/null @@ -1,3 +0,0 @@ -Use :func:`multiprocessing.connection.wait` instead of polling each 0.2 -seconds for worker updates in :class:`multiprocessing.Pool`. Patch by Pablo -Galindo. diff --git a/Misc/NEWS.d/next/Library/2019-01-11-08-47-58.bpo-35715.Wi3gl0.rst b/Misc/NEWS.d/next/Library/2019-01-11-08-47-58.bpo-35715.Wi3gl0.rst deleted file mode 100644 index 0c1ec6b53fd8..000000000000 --- a/Misc/NEWS.d/next/Library/2019-01-11-08-47-58.bpo-35715.Wi3gl0.rst +++ /dev/null @@ -1 +0,0 @@ -Librates the return value of a ProcessPoolExecutor _process_worker after it's no longer needed to free memory \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-01-21-13-56-55.bpo-35802.6633PE.rst b/Misc/NEWS.d/next/Library/2019-01-21-13-56-55.bpo-35802.6633PE.rst deleted file mode 100644 index 8b73d2bd5851..000000000000 --- a/Misc/NEWS.d/next/Library/2019-01-21-13-56-55.bpo-35802.6633PE.rst +++ /dev/null @@ -1,2 +0,0 @@ -Clean up code which checked presence of ``os.stat`` / ``os.lstat`` / -``os.chmod`` which are always present. Patch by Anthony Sottile. diff --git a/Misc/NEWS.d/next/Library/2019-01-28-10-19-40.bpo-35843.7rXGQE.rst b/Misc/NEWS.d/next/Library/2019-01-28-10-19-40.bpo-35843.7rXGQE.rst deleted file mode 100644 index 1a9eaf0d1390..000000000000 --- a/Misc/NEWS.d/next/Library/2019-01-28-10-19-40.bpo-35843.7rXGQE.rst +++ /dev/null @@ -1 +0,0 @@ -Implement ``__getitem__`` for ``_NamespacePath``. Patch by Anthony Sottile. diff --git a/Misc/NEWS.d/next/Library/2019-02-06-12-07-46.bpo-30670.yffB3F.rst b/Misc/NEWS.d/next/Library/2019-02-06-12-07-46.bpo-30670.yffB3F.rst deleted file mode 100644 index 63cdbb363f76..000000000000 --- a/Misc/NEWS.d/next/Library/2019-02-06-12-07-46.bpo-30670.yffB3F.rst +++ /dev/null @@ -1,4 +0,0 @@ -`pprint.pp` has been added to pretty-print objects with dictionary -keys being sorted with their insertion order by default. Parameter -*sort_dicts* has been added to `pprint.pprint`, `pprint.pformat` and -`pprint.PrettyPrinter`. Contributed by R?mi Lapeyre. diff --git a/Misc/NEWS.d/next/Library/2019-02-10-16-49-16.bpo-21269.Fqi7VH.rst b/Misc/NEWS.d/next/Library/2019-02-10-16-49-16.bpo-21269.Fqi7VH.rst deleted file mode 100644 index 15ad636a5e80..000000000000 --- a/Misc/NEWS.d/next/Library/2019-02-10-16-49-16.bpo-21269.Fqi7VH.rst +++ /dev/null @@ -1 +0,0 @@ -Add ``args`` and ``kwargs`` properties to mock call objects. Contributed by Kumar Akshay. diff --git a/Misc/NEWS.d/next/Library/2019-02-16-07-11-02.bpo-35899.cjfn5a.rst b/Misc/NEWS.d/next/Library/2019-02-16-07-11-02.bpo-35899.cjfn5a.rst deleted file mode 100644 index 73d4fa17b33d..000000000000 --- a/Misc/NEWS.d/next/Library/2019-02-16-07-11-02.bpo-35899.cjfn5a.rst +++ /dev/null @@ -1 +0,0 @@ -Enum has been fixed to correctly handle empty strings and strings with non-Latin characters (ie. '?', '?') without crashing. Original patch contributed by Maxwell. Assisted by St?phane Wirtel. diff --git a/Misc/NEWS.d/next/Library/2019-02-19-19-53-46.bpo-36043.l867v0.rst b/Misc/NEWS.d/next/Library/2019-02-19-19-53-46.bpo-36043.l867v0.rst deleted file mode 100644 index f4911a0c8d0a..000000000000 --- a/Misc/NEWS.d/next/Library/2019-02-19-19-53-46.bpo-36043.l867v0.rst +++ /dev/null @@ -1 +0,0 @@ -:class:`FileCookieJar` supports :term:`path-like object`. Contributed by St?phane Wirtel diff --git a/Misc/NEWS.d/next/Library/2019-02-23-06-49-06.bpo-36091.26o4Lc.rst b/Misc/NEWS.d/next/Library/2019-02-23-06-49-06.bpo-36091.26o4Lc.rst deleted file mode 100644 index 582be4493768..000000000000 --- a/Misc/NEWS.d/next/Library/2019-02-23-06-49-06.bpo-36091.26o4Lc.rst +++ /dev/null @@ -1 +0,0 @@ -Clean up reference to async generator in Lib/types. Patch by Henry Chen. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-02-25-13-21-43.bpo-36106.VuhEiQ.rst b/Misc/NEWS.d/next/Library/2019-02-25-13-21-43.bpo-36106.VuhEiQ.rst deleted file mode 100644 index 36e17508cd4a..000000000000 --- a/Misc/NEWS.d/next/Library/2019-02-25-13-21-43.bpo-36106.VuhEiQ.rst +++ /dev/null @@ -1 +0,0 @@ -Resolve potential name clash with libm's sinpi(). Patch by Dmitrii Pasechnik. diff --git a/Misc/NEWS.d/next/Library/2019-02-25-23-04-00.bpo-35178.NA_rXa.rst b/Misc/NEWS.d/next/Library/2019-02-25-23-04-00.bpo-35178.NA_rXa.rst deleted file mode 100644 index 2593199cfe9c..000000000000 --- a/Misc/NEWS.d/next/Library/2019-02-25-23-04-00.bpo-35178.NA_rXa.rst +++ /dev/null @@ -1,2 +0,0 @@ -Ensure custom :func:`warnings.formatwarning` function can receive `line` as -positional argument. Based on patch by Tashrif Billah. diff --git a/Misc/NEWS.d/next/Library/2019-02-26-11-34-44.bpo-35652.6KRJu_.rst b/Misc/NEWS.d/next/Library/2019-02-26-11-34-44.bpo-35652.6KRJu_.rst deleted file mode 100644 index c247e1706a33..000000000000 --- a/Misc/NEWS.d/next/Library/2019-02-26-11-34-44.bpo-35652.6KRJu_.rst +++ /dev/null @@ -1,2 +0,0 @@ -shutil.copytree(copy_function=...) erroneously pass DirEntry instead of a -path string. diff --git a/Misc/NEWS.d/next/Library/2019-02-26-22-41-38.bpo-36130._BnZOo.rst b/Misc/NEWS.d/next/Library/2019-02-26-22-41-38.bpo-36130._BnZOo.rst deleted file mode 100644 index 3bab152871f3..000000000000 --- a/Misc/NEWS.d/next/Library/2019-02-26-22-41-38.bpo-36130._BnZOo.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix ``pdb`` with ``skip=...`` when stepping into a frame without a -``__name__`` global. Patch by Anthony Sottile. diff --git a/Misc/NEWS.d/next/Library/2019-03-01-16-10-01.bpo-36103.n6VgXL.rst b/Misc/NEWS.d/next/Library/2019-03-01-16-10-01.bpo-36103.n6VgXL.rst deleted file mode 100644 index 9f7330597e7a..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-01-16-10-01.bpo-36103.n6VgXL.rst +++ /dev/null @@ -1,3 +0,0 @@ -Default buffer size used by ``shutil.copyfileobj()`` is changed from 16 KiB -to 64 KiB on non-Windows platform to reduce system call overhead. Contributed -by Inada Naoki. diff --git a/Misc/NEWS.d/next/Library/2019-03-03-11-37-09.bpo-36169.8nWJy7.rst b/Misc/NEWS.d/next/Library/2019-03-03-11-37-09.bpo-36169.8nWJy7.rst deleted file mode 100644 index 49afa2eed294..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-03-11-37-09.bpo-36169.8nWJy7.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add overlap() method to statistics.NormalDist. Computes the overlapping -coefficient for two normal distributions. diff --git a/Misc/NEWS.d/next/Library/2019-03-04-10-42-46.bpo-36179.jEyuI-.rst b/Misc/NEWS.d/next/Library/2019-03-04-10-42-46.bpo-36179.jEyuI-.rst deleted file mode 100644 index 61a98778b78e..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-04-10-42-46.bpo-36179.jEyuI-.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix two unlikely reference leaks in _hashopenssl. The leaks only occur in -out-of-memory cases. diff --git a/Misc/NEWS.d/next/Library/2019-03-06-13-07-29.bpo-36139.6kedum.rst b/Misc/NEWS.d/next/Library/2019-03-06-13-07-29.bpo-36139.6kedum.rst deleted file mode 100644 index 9dcd857cd256..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-06-13-07-29.bpo-36139.6kedum.rst +++ /dev/null @@ -1 +0,0 @@ -Release GIL when closing :class:`~mmap.mmap` objects. diff --git a/Misc/NEWS.d/next/Library/2019-03-06-13-21-33.bpo-35807.W7mmu3.rst b/Misc/NEWS.d/next/Library/2019-03-06-13-21-33.bpo-35807.W7mmu3.rst deleted file mode 100644 index 1109fbed3f9c..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-06-13-21-33.bpo-35807.W7mmu3.rst +++ /dev/null @@ -1 +0,0 @@ -Update ensurepip to install pip 19.0.3 and setuptools 40.8.0. diff --git a/Misc/NEWS.d/next/Library/2019-03-08-13-32-21.bpo-36235._M72wU.rst b/Misc/NEWS.d/next/Library/2019-03-08-13-32-21.bpo-36235._M72wU.rst deleted file mode 100644 index 59df98c101af..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-08-13-32-21.bpo-36235._M72wU.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fix ``CFLAGS`` in ``customize_compiler()`` of ``distutils.sysconfig``: when -the ``CFLAGS`` environment variable is defined, don't override ``CFLAGS`` -variable with the ``OPT`` variable anymore. Initial patch written by David -Malcolm. diff --git a/Misc/NEWS.d/next/Library/2019-03-09-18-01-24.bpo-36251.zOp9l0.rst b/Misc/NEWS.d/next/Library/2019-03-09-18-01-24.bpo-36251.zOp9l0.rst deleted file mode 100644 index 5138b0a0cb8b..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-09-18-01-24.bpo-36251.zOp9l0.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix format strings used for stderrprinter and re.Match reprs. Patch by -Stephan Hohe. diff --git a/Misc/NEWS.d/next/Library/2019-03-11-22-06-36.bpo-35931.Qp_Tbe.rst b/Misc/NEWS.d/next/Library/2019-03-11-22-06-36.bpo-35931.Qp_Tbe.rst deleted file mode 100644 index 68c57e2e69df..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-11-22-06-36.bpo-35931.Qp_Tbe.rst +++ /dev/null @@ -1 +0,0 @@ -The :mod:`pdb` ``debug`` command now gracefully handles all exceptions. diff --git a/Misc/NEWS.d/next/Library/2019-03-12-21-02-55.bpo-36280.mOd3iH.rst b/Misc/NEWS.d/next/Library/2019-03-12-21-02-55.bpo-36280.mOd3iH.rst deleted file mode 100644 index e97285431e53..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-12-21-02-55.bpo-36280.mOd3iH.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add a kind field to ast.Constant. It is 'u' if the literal has a 'u' prefix -(i.e. a Python 2 style unicode literal), else None. diff --git a/Misc/NEWS.d/next/Library/2019-03-13-14-14-36.bpo-36272.f3l2IG.rst b/Misc/NEWS.d/next/Library/2019-03-13-14-14-36.bpo-36272.f3l2IG.rst deleted file mode 100644 index 2f2f7905c015..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-13-14-14-36.bpo-36272.f3l2IG.rst +++ /dev/null @@ -1,2 +0,0 @@ -:mod:`logging` does not silently ignore RecursionError anymore. Patch -contributed by R?mi Lapeyre. diff --git a/Misc/NEWS.d/next/Library/2019-03-13-14-55-02.bpo-31904.834kfY.rst b/Misc/NEWS.d/next/Library/2019-03-13-14-55-02.bpo-31904.834kfY.rst deleted file mode 100644 index d859446b90a3..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-13-14-55-02.bpo-31904.834kfY.rst +++ /dev/null @@ -1 +0,0 @@ -Add _signal module support for VxWorks. diff --git a/Misc/NEWS.d/next/Library/2019-03-14-01-09-59.bpo-36285.G-usj8.rst b/Misc/NEWS.d/next/Library/2019-03-14-01-09-59.bpo-36285.G-usj8.rst deleted file mode 100644 index bf16170c5f6f..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-14-01-09-59.bpo-36285.G-usj8.rst +++ /dev/null @@ -1 +0,0 @@ -Fix integer overflows in the array module. Patch by Stephan Hohe. diff --git a/Misc/NEWS.d/next/Library/2019-03-14-16-25-17.bpo-36268.MDXLw6.rst b/Misc/NEWS.d/next/Library/2019-03-14-16-25-17.bpo-36268.MDXLw6.rst deleted file mode 100644 index 55f4e0f0d051..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-14-16-25-17.bpo-36268.MDXLw6.rst +++ /dev/null @@ -1,3 +0,0 @@ -Switch the default format used for writing tars with mod:`tarfile` to -the modern POSIX.1-2001 pax standard, from the vendor-specific GNU. -Contributed by C.A.M. Gerlach. diff --git a/Misc/NEWS.d/next/Library/2019-03-15-13-54-07.bpo-36298.amEVK2.rst b/Misc/NEWS.d/next/Library/2019-03-15-13-54-07.bpo-36298.amEVK2.rst deleted file mode 100644 index 14be079ddb92..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-15-13-54-07.bpo-36298.amEVK2.rst +++ /dev/null @@ -1,2 +0,0 @@ -Raise ModuleNotFoundError in pyclbr when a module can't be found. -Thanks to 'mental' for the bug report. diff --git a/Misc/NEWS.d/next/Library/2019-03-15-21-41-22.bpo-36297.Gz9ZfU.rst b/Misc/NEWS.d/next/Library/2019-03-15-21-41-22.bpo-36297.Gz9ZfU.rst deleted file mode 100644 index f633feea5cac..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-15-21-41-22.bpo-36297.Gz9ZfU.rst +++ /dev/null @@ -1,2 +0,0 @@ -"unicode_internal" codec is removed. It was deprecated since Python 3.3. -Patch by Inada Naoki. diff --git a/Misc/NEWS.d/next/Library/2019-03-16-13-40-59.bpo-36321.s6crQx.rst b/Misc/NEWS.d/next/Library/2019-03-16-13-40-59.bpo-36321.s6crQx.rst deleted file mode 100644 index eea6f5418484..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-16-13-40-59.bpo-36321.s6crQx.rst +++ /dev/null @@ -1,5 +0,0 @@ -collections.namedtuple() misspelled the name of an attribute. To be -consistent with typing.NamedTuple, the attribute name should have been -"_field_defaults" instead of "_fields_defaults". For backwards -compatibility, both spellings are now created. The misspelled version may -be removed in the future. diff --git a/Misc/NEWS.d/next/Library/2019-03-17-01-17-45.bpo-36324.dvNrRe.rst b/Misc/NEWS.d/next/Library/2019-03-17-01-17-45.bpo-36324.dvNrRe.rst deleted file mode 100644 index 536b2b8739df..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-17-01-17-45.bpo-36324.dvNrRe.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add method to statistics.NormalDist for computing the inverse cumulative -normal distribution. diff --git a/Misc/NEWS.d/next/Library/2019-03-17-16-43-29.bpo-34745.nOfm7_.rst b/Misc/NEWS.d/next/Library/2019-03-17-16-43-29.bpo-34745.nOfm7_.rst deleted file mode 100644 index d88f36a6d217..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-17-16-43-29.bpo-34745.nOfm7_.rst +++ /dev/null @@ -1 +0,0 @@ -Fix :mod:`asyncio` ssl memory issues caused by circular references diff --git a/Misc/NEWS.d/next/Library/2019-03-18-01-08-14.bpo-36320.-06b9_.rst b/Misc/NEWS.d/next/Library/2019-03-18-01-08-14.bpo-36320.-06b9_.rst deleted file mode 100644 index 9e9495f46b7e..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-18-01-08-14.bpo-36320.-06b9_.rst +++ /dev/null @@ -1,3 +0,0 @@ -The typing.NamedTuple() class has deprecated the _field_types attribute in -favor of the __annotations__ attribute which carried the same information. -Also, both attributes were converted from OrderedDict to a regular dict. diff --git a/Misc/NEWS.d/next/Library/2019-03-23-10-25-07.bpo-36401.hYpVBS.rst b/Misc/NEWS.d/next/Library/2019-03-23-10-25-07.bpo-36401.hYpVBS.rst deleted file mode 100644 index cf097d7ed4ad..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-23-10-25-07.bpo-36401.hYpVBS.rst +++ /dev/null @@ -1,2 +0,0 @@ -The class documentation created by pydoc now has a separate section for -readonly properties. diff --git a/Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst b/Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst deleted file mode 100644 index d2eb8f1f352c..000000000000 --- a/Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst +++ /dev/null @@ -1,4 +0,0 @@ -Don't send cookies of domain A without Domain attribute to domain B -when domain A is a suffix match of domain B while using a cookiejar -with :class:`http.cookiejar.DefaultCookiePolicy` policy. Patch by -Karthikeyan Singaravelan. diff --git a/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst b/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst deleted file mode 100644 index 5546394157f9..000000000000 --- a/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst +++ /dev/null @@ -1,3 +0,0 @@ -Changes urlsplit() to raise ValueError when the URL contains characters that -decompose under IDNA encoding (NFKC-normalization) into characters that -affect how the URL is parsed. diff --git a/Misc/NEWS.d/next/Tests/2019-02-26-12-51-35.bpo-36123.QRhhRS.rst b/Misc/NEWS.d/next/Tests/2019-02-26-12-51-35.bpo-36123.QRhhRS.rst deleted file mode 100644 index 5a7e5bb8f43c..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-02-26-12-51-35.bpo-36123.QRhhRS.rst +++ /dev/null @@ -1 +0,0 @@ -Fix race condition in test_socket. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Tests/2019-02-28-18-33-29.bpo-29571.r6b9fr.rst b/Misc/NEWS.d/next/Tests/2019-02-28-18-33-29.bpo-29571.r6b9fr.rst deleted file mode 100644 index 0f40c98514ce..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-02-28-18-33-29.bpo-29571.r6b9fr.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix ``test_re.test_locale_flag()``: use ``locale.getpreferredencoding()`` -rather than ``locale.getlocale()`` to get the locale encoding. With some -locales, ``locale.getlocale()`` returns the wrong encoding. diff --git a/Misc/NEWS.d/next/Tests/2019-03-08-12-53-37.bpo-36234.NRVK6W.rst b/Misc/NEWS.d/next/Tests/2019-03-08-12-53-37.bpo-36234.NRVK6W.rst deleted file mode 100644 index 33178b6c3892..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-03-08-12-53-37.bpo-36234.NRVK6W.rst +++ /dev/null @@ -1,2 +0,0 @@ -test_posix.PosixUidGidTests: add tests for invalid uid/gid type (str). -Initial patch written by David Malcolm. diff --git a/Misc/NEWS.d/next/Tools-Demos/2017-12-19-20-42-36.bpo-32217.axXcjA.rst b/Misc/NEWS.d/next/Tools-Demos/2017-12-19-20-42-36.bpo-32217.axXcjA.rst deleted file mode 100644 index 67feb9e9c3c5..000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2017-12-19-20-42-36.bpo-32217.axXcjA.rst +++ /dev/null @@ -1 +0,0 @@ -Fix freeze script on Windows. diff --git a/Misc/NEWS.d/next/Tools-Demos/2019-03-04-02-09-09.bpo-35132.1R_pnL.rst b/Misc/NEWS.d/next/Tools-Demos/2019-03-04-02-09-09.bpo-35132.1R_pnL.rst deleted file mode 100644 index d73452df429b..000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2019-03-04-02-09-09.bpo-35132.1R_pnL.rst +++ /dev/null @@ -1 +0,0 @@ -Fix py-list and py-bt commands of python-gdb.py on gdb7. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Windows/2019-02-24-07-52-39.bpo-24643.PofyiS.rst b/Misc/NEWS.d/next/Windows/2019-02-24-07-52-39.bpo-24643.PofyiS.rst deleted file mode 100644 index 7bc62d8b8fe1..000000000000 --- a/Misc/NEWS.d/next/Windows/2019-02-24-07-52-39.bpo-24643.PofyiS.rst +++ /dev/null @@ -1 +0,0 @@ -Fix name collisions due to ``#define timezone _timezone`` in PC/pyconfig.h. diff --git a/Misc/NEWS.d/next/Windows/2019-03-11-09-33-47.bpo-36264.rTzWce.rst b/Misc/NEWS.d/next/Windows/2019-03-11-09-33-47.bpo-36264.rTzWce.rst deleted file mode 100644 index aae598658116..000000000000 --- a/Misc/NEWS.d/next/Windows/2019-03-11-09-33-47.bpo-36264.rTzWce.rst +++ /dev/null @@ -1,2 +0,0 @@ -Don't honor POSIX ``HOME`` in ``os.path.expanduser`` on windows. Patch by -Anthony Sottile. diff --git a/Misc/NEWS.d/next/Windows/2019-03-16-16-51-17.bpo-36312.Niwm-T.rst b/Misc/NEWS.d/next/Windows/2019-03-16-16-51-17.bpo-36312.Niwm-T.rst deleted file mode 100644 index 8b325db3a989..000000000000 --- a/Misc/NEWS.d/next/Windows/2019-03-16-16-51-17.bpo-36312.Niwm-T.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed decoders for the following code pages: 50220, 50221, 50222, 50225, -50227, 50229, 57002 through 57011, 65000 and 42. diff --git a/README.rst b/README.rst index 11f5d0b5d3ca..65cca826dd2d 100644 --- a/README.rst +++ b/README.rst @@ -1,4 +1,4 @@ -This is Python version 3.8.0 alpha 2 +This is Python version 3.8.0 alpha 3 ==================================== .. image:: https://travis-ci.org/python/cpython.svg?branch=master From webhook-mailer at python.org Tue Mar 26 05:11:22 2019 From: webhook-mailer at python.org (=?utf-8?q?=C5=81ukasz?= Langa) Date: Tue, 26 Mar 2019 09:11:22 -0000 Subject: [Python-checkins] Post v3.8.0a3 Message-ID: https://github.com/python/cpython/commit/b4d8f28a8af4f35c951c13a5c29630d1fb401105 commit: b4d8f28a8af4f35c951c13a5c29630d1fb401105 branch: master author: ?ukasz Langa committer: ?ukasz Langa date: 2019-03-26T10:11:11+01:00 summary: Post v3.8.0a3 files: M Include/patchlevel.h diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 610c8a98edd4..497dda046ae9 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -23,7 +23,7 @@ #define PY_RELEASE_SERIAL 3 /* Version as a string */ -#define PY_VERSION "3.8.0a3" +#define PY_VERSION "3.8.0a3+" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. From webhook-mailer at python.org Tue Mar 26 05:26:36 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 26 Mar 2019 09:26:36 -0000 Subject: [Python-checkins] bpo-36433: fix confusing error messages in classmethoddescr_call (GH-12556) Message-ID: https://github.com/python/cpython/commit/871309c775fd4d72048bfaa31affd54f9934f7dd commit: 871309c775fd4d72048bfaa31affd54f9934f7dd branch: master author: Inada Naoki committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-26T02:26:33-07:00 summary: bpo-36433: fix confusing error messages in classmethoddescr_call (GH-12556) https://bugs.python.org/issue36433 files: A Misc/NEWS.d/next/Core and Builtins/2019-03-26-17-23-02.bpo-36433.-8XzZf.rst M Lib/test/test_descr.py M Objects/descrobject.c diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index e39fea615db3..09eef8c56f30 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -1597,12 +1597,27 @@ class SubSpam(spam.spamlist): pass self.assertEqual(x2, SubSpam) self.assertEqual(a2, a1) self.assertEqual(d2, d1) - with self.assertRaises(TypeError): + + with self.assertRaises(TypeError) as cm: spam_cm() - with self.assertRaises(TypeError): + self.assertEqual( + str(cm.exception), + "descriptor 'classmeth' of 'xxsubtype.spamlist' " + "object needs an argument") + + with self.assertRaises(TypeError) as cm: spam_cm(spam.spamlist()) - with self.assertRaises(TypeError): + self.assertEqual( + str(cm.exception), + "descriptor 'classmeth' requires a type " + "but received a 'xxsubtype.spamlist' instance") + + with self.assertRaises(TypeError) as cm: spam_cm(list) + self.assertEqual( + str(cm.exception), + "descriptor 'classmeth' requires a subtype of 'xxsubtype.spamlist' " + "but received 'list'") def test_staticmethods(self): # Testing static methods... diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-26-17-23-02.bpo-36433.-8XzZf.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-26-17-23-02.bpo-36433.-8XzZf.rst new file mode 100644 index 000000000000..6d1bd288bda1 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-26-17-23-02.bpo-36433.-8XzZf.rst @@ -0,0 +1 @@ +Fixed TypeError message in classmethoddescr_call. diff --git a/Objects/descrobject.c b/Objects/descrobject.c index 22546a563a51..ab4151ec93e0 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -315,20 +315,18 @@ classmethoddescr_call(PyMethodDescrObject *descr, PyObject *args, if (!PyType_Check(self)) { PyErr_Format(PyExc_TypeError, "descriptor '%V' requires a type " - "but received a '%.100s'", + "but received a '%.100s' instance", descr_name((PyDescrObject *)descr), "?", - PyDescr_TYPE(descr)->tp_name, self->ob_type->tp_name); return NULL; } if (!PyType_IsSubtype((PyTypeObject *)self, PyDescr_TYPE(descr))) { PyErr_Format(PyExc_TypeError, - "descriptor '%V' " - "requires a subtype of '%.100s' " - "but received '%.100s", + "descriptor '%V' requires a subtype of '%.100s' " + "but received '%.100s'", descr_name((PyDescrObject *)descr), "?", PyDescr_TYPE(descr)->tp_name, - self->ob_type->tp_name); + ((PyTypeObject*)self)->tp_name); return NULL; } From webhook-mailer at python.org Tue Mar 26 05:47:11 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 26 Mar 2019 09:47:11 -0000 Subject: [Python-checkins] bpo-36433: fix confusing error messages in classmethoddescr_call (GH-12556) Message-ID: https://github.com/python/cpython/commit/03440850e7266aa7fd531c7f281a3fdcf17f90a4 commit: 03440850e7266aa7fd531c7f281a3fdcf17f90a4 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-26T02:47:08-07:00 summary: bpo-36433: fix confusing error messages in classmethoddescr_call (GH-12556) https://bugs.python.org/issue36433 (cherry picked from commit 871309c775fd4d72048bfaa31affd54f9934f7dd) Co-authored-by: Inada Naoki files: A Misc/NEWS.d/next/Core and Builtins/2019-03-26-17-23-02.bpo-36433.-8XzZf.rst M Lib/test/test_descr.py M Objects/descrobject.c diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 0e7728ebf2d7..d9541b9133f1 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -1592,12 +1592,27 @@ class SubSpam(spam.spamlist): pass self.assertEqual(x2, SubSpam) self.assertEqual(a2, a1) self.assertEqual(d2, d1) - with self.assertRaises(TypeError): + + with self.assertRaises(TypeError) as cm: spam_cm() - with self.assertRaises(TypeError): + self.assertEqual( + str(cm.exception), + "descriptor 'classmeth' of 'xxsubtype.spamlist' " + "object needs an argument") + + with self.assertRaises(TypeError) as cm: spam_cm(spam.spamlist()) - with self.assertRaises(TypeError): + self.assertEqual( + str(cm.exception), + "descriptor 'classmeth' requires a type " + "but received a 'xxsubtype.spamlist' instance") + + with self.assertRaises(TypeError) as cm: spam_cm(list) + self.assertEqual( + str(cm.exception), + "descriptor 'classmeth' requires a subtype of 'xxsubtype.spamlist' " + "but received 'list'") def test_staticmethods(self): # Testing static methods... diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-26-17-23-02.bpo-36433.-8XzZf.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-26-17-23-02.bpo-36433.-8XzZf.rst new file mode 100644 index 000000000000..6d1bd288bda1 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-26-17-23-02.bpo-36433.-8XzZf.rst @@ -0,0 +1 @@ +Fixed TypeError message in classmethoddescr_call. diff --git a/Objects/descrobject.c b/Objects/descrobject.c index 277fed995615..370b7a75e8b4 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -313,20 +313,18 @@ classmethoddescr_call(PyMethodDescrObject *descr, PyObject *args, if (!PyType_Check(self)) { PyErr_Format(PyExc_TypeError, "descriptor '%V' requires a type " - "but received a '%.100s'", + "but received a '%.100s' instance", descr_name((PyDescrObject *)descr), "?", - PyDescr_TYPE(descr)->tp_name, self->ob_type->tp_name); return NULL; } if (!PyType_IsSubtype((PyTypeObject *)self, PyDescr_TYPE(descr))) { PyErr_Format(PyExc_TypeError, - "descriptor '%V' " - "requires a subtype of '%.100s' " - "but received '%.100s", + "descriptor '%V' requires a subtype of '%.100s' " + "but received '%.100s'", descr_name((PyDescrObject *)descr), "?", PyDescr_TYPE(descr)->tp_name, - self->ob_type->tp_name); + ((PyTypeObject*)self)->tp_name); return NULL; } From webhook-mailer at python.org Tue Mar 26 09:35:46 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 26 Mar 2019 13:35:46 -0000 Subject: [Python-checkins] bpo-36436: Fix _testcapi.pymem_buffer_overflow() (GH-12560) Message-ID: https://github.com/python/cpython/commit/414b1cde93764cdabb0798b02af4dd7df954424d commit: 414b1cde93764cdabb0798b02af4dd7df954424d branch: master author: Victor Stinner committer: GitHub date: 2019-03-26T14:35:30+01:00 summary: bpo-36436: Fix _testcapi.pymem_buffer_overflow() (GH-12560) Handle memory allocation failure. files: A Misc/NEWS.d/next/Tests/2019-03-26-13-49-21.bpo-36436.yAtN0V.rst M Modules/_testcapimodule.c diff --git a/Misc/NEWS.d/next/Tests/2019-03-26-13-49-21.bpo-36436.yAtN0V.rst b/Misc/NEWS.d/next/Tests/2019-03-26-13-49-21.bpo-36436.yAtN0V.rst new file mode 100644 index 000000000000..efc9296ad622 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-03-26-13-49-21.bpo-36436.yAtN0V.rst @@ -0,0 +1 @@ +Fix ``_testcapi.pymem_buffer_overflow()``: handle memory allocation failure. diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index c82ba0cfd0d6..c515efe660b5 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -4184,6 +4184,10 @@ pymem_buffer_overflow(PyObject *self, PyObject *args) /* Deliberate buffer overflow to check that PyMem_Free() detects the overflow when debug hooks are installed. */ buffer = PyMem_Malloc(16); + if (buffer == NULL) { + PyErr_NoMemory(); + return NULL; + } buffer[16] = 'x'; PyMem_Free(buffer); From webhook-mailer at python.org Tue Mar 26 11:39:10 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 26 Mar 2019 15:39:10 -0000 Subject: [Python-checkins] bpo-36436: Fix _testcapi.pymem_buffer_overflow() (GH-12560) Message-ID: https://github.com/python/cpython/commit/20fde53a25aefd076d8478f67d6db3908459c6f3 commit: 20fde53a25aefd076d8478f67d6db3908459c6f3 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-26T08:39:03-07:00 summary: bpo-36436: Fix _testcapi.pymem_buffer_overflow() (GH-12560) Handle memory allocation failure. (cherry picked from commit 414b1cde93764cdabb0798b02af4dd7df954424d) Co-authored-by: Victor Stinner files: A Misc/NEWS.d/next/Tests/2019-03-26-13-49-21.bpo-36436.yAtN0V.rst M Modules/_testcapimodule.c diff --git a/Misc/NEWS.d/next/Tests/2019-03-26-13-49-21.bpo-36436.yAtN0V.rst b/Misc/NEWS.d/next/Tests/2019-03-26-13-49-21.bpo-36436.yAtN0V.rst new file mode 100644 index 000000000000..efc9296ad622 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-03-26-13-49-21.bpo-36436.yAtN0V.rst @@ -0,0 +1 @@ +Fix ``_testcapi.pymem_buffer_overflow()``: handle memory allocation failure. diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index eb050ff112e8..1e33ca872d45 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -4175,6 +4175,10 @@ pymem_buffer_overflow(PyObject *self, PyObject *args) /* Deliberate buffer overflow to check that PyMem_Free() detects the overflow when debug hooks are installed. */ buffer = PyMem_Malloc(16); + if (buffer == NULL) { + PyErr_NoMemory(); + return NULL; + } buffer[16] = 'x'; PyMem_Free(buffer); From webhook-mailer at python.org Tue Mar 26 11:59:05 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 26 Mar 2019 15:59:05 -0000 Subject: [Python-checkins] bpo-36301: Cleanup preconfig.c and coreconfig.c (GH-12563) Message-ID: https://github.com/python/cpython/commit/f8ba6f5afc317d1be3025db1be410ac66a7e5a27 commit: f8ba6f5afc317d1be3025db1be410ac66a7e5a27 branch: master author: Victor Stinner committer: GitHub date: 2019-03-26T16:58:50+01:00 summary: bpo-36301: Cleanup preconfig.c and coreconfig.c (GH-12563) * _PyCoreConfig_Write() now updates _PyRuntime.preconfig * Remove _PyPreCmdline_Copy() * _PyPreCmdline_Read() now accepts _PyPreConfig and _PyCoreConfig optional configurations. * Rename _PyPreConfig_ReadFromArgv() to _PyPreConfig_Read(). Simplify the code. * Calling _PyCoreConfig_Read() no longer adds the warning options twice: don't add a warning option if it's already in the list. * Rename _PyCoreConfig_ReadFromArgv() to _PyCoreConfig_Read(). * Rename config_from_cmdline() to _PyCoreConfig_ReadFromArgv(). * Add more assertions on _PyCoreConfig in _PyCoreConfig_Read(). * Move some functions. * Make some config functions private. files: M Include/cpython/pylifecycle.h M Include/internal/pycore_coreconfig.h M Lib/test/test_embed.py M Modules/main.c M Programs/_testembed.c M Python/coreconfig.c M Python/pathconfig.c M Python/preconfig.c M Python/pylifecycle.c diff --git a/Include/cpython/pylifecycle.h b/Include/cpython/pylifecycle.h index e32e54cba07f..0c5f74e4f2b2 100644 --- a/Include/cpython/pylifecycle.h +++ b/Include/cpython/pylifecycle.h @@ -21,8 +21,8 @@ PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromConfig( const _PyCoreConfig *coreconfig); PyAPI_FUNC(_PyInitError) _Py_InitializeCore( - PyInterpreterState **interp, - const _PyCoreConfig *); + const _PyCoreConfig *config, + PyInterpreterState **interp); PyAPI_FUNC(int) _Py_IsCoreInitialized(void); diff --git a/Include/internal/pycore_coreconfig.h b/Include/internal/pycore_coreconfig.h index d79f590d68d2..dad5d3f3ec8d 100644 --- a/Include/internal/pycore_coreconfig.h +++ b/Include/internal/pycore_coreconfig.h @@ -14,8 +14,8 @@ extern "C" { typedef struct { _PyWstrList argv; _PyWstrList xoptions; /* "-X value" option */ - int use_environment; /* -E option */ int isolated; /* -I option */ + int use_environment; /* -E option */ int dev_mode; /* -X dev and PYTHONDEVMODE */ } _PyPreCmdline; @@ -27,23 +27,14 @@ typedef struct { /* Note: _PyPreCmdline_INIT sets other fields to 0/NULL */ PyAPI_FUNC(void) _PyPreCmdline_Clear(_PyPreCmdline *cmdline); -PyAPI_FUNC(int) _PyPreCmdline_Copy(_PyPreCmdline *cmdline, - const _PyPreCmdline *cmdline2); PyAPI_FUNC(_PyInitError) _PyPreCmdline_SetArgv(_PyPreCmdline *cmdline, const _PyArgv *args); -PyAPI_FUNC(void) _PyPreCmdline_GetPreConfig( - _PyPreCmdline *cmdline, - const _PyPreConfig *config); -PyAPI_FUNC(void) _PyPreCmdline_SetPreConfig( - const _PyPreCmdline *cmdline, - _PyPreConfig *config); -PyAPI_FUNC(void) _PyPreCmdline_GetCoreConfig( - _PyPreCmdline *cmdline, - const _PyCoreConfig *config); -PyAPI_FUNC(void) _PyPreCmdline_SetCoreConfig( +PyAPI_FUNC(int) _PyPreCmdline_SetCoreConfig( const _PyPreCmdline *cmdline, _PyCoreConfig *config); -PyAPI_FUNC(_PyInitError) _PyPreCmdline_Read(_PyPreCmdline *cmdline); +PyAPI_FUNC(_PyInitError) _PyPreCmdline_Read(_PyPreCmdline *cmdline, + const _PyPreConfig *preconfig, + const _PyCoreConfig *coreconfig); /* --- _PyWstrList ------------------------------------------------ */ @@ -57,6 +48,8 @@ PyAPI_FUNC(int) _PyWstrList_Copy(_PyWstrList *list, PyAPI_FUNC(int) _PyWstrList_Append(_PyWstrList *list, const wchar_t *item); PyAPI_FUNC(PyObject*) _PyWstrList_AsList(const _PyWstrList *list); +PyAPI_FUNC(int) _PyWstrList_Extend(_PyWstrList *list, + const _PyWstrList *list2); /* --- _PyArgv ---------------------------------------------------- */ @@ -70,7 +63,7 @@ PyAPI_FUNC(_PyInitError) _PyArgv_AsWstrList(const _PyArgv *args, PyAPI_FUNC(void) _Py_ClearArgcArgv(void); -/* --- _PyPreConfig ----------------------------------------------- */ +/* --- Helper functions ------------------------------------------- */ PyAPI_FUNC(int) _Py_str_to_int( const char *str, @@ -81,22 +74,20 @@ PyAPI_FUNC(const wchar_t*) _Py_get_xoption( PyAPI_FUNC(const char*) _Py_GetEnv( int use_environment, const char *name); - -PyAPI_FUNC(void) _PyPreConfig_Clear(_PyPreConfig *config); -PyAPI_FUNC(int) _PyPreConfig_Copy(_PyPreConfig *config, - const _PyPreConfig *config2); -PyAPI_FUNC(void) _PyPreConfig_GetGlobalConfig(_PyPreConfig *config); -PyAPI_FUNC(void) _PyPreConfig_SetGlobalConfig(const _PyPreConfig *config); PyAPI_FUNC(void) _Py_get_env_flag( int use_environment, int *flag, const char *name); + +/* --- _PyPreConfig ----------------------------------------------- */ + +PyAPI_FUNC(void) _PyPreConfig_Clear(_PyPreConfig *config); +PyAPI_FUNC(int) _PyPreConfig_Copy(_PyPreConfig *config, + const _PyPreConfig *config2); +PyAPI_FUNC(PyObject*) _PyPreConfig_AsDict(const _PyPreConfig *config); PyAPI_FUNC(_PyInitError) _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args, const _PyCoreConfig *coreconfig); -PyAPI_FUNC(PyObject*) _PyPreConfig_AsDict(const _PyPreConfig *config); -PyAPI_FUNC(_PyInitError) _PyPreConfig_ReadFromArgv(_PyPreConfig *config, - const _PyArgv *args); PyAPI_FUNC(_PyInitError) _PyPreConfig_Write(_PyPreConfig *config); @@ -109,10 +100,7 @@ PyAPI_FUNC(int) _PyCoreConfig_Copy( PyAPI_FUNC(_PyInitError) _PyCoreConfig_InitPathConfig(_PyCoreConfig *config); PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetPathConfig( const _PyCoreConfig *config); -PyAPI_FUNC(void) _PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config); -PyAPI_FUNC(void) _PyCoreConfig_SetGlobalConfig(const _PyCoreConfig *config); -PyAPI_FUNC(_PyInitError) _PyCoreConfig_Read(_PyCoreConfig *config); -PyAPI_FUNC(_PyInitError) _PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, +PyAPI_FUNC(_PyInitError) _PyCoreConfig_Read(_PyCoreConfig *config, const _PyArgv *args); PyAPI_FUNC(void) _PyCoreConfig_Write(const _PyCoreConfig *config); diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index ff3cfb1ea49d..7efd5be23e03 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -302,7 +302,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'pycache_prefix': None, 'program_name': './_testembed', 'argv': [""], - 'program': None, + 'program': '', 'xoptions': [], 'warnoptions': [], @@ -537,6 +537,7 @@ def test_init_global_config(self): 'program_name': './globalvar', 'site_import': 0, 'bytes_warning': 1, + 'warnoptions': ['default::BytesWarning'], 'inspect': 1, 'interactive': 1, 'optimization_level': 2, @@ -579,7 +580,7 @@ def test_init_from_config(self): 'argv': ['-c', 'pass'], 'program': 'conf_program', 'xoptions': ['core_xoption1=3', 'core_xoption2=', 'core_xoption3'], - 'warnoptions': ['default', 'error::ResourceWarning'], + 'warnoptions': ['error::ResourceWarning', 'default::BytesWarning'], 'site_import': 0, 'bytes_warning': 1, @@ -629,14 +630,16 @@ def test_init_env_dev_mode(self): preconfig = dict(self.INIT_ENV_PRECONFIG, allocator='debug') config = dict(self.INIT_ENV_CONFIG, - dev_mode=1) + dev_mode=1, + warnoptions=['default']) self.check_config("init_env_dev_mode", config, preconfig) def test_init_env_dev_mode_alloc(self): preconfig = dict(self.INIT_ENV_PRECONFIG, allocator='malloc') config = dict(self.INIT_ENV_CONFIG, - dev_mode=1) + dev_mode=1, + warnoptions=['default']) self.check_config("init_env_dev_mode_alloc", config, preconfig) def test_init_dev_mode(self): @@ -646,14 +649,12 @@ def test_init_dev_mode(self): config = { 'faulthandler': 1, 'dev_mode': 1, + 'warnoptions': ['default'], } self.check_config("init_dev_mode", config, preconfig) def test_init_isolated(self): - preconfig = { - 'isolated': 0, - 'use_environment': 1, - } + preconfig = {} config = { 'isolated': 1, 'use_environment': 0, diff --git a/Modules/main.c b/Modules/main.c index 9fcc76e58a6a..98a886125ca8 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -289,7 +289,7 @@ pymain_init_preconfig(const _PyArgv *args) _PyPreConfig config = _PyPreConfig_INIT; - err = _PyPreConfig_ReadFromArgv(&config, args); + err = _PyPreConfig_Read(&config, args, NULL); if (_Py_INIT_FAILED(err)) { goto done; } @@ -306,12 +306,12 @@ static _PyInitError pymain_init_coreconfig(_PyCoreConfig *config, const _PyArgv *args, PyInterpreterState **interp_p) { - _PyInitError err = _PyCoreConfig_ReadFromArgv(config, args); + _PyInitError err = _PyCoreConfig_Read(config, args); if (_Py_INIT_FAILED(err)) { return err; } - return _Py_InitializeCore(interp_p, config); + return _Py_InitializeCore(config, interp_p); } @@ -359,22 +359,18 @@ pymain_init(const _PyArgv *args, PyInterpreterState **interp_p) } _PyCoreConfig config = _PyCoreConfig_INIT; - err = pymain_init_coreconfig(&config, args, interp_p); + _PyCoreConfig_Clear(&config); if (_Py_INIT_FAILED(err)) { - goto done; + return err; } err = pymain_init_python_main(*interp_p); if (_Py_INIT_FAILED(err)) { - goto done; + return err; } - err = _Py_INIT_OK(); - -done: - _PyCoreConfig_Clear(&config); - return err; + return _Py_INIT_OK(); } diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 70ef45f9281c..7fb0d695b475 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -466,8 +466,7 @@ static int test_init_from_config(void) config.xoptions.length = Py_ARRAY_LENGTH(xoptions); config.xoptions.items = xoptions; - static wchar_t* warnoptions[2] = { - L"default", + static wchar_t* warnoptions[1] = { L"error::ResourceWarning", }; config.warnoptions.length = Py_ARRAY_LENGTH(warnoptions); diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 2e6eb4029879..2f54e79081fd 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -296,7 +296,7 @@ _PyWstrList_Append(_PyWstrList *list, const wchar_t *item) } -static int +int _PyWstrList_Extend(_PyWstrList *list, const _PyWstrList *list2) { for (Py_ssize_t i = 0; i < list2->length; i++) { @@ -308,6 +308,18 @@ _PyWstrList_Extend(_PyWstrList *list, const _PyWstrList *list2) } +static int +_PyWstrList_Find(_PyWstrList *list, const wchar_t *item) +{ + for (Py_ssize_t i = 0; i < list->length; i++) { + if (wcscmp(list->items[i], item) == 0) { + return 1; + } + } + return 0; +} + + PyObject* _PyWstrList_AsList(const _PyWstrList *list) { @@ -607,6 +619,120 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) } +static PyObject * +_PyCoreConfig_AsDict(const _PyCoreConfig *config) +{ + PyObject *dict; + + dict = PyDict_New(); + if (dict == NULL) { + return NULL; + } + +#define SET_ITEM(KEY, EXPR) \ + do { \ + PyObject *obj = (EXPR); \ + if (obj == NULL) { \ + goto fail; \ + } \ + int res = PyDict_SetItemString(dict, (KEY), obj); \ + Py_DECREF(obj); \ + if (res < 0) { \ + goto fail; \ + } \ + } while (0) +#define FROM_STRING(STR) \ + ((STR != NULL) ? \ + PyUnicode_FromString(STR) \ + : (Py_INCREF(Py_None), Py_None)) +#define SET_ITEM_INT(ATTR) \ + SET_ITEM(#ATTR, PyLong_FromLong(config->ATTR)) +#define SET_ITEM_UINT(ATTR) \ + SET_ITEM(#ATTR, PyLong_FromUnsignedLong(config->ATTR)) +#define SET_ITEM_STR(ATTR) \ + SET_ITEM(#ATTR, FROM_STRING(config->ATTR)) +#define FROM_WSTRING(STR) \ + ((STR != NULL) ? \ + PyUnicode_FromWideChar(STR, -1) \ + : (Py_INCREF(Py_None), Py_None)) +#define SET_ITEM_WSTR(ATTR) \ + SET_ITEM(#ATTR, FROM_WSTRING(config->ATTR)) +#define SET_ITEM_WSTRLIST(LIST) \ + SET_ITEM(#LIST, _PyWstrList_AsList(&config->LIST)) + + SET_ITEM_INT(isolated); + SET_ITEM_INT(use_environment); + SET_ITEM_INT(dev_mode); + SET_ITEM_INT(install_signal_handlers); + SET_ITEM_INT(use_hash_seed); + SET_ITEM_UINT(hash_seed); + SET_ITEM_INT(faulthandler); + SET_ITEM_INT(tracemalloc); + SET_ITEM_INT(import_time); + SET_ITEM_INT(show_ref_count); + SET_ITEM_INT(show_alloc_count); + SET_ITEM_INT(dump_refs); + SET_ITEM_INT(malloc_stats); + SET_ITEM_STR(filesystem_encoding); + SET_ITEM_STR(filesystem_errors); + SET_ITEM_WSTR(pycache_prefix); + SET_ITEM_WSTR(program_name); + SET_ITEM_WSTRLIST(argv); + SET_ITEM_WSTR(program); + SET_ITEM_WSTRLIST(xoptions); + SET_ITEM_WSTRLIST(warnoptions); + SET_ITEM_WSTR(module_search_path_env); + SET_ITEM_WSTR(home); + SET_ITEM_WSTRLIST(module_search_paths); + SET_ITEM_WSTR(executable); + SET_ITEM_WSTR(prefix); + SET_ITEM_WSTR(base_prefix); + SET_ITEM_WSTR(exec_prefix); + SET_ITEM_WSTR(base_exec_prefix); +#ifdef MS_WINDOWS + SET_ITEM_WSTR(dll_path); +#endif + SET_ITEM_INT(site_import); + SET_ITEM_INT(bytes_warning); + SET_ITEM_INT(inspect); + SET_ITEM_INT(interactive); + SET_ITEM_INT(optimization_level); + SET_ITEM_INT(parser_debug); + SET_ITEM_INT(write_bytecode); + SET_ITEM_INT(verbose); + SET_ITEM_INT(quiet); + SET_ITEM_INT(user_site_directory); + SET_ITEM_INT(buffered_stdio); + SET_ITEM_STR(stdio_encoding); + SET_ITEM_STR(stdio_errors); +#ifdef MS_WINDOWS + SET_ITEM_INT(legacy_windows_stdio); +#endif + SET_ITEM_INT(skip_source_first_line); + SET_ITEM_WSTR(run_command); + SET_ITEM_WSTR(run_module); + SET_ITEM_WSTR(run_filename); + SET_ITEM_INT(_install_importlib); + SET_ITEM_STR(_check_hash_pycs_mode); + SET_ITEM_INT(_frozen); + + return dict; + +fail: + Py_DECREF(dict); + return NULL; + +#undef FROM_STRING +#undef FROM_WSTRING +#undef SET_ITEM +#undef SET_ITEM_INT +#undef SET_ITEM_UINT +#undef SET_ITEM_STR +#undef SET_ITEM_WSTR +#undef SET_ITEM_WSTRLIST +} + + static const char* _PyCoreConfig_GetEnv(const _PyCoreConfig *config, const char *name) { @@ -614,6 +740,9 @@ _PyCoreConfig_GetEnv(const _PyCoreConfig *config, const char *name) } +/* Get a copy of the environment variable as wchar_t*. + Return 0 on success, but *dest can be NULL. + Return -1 on memory allocation failure. Return -2 on decoding error. */ static int _PyCoreConfig_GetEnvDup(const _PyCoreConfig *config, wchar_t **dest, @@ -662,7 +791,7 @@ _PyCoreConfig_GetEnvDup(const _PyCoreConfig *config, } -void +static void _PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config) { #define COPY_FLAG(ATTR, VALUE) \ @@ -699,7 +828,7 @@ _PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config) /* Set Py_xxx global configuration variables from 'config' configuration. */ -void +static void _PyCoreConfig_SetGlobalConfig(const _PyCoreConfig *config) { #define COPY_FLAG(ATTR, VAR) \ @@ -848,10 +977,10 @@ config_get_xoption(const _PyCoreConfig *config, wchar_t *name) static _PyInitError config_init_home(_PyCoreConfig *config) { - wchar_t *home; + assert(config->home == NULL); /* If Py_SetPythonHome() was called, use its value */ - home = _Py_path_config.home; + wchar_t *home = _Py_path_config.home; if (home) { config->home = _PyMem_RawWcsdup(home); if (config->home == NULL) { @@ -1098,7 +1227,7 @@ config_read_complex_options(_PyCoreConfig *config) static const char * -get_stdio_errors(const _PyCoreConfig *config) +config_get_stdio_errors(const _PyCoreConfig *config) { #ifndef MS_WINDOWS const char *loc = setlocale(LC_CTYPE, NULL); @@ -1125,7 +1254,7 @@ get_stdio_errors(const _PyCoreConfig *config) static _PyInitError -get_locale_encoding(char **locale_encoding) +config_get_locale_encoding(char **locale_encoding) { #ifdef MS_WINDOWS char encoding[20]; @@ -1236,13 +1365,13 @@ config_init_stdio_encoding(_PyCoreConfig *config, /* Choose the default error handler based on the current locale. */ if (config->stdio_encoding == NULL) { - _PyInitError err = get_locale_encoding(&config->stdio_encoding); + _PyInitError err = config_get_locale_encoding(&config->stdio_encoding); if (_Py_INIT_FAILED(err)) { return err; } } if (config->stdio_errors == NULL) { - const char *errors = get_stdio_errors(config); + const char *errors = config_get_stdio_errors(config); config->stdio_errors = _PyMem_RawStrdup(errors); if (config->stdio_errors == NULL) { return _Py_INIT_NO_MEMORY(); @@ -1306,7 +1435,7 @@ config_init_fs_encoding(_PyCoreConfig *config, const _PyPreConfig *preconfig) #if defined(__APPLE__) || defined(__ANDROID__) config->filesystem_encoding = _PyMem_RawStrdup("utf-8"); #else - _PyInitError err = get_locale_encoding(&config->filesystem_encoding); + _PyInitError err = config_get_locale_encoding(&config->filesystem_encoding); if (_Py_INIT_FAILED(err)) { return err; } @@ -1330,38 +1459,22 @@ config_init_fs_encoding(_PyCoreConfig *config, const _PyPreConfig *preconfig) } -/* Read the configuration into _PyCoreConfig from: - - * Environment variables - * Py_xxx global configuration variables - - See _PyCoreConfig_ReadFromArgv() to parse also command line arguments. */ static _PyInitError -config_read_impl(_PyCoreConfig *config, _PyPreCmdline *cmdline) +config_read(_PyCoreConfig *config, _PyPreCmdline *cmdline) { _PyInitError err; const _PyPreConfig *preconfig = &_PyRuntime.preconfig; - _PyPreCmdline_GetPreConfig(cmdline, preconfig); - _PyPreCmdline_GetCoreConfig(cmdline, config); - - err = _PyPreCmdline_Read(cmdline); + err = _PyPreCmdline_Read(cmdline, preconfig, config); if (_Py_INIT_FAILED(err)) { return err; } - _PyPreCmdline_SetCoreConfig(cmdline, config); - - if (_PyWstrList_Extend(&config->xoptions, &cmdline->xoptions) < 0) { + if (_PyPreCmdline_SetCoreConfig(cmdline, config) < 0) { return _Py_INIT_NO_MEMORY(); } - _PyCoreConfig_GetGlobalConfig(config); - - assert(config->use_environment >= 0); - if (config->isolated > 0) { - config->use_environment = 0; config->user_site_directory = 0; } @@ -1419,16 +1532,16 @@ config_read_impl(_PyCoreConfig *config, _PyPreCmdline *cmdline) config->faulthandler = 1; } } - if (config->use_hash_seed < 0) { - config->use_hash_seed = 0; - config->hash_seed = 0; - } if (config->faulthandler < 0) { config->faulthandler = 0; } if (config->tracemalloc < 0) { config->tracemalloc = 0; } + if (config->use_hash_seed < 0) { + config->use_hash_seed = 0; + config->hash_seed = 0; + } if (config->filesystem_encoding == NULL || config->filesystem_errors == NULL) { err = config_init_fs_encoding(config, preconfig); @@ -1449,53 +1562,10 @@ config_read_impl(_PyCoreConfig *config, _PyPreCmdline *cmdline) } } - assert(config->use_environment >= 0); - assert(config->filesystem_encoding != NULL); - assert(config->filesystem_errors != NULL); - assert(config->stdio_encoding != NULL); - assert(config->stdio_errors != NULL); - assert(config->_check_hash_pycs_mode != NULL); - assert(_PyWstrList_CheckConsistency(&config->argv)); - return _Py_INIT_OK(); } -static _PyInitError -config_read(_PyCoreConfig *config, const _PyPreCmdline *src_cmdline) -{ - _PyInitError err; - - err = _Py_PreInitializeFromConfig(config); - if (_Py_INIT_FAILED(err)) { - return err; - } - - _PyPreCmdline cmdline = _PyPreCmdline_INIT; - - if (src_cmdline) { - if (_PyPreCmdline_Copy(&cmdline, src_cmdline) < 0) { - err = _Py_INIT_NO_MEMORY(); - goto done; - } - } - - err = config_read_impl(config, &cmdline); - -done: - _PyPreCmdline_Clear(&cmdline); - return err; - -} - - -_PyInitError -_PyCoreConfig_Read(_PyCoreConfig *config) -{ - return config_read(config, NULL); -} - - static void config_init_stdio(const _PyCoreConfig *config) { @@ -1542,139 +1612,30 @@ _PyCoreConfig_Write(const _PyCoreConfig *config) { _PyCoreConfig_SetGlobalConfig(config); config_init_stdio(config); -} - - -static PyObject * -_PyCoreConfig_AsDict(const _PyCoreConfig *config) -{ - PyObject *dict; - - dict = PyDict_New(); - if (dict == NULL) { - return NULL; - } -#define SET_ITEM(KEY, EXPR) \ - do { \ - PyObject *obj = (EXPR); \ - if (obj == NULL) { \ - goto fail; \ - } \ - int res = PyDict_SetItemString(dict, (KEY), obj); \ - Py_DECREF(obj); \ - if (res < 0) { \ - goto fail; \ - } \ - } while (0) -#define FROM_STRING(STR) \ - ((STR != NULL) ? \ - PyUnicode_FromString(STR) \ - : (Py_INCREF(Py_None), Py_None)) -#define SET_ITEM_INT(ATTR) \ - SET_ITEM(#ATTR, PyLong_FromLong(config->ATTR)) -#define SET_ITEM_UINT(ATTR) \ - SET_ITEM(#ATTR, PyLong_FromUnsignedLong(config->ATTR)) -#define SET_ITEM_STR(ATTR) \ - SET_ITEM(#ATTR, FROM_STRING(config->ATTR)) -#define FROM_WSTRING(STR) \ - ((STR != NULL) ? \ - PyUnicode_FromWideChar(STR, -1) \ - : (Py_INCREF(Py_None), Py_None)) -#define SET_ITEM_WSTR(ATTR) \ - SET_ITEM(#ATTR, FROM_WSTRING(config->ATTR)) -#define SET_ITEM_WSTRLIST(LIST) \ - SET_ITEM(#LIST, _PyWstrList_AsList(&config->LIST)) - - SET_ITEM_INT(isolated); - SET_ITEM_INT(use_environment); - SET_ITEM_INT(dev_mode); - SET_ITEM_INT(install_signal_handlers); - SET_ITEM_INT(use_hash_seed); - SET_ITEM_UINT(hash_seed); - SET_ITEM_INT(faulthandler); - SET_ITEM_INT(tracemalloc); - SET_ITEM_INT(import_time); - SET_ITEM_INT(show_ref_count); - SET_ITEM_INT(show_alloc_count); - SET_ITEM_INT(dump_refs); - SET_ITEM_INT(malloc_stats); - SET_ITEM_STR(filesystem_encoding); - SET_ITEM_STR(filesystem_errors); - SET_ITEM_WSTR(pycache_prefix); - SET_ITEM_WSTR(program_name); - SET_ITEM_WSTRLIST(argv); - SET_ITEM_WSTR(program); - SET_ITEM_WSTRLIST(xoptions); - SET_ITEM_WSTRLIST(warnoptions); - SET_ITEM_WSTR(module_search_path_env); - SET_ITEM_WSTR(home); - SET_ITEM_WSTRLIST(module_search_paths); - SET_ITEM_WSTR(executable); - SET_ITEM_WSTR(prefix); - SET_ITEM_WSTR(base_prefix); - SET_ITEM_WSTR(exec_prefix); - SET_ITEM_WSTR(base_exec_prefix); -#ifdef MS_WINDOWS - SET_ITEM_WSTR(dll_path); -#endif - SET_ITEM_INT(site_import); - SET_ITEM_INT(bytes_warning); - SET_ITEM_INT(inspect); - SET_ITEM_INT(interactive); - SET_ITEM_INT(optimization_level); - SET_ITEM_INT(parser_debug); - SET_ITEM_INT(write_bytecode); - SET_ITEM_INT(verbose); - SET_ITEM_INT(quiet); - SET_ITEM_INT(user_site_directory); - SET_ITEM_INT(buffered_stdio); - SET_ITEM_STR(stdio_encoding); - SET_ITEM_STR(stdio_errors); -#ifdef MS_WINDOWS - SET_ITEM_INT(legacy_windows_stdio); -#endif - SET_ITEM_INT(skip_source_first_line); - SET_ITEM_WSTR(run_command); - SET_ITEM_WSTR(run_module); - SET_ITEM_WSTR(run_filename); - SET_ITEM_INT(_install_importlib); - SET_ITEM_STR(_check_hash_pycs_mode); - SET_ITEM_INT(_frozen); - - return dict; - -fail: - Py_DECREF(dict); - return NULL; - -#undef FROM_STRING -#undef FROM_WSTRING -#undef SET_ITEM -#undef SET_ITEM_INT -#undef SET_ITEM_UINT -#undef SET_ITEM_STR -#undef SET_ITEM_WSTR -#undef SET_ITEM_WSTRLIST + /* Write the new pre-configuration into _PyRuntime */ + _PyPreConfig *preconfig = &_PyRuntime.preconfig; + preconfig->isolated = config->isolated; + preconfig->use_environment = config->use_environment; + preconfig->dev_mode = config->dev_mode; } /* --- _PyCmdline ------------------------------------------------- */ typedef struct { - _PyPreCmdline precmdline; - _PyWstrList warnoptions; /* Command line -W options */ + _PyWstrList cmdline_warnoptions; /* Command line -W options */ _PyWstrList env_warnoptions; /* PYTHONWARNINGS environment variables */ int print_help; /* -h, -? options */ int print_version; /* -V option */ + int need_usage; } _PyCmdline; static void cmdline_clear(_PyCmdline *cmdline) { - _PyPreCmdline_Clear(&cmdline->precmdline); - _PyWstrList_Clear(&cmdline->warnoptions); + _PyWstrList_Clear(&cmdline->cmdline_warnoptions); _PyWstrList_Clear(&cmdline->env_warnoptions); } @@ -1684,9 +1645,9 @@ cmdline_clear(_PyCmdline *cmdline) /* Parse the command line arguments */ static _PyInitError config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, - int *need_usage) + _PyPreCmdline *precmdline) { - const _PyWstrList *argv = &cmdline->precmdline.argv; + const _PyWstrList *argv = &precmdline->argv; _PyOS_ResetGetOpt(); do { @@ -1740,7 +1701,7 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, } else { fprintf(stderr, "--check-hash-based-pycs must be one of " "'default', 'always', or 'never'\n"); - *need_usage = 1; + cmdline->need_usage = 1; return _Py_INIT_OK(); } break; @@ -1761,7 +1722,7 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, case 'E': case 'I': case 'X': - /* option handled by _PyPreConfig_ReadFromArgv() */ + /* option handled by _PyPreCmdline_Read() */ break; /* case 'J': reserved for Jython */ @@ -1808,7 +1769,7 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, break; case 'W': - if (_PyWstrList_Append(&cmdline->warnoptions, _PyOS_optarg) < 0) { + if (_PyWstrList_Append(&cmdline->cmdline_warnoptions, _PyOS_optarg) < 0) { return _Py_INIT_NO_MEMORY(); } break; @@ -1825,7 +1786,7 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, default: /* unknown argument: parsing failed */ - *need_usage = 1; + cmdline->need_usage = 1; return _Py_INIT_OK(); } } while (1); @@ -1891,9 +1852,9 @@ cmdline_init_env_warnoptions(_PyCmdline *cmdline, const _PyCoreConfig *config) static _PyInitError -config_init_program(_PyCoreConfig *config, const _PyCmdline *cmdline) +config_init_program(_PyCoreConfig *config, const _PyPreCmdline *cmdline) { - const _PyWstrList *argv = &cmdline->precmdline.argv; + const _PyWstrList *argv = &cmdline->argv; wchar_t *program; if (argv->length >= 1) { program = argv->items[0]; @@ -1910,11 +1871,23 @@ config_init_program(_PyCoreConfig *config, const _PyCmdline *cmdline) } +static int +config_add_warnoption(_PyCoreConfig *config, const wchar_t *option) +{ + if (_PyWstrList_Find(&config->warnoptions, option)) { + /* Already present: do nothing */ + return 0; + } + if (_PyWstrList_Append(&config->warnoptions, option)) { + return -1; + } + return 0; +} + + static _PyInitError config_init_warnoptions(_PyCoreConfig *config, const _PyCmdline *cmdline) { - assert(config->warnoptions.length == 0); - /* The priority order for warnings configuration is (highest precedence * first): * @@ -1931,17 +1904,26 @@ config_init_warnoptions(_PyCoreConfig *config, const _PyCmdline *cmdline) */ if (config->dev_mode) { - if (_PyWstrList_Append(&config->warnoptions, L"default")) { + if (config_add_warnoption(config, L"default") < 0) { return _Py_INIT_NO_MEMORY(); } } - if (_PyWstrList_Extend(&config->warnoptions, &cmdline->env_warnoptions) < 0) { - return _Py_INIT_NO_MEMORY(); + Py_ssize_t i; + const _PyWstrList *options; + + options = &cmdline->env_warnoptions; + for (i = 0; i < options->length; i++) { + if (config_add_warnoption(config, options->items[i]) < 0) { + return _Py_INIT_NO_MEMORY(); + } } - if (_PyWstrList_Extend(&config->warnoptions, &cmdline->warnoptions) < 0) { - return _Py_INIT_NO_MEMORY(); + options = &cmdline->cmdline_warnoptions; + for (i = 0; i < options->length; i++) { + if (config_add_warnoption(config, options->items[i]) < 0) { + return _Py_INIT_NO_MEMORY(); + } } /* If the bytes_warning_flag isn't set, bytesobject.c and bytearrayobject.c @@ -1956,7 +1938,7 @@ config_init_warnoptions(_PyCoreConfig *config, const _PyCmdline *cmdline) else { filter = L"default::BytesWarning"; } - if (_PyWstrList_Append(&config->warnoptions, filter)) { + if (config_add_warnoption(config, filter) < 0) { return _Py_INIT_NO_MEMORY(); } } @@ -1965,9 +1947,9 @@ config_init_warnoptions(_PyCoreConfig *config, const _PyCmdline *cmdline) static _PyInitError -config_init_argv(_PyCoreConfig *config, const _PyCmdline *cmdline) +config_init_argv(_PyCoreConfig *config, const _PyPreCmdline *cmdline) { - const _PyWstrList *cmdline_argv = &cmdline->precmdline.argv; + const _PyWstrList *cmdline_argv = &cmdline->argv; _PyWstrList config_argv = _PyWstrList_INIT; /* Copy argv to be able to modify it (to force -c/-m) */ @@ -2032,110 +2014,152 @@ config_usage(int error, const wchar_t* program) } -/* Parse command line options and environment variables. */ -static _PyInitError -config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline) +/* Read the configuration into _PyCoreConfig from: + + * Command line arguments + * Environment variables + * Py_xxx global configuration variables */ +_PyInitError +_PyCoreConfig_Read(_PyCoreConfig *config, const _PyArgv *args) { - int need_usage = 0; _PyInitError err; + err = _Py_PreInitializeFromConfig(config); + if (_Py_INIT_FAILED(err)) { + return err; + } + _PyCoreConfig_GetGlobalConfig(config); + _PyPreCmdline precmdline = _PyPreCmdline_INIT; + if (args) { + err = _PyPreCmdline_SetArgv(&precmdline, args); + if (_Py_INIT_FAILED(err)) { + goto done; + } + } + if (config->program == NULL) { - err = config_init_program(config, cmdline); + err = config_init_program(config, &precmdline); if (_Py_INIT_FAILED(err)) { - return err; + goto done; } } - err = _PyPreCmdline_Read(&cmdline->precmdline); + const _PyPreConfig *preconfig = &_PyRuntime.preconfig; + err = _PyPreCmdline_Read(&precmdline, preconfig, config); if (_Py_INIT_FAILED(err)) { - return err; + goto done; } - _PyPreCmdline_SetPreConfig(&cmdline->precmdline, &_PyRuntime.preconfig); + _PyCmdline cmdline; + memset(&cmdline, 0, sizeof(cmdline)); - err = config_parse_cmdline(config, cmdline, &need_usage); - if (_Py_INIT_FAILED(err)) { - return err; - } + if (args) { + err = config_parse_cmdline(config, &cmdline, &precmdline); + if (_Py_INIT_FAILED(err)) { + goto done; + } - if (need_usage) { - config_usage(1, config->program); - return _Py_INIT_EXIT(2); - } + if (cmdline.need_usage) { + config_usage(1, config->program); + err = _Py_INIT_EXIT(2); + goto done; + } - if (cmdline->print_help) { - config_usage(0, config->program); - return _Py_INIT_EXIT(0); - } + if (cmdline.print_help) { + config_usage(0, config->program); + err = _Py_INIT_EXIT(0); + goto done; + } - if (cmdline->print_version) { - printf("Python %s\n", - (cmdline->print_version >= 2) ? Py_GetVersion() : PY_VERSION); - return _Py_INIT_EXIT(0); - } + if (cmdline.print_version) { + printf("Python %s\n", + (cmdline.print_version >= 2) ? Py_GetVersion() : PY_VERSION); + err = _Py_INIT_EXIT(0); + goto done; + } - err = config_init_argv(config, cmdline); - if (_Py_INIT_FAILED(err)) { - return err; + err = config_init_argv(config, &precmdline); + if (_Py_INIT_FAILED(err)) { + goto done; + } } - err = config_read(config, &cmdline->precmdline); + err = config_read(config, &precmdline); if (_Py_INIT_FAILED(err)) { - return err; + goto done; } if (config->use_environment) { - err = cmdline_init_env_warnoptions(cmdline, config); + err = cmdline_init_env_warnoptions(&cmdline, config); if (_Py_INIT_FAILED(err)) { - return err; + goto done; } } - err = config_init_warnoptions(config, cmdline); + err = config_init_warnoptions(config, &cmdline); if (_Py_INIT_FAILED(err)) { - return err; + goto done; } - const _PyWstrList *argv = &cmdline->precmdline.argv; + const _PyWstrList *argv = &precmdline.argv; if (_Py_SetArgcArgv(argv->length, argv->items) < 0) { - return _Py_INIT_NO_MEMORY(); - } - return _Py_INIT_OK(); -} - - -/* Read the configuration into _PyCoreConfig from: - - * Command line arguments - * Environment variables - * Py_xxx global configuration variables */ -_PyInitError -_PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, const _PyArgv *args) -{ - _PyInitError err; - - err = _Py_PreInitializeFromConfig(config); - if (_Py_INIT_FAILED(err)) { - return err; - } - - _PyCmdline cmdline = {.precmdline = _PyPreCmdline_INIT}; - - err = _PyPreCmdline_SetArgv(&cmdline.precmdline, args); - if (_Py_INIT_FAILED(err)) { + err = _Py_INIT_NO_MEMORY(); goto done; } - err = config_from_cmdline(config, &cmdline); - if (_Py_INIT_FAILED(err)) { - goto done; + /* Check config consistency */ + assert(config->isolated >= 0); + assert(config->use_environment >= 0); + assert(config->dev_mode >= 0); + assert(config->install_signal_handlers >= 0); + assert(config->use_hash_seed >= 0); + assert(config->faulthandler >= 0); + assert(config->tracemalloc >= 0); + assert(config->site_import >= 0); + assert(config->bytes_warning >= 0); + assert(config->inspect >= 0); + assert(config->interactive >= 0); + assert(config->optimization_level >= 0); + assert(config->parser_debug >= 0); + assert(config->write_bytecode >= 0); + assert(config->verbose >= 0); + assert(config->quiet >= 0); + assert(config->user_site_directory >= 0); + assert(config->buffered_stdio >= 0); + assert(config->program_name != NULL); + assert(config->program != NULL); + assert(_PyWstrList_CheckConsistency(&config->argv)); + assert(_PyWstrList_CheckConsistency(&config->xoptions)); + assert(_PyWstrList_CheckConsistency(&config->warnoptions)); + assert(_PyWstrList_CheckConsistency(&config->module_search_paths)); + if (config->_install_importlib) { + assert(config->executable != NULL); + assert(config->prefix != NULL); + assert(config->base_prefix != NULL); + assert(config->exec_prefix != NULL); + assert(config->base_exec_prefix != NULL); +#ifdef MS_WINDOWS + assert(config->dll_path != NULL); +#endif } + assert(config->filesystem_encoding != NULL); + assert(config->filesystem_errors != NULL); + assert(config->stdio_encoding != NULL); + assert(config->stdio_errors != NULL); +#ifdef MS_WINDOWS + assert(config->legacy_windows_stdio >= 0); +#endif + assert(config->_check_hash_pycs_mode != NULL); + assert(config->_install_importlib >= 0); + assert(config->_frozen >= 0); + err = _Py_INIT_OK(); done: cmdline_clear(&cmdline); + _PyPreCmdline_Clear(&precmdline); return err; } diff --git a/Python/pathconfig.c b/Python/pathconfig.c index 7fea7c366786..10e141a47de0 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -394,7 +394,7 @@ pathconfig_global_init(void) _PyInitError err; _PyCoreConfig config = _PyCoreConfig_INIT; - err = _PyCoreConfig_Read(&config); + err = _PyCoreConfig_Read(&config, NULL); if (_Py_INIT_FAILED(err)) { goto error; } diff --git a/Python/preconfig.c b/Python/preconfig.c index d336352d93c2..ce63ef0777aa 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -63,6 +63,7 @@ _Py_SetFileSystemEncoding(const char *encoding, const char *errors) /* --- _PyArgv ---------------------------------------------------- */ +/* Decode bytes_argv using Py_DecodeLocale() */ _PyInitError _PyArgv_AsWstrList(const _PyArgv *args, _PyWstrList *list) { @@ -110,22 +111,6 @@ _PyPreCmdline_Clear(_PyPreCmdline *cmdline) } -int -_PyPreCmdline_Copy(_PyPreCmdline *cmdline, const _PyPreCmdline *cmdline2) -{ - _PyPreCmdline_Clear(cmdline); - if (_PyWstrList_Copy(&cmdline->argv, &cmdline2->argv) < 0) { - return -1; - } - if (_PyWstrList_Copy(&cmdline->xoptions, &cmdline2->xoptions) < 0) { - return -1; - } - cmdline->use_environment = cmdline2->use_environment; - cmdline->isolated = cmdline2->isolated; - return 0; -} - - _PyInitError _PyPreCmdline_SetArgv(_PyPreCmdline *cmdline, const _PyArgv *args) { @@ -133,7 +118,7 @@ _PyPreCmdline_SetArgv(_PyPreCmdline *cmdline, const _PyArgv *args) } -void +static void _PyPreCmdline_GetPreConfig(_PyPreCmdline *cmdline, const _PyPreConfig *config) { #define COPY_ATTR(ATTR) \ @@ -141,31 +126,29 @@ _PyPreCmdline_GetPreConfig(_PyPreCmdline *cmdline, const _PyPreConfig *config) cmdline->ATTR = config->ATTR; \ } - COPY_ATTR(use_environment); COPY_ATTR(isolated); + COPY_ATTR(use_environment); COPY_ATTR(dev_mode); #undef COPY_ATTR } -void +static void _PyPreCmdline_SetPreConfig(const _PyPreCmdline *cmdline, _PyPreConfig *config) { #define COPY_ATTR(ATTR) \ - if (cmdline->ATTR != -1) { \ - config->ATTR = cmdline->ATTR; \ - } + config->ATTR = cmdline->ATTR - COPY_ATTR(use_environment); COPY_ATTR(isolated); + COPY_ATTR(use_environment); COPY_ATTR(dev_mode); #undef COPY_ATTR } -void +static void _PyPreCmdline_GetCoreConfig(_PyPreCmdline *cmdline, const _PyCoreConfig *config) { #define COPY_ATTR(ATTR) \ @@ -173,30 +156,126 @@ _PyPreCmdline_GetCoreConfig(_PyPreCmdline *cmdline, const _PyCoreConfig *config) cmdline->ATTR = config->ATTR; \ } - COPY_ATTR(use_environment); COPY_ATTR(isolated); + COPY_ATTR(use_environment); COPY_ATTR(dev_mode); #undef COPY_ATTR } -void +int _PyPreCmdline_SetCoreConfig(const _PyPreCmdline *cmdline, _PyCoreConfig *config) { #define COPY_ATTR(ATTR) \ - if (config->ATTR == -1 && cmdline->ATTR != -1) { \ - config->ATTR = cmdline->ATTR; \ + config->ATTR = cmdline->ATTR + + if (_PyWstrList_Extend(&config->xoptions, &cmdline->xoptions) < 0) { + return -1; } - COPY_ATTR(use_environment); COPY_ATTR(isolated); + COPY_ATTR(use_environment); COPY_ATTR(dev_mode); + return 0; #undef COPY_ATTR } +/* Parse the command line arguments */ +static _PyInitError +precmdline_parse_cmdline(_PyPreCmdline *cmdline) +{ + _PyWstrList *argv = &cmdline->argv; + + _PyOS_ResetGetOpt(); + /* Don't log parsing errors into stderr here: _PyCoreConfig_Read() + is responsible for that */ + _PyOS_opterr = 0; + do { + int longindex = -1; + int c = _PyOS_GetOpt(argv->length, argv->items, &longindex); + + if (c == EOF || c == 'c' || c == 'm') { + break; + } + + switch (c) { + case 'E': + cmdline->use_environment = 0; + break; + + case 'I': + cmdline->isolated = 1; + break; + + case 'X': + { + if (_PyWstrList_Append(&cmdline->xoptions, _PyOS_optarg) < 0) { + return _Py_INIT_NO_MEMORY(); + } + break; + } + + default: + /* ignore other argument: + handled by _PyCoreConfig_Read() */ + break; + } + } while (1); + + return _Py_INIT_OK(); +} + + +_PyInitError +_PyPreCmdline_Read(_PyPreCmdline *cmdline, + const _PyPreConfig *preconfig, + const _PyCoreConfig *coreconfig) +{ + if (preconfig) { + _PyPreCmdline_GetPreConfig(cmdline, preconfig); + } + + if (coreconfig) { + _PyPreCmdline_GetCoreConfig(cmdline, coreconfig); + } + + _PyInitError err = precmdline_parse_cmdline(cmdline); + if (_Py_INIT_FAILED(err)) { + return err; + } + + /* isolated, use_environment */ + if (cmdline->isolated < 0) { + cmdline->isolated = 0; + } + if (cmdline->isolated > 0) { + cmdline->use_environment = 0; + } + if (cmdline->use_environment < 0) { + cmdline->use_environment = 0; + } + + /* dev_mode */ + if ((cmdline && _Py_get_xoption(&cmdline->xoptions, L"dev")) + || _Py_GetEnv(cmdline->use_environment, "PYTHONDEVMODE")) + { + cmdline->dev_mode = 1; + } + if (cmdline->dev_mode < 0) { + cmdline->dev_mode = 0; + } + + assert(cmdline->use_environment >= 0); + assert(cmdline->isolated >= 0); + assert(cmdline->dev_mode >= 0); + + return _Py_INIT_OK(); +} + + /* --- _PyPreConfig ----------------------------------------------- */ void @@ -240,17 +319,71 @@ _PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2) } -void +PyObject* +_PyPreConfig_AsDict(const _PyPreConfig *config) +{ + PyObject *dict; + + dict = PyDict_New(); + if (dict == NULL) { + return NULL; + } + +#define SET_ITEM(KEY, EXPR) \ + do { \ + PyObject *obj = (EXPR); \ + if (obj == NULL) { \ + goto fail; \ + } \ + int res = PyDict_SetItemString(dict, (KEY), obj); \ + Py_DECREF(obj); \ + if (res < 0) { \ + goto fail; \ + } \ + } while (0) +#define SET_ITEM_INT(ATTR) \ + SET_ITEM(#ATTR, PyLong_FromLong(config->ATTR)) +#define FROM_STRING(STR) \ + ((STR != NULL) ? \ + PyUnicode_FromString(STR) \ + : (Py_INCREF(Py_None), Py_None)) +#define SET_ITEM_STR(ATTR) \ + SET_ITEM(#ATTR, FROM_STRING(config->ATTR)) + + SET_ITEM_INT(isolated); + SET_ITEM_INT(use_environment); + SET_ITEM_INT(coerce_c_locale); + SET_ITEM_INT(coerce_c_locale_warn); + SET_ITEM_INT(utf8_mode); +#ifdef MS_WINDOWS + SET_ITEM_INT(legacy_windows_fs_encoding); +#endif + SET_ITEM_INT(dev_mode); + SET_ITEM_STR(allocator); + return dict; + +fail: + Py_DECREF(dict); + return NULL; + +#undef FROM_STRING +#undef SET_ITEM +#undef SET_ITEM_INT +#undef SET_ITEM_STR +} + + +static void _PyPreConfig_GetGlobalConfig(_PyPreConfig *config) { #define COPY_FLAG(ATTR, VALUE) \ - if (config->ATTR == -1) { \ - config->ATTR = VALUE; \ - } + if (config->ATTR == -1) { \ + config->ATTR = VALUE; \ + } #define COPY_NOT_FLAG(ATTR, VALUE) \ - if (config->ATTR == -1) { \ - config->ATTR = !(VALUE); \ - } + if (config->ATTR == -1) { \ + config->ATTR = !(VALUE); \ + } COPY_FLAG(isolated, Py_IsolatedFlag); COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); @@ -264,17 +397,17 @@ _PyPreConfig_GetGlobalConfig(_PyPreConfig *config) } -void +static void _PyPreConfig_SetGlobalConfig(const _PyPreConfig *config) { #define COPY_FLAG(ATTR, VAR) \ - if (config->ATTR != -1) { \ - VAR = config->ATTR; \ - } + if (config->ATTR != -1) { \ + VAR = config->ATTR; \ + } #define COPY_NOT_FLAG(ATTR, VAR) \ - if (config->ATTR != -1) { \ - VAR = !config->ATTR; \ - } + if (config->ATTR != -1) { \ + VAR = !config->ATTR; \ + } COPY_FLAG(isolated, Py_IsolatedFlag); COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); @@ -307,13 +440,6 @@ _Py_GetEnv(int use_environment, const char *name) } -static const char* -_PyPreConfig_GetEnv(const _PyPreConfig *config, const char *name) -{ - return _Py_GetEnv(config->use_environment, name); -} - - int _Py_str_to_int(const char *str, int *result) { @@ -374,6 +500,16 @@ _Py_get_xoption(const _PyWstrList *xoptions, const wchar_t *name) static _PyInitError preconfig_init_utf8_mode(_PyPreConfig *config, const _PyPreCmdline *cmdline) { +#ifdef MS_WINDOWS + if (config->legacy_windows_fs_encoding) { + config->utf8_mode = 0; + } +#endif + + if (config->utf8_mode >= 0) { + return _Py_INIT_OK(); + } + const wchar_t *xopt; if (cmdline) { xopt = _Py_get_xoption(&cmdline->xoptions, L"utf8"); @@ -401,7 +537,7 @@ preconfig_init_utf8_mode(_PyPreConfig *config, const _PyPreCmdline *cmdline) return _Py_INIT_OK(); } - const char *opt = _PyPreConfig_GetEnv(config, "PYTHONUTF8"); + const char *opt = _Py_GetEnv(config->use_environment, "PYTHONUTF8"); if (opt) { if (strcmp(opt, "1") == 0) { config->utf8_mode = 1; @@ -416,92 +552,6 @@ preconfig_init_utf8_mode(_PyPreConfig *config, const _PyPreCmdline *cmdline) return _Py_INIT_OK(); } - return _Py_INIT_OK(); -} - - -static void -preconfig_init_locale(_PyPreConfig *config) -{ - /* The C locale enables the C locale coercion (PEP 538) */ - if (_Py_LegacyLocaleDetected()) { - config->coerce_c_locale = 2; - } - else { - config->coerce_c_locale = 0; - } -} - - -static _PyInitError -preconfig_read(_PyPreConfig *config, _PyPreCmdline *cmdline) -{ - _PyInitError err; - - err = _PyPreCmdline_Read(cmdline); - if (_Py_INIT_FAILED(err)) { - return err; - } - - _PyPreCmdline_SetPreConfig(cmdline, config); - - _PyPreConfig_GetGlobalConfig(config); - - /* isolated and use_environment */ - if (config->isolated > 0) { - config->use_environment = 0; - } - - /* Default values */ - if (config->use_environment < 0) { - config->use_environment = 0; - } - - /* legacy_windows_fs_encoding, utf8_mode, coerce_c_locale */ - if (config->use_environment) { -#ifdef MS_WINDOWS - _Py_get_env_flag(config->use_environment, - &config->legacy_windows_fs_encoding, - "PYTHONLEGACYWINDOWSFSENCODING"); -#endif - - const char *env = _PyPreConfig_GetEnv(config, "PYTHONCOERCECLOCALE"); - if (env) { - if (strcmp(env, "0") == 0) { - if (config->coerce_c_locale < 0) { - config->coerce_c_locale = 0; - } - } - else if (strcmp(env, "warn") == 0) { - config->coerce_c_locale_warn = 1; - } - else { - if (config->coerce_c_locale < 0) { - config->coerce_c_locale = 1; - } - } - } - } - -#ifdef MS_WINDOWS - if (config->legacy_windows_fs_encoding) { - config->utf8_mode = 0; - } -#endif - - if (config->utf8_mode < 0) { - err = preconfig_init_utf8_mode(config, cmdline); - if (_Py_INIT_FAILED(err)) { - return err; - } - } - - /* Test also if coerce_c_locale equals 1: PYTHONCOERCECLOCALE=1 doesn't - imply that the C locale is always coerced. It is only coerced if - if the LC_CTYPE locale is "C". */ - if (config->coerce_c_locale != 0 && config->coerce_c_locale != 2) { - preconfig_init_locale(config); - } #ifndef MS_WINDOWS if (config->utf8_mode < 0) { @@ -516,33 +566,61 @@ preconfig_read(_PyPreConfig *config, _PyPreCmdline *cmdline) } #endif - if (config->coerce_c_locale < 0) { - config->coerce_c_locale = 0; - } if (config->utf8_mode < 0) { config->utf8_mode = 0; } - if (config->coerce_c_locale < 0) { - config->coerce_c_locale = 0; + return _Py_INIT_OK(); +} + + +static void +preconfig_init_coerce_c_locale(_PyPreConfig *config) +{ + const char *env = _Py_GetEnv(config->use_environment, "PYTHONCOERCECLOCALE"); + if (env) { + if (strcmp(env, "0") == 0) { + if (config->coerce_c_locale < 0) { + config->coerce_c_locale = 0; + } + } + else if (strcmp(env, "warn") == 0) { + config->coerce_c_locale_warn = 1; + } + else { + if (config->coerce_c_locale < 0) { + config->coerce_c_locale = 1; + } + } } - /* dev_mode */ - if ((cmdline && _Py_get_xoption(&cmdline->xoptions, L"dev")) - || _PyPreConfig_GetEnv(config, "PYTHONDEVMODE")) - { - config->dev_mode = 1; + /* Test if coerce_c_locale equals to -1 or equals to 1: + PYTHONCOERCECLOCALE=1 doesn't imply that the C locale is always coerced. + It is only coerced if if the LC_CTYPE locale is "C". */ + if (config->coerce_c_locale == 0 || config->coerce_c_locale == 2) { + return; + } + + /* The C locale enables the C locale coercion (PEP 538) */ + if (_Py_LegacyLocaleDetected()) { + config->coerce_c_locale = 2; } - if (config->dev_mode < 0) { - config->dev_mode = 0; + else { + config->coerce_c_locale = 0; } - /* allocator */ + assert(config->coerce_c_locale >= 0); +} + + +static _PyInitError +preconfig_init_allocator(_PyPreConfig *config) +{ if (config->allocator == NULL) { /* bpo-34247. The PYTHONMALLOC environment variable has the priority over PYTHONDEV env var and "-X dev" command line option. For example, PYTHONMALLOC=malloc PYTHONDEVMODE=1 sets the memory allocators to "malloc" (and not to "debug"). */ - const char *allocator = _PyPreConfig_GetEnv(config, "PYTHONMALLOC"); + const char *allocator = _Py_GetEnv(config->use_environment, "PYTHONMALLOC"); if (allocator) { config->allocator = _PyMem_RawStrdup(allocator); if (config->allocator == NULL) { @@ -557,130 +635,51 @@ preconfig_read(_PyPreConfig *config, _PyPreCmdline *cmdline) return _Py_INIT_NO_MEMORY(); } } - - assert(config->coerce_c_locale >= 0); - assert(config->utf8_mode >= 0); - assert(config->isolated >= 0); - assert(config->use_environment >= 0); - assert(config->dev_mode >= 0); - return _Py_INIT_OK(); } static _PyInitError -get_ctype_locale(char **locale_p) +preconfig_read(_PyPreConfig *config, _PyPreCmdline *cmdline, + const _PyCoreConfig *coreconfig) { - const char *loc = setlocale(LC_CTYPE, NULL); - if (loc == NULL) { - return _Py_INIT_ERR("failed to LC_CTYPE locale"); - } + _PyInitError err; - char *copy = _PyMem_RawStrdup(loc); - if (copy == NULL) { - return _Py_INIT_NO_MEMORY(); + err = _PyPreCmdline_Read(cmdline, config, coreconfig); + if (_Py_INIT_FAILED(err)) { + return err; } - *locale_p = copy; - return _Py_INIT_OK(); -} + _PyPreCmdline_SetPreConfig(cmdline, config); + /* legacy_windows_fs_encoding, coerce_c_locale, utf8_mode */ +#ifdef MS_WINDOWS + _Py_get_env_flag(config->use_environment, + &config->legacy_windows_fs_encoding, + "PYTHONLEGACYWINDOWSFSENCODING"); +#endif -PyObject* -_PyPreConfig_AsDict(const _PyPreConfig *config) -{ - PyObject *dict; + preconfig_init_coerce_c_locale(config); - dict = PyDict_New(); - if (dict == NULL) { - return NULL; + err = preconfig_init_utf8_mode(config, cmdline); + if (_Py_INIT_FAILED(err)) { + return err; } -#define SET_ITEM(KEY, EXPR) \ - do { \ - PyObject *obj = (EXPR); \ - if (obj == NULL) { \ - goto fail; \ - } \ - int res = PyDict_SetItemString(dict, (KEY), obj); \ - Py_DECREF(obj); \ - if (res < 0) { \ - goto fail; \ - } \ - } while (0) -#define SET_ITEM_INT(ATTR) \ - SET_ITEM(#ATTR, PyLong_FromLong(config->ATTR)) -#define FROM_STRING(STR) \ - ((STR != NULL) ? \ - PyUnicode_FromString(STR) \ - : (Py_INCREF(Py_None), Py_None)) -#define SET_ITEM_STR(ATTR) \ - SET_ITEM(#ATTR, FROM_STRING(config->ATTR)) + /* allocator */ + err = preconfig_init_allocator(config); + if (_Py_INIT_FAILED(err)) { + return err; + } - SET_ITEM_INT(isolated); - SET_ITEM_INT(use_environment); - SET_ITEM_INT(coerce_c_locale); - SET_ITEM_INT(coerce_c_locale_warn); - SET_ITEM_INT(utf8_mode); + assert(config->coerce_c_locale >= 0); #ifdef MS_WINDOWS - SET_ITEM_INT(legacy_windows_fs_encoding); + assert(config->legacy_windows_fs_encoding >= 0); #endif - SET_ITEM_INT(dev_mode); - SET_ITEM_STR(allocator); - return dict; - -fail: - Py_DECREF(dict); - return NULL; - -#undef FROM_STRING -#undef SET_ITEM -#undef SET_ITEM_INT -#undef SET_ITEM_STR -} - - -/* Parse the command line arguments */ -_PyInitError -_PyPreCmdline_Read(_PyPreCmdline *cmdline) -{ - _PyWstrList *argv = &cmdline->argv; - - _PyOS_ResetGetOpt(); - /* Don't log parsing errors into stderr here: _PyCoreConfig_ReadFromArgv() - is responsible for that */ - _PyOS_opterr = 0; - do { - int longindex = -1; - int c = _PyOS_GetOpt(argv->length, argv->items, &longindex); - - if (c == EOF || c == 'c' || c == 'm') { - break; - } - - switch (c) { - case 'E': - cmdline->use_environment = 0; - break; - - case 'I': - cmdline->isolated = 1; - break; - - case 'X': - { - if (_PyWstrList_Append(&cmdline->xoptions, _PyOS_optarg) < 0) { - return _Py_INIT_NO_MEMORY(); - } - break; - } - - default: - /* ignore other argument: - handled by _PyCoreConfig_ReadFromArgv() */ - break; - } - } while (1); + assert(config->utf8_mode >= 0); + assert(config->isolated >= 0); + assert(config->use_environment >= 0); + assert(config->dev_mode >= 0); return _Py_INIT_OK(); } @@ -688,38 +687,43 @@ _PyPreCmdline_Read(_PyPreCmdline *cmdline) /* Read the configuration from: + - command line arguments - environment variables - Py_xxx global configuration variables - - the LC_CTYPE locale - - See _PyPreConfig_ReadFromArgv() to parse also command line arguments. */ + - the LC_CTYPE locale */ _PyInitError _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args, const _PyCoreConfig *coreconfig) { _PyInitError err; - _PyPreCmdline cmdline = _PyPreCmdline_INIT; - char *old_loc = NULL; - err = get_ctype_locale(&old_loc); + err = _PyRuntime_Initialize(); if (_Py_INIT_FAILED(err)) { - goto done; + return err; } - /* Set LC_CTYPE to the user preferred locale */ - _Py_SetLocaleFromEnv(LC_CTYPE); - _PyPreConfig_GetGlobalConfig(config); - _PyPreCmdline_GetPreConfig(&cmdline, config); + /* Copy LC_CTYPE locale, since it's modified later */ + const char *loc = setlocale(LC_CTYPE, NULL); + if (loc == NULL) { + return _Py_INIT_ERR("failed to LC_CTYPE locale"); + } + char *init_ctype_locale = _PyMem_RawStrdup(loc); + if (init_ctype_locale == NULL) { + return _Py_INIT_NO_MEMORY(); + } - if (coreconfig) { - _PyPreCmdline_GetCoreConfig(&cmdline, coreconfig); - if (config->dev_mode == -1) { - config->dev_mode = coreconfig->dev_mode; - } + /* Save the config to be able to restore it if encodings change */ + _PyPreConfig save_config = _PyPreConfig_INIT; + if (_PyPreConfig_Copy(&save_config, config) < 0) { + return _Py_INIT_NO_MEMORY(); } + /* Set LC_CTYPE to the user preferred locale */ + _Py_SetLocaleFromEnv(LC_CTYPE); + + _PyPreCmdline cmdline = _PyPreCmdline_INIT; if (args) { err = _PyPreCmdline_SetArgv(&cmdline, args); if (_Py_INIT_FAILED(err)) { @@ -727,61 +731,13 @@ _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args, } } - err = preconfig_read(config, &cmdline); - -done: - if (old_loc != NULL) { - setlocale(LC_CTYPE, old_loc); - PyMem_RawFree(old_loc); - } - _PyPreCmdline_Clear(&cmdline); - - return err; -} - - -/* Read the configuration from: - - - command line arguments - - environment variables - - Py_xxx global configuration variables - - the LC_CTYPE locale - - See _PyPreConfig_ReadFromArgv() to parse also command line arguments. */ -_PyInitError -_PyPreConfig_ReadFromArgv(_PyPreConfig *config, const _PyArgv *args) -{ - _PyInitError err; - - err = _PyRuntime_Initialize(); - if (_Py_INIT_FAILED(err)) { - return err; - } - - char *init_ctype_locale = NULL; int init_utf8_mode = Py_UTF8Mode; #ifdef MS_WINDOWS int init_legacy_encoding = Py_LegacyWindowsFSEncodingFlag; #endif - _PyPreConfig save_config = _PyPreConfig_INIT; int locale_coerced = 0; int loops = 0; - err = get_ctype_locale(&init_ctype_locale); - if (_Py_INIT_FAILED(err)) { - goto done; - } - - _PyPreConfig_GetGlobalConfig(config); - - if (_PyPreConfig_Copy(&save_config, config) < 0) { - err = _Py_INIT_NO_MEMORY(); - goto done; - } - - /* Set LC_CTYPE to the user preferred locale */ - _Py_SetLocaleFromEnv(LC_CTYPE); - while (1) { int utf8_mode = config->utf8_mode; @@ -800,7 +756,7 @@ _PyPreConfig_ReadFromArgv(_PyPreConfig *config, const _PyArgv *args) Py_LegacyWindowsFSEncodingFlag = config->legacy_windows_fs_encoding; #endif - err = _PyPreConfig_Read(config, args, NULL); + err = preconfig_read(config, &cmdline, coreconfig); if (_Py_INIT_FAILED(err)) { goto done; } @@ -864,6 +820,7 @@ _PyPreConfig_ReadFromArgv(_PyPreConfig *config, const _PyArgv *args) #ifdef MS_WINDOWS Py_LegacyWindowsFSEncodingFlag = init_legacy_encoding; #endif + _PyPreCmdline_Clear(&cmdline); return err; } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index b12fa820e9ca..57b0c3215b7d 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -482,7 +482,7 @@ _Py_Initialize_ReconfigureCore(PyInterpreterState **interp_p, } *interp_p = interp; - _PyCoreConfig_SetGlobalConfig(core_config); + _PyCoreConfig_Write(core_config); if (_PyCoreConfig_Copy(&interp->core_config, core_config) < 0) { return _Py_INIT_ERR("failed to copy core config"); @@ -506,7 +506,7 @@ pycore_init_runtime(const _PyCoreConfig *core_config) return _Py_INIT_ERR("main interpreter already initialized"); } - _PyCoreConfig_SetGlobalConfig(core_config); + _PyCoreConfig_Write(core_config); _PyInitError err = _PyRuntime_Initialize(); if (_Py_INIT_FAILED(err)) { @@ -801,7 +801,7 @@ pyinit_coreconfig(_PyCoreConfig *config, const _PyCoreConfig *src_config, return _Py_INIT_ERR("failed to copy core config"); } - _PyInitError err = _PyCoreConfig_Read(config); + _PyInitError err = _PyCoreConfig_Read(config, NULL); if (_Py_INIT_FAILED(err)) { return err; } @@ -833,14 +833,12 @@ pyinit_coreconfig(_PyCoreConfig *config, const _PyCoreConfig *src_config, * safe to call without calling Py_Initialize first) */ _PyInitError -_Py_InitializeCore(PyInterpreterState **interp_p, - const _PyCoreConfig *src_config) +_Py_InitializeCore(const _PyCoreConfig *src_config, + PyInterpreterState **interp_p) { - _PyInitError err; - assert(src_config != NULL); - err = _Py_PreInitializeFromConfig(src_config); + _PyInitError err = _Py_PreInitializeFromConfig(src_config); if (_Py_INIT_FAILED(err)) { return err; } @@ -987,7 +985,7 @@ _Py_InitializeFromConfig(const _PyCoreConfig *config) { PyInterpreterState *interp = NULL; _PyInitError err; - err = _Py_InitializeCore(&interp, config); + err = _Py_InitializeCore(config, &interp); if (_Py_INIT_FAILED(err)) { return err; } From webhook-mailer at python.org Tue Mar 26 15:12:50 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 26 Mar 2019 19:12:50 -0000 Subject: [Python-checkins] bpo-36364: fix SharedMemoryManager examples (GH-12439) Message-ID: https://github.com/python/cpython/commit/3b7e47aea9b29f2669e7178a461426d18bce349e commit: 3b7e47aea9b29f2669e7178a461426d18bce349e branch: master author: Pierre Glaser committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-26T12:12:26-07:00 summary: bpo-36364: fix SharedMemoryManager examples (GH-12439) Examples of the `multiprocessing.shared_memory` module try to import `SharedMemoryManager` from `multiprocessing.shared_memory` whereas this class is defined in `multiprocessing.managers`. files: M Doc/library/multiprocessing.shared_memory.rst diff --git a/Doc/library/multiprocessing.shared_memory.rst b/Doc/library/multiprocessing.shared_memory.rst index 426fef62fa75..cba576a29e2e 100644 --- a/Doc/library/multiprocessing.shared_memory.rst +++ b/Doc/library/multiprocessing.shared_memory.rst @@ -176,6 +176,7 @@ same ``numpy.ndarray`` from two distinct Python shells: .. class:: SharedMemoryManager([address[, authkey]]) + :module: multiprocessing.managers A subclass of :class:`~multiprocessing.managers.BaseManager` which can be used for the management of shared memory blocks across processes. @@ -218,8 +219,8 @@ The following example demonstrates the basic mechanisms of a .. doctest:: :options: +SKIP - >>> from multiprocessing import shared_memory - >>> smm = shared_memory.SharedMemoryManager() + >>> from multiprocessing.managers import SharedMemoryManager + >>> smm = SharedMemoryManager() >>> smm.start() # Start the process that manages the shared memory blocks >>> sl = smm.ShareableList(range(4)) >>> sl @@ -238,7 +239,7 @@ needed: .. doctest:: :options: +SKIP - >>> with shared_memory.SharedMemoryManager() as smm: + >>> with SharedMemoryManager() as smm: ... sl = smm.ShareableList(range(2000)) ... # Divide the work among two processes, storing partial results in sl ... p1 = Process(target=do_work, args=(sl, 0, 1000)) From webhook-mailer at python.org Tue Mar 26 17:10:51 2019 From: webhook-mailer at python.org (Tal Einat) Date: Tue, 26 Mar 2019 21:10:51 -0000 Subject: [Python-checkins] bpo-34203: FAQ: improve wording of paragraph about 2.x vs. 3.x (GH-9821) Message-ID: https://github.com/python/cpython/commit/6cd658b1a5cb2413230dbc2d9395d20498be8518 commit: 6cd658b1a5cb2413230dbc2d9395d20498be8518 branch: master author: Tal Einat committer: GitHub date: 2019-03-26T23:10:40+02:00 summary: bpo-34203: FAQ: improve wording of paragraph about 2.x vs. 3.x (GH-9821) files: M Doc/faq/general.rst diff --git a/Doc/faq/general.rst b/Doc/faq/general.rst index 7ee340d7957c..3ef553e8acb4 100644 --- a/Doc/faq/general.rst +++ b/Doc/faq/general.rst @@ -306,14 +306,10 @@ guaranteed that interfaces will remain the same throughout a series of bugfix releases. The latest stable releases can always be found on the `Python download page -`_. There are two production-ready version -of Python: 2.x and 3.x, but the recommended one at this times is Python 3.x. -Although Python 2.x is still widely used, `it will not be -maintained after January 1, 2020 `_. -Python 2.x was known for having more third-party libraries available, however, -by the time of this writing, most of the widely used libraries support Python 3.x, -and some are even dropping the Python 2.x support. - +`_. There are two production-ready versions +of Python: 2.x and 3.x. The recommended version is 3.x, which is supported by +most widely used libraries. Although 2.x is still widely used, `it will not +be maintained after January 1, 2020 `_. How many people are using Python? --------------------------------- From webhook-mailer at python.org Tue Mar 26 17:17:22 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 26 Mar 2019 21:17:22 -0000 Subject: [Python-checkins] [2.7] bpo-34203: FAQ: improve wording of paragraph about 2.x vs. 3.x (GH-9821) (GH-12568) Message-ID: https://github.com/python/cpython/commit/5a3316931c6042df44b3b342df956cd6a77e8dcd commit: 5a3316931c6042df44b3b342df956cd6a77e8dcd branch: 2.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-26T14:17:16-07:00 summary: [2.7] bpo-34203: FAQ: improve wording of paragraph about 2.x vs. 3.x (GH-9821) (GH-12568) (cherry picked from commit 6cd658b1a5cb2413230dbc2d9395d20498be8518) Co-authored-by: Tal Einat https://bugs.python.org/issue34203 files: M Doc/faq/general.rst diff --git a/Doc/faq/general.rst b/Doc/faq/general.rst index e9b3fafbf55f..27f46810c164 100644 --- a/Doc/faq/general.rst +++ b/Doc/faq/general.rst @@ -306,14 +306,10 @@ guaranteed that interfaces will remain the same throughout a series of bugfix releases. The latest stable releases can always be found on the `Python download page -`_. There are two production-ready version -of Python: 2.x and 3.x, but the recommended one at this times is Python 3.x. -Although Python 2.x is still widely used, `it will not be -maintained after January 1, 2020 `_. -Python 2.x was known for having more third-party libraries available, however, -by the time of this writing, most of the widely used libraries support Python 3.x, -and some are even dropping the Python 2.x support. - +`_. There are two production-ready versions +of Python: 2.x and 3.x. The recommended version is 3.x, which is supported by +most widely used libraries. Although 2.x is still widely used, `it will not +be maintained after January 1, 2020 `_. How many people are using Python? --------------------------------- From webhook-mailer at python.org Tue Mar 26 17:20:34 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 26 Mar 2019 21:20:34 -0000 Subject: [Python-checkins] bpo-34203: FAQ: improve wording of paragraph about 2.x vs. 3.x (GH-9821) Message-ID: https://github.com/python/cpython/commit/5ac626350e2bfe5f283e7322bc31045062680d2b commit: 5ac626350e2bfe5f283e7322bc31045062680d2b branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-26T14:20:29-07:00 summary: bpo-34203: FAQ: improve wording of paragraph about 2.x vs. 3.x (GH-9821) (cherry picked from commit 6cd658b1a5cb2413230dbc2d9395d20498be8518) Co-authored-by: Tal Einat files: M Doc/faq/general.rst diff --git a/Doc/faq/general.rst b/Doc/faq/general.rst index 7ee340d7957c..3ef553e8acb4 100644 --- a/Doc/faq/general.rst +++ b/Doc/faq/general.rst @@ -306,14 +306,10 @@ guaranteed that interfaces will remain the same throughout a series of bugfix releases. The latest stable releases can always be found on the `Python download page -`_. There are two production-ready version -of Python: 2.x and 3.x, but the recommended one at this times is Python 3.x. -Although Python 2.x is still widely used, `it will not be -maintained after January 1, 2020 `_. -Python 2.x was known for having more third-party libraries available, however, -by the time of this writing, most of the widely used libraries support Python 3.x, -and some are even dropping the Python 2.x support. - +`_. There are two production-ready versions +of Python: 2.x and 3.x. The recommended version is 3.x, which is supported by +most widely used libraries. Although 2.x is still widely used, `it will not +be maintained after January 1, 2020 `_. How many people are using Python? --------------------------------- From webhook-mailer at python.org Tue Mar 26 19:26:21 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 26 Mar 2019 23:26:21 -0000 Subject: [Python-checkins] bpo-36301: Test Python init with isolated (GH-12569) Message-ID: https://github.com/python/cpython/commit/6da20a49507c46738632baf3e4bfe3bdd086155b commit: 6da20a49507c46738632baf3e4bfe3bdd086155b branch: master author: Victor Stinner committer: GitHub date: 2019-03-27T00:26:18+01:00 summary: bpo-36301: Test Python init with isolated (GH-12569) Add test_preinit_isolated1() and test_preinit_isolated2() test_embed. files: M Lib/test/test_embed.py M Programs/_testembed.c diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 7efd5be23e03..c44d24ecfdd3 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -662,6 +662,26 @@ def test_init_isolated(self): } self.check_config("init_isolated", config, preconfig) + def test_preinit_isolated1(self): + # _PyPreConfig.isolated=1, _PyCoreConfig.isolated not set + preconfig = {} + config = { + 'isolated': 1, + 'use_environment': 0, + 'user_site_directory': 0, + } + self.check_config("preinit_isolated1", config, preconfig) + + def test_preinit_isolated2(self): + # _PyPreConfig.isolated=0, _PyCoreConfig.isolated=1 + preconfig = {} + config = { + 'isolated': 1, + 'use_environment': 0, + 'user_site_directory': 0, + } + self.check_config("preinit_isolated2", config, preconfig) + if __name__ == "__main__": unittest.main() diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 7fb0d695b475..76de8aab5ba6 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -648,6 +648,74 @@ static int test_init_isolated(void) } +/* _PyPreConfig.isolated=1, _PyCoreConfig.isolated=0 */ +static int test_preinit_isolated1(void) +{ + _PyInitError err; + + _PyPreConfig preconfig = _PyPreConfig_INIT; + + /* Set coerce_c_locale and utf8_mode to not depend on the locale */ + preconfig.coerce_c_locale = 0; + preconfig.utf8_mode = 0; + preconfig.isolated = 1; + + err = _Py_PreInitializeFromPreConfig(&preconfig); + if (_Py_INIT_FAILED(err)) { + _Py_ExitInitError(err); + } + + _PyCoreConfig config = _PyCoreConfig_INIT; + config.program_name = L"./_testembed"; + + test_init_env_dev_mode_putenvs(); + err = _Py_InitializeFromConfig(&config); + if (_Py_INIT_FAILED(err)) { + _Py_ExitInitError(err); + } + dump_config(); + Py_Finalize(); + return 0; +} + + +/* _PyPreConfig.isolated=0, _PyCoreConfig.isolated=1 */ +static int test_preinit_isolated2(void) +{ + _PyInitError err; + + _PyPreConfig preconfig = _PyPreConfig_INIT; + + /* Set coerce_c_locale and utf8_mode to not depend on the locale */ + preconfig.coerce_c_locale = 0; + preconfig.utf8_mode = 0; + preconfig.isolated = 0; + + err = _Py_PreInitializeFromPreConfig(&preconfig); + if (_Py_INIT_FAILED(err)) { + _Py_ExitInitError(err); + } + + /* Test _PyCoreConfig.isolated=1 */ + _PyCoreConfig config = _PyCoreConfig_INIT; + + Py_IsolatedFlag = 0; + config.isolated = 1; + + /* Use path starting with "./" avoids a search along the PATH */ + config.program_name = L"./_testembed"; + + test_init_env_dev_mode_putenvs(); + err = _Py_InitializeFromConfig(&config); + if (_Py_INIT_FAILED(err)) { + _Py_ExitInitError(err); + } + dump_config(); + Py_Finalize(); + return 0; +} + + static int test_init_dev_mode(void) { _PyCoreConfig config = _PyCoreConfig_INIT; @@ -699,6 +767,8 @@ static struct TestCase TestCases[] = { { "init_env_dev_mode_alloc", test_init_env_dev_mode_alloc }, { "init_dev_mode", test_init_dev_mode }, { "init_isolated", test_init_isolated }, + { "preinit_isolated1", test_preinit_isolated1 }, + { "preinit_isolated2", test_preinit_isolated2 }, { NULL, NULL } }; From webhook-mailer at python.org Tue Mar 26 19:58:29 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Tue, 26 Mar 2019 23:58:29 -0000 Subject: [Python-checkins] bpo-36429: Fix starting IDLE with pyshell (#12548) Message-ID: https://github.com/python/cpython/commit/6a258c88906a7e8acde455ee2acb78b6f315ea0b commit: 6a258c88906a7e8acde455ee2acb78b6f315ea0b branch: master author: Terry Jan Reedy committer: GitHub date: 2019-03-26T19:58:19-04:00 summary: bpo-36429: Fix starting IDLE with pyshell (#12548) Add idlelib.pyshell alias at top; remove pyshell alias at bottom. Remove obsolete __name__=='__main__' command. files: A Misc/NEWS.d/next/IDLE/2019-03-26-00-09-50.bpo-36429.w-jL2e.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/pyshell.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index dbb3653bb4f4..be855bc46718 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,15 @@ Released on 2019-10-20? ====================================== +bpo-36429: Fix starting IDLE with pyshell. +Add idlelib.pyshell alias at top; remove pyshell alias at bottom. +Remove obsolete __name__=='__main__' command. + +bpo-30348: Increase test coverage of idlelib.autocomplete by 30%. +Patch by Louie Lu. + +bpo-23205: Add tests and refactor grep's findfiles. + bpo-36405: Use dict unpacking in idlelib. bpo-36396: Remove fgBg param of idlelib.config.GetHighlight(). diff --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py index 11bafdb49aaa..2de42658b01c 100755 --- a/Lib/idlelib/pyshell.py +++ b/Lib/idlelib/pyshell.py @@ -1,6 +1,8 @@ #! /usr/bin/env python3 import sys +if __name__ == "__main__": + sys.modules['idlelib.pyshell'] = sys.modules['__main__'] try: from tkinter import * @@ -416,10 +418,7 @@ def build_subprocess_arglist(self): # run from the IDLE source directory. del_exitf = idleConf.GetOption('main', 'General', 'delete-exitfunc', default=False, type='bool') - if __name__ == 'idlelib.pyshell': - command = "__import__('idlelib.run').run.main(%r)" % (del_exitf,) - else: - command = "__import__('run').main(%r)" % (del_exitf,) + command = "__import__('idlelib.run').run.main(%r)" % (del_exitf,) return [sys.executable] + w + ["-c", command, str(self.port)] def start_subprocess(self): @@ -1574,7 +1573,6 @@ def main(): capture_warnings(False) if __name__ == "__main__": - sys.modules['pyshell'] = sys.modules['__main__'] main() capture_warnings(False) # Make sure turned off; see issue 18081 diff --git a/Misc/NEWS.d/next/IDLE/2019-03-26-00-09-50.bpo-36429.w-jL2e.rst b/Misc/NEWS.d/next/IDLE/2019-03-26-00-09-50.bpo-36429.w-jL2e.rst new file mode 100644 index 000000000000..1d6bb1a587b5 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-03-26-00-09-50.bpo-36429.w-jL2e.rst @@ -0,0 +1,2 @@ +Fix starting IDLE with pyshell. Add idlelib.pyshell alias at top; remove +pyshell alias at bottom. Remove obsolete __name__=='__main__' command. From webhook-mailer at python.org Tue Mar 26 20:19:27 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 27 Mar 2019 00:19:27 -0000 Subject: [Python-checkins] bpo-36429: Fix starting IDLE with pyshell (GH-12548) Message-ID: https://github.com/python/cpython/commit/23eb816399ac7482d2bd7d50814b19a3db52e7d4 commit: 23eb816399ac7482d2bd7d50814b19a3db52e7d4 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-26T17:19:23-07:00 summary: bpo-36429: Fix starting IDLE with pyshell (GH-12548) Add idlelib.pyshell alias at top; remove pyshell alias at bottom. Remove obsolete __name__=='__main__' command. (cherry picked from commit 6a258c88906a7e8acde455ee2acb78b6f315ea0b) Co-authored-by: Terry Jan Reedy files: A Misc/NEWS.d/next/IDLE/2019-03-26-00-09-50.bpo-36429.w-jL2e.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/pyshell.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index f136810e7a86..6340e19bb80b 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,15 @@ Released on 2019-??-?? ====================================== +bpo-36429: Fix starting IDLE with pyshell. +Add idlelib.pyshell alias at top; remove pyshell alias at bottom. +Remove obsolete __name__=='__main__' command. + +bpo-30348: Increase test coverage of idlelib.autocomplete by 30%. +Patch by Louie Lu. + +bpo-23205: Add tests and refactor grep's findfiles. + bpo-36405: Use dict unpacking in idlelib. bpo-36396: Remove fgBg param of idlelib.config.GetHighlight(). diff --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py index 11bafdb49aaa..2de42658b01c 100755 --- a/Lib/idlelib/pyshell.py +++ b/Lib/idlelib/pyshell.py @@ -1,6 +1,8 @@ #! /usr/bin/env python3 import sys +if __name__ == "__main__": + sys.modules['idlelib.pyshell'] = sys.modules['__main__'] try: from tkinter import * @@ -416,10 +418,7 @@ def build_subprocess_arglist(self): # run from the IDLE source directory. del_exitf = idleConf.GetOption('main', 'General', 'delete-exitfunc', default=False, type='bool') - if __name__ == 'idlelib.pyshell': - command = "__import__('idlelib.run').run.main(%r)" % (del_exitf,) - else: - command = "__import__('run').main(%r)" % (del_exitf,) + command = "__import__('idlelib.run').run.main(%r)" % (del_exitf,) return [sys.executable] + w + ["-c", command, str(self.port)] def start_subprocess(self): @@ -1574,7 +1573,6 @@ def main(): capture_warnings(False) if __name__ == "__main__": - sys.modules['pyshell'] = sys.modules['__main__'] main() capture_warnings(False) # Make sure turned off; see issue 18081 diff --git a/Misc/NEWS.d/next/IDLE/2019-03-26-00-09-50.bpo-36429.w-jL2e.rst b/Misc/NEWS.d/next/IDLE/2019-03-26-00-09-50.bpo-36429.w-jL2e.rst new file mode 100644 index 000000000000..1d6bb1a587b5 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-03-26-00-09-50.bpo-36429.w-jL2e.rst @@ -0,0 +1,2 @@ +Fix starting IDLE with pyshell. Add idlelib.pyshell alias at top; remove +pyshell alias at bottom. Remove obsolete __name__=='__main__' command. From webhook-mailer at python.org Tue Mar 26 20:36:20 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 27 Mar 2019 00:36:20 -0000 Subject: [Python-checkins] bpo-36444: Remove _PyMainInterpreterConfig (GH-12571) Message-ID: https://github.com/python/cpython/commit/8b9dbc017a190d13f717e714630d620adb7c7ac2 commit: 8b9dbc017a190d13f717e714630d620adb7c7ac2 branch: master author: Victor Stinner committer: GitHub date: 2019-03-27T01:36:16+01:00 summary: bpo-36444: Remove _PyMainInterpreterConfig (GH-12571) files: M Include/cpython/pylifecycle.h M Include/cpython/pystate.h M Include/internal/pycore_coreconfig.h M Include/internal/pycore_pystate.h M Lib/test/test_embed.py M Modules/main.c M Python/coreconfig.c M Python/pylifecycle.c M Python/pystate.c M Python/sysmodule.c diff --git a/Include/cpython/pylifecycle.h b/Include/cpython/pylifecycle.h index 0c5f74e4f2b2..1db1d2167cb1 100644 --- a/Include/cpython/pylifecycle.h +++ b/Include/cpython/pylifecycle.h @@ -26,17 +26,8 @@ PyAPI_FUNC(_PyInitError) _Py_InitializeCore( PyAPI_FUNC(int) _Py_IsCoreInitialized(void); -PyAPI_FUNC(_PyInitError) _PyMainInterpreterConfig_Read( - _PyMainInterpreterConfig *config, - const _PyCoreConfig *core_config); -PyAPI_FUNC(void) _PyMainInterpreterConfig_Clear(_PyMainInterpreterConfig *); -PyAPI_FUNC(int) _PyMainInterpreterConfig_Copy( - _PyMainInterpreterConfig *config, - const _PyMainInterpreterConfig *config2); - PyAPI_FUNC(_PyInitError) _Py_InitializeMainInterpreter( - PyInterpreterState *interp, - const _PyMainInterpreterConfig *); + PyInterpreterState *interp); /* Initialization and finalization */ diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h index 5439d07e6af3..a0953f03261d 100644 --- a/Include/cpython/pystate.h +++ b/Include/cpython/pystate.h @@ -8,33 +8,10 @@ extern "C" { #include "cpython/coreconfig.h" -/* Placeholders while working on the new configuration API - * - * See PEP 432 for final anticipated contents - */ -typedef struct { - int install_signal_handlers; /* Install signal handlers? -1 means unset */ - PyObject *argv; /* sys.argv list, can be NULL */ - PyObject *executable; /* sys.executable str */ - PyObject *prefix; /* sys.prefix str */ - PyObject *base_prefix; /* sys.base_prefix str, can be NULL */ - PyObject *exec_prefix; /* sys.exec_prefix str */ - PyObject *base_exec_prefix; /* sys.base_exec_prefix str, can be NULL */ - PyObject *warnoptions; /* sys.warnoptions list, can be NULL */ - PyObject *xoptions; /* sys._xoptions dict, can be NULL */ - PyObject *module_search_path; /* sys.path list */ - PyObject *pycache_prefix; /* sys.pycache_prefix str, can be NULL */ -} _PyMainInterpreterConfig; - -#define _PyMainInterpreterConfig_INIT \ - (_PyMainInterpreterConfig){.install_signal_handlers = -1} -/* Note: _PyMainInterpreterConfig_INIT sets other fields to 0/NULL */ - PyAPI_FUNC(int) _PyInterpreterState_RequiresIDRef(PyInterpreterState *); PyAPI_FUNC(void) _PyInterpreterState_RequireIDRef(PyInterpreterState *, int); PyAPI_FUNC(_PyCoreConfig *) _PyInterpreterState_GetCoreConfig(PyInterpreterState *); -PyAPI_FUNC(_PyMainInterpreterConfig *) _PyInterpreterState_GetMainConfig(PyInterpreterState *); PyAPI_FUNC(PyObject *) _PyInterpreterState_GetMainModule(PyInterpreterState *); diff --git a/Include/internal/pycore_coreconfig.h b/Include/internal/pycore_coreconfig.h index dad5d3f3ec8d..c5f39bac9f83 100644 --- a/Include/internal/pycore_coreconfig.h +++ b/Include/internal/pycore_coreconfig.h @@ -104,11 +104,6 @@ PyAPI_FUNC(_PyInitError) _PyCoreConfig_Read(_PyCoreConfig *config, const _PyArgv *args); PyAPI_FUNC(void) _PyCoreConfig_Write(const _PyCoreConfig *config); -/* --- _PyMainInterpreterConfig ----------------------------------- */ - -PyAPI_FUNC(PyObject*) _PyMainInterpreterConfig_AsDict( - const _PyMainInterpreterConfig *config); - #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 27c6eea6aa8c..df3730f8014a 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -59,7 +59,6 @@ struct _is { int fscodec_initialized; _PyCoreConfig core_config; - _PyMainInterpreterConfig config; #ifdef HAVE_DLOPEN int dlopenflags; #endif diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index c44d24ecfdd3..f5e3cef68a54 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -347,22 +347,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'legacy_windows_stdio': 0, }) - # main config - COPY_MAIN_CONFIG = ( - # Copy core config to main config for expected values - 'argv', - 'base_exec_prefix', - 'base_prefix', - 'exec_prefix', - 'executable', - 'install_signal_handlers', - 'prefix', - 'pycache_prefix', - 'warnoptions', - # xoptions is created from core_config in check_main_config(). - # 'module_search_paths' is copied to 'module_search_path'. - ) - # global config DEFAULT_GLOBAL_CONFIG = { 'Py_HasFileSystemDefaultEncoding': 0, @@ -410,18 +394,6 @@ def main_xoptions(self, xoptions_list): xoptions[opt] = True return xoptions - def check_main_config(self, config): - core_config = config['core_config'] - main_config = config['main_config'] - - # main config - expected = {} - for key in self.COPY_MAIN_CONFIG: - expected[key] = core_config[key] - expected['module_search_path'] = core_config['module_search_paths'] - expected['xoptions'] = self.main_xoptions(core_config['xoptions']) - self.assertEqual(main_config, expected) - def get_expected_config(self, expected, env): expected = dict(self.DEFAULT_CORE_CONFIG, **expected) @@ -523,7 +495,6 @@ def check_config(self, testname, expected_config, expected_preconfig): self.check_core_config(config, expected_config) self.check_pre_config(config, expected_preconfig) - self.check_main_config(config) self.check_global_config(config) def test_init_default_config(self): diff --git a/Modules/main.c b/Modules/main.c index 98a886125ca8..05b42cbc6c83 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -31,255 +31,6 @@ extern "C" { #endif -/* --- PyMainInterpreter ------------------------------------------ */ - -void -_PyMainInterpreterConfig_Clear(_PyMainInterpreterConfig *config) -{ - Py_CLEAR(config->argv); - Py_CLEAR(config->executable); - Py_CLEAR(config->prefix); - Py_CLEAR(config->base_prefix); - Py_CLEAR(config->exec_prefix); - Py_CLEAR(config->base_exec_prefix); - Py_CLEAR(config->warnoptions); - Py_CLEAR(config->xoptions); - Py_CLEAR(config->module_search_path); - Py_CLEAR(config->pycache_prefix); -} - - -static int -mainconfig_add_xoption(PyObject *opts, const wchar_t *s) -{ - PyObject *name, *value; - - const wchar_t *name_end = wcschr(s, L'='); - if (!name_end) { - name = PyUnicode_FromWideChar(s, -1); - value = Py_True; - Py_INCREF(value); - } - else { - name = PyUnicode_FromWideChar(s, name_end - s); - value = PyUnicode_FromWideChar(name_end + 1, -1); - } - if (name == NULL || value == NULL) { - goto error; - } - if (PyDict_SetItem(opts, name, value) < 0) { - goto error; - } - Py_DECREF(name); - Py_DECREF(value); - return 0; - -error: - Py_XDECREF(name); - Py_XDECREF(value); - return -1; -} - - -static PyObject* -mainconfig_create_xoptions_dict(const _PyCoreConfig *config) -{ - Py_ssize_t nxoption = config->xoptions.length; - wchar_t * const * xoptions = config->xoptions.items; - PyObject *dict = PyDict_New(); - if (dict == NULL) { - return NULL; - } - - for (Py_ssize_t i=0; i < nxoption; i++) { - const wchar_t *option = xoptions[i]; - if (mainconfig_add_xoption(dict, option) < 0) { - Py_DECREF(dict); - return NULL; - } - } - - return dict; -} - - -static PyObject* -mainconfig_copy_attr(PyObject *obj) -{ - if (PyUnicode_Check(obj)) { - Py_INCREF(obj); - return obj; - } - else if (PyList_Check(obj)) { - return PyList_GetSlice(obj, 0, Py_SIZE(obj)); - } - else if (PyDict_Check(obj)) { - /* The dict type is used for xoptions. Make the assumption that keys - and values are immutables */ - return PyDict_Copy(obj); - } - else { - PyErr_Format(PyExc_TypeError, - "cannot copy config attribute of type %.200s", - Py_TYPE(obj)->tp_name); - return NULL; - } -} - - -int -_PyMainInterpreterConfig_Copy(_PyMainInterpreterConfig *config, - const _PyMainInterpreterConfig *config2) -{ - _PyMainInterpreterConfig_Clear(config); - -#define COPY_ATTR(ATTR) config->ATTR = config2->ATTR -#define COPY_OBJ_ATTR(ATTR) \ - do { \ - if (config2->ATTR != NULL) { \ - config->ATTR = mainconfig_copy_attr(config2->ATTR); \ - if (config->ATTR == NULL) { \ - return -1; \ - } \ - } \ - } while (0) - - COPY_ATTR(install_signal_handlers); - COPY_OBJ_ATTR(argv); - COPY_OBJ_ATTR(executable); - COPY_OBJ_ATTR(prefix); - COPY_OBJ_ATTR(base_prefix); - COPY_OBJ_ATTR(exec_prefix); - COPY_OBJ_ATTR(base_exec_prefix); - COPY_OBJ_ATTR(warnoptions); - COPY_OBJ_ATTR(xoptions); - COPY_OBJ_ATTR(module_search_path); - COPY_OBJ_ATTR(pycache_prefix); -#undef COPY_ATTR -#undef COPY_OBJ_ATTR - return 0; -} - - -PyObject* -_PyMainInterpreterConfig_AsDict(const _PyMainInterpreterConfig *config) -{ - PyObject *dict, *obj; - int res; - - dict = PyDict_New(); - if (dict == NULL) { - return NULL; - } - -#define SET_ITEM_INT(ATTR) \ - do { \ - obj = PyLong_FromLong(config->ATTR); \ - if (obj == NULL) { \ - goto fail; \ - } \ - res = PyDict_SetItemString(dict, #ATTR, obj); \ - Py_DECREF(obj); \ - if (res < 0) { \ - goto fail; \ - } \ - } while (0) - -#define SET_ITEM_OBJ(ATTR) \ - do { \ - obj = config->ATTR; \ - if (obj == NULL) { \ - obj = Py_None; \ - } \ - res = PyDict_SetItemString(dict, #ATTR, obj); \ - if (res < 0) { \ - goto fail; \ - } \ - } while (0) - - SET_ITEM_INT(install_signal_handlers); - SET_ITEM_OBJ(argv); - SET_ITEM_OBJ(executable); - SET_ITEM_OBJ(prefix); - SET_ITEM_OBJ(base_prefix); - SET_ITEM_OBJ(exec_prefix); - SET_ITEM_OBJ(base_exec_prefix); - SET_ITEM_OBJ(warnoptions); - SET_ITEM_OBJ(xoptions); - SET_ITEM_OBJ(module_search_path); - SET_ITEM_OBJ(pycache_prefix); - - return dict; - -fail: - Py_DECREF(dict); - return NULL; - -#undef SET_ITEM_OBJ -} - - -_PyInitError -_PyMainInterpreterConfig_Read(_PyMainInterpreterConfig *main_config, - const _PyCoreConfig *config) -{ - if (main_config->install_signal_handlers < 0) { - main_config->install_signal_handlers = config->install_signal_handlers; - } - - if (main_config->xoptions == NULL) { - main_config->xoptions = mainconfig_create_xoptions_dict(config); - if (main_config->xoptions == NULL) { - return _Py_INIT_NO_MEMORY(); - } - } - -#define COPY_WSTR(ATTR) \ - do { \ - if (main_config->ATTR == NULL && config->ATTR != NULL) { \ - main_config->ATTR = PyUnicode_FromWideChar(config->ATTR, -1); \ - if (main_config->ATTR == NULL) { \ - return _Py_INIT_NO_MEMORY(); \ - } \ - } \ - } while (0) -#define COPY_WSTRLIST(ATTR, LIST) \ - do { \ - if (ATTR == NULL) { \ - ATTR = _PyWstrList_AsList(LIST); \ - if (ATTR == NULL) { \ - return _Py_INIT_NO_MEMORY(); \ - } \ - } \ - } while (0) - - COPY_WSTRLIST(main_config->warnoptions, &config->warnoptions); - COPY_WSTRLIST(main_config->argv, &config->argv); - - if (config->_install_importlib) { - COPY_WSTR(executable); - COPY_WSTR(prefix); - COPY_WSTR(base_prefix); - COPY_WSTR(exec_prefix); - COPY_WSTR(base_exec_prefix); - - COPY_WSTRLIST(main_config->module_search_path, - &config->module_search_paths); - - if (config->pycache_prefix != NULL) { - COPY_WSTR(pycache_prefix); - } else { - main_config->pycache_prefix = NULL; - } - - } - - return _Py_INIT_OK(); -#undef COPY_WSTR -#undef COPY_WSTRLIST -} - - /* --- pymain_init() ---------------------------------------------- */ static _PyInitError @@ -315,25 +66,6 @@ pymain_init_coreconfig(_PyCoreConfig *config, const _PyArgv *args, } -static _PyInitError -pymain_init_python_main(PyInterpreterState *interp) -{ - _PyInitError err; - - _PyMainInterpreterConfig main_config = _PyMainInterpreterConfig_INIT; - err = _PyMainInterpreterConfig_Read(&main_config, &interp->core_config); - if (!_Py_INIT_FAILED(err)) { - err = _Py_InitializeMainInterpreter(interp, &main_config); - } - _PyMainInterpreterConfig_Clear(&main_config); - - if (_Py_INIT_FAILED(err)) { - return err; - } - return _Py_INIT_OK(); -} - - static _PyInitError pymain_init(const _PyArgv *args, PyInterpreterState **interp_p) { @@ -365,7 +97,7 @@ pymain_init(const _PyArgv *args, PyInterpreterState **interp_p) return err; } - err = pymain_init_python_main(*interp_p); + err = _Py_InitializeMainInterpreter(*interp_p); if (_Py_INIT_FAILED(err)) { return err; } diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 2f54e79081fd..944a9e22ca12 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -2208,17 +2208,6 @@ _Py_GetConfigsAsDict(void) } Py_CLEAR(dict); - /* main config */ - const _PyMainInterpreterConfig *main_config = _PyInterpreterState_GetMainConfig(interp); - dict = _PyMainInterpreterConfig_AsDict(main_config); - if (dict == NULL) { - goto error; - } - if (PyDict_SetItemString(config, "main_config", dict) < 0) { - goto error; - } - Py_CLEAR(dict); - return config; error: diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 57b0c3215b7d..ca90e7238b66 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -853,14 +853,19 @@ _Py_InitializeCore(const _PyCoreConfig *src_config, configuration. Example of bpo-34008: Py_Main() called after Py_Initialize(). */ static _PyInitError -_Py_ReconfigureMainInterpreter(PyInterpreterState *interp, - const _PyMainInterpreterConfig *config) +_Py_ReconfigureMainInterpreter(PyInterpreterState *interp) { - if (config->argv != NULL) { - int res = PyDict_SetItemString(interp->sysdict, "argv", config->argv); - if (res < 0) { - return _Py_INIT_ERR("fail to set sys.argv"); - } + _PyCoreConfig *core_config = &interp->core_config; + + PyObject *argv = _PyWstrList_AsList(&core_config->argv); + if (argv == NULL) { + return _Py_INIT_NO_MEMORY(); \ + } + + int res = PyDict_SetItemString(interp->sysdict, "argv", argv); + Py_DECREF(argv); + if (res < 0) { + return _Py_INIT_ERR("fail to set sys.argv"); } return _Py_INIT_OK(); } @@ -877,22 +882,17 @@ _Py_ReconfigureMainInterpreter(PyInterpreterState *interp, * non-zero return code. */ _PyInitError -_Py_InitializeMainInterpreter(PyInterpreterState *interp, - const _PyMainInterpreterConfig *config) +_Py_InitializeMainInterpreter(PyInterpreterState *interp) { if (!_PyRuntime.core_initialized) { return _Py_INIT_ERR("runtime core not initialized"); } /* Configure the main interpreter */ - if (_PyMainInterpreterConfig_Copy(&interp->config, config) < 0) { - return _Py_INIT_ERR("failed to copy main interpreter config"); - } - config = &interp->config; _PyCoreConfig *core_config = &interp->core_config; if (_PyRuntime.initialized) { - return _Py_ReconfigureMainInterpreter(interp, config); + return _Py_ReconfigureMainInterpreter(interp); } if (!core_config->_install_importlib) { @@ -929,7 +929,7 @@ _Py_InitializeMainInterpreter(PyInterpreterState *interp, return err; } - if (interp->config.install_signal_handlers) { + if (core_config->install_signal_handlers) { err = initsigs(); /* Signal handling stuff, including initintr() */ if (_Py_INIT_FAILED(err)) { return err; @@ -991,12 +991,7 @@ _Py_InitializeFromConfig(const _PyCoreConfig *config) } config = &interp->core_config; - _PyMainInterpreterConfig main_config = _PyMainInterpreterConfig_INIT; - err = _PyMainInterpreterConfig_Read(&main_config, config); - if (!_Py_INIT_FAILED(err)) { - err = _Py_InitializeMainInterpreter(interp, &main_config); - } - _PyMainInterpreterConfig_Clear(&main_config); + err = _Py_InitializeMainInterpreter(interp); if (_Py_INIT_FAILED(err)) { return err; } @@ -1364,24 +1359,18 @@ new_interpreter(PyThreadState **tstate_p) /* Copy the current interpreter config into the new interpreter */ _PyCoreConfig *core_config; - _PyMainInterpreterConfig *config; if (save_tstate != NULL) { core_config = &save_tstate->interp->core_config; - config = &save_tstate->interp->config; } else { /* No current thread state, copy from the main interpreter */ PyInterpreterState *main_interp = PyInterpreterState_Main(); core_config = &main_interp->core_config; - config = &main_interp->config; } if (_PyCoreConfig_Copy(&interp->core_config, core_config) < 0) { return _Py_INIT_ERR("failed to copy core config"); } core_config = &interp->core_config; - if (_PyMainInterpreterConfig_Copy(&interp->config, config) < 0) { - return _Py_INIT_ERR("failed to copy main interpreter config"); - } err = _PyExc_Init(); if (_Py_INIT_FAILED(err)) { diff --git a/Python/pystate.c b/Python/pystate.c index 6fe3dd1ff3fa..a2464b6cf551 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -174,7 +174,6 @@ PyInterpreterState_New(void) interp->id_refcount = -1; interp->check_interval = 100; interp->core_config = _PyCoreConfig_INIT; - interp->config = _PyMainInterpreterConfig_INIT; interp->eval_frame = _PyEval_EvalFrameDefault; #ifdef HAVE_DLOPEN #if HAVE_DECL_RTLD_NOW @@ -221,7 +220,6 @@ PyInterpreterState_Clear(PyInterpreterState *interp) PyThreadState_Clear(p); HEAD_UNLOCK(); _PyCoreConfig_Clear(&interp->core_config); - _PyMainInterpreterConfig_Clear(&interp->config); Py_CLEAR(interp->codec_search_path); Py_CLEAR(interp->codec_search_cache); Py_CLEAR(interp->codec_error_registry); @@ -455,12 +453,6 @@ _PyInterpreterState_GetCoreConfig(PyInterpreterState *interp) return &interp->core_config; } -_PyMainInterpreterConfig * -_PyInterpreterState_GetMainConfig(PyInterpreterState *interp) -{ - return &interp->config; -} - PyObject * _PyInterpreterState_GetMainModule(PyInterpreterState *interp) { diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 12ec7d5918ed..1af11c4ab97c 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -17,6 +17,7 @@ Data members: #include "Python.h" #include "code.h" #include "frameobject.h" +#include "pycore_coreconfig.h" #include "pycore_pylifecycle.h" #include "pycore_pymem.h" #include "pycore_pathconfig.h" @@ -2530,26 +2531,71 @@ _PySys_InitCore(PyObject *sysdict) } \ } while (0) + +static int +sys_add_xoption(PyObject *opts, const wchar_t *s) +{ + PyObject *name, *value; + + const wchar_t *name_end = wcschr(s, L'='); + if (!name_end) { + name = PyUnicode_FromWideChar(s, -1); + value = Py_True; + Py_INCREF(value); + } + else { + name = PyUnicode_FromWideChar(s, name_end - s); + value = PyUnicode_FromWideChar(name_end + 1, -1); + } + if (name == NULL || value == NULL) { + goto error; + } + if (PyDict_SetItem(opts, name, value) < 0) { + goto error; + } + Py_DECREF(name); + Py_DECREF(value); + return 0; + +error: + Py_XDECREF(name); + Py_XDECREF(value); + return -1; +} + + +static PyObject* +sys_create_xoptions_dict(const _PyCoreConfig *config) +{ + Py_ssize_t nxoption = config->xoptions.length; + wchar_t * const * xoptions = config->xoptions.items; + PyObject *dict = PyDict_New(); + if (dict == NULL) { + return NULL; + } + + for (Py_ssize_t i=0; i < nxoption; i++) { + const wchar_t *option = xoptions[i]; + if (sys_add_xoption(dict, option) < 0) { + Py_DECREF(dict); + return NULL; + } + } + + return dict; +} + + int _PySys_InitMain(PyInterpreterState *interp) { PyObject *sysdict = interp->sysdict; - const _PyCoreConfig *core_config = &interp->core_config; - const _PyMainInterpreterConfig *config = &interp->config; + const _PyCoreConfig *config = &interp->core_config; int res; - /* _PyMainInterpreterConfig_Read() must set all these variables */ - assert(config->module_search_path != NULL); - assert(config->executable != NULL); - assert(config->prefix != NULL); - assert(config->base_prefix != NULL); - assert(config->exec_prefix != NULL); - assert(config->base_exec_prefix != NULL); - -#define COPY_LIST(KEY, ATTR) \ +#define COPY_LIST(KEY, VALUE) \ do { \ - assert(PyList_Check(ATTR)); \ - PyObject *list = PyList_GetSlice(ATTR, 0, PyList_GET_SIZE(ATTR)); \ + PyObject *list = _PyWstrList_AsList(&(VALUE)); \ if (list == NULL) { \ return -1; \ } \ @@ -2557,36 +2603,41 @@ _PySys_InitMain(PyInterpreterState *interp) Py_DECREF(list); \ } while (0) - COPY_LIST("path", config->module_search_path); +#define SET_SYS_FROM_WSTR(KEY, VALUE) \ + do { \ + PyObject *str = PyUnicode_FromWideChar(VALUE, -1); \ + if (str == NULL) { \ + return -1; \ + } \ + SET_SYS_FROM_STRING_BORROW(KEY, str); \ + Py_DECREF(str); \ + } while (0) - SET_SYS_FROM_STRING_BORROW("executable", config->executable); - SET_SYS_FROM_STRING_BORROW("prefix", config->prefix); - SET_SYS_FROM_STRING_BORROW("base_prefix", config->base_prefix); - SET_SYS_FROM_STRING_BORROW("exec_prefix", config->exec_prefix); - SET_SYS_FROM_STRING_BORROW("base_exec_prefix", config->base_exec_prefix); + COPY_LIST("path", config->module_search_paths); + + SET_SYS_FROM_WSTR("executable", config->executable); + SET_SYS_FROM_WSTR("prefix", config->prefix); + SET_SYS_FROM_WSTR("base_prefix", config->base_prefix); + SET_SYS_FROM_WSTR("exec_prefix", config->exec_prefix); + SET_SYS_FROM_WSTR("base_exec_prefix", config->base_exec_prefix); if (config->pycache_prefix != NULL) { - SET_SYS_FROM_STRING_BORROW("pycache_prefix", config->pycache_prefix); + SET_SYS_FROM_WSTR("pycache_prefix", config->pycache_prefix); } else { PyDict_SetItemString(sysdict, "pycache_prefix", Py_None); } - if (config->argv != NULL) { - SET_SYS_FROM_STRING_BORROW("argv", config->argv); - } - if (config->warnoptions != NULL) { - COPY_LIST("warnoptions", config->warnoptions); - } - if (config->xoptions != NULL) { - PyObject *dict = PyDict_Copy(config->xoptions); - if (dict == NULL) { - return -1; - } - SET_SYS_FROM_STRING_BORROW("_xoptions", dict); - Py_DECREF(dict); + COPY_LIST("argv", config->argv); + COPY_LIST("warnoptions", config->warnoptions); + + PyObject *xoptions = sys_create_xoptions_dict(config); + if (xoptions == NULL) { + return -1; } + SET_SYS_FROM_STRING_BORROW("_xoptions", xoptions); #undef COPY_LIST +#undef SET_SYS_FROM_WSTR /* Set flags to their final values */ SET_SYS_FROM_STRING_INT_RESULT("flags", make_flags()); @@ -2602,7 +2653,7 @@ _PySys_InitMain(PyInterpreterState *interp) } SET_SYS_FROM_STRING_INT_RESULT("dont_write_bytecode", - PyBool_FromLong(!core_config->write_bytecode)); + PyBool_FromLong(!config->write_bytecode)); if (get_warnoptions() == NULL) return -1; From webhook-mailer at python.org Tue Mar 26 21:04:20 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 27 Mar 2019 01:04:20 -0000 Subject: [Python-checkins] bpo-36444: Add _PyCoreConfig._init_main (GH-12572) Message-ID: https://github.com/python/cpython/commit/484f20d2ff95cc2e1bea759852da307bc1d1d944 commit: 484f20d2ff95cc2e1bea759852da307bc1d1d944 branch: master author: Victor Stinner committer: GitHub date: 2019-03-27T02:04:16+01:00 summary: bpo-36444: Add _PyCoreConfig._init_main (GH-12572) * Add _PyCoreConfig._init_main: if equals to zero, _Py_InitializeFromConfig() doesn't call _Py_InitializeMainInterpreter(). * Add interp_p parameter to _Py_InitializeFromConfig(). * pymain_init() now calls _Py_InitializeFromConfig(). * Make _Py_InitializeCore() private. files: M Include/cpython/coreconfig.h M Include/cpython/pylifecycle.h M Lib/test/test_embed.py M Modules/main.c M Programs/_freeze_importlib.c M Programs/_testembed.c M Python/coreconfig.c M Python/frozenmain.c M Python/pylifecycle.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index 827a19a145d0..53493ff85a37 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -365,6 +365,9 @@ typedef struct { If set to -1 (default), inherit Py_FrozenFlag value. */ int _frozen; + /* If non-zero, use "main" Python initialization */ + int _init_main; + } _PyCoreConfig; #ifdef MS_WINDOWS @@ -398,7 +401,8 @@ typedef struct { .buffered_stdio = -1, \ ._install_importlib = 1, \ ._check_hash_pycs_mode = "default", \ - ._frozen = -1} + ._frozen = -1, \ + ._init_main = 1} /* Note: _PyCoreConfig_INIT sets other fields to 0/NULL */ diff --git a/Include/cpython/pylifecycle.h b/Include/cpython/pylifecycle.h index 1db1d2167cb1..496dcb2c6043 100644 --- a/Include/cpython/pylifecycle.h +++ b/Include/cpython/pylifecycle.h @@ -20,9 +20,6 @@ PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromPreConfig( PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromConfig( const _PyCoreConfig *coreconfig); -PyAPI_FUNC(_PyInitError) _Py_InitializeCore( - const _PyCoreConfig *config, - PyInterpreterState **interp); PyAPI_FUNC(int) _Py_IsCoreInitialized(void); @@ -32,7 +29,8 @@ PyAPI_FUNC(_PyInitError) _Py_InitializeMainInterpreter( /* Initialization and finalization */ PyAPI_FUNC(_PyInitError) _Py_InitializeFromConfig( - const _PyCoreConfig *config); + const _PyCoreConfig *config, + PyInterpreterState **interp_p); PyAPI_FUNC(void) _Py_NO_RETURN _Py_ExitInitError(_PyInitError err); /* Py_PyAtExit is for the atexit module, Py_AtExit is for low-level diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index f5e3cef68a54..c63ea5a45e4b 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -338,6 +338,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): '_install_importlib': 1, '_check_hash_pycs_mode': 'default', '_frozen': 0, + '_init_main': 1, } if MS_WINDOWS: DEFAULT_PRE_CONFIG.update({ diff --git a/Modules/main.c b/Modules/main.c index 05b42cbc6c83..57d16093dcaa 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -53,19 +53,6 @@ pymain_init_preconfig(const _PyArgv *args) } -static _PyInitError -pymain_init_coreconfig(_PyCoreConfig *config, const _PyArgv *args, - PyInterpreterState **interp_p) -{ - _PyInitError err = _PyCoreConfig_Read(config, args); - if (_Py_INIT_FAILED(err)) { - return err; - } - - return _Py_InitializeCore(config, interp_p); -} - - static _PyInitError pymain_init(const _PyArgv *args, PyInterpreterState **interp_p) { @@ -91,18 +78,22 @@ pymain_init(const _PyArgv *args, PyInterpreterState **interp_p) } _PyCoreConfig config = _PyCoreConfig_INIT; - err = pymain_init_coreconfig(&config, args, interp_p); - _PyCoreConfig_Clear(&config); + + err = _PyCoreConfig_Read(&config, args); if (_Py_INIT_FAILED(err)) { - return err; + goto done; } - err = _Py_InitializeMainInterpreter(*interp_p); + err = _Py_InitializeFromConfig(&config, interp_p); if (_Py_INIT_FAILED(err)) { - return err; + goto done; } - return _Py_INIT_OK(); + err = _Py_INIT_OK(); + +done: + _PyCoreConfig_Clear(&config); + return err; } diff --git a/Programs/_freeze_importlib.c b/Programs/_freeze_importlib.c index 0818012d8c5a..774748dc0915 100644 --- a/Programs/_freeze_importlib.c +++ b/Programs/_freeze_importlib.c @@ -84,8 +84,9 @@ main(int argc, char *argv[]) /* Don't install importlib, since it could execute outdated bytecode. */ config._install_importlib = 0; config._frozen = 1; + config._init_main = 0; - _PyInitError err = _Py_InitializeFromConfig(&config); + _PyInitError err = _Py_InitializeFromConfig(&config, NULL); /* No need to call _PyCoreConfig_Clear() since we didn't allocate any memory: program_name is a constant string. */ if (_Py_INIT_FAILED(err)) { diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 76de8aab5ba6..70587990f8de 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -529,7 +529,7 @@ static int test_init_from_config(void) Py_FrozenFlag = 0; config._frozen = 1; - err = _Py_InitializeFromConfig(&config); + err = _Py_InitializeFromConfig(&config, NULL); /* Don't call _PyCoreConfig_Clear() since all strings are static */ if (_Py_INIT_FAILED(err)) { _Py_ExitInitError(err); @@ -638,7 +638,7 @@ static int test_init_isolated(void) config.program_name = L"./_testembed"; test_init_env_dev_mode_putenvs(); - err = _Py_InitializeFromConfig(&config); + err = _Py_InitializeFromConfig(&config, NULL); if (_Py_INIT_FAILED(err)) { _Py_ExitInitError(err); } @@ -669,7 +669,7 @@ static int test_preinit_isolated1(void) config.program_name = L"./_testembed"; test_init_env_dev_mode_putenvs(); - err = _Py_InitializeFromConfig(&config); + err = _Py_InitializeFromConfig(&config, NULL); if (_Py_INIT_FAILED(err)) { _Py_ExitInitError(err); } @@ -706,7 +706,7 @@ static int test_preinit_isolated2(void) config.program_name = L"./_testembed"; test_init_env_dev_mode_putenvs(); - err = _Py_InitializeFromConfig(&config); + err = _Py_InitializeFromConfig(&config, NULL); if (_Py_INIT_FAILED(err)) { _Py_ExitInitError(err); } @@ -723,7 +723,7 @@ static int test_init_dev_mode(void) putenv("PYTHONMALLOC="); config.dev_mode = 1; config.program_name = L"./_testembed"; - _PyInitError err = _Py_InitializeFromConfig(&config); + _PyInitError err = _Py_InitializeFromConfig(&config, NULL); if (_Py_INIT_FAILED(err)) { _Py_ExitInitError(err); } diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 944a9e22ca12..ecb22e5667d7 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -610,6 +610,7 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) COPY_WSTR_ATTR(run_filename); COPY_ATTR(_check_hash_pycs_mode); COPY_ATTR(_frozen); + COPY_ATTR(_init_main); #undef COPY_ATTR #undef COPY_STR_ATTR @@ -715,6 +716,7 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) SET_ITEM_INT(_install_importlib); SET_ITEM_STR(_check_hash_pycs_mode); SET_ITEM_INT(_frozen); + SET_ITEM_INT(_init_main); return dict; diff --git a/Python/frozenmain.c b/Python/frozenmain.c index 6554aa75b038..041b4670ca38 100644 --- a/Python/frozenmain.c +++ b/Python/frozenmain.c @@ -82,7 +82,7 @@ Py_FrozenMain(int argc, char **argv) if (argc >= 1) Py_SetProgramName(argv_copy[0]); - err = _Py_InitializeFromConfig(&config); + err = _Py_InitializeFromConfig(&config, NULL); /* No need to call _PyCoreConfig_Clear() since we didn't allocate any memory: program_name is a constant string. */ if (_Py_INIT_FAILED(err)) { diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index ca90e7238b66..f255fd9e132e 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -458,7 +458,7 @@ _Py_SetLocaleFromEnv(int category) /* Global initializations. Can be undone by Py_Finalize(). Don't call this twice without an intervening Py_Finalize() call. - Every call to _Py_InitializeCore, Py_Initialize or Py_InitializeEx + Every call to _Py_InitializeFromConfig, Py_Initialize or Py_InitializeEx must have a corresponding call to Py_Finalize. Locking: you must hold the interpreter lock while calling these APIs. @@ -832,7 +832,7 @@ pyinit_coreconfig(_PyCoreConfig *config, const _PyCoreConfig *src_config, * to the Python C API (unless the API is explicitly listed as being * safe to call without calling Py_Initialize first) */ -_PyInitError +static _PyInitError _Py_InitializeCore(const _PyCoreConfig *src_config, PyInterpreterState **interp_p) { @@ -981,7 +981,8 @@ _Py_InitializeMainInterpreter(PyInterpreterState *interp) #undef _INIT_DEBUG_PRINT _PyInitError -_Py_InitializeFromConfig(const _PyCoreConfig *config) +_Py_InitializeFromConfig(const _PyCoreConfig *config, + PyInterpreterState **interp_p) { PyInterpreterState *interp = NULL; _PyInitError err; @@ -989,12 +990,18 @@ _Py_InitializeFromConfig(const _PyCoreConfig *config) if (_Py_INIT_FAILED(err)) { return err; } + if (interp_p) { + *interp_p = interp; + } config = &interp->core_config; - err = _Py_InitializeMainInterpreter(interp); - if (_Py_INIT_FAILED(err)) { - return err; + if (config->_init_main) { + err = _Py_InitializeMainInterpreter(interp); + if (_Py_INIT_FAILED(err)) { + return err; + } } + return _Py_INIT_OK(); } @@ -1007,13 +1014,10 @@ Py_InitializeEx(int install_sigs) return; } - _PyInitError err; _PyCoreConfig config = _PyCoreConfig_INIT; config.install_signal_handlers = install_sigs; - err = _Py_InitializeFromConfig(&config); - _PyCoreConfig_Clear(&config); - + _PyInitError err = _Py_InitializeFromConfig(&config, NULL); if (_Py_INIT_FAILED(err)) { _Py_ExitInitError(err); } From webhook-mailer at python.org Tue Mar 26 21:17:54 2019 From: webhook-mailer at python.org (=?utf-8?q?=C3=89ric?= Araujo) Date: Wed, 27 Mar 2019 01:17:54 -0000 Subject: [Python-checkins] Minor doc improvement (GH-10341) Message-ID: https://github.com/python/cpython/commit/dfd775a0b1aee51d842b20cdebd97cc52c0b32e7 commit: dfd775a0b1aee51d842b20cdebd97cc52c0b32e7 branch: master author: Andre Delfino committer: ?ric Araujo date: 2019-03-26T21:17:50-04:00 summary: Minor doc improvement (GH-10341) Change "star-operator" to "* operator". files: M Doc/library/collections.rst M Doc/tutorial/controlflow.rst diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index 64de970fec94..8d53e6879ef8 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -971,7 +971,7 @@ function: >>> getattr(p, 'x') 11 -To convert a dictionary to a named tuple, use the double-star-operator +To convert a dictionary to a named tuple, use the ``**`` operator (as described in :ref:`tut-unpacking-arguments`): >>> d = {'x': 11, 'y': 22} diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst index 905734539c68..abf163d232c5 100644 --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -560,7 +560,7 @@ The reverse situation occurs when the arguments are already in a list or tuple but need to be unpacked for a function call requiring separate positional arguments. For instance, the built-in :func:`range` function expects separate *start* and *stop* arguments. If they are not available separately, write the -function call with the ``*``\ -operator to unpack the arguments out of a list +function call with the ``*`` operator to unpack the arguments out of a list or tuple:: >>> list(range(3, 6)) # normal call with separate arguments @@ -573,7 +573,7 @@ or tuple:: single: **; in function calls In the same fashion, dictionaries can deliver keyword arguments with the -``**``\ -operator:: +``**`` operator:: >>> def parrot(voltage, state='a stiff', action='voom'): ... print("-- This parrot wouldn't", action, end=' ') From webhook-mailer at python.org Tue Mar 26 21:21:30 2019 From: webhook-mailer at python.org (=?utf-8?q?=C3=89ric?= Araujo) Date: Wed, 27 Mar 2019 01:21:30 -0000 Subject: [Python-checkins] bpo-33832: Add "magic method" glossary entry (GH-7630) Message-ID: https://github.com/python/cpython/commit/f760610bddd7e8f8ac0914d5d59ef806bc16a73b commit: f760610bddd7e8f8ac0914d5d59ef806bc16a73b branch: master author: Andre Delfino committer: ?ric Araujo date: 2019-03-26T21:21:27-04:00 summary: bpo-33832: Add "magic method" glossary entry (GH-7630) files: A Misc/NEWS.d/next/Documentation/2018-06-15-15-57-37.bpo-33832.xBFhKw.rst M Doc/glossary.rst diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 31cdba2444be..5810a6b79978 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -663,6 +663,11 @@ Glossary :term:`finder`. See :pep:`302` for details and :class:`importlib.abc.Loader` for an :term:`abstract base class`. + magic method + .. index:: pair: magic; method + + An informal synonym for :term:`special method`. + mapping A container object that supports arbitrary key lookups and implements the methods specified in the :class:`~collections.abc.Mapping` or @@ -1004,6 +1009,8 @@ Glossary (subscript) notation uses :class:`slice` objects internally. special method + .. index:: pair: special; method + A method that is called implicitly by Python to execute a certain operation on a type, such as addition. Such methods have names starting and ending with double underscores. Special methods are documented in diff --git a/Misc/NEWS.d/next/Documentation/2018-06-15-15-57-37.bpo-33832.xBFhKw.rst b/Misc/NEWS.d/next/Documentation/2018-06-15-15-57-37.bpo-33832.xBFhKw.rst new file mode 100644 index 000000000000..3d1c63acca3b --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2018-06-15-15-57-37.bpo-33832.xBFhKw.rst @@ -0,0 +1 @@ +Add glossary entry for 'magic method'. From webhook-mailer at python.org Tue Mar 26 21:23:58 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 27 Mar 2019 01:23:58 -0000 Subject: [Python-checkins] Minor doc improvement (GH-10341) Message-ID: https://github.com/python/cpython/commit/e16599c48ce3b99e4c3aaf0cb053cd01b50e380f commit: e16599c48ce3b99e4c3aaf0cb053cd01b50e380f branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-26T18:23:54-07:00 summary: Minor doc improvement (GH-10341) Change "star-operator" to "* operator". (cherry picked from commit dfd775a0b1aee51d842b20cdebd97cc52c0b32e7) Co-authored-by: Andre Delfino files: M Doc/library/collections.rst M Doc/tutorial/controlflow.rst diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index 1616585b654b..9f47e8978da3 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -959,7 +959,7 @@ function: >>> getattr(p, 'x') 11 -To convert a dictionary to a named tuple, use the double-star-operator +To convert a dictionary to a named tuple, use the ``**`` operator (as described in :ref:`tut-unpacking-arguments`): >>> d = {'x': 11, 'y': 22} diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst index 905734539c68..abf163d232c5 100644 --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -560,7 +560,7 @@ The reverse situation occurs when the arguments are already in a list or tuple but need to be unpacked for a function call requiring separate positional arguments. For instance, the built-in :func:`range` function expects separate *start* and *stop* arguments. If they are not available separately, write the -function call with the ``*``\ -operator to unpack the arguments out of a list +function call with the ``*`` operator to unpack the arguments out of a list or tuple:: >>> list(range(3, 6)) # normal call with separate arguments @@ -573,7 +573,7 @@ or tuple:: single: **; in function calls In the same fashion, dictionaries can deliver keyword arguments with the -``**``\ -operator:: +``**`` operator:: >>> def parrot(voltage, state='a stiff', action='voom'): ... print("-- This parrot wouldn't", action, end=' ') From webhook-mailer at python.org Tue Mar 26 21:26:17 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 27 Mar 2019 01:26:17 -0000 Subject: [Python-checkins] bpo-33832: Add "magic method" glossary entry (GH-7630) Message-ID: https://github.com/python/cpython/commit/6cbb4c0795099b79f0a7c7d20df4ba1c1ec0ac24 commit: 6cbb4c0795099b79f0a7c7d20df4ba1c1ec0ac24 branch: 2.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-26T18:26:14-07:00 summary: bpo-33832: Add "magic method" glossary entry (GH-7630) (cherry picked from commit f760610bddd7e8f8ac0914d5d59ef806bc16a73b) Co-authored-by: Andre Delfino files: A Misc/NEWS.d/next/Documentation/2018-06-15-15-57-37.bpo-33832.xBFhKw.rst M Doc/glossary.rst diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 9e6bf233bbcf..43abf5047543 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -490,6 +490,11 @@ Glossary :meth:`load_module`. A loader is typically returned by a :term:`finder`. See :pep:`302` for details. + magic method + .. index:: pair: magic; method + + An informal synonym for :term:`special method`. + mapping A container object that supports arbitrary key lookups and implements the methods specified in the :class:`~collections.Mapping` or @@ -698,6 +703,8 @@ Glossary versions, :meth:`__getslice__` and :meth:`__setslice__`). special method + .. index:: pair: special; method + A method that is called implicitly by Python to execute a certain operation on a type, such as addition. Such methods have names starting and ending with double underscores. Special methods are documented in diff --git a/Misc/NEWS.d/next/Documentation/2018-06-15-15-57-37.bpo-33832.xBFhKw.rst b/Misc/NEWS.d/next/Documentation/2018-06-15-15-57-37.bpo-33832.xBFhKw.rst new file mode 100644 index 000000000000..3d1c63acca3b --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2018-06-15-15-57-37.bpo-33832.xBFhKw.rst @@ -0,0 +1 @@ +Add glossary entry for 'magic method'. From webhook-mailer at python.org Tue Mar 26 21:26:55 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 27 Mar 2019 01:26:55 -0000 Subject: [Python-checkins] bpo-33832: Add "magic method" glossary entry (GH-7630) Message-ID: https://github.com/python/cpython/commit/ead15795986972690217e52087eb946b8a5bbcda commit: ead15795986972690217e52087eb946b8a5bbcda branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-26T18:26:52-07:00 summary: bpo-33832: Add "magic method" glossary entry (GH-7630) (cherry picked from commit f760610bddd7e8f8ac0914d5d59ef806bc16a73b) Co-authored-by: Andre Delfino files: A Misc/NEWS.d/next/Documentation/2018-06-15-15-57-37.bpo-33832.xBFhKw.rst M Doc/glossary.rst diff --git a/Doc/glossary.rst b/Doc/glossary.rst index fb8ff2a7c656..472351b485ac 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -659,6 +659,11 @@ Glossary :term:`finder`. See :pep:`302` for details and :class:`importlib.abc.Loader` for an :term:`abstract base class`. + magic method + .. index:: pair: magic; method + + An informal synonym for :term:`special method`. + mapping A container object that supports arbitrary key lookups and implements the methods specified in the :class:`~collections.abc.Mapping` or @@ -1000,6 +1005,8 @@ Glossary (subscript) notation uses :class:`slice` objects internally. special method + .. index:: pair: special; method + A method that is called implicitly by Python to execute a certain operation on a type, such as addition. Such methods have names starting and ending with double underscores. Special methods are documented in diff --git a/Misc/NEWS.d/next/Documentation/2018-06-15-15-57-37.bpo-33832.xBFhKw.rst b/Misc/NEWS.d/next/Documentation/2018-06-15-15-57-37.bpo-33832.xBFhKw.rst new file mode 100644 index 000000000000..3d1c63acca3b --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2018-06-15-15-57-37.bpo-33832.xBFhKw.rst @@ -0,0 +1 @@ +Add glossary entry for 'magic method'. From webhook-mailer at python.org Wed Mar 27 01:59:03 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Wed, 27 Mar 2019 05:59:03 -0000 Subject: [Python-checkins] bpo-36407: Fix writing indentations of CDATA section (xml.dom.minidom). (GH-12514) Message-ID: https://github.com/python/cpython/commit/384b81d923addd52125e94470b11d2574ca266a9 commit: 384b81d923addd52125e94470b11d2574ca266a9 branch: master author: Vladimir Surjaninov committer: Serhiy Storchaka date: 2019-03-27T07:58:49+02:00 summary: bpo-36407: Fix writing indentations of CDATA section (xml.dom.minidom). (GH-12514) files: A Misc/NEWS.d/next/Library/2019-03-23-17-16-15.bpo-36407.LG3aC4.rst M Lib/test/test_minidom.py M Lib/xml/dom/minidom.py diff --git a/Lib/test/test_minidom.py b/Lib/test/test_minidom.py index f3ef958b5353..70965854ed1b 100644 --- a/Lib/test/test_minidom.py +++ b/Lib/test/test_minidom.py @@ -1631,5 +1631,21 @@ def test_toprettyxml_with_attributes_ordered(self): '\n' '\n') + def test_toprettyxml_with_cdata(self): + xml_str = ']]>' + doc = parseString(xml_str) + self.assertEqual(doc.toprettyxml(), + '\n' + '\n' + '\t]]>\n' + '\n') + + def test_cdata_parsing(self): + xml_str = ']]>' + dom1 = parseString(xml_str) + self.checkWholeText(dom1.getElementsByTagName('node')[0].firstChild, '') + dom2 = parseString(dom1.toprettyxml()) + self.checkWholeText(dom2.getElementsByTagName('node')[0].firstChild, '') + if __name__ == "__main__": unittest.main() diff --git a/Lib/xml/dom/minidom.py b/Lib/xml/dom/minidom.py index 43569ddcbeac..464420b76598 100644 --- a/Lib/xml/dom/minidom.py +++ b/Lib/xml/dom/minidom.py @@ -862,7 +862,8 @@ def writexml(self, writer, indent="", addindent="", newl=""): if self.childNodes: writer.write(">") if (len(self.childNodes) == 1 and - self.childNodes[0].nodeType == Node.TEXT_NODE): + self.childNodes[0].nodeType in ( + Node.TEXT_NODE, Node.CDATA_SECTION_NODE)): self.childNodes[0].writexml(writer, '', '', '') else: writer.write(newl) diff --git a/Misc/NEWS.d/next/Library/2019-03-23-17-16-15.bpo-36407.LG3aC4.rst b/Misc/NEWS.d/next/Library/2019-03-23-17-16-15.bpo-36407.LG3aC4.rst new file mode 100644 index 000000000000..3873329a51e1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-23-17-16-15.bpo-36407.LG3aC4.rst @@ -0,0 +1,2 @@ +Fixed wrong indentation writing for CDATA section in xml.dom.minidom. +Patch by Vladimir Surjaninov. From webhook-mailer at python.org Wed Mar 27 02:02:33 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Wed, 27 Mar 2019 06:02:33 -0000 Subject: [Python-checkins] bpo-36431: Use PEP 448 dict unpacking for merging two dicts. (GH-12553) Message-ID: https://github.com/python/cpython/commit/da0847048aa7f934573fa449cea8643def056aa5 commit: da0847048aa7f934573fa449cea8643def056aa5 branch: master author: Serhiy Storchaka committer: GitHub date: 2019-03-27T08:02:28+02:00 summary: bpo-36431: Use PEP 448 dict unpacking for merging two dicts. (GH-12553) files: M Lib/functools.py M Lib/idlelib/rpc.py M Lib/pdb.py M Lib/urllib/request.py M Lib/xml/etree/ElementTree.py M Lib/xml/sax/saxutils.py diff --git a/Lib/functools.py b/Lib/functools.py index fe47600caa1a..426653f13f6d 100644 --- a/Lib/functools.py +++ b/Lib/functools.py @@ -285,10 +285,7 @@ def __new__(*args, **keywords): if hasattr(func, "func"): args = func.args + args - tmpkw = func.keywords.copy() - tmpkw.update(keywords) - keywords = tmpkw - del tmpkw + keywords = {**func.keywords, **keywords} func = func.func self = super(partial, cls).__new__(cls) @@ -302,9 +299,8 @@ def __call__(*args, **keywords): if not args: raise TypeError("descriptor '__call__' of partial needs an argument") self, *args = args - newkeywords = self.keywords.copy() - newkeywords.update(keywords) - return self.func(*self.args, *args, **newkeywords) + keywords = {**self.keywords, **keywords} + return self.func(*self.args, *args, **keywords) @recursive_repr() def __repr__(self): @@ -371,8 +367,7 @@ def __init__(self, func, *args, **keywords): # it's also more efficient since only one function will be called self.func = func.func self.args = func.args + args - self.keywords = func.keywords.copy() - self.keywords.update(keywords) + self.keywords = {**func.keywords, **keywords} else: self.func = func self.args = args @@ -391,11 +386,9 @@ def __repr__(self): def _make_unbound_method(self): def _method(*args, **keywords): - call_keywords = self.keywords.copy() - call_keywords.update(keywords) - cls_or_self, *rest = args - call_args = (cls_or_self,) + self.args + tuple(rest) - return self.func(*call_args, **call_keywords) + cls_or_self, *args = args + keywords = {**self.keywords, **keywords} + return self.func(cls_or_self, *self.args, *args, **keywords) _method.__isabstractmethod__ = self.__isabstractmethod__ _method._partialmethod = self return _method diff --git a/Lib/idlelib/rpc.py b/Lib/idlelib/rpc.py index 9962477cc561..f035bde4a0a0 100644 --- a/Lib/idlelib/rpc.py +++ b/Lib/idlelib/rpc.py @@ -64,8 +64,7 @@ def dumps(obj, protocol=None): class CodePickler(pickle.Pickler): - dispatch_table = {types.CodeType: pickle_code} - dispatch_table.update(copyreg.dispatch_table) + dispatch_table = {types.CodeType: pickle_code, **copyreg.dispatch_table} BUFSIZE = 8*1024 diff --git a/Lib/pdb.py b/Lib/pdb.py index bf3219af3985..f5d33c27fc1d 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -491,8 +491,7 @@ def _complete_expression(self, text, line, begidx, endidx): # Collect globals and locals. It is usually not really sensible to also # complete builtins, and they clutter the namespace quite heavily, so we # leave them out. - ns = self.curframe.f_globals.copy() - ns.update(self.curframe_locals) + ns = {**self.curframe.f_globals, **self.curframe_locals} if '.' in text: # Walk an attribute chain up to the last part, similar to what # rlcompleter does. This will bail if any of the parts are not @@ -1377,8 +1376,7 @@ def do_interact(self, arg): Start an interactive interpreter whose global namespace contains all the (global and local) names found in the current scope. """ - ns = self.curframe.f_globals.copy() - ns.update(self.curframe_locals) + ns = {**self.curframe.f_globals, **self.curframe_locals} code.interact("*interactive*", local=ns) def do_alias(self, arg): diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index 9a3d399f0189..df2ff06f0fc9 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -426,8 +426,7 @@ def remove_header(self, header_name): self.unredirected_hdrs.pop(header_name, None) def header_items(self): - hdrs = self.unredirected_hdrs.copy() - hdrs.update(self.headers) + hdrs = {**self.unredirected_hdrs, **self.headers} return list(hdrs.items()) class OpenerDirector: diff --git a/Lib/xml/etree/ElementTree.py b/Lib/xml/etree/ElementTree.py index c1cf483cf56b..b5ad8e1d1406 100644 --- a/Lib/xml/etree/ElementTree.py +++ b/Lib/xml/etree/ElementTree.py @@ -169,10 +169,8 @@ def __init__(self, tag, attrib={}, **extra): if not isinstance(attrib, dict): raise TypeError("attrib must be dict, not %s" % ( attrib.__class__.__name__,)) - attrib = attrib.copy() - attrib.update(extra) self.tag = tag - self.attrib = attrib + self.attrib = {**attrib, **extra} self._children = [] def __repr__(self): @@ -451,8 +449,7 @@ def SubElement(parent, tag, attrib={}, **extra): additional attributes given as keyword arguments. """ - attrib = attrib.copy() - attrib.update(extra) + attrib = {**attrib, **extra} element = parent.makeelement(tag, attrib) parent.append(element) return element diff --git a/Lib/xml/sax/saxutils.py b/Lib/xml/sax/saxutils.py index a69c7f762175..b4fc2da76408 100644 --- a/Lib/xml/sax/saxutils.py +++ b/Lib/xml/sax/saxutils.py @@ -56,8 +56,7 @@ def quoteattr(data, entities={}): the optional entities parameter. The keys and values must all be strings; each key will be replaced with its corresponding value. """ - entities = entities.copy() - entities.update({'\n': ' ', '\r': ' ', '\t':' '}) + entities = {**entities, '\n': ' ', '\r': ' ', '\t':' '} data = escape(data, entities) if '"' in data: if "'" in data: From webhook-mailer at python.org Wed Mar 27 05:15:22 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Wed, 27 Mar 2019 09:15:22 -0000 Subject: [Python-checkins] bpo-32380: add "versionadded: 3.8" to singledispatchmethod (GH-12580) Message-ID: https://github.com/python/cpython/commit/bc284f0c7a9a7a9a4bf12c680823023a6770ce06 commit: bc284f0c7a9a7a9a4bf12c680823023a6770ce06 branch: master author: Inada Naoki committer: GitHub date: 2019-03-27T18:15:17+09:00 summary: bpo-32380: add "versionadded: 3.8" to singledispatchmethod (GH-12580) files: M Doc/library/functools.rst diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst index cd59e5bebfd5..16a779fa8368 100644 --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -474,6 +474,9 @@ The :mod:`functools` module defines the following functions: The same pattern can be used for other similar decorators: ``staticmethod``, ``abstractmethod``, and others. + .. versionadded:: 3.8 + + .. function:: update_wrapper(wrapper, wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES) Update a *wrapper* function to look like the *wrapped* function. The optional From webhook-mailer at python.org Wed Mar 27 06:10:36 2019 From: webhook-mailer at python.org (Julien Palard) Date: Wed, 27 Mar 2019 10:10:36 -0000 Subject: [Python-checkins] Doc: Fixed missing punctuation in datamodel.rst (GH-12581) Message-ID: https://github.com/python/cpython/commit/1fc5bf2ff27b898e8d9460d0fbc791e83009ed71 commit: 1fc5bf2ff27b898e8d9460d0fbc791e83009ed71 branch: master author: Jules Lasne (jlasne) committer: Julien Palard date: 2019-03-27T11:10:33+01:00 summary: Doc: Fixed missing punctuation in datamodel.rst (GH-12581) files: M Doc/reference/datamodel.rst diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index c3e79ce6c881..1683d25db924 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -475,13 +475,13 @@ Callable types | :attr:`__doc__` | The function's documentation | Writable | | | string, or ``None`` if | | | | unavailable; not inherited by | | - | | subclasses | | + | | subclasses. | | +-------------------------+-------------------------------+-----------+ - | :attr:`~definition.\ | The function's name | Writable | + | :attr:`~definition.\ | The function's name. | Writable | | __name__` | | | +-------------------------+-------------------------------+-----------+ | :attr:`~definition.\ | The function's | Writable | - | __qualname__` | :term:`qualified name` | | + | __qualname__` | :term:`qualified name`. | | | | | | | | .. versionadded:: 3.3 | | +-------------------------+-------------------------------+-----------+ @@ -493,7 +493,7 @@ Callable types | | argument values for those | | | | arguments that have defaults, | | | | or ``None`` if no arguments | | - | | have a default value | | + | | have a default value. | | +-------------------------+-------------------------------+-----------+ | :attr:`__code__` | The code object representing | Writable | | | the compiled function body. | | @@ -1857,11 +1857,11 @@ passed through to all metaclass operations described below. When a class definition is executed, the following steps occur: -* MRO entries are resolved -* the appropriate metaclass is determined -* the class namespace is prepared -* the class body is executed -* the class object is created +* MRO entries are resolved; +* the appropriate metaclass is determined; +* the class namespace is prepared; +* the class body is executed; +* the class object is created. Resolving MRO entries @@ -1885,11 +1885,11 @@ Determining the appropriate metaclass The appropriate metaclass for a class definition is determined as follows: -* if no bases and no explicit metaclass are given, then :func:`type` is used +* if no bases and no explicit metaclass are given, then :func:`type` is used; * if an explicit metaclass is given and it is *not* an instance of - :func:`type`, then it is used directly as the metaclass + :func:`type`, then it is used directly as the metaclass; * if an instance of :func:`type` is given as the explicit metaclass, or - bases are defined, then the most derived metaclass is used + bases are defined, then the most derived metaclass is used. The most derived metaclass is selected from the explicitly specified metaclass (if any) and the metaclasses (i.e. ``type(cls)``) of all specified @@ -1976,7 +1976,7 @@ invoked after creating the class object: * first, ``type.__new__`` collects all of the descriptors in the class namespace that define a :meth:`~object.__set_name__` method; * second, all of these ``__set_name__`` methods are called with the class - being defined and the assigned name of that particular descriptor; and + being defined and the assigned name of that particular descriptor; * finally, the :meth:`~object.__init_subclass__` hook is called on the immediate parent of the new class in its method resolution order. @@ -2048,7 +2048,7 @@ Emulating generic types ----------------------- One can implement the generic class syntax as specified by :pep:`484` -(for example ``List[int]``) by defining a special method +(for example ``List[int]``) by defining a special method: .. classmethod:: object.__class_getitem__(cls, key) From webhook-mailer at python.org Wed Mar 27 06:18:39 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 27 Mar 2019 10:18:39 -0000 Subject: [Python-checkins] Doc: Fixed missing punctuation in datamodel.rst (GH-12581) Message-ID: https://github.com/python/cpython/commit/101ddba62d91705149c73b2aad6aad3fe305d58f commit: 101ddba62d91705149c73b2aad6aad3fe305d58f branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-27T03:18:36-07:00 summary: Doc: Fixed missing punctuation in datamodel.rst (GH-12581) (cherry picked from commit 1fc5bf2ff27b898e8d9460d0fbc791e83009ed71) Co-authored-by: Jules Lasne (jlasne) files: M Doc/reference/datamodel.rst diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 22c9b4153e20..61a1bf425e53 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -475,13 +475,13 @@ Callable types | :attr:`__doc__` | The function's documentation | Writable | | | string, or ``None`` if | | | | unavailable; not inherited by | | - | | subclasses | | + | | subclasses. | | +-------------------------+-------------------------------+-----------+ - | :attr:`~definition.\ | The function's name | Writable | + | :attr:`~definition.\ | The function's name. | Writable | | __name__` | | | +-------------------------+-------------------------------+-----------+ | :attr:`~definition.\ | The function's | Writable | - | __qualname__` | :term:`qualified name` | | + | __qualname__` | :term:`qualified name`. | | | | | | | | .. versionadded:: 3.3 | | +-------------------------+-------------------------------+-----------+ @@ -493,7 +493,7 @@ Callable types | | argument values for those | | | | arguments that have defaults, | | | | or ``None`` if no arguments | | - | | have a default value | | + | | have a default value. | | +-------------------------+-------------------------------+-----------+ | :attr:`__code__` | The code object representing | Writable | | | the compiled function body. | | @@ -1861,11 +1861,11 @@ passed through to all metaclass operations described below. When a class definition is executed, the following steps occur: -* MRO entries are resolved -* the appropriate metaclass is determined -* the class namespace is prepared -* the class body is executed -* the class object is created +* MRO entries are resolved; +* the appropriate metaclass is determined; +* the class namespace is prepared; +* the class body is executed; +* the class object is created. Resolving MRO entries @@ -1889,11 +1889,11 @@ Determining the appropriate metaclass The appropriate metaclass for a class definition is determined as follows: -* if no bases and no explicit metaclass are given, then :func:`type` is used +* if no bases and no explicit metaclass are given, then :func:`type` is used; * if an explicit metaclass is given and it is *not* an instance of - :func:`type`, then it is used directly as the metaclass + :func:`type`, then it is used directly as the metaclass; * if an instance of :func:`type` is given as the explicit metaclass, or - bases are defined, then the most derived metaclass is used + bases are defined, then the most derived metaclass is used. The most derived metaclass is selected from the explicitly specified metaclass (if any) and the metaclasses (i.e. ``type(cls)``) of all specified @@ -1981,7 +1981,7 @@ invoked after creating the class object: * first, ``type.__new__`` collects all of the descriptors in the class namespace that define a :meth:`~object.__set_name__` method; * second, all of these ``__set_name__`` methods are called with the class - being defined and the assigned name of that particular descriptor; and + being defined and the assigned name of that particular descriptor; * finally, the :meth:`~object.__init_subclass__` hook is called on the immediate parent of the new class in its method resolution order. @@ -2053,7 +2053,7 @@ Emulating generic types ----------------------- One can implement the generic class syntax as specified by :pep:`484` -(for example ``List[int]``) by defining a special method +(for example ``List[int]``) by defining a special method: .. classmethod:: object.__class_getitem__(cls, key) From webhook-mailer at python.org Wed Mar 27 07:52:32 2019 From: webhook-mailer at python.org (Petr Viktorin) Date: Wed, 27 Mar 2019 11:52:32 -0000 Subject: [Python-checkins] bpo-35810: Incref heap-allocated types in PyObject_Init (GH-11661) Message-ID: https://github.com/python/cpython/commit/364f0b0f19cc3f0d5e63f571ec9163cf41c62958 commit: 364f0b0f19cc3f0d5e63f571ec9163cf41c62958 branch: master author: Eddie Elizondo committer: Petr Viktorin date: 2019-03-27T12:52:18+01:00 summary: bpo-35810: Incref heap-allocated types in PyObject_Init (GH-11661) * Incref heap-allocated types in PyObject_Init * Add documentation and porting notes to What's New files: A Misc/NEWS.d/next/C API/2019-01-23-12-38-11.bpo-35810.wpbWeb.rst M Doc/whatsnew/3.8.rst M Include/objimpl.h M Modules/_curses_panel.c M Modules/_tkinter.c M Objects/object.c M Objects/structseq.c M Objects/typeobject.c diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 6ab7991d8d4c..0ffbcab353ec 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -509,6 +509,12 @@ Build and C API Changes ``1`` for objects implementing ``__index__()``. (Contributed by Serhiy Storchaka in :issue:`36048`.) +* Heap-allocated type objects will now increase their reference count + in :c:func:`PyObject_Init` (and its parallel macro ``PyObject_INIT``) + instead of in :c:func:`PyType_GenericAlloc`. Types that modify instance + allocation or deallocation may need to be adjusted. + (Contributed by Eddie Elizondo in :issue:`35810`.) + Deprecated ========== @@ -732,6 +738,67 @@ Changes in the C API (Contributed by Inada Naoki in :issue:`36381`.) +Changes in the C API +-------------------------- + +* Instances of heap-allocated types (such as those created with + :c:func:`PyType_FromSpec`) hold a reference to their type object. + Increasing the reference count of these type objects has been moved from + :c:func:`PyType_GenericAlloc` to the more low-level functions, + :c:func:`PyObject_Init` and :c:func:`PyObject_INIT`. + This makes types created through :c:func:`PyType_FromSpec` behave like + other classes in managed code. + + Statically allocated types are not affected. + + For the vast majority of cases, there should be no side effect. + However, types that manually increase the reference count after allocating + an instance (perhaps to work around the bug) may now become immortal. + To avoid this, these classes need to call Py_DECREF on the type object + during instance deallocation. + + To correctly port these types into 3.8, please apply the following + changes: + + * Remove :c:macro:`Py_INCREF` on the type object after allocating an + instance - if any. + This may happen after calling :c:func:`PyObject_New`, + :c:func:`PyObject_NewVar`, :c:func:`PyObject_GC_New`, + :c:func:`PyObject_GC_NewVar`, or any other custom allocator that uses + :c:func:`PyObject_Init` or :c:func:`PyObject_INIT`. + + Example:: + + static foo_struct * + foo_new(PyObject *type) { + foo_struct *foo = PyObject_GC_New(foo_struct, (PyTypeObject *) type); + if (foo == NULL) + return NULL; + #if PY_VERSION_HEX < 0x03080000 + // Workaround for Python issue 35810; no longer necessary in Python 3.8 + PY_INCREF(type) + #endif + return foo; + } + + * Ensure that all custom ``tp_dealloc`` functions of heap-allocated types + decrease the type's reference count. + + Example:: + + static void + foo_dealloc(foo_struct *instance) { + PyObject *type = Py_TYPE(instance); + PyObject_GC_Del(instance); + #if PY_VERSION_HEX >= 0x03080000 + // This was not needed before Python 3.8 (Python issue 35810) + Py_DECREF(type); + #endif + } + + (Contributed by Eddie Elizondo in :issue:`35810`.) + + CPython bytecode changes ------------------------ diff --git a/Include/objimpl.h b/Include/objimpl.h index f475ed001d02..2337d8a56c77 100644 --- a/Include/objimpl.h +++ b/Include/objimpl.h @@ -138,6 +138,9 @@ _PyObject_INIT(PyObject *op, PyTypeObject *typeobj) { assert(op != NULL); Py_TYPE(op) = typeobj; + if (PyType_GetFlags(typeobj) & Py_TPFLAGS_HEAPTYPE) { + Py_INCREF(typeobj); + } _Py_NewReference(op); return op; } diff --git a/Misc/NEWS.d/next/C API/2019-01-23-12-38-11.bpo-35810.wpbWeb.rst b/Misc/NEWS.d/next/C API/2019-01-23-12-38-11.bpo-35810.wpbWeb.rst new file mode 100644 index 000000000000..47d25a5924c7 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2019-01-23-12-38-11.bpo-35810.wpbWeb.rst @@ -0,0 +1,4 @@ +Modify ``PyObject_Init`` to correctly increase the refcount of heap- +allocated Type objects. Also fix the refcounts of the heap-allocated types +that were either doing this manually or not decreasing the type's refcount +in tp_dealloc diff --git a/Modules/_curses_panel.c b/Modules/_curses_panel.c index e7bbefd50fdf..53849e3a29cc 100644 --- a/Modules/_curses_panel.c +++ b/Modules/_curses_panel.c @@ -250,7 +250,10 @@ PyCursesPanel_New(PANEL *pan, PyCursesWindowObject *wo) static void PyCursesPanel_Dealloc(PyCursesPanelObject *po) { - PyObject *obj = (PyObject *) panel_userptr(po->pan); + PyObject *tp, *obj; + + tp = (PyObject *) Py_TYPE(po); + obj = (PyObject *) panel_userptr(po->pan); if (obj) { (void)set_panel_userptr(po->pan, NULL); Py_DECREF(obj); @@ -261,6 +264,7 @@ PyCursesPanel_Dealloc(PyCursesPanelObject *po) remove_lop(po); } PyObject_DEL(po); + Py_DECREF(tp); } /* panel_above(NULL) returns the bottom panel in the stack. To get diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index a96924c9c6e7..613a95b08972 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -617,7 +617,6 @@ Tkapp_New(const char *screenName, const char *className, v = PyObject_New(TkappObject, (PyTypeObject *) Tkapp_Type); if (v == NULL) return NULL; - Py_INCREF(Tkapp_Type); v->interp = Tcl_CreateInterp(); v->wantobjects = wantobjects; @@ -802,7 +801,6 @@ newPyTclObject(Tcl_Obj *arg) self = PyObject_New(PyTclObject, (PyTypeObject *) PyTclObject_Type); if (self == NULL) return NULL; - Py_INCREF(PyTclObject_Type); Tcl_IncrRefCount(arg); self->value = arg; self->string = NULL; @@ -2722,7 +2720,6 @@ Tktt_New(PyObject *func) v = PyObject_New(TkttObject, (PyTypeObject *) Tktt_Type); if (v == NULL) return NULL; - Py_INCREF(Tktt_Type); Py_INCREF(func); v->token = NULL; diff --git a/Objects/object.c b/Objects/object.c index b446d598130a..bd44acacb615 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -230,6 +230,9 @@ PyObject_Init(PyObject *op, PyTypeObject *tp) return PyErr_NoMemory(); /* Any changes should be reflected in PyObject_INIT (objimpl.h) */ Py_TYPE(op) = tp; + if (PyType_GetFlags(tp) & Py_TPFLAGS_HEAPTYPE) { + Py_INCREF(tp); + } _Py_NewReference(op); return op; } @@ -240,9 +243,8 @@ PyObject_InitVar(PyVarObject *op, PyTypeObject *tp, Py_ssize_t size) if (op == NULL) return (PyVarObject *) PyErr_NoMemory(); /* Any changes should be reflected in PyObject_INIT_VAR */ - op->ob_size = size; - Py_TYPE(op) = tp; - _Py_NewReference((PyObject *)op); + Py_SIZE(op) = size; + PyObject_Init((PyObject *)op, tp); return op; } diff --git a/Objects/structseq.c b/Objects/structseq.c index cf36fa7f97c0..a5046c42cbc3 100644 --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -63,12 +63,17 @@ static void structseq_dealloc(PyStructSequence *obj) { Py_ssize_t i, size; + PyTypeObject *tp; + tp = (PyTypeObject *) Py_TYPE(obj); size = REAL_SIZE(obj); for (i = 0; i < size; ++i) { Py_XDECREF(obj->ob_item[i]); } PyObject_GC_Del(obj); + if (PyType_GetFlags(tp) & Py_TPFLAGS_HEAPTYPE) { + Py_DECREF(tp); + } } /*[clinic input] diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 403f3caaee6a..4c3909c098c4 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -987,9 +987,6 @@ PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems) memset(obj, '\0', size); - if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) - Py_INCREF(type); - if (type->tp_itemsize == 0) (void)PyObject_INIT(obj, type); else From webhook-mailer at python.org Wed Mar 27 08:40:21 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 27 Mar 2019 12:40:21 -0000 Subject: [Python-checkins] bpo-36444: Rework _Py_InitializeFromConfig() API (GH-12576) Message-ID: https://github.com/python/cpython/commit/5ac27a50ff2b42216746fedc0522a92c53089bb3 commit: 5ac27a50ff2b42216746fedc0522a92c53089bb3 branch: master author: Victor Stinner committer: GitHub date: 2019-03-27T13:40:14+01:00 summary: bpo-36444: Rework _Py_InitializeFromConfig() API (GH-12576) files: M Include/cpython/coreconfig.h M Include/cpython/pylifecycle.h M Include/internal/pycore_coreconfig.h M Include/internal/pycore_pylifecycle.h M Modules/main.c M Programs/_freeze_importlib.c M Programs/_testembed.c M Python/coreconfig.c M Python/frozenmain.c M Python/preconfig.c M Python/pylifecycle.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index 53493ff85a37..27ee1f4c63fd 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -5,16 +5,6 @@ extern "C" { #endif -/* --- _PyArgv ---------------------------------------------------- */ - -typedef struct { - int argc; - int use_bytes_argv; - char **bytes_argv; - wchar_t **wchar_argv; -} _PyArgv; - - /* --- _PyInitError ----------------------------------------------- */ typedef struct { diff --git a/Include/cpython/pylifecycle.h b/Include/cpython/pylifecycle.h index 496dcb2c6043..e293b04e3f19 100644 --- a/Include/cpython/pylifecycle.h +++ b/Include/cpython/pylifecycle.h @@ -14,23 +14,33 @@ PyAPI_FUNC(int) Py_SetStandardStreamEncoding(const char *encoding, /* PEP 432 Multi-phase initialization API (Private while provisional!) */ -PyAPI_FUNC(_PyInitError) _Py_PreInitialize(void); -PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromPreConfig( - const _PyPreConfig *preconfig); -PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromConfig( - const _PyCoreConfig *coreconfig); +PyAPI_FUNC(_PyInitError) _Py_PreInitialize( + const _PyPreConfig *src_config); +PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromArgs( + const _PyPreConfig *src_config, + int argc, + char **argv); +PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromWideArgs( + const _PyPreConfig *src_config, + int argc, + wchar_t **argv); PyAPI_FUNC(int) _Py_IsCoreInitialized(void); -PyAPI_FUNC(_PyInitError) _Py_InitializeMainInterpreter( - PyInterpreterState *interp); - /* Initialization and finalization */ PyAPI_FUNC(_PyInitError) _Py_InitializeFromConfig( + const _PyCoreConfig *config); +PyAPI_FUNC(_PyInitError) _Py_InitializeFromArgs( + const _PyCoreConfig *config, + int argc, + char **argv); +PyAPI_FUNC(_PyInitError) _Py_InitializeFromWideArgs( const _PyCoreConfig *config, - PyInterpreterState **interp_p); + int argc, + wchar_t **argv); + PyAPI_FUNC(void) _Py_NO_RETURN _Py_ExitInitError(_PyInitError err); /* Py_PyAtExit is for the atexit module, Py_AtExit is for low-level diff --git a/Include/internal/pycore_coreconfig.h b/Include/internal/pycore_coreconfig.h index c5f39bac9f83..3a27628aa740 100644 --- a/Include/internal/pycore_coreconfig.h +++ b/Include/internal/pycore_coreconfig.h @@ -9,34 +9,6 @@ extern "C" { #endif -/* --- _PyPreCmdline ------------------------------------------------- */ - -typedef struct { - _PyWstrList argv; - _PyWstrList xoptions; /* "-X value" option */ - int isolated; /* -I option */ - int use_environment; /* -E option */ - int dev_mode; /* -X dev and PYTHONDEVMODE */ -} _PyPreCmdline; - -#define _PyPreCmdline_INIT \ - (_PyPreCmdline){ \ - .use_environment = -1, \ - .isolated = -1, \ - .dev_mode = -1} -/* Note: _PyPreCmdline_INIT sets other fields to 0/NULL */ - -PyAPI_FUNC(void) _PyPreCmdline_Clear(_PyPreCmdline *cmdline); -PyAPI_FUNC(_PyInitError) _PyPreCmdline_SetArgv(_PyPreCmdline *cmdline, - const _PyArgv *args); -PyAPI_FUNC(int) _PyPreCmdline_SetCoreConfig( - const _PyPreCmdline *cmdline, - _PyCoreConfig *config); -PyAPI_FUNC(_PyInitError) _PyPreCmdline_Read(_PyPreCmdline *cmdline, - const _PyPreConfig *preconfig, - const _PyCoreConfig *coreconfig); - - /* --- _PyWstrList ------------------------------------------------ */ #ifndef NDEBUG @@ -54,15 +26,17 @@ PyAPI_FUNC(int) _PyWstrList_Extend(_PyWstrList *list, /* --- _PyArgv ---------------------------------------------------- */ +typedef struct { + int argc; + int use_bytes_argv; + char **bytes_argv; + wchar_t **wchar_argv; +} _PyArgv; + PyAPI_FUNC(_PyInitError) _PyArgv_AsWstrList(const _PyArgv *args, _PyWstrList *list); -/* --- Py_GetArgcArgv() helpers ----------------------------------- */ - -PyAPI_FUNC(void) _Py_ClearArgcArgv(void); - - /* --- Helper functions ------------------------------------------- */ PyAPI_FUNC(int) _Py_str_to_int( @@ -79,15 +53,47 @@ PyAPI_FUNC(void) _Py_get_env_flag( int *flag, const char *name); +/* Py_GetArgcArgv() helper */ +PyAPI_FUNC(void) _Py_ClearArgcArgv(void); + + +/* --- _PyPreCmdline ------------------------------------------------- */ + +typedef struct { + _PyWstrList argv; + _PyWstrList xoptions; /* "-X value" option */ + int isolated; /* -I option */ + int use_environment; /* -E option */ + int dev_mode; /* -X dev and PYTHONDEVMODE */ +} _PyPreCmdline; + +#define _PyPreCmdline_INIT \ + (_PyPreCmdline){ \ + .use_environment = -1, \ + .isolated = -1, \ + .dev_mode = -1} +/* Note: _PyPreCmdline_INIT sets other fields to 0/NULL */ + +PyAPI_FUNC(void) _PyPreCmdline_Clear(_PyPreCmdline *cmdline); +PyAPI_FUNC(_PyInitError) _PyPreCmdline_SetArgv(_PyPreCmdline *cmdline, + const _PyArgv *args); +PyAPI_FUNC(int) _PyPreCmdline_SetCoreConfig( + const _PyPreCmdline *cmdline, + _PyCoreConfig *config); +PyAPI_FUNC(_PyInitError) _PyPreCmdline_Read(_PyPreCmdline *cmdline, + const _PyPreConfig *preconfig); + + /* --- _PyPreConfig ----------------------------------------------- */ PyAPI_FUNC(void) _PyPreConfig_Clear(_PyPreConfig *config); PyAPI_FUNC(int) _PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2); PyAPI_FUNC(PyObject*) _PyPreConfig_AsDict(const _PyPreConfig *config); +PyAPI_FUNC(void) _PyCoreConfig_GetCoreConfig(_PyPreConfig *config, + const _PyCoreConfig *core_config); PyAPI_FUNC(_PyInitError) _PyPreConfig_Read(_PyPreConfig *config, - const _PyArgv *args, - const _PyCoreConfig *coreconfig); + const _PyArgv *args); PyAPI_FUNC(_PyInitError) _PyPreConfig_Write(_PyPreConfig *config); diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index 3214d6b06bd6..d837ea4fb33a 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -77,8 +77,8 @@ extern void _PyGILState_Fini(void); PyAPI_FUNC(void) _PyGC_DumpShutdownStats(void); -PyAPI_FUNC(_PyInitError) _Py_PreInitializeInPlace( - _PyPreConfig *config); +PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromCoreConfig( + const _PyCoreConfig *coreconfig); #ifdef __cplusplus } diff --git a/Modules/main.c b/Modules/main.c index 57d16093dcaa..ff79edbe43e0 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -34,27 +34,7 @@ extern "C" { /* --- pymain_init() ---------------------------------------------- */ static _PyInitError -pymain_init_preconfig(const _PyArgv *args) -{ - _PyInitError err; - - _PyPreConfig config = _PyPreConfig_INIT; - - err = _PyPreConfig_Read(&config, args, NULL); - if (_Py_INIT_FAILED(err)) { - goto done; - } - - err = _Py_PreInitializeInPlace(&config); - -done: - _PyPreConfig_Clear(&config); - return err; -} - - -static _PyInitError -pymain_init(const _PyArgv *args, PyInterpreterState **interp_p) +pymain_init(const _PyArgv *args) { _PyInitError err; @@ -72,28 +52,24 @@ pymain_init(const _PyArgv *args, PyInterpreterState **interp_p) fedisableexcept(FE_OVERFLOW); #endif - err = pymain_init_preconfig(args); - if (_Py_INIT_FAILED(err)) { - return err; - } - _PyCoreConfig config = _PyCoreConfig_INIT; - err = _PyCoreConfig_Read(&config, args); - if (_Py_INIT_FAILED(err)) { - goto done; + if (args->use_bytes_argv) { + err = _Py_PreInitializeFromArgs(NULL, args->argc, args->bytes_argv); + } + else { + err = _Py_PreInitializeFromWideArgs(NULL, args->argc, args->wchar_argv); } - - err = _Py_InitializeFromConfig(&config, interp_p); if (_Py_INIT_FAILED(err)) { - goto done; + return err; } - err = _Py_INIT_OK(); - -done: - _PyCoreConfig_Clear(&config); - return err; + if (args->use_bytes_argv) { + return _Py_InitializeFromArgs(&config, args->argc, args->bytes_argv); + } + else { + return _Py_InitializeFromWideArgs(&config, args->argc, args->wchar_argv); + } } @@ -468,9 +444,12 @@ pymain_repl(_PyCoreConfig *config, PyCompilerFlags *cf, int *exitcode) static _PyInitError -pymain_run_python(PyInterpreterState *interp, int *exitcode) +pymain_run_python(int *exitcode) { _PyInitError err; + + PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); + /* pymain_run_stdin() modify the config */ _PyCoreConfig *config = &interp->core_config; PyObject *main_importer_path = NULL; @@ -586,14 +565,13 @@ pymain_main(_PyArgv *args) { _PyInitError err; - PyInterpreterState *interp; - err = pymain_init(args, &interp); + err = pymain_init(args); if (_Py_INIT_FAILED(err)) { goto exit_init_error; } int exitcode = 0; - err = pymain_run_python(interp, &exitcode); + err = pymain_run_python(&exitcode); if (_Py_INIT_FAILED(err)) { goto exit_init_error; } diff --git a/Programs/_freeze_importlib.c b/Programs/_freeze_importlib.c index 774748dc0915..6f77e86a9e66 100644 --- a/Programs/_freeze_importlib.c +++ b/Programs/_freeze_importlib.c @@ -86,7 +86,7 @@ main(int argc, char *argv[]) config._frozen = 1; config._init_main = 0; - _PyInitError err = _Py_InitializeFromConfig(&config, NULL); + _PyInitError err = _Py_InitializeFromConfig(&config); /* No need to call _PyCoreConfig_Clear() since we didn't allocate any memory: program_name is a constant string. */ if (_Py_INIT_FAILED(err)) { diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 70587990f8de..425954cdd40b 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -408,7 +408,7 @@ static int test_init_from_config(void) Py_UTF8Mode = 0; preconfig.utf8_mode = 1; - err = _Py_PreInitializeFromPreConfig(&preconfig); + err = _Py_PreInitialize(&preconfig); if (_Py_INIT_FAILED(err)) { _Py_ExitInitError(err); } @@ -529,7 +529,7 @@ static int test_init_from_config(void) Py_FrozenFlag = 0; config._frozen = 1; - err = _Py_InitializeFromConfig(&config, NULL); + err = _Py_InitializeFromConfig(&config); /* Don't call _PyCoreConfig_Clear() since all strings are static */ if (_Py_INIT_FAILED(err)) { _Py_ExitInitError(err); @@ -623,7 +623,7 @@ static int test_init_isolated(void) preconfig.coerce_c_locale = 0; preconfig.utf8_mode = 0; - err = _Py_PreInitializeFromPreConfig(&preconfig); + err = _Py_PreInitialize(&preconfig); if (_Py_INIT_FAILED(err)) { _Py_ExitInitError(err); } @@ -638,7 +638,7 @@ static int test_init_isolated(void) config.program_name = L"./_testembed"; test_init_env_dev_mode_putenvs(); - err = _Py_InitializeFromConfig(&config, NULL); + err = _Py_InitializeFromConfig(&config); if (_Py_INIT_FAILED(err)) { _Py_ExitInitError(err); } @@ -660,7 +660,7 @@ static int test_preinit_isolated1(void) preconfig.utf8_mode = 0; preconfig.isolated = 1; - err = _Py_PreInitializeFromPreConfig(&preconfig); + err = _Py_PreInitialize(&preconfig); if (_Py_INIT_FAILED(err)) { _Py_ExitInitError(err); } @@ -669,7 +669,7 @@ static int test_preinit_isolated1(void) config.program_name = L"./_testembed"; test_init_env_dev_mode_putenvs(); - err = _Py_InitializeFromConfig(&config, NULL); + err = _Py_InitializeFromConfig(&config); if (_Py_INIT_FAILED(err)) { _Py_ExitInitError(err); } @@ -691,7 +691,7 @@ static int test_preinit_isolated2(void) preconfig.utf8_mode = 0; preconfig.isolated = 0; - err = _Py_PreInitializeFromPreConfig(&preconfig); + err = _Py_PreInitialize(&preconfig); if (_Py_INIT_FAILED(err)) { _Py_ExitInitError(err); } @@ -706,7 +706,7 @@ static int test_preinit_isolated2(void) config.program_name = L"./_testembed"; test_init_env_dev_mode_putenvs(); - err = _Py_InitializeFromConfig(&config, NULL); + err = _Py_InitializeFromConfig(&config); if (_Py_INIT_FAILED(err)) { _Py_ExitInitError(err); } @@ -723,7 +723,7 @@ static int test_init_dev_mode(void) putenv("PYTHONMALLOC="); config.dev_mode = 1; config.program_name = L"./_testembed"; - _PyInitError err = _Py_InitializeFromConfig(&config, NULL); + _PyInitError err = _Py_InitializeFromConfig(&config); if (_Py_INIT_FAILED(err)) { _Py_ExitInitError(err); } diff --git a/Python/coreconfig.c b/Python/coreconfig.c index ecb22e5667d7..13aa2272011f 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -1465,12 +1465,7 @@ static _PyInitError config_read(_PyCoreConfig *config, _PyPreCmdline *cmdline) { _PyInitError err; - const _PyPreConfig *preconfig = &_PyRuntime.preconfig; - err = _PyPreCmdline_Read(cmdline, preconfig, config); - if (_Py_INIT_FAILED(err)) { - return err; - } if (_PyPreCmdline_SetCoreConfig(cmdline, config) < 0) { return _Py_INIT_NO_MEMORY(); @@ -2016,6 +2011,35 @@ config_usage(int error, const wchar_t* program) } +static _PyInitError +core_read_precmdline(_PyCoreConfig *config, const _PyArgv *args, + _PyPreCmdline *precmdline) +{ + _PyInitError err; + + if (args) { + err = _PyPreCmdline_SetArgv(precmdline, args); + if (_Py_INIT_FAILED(err)) { + return err; + } + } + + _PyPreConfig preconfig = _PyPreConfig_INIT; + if (_PyPreConfig_Copy(&preconfig, &_PyRuntime.preconfig) < 0) { + err = _Py_INIT_NO_MEMORY(); + goto done; + } + + _PyCoreConfig_GetCoreConfig(&preconfig, config); + + err = _PyPreCmdline_Read(precmdline, &preconfig); + +done: + _PyPreConfig_Clear(&preconfig); + return err; +} + + /* Read the configuration into _PyCoreConfig from: * Command line arguments @@ -2026,7 +2050,7 @@ _PyCoreConfig_Read(_PyCoreConfig *config, const _PyArgv *args) { _PyInitError err; - err = _Py_PreInitializeFromConfig(config); + err = _Py_PreInitializeFromCoreConfig(config); if (_Py_INIT_FAILED(err)) { return err; } @@ -2034,11 +2058,9 @@ _PyCoreConfig_Read(_PyCoreConfig *config, const _PyArgv *args) _PyCoreConfig_GetGlobalConfig(config); _PyPreCmdline precmdline = _PyPreCmdline_INIT; - if (args) { - err = _PyPreCmdline_SetArgv(&precmdline, args); - if (_Py_INIT_FAILED(err)) { - goto done; - } + err = core_read_precmdline(config, args, &precmdline); + if (_Py_INIT_FAILED(err)) { + goto done; } if (config->program == NULL) { @@ -2048,12 +2070,6 @@ _PyCoreConfig_Read(_PyCoreConfig *config, const _PyArgv *args) } } - const _PyPreConfig *preconfig = &_PyRuntime.preconfig; - err = _PyPreCmdline_Read(&precmdline, preconfig, config); - if (_Py_INIT_FAILED(err)) { - goto done; - } - _PyCmdline cmdline; memset(&cmdline, 0, sizeof(cmdline)); diff --git a/Python/frozenmain.c b/Python/frozenmain.c index 041b4670ca38..6554aa75b038 100644 --- a/Python/frozenmain.c +++ b/Python/frozenmain.c @@ -82,7 +82,7 @@ Py_FrozenMain(int argc, char **argv) if (argc >= 1) Py_SetProgramName(argv_copy[0]); - err = _Py_InitializeFromConfig(&config, NULL); + err = _Py_InitializeFromConfig(&config); /* No need to call _PyCoreConfig_Clear() since we didn't allocate any memory: program_name is a constant string. */ if (_Py_INIT_FAILED(err)) { diff --git a/Python/preconfig.c b/Python/preconfig.c index ce63ef0777aa..011ed53a8e73 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -148,22 +148,6 @@ _PyPreCmdline_SetPreConfig(const _PyPreCmdline *cmdline, _PyPreConfig *config) } -static void -_PyPreCmdline_GetCoreConfig(_PyPreCmdline *cmdline, const _PyCoreConfig *config) -{ -#define COPY_ATTR(ATTR) \ - if (config->ATTR != -1) { \ - cmdline->ATTR = config->ATTR; \ - } - - COPY_ATTR(isolated); - COPY_ATTR(use_environment); - COPY_ATTR(dev_mode); - -#undef COPY_ATTR -} - - int _PyPreCmdline_SetCoreConfig(const _PyPreCmdline *cmdline, _PyCoreConfig *config) { @@ -231,17 +215,12 @@ precmdline_parse_cmdline(_PyPreCmdline *cmdline) _PyInitError _PyPreCmdline_Read(_PyPreCmdline *cmdline, - const _PyPreConfig *preconfig, - const _PyCoreConfig *coreconfig) + const _PyPreConfig *preconfig) { if (preconfig) { _PyPreCmdline_GetPreConfig(cmdline, preconfig); } - if (coreconfig) { - _PyPreCmdline_GetCoreConfig(cmdline, coreconfig); - } - _PyInitError err = precmdline_parse_cmdline(cmdline); if (_Py_INIT_FAILED(err)) { return err; @@ -373,6 +352,23 @@ _PyPreConfig_AsDict(const _PyPreConfig *config) } +void +_PyCoreConfig_GetCoreConfig(_PyPreConfig *config, + const _PyCoreConfig *core_config) +{ +#define COPY_ATTR(ATTR) \ + if (core_config->ATTR != -1) { \ + config->ATTR = core_config->ATTR; \ + } + + COPY_ATTR(isolated); + COPY_ATTR(use_environment); + COPY_ATTR(dev_mode); + +#undef COPY_ATTR +} + + static void _PyPreConfig_GetGlobalConfig(_PyPreConfig *config) { @@ -640,12 +636,11 @@ preconfig_init_allocator(_PyPreConfig *config) static _PyInitError -preconfig_read(_PyPreConfig *config, _PyPreCmdline *cmdline, - const _PyCoreConfig *coreconfig) +preconfig_read(_PyPreConfig *config, _PyPreCmdline *cmdline) { _PyInitError err; - err = _PyPreCmdline_Read(cmdline, config, coreconfig); + err = _PyPreCmdline_Read(cmdline, config); if (_Py_INIT_FAILED(err)) { return err; } @@ -692,8 +687,7 @@ preconfig_read(_PyPreConfig *config, _PyPreCmdline *cmdline, - Py_xxx global configuration variables - the LC_CTYPE locale */ _PyInitError -_PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args, - const _PyCoreConfig *coreconfig) +_PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args) { _PyInitError err; @@ -756,7 +750,7 @@ _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args, Py_LegacyWindowsFSEncodingFlag = config->legacy_windows_fs_encoding; #endif - err = preconfig_read(config, &cmdline, coreconfig); + err = preconfig_read(config, &cmdline); if (_Py_INIT_FAILED(err)) { goto done; } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index f255fd9e132e..7c6948e6bdb1 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -718,40 +718,35 @@ _Py_InitializeCore_impl(PyInterpreterState **interp_p, static _PyInitError -pyinit_preinit(_PyPreConfig *config, - const _PyPreConfig *src_config, - const _PyCoreConfig *coreconfig) +preinit(const _PyPreConfig *src_config, const _PyArgv *args) { _PyInitError err; - _PyPreConfig local_config = _PyPreConfig_INIT; - if (!config) { - config = &local_config; - } err = _PyRuntime_Initialize(); if (_Py_INIT_FAILED(err)) { - goto done; + return err; } if (_PyRuntime.pre_initialized) { /* If it's already configured: ignored the new configuration */ - err = _Py_INIT_OK(); - goto done; + return _Py_INIT_OK(); } + _PyPreConfig config = _PyPreConfig_INIT; + if (src_config) { - if (_PyPreConfig_Copy(config, src_config) < 0) { - err = _Py_INIT_ERR("failed to copy pre config"); + if (_PyPreConfig_Copy(&config, src_config) < 0) { + err = _Py_INIT_NO_MEMORY(); goto done; } } - err = _PyPreConfig_Read(config, NULL, coreconfig); + err = _PyPreConfig_Read(&config, args); if (_Py_INIT_FAILED(err)) { goto done; } - err = _PyPreConfig_Write(config); + err = _PyPreConfig_Write(&config); if (_Py_INIT_FAILED(err)) { goto done; } @@ -760,48 +755,55 @@ pyinit_preinit(_PyPreConfig *config, err = _Py_INIT_OK(); done: - _PyPreConfig_Clear(&local_config); + _PyPreConfig_Clear(&config); return err; } - _PyInitError -_Py_PreInitialize(void) +_Py_PreInitializeFromArgs(const _PyPreConfig *src_config, int argc, char **argv) { - return pyinit_preinit(NULL, NULL, NULL); + _PyArgv args = {.use_bytes_argv = 1, .argc = argc, .bytes_argv = argv}; + return preinit(src_config, &args); } _PyInitError -_Py_PreInitializeFromPreConfig(const _PyPreConfig *src_config) +_Py_PreInitializeFromWideArgs(const _PyPreConfig *src_config, int argc, wchar_t **argv) { - return pyinit_preinit(NULL, src_config, NULL); + _PyArgv args = {.use_bytes_argv = 0, .argc = argc, .wchar_argv = argv}; + return preinit(src_config, &args); } _PyInitError -_Py_PreInitializeInPlace(_PyPreConfig *config) +_Py_PreInitialize(const _PyPreConfig *src_config) { - return pyinit_preinit(config, NULL, NULL); + return preinit(src_config, NULL); } _PyInitError -_Py_PreInitializeFromConfig(const _PyCoreConfig *coreconfig) +_Py_PreInitializeFromCoreConfig(const _PyCoreConfig *coreconfig) { - return pyinit_preinit(NULL, NULL, coreconfig); + _PyPreConfig config = _PyPreConfig_INIT; + _PyCoreConfig_GetCoreConfig(&config, coreconfig); + return _Py_PreInitialize(&config); + /* No need to clear config: + _PyCoreConfig_GetCoreConfig() doesn't allocate memory */ } static _PyInitError -pyinit_coreconfig(_PyCoreConfig *config, const _PyCoreConfig *src_config, +pyinit_coreconfig(_PyCoreConfig *config, + const _PyCoreConfig *src_config, + const _PyArgv *args, PyInterpreterState **interp_p) { if (_PyCoreConfig_Copy(config, src_config) < 0) { return _Py_INIT_ERR("failed to copy core config"); } - _PyInitError err = _PyCoreConfig_Read(config, NULL); + _PyInitError err = _PyCoreConfig_Read(config, args); if (_Py_INIT_FAILED(err)) { return err; } @@ -834,21 +836,23 @@ pyinit_coreconfig(_PyCoreConfig *config, const _PyCoreConfig *src_config, */ static _PyInitError _Py_InitializeCore(const _PyCoreConfig *src_config, + const _PyArgv *args, PyInterpreterState **interp_p) { assert(src_config != NULL); - _PyInitError err = _Py_PreInitializeFromConfig(src_config); + _PyInitError err = _Py_PreInitializeFromCoreConfig(src_config); if (_Py_INIT_FAILED(err)) { return err; } _PyCoreConfig local_config = _PyCoreConfig_INIT; - err = pyinit_coreconfig(&local_config, src_config, interp_p); + err = pyinit_coreconfig(&local_config, src_config, args, interp_p); _PyCoreConfig_Clear(&local_config); return err; } + /* Py_Initialize() has already been called: update the main interpreter configuration. Example of bpo-34008: Py_Main() called after Py_Initialize(). */ @@ -881,7 +885,7 @@ _Py_ReconfigureMainInterpreter(PyInterpreterState *interp) * Other errors should be reported as normal Python exceptions with a * non-zero return code. */ -_PyInitError +static _PyInitError _Py_InitializeMainInterpreter(PyInterpreterState *interp) { if (!_PyRuntime.core_initialized) { @@ -980,19 +984,15 @@ _Py_InitializeMainInterpreter(PyInterpreterState *interp) #undef _INIT_DEBUG_PRINT -_PyInitError -_Py_InitializeFromConfig(const _PyCoreConfig *config, - PyInterpreterState **interp_p) +static _PyInitError +init_python(const _PyCoreConfig *config, const _PyArgv *args) { PyInterpreterState *interp = NULL; _PyInitError err; - err = _Py_InitializeCore(config, &interp); + err = _Py_InitializeCore(config, args, &interp); if (_Py_INIT_FAILED(err)) { return err; } - if (interp_p) { - *interp_p = interp; - } config = &interp->core_config; if (config->_init_main) { @@ -1006,6 +1006,29 @@ _Py_InitializeFromConfig(const _PyCoreConfig *config, } +_PyInitError +_Py_InitializeFromArgs(const _PyCoreConfig *config, int argc, char **argv) +{ + _PyArgv args = {.use_bytes_argv = 1, .argc = argc, .bytes_argv = argv}; + return init_python(config, &args); +} + + +_PyInitError +_Py_InitializeFromWideArgs(const _PyCoreConfig *config, int argc, wchar_t **argv) +{ + _PyArgv args = {.use_bytes_argv = 0, .argc = argc, .wchar_argv = argv}; + return init_python(config, &args); +} + + +_PyInitError +_Py_InitializeFromConfig(const _PyCoreConfig *config) +{ + return init_python(config, NULL); +} + + void Py_InitializeEx(int install_sigs) { @@ -1017,7 +1040,7 @@ Py_InitializeEx(int install_sigs) _PyCoreConfig config = _PyCoreConfig_INIT; config.install_signal_handlers = install_sigs; - _PyInitError err = _Py_InitializeFromConfig(&config, NULL); + _PyInitError err = _Py_InitializeFromConfig(&config); if (_Py_INIT_FAILED(err)) { _Py_ExitInitError(err); } From webhook-mailer at python.org Wed Mar 27 08:43:53 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 27 Mar 2019 12:43:53 -0000 Subject: [Python-checkins] bpo-36447, bpo-36447: Fix refleak in _PySys_InitMain() (GH-12586) Message-ID: https://github.com/python/cpython/commit/34ef64fe5947bd7e1b075c785fc1125c4e600cd4 commit: 34ef64fe5947bd7e1b075c785fc1125c4e600cd4 branch: master author: Pablo Galindo committer: Victor Stinner date: 2019-03-27T13:43:47+01:00 summary: bpo-36447, bpo-36447: Fix refleak in _PySys_InitMain() (GH-12586) Fix refleak in sysmodule.c when calling SET_SYS_FROM_STRING_BORROW. files: M Python/sysmodule.c diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 1af11c4ab97c..3de94e8468be 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -2635,6 +2635,7 @@ _PySys_InitMain(PyInterpreterState *interp) return -1; } SET_SYS_FROM_STRING_BORROW("_xoptions", xoptions); + Py_DECREF(xoptions); #undef COPY_LIST #undef SET_SYS_FROM_WSTR From webhook-mailer at python.org Wed Mar 27 11:11:23 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 27 Mar 2019 15:11:23 -0000 Subject: [Python-checkins] bpo-31904: Fix test_utf8_mode on VxWorks (GH-12428) Message-ID: https://github.com/python/cpython/commit/f4333d0479d6974d142e858522e95cbf8381f016 commit: f4333d0479d6974d142e858522e95cbf8381f016 branch: master author: hliu0 committer: Victor Stinner date: 2019-03-27T16:11:12+01:00 summary: bpo-31904: Fix test_utf8_mode on VxWorks (GH-12428) Python always use UTF-8 on VxWorks. files: A Misc/NEWS.d/next/Tests/2019-03-19-17-39-25.bpo-31904.QxhhRx.rst M Lib/test/test_utf8_mode.py diff --git a/Lib/test/test_utf8_mode.py b/Lib/test/test_utf8_mode.py index 220ff34a1189..2429b00459be 100644 --- a/Lib/test/test_utf8_mode.py +++ b/Lib/test/test_utf8_mode.py @@ -12,7 +12,7 @@ MS_WINDOWS = (sys.platform == 'win32') POSIX_LOCALES = ('C', 'POSIX') - +VXWORKS = (sys.platform == "vxworks") class UTF8ModeTests(unittest.TestCase): DEFAULT_ENV = { @@ -225,7 +225,7 @@ def check(utf8_opt, expected, **kw): with self.subTest(LC_ALL=loc): check('utf8', [arg_utf8], LC_ALL=loc) - if sys.platform == 'darwin' or support.is_android: + if sys.platform == 'darwin' or support.is_android or VXWORKS: c_arg = arg_utf8 elif sys.platform.startswith("aix"): c_arg = arg.decode('iso-8859-1') diff --git a/Misc/NEWS.d/next/Tests/2019-03-19-17-39-25.bpo-31904.QxhhRx.rst b/Misc/NEWS.d/next/Tests/2019-03-19-17-39-25.bpo-31904.QxhhRx.rst new file mode 100644 index 000000000000..95771508619e --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-03-19-17-39-25.bpo-31904.QxhhRx.rst @@ -0,0 +1 @@ +Fix test_utf8_mode on VxWorks: Python always use UTF-8 on VxWorks. From webhook-mailer at python.org Wed Mar 27 11:14:59 2019 From: webhook-mailer at python.org (Steve Dower) Date: Wed, 27 Mar 2019 15:14:59 -0000 Subject: [Python-checkins] bpo-36441: Fixes creating a venv when debug binaries are installed. (#12566) Message-ID: https://github.com/python/cpython/commit/4a9a505d6f2474a570422dad89f8d1b344d6cd36 commit: 4a9a505d6f2474a570422dad89f8d1b344d6cd36 branch: master author: Steve Dower committer: GitHub date: 2019-03-27T08:14:53-07:00 summary: bpo-36441: Fixes creating a venv when debug binaries are installed. (#12566) files: A Misc/NEWS.d/next/Windows/2019-03-26-11-46-15.bpo-36441.lYjGF1.rst M Lib/venv/__init__.py M Tools/msi/lib/lib_files.wxs diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py index 5e6d375e95a7..4a49b240b8e2 100644 --- a/Lib/venv/__init__.py +++ b/Lib/venv/__init__.py @@ -195,6 +195,9 @@ def symlink_or_copy(self, src, dst, relative_symlinks_ok=False): src = os.path.join(os.path.dirname(src), basename + ext) else: src = srcfn + if not os.path.exists(src): + logger.warning('Unable to copy %r', src) + return shutil.copyfile(src, dst) diff --git a/Misc/NEWS.d/next/Windows/2019-03-26-11-46-15.bpo-36441.lYjGF1.rst b/Misc/NEWS.d/next/Windows/2019-03-26-11-46-15.bpo-36441.lYjGF1.rst new file mode 100644 index 000000000000..b27abff62098 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-03-26-11-46-15.bpo-36441.lYjGF1.rst @@ -0,0 +1 @@ +Fixes creating a venv when debug binaries are installed. diff --git a/Tools/msi/lib/lib_files.wxs b/Tools/msi/lib/lib_files.wxs index a9952bdac4db..251f9b1aeb86 100644 --- a/Tools/msi/lib/lib_files.wxs +++ b/Tools/msi/lib/lib_files.wxs @@ -69,6 +69,15 @@ + + + + + + + + + @@ -87,6 +96,12 @@ + + + + + + From webhook-mailer at python.org Wed Mar 27 11:48:00 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 27 Mar 2019 15:48:00 -0000 Subject: [Python-checkins] bpo-36441: Fixes creating a venv when debug binaries are installed. (GH-12566) Message-ID: https://github.com/python/cpython/commit/65445f65e6080310d612f73083ba172eb2c6e326 commit: 65445f65e6080310d612f73083ba172eb2c6e326 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-27T08:47:57-07:00 summary: bpo-36441: Fixes creating a venv when debug binaries are installed. (GH-12566) (cherry picked from commit 4a9a505d6f2474a570422dad89f8d1b344d6cd36) Co-authored-by: Steve Dower files: A Misc/NEWS.d/next/Windows/2019-03-26-11-46-15.bpo-36441.lYjGF1.rst M Lib/venv/__init__.py M Tools/msi/lib/lib_files.wxs diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py index 4fbd954f200d..7836dfba04ca 100644 --- a/Lib/venv/__init__.py +++ b/Lib/venv/__init__.py @@ -193,6 +193,9 @@ def symlink_or_copy(self, src, dst, relative_symlinks_ok=False): src = os.path.join(os.path.dirname(src), basename + ext) else: src = srcfn + if not os.path.exists(src): + logger.warning('Unable to copy %r', src) + return shutil.copyfile(src, dst) diff --git a/Misc/NEWS.d/next/Windows/2019-03-26-11-46-15.bpo-36441.lYjGF1.rst b/Misc/NEWS.d/next/Windows/2019-03-26-11-46-15.bpo-36441.lYjGF1.rst new file mode 100644 index 000000000000..b27abff62098 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-03-26-11-46-15.bpo-36441.lYjGF1.rst @@ -0,0 +1 @@ +Fixes creating a venv when debug binaries are installed. diff --git a/Tools/msi/lib/lib_files.wxs b/Tools/msi/lib/lib_files.wxs index a9952bdac4db..251f9b1aeb86 100644 --- a/Tools/msi/lib/lib_files.wxs +++ b/Tools/msi/lib/lib_files.wxs @@ -69,6 +69,15 @@ + + + + + + + + + @@ -87,6 +96,12 @@ + + + + + + From webhook-mailer at python.org Wed Mar 27 13:29:08 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 27 Mar 2019 17:29:08 -0000 Subject: [Python-checkins] bpo-36443: Disable C locale coercion and UTF-8 Mode by default (GH-12589) Message-ID: https://github.com/python/cpython/commit/d929f1838a8fba881ff0148b7fc31f6265703e3d commit: d929f1838a8fba881ff0148b7fc31f6265703e3d branch: master author: Victor Stinner committer: GitHub date: 2019-03-27T18:28:46+01:00 summary: bpo-36443: Disable C locale coercion and UTF-8 Mode by default (GH-12589) bpo-36443, bpo-36202: Since Python 3.7.0, calling Py_DecodeLocale() before Py_Initialize() produces mojibake if the LC_CTYPE locale is coerced and/or if the UTF-8 Mode is enabled by the user configuration. This change fix the issue by disabling LC_CTYPE coercion and UTF-8 Mode by default. They must now be enabled explicitly (opt-in) using the new _Py_PreInitialize() API with _PyPreConfig. When embedding Python, set coerce_c_locale and utf8_mode attributes of _PyPreConfig to -1 to enable automatically these parameters depending on the LC_CTYPE locale, environment variables and command line arguments Alternative: Setting Py_UTF8Mode to 1 always explicitly enables the UTF-8 Mode. Changes: * _PyPreConfig_INIT now sets coerce_c_locale and utf8_mode to 0 by default. * _Py_InitializeFromArgs() and _Py_InitializeFromWideArgs() can now be called with config=NULL. files: A Misc/NEWS.d/next/C API/2019-03-27-15-58-23.bpo-36443.tAfZR9.rst M Include/cpython/coreconfig.h M Lib/test/test_embed.py M Modules/main.c M Programs/_testembed.c M Python/preconfig.c M Python/pylifecycle.c diff --git a/Include/cpython/coreconfig.h b/Include/cpython/coreconfig.h index 27ee1f4c63fd..7ce1a02e16c6 100644 --- a/Include/cpython/coreconfig.h +++ b/Include/cpython/coreconfig.h @@ -63,13 +63,20 @@ typedef struct { set to !Py_IgnoreEnvironmentFlag. */ int use_environment; - /* PYTHONCOERCECLOCALE, -1 means unknown. + /* Coerce the LC_CTYPE locale if it's equal to "C"? (PEP 538) + + Set to 0 by PYTHONCOERCECLOCALE=0. Set to 1 by PYTHONCOERCECLOCALE=1. + Set to 2 if the user preferred LC_CTYPE locale is "C". If it is equal to 1, LC_CTYPE locale is read to decide it it should be coerced or not (ex: PYTHONCOERCECLOCALE=1). Internally, it is set to 2 if the LC_CTYPE locale must be coerced. */ int coerce_c_locale; - int coerce_c_locale_warn; /* PYTHONCOERCECLOCALE=warn */ + + /* Emit a warning if the LC_CTYPE locale is coerced? + + Disabled by default. Set to 1 by PYTHONCOERCECLOCALE=warn. */ + int coerce_c_locale_warn; #ifdef MS_WINDOWS /* If greater than 1, use the "mbcs" encoding instead of the UTF-8 @@ -83,9 +90,17 @@ typedef struct { int legacy_windows_fs_encoding; #endif - /* Enable UTF-8 mode? - Set by -X utf8 command line option and PYTHONUTF8 environment variable. - If set to -1 (default), inherit Py_UTF8Mode value. */ + /* Enable UTF-8 mode? (PEP 540) + + Disabled by default (equals to 0). + + Set to 1 by "-X utf8" and "-X utf8=1" command line options. + Set to 1 by PYTHONUTF8=1 environment variable. + + Set to 0 by "-X utf8=0" and PYTHONUTF8=0. + + If equals to -1, it is set to 1 if the LC_CTYPE locale is "C" or + "POSIX", otherwise inherit Py_UTF8Mode value. */ int utf8_mode; int dev_mode; /* Development mode. PYTHONDEVMODE, -X dev */ @@ -104,8 +119,6 @@ typedef struct { _PyPreConfig_WINDOWS_INIT \ .isolated = -1, \ .use_environment = -1, \ - .coerce_c_locale = -1, \ - .utf8_mode = -1, \ .dev_mode = -1, \ .allocator = NULL} diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index c63ea5a45e4b..164527a664af 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -494,8 +494,8 @@ def check_config(self, testname, expected_config, expected_preconfig): if key not in expected_preconfig: expected_preconfig[key] = expected_config[key] - self.check_core_config(config, expected_config) self.check_pre_config(config, expected_preconfig) + self.check_core_config(config, expected_config) self.check_global_config(config) def test_init_default_config(self): @@ -573,7 +573,6 @@ def test_init_from_config(self): INIT_ENV_PRECONFIG = { 'allocator': 'malloc', - 'utf8_mode': 1, } INIT_ENV_CONFIG = { 'use_hash_seed': 1, @@ -581,8 +580,6 @@ def test_init_from_config(self): 'tracemalloc': 2, 'import_time': 1, 'malloc_stats': 1, - 'filesystem_encoding': 'utf-8', - 'filesystem_errors': UTF8_MODE_ERRORS, 'inspect': 1, 'optimization_level': 2, 'pycache_prefix': 'env_pycache_prefix', diff --git a/Misc/NEWS.d/next/C API/2019-03-27-15-58-23.bpo-36443.tAfZR9.rst b/Misc/NEWS.d/next/C API/2019-03-27-15-58-23.bpo-36443.tAfZR9.rst new file mode 100644 index 000000000000..3d98c318d401 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2019-03-27-15-58-23.bpo-36443.tAfZR9.rst @@ -0,0 +1,6 @@ +Since Python 3.7.0, calling :c:func:`Py_DecodeLocale` before +:c:func:`Py_Initialize` produces mojibake if the ``LC_CTYPE`` locale is coerced +and/or if the UTF-8 Mode is enabled by the user configuration. The LC_CTYPE +coercion and UTF-8 Mode are now disabled by default to fix the mojibake issue. +They must now be enabled explicitly (opt-in) using the new +:c:func:`_Py_PreInitialize` API with ``_PyPreConfig``. diff --git a/Modules/main.c b/Modules/main.c index ff79edbe43e0..766576939db1 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -52,23 +52,30 @@ pymain_init(const _PyArgv *args) fedisableexcept(FE_OVERFLOW); #endif - _PyCoreConfig config = _PyCoreConfig_INIT; - + _PyPreConfig preconfig = _PyPreConfig_INIT; + /* Set to -1 to enable them depending on the LC_CTYPE locale and the + environment variables (PYTHONUTF8 and PYTHONCOERCECLOCALE) */ + preconfig.coerce_c_locale = -1; + preconfig.utf8_mode = -1; if (args->use_bytes_argv) { - err = _Py_PreInitializeFromArgs(NULL, args->argc, args->bytes_argv); + err = _Py_PreInitializeFromArgs(&preconfig, + args->argc, args->bytes_argv); } else { - err = _Py_PreInitializeFromWideArgs(NULL, args->argc, args->wchar_argv); + err = _Py_PreInitializeFromWideArgs(&preconfig, + args->argc, args->wchar_argv); } if (_Py_INIT_FAILED(err)) { return err; } + /* pass NULL as the config: config is read from command line arguments, + environment variables, configuration files */ if (args->use_bytes_argv) { - return _Py_InitializeFromArgs(&config, args->argc, args->bytes_argv); + return _Py_InitializeFromArgs(NULL, args->argc, args->bytes_argv); } else { - return _Py_InitializeFromWideArgs(&config, args->argc, args->wchar_argv); + return _Py_InitializeFromWideArgs(NULL, args->argc, args->wchar_argv); } } diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 425954cdd40b..d8e12cf3ffe5 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -441,8 +441,6 @@ static int test_init_from_config(void) putenv("PYTHONMALLOCSTATS=0"); config.malloc_stats = 1; - /* FIXME: test coerce_c_locale and coerce_c_locale_warn */ - putenv("PYTHONPYCACHEPREFIX=env_pycache_prefix"); config.pycache_prefix = L"conf_pycache_prefix"; @@ -617,17 +615,6 @@ static int test_init_isolated(void) { _PyInitError err; - _PyPreConfig preconfig = _PyPreConfig_INIT; - - /* Set coerce_c_locale and utf8_mode to not depend on the locale */ - preconfig.coerce_c_locale = 0; - preconfig.utf8_mode = 0; - - err = _Py_PreInitialize(&preconfig); - if (_Py_INIT_FAILED(err)) { - _Py_ExitInitError(err); - } - /* Test _PyCoreConfig.isolated=1 */ _PyCoreConfig config = _PyCoreConfig_INIT; @@ -654,10 +641,6 @@ static int test_preinit_isolated1(void) _PyInitError err; _PyPreConfig preconfig = _PyPreConfig_INIT; - - /* Set coerce_c_locale and utf8_mode to not depend on the locale */ - preconfig.coerce_c_locale = 0; - preconfig.utf8_mode = 0; preconfig.isolated = 1; err = _Py_PreInitialize(&preconfig); @@ -685,10 +668,6 @@ static int test_preinit_isolated2(void) _PyInitError err; _PyPreConfig preconfig = _PyPreConfig_INIT; - - /* Set coerce_c_locale and utf8_mode to not depend on the locale */ - preconfig.coerce_c_locale = 0; - preconfig.utf8_mode = 0; preconfig.isolated = 0; err = _Py_PreInitialize(&preconfig); diff --git a/Python/preconfig.c b/Python/preconfig.c index 011ed53a8e73..7ac645d7f08b 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -386,7 +386,9 @@ _PyPreConfig_GetGlobalConfig(_PyPreConfig *config) #ifdef MS_WINDOWS COPY_FLAG(legacy_windows_fs_encoding, Py_LegacyWindowsFSEncodingFlag); #endif - COPY_FLAG(utf8_mode, Py_UTF8Mode); + if (Py_UTF8Mode > 0) { + config->utf8_mode = 1; + } #undef COPY_FLAG #undef COPY_NOT_FLAG diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 7c6948e6bdb1..ad1447256cc6 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -485,7 +485,7 @@ _Py_Initialize_ReconfigureCore(PyInterpreterState **interp_p, _PyCoreConfig_Write(core_config); if (_PyCoreConfig_Copy(&interp->core_config, core_config) < 0) { - return _Py_INIT_ERR("failed to copy core config"); + return _Py_INIT_NO_MEMORY(); } core_config = &interp->core_config; @@ -548,7 +548,7 @@ pycore_create_interpreter(const _PyCoreConfig *core_config, *interp_p = interp; if (_PyCoreConfig_Copy(&interp->core_config, core_config) < 0) { - return _Py_INIT_ERR("failed to copy core config"); + return _Py_INIT_NO_MEMORY(); } core_config = &interp->core_config; @@ -785,6 +785,7 @@ _Py_PreInitialize(const _PyPreConfig *src_config) _PyInitError _Py_PreInitializeFromCoreConfig(const _PyCoreConfig *coreconfig) { + assert(coreconfig != NULL); _PyPreConfig config = _PyPreConfig_INIT; _PyCoreConfig_GetCoreConfig(&config, coreconfig); return _Py_PreInitialize(&config); @@ -799,8 +800,10 @@ pyinit_coreconfig(_PyCoreConfig *config, const _PyArgv *args, PyInterpreterState **interp_p) { - if (_PyCoreConfig_Copy(config, src_config) < 0) { - return _Py_INIT_ERR("failed to copy core config"); + if (src_config) { + if (_PyCoreConfig_Copy(config, src_config) < 0) { + return _Py_INIT_NO_MEMORY(); + } } _PyInitError err = _PyCoreConfig_Read(config, args); @@ -839,9 +842,14 @@ _Py_InitializeCore(const _PyCoreConfig *src_config, const _PyArgv *args, PyInterpreterState **interp_p) { - assert(src_config != NULL); + _PyInitError err; - _PyInitError err = _Py_PreInitializeFromCoreConfig(src_config); + if (src_config) { + err = _Py_PreInitializeFromCoreConfig(src_config); + } + else { + err = _Py_PreInitialize(NULL); + } if (_Py_INIT_FAILED(err)) { return err; } @@ -1395,7 +1403,7 @@ new_interpreter(PyThreadState **tstate_p) } if (_PyCoreConfig_Copy(&interp->core_config, core_config) < 0) { - return _Py_INIT_ERR("failed to copy core config"); + return _Py_INIT_NO_MEMORY(); } core_config = &interp->core_config; From webhook-mailer at python.org Wed Mar 27 16:16:53 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Wed, 27 Mar 2019 20:16:53 -0000 Subject: [Python-checkins] Add missing docstrings for TarInfo objects (#12555) Message-ID: https://github.com/python/cpython/commit/a694f2394881fb68b5646061ded01fff6dc47778 commit: a694f2394881fb68b5646061ded01fff6dc47778 branch: master author: Raymond Hettinger committer: GitHub date: 2019-03-27T13:16:34-07:00 summary: Add missing docstrings for TarInfo objects (#12555) files: M Lib/pydoc.py M Lib/tarfile.py diff --git a/Lib/pydoc.py b/Lib/pydoc.py index 0cf3d3359624..86ccfe041f66 100644 --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -997,8 +997,8 @@ def docdata(self, object, name=None, mod=None, cl=None): if name: push('
%s
\n' % name) - if object.__doc__ is not None: - doc = self.markup(getdoc(object), self.preformat) + doc = self.markup(getdoc(object), self.preformat) + if doc: push('
%s
\n' % doc) push('
\n') diff --git a/Lib/tarfile.py b/Lib/tarfile.py index 30cecffd1a84..2c06f9160c65 100755 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -717,11 +717,32 @@ class TarInfo(object): usually created internally. """ - __slots__ = ("name", "mode", "uid", "gid", "size", "mtime", - "chksum", "type", "linkname", "uname", "gname", - "devmajor", "devminor", - "offset", "offset_data", "pax_headers", "sparse", - "tarfile", "_sparse_structs", "_link_target") + __slots__ = dict( + name = 'Name of the archive member.', + mode = 'Permission bits.', + uid = 'User ID of the user who originally stored this member.', + gid = 'Group ID of the user who originally stored this member.', + size = 'Size in bytes.', + mtime = 'Time of last modification.', + chksum = 'Header checksum.', + type = ('File type. type is usually one of these constants: ' + 'REGTYPE, AREGTYPE, LNKTYPE, SYMTYPE, DIRTYPE, FIFOTYPE, ' + 'CONTTYPE, CHRTYPE, BLKTYPE, GNUTYPE_SPARSE.'), + linkname = ('Name of the target file name, which is only present ' + 'in TarInfo objects of type LNKTYPE and SYMTYPE.'), + uname = 'User name.', + gname = 'Group name.', + devmajor = 'Device major number.', + devminor = 'Device minor number.', + offset = 'The tar header starts here.', + offset_data = "The file's data starts here.", + pax_headers = ('A dictionary containing key-value pairs of an ' + 'associated pax extended header.'), + sparse = 'Sparse member information.', + tarfile = None, + _sparse_structs = None, + _link_target = None, + ) def __init__(self, name=""): """Construct a TarInfo object. name is the optional name @@ -747,10 +768,9 @@ def __init__(self, name=""): self.sparse = None # sparse member information self.pax_headers = {} # pax header information - # In pax headers the "name" and "linkname" field are called - # "path" and "linkpath". @property def path(self): + 'In pax headers, "name" is called "path".' return self.name @path.setter @@ -759,6 +779,7 @@ def path(self, name): @property def linkpath(self): + 'In pax headers, "linkname" is called "linkpath".' return self.linkname @linkpath.setter @@ -1350,24 +1371,42 @@ def _block(self, count): return blocks * BLOCKSIZE def isreg(self): + 'Return True if the Tarinfo object is a regular file.' return self.type in REGULAR_TYPES + def isfile(self): + 'Return True if the Tarinfo object is a regular file.' return self.isreg() + def isdir(self): + 'Return True if it is a directory.' return self.type == DIRTYPE + def issym(self): + 'Return True if it is a symbolic link.' return self.type == SYMTYPE + def islnk(self): + 'Return True if it is a hard link.' return self.type == LNKTYPE + def ischr(self): + 'Return True if it is a character device.' return self.type == CHRTYPE + def isblk(self): + 'Return True if it is a block device.' return self.type == BLKTYPE + def isfifo(self): + 'Return True if it is a FIFO.' return self.type == FIFOTYPE + def issparse(self): return self.sparse is not None + def isdev(self): + 'Return True if it is one of character device, block device or FIFO.' return self.type in (CHRTYPE, BLKTYPE, FIFOTYPE) # class TarInfo From webhook-mailer at python.org Wed Mar 27 17:34:23 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Wed, 27 Mar 2019 21:34:23 -0000 Subject: [Python-checkins] bpo-31292: Fixed distutils check --restructuredtext for include directives (GH-10605) Message-ID: https://github.com/python/cpython/commit/d5a5a33f12b60129d57f9b423b77d2fcba506834 commit: d5a5a33f12b60129d57f9b423b77d2fcba506834 branch: master author: Philipp A committer: Cheryl Sabella date: 2019-03-27T17:34:19-04:00 summary: bpo-31292: Fixed distutils check --restructuredtext for include directives (GH-10605) files: A Lib/distutils/tests/includetest.rst A Misc/NEWS.d/next/Library/2017-08-30-20-27-00.bpo-31292.dKIaZb.rst M Lib/distutils/command/check.py M Lib/distutils/tests/test_check.py diff --git a/Lib/distutils/command/check.py b/Lib/distutils/command/check.py index 7ebe707cff49..04c2f9642d73 100644 --- a/Lib/distutils/command/check.py +++ b/Lib/distutils/command/check.py @@ -120,7 +120,8 @@ def check_restructuredtext(self): def _check_rst_data(self, data): """Returns warnings when the provided data doesn't compile.""" - source_path = StringIO() + # the include and csv_table directives need this to be a path + source_path = self.distribution.script_name or 'setup.py' parser = Parser() settings = frontend.OptionParser(components=(Parser,)).get_default_values() settings.tab_width = 4 diff --git a/Lib/distutils/tests/includetest.rst b/Lib/distutils/tests/includetest.rst new file mode 100644 index 000000000000..d7b4ae38b09d --- /dev/null +++ b/Lib/distutils/tests/includetest.rst @@ -0,0 +1 @@ +This should be included. diff --git a/Lib/distutils/tests/test_check.py b/Lib/distutils/tests/test_check.py index 3d22868e313b..e534aca1d476 100644 --- a/Lib/distutils/tests/test_check.py +++ b/Lib/distutils/tests/test_check.py @@ -1,4 +1,5 @@ """Tests for distutils.command.check.""" +import os import textwrap import unittest from test.support import run_unittest @@ -13,13 +14,19 @@ pygments = None +HERE = os.path.dirname(__file__) + + class CheckTestCase(support.LoggingSilencer, support.TempdirManager, unittest.TestCase): - def _run(self, metadata=None, **options): + def _run(self, metadata=None, cwd=None, **options): if metadata is None: metadata = {} + if cwd is not None: + old_dir = os.getcwd() + os.chdir(cwd) pkg_info, dist = self.create_dist(**metadata) cmd = check(dist) cmd.initialize_options() @@ -27,6 +34,8 @@ def _run(self, metadata=None, **options): setattr(cmd, name, value) cmd.ensure_finalized() cmd.run() + if cwd is not None: + os.chdir(old_dir) return cmd def test_check_metadata(self): @@ -99,6 +108,11 @@ def test_check_restructuredtext(self): cmd = self._run(metadata, strict=1, restructuredtext=1) self.assertEqual(cmd._warnings, 0) + # check that includes work to test #31292 + metadata['long_description'] = 'title\n=====\n\n.. include:: includetest.rst' + cmd = self._run(metadata, cwd=HERE, strict=1, restructuredtext=1) + self.assertEqual(cmd._warnings, 0) + @unittest.skipUnless(HAS_DOCUTILS, "won't test without docutils") def test_check_restructuredtext_with_syntax_highlight(self): # Don't fail if there is a `code` or `code-block` directive diff --git a/Misc/NEWS.d/next/Library/2017-08-30-20-27-00.bpo-31292.dKIaZb.rst b/Misc/NEWS.d/next/Library/2017-08-30-20-27-00.bpo-31292.dKIaZb.rst new file mode 100644 index 000000000000..b62eee3c5ee4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-08-30-20-27-00.bpo-31292.dKIaZb.rst @@ -0,0 +1,2 @@ +Fix ``setup.py check --restructuredtext`` for +files containing ``include`` directives. From webhook-mailer at python.org Wed Mar 27 18:23:23 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 27 Mar 2019 22:23:23 -0000 Subject: [Python-checkins] bpo-31292: Fixed distutils check --restructuredtext for include directives (GH-10605) Message-ID: https://github.com/python/cpython/commit/600aca47f085a06579e7af4c6423ea7e907b4bb4 commit: 600aca47f085a06579e7af4c6423ea7e907b4bb4 branch: 2.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-27T15:23:19-07:00 summary: bpo-31292: Fixed distutils check --restructuredtext for include directives (GH-10605) (cherry picked from commit d5a5a33f12b60129d57f9b423b77d2fcba506834) Co-authored-by: Philipp A files: A Lib/distutils/tests/includetest.rst A Misc/NEWS.d/next/Library/2017-08-30-20-27-00.bpo-31292.dKIaZb.rst M Lib/distutils/command/check.py M Lib/distutils/tests/test_check.py diff --git a/Lib/distutils/command/check.py b/Lib/distutils/command/check.py index 4ea03d303490..fc7db527b97a 100644 --- a/Lib/distutils/command/check.py +++ b/Lib/distutils/command/check.py @@ -124,7 +124,8 @@ def check_restructuredtext(self): def _check_rst_data(self, data): """Returns warnings when the provided data doesn't compile.""" - source_path = StringIO() + # the include and csv_table directives need this to be a path + source_path = self.distribution.script_name or 'setup.py' parser = Parser() settings = frontend.OptionParser(components=(Parser,)).get_default_values() settings.tab_width = 4 diff --git a/Lib/distutils/tests/includetest.rst b/Lib/distutils/tests/includetest.rst new file mode 100644 index 000000000000..d7b4ae38b09d --- /dev/null +++ b/Lib/distutils/tests/includetest.rst @@ -0,0 +1 @@ +This should be included. diff --git a/Lib/distutils/tests/test_check.py b/Lib/distutils/tests/test_check.py index e94647ffa4a7..2e2cf131e076 100644 --- a/Lib/distutils/tests/test_check.py +++ b/Lib/distutils/tests/test_check.py @@ -1,5 +1,6 @@ # -*- encoding: utf8 -*- """Tests for distutils.command.check.""" +import os import textwrap import unittest from test.test_support import run_unittest @@ -14,13 +15,19 @@ pygments = None +HERE = os.path.dirname(__file__) + + class CheckTestCase(support.LoggingSilencer, support.TempdirManager, unittest.TestCase): - def _run(self, metadata=None, **options): + def _run(self, metadata=None, cwd=None, **options): if metadata is None: metadata = {} + if cwd is not None: + old_dir = os.getcwd() + os.chdir(cwd) pkg_info, dist = self.create_dist(**metadata) cmd = check(dist) cmd.initialize_options() @@ -28,6 +35,8 @@ def _run(self, metadata=None, **options): setattr(cmd, name, value) cmd.ensure_finalized() cmd.run() + if cwd is not None: + os.chdir(old_dir) return cmd def test_check_metadata(self): @@ -100,6 +109,11 @@ def test_check_restructuredtext(self): cmd = self._run(metadata, strict=1, restructuredtext=1) self.assertEqual(cmd._warnings, 0) + # check that includes work to test #31292 + metadata['long_description'] = 'title\n=====\n\n.. include:: includetest.rst' + cmd = self._run(metadata, cwd=HERE, strict=1, restructuredtext=1) + self.assertEqual(cmd._warnings, 0) + @unittest.skipUnless(HAS_DOCUTILS, "won't test without docutils") def test_check_restructuredtext_with_syntax_highlight(self): # Don't fail if there is a `code` or `code-block` directive diff --git a/Misc/NEWS.d/next/Library/2017-08-30-20-27-00.bpo-31292.dKIaZb.rst b/Misc/NEWS.d/next/Library/2017-08-30-20-27-00.bpo-31292.dKIaZb.rst new file mode 100644 index 000000000000..b62eee3c5ee4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-08-30-20-27-00.bpo-31292.dKIaZb.rst @@ -0,0 +1,2 @@ +Fix ``setup.py check --restructuredtext`` for +files containing ``include`` directives. From webhook-mailer at python.org Wed Mar 27 18:26:01 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 27 Mar 2019 22:26:01 -0000 Subject: [Python-checkins] bpo-31292: Fixed distutils check --restructuredtext for include directives (GH-10605) Message-ID: https://github.com/python/cpython/commit/9cad523328324bd82fa19b597ead1614a0e61ae2 commit: 9cad523328324bd82fa19b597ead1614a0e61ae2 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-27T15:25:57-07:00 summary: bpo-31292: Fixed distutils check --restructuredtext for include directives (GH-10605) (cherry picked from commit d5a5a33f12b60129d57f9b423b77d2fcba506834) Co-authored-by: Philipp A files: A Lib/distutils/tests/includetest.rst A Misc/NEWS.d/next/Library/2017-08-30-20-27-00.bpo-31292.dKIaZb.rst M Lib/distutils/command/check.py M Lib/distutils/tests/test_check.py diff --git a/Lib/distutils/command/check.py b/Lib/distutils/command/check.py index 7ebe707cff49..04c2f9642d73 100644 --- a/Lib/distutils/command/check.py +++ b/Lib/distutils/command/check.py @@ -120,7 +120,8 @@ def check_restructuredtext(self): def _check_rst_data(self, data): """Returns warnings when the provided data doesn't compile.""" - source_path = StringIO() + # the include and csv_table directives need this to be a path + source_path = self.distribution.script_name or 'setup.py' parser = Parser() settings = frontend.OptionParser(components=(Parser,)).get_default_values() settings.tab_width = 4 diff --git a/Lib/distutils/tests/includetest.rst b/Lib/distutils/tests/includetest.rst new file mode 100644 index 000000000000..d7b4ae38b09d --- /dev/null +++ b/Lib/distutils/tests/includetest.rst @@ -0,0 +1 @@ +This should be included. diff --git a/Lib/distutils/tests/test_check.py b/Lib/distutils/tests/test_check.py index 3d22868e313b..e534aca1d476 100644 --- a/Lib/distutils/tests/test_check.py +++ b/Lib/distutils/tests/test_check.py @@ -1,4 +1,5 @@ """Tests for distutils.command.check.""" +import os import textwrap import unittest from test.support import run_unittest @@ -13,13 +14,19 @@ pygments = None +HERE = os.path.dirname(__file__) + + class CheckTestCase(support.LoggingSilencer, support.TempdirManager, unittest.TestCase): - def _run(self, metadata=None, **options): + def _run(self, metadata=None, cwd=None, **options): if metadata is None: metadata = {} + if cwd is not None: + old_dir = os.getcwd() + os.chdir(cwd) pkg_info, dist = self.create_dist(**metadata) cmd = check(dist) cmd.initialize_options() @@ -27,6 +34,8 @@ def _run(self, metadata=None, **options): setattr(cmd, name, value) cmd.ensure_finalized() cmd.run() + if cwd is not None: + os.chdir(old_dir) return cmd def test_check_metadata(self): @@ -99,6 +108,11 @@ def test_check_restructuredtext(self): cmd = self._run(metadata, strict=1, restructuredtext=1) self.assertEqual(cmd._warnings, 0) + # check that includes work to test #31292 + metadata['long_description'] = 'title\n=====\n\n.. include:: includetest.rst' + cmd = self._run(metadata, cwd=HERE, strict=1, restructuredtext=1) + self.assertEqual(cmd._warnings, 0) + @unittest.skipUnless(HAS_DOCUTILS, "won't test without docutils") def test_check_restructuredtext_with_syntax_highlight(self): # Don't fail if there is a `code` or `code-block` directive diff --git a/Misc/NEWS.d/next/Library/2017-08-30-20-27-00.bpo-31292.dKIaZb.rst b/Misc/NEWS.d/next/Library/2017-08-30-20-27-00.bpo-31292.dKIaZb.rst new file mode 100644 index 000000000000..b62eee3c5ee4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-08-30-20-27-00.bpo-31292.dKIaZb.rst @@ -0,0 +1,2 @@ +Fix ``setup.py check --restructuredtext`` for +files containing ``include`` directives. From webhook-mailer at python.org Wed Mar 27 19:28:36 2019 From: webhook-mailer at python.org (Steve Dower) Date: Wed, 27 Mar 2019 23:28:36 -0000 Subject: [Python-checkins] bpo-36245: Avoid problems when building in a directory containing spaces. (GH-12241) Message-ID: https://github.com/python/cpython/commit/bb89aa24cf71f9874d1d26f3a2440fefa0b6bbcc commit: bb89aa24cf71f9874d1d26f3a2440fefa0b6bbcc branch: 2.7 author: Steve Dower committer: GitHub date: 2019-03-27T16:28:33-07:00 summary: bpo-36245: Avoid problems when building in a directory containing spaces. (GH-12241) files: M PCbuild/get_externals.bat diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat index bda243fe2e31..ed6a79f11db6 100644 --- a/PCbuild/get_externals.bat +++ b/PCbuild/get_externals.bat @@ -2,8 +2,8 @@ setlocal rem Simple script to fetch source for external libraries -if "%PCBUILD%"=="" (set PCBUILD=%~dp0) -if "%EXTERNALS_DIR%"=="" (set EXTERNALS_DIR=%PCBUILD%\..\externals) +if NOT DEFINED PCBUILD (set PCBUILD=%~dp0) +if NOT DEFINED EXTERNALS_DIR (set EXTERNALS_DIR=%PCBUILD%\..\externals) set DO_FETCH=true set DO_CLEAN=false @@ -34,7 +34,7 @@ call "%PCBUILD%\find_python.bat" "%PYTHON%" git 2>&1 > nul if ERRORLEVEL 9009 ( - if "%PYTHON%"=="" ( + if NOT DEFINED PYTHON ( echo Python 3.6 could not be found or installed, and git.exe is not on your PATH && exit /B 1 ) ) @@ -56,7 +56,7 @@ if NOT "%IncludeTkinter%"=="false" set libraries=%libraries% tix-8.4.3.5 for %%e in (%libraries%) do ( if exist "%EXTERNALS_DIR%\%%e" ( echo.%%e already exists, skipping. - ) else if "%PYTHON%"=="" ( + ) else if NOT DEFINED PYTHON ( echo.Fetching %%e with git... git clone --depth 1 https://github.com/%ORG%/cpython-source-deps --branch %%e "%EXTERNALS_DIR%\%%e" ) else ( @@ -74,7 +74,7 @@ if NOT "%IncludeSSL%"=="false" set binaries=%binaries% nasm-2.11.06 for %%b in (%binaries%) do ( if exist "%EXTERNALS_DIR%\%%b" ( echo.%%b already exists, skipping. - ) else if "%PYTHON%"=="" ( + ) else if NOT DEFINED PYTHON ( echo.Fetching %%b with git... git clone --depth 1 https://github.com/%ORG%/cpython-bin-deps --branch %%b "%EXTERNALS_DIR%\%%b" ) else ( From webhook-mailer at python.org Wed Mar 27 19:28:44 2019 From: webhook-mailer at python.org (Steve Dower) Date: Wed, 27 Mar 2019 23:28:44 -0000 Subject: [Python-checkins] bpo-36245: Fix more empty environment variable checks (GH-12592) Message-ID: https://github.com/python/cpython/commit/b95a79c928fc4a6135d91c0c553cb2a63cf15140 commit: b95a79c928fc4a6135d91c0c553cb2a63cf15140 branch: master author: Steve Dower committer: GitHub date: 2019-03-27T16:28:41-07:00 summary: bpo-36245: Fix more empty environment variable checks (GH-12592) files: M PCbuild/get_externals.bat diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat index cbeb5a19b55b..887fdc941171 100644 --- a/PCbuild/get_externals.bat +++ b/PCbuild/get_externals.bat @@ -2,8 +2,8 @@ setlocal rem Simple script to fetch source for external libraries -if "%PCBUILD%"=="" (set PCBUILD=%~dp0) -if "%EXTERNALS_DIR%"=="" (set EXTERNALS_DIR=%PCBUILD%\..\externals) +if NOT DEFINED PCBUILD (set PCBUILD=%~dp0) +if NOT DEFINED EXTERNALS_DIR (set EXTERNALS_DIR=%PCBUILD%\..\externals) set DO_FETCH=true set DO_CLEAN=false From webhook-mailer at python.org Wed Mar 27 20:01:34 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 28 Mar 2019 00:01:34 -0000 Subject: [Python-checkins] bpo-36245: Fix more empty environment variable checks (GH-12592) Message-ID: https://github.com/python/cpython/commit/1ff04dcadfb57a8a8f61a6ea93292e8ae96dca4a commit: 1ff04dcadfb57a8a8f61a6ea93292e8ae96dca4a branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-27T17:01:31-07:00 summary: bpo-36245: Fix more empty environment variable checks (GH-12592) (cherry picked from commit b95a79c928fc4a6135d91c0c553cb2a63cf15140) Co-authored-by: Steve Dower files: M PCbuild/get_externals.bat diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat index cbeb5a19b55b..887fdc941171 100644 --- a/PCbuild/get_externals.bat +++ b/PCbuild/get_externals.bat @@ -2,8 +2,8 @@ setlocal rem Simple script to fetch source for external libraries -if "%PCBUILD%"=="" (set PCBUILD=%~dp0) -if "%EXTERNALS_DIR%"=="" (set EXTERNALS_DIR=%PCBUILD%\..\externals) +if NOT DEFINED PCBUILD (set PCBUILD=%~dp0) +if NOT DEFINED EXTERNALS_DIR (set EXTERNALS_DIR=%PCBUILD%\..\externals) set DO_FETCH=true set DO_CLEAN=false From webhook-mailer at python.org Thu Mar 28 00:03:05 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Thu, 28 Mar 2019 04:03:05 -0000 Subject: [Python-checkins] Revert "Minor doc improvement (GH-10341)" (GH-12597) Message-ID: https://github.com/python/cpython/commit/fb28fcc9252da51001b98cd93d65fb0e9b43aa3e commit: fb28fcc9252da51001b98cd93d65fb0e9b43aa3e branch: master author: Raymond Hettinger committer: GitHub date: 2019-03-27T21:03:02-07:00 summary: Revert "Minor doc improvement (GH-10341)" (GH-12597) This reverts commit dfd775a0b1aee51d842b20cdebd97cc52c0b32e7. files: M Doc/library/collections.rst M Doc/tutorial/controlflow.rst diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index 8d53e6879ef8..64de970fec94 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -971,7 +971,7 @@ function: >>> getattr(p, 'x') 11 -To convert a dictionary to a named tuple, use the ``**`` operator +To convert a dictionary to a named tuple, use the double-star-operator (as described in :ref:`tut-unpacking-arguments`): >>> d = {'x': 11, 'y': 22} diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst index abf163d232c5..905734539c68 100644 --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -560,7 +560,7 @@ The reverse situation occurs when the arguments are already in a list or tuple but need to be unpacked for a function call requiring separate positional arguments. For instance, the built-in :func:`range` function expects separate *start* and *stop* arguments. If they are not available separately, write the -function call with the ``*`` operator to unpack the arguments out of a list +function call with the ``*``\ -operator to unpack the arguments out of a list or tuple:: >>> list(range(3, 6)) # normal call with separate arguments @@ -573,7 +573,7 @@ or tuple:: single: **; in function calls In the same fashion, dictionaries can deliver keyword arguments with the -``**`` operator:: +``**``\ -operator:: >>> def parrot(voltage, state='a stiff', action='voom'): ... print("-- This parrot wouldn't", action, end=' ') From webhook-mailer at python.org Thu Mar 28 00:19:33 2019 From: webhook-mailer at python.org (Ned Deily) Date: Thu, 28 Mar 2019 04:19:33 -0000 Subject: [Python-checkins] Fix NEWS entries with incorrect bpo numbers (GH-12599) Message-ID: https://github.com/python/cpython/commit/738cb42a14481aa9ae58704f6bee951308212d7e commit: 738cb42a14481aa9ae58704f6bee951308212d7e branch: master author: Ned Deily committer: GitHub date: 2019-03-28T00:19:30-04:00 summary: Fix NEWS entries with incorrect bpo numbers (GH-12599) files: A Misc/NEWS.d/next/Core and Builtins/2019-03-20-00-37-24.bpo-36143.fnKoKo.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-20-00-37-24.bpo-12456.fnKoKo.rst M Misc/NEWS.d/3.8.0a3.rst diff --git a/Misc/NEWS.d/3.8.0a3.rst b/Misc/NEWS.d/3.8.0a3.rst index 4962464a10b5..a7397b520cb1 100644 --- a/Misc/NEWS.d/3.8.0a3.rst +++ b/Misc/NEWS.d/3.8.0a3.rst @@ -49,7 +49,7 @@ Fix a possible crash in ``structseq_repr()``. .. -.. bpo: 12477 +.. bpo: 36256 .. date: 2019-03-21-00-24-18 .. nonce: OZHa0t .. section: Core and Builtins @@ -236,7 +236,7 @@ deprecated. .. -.. bpo: 11814 +.. bpo: 35808 .. date: 2019-02-11-00-50-03 .. nonce: M12CMH .. section: Core and Builtins diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-20-00-37-24.bpo-12456.fnKoKo.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-20-00-37-24.bpo-36143.fnKoKo.rst similarity index 100% rename from Misc/NEWS.d/next/Core and Builtins/2019-03-20-00-37-24.bpo-12456.fnKoKo.rst rename to Misc/NEWS.d/next/Core and Builtins/2019-03-20-00-37-24.bpo-36143.fnKoKo.rst From webhook-mailer at python.org Thu Mar 28 00:21:02 2019 From: webhook-mailer at python.org (Ned Deily) Date: Thu, 28 Mar 2019 04:21:02 -0000 Subject: [Python-checkins] [3.7] Fix NEWS entry with incorrect bpo number (GH-12600) Message-ID: https://github.com/python/cpython/commit/374663567935f0c8350982398b5cd28520c75713 commit: 374663567935f0c8350982398b5cd28520c75713 branch: 3.7 author: Ned Deily committer: GitHub date: 2019-03-28T00:20:59-04:00 summary: [3.7] Fix NEWS entry with incorrect bpo number (GH-12600) files: A Misc/NEWS.d/next/Core and Builtins/2019-03-21-00-24-18.bpo-36256.OZHa0t.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-21-00-24-18.bpo-12477.OZHa0t.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-21-00-24-18.bpo-12477.OZHa0t.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-21-00-24-18.bpo-36256.OZHa0t.rst similarity index 100% rename from Misc/NEWS.d/next/Core and Builtins/2019-03-21-00-24-18.bpo-12477.OZHa0t.rst rename to Misc/NEWS.d/next/Core and Builtins/2019-03-21-00-24-18.bpo-36256.OZHa0t.rst From webhook-mailer at python.org Thu Mar 28 02:03:28 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Thu, 28 Mar 2019 06:03:28 -0000 Subject: [Python-checkins] bpo-36452: dictiter: track maximum iteration count (GH-12596) Message-ID: https://github.com/python/cpython/commit/796cc6e3ad3617c1ea9e528663aac1a206230a28 commit: 796cc6e3ad3617c1ea9e528663aac1a206230a28 branch: master author: Thomas Perl committer: Inada Naoki date: 2019-03-28T15:03:25+09:00 summary: bpo-36452: dictiter: track maximum iteration count (GH-12596) files: A Misc/NEWS.d/next/Core and Builtins/2019-03-27-23-53-00.bpo-36452.xhK2lT.rst M Lib/test/test_dict.py M Objects/dictobject.c diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py index 03afd5b2a6c7..eecdc8beec69 100644 --- a/Lib/test/test_dict.py +++ b/Lib/test/test_dict.py @@ -470,6 +470,15 @@ def test_mutating_iteration(self): for i in d: d[i+1] = 1 + def test_mutating_iteration_delete(self): + # change dict content during iteration + d = {} + d[0] = 0 + with self.assertRaises(RuntimeError): + for i in d: + del d[0] + d[1] = 1 + def test_mutating_lookup(self): # changing dict during a lookup (issue #14417) class NastyKey: diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-27-23-53-00.bpo-36452.xhK2lT.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-27-23-53-00.bpo-36452.xhK2lT.rst new file mode 100644 index 000000000000..37c0c503edec --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-27-23-53-00.bpo-36452.xhK2lT.rst @@ -0,0 +1 @@ +Changing `dict` keys during iteration will now be detected in certain corner cases where the number of keys isn't changed (but they keys themselves are), and a `RuntimeError` will be raised. \ No newline at end of file diff --git a/Objects/dictobject.c b/Objects/dictobject.c index e2603e190b62..7ea979cd1761 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -3543,6 +3543,12 @@ dictiter_iternextkey(dictiterobject *di) goto fail; key = entry_ptr->me_key; } + // We found an element (key), but did not expect it + if (di->len == 0) { + PyErr_SetString(PyExc_RuntimeError, + "dictionary keys changed during iteration"); + goto fail; + } di->di_pos = i+1; di->len--; Py_INCREF(key); From webhook-mailer at python.org Thu Mar 28 09:53:11 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Thu, 28 Mar 2019 13:53:11 -0000 Subject: [Python-checkins] bpo-36459: Fix a possible double PyMem_FREE() due to tokenizer.c's tok_nextc() (12601) Message-ID: https://github.com/python/cpython/commit/cda139d1ded6708665b53e4ed32ccc1d2627e1da commit: cda139d1ded6708665b53e4ed32ccc1d2627e1da branch: master author: Zackery Spytz committer: Serhiy Storchaka date: 2019-03-28T15:53:00+02:00 summary: bpo-36459: Fix a possible double PyMem_FREE() due to tokenizer.c's tok_nextc() (12601) Remove the PyMem_FREE() call added in cb90c89. The buffer will be freed when PyTokenizer_Free() is called on the tokenizer state. files: A Misc/NEWS.d/next/Core and Builtins/2019-03-27-22-35-16.bpo-36459.UAvkKp.rst M Parser/tokenizer.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-27-22-35-16.bpo-36459.UAvkKp.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-27-22-35-16.bpo-36459.UAvkKp.rst new file mode 100644 index 000000000000..6c234a6a76d9 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-27-22-35-16.bpo-36459.UAvkKp.rst @@ -0,0 +1 @@ +Fix a possible double ``PyMem_FREE()`` due to tokenizer.c's ``tok_nextc()``. diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index ad054975689e..58dd1cd30b37 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -963,7 +963,6 @@ tok_nextc(struct tok_state *tok) newbuf = (char *)PyMem_REALLOC(newbuf, newsize); if (newbuf == NULL) { - PyMem_FREE(tok->buf); tok->done = E_NOMEM; tok->cur = tok->inp; return EOF; From webhook-mailer at python.org Thu Mar 28 10:01:40 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Thu, 28 Mar 2019 14:01:40 -0000 Subject: [Python-checkins] bpo-36387: Refactor getenvironment() in _winapi.c. (GH-12482) Message-ID: https://github.com/python/cpython/commit/8abd7c7e37714ce0c42f871f81e52f14c155d1bd commit: 8abd7c7e37714ce0c42f871f81e52f14c155d1bd branch: master author: Serhiy Storchaka committer: GitHub date: 2019-03-28T16:01:34+02:00 summary: bpo-36387: Refactor getenvironment() in _winapi.c. (GH-12482) Make it doing less memory allocations and using the modern C API. files: M Modules/_winapi.c diff --git a/Modules/_winapi.c b/Modules/_winapi.c index e7b221d888ef..2eb708e9073e 100644 --- a/Modules/_winapi.c +++ b/Modules/_winapi.c @@ -752,12 +752,12 @@ gethandle(PyObject* obj, const char* name) return ret; } -static PyObject* +static wchar_t * getenvironment(PyObject* environment) { Py_ssize_t i, envsize, totalsize; - Py_UCS4 *buffer = NULL, *p, *end; - PyObject *keys, *values, *res; + wchar_t *buffer = NULL, *p, *end; + PyObject *keys, *values; /* convert environment dictionary to windows environment string */ if (! PyMapping_Check(environment)) { @@ -775,8 +775,8 @@ getenvironment(PyObject* environment) goto error; } - envsize = PySequence_Fast_GET_SIZE(keys); - if (PySequence_Fast_GET_SIZE(values) != envsize) { + envsize = PyList_GET_SIZE(keys); + if (PyList_GET_SIZE(values) != envsize) { PyErr_SetString(PyExc_RuntimeError, "environment changed size during iteration"); goto error; @@ -784,8 +784,9 @@ getenvironment(PyObject* environment) totalsize = 1; /* trailing null character */ for (i = 0; i < envsize; i++) { - PyObject* key = PySequence_Fast_GET_ITEM(keys, i); - PyObject* value = PySequence_Fast_GET_ITEM(values, i); + PyObject* key = PyList_GET_ITEM(keys, i); + PyObject* value = PyList_GET_ITEM(values, i); + Py_ssize_t size; if (! PyUnicode_Check(key) || ! PyUnicode_Check(value)) { PyErr_SetString(PyExc_TypeError, @@ -806,19 +807,25 @@ getenvironment(PyObject* environment) PyErr_SetString(PyExc_ValueError, "illegal environment variable name"); goto error; } - if (totalsize > PY_SSIZE_T_MAX - PyUnicode_GET_LENGTH(key) - 1) { + + size = PyUnicode_AsWideChar(key, NULL, 0); + assert(size > 1); + if (totalsize > PY_SSIZE_T_MAX - size) { PyErr_SetString(PyExc_OverflowError, "environment too long"); goto error; } - totalsize += PyUnicode_GET_LENGTH(key) + 1; /* +1 for '=' */ - if (totalsize > PY_SSIZE_T_MAX - PyUnicode_GET_LENGTH(value) - 1) { + totalsize += size; /* including '=' */ + + size = PyUnicode_AsWideChar(value, NULL, 0); + assert(size > 0); + if (totalsize > PY_SSIZE_T_MAX - size) { PyErr_SetString(PyExc_OverflowError, "environment too long"); goto error; } - totalsize += PyUnicode_GET_LENGTH(value) + 1; /* +1 for '\0' */ + totalsize += size; /* including trailing '\0' */ } - buffer = PyMem_NEW(Py_UCS4, totalsize); + buffer = PyMem_NEW(wchar_t, totalsize); if (! buffer) { PyErr_NoMemory(); goto error; @@ -827,34 +834,25 @@ getenvironment(PyObject* environment) end = buffer + totalsize; for (i = 0; i < envsize; i++) { - PyObject* key = PySequence_Fast_GET_ITEM(keys, i); - PyObject* value = PySequence_Fast_GET_ITEM(values, i); - if (!PyUnicode_AsUCS4(key, p, end - p, 0)) - goto error; - p += PyUnicode_GET_LENGTH(key); - *p++ = '='; - if (!PyUnicode_AsUCS4(value, p, end - p, 0)) - goto error; - p += PyUnicode_GET_LENGTH(value); - *p++ = '\0'; + PyObject* key = PyList_GET_ITEM(keys, i); + PyObject* value = PyList_GET_ITEM(values, i); + Py_ssize_t size = PyUnicode_AsWideChar(key, p, end - p); + assert(1 <= size && size < end - p); + p += size; + *p++ = L'='; + size = PyUnicode_AsWideChar(value, p, end - p); + assert(0 <= size && size < end - p); + p += size + 1; } - /* add trailing null byte */ - *p++ = '\0'; + /* add trailing null character */ + *p++ = L'\0'; assert(p == end); - Py_XDECREF(keys); - Py_XDECREF(values); - - res = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, p - buffer); - PyMem_Free(buffer); - return res; - error: - PyMem_Free(buffer); Py_XDECREF(keys); Py_XDECREF(values); - return NULL; + return buffer; } static LPHANDLE @@ -1053,8 +1051,7 @@ _winapi_CreateProcess_impl(PyObject *module, BOOL result; PROCESS_INFORMATION pi; STARTUPINFOEXW si; - PyObject *environment = NULL; - wchar_t *wenvironment; + wchar_t *wenvironment = NULL; wchar_t *command_line_copy = NULL; AttributeList attribute_list = {0}; @@ -1071,20 +1068,11 @@ _winapi_CreateProcess_impl(PyObject *module, goto cleanup; if (env_mapping != Py_None) { - environment = getenvironment(env_mapping); - if (environment == NULL) { - goto cleanup; - } - /* contains embedded null characters */ - wenvironment = PyUnicode_AsUnicode(environment); + wenvironment = getenvironment(env_mapping); if (wenvironment == NULL) { goto cleanup; } } - else { - environment = NULL; - wenvironment = NULL; - } if (getattributelist(startup_info, "lpAttributeList", &attribute_list) < 0) goto cleanup; @@ -1131,7 +1119,7 @@ _winapi_CreateProcess_impl(PyObject *module, cleanup: PyMem_Free(command_line_copy); - Py_XDECREF(environment); + PyMem_Free(wenvironment); freeattributelist(&attribute_list); return ret; From webhook-mailer at python.org Thu Mar 28 10:20:48 2019 From: webhook-mailer at python.org (Giampaolo Rodola) Date: Thu, 28 Mar 2019 14:20:48 -0000 Subject: [Python-checkins] bpo-29515: add missing socket.IPPROTO_* constants on Windows (GH-12183) Message-ID: https://github.com/python/cpython/commit/3eca28c61363a03b81b9fb12775490d6e42d8ecf commit: 3eca28c61363a03b81b9fb12775490d6e42d8ecf branch: master author: Giampaolo Rodola committer: GitHub date: 2019-03-28T15:20:30+01:00 summary: bpo-29515: add missing socket.IPPROTO_* constants on Windows (GH-12183) files: A Misc/NEWS.d/next/Windows/2019-03-05-18-09-43.bpo-29515.vwUTv0.rst M Lib/test/test_socket.py M Modules/socketmodule.c diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 08c7cdef73dd..8a990ea31410 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -867,6 +867,8 @@ def testSendtoErrors(self): def testCrucialConstants(self): # Testing for mission critical constants socket.AF_INET + if socket.has_ipv6: + socket.AF_INET6 socket.SOCK_STREAM socket.SOCK_DGRAM socket.SOCK_RAW @@ -875,6 +877,23 @@ def testCrucialConstants(self): socket.SOL_SOCKET socket.SO_REUSEADDR + def testCrucialIpProtoConstants(self): + socket.IPPROTO_TCP + socket.IPPROTO_UDP + if socket.has_ipv6: + socket.IPPROTO_IPV6 + + @unittest.skipUnless(os.name == "nt", "Windows specific") + def testWindowsSpecificConstants(self): + socket.IPPROTO_ICLFXBM + socket.IPPROTO_ST + socket.IPPROTO_CBT + socket.IPPROTO_IGP + socket.IPPROTO_RDP + socket.IPPROTO_PGM + socket.IPPROTO_L2TP + socket.IPPROTO_SCTP + def testHostnameRes(self): # Testing hostname resolution mechanisms hostname = socket.gethostname() diff --git a/Misc/NEWS.d/next/Windows/2019-03-05-18-09-43.bpo-29515.vwUTv0.rst b/Misc/NEWS.d/next/Windows/2019-03-05-18-09-43.bpo-29515.vwUTv0.rst new file mode 100644 index 000000000000..2f3f0991d9a2 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-03-05-18-09-43.bpo-29515.vwUTv0.rst @@ -0,0 +1,27 @@ +Add the following socket module constants on Windows: +IPPROTO_AH +IPPROTO_CBT +IPPROTO_DSTOPTS +IPPROTO_EGP +IPPROTO_ESP +IPPROTO_FRAGMENT +IPPROTO_GGP +IPPROTO_HOPOPTS +IPPROTO_ICLFXBM +IPPROTO_ICMPV6 +IPPROTO_IDP +IPPROTO_IGMP +IPPROTO_IGP +IPPROTO_IPV4 +IPPROTO_IPV6 +IPPROTO_L2TP +IPPROTO_MAX +IPPROTO_ND +IPPROTO_NONE +IPPROTO_PGM +IPPROTO_PIM +IPPROTO_PUP +IPPROTO_RDP +IPPROTO_ROUTING +IPPROTO_SCTP +IPPROTO_ST diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index b48f8a9c3093..c024542fe709 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -309,6 +309,40 @@ if_indextoname(index) -- return the corresponding interface name\n\ # include # endif +/* Macros based on the IPPROTO enum, see: https://bugs.python.org/issue29515 */ +#ifdef MS_WINDOWS +#define IPPROTO_ICMP IPPROTO_ICMP +#define IPPROTO_IGMP IPPROTO_IGMP +#define IPPROTO_GGP IPPROTO_GGP +#define IPPROTO_TCP IPPROTO_TCP +#define IPPROTO_PUP IPPROTO_PUP +#define IPPROTO_UDP IPPROTO_UDP +#define IPPROTO_IDP IPPROTO_IDP +#define IPPROTO_ND IPPROTO_ND +#define IPPROTO_RAW IPPROTO_RAW +#define IPPROTO_MAX IPPROTO_MAX +#define IPPROTO_HOPOPTS IPPROTO_HOPOPTS +#define IPPROTO_IPV4 IPPROTO_IPV4 +#define IPPROTO_IPV6 IPPROTO_IPV6 +#define IPPROTO_ROUTING IPPROTO_ROUTING +#define IPPROTO_FRAGMENT IPPROTO_FRAGMENT +#define IPPROTO_ESP IPPROTO_ESP +#define IPPROTO_AH IPPROTO_AH +#define IPPROTO_ICMPV6 IPPROTO_ICMPV6 +#define IPPROTO_NONE IPPROTO_NONE +#define IPPROTO_DSTOPTS IPPROTO_DSTOPTS +#define IPPROTO_EGP IPPROTO_EGP +#define IPPROTO_PIM IPPROTO_PIM +#define IPPROTO_ICLFXBM IPPROTO_ICLFXBM // WinSock2 only +#define IPPROTO_ST IPPROTO_ST // WinSock2 only +#define IPPROTO_CBT IPPROTO_CBT // WinSock2 only +#define IPPROTO_IGP IPPROTO_IGP // WinSock2 only +#define IPPROTO_RDP IPPROTO_RDP // WinSock2 only +#define IPPROTO_PGM IPPROTO_PGM // WinSock2 only +#define IPPROTO_L2TP IPPROTO_L2TP // WinSock2 only +#define IPPROTO_SCTP IPPROTO_SCTP // WinSock2 only +#endif /* MS_WINDOWS */ + /* Provides the IsWindows7SP1OrGreater() function */ #include @@ -356,7 +390,7 @@ remove_unusable_flags(PyObject *m) for (int i=0; i https://github.com/python/cpython/commit/dffe90ee0eaf77785ad3d4ad7fb3249430ed1cb9 commit: dffe90ee0eaf77785ad3d4ad7fb3249430ed1cb9 branch: 2.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-28T07:44:21-07:00 summary: bpo-36459: Fix a possible double PyMem_FREE() due to tokenizer.c's tok_nextc() (12601) Remove the PyMem_FREE() call added in cb90c89. The buffer will be freed when PyTokenizer_Free() is called on the tokenizer state. (cherry picked from commit cda139d1ded6708665b53e4ed32ccc1d2627e1da) Co-authored-by: Zackery Spytz files: A Misc/NEWS.d/next/Core and Builtins/2019-03-27-22-35-16.bpo-36459.UAvkKp.rst M Parser/tokenizer.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-27-22-35-16.bpo-36459.UAvkKp.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-27-22-35-16.bpo-36459.UAvkKp.rst new file mode 100644 index 000000000000..6c234a6a76d9 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-27-22-35-16.bpo-36459.UAvkKp.rst @@ -0,0 +1 @@ +Fix a possible double ``PyMem_FREE()`` due to tokenizer.c's ``tok_nextc()``. diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index 6d7869c88e22..89666611940c 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -979,7 +979,6 @@ tok_nextc(register struct tok_state *tok) newbuf = (char *)PyMem_REALLOC(newbuf, newsize); if (newbuf == NULL) { - PyMem_FREE(tok->buf); tok->done = E_NOMEM; tok->cur = tok->inp; return EOF; From webhook-mailer at python.org Thu Mar 28 11:08:50 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 28 Mar 2019 15:08:50 -0000 Subject: [Python-checkins] bpo-36459: Fix a possible double PyMem_FREE() due to tokenizer.c's tok_nextc() (12601) Message-ID: https://github.com/python/cpython/commit/6fd3c852b15820480ad2ea83e7857615c4976304 commit: 6fd3c852b15820480ad2ea83e7857615c4976304 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-28T08:08:35-07:00 summary: bpo-36459: Fix a possible double PyMem_FREE() due to tokenizer.c's tok_nextc() (12601) Remove the PyMem_FREE() call added in cb90c89. The buffer will be freed when PyTokenizer_Free() is called on the tokenizer state. (cherry picked from commit cda139d1ded6708665b53e4ed32ccc1d2627e1da) Co-authored-by: Zackery Spytz files: A Misc/NEWS.d/next/Core and Builtins/2019-03-27-22-35-16.bpo-36459.UAvkKp.rst M Parser/tokenizer.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-27-22-35-16.bpo-36459.UAvkKp.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-27-22-35-16.bpo-36459.UAvkKp.rst new file mode 100644 index 000000000000..6c234a6a76d9 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-27-22-35-16.bpo-36459.UAvkKp.rst @@ -0,0 +1 @@ +Fix a possible double ``PyMem_FREE()`` due to tokenizer.c's ``tok_nextc()``. diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index 34722f85b94a..e374c5a4aee6 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -1055,7 +1055,6 @@ tok_nextc(struct tok_state *tok) newbuf = (char *)PyMem_REALLOC(newbuf, newsize); if (newbuf == NULL) { - PyMem_FREE(tok->buf); tok->done = E_NOMEM; tok->cur = tok->inp; return EOF; From webhook-mailer at python.org Thu Mar 28 11:32:41 2019 From: webhook-mailer at python.org (Julien Palard) Date: Thu, 28 Mar 2019 15:32:41 -0000 Subject: [Python-checkins] bpo-36425: Add Simplified Chinese to the language switcher (GH-12537) Message-ID: https://github.com/python/cpython/commit/45a5fdb91cee665161a8b1980bb4e6ccb999f58f commit: 45a5fdb91cee665161a8b1980bb4e6ccb999f58f branch: master author: zhsj committer: Julien Palard date: 2019-03-28T16:32:25+01:00 summary: bpo-36425: Add Simplified Chinese to the language switcher (GH-12537) files: A Misc/NEWS.d/next/Documentation/2019-03-27-22-46-00.bpo-36425.kG9gx1.rst M Doc/tools/static/switchers.js diff --git a/Doc/tools/static/switchers.js b/Doc/tools/static/switchers.js index 20dad93d6a5e..346b31494e60 100644 --- a/Doc/tools/static/switchers.js +++ b/Doc/tools/static/switchers.js @@ -22,6 +22,7 @@ 'fr': 'French', 'ja': 'Japanese', 'ko': 'Korean', + 'zh-cn': 'Simplified Chinese', }; function build_version_select(current_version, current_release) { diff --git a/Misc/NEWS.d/next/Documentation/2019-03-27-22-46-00.bpo-36425.kG9gx1.rst b/Misc/NEWS.d/next/Documentation/2019-03-27-22-46-00.bpo-36425.kG9gx1.rst new file mode 100644 index 000000000000..12bd833a88b5 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-03-27-22-46-00.bpo-36425.kG9gx1.rst @@ -0,0 +1,2 @@ +New documentation translation: `Simplified Chinese +`_. From webhook-mailer at python.org Thu Mar 28 13:59:13 2019 From: webhook-mailer at python.org (Steve Dower) Date: Thu, 28 Mar 2019 17:59:13 -0000 Subject: [Python-checkins] bpo-35941: Fix ssl certificate enumeration for windows (GH-12486) Message-ID: https://github.com/python/cpython/commit/d93fbbf88e4abdd24a0a55e3ddf85b8420c62052 commit: d93fbbf88e4abdd24a0a55e3ddf85b8420c62052 branch: master author: kctherookie <48805853+kctherookie at users.noreply.github.com> committer: Steve Dower date: 2019-03-28T10:59:06-07:00 summary: bpo-35941: Fix ssl certificate enumeration for windows (GH-12486) Add a function to collect certificates from several certificate stores into one certificate collection store that is then enumerated. This ensures we load as many certificates as we can access. files: A Misc/NEWS.d/next/Windows/2019-03-28-03-51-16.bpo-35941.UnlAEE.rst M Modules/_ssl.c diff --git a/Misc/NEWS.d/next/Windows/2019-03-28-03-51-16.bpo-35941.UnlAEE.rst b/Misc/NEWS.d/next/Windows/2019-03-28-03-51-16.bpo-35941.UnlAEE.rst new file mode 100644 index 000000000000..cda654bfa5b9 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-03-28-03-51-16.bpo-35941.UnlAEE.rst @@ -0,0 +1,3 @@ +enum_certificates function of the ssl module now returns certificates from all available certificate stores inside windows in a query instead of returning only certificates from the system wide certificate store. +This includes certificates from these certificate stores: local machine, local machine enterprise, local machine group policy, current user, current user group policy, services, users. +ssl.enum_crls() function is changed in the same way to return all certificate revocation lists inside the windows certificate revocation list stores. \ No newline at end of file diff --git a/Modules/_ssl.c b/Modules/_ssl.c index f2ce7fa627ee..f8ae916735f4 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -5400,6 +5400,68 @@ parseKeyUsage(PCCERT_CONTEXT pCertCtx, DWORD flags) return retval; } +static HCERTSTORE +ssl_collect_certificates(const char *store_name) +{ +/* this function collects the system certificate stores listed in + * system_stores into a collection certificate store for being + * enumerated. The store must be readable to be added to the + * store collection. + */ + + HCERTSTORE hCollectionStore = NULL, hSystemStore = NULL; + static DWORD system_stores[] = { + CERT_SYSTEM_STORE_LOCAL_MACHINE, + CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE, + CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY, + CERT_SYSTEM_STORE_CURRENT_USER, + CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY, + CERT_SYSTEM_STORE_SERVICES, + CERT_SYSTEM_STORE_USERS}; + size_t i, storesAdded; + BOOL result; + + hCollectionStore = CertOpenStore(CERT_STORE_PROV_COLLECTION, 0, + (HCRYPTPROV)NULL, 0, NULL); + if (!hCollectionStore) { + return NULL; + } + storesAdded = 0; + for (i = 0; i < sizeof(system_stores) / sizeof(DWORD); i++) { + hSystemStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_A, 0, + (HCRYPTPROV)NULL, + CERT_STORE_READONLY_FLAG | + system_stores[i], store_name); + if (hSystemStore) { + result = CertAddStoreToCollection(hCollectionStore, hSystemStore, + CERT_PHYSICAL_STORE_ADD_ENABLE_FLAG, 0); + if (result) { + ++storesAdded; + } + } + } + if (storesAdded == 0) { + CertCloseStore(hCollectionStore, CERT_CLOSE_STORE_FORCE_FLAG); + return NULL; + } + + return hCollectionStore; +} + +/* code from Objects/listobject.c */ + +static int +list_contains(PyListObject *a, PyObject *el) +{ + Py_ssize_t i; + int cmp; + + for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i) + cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i), + Py_EQ); + return cmp; +} + /*[clinic input] _ssl.enum_certificates store_name: str @@ -5417,7 +5479,7 @@ static PyObject * _ssl_enum_certificates_impl(PyObject *module, const char *store_name) /*[clinic end generated code: output=5134dc8bb3a3c893 input=915f60d70461ea4e]*/ { - HCERTSTORE hStore = NULL; + HCERTSTORE hCollectionStore = NULL; PCCERT_CONTEXT pCertCtx = NULL; PyObject *keyusage = NULL, *cert = NULL, *enc = NULL, *tup = NULL; PyObject *result = NULL; @@ -5426,15 +5488,13 @@ _ssl_enum_certificates_impl(PyObject *module, const char *store_name) if (result == NULL) { return NULL; } - hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_A, 0, (HCRYPTPROV)NULL, - CERT_STORE_READONLY_FLAG | CERT_SYSTEM_STORE_LOCAL_MACHINE, - store_name); - if (hStore == NULL) { + hCollectionStore = ssl_collect_certificates(store_name); + if (hCollectionStore == NULL) { Py_DECREF(result); return PyErr_SetFromWindowsErr(GetLastError()); } - while (pCertCtx = CertEnumCertificatesInStore(hStore, pCertCtx)) { + while (pCertCtx = CertEnumCertificatesInStore(hCollectionStore, pCertCtx)) { cert = PyBytes_FromStringAndSize((const char*)pCertCtx->pbCertEncoded, pCertCtx->cbCertEncoded); if (!cert) { @@ -5464,9 +5524,11 @@ _ssl_enum_certificates_impl(PyObject *module, const char *store_name) enc = NULL; PyTuple_SET_ITEM(tup, 2, keyusage); keyusage = NULL; - if (PyList_Append(result, tup) < 0) { - Py_CLEAR(result); - break; + if (!list_contains((PyListObject*)result, tup)) { + if (PyList_Append(result, tup) < 0) { + Py_CLEAR(result); + break; + } } Py_CLEAR(tup); } @@ -5481,11 +5543,15 @@ _ssl_enum_certificates_impl(PyObject *module, const char *store_name) Py_XDECREF(keyusage); Py_XDECREF(tup); - if (!CertCloseStore(hStore, 0)) { + /* CERT_CLOSE_STORE_FORCE_FLAG forces freeing of memory for all contexts + associated with the store, in this case our collection store and the + associated system stores. */ + if (!CertCloseStore(hCollectionStore, CERT_CLOSE_STORE_FORCE_FLAG)) { /* This error case might shadow another exception.*/ Py_XDECREF(result); return PyErr_SetFromWindowsErr(GetLastError()); } + return result; } @@ -5505,7 +5571,7 @@ static PyObject * _ssl_enum_crls_impl(PyObject *module, const char *store_name) /*[clinic end generated code: output=bce467f60ccd03b6 input=a1f1d7629f1c5d3d]*/ { - HCERTSTORE hStore = NULL; + HCERTSTORE hCollectionStore = NULL; PCCRL_CONTEXT pCrlCtx = NULL; PyObject *crl = NULL, *enc = NULL, *tup = NULL; PyObject *result = NULL; @@ -5514,15 +5580,13 @@ _ssl_enum_crls_impl(PyObject *module, const char *store_name) if (result == NULL) { return NULL; } - hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_A, 0, (HCRYPTPROV)NULL, - CERT_STORE_READONLY_FLAG | CERT_SYSTEM_STORE_LOCAL_MACHINE, - store_name); - if (hStore == NULL) { + hCollectionStore = ssl_collect_certificates(store_name); + if (hCollectionStore == NULL) { Py_DECREF(result); return PyErr_SetFromWindowsErr(GetLastError()); } - while (pCrlCtx = CertEnumCRLsInStore(hStore, pCrlCtx)) { + while (pCrlCtx = CertEnumCRLsInStore(hCollectionStore, pCrlCtx)) { crl = PyBytes_FromStringAndSize((const char*)pCrlCtx->pbCrlEncoded, pCrlCtx->cbCrlEncoded); if (!crl) { @@ -5542,9 +5606,11 @@ _ssl_enum_crls_impl(PyObject *module, const char *store_name) PyTuple_SET_ITEM(tup, 1, enc); enc = NULL; - if (PyList_Append(result, tup) < 0) { - Py_CLEAR(result); - break; + if (!list_contains((PyListObject*)result, tup)) { + if (PyList_Append(result, tup) < 0) { + Py_CLEAR(result); + break; + } } Py_CLEAR(tup); } @@ -5558,7 +5624,10 @@ _ssl_enum_crls_impl(PyObject *module, const char *store_name) Py_XDECREF(enc); Py_XDECREF(tup); - if (!CertCloseStore(hStore, 0)) { + /* CERT_CLOSE_STORE_FORCE_FLAG forces freeing of memory for all contexts + associated with the store, in this case our collection store and the + associated system stores. */ + if (!CertCloseStore(hCollectionStore, CERT_CLOSE_STORE_FORCE_FLAG)) { /* This error case might shadow another exception.*/ Py_XDECREF(result); return PyErr_SetFromWindowsErr(GetLastError()); From webhook-mailer at python.org Thu Mar 28 14:12:49 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 28 Mar 2019 18:12:49 -0000 Subject: [Python-checkins] bpo-36425: Add Simplified Chinese to the language switcher (GH-12537) Message-ID: https://github.com/python/cpython/commit/1d9f1a0c9690f4e53003dc5e625a2867715c828a commit: 1d9f1a0c9690f4e53003dc5e625a2867715c828a branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-28T11:12:39-07:00 summary: bpo-36425: Add Simplified Chinese to the language switcher (GH-12537) (cherry picked from commit 45a5fdb91cee665161a8b1980bb4e6ccb999f58f) Co-authored-by: zhsj files: A Misc/NEWS.d/next/Documentation/2019-03-27-22-46-00.bpo-36425.kG9gx1.rst M Doc/tools/static/switchers.js diff --git a/Doc/tools/static/switchers.js b/Doc/tools/static/switchers.js index 20dad93d6a5e..346b31494e60 100644 --- a/Doc/tools/static/switchers.js +++ b/Doc/tools/static/switchers.js @@ -22,6 +22,7 @@ 'fr': 'French', 'ja': 'Japanese', 'ko': 'Korean', + 'zh-cn': 'Simplified Chinese', }; function build_version_select(current_version, current_release) { diff --git a/Misc/NEWS.d/next/Documentation/2019-03-27-22-46-00.bpo-36425.kG9gx1.rst b/Misc/NEWS.d/next/Documentation/2019-03-27-22-46-00.bpo-36425.kG9gx1.rst new file mode 100644 index 000000000000..12bd833a88b5 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-03-27-22-46-00.bpo-36425.kG9gx1.rst @@ -0,0 +1,2 @@ +New documentation translation: `Simplified Chinese +`_. From webhook-mailer at python.org Thu Mar 28 14:56:56 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 28 Mar 2019 18:56:56 -0000 Subject: [Python-checkins] bpo-35941: Fix ssl certificate enumeration for windows (GH-12486) Message-ID: https://github.com/python/cpython/commit/e9868c5416731f5ca5378a1d36e4b020c349291c commit: e9868c5416731f5ca5378a1d36e4b020c349291c branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-28T11:56:50-07:00 summary: bpo-35941: Fix ssl certificate enumeration for windows (GH-12486) Add a function to collect certificates from several certificate stores into one certificate collection store that is then enumerated. This ensures we load as many certificates as we can access. (cherry picked from commit d93fbbf88e4abdd24a0a55e3ddf85b8420c62052) Co-authored-by: kctherookie <48805853+kctherookie at users.noreply.github.com> files: A Misc/NEWS.d/next/Windows/2019-03-28-03-51-16.bpo-35941.UnlAEE.rst M Modules/_ssl.c diff --git a/Misc/NEWS.d/next/Windows/2019-03-28-03-51-16.bpo-35941.UnlAEE.rst b/Misc/NEWS.d/next/Windows/2019-03-28-03-51-16.bpo-35941.UnlAEE.rst new file mode 100644 index 000000000000..cda654bfa5b9 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-03-28-03-51-16.bpo-35941.UnlAEE.rst @@ -0,0 +1,3 @@ +enum_certificates function of the ssl module now returns certificates from all available certificate stores inside windows in a query instead of returning only certificates from the system wide certificate store. +This includes certificates from these certificate stores: local machine, local machine enterprise, local machine group policy, current user, current user group policy, services, users. +ssl.enum_crls() function is changed in the same way to return all certificate revocation lists inside the windows certificate revocation list stores. \ No newline at end of file diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 7076fddf8dd4..fff1a28843d0 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -5401,6 +5401,68 @@ parseKeyUsage(PCCERT_CONTEXT pCertCtx, DWORD flags) return retval; } +static HCERTSTORE +ssl_collect_certificates(const char *store_name) +{ +/* this function collects the system certificate stores listed in + * system_stores into a collection certificate store for being + * enumerated. The store must be readable to be added to the + * store collection. + */ + + HCERTSTORE hCollectionStore = NULL, hSystemStore = NULL; + static DWORD system_stores[] = { + CERT_SYSTEM_STORE_LOCAL_MACHINE, + CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE, + CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY, + CERT_SYSTEM_STORE_CURRENT_USER, + CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY, + CERT_SYSTEM_STORE_SERVICES, + CERT_SYSTEM_STORE_USERS}; + size_t i, storesAdded; + BOOL result; + + hCollectionStore = CertOpenStore(CERT_STORE_PROV_COLLECTION, 0, + (HCRYPTPROV)NULL, 0, NULL); + if (!hCollectionStore) { + return NULL; + } + storesAdded = 0; + for (i = 0; i < sizeof(system_stores) / sizeof(DWORD); i++) { + hSystemStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_A, 0, + (HCRYPTPROV)NULL, + CERT_STORE_READONLY_FLAG | + system_stores[i], store_name); + if (hSystemStore) { + result = CertAddStoreToCollection(hCollectionStore, hSystemStore, + CERT_PHYSICAL_STORE_ADD_ENABLE_FLAG, 0); + if (result) { + ++storesAdded; + } + } + } + if (storesAdded == 0) { + CertCloseStore(hCollectionStore, CERT_CLOSE_STORE_FORCE_FLAG); + return NULL; + } + + return hCollectionStore; +} + +/* code from Objects/listobject.c */ + +static int +list_contains(PyListObject *a, PyObject *el) +{ + Py_ssize_t i; + int cmp; + + for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i) + cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i), + Py_EQ); + return cmp; +} + /*[clinic input] _ssl.enum_certificates store_name: str @@ -5418,7 +5480,7 @@ static PyObject * _ssl_enum_certificates_impl(PyObject *module, const char *store_name) /*[clinic end generated code: output=5134dc8bb3a3c893 input=915f60d70461ea4e]*/ { - HCERTSTORE hStore = NULL; + HCERTSTORE hCollectionStore = NULL; PCCERT_CONTEXT pCertCtx = NULL; PyObject *keyusage = NULL, *cert = NULL, *enc = NULL, *tup = NULL; PyObject *result = NULL; @@ -5427,15 +5489,13 @@ _ssl_enum_certificates_impl(PyObject *module, const char *store_name) if (result == NULL) { return NULL; } - hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_A, 0, (HCRYPTPROV)NULL, - CERT_STORE_READONLY_FLAG | CERT_SYSTEM_STORE_LOCAL_MACHINE, - store_name); - if (hStore == NULL) { + hCollectionStore = ssl_collect_certificates(store_name); + if (hCollectionStore == NULL) { Py_DECREF(result); return PyErr_SetFromWindowsErr(GetLastError()); } - while (pCertCtx = CertEnumCertificatesInStore(hStore, pCertCtx)) { + while (pCertCtx = CertEnumCertificatesInStore(hCollectionStore, pCertCtx)) { cert = PyBytes_FromStringAndSize((const char*)pCertCtx->pbCertEncoded, pCertCtx->cbCertEncoded); if (!cert) { @@ -5465,9 +5525,11 @@ _ssl_enum_certificates_impl(PyObject *module, const char *store_name) enc = NULL; PyTuple_SET_ITEM(tup, 2, keyusage); keyusage = NULL; - if (PyList_Append(result, tup) < 0) { - Py_CLEAR(result); - break; + if (!list_contains((PyListObject*)result, tup)) { + if (PyList_Append(result, tup) < 0) { + Py_CLEAR(result); + break; + } } Py_CLEAR(tup); } @@ -5482,11 +5544,15 @@ _ssl_enum_certificates_impl(PyObject *module, const char *store_name) Py_XDECREF(keyusage); Py_XDECREF(tup); - if (!CertCloseStore(hStore, 0)) { + /* CERT_CLOSE_STORE_FORCE_FLAG forces freeing of memory for all contexts + associated with the store, in this case our collection store and the + associated system stores. */ + if (!CertCloseStore(hCollectionStore, CERT_CLOSE_STORE_FORCE_FLAG)) { /* This error case might shadow another exception.*/ Py_XDECREF(result); return PyErr_SetFromWindowsErr(GetLastError()); } + return result; } @@ -5506,7 +5572,7 @@ static PyObject * _ssl_enum_crls_impl(PyObject *module, const char *store_name) /*[clinic end generated code: output=bce467f60ccd03b6 input=a1f1d7629f1c5d3d]*/ { - HCERTSTORE hStore = NULL; + HCERTSTORE hCollectionStore = NULL; PCCRL_CONTEXT pCrlCtx = NULL; PyObject *crl = NULL, *enc = NULL, *tup = NULL; PyObject *result = NULL; @@ -5515,15 +5581,13 @@ _ssl_enum_crls_impl(PyObject *module, const char *store_name) if (result == NULL) { return NULL; } - hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_A, 0, (HCRYPTPROV)NULL, - CERT_STORE_READONLY_FLAG | CERT_SYSTEM_STORE_LOCAL_MACHINE, - store_name); - if (hStore == NULL) { + hCollectionStore = ssl_collect_certificates(store_name); + if (hCollectionStore == NULL) { Py_DECREF(result); return PyErr_SetFromWindowsErr(GetLastError()); } - while (pCrlCtx = CertEnumCRLsInStore(hStore, pCrlCtx)) { + while (pCrlCtx = CertEnumCRLsInStore(hCollectionStore, pCrlCtx)) { crl = PyBytes_FromStringAndSize((const char*)pCrlCtx->pbCrlEncoded, pCrlCtx->cbCrlEncoded); if (!crl) { @@ -5543,9 +5607,11 @@ _ssl_enum_crls_impl(PyObject *module, const char *store_name) PyTuple_SET_ITEM(tup, 1, enc); enc = NULL; - if (PyList_Append(result, tup) < 0) { - Py_CLEAR(result); - break; + if (!list_contains((PyListObject*)result, tup)) { + if (PyList_Append(result, tup) < 0) { + Py_CLEAR(result); + break; + } } Py_CLEAR(tup); } @@ -5559,7 +5625,10 @@ _ssl_enum_crls_impl(PyObject *module, const char *store_name) Py_XDECREF(enc); Py_XDECREF(tup); - if (!CertCloseStore(hStore, 0)) { + /* CERT_CLOSE_STORE_FORCE_FLAG forces freeing of memory for all contexts + associated with the store, in this case our collection store and the + associated system stores. */ + if (!CertCloseStore(hCollectionStore, CERT_CLOSE_STORE_FORCE_FLAG)) { /* This error case might shadow another exception.*/ Py_XDECREF(result); return PyErr_SetFromWindowsErr(GetLastError()); From webhook-mailer at python.org Thu Mar 28 16:38:35 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 28 Mar 2019 20:38:35 -0000 Subject: [Python-checkins] Fix typo in email.encoders doc (GH-9700) Message-ID: https://github.com/python/cpython/commit/e63fc11b1d64d9586003ce4aebf4eb2fdcaf8125 commit: e63fc11b1d64d9586003ce4aebf4eb2fdcaf8125 branch: master author: ksamuel committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-28T13:38:30-07:00 summary: Fix typo in email.encoders doc (GH-9700) Make the encoding/encoders mention congruent. files: M Doc/library/email.encoders.rst diff --git a/Doc/library/email.encoders.rst b/Doc/library/email.encoders.rst index e24ac7b90d29..70bf61323c39 100644 --- a/Doc/library/email.encoders.rst +++ b/Doc/library/email.encoders.rst @@ -19,7 +19,7 @@ need to encode the payloads for transport through compliant mail servers. This is especially true for :mimetype:`image/\*` and :mimetype:`text/\*` type messages containing binary data. -The :mod:`email` package provides some convenient encodings in its +The :mod:`email` package provides some convenient encoders in its :mod:`encoders` module. These encoders are actually used by the :class:`~email.mime.audio.MIMEAudio` and :class:`~email.mime.image.MIMEImage` class constructors to provide default encodings. All encoder functions take From webhook-mailer at python.org Thu Mar 28 17:06:48 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 28 Mar 2019 21:06:48 -0000 Subject: [Python-checkins] Fixed capital letters missing and missing . (GH-12584) Message-ID: https://github.com/python/cpython/commit/3d78c4a6e5ae91eaf337b6f5cc6e8bb01af7c7b1 commit: 3d78c4a6e5ae91eaf337b6f5cc6e8bb01af7c7b1 branch: master author: Jules Lasne (jlasne) committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-28T14:06:27-07:00 summary: Fixed capital letters missing and missing . (GH-12584) No `bpo` for minor doc fix files: M Doc/library/unittest.rst diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index d1b4f3ba0bbb..8ad2abd3d89a 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -1000,7 +1000,7 @@ Test cases int('XYZ') .. versionadded:: 3.1 - under the name ``assertRaisesRegexp``. + Added under the name ``assertRaisesRegexp``. .. versionchanged:: 3.2 Renamed to :meth:`assertRaisesRegex`. @@ -1145,7 +1145,7 @@ Test cases +---------------------------------------+--------------------------------+--------------+ | :meth:`assertCountEqual(a, b) | *a* and *b* have the same | 3.2 | | ` | elements in the same number, | | - | | regardless of their order | | + | | regardless of their order. | | +---------------------------------------+--------------------------------+--------------+ @@ -1193,7 +1193,7 @@ Test cases expression suitable for use by :func:`re.search`. .. versionadded:: 3.1 - under the name ``assertRegexpMatches``. + Added under the name ``assertRegexpMatches``. .. versionchanged:: 3.2 The method ``assertRegexpMatches()`` has been renamed to :meth:`.assertRegex`. @@ -1516,14 +1516,14 @@ along with their deprecated aliases: ============================== ====================== ======================= .. deprecated:: 3.1 - the fail* aliases listed in the second column. + The fail* aliases listed in the second column have been deprecated. .. deprecated:: 3.2 - the assert* aliases listed in the third column. + The assert* aliases listed in the third column have been deprecated. .. deprecated:: 3.2 ``assertRegexpMatches`` and ``assertRaisesRegexp`` have been renamed to :meth:`.assertRegex` and :meth:`.assertRaisesRegex`. .. deprecated:: 3.5 - the ``assertNotRegexpMatches`` name in favor of :meth:`.assertNotRegex`. + The ``assertNotRegexpMatches`` name is deprecated in favor of :meth:`.assertNotRegex`. .. _testsuite-objects: From webhook-mailer at python.org Thu Mar 28 17:08:47 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 28 Mar 2019 21:08:47 -0000 Subject: [Python-checkins] bpo-36366: Return None on stopping unstarted patch object (GH-12472) Message-ID: https://github.com/python/cpython/commit/02b84cb1b4f5407309c81c8b1ae0397355d6e568 commit: 02b84cb1b4f5407309c81c8b1ae0397355d6e568 branch: master author: Xtreak committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-28T14:08:43-07:00 summary: bpo-36366: Return None on stopping unstarted patch object (GH-12472) Return None after calling unittest.mock.patch.object.stop() regardless of whether the object was started. This makes the method idempotent. https://bugs.python.org/issue36366 files: A Misc/NEWS.d/next/Library/2019-03-20-15-13-18.bpo-36366.n0eav_.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 fdde16be03a3..8684f1dfa572 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -1398,7 +1398,7 @@ def __enter__(self): def __exit__(self, *exc_info): """Undo the patch.""" if not _is_started(self): - raise RuntimeError('stop called on unstarted patcher') + return if self.is_local and self.temp_original is not DEFAULT: setattr(self.target, self.attribute, self.temp_original) diff --git a/Lib/unittest/test/testmock/testpatch.py b/Lib/unittest/test/testmock/testpatch.py index c484adb60508..2c14360b2df5 100644 --- a/Lib/unittest/test/testmock/testpatch.py +++ b/Lib/unittest/test/testmock/testpatch.py @@ -772,10 +772,18 @@ def test_patch_start_stop(self): def test_stop_without_start(self): + # bpo-36366: calling stop without start will return None. patcher = patch(foo_name, 'bar', 3) + self.assertIsNone(patcher.stop()) - # calling stop without start used to produce a very obscure error - self.assertRaises(RuntimeError, patcher.stop) + + def test_stop_idempotent(self): + # bpo-36366: calling stop on an already stopped patch will return None. + patcher = patch(foo_name, 'bar', 3) + + patcher.start() + patcher.stop() + self.assertIsNone(patcher.stop()) def test_patchobject_start_stop(self): diff --git a/Misc/NEWS.d/next/Library/2019-03-20-15-13-18.bpo-36366.n0eav_.rst b/Misc/NEWS.d/next/Library/2019-03-20-15-13-18.bpo-36366.n0eav_.rst new file mode 100644 index 000000000000..a43504839c6f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-20-15-13-18.bpo-36366.n0eav_.rst @@ -0,0 +1,4 @@ +Calling ``stop()`` on an unstarted or stopped :func:`unittest.mock.patch` +object will now return `None` instead of raising :exc:`RuntimeError`, +making the method idempotent. +Patch byKarthikeyan Singaravelan. From webhook-mailer at python.org Thu Mar 28 17:47:28 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 28 Mar 2019 21:47:28 -0000 Subject: [Python-checkins] bpo-30427: eliminate redundant type checks in os.path.normcase() (GH-1712) Message-ID: https://github.com/python/cpython/commit/74510e2a57f6d4b51ac1ab4f778cd7a4c54b541e commit: 74510e2a57f6d4b51ac1ab4f778cd7a4c54b541e branch: master author: Wolfgang Maier committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-03-28T14:47:18-07:00 summary: bpo-30427: eliminate redundant type checks in os.path.normcase() (GH-1712) https://bugs.python.org/issue30427 files: A Misc/NEWS.d/next/Library/2019-03-28-21-17-08.bpo-30427.lxzvbw.rst M Lib/ntpath.py M Lib/posixpath.py diff --git a/Lib/ntpath.py b/Lib/ntpath.py index b5e1d121fc57..f3cfabf0238e 100644 --- a/Lib/ntpath.py +++ b/Lib/ntpath.py @@ -46,16 +46,10 @@ def normcase(s): Makes all characters lowercase and all slashes into backslashes.""" s = os.fspath(s) - try: - if isinstance(s, bytes): - return s.replace(b'/', b'\\').lower() - else: - return s.replace('/', '\\').lower() - except (TypeError, AttributeError): - if not isinstance(s, (bytes, str)): - raise TypeError("normcase() argument must be str or bytes, " - "not %r" % s.__class__.__name__) from None - raise + if isinstance(s, bytes): + return s.replace(b'/', b'\\').lower() + else: + return s.replace('/', '\\').lower() # Return whether a path is absolute. diff --git a/Lib/posixpath.py b/Lib/posixpath.py index 12ab2eadbf9b..21ce72fd79cd 100644 --- a/Lib/posixpath.py +++ b/Lib/posixpath.py @@ -51,11 +51,7 @@ def _get_sep(path): def normcase(s): """Normalize case of pathname. Has no effect under Posix""" - s = os.fspath(s) - if not isinstance(s, (bytes, str)): - raise TypeError("normcase() argument must be str or bytes, " - "not '{}'".format(s.__class__.__name__)) - return s + return os.fspath(s) # Return whether a path is absolute. diff --git a/Misc/NEWS.d/next/Library/2019-03-28-21-17-08.bpo-30427.lxzvbw.rst b/Misc/NEWS.d/next/Library/2019-03-28-21-17-08.bpo-30427.lxzvbw.rst new file mode 100644 index 000000000000..80e7c4a15e52 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-28-21-17-08.bpo-30427.lxzvbw.rst @@ -0,0 +1,2 @@ +``os.path.normcase()`` relies on ``os.fspath()`` to check the type of its argument. Redundant checks have been removed from its ``posixpath.normcase()`` and ``ntpath.normcase()`` implementations. +Patch by Wolfgang Maier. From webhook-mailer at python.org Thu Mar 28 21:55:30 2019 From: webhook-mailer at python.org (Carol Willing) Date: Fri, 29 Mar 2019 01:55:30 -0000 Subject: [Python-checkins] bpo-33043: Add a Contributing to Docs link and Update the Found a Bug Page (#12006) Message-ID: https://github.com/python/cpython/commit/081158e3ba20dfa95d09cd652a44e271b95eb14c commit: 081158e3ba20dfa95d09cd652a44e271b95eb14c branch: master author: Susan Su committer: Carol Willing date: 2019-03-28T18:55:24-07:00 summary: bpo-33043: Add a Contributing to Docs link and Update the Found a Bug Page (#12006) * changes to html file -> added contributing to docs link at the end of the page * revisions to the dealing with bugs page. added more links in the documentation bugs section * ?? Added by blurb_it. * Update Doc/bugs.rst Updated Doc/bugs.rst in accordance with willingc and JulienPalard suggestions. Co-Authored-By: suhearsawho files: A Misc/NEWS.d/next/Documentation/2019-02-24-03-15-10.bpo-33043.8knWTS.rst M Doc/bugs.rst M Doc/tools/templates/indexcontent.html diff --git a/Doc/bugs.rst b/Doc/bugs.rst index c449ba2e7192..1e044ad2033d 100644 --- a/Doc/bugs.rst +++ b/Doc/bugs.rst @@ -25,7 +25,15 @@ docs at python.org (behavioral bugs can be sent to python-list at python.org). though it may take a while to be processed. .. seealso:: - `Documentation bugs`_ on the Python issue tracker + + `Documentation bugs`_ + A list of documentation bugs that have been submitted to the Python issue tracker. + + `Issue Tracking `_ + Overview of the process involved in reporting an improvement on the tracker. + + `Helping with Documentation `_ + Comprehensive guide for individuals that are interested in contributing to Python documentation. .. _using-the-tracker: diff --git a/Doc/tools/templates/indexcontent.html b/Doc/tools/templates/indexcontent.html index d795c0a5586b..152162ab0dd2 100644 --- a/Doc/tools/templates/indexcontent.html +++ b/Doc/tools/templates/indexcontent.html @@ -57,6 +57,7 @@

{{ docstitle|e }}

+ diff --git a/Misc/NEWS.d/next/Documentation/2019-02-24-03-15-10.bpo-33043.8knWTS.rst b/Misc/NEWS.d/next/Documentation/2019-02-24-03-15-10.bpo-33043.8knWTS.rst new file mode 100644 index 000000000000..124aa5e027ab --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-02-24-03-15-10.bpo-33043.8knWTS.rst @@ -0,0 +1 @@ +Updates the docs.python.org page with the addition of a 'Contributing to Docs' link at the end of the page (between 'Reporting Bugs' and 'About Documentation'). Updates the 'Found a Bug' page with additional links and information in the Documentation Bugs section. \ No newline at end of file From webhook-mailer at python.org Thu Mar 28 22:11:12 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 29 Mar 2019 02:11:12 -0000 Subject: [Python-checkins] Fixed capital letters missing and missing . (GH-12584) Message-ID: https://github.com/python/cpython/commit/40ee9a3640d702bce127e9877c82a99ce817f0d1 commit: 40ee9a3640d702bce127e9877c82a99ce817f0d1 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-28T19:11:06-07:00 summary: Fixed capital letters missing and missing . (GH-12584) No `bpo` for minor doc fix (cherry picked from commit 3d78c4a6e5ae91eaf337b6f5cc6e8bb01af7c7b1) Co-authored-by: Jules Lasne (jlasne) files: M Doc/library/unittest.rst diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index 3e9e38c074a2..13230daf85f0 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -1000,7 +1000,7 @@ Test cases int('XYZ') .. versionadded:: 3.1 - under the name ``assertRaisesRegexp``. + Added under the name ``assertRaisesRegexp``. .. versionchanged:: 3.2 Renamed to :meth:`assertRaisesRegex`. @@ -1145,7 +1145,7 @@ Test cases +---------------------------------------+--------------------------------+--------------+ | :meth:`assertCountEqual(a, b) | *a* and *b* have the same | 3.2 | | ` | elements in the same number, | | - | | regardless of their order | | + | | regardless of their order. | | +---------------------------------------+--------------------------------+--------------+ @@ -1193,7 +1193,7 @@ Test cases expression suitable for use by :func:`re.search`. .. versionadded:: 3.1 - under the name ``assertRegexpMatches``. + Added under the name ``assertRegexpMatches``. .. versionchanged:: 3.2 The method ``assertRegexpMatches()`` has been renamed to :meth:`.assertRegex`. @@ -1483,14 +1483,14 @@ along with their deprecated aliases: ============================== ====================== ======================= .. deprecated:: 3.1 - the fail* aliases listed in the second column. + The fail* aliases listed in the second column have been deprecated. .. deprecated:: 3.2 - the assert* aliases listed in the third column. + The assert* aliases listed in the third column have been deprecated. .. deprecated:: 3.2 ``assertRegexpMatches`` and ``assertRaisesRegexp`` have been renamed to :meth:`.assertRegex` and :meth:`.assertRaisesRegex`. .. deprecated:: 3.5 - the ``assertNotRegexpMatches`` name in favor of :meth:`.assertNotRegex`. + The ``assertNotRegexpMatches`` name is deprecated in favor of :meth:`.assertNotRegex`. .. _testsuite-objects: From webhook-mailer at python.org Thu Mar 28 22:15:37 2019 From: webhook-mailer at python.org (Carol Willing) Date: Fri, 29 Mar 2019 02:15:37 -0000 Subject: [Python-checkins] bpo-36064: Clarify allowed data types for urllib.request.Request. (GH-11990) Message-ID: https://github.com/python/cpython/commit/9e30fbac019d9c0a31d444a711e845c7e883caf5 commit: 9e30fbac019d9c0a31d444a711e845c7e883caf5 branch: master author: Julien Palard committer: Carol Willing date: 2019-03-28T19:15:34-07:00 summary: bpo-36064: Clarify allowed data types for urllib.request.Request. (GH-11990) files: M Doc/library/urllib.request.rst diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst index 289bfcaebc3d..f56da1b341fe 100644 --- a/Doc/library/urllib.request.rst +++ b/Doc/library/urllib.request.rst @@ -192,8 +192,8 @@ The following classes are provided: *data* must be an object specifying additional data to send to the server, or ``None`` if no such data is needed. Currently HTTP requests are the only ones that use *data*. The supported object - types include bytes, file-like objects, and iterables. If no - ``Content-Length`` nor ``Transfer-Encoding`` header field + types include bytes, file-like objects, and iterables of bytes-like objects. + If no ``Content-Length`` nor ``Transfer-Encoding`` header field has been provided, :class:`HTTPHandler` will set these headers according to the type of *data*. ``Content-Length`` will be used to send bytes objects, while ``Transfer-Encoding: chunked`` as specified in From webhook-mailer at python.org Fri Mar 29 03:49:13 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Fri, 29 Mar 2019 07:49:13 -0000 Subject: [Python-checkins] bpo-35194: cjkcodec: check the encoded value is not truncated (GH-10432) Message-ID: https://github.com/python/cpython/commit/5f45979b63300338b68709bfe817ddae563b93fd commit: 5f45979b63300338b68709bfe817ddae563b93fd branch: master author: Alexey Izbyshev committer: Inada Naoki date: 2019-03-29T16:48:47+09:00 summary: bpo-35194: cjkcodec: check the encoded value is not truncated (GH-10432) files: M Modules/cjkcodecs/cjkcodecs.h diff --git a/Modules/cjkcodecs/cjkcodecs.h b/Modules/cjkcodecs/cjkcodecs.h index 2ae28ecbe207..b67f3482faf8 100644 --- a/Modules/cjkcodecs/cjkcodecs.h +++ b/Modules/cjkcodecs/cjkcodecs.h @@ -149,40 +149,42 @@ static const struct dbcs_map *mapping_list; writer->pos += 2; \ } while (0) -#define OUTBYTE1(c) \ - do { ((*outbuf)[0]) = (c); } while (0) -#define OUTBYTE2(c) \ - do { ((*outbuf)[1]) = (c); } while (0) -#define OUTBYTE3(c) \ - do { ((*outbuf)[2]) = (c); } while (0) -#define OUTBYTE4(c) \ - do { ((*outbuf)[3]) = (c); } while (0) +#define OUTBYTEI(c, i) \ + do { \ + assert((unsigned char)(c) == (c)); \ + ((*outbuf)[i]) = (c); \ + } while (0) + +#define OUTBYTE1(c) OUTBYTEI(c, 0) +#define OUTBYTE2(c) OUTBYTEI(c, 1) +#define OUTBYTE3(c) OUTBYTEI(c, 2) +#define OUTBYTE4(c) OUTBYTEI(c, 3) #define WRITEBYTE1(c1) \ do { \ REQUIRE_OUTBUF(1); \ - (*outbuf)[0] = (c1); \ + OUTBYTE1(c1); \ } while (0) #define WRITEBYTE2(c1, c2) \ do { \ REQUIRE_OUTBUF(2); \ - (*outbuf)[0] = (c1); \ - (*outbuf)[1] = (c2); \ + OUTBYTE1(c1); \ + OUTBYTE2(c2); \ } while (0) #define WRITEBYTE3(c1, c2, c3) \ do { \ REQUIRE_OUTBUF(3); \ - (*outbuf)[0] = (c1); \ - (*outbuf)[1] = (c2); \ - (*outbuf)[2] = (c3); \ + OUTBYTE1(c1); \ + OUTBYTE2(c2); \ + OUTBYTE3(c3); \ } while (0) #define WRITEBYTE4(c1, c2, c3, c4) \ do { \ REQUIRE_OUTBUF(4); \ - (*outbuf)[0] = (c1); \ - (*outbuf)[1] = (c2); \ - (*outbuf)[2] = (c3); \ - (*outbuf)[3] = (c4); \ + OUTBYTE1(c1); \ + OUTBYTE2(c2); \ + OUTBYTE3(c3); \ + OUTBYTE4(c4); \ } while (0) #define _TRYMAP_ENC(m, assi, val) \ From webhook-mailer at python.org Fri Mar 29 10:13:54 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 29 Mar 2019 14:13:54 -0000 Subject: [Python-checkins] bpo-36471: Add _Py_RunMain() (GH-12618) Message-ID: https://github.com/python/cpython/commit/2f54908afc5665937d763510b4430f10cf764641 commit: 2f54908afc5665937d763510b4430f10cf764641 branch: master author: Victor Stinner committer: GitHub date: 2019-03-29T15:13:46+01:00 summary: bpo-36471: Add _Py_RunMain() (GH-12618) * Add config_read_cmdline() subfunction. Remove _PyCmdline structure. * _PyCoreConfig_Read() now also parses config->argv command line arguments files: M Include/cpython/pylifecycle.h M Lib/test/test_embed.py M Modules/main.c M Programs/_testembed.c M Python/coreconfig.c diff --git a/Include/cpython/pylifecycle.h b/Include/cpython/pylifecycle.h index e293b04e3f19..2366c774e7fa 100644 --- a/Include/cpython/pylifecycle.h +++ b/Include/cpython/pylifecycle.h @@ -41,6 +41,9 @@ PyAPI_FUNC(_PyInitError) _Py_InitializeFromWideArgs( int argc, wchar_t **argv); +PyAPI_FUNC(int) _Py_RunMain(void); + + PyAPI_FUNC(void) _Py_NO_RETURN _Py_ExitInitError(_PyInitError err); /* Py_PyAtExit is for the atexit module, Py_AtExit is for low-level diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 164527a664af..cd6027205a92 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -53,7 +53,12 @@ def run_embedded_interpreter(self, *args, env=None): stderr=subprocess.PIPE, universal_newlines=True, env=env) - (out, err) = p.communicate() + try: + (out, err) = p.communicate() + except: + p.terminate() + p.wait() + raise if p.returncode != 0 and support.verbose: print(f"--- {cmd} failed ---") print(f"stdout:\n{out}") @@ -254,6 +259,11 @@ def test_initialize_pymain(self): self.assertEqual(out.rstrip(), "Py_Main() after Py_Initialize: sys.argv=['-c', 'arg2']") self.assertEqual(err, '') + def test_run_main(self): + out, err = self.run_embedded_interpreter("run_main") + self.assertEqual(out.rstrip(), "_Py_RunMain(): sys.argv=['-c', 'arg2']") + self.assertEqual(err, '') + class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): maxDiff = 4096 @@ -549,10 +559,11 @@ def test_init_from_config(self): 'pycache_prefix': 'conf_pycache_prefix', 'program_name': './conf_program_name', - 'argv': ['-c', 'pass'], + 'argv': ['-c', 'arg2'], 'program': 'conf_program', 'xoptions': ['core_xoption1=3', 'core_xoption2=', 'core_xoption3'], 'warnoptions': ['error::ResourceWarning', 'default::BytesWarning'], + 'run_command': 'pass\n', 'site_import': 0, 'bytes_warning': 1, diff --git a/Modules/main.c b/Modules/main.c index 766576939db1..42d2c3c2aeec 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -567,20 +567,22 @@ exit_sigint(void) } -static int -pymain_main(_PyArgv *args) +static void _Py_NO_RETURN +pymain_exit_error(_PyInitError err) { - _PyInitError err; + pymain_free(); + _Py_ExitInitError(err); +} - err = pymain_init(args); - if (_Py_INIT_FAILED(err)) { - goto exit_init_error; - } +int +_Py_RunMain(void) +{ int exitcode = 0; - err = pymain_run_python(&exitcode); + + _PyInitError err = pymain_run_python(&exitcode); if (_Py_INIT_FAILED(err)) { - goto exit_init_error; + pymain_exit_error(err); } if (Py_FinalizeEx() < 0) { @@ -596,10 +598,18 @@ pymain_main(_PyArgv *args) } return exitcode; +} -exit_init_error: - pymain_free(); - _Py_ExitInitError(err); + +static int +pymain_main(_PyArgv *args) +{ + _PyInitError err = pymain_init(args); + if (_Py_INIT_FAILED(err)) { + pymain_exit_error(err); + } + + return _Py_RunMain(); } diff --git a/Programs/_testembed.c b/Programs/_testembed.c index d8e12cf3ffe5..7d71a961602d 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -447,9 +447,11 @@ static int test_init_from_config(void) Py_SetProgramName(L"./globalvar"); config.program_name = L"./conf_program_name"; - static wchar_t* argv[2] = { + static wchar_t* argv[] = { + L"python3", L"-c", L"pass", + L"arg2", }; config.argv.length = Py_ARRAY_LENGTH(argv); config.argv.items = argv; @@ -528,7 +530,6 @@ static int test_init_from_config(void) config._frozen = 1; err = _Py_InitializeFromConfig(&config); - /* Don't call _PyCoreConfig_Clear() since all strings are static */ if (_Py_INIT_FAILED(err)) { _Py_ExitInitError(err); } @@ -712,6 +713,27 @@ static int test_init_dev_mode(void) } +static int test_run_main(void) +{ + _PyCoreConfig config = _PyCoreConfig_INIT; + + wchar_t *argv[] = {L"python3", L"-c", + (L"import sys; " + L"print(f'_Py_RunMain(): sys.argv={sys.argv}')"), + L"arg2"}; + config.argv.length = Py_ARRAY_LENGTH(argv); + config.argv.items = argv; + config.program_name = L"./python3"; + + _PyInitError err = _Py_InitializeFromConfig(&config); + if (_Py_INIT_FAILED(err)) { + _Py_ExitInitError(err); + } + + return _Py_RunMain(); +} + + /* ********************************************************* * List of test cases and the function that implements it. * @@ -748,6 +770,7 @@ static struct TestCase TestCases[] = { { "init_isolated", test_init_isolated }, { "preinit_isolated1", test_preinit_isolated1 }, { "preinit_isolated2", test_preinit_isolated2 }, + { "run_main", test_run_main }, { NULL, NULL } }; diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 13aa2272011f..7b55b06b7a6e 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -1618,33 +1618,34 @@ _PyCoreConfig_Write(const _PyCoreConfig *config) } -/* --- _PyCmdline ------------------------------------------------- */ - -typedef struct { - _PyWstrList cmdline_warnoptions; /* Command line -W options */ - _PyWstrList env_warnoptions; /* PYTHONWARNINGS environment variables */ - int print_help; /* -h, -? options */ - int print_version; /* -V option */ - int need_usage; -} _PyCmdline; - +/* --- _PyCoreConfig command line parser -------------------------- */ static void -cmdline_clear(_PyCmdline *cmdline) +config_usage(int error, const wchar_t* program) { - _PyWstrList_Clear(&cmdline->cmdline_warnoptions); - _PyWstrList_Clear(&cmdline->env_warnoptions); -} + FILE *f = error ? stderr : stdout; + fprintf(f, usage_line, program); + if (error) + fprintf(f, "Try `python -h' for more information.\n"); + else { + fputs(usage_1, f); + fputs(usage_2, f); + fputs(usage_3, f); + fprintf(f, usage_4, (wint_t)DELIM); + fprintf(f, usage_5, (wint_t)DELIM, PYTHONHOMEHELP); + fputs(usage_6, f); + } +} -/* --- _PyCoreConfig command line parser -------------------------- */ /* Parse the command line arguments */ static _PyInitError -config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, - _PyPreCmdline *precmdline) +config_parse_cmdline(_PyCoreConfig *config, _PyPreCmdline *precmdline, + _PyWstrList *warnoptions) { const _PyWstrList *argv = &precmdline->argv; + int print_version = 0; _PyOS_ResetGetOpt(); do { @@ -1698,8 +1699,8 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, } else { fprintf(stderr, "--check-hash-based-pycs must be one of " "'default', 'always', or 'never'\n"); - cmdline->need_usage = 1; - return _Py_INIT_OK(); + config_usage(1, config->program); + return _Py_INIT_EXIT(2); } break; @@ -1758,15 +1759,15 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, case 'h': case '?': - cmdline->print_help++; - break; + config_usage(0, config->program); + return _Py_INIT_EXIT(0); case 'V': - cmdline->print_version++; + print_version++; break; case 'W': - if (_PyWstrList_Append(&cmdline->cmdline_warnoptions, _PyOS_optarg) < 0) { + if (_PyWstrList_Append(warnoptions, _PyOS_optarg) < 0) { return _Py_INIT_NO_MEMORY(); } break; @@ -1783,11 +1784,17 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, default: /* unknown argument: parsing failed */ - cmdline->need_usage = 1; - return _Py_INIT_OK(); + config_usage(1, config->program); + return _Py_INIT_EXIT(2); } } while (1); + if (print_version) { + printf("Python %s\n", + (print_version >= 2) ? Py_GetVersion() : PY_VERSION); + return _Py_INIT_EXIT(0); + } + if (config->run_command == NULL && config->run_module == NULL && _PyOS_optind < argv->length && wcscmp(argv->items[_PyOS_optind], L"-") != 0 @@ -1819,7 +1826,7 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline, /* Get warning options from PYTHONWARNINGS environment variable. */ static _PyInitError -cmdline_init_env_warnoptions(_PyCmdline *cmdline, const _PyCoreConfig *config) +config_init_env_warnoptions(const _PyCoreConfig *config, _PyWstrList *warnoptions) { wchar_t *env; int res = _PyCoreConfig_GetEnvDup(config, &env, @@ -1838,7 +1845,7 @@ cmdline_init_env_warnoptions(_PyCmdline *cmdline, const _PyCoreConfig *config) warning != NULL; warning = WCSTOK(NULL, L",", &context)) { - if (_PyWstrList_Append(&cmdline->env_warnoptions, warning) < 0) { + if (_PyWstrList_Append(warnoptions, warning) < 0) { PyMem_RawFree(env); return _Py_INIT_NO_MEMORY(); } @@ -1883,7 +1890,9 @@ config_add_warnoption(_PyCoreConfig *config, const wchar_t *option) static _PyInitError -config_init_warnoptions(_PyCoreConfig *config, const _PyCmdline *cmdline) +config_init_warnoptions(_PyCoreConfig *config, + const _PyWstrList *cmdline_warnoptions, + const _PyWstrList *env_warnoptions) { /* The priority order for warnings configuration is (highest precedence * first): @@ -1909,14 +1918,14 @@ config_init_warnoptions(_PyCoreConfig *config, const _PyCmdline *cmdline) Py_ssize_t i; const _PyWstrList *options; - options = &cmdline->env_warnoptions; + options = env_warnoptions; for (i = 0; i < options->length; i++) { if (config_add_warnoption(config, options->items[i]) < 0) { return _Py_INIT_NO_MEMORY(); } } - options = &cmdline->cmdline_warnoptions; + options = cmdline_warnoptions; for (i = 0; i < options->length; i++) { if (config_add_warnoption(config, options->items[i]) < 0) { return _Py_INIT_NO_MEMORY(); @@ -1992,36 +2001,14 @@ config_init_argv(_PyCoreConfig *config, const _PyPreCmdline *cmdline) } -static void -config_usage(int error, const wchar_t* program) -{ - FILE *f = error ? stderr : stdout; - - fprintf(f, usage_line, program); - if (error) - fprintf(f, "Try `python -h' for more information.\n"); - else { - fputs(usage_1, f); - fputs(usage_2, f); - fputs(usage_3, f); - fprintf(f, usage_4, (wint_t)DELIM); - fprintf(f, usage_5, (wint_t)DELIM, PYTHONHOMEHELP); - fputs(usage_6, f); - } -} - - static _PyInitError core_read_precmdline(_PyCoreConfig *config, const _PyArgv *args, _PyPreCmdline *precmdline) { _PyInitError err; - if (args) { - err = _PyPreCmdline_SetArgv(precmdline, args); - if (_Py_INIT_FAILED(err)) { - return err; - } + if (_PyWstrList_Copy(&precmdline->argv, &config->argv) < 0) { + return _Py_INIT_NO_MEMORY(); } _PyPreConfig preconfig = _PyPreConfig_INIT; @@ -2040,83 +2027,88 @@ core_read_precmdline(_PyCoreConfig *config, const _PyArgv *args, } -/* Read the configuration into _PyCoreConfig from: - - * Command line arguments - * Environment variables - * Py_xxx global configuration variables */ -_PyInitError -_PyCoreConfig_Read(_PyCoreConfig *config, const _PyArgv *args) +static _PyInitError +config_read_cmdline(_PyCoreConfig *config, _PyPreCmdline *precmdline) { _PyInitError err; + _PyWstrList cmdline_warnoptions = _PyWstrList_INIT; + _PyWstrList env_warnoptions = _PyWstrList_INIT; - err = _Py_PreInitializeFromCoreConfig(config); + err = config_parse_cmdline(config, precmdline, &cmdline_warnoptions); if (_Py_INIT_FAILED(err)) { - return err; + goto done; } - _PyCoreConfig_GetGlobalConfig(config); + err = config_init_argv(config, precmdline); + if (_Py_INIT_FAILED(err)) { + goto done; + } - _PyPreCmdline precmdline = _PyPreCmdline_INIT; - err = core_read_precmdline(config, args, &precmdline); + err = config_read(config, precmdline); if (_Py_INIT_FAILED(err)) { goto done; } - if (config->program == NULL) { - err = config_init_program(config, &precmdline); + if (config->use_environment) { + err = config_init_env_warnoptions(config, &env_warnoptions); if (_Py_INIT_FAILED(err)) { goto done; } } - _PyCmdline cmdline; - memset(&cmdline, 0, sizeof(cmdline)); + err = config_init_warnoptions(config, + &cmdline_warnoptions, &env_warnoptions); + if (_Py_INIT_FAILED(err)) { + goto done; + } - if (args) { - err = config_parse_cmdline(config, &cmdline, &precmdline); - if (_Py_INIT_FAILED(err)) { - goto done; - } + err = _Py_INIT_OK(); - if (cmdline.need_usage) { - config_usage(1, config->program); - err = _Py_INIT_EXIT(2); - goto done; - } +done: + _PyWstrList_Clear(&cmdline_warnoptions); + _PyWstrList_Clear(&env_warnoptions); + return err; +} - if (cmdline.print_help) { - config_usage(0, config->program); - err = _Py_INIT_EXIT(0); - goto done; - } - if (cmdline.print_version) { - printf("Python %s\n", - (cmdline.print_version >= 2) ? Py_GetVersion() : PY_VERSION); - err = _Py_INIT_EXIT(0); - goto done; - } +/* Read the configuration into _PyCoreConfig from: + + * Command line arguments + * Environment variables + * Py_xxx global configuration variables */ +_PyInitError +_PyCoreConfig_Read(_PyCoreConfig *config, const _PyArgv *args) +{ + _PyInitError err; - err = config_init_argv(config, &precmdline); + if (args) { + err = _PyArgv_AsWstrList(args, &config->argv); if (_Py_INIT_FAILED(err)) { - goto done; + return err; } } - err = config_read(config, &precmdline); + err = _Py_PreInitializeFromCoreConfig(config); + if (_Py_INIT_FAILED(err)) { + return err; + } + + _PyCoreConfig_GetGlobalConfig(config); + + _PyPreCmdline precmdline = _PyPreCmdline_INIT; + err = core_read_precmdline(config, args, &precmdline); if (_Py_INIT_FAILED(err)) { goto done; } - if (config->use_environment) { - err = cmdline_init_env_warnoptions(&cmdline, config); + if (config->program == NULL) { + err = config_init_program(config, &precmdline); if (_Py_INIT_FAILED(err)) { goto done; } } - err = config_init_warnoptions(config, &cmdline); + err = config_read_cmdline(config, &precmdline); if (_Py_INIT_FAILED(err)) { goto done; } @@ -2176,7 +2168,6 @@ _PyCoreConfig_Read(_PyCoreConfig *config, const _PyArgv *args) err = _Py_INIT_OK(); done: - cmdline_clear(&cmdline); _PyPreCmdline_Clear(&precmdline); return err; } From webhook-mailer at python.org Fri Mar 29 14:37:43 2019 From: webhook-mailer at python.org (Steve Dower) Date: Fri, 29 Mar 2019 18:37:43 -0000 Subject: [Python-checkins] bpo-36448: mention 'make regen-all' in error message (GH-12585) Message-ID: https://github.com/python/cpython/commit/3396d1e0ca858065c5bb7e5a9737be6ffc4028f7 commit: 3396d1e0ca858065c5bb7e5a9737be6ffc4028f7 branch: master author: Jeroen Demeyer committer: Steve Dower date: 2019-03-29T11:37:22-07:00 summary: bpo-36448: mention 'make regen-all' in error message (GH-12585) files: M PCbuild/_freeze_importlib.vcxproj diff --git a/PCbuild/_freeze_importlib.vcxproj b/PCbuild/_freeze_importlib.vcxproj index 998fba6bb544..76885d8b354a 100644 --- a/PCbuild/_freeze_importlib.vcxproj +++ b/PCbuild/_freeze_importlib.vcxproj @@ -125,9 +125,9 @@ - - https://github.com/python/cpython/commit/32119e10b792ad7ee4e5f951a2d89ddbaf111cc5 commit: 32119e10b792ad7ee4e5f951a2d89ddbaf111cc5 branch: master author: Paul Monson committer: Steve Dower date: 2019-03-29T16:30:10-07:00 summary: bpo-35947: Update Windows to the current version of libffi (GH-11797) We now use a pre-built libffi binary from our binaries repository, and no longer vendor the full implementation. files: A Misc/NEWS.d/next/Windows/2019-02-11-14-53-17.bpo-35947.9vI4hP.rst A PCbuild/libffi.props A PCbuild/prepare_libffi.bat D Modules/_ctypes/libffi_msvc/LICENSE D Modules/_ctypes/libffi_msvc/README D Modules/_ctypes/libffi_msvc/README.ctypes D Modules/_ctypes/libffi_msvc/ffi.c D Modules/_ctypes/libffi_msvc/ffi.h D Modules/_ctypes/libffi_msvc/ffi_common.h D Modules/_ctypes/libffi_msvc/fficonfig.h D Modules/_ctypes/libffi_msvc/ffitarget.h D Modules/_ctypes/libffi_msvc/prep_cif.c D Modules/_ctypes/libffi_msvc/types.c D Modules/_ctypes/libffi_msvc/win32.c D Modules/_ctypes/libffi_msvc/win64.asm M Lib/ctypes/test/test_win32.py M Modules/_ctypes/_ctypes.c M Modules/_ctypes/callproc.c M PC/layout/main.py M PCbuild/_ctypes.vcxproj M PCbuild/_ctypes.vcxproj.filters M PCbuild/get_externals.bat M PCbuild/python.props M Tools/msi/lib/lib_files.wxs diff --git a/Lib/ctypes/test/test_win32.py b/Lib/ctypes/test/test_win32.py index a2941f3fe078..e51bdc8ad6b0 100644 --- a/Lib/ctypes/test/test_win32.py +++ b/Lib/ctypes/test/test_win32.py @@ -6,35 +6,6 @@ import _ctypes_test -# Only windows 32-bit has different calling conventions. - at unittest.skipUnless(sys.platform == "win32", 'Windows-specific test') - at unittest.skipUnless(sizeof(c_void_p) == sizeof(c_int), - "sizeof c_void_p and c_int differ") -class WindowsTestCase(unittest.TestCase): - def test_callconv_1(self): - # Testing stdcall function - - IsWindow = windll.user32.IsWindow - # ValueError: Procedure probably called with not enough arguments - # (4 bytes missing) - self.assertRaises(ValueError, IsWindow) - - # This one should succeed... - self.assertEqual(0, IsWindow(0)) - - # ValueError: Procedure probably called with too many arguments - # (8 bytes in excess) - self.assertRaises(ValueError, IsWindow, 0, 0, 0) - - def test_callconv_2(self): - # Calling stdcall function as cdecl - - IsWindow = cdll.user32.IsWindow - - # ValueError: Procedure called with not enough arguments - # (4 bytes missing) or wrong calling convention - self.assertRaises(ValueError, IsWindow, None) - @unittest.skipUnless(sys.platform == "win32", 'Windows-specific test') class FunctionCallTestCase(unittest.TestCase): @unittest.skipUnless('MSC' in sys.version, "SEH only supported by MSC") diff --git a/Misc/NEWS.d/next/Windows/2019-02-11-14-53-17.bpo-35947.9vI4hP.rst b/Misc/NEWS.d/next/Windows/2019-02-11-14-53-17.bpo-35947.9vI4hP.rst new file mode 100644 index 000000000000..ae3c5a751b46 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-02-11-14-53-17.bpo-35947.9vI4hP.rst @@ -0,0 +1,2 @@ +Added current version of libffi to cpython-source-deps. +Change _ctypes to use current version of libffi on Windows. diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 45102f3304ec..7479edaf1110 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -403,24 +403,35 @@ static PyCArgObject * StructUnionType_paramfunc(CDataObject *self) { PyCArgObject *parg; + CDataObject *copied_self; StgDictObject *stgdict; + if (self->b_size > sizeof(void*)) { + void *new_ptr = PyMem_Malloc(self->b_size); + if (new_ptr == NULL) + return NULL; + memcpy(new_ptr, self->b_ptr, self->b_size); + copied_self = (CDataObject *)PyCData_AtAddress( + (PyObject *)Py_TYPE(self), new_ptr); + copied_self->b_needsfree = 1; + } else { + copied_self = self; + Py_INCREF(copied_self); + } + parg = PyCArgObject_new(); - if (parg == NULL) + if (parg == NULL) { + Py_DECREF(copied_self); return NULL; + } parg->tag = 'V'; - stgdict = PyObject_stgdict((PyObject *)self); + stgdict = PyObject_stgdict((PyObject *)copied_self); assert(stgdict); /* Cannot be NULL for structure/union instances */ parg->pffi_type = &stgdict->ffi_type_pointer; - /* For structure parameters (by value), parg->value doesn't contain the structure - data itself, instead parg->value.p *points* to the structure's data - See also _ctypes.c, function _call_function_pointer(). - */ - parg->value.p = self->b_ptr; - parg->size = self->b_size; - Py_INCREF(self); - parg->obj = (PyObject *)self; + parg->value.p = copied_self->b_ptr; + parg->size = copied_self->b_size; + parg->obj = (PyObject *)copied_self; return parg; } diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index d91e84613b2f..7c25e2e796bf 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -729,6 +729,23 @@ static int ConvParam(PyObject *obj, Py_ssize_t index, struct argument *pa) } } +#if defined(MS_WIN32) && !defined(_WIN32_WCE) +/* +Per: https://msdn.microsoft.com/en-us/library/7572ztz4.aspx +To be returned by value in RAX, user-defined types must have a length +of 1, 2, 4, 8, 16, 32, or 64 bits +*/ +int can_return_struct_as_int(size_t s) +{ + return s == 1 || s == 2 || s == 4; +} + +int can_return_struct_as_sint64(size_t s) +{ + return s == 8; +} +#endif + ffi_type *_ctypes_get_ffi_type(PyObject *obj) { @@ -778,12 +795,9 @@ static int _call_function_pointer(int flags, int *space; ffi_cif cif; int cc; -#ifdef MS_WIN32 - int delta; -#ifndef DONT_USE_SEH +#if defined(MS_WIN32) && !defined(DONT_USE_SEH) DWORD dwExceptionCode = 0; EXCEPTION_RECORD record; -#endif #endif /* XXX check before here */ if (restype == NULL) { @@ -828,7 +842,6 @@ static int _call_function_pointer(int flags, #ifndef DONT_USE_SEH __try { #endif - delta = #endif ffi_call(&cif, (void *)pProc, resmem, avalues); #ifdef MS_WIN32 @@ -860,35 +873,6 @@ static int _call_function_pointer(int flags, return -1; } #endif -#ifdef MS_WIN64 - if (delta != 0) { - PyErr_Format(PyExc_RuntimeError, - "ffi_call failed with code %d", - delta); - return -1; - } -#else - if (delta < 0) { - if (flags & FUNCFLAG_CDECL) - PyErr_Format(PyExc_ValueError, - "Procedure called with not enough " - "arguments (%d bytes missing) " - "or wrong calling convention", - -delta); - else - PyErr_Format(PyExc_ValueError, - "Procedure probably called with not enough " - "arguments (%d bytes missing)", - -delta); - return -1; - } else if (delta > 0) { - PyErr_Format(PyExc_ValueError, - "Procedure probably called with too many " - "arguments (%d bytes in excess)", - delta); - return -1; - } -#endif #endif if ((flags & FUNCFLAG_PYTHONAPI) && PyErr_Occurred()) return -1; diff --git a/Modules/_ctypes/libffi_msvc/LICENSE b/Modules/_ctypes/libffi_msvc/LICENSE deleted file mode 100644 index f591795152d6..000000000000 --- a/Modules/_ctypes/libffi_msvc/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -libffi - Copyright (c) 1996-2003 Red Hat, Inc. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -``Software''), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/Modules/_ctypes/libffi_msvc/README b/Modules/_ctypes/libffi_msvc/README deleted file mode 100644 index 69e46cbf8a42..000000000000 --- a/Modules/_ctypes/libffi_msvc/README +++ /dev/null @@ -1,500 +0,0 @@ -This directory contains the libffi package, which is not part of GCC but -shipped with GCC as convenience. - -Status -====== - -libffi-2.00 has not been released yet! This is a development snapshot! - -libffi-1.20 was released on October 5, 1998. Check the libffi web -page for updates: . - - -What is libffi? -=============== - -Compilers for high level languages generate code that follow certain -conventions. These conventions are necessary, in part, for separate -compilation to work. One such convention is the "calling -convention". The "calling convention" is essentially a set of -assumptions made by the compiler about where function arguments will -be found on entry to a function. A "calling convention" also specifies -where the return value for a function is found. - -Some programs may not know at the time of compilation what arguments -are to be passed to a function. For instance, an interpreter may be -told at run-time about the number and types of arguments used to call -a given function. Libffi can be used in such programs to provide a -bridge from the interpreter program to compiled code. - -The libffi library provides a portable, high level programming -interface to various calling conventions. This allows a programmer to -call any function specified by a call interface description at run -time. - -Ffi stands for Foreign Function Interface. A foreign function -interface is the popular name for the interface that allows code -written in one language to call code written in another language. The -libffi library really only provides the lowest, machine dependent -layer of a fully featured foreign function interface. A layer must -exist above libffi that handles type conversions for values passed -between the two languages. - - -Supported Platforms and Prerequisites -===================================== - -Libffi has been ported to: - - SunOS 4.1.3 & Solaris 2.x (SPARC-V8, SPARC-V9) - - Irix 5.3 & 6.2 (System V/o32 & n32) - - Intel x86 - Linux (System V ABI) - - Alpha - Linux and OSF/1 - - m68k - Linux (System V ABI) - - PowerPC - Linux (System V ABI, Darwin, AIX) - - ARM - Linux (System V ABI) - -Libffi has been tested with the egcs 1.0.2 gcc compiler. Chances are -that other versions will work. Libffi has also been built and tested -with the SGI compiler tools. - -On PowerPC, the tests failed (see the note below). - -You must use GNU make to build libffi. SGI's make will not work. -Sun's probably won't either. - -If you port libffi to another platform, please let me know! I assume -that some will be easy (x86 NetBSD), and others will be more difficult -(HP). - - -Installing libffi -================= - -[Note: before actually performing any of these installation steps, - you may wish to read the "Platform Specific Notes" below.] - -First you must configure the distribution for your particular -system. Go to the directory you wish to build libffi in and run the -"configure" program found in the root directory of the libffi source -distribution. - -You may want to tell configure where to install the libffi library and -header files. To do that, use the --prefix configure switch. Libffi -will install under /usr/local by default. - -If you want to enable extra run-time debugging checks use the the ---enable-debug configure switch. This is useful when your program dies -mysteriously while using libffi. - -Another useful configure switch is --enable-purify-safety. Using this -will add some extra code which will suppress certain warnings when you -are using Purify with libffi. Only use this switch when using -Purify, as it will slow down the library. - -Configure has many other options. Use "configure --help" to see them all. - -Once configure has finished, type "make". Note that you must be using -GNU make. SGI's make will not work. Sun's probably won't either. -You can ftp GNU make from prep.ai.mit.edu:/pub/gnu. - -To ensure that libffi is working as advertised, type "make test". - -To install the library and header files, type "make install". - - -Using libffi -============ - - The Basics - ---------- - -Libffi assumes that you have a pointer to the function you wish to -call and that you know the number and types of arguments to pass it, -as well as the return type of the function. - -The first thing you must do is create an ffi_cif object that matches -the signature of the function you wish to call. The cif in ffi_cif -stands for Call InterFace. To prepare a call interface object, use the -following function: - -ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, - unsigned int nargs, - ffi_type *rtype, ffi_type **atypes); - - CIF is a pointer to the call interface object you wish - to initialize. - - ABI is an enum that specifies the calling convention - to use for the call. FFI_DEFAULT_ABI defaults - to the system's native calling convention. Other - ABI's may be used with care. They are system - specific. - - NARGS is the number of arguments this function accepts. - libffi does not yet support vararg functions. - - RTYPE is a pointer to an ffi_type structure that represents - the return type of the function. Ffi_type objects - describe the types of values. libffi provides - ffi_type objects for many of the native C types: - signed int, unsigned int, signed char, unsigned char, - etc. There is also a pointer ffi_type object and - a void ffi_type. Use &ffi_type_void for functions that - don't return values. - - ATYPES is a vector of ffi_type pointers. ARGS must be NARGS long. - If NARGS is 0, this is ignored. - - -ffi_prep_cif will return a status code that you are responsible -for checking. It will be one of the following: - - FFI_OK - All is good. - - FFI_BAD_TYPEDEF - One of the ffi_type objects that ffi_prep_cif - came across is bad. - - -Before making the call, the VALUES vector should be initialized -with pointers to the appropriate argument values. - -To call the the function using the initialized ffi_cif, use the -ffi_call function: - -void ffi_call(ffi_cif *cif, void *fn, void *rvalue, void **avalues); - - CIF is a pointer to the ffi_cif initialized specifically - for this function. - - FN is a pointer to the function you want to call. - - RVALUE is a pointer to a chunk of memory that is to hold the - result of the function call. Currently, it must be - at least one word in size (except for the n32 version - under Irix 6.x, which must be a pointer to an 8 byte - aligned value (a long long). It must also be at least - word aligned (depending on the return type, and the - system's alignment requirements). If RTYPE is - &ffi_type_void, this is ignored. If RVALUE is NULL, - the return value is discarded. - - AVALUES is a vector of void* that point to the memory locations - holding the argument values for a call. - If NARGS is 0, this is ignored. - - -If you are expecting a return value from FN it will have been stored -at RVALUE. - - - - An Example - ---------- - -Here is a trivial example that calls puts() a few times. - - #include - #include - - int main() - { - ffi_cif cif; - ffi_type *args[1]; - void *values[1]; - char *s; - int rc; - - /* Initialize the argument info vectors */ - args[0] = &ffi_type_uint; - values[0] = &s; - - /* Initialize the cif */ - if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_uint, args) == FFI_OK) - { - s = "Hello World!"; - ffi_call(&cif, puts, &rc, values); - /* rc now holds the result of the call to puts */ - - /* values holds a pointer to the function's arg, so to - call puts() again all we need to do is change the - value of s */ - s = "This is cool!"; - ffi_call(&cif, puts, &rc, values); - } - - return 0; - } - - - - Aggregate Types - --------------- - -Although libffi has no special support for unions or bit-fields, it is -perfectly happy passing structures back and forth. You must first -describe the structure to libffi by creating a new ffi_type object -for it. Here is the definition of ffi_type: - - typedef struct _ffi_type - { - unsigned size; - short alignment; - short type; - struct _ffi_type **elements; - } ffi_type; - -All structures must have type set to FFI_TYPE_STRUCT. You may set -size and alignment to 0. These will be calculated and reset to the -appropriate values by ffi_prep_cif(). - -elements is a NULL terminated array of pointers to ffi_type objects -that describe the type of the structure elements. These may, in turn, -be structure elements. - -The following example initializes a ffi_type object representing the -tm struct from Linux's time.h: - - struct tm { - int tm_sec; - int tm_min; - int tm_hour; - int tm_mday; - int tm_mon; - int tm_year; - int tm_wday; - int tm_yday; - int tm_isdst; - /* Those are for future use. */ - long int __tm_gmtoff__; - __const char *__tm_zone__; - }; - - { - ffi_type tm_type; - ffi_type *tm_type_elements[12]; - int i; - - tm_type.size = tm_type.alignment = 0; - tm_type.elements = &tm_type_elements; - - for (i = 0; i < 9; i++) - tm_type_elements[i] = &ffi_type_sint; - - tm_type_elements[9] = &ffi_type_slong; - tm_type_elements[10] = &ffi_type_pointer; - tm_type_elements[11] = NULL; - - /* tm_type can now be used to represent tm argument types and - return types for ffi_prep_cif() */ - } - - - -Platform Specific Notes -======================= - - Intel x86 - --------- - -There are no known problems with the x86 port. - - Sun SPARC - SunOS 4.1.3 & Solaris 2.x - ------------------------------------- - -You must use GNU Make to build libffi on Sun platforms. - - MIPS - Irix 5.3 & 6.x - --------------------- - -Irix 6.2 and better supports three different calling conventions: o32, -n32 and n64. Currently, libffi only supports both o32 and n32 under -Irix 6.x, but only o32 under Irix 5.3. Libffi will automatically be -configured for whichever calling convention it was built for. - -By default, the configure script will try to build libffi with the GNU -development tools. To build libffi with the SGI development tools, set -the environment variable CC to either "cc -32" or "cc -n32" before -running configure under Irix 6.x (depending on whether you want an o32 -or n32 library), or just "cc" for Irix 5.3. - -With the n32 calling convention, when returning structures smaller -than 16 bytes, be sure to provide an RVALUE that is 8 byte aligned. -Here's one way of forcing this: - - double struct_storage[2]; - my_small_struct *s = (my_small_struct *) struct_storage; - /* Use s for RVALUE */ - -If you don't do this you are liable to get spurious bus errors. - -"long long" values are not supported yet. - -You must use GNU Make to build libffi on SGI platforms. - - ARM - System V ABI - ------------------ - -The ARM port was performed on a NetWinder running ARM Linux ELF -(2.0.31) and gcc 2.8.1. - - - - PowerPC System V ABI - -------------------- - -There are two `System V ABI's which libffi implements for PowerPC. -They differ only in how small structures are returned from functions. - -In the FFI_SYSV version, structures that are 8 bytes or smaller are -returned in registers. This is what GCC does when it is configured -for solaris, and is what the System V ABI I have (dated September -1995) says. - -In the FFI_GCC_SYSV version, all structures are returned the same way: -by passing a pointer as the first argument to the function. This is -what GCC does when it is configured for linux or a generic sysv -target. - -EGCS 1.0.1 (and probably other versions of EGCS/GCC) also has a -inconsistency with the SysV ABI: When a procedure is called with many -floating-point arguments, some of them get put on the stack. They are -all supposed to be stored in double-precision format, even if they are -only single-precision, but EGCS stores single-precision arguments as -single-precision anyway. This causes one test to fail (the `many -arguments' test). - - -What's With The Cryptic Comments? -================================= - -You might notice a number of cryptic comments in the code, delimited -by /*@ and @*/. These are annotations read by the program LCLint, a -tool for statically checking C programs. You can read all about it at -. - - -History -======= - -1.20 Oct-5-98 - Raffaele Sena produces ARM port. - -1.19 Oct-5-98 - Fixed x86 long double and long long return support. - m68k bug fixes from Andreas Schwab. - Patch for DU assembler compatibility for the Alpha from Richard - Henderson. - -1.18 Apr-17-98 - Bug fixes and MIPS configuration changes. - -1.17 Feb-24-98 - Bug fixes and m68k port from Andreas Schwab. PowerPC port from - Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes. - -1.16 Feb-11-98 - Richard Henderson produces Alpha port. - -1.15 Dec-4-97 - Fixed an n32 ABI bug. New libtool, auto* support. - -1.14 May-13-97 - libtool is now used to generate shared and static libraries. - Fixed a minor portability problem reported by Russ McManus - . - -1.13 Dec-2-96 - Added --enable-purify-safety to keep Purify from complaining - about certain low level code. - Sparc fix for calling functions with < 6 args. - Linux x86 a.out fix. - -1.12 Nov-22-96 - Added missing ffi_type_void, needed for supporting void return - types. Fixed test case for non MIPS machines. Cygnus Support - is now Cygnus Solutions. - -1.11 Oct-30-96 - Added notes about GNU make. - -1.10 Oct-29-96 - Added configuration fix for non GNU compilers. - -1.09 Oct-29-96 - Added --enable-debug configure switch. Clean-ups based on LCLint - feedback. ffi_mips.h is always installed. Many configuration - fixes. Fixed ffitest.c for sparc builds. - -1.08 Oct-15-96 - Fixed n32 problem. Many clean-ups. - -1.07 Oct-14-96 - Gordon Irlam rewrites v8.S again. Bug fixes. - -1.06 Oct-14-96 - Gordon Irlam improved the sparc port. - -1.05 Oct-14-96 - Interface changes based on feedback. - -1.04 Oct-11-96 - Sparc port complete (modulo struct passing bug). - -1.03 Oct-10-96 - Passing struct args, and returning struct values works for - all architectures/calling conventions. Expanded tests. - -1.02 Oct-9-96 - Added SGI n32 support. Fixed bugs in both o32 and Linux support. - Added "make test". - -1.01 Oct-8-96 - Fixed float passing bug in mips version. Restructured some - of the code. Builds cleanly with SGI tools. - -1.00 Oct-7-96 - First release. No public announcement. - - -Authors & Credits -================= - -libffi was written by Anthony Green . - -Portions of libffi were derived from Gianni Mariani's free gencall -library for Silicon Graphics machines. - -The closure mechanism was designed and implemented by Kresten Krab -Thorup. - -The Sparc port was derived from code contributed by the fine folks at -Visible Decisions Inc . Further enhancements were -made by Gordon Irlam at Cygnus Solutions . - -The Alpha port was written by Richard Henderson at Cygnus Solutions. - -Andreas Schwab ported libffi to m68k Linux and provided a number of -bug fixes. - -Geoffrey Keating ported libffi to the PowerPC. - -Raffaele Sena ported libffi to the ARM. - -Jesper Skov and Andrew Haley both did more than their fair share of -stepping through the code and tracking down bugs. - -Thanks also to Tom Tromey for bug fixes and configuration help. - -Thanks to Jim Blandy, who provided some useful feedback on the libffi -interface. - -If you have a problem, or have found a bug, please send a note to -green at cygnus.com. diff --git a/Modules/_ctypes/libffi_msvc/README.ctypes b/Modules/_ctypes/libffi_msvc/README.ctypes deleted file mode 100644 index 17e8a40b83f9..000000000000 --- a/Modules/_ctypes/libffi_msvc/README.ctypes +++ /dev/null @@ -1,7 +0,0 @@ -The purpose is to hack the libffi sources so that they can be compiled -with MSVC, and to extend them so that they have the features I need -for ctypes. - -I retrieved the libffi sources from the gcc cvs repository on -2004-01-27. Then I did 'configure' in a 'build' subdirectory on a x86 -linux system, and copied the files I found useful. diff --git a/Modules/_ctypes/libffi_msvc/ffi.c b/Modules/_ctypes/libffi_msvc/ffi.c deleted file mode 100644 index d202b158b079..000000000000 --- a/Modules/_ctypes/libffi_msvc/ffi.c +++ /dev/null @@ -1,530 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 1996, 1998, 1999, 2001 Red Hat, Inc. - Copyright (c) 2002 Ranjit Mathew - Copyright (c) 2002 Bo Thorsen - Copyright (c) 2002 Roger Sayle - - x86 Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include - -#include - -/* ffi_prep_args is called by the assembly routine once stack space - has been allocated for the function's arguments */ - -extern void Py_FatalError(const char *msg); - -/*@-exportheader@*/ -void ffi_prep_args(char *stack, extended_cif *ecif) -/*@=exportheader@*/ -{ - register unsigned int i; - register void **p_argv; - register char *argp; - register ffi_type **p_arg; - - argp = stack; - if (ecif->cif->rtype->type == FFI_TYPE_STRUCT) - { - *(void **) argp = ecif->rvalue; - argp += sizeof(void *); - } - - p_argv = ecif->avalue; - - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; - i != 0; - i--, p_arg++) - { - size_t z; - - /* Align if necessary */ - if ((sizeof(void *) - 1) & (size_t) argp) - argp = (char *) ALIGN(argp, sizeof(void *)); - - z = (*p_arg)->size; - if (z < sizeof(intptr_t)) - { - z = sizeof(intptr_t); - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - *(intptr_t *) argp = (intptr_t)*(SINT8 *)(* p_argv); - break; - - case FFI_TYPE_UINT8: - *(uintptr_t *) argp = (uintptr_t)*(UINT8 *)(* p_argv); - break; - - case FFI_TYPE_SINT16: - *(intptr_t *) argp = (intptr_t)*(SINT16 *)(* p_argv); - break; - - case FFI_TYPE_UINT16: - *(uintptr_t *) argp = (uintptr_t)*(UINT16 *)(* p_argv); - break; - - case FFI_TYPE_SINT32: - *(intptr_t *) argp = (intptr_t)*(SINT32 *)(* p_argv); - break; - - case FFI_TYPE_UINT32: - *(uintptr_t *) argp = (uintptr_t)*(UINT32 *)(* p_argv); - break; - - case FFI_TYPE_FLOAT: - *(uintptr_t *) argp = 0; - *(float *) argp = *(float *)(* p_argv); - break; - - // 64-bit value cases should never be used for x86 and AMD64 builds - case FFI_TYPE_SINT64: - *(intptr_t *) argp = (intptr_t)*(SINT64 *)(* p_argv); - break; - - case FFI_TYPE_UINT64: - *(uintptr_t *) argp = (uintptr_t)*(UINT64 *)(* p_argv); - break; - - case FFI_TYPE_STRUCT: - *(uintptr_t *) argp = (uintptr_t)*(UINT32 *)(* p_argv); - break; - - case FFI_TYPE_DOUBLE: - *(uintptr_t *) argp = 0; - *(double *) argp = *(double *)(* p_argv); - break; - - default: - FFI_ASSERT(0); - } - } -#ifdef _WIN64 - else if (z > 8) - { - /* On Win64, if a single argument takes more than 8 bytes, - then it is always passed by reference. */ - *(void **)argp = *p_argv; - z = 8; - } -#endif - else - { - memcpy(argp, *p_argv, z); - } - p_argv++; - argp += z; - } - - if (argp >= stack && (unsigned)(argp - stack) > ecif->cif->bytes) - { - Py_FatalError("FFI BUG: not enough stack space for arguments"); - } - return; -} - -/* -Per: https://msdn.microsoft.com/en-us/library/7572ztz4.aspx -To be returned by value in RAX, user-defined types must have a length -of 1, 2, 4, 8, 16, 32, or 64 bits -*/ -int can_return_struct_as_int(size_t s) -{ - return s == 1 || s == 2 || s == 4; -} - -int can_return_struct_as_sint64(size_t s) -{ - return s == 8; -} - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - /* Set the return type flag */ - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - case FFI_TYPE_SINT64: - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - case FFI_TYPE_LONGDOUBLE: - cif->flags = (unsigned) cif->rtype->type; - break; - - case FFI_TYPE_STRUCT: - /* MSVC returns small structures in registers. Put in cif->flags - the value FFI_TYPE_STRUCT only if the structure is big enough; - otherwise, put the 4- or 8-bytes integer type. */ - if (can_return_struct_as_int(cif->rtype->size)) - cif->flags = FFI_TYPE_INT; - else if (can_return_struct_as_sint64(cif->rtype->size)) - cif->flags = FFI_TYPE_SINT64; - else - cif->flags = FFI_TYPE_STRUCT; - break; - - case FFI_TYPE_UINT64: -#ifdef _WIN64 - case FFI_TYPE_POINTER: -#endif - cif->flags = FFI_TYPE_SINT64; - break; - - default: - cif->flags = FFI_TYPE_INT; - break; - } - - return FFI_OK; -} - -#ifdef _WIN32 -extern int -ffi_call_x86(void (*)(char *, extended_cif *), - /*@out@*/ extended_cif *, - unsigned, unsigned, - /*@out@*/ unsigned *, - void (*fn)()); -#endif - -#ifdef _WIN64 -extern int -ffi_call_AMD64(void (*)(char *, extended_cif *), - /*@out@*/ extended_cif *, - unsigned, unsigned, - /*@out@*/ unsigned *, - void (*fn)()); -#endif - -int -ffi_call(/*@dependent@*/ ffi_cif *cif, - void (*fn)(), - /*@out@*/ void *rvalue, - /*@dependent@*/ void **avalue) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return */ - /* value address then we need to make one */ - - if ((rvalue == NULL) && - (cif->rtype->type == FFI_TYPE_STRUCT)) - { - /*@-sysunrecog@*/ - ecif.rvalue = alloca(cif->rtype->size); - /*@=sysunrecog@*/ - } - else - ecif.rvalue = rvalue; - - - switch (cif->abi) - { -#if !defined(_WIN64) - case FFI_SYSV: - case FFI_STDCALL: - return ffi_call_x86(ffi_prep_args, &ecif, cif->bytes, - cif->flags, ecif.rvalue, fn); - break; -#else - case FFI_SYSV: - /* If a single argument takes more than 8 bytes, - then a copy is passed by reference. */ - for (unsigned i = 0; i < cif->nargs; i++) { - size_t z = cif->arg_types[i]->size; - if (z > 8) { - void *temp = alloca(z); - memcpy(temp, avalue[i], z); - avalue[i] = temp; - } - } - /*@-usedef@*/ - return ffi_call_AMD64(ffi_prep_args, &ecif, cif->bytes, - cif->flags, ecif.rvalue, fn); - /*@=usedef@*/ - break; -#endif - - default: - FFI_ASSERT(0); - break; - } - return -1; /* theller: Hrm. */ -} - - -/** private members **/ - -static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, - void** args, ffi_cif* cif); -/* This function is jumped to by the trampoline */ - -#ifdef _WIN64 -void * -#else -static void __fastcall -#endif -ffi_closure_SYSV (ffi_closure *closure, char *argp) -{ - // this is our return value storage - long double res; - - // our various things... - ffi_cif *cif; - void **arg_area; - unsigned short rtype; - void *resp = (void*)&res; - void *args = argp + sizeof(void*); - - cif = closure->cif; - arg_area = (void**) alloca (cif->nargs * sizeof (void*)); - - /* this call will initialize ARG_AREA, such that each - * element in that array points to the corresponding - * value on the stack; and if the function returns - * a structure, it will re-set RESP to point to the - * structure return address. */ - - ffi_prep_incoming_args_SYSV(args, (void**)&resp, arg_area, cif); - - (closure->fun) (cif, resp, arg_area, closure->user_data); - - rtype = cif->flags; - -#if defined(_WIN32) && !defined(_WIN64) -#ifdef _MSC_VER - /* now, do a generic return based on the value of rtype */ - if (rtype == FFI_TYPE_INT) - { - _asm mov eax, resp ; - _asm mov eax, [eax] ; - } - else if (rtype == FFI_TYPE_FLOAT) - { - _asm mov eax, resp ; - _asm fld DWORD PTR [eax] ; -// asm ("flds (%0)" : : "r" (resp) : "st" ); - } - else if (rtype == FFI_TYPE_DOUBLE) - { - _asm mov eax, resp ; - _asm fld QWORD PTR [eax] ; -// asm ("fldl (%0)" : : "r" (resp) : "st", "st(1)" ); - } - else if (rtype == FFI_TYPE_LONGDOUBLE) - { -// asm ("fldt (%0)" : : "r" (resp) : "st", "st(1)" ); - } - else if (rtype == FFI_TYPE_SINT64) - { - _asm mov edx, resp ; - _asm mov eax, [edx] ; - _asm mov edx, [edx + 4] ; -// asm ("movl 0(%0),%%eax;" -// "movl 4(%0),%%edx" -// : : "r"(resp) -// : "eax", "edx"); - } -#else - /* now, do a generic return based on the value of rtype */ - if (rtype == FFI_TYPE_INT) - { - asm ("movl (%0),%%eax" : : "r" (resp) : "eax"); - } - else if (rtype == FFI_TYPE_FLOAT) - { - asm ("flds (%0)" : : "r" (resp) : "st" ); - } - else if (rtype == FFI_TYPE_DOUBLE) - { - asm ("fldl (%0)" : : "r" (resp) : "st", "st(1)" ); - } - else if (rtype == FFI_TYPE_LONGDOUBLE) - { - asm ("fldt (%0)" : : "r" (resp) : "st", "st(1)" ); - } - else if (rtype == FFI_TYPE_SINT64) - { - asm ("movl 0(%0),%%eax;" - "movl 4(%0),%%edx" - : : "r"(resp) - : "eax", "edx"); - } -#endif -#endif - -#ifdef _WIN64 - /* The result is returned in rax. This does the right thing for - result types except for floats; we have to 'mov xmm0, rax' in the - caller to correct this. - */ - return *(void **)resp; -#endif -} - -/*@-exportheader@*/ -static void -ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, - void **avalue, ffi_cif *cif) -/*@=exportheader@*/ -{ - register unsigned int i; - register void **p_argv; - register char *argp; - register ffi_type **p_arg; - - argp = stack; - - if ( cif->rtype->type == FFI_TYPE_STRUCT ) { - *rvalue = *(void **) argp; - argp += sizeof(void *); - } - - p_argv = avalue; - - for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) - { - size_t z; - - /* Align if necessary */ - if ((sizeof(char *) - 1) & (size_t) argp) { - argp = (char *) ALIGN(argp, sizeof(char*)); - } - - z = (*p_arg)->size; - - /* because we're little endian, this is what it turns into. */ - -#ifdef _WIN64 - if (z > 8) { - /* On Win64, if a single argument takes more than 8 bytes, - * then it is always passed by reference. - */ - *p_argv = *((void**) argp); - z = 8; - } - else -#endif - *p_argv = (void*) argp; - - p_argv++; - argp += z; - } - - return; -} - -/* the cif must already be prep'ed */ -extern void ffi_closure_OUTER(); - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - void *codeloc) -{ - short bytes; - char *tramp; -#ifdef _WIN64 - int mask = 0; -#endif - FFI_ASSERT (cif->abi == FFI_SYSV); - - if (cif->abi == FFI_SYSV) - bytes = 0; -#if !defined(_WIN64) - else if (cif->abi == FFI_STDCALL) - bytes = cif->bytes; -#endif - else - return FFI_BAD_ABI; - - tramp = &closure->tramp[0]; - -#define BYTES(text) memcpy(tramp, text, sizeof(text)), tramp += sizeof(text)-1 -#define POINTER(x) *(void**)tramp = (void*)(x), tramp += sizeof(void*) -#define SHORT(x) *(short*)tramp = x, tramp += sizeof(short) -#define INT(x) *(int*)tramp = x, tramp += sizeof(int) - -#ifdef _WIN64 - if (cif->nargs >= 1 && - (cif->arg_types[0]->type == FFI_TYPE_FLOAT - || cif->arg_types[0]->type == FFI_TYPE_DOUBLE)) - mask |= 1; - if (cif->nargs >= 2 && - (cif->arg_types[1]->type == FFI_TYPE_FLOAT - || cif->arg_types[1]->type == FFI_TYPE_DOUBLE)) - mask |= 2; - if (cif->nargs >= 3 && - (cif->arg_types[2]->type == FFI_TYPE_FLOAT - || cif->arg_types[2]->type == FFI_TYPE_DOUBLE)) - mask |= 4; - if (cif->nargs >= 4 && - (cif->arg_types[3]->type == FFI_TYPE_FLOAT - || cif->arg_types[3]->type == FFI_TYPE_DOUBLE)) - mask |= 8; - - /* 41 BB ---- mov r11d,mask */ - BYTES("\x41\xBB"); INT(mask); - - /* 48 B8 -------- mov rax, closure */ - BYTES("\x48\xB8"); POINTER(closure); - - /* 49 BA -------- mov r10, ffi_closure_OUTER */ - BYTES("\x49\xBA"); POINTER(ffi_closure_OUTER); - - /* 41 FF E2 jmp r10 */ - BYTES("\x41\xFF\xE2"); - -#else - - /* mov ecx, closure */ - BYTES("\xb9"); POINTER(closure); - - /* mov edx, esp */ - BYTES("\x8b\xd4"); - - /* call ffi_closure_SYSV */ - BYTES("\xe8"); POINTER((char*)&ffi_closure_SYSV - (tramp + 4)); - - /* ret bytes */ - BYTES("\xc2"); - SHORT(bytes); - -#endif - - if (tramp - &closure->tramp[0] > FFI_TRAMPOLINE_SIZE) - Py_FatalError("FFI_TRAMPOLINE_SIZE too small in " __FILE__); - - closure->cif = cif; - closure->user_data = user_data; - closure->fun = fun; - return FFI_OK; -} diff --git a/Modules/_ctypes/libffi_msvc/ffi.h b/Modules/_ctypes/libffi_msvc/ffi.h deleted file mode 100644 index ba74202720a6..000000000000 --- a/Modules/_ctypes/libffi_msvc/ffi.h +++ /dev/null @@ -1,322 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - libffi 2.00-beta - Copyright (c) 1996-2003 Red Hat, Inc. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - - ----------------------------------------------------------------------- */ - -/* ------------------------------------------------------------------- - The basic API is described in the README file. - - The raw API is designed to bypass some of the argument packing - and unpacking on architectures for which it can be avoided. - - The closure API allows interpreted functions to be packaged up - inside a C function pointer, so that they can be called as C functions, - with no understanding on the client side that they are interpreted. - It can also be used in other cases in which it is necessary to package - up a user specified parameter and a function pointer as a single - function pointer. - - The closure API must be implemented in order to get its functionality, - e.g. for use by gij. Routines are provided to emulate the raw API - if the underlying platform doesn't allow faster implementation. - - More details on the raw and cloure API can be found in: - - http://gcc.gnu.org/ml/java/1999-q3/msg00138.html - - and - - http://gcc.gnu.org/ml/java/1999-q3/msg00174.html - -------------------------------------------------------------------- */ - -#ifndef LIBFFI_H -#define LIBFFI_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Specify which architecture libffi is configured for. */ -//XXX #define X86 - -/* ---- System configuration information --------------------------------- */ - -#include - -#ifndef LIBFFI_ASM - -#include -#include - -/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). - But we can find it either under the correct ANSI name, or under GNU - C's internal name. */ -#ifdef LONG_LONG_MAX -# define FFI_LONG_LONG_MAX LONG_LONG_MAX -#else -# ifdef LLONG_MAX -# define FFI_LONG_LONG_MAX LLONG_MAX -# else -# ifdef __GNUC__ -# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ -# endif -# ifdef _MSC_VER -# define FFI_LONG_LONG_MAX _I64_MAX -# endif -# endif -#endif - -#if SCHAR_MAX == 127 -# define ffi_type_uchar ffi_type_uint8 -# define ffi_type_schar ffi_type_sint8 -#else - #error "char size not supported" -#endif - -#if SHRT_MAX == 32767 -# define ffi_type_ushort ffi_type_uint16 -# define ffi_type_sshort ffi_type_sint16 -#elif SHRT_MAX == 2147483647 -# define ffi_type_ushort ffi_type_uint32 -# define ffi_type_sshort ffi_type_sint32 -#else - #error "short size not supported" -#endif - -#if INT_MAX == 32767 -# define ffi_type_uint ffi_type_uint16 -# define ffi_type_sint ffi_type_sint16 -#elif INT_MAX == 2147483647 -# define ffi_type_uint ffi_type_uint32 -# define ffi_type_sint ffi_type_sint32 -#elif INT_MAX == 9223372036854775807 -# define ffi_type_uint ffi_type_uint64 -# define ffi_type_sint ffi_type_sint64 -#else - #error "int size not supported" -#endif - -#define ffi_type_ulong ffi_type_uint64 -#define ffi_type_slong ffi_type_sint64 -#if LONG_MAX == 2147483647 -# if FFI_LONG_LONG_MAX != 9223372036854775807 - #error "no 64-bit data type supported" -# endif -#elif LONG_MAX != 9223372036854775807 - #error "long size not supported" -#endif - -/* The closure code assumes that this works on pointers, i.e. a size_t */ -/* can hold a pointer. */ - -typedef struct _ffi_type -{ - size_t size; - unsigned short alignment; - unsigned short type; - /*@null@*/ struct _ffi_type **elements; -} ffi_type; - -int can_return_struct_as_int(size_t); -int can_return_struct_as_sint64(size_t); - -/* These are defined in types.c */ -extern ffi_type ffi_type_void; -extern ffi_type ffi_type_uint8; -extern ffi_type ffi_type_sint8; -extern ffi_type ffi_type_uint16; -extern ffi_type ffi_type_sint16; -extern ffi_type ffi_type_uint32; -extern ffi_type ffi_type_sint32; -extern ffi_type ffi_type_uint64; -extern ffi_type ffi_type_sint64; -extern ffi_type ffi_type_float; -extern ffi_type ffi_type_double; -extern ffi_type ffi_type_longdouble; -extern ffi_type ffi_type_pointer; - - -typedef enum { - FFI_OK = 0, - FFI_BAD_TYPEDEF, - FFI_BAD_ABI -} ffi_status; - -typedef unsigned FFI_TYPE; - -typedef struct { - ffi_abi abi; - unsigned nargs; - /*@dependent@*/ ffi_type **arg_types; - /*@dependent@*/ ffi_type *rtype; - unsigned bytes; - unsigned flags; -#ifdef FFI_EXTRA_CIF_FIELDS - FFI_EXTRA_CIF_FIELDS; -#endif -} ffi_cif; - -/* ---- Definitions for the raw API -------------------------------------- */ - -#ifdef _WIN64 -#define FFI_SIZEOF_ARG 8 -#else -#define FFI_SIZEOF_ARG 4 -#endif - -typedef union { - ffi_sarg sint; - ffi_arg uint; - float flt; - char data[FFI_SIZEOF_ARG]; - void* ptr; -} ffi_raw; - -void ffi_raw_call (/*@dependent@*/ ffi_cif *cif, - void (*fn)(), - /*@out@*/ void *rvalue, - /*@dependent@*/ ffi_raw *avalue); - -void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); -void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); -size_t ffi_raw_size (ffi_cif *cif); - -/* This is analogous to the raw API, except it uses Java parameter */ -/* packing, even on 64-bit machines. I.e. on 64-bit machines */ -/* longs and doubles are followed by an empty 64-bit word. */ - -void ffi_java_raw_call (/*@dependent@*/ ffi_cif *cif, - void (*fn)(), - /*@out@*/ void *rvalue, - /*@dependent@*/ ffi_raw *avalue); - -void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); -void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); -size_t ffi_java_raw_size (ffi_cif *cif); - -/* ---- Definitions for closures ----------------------------------------- */ - -#if FFI_CLOSURES - -typedef struct { - char tramp[FFI_TRAMPOLINE_SIZE]; - ffi_cif *cif; - void (*fun)(ffi_cif*,void*,void**,void*); - void *user_data; -} ffi_closure; - -void ffi_closure_free(void *); -void *ffi_closure_alloc (size_t size, void **code); - -ffi_status -ffi_prep_closure_loc (ffi_closure*, - ffi_cif *, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - void *codeloc); - -typedef struct { - char tramp[FFI_TRAMPOLINE_SIZE]; - - ffi_cif *cif; - -#if !FFI_NATIVE_RAW_API - - /* if this is enabled, then a raw closure has the same layout - as a regular closure. We use this to install an intermediate - handler to do the transaltion, void** -> ffi_raw*. */ - - void (*translate_args)(ffi_cif*,void*,void**,void*); - void *this_closure; - -#endif - - void (*fun)(ffi_cif*,void*,ffi_raw*,void*); - void *user_data; - -} ffi_raw_closure; - -ffi_status -ffi_prep_raw_closure (ffi_raw_closure*, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,ffi_raw*,void*), - void *user_data); - -ffi_status -ffi_prep_java_raw_closure (ffi_raw_closure*, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,ffi_raw*,void*), - void *user_data); - -#endif /* FFI_CLOSURES */ - -/* ---- Public interface definition -------------------------------------- */ - -ffi_status ffi_prep_cif(/*@out@*/ /*@partial@*/ ffi_cif *cif, - ffi_abi abi, - unsigned int nargs, - /*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type *rtype, - /*@dependent@*/ ffi_type **atypes); - -int -ffi_call(/*@dependent@*/ ffi_cif *cif, - void (*fn)(), - /*@out@*/ void *rvalue, - /*@dependent@*/ void **avalue); - -/* Useful for eliminating compiler warnings */ -#define FFI_FN(f) ((void (*)())f) - -/* ---- Definitions shared with assembly code ---------------------------- */ - -#endif - -/* If these change, update src/mips/ffitarget.h. */ -#define FFI_TYPE_VOID 0 -#define FFI_TYPE_INT 1 -#define FFI_TYPE_FLOAT 2 -#define FFI_TYPE_DOUBLE 3 -#if 1 -#define FFI_TYPE_LONGDOUBLE 4 -#else -#define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE -#endif -#define FFI_TYPE_UINT8 5 -#define FFI_TYPE_SINT8 6 -#define FFI_TYPE_UINT16 7 -#define FFI_TYPE_SINT16 8 -#define FFI_TYPE_UINT32 9 -#define FFI_TYPE_SINT32 10 -#define FFI_TYPE_UINT64 11 -#define FFI_TYPE_SINT64 12 -#define FFI_TYPE_STRUCT 13 -#define FFI_TYPE_POINTER 14 - -/* This should always refer to the last type code (for sanity checks) */ -#define FFI_TYPE_LAST FFI_TYPE_POINTER - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/Modules/_ctypes/libffi_msvc/ffi_common.h b/Modules/_ctypes/libffi_msvc/ffi_common.h deleted file mode 100644 index 43fb83b48105..000000000000 --- a/Modules/_ctypes/libffi_msvc/ffi_common.h +++ /dev/null @@ -1,77 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi_common.h - Copyright (c) 1996 Red Hat, Inc. - - Common internal definitions and macros. Only necessary for building - libffi. - ----------------------------------------------------------------------- */ - -#ifndef FFI_COMMON_H -#define FFI_COMMON_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include - -/* Check for the existence of memcpy. */ -#if STDC_HEADERS -# include -#else -# ifndef HAVE_MEMCPY -# define memcpy(d, s, n) bcopy ((s), (d), (n)) -# endif -#endif - -#if defined(FFI_DEBUG) -#include -#endif - -#ifdef FFI_DEBUG -/*@exits@*/ void ffi_assert(/*@temp@*/ char *expr, /*@temp@*/ char *file, int line); -void ffi_stop_here(void); -void ffi_type_test(/*@temp@*/ /*@out@*/ ffi_type *a, /*@temp@*/ char *file, int line); - -#define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__)) -#define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l))) -#define FFI_ASSERT_VALID_TYPE(x) ffi_type_test (x, __FILE__, __LINE__) -#else -#define FFI_ASSERT(x) -#define FFI_ASSERT_AT(x, f, l) -#define FFI_ASSERT_VALID_TYPE(x) -#endif - -#define ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1) - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif); - -/* Extended cif, used in callback from assembly routine */ -typedef struct -{ - /*@dependent@*/ ffi_cif *cif; - /*@dependent@*/ void *rvalue; - /*@dependent@*/ void **avalue; -} extended_cif; - -/* Terse sized type definitions. */ -typedef unsigned int UINT8 __attribute__((__mode__(__QI__))); -typedef signed int SINT8 __attribute__((__mode__(__QI__))); -typedef unsigned int UINT16 __attribute__((__mode__(__HI__))); -typedef signed int SINT16 __attribute__((__mode__(__HI__))); -typedef unsigned int UINT32 __attribute__((__mode__(__SI__))); -typedef signed int SINT32 __attribute__((__mode__(__SI__))); -typedef unsigned int UINT64 __attribute__((__mode__(__DI__))); -typedef signed int SINT64 __attribute__((__mode__(__DI__))); - -typedef float FLOAT32; - - -#ifdef __cplusplus -} -#endif - -#endif - - diff --git a/Modules/_ctypes/libffi_msvc/fficonfig.h b/Modules/_ctypes/libffi_msvc/fficonfig.h deleted file mode 100644 index c14f653ec894..000000000000 --- a/Modules/_ctypes/libffi_msvc/fficonfig.h +++ /dev/null @@ -1,96 +0,0 @@ -/* fficonfig.h. Originally created by configure, now hand_maintained for MSVC. */ - -/* fficonfig.h. Generated automatically by configure. */ -/* fficonfig.h.in. Generated automatically from configure.in by autoheader. */ - -/* Define this for MSVC, but not for mingw32! */ -#ifdef _MSC_VER -#define __attribute__(x) /* */ -#endif -#define alloca _alloca - -/*----------------------------------------------------------------*/ - -/* Define if using alloca.c. */ -/* #undef C_ALLOCA */ - -/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems. - This function is required for alloca.c support on those systems. */ -/* #undef CRAY_STACKSEG_END */ - -/* Define if you have alloca, as a function or macro. */ -#define HAVE_ALLOCA 1 - -/* Define if you have and it should be used (not on Ultrix). */ -/* #define HAVE_ALLOCA_H 1 */ - -/* If using the C implementation of alloca, define if you know the - direction of stack growth for your system; otherwise it will be - automatically deduced at run-time. - STACK_DIRECTION > 0 => grows toward higher addresses - STACK_DIRECTION < 0 => grows toward lower addresses - STACK_DIRECTION = 0 => direction of growth unknown - */ -/* #undef STACK_DIRECTION */ - -/* Define if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Define if you have the memcpy function. */ -#define HAVE_MEMCPY 1 - -/* Define if read-only mmap of a plain file works. */ -//#define HAVE_MMAP_FILE 1 - -/* Define if mmap of /dev/zero works. */ -//#define HAVE_MMAP_DEV_ZERO 1 - -/* Define if mmap with MAP_ANON(YMOUS) works. */ -//#define HAVE_MMAP_ANON 1 - -/* The number of bytes in type double */ -#define SIZEOF_DOUBLE 8 - -/* The number of bytes in type long double */ -#define SIZEOF_LONG_DOUBLE 12 - -/* Define if you have the long double type and it is bigger than a double */ -#define HAVE_LONG_DOUBLE 1 - -/* whether byteorder is bigendian */ -/* #undef WORDS_BIGENDIAN */ - -/* Define if the host machine stores words of multi-word integers in - big-endian order. */ -/* #undef HOST_WORDS_BIG_ENDIAN */ - -/* 1234 = LIL_ENDIAN, 4321 = BIGENDIAN */ -#define BYTEORDER 1234 - -/* Define if your assembler and linker support unaligned PC relative relocs. */ -/* #undef HAVE_AS_SPARC_UA_PCREL */ - -/* Define if your assembler supports .register. */ -/* #undef HAVE_AS_REGISTER_PSEUDO_OP */ - -/* Define if .eh_frame sections should be read-only. */ -/* #undef HAVE_RO_EH_FRAME */ - -/* Define to the flags needed for the .section .eh_frame directive. */ -/* #define EH_FRAME_FLAGS "aw" */ - -/* Define to the flags needed for the .section .eh_frame directive. */ -/* #define EH_FRAME_FLAGS "aw" */ - -/* Define this if you want extra debugging. */ -/* #undef FFI_DEBUG */ - -/* Define this is you do not want support for aggregate types. */ -/* #undef FFI_NO_STRUCTS */ - -/* Define this is you do not want support for the raw API. */ -/* #undef FFI_NO_RAW_API */ - -/* Define this if you are using Purify and want to suppress spurious messages. */ -/* #undef USING_PURIFY */ - diff --git a/Modules/_ctypes/libffi_msvc/ffitarget.h b/Modules/_ctypes/libffi_msvc/ffitarget.h deleted file mode 100644 index 85f5ee81bbe6..000000000000 --- a/Modules/_ctypes/libffi_msvc/ffitarget.h +++ /dev/null @@ -1,85 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. - Target configuration macros for x86 and x86-64. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -/* ---- System specific configurations ----------------------------------- */ - -#if defined (X86_64) && defined (__i386__) -#undef X86_64 -#define X86 -#endif - -/* ---- Generic type definitions ----------------------------------------- */ - -#ifndef LIBFFI_ASM -#ifndef _WIN64 -typedef unsigned long ffi_arg; -#else -typedef unsigned __int64 ffi_arg; -#endif -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - - /* ---- Intel x86 Win32 ---------- */ - FFI_SYSV, -#ifndef _WIN64 - FFI_STDCALL, -#endif - /* TODO: Add fastcall support for the sake of completeness */ - FFI_DEFAULT_ABI = FFI_SYSV, - - /* ---- Intel x86 and AMD x86-64 - */ -/* #if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__)) */ -/* FFI_SYSV, */ -/* FFI_UNIX64,*/ /* Unix variants all use the same ABI for x86-64 */ -/* #ifdef __i386__ */ -/* FFI_DEFAULT_ABI = FFI_SYSV, */ -/* #else */ -/* FFI_DEFAULT_ABI = FFI_UNIX64, */ -/* #endif */ -/* #endif */ - - FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 - -#ifdef _WIN64 -#define FFI_TRAMPOLINE_SIZE 29 -#define FFI_NATIVE_RAW_API 0 -#else -#define FFI_TRAMPOLINE_SIZE 15 -#define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ -#endif - -#endif - diff --git a/Modules/_ctypes/libffi_msvc/prep_cif.c b/Modules/_ctypes/libffi_msvc/prep_cif.c deleted file mode 100644 index 022435e53fcd..000000000000 --- a/Modules/_ctypes/libffi_msvc/prep_cif.c +++ /dev/null @@ -1,188 +0,0 @@ -/* ----------------------------------------------------------------------- - prep_cif.c - Copyright (c) 1996, 1998 Red Hat, Inc. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include -#include - - -/* Round up to FFI_SIZEOF_ARG. */ - -#define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG) - -/* Perform machine independent initialization of aggregate type - specifications. */ - -static ffi_status initialize_aggregate(/*@out@*/ ffi_type *arg) -{ - ffi_type **ptr; - - FFI_ASSERT(arg != NULL); - - /*@-usedef@*/ - - FFI_ASSERT(arg->elements != NULL); - FFI_ASSERT(arg->size == 0); - FFI_ASSERT(arg->alignment == 0); - - ptr = &(arg->elements[0]); - - while ((*ptr) != NULL) - { - if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK)) - return FFI_BAD_TYPEDEF; - - /* Perform a sanity check on the argument type */ - FFI_ASSERT_VALID_TYPE(*ptr); - - arg->size = ALIGN(arg->size, (*ptr)->alignment); - arg->size += (*ptr)->size; - - arg->alignment = (arg->alignment > (*ptr)->alignment) ? - arg->alignment : (*ptr)->alignment; - - ptr++; - } - - /* Structure size includes tail padding. This is important for - structures that fit in one register on ABIs like the PowerPC64 - Linux ABI that right justify small structs in a register. - It's also needed for nested structure layout, for example - struct A { long a; char b; }; struct B { struct A x; char y; }; - should find y at an offset of 2*sizeof(long) and result in a - total size of 3*sizeof(long). */ - arg->size = ALIGN (arg->size, arg->alignment); - - if (arg->size == 0) - return FFI_BAD_TYPEDEF; - else - return FFI_OK; - - /*@=usedef@*/ -} - -/* Perform machine independent ffi_cif preparation, then call - machine dependent routine. */ - -ffi_status ffi_prep_cif(/*@out@*/ /*@partial@*/ ffi_cif *cif, - ffi_abi abi, unsigned int nargs, - /*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type *rtype, - /*@dependent@*/ ffi_type **atypes) -{ - unsigned bytes = 0; - unsigned int i; - ffi_type **ptr; - - FFI_ASSERT(cif != NULL); - FFI_ASSERT((abi > FFI_FIRST_ABI) && (abi <= FFI_DEFAULT_ABI)); - - cif->abi = abi; - cif->arg_types = atypes; - cif->nargs = nargs; - cif->rtype = rtype; - - cif->flags = 0; - - /* Initialize the return type if necessary */ - /*@-usedef@*/ - if ((cif->rtype->size == 0) && (initialize_aggregate(cif->rtype) != FFI_OK)) - return FFI_BAD_TYPEDEF; - /*@=usedef@*/ - - /* Perform a sanity check on the return type */ - FFI_ASSERT_VALID_TYPE(cif->rtype); - - /* x86-64 and s390 stack space allocation is handled in prep_machdep. */ -#if !defined M68K && !defined __x86_64__ && !defined S390 - /* Make space for the return structure pointer */ - if (cif->rtype->type == FFI_TYPE_STRUCT -#ifdef _WIN32 - && !can_return_struct_as_int(cif->rtype->size) /* MSVC returns small structs in registers */ - && !can_return_struct_as_sint64(cif->rtype->size) -#endif -#ifdef SPARC - && (cif->abi != FFI_V9 || cif->rtype->size > 32) -#endif - ) - bytes = STACK_ARG_SIZE(sizeof(void*)); -#endif - - for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) - { - - /* Initialize any uninitialized aggregate type definitions */ - if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK)) - return FFI_BAD_TYPEDEF; - - /* Perform a sanity check on the argument type, do this - check after the initialization. */ - FFI_ASSERT_VALID_TYPE(*ptr); - -#if !defined __x86_64__ && !defined S390 -#ifdef SPARC - if (((*ptr)->type == FFI_TYPE_STRUCT - && ((*ptr)->size > 16 || cif->abi != FFI_V9)) - || ((*ptr)->type == FFI_TYPE_LONGDOUBLE - && cif->abi != FFI_V9)) - bytes += sizeof(void*); - else -#elif defined (_WIN64) - if ((*ptr)->type == FFI_TYPE_STRUCT && - !can_return_struct_as_int((*ptr)->size) && - !can_return_struct_as_sint64((*ptr)->size)) - bytes += sizeof(void*); - else -#endif - { -#if !defined(_MSC_VER) && !defined(__MINGW32__) - /* Don't know if this is a libffi bug or not. At least on - Windows with MSVC, function call parameters are *not* - aligned in the same way as structure fields are, they are - only aligned in integer boundaries. - - This doesn't do any harm for cdecl functions and closures, - since the caller cleans up the stack, but it is wrong for - stdcall functions where the callee cleans. - */ - - /* Add any padding if necessary */ - if (((*ptr)->alignment - 1) & bytes) - bytes = ALIGN(bytes, (*ptr)->alignment); - -#endif - bytes += STACK_ARG_SIZE((*ptr)->size); - } -#endif - } - -#ifdef _WIN64 - /* Function call needs at least 40 bytes stack size, on win64 AMD64 */ - if (bytes < 40) - bytes = 40; -#endif - - cif->bytes = bytes; - - /* Perform machine dependent cif processing */ - return ffi_prep_cif_machdep(cif); -} diff --git a/Modules/_ctypes/libffi_msvc/types.c b/Modules/_ctypes/libffi_msvc/types.c deleted file mode 100644 index 4433ac28c8c8..000000000000 --- a/Modules/_ctypes/libffi_msvc/types.c +++ /dev/null @@ -1,104 +0,0 @@ -/* ----------------------------------------------------------------------- - types.c - Copyright (c) 1996, 1998 Red Hat, Inc. - - Predefined ffi_types needed by libffi. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -#include -#include - -/* Type definitions */ - -#define FFI_INTEGRAL_TYPEDEF(n, s, a, t) ffi_type ffi_type_##n = { s, a, t, NULL } -#define FFI_AGGREGATE_TYPEDEF(n, e) ffi_type ffi_type_##n = { 0, 0, FFI_TYPE_STRUCT, e } - -/* Size and alignment are fake here. They must not be 0. */ -FFI_INTEGRAL_TYPEDEF(void, 1, 1, FFI_TYPE_VOID); - -FFI_INTEGRAL_TYPEDEF(uint8, 1, 1, FFI_TYPE_UINT8); -FFI_INTEGRAL_TYPEDEF(sint8, 1, 1, FFI_TYPE_SINT8); -FFI_INTEGRAL_TYPEDEF(uint16, 2, 2, FFI_TYPE_UINT16); -FFI_INTEGRAL_TYPEDEF(sint16, 2, 2, FFI_TYPE_SINT16); -FFI_INTEGRAL_TYPEDEF(uint32, 4, 4, FFI_TYPE_UINT32); -FFI_INTEGRAL_TYPEDEF(sint32, 4, 4, FFI_TYPE_SINT32); -FFI_INTEGRAL_TYPEDEF(float, 4, 4, FFI_TYPE_FLOAT); - -#if defined ALPHA || defined SPARC64 || defined X86_64 || defined S390X \ - || defined IA64 || defined _WIN64 - -FFI_INTEGRAL_TYPEDEF(pointer, 8, 8, FFI_TYPE_POINTER); - -#else - -FFI_INTEGRAL_TYPEDEF(pointer, 4, 4, FFI_TYPE_POINTER); - -#endif - -#if defined X86 || defined X86_WIN32 || defined ARM || defined M68K - -FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); -FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); - -#elif defined SH - -FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); -FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); - -#else - -FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); -FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); - -#endif - - -#if defined X86 || defined X86_WIN32 || defined M68K - -FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); -FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE); - -#elif defined ARM || defined SH || defined POWERPC_AIX || defined POWERPC_DARWIN - -FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); -FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE); - -#elif defined SPARC - -FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); -#ifdef SPARC64 -FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); -#else -FFI_INTEGRAL_TYPEDEF(longdouble, 16, 8, FFI_TYPE_LONGDOUBLE); -#endif - -#elif defined X86_64 - -FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); -FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); - -#else - -FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); -FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); - -#endif - diff --git a/Modules/_ctypes/libffi_msvc/win32.c b/Modules/_ctypes/libffi_msvc/win32.c deleted file mode 100644 index f44a5fe3697c..000000000000 --- a/Modules/_ctypes/libffi_msvc/win32.c +++ /dev/null @@ -1,162 +0,0 @@ -/* ----------------------------------------------------------------------- - win32.S - Copyright (c) 1996, 1998, 2001, 2002 Red Hat, Inc. - Copyright (c) 2001 John Beniton - Copyright (c) 2002 Ranjit Mathew - - - X86 Foreign Function Interface - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - ``Software''), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - ----------------------------------------------------------------------- */ - -/* theller: almost verbatim translation from gas syntax to MSVC inline - assembler code. */ - -/* theller: ffi_call_x86 now returns an integer - the difference of the stack - pointer before and after the function call. If everything is ok, zero is - returned. If stdcall functions are passed the wrong number of arguments, - the difference will be nonzero. */ - -#include -#include - -__declspec(naked) int -ffi_call_x86(void (* prepfunc)(char *, extended_cif *), /* 8 */ - extended_cif *ecif, /* 12 */ - unsigned bytes, /* 16 */ - unsigned flags, /* 20 */ - unsigned *rvalue, /* 24 */ - void (*fn)()) /* 28 */ -{ - _asm { - push ebp - mov ebp, esp - - push esi // NEW: this register must be preserved across function calls -// XXX SAVE ESP NOW! - mov esi, esp // save stack pointer before the call - -// Make room for all of the new args. - mov ecx, [ebp+16] - sub esp, ecx // sub esp, bytes - - mov eax, esp - -// Place all of the ffi_prep_args in position - push [ebp + 12] // ecif - push eax - call [ebp + 8] // prepfunc - -// Return stack to previous state and call the function - add esp, 8 -// FIXME: Align the stack to a 128-bit boundary to avoid -// potential performance hits. - call [ebp + 28] - -// Load ecif->cif->abi - mov ecx, [ebp + 12] - mov ecx, [ecx]ecif.cif - mov ecx, [ecx]ecif.cif.abi - - cmp ecx, FFI_STDCALL - je noclean -// STDCALL: Remove the space we pushed for the args - mov ecx, [ebp + 16] - add esp, ecx -// CDECL: Caller has already cleaned the stack -noclean: -// Check that esp has the same value as before! - sub esi, esp - -// Load %ecx with the return type code - mov ecx, [ebp + 20] - -// If the return value pointer is NULL, assume no return value. -/* - Intel asm is weird. We have to explicitly specify 'DWORD PTR' in the next instruction, - otherwise only one BYTE will be compared (instead of a DWORD)! - */ - cmp DWORD PTR [ebp + 24], 0 - jne sc_retint - -// Even if there is no space for the return value, we are -// obliged to handle floating-point values. - cmp ecx, FFI_TYPE_FLOAT - jne sc_noretval -// fstp %st(0) - fstp st(0) - - jmp sc_epilogue - -sc_retint: - cmp ecx, FFI_TYPE_INT - jne sc_retfloat -// # Load %ecx with the pointer to storage for the return value - mov ecx, [ebp + 24] - mov [ecx + 0], eax - jmp sc_epilogue - -sc_retfloat: - cmp ecx, FFI_TYPE_FLOAT - jne sc_retdouble -// Load %ecx with the pointer to storage for the return value - mov ecx, [ebp+24] -// fstps (%ecx) - fstp DWORD PTR [ecx] - jmp sc_epilogue - -sc_retdouble: - cmp ecx, FFI_TYPE_DOUBLE - jne sc_retlongdouble -// movl 24(%ebp),%ecx - mov ecx, [ebp+24] - fstp QWORD PTR [ecx] - jmp sc_epilogue - - jmp sc_retlongdouble // avoid warning about unused label -sc_retlongdouble: - cmp ecx, FFI_TYPE_LONGDOUBLE - jne sc_retint64 -// Load %ecx with the pointer to storage for the return value - mov ecx, [ebp+24] -// fstpt (%ecx) - fstp QWORD PTR [ecx] /* XXX ??? */ - jmp sc_epilogue - -sc_retint64: - cmp ecx, FFI_TYPE_SINT64 - jne sc_retstruct -// Load %ecx with the pointer to storage for the return value - mov ecx, [ebp+24] - mov [ecx+0], eax - mov [ecx+4], edx - -sc_retstruct: -// Nothing to do! - -sc_noretval: -sc_epilogue: - mov eax, esi - pop esi // NEW restore: must be preserved across function calls - mov esp, ebp - pop ebp - ret - } -} diff --git a/Modules/_ctypes/libffi_msvc/win64.asm b/Modules/_ctypes/libffi_msvc/win64.asm deleted file mode 100644 index 301188bc9c17..000000000000 --- a/Modules/_ctypes/libffi_msvc/win64.asm +++ /dev/null @@ -1,156 +0,0 @@ -PUBLIC ffi_call_AMD64 - -EXTRN __chkstk:NEAR -EXTRN ffi_closure_SYSV:NEAR - -_TEXT SEGMENT - -;;; ffi_closure_OUTER will be called with these registers set: -;;; rax points to 'closure' -;;; r11 contains a bit mask that specifies which of the -;;; first four parameters are float or double -;;; -;;; It must move the parameters passed in registers to their stack location, -;;; call ffi_closure_SYSV for the actual work, then return the result. -;;; -ffi_closure_OUTER PROC FRAME - ;; save actual arguments to their stack space. - test r11, 1 - jne first_is_float - mov QWORD PTR [rsp+8], rcx - jmp second -first_is_float: - movlpd QWORD PTR [rsp+8], xmm0 - -second: - test r11, 2 - jne second_is_float - mov QWORD PTR [rsp+16], rdx - jmp third -second_is_float: - movlpd QWORD PTR [rsp+16], xmm1 - -third: - test r11, 4 - jne third_is_float - mov QWORD PTR [rsp+24], r8 - jmp forth -third_is_float: - movlpd QWORD PTR [rsp+24], xmm2 - -forth: - test r11, 8 - jne forth_is_float - mov QWORD PTR [rsp+32], r9 - jmp done -forth_is_float: - movlpd QWORD PTR [rsp+32], xmm3 - -done: -.ALLOCSTACK 40 - sub rsp, 40 -.ENDPROLOG - mov rcx, rax ; context is first parameter - mov rdx, rsp ; stack is second parameter - add rdx, 40 ; correct our own area - mov rax, ffi_closure_SYSV - call rax ; call the real closure function - ;; Here, code is missing that handles float return values - add rsp, 40 - movd xmm0, rax ; In case the closure returned a float. - ret 0 -ffi_closure_OUTER ENDP - - -;;; ffi_call_AMD64 - -stack$ = 0 -prepfunc$ = 32 -ecif$ = 40 -bytes$ = 48 -flags$ = 56 -rvalue$ = 64 -fn$ = 72 - -ffi_call_AMD64 PROC FRAME - - mov QWORD PTR [rsp+32], r9 - mov QWORD PTR [rsp+24], r8 - mov QWORD PTR [rsp+16], rdx - mov QWORD PTR [rsp+8], rcx -.PUSHREG rbp - push rbp -.ALLOCSTACK 48 - sub rsp, 48 ; 00000030H -.SETFRAME rbp, 32 - lea rbp, QWORD PTR [rsp+32] -.ENDPROLOG - - mov eax, DWORD PTR bytes$[rbp] - add rax, 15 - and rax, -16 - call __chkstk - sub rsp, rax - lea rax, QWORD PTR [rsp+32] - mov QWORD PTR stack$[rbp], rax - - mov rdx, QWORD PTR ecif$[rbp] - mov rcx, QWORD PTR stack$[rbp] - call QWORD PTR prepfunc$[rbp] - - mov rsp, QWORD PTR stack$[rbp] - - movlpd xmm3, QWORD PTR [rsp+24] - movd r9, xmm3 - - movlpd xmm2, QWORD PTR [rsp+16] - movd r8, xmm2 - - movlpd xmm1, QWORD PTR [rsp+8] - movd rdx, xmm1 - - movlpd xmm0, QWORD PTR [rsp] - movd rcx, xmm0 - - call QWORD PTR fn$[rbp] -ret_int$: - cmp DWORD PTR flags$[rbp], 1 ; FFI_TYPE_INT - jne ret_float$ - - mov rcx, QWORD PTR rvalue$[rbp] - mov DWORD PTR [rcx], eax - jmp SHORT ret_nothing$ - -ret_float$: - cmp DWORD PTR flags$[rbp], 2 ; FFI_TYPE_FLOAT - jne SHORT ret_double$ - - mov rax, QWORD PTR rvalue$[rbp] - movlpd QWORD PTR [rax], xmm0 - jmp SHORT ret_nothing$ - -ret_double$: - cmp DWORD PTR flags$[rbp], 3 ; FFI_TYPE_DOUBLE - jne SHORT ret_int64$ - - mov rax, QWORD PTR rvalue$[rbp] - movlpd QWORD PTR [rax], xmm0 - jmp SHORT ret_nothing$ - -ret_int64$: - cmp DWORD PTR flags$[rbp], 12 ; FFI_TYPE_SINT64 - jne ret_nothing$ - - mov rcx, QWORD PTR rvalue$[rbp] - mov QWORD PTR [rcx], rax - jmp SHORT ret_nothing$ - -ret_nothing$: - xor eax, eax - - lea rsp, QWORD PTR [rbp+16] - pop rbp - ret 0 -ffi_call_AMD64 ENDP -_TEXT ENDS -END diff --git a/PC/layout/main.py b/PC/layout/main.py index 910085c01bb2..185e6498e1bc 100644 --- a/PC/layout/main.py +++ b/PC/layout/main.py @@ -52,7 +52,7 @@ EXCLUDE_FROM_COMPILE = FileNameSet("badsyntax_*", "bad_*") EXCLUDE_FROM_CATALOG = FileSuffixSet(".exe", ".pyd", ".dll") -REQUIRED_DLLS = FileStemSet("libcrypto*", "libssl*") +REQUIRED_DLLS = FileStemSet("libcrypto*", "libssl*", "libffi*") LIB2TO3_GRAMMAR_FILES = FileNameSet("Grammar.txt", "PatternGrammar.txt") diff --git a/PCbuild/_ctypes.vcxproj b/PCbuild/_ctypes.vcxproj index d4c9f87b6fe7..a265427a6568 100644 --- a/PCbuild/_ctypes.vcxproj +++ b/PCbuild/_ctypes.vcxproj @@ -70,6 +70,7 @@ + @@ -77,7 +78,7 @@ - ..\Modules\_ctypes\libffi_msvc;%(AdditionalIncludeDirectories) + FFI_BUILDING;%(PreprocessorDefinitions) /EXPORT:DllGetClassObject,PRIVATE /EXPORT:DllCanUnloadNow,PRIVATE %(AdditionalOptions) @@ -86,32 +87,14 @@ - - - - - - - 4267;%(DisableSpecificWarnings) - - - true - - - - - true - ml64 /nologo /c /Zi /Fo "$(IntDir)win64.obj" "%(FullPath)" - $(IntDir)win64.obj;%(Outputs) - @@ -122,4 +105,4 @@ - \ No newline at end of file + diff --git a/PCbuild/_ctypes.vcxproj.filters b/PCbuild/_ctypes.vcxproj.filters index 83d7a7b67ab9..3123286347ae 100644 --- a/PCbuild/_ctypes.vcxproj.filters +++ b/PCbuild/_ctypes.vcxproj.filters @@ -15,18 +15,6 @@ Header Files - - Header Files - - - Header Files - - - Header Files - - - Header Files - @@ -41,25 +29,14 @@ Source Files - - Source Files - Source Files - - Source Files - Source Files - - Source Files - - - Source Files - + \ No newline at end of file diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat index 887fdc941171..b82b6e6588e6 100644 --- a/PCbuild/get_externals.bat +++ b/PCbuild/get_externals.bat @@ -7,14 +7,17 @@ if NOT DEFINED EXTERNALS_DIR (set EXTERNALS_DIR=%PCBUILD%\..\externals) set DO_FETCH=true set DO_CLEAN=false +set IncludeLibffiSrc=false set IncludeTkinterSrc=false set IncludeSSLSrc=false :CheckOpts if "%~1"=="--no-tkinter" (set IncludeTkinter=false) & shift & goto CheckOpts if "%~1"=="--no-openssl" (set IncludeSSL=false) & shift & goto CheckOpts +if "%~1"=="--no-libffi" (set IncludeLibffi=false) & shift & goto CheckOpts if "%~1"=="--tkinter-src" (set IncludeTkinterSrc=true) & shift & goto CheckOpts if "%~1"=="--openssl-src" (set IncludeSSLSrc=true) & shift & goto CheckOpts +if "%~1"=="--libffi-src" (set IncludeLibffiSrc=true) & shift & goto CheckOpts if "%~1"=="--python" (set PYTHON=%2) & shift & shift & goto CheckOpts if "%~1"=="--organization" (set ORG=%2) & shift & shift & goto CheckOpts if "%~1"=="-c" (set DO_CLEAN=true) & shift & goto CheckOpts @@ -49,6 +52,7 @@ echo.Fetching external libraries... set libraries= set libraries=%libraries% bzip2-1.0.6 +if NOT "%IncludeLibffiSrc%"=="false" set libraries=%libraries% libffi-3.3.0-rc0-r1 if NOT "%IncludeSSLSrc%"=="false" set libraries=%libraries% openssl-1.1.0j set libraries=%libraries% sqlite-3.21.0.0 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tcl-core-8.6.9.0 @@ -72,6 +76,7 @@ for %%e in (%libraries%) do ( echo.Fetching external binaries... set binaries= +if NOT "%IncludeLibffi%"=="false" set binaries=%binaries% libffi if NOT "%IncludeSSL%"=="false" set binaries=%binaries% openssl-bin-1.1.0j if NOT "%IncludeTkinter%"=="false" set binaries=%binaries% tcltk-8.6.9.0 if NOT "%IncludeSSLSrc%"=="false" set binaries=%binaries% nasm-2.11.06 diff --git a/PCbuild/libffi.props b/PCbuild/libffi.props new file mode 100644 index 000000000000..975c4a0d355f --- /dev/null +++ b/PCbuild/libffi.props @@ -0,0 +1,21 @@ + + + + + $(libffiIncludeDir);%(AdditionalIncludeDirectories) + + + $(libffiOutDir);%(AdditionalLibraryDirectories) + libffi-7.lib;%(AdditionalDependencies) + + + + <_LIBFFIDLL Include="$(libffiOutDir)\libffi-7.dll" /> + + + + + + + + \ No newline at end of file diff --git a/PCbuild/prepare_libffi.bat b/PCbuild/prepare_libffi.bat new file mode 100644 index 000000000000..3df85130f48a --- /dev/null +++ b/PCbuild/prepare_libffi.bat @@ -0,0 +1,169 @@ + at echo off +goto :Run + +:Usage +echo. +echo Before running prepare_libffi.bat +echo LIBFFI_SOURCE environment variable must be set to the location of +echo of python-source-deps clone of libffi branch +echo VCVARSALL must be set to location of vcvarsall.bat +echo cygwin must be installed (see below) +echo SH environment variable must be set to the location of sh.exe +echo. +echo Tested with cygwin-x86 from https://www.cygwin.com/install.html +echo Select http://mirrors.kernel.org as the download site +echo Include the following cygwin packages in cygwin configuration: +echo make, autoconf, automake, libtool, dejagnu +echo. +echo NOTE: dejagnu is only required for running tests. +echo set LIBFFI_TEST=1 to run tests (optional) +echo. +echo Based on https://github.com/libffi/libffi/blob/master/.appveyor.yml +echo. +echo. +echo.Available flags: +echo. -x64 build for x64 +echo. -x86 build for x86 +echo. -? this help +echo. --install-cygwin install cygwin to c:\cygwin +exit /b 127 + +:Run + +set BUILD_X64= +set BUILD_X86= +set INSTALL_CYGWIN= + +:CheckOpts +if "%1"=="" goto :CheckOptsDone +if /I "%1"=="-x64" (set BUILD_X64=1) & shift & goto :CheckOpts +if /I "%1"=="-x86" (set BUILD_X86=1) & shift & goto :CheckOpts +if /I "%1"=="-?" goto :Usage +if /I "%1"=="--install-cygwin" (set INSTALL_CYGWIN=1) & shift & goto :CheckOpts +goto :Usage + +:CheckOptsDone + +if NOT DEFINED BUILD_X64 if NOT DEFINED BUILD_X86 if NOT DEFINED BUILD_ARM32 ( + set BUILD_X64=1 + set BUILD_X86=1 +) + +if "%INSTALL_CYGWIN%"=="1" call :InstallCygwin + +setlocal +if NOT DEFINED SH if exist c:\cygwin\bin\sh.exe set SH=c:\cygwin\bin\sh.exe + +if NOT DEFINED VCVARSALL ( + if exist "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ( + set VCVARSALL="C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" + ) +) +if ^%VCVARSALL:~0,1% NEQ ^" SET VCVARSALL="%VCVARSALL%" + +if NOT DEFINED LIBFFI_SOURCE echo.&&echo ERROR LIBFFI_SOURCE environment variable not set && goto :Usage +if NOT DEFINED SH echo ERROR SH environment variable not set && goto :Usage + +if not exist %SH% echo ERROR %SH% does not exist && goto :Usage +if not exist %LIBFFI_SOURCE% echo ERROR %LIBFFI_SOURCE% does not exist && goto :Usage + +set OLDPWD=%LIBFFI_SOURCE% +pushd %LIBFFI_SOURCE% + +%SH% --login -lc "cygcheck -dc cygwin" +set GET_MSVCC=%SH% -lc "cd $OLDPWD; export MSVCC=`/usr/bin/find $PWD -name msvcc.sh`; echo ${MSVCC};" +FOR /F "usebackq delims==" %%i IN (`%GET_MSVCC%`) do @set MSVCC=%%i + +echo. +echo VCVARSALL : %VCVARSALL% +echo SH : %SH% +echo LIBFFI_SOURCE: %LIBFFI_SOURCE% +echo MSVCC : %MSVCC% +echo. + +if not exist Makefile.in (%SH% -lc "(cd $LIBFFI_SOURCE; ./autogen.sh;)") + +call :BuildOne x86 i686-pc-cygwin i686-pc-cygwin +call :BuildOne x64 x86_64-w64-cygwin x86_64-w64-cygwin + +popd +endlocal +exit /b 0 +REM all done + + +REM this subroutine is called once for each architecture +:BuildOne + +setlocal + +REM Initialize variables +set VCVARS_PLATFORM=%1 +set BUILD=%2 +set HOST=%3 +set ASSEMBLER= +set SRC_ARCHITECTURE=x86 + +if NOT DEFINED VCVARS_PLATFORM echo ERROR bad VCVARS_PLATFORM&&exit /b 123 + +if /I "%VCVARS_PLATFORM%" EQU "x64" ( + set ARCH=amd64 + set ARTIFACTS=%LIBFFI_SOURCE%\x86_64-w64-cygwin + set ASSEMBLER=-m64 + set SRC_ARCHITECTURE=x86 +) +if /I "%VCVARS_PLATFORM%" EQU "x86" ( + set ARCH=win32 + set ARTIFACTS=%LIBFFI_SOURCE%\i686-pc-cygwin + set ASSEMBLER= + set SRC_ARCHITECTURE=x86 +) + +if NOT DEFINED LIBFFI_OUT set LIBFFI_OUT=%~dp0\..\externals\libffi +set _LIBFFI_OUT=%LIBFFI_OUT%\%ARCH% + +echo get VS build environment +call %VCVARSALL% %VCVARS_PLATFORM% + +echo clean %_LIBFFI_OUT% +if exist %_LIBFFI_OUT% (rd %_LIBFFI_OUT% /s/q) + +echo Configure the build to generate fficonfig.h and ffi.h +%SH% -lc "(cd $OLDPWD; ./configure CC='%MSVCC% %ASSEMBLER%' CXX='%MSVCC% %ASSEMBLER%' LD='link' CPP='cl -nologo -EP' CXXCPP='cl -nologo -EP' CPPFLAGS='-DFFI_BUILDING_DLL' NM='dumpbin -symbols' STRIP=':' --build=$BUILD --host=$HOST;)" + +echo Building libffi +%SH% -lc "(cd $OLDPWD; export PATH=/usr/bin:$PATH; cp src/%SRC_ARCHITECTURE%/ffitarget.h include; make; find .;)" + +REM Tests are not needed to produce artifacts +if "%LIBFFI_TEST%" EQU "1" ( + echo "Running tests..." + %SH% -lc "(cd $OLDPWD; export PATH=/usr/bin:$PATH; cp `find $PWD -name 'libffi-?.dll'` $HOST/testsuite/; make check; cat `find ./ -name libffi.log`)" +) else ( + echo "Not running tests" +) + + +echo copying files to %_LIBFFI_OUT% +if not exist %_LIBFFI_OUT%\include (md %_LIBFFI_OUT%\include) +copy %ARTIFACTS%\.libs\libffi-7.dll %_LIBFFI_OUT% +copy %ARTIFACTS%\.libs\libffi-7.lib %_LIBFFI_OUT% +copy %ARTIFACTS%\fficonfig.h %_LIBFFI_OUT%\include +copy %ARTIFACTS%\include\*.h %_LIBFFI_OUT%\include + +endlocal +exit /b + +:InstallCygwin +setlocal + +if NOT DEFINED CYG_ROOT (set CYG_ROOT=c:/cygwin) +if NOT DEFINED CYG_CACHE (set CYG_CACHE=C:/cygwin/var/cache/setup) +if NOT DEFINED CYG_MIRROR (set CYG_MIRROR=http://mirrors.kernel.org/sourceware/cygwin/) + +powershell -c "md $env:CYG_ROOT -ErrorAction SilentlyContinue" +powershell -c "$setup = $env:CYG_ROOT+'/setup.exe'; if (!(Test-Path $setup)){invoke-webrequest https://cygwin.com/setup-x86.exe -outfile $setup} +%CYG_ROOT%/setup.exe -qnNdO -R "%CYG_ROOT%" -s "%CYG_MIRROR%" -l "%CYG_CACHE%" -P make -P autoconf -P automake -P libtool -P dejagnu + +endlocal +exit /b + diff --git a/PCbuild/python.props b/PCbuild/python.props index 3a0ddceda664..52bc99e0560c 100644 --- a/PCbuild/python.props +++ b/PCbuild/python.props @@ -53,6 +53,9 @@ $(ExternalsDir)sqlite-3.21.0.0\ $(ExternalsDir)bzip2-1.0.6\ $(ExternalsDir)xz-5.2.2\ + $(ExternalsDir)libffi\ + $(ExternalsDir)libffi\$(ArchName)\ + $(libffiOutDir)include $(ExternalsDir)openssl-1.1.0j\ $(ExternalsDir)openssl-bin-1.1.0j\$(ArchName)\ $(opensslOutDir)include diff --git a/Tools/msi/lib/lib_files.wxs b/Tools/msi/lib/lib_files.wxs index 251f9b1aeb86..472bacf20dba 100644 --- a/Tools/msi/lib/lib_files.wxs +++ b/Tools/msi/lib/lib_files.wxs @@ -22,6 +22,9 @@ + + + @@ -59,6 +62,9 @@ + + + From webhook-mailer at python.org Fri Mar 29 19:37:19 2019 From: webhook-mailer at python.org (Steve Dower) Date: Fri, 29 Mar 2019 23:37:19 -0000 Subject: [Python-checkins] bpo-36085: Enable better DLL resolution on Windows (GH-12302) Message-ID: https://github.com/python/cpython/commit/2438cdf0e932a341c7613bf4323d06b91ae9f1f1 commit: 2438cdf0e932a341c7613bf4323d06b91ae9f1f1 branch: master author: Steve Dower committer: GitHub date: 2019-03-29T16:37:16-07:00 summary: bpo-36085: Enable better DLL resolution on Windows (GH-12302) files: A Misc/NEWS.d/next/Windows/2019-03-18-11-44-49.bpo-36085.mLfxfc.rst M Doc/library/ctypes.rst M Doc/library/os.rst M Doc/whatsnew/3.8.rst M Lib/ctypes/__init__.py M Lib/ctypes/test/test_loading.py M Lib/os.py M Lib/test/test_import/__init__.py M Modules/_ctypes/callproc.c M Modules/clinic/posixmodule.c.h M Modules/posixmodule.c M Python/dynload_win.c diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index 500aad8858f2..baab0de8f8ac 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -1322,14 +1322,14 @@ There are several ways to load shared libraries into the Python process. One way is to instantiate one of the following classes: -.. class:: CDLL(name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False) +.. class:: CDLL(name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False, winmode=0) Instances of this class represent loaded shared libraries. Functions in these libraries use the standard C calling convention, and are assumed to return :c:type:`int`. -.. class:: OleDLL(name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False) +.. class:: OleDLL(name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False, winmode=0) Windows only: Instances of this class represent loaded shared libraries, functions in these libraries use the ``stdcall`` calling convention, and are @@ -1342,7 +1342,7 @@ way is to instantiate one of the following classes: :exc:`WindowsError` used to be raised. -.. class:: WinDLL(name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False) +.. class:: WinDLL(name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False, winmode=0) Windows only: Instances of this class represent loaded shared libraries, functions in these libraries use the ``stdcall`` calling convention, and are @@ -1394,6 +1394,17 @@ the Windows error code which is managed by the :func:`GetLastError` and :func:`ctypes.set_last_error` are used to request and change the ctypes private copy of the windows error code. +The *winmode* parameter is used on Windows to specify how the library is loaded +(since *mode* is ignored). It takes any value that is valid for the Win32 API +``LoadLibraryEx`` flags parameter. When omitted, the default is to use the flags +that result in the most secure DLL load to avoiding issues such as DLL +hijacking. Passing the full path to the DLL is the safest way to ensure the +correct library and dependencies are loaded. + +.. versionchanged:: 3.8 + Added *winmode* parameter. + + .. data:: RTLD_GLOBAL :noindex: diff --git a/Doc/library/os.rst b/Doc/library/os.rst index f8803af95200..85e240a0006a 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -3079,6 +3079,36 @@ to be ignored. :func:`signal.signal`. +.. function:: add_dll_directory(path) + + Add a path to the DLL search path. + + This search path is used when resolving dependencies for imported + extension modules (the module itself is resolved through sys.path), + and also by :mod:`ctypes`. + + Remove the directory by calling **close()** on the returned object + or using it in a :keyword:`with` statement. + + See the `Microsoft documentation + `_ + for more information about how DLLs are loaded. + + .. availability:: Windows. + + .. versionadded:: 3.8 + Previous versions of CPython would resolve DLLs using the default + behavior for the current process. This led to inconsistencies, + such as only sometimes searching :envvar:`PATH` or the current + working directory, and OS functions such as ``AddDllDirectory`` + having no effect. + + In 3.8, the two primary ways DLLs are loaded now explicitly + override the process-wide behavior to ensure consistency. See the + :ref:`porting notes ` for information on + updating libraries. + + .. function:: execl(path, arg0, arg1, ...) execle(path, arg0, arg1, ..., env) execlp(file, arg0, arg1, ...) diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 0ffbcab353ec..f0423c376fcd 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -168,6 +168,16 @@ asyncio On Windows, the default event loop is now :class:`~asyncio.ProactorEventLoop`. +ctypes +------ + +On Windows, :class:`~ctypes.CDLL` and subclasses now accept a *winmode* parameter +to specify flags for the underlying ``LoadLibraryEx`` call. The default flags are +set to only load DLL dependencies from trusted locations, including the path +where the DLL is stored (if a full or partial path is used to load the initial +DLL) and paths added by :func:`~os.add_dll_directory`. + + gettext ------- @@ -238,6 +248,13 @@ Added new function, :func:`math.prod`, as analogous function to :func:`sum` that returns the product of a 'start' value (default: 1) times an iterable of numbers. (Contributed by Pablo Galindo in :issue:`35606`) +os +-- + +Added new function :func:`~os.add_dll_directory` on Windows for providing +additional search paths for native dependencies when importing extension +modules or loading DLLs using :mod:`ctypes`. + os.path ------- @@ -727,6 +744,19 @@ Changes in the Python API environment variable and does not use :envvar:`HOME`, which is not normally set for regular user accounts. +.. _bpo-36085-whatsnew: + +* DLL dependencies for extension modules and DLLs loaded with :mod:`ctypes` on + Windows are now resolved more securely. Only the system paths, the directory + containing the DLL or PYD file, and directories added with + :func:`~os.add_dll_directory` are searched for load-time dependencies. + Specifically, :envvar:`PATH` and the current working directory are no longer + used, and modifications to these will no longer have any effect on normal DLL + resolution. If your application relies on these mechanisms, you should check + for :func:`~os.add_dll_directory` and if it exists, use it to add your DLLs + directory while loading your library. + (See :issue:`36085`.) + Changes in the C API -------------------- diff --git a/Lib/ctypes/__init__.py b/Lib/ctypes/__init__.py index 5f78beda5866..4107db3e3972 100644 --- a/Lib/ctypes/__init__.py +++ b/Lib/ctypes/__init__.py @@ -326,7 +326,8 @@ class CDLL(object): def __init__(self, name, mode=DEFAULT_MODE, handle=None, use_errno=False, - use_last_error=False): + use_last_error=False, + winmode=None): self._name = name flags = self._func_flags_ if use_errno: @@ -341,6 +342,15 @@ def __init__(self, name, mode=DEFAULT_MODE, handle=None, """ if name and name.endswith(")") and ".a(" in name: mode |= ( _os.RTLD_MEMBER | _os.RTLD_NOW ) + if _os.name == "nt": + if winmode is not None: + mode = winmode + else: + import nt + mode = nt._LOAD_LIBRARY_SEARCH_DEFAULT_DIRS + if '/' in name or '\\' in name: + self._name = nt._getfullpathname(self._name) + mode |= nt._LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR class _FuncPtr(_CFuncPtr): _flags_ = flags diff --git a/Lib/ctypes/test/test_loading.py b/Lib/ctypes/test/test_loading.py index f3b65b9d6e7e..be367c6fa352 100644 --- a/Lib/ctypes/test/test_loading.py +++ b/Lib/ctypes/test/test_loading.py @@ -1,6 +1,9 @@ from ctypes import * import os +import shutil +import subprocess import sys +import sysconfig import unittest import test.support from ctypes.util import find_library @@ -112,5 +115,65 @@ def test_1703286_B(self): # This is the real test: call the function via 'call_function' self.assertEqual(0, call_function(proc, (None,))) + @unittest.skipUnless(os.name == "nt", + 'test specific to Windows') + def test_load_dll_with_flags(self): + _sqlite3 = test.support.import_module("_sqlite3") + src = _sqlite3.__file__ + if src.lower().endswith("_d.pyd"): + ext = "_d.dll" + else: + ext = ".dll" + + with test.support.temp_dir() as tmp: + # We copy two files and load _sqlite3.dll (formerly .pyd), + # which has a dependency on sqlite3.dll. Then we test + # loading it in subprocesses to avoid it starting in memory + # for each test. + target = os.path.join(tmp, "_sqlite3.dll") + shutil.copy(src, target) + shutil.copy(os.path.join(os.path.dirname(src), "sqlite3" + ext), + os.path.join(tmp, "sqlite3" + ext)) + + def should_pass(command): + with self.subTest(command): + subprocess.check_output( + [sys.executable, "-c", + "from ctypes import *; import nt;" + command], + cwd=tmp + ) + + def should_fail(command): + with self.subTest(command): + with self.assertRaises(subprocess.CalledProcessError): + subprocess.check_output( + [sys.executable, "-c", + "from ctypes import *; import nt;" + command], + cwd=tmp, stderr=subprocess.STDOUT, + ) + + # Default load should not find this in CWD + should_fail("WinDLL('_sqlite3.dll')") + + # Relative path (but not just filename) should succeed + should_pass("WinDLL('./_sqlite3.dll')") + + # Insecure load flags should succeed + should_pass("WinDLL('_sqlite3.dll', winmode=0)") + + # Full path load without DLL_LOAD_DIR shouldn't find dependency + should_fail("WinDLL(nt._getfullpathname('_sqlite3.dll'), " + + "winmode=nt._LOAD_LIBRARY_SEARCH_SYSTEM32)") + + # Full path load with DLL_LOAD_DIR should succeed + should_pass("WinDLL(nt._getfullpathname('_sqlite3.dll'), " + + "winmode=nt._LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR)") + + # User-specified directory should succeed + should_pass("import os; p = os.add_dll_directory(os.getcwd());" + + "WinDLL('_sqlite3.dll'); p.close()") + + + if __name__ == "__main__": unittest.main() diff --git a/Lib/os.py b/Lib/os.py index 7741c7580d0e..79ff7a22d92e 100644 --- a/Lib/os.py +++ b/Lib/os.py @@ -1070,3 +1070,40 @@ def __fspath__(self): @classmethod def __subclasshook__(cls, subclass): return hasattr(subclass, '__fspath__') + + +if name == 'nt': + class _AddedDllDirectory: + def __init__(self, path, cookie, remove_dll_directory): + self.path = path + self._cookie = cookie + self._remove_dll_directory = remove_dll_directory + def close(self): + self._remove_dll_directory(self._cookie) + self.path = None + def __enter__(self): + return self + def __exit__(self, *args): + self.close() + def __repr__(self): + if self.path: + return "".format(self.path) + return "" + + def add_dll_directory(path): + """Add a path to the DLL search path. + + This search path is used when resolving dependencies for imported + extension modules (the module itself is resolved through sys.path), + and also by ctypes. + + Remove the directory by calling close() on the returned object or + using it in a with statement. + """ + import nt + cookie = nt._add_dll_directory(path) + return _AddedDllDirectory( + path, + cookie, + nt._remove_dll_directory + ) diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py index 7306e0f7f722..a0bfe1a6c19b 100644 --- a/Lib/test/test_import/__init__.py +++ b/Lib/test/test_import/__init__.py @@ -8,6 +8,8 @@ import platform import py_compile import random +import shutil +import subprocess import stat import sys import threading @@ -17,6 +19,7 @@ import textwrap import errno import contextlib +import glob import test.support from test.support import ( @@ -460,6 +463,51 @@ def run(): finally: del sys.path[0] + @unittest.skipUnless(sys.platform == "win32", "Windows-specific") + def test_dll_dependency_import(self): + from _winapi import GetModuleFileName + dllname = GetModuleFileName(sys.dllhandle) + pydname = importlib.util.find_spec("_sqlite3").origin + depname = os.path.join( + os.path.dirname(pydname), + "sqlite3{}.dll".format("_d" if "_d" in pydname else "")) + + with test.support.temp_dir() as tmp: + tmp2 = os.path.join(tmp, "DLLs") + os.mkdir(tmp2) + + pyexe = os.path.join(tmp, os.path.basename(sys.executable)) + shutil.copy(sys.executable, pyexe) + shutil.copy(dllname, tmp) + for f in glob.glob(os.path.join(sys.prefix, "vcruntime*.dll")): + shutil.copy(f, tmp) + + shutil.copy(pydname, tmp2) + + env = None + env = {k.upper(): os.environ[k] for k in os.environ} + env["PYTHONPATH"] = tmp2 + ";" + os.path.dirname(os.__file__) + + # Test 1: import with added DLL directory + subprocess.check_call([ + pyexe, "-Sc", ";".join([ + "import os", + "p = os.add_dll_directory({!r})".format( + os.path.dirname(depname)), + "import _sqlite3", + "p.close" + ])], + stderr=subprocess.STDOUT, + env=env, + cwd=os.path.dirname(pyexe)) + + # Test 2: import with DLL adjacent to PYD + shutil.copy(depname, tmp2) + subprocess.check_call([pyexe, "-Sc", "import _sqlite3"], + stderr=subprocess.STDOUT, + env=env, + cwd=os.path.dirname(pyexe)) + @skip_if_dont_write_bytecode class FilePermissionTests(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Windows/2019-03-18-11-44-49.bpo-36085.mLfxfc.rst b/Misc/NEWS.d/next/Windows/2019-03-18-11-44-49.bpo-36085.mLfxfc.rst new file mode 100644 index 000000000000..41f23e655652 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-03-18-11-44-49.bpo-36085.mLfxfc.rst @@ -0,0 +1,2 @@ +Enable better DLL resolution on Windows by using safe DLL search paths and +adding :func:`os.add_dll_directory`. diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index 7c25e2e796bf..5a943d3c3708 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -1251,19 +1251,21 @@ static PyObject *format_error(PyObject *self, PyObject *args) } static const char load_library_doc[] = -"LoadLibrary(name) -> handle\n\ +"LoadLibrary(name, load_flags) -> handle\n\ \n\ Load an executable (usually a DLL), and return a handle to it.\n\ The handle may be used to locate exported functions in this\n\ -module.\n"; +module. load_flags are as defined for LoadLibraryEx in the\n\ +Windows API.\n"; static PyObject *load_library(PyObject *self, PyObject *args) { const WCHAR *name; PyObject *nameobj; - PyObject *ignored; + int load_flags = 0; HMODULE hMod; + DWORD err; - if (!PyArg_ParseTuple(args, "U|O:LoadLibrary", &nameobj, &ignored)) + if (!PyArg_ParseTuple(args, "U|i:LoadLibrary", &nameobj, &load_flags)) return NULL; name = _PyUnicode_AsUnicode(nameobj); @@ -1271,11 +1273,22 @@ static PyObject *load_library(PyObject *self, PyObject *args) return NULL; Py_BEGIN_ALLOW_THREADS - hMod = LoadLibraryW(name); + /* bpo-36085: Limit DLL search directories to avoid pre-loading + * attacks and enable use of the AddDllDirectory function. + */ + hMod = LoadLibraryExW(name, NULL, (DWORD)load_flags); + err = hMod ? 0 : GetLastError(); Py_END_ALLOW_THREADS - if (!hMod) - return PyErr_SetFromWindowsErr(GetLastError()); + if (err == ERROR_MOD_NOT_FOUND) { + PyErr_Format(PyExc_FileNotFoundError, + ("Could not find module '%.500S'. Try using " + "the full path with constructor syntax."), + nameobj); + return NULL; + } else if (err) { + return PyErr_SetFromWindowsErr(err); + } #ifdef _WIN64 return PyLong_FromVoidPtr(hMod); #else @@ -1291,15 +1304,18 @@ static PyObject *free_library(PyObject *self, PyObject *args) { void *hMod; BOOL result; + DWORD err; if (!PyArg_ParseTuple(args, "O&:FreeLibrary", &_parse_voidp, &hMod)) return NULL; Py_BEGIN_ALLOW_THREADS result = FreeLibrary((HMODULE)hMod); + err = result ? 0 : GetLastError(); Py_END_ALLOW_THREADS - if (!result) - return PyErr_SetFromWindowsErr(GetLastError()); + if (!result) { + return PyErr_SetFromWindowsErr(err); + } Py_RETURN_NONE; } diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index 55f2cbb91a08..43f8ba6b4e61 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -7961,6 +7961,94 @@ os_getrandom(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject #endif /* defined(HAVE_GETRANDOM_SYSCALL) */ +#if defined(MS_WINDOWS) + +PyDoc_STRVAR(os__add_dll_directory__doc__, +"_add_dll_directory($module, /, path)\n" +"--\n" +"\n" +"Add a path to the DLL search path.\n" +"\n" +"This search path is used when resolving dependencies for imported\n" +"extension modules (the module itself is resolved through sys.path),\n" +"and also by ctypes.\n" +"\n" +"Returns an opaque value that may be passed to os.remove_dll_directory\n" +"to remove this directory from the search path."); + +#define OS__ADD_DLL_DIRECTORY_METHODDEF \ + {"_add_dll_directory", (PyCFunction)(void(*)(void))os__add_dll_directory, METH_FASTCALL|METH_KEYWORDS, os__add_dll_directory__doc__}, + +static PyObject * +os__add_dll_directory_impl(PyObject *module, path_t *path); + +static PyObject * +os__add_dll_directory(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"path", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "_add_dll_directory", 0}; + PyObject *argsbuf[1]; + path_t path = PATH_T_INITIALIZE("_add_dll_directory", "path", 0, 0); + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!path_converter(args[0], &path)) { + goto exit; + } + return_value = os__add_dll_directory_impl(module, &path); + +exit: + /* Cleanup for path */ + path_cleanup(&path); + + return return_value; +} + +#endif /* defined(MS_WINDOWS) */ + +#if defined(MS_WINDOWS) + +PyDoc_STRVAR(os__remove_dll_directory__doc__, +"_remove_dll_directory($module, /, cookie)\n" +"--\n" +"\n" +"Removes a path from the DLL search path.\n" +"\n" +"The parameter is an opaque value that was returned from\n" +"os.add_dll_directory. You can only remove directories that you added\n" +"yourself."); + +#define OS__REMOVE_DLL_DIRECTORY_METHODDEF \ + {"_remove_dll_directory", (PyCFunction)(void(*)(void))os__remove_dll_directory, METH_FASTCALL|METH_KEYWORDS, os__remove_dll_directory__doc__}, + +static PyObject * +os__remove_dll_directory_impl(PyObject *module, PyObject *cookie); + +static PyObject * +os__remove_dll_directory(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"cookie", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "_remove_dll_directory", 0}; + PyObject *argsbuf[1]; + PyObject *cookie; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + cookie = args[0]; + return_value = os__remove_dll_directory_impl(module, cookie); + +exit: + return return_value; +} + +#endif /* defined(MS_WINDOWS) */ + #ifndef OS_TTYNAME_METHODDEF #define OS_TTYNAME_METHODDEF #endif /* !defined(OS_TTYNAME_METHODDEF) */ @@ -8480,4 +8568,12 @@ os_getrandom(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject #ifndef OS_GETRANDOM_METHODDEF #define OS_GETRANDOM_METHODDEF #endif /* !defined(OS_GETRANDOM_METHODDEF) */ -/*[clinic end generated code: output=1a9c62f5841221ae input=a9049054013a1b77]*/ + +#ifndef OS__ADD_DLL_DIRECTORY_METHODDEF + #define OS__ADD_DLL_DIRECTORY_METHODDEF +#endif /* !defined(OS__ADD_DLL_DIRECTORY_METHODDEF) */ + +#ifndef OS__REMOVE_DLL_DIRECTORY_METHODDEF + #define OS__REMOVE_DLL_DIRECTORY_METHODDEF +#endif /* !defined(OS__REMOVE_DLL_DIRECTORY_METHODDEF) */ +/*[clinic end generated code: output=ab36ec0376a422ae input=a9049054013a1b77]*/ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 3f760183575a..7c4e5f082b5d 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -1442,17 +1442,23 @@ win32_error(const char* function, const char* filename) } static PyObject * -win32_error_object(const char* function, PyObject* filename) +win32_error_object_err(const char* function, PyObject* filename, DWORD err) { /* XXX - see win32_error for comments on 'function' */ - errno = GetLastError(); if (filename) return PyErr_SetExcFromWindowsErrWithFilenameObject( PyExc_OSError, - errno, + err, filename); else - return PyErr_SetFromWindowsErr(errno); + return PyErr_SetFromWindowsErr(err); +} + +static PyObject * +win32_error_object(const char* function, PyObject* filename) +{ + errno = GetLastError(); + return win32_error_object_err(function, filename, errno); } #endif /* MS_WINDOWS */ @@ -13161,6 +13167,113 @@ os_getrandom_impl(PyObject *module, Py_ssize_t size, int flags) } #endif /* HAVE_GETRANDOM_SYSCALL */ +#ifdef MS_WINDOWS +/* bpo-36085: Helper functions for managing DLL search directories + * on win32 + */ + +typedef DLL_DIRECTORY_COOKIE (WINAPI *PAddDllDirectory)(PCWSTR newDirectory); +typedef BOOL (WINAPI *PRemoveDllDirectory)(DLL_DIRECTORY_COOKIE cookie); + +/*[clinic input] +os._add_dll_directory + + path: path_t + +Add a path to the DLL search path. + +This search path is used when resolving dependencies for imported +extension modules (the module itself is resolved through sys.path), +and also by ctypes. + +Returns an opaque value that may be passed to os.remove_dll_directory +to remove this directory from the search path. +[clinic start generated code]*/ + +static PyObject * +os__add_dll_directory_impl(PyObject *module, path_t *path) +/*[clinic end generated code: output=80b025daebb5d683 input=1de3e6c13a5808c8]*/ +{ + HMODULE hKernel32; + PAddDllDirectory AddDllDirectory; + DLL_DIRECTORY_COOKIE cookie = 0; + DWORD err = 0; + + /* For Windows 7, we have to load this. As this will be a fairly + infrequent operation, just do it each time. Kernel32 is always + loaded. */ + Py_BEGIN_ALLOW_THREADS + if (!(hKernel32 = GetModuleHandleW(L"kernel32")) || + !(AddDllDirectory = (PAddDllDirectory)GetProcAddress( + hKernel32, "AddDllDirectory")) || + !(cookie = (*AddDllDirectory)(path->wide))) { + err = GetLastError(); + } + Py_END_ALLOW_THREADS + + if (err) { + return win32_error_object_err("add_dll_directory", + path->object, err); + } + + return PyCapsule_New(cookie, "DLL directory cookie", NULL); +} + +/*[clinic input] +os._remove_dll_directory + + cookie: object + +Removes a path from the DLL search path. + +The parameter is an opaque value that was returned from +os.add_dll_directory. You can only remove directories that you added +yourself. +[clinic start generated code]*/ + +static PyObject * +os__remove_dll_directory_impl(PyObject *module, PyObject *cookie) +/*[clinic end generated code: output=594350433ae535bc input=c1d16a7e7d9dc5dc]*/ +{ + HMODULE hKernel32; + PRemoveDllDirectory RemoveDllDirectory; + DLL_DIRECTORY_COOKIE cookieValue; + DWORD err = 0; + + if (!PyCapsule_IsValid(cookie, "DLL directory cookie")) { + PyErr_SetString(PyExc_TypeError, + "Provided cookie was not returned from os.add_dll_directory"); + return NULL; + } + + cookieValue = (DLL_DIRECTORY_COOKIE)PyCapsule_GetPointer( + cookie, "DLL directory cookie"); + + /* For Windows 7, we have to load this. As this will be a fairly + infrequent operation, just do it each time. Kernel32 is always + loaded. */ + Py_BEGIN_ALLOW_THREADS + if (!(hKernel32 = GetModuleHandleW(L"kernel32")) || + !(RemoveDllDirectory = (PRemoveDllDirectory)GetProcAddress( + hKernel32, "RemoveDllDirectory")) || + !(*RemoveDllDirectory)(cookieValue)) { + err = GetLastError(); + } + Py_END_ALLOW_THREADS + + if (err) { + return win32_error_object_err("remove_dll_directory", + NULL, err); + } + + if (PyCapsule_SetName(cookie, NULL)) { + return NULL; + } + + Py_RETURN_NONE; +} + +#endif static PyMethodDef posix_methods[] = { @@ -13349,6 +13462,10 @@ static PyMethodDef posix_methods[] = { OS_SCANDIR_METHODDEF OS_FSPATH_METHODDEF OS_GETRANDOM_METHODDEF +#ifdef MS_WINDOWS + OS__ADD_DLL_DIRECTORY_METHODDEF + OS__REMOVE_DLL_DIRECTORY_METHODDEF +#endif {NULL, NULL} /* Sentinel */ }; @@ -13826,6 +13943,14 @@ all_ins(PyObject *m) if (PyModule_AddIntConstant(m, "_COPYFILE_DATA", COPYFILE_DATA)) return -1; #endif +#ifdef MS_WINDOWS + if (PyModule_AddIntConstant(m, "_LOAD_LIBRARY_SEARCH_DEFAULT_DIRS", LOAD_LIBRARY_SEARCH_DEFAULT_DIRS)) return -1; + if (PyModule_AddIntConstant(m, "_LOAD_LIBRARY_SEARCH_APPLICATION_DIR", LOAD_LIBRARY_SEARCH_APPLICATION_DIR)) return -1; + if (PyModule_AddIntConstant(m, "_LOAD_LIBRARY_SEARCH_SYSTEM32", LOAD_LIBRARY_SEARCH_SYSTEM32)) return -1; + if (PyModule_AddIntConstant(m, "_LOAD_LIBRARY_SEARCH_USER_DIRS", LOAD_LIBRARY_SEARCH_USER_DIRS)) return -1; + if (PyModule_AddIntConstant(m, "_LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR", LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR)) return -1; +#endif + return 0; } diff --git a/Python/dynload_win.c b/Python/dynload_win.c index 36918c3579d9..457d47f5eed5 100644 --- a/Python/dynload_win.c +++ b/Python/dynload_win.c @@ -215,12 +215,14 @@ dl_funcptr _PyImport_FindSharedFuncptrWindows(const char *prefix, #if HAVE_SXS cookie = _Py_ActivateActCtx(); #endif - /* We use LoadLibraryEx so Windows looks for dependent DLLs - in directory of pathname first. */ - /* XXX This call doesn't exist in Windows CE */ + /* bpo-36085: We use LoadLibraryEx with restricted search paths + to avoid DLL preloading attacks and enable use of the + AddDllDirectory function. We add SEARCH_DLL_LOAD_DIR to + ensure DLLs adjacent to the PYD are preferred. */ Py_BEGIN_ALLOW_THREADS hDLL = LoadLibraryExW(wpathname, NULL, - LOAD_WITH_ALTERED_SEARCH_PATH); + LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | + LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR); Py_END_ALLOW_THREADS #if HAVE_SXS _Py_DeactivateActCtx(cookie); From webhook-mailer at python.org Fri Mar 29 22:08:21 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Sat, 30 Mar 2019 02:08:21 -0000 Subject: [Python-checkins] github: assign @methane to dict owner (GH-12617) Message-ID: https://github.com/python/cpython/commit/7444daada1270c94501d5516ab1e553b5e2b9586 commit: 7444daada1270c94501d5516ab1e553b5e2b9586 branch: master author: Inada Naoki committer: GitHub date: 2019-03-30T11:08:17+09:00 summary: github: assign @methane to dict owner (GH-12617) files: M .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 03e36cfcedd4..40d2cc127690 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -11,6 +11,7 @@ **/*context* @1st1 **/*genobject* @1st1 **/*hamt* @1st1 +Objects/dict* @methane # Hashing **/*hashlib* @python/crypto-team From webhook-mailer at python.org Sat Mar 30 01:32:13 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Sat, 30 Mar 2019 05:32:13 -0000 Subject: [Python-checkins] bpo-17110: doc: add note how to get bytes from sys.argv (GH-12602) Message-ID: https://github.com/python/cpython/commit/38f4e468d4b55551e135c67337c18ae142193ba8 commit: 38f4e468d4b55551e135c67337c18ae142193ba8 branch: master author: Inada Naoki committer: GitHub date: 2019-03-30T14:32:08+09:00 summary: bpo-17110: doc: add note how to get bytes from sys.argv (GH-12602) files: M Doc/library/sys.rst diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 0fa5bd462294..52026f6a2bce 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -30,6 +30,12 @@ always available. To loop over the standard input, or the list of files given on the command line, see the :mod:`fileinput` module. + .. note:: + On Unix, command line arguments are passed by bytes from OS. Python decodes + them with filesystem encoding and "surrogateescape" error handler. + When you need original bytes, you can get it by + ``[os.fsencode(arg) for arg in sys.argv]``. + .. data:: base_exec_prefix From webhook-mailer at python.org Sat Mar 30 01:38:17 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 30 Mar 2019 05:38:17 -0000 Subject: [Python-checkins] bpo-17110: doc: add note how to get bytes from sys.argv (GH-12602) Message-ID: https://github.com/python/cpython/commit/5b80cb5584a72044424f2d82d0ae79c720f24c47 commit: 5b80cb5584a72044424f2d82d0ae79c720f24c47 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-29T22:38:14-07:00 summary: bpo-17110: doc: add note how to get bytes from sys.argv (GH-12602) (cherry picked from commit 38f4e468d4b55551e135c67337c18ae142193ba8) Co-authored-by: Inada Naoki files: M Doc/library/sys.rst diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index ace0e2808b18..c2c653e00beb 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -30,6 +30,12 @@ always available. To loop over the standard input, or the list of files given on the command line, see the :mod:`fileinput` module. + .. note:: + On Unix, command line arguments are passed by bytes from OS. Python decodes + them with filesystem encoding and "surrogateescape" error handler. + When you need original bytes, you can get it by + ``[os.fsencode(arg) for arg in sys.argv]``. + .. data:: base_exec_prefix From webhook-mailer at python.org Sat Mar 30 02:23:43 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Sat, 30 Mar 2019 06:23:43 -0000 Subject: [Python-checkins] bpo-24214: Fixed the UTF-8 incremental decoder. (GH-12603) Message-ID: https://github.com/python/cpython/commit/7a465cb5ee7e298cae626ace1fc3e7d97df79f2e commit: 7a465cb5ee7e298cae626ace1fc3e7d97df79f2e branch: master author: Serhiy Storchaka committer: GitHub date: 2019-03-30T08:23:38+02:00 summary: bpo-24214: Fixed the UTF-8 incremental decoder. (GH-12603) The bug occurred when the encoded surrogate character is passed to the incremental decoder in two chunks. files: A Misc/NEWS.d/next/Core and Builtins/2019-03-28-15-22-45.bpo-24214.tZ6lYU.rst M Lib/test/test_codecs.py M Objects/unicodeobject.c diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index 331449397e37..05843c54bd5f 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -406,6 +406,15 @@ def test_lone_surrogates(self): self.assertEqual(test_sequence.decode(self.encoding, "backslashreplace"), before + backslashreplace + after) + def test_incremental_surrogatepass(self): + # Test incremental decoder for surrogatepass handler: + # see issue #24214 + data = '\uD901'.encode(self.encoding, 'surrogatepass') + for i in range(1, len(data)): + dec = codecs.getincrementaldecoder(self.encoding)('surrogatepass') + self.assertEqual(dec.decode(data[:i]), '') + self.assertEqual(dec.decode(data[i:], True), '\uD901') + class UTF32Test(ReadTest, unittest.TestCase): encoding = "utf-32" diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-28-15-22-45.bpo-24214.tZ6lYU.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-28-15-22-45.bpo-24214.tZ6lYU.rst new file mode 100644 index 000000000000..abb27591f78a --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-28-15-22-45.bpo-24214.tZ6lYU.rst @@ -0,0 +1,2 @@ +Fixed support of the surrogatepass error handler in the UTF-8 incremental +decoder. diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 8ab3943e61b2..c0b345be7e8d 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -4883,6 +4883,9 @@ PyUnicode_DecodeUTF8Stateful(const char *s, case 2: case 3: case 4: + if (s == end || consumed) { + goto End; + } errmsg = "invalid continuation byte"; startinpos = s - starts; endinpos = startinpos + ch - 1; From webhook-mailer at python.org Sat Mar 30 02:25:22 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Sat, 30 Mar 2019 06:25:22 -0000 Subject: [Python-checkins] bpo-36434: Properly handle writing errors in ZIP files. (GH-12559) Message-ID: https://github.com/python/cpython/commit/2524fdefc9bb2a97b99319190aeb23703079ad4c commit: 2524fdefc9bb2a97b99319190aeb23703079ad4c branch: master author: Serhiy Storchaka committer: GitHub date: 2019-03-30T08:25:19+02:00 summary: bpo-36434: Properly handle writing errors in ZIP files. (GH-12559) Errors during writing no longer prevent to properly close the ZIP file. files: A Misc/NEWS.d/next/Library/2019-03-26-14-20-59.bpo-36434.PTdidw.rst M Lib/test/test_zipfile.py M Lib/zipfile.py diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index 7b8922f4e054..14e1e08c5bfd 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -402,6 +402,43 @@ def test_per_file_compresslevel(self): self.assertEqual(one_info._compresslevel, 1) self.assertEqual(nine_info._compresslevel, 9) + def test_writing_errors(self): + class BrokenFile(io.BytesIO): + def write(self, data): + nonlocal count + if count is not None: + if count == stop: + raise OSError + count += 1 + super().write(data) + + stop = 0 + while True: + testfile = BrokenFile() + count = None + with zipfile.ZipFile(testfile, 'w', self.compression) as zipfp: + with zipfp.open('file1', 'w') as f: + f.write(b'data1') + count = 0 + try: + with zipfp.open('file2', 'w') as f: + f.write(b'data2') + except OSError: + stop += 1 + else: + break + finally: + count = None + with zipfile.ZipFile(io.BytesIO(testfile.getvalue())) as zipfp: + self.assertEqual(zipfp.namelist(), ['file1']) + self.assertEqual(zipfp.read('file1'), b'data1') + + with zipfile.ZipFile(io.BytesIO(testfile.getvalue())) as zipfp: + self.assertEqual(zipfp.namelist(), ['file1', 'file2']) + self.assertEqual(zipfp.read('file1'), b'data1') + self.assertEqual(zipfp.read('file2'), b'data2') + + def tearDown(self): unlink(TESTFN) unlink(TESTFN2) diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 61cd929f614f..2dc016472117 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -1105,47 +1105,50 @@ def write(self, data): def close(self): if self.closed: return - super().close() - # Flush any data from the compressor, and update header info - if self._compressor: - buf = self._compressor.flush() - self._compress_size += len(buf) - self._fileobj.write(buf) - self._zinfo.compress_size = self._compress_size - else: - self._zinfo.compress_size = self._file_size - self._zinfo.CRC = self._crc - self._zinfo.file_size = self._file_size - - # Write updated header info - if self._zinfo.flag_bits & 0x08: - # Write CRC and file sizes after the file data - fmt = ' ZIP64_LIMIT: - raise RuntimeError('File size unexpectedly exceeded ZIP64 ' - 'limit') - if self._compress_size > ZIP64_LIMIT: - raise RuntimeError('Compressed size unexpectedly exceeded ' - 'ZIP64 limit') - # Seek backwards and write file header (which will now include - # correct CRC and file sizes) - - # Preserve current position in file - self._zipfile.start_dir = self._fileobj.tell() - self._fileobj.seek(self._zinfo.header_offset) - self._fileobj.write(self._zinfo.FileHeader(self._zip64)) - self._fileobj.seek(self._zipfile.start_dir) - - self._zipfile._writing = False - - # Successfully written: Add file to our caches - self._zipfile.filelist.append(self._zinfo) - self._zipfile.NameToInfo[self._zinfo.filename] = self._zinfo + try: + super().close() + # Flush any data from the compressor, and update header info + if self._compressor: + buf = self._compressor.flush() + self._compress_size += len(buf) + self._fileobj.write(buf) + self._zinfo.compress_size = self._compress_size + else: + self._zinfo.compress_size = self._file_size + self._zinfo.CRC = self._crc + self._zinfo.file_size = self._file_size + + # Write updated header info + if self._zinfo.flag_bits & 0x08: + # Write CRC and file sizes after the file data + fmt = ' ZIP64_LIMIT: + raise RuntimeError( + 'File size unexpectedly exceeded ZIP64 limit') + if self._compress_size > ZIP64_LIMIT: + raise RuntimeError( + 'Compressed size unexpectedly exceeded ZIP64 limit') + # Seek backwards and write file header (which will now include + # correct CRC and file sizes) + + # Preserve current position in file + self._zipfile.start_dir = self._fileobj.tell() + self._fileobj.seek(self._zinfo.header_offset) + self._fileobj.write(self._zinfo.FileHeader(self._zip64)) + self._fileobj.seek(self._zipfile.start_dir) + + # Successfully written: Add file to our caches + self._zipfile.filelist.append(self._zinfo) + self._zipfile.NameToInfo[self._zinfo.filename] = self._zinfo + finally: + self._zipfile._writing = False + + class ZipFile: """ Class with methods to open, read, write, close, list zip files. diff --git a/Misc/NEWS.d/next/Library/2019-03-26-14-20-59.bpo-36434.PTdidw.rst b/Misc/NEWS.d/next/Library/2019-03-26-14-20-59.bpo-36434.PTdidw.rst new file mode 100644 index 000000000000..6e3e050c89bd --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-26-14-20-59.bpo-36434.PTdidw.rst @@ -0,0 +1 @@ +Errors during writing to a ZIP file no longer prevent to properly close it. From webhook-mailer at python.org Sat Mar 30 02:32:23 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Sat, 30 Mar 2019 06:32:23 -0000 Subject: [Python-checkins] bpo-22831: Use "with" to avoid possible fd leaks in tools (part 1). (GH-10926) Message-ID: https://github.com/python/cpython/commit/afbb7a371fb44edc731344eab5b474ad8f7b57d7 commit: afbb7a371fb44edc731344eab5b474ad8f7b57d7 branch: master author: Serhiy Storchaka committer: GitHub date: 2019-03-30T08:32:18+02:00 summary: bpo-22831: Use "with" to avoid possible fd leaks in tools (part 1). (GH-10926) files: M Tools/scripts/fixcid.py M Tools/scripts/fixdiv.py M Tools/scripts/fixheader.py M Tools/scripts/gprof2html.py M Tools/scripts/texi2html.py diff --git a/Tools/scripts/fixcid.py b/Tools/scripts/fixcid.py index c66a0ac093a7..8f35eaeeb4f6 100755 --- a/Tools/scripts/fixcid.py +++ b/Tools/scripts/fixcid.py @@ -281,36 +281,36 @@ def addsubst(substfile): except IOError as msg: err(substfile + ': cannot read substfile: ' + str(msg) + '\n') sys.exit(1) - lineno = 0 - while 1: - line = fp.readline() - if not line: break - lineno = lineno + 1 - try: - i = line.index('#') - except ValueError: - i = -1 # Happens to delete trailing \n - words = line[:i].split() - if not words: continue - if len(words) == 3 and words[0] == 'struct': - words[:2] = [words[0] + ' ' + words[1]] - elif len(words) != 2: - err(substfile + '%s:%r: warning: bad line: %r' % (substfile, lineno, line)) - continue - if Reverse: - [value, key] = words - else: - [key, value] = words - if value[0] == '*': - value = value[1:] - if key[0] == '*': - key = key[1:] - NotInComment[key] = value - if key in Dict: - err('%s:%r: warning: overriding: %r %r\n' % (substfile, lineno, key, value)) - err('%s:%r: warning: previous: %r\n' % (substfile, lineno, Dict[key])) - Dict[key] = value - fp.close() + with fp: + lineno = 0 + while 1: + line = fp.readline() + if not line: break + lineno = lineno + 1 + try: + i = line.index('#') + except ValueError: + i = -1 # Happens to delete trailing \n + words = line[:i].split() + if not words: continue + if len(words) == 3 and words[0] == 'struct': + words[:2] = [words[0] + ' ' + words[1]] + elif len(words) != 2: + err(substfile + '%s:%r: warning: bad line: %r' % (substfile, lineno, line)) + continue + if Reverse: + [value, key] = words + else: + [key, value] = words + if value[0] == '*': + value = value[1:] + if key[0] == '*': + key = key[1:] + NotInComment[key] = value + if key in Dict: + err('%s:%r: warning: overriding: %r %r\n' % (substfile, lineno, key, value)) + err('%s:%r: warning: previous: %r\n' % (substfile, lineno, Dict[key])) + Dict[key] = value if __name__ == '__main__': main() diff --git a/Tools/scripts/fixdiv.py b/Tools/scripts/fixdiv.py index 1213a4e39760..df7c481aa228 100755 --- a/Tools/scripts/fixdiv.py +++ b/Tools/scripts/fixdiv.py @@ -179,27 +179,27 @@ def usage(msg): def readwarnings(warningsfile): prog = re.compile(PATTERN) + warnings = {} try: f = open(warningsfile) except IOError as msg: sys.stderr.write("can't open: %s\n" % msg) return - warnings = {} - while 1: - line = f.readline() - if not line: - break - m = prog.match(line) - if not m: - if line.find("division") >= 0: - sys.stderr.write("Warning: ignored input " + line) - continue - filename, lineno, what = m.groups() - list = warnings.get(filename) - if list is None: - warnings[filename] = list = [] - list.append((int(lineno), sys.intern(what))) - f.close() + with f: + while 1: + line = f.readline() + if not line: + break + m = prog.match(line) + if not m: + if line.find("division") >= 0: + sys.stderr.write("Warning: ignored input " + line) + continue + filename, lineno, what = m.groups() + list = warnings.get(filename) + if list is None: + warnings[filename] = list = [] + list.append((int(lineno), sys.intern(what))) return warnings def process(filename, list): @@ -210,84 +210,84 @@ def process(filename, list): except IOError as msg: sys.stderr.write("can't open: %s\n" % msg) return 1 - print("Index:", filename) - f = FileContext(fp) - list.sort() - index = 0 # list[:index] has been processed, list[index:] is still to do - g = tokenize.generate_tokens(f.readline) - while 1: - startlineno, endlineno, slashes = lineinfo = scanline(g) - if startlineno is None: - break - assert startlineno <= endlineno is not None - orphans = [] - while index < len(list) and list[index][0] < startlineno: - orphans.append(list[index]) - index += 1 - if orphans: - reportphantomwarnings(orphans, f) - warnings = [] - while index < len(list) and list[index][0] <= endlineno: - warnings.append(list[index]) - index += 1 - if not slashes and not warnings: - pass - elif slashes and not warnings: - report(slashes, "No conclusive evidence") - elif warnings and not slashes: - reportphantomwarnings(warnings, f) - else: - if len(slashes) > 1: - if not multi_ok: - rows = [] - lastrow = None - for (row, col), line in slashes: - if row == lastrow: - continue - rows.append(row) - lastrow = row - assert rows - if len(rows) == 1: - print("*** More than one / operator in line", rows[0]) + with fp: + print("Index:", filename) + f = FileContext(fp) + list.sort() + index = 0 # list[:index] has been processed, list[index:] is still to do + g = tokenize.generate_tokens(f.readline) + while 1: + startlineno, endlineno, slashes = lineinfo = scanline(g) + if startlineno is None: + break + assert startlineno <= endlineno is not None + orphans = [] + while index < len(list) and list[index][0] < startlineno: + orphans.append(list[index]) + index += 1 + if orphans: + reportphantomwarnings(orphans, f) + warnings = [] + while index < len(list) and list[index][0] <= endlineno: + warnings.append(list[index]) + index += 1 + if not slashes and not warnings: + pass + elif slashes and not warnings: + report(slashes, "No conclusive evidence") + elif warnings and not slashes: + reportphantomwarnings(warnings, f) + else: + if len(slashes) > 1: + if not multi_ok: + rows = [] + lastrow = None + for (row, col), line in slashes: + if row == lastrow: + continue + rows.append(row) + lastrow = row + assert rows + if len(rows) == 1: + print("*** More than one / operator in line", rows[0]) + else: + print("*** More than one / operator per statement", end=' ') + print("in lines %d-%d" % (rows[0], rows[-1])) + intlong = [] + floatcomplex = [] + bad = [] + for lineno, what in warnings: + if what in ("int", "long"): + intlong.append(what) + elif what in ("float", "complex"): + floatcomplex.append(what) else: - print("*** More than one / operator per statement", end=' ') - print("in lines %d-%d" % (rows[0], rows[-1])) - intlong = [] - floatcomplex = [] - bad = [] - for lineno, what in warnings: - if what in ("int", "long"): - intlong.append(what) - elif what in ("float", "complex"): - floatcomplex.append(what) - else: - bad.append(what) - lastrow = None - for (row, col), line in slashes: - if row == lastrow: - continue - lastrow = row - line = chop(line) - if line[col:col+1] != "/": - print("*** Can't find the / operator in line %d:" % row) - print("*", line) - continue - if bad: - print("*** Bad warning for line %d:" % row, bad) - print("*", line) - elif intlong and not floatcomplex: - print("%dc%d" % (row, row)) - print("<", line) - print("---") - print(">", line[:col] + "/" + line[col:]) - elif floatcomplex and not intlong: - print("True division / operator at line %d:" % row) - print("=", line) - elif intlong and floatcomplex: - print("*** Ambiguous / operator (%s, %s) at line %d:" % ( - "|".join(intlong), "|".join(floatcomplex), row)) - print("?", line) - fp.close() + bad.append(what) + lastrow = None + for (row, col), line in slashes: + if row == lastrow: + continue + lastrow = row + line = chop(line) + if line[col:col+1] != "/": + print("*** Can't find the / operator in line %d:" % row) + print("*", line) + continue + if bad: + print("*** Bad warning for line %d:" % row, bad) + print("*", line) + elif intlong and not floatcomplex: + print("%dc%d" % (row, row)) + print("<", line) + print("---") + print(">", line[:col] + "/" + line[col:]) + elif floatcomplex and not intlong: + print("True division / operator at line %d:" % row) + print("=", line) + elif intlong and floatcomplex: + print("*** Ambiguous / operator (%s, %s) at line %d:" % + ("|".join(intlong), "|".join(floatcomplex), row)) + print("?", line) def reportphantomwarnings(warnings, f): blocks = [] diff --git a/Tools/scripts/fixheader.py b/Tools/scripts/fixheader.py index ec840575b205..c834eec1e20e 100755 --- a/Tools/scripts/fixheader.py +++ b/Tools/scripts/fixheader.py @@ -15,8 +15,8 @@ def process(filename): except IOError as msg: sys.stderr.write('%s: can\'t open: %s\n' % (filename, str(msg))) return - data = f.read() - f.close() + with f: + data = f.read() if data[:2] != '/*': sys.stderr.write('%s does not begin with C comment\n' % filename) return @@ -25,25 +25,25 @@ def process(filename): except IOError as msg: sys.stderr.write('%s: can\'t write: %s\n' % (filename, str(msg))) return - sys.stderr.write('Processing %s ...\n' % filename) - magic = 'Py_' - for c in filename: - if ord(c)<=0x80 and c.isalnum(): - magic = magic + c.upper() - else: magic = magic + '_' - sys.stdout = f - print('#ifndef', magic) - print('#define', magic) - print('#ifdef __cplusplus') - print('extern "C" {') - print('#endif') - print() - f.write(data) - print() - print('#ifdef __cplusplus') - print('}') - print('#endif') - print('#endif /*', '!'+magic, '*/') + with f: + sys.stderr.write('Processing %s ...\n' % filename) + magic = 'Py_' + for c in filename: + if ord(c)<=0x80 and c.isalnum(): + magic = magic + c.upper() + else: magic = magic + '_' + print('#ifndef', magic, file=f) + print('#define', magic, file=f) + print('#ifdef __cplusplus', file=f) + print('extern "C" {', file=f) + print('#endif', file=f) + print(file=f) + f.write(data) + print(file=f) + print('#ifdef __cplusplus', file=f) + print('}', file=f) + print('#endif', file=f) + print('#endif /*', '!'+magic, '*/', file=f) if __name__ == '__main__': main() diff --git a/Tools/scripts/gprof2html.py b/Tools/scripts/gprof2html.py index 4ca705c3c61c..b14def4ef848 100755 --- a/Tools/scripts/gprof2html.py +++ b/Tools/scripts/gprof2html.py @@ -28,14 +28,7 @@ def add_escapes(filename): for line in fp: yield html.escape(line) - -def main(): - filename = "gprof.out" - if sys.argv[1:]: - filename = sys.argv[1] - outputfilename = filename + ".html" - input = add_escapes(filename) - output = open(outputfilename, "w") +def gprof2html(input, output, filename): output.write(header % filename) for line in input: output.write(line) @@ -78,7 +71,16 @@ def main(): part = '%s' % (part, part) output.write(part) output.write(trailer) - output.close() + + +def main(): + filename = "gprof.out" + if sys.argv[1:]: + filename = sys.argv[1] + outputfilename = filename + ".html" + input = add_escapes(filename) + with open(outputfilename, "w") as output: + gprof2html(input, output, filename) webbrowser.open("file:" + os.path.abspath(outputfilename)) if __name__ == '__main__': diff --git a/Tools/scripts/texi2html.py b/Tools/scripts/texi2html.py index 5565c210dabb..c06d812ab3fb 100755 --- a/Tools/scripts/texi2html.py +++ b/Tools/scripts/texi2html.py @@ -118,11 +118,10 @@ def write(self, *lines): self.lines.append(line) def flush(self): - fp = open(self.dirname + '/' + makefile(self.name), 'w') - fp.write(self.prologue) - fp.write(self.text) - fp.write(self.epilogue) - fp.close() + with open(self.dirname + '/' + makefile(self.name), 'w') as fp: + fp.write(self.prologue) + fp.write(self.text) + fp.write(self.epilogue) def link(self, label, nodename, rel=None, rev=None): if nodename: @@ -558,14 +557,14 @@ def do_include(self, args): except IOError as msg: print('*** Can\'t open include file', repr(file)) return - print('!'*self.debugging, '--> file', repr(file)) - save_done = self.done - save_skip = self.skip - save_stack = self.stack - self.includedepth = self.includedepth + 1 - self.parserest(fp, 0) - self.includedepth = self.includedepth - 1 - fp.close() + with fp: + print('!'*self.debugging, '--> file', repr(file)) + save_done = self.done + save_skip = self.skip + save_stack = self.stack + self.includedepth = self.includedepth + 1 + self.parserest(fp, 0) + self.includedepth = self.includedepth - 1 self.done = save_done self.skip = save_skip self.stack = save_stack @@ -1770,78 +1769,75 @@ def finalize(self): # PROJECT FILE try: - fp = open(projectfile,'w') - print('[OPTIONS]', file=fp) - print('Auto Index=Yes', file=fp) - print('Binary TOC=No', file=fp) - print('Binary Index=Yes', file=fp) - print('Compatibility=1.1', file=fp) - print('Compiled file=' + resultfile + '', file=fp) - print('Contents file=' + contentfile + '', file=fp) - print('Default topic=' + defaulttopic + '', file=fp) - print('Error log file=ErrorLog.log', file=fp) - print('Index file=' + indexfile + '', file=fp) - print('Title=' + title + '', file=fp) - print('Display compile progress=Yes', file=fp) - print('Full-text search=Yes', file=fp) - print('Default window=main', file=fp) - print('', file=fp) - print('[WINDOWS]', file=fp) - print('main=,"' + contentfile + '","' + indexfile - + '","","",,,,,0x23520,222,0x1046,[10,10,780,560],' - '0xB0000,,,,,,0', file=fp) - print('', file=fp) - print('[FILES]', file=fp) - print('', file=fp) - self.dumpfiles(fp) - fp.close() + with open(projectfile, 'w') as fp: + print('[OPTIONS]', file=fp) + print('Auto Index=Yes', file=fp) + print('Binary TOC=No', file=fp) + print('Binary Index=Yes', file=fp) + print('Compatibility=1.1', file=fp) + print('Compiled file=' + resultfile + '', file=fp) + print('Contents file=' + contentfile + '', file=fp) + print('Default topic=' + defaulttopic + '', file=fp) + print('Error log file=ErrorLog.log', file=fp) + print('Index file=' + indexfile + '', file=fp) + print('Title=' + title + '', file=fp) + print('Display compile progress=Yes', file=fp) + print('Full-text search=Yes', file=fp) + print('Default window=main', file=fp) + print('', file=fp) + print('[WINDOWS]', file=fp) + print('main=,"' + contentfile + '","' + indexfile + + '","","",,,,,0x23520,222,0x1046,[10,10,780,560],' + '0xB0000,,,,,,0', file=fp) + print('', file=fp) + print('[FILES]', file=fp) + print('', file=fp) + self.dumpfiles(fp) except IOError as msg: print(projectfile, ':', msg) sys.exit(1) # CONTENT FILE try: - fp = open(contentfile,'w') - print('', file=fp) - print('', file=fp) - print('', file=fp) - print('', file=fp) - print('', file=fp) - print('', file=fp) - print('', file=fp) - print('', file=fp) - print(' ', file=fp) - print(' ', file=fp) - print(' ', file=fp) - print(' ', file=fp) - print(' ', file=fp) - self.dumpnodes(fp) - print('', file=fp) - print('', file=fp) - fp.close() + with open(contentfile, 'w') as fp: + print('', file=fp) + print('', file=fp) + print('', file=fp) + print('', file=fp) + print('', file=fp) + print('', file=fp) + print('', file=fp) + print('', file=fp) + print(' ', file=fp) + print(' ', file=fp) + print(' ', file=fp) + print(' ', file=fp) + print(' ', file=fp) + self.dumpnodes(fp) + print('', file=fp) + print('', file=fp) except IOError as msg: print(contentfile, ':', msg) sys.exit(1) # INDEX FILE try: - fp = open(indexfile ,'w') - print('', file=fp) - print('', file=fp) - print('', file=fp) - print('', file=fp) - print('', file=fp) - print('', file=fp) - print('', file=fp) - print('', file=fp) - print('', file=fp) - print('', file=fp) - self.dumpindex(fp) - print('', file=fp) - print('', file=fp) - fp.close() + with open(indexfile, 'w') as fp: + print('', file=fp) + print('', file=fp) + print('', file=fp) + print('', file=fp) + print('', file=fp) + print('', file=fp) + print('', file=fp) + print('', file=fp) + print('', file=fp) + print('', file=fp) + self.dumpindex(fp) + print('', file=fp) + print('', file=fp) except IOError as msg: print(indexfile , ':', msg) sys.exit(1) @@ -2064,8 +2060,8 @@ def test(): print(file, ':', msg) sys.exit(1) - parser.parse(fp) - fp.close() + with fp: + parser.parse(fp) parser.report() htmlhelp.finalize() From webhook-mailer at python.org Sat Mar 30 02:33:06 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Sat, 30 Mar 2019 06:33:06 -0000 Subject: [Python-checkins] bpo-22831: Use "with" to avoid possible fd leaks in tools (part 2). (GH-10927) Message-ID: https://github.com/python/cpython/commit/172bb39452ae8b3ccdf5d1f23ead46f44200cd49 commit: 172bb39452ae8b3ccdf5d1f23ead46f44200cd49 branch: master author: Serhiy Storchaka committer: GitHub date: 2019-03-30T08:33:02+02:00 summary: bpo-22831: Use "with" to avoid possible fd leaks in tools (part 2). (GH-10927) files: M Tools/demo/markov.py M Tools/demo/rpython.py M Tools/demo/rpythond.py M Tools/freeze/checkextensions_win32.py M Tools/freeze/freeze.py M Tools/i18n/pygettext.py M Tools/scripts/cleanfuture.py M Tools/scripts/combinerefs.py M Tools/scripts/dutree.py M Tools/scripts/eptags.py M Tools/scripts/finddiv.py M Tools/scripts/fixnotice.py M Tools/scripts/fixps.py M Tools/scripts/get-remote-certificate.py M Tools/scripts/h2py.py M Tools/scripts/ifdef.py M Tools/scripts/md5sum.py M Tools/scripts/mkreal.py M Tools/scripts/nm2def.py M Tools/scripts/objgraph.py M Tools/scripts/parseentities.py M Tools/scripts/pathfix.py M Tools/scripts/pdeps.py M Tools/scripts/ptags.py M Tools/scripts/rgrep.py M Tools/unicode/gencjkcodecs.py M Tools/unicode/gencodec.py diff --git a/Tools/demo/markov.py b/Tools/demo/markov.py index 7a0720fa7c34..9729f3820fa0 100755 --- a/Tools/demo/markov.py +++ b/Tools/demo/markov.py @@ -78,9 +78,9 @@ def test(): continue else: f = open(filename, 'r') - if debug: print('processing', filename, '...') - text = f.read() - f.close() + with f: + if debug: print('processing', filename, '...') + text = f.read() paralist = text.split('\n\n') for para in paralist: if debug > 1: print('feeding ...') diff --git a/Tools/demo/rpython.py b/Tools/demo/rpython.py index 5e7bc0a27d11..8d7e2747636c 100755 --- a/Tools/demo/rpython.py +++ b/Tools/demo/rpython.py @@ -22,17 +22,16 @@ def main(): port = int(port[i+1:]) host = host[:i] command = ' '.join(sys.argv[2:]) - s = socket(AF_INET, SOCK_STREAM) - s.connect((host, port)) - s.send(command.encode()) - s.shutdown(SHUT_WR) - reply = b'' - while True: - data = s.recv(BUFSIZE) - if not data: - break - reply += data - print(reply.decode(), end=' ') - s.close() + with socket(AF_INET, SOCK_STREAM) as s: + s.connect((host, port)) + s.send(command.encode()) + s.shutdown(SHUT_WR) + reply = b'' + while True: + data = s.recv(BUFSIZE) + if not data: + break + reply += data + print(reply.decode(), end=' ') main() diff --git a/Tools/demo/rpythond.py b/Tools/demo/rpythond.py index 9ffe13ab4fee..a885b3e946a1 100755 --- a/Tools/demo/rpythond.py +++ b/Tools/demo/rpythond.py @@ -26,16 +26,16 @@ def main(): s.listen(1) while True: conn, (remotehost, remoteport) = s.accept() - print('connection from', remotehost, remoteport) - request = b'' - while 1: - data = conn.recv(BUFSIZE) - if not data: - break - request += data - reply = execute(request.decode()) - conn.send(reply.encode()) - conn.close() + with conn: + print('connection from', remotehost, remoteport) + request = b'' + while 1: + data = conn.recv(BUFSIZE) + if not data: + break + request += data + reply = execute(request.decode()) + conn.send(reply.encode()) def execute(request): stdout = sys.stdout diff --git a/Tools/freeze/checkextensions_win32.py b/Tools/freeze/checkextensions_win32.py index c9cb576ae520..64350df2b84f 100644 --- a/Tools/freeze/checkextensions_win32.py +++ b/Tools/freeze/checkextensions_win32.py @@ -130,7 +130,8 @@ def parse_dsp(dsp): ret = [] dsp_path, dsp_name = os.path.split(dsp) try: - lines = open(dsp, "r").readlines() + with open(dsp, "r") as fp: + lines = fp.readlines() except IOError as msg: sys.stderr.write("%s: %s\n" % (dsp, msg)) return None diff --git a/Tools/freeze/freeze.py b/Tools/freeze/freeze.py index 3ab56fd0fe1d..83aa508a46a9 100755 --- a/Tools/freeze/freeze.py +++ b/Tools/freeze/freeze.py @@ -142,7 +142,8 @@ def main(): # last option can not be "-i", so this ensures "pos+1" is in range! if sys.argv[pos] == '-i': try: - options = open(sys.argv[pos+1]).read().split() + with open(sys.argv[pos+1]) as infp: + options = infp.read().split() except IOError as why: usage("File name '%s' specified with the -i option " "can not be read - %s" % (sys.argv[pos+1], why) ) diff --git a/Tools/i18n/pygettext.py b/Tools/i18n/pygettext.py index b46dd339736f..b1d281d793bd 100755 --- a/Tools/i18n/pygettext.py +++ b/Tools/i18n/pygettext.py @@ -561,9 +561,8 @@ class Options: # initialize list of strings to exclude if options.excludefilename: try: - fp = open(options.excludefilename) - options.toexclude = fp.readlines() - fp.close() + with open(options.excludefilename) as fp: + options.toexclude = fp.readlines() except IOError: print(_( "Can't read --exclude-file: %s") % options.excludefilename, file=sys.stderr) diff --git a/Tools/scripts/cleanfuture.py b/Tools/scripts/cleanfuture.py index b48ab60dd65b..94f691263215 100755 --- a/Tools/scripts/cleanfuture.py +++ b/Tools/scripts/cleanfuture.py @@ -96,11 +96,11 @@ def check(file): errprint("%r: I/O Error: %s" % (file, str(msg))) return - ff = FutureFinder(f, file) - changed = ff.run() - if changed: - ff.gettherest() - f.close() + with f: + ff = FutureFinder(f, file) + changed = ff.run() + if changed: + ff.gettherest() if changed: if verbose: print("changed.") @@ -122,9 +122,8 @@ def check(file): os.rename(file, bak) if verbose: print("renamed", file, "to", bak) - g = open(file, "w") - ff.write(g) - g.close() + with open(file, "w") as g: + ff.write(g) if verbose: print("wrote new", file) else: diff --git a/Tools/scripts/combinerefs.py b/Tools/scripts/combinerefs.py index 7ca95267c93d..49ccca73909f 100755 --- a/Tools/scripts/combinerefs.py +++ b/Tools/scripts/combinerefs.py @@ -85,9 +85,7 @@ def read(fileiter, pat, whilematch): else: break -def combine(fname): - f = open(fname) - +def combinefile(f): fi = iter(f) for line in read(fi, re.compile(r'^Remaining objects:$'), False): @@ -121,8 +119,11 @@ def combine(fname): print('[%s->%s]' % (addr2rc[addr], rc), end=' ') print(guts, addr2guts[addr]) - f.close() print("%d objects before, %d after" % (before, after)) +def combine(fname): + with open(fname) as f: + combinefile(f) + if __name__ == '__main__': combine(sys.argv[1]) diff --git a/Tools/scripts/dutree.py b/Tools/scripts/dutree.py index 6b4361ac6138..d25cf72b707e 100755 --- a/Tools/scripts/dutree.py +++ b/Tools/scripts/dutree.py @@ -4,18 +4,18 @@ import os, sys, errno def main(): - p = os.popen('du ' + ' '.join(sys.argv[1:]), 'r') total, d = None, {} - for line in p.readlines(): - i = 0 - while line[i] in '0123456789': i = i+1 - size = eval(line[:i]) - while line[i] in ' \t': i = i+1 - filename = line[i:-1] - comps = filename.split('/') - if comps[0] == '': comps[0] = '/' - if comps[len(comps)-1] == '': del comps[len(comps)-1] - total, d = store(size, comps, total, d) + with os.popen('du ' + ' '.join(sys.argv[1:])) as p: + for line in p: + i = 0 + while line[i] in '0123456789': i = i+1 + size = eval(line[:i]) + while line[i] in ' \t': i = i+1 + filename = line[i:-1] + comps = filename.split('/') + if comps[0] == '': comps[0] = '/' + if comps[len(comps)-1] == '': del comps[len(comps)-1] + total, d = store(size, comps, total, d) try: display(total, d) except IOError as e: diff --git a/Tools/scripts/eptags.py b/Tools/scripts/eptags.py index 401ac7e29cd2..7f8059ba71ad 100755 --- a/Tools/scripts/eptags.py +++ b/Tools/scripts/eptags.py @@ -28,29 +28,30 @@ def treat_file(filename, outfp): except OSError: sys.stderr.write('Cannot open %s\n'%filename) return - charno = 0 - lineno = 0 - tags = [] - size = 0 - while 1: - line = fp.readline() - if not line: - break - lineno = lineno + 1 - m = matcher.search(line) - if m: - tag = m.group(0) + '\177%d,%d\n' % (lineno, charno) - tags.append(tag) - size = size + len(tag) - charno = charno + len(line) + with fp: + charno = 0 + lineno = 0 + tags = [] + size = 0 + while 1: + line = fp.readline() + if not line: + break + lineno = lineno + 1 + m = matcher.search(line) + if m: + tag = m.group(0) + '\177%d,%d\n' % (lineno, charno) + tags.append(tag) + size = size + len(tag) + charno = charno + len(line) outfp.write('\f\n%s,%d\n' % (filename,size)) for tag in tags: outfp.write(tag) def main(): - outfp = open('TAGS', 'w') - for filename in sys.argv[1:]: - treat_file(filename, outfp) + with open('TAGS', 'w') as outfp: + for filename in sys.argv[1:]: + treat_file(filename, outfp) if __name__=="__main__": main() diff --git a/Tools/scripts/finddiv.py b/Tools/scripts/finddiv.py index a705f562036e..d21253cf1c8a 100755 --- a/Tools/scripts/finddiv.py +++ b/Tools/scripts/finddiv.py @@ -55,17 +55,17 @@ def process(filename, listnames): except IOError as msg: sys.stderr.write("Can't open: %s\n" % msg) return 1 - g = tokenize.generate_tokens(fp.readline) - lastrow = None - for type, token, (row, col), end, line in g: - if token in ("/", "/="): - if listnames: - print(filename) - break - if row != lastrow: - lastrow = row - print("%s:%d:%s" % (filename, row, line), end=' ') - fp.close() + with fp: + g = tokenize.generate_tokens(fp.readline) + lastrow = None + for type, token, (row, col), end, line in g: + if token in ("/", "/="): + if listnames: + print(filename) + break + if row != lastrow: + lastrow = row + print("%s:%d:%s" % (filename, row, line), end=' ') def processdir(dir, listnames): try: diff --git a/Tools/scripts/fixnotice.py b/Tools/scripts/fixnotice.py index ad967f94781c..317051dd82f3 100755 --- a/Tools/scripts/fixnotice.py +++ b/Tools/scripts/fixnotice.py @@ -73,22 +73,19 @@ def main(): elif opt == '--dry-run': DRYRUN = 1 elif opt == '--oldnotice': - fp = open(arg) - OLD_NOTICE = fp.read() - fp.close() + with open(arg) as fp: + OLD_NOTICE = fp.read() elif opt == '--newnotice': - fp = open(arg) - NEW_NOTICE = fp.read() - fp.close() + with open(arg) as fp: + NEW_NOTICE = fp.read() for arg in args: process(arg) def process(file): - f = open(file) - data = f.read() - f.close() + with open(file) as f: + data = f.read() i = data.find(OLD_NOTICE) if i < 0: if VERBOSE: @@ -102,9 +99,8 @@ def process(file): data = data[:i] + NEW_NOTICE + data[i+len(OLD_NOTICE):] new = file + ".new" backup = file + ".bak" - f = open(new, "w") - f.write(data) - f.close() + with open(new, "w") as f: + f.write(data) os.rename(file, backup) os.rename(new, file) diff --git a/Tools/scripts/fixps.py b/Tools/scripts/fixps.py index b00226120684..725300e56a27 100755 --- a/Tools/scripts/fixps.py +++ b/Tools/scripts/fixps.py @@ -14,20 +14,18 @@ def main(): except IOError as msg: print(filename, ': can\'t open :', msg) continue - line = f.readline() - if not re.match('^#! */usr/local/bin/python', line): - print(filename, ': not a /usr/local/bin/python script') - f.close() - continue - rest = f.read() - f.close() + with f: + line = f.readline() + if not re.match('^#! */usr/local/bin/python', line): + print(filename, ': not a /usr/local/bin/python script') + continue + rest = f.read() line = re.sub('/usr/local/bin/python', '/usr/bin/env python', line) print(filename, ':', repr(line)) - f = open(filename, "w") - f.write(line) - f.write(rest) - f.close() + with open(filename, "w") as f: + f.write(line) + f.write(rest) if __name__ == '__main__': main() diff --git a/Tools/scripts/get-remote-certificate.py b/Tools/scripts/get-remote-certificate.py index 5811f202eda9..38901286e19a 100755 --- a/Tools/scripts/get-remote-certificate.py +++ b/Tools/scripts/get-remote-certificate.py @@ -29,9 +29,8 @@ def strip_to_x509_cert(certfile_contents, outfile=None): return None else: tn = tempfile.mktemp() - fp = open(tn, "wb") - fp.write(m.group(1) + b"\n") - fp.close() + with open(tn, "wb") as fp: + fp.write(m.group(1) + b"\n") try: tn2 = (outfile or tempfile.mktemp()) status, output = subproc(r'openssl x509 -in "%s" -out "%s"' % @@ -39,9 +38,8 @@ def strip_to_x509_cert(certfile_contents, outfile=None): if status != 0: raise RuntimeError('OpenSSL x509 failed with status %s and ' 'output: %r' % (status, output)) - fp = open(tn2, 'rb') - data = fp.read() - fp.close() + with open(tn2, 'rb') as fp: + data = fp.read() os.unlink(tn2) return data finally: @@ -49,9 +47,8 @@ def strip_to_x509_cert(certfile_contents, outfile=None): if sys.platform.startswith("win"): tfile = tempfile.mktemp() - fp = open(tfile, "w") - fp.write("quit\n") - fp.close() + with open(tfile, "w") as fp: + fp.write("quit\n") try: status, output = subproc( 'openssl s_client -connect "%s:%s" -showcerts < "%s"' % diff --git a/Tools/scripts/h2py.py b/Tools/scripts/h2py.py index 4363c0cf7354..ea37c04d4c56 100755 --- a/Tools/scripts/h2py.py +++ b/Tools/scripts/h2py.py @@ -69,23 +69,21 @@ def main(): sys.stdout.write('# Generated by h2py from stdin\n') process(sys.stdin, sys.stdout) else: - fp = open(filename, 'r') - outfile = os.path.basename(filename) - i = outfile.rfind('.') - if i > 0: outfile = outfile[:i] - modname = outfile.upper() - outfile = modname + '.py' - outfp = open(outfile, 'w') - outfp.write('# Generated by h2py from %s\n' % filename) - filedict = {} - for dir in searchdirs: - if filename[:len(dir)] == dir: - filedict[filename[len(dir)+1:]] = None # no '/' trailing - importable[filename[len(dir)+1:]] = modname - break - process(fp, outfp) - outfp.close() - fp.close() + with open(filename) as fp: + outfile = os.path.basename(filename) + i = outfile.rfind('.') + if i > 0: outfile = outfile[:i] + modname = outfile.upper() + outfile = modname + '.py' + with open(outfile, 'w') as outfp: + outfp.write('# Generated by h2py from %s\n' % filename) + filedict = {} + for dir in searchdirs: + if filename[:len(dir)] == dir: + filedict[filename[len(dir)+1:]] = None # no '/' trailing + importable[filename[len(dir)+1:]] = modname + break + process(fp, outfp) def pytify(body): # replace ignored patterns by spaces @@ -161,9 +159,10 @@ def process(fp, outfp, env = {}): except IOError: pass if inclfp: - outfp.write( - '\n# Included from %s\n' % filename) - process(inclfp, outfp, env) + with inclfp: + outfp.write( + '\n# Included from %s\n' % filename) + process(inclfp, outfp, env) else: sys.stderr.write('Warning - could not find file %s\n' % filename) diff --git a/Tools/scripts/ifdef.py b/Tools/scripts/ifdef.py index b1711ce5c16e..22249b2d0af5 100755 --- a/Tools/scripts/ifdef.py +++ b/Tools/scripts/ifdef.py @@ -45,9 +45,8 @@ def main(): if filename == '-': process(sys.stdin, sys.stdout) else: - f = open(filename, 'r') - process(f, sys.stdout) - f.close() + with open(filename) as f: + process(f, sys.stdout) def process(fpi, fpo): keywords = ('if', 'ifdef', 'ifndef', 'else', 'endif') diff --git a/Tools/scripts/md5sum.py b/Tools/scripts/md5sum.py index 9cf4bdc9c691..f910576377aa 100755 --- a/Tools/scripts/md5sum.py +++ b/Tools/scripts/md5sum.py @@ -47,10 +47,10 @@ def printsum(filename, out=sys.stdout): except IOError as msg: sys.stderr.write('%s: Can\'t open: %s\n' % (filename, msg)) return 1 - if fnfilter: - filename = fnfilter(filename) - sts = printsumfp(fp, filename, out) - fp.close() + with fp: + if fnfilter: + filename = fnfilter(filename) + sts = printsumfp(fp, filename, out) return sts def printsumfp(fp, filename, out=sys.stdout): diff --git a/Tools/scripts/mkreal.py b/Tools/scripts/mkreal.py index b21909e691d6..f169da43fe11 100755 --- a/Tools/scripts/mkreal.py +++ b/Tools/scripts/mkreal.py @@ -18,14 +18,13 @@ def mkrealfile(name): st = os.stat(name) # Get the mode mode = S_IMODE(st[ST_MODE]) linkto = os.readlink(name) # Make sure again it's a symlink - f_in = open(name, 'r') # This ensures it's a file - os.unlink(name) - f_out = open(name, 'w') - while 1: - buf = f_in.read(BUFSIZE) - if not buf: break - f_out.write(buf) - del f_out # Flush data to disk before changing mode + with open(name, 'rb') as f_in: # This ensures it's a file + os.unlink(name) + with open(name, 'wb') as f_out: + while 1: + buf = f_in.read(BUFSIZE) + if not buf: break + f_out.write(buf) os.chmod(name, mode) def mkrealdir(name): diff --git a/Tools/scripts/nm2def.py b/Tools/scripts/nm2def.py index 83bbcd749f4d..a885ebd6fecc 100755 --- a/Tools/scripts/nm2def.py +++ b/Tools/scripts/nm2def.py @@ -42,7 +42,8 @@ def symbols(lib=PYTHONLIB,types=('T','C','D')): - lines = os.popen(NM % lib).readlines() + with os.popen(NM % lib) as pipe: + lines = pipe.readlines() lines = [s.strip() for s in lines] symbols = {} for line in lines: @@ -97,7 +98,7 @@ def main(): exports = export_list(s) f = sys.stdout # open('PC/python_nt.def','w') f.write(DEF_TEMPLATE % (exports)) - f.close() + # f.close() if __name__ == '__main__': main() diff --git a/Tools/scripts/objgraph.py b/Tools/scripts/objgraph.py index 3bb1712a9dcf..add41e692c03 100755 --- a/Tools/scripts/objgraph.py +++ b/Tools/scripts/objgraph.py @@ -180,7 +180,8 @@ def main(): if filename == '-': readinput(sys.stdin) else: - readinput(open(filename, 'r')) + with open(filename) as f: + readinput(f) # warndups() # diff --git a/Tools/scripts/parseentities.py b/Tools/scripts/parseentities.py index c686b0241a71..0229d3af86ba 100755 --- a/Tools/scripts/parseentities.py +++ b/Tools/scripts/parseentities.py @@ -50,13 +50,15 @@ def writefile(f,defs): if __name__ == '__main__': if len(sys.argv) > 1: - infile = open(sys.argv[1]) + with open(sys.argv[1]) as infile: + text = infile.read() else: - infile = sys.stdin + text = sys.stdin.read() + + defs = parse(text) + if len(sys.argv) > 2: - outfile = open(sys.argv[2],'w') + with open(sys.argv[2],'w') as outfile: + writefile(outfile, defs) else: - outfile = sys.stdout - text = infile.read() - defs = parse(text) - writefile(outfile,defs) + writefile(sys.stdout, defs) diff --git a/Tools/scripts/pathfix.py b/Tools/scripts/pathfix.py index c5bf984306a3..1a0cf1c9e69c 100755 --- a/Tools/scripts/pathfix.py +++ b/Tools/scripts/pathfix.py @@ -103,29 +103,27 @@ def fix(filename): except IOError as msg: err('%s: cannot open: %r\n' % (filename, msg)) return 1 - line = f.readline() - fixed = fixline(line) - if line == fixed: - rep(filename+': no change\n') - f.close() - return - head, tail = os.path.split(filename) - tempname = os.path.join(head, '@' + tail) - try: - g = open(tempname, 'wb') - except IOError as msg: - f.close() - err('%s: cannot create: %r\n' % (tempname, msg)) - return 1 - rep(filename + ': updating\n') - g.write(fixed) - BUFSIZE = 8*1024 - while 1: - buf = f.read(BUFSIZE) - if not buf: break - g.write(buf) - g.close() - f.close() + with f: + line = f.readline() + fixed = fixline(line) + if line == fixed: + rep(filename+': no change\n') + return + head, tail = os.path.split(filename) + tempname = os.path.join(head, '@' + tail) + try: + g = open(tempname, 'wb') + except IOError as msg: + err('%s: cannot create: %r\n' % (tempname, msg)) + return 1 + with g: + rep(filename + ': updating\n') + g.write(fixed) + BUFSIZE = 8*1024 + while 1: + buf = f.read(BUFSIZE) + if not buf: break + g.write(buf) # Finishing touch -- move files diff --git a/Tools/scripts/pdeps.py b/Tools/scripts/pdeps.py index f8218ac5243d..4e8e930948f1 100755 --- a/Tools/scripts/pdeps.py +++ b/Tools/scripts/pdeps.py @@ -64,29 +64,28 @@ def main(): # Collect data from one file # def process(filename, table): - fp = open(filename, 'r') - mod = os.path.basename(filename) - if mod[-3:] == '.py': - mod = mod[:-3] - table[mod] = list = [] - while 1: - line = fp.readline() - if not line: break - while line[-1:] == '\\': - nextline = fp.readline() - if not nextline: break - line = line[:-1] + nextline - m_found = m_import.match(line) or m_from.match(line) - if m_found: - (a, b), (a1, b1) = m_found.regs[:2] - else: continue - words = line[a1:b1].split(',') - # print '#', line, words - for word in words: - word = word.strip() - if word not in list: - list.append(word) - fp.close() + with open(filename) as fp: + mod = os.path.basename(filename) + if mod[-3:] == '.py': + mod = mod[:-3] + table[mod] = list = [] + while 1: + line = fp.readline() + if not line: break + while line[-1:] == '\\': + nextline = fp.readline() + if not nextline: break + line = line[:-1] + nextline + m_found = m_import.match(line) or m_from.match(line) + if m_found: + (a, b), (a1, b1) = m_found.regs[:2] + else: continue + words = line[a1:b1].split(',') + # print '#', line, words + for word in words: + word = word.strip() + if word not in list: + list.append(word) # Compute closure (this is in fact totally general) diff --git a/Tools/scripts/ptags.py b/Tools/scripts/ptags.py index 396cbd07ea4d..eedd411702c1 100755 --- a/Tools/scripts/ptags.py +++ b/Tools/scripts/ptags.py @@ -19,9 +19,9 @@ def main(): for filename in args: treat_file(filename) if tags: - fp = open('tags', 'w') - tags.sort() - for s in tags: fp.write(s) + with open('tags', 'w') as fp: + tags.sort() + for s in tags: fp.write(s) expr = r'^[ \t]*(def|class)[ \t]+([a-zA-Z0-9_]+)[ \t]*[:\(]' @@ -33,21 +33,22 @@ def treat_file(filename): except: sys.stderr.write('Cannot open %s\n' % filename) return - base = os.path.basename(filename) - if base[-3:] == '.py': - base = base[:-3] - s = base + '\t' + filename + '\t' + '1\n' - tags.append(s) - while 1: - line = fp.readline() - if not line: - break - m = matcher.match(line) - if m: - content = m.group(0) - name = m.group(2) - s = name + '\t' + filename + '\t/^' + content + '/\n' - tags.append(s) + with fp: + base = os.path.basename(filename) + if base[-3:] == '.py': + base = base[:-3] + s = base + '\t' + filename + '\t' + '1\n' + tags.append(s) + while 1: + line = fp.readline() + if not line: + break + m = matcher.match(line) + if m: + content = m.group(0) + name = m.group(2) + s = name + '\t' + filename + '\t/^' + content + '/\n' + tags.append(s) if __name__ == '__main__': main() diff --git a/Tools/scripts/rgrep.py b/Tools/scripts/rgrep.py index 1917e05e4941..c39bf93aad3b 100755 --- a/Tools/scripts/rgrep.py +++ b/Tools/scripts/rgrep.py @@ -30,29 +30,30 @@ def main(): f = open(filename) except IOError as msg: usage("can't open %r: %s" % (filename, msg), 1) - f.seek(0, 2) - pos = f.tell() - leftover = None - while pos > 0: - size = min(pos, bufsize) - pos = pos - size - f.seek(pos) - buffer = f.read(size) - lines = buffer.split("\n") - del buffer - if leftover is None: - if not lines[-1]: - del lines[-1] - else: - lines[-1] = lines[-1] + leftover - if pos > 0: - leftover = lines[0] - del lines[0] - else: - leftover = None - for line in reversed(lines): - if prog.search(line): - print(line) + with f: + f.seek(0, 2) + pos = f.tell() + leftover = None + while pos > 0: + size = min(pos, bufsize) + pos = pos - size + f.seek(pos) + buffer = f.read(size) + lines = buffer.split("\n") + del buffer + if leftover is None: + if not lines[-1]: + del lines[-1] + else: + lines[-1] = lines[-1] + leftover + if pos > 0: + leftover = lines[0] + del lines[0] + else: + leftover = None + for line in reversed(lines): + if prog.search(line): + print(line) def usage(msg, code=2): diff --git a/Tools/unicode/gencjkcodecs.py b/Tools/unicode/gencjkcodecs.py index ebccfc7f96ba..45866bf2f610 100644 --- a/Tools/unicode/gencjkcodecs.py +++ b/Tools/unicode/gencjkcodecs.py @@ -61,7 +61,8 @@ def gencodecs(prefix): encoding=enc.lower(), owner=loc) codecpath = os.path.join(prefix, enc + '.py') - open(codecpath, 'w').write(code) + with open(codecpath, 'w') as f: + f.write(code) if __name__ == '__main__': import sys diff --git a/Tools/unicode/gencodec.py b/Tools/unicode/gencodec.py index 31f0112150d6..1e5aced63aa0 100644 --- a/Tools/unicode/gencodec.py +++ b/Tools/unicode/gencodec.py @@ -72,9 +72,8 @@ def parsecodes(codes, len=len, range=range): def readmap(filename): - f = open(filename,'r') - lines = f.readlines() - f.close() + with open(filename) as f: + lines = f.readlines() enc2uni = {} identity = [] unmapped = list(range(256)) @@ -359,18 +358,16 @@ def getregentry(): def pymap(name,map,pyfile,encodingname,comments=1): code = codegen(name,map,encodingname,comments) - f = open(pyfile,'w') - f.write(code) - f.close() + with open(pyfile,'w') as f: + f.write(code) def marshalmap(name,map,marshalfile): d = {} for e,(u,c) in map.items(): d[e] = (u,c) - f = open(marshalfile,'wb') - marshal.dump(d,f) - f.close() + with open(marshalfile,'wb') as f: + marshal.dump(d,f) def convertdir(dir, dirprefix='', nameprefix='', comments=1): @@ -411,8 +408,8 @@ def rewritepythondir(dir, dirprefix='', comments=1): print('converting %s to %s' % (mapname, dirprefix + codefile)) try: - map = marshal.load(open(os.path.join(dir,mapname), - 'rb')) + with open(os.path.join(dir, mapname), 'rb') as f: + map = marshal.load(f) if not map: print('* map is empty; skipping') else: From webhook-mailer at python.org Sat Mar 30 07:24:09 2019 From: webhook-mailer at python.org (Nick Coghlan) Date: Sat, 30 Mar 2019 11:24:09 -0000 Subject: [Python-checkins] C API docs: Py_IsInitialized is always safe to call (GH-12630) Message-ID: https://github.com/python/cpython/commit/ddbb978e1065dde21d1662386b26ded359f4b16e commit: ddbb978e1065dde21d1662386b26ded359f4b16e branch: master author: Nick Coghlan committer: GitHub date: 2019-03-30T21:24:05+10:00 summary: C API docs: Py_IsInitialized is always safe to call (GH-12630) files: M Doc/c-api/init.rst diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 2c6d21fa9da1..b87e999fe02b 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -37,6 +37,7 @@ The following functions can be safely called before Python is initialized: * Informative functions: + * :c:func:`Py_IsInitialized` * :c:func:`PyMem_GetAllocator` * :c:func:`PyObject_GetArenaAllocator` * :c:func:`Py_GetBuildInfo` From webhook-mailer at python.org Sat Mar 30 07:29:47 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 30 Mar 2019 11:29:47 -0000 Subject: [Python-checkins] C API docs: Py_IsInitialized is always safe to call (GH-12630) Message-ID: https://github.com/python/cpython/commit/128e40f06f3ddc18e113339af464ffefd070eaef commit: 128e40f06f3ddc18e113339af464ffefd070eaef branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-03-30T04:29:43-07:00 summary: C API docs: Py_IsInitialized is always safe to call (GH-12630) (cherry picked from commit ddbb978e1065dde21d1662386b26ded359f4b16e) Co-authored-by: Nick Coghlan files: M Doc/c-api/init.rst diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 50998be5747b..2cdc0527dff9 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -37,6 +37,7 @@ The following functions can be safely called before Python is initialized: * Informative functions: + * :c:func:`Py_IsInitialized` * :c:func:`PyMem_GetAllocator` * :c:func:`PyObject_GetArenaAllocator` * :c:func:`Py_GetBuildInfo` From webhook-mailer at python.org Sat Mar 30 09:52:23 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Sat, 30 Mar 2019 13:52:23 -0000 Subject: [Python-checkins] bpo-36434: Properly handle writing errors in ZIP files. (GH-12559) (GH-12628) Message-ID: https://github.com/python/cpython/commit/4724ba9b57c45ce4bca3c828f2ed8dcff3800a0c commit: 4724ba9b57c45ce4bca3c828f2ed8dcff3800a0c branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Serhiy Storchaka date: 2019-03-30T15:52:16+02:00 summary: bpo-36434: Properly handle writing errors in ZIP files. (GH-12559) (GH-12628) Errors during writing no longer prevent to properly close the ZIP file. (cherry picked from commit 2524fdefc9bb2a97b99319190aeb23703079ad4c) Co-authored-by: Serhiy Storchaka files: A Misc/NEWS.d/next/Library/2019-03-26-14-20-59.bpo-36434.PTdidw.rst M Lib/test/test_zipfile.py M Lib/zipfile.py diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index b48366a53263..ac8f64ce22f6 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -402,6 +402,43 @@ def test_per_file_compresslevel(self): self.assertEqual(one_info._compresslevel, 1) self.assertEqual(nine_info._compresslevel, 9) + def test_writing_errors(self): + class BrokenFile(io.BytesIO): + def write(self, data): + nonlocal count + if count is not None: + if count == stop: + raise OSError + count += 1 + super().write(data) + + stop = 0 + while True: + testfile = BrokenFile() + count = None + with zipfile.ZipFile(testfile, 'w', self.compression) as zipfp: + with zipfp.open('file1', 'w') as f: + f.write(b'data1') + count = 0 + try: + with zipfp.open('file2', 'w') as f: + f.write(b'data2') + except OSError: + stop += 1 + else: + break + finally: + count = None + with zipfile.ZipFile(io.BytesIO(testfile.getvalue())) as zipfp: + self.assertEqual(zipfp.namelist(), ['file1']) + self.assertEqual(zipfp.read('file1'), b'data1') + + with zipfile.ZipFile(io.BytesIO(testfile.getvalue())) as zipfp: + self.assertEqual(zipfp.namelist(), ['file1', 'file2']) + self.assertEqual(zipfp.read('file1'), b'data1') + self.assertEqual(zipfp.read('file2'), b'data2') + + def tearDown(self): unlink(TESTFN) unlink(TESTFN2) diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 75dc59d1fc29..e83600e13d5e 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -1101,47 +1101,50 @@ def write(self, data): def close(self): if self.closed: return - super().close() - # Flush any data from the compressor, and update header info - if self._compressor: - buf = self._compressor.flush() - self._compress_size += len(buf) - self._fileobj.write(buf) - self._zinfo.compress_size = self._compress_size - else: - self._zinfo.compress_size = self._file_size - self._zinfo.CRC = self._crc - self._zinfo.file_size = self._file_size - - # Write updated header info - if self._zinfo.flag_bits & 0x08: - # Write CRC and file sizes after the file data - fmt = ' ZIP64_LIMIT: - raise RuntimeError('File size unexpectedly exceeded ZIP64 ' - 'limit') - if self._compress_size > ZIP64_LIMIT: - raise RuntimeError('Compressed size unexpectedly exceeded ' - 'ZIP64 limit') - # Seek backwards and write file header (which will now include - # correct CRC and file sizes) - - # Preserve current position in file - self._zipfile.start_dir = self._fileobj.tell() - self._fileobj.seek(self._zinfo.header_offset) - self._fileobj.write(self._zinfo.FileHeader(self._zip64)) - self._fileobj.seek(self._zipfile.start_dir) - - self._zipfile._writing = False - - # Successfully written: Add file to our caches - self._zipfile.filelist.append(self._zinfo) - self._zipfile.NameToInfo[self._zinfo.filename] = self._zinfo + try: + super().close() + # Flush any data from the compressor, and update header info + if self._compressor: + buf = self._compressor.flush() + self._compress_size += len(buf) + self._fileobj.write(buf) + self._zinfo.compress_size = self._compress_size + else: + self._zinfo.compress_size = self._file_size + self._zinfo.CRC = self._crc + self._zinfo.file_size = self._file_size + + # Write updated header info + if self._zinfo.flag_bits & 0x08: + # Write CRC and file sizes after the file data + fmt = ' ZIP64_LIMIT: + raise RuntimeError( + 'File size unexpectedly exceeded ZIP64 limit') + if self._compress_size > ZIP64_LIMIT: + raise RuntimeError( + 'Compressed size unexpectedly exceeded ZIP64 limit') + # Seek backwards and write file header (which will now include + # correct CRC and file sizes) + + # Preserve current position in file + self._zipfile.start_dir = self._fileobj.tell() + self._fileobj.seek(self._zinfo.header_offset) + self._fileobj.write(self._zinfo.FileHeader(self._zip64)) + self._fileobj.seek(self._zipfile.start_dir) + + # Successfully written: Add file to our caches + self._zipfile.filelist.append(self._zinfo) + self._zipfile.NameToInfo[self._zinfo.filename] = self._zinfo + finally: + self._zipfile._writing = False + + class ZipFile: """ Class with methods to open, read, write, close, list zip files. diff --git a/Misc/NEWS.d/next/Library/2019-03-26-14-20-59.bpo-36434.PTdidw.rst b/Misc/NEWS.d/next/Library/2019-03-26-14-20-59.bpo-36434.PTdidw.rst new file mode 100644 index 000000000000..6e3e050c89bd --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-26-14-20-59.bpo-36434.PTdidw.rst @@ -0,0 +1 @@ +Errors during writing to a ZIP file no longer prevent to properly close it. From webhook-mailer at python.org Sat Mar 30 09:52:45 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Sat, 30 Mar 2019 13:52:45 -0000 Subject: [Python-checkins] bpo-24214: Fixed the UTF-8 incremental decoder. (GH-12603) (GH-12627) Message-ID: https://github.com/python/cpython/commit/bd48280cb66544827952ca91e326cbb178c8c461 commit: bd48280cb66544827952ca91e326cbb178c8c461 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Serhiy Storchaka date: 2019-03-30T15:52:41+02:00 summary: bpo-24214: Fixed the UTF-8 incremental decoder. (GH-12603) (GH-12627) The bug occurred when the encoded surrogate character is passed to the incremental decoder in two chunks. (cherry picked from commit 7a465cb5ee7e298cae626ace1fc3e7d97df79f2e) Co-authored-by: Serhiy Storchaka files: A Misc/NEWS.d/next/Core and Builtins/2019-03-28-15-22-45.bpo-24214.tZ6lYU.rst M Lib/test/test_codecs.py M Objects/unicodeobject.c diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index 293dfbc61aba..5ba2c7bdc5f8 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -401,6 +401,15 @@ def test_lone_surrogates(self): self.assertEqual(test_sequence.decode(self.encoding, "backslashreplace"), before + backslashreplace + after) + def test_incremental_surrogatepass(self): + # Test incremental decoder for surrogatepass handler: + # see issue #24214 + data = '\uD901'.encode(self.encoding, 'surrogatepass') + for i in range(1, len(data)): + dec = codecs.getincrementaldecoder(self.encoding)('surrogatepass') + self.assertEqual(dec.decode(data[:i]), '') + self.assertEqual(dec.decode(data[i:], True), '\uD901') + class UTF32Test(ReadTest, unittest.TestCase): encoding = "utf-32" diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-28-15-22-45.bpo-24214.tZ6lYU.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-28-15-22-45.bpo-24214.tZ6lYU.rst new file mode 100644 index 000000000000..abb27591f78a --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-28-15-22-45.bpo-24214.tZ6lYU.rst @@ -0,0 +1,2 @@ +Fixed support of the surrogatepass error handler in the UTF-8 incremental +decoder. diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index adcf69d4e539..e18937981bb7 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -4890,6 +4890,9 @@ PyUnicode_DecodeUTF8Stateful(const char *s, case 2: case 3: case 4: + if (s == end || consumed) { + goto End; + } errmsg = "invalid continuation byte"; startinpos = s - starts; endinpos = startinpos + ch - 1; From webhook-mailer at python.org Sat Mar 30 10:53:52 2019 From: webhook-mailer at python.org (Nick Coghlan) Date: Sat, 30 Mar 2019 14:53:52 -0000 Subject: [Python-checkins] bpo-36384: Remove check for leading zeroes in IPv4 addresses (GH-12577) Message-ID: https://github.com/python/cpython/commit/e653d4d8e820a7a004ad399530af0135b45db27a commit: e653d4d8e820a7a004ad399530af0135b45db27a branch: master author: Joel Croteau committer: Nick Coghlan date: 2019-03-31T00:53:48+10:00 summary: bpo-36384: Remove check for leading zeroes in IPv4 addresses (GH-12577) Stop rejecting IPv4 octets with leading zeroes as ambiguously octal. Plenty of other tools generate decimal IPv4 octets with leading zeroes, so keeping this check hurts interoperability. Patch by Joel Croteau. files: A Misc/NEWS.d/next/Library/2019-03-27-02-09-22.bpo-36385.we2F45.rst M Lib/ipaddress.py M Lib/test/test_ipaddress.py diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py index 15507d61dec8..a88cf3d0b7c5 100644 --- a/Lib/ipaddress.py +++ b/Lib/ipaddress.py @@ -1165,12 +1165,6 @@ def _parse_octet(cls, octet_str): raise ValueError(msg % octet_str) # Convert to integer (we know digits are legal) octet_int = int(octet_str, 10) - # Any octets that look like they *might* be written in octal, - # and which don't look exactly the same in both octal and - # decimal are rejected as ambiguous - if octet_int > 7 and octet_str[0] == '0': - msg = "Ambiguous (octal/decimal) value in %r not permitted" - raise ValueError(msg % octet_str) if octet_int > 255: raise ValueError("Octet %d (> 255) not permitted" % octet_int) return octet_int diff --git a/Lib/test/test_ipaddress.py b/Lib/test/test_ipaddress.py index 0e0753f34c49..53f6f128443c 100644 --- a/Lib/test/test_ipaddress.py +++ b/Lib/test/test_ipaddress.py @@ -92,11 +92,14 @@ def pickle_test(self, addr): y = pickle.loads(pickle.dumps(x, proto)) self.assertEqual(y, x) + class CommonTestMixin_v4(CommonTestMixin): def test_leading_zeros(self): self.assertInstancesEqual("000.000.000.000", "0.0.0.0") self.assertInstancesEqual("192.168.000.001", "192.168.0.1") + self.assertInstancesEqual("016.016.016.016", "16.16.16.16") + self.assertInstancesEqual("001.000.008.016", "1.0.8.16") def test_int(self): self.assertInstancesEqual(0, "0.0.0.0") @@ -229,15 +232,6 @@ def assertBadOctet(addr, octet): assertBadOctet("1.2.3.4::", "4::") assertBadOctet("1.a.2.3", "a") - def test_octal_decimal_ambiguity(self): - def assertBadOctet(addr, octet): - msg = "Ambiguous (octal/decimal) value in %r not permitted in %r" - with self.assertAddressError(re.escape(msg % (octet, addr))): - ipaddress.IPv4Address(addr) - - assertBadOctet("016.016.016.016", "016") - assertBadOctet("001.000.008.016", "008") - def test_octet_length(self): def assertBadOctet(addr, octet): msg = "At most 3 characters permitted in %r in %r" diff --git a/Misc/NEWS.d/next/Library/2019-03-27-02-09-22.bpo-36385.we2F45.rst b/Misc/NEWS.d/next/Library/2019-03-27-02-09-22.bpo-36385.we2F45.rst new file mode 100644 index 000000000000..26f6dd7d5f47 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-27-02-09-22.bpo-36385.we2F45.rst @@ -0,0 +1 @@ +Stop rejecting IPv4 octets for being ambiguously octal. Leading zeros are ignored, and no longer are assumed to specify octal octets. Octets are always decimal numbers. Octets must still be no more than three digits, including leading zeroes. From webhook-mailer at python.org Sat Mar 30 12:32:09 2019 From: webhook-mailer at python.org (Steve Dower) Date: Sat, 30 Mar 2019 16:32:09 -0000 Subject: [Python-checkins] bpo-36010: Add venv to the nuget distribution (GH-12367) Message-ID: https://github.com/python/cpython/commit/e724152796a5a41544f52054506c6c2248242a5d commit: e724152796a5a41544f52054506c6c2248242a5d branch: master author: Paul Moore committer: Steve Dower date: 2019-03-30T09:32:05-07:00 summary: bpo-36010: Add venv to the nuget distribution (GH-12367) files: A Misc/NEWS.d/next/Windows/2019-03-16-10-24-58.bpo-36010.dttWfp.rst M PC/layout/support/options.py M Tools/nuget/make_pkg.proj diff --git a/Misc/NEWS.d/next/Windows/2019-03-16-10-24-58.bpo-36010.dttWfp.rst b/Misc/NEWS.d/next/Windows/2019-03-16-10-24-58.bpo-36010.dttWfp.rst new file mode 100644 index 000000000000..32c57c49ae41 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-03-16-10-24-58.bpo-36010.dttWfp.rst @@ -0,0 +1 @@ +Add the venv standard library module to the nuget distribution for Windows. \ No newline at end of file diff --git a/PC/layout/support/options.py b/PC/layout/support/options.py index 76d9e34e1f46..22492f220d60 100644 --- a/PC/layout/support/options.py +++ b/PC/layout/support/options.py @@ -53,7 +53,15 @@ def public(f): }, "nuget": { "help": "nuget package", - "options": ["stable", "pip", "distutils", "dev", "props"], + "options": [ + "dev", + "tools", + "pip", + "stable", + "distutils", + "venv", + "props" + ], }, "default": { "help": "development kit package", diff --git a/Tools/nuget/make_pkg.proj b/Tools/nuget/make_pkg.proj index e093a6d0bd76..5638952ac9f9 100644 --- a/Tools/nuget/make_pkg.proj +++ b/Tools/nuget/make_pkg.proj @@ -28,7 +28,7 @@ $(PythonArguments) -b "$(BuildPath.TrimEnd(`\`))" -s "$(PySourcePath.TrimEnd(`\`))" $(PythonArguments) -t "$(IntermediateOutputPath)obj" $(PythonArguments) --copy "$(IntermediateOutputPath)pkg" - $(PythonArguments) --include-dev --include-tools --include-pip --include-stable --include-launcher --include-props + $(PythonArguments) --preset-nuget "$(IntermediateOutputPath)pkg\pip.exe" -B -m pip install -U $(Packages) From webhook-mailer at python.org Sat Mar 30 17:47:15 2019 From: webhook-mailer at python.org (Steve Dower) Date: Sat, 30 Mar 2019 21:47:15 -0000 Subject: [Python-checkins] bpo-36010: Add venv to the nuget distribution (GH-12367) Message-ID: https://github.com/python/cpython/commit/3e78c7c30553baf72b7eb6fe3384d88fff549906 commit: 3e78c7c30553baf72b7eb6fe3384d88fff549906 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Steve Dower date: 2019-03-30T14:47:12-07:00 summary: bpo-36010: Add venv to the nuget distribution (GH-12367) (cherry picked from commit e724152796a5a41544f52054506c6c2248242a5d) Co-authored-by: Paul Moore files: A Misc/NEWS.d/next/Windows/2019-03-16-10-24-58.bpo-36010.dttWfp.rst M PC/layout/support/options.py M Tools/nuget/make_pkg.proj diff --git a/Misc/NEWS.d/next/Windows/2019-03-16-10-24-58.bpo-36010.dttWfp.rst b/Misc/NEWS.d/next/Windows/2019-03-16-10-24-58.bpo-36010.dttWfp.rst new file mode 100644 index 000000000000..32c57c49ae41 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-03-16-10-24-58.bpo-36010.dttWfp.rst @@ -0,0 +1 @@ +Add the venv standard library module to the nuget distribution for Windows. \ No newline at end of file diff --git a/PC/layout/support/options.py b/PC/layout/support/options.py index 76d9e34e1f46..22492f220d60 100644 --- a/PC/layout/support/options.py +++ b/PC/layout/support/options.py @@ -53,7 +53,15 @@ def public(f): }, "nuget": { "help": "nuget package", - "options": ["stable", "pip", "distutils", "dev", "props"], + "options": [ + "dev", + "tools", + "pip", + "stable", + "distutils", + "venv", + "props" + ], }, "default": { "help": "development kit package", diff --git a/Tools/nuget/make_pkg.proj b/Tools/nuget/make_pkg.proj index e093a6d0bd76..5638952ac9f9 100644 --- a/Tools/nuget/make_pkg.proj +++ b/Tools/nuget/make_pkg.proj @@ -28,7 +28,7 @@ $(PythonArguments) -b "$(BuildPath.TrimEnd(`\`))" -s "$(PySourcePath.TrimEnd(`\`))" $(PythonArguments) -t "$(IntermediateOutputPath)obj" $(PythonArguments) --copy "$(IntermediateOutputPath)pkg" - $(PythonArguments) --include-dev --include-tools --include-pip --include-stable --include-launcher --include-props + $(PythonArguments) --preset-nuget "$(IntermediateOutputPath)pkg\pip.exe" -B -m pip install -U $(Packages) From webhook-mailer at python.org Sat Mar 30 20:14:49 2019 From: webhook-mailer at python.org (Steve Dower) Date: Sun, 31 Mar 2019 00:14:49 -0000 Subject: [Python-checkins] bpo-36085: Add additional load flag to ensure DLL loads successfully (GH-12633) Message-ID: https://github.com/python/cpython/commit/ac19d9652799412404aef6b357a01057df34e005 commit: ac19d9652799412404aef6b357a01057df34e005 branch: master author: Steve Dower committer: GitHub date: 2019-03-30T17:14:46-07:00 summary: bpo-36085: Add additional load flag to ensure DLL loads successfully (GH-12633) files: M Lib/ctypes/test/test_loading.py diff --git a/Lib/ctypes/test/test_loading.py b/Lib/ctypes/test/test_loading.py index be367c6fa352..9b97d8008604 100644 --- a/Lib/ctypes/test/test_loading.py +++ b/Lib/ctypes/test/test_loading.py @@ -167,7 +167,8 @@ def should_fail(command): # Full path load with DLL_LOAD_DIR should succeed should_pass("WinDLL(nt._getfullpathname('_sqlite3.dll'), " + - "winmode=nt._LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR)") + "winmode=nt._LOAD_LIBRARY_SEARCH_SYSTEM32|" + + "nt._LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR)") # User-specified directory should succeed should_pass("import os; p = os.add_dll_directory(os.getcwd());" + From webhook-mailer at python.org Sat Mar 30 23:58:26 2019 From: webhook-mailer at python.org (Steve Dower) Date: Sun, 31 Mar 2019 03:58:26 -0000 Subject: [Python-checkins] bpo-36085: Add installer check for KB2533625 (GH-12636) Message-ID: https://github.com/python/cpython/commit/79da388a4016e24c4258dcc62cd0fa9dde0acb5b commit: 79da388a4016e24c4258dcc62cd0fa9dde0acb5b branch: master author: Steve Dower committer: GitHub date: 2019-03-30T20:58:17-07:00 summary: bpo-36085: Add installer check for KB2533625 (GH-12636) files: M Doc/whatsnew/3.8.rst M Tools/msi/build.bat M Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp M Tools/msi/lib/lib_files.wxs diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index f0423c376fcd..ccd8bbd81042 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -754,7 +754,9 @@ Changes in the Python API used, and modifications to these will no longer have any effect on normal DLL resolution. If your application relies on these mechanisms, you should check for :func:`~os.add_dll_directory` and if it exists, use it to add your DLLs - directory while loading your library. + directory while loading your library. Note that Windows 7 users will need to + ensure that Windows Update KB2533625 has been installed (this is also verified + by the installer). (See :issue:`36085`.) diff --git a/Tools/msi/build.bat b/Tools/msi/build.bat index 8fa612e9ddc0..532cebc5b511 100644 --- a/Tools/msi/build.bat +++ b/Tools/msi/build.bat @@ -6,7 +6,7 @@ set PCBUILD=%D%..\..\PCbuild\ set BUILDX86= set BUILDX64= set BUILDDOC= -set BUILDTEST=--test-marker +set BUILDTEST= set BUILDPACK= set REBUILD= @@ -16,6 +16,7 @@ if "%~1" EQU "-x86" (set BUILDX86=1) && shift && goto CheckOpts if "%~1" EQU "-x64" (set BUILDX64=1) && shift && goto CheckOpts if "%~1" EQU "--doc" (set BUILDDOC=1) && shift && goto CheckOpts if "%~1" EQU "--no-test-marker" (set BUILDTEST=) && shift && goto CheckOpts +if "%~1" EQU "--test-marker" (set BUILDTEST=--test-marker) && shift && goto CheckOpts if "%~1" EQU "--pack" (set BUILDPACK=1) && shift && goto CheckOpts if "%~1" EQU "-r" (set REBUILD=-r) && shift && goto CheckOpts @@ -69,11 +70,12 @@ if defined BUILDX64 ( exit /B 0 :Help -echo build.bat [-x86] [-x64] [--doc] [-h] [--no-test-marker] [--pack] [-r] +echo build.bat [-x86] [-x64] [--doc] [-h] [--test-marker] [--pack] [-r] echo. echo -x86 Build x86 installers echo -x64 Build x64 installers echo --doc Build CHM documentation -echo --no-test-marker Build without test markers +echo --test-marker Build with test markers +echo --no-test-marker Build without test markers (default) echo --pack Embed core MSIs into installer echo -r Rebuild rather than incremental build diff --git a/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp b/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp index 2e468b7e57b2..7cd8fb8e0583 100644 --- a/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp +++ b/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp @@ -2989,9 +2989,20 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication { LOC_STRING *pLocString = nullptr; if (IsWindowsServer()) { - if (IsWindowsVersionOrGreater(6, 1, 1)) { - BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Target OS is Windows Server 2008 R2 or later"); + if (IsWindowsVersionOrGreater(6, 2, 0)) { + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Target OS is Windows Server 2012 or later"); return; + } else if (IsWindowsVersionOrGreater(6, 1, 1)) { + HMODULE hKernel32 = GetModuleHandleW(L"kernel32"); + if (hKernel32 && !GetProcAddress(hKernel32, "AddDllDirectory")) { + BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows Server 2008 R2 without KB2533625"); + BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "KB2533625 update is required to continue."); + /* The "MissingSP1" error also specifies updates are required */ + LocGetString(_wixLoc, L"#(loc.FailureWS2K8R2MissingSP1)", &pLocString); + } else { + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Target OS is Windows Server 2008 R2 or later"); + return; + } } else if (IsWindowsVersionOrGreater(6, 1, 0)) { BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows Server 2008 R2"); BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Service Pack 1 is required to continue installation"); @@ -3009,9 +3020,20 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication { LocGetString(_wixLoc, L"#(loc.FailureWS2K3OrEarlier)", &pLocString); } } else { - if (IsWindows7SP1OrGreater()) { - BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Target OS is Windows 7 SP1 or later"); + if (IsWindows8OrGreater()) { + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Target OS is Windows 8 or later"); return; + } else if (IsWindows7SP1OrGreater()) { + HMODULE hKernel32 = GetModuleHandleW(L"kernel32"); + if (hKernel32 && !GetProcAddress(hKernel32, "AddDllDirectory")) { + BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows 7 SP1 without KB2533625"); + BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "KB2533625 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"); diff --git a/Tools/msi/lib/lib_files.wxs b/Tools/msi/lib/lib_files.wxs index 472bacf20dba..b462372512f6 100644 --- a/Tools/msi/lib/lib_files.wxs +++ b/Tools/msi/lib/lib_files.wxs @@ -62,9 +62,6 @@ - - - From webhook-mailer at python.org Sun Mar 31 12:00:18 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Sun, 31 Mar 2019 16:00:18 -0000 Subject: [Python-checkins] bpo-35947: Fix a compiler warning in _ctypes.c's StructUnionType_paramfunc(). (GH-12629) Message-ID: https://github.com/python/cpython/commit/48600c72c1afe1096c2412a135a43f8cdd895195 commit: 48600c72c1afe1096c2412a135a43f8cdd895195 branch: master author: Zackery Spytz committer: Serhiy Storchaka date: 2019-03-31T19:00:12+03:00 summary: bpo-35947: Fix a compiler warning in _ctypes.c's StructUnionType_paramfunc(). (GH-12629) files: M Modules/_ctypes/_ctypes.c diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 7479edaf1110..03f8e756092c 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -406,7 +406,7 @@ StructUnionType_paramfunc(CDataObject *self) CDataObject *copied_self; StgDictObject *stgdict; - if (self->b_size > sizeof(void*)) { + if ((size_t)self->b_size > sizeof(void*)) { void *new_ptr = PyMem_Malloc(self->b_size); if (new_ptr == NULL) return NULL; From webhook-mailer at python.org Sun Mar 31 12:02:14 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Sun, 31 Mar 2019 16:02:14 -0000 Subject: [Python-checkins] bpo-36150: Fix possible assertion failures due to _ctypes.c's PyCData_reduce(). (GH-12106) Message-ID: https://github.com/python/cpython/commit/5f2c50810a67982b0c80f6d3258fee3647f67005 commit: 5f2c50810a67982b0c80f6d3258fee3647f67005 branch: master author: Zackery Spytz committer: Serhiy Storchaka date: 2019-03-31T19:02:11+03:00 summary: bpo-36150: Fix possible assertion failures due to _ctypes.c's PyCData_reduce(). (GH-12106) files: M Modules/_ctypes/_ctypes.c diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 03f8e756092c..b3a20309472d 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -2743,10 +2743,11 @@ PyCData_reduce(PyObject *myself, PyObject *args) "ctypes objects containing pointers cannot be pickled"); return NULL; } - return Py_BuildValue("O(O(NN))", - _unpickle, - Py_TYPE(myself), - PyObject_GetAttrString(myself, "__dict__"), + PyObject *dict = PyObject_GetAttrString(myself, "__dict__"); + if (dict == NULL) { + return NULL; + } + return Py_BuildValue("O(O(NN))", _unpickle, Py_TYPE(myself), dict, PyBytes_FromStringAndSize(self->b_ptr, self->b_size)); } From webhook-mailer at python.org Sun Mar 31 13:14:21 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Sun, 31 Mar 2019 17:14:21 -0000 Subject: [Python-checkins] bpo-36150: Fix possible assertion failures due to _ctypes.c's PyCData_reduce(). (GH-12106) (GH-12643) Message-ID: https://github.com/python/cpython/commit/a110817c080ca3c2f3262350b5d7e0c0582527e6 commit: a110817c080ca3c2f3262350b5d7e0c0582527e6 branch: 2.7 author: Zackery Spytz committer: Serhiy Storchaka date: 2019-03-31T20:14:16+03:00 summary: bpo-36150: Fix possible assertion failures due to _ctypes.c's PyCData_reduce(). (GH-12106) (GH-12643) (cherry picked from commit 5f2c50810a67982b0c80f6d3258fee3647f67005) files: M Modules/_ctypes/_ctypes.c diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 3a3aabbb6cb5..33e224386fb1 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -2795,16 +2795,18 @@ static PyObject * PyCData_reduce(PyObject *_self, PyObject *args) { CDataObject *self = (CDataObject *)_self; + PyObject *dict; if (PyObject_stgdict(_self)->flags & (TYPEFLAG_ISPOINTER|TYPEFLAG_HASPOINTER)) { PyErr_SetString(PyExc_ValueError, "ctypes objects containing pointers cannot be pickled"); return NULL; } - return Py_BuildValue("O(O(NN))", - _unpickle, - Py_TYPE(_self), - PyObject_GetAttrString(_self, "__dict__"), + dict = PyObject_GetAttrString(_self, "__dict__"); + if (dict == NULL) { + return NULL; + } + return Py_BuildValue("O(O(NN))", _unpickle, Py_TYPE(_self), dict, PyString_FromStringAndSize(self->b_ptr, self->b_size)); } From webhook-mailer at python.org Sun Mar 31 13:15:14 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Sun, 31 Mar 2019 17:15:14 -0000 Subject: [Python-checkins] bpo-36150: Fix possible assertion failures due to _ctypes.c's PyCData_reduce(). (GH-12106) (GH-12642) Message-ID: https://github.com/python/cpython/commit/5e233951d931acc0e927100c51e9a27a2791b6a5 commit: 5e233951d931acc0e927100c51e9a27a2791b6a5 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Serhiy Storchaka date: 2019-03-31T20:15:11+03:00 summary: bpo-36150: Fix possible assertion failures due to _ctypes.c's PyCData_reduce(). (GH-12106) (GH-12642) (cherry picked from commit 5f2c50810a67982b0c80f6d3258fee3647f67005) Co-authored-by: Zackery Spytz files: M Modules/_ctypes/_ctypes.c diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 48ad696e1078..be0b321bad03 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -2663,10 +2663,11 @@ PyCData_reduce(PyObject *myself, PyObject *args) "ctypes objects containing pointers cannot be pickled"); return NULL; } - return Py_BuildValue("O(O(NN))", - _unpickle, - Py_TYPE(myself), - PyObject_GetAttrString(myself, "__dict__"), + PyObject *dict = PyObject_GetAttrString(myself, "__dict__"); + if (dict == NULL) { + return NULL; + } + return Py_BuildValue("O(O(NN))", _unpickle, Py_TYPE(myself), dict, PyBytes_FromStringAndSize(self->b_ptr, self->b_size)); }